39 Commits b9c05b1bb4 ... eeab6dd529

Author SHA1 Message Date
  Blizzard eeab6dd529 fix: merge 10 months ago
  Blizzard 3ed49c6722 fix: dev分支环境 10 months ago
  Blizzard 6366524e0a Merge remote-tracking branch 'origin/dev' into dev 10 months ago
  Blizzard 1f9095f59e fix: es 10 months ago
  weirenchun 55af8e6d9f 大屏统计 10 months ago
  Blizzard 158debe05c fix: my task page 11 months ago
  Blizzard b2f9be6d5b fix: contract sign date 11 months ago
  Blizzard bdc0edbec0 fix: es search 11 months ago
  Blizzard 4f3c08895b fix: directory refactor 11 months ago
  Blizzard 5947b13327 fix: directory refactor 11 months ago
  Blizzard 28d2b12e7a fix: directory refactor 11 months ago
  Blizzard 612b34ddee feat: task notice 11 months ago
  Blizzard f8b342a3e1 fix: statistics fix 11 months ago
  Blizzard 125b51deb5 fix: task page fix 11 months ago
  Blizzard e3a5d839e2 feat: mini program : invite to dept 11 months ago
  Blizzard 984794444d fix: select by task status 11 months ago
  Blizzard d5341c6a89 feat: save project group 11 months ago
  Blizzard 90dc192760 feat: es search 11 months ago
  Blizzard 64e3dfebe6 feat: 1.ES save file 11 months ago
  Blizzard 853f91c883 feat: rpc update user 1 year ago
  Blizzard 5c024a16ee fix: project page 1 year ago
  Blizzard 369ffeec84 feat: contact and invite 1 year ago
  Blizzard e2314f5e60 feat: announcement 1 year ago
  Blizzard 5d4995854a feat: stage detail 1 year ago
  Blizzard b9977d2e00 feat: project statistics 1 year ago
  Blizzard c4eb240de3 feat: project statistics 1 year ago
  Blizzard 32cd602cb0 feat: index page schedule 1 year ago
  Blizzard a972a4c487 feat: select file 1 year ago
  Blizzard cd1a5cd068 feat: project group 1 year ago
  Blizzard 8411bbeeba feat: my task statistics 1 year ago
  Blizzard a285dcc627 feat: add serialization 1 year ago
  Blizzard 5693aaa0cc feat: task's related cost crud 1 year ago
  Blizzard a12a4338f4 feat: task's related contract 1 year ago
  Blizzard e79ab2eeff feat: task's related log 1 year ago
  Blizzard 191a07c7d3 feat: 1.task's crud 2.result file 1 year ago
  Blizzard d3777e5773 feat: read file 1 year ago
  Blizzard b5f8f6033a feat: file and folder crud 1 year ago
  Blizzard 3a92f3933a feat: create dept and search dept 1 year ago
  Blizzard 95d06546e7 feat: project crud api 1 year ago
100 changed files with 4379 additions and 199 deletions
  1. 6 6
      blade-biz-common/pom.xml
  2. 0 0
      blade-biz-common/src/main/java/org/springblade/common/cache/CacheNames.java
  3. 0 0
      blade-biz-common/src/main/java/org/springblade/common/config/BladeCommonConfiguration.java
  4. 0 0
      blade-biz-common/src/main/java/org/springblade/common/constant/CommonConstant.java
  5. 1 1
      blade-biz-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  6. 7 5
      blade-biz-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java
  7. 0 0
      blade-biz-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  8. 0 0
      blade-biz-common/src/main/resources/banner.txt
  9. 3 7
      blade-service-api/pom.xml
  10. 34 3
      blade-service-api/wt-okr-api/pom.xml
  11. 33 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/InviteToDeptDTO.java
  12. 41 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/MyTaskPageDTO.java
  13. 54 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/ProjectPageDTO.java
  14. 48 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/ProjectTaskPageDTO.java
  15. 36 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/SearchProjectFileDTO.java
  16. 31 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/SelectFileDTO.java
  17. 19 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/UpdateUserDTO.java
  18. 35 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/UploadFileDTO.java
  19. 31 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/UploadInnerFileDTO.java
  20. 104 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Announcement.java
  21. 45 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/AnnouncementSend.java
  22. 37 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ApplyJoin.java
  23. 45 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ContactOuter.java
  24. 57 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/FileAndFolder.java
  25. 28 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/FileAndFolderHistory.java
  26. 32 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/FileRead.java
  27. 28 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/FileShare.java
  28. 44 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/IndexMessage.java
  29. 47 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/InnerFileAndFolder.java
  30. 23 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/LineChartData.java
  31. 17 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/LineChartDataSet.java
  32. 53 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Project.java
  33. 38 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ProjectAuth.java
  34. 41 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ProjectGroup.java
  35. 57 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ProjectStage.java
  36. 21 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Qrcode.java
  37. 136 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Task.java
  38. 68 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskContract.java
  39. 44 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskContractPayLog.java
  40. 69 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskCost.java
  41. 39 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskFile.java
  42. 33 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskLog.java
  43. 2 2
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TemplateTypeAndStage.java
  44. 36 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/WorkStatus.java
  45. 18 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/AnnouncementSendVO.java
  46. 20 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ApplyJoinVO.java
  47. 38 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/AuthUserInfo.java
  48. 20 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ContactOuterUserVO.java
  49. 19 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ContactOuterVO.java
  50. 26 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/FileAndFolderHistoryVO.java
  51. 35 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/FileAndFolderVO.java
  52. 32 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/IndexProjectAndTaskSummaryVO.java
  53. 28 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/IndexTaskScheduleVO.java
  54. 27 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/InnerFileAndFolderVO.java
  55. 23 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/MyIndexTaskStatistics.java
  56. 33 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/MyTaskStatistics.java
  57. 28 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ProjectGroupVO.java
  58. 21 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ProjectStageVO.java
  59. 33 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ProjectStatisticsVO.java
  60. 23 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ProjectVO.java
  61. 27 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ScheduleUserVO.java
  62. 27 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskContractPayLogVO.java
  63. 25 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskContractVO.java
  64. 24 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskCostVO.java
  65. 24 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskFileVO.java
  66. 18 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskLogVO.java
  67. 42 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskVO.java
  68. 20 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/UserStatusVO.java
  69. 18 0
      blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/WorkStatusVO.java
  70. 9 10
      blade-service/pom.xml
  71. 0 67
      blade-service/wt-okr/pom.xml
  72. 0 38
      blade-service/wt-okr/src/main/java/com/wtkj/controller/ProjectController.java
  73. 0 12
      blade-service/wt-okr/src/main/java/com/wtkj/service/IProjectService.java
  74. 0 16
      blade-service/wt-okr/src/main/java/com/wtkj/service/ITypeAndStageService.java
  75. 0 18
      blade-service/wt-okr/src/main/java/com/wtkj/service/impl/ProjectServiceImpl.java
  76. 150 0
      blade-service/wutong-okr/pom.xml
  77. 3 2
      blade-service/wutong-okr/src/main/java/com/wtkj/OKRServiceApplication.java
  78. 0 0
      blade-service/wutong-okr/src/main/java/com/wtkj/config/AsyncConfig.java
  79. 18 0
      blade-service/wutong-okr/src/main/java/com/wtkj/config/FeignConfig.java
  80. 83 0
      blade-service/wutong-okr/src/main/java/com/wtkj/config/KafkaConfig.java
  81. 16 0
      blade-service/wutong-okr/src/main/java/com/wtkj/config/KafkaConstant.java
  82. 39 0
      blade-service/wutong-okr/src/main/java/com/wtkj/config/MagicValue.java
  83. 62 0
      blade-service/wutong-okr/src/main/java/com/wtkj/config/NacosConfigValue.java
  84. 67 0
      blade-service/wutong-okr/src/main/java/com/wtkj/config/es/EsConfig.java
  85. 156 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/AnnouncementController.java
  86. 62 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/CommonController.java
  87. 83 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/ContactController.java
  88. 231 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/FileAndFolderController.java
  89. 140 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/IndexController.java
  90. 191 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/ProjectController.java
  91. 147 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/QrCodeController.java
  92. 139 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/ResourceController.java
  93. 347 0
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/TaskController.java
  94. 12 12
      blade-service/wutong-okr/src/main/java/com/wtkj/controller/TypeAndStageController.java
  95. 90 0
      blade-service/wutong-okr/src/main/java/com/wtkj/handler/EsFileHandler.java
  96. 94 0
      blade-service/wutong-okr/src/main/java/com/wtkj/handler/Schedule.java
  97. 30 0
      blade-service/wutong-okr/src/main/java/com/wtkj/handler/es/Doc.java
  98. 12 0
      blade-service/wutong-okr/src/main/java/com/wtkj/mapper/AnnouncementMapper.java
  99. 6 0
      blade-service/wutong-okr/src/main/java/com/wtkj/mapper/AnnouncementMapper.xml
  100. 20 0
      blade-service/wutong-okr/src/main/java/com/wtkj/mapper/AnnouncementSendMapper.java

+ 6 - 6
blade-common/pom.xml → blade-biz-common/pom.xml

@@ -2,19 +2,19 @@
 <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
+
     <parent>
-        <groupId>com.wtkj</groupId>
         <artifactId>wt-service-okr</artifactId>
-        <version>1.0.RELEASE</version>
+        <groupId>org.springblade</groupId>
+        <version>2.9.1.RELEASE</version>
     </parent>
+    <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>blade-common</artifactId>
+    <artifactId>blade-biz-common</artifactId>
     <name>${project.artifactId}</name>
-    <version>1.0.RELEASE</version>
+    <version>2.9.1.RELEASE</version>
     <packaging>jar</packaging>
 
-
     <dependencies>
         <dependency>
             <groupId>org.springblade</groupId>

+ 0 - 0
blade-common/src/main/java/org/springblade/common/cache/CacheNames.java → blade-biz-common/src/main/java/org/springblade/common/cache/CacheNames.java


+ 0 - 0
blade-common/src/main/java/org/springblade/common/config/BladeCommonConfiguration.java → blade-biz-common/src/main/java/org/springblade/common/config/BladeCommonConfiguration.java


+ 0 - 0
blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java → blade-biz-common/src/main/java/org/springblade/common/constant/CommonConstant.java


+ 1 - 1
blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java → blade-biz-common/src/main/java/org/springblade/common/constant/LauncherConstant.java

@@ -72,7 +72,7 @@ public interface LauncherConstant {
 	/**
 	 * seata dev 地址
 	 */
-	String SEATA_DEV_ADDR = "127.0.0.1:8091";
+	String SEATA_DEV_ADDR = "192.168.31.181:8091";
 
 	/**
 	 * seata prod 地址

+ 7 - 5
blade-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java → blade-biz-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java

@@ -33,25 +33,27 @@ import java.util.Properties;
 @AutoService(LauncherService.class)
 public class LauncherServiceImpl implements LauncherService {
 
+	private final String activeProfile = "dev";
+
 	@Override
 	public void launcher(SpringApplicationBuilder builder, String appName, String profile, boolean isLocalDev) {
 		Properties props = System.getProperties();
 		// 通用注册
-		PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
-		PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
-		PropsUtil.setProperty(props, "spring.cloud.sentinel.transport.dashboard", LauncherConstant.sentinelAddr(profile));
+		PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(activeProfile));
+		PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(activeProfile));
+		PropsUtil.setProperty(props, "spring.cloud.sentinel.transport.dashboard", LauncherConstant.sentinelAddr(activeProfile));
 		PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true");
 
 		// dubbo注册
 		PropsUtil.setProperty(props, "dubbo.application.name", appName);
 		PropsUtil.setProperty(props, "dubbo.application.qos.enable", "false");
 		PropsUtil.setProperty(props, "dubbo.protocol.name", "dubbo");
-		PropsUtil.setProperty(props, "dubbo.registry.address", "nacos://" + LauncherConstant.nacosAddr(profile));
+		PropsUtil.setProperty(props, "dubbo.registry.address", "nacos://" + LauncherConstant.nacosAddr(activeProfile));
 		PropsUtil.setProperty(props, "dubbo.version", AppConstant.APPLICATION_VERSION);
 		PropsUtil.setProperty(props, "dubbo.scan.base-packages", AppConstant.BASE_PACKAGES);
 
 		// seata注册地址
-		PropsUtil.setProperty(props, "seata.service.grouplist.default", LauncherConstant.seataAddr(profile));
+		PropsUtil.setProperty(props, "seata.service.grouplist.default", LauncherConstant.seataAddr(activeProfile));
 		// seata注册group格式
 		PropsUtil.setProperty(props, "seata.tx-service-group", LauncherConstant.seataServiceGroup(appName));
 		// seata配置服务group

+ 0 - 0
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java → blade-biz-common/src/main/java/org/springblade/common/utils/CommonUtil.java


+ 0 - 0
blade-common/src/main/resources/banner.txt → blade-biz-common/src/main/resources/banner.txt


+ 3 - 7
blade-service-api/pom.xml

@@ -2,14 +2,15 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.wtkj</groupId>
         <artifactId>wt-service-okr</artifactId>
-        <version>1.0.RELEASE</version>
+        <groupId>org.springblade</groupId>
+        <version>2.9.1.RELEASE</version>
     </parent>
 
     <artifactId>blade-service-api</artifactId>
     <packaging>pom</packaging>
     <name>blade-service-api</name>
+    <version>2.9.1.RELEASE</version>
 
     <modules>
         <module>wt-okr-api</module>
@@ -47,11 +48,6 @@
             <artifactId>blade-core-auto</artifactId>
             <scope>provided</scope>
         </dependency>
-        <dependency>
-            <groupId>com.wtkj</groupId>
-            <artifactId>blade-common</artifactId>
-            <version>1.0.RELEASE</version>
-        </dependency>
     </dependencies>
 
     <build>

+ 34 - 3
blade-service-api/wt-okr-api/pom.xml

@@ -2,16 +2,47 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.wtkj</groupId>
+        <groupId>org.springblade</groupId>
         <artifactId>blade-service-api</artifactId>
-        <version>1.0.RELEASE</version>
+        <version>2.9.1.RELEASE</version>
     </parent>
 
+    <groupId>com.wtkj</groupId>
     <artifactId>wt-okr-api</artifactId>
-    <version>1.0.RELEASE</version>
+    <version>2.9.1.RELEASE</version>
     <packaging>jar</packaging>
 
     <name>wt-okr-api</name>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-user-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.wtkj</groupId>
+            <artifactId>wutong-file-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+        </dependency>
 
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-system-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-dict-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.wtkj</groupId>
+            <artifactId>wutong-base-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+        </dependency>
+
+    </dependencies>
 </project>

+ 33 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/InviteToDeptDTO.java

@@ -0,0 +1,33 @@
+package com.wtkj.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-25 15:47
+ * @describe
+ */
+@Data
+public class InviteToDeptDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "createUser can't be null")
+	private Long createUser;
+
+	@NotNull(message = "qrcodeId can't be null")
+	private String qrcodeId;
+
+	@NotNull(message = "type can't be null")
+	private Integer type;
+
+	@NotNull(message = "deptId can't be null")
+	private Long deptId;
+
+}

+ 41 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/MyTaskPageDTO.java

@@ -0,0 +1,41 @@
+package com.wtkj.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-10-07 23:07
+ * @describe
+ */
+@Data
+public class MyTaskPageDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "type:1:全部 2:我创建的 3:我执行的 4:我管理的")
+	private Integer type = 1;
+
+	private Integer isGroup = 0;
+
+	private Integer year;
+
+	private Integer month;
+
+	@NotNull(message = "current不可为空")
+	private int current;
+
+	@NotNull(message = "size不可为空")
+	private int size;
+
+	@ApiModelProperty(value = "当前登录用户的顶级机构id")
+	@NotNull(message = "topDept不可为空")
+	private Long topDept;
+
+	@ApiModelProperty(value = "当前登录用户的机构类型")
+	@NotNull(message = "deptCategory不可为空")
+	private Integer deptCategory;
+}

+ 54 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/ProjectPageDTO.java

@@ -0,0 +1,54 @@
+package com.wtkj.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-13 17:11
+ * @describe
+ */
+@Data
+public class ProjectPageDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private String year;
+
+	private String name;
+
+	private String areaCode;
+
+	@ApiModelProperty(value = "主管单位")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long competentUnit;
+
+	@ApiModelProperty(value = "协作单位")
+	private String cooperationUint;
+
+	@ApiModelProperty(value = "是否按照待完成任务数降序 0:否 1:是 默认否")
+	private Integer todoAsc = 0;
+
+	@ApiModelProperty(value = "是否按照截至时间降序 0:否 1:是 默认否")
+	private Integer endTimeAsc = 0;
+
+	@NotNull(message = "current不可为空")
+	private int current;
+
+	@NotNull(message = "size不可为空")
+	private int size;
+
+	@ApiModelProperty(value = "当前登录用户的顶级机构id")
+	@NotNull(message = "topDept不可为空")
+	private Long topDept;
+
+	@ApiModelProperty(value = "当前登录用户的机构类型")
+	@NotNull(message = "deptCategory不可为空")
+	private Integer deptCategory;
+
+}

+ 48 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/ProjectTaskPageDTO.java

@@ -0,0 +1,48 @@
+package com.wtkj.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-19 09:50
+ * @describe
+ */
+@Data
+public class ProjectTaskPageDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@NotNull(message = "projectId can't be null")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long projectId;
+
+	@NotNull(message = "stageId can't be null")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long stageId;
+
+	private String name;
+
+	@ApiModelProperty(value = "当前登录用户的机构类型")
+	@NotNull(message = "deptCategory can't be null")
+	private Integer deptCategory;
+
+	@ApiModelProperty(value = "协作单位")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long orgDeptId;
+
+	private Integer taskStatus;
+
+
+	@NotNull(message = "current can't be null")
+	private Integer current;
+
+	@NotNull(message = "size can't be null")
+	private Integer size;
+
+}

+ 36 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/SearchProjectFileDTO.java

@@ -0,0 +1,36 @@
+package com.wtkj.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-27 09:52
+ * @describe
+ */
+@Data
+public class SearchProjectFileDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "deptId can't be null")
+	private Long topDeptId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long projectId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long createUser;
+
+	private String text;
+
+	private Integer current;
+
+	private Integer size;
+
+}

+ 31 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/SelectFileDTO.java

@@ -0,0 +1,31 @@
+package com.wtkj.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 11:44
+ * @describe
+ */
+@Data
+public class SelectFileDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@NotBlank(message = "projectId不可为空")
+	private String projectId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long stageId;
+
+	private Integer isLatest;
+
+	private Integer current;
+
+	private Integer size;
+}

+ 19 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/UpdateUserDTO.java

@@ -0,0 +1,19 @@
+package com.wtkj.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.user.entity.User;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-26 11:51
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class UpdateUserDTO extends User {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long newRoleId;
+}

+ 35 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/UploadFileDTO.java

@@ -0,0 +1,35 @@
+package com.wtkj.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 15:19
+ * @describe
+ */
+@Data
+public class UploadFileDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@NotNull(message = "projectId不可为空")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long projectId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "stageId不可为空")
+	private Long stageId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "parentId不可为空")
+	private Long parentId = 0L;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "bladeFileId不可为空")
+	private Long bladeFileId;
+}

+ 31 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/dto/UploadInnerFileDTO.java

@@ -0,0 +1,31 @@
+package com.wtkj.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 15:19
+ * @describe
+ */
+@Data
+public class UploadInnerFileDTO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "deptId不可为空")
+	private Long deptId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "parentId不可为空")
+	private Long parentId = 0L;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "bladeFileId不可为空")
+	private Long bladeFileId;
+}

+ 104 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Announcement.java

@@ -0,0 +1,104 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-23 11:05
+ * @describe
+ */
+@Data
+@TableName("blade_announcement")
+@EqualsAndHashCode(callSuper = true)
+public class Announcement extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+
+	/**
+	 * 标题
+	 */
+	@TableField("title")
+	private String title;
+	/**
+	 * 内容
+	 */
+	@TableField("msg_content")
+	private String msgContent;
+	/**
+	 * 开始时间
+	 */
+	@TableField("start_time")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime startTime;
+
+	/**
+	 * 结束时间
+	 */
+	@TableField("end_time")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private LocalDateTime endTime;
+	/**
+	 * 优先级(L低,M中,H高)
+	 */
+	@TableField("priority")
+	private String priority;
+	/**
+	 * 消息类型1:通知公告2:系统消息
+	 */
+	@TableField("msg_category")
+	private Integer msgCategory;
+	/**
+	 * 通告对象类型(1:指定用户,2:全体用户)
+	 */
+	@TableField("msg_type")
+	private Integer msgType;
+	/**
+	 * 发布状态(0未发布,1已发布,2已撤销)
+	 */
+	@TableField("send_status")
+	private Integer sendStatus;
+	/**
+	 * 发布时间
+	 */
+	@TableField("send_time")
+	private LocalDateTime sendTime;
+	/**
+	 * 撤销时间
+	 */
+	@TableField("cancel_time")
+	private LocalDateTime cancelTime;
+	/**
+	 * 打开方式(组件:component 路由:url)
+	 */
+	@TableField("open_type")
+	private String openType;
+	/**
+	 * 指定用户
+	 */
+	@TableField("user_ids")
+	private String userIds;
+	/**
+	 * 摘要
+	 */
+	@TableField("msg_abstract")
+	private String msgAbstract;
+	/**
+	 * 组件/路由 地址
+	 */
+	@TableField("open_page")
+	private String openPage;
+
+	@TableField("header")
+	private String header = "asset";
+}

+ 45 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/AnnouncementSend.java

@@ -0,0 +1,45 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-23 11:03
+ * @describe
+ */
+@Data
+@TableName("blade_announcement_send")
+@EqualsAndHashCode(callSuper = true)
+public class AnnouncementSend extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 通告ID
+	 */
+	@TableField("anno_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long annoId;
+	/**
+	 * 用户id
+	 */
+	@TableField("user_id")
+	private Long userId;
+	/**
+	 * 阅读状态(0未读,1已读)
+	 */
+	@TableField("read_flag")
+	private Integer readFlag;
+
+	@TableField("read_time")
+	private Date readTime;
+
+}

+ 37 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ApplyJoin.java

@@ -0,0 +1,37 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Blizzard
+ * @create at 2023-10-06 10:37
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_apply_join")
+public class ApplyJoin extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("user_id")
+	@NotNull(message = "userId can't be null")
+	private Long userId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("dept_id")
+	@NotNull(message = "deptId can't be null")
+	private Long deptId;
+
+	@TableField("is_agree")
+	private Integer isAgree = 0;
+}

+ 45 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ContactOuter.java

@@ -0,0 +1,45 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-19 10:00
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@TableName("blade_contacts_outer")
+@Data
+public class ContactOuter extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "本机构顶级机构id")
+	@TableField("top_dept_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long topDeptId;
+
+	@ApiModelProperty(value = "外部联系人联系人顶级机构id")
+	@TableField("related_dept_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long relatedDeptId;
+
+
+	@ApiModelProperty(value = "邀请人")
+	@TableField("user_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long userId;
+
+
+	@ApiModelProperty(value = "联系人")
+	@TableField("related_user_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long relatedUserId;
+}

+ 57 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/FileAndFolder.java

@@ -0,0 +1,57 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 14:38
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_file_and_folder")
+public class FileAndFolder extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("project_id")
+	private Long projectId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("stage_id")
+	private Long stageId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("parent_id")
+	private Long parentId = 0L;
+
+	@TableField("title")
+	private String title;
+
+	@TableField("type")
+	@ApiModelProperty(value = "1:文件 2:文件夹")
+	@NotNull(message = "type不可为空")
+	private Integer type;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("blade_file_id")
+	private Long bladeFileId;
+
+	@TableField("is_private")
+	@ApiModelProperty(value = "是否私有 1:是 0:否 默认否")
+	private Integer isPrivate = 0;
+
+	@TableField("private_user")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long privateUser;
+}

+ 28 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/FileAndFolderHistory.java

@@ -0,0 +1,28 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 15:44
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_file_and_folder_history")
+public class FileAndFolderHistory extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	//blade_file的主键id
+	@TableField("latest_id")
+	private String latestId;
+
+	//blade_file的主键id
+	@TableField("history_id")
+	private String historyId;
+}

+ 32 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/FileRead.java

@@ -0,0 +1,32 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 11:09
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_file_read")
+public class FileRead extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@TableField("blade_file_id")
+	@ApiModelProperty(value = "文件主键id")
+	private String bladeFileId;
+
+	@TableField("user_id")
+	@ApiModelProperty(value = "用户id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long userId;
+}

+ 28 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/FileShare.java

@@ -0,0 +1,28 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-26 15:04
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@TableName("blade_file_share")
+@Data
+public class FileShare extends BaseEntity {
+
+
+	@ApiModelProperty("文件bladeFileIds")
+	@TableField("blade_file_ids")
+	@NotNull(message = "文件bladeFileIds不可为空")
+	private String bladeFileIds;
+
+}

+ 44 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/IndexMessage.java

@@ -0,0 +1,44 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 22:10
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_index_message_log")
+public class IndexMessage extends BaseEntity {
+	private static final long serialVersionUID = 1L;
+
+
+	@TableField("category")
+	@ApiModelProperty("分类,1:待办 2:内容更新")
+	private Integer category;
+
+	@TableField("to_user")
+	@ApiModelProperty("接收者")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long toUser;
+
+	@TableField("content")
+	@ApiModelProperty("提醒内容")
+	private String content;
+
+	@TableField("open_url")
+	@ApiModelProperty("")
+	private String openUrl;
+
+	@TableField("is_read")
+	@ApiModelProperty("已读未读")
+	private Integer isRead;
+}

+ 47 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/InnerFileAndFolder.java

@@ -0,0 +1,47 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-26 11:20
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_inner_file_and_folder")
+public class InnerFileAndFolder extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("dept_id")
+	@NotNull(message = "deptId不可为空")
+	private Long deptId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("parent_id")
+	private Long parentId = 0L;
+
+	@TableField("title")
+	private String title;
+
+	@TableField("type")
+	@ApiModelProperty(value = "1:文件 2:文件夹")
+	@NotNull(message = "type不可为空")
+	private Integer type;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("blade_file_id")
+	private Long bladeFileId;
+
+}

+ 23 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/LineChartData.java

@@ -0,0 +1,23 @@
+package com.wtkj.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-28 01:12
+ * @describe
+ */
+@Data
+public class LineChartData implements Serializable {
+
+	private String name;
+
+	private String type;
+
+	private List<Map<String, Object>> data;
+}
+

+ 17 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/LineChartDataSet.java

@@ -0,0 +1,17 @@
+package com.wtkj.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-28 01:19
+ * @describe
+ */
+@Data
+public class LineChartDataSet implements Serializable {
+
+	private List<LineChartData> lineChartDataList;
+}

+ 53 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Project.java

@@ -2,13 +2,18 @@ package com.wtkj.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @author Blizzard
@@ -25,18 +30,66 @@ public class Project extends BaseEntity {
 	@TableField("project_type")
 	@NotNull(message = "projectType不可为空")
 	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "项目类型id")
 	private Long projectType;
 
+	@TableField("current_stage")
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "当前阶段id")
+	private Long currentStage;
+
 	@TableField("name")
 	private String name;
 
+	@TableField("total_amount")
+	private BigDecimal totalAmount;
+
+	@TableField("construct_content")
+	private String constructContent;
+
 	@TableField("area_code")
 	@NotNull(message = "areaCode不可为空")
+	@ApiModelProperty(value = "地区编码")
 	private String areaCode;
 
 	@TableField("competent_unit")
 	@NotNull(message = "competentUnit不可为空")
 	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "主管单位")
 	private Long competentUnit;
 
+	@TableField("cooperation_unit")
+	@ApiModelProperty(value = "协作单位")
+	private String cooperationUint;
+
+	@TableField("industry_id")
+	@NotNull(message = "industryId不可为空")
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "行业分类")
+	private Long industryId;
+
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	@ApiModelProperty(value = "开始时间")
+	private Date startTime;
+
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	@ApiModelProperty(value = "截止时间")
+	private Date endTime;
+
+	@TableField("year")
+	@ApiModelProperty(value = "年份")
+	private String year;
+
+	@TableField("todo_task")
+	@ApiModelProperty(value = "待完成任务数量")
+	private Integer todoTask = 0;
+
+	@TableField("img_id")
+	@ApiModelProperty(value = "项目图片文件ID")
+	private Long imgId = 1711941608824688642L;
+
+
+
 }

+ 38 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ProjectAuth.java

@@ -0,0 +1,38 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-13 17:21
+ * @describe 第三方机构项目权限
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_project_auth")
+public class ProjectAuth extends BaseEntity {
+	private static final long serialVersionUID = 1L;
+
+
+	@TableField("user_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long userId;
+
+	@TableField("top_dept")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long topDept;
+
+	@TableField("user_dept")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long userDept;
+
+	@TableField("project_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long projectId;
+}

+ 41 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ProjectGroup.java

@@ -0,0 +1,41 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-19 21:22
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@TableName("blade_project_group")
+@Data
+public class ProjectGroup extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@TableField("project_id")
+	@ApiModelProperty(value = "项目id")
+	private Long projectId;
+
+	@TableField("stage_id")
+	@ApiModelProperty(value = "阶段id")
+	private Long stageId;
+
+	@TableField("invite_dept")
+	@ApiModelProperty(value = "发起邀请的机构")
+	private Long inviteDept;
+
+	@TableField("be_invited_dept")
+	@ApiModelProperty(value = "接受邀请的机构")
+	private Long beInvitedDept;
+
+	@TableField("user_id")
+	@ApiModelProperty(value = "接受邀请的用户")
+	private Long userId;
+}

+ 57 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/ProjectStage.java

@@ -0,0 +1,57 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-13 16:15
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_project_stage")
+public class ProjectStage extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@TableField("project_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long projectId;
+
+	@TableField("name")
+	@ApiModelProperty("名称")
+	private String name;
+
+	@TableField("stage_status")
+	@ApiModelProperty("阶段状态:1:正常 2:异常 3:失控")
+	private Integer stageStatus = 1;
+
+	@TableField("sort")
+	@ApiModelProperty("排序")
+	@NotNull(message = "sort不可为空")
+	private Integer sort;
+
+	@TableField("start_time")
+	@ApiModelProperty("阶段周期开始时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date startTime;
+
+	@TableField("end_time")
+	@ApiModelProperty("阶段周期结束时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date endTime;
+}

+ 21 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Qrcode.java

@@ -0,0 +1,21 @@
+package com.wtkj.entity;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-10-11 16:28
+ * @describe
+ */
+public class Qrcode implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private String id;
+
+	private Long createUser;
+
+	private Long topDeptId;
+
+
+}

+ 136 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/Task.java

@@ -0,0 +1,136 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 14:35
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_task")
+public class Task extends BaseEntity {
+	private static final long serialVersionUID = 1L;
+
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("project_id")
+	@NotNull(message = "projectId can't be null")
+	private Long projectId;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("stage_id")
+	@NotNull(message = "stageId can't be null")
+	private Long stageId;
+
+	@TableField("title")
+	private String title;
+
+	@TableField("competent_unit")
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "主管单位")
+	private Long competentUnit;
+
+	@ApiModelProperty(value = "派遣给哪个机构:顶级机构")
+	@NotNull(message = "orgDeptId不可为空")
+	@TableField("org_dept_id")
+	private Long orgDeptId;
+
+	@TableField("task_status")
+	@ApiModelProperty("任务状态:1.待确认 2.进行中 3.已提交 4.已完成 5.已取消")
+	private Integer taskStatus = 1;
+
+	@TableField("is_expire")
+	private Integer isExpire = 0;
+
+	@TableField("level")
+	@ApiModelProperty("优先级")
+	private Integer level;
+
+	@TableField("category")
+	@ApiModelProperty("类别:可研,方案、其他等")
+	private String category;
+
+	@TableField("tags")
+	@ApiModelProperty("标签:新写、修改等")
+	private String tags;
+
+	@TableField("start_time")
+	@ApiModelProperty("开始时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date startTime;
+
+	@TableField("end_time")
+	@ApiModelProperty("截止时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date endTime;
+
+	@TableField("is_confirmed")
+	@ApiModelProperty("是否已经确认完成")
+	private Integer isConfirmed;
+
+	@TableField("confirm_time")
+	@ApiModelProperty("任务完成确认时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date confirmTime;
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty(value = "确认任务完成的用户")
+	@TableField("confirm_user")
+	private Long confirmUser;
+
+	@TableField("remark")
+	@ApiModelProperty("备注")
+	private String remark;
+
+	@TableField("task_process")
+	@ApiModelProperty("任务进展")
+	private String taskProcess;
+
+	@TableField("related_ids")
+	@ApiModelProperty("参考文件的主键id")
+	private String relatedIds;
+
+	@ApiModelProperty(value = "项目经理")
+	@TableField("project_manager")
+	private Long projectManager;
+
+	@ApiModelProperty(value = "第一审查人")
+	@TableField("first_check_user")
+	private Long firstCheckUser;
+
+	@ApiModelProperty(value = "第二审查人")
+	@TableField("second_check_user")
+	private Long secondCheckUser;
+
+	@ApiModelProperty(value = "实际执行部门")
+	@TableField("execute_dept")
+	private Long executeDept;
+
+	@ApiModelProperty(value = "执行人")
+	@TableField("execute_user")
+	private String executeUser;
+
+	@TableField("year")
+	private Integer year;
+
+	@TableField("month")
+	private Integer month;
+
+}

+ 68 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskContract.java

@@ -0,0 +1,68 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-18 09:20
+ * @describe 任务相关合同
+ */
+@EqualsAndHashCode(callSuper = true)
+@TableName("blade_task_contract")
+@Data
+public class TaskContract extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@TableField("project_id")
+	@NotNull(message = "projectId can't be null")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long projectId;
+
+	@TableField("task_id")
+	@NotNull(message = "taskId can't be null")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long taskId;
+
+	@TableField("org_dept_id")
+	@ApiModelProperty(value = "任务执行机构的顶级id,即乙方")
+	@NotNull(message = "orgDeptId can't be null")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long orgDeptId;
+
+	@TableField("blade_file_id")
+	@ApiModelProperty(value = "文件上传完返回的主键id")
+	private String bladeFileId;
+
+	@TableField("amount")
+	@ApiModelProperty(value = "合同金额")
+	private BigDecimal amount;
+
+	@TableField("unpaid_amount")
+	@ApiModelProperty(value = "未付金额")
+	private BigDecimal unpaidAmount;
+
+	@TableField("year")
+	@ApiModelProperty(value = "签订年")
+	private Integer year;
+
+	@TableField("sign_date")
+	@ApiModelProperty(value = "签订日期")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date signDate;
+
+}

+ 44 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskContractPayLog.java

@@ -0,0 +1,44 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author Blizzard
+ * @create at 2023-10-12 15:12
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@TableName("blade_task_contract_pay_log")
+@Data
+public class TaskContractPayLog extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@TableField("contract_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "contractId can't be null")
+	private Long contractId;
+
+	@TableField("pay_amount")
+	private BigDecimal payAmount = BigDecimal.valueOf(0);
+
+	@TableField("pay_time")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date payTime;
+
+	@TableField("blade_file_ids")
+	private String bladeFileIds;
+}

+ 69 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskCost.java

@@ -0,0 +1,69 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-18 11:52
+ * @describe 任务成本核算
+ */
+@EqualsAndHashCode(callSuper = true)
+@TableName("blade_task_cost")
+@Data
+public class TaskCost extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+
+	@TableField("project_id")
+	@NotNull(message = "projectId can't be null")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long projectId;
+
+	@TableField("task_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	@NotNull(message = "taskId can't be null")
+	private Long taskId;
+
+	@ApiModelProperty(value = "成本类型 字典值")
+	@TableField("type")
+	private String type;
+
+	@ApiModelProperty(value = "金额")
+	@TableField("amount")
+	private BigDecimal amount;
+
+	@ApiModelProperty(value = "开始时间")
+	@TableField("start_time")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date startTime;
+
+	@ApiModelProperty(value = "结束时间")
+	@TableField("end_time")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date endTime;
+
+	@ApiModelProperty(value = "交通方式 字典值")
+	@TableField("transportation_mode")
+	private String transportationMode;
+
+	@ApiModelProperty(value = "报销凭证文件ids 上传完成以后返回的主键ID")
+	@TableField("blade_file_ids")
+	private String bladeFileIds;
+
+}

+ 39 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskFile.java

@@ -0,0 +1,39 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 21:09
+ * @describe 任务成果文件
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_task_file")
+public class TaskFile extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+
+	@JsonSerialize(using = ToStringSerializer.class)
+	@TableField("task_id")
+	@ApiModelProperty("任务ID")
+	private Long taskId;
+
+	//blade_file 主键ID
+	@TableField("blade_file_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	@ApiModelProperty("文件上传完以后返回的主键id")
+	private Long bladeFileId;
+
+	@TableField("is_checked")
+	@ApiModelProperty("是否确认")
+	private Integer isChecked;
+}

+ 33 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TaskLog.java

@@ -0,0 +1,33 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 15:35
+ * @describe 任务相关动态
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_task_log")
+public class TaskLog extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+
+	@TableField("task_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long taskId;
+
+	@TableField("content")
+	private String content;
+
+	@TableField("related_user")
+	private String relatedUser;
+}

+ 2 - 2
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TypeAndStage.java → blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/TemplateTypeAndStage.java

@@ -17,9 +17,9 @@ import javax.validation.constraints.NotNull;
  * @describe 项目类型和阶段表
  */
 @Data
-@TableName("blade_type_and_stage")
+@TableName("blade_template_type_and_stage")
 @EqualsAndHashCode(callSuper = true)
-public class TypeAndStage extends BaseEntity {
+public class TemplateTypeAndStage extends BaseEntity {
 
 	private static final long serialVersionUID = 1L;
 

+ 36 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/entity/WorkStatus.java

@@ -0,0 +1,36 @@
+package com.wtkj.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 23:47
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName("blade_work_status")
+public class WorkStatus extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("用户id")
+	@TableField("user_id")
+	@JsonSerialize(using = ToStringSerializer.class)
+	private Long userId;
+
+	@TableField("work_status")
+	@ApiModelProperty("状态图标")
+	private Integer workStatus;
+
+	@TableField("work_status_describe")
+	@ApiModelProperty("状态词")
+	private String workStatusDescribe;
+}

+ 18 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/AnnouncementSendVO.java

@@ -0,0 +1,18 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.Announcement;
+import com.wtkj.entity.AnnouncementSend;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-23 11:33
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class AnnouncementSendVO extends AnnouncementSend {
+
+	private Announcement announcement;
+}

+ 20 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ApplyJoinVO.java

@@ -0,0 +1,20 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.ApplyJoin;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.user.entity.User;
+
+/**
+ * @author Blizzard
+ * @create at 2023-10-06 10:59
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ApplyJoinVO extends ApplyJoin {
+	private static final long serialVersionUID = 1L;
+
+	private User user;
+
+}

+ 38 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/AuthUserInfo.java

@@ -0,0 +1,38 @@
+package com.wtkj.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.system.user.entity.User;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 11:25
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class AuthUserInfo extends BladeUser {
+
+	private static final long serialVersionUID = 1L;
+
+
+	@ApiModelProperty(value = "当前登录用户的顶级部门ID")
+	private Long topDept;
+
+	@ApiModelProperty(value = "当前登录用户的顶级部门")
+	private String topDeptName;
+
+	@ApiModelProperty(value = "机构类别")
+	private Integer deptCategory;
+
+
+	private String deptName;
+
+	private User user;
+
+	private String openId;
+
+
+}

+ 20 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ContactOuterUserVO.java

@@ -0,0 +1,20 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.ContactOuter;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.user.entity.User;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-25 15:28
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ContactOuterUserVO extends ContactOuter {
+
+	private static final long serialVersionUID = 1L;
+
+	private User user;
+}

+ 19 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ContactOuterVO.java

@@ -0,0 +1,19 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.ContactOuter;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-25 15:07
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ContactOuterVO extends ContactOuter {
+
+	private static final long serialVersionUID = 1L;
+
+	private String deptName;
+}

+ 26 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/FileAndFolderHistoryVO.java

@@ -0,0 +1,26 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.FileAndFolderHistory;
+import com.wutong.file.vo.FileVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-26 14:27
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class FileAndFolderHistoryVO extends FileAndFolderHistory {
+
+	private FileVO fileVO;
+
+	private String userName;
+
+	private String deptName;
+
+	private String coverUser;
+
+	private String coverDept;
+}

+ 35 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/FileAndFolderVO.java

@@ -0,0 +1,35 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.FileAndFolder;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 17:14
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class FileAndFolderVO extends FileAndFolder {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "权限 0:无 1:有")
+	private Integer auth = 1;
+
+	private String uploadUser;
+
+	private String uploadDept;
+
+	private Integer fileAmount;
+
+	private String volume;
+
+	private String suffix;
+
+	private String url;
+
+	private String projectName;
+}

+ 32 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/IndexProjectAndTaskSummaryVO.java

@@ -0,0 +1,32 @@
+package com.wtkj.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 14:54
+ * @describe
+ */
+@Data
+public class IndexProjectAndTaskSummaryVO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "项目总数")
+	private Integer projectCount = 0;
+
+	@ApiModelProperty(value = "我参与的")
+	private Integer myProjectCount = 0;
+
+	@ApiModelProperty(value = "任务总数")
+	private Integer taskCount = 0;
+
+	@ApiModelProperty(value = "我的任务")
+	private Integer myTaskCount = 0;
+
+	@ApiModelProperty(value = "今日任务")
+	private Integer todayTask = 0;
+}

+ 28 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/IndexTaskScheduleVO.java

@@ -0,0 +1,28 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.Task;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 16:31
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class IndexTaskScheduleVO extends Task {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "项目名称")
+	private String projectName;
+
+	@ApiModelProperty(value = "项目经理")
+	private String projectManagerUser;
+
+	private List<String> tagsArray;
+}

+ 27 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/InnerFileAndFolderVO.java

@@ -0,0 +1,27 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.InnerFileAndFolder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-26 22:50
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class InnerFileAndFolderVO extends InnerFileAndFolder {
+
+	private static final long serialVersionUID = 1L;
+
+	private String createUserName;
+
+	private Integer fileAmount;
+
+	private String volume;
+
+	private String suffix;
+
+	private String url;
+}

+ 23 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/MyIndexTaskStatistics.java

@@ -0,0 +1,23 @@
+package com.wtkj.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-21 10:20
+ * @describe
+ */
+@Data
+public class MyIndexTaskStatistics implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Integer all = 0;
+
+	private Integer todayTodo = 0;
+
+	private Integer expire = 0;
+
+}

+ 33 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/MyTaskStatistics.java

@@ -0,0 +1,33 @@
+package com.wtkj.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-18 15:52
+ * @describe
+ */
+@Data
+public class MyTaskStatistics implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	private Integer all = 0;
+
+	private Integer completed = 0;
+
+	private Integer notCompleted = 0;
+
+	private Integer overdue = 0;
+
+	private Integer toConfirmed = 0;
+
+	private Integer timeToConfirm = 0;
+
+	private Integer todayToExpire = 0;
+
+	private Integer overdueComplete = 0;
+
+
+}

+ 28 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ProjectGroupVO.java

@@ -0,0 +1,28 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.ProjectGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.user.entity.User;
+
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 09:30
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProjectGroupVO extends ProjectGroup {
+
+	private static final long serialVersionUID = 1L;
+
+	private String deptName;
+
+	private Integer size;
+
+	private List<User> users;
+
+
+}

+ 21 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ProjectStageVO.java

@@ -0,0 +1,21 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.ProjectStage;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-28 14:20
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProjectStageVO extends ProjectStage {
+
+	private static final long serialVersionUID = 1L;
+
+	private Integer fileAmount = 0;
+
+
+}

+ 33 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ProjectStatisticsVO.java

@@ -0,0 +1,33 @@
+package com.wtkj.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-21 10:47
+ * @describe
+ */
+@Data
+public class ProjectStatisticsVO implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "项目总数")
+	private Integer projectCount = 0;
+
+	@ApiModelProperty(value = "项目总投资")
+	private BigDecimal totalAmount = BigDecimal.valueOf(0);
+
+	@ApiModelProperty(value = "服务合同总投资")
+	private BigDecimal contractAmount = BigDecimal.valueOf(0);
+
+	@ApiModelProperty(value = "待完成任务总数")
+	private Integer todoTask = 0;
+
+	@ApiModelProperty(value = "风险预警")
+	private Integer warns = 0;
+}

+ 23 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ProjectVO.java

@@ -0,0 +1,23 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.Project;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-16 23:07
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProjectVO extends Project {
+
+	private static final long serialVersionUID = 1L;
+
+	private String currentStageName;
+
+	private String imgUrl;
+
+	private String competentUnitName;
+}

+ 27 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/ScheduleUserVO.java

@@ -0,0 +1,27 @@
+package com.wtkj.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.system.user.entity.User;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 22:02
+ * @describe
+ */
+@Data
+public class ScheduleUserVO implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty(value = "用户")
+	private User user;
+
+	@ApiModelProperty(value = "今日待完成")
+	private Integer todayTodo = 0;
+
+	@ApiModelProperty(value = "逾期任务")
+	private Integer todayExpire = 0;
+
+}

+ 27 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskContractPayLogVO.java

@@ -0,0 +1,27 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.TaskContractPayLog;
+import com.wutong.file.vo.FileVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-10-12 15:43
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskContractPayLogVO extends TaskContractPayLog {
+
+	private static final long serialVersionUID = 1L;
+
+	private List<FileVO> files;
+
+	private String createUserName;
+
+	private String createDeptName;
+
+}

+ 25 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskContractVO.java

@@ -0,0 +1,25 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.TaskContract;
+import com.wutong.file.vo.FileVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-18 10:33
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskContractVO extends TaskContract {
+
+	private static final long serialVersionUID = 1L;
+
+	private String partyB;
+
+	private List<FileVO> fileVO;
+
+}

+ 24 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskCostVO.java

@@ -0,0 +1,24 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.TaskCost;
+import com.wutong.file.vo.FileVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-18 14:26
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskCostVO extends TaskCost {
+
+	private static final long serialVersionUID = 1L;
+
+	private String submitUser;
+
+	private List<FileVO> files;
+}

+ 24 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskFileVO.java

@@ -0,0 +1,24 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.TaskFile;
+import com.wutong.file.vo.FileVO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 21:45
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskFileVO extends TaskFile {
+
+	private static final long serialVersionUID = 1L;
+
+	private FileVO fileVO;
+
+	private String fileName;
+
+	private String createUserName;
+}

+ 18 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskLogVO.java

@@ -0,0 +1,18 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.TaskLog;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 16:58
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskLogVO extends TaskLog {
+
+	private static final long serialVersionUID = 1L;
+
+}

+ 42 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/TaskVO.java

@@ -0,0 +1,42 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.FileAndFolder;
+import com.wtkj.entity.Task;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.user.entity.User;
+
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 16:18
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskVO extends Task {
+	private static final long serialVersionUID = 1L;
+
+	private String projectName;
+
+	private String projectManagerUser;
+
+	private String dispatchUintName;
+
+	private String executeDeptName;
+
+	private String createUserName;
+
+	private List<FileAndFolder> files;
+
+	private User firstUser;
+
+	private User secondUser;
+
+	private List<String> executeUsers;
+
+	private List<String> tagsArray;
+
+	private List<Long> checkUserIds;
+}

+ 20 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/UserStatusVO.java

@@ -0,0 +1,20 @@
+package com.wtkj.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.user.entity.User;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-16 00:06
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class UserStatusVO extends User {
+
+	private static final long serialVersionUID = 1L;
+
+
+	private String workStatus;
+}

+ 18 - 0
blade-service-api/wt-okr-api/src/main/java/com/wtkj/vo/WorkStatusVO.java

@@ -0,0 +1,18 @@
+package com.wtkj.vo;
+
+import com.wtkj.entity.WorkStatus;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-16 00:01
+ * @describe
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class WorkStatusVO extends WorkStatus {
+
+	private static final long serialVersionUID = 1L;
+
+}

+ 9 - 10
blade-service/pom.xml

@@ -2,34 +2,33 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>com.wtkj</groupId>
         <artifactId>wt-service-okr</artifactId>
-        <version>1.0.RELEASE</version>
+        <groupId>org.springblade</groupId>
+        <version>2.9.1.RELEASE</version>
     </parent>
 
     <artifactId>blade-service</artifactId>
     <packaging>pom</packaging>
-
-    <name>blade-service</name>
+    <version>2.9.1.RELEASE</version>
+    <name>${project.artifactId}</name>
 
     <modules>
-        <module>wt-okr</module>
+        <module>wutong-okr</module>
     </modules>
 
 
     <dependencies>
         <dependency>
             <groupId>org.springblade</groupId>
-            <artifactId>blade-starter-tenant</artifactId>
+            <artifactId>blade-biz-common</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springblade</groupId>
-            <artifactId>blade-starter-api-crypto</artifactId>
+            <artifactId>blade-starter-tenant</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.wtkj</groupId>
-            <artifactId>blade-common</artifactId>
-            <version>1.0.RELEASE</version>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-api-crypto</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springblade</groupId>

+ 0 - 67
blade-service/wt-okr/pom.xml

@@ -1,67 +0,0 @@
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>com.wtkj</groupId>
-        <artifactId>blade-service</artifactId>
-        <version>1.0.RELEASE</version>
-    </parent>
-
-    <artifactId>wt-okr</artifactId>
-    <packaging>jar</packaging>
-    <name>wt-okr</name>
-
-
-    <dependencies>
-        <dependency>
-            <groupId>org.springblade</groupId>
-            <artifactId>blade-core-boot</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springblade</groupId>
-            <artifactId>blade-starter-swagger</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.wtkj</groupId>
-            <artifactId>wt-okr-api</artifactId>
-            <version>1.0.RELEASE</version>
-        </dependency>
-    </dependencies>
-
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.spotify</groupId>
-                <artifactId>dockerfile-maven-plugin</artifactId>
-                <configuration>
-                    <username>${docker.username}</username>
-                    <password>${docker.password}</password>
-                    <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
-                    <tag>${project.version}</tag>
-                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
-                    <buildArgs>
-                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
-                    </buildArgs>
-                    <skip>false</skip>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-antrun-plugin</artifactId>
-            </plugin>
-
-            <!--不打包test-->
-            <!--<plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.12.4</version>
-                <configuration>
-                    <skipTests>true</skipTests>
-                </configuration>
-            </plugin>-->
-            <!--不打包tes-->
-        </plugins>
-    </build>
-
-</project>

+ 0 - 38
blade-service/wt-okr/src/main/java/com/wtkj/controller/ProjectController.java

@@ -1,38 +0,0 @@
-package com.wtkj.controller;
-
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import com.wtkj.entity.Project;
-import com.wtkj.service.IProjectService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.AllArgsConstructor;
-import org.springblade.core.tool.api.R;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author Blizzard
- * @create at 2023-09-13 15:50
- * @describe
- */
-@RestController
-@AllArgsConstructor
-@RequestMapping("/project")
-@Api(value = "项目模块", tags = "项目模块")
-public class ProjectController {
-
-	private final IProjectService projectService;
-
-	/**
-	 * 创建/修改项目
-	 */
-	@PostMapping("/submit")
-	@ApiOperation(value = "新建或者修改项目", notes = "传入project")
-	@ApiOperationSupport(order = 1)
-	public R<Boolean> create(@RequestBody Project project) {
-		return R.status(projectService.saveOrUpdate(project));
-	}
-
-}

+ 0 - 12
blade-service/wt-okr/src/main/java/com/wtkj/service/IProjectService.java

@@ -1,12 +0,0 @@
-package com.wtkj.service;
-
-import com.wtkj.entity.Project;
-import org.springblade.core.mp.base.BaseService;
-
-/**
- * @author Blizzard
- * @create at 2023-09-13 16:00
- * @describe
- */
-public interface IProjectService extends BaseService<Project> {
-}

+ 0 - 16
blade-service/wt-okr/src/main/java/com/wtkj/service/ITypeAndStageService.java

@@ -1,16 +0,0 @@
-package com.wtkj.service;
-
-import com.wtkj.entity.TypeAndStage;
-import org.springblade.core.mp.base.BaseService;
-
-/**
- * @author Jimi Zhang
- * @create at 2022-12-12 14:05
- * @describe
- */
-public interface ITypeAndStageService extends BaseService<TypeAndStage> {
-
-
-	boolean submit(TypeAndStage typeAndStage);
-
-}

+ 0 - 18
blade-service/wt-okr/src/main/java/com/wtkj/service/impl/ProjectServiceImpl.java

@@ -1,18 +0,0 @@
-package com.wtkj.service.impl;
-
-import com.wtkj.entity.Project;
-import com.wtkj.mapper.ProjectMapper;
-import com.wtkj.service.IProjectService;
-import lombok.AllArgsConstructor;
-import org.springblade.core.mp.base.BaseServiceImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * @author Blizzard
- * @create at 2023-09-13 16:00
- * @describe
- */
-@Service
-@AllArgsConstructor
-public class ProjectServiceImpl extends BaseServiceImpl<ProjectMapper, Project> implements IProjectService {
-}

+ 150 - 0
blade-service/wutong-okr/pom.xml

@@ -0,0 +1,150 @@
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>blade-service</artifactId>
+        <groupId>org.springblade</groupId>
+        <version>2.9.1.RELEASE</version>
+    </parent>
+
+    <groupId>com.wtkj</groupId>
+    <artifactId>wutong-okr</artifactId>
+    <name>${project.artifactId}</name>
+    <version>${bladex.project.version}</version>
+    <packaging>jar</packaging>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-core-boot</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-swagger</artifactId>
+        </dependency>
+
+
+        <!--数据导出-->
+        <!--        <dependency>-->
+        <!--            <groupId>org.springblade</groupId>-->
+        <!--            <artifactId>blade-starter-excel</artifactId>-->
+        <!--        </dependency>-->
+
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-base</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
+
+        <!--        分布式事务-->
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-starter-transaction</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!--        es-->
+        <dependency>
+            <groupId>co.elastic.clients</groupId>
+            <artifactId>elasticsearch-java</artifactId>
+            <version>8.6.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.elasticsearch.client</groupId>
+            <artifactId>elasticsearch-rest-client</artifactId>
+            <version>8.6.1</version>
+        </dependency>
+
+        <!--        <dependency>-->
+        <!--            <groupId>com.fasterxml.jackson.core</groupId>-->
+        <!--            <artifactId>jackson-databind</artifactId>-->
+        <!--            <version>2.12.3</version>-->
+        <!--        </dependency>-->
+
+        <dependency>
+            <groupId>jakarta.json</groupId>
+            <artifactId>jakarta.json-api</artifactId>
+            <version>2.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.kafka</groupId>
+            <artifactId>spring-kafka</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.5.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. -->
+            <!-- 请到https://search.maven.org/search?q=tencentcloud-sdk-java查询所有版本,最新版本如下 -->
+            <version>3.1.875</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.wtkj</groupId>
+            <artifactId>wt-okr-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <username>${docker.username}</username>
+                    <password>${docker.password}</password>
+                    <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
+                    <tag>${project.version}</tag>
+                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
+                    <buildArgs>
+                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+            </plugin>
+
+            <!--不打包test-->
+            <!--<plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.12.4</version>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>-->
+            <!--不打包tes-->
+        </plugins>
+    </build>
+
+</project>

+ 3 - 2
blade-service/wt-okr/src/main/java/com/wtkj/OKRServiceApplication.java → blade-service/wutong-okr/src/main/java/com/wtkj/OKRServiceApplication.java

@@ -3,15 +3,16 @@ package com.wtkj;
 import org.springblade.common.constant.LauncherConstant;
 import org.springblade.core.cloud.feign.EnableBladeFeign;
 import org.springblade.core.launch.BladeApplication;
-import org.springframework.cloud.client.SpringCloudApplication;
+import org.springblade.core.transaction.annotation.SeataCloudApplication;
 
 /**
  * @author Blizzard
  * @create at 2023-09-13 11:12
  * @describe
  */
-@SpringCloudApplication
+
 @EnableBladeFeign
+@SeataCloudApplication
 public class OKRServiceApplication {
 	public static void main(String[] args) {
 		BladeApplication.run(LauncherConstant.APPLICATION_SERVICE_NAME, OKRServiceApplication.class);

+ 0 - 0
blade-service/wt-okr/src/main/java/com/wtkj/config/AsyncConfig.java → blade-service/wutong-okr/src/main/java/com/wtkj/config/AsyncConfig.java


+ 18 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/config/FeignConfig.java

@@ -0,0 +1,18 @@
+package com.wtkj.config;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 09:20
+ * @describe
+ */
+@Configuration
+@ComponentScan({"org.springblade", "com.wutong"})
+@EnableFeignClients({"org.springblade", "com.wutong"})
+@MapperScan({"org.springblade.**.mapper.**", "com.wtkj.**.mapper.**"})
+public class FeignConfig {
+}

+ 83 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/config/KafkaConfig.java

@@ -0,0 +1,83 @@
+package com.wtkj.config;
+
+import lombok.AllArgsConstructor;
+import org.apache.kafka.clients.admin.NewTopic;
+import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.kafka.annotation.EnableKafka;
+import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
+import org.springframework.kafka.core.*;
+import org.springframework.kafka.listener.ContainerProperties;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-27 11:27
+ * @describe
+ */
+@Configuration(proxyBeanMethods = false)
+@EnableConfigurationProperties({KafkaProperties.class})
+@EnableKafka
+@AllArgsConstructor
+public class KafkaConfig {
+
+	private final KafkaProperties kafkaProperties;
+
+
+	/**
+	 * topic 配置 启动自动创建 已经存在不会创建
+	 */
+	@Bean
+	public NewTopic kafkaTopic() {
+		return new NewTopic(KafkaConstant.PARSE_SUCCESS_MESSAGE, KafkaConstant.DEFAULT_PARTITION_NUM, (short) 1);
+	}
+
+	@Bean
+	public KafkaTemplate<String, String> kafkaTemplate() {
+		return new KafkaTemplate<>(producerFactory());
+	}
+
+	/**
+	 * 生产者配置
+	 */
+	@Bean
+	public ProducerFactory<String, String> producerFactory() {
+		return new DefaultKafkaProducerFactory<>(kafkaProperties.buildProducerProperties());
+	}
+
+	/**
+	 * 消费者配置
+	 */
+	@Bean
+	public ConsumerFactory<String, String> consumerFactory() {
+		return new DefaultKafkaConsumerFactory<>(kafkaProperties.buildConsumerProperties());
+	}
+
+	/**
+	 * 监听器配置1
+	 */
+	@Bean
+	public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
+		ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
+		factory.setConsumerFactory(consumerFactory());
+		//分区大小
+		factory.setConcurrency(KafkaConstant.DEFAULT_PARTITION_NUM);
+		factory.setBatchListener(true);
+		factory.getContainerProperties().setPollTimeout(3000);
+		return factory;
+	}
+
+
+	@Bean("ackContainerFactory")
+	public ConcurrentKafkaListenerContainerFactory<String, String> ackContainerFactory() {
+		ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
+		factory.setConsumerFactory(consumerFactory());
+		factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);
+		//3个分区
+		factory.setConcurrency(KafkaConstant.DEFAULT_PARTITION_NUM);
+		return factory;
+	}
+
+
+}

+ 16 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/config/KafkaConstant.java

@@ -0,0 +1,16 @@
+package com.wtkj.config;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-27 11:22
+ * @describe
+ */
+public interface KafkaConstant {
+
+	//分区数量
+	Integer DEFAULT_PARTITION_NUM = 3;
+
+	//项目文件解析成功消息处理topic
+	String PARSE_SUCCESS_MESSAGE = "parse-success-message-topic";
+
+}

+ 39 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/config/MagicValue.java

@@ -0,0 +1,39 @@
+package com.wtkj.config;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 09:17
+ * @describe
+ */
+public interface MagicValue {
+
+	/**
+	 * 业主机构管理员
+	 */
+	String DEPT_ADMIN = "deptAdmin";
+
+	/**
+	 * 服务机构管理员
+	 */
+	String STAFF_ADMIN = "staff_admin";
+
+	/**
+	 * 服务机构次级管理员
+	 */
+	String STAFF_SECOND_ADMIN = "staff_second_admin";
+
+	/**
+	 * 服务机构
+	 */
+	String STAFF_PROJECT_MANAGER = "staff_project_manager";
+
+	String STAFF_USER = "staff_user";
+
+	Integer ZERO = 0;
+
+	Integer ONE = 1;
+
+	Integer TWO = 2;
+
+	String PROJECT_RESOURCE_INDEX = "project_resource_index";
+}

+ 62 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/config/NacosConfigValue.java

@@ -0,0 +1,62 @@
+package com.wtkj.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-19 11:08
+ * @describe nacos配置中心读取 配置
+ */
+@Configuration
+public class NacosConfigValue {
+
+
+	public static long expireIn;
+
+	public static long scanCount;
+
+	public static String corpId;
+	public static String qyAgentId;
+
+	public static String qySecret;
+
+	public static String txSecretId;
+
+	public static String txSecretKey;
+
+	@Value("${qrcode.expireIn}")
+	public void setExpireIn(Long expireIn) {
+		NacosConfigValue.expireIn = expireIn;
+	}
+
+	@Value("${qrcode.scanCount}")
+	public void setScanCount(Long scanCount) {
+		NacosConfigValue.scanCount = scanCount;
+	}
+
+	@Value("${qy.corpId}")
+	public void setCorpId(String corpId) {
+		NacosConfigValue.corpId = corpId;
+	}
+
+	@Value("${qy.agentId}")
+	public void setCpAgentId(String qyAgentId) {
+		NacosConfigValue.qyAgentId = qyAgentId;
+	}
+
+	@Value("${qy.secret}")
+	public void setCpSecret(String qySecret) {
+		NacosConfigValue.qySecret = qySecret;
+	}
+
+	@Value("${txCloud.secretId}")
+	public void setTxSecretId(String secretId) {
+		NacosConfigValue.txSecretId = secretId;
+	}
+
+	@Value("${txCloud.secretKey}")
+	public void setTxSecretKey(String secretKey) {
+		NacosConfigValue.txSecretKey = secretKey;
+	}
+}

+ 67 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/config/es/EsConfig.java

@@ -0,0 +1,67 @@
+//package com.wtkj.config.es;
+//
+//import co.elastic.clients.elasticsearch.ElasticsearchClient;
+//import co.elastic.clients.json.jackson.JacksonJsonpMapper;
+//import co.elastic.clients.transport.ElasticsearchTransport;
+//import co.elastic.clients.transport.rest_client.RestClientTransport;
+//import org.apache.http.HttpHost;
+//import org.elasticsearch.client.RestClient;
+//import org.elasticsearch.client.RestClientBuilder;
+//import org.elasticsearch.client.RestHighLevelClient;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.util.StringUtils;
+//
+///**
+// * @author Blizzard
+// * @create at 2023-09-27 10:03
+// * @describe
+// */
+//@Configuration
+//public class EsConfig {
+//
+//	@Value("${spring.elasticsearch.rest.uris}")
+//	private String hosts;
+//
+//
+//	private HttpHost[] toHttpHost() {
+//		if (!StringUtils.hasLength(hosts)) {
+//			throw new RuntimeException("invalid elasticsearch configuration. elasticsearch.hosts不能为空!");
+//		}
+//
+//		// 多个IP逗号隔开
+//		String[] hostArray = hosts.split(",");
+//		HttpHost[] httpHosts = new HttpHost[hostArray.length];
+//		HttpHost httpHost;
+//		for (int i = 0; i < hostArray.length; i++) {
+//			String[] strings = hostArray[i].split(":");
+//			httpHost = new HttpHost(strings[0], Integer.parseInt(strings[1]), "http");
+//			httpHosts[i] = httpHost;
+//		}
+//
+//		return httpHosts;
+//	}
+//
+//
+//	@Bean
+//	public ElasticsearchClient elasticsearchClient() {
+//		HttpHost[] httpHost = toHttpHost();
+//		RestClient restClient = RestClient.builder(httpHost).build();
+//		// Create the transport with a Jackson mapper
+//		ElasticsearchTransport transport = new RestClientTransport(
+//			restClient, new JacksonJsonpMapper());
+//
+//		// And create the API client
+//		return new ElasticsearchClient(transport);
+//	}
+//
+//	@Bean
+//	public RestHighLevelClient esRestClient() {
+//		RestClientBuilder builder;
+//		builder = RestClient.builder(toHttpHost());
+//		return new RestHighLevelClient(builder);
+//	}
+//
+//
+//}

+ 156 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/AnnouncementController.java

@@ -0,0 +1,156 @@
+package com.wtkj.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.entity.Announcement;
+import com.wtkj.entity.AnnouncementSend;
+import com.wtkj.service.IAnnouncementSendService;
+import com.wtkj.service.IAnnouncementService;
+import com.wtkj.vo.AnnouncementSendVO;
+import com.wtkj.wrapper.AnnouncementSendWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-23 11:24
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/announcement")
+@Api(value = "通知公告模块", tags = "通知公告模块")
+public class AnnouncementController {
+
+	private final IAnnouncementService announcementService;
+	private final IAnnouncementSendService announcementSendService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入announcement")
+	public R<Announcement> detail(Announcement announcement) {
+		Announcement detail = announcementService.getOne(Condition.getQueryWrapper(announcement));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 系统通告表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入announcement")
+	public R<IPage<Announcement>> list(Announcement announcement, Query query) {
+		IPage<Announcement> pages = announcementService.page(Condition.getPage(query), Condition.getQueryWrapper(announcement));
+		return R.data(pages);
+	}
+
+
+	/**
+	 * 新增或修改 系统通告表
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "新增或修改", notes = "传入announcement")
+	public R submit(@Valid @RequestBody Announcement announcement) {
+		return R.status(announcementService.saveOrUpdate(announcement));
+	}
+
+
+	/**
+	 * 删除 系统通告表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(announcementService.deleteLogic(Func.toLongList(ids)));
+	}
+
+
+	@GetMapping("/send-detail")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "发送详情", notes = "传入announcementSend")
+	public R<AnnouncementSendVO> detail(AnnouncementSend announcementSend) {
+		AnnouncementSend detail = announcementSendService.getOne(Condition.getQueryWrapper(announcementSend));
+		return R.data(AnnouncementSendWrapper.build().entityVO(detail));
+	}
+
+
+	/**
+	 * 自定义分页 获取用户消息列表
+	 */
+	@GetMapping("/send-page")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "发送分页", notes = "")
+	public R<IPage<AnnouncementSendVO>> page(Query query) {
+		Long userId = AuthUtil.getUserId();
+		if (userId == -1L) {
+			return R.fail("获取用户信息失败!");
+		}
+		IPage<AnnouncementSend> pages = announcementSendService.selectAnnouncementSendPage(Condition.getPage(query), userId);
+		return R.data(AnnouncementSendWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 获取用户未读消息数量
+	 */
+	@GetMapping("/send-notReadCount")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "获取用户未读消息数量", notes = "")
+	public R notReadCount() {
+		Long userId = AuthUtil.getUserId();
+		if (userId == -1L) {
+			return R.fail("获取用户信息失败!");
+		}
+		return R.data(announcementSendService.notReadCount(userId));
+	}
+
+
+	/**
+	 * 用户阅读状态修改
+	 */
+	@PostMapping("/send-read")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "用户阅读状态修改", notes = "传入id")
+	public R read(@ApiParam(value = "主键ID", required = true) @RequestParam Long id) {
+		return R.status(announcementSendService.updateReadFlag(id));
+	}
+
+	/**
+	 * 用户阅读状态修改
+	 */
+	@PostMapping("/send-allRead")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "一键全部已读", notes = "")
+	public R allRead() {
+		Long userId = AuthUtil.getUserId();
+		if (userId == -1L) {
+			return R.fail("获取用户信息失败!");
+		}
+		return R.status(announcementSendService.allRead(userId));
+	}
+
+
+	/**
+	 * 删除 用户通告阅读标记表
+	 */
+	@PostMapping("/send-remove")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "发送逻辑删除", notes = "传入ids")
+	public R removeSend(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(announcementSendService.deleteLogic(Func.toLongList(ids)));
+	}
+}

+ 62 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/CommonController.java

@@ -0,0 +1,62 @@
+package com.wtkj.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.service.ICommonService;
+import com.wtkj.service.ITaskService;
+import com.wtkj.util.Workload;
+import com.wtkj.vo.AuthUserInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.annotation.PreAuth;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.RoleConstant;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 11:13
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/common")
+@Api(value = "公共模块", tags = "公共模块")
+public class CommonController {
+
+	private final ITaskService taskService;
+	private final ICommonService commonService;
+
+	/**
+	 * 当前登录用户信息
+	 */
+	@GetMapping("/user-info")
+	@ApiOperation(value = "当前登录用户信息", notes = "")
+	@ApiOperationSupport(order = 1)
+	public R<AuthUserInfo> userInfo() {
+		return R.data(commonService.userInfo());
+	}
+
+
+	/**
+	 * 导出工作量
+	 */
+	@GetMapping("/export-task")
+	@ApiOperation(value = "工作量导出", notes = "")
+	@ApiOperationSupport(order = 2)
+	@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
+	public void export(@RequestParam String date, HttpServletResponse response) throws IOException {
+
+		List<Workload> list = taskService.exportList(date);
+		taskService.export(list, response);
+
+	}
+
+}

+ 83 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/ContactController.java

@@ -0,0 +1,83 @@
+package com.wtkj.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.dto.UpdateUserDTO;
+import com.wtkj.entity.ContactOuter;
+import com.wtkj.service.IContactOuterService;
+import com.wtkj.service.IWorkStatusService;
+import com.wtkj.vo.WorkStatusVO;
+import com.wtkj.wrapper.ContactOuterUserWrapper;
+import com.wtkj.wrapper.ContactOuterWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-20 11:58
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/contact")
+@Api(value = "联系人模块", tags = "联系人模块")
+public class ContactController {
+
+	private final IContactOuterService contactOuterService;
+	private final IWorkStatusService workStatusService;
+
+
+	/**
+	 * 外部联系人
+	 */
+	@GetMapping("/outer-dept")
+	@ApiOperation(value = "外部联系人机构分页", notes = "传入分页参数")
+	@ApiOperationSupport(order = 1)
+	public R address(Query query) {
+		IPage<ContactOuter> page = contactOuterService.selectPage(AuthUtil.getUserId(), Condition.getPage(query));
+		return R.data(ContactOuterWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 外部联系人分页
+	 */
+	@GetMapping("/outer-contact")
+	@ApiOperation(value = "外部联系人分页", notes = "传入deptId 分页参数")
+	@ApiOperationSupport(order = 2)
+	public R contactPage(@RequestParam Long deptId, Query query) {
+		IPage<ContactOuter> page = contactOuterService.contactPage(deptId, AuthUtil.getUserId(), Condition.getPage(query));
+		return R.data(ContactOuterUserWrapper.build().pageVO(page));
+	}
+
+
+	/**
+	 * 用户工作状态
+	 */
+	@GetMapping("/user-workStatus")
+	@ApiOperation(value = "用户工作状态", notes = "传入userId")
+	@ApiOperationSupport(order = 3)
+	public R workStatus(@RequestParam Long userId) {
+		WorkStatusVO workStatusVO = workStatusService.workStatus(userId);
+		return R.data(workStatusVO);
+	}
+
+	/**
+	 * 修改用户信息
+	 */
+	@PostMapping("/update-user")
+	@ApiOperation(value = "修改用户信息", notes = "传入")
+	@ApiOperationSupport(order = 3)
+	public R updateUser(@RequestBody @Valid UpdateUserDTO dto) {
+		return R.status(contactOuterService.updateUser(dto));
+	}
+
+
+}

+ 231 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/FileAndFolderController.java

@@ -0,0 +1,231 @@
+package com.wtkj.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.dto.SelectFileDTO;
+import com.wtkj.dto.UploadFileDTO;
+import com.wtkj.entity.FileAndFolder;
+import com.wtkj.entity.FileAndFolderHistory;
+import com.wtkj.entity.FileRead;
+import com.wtkj.service.ICommonService;
+import com.wtkj.service.IFileAndFolderHistoryService;
+import com.wtkj.service.IFileAndFolderService;
+import com.wtkj.service.IFileReadService;
+import com.wtkj.vo.FileAndFolderVO;
+import com.wtkj.wrapper.FileAndFolderHistoryWrapper;
+import com.wtkj.wrapper.FileAndFolderWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Objects;
+
+import static com.wtkj.config.MagicValue.ONE;
+import static com.wtkj.config.MagicValue.TWO;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-14 15:06
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/file-and-folder")
+@Api(value = "文件和文件夹模块", tags = "文件和文件夹模块")
+public class FileAndFolderController {
+
+	public final IFileAndFolderHistoryService historyService;
+	private final IFileAndFolderService fileAndFolderService;
+	private final ICommonService commonService;
+	private final IFileReadService fileReadService;
+
+	/**
+	 * 新建文件夹
+	 */
+	@PostMapping("/submit")
+	@ApiOperation(value = "创建修改文件夹或者文件", notes = "")
+	@ApiOperationSupport(order = 1)
+	public R<Boolean> createFolder(@RequestBody FileAndFolder folder) {
+		LambdaQueryWrapper<FileAndFolder> lqw = new LambdaQueryWrapper<>();
+		lqw.eq(FileAndFolder::getStageId, folder.getStageId());
+		lqw.eq(FileAndFolder::getTitle, folder.getTitle());
+		lqw.eq(FileAndFolder::getParentId, folder.getParentId());
+		if (folder.getIsPrivate() == 1) {
+			folder.setPrivateUser(AuthUtil.getUserId());
+		}
+		if (Objects.equals(folder.getType(), ONE)) {
+			lqw.eq(FileAndFolder::getType, ONE);
+			long cnt = fileAndFolderService.count(lqw);
+			if (cnt > 0L) {
+				throw new ServiceException("此项目阶段下已经存在同名文件");
+			}
+		} else if (Objects.equals(folder.getType(), TWO)) {
+			lqw.eq(FileAndFolder::getType, TWO);
+			long cnt = fileAndFolderService.count(lqw);
+			if (cnt > 0L) {
+				throw new ServiceException("此项目阶段下已经存在同名文件夹");
+			}
+		}
+		return R.status(fileAndFolderService.saveOrUpdate(folder));
+	}
+
+	/**
+	 * 上传文件
+	 */
+	@PostMapping("/upload-file")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "上传文件提示覆盖", notes = "")
+	public R<Boolean> uploadFile(@Valid @RequestBody List<UploadFileDTO> files) {
+		//判断是否存在重名文件
+		boolean isExist = fileAndFolderService.isExistSameName(files);
+		if (isExist) {
+			//存同名文件 提示
+			return R.fail("存在重名文件,是否覆盖");
+		} else {
+			//不存在同名文件 直接上传
+			return R.status(commonService.uploadFile(files));
+		}
+	}
+
+	/**
+	 * 文件覆盖
+	 */
+	@PostMapping("/cover-file")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "上传直接覆盖同名文件", notes = "")
+	public R<Boolean> coverFile(@Valid @RequestBody List<UploadFileDTO> files) {
+		return R.status(commonService.coverFile(files));
+	}
+
+	/**
+	 * 阶段下的文件夹和文件
+	 */
+	@GetMapping("/page-by-stage")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "阶段下的顶级文件和文件夹", notes = "")
+	public R<IPage<FileAndFolderVO>> pageByStage(@RequestParam("stageId") Long stageId, @RequestParam Integer type, Query query) {
+		IPage<FileAndFolder> page = fileAndFolderService.pageByStageId(stageId, type, Condition.getPage(query));
+		return R.data(FileAndFolderWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 文件夹下的文件和文件夹
+	 */
+	@GetMapping("/page-by-parent")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "文件夹下的文件和文件夹", notes = "")
+	public R<IPage<FileAndFolderVO>> pageByParentId(@RequestParam("parentId") Long parentId, @RequestParam Integer type, Query query) {
+		IPage<FileAndFolder> page = fileAndFolderService.pageByParentId(parentId, type, Condition.getPage(query));
+		return R.data(FileAndFolderWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 文件夹下的文件数量  页码数量
+	 */
+	@GetMapping("/file-and-page-amount")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "文夹下的文件数量", notes = "传入文件夹主键id")
+	public R<JSONObject> getPageAmount(@RequestParam Long stageId, @RequestParam Long parentId) {
+		return R.data(fileAndFolderService.getPageAndFileAmount(stageId, parentId));
+	}
+
+	/**
+	 * 删除文件/文件夹
+	 */
+	@GetMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "删除文件夹或文件", notes = "")
+	public R<Boolean> delete(@RequestParam String ids) {
+		return R.status(commonService.remove(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 文件或者文件夹移动
+	 */
+	@GetMapping("/move")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "移动文件或者文件夹", notes = "")
+	public R<Boolean> move(String ids, Long stageId, Long parentId) {
+		return R.status(commonService.move(ids, stageId, parentId));
+	}
+
+	/**
+	 * 文件详情
+	 */
+	@GetMapping("/file-detail")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "文件详情", notes = "")
+	public R<FileAndFolderVO> detail(@RequestParam Long id) {
+		FileAndFolder byId = fileAndFolderService.getById(id);
+		return R.data(FileAndFolderWrapper.build().entityVO(byId));
+	}
+
+	/**
+	 * 阅读文件
+	 */
+	@PostMapping("/read-file")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "阅读文件", notes = "")
+	public R<Boolean> readFile(@RequestBody FileRead read) {
+		return R.status(fileReadService.readFile(read));
+	}
+
+
+	/**
+	 * 文件选择列表
+	 */
+	@PostMapping("/select-file")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "选择文件", notes = "")
+	public R selectFile(@RequestBody @Valid SelectFileDTO dto) {
+		Query query = new Query();
+		query.setCurrent(dto.getCurrent());
+		query.setSize(dto.getSize());
+		IPage<FileAndFolder> page = fileAndFolderService.selectPage(dto.getProjectId(), dto.getStageId(), dto.getIsLatest(), Condition.getPage(query));
+		return R.data(FileAndFolderWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 文件历史
+	 */
+	@GetMapping("/v2/file-history")
+	@ApiOperationSupport(order = 21)
+	@ApiOperation(value = "文件历史", notes = "传入fileId字段,注意非主键id")
+	public R fileHistory(@RequestParam String fileId, Query query) {
+		IPage<FileAndFolderHistory> page = historyService.getPage(fileId, Condition.getPage(query));
+		return R.data(FileAndFolderHistoryWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 文件阅读记录
+	 */
+	@GetMapping("/file-read-user")
+	@ApiOperationSupport(order = 22)
+	@ApiOperation(value = "文件阅读人", notes = "传入文件id")
+	public R fileRead(@RequestParam String bladeFileId) {
+		return R.data(fileReadService.fileRead(bladeFileId));
+	}
+
+	/**
+	 * 是否阅读过
+	 */
+	@GetMapping("/is-read")
+	@ApiOperationSupport(order = 23)
+	@ApiOperation(value = "是否阅过文件", notes = "传入文件id")
+	public R isRead(@RequestParam String bladeFileId) {
+		return R.data(fileReadService.isRead(bladeFileId, AuthUtil.getUserId()));
+	}
+
+
+}

+ 140 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/IndexController.java

@@ -0,0 +1,140 @@
+package com.wtkj.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.entity.Task;
+import com.wtkj.entity.WorkStatus;
+import com.wtkj.service.IIndexService;
+import com.wtkj.service.IWorkStatusService;
+import com.wtkj.wrapper.IndexTaskScheduleWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static com.wtkj.config.MagicValue.*;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 23:58
+ * @describe
+ */
+@RestController
+@RequestMapping("/index")
+@Api(value = "首页", tags = "首页")
+@AllArgsConstructor
+public class IndexController {
+
+	private final IWorkStatusService workStatus;
+	private final IIndexService indexService;
+
+	/**
+	 * 用户工作状态
+	 */
+	@GetMapping("/work-status")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "我的状态", notes = "")
+	public R workStatus() {
+		Long userId = AuthUtil.getUserId();
+		return R.data(workStatus.workStatus(userId));
+	}
+
+	/**
+	 * 修改工作状态
+	 */
+	@PostMapping("/submit-work-status")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "新增或者修改工作状态", notes = "")
+	public R submit(@RequestBody WorkStatus status) {
+		status.setUserId(AuthUtil.getUserId());
+		return R.status(workStatus.saveOrUpdate(status));
+	}
+
+	/**
+	 * 首页统计
+	 */
+	@GetMapping("/project-and-task")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "项目和任务统计", notes = "")
+	public R projectAndTask(@RequestParam Long topDept) {
+		return R.data(indexService.projectAndTaskSummary(topDept));
+	}
+
+	/**
+	 * 待办事项
+	 */
+	@GetMapping("/todo-list")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "待办事项", notes = "传入isRead查看状态 0:全部 1:已读 2: 未读 默认未读,分页参数")
+	public R todoList(@RequestParam(defaultValue = "2") Integer isRead, Query query) {
+		return R.data(indexService.todoList(isRead, Condition.getPage(query)));
+	}
+
+	/**
+	 * 学习资料
+	 */
+	@GetMapping("/study-list")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "学习资料", notes = "")
+	public R noticeList(Query query) {
+		return R.data(indexService.studyList(Condition.getPage(query)));
+	}
+
+	/**
+	 * 阅读消息
+	 */
+	@GetMapping("/message-detail")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "阅读待办", notes = "传入id")
+	public R messageDetail(@RequestParam Long id) {
+		return R.data(indexService.messageDetail(id));
+	}
+
+	/**
+	 * 工作日程
+	 */
+	@GetMapping("/user-schedule")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "用户工作日程", notes = "传入登录用户的顶级机构id,日期字符串")
+	public R schedule(@RequestParam Long topDept, String date) {
+		return R.data(indexService.schedule(topDept, date));
+	}
+
+	/**
+	 * 工作日程展开
+	 */
+	@GetMapping("/user-schedule-expand")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "用户工作日程展开", notes = "传入用户id,日期字符串")
+	public R scheduleExpand(@RequestParam Long userId, String date) {
+		List<Task> taskList = indexService.scheduleExpand(userId, date);
+		return R.data(IndexTaskScheduleWrapper.build().listVO(taskList));
+	}
+
+
+	/**
+	 * 任务分布
+	 */
+	@GetMapping("/task-statistics")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "任务分布统计", notes = "传入日期")
+	public R taskTaskStatistics(@RequestParam Long topDept, @RequestParam String date) {
+		String userRole = AuthUtil.getUserRole();
+		if (userRole != null) {
+			if (userRole.contains(STAFF_ADMIN)) {
+				return R.data(indexService.mapStatistics(topDept, date));
+			} else if (userRole.contains(STAFF_SECOND_ADMIN)) {
+				return R.data(indexService.myStatistics(date));
+			} else if (userRole.contains(STAFF_USER)) {
+				return R.data(null);
+			}
+		}
+		return R.fail("获取用户角色失败");
+	}
+
+}

+ 191 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/ProjectController.java

@@ -0,0 +1,191 @@
+package com.wtkj.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.dto.ProjectPageDTO;
+import com.wtkj.entity.Project;
+import com.wtkj.entity.ProjectGroup;
+import com.wtkj.entity.ProjectStage;
+import com.wtkj.service.IProjectGroupService;
+import com.wtkj.service.IProjectService;
+import com.wtkj.service.IProjectStageService;
+import com.wtkj.service.ITaskService;
+import com.wtkj.vo.MyTaskStatistics;
+import com.wtkj.vo.ProjectStageVO;
+import com.wtkj.wrapper.ProjectGroupWrapper;
+import com.wtkj.wrapper.ProjectStageWrapper;
+import com.wtkj.wrapper.ProjectWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-13 15:50
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/project")
+@Api(value = "项目模块", tags = "项目模块")
+public class ProjectController {
+
+	private final IProjectService projectService;
+
+
+	private final IProjectStageService stageService;
+
+	private final ITaskService taskService;
+
+	private final IProjectGroupService projectGroupService;
+
+	/**
+	 * 创建/修改项目
+	 */
+	@PostMapping("/submit")
+	@ApiOperation(value = "新建或者修改项目", notes = "传入project")
+	@ApiOperationSupport(order = 1)
+	public R<Boolean> create(@RequestBody @Valid Project project) {
+		return R.status(projectService.submit(project));
+	}
+
+	/**
+	 * 分页
+	 */
+	@PostMapping("/page")
+	@ApiOperation(value = "分页", notes = "")
+	@ApiOperationSupport(order = 2)
+	public R page(@RequestBody @Valid ProjectPageDTO dto) {
+		Query query = new Query();
+		query.setCurrent(dto.getCurrent());
+		query.setSize(dto.getSize());
+		IPage<Project> page = projectService.getPage(dto, Condition.getPage(query));
+		return R.data(ProjectWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 删除
+	 */
+	@GetMapping("/delete")
+	@ApiOperation(value = "删除", notes = "传入ids")
+	@ApiOperationSupport(order = 3)
+	public R<Boolean> delete(String ids) {
+		boolean flag = projectService.delete(Func.toLongList(ids));
+		return R.status(flag);
+	}
+
+	/**
+	 * 项目下的所有阶段
+	 */
+	@GetMapping("/stage-list")
+	@ApiOperation(value = "项目下的所有阶段", notes = "传入projectId")
+	@ApiOperationSupport(order = 4)
+	public R<List<ProjectStageVO>> stageList(Long projectId) {
+		List<ProjectStage> projectStages = stageService.listByProjectId(projectId);
+		return R.data(ProjectStageWrapper.build().listVO(projectStages));
+	}
+
+	/**
+	 * 修改阶段
+	 */
+	@PostMapping("/submit-stage")
+	@ApiOperation(value = "修改项目阶段", notes = "")
+	@ApiOperationSupport(order = 5)
+	public R submitStage(@RequestBody ProjectStage stage) {
+		return R.status(stageService.submit(stage));
+	}
+
+	/**
+	 * 阶段详情
+	 */
+	@GetMapping("/stage-detail")
+	@ApiOperation(value = "阶段详情", notes = "传入stageId")
+	@ApiOperationSupport(order = 6)
+	public R stageDetail(@RequestParam Long stageId) {
+		ProjectStage stage = stageService.getById(stageId);
+		return R.data(ProjectStageWrapper.build().entityVO(stage));
+	}
+
+	/**
+	 * 项目列表统计
+	 */
+	@GetMapping("/project-statistics")
+	@ApiOperation(value = "项目列表统计", notes = "")
+	@ApiOperationSupport(order = 6)
+	public R projectStatistics(@RequestParam Long topDept, @RequestParam Integer deptCategory, @RequestParam String year) {
+		return R.data(projectService.projectStatistics(topDept, deptCategory, year));
+	}
+
+	/**
+	 * 项目小组
+	 */
+	@GetMapping("/project-group-mem")
+	@ApiOperation(value = "项目组成员", notes = "传入stageId")
+	@ApiOperationSupport(order = 7)
+	public R groupMem(@RequestParam Long stageId) {
+		List<ProjectGroup> list = projectGroupService.getGroupByStageId(stageId);
+		return R.data(ProjectGroupWrapper.build().listVO(list));
+	}
+
+	@GetMapping("/project-detail")
+	@ApiOperation(value = "项目详情", notes = "")
+	@ApiOperationSupport(order = 8)
+	public R detail(@RequestParam Long projectId) {
+		Project byId = projectService.getById(projectId);
+		return R.data(ProjectWrapper.build().entityVO(byId));
+	}
+
+	/**
+	 * 工作台任务统计
+	 */
+	@GetMapping("/task-summary")
+	@ApiOperation(value = "项目任务统计", notes = "传入stageId")
+	@ApiOperationSupport(order = 9)
+	public R<MyTaskStatistics> taskStatistics(@RequestParam Long stageId) {
+		return R.data(taskService.taskStatistics(stageId, null, null));
+	}
+
+	/**
+	 * 任务分布
+	 */
+	@GetMapping("/task-distribution")
+	@ApiOperation(value = "任务分布", notes = "传入projectId")
+	@ApiOperationSupport(order = 10)
+	public R projectTaskSummary(@RequestParam Long stageId) {
+		return R.data(taskService.projectTaskSummary(stageId));
+	}
+
+	/**
+	 * 任务进展走势
+	 */
+	@GetMapping("/task-situation")
+	@ApiOperation(value = "任务进展走势", notes = "传入projectId")
+	@ApiOperationSupport(order = 11)
+	public R projectTaskSituation(@RequestParam Long stageId) {
+		return R.data(taskService.projectTaskSituation(stageId));
+	}
+
+	@GetMapping("/task-burnout")
+	@ApiOperation(value = "任务燃尽", notes = "传入projectId")
+	@ApiOperationSupport(order = 12)
+	public R projectTaskBurnout(@RequestParam Long stageId) {
+		return R.data(taskService.projectTaskBurnout(stageId));
+	}
+
+	@GetMapping("/big-data-count")
+	@ApiOperation(value = "大屏统计", notes = "")
+	@ApiOperationSupport(order = 13)
+	public R bigDataCount() {
+		return R.data(projectService.bigDataCount());
+	}
+
+
+}

+ 147 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/QrCodeController.java

@@ -0,0 +1,147 @@
+package com.wtkj.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.entity.ApplyJoin;
+import com.wtkj.entity.FileShare;
+import com.wtkj.service.IApplyJoinService;
+import com.wtkj.service.IQrcodeService;
+import com.wtkj.wrapper.ApplyJoinWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-19 17:25
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/qrcode")
+@Api(value = "二维码模块", tags = "二维码模块")
+public class QrCodeController {
+
+	private final IQrcodeService qrcodeService;
+	private final IApplyJoinService applyJoinService;
+
+	/**
+	 * 生成二维码
+	 */
+	@GetMapping("/create-dept-qrcode")
+	@ApiOperation(value = "生成邀请用户至机构二维码", notes = "传入部门id")
+	@ApiOperationSupport(order = 1)
+	public R createQrcode(@RequestParam Long deptId) {
+		return R.data(qrcodeService.createDeptQrcode(deptId));
+	}
+
+	/**
+	 * 扫描二维码展现文字内容
+	 */
+	@GetMapping("/scan-invite-to-dept")
+	@ApiOperation(value = "扫描邀请至部门二维码", notes = "")
+	@ApiOperationSupport(order = 2)
+	public R scanInviteToDept(@RequestParam String qrcodeId, @RequestParam Long createUser, @RequestParam Long deptId) {
+		return R.data(qrcodeService.scanInviteToDept(qrcodeId, createUser, deptId));
+	}
+
+	/**
+	 * 邀请至机构下
+	 */
+	@GetMapping("/invite-to-dept")
+	@ApiOperation(value = "接受邀请加入机构", notes = "")
+	@ApiOperationSupport(order = 3)
+	public R inviteToDept(@RequestParam String qrcodeId, @RequestParam Long createUser, @RequestParam Long deptId) {
+		return R.status(qrcodeService.inviteToDept(qrcodeId, createUser, deptId));
+	}
+
+
+	@PostMapping("/apply-to-dept")
+	@ApiOperation(value = "申请加入机构", notes = "")
+	@ApiOperationSupport(order = 4)
+	public R applyToDept(@RequestBody @Valid ApplyJoin join) {
+		return R.status(applyJoinService.saveOrUpdate(join));
+	}
+
+	/**
+	 * 申请列表
+	 */
+	@GetMapping("/apply-page")
+	@ApiOperation(value = "申请列表", notes = "传入当前登录用户顶级机构id")
+	@ApiOperationSupport(order = 5)
+	public R applyPage(@RequestParam Long topDept, Query query) {
+		IPage<ApplyJoin> page = applyJoinService.page(Condition.getPage(query), new LambdaQueryWrapper<ApplyJoin>().eq(ApplyJoin::getDeptId, topDept));
+		return R.data(ApplyJoinWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 同意加入组织
+	 */
+	@GetMapping("/agree-apply")
+	@ApiOperation(value = "同意加入机构", notes = "传入记录主键id")
+	@ApiOperationSupport(order = 6)
+	public R agreeJoinDept(@RequestParam Long id) {
+		return R.status(applyJoinService.agreeApply(id));
+	}
+
+	/**
+	 * 生成邀请至项目组二维码
+	 */
+	@GetMapping("/create-group-qrcode")
+	@ApiOperation(value = "生成邀请至项目组二维码", notes = "")
+	@ApiOperationSupport(order = 7)
+	public R createGroupQrcode(@RequestParam Long projectId) {
+		return R.data(qrcodeService.createGroupQrcode(projectId));
+	}
+
+	/**
+	 * 扫描邀请至项目组二维码
+	 */
+	@GetMapping("/scan-invite-to-project")
+	@ApiOperation(value = "扫描邀请至项目组二维码", notes = "")
+	@ApiOperationSupport(order = 8)
+	public R scanInviteToProject(@RequestParam String qrcodeId, @RequestParam Long createUser, @RequestParam Long projectId, @RequestParam Long topDept) {
+		return R.data(R.data(qrcodeService.scanInviteToProject(qrcodeId, createUser, projectId, topDept)));
+	}
+
+
+	/**
+	 * 邀请至项目组
+	 */
+	@GetMapping("/invite-to-project")
+	@ApiOperation(value = "接受邀请至项目组", notes = "deptId:服务商的顶级机构id")
+	@ApiOperationSupport(order = 9)
+	public R inviteToProject(@RequestParam String qrcodeId, @RequestParam Long createUser, @RequestParam Long projectId, @RequestParam Long topDept) {
+		return R.status(qrcodeService.inviteToProject(qrcodeId, createUser, projectId, topDept));
+	}
+
+
+	/**
+	 * 生成一条分享记录
+	 */
+	@PostMapping("/save-share")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "生成文件分享", notes = "ids:文件的")
+	public R saveShare(@RequestBody FileShare share) {
+		return R.data(qrcodeService.savaShare(share));
+	}
+
+	/**
+	 * 查看分享
+	 */
+	@PostMapping("/get-share")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "查看文件分享", notes = "传入二维码返回ID")
+	public R getShare(@RequestParam Long id) {
+		return R.data(qrcodeService.getShare(id));
+	}
+
+
+}

+ 139 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/ResourceController.java

@@ -0,0 +1,139 @@
+package com.wtkj.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.dto.SearchProjectFileDTO;
+import com.wtkj.dto.UploadInnerFileDTO;
+import com.wtkj.entity.FileAndFolder;
+import com.wtkj.entity.InnerFileAndFolder;
+import com.wtkj.service.ICommonService;
+import com.wtkj.service.IInnerFileAndFolderService;
+import com.wtkj.wrapper.FileAndFolderWrapper;
+import com.wtkj.wrapper.InnerFileAndFolderWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Objects;
+
+import static com.wtkj.config.MagicValue.ONE;
+import static com.wtkj.config.MagicValue.TWO;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-26 09:24
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/resource")
+@Api(value = "资料库模块", tags = "资料库模块")
+public class ResourceController {
+
+	private final IInnerFileAndFolderService innerFileAndFolderService;
+
+	private final ICommonService commonService;
+
+	/**
+	 * 内部资料库
+	 */
+	@PostMapping("/submit-inner-folder")
+	@ApiOperation(value = "创建或者修改内部文件夹或者文件", notes = "")
+	@ApiOperationSupport(order = 1)
+	public R submitFolder(@RequestBody @Valid InnerFileAndFolder folder) {
+		LambdaQueryWrapper<InnerFileAndFolder> lqw = new LambdaQueryWrapper<>();
+		lqw.eq(InnerFileAndFolder::getParentId, folder.getParentId());
+		lqw.eq(InnerFileAndFolder::getTitle, folder.getTitle());
+		if (Objects.equals(folder.getType(), ONE)) {
+			lqw.eq(InnerFileAndFolder::getType, ONE);
+			long cnt = innerFileAndFolderService.count(lqw);
+			if (cnt > 0L) {
+				throw new ServiceException("此文件夹下已经存在同名文件");
+			}
+		} else if (Objects.equals(folder.getType(), TWO)) {
+			lqw.eq(InnerFileAndFolder::getType, TWO);
+			long cnt = innerFileAndFolderService.count(lqw);
+			if (cnt > 0L) {
+				throw new ServiceException("此文件夹下已经存在同名文件夹");
+			}
+		}
+		return R.status(innerFileAndFolderService.saveOrUpdate(folder));
+	}
+
+	/**
+	 * 删除文件/文件夹
+	 */
+	@GetMapping("/remove-inner-file")
+	@ApiOperation(value = "删除内部文件或者文件夹", notes = "")
+	@ApiOperationSupport(order = 2)
+	public R remove(@RequestParam String ids) {
+		return R.status(commonService.delete(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 分页
+	 */
+	@GetMapping("/inner-page")
+	@ApiOperation(value = "内部文件夹 分页", notes = "传入parentId,分页参数")
+	@ApiOperationSupport(order = 3)
+	public R innerPage(@RequestParam Long deptId, @RequestParam Long parentId, @RequestParam String name, Query query) {
+		IPage<InnerFileAndFolder> page = innerFileAndFolderService.selectPage(deptId, parentId, name, Condition.getPage(query));
+		return R.data(InnerFileAndFolderWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 文件数量
+	 */
+	@GetMapping("/file-and-page-amount")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "文夹下的文件数量", notes = "传入文件夹主键id")
+	public R<JSONObject> getPageAmount(@RequestParam Long deptId, @RequestParam Long parentId) {
+		return R.data(innerFileAndFolderService.getPageAndFileAmount(deptId, parentId));
+	}
+
+	/**
+	 * 上传文件
+	 */
+	@PostMapping("/upload-inner-file")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "上传内部文件", notes = "传入文件夹主键id")
+	public R uploadInnerFile(@RequestBody @Valid List<UploadInnerFileDTO> files) {
+		return R.status(commonService.uploadInnerFile(files));
+	}
+
+
+	/**
+	 * 项目资料
+	 */
+	@PostMapping("/search-project-file")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "项目资料", notes = "")
+	public R searchProjectFile(@RequestBody SearchProjectFileDTO dto) {
+		Query query = new Query();
+		query.setSize(dto.getSize());
+		query.setCurrent(dto.getCurrent());
+		IPage<FileAndFolder> page = commonService.esSearch(dto, Condition.getPage(query));
+		return R.data(FileAndFolderWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 打开文件
+	 */
+	@PostMapping("/open-search-file")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "打开搜索结果文件", notes = "")
+	public R openSearch(@RequestParam Long projectId, @RequestParam Long fileId, @RequestParam String text) {
+		return R.data(commonService.openSearchFile(projectId, fileId, text));
+	}
+
+}

+ 347 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/controller/TaskController.java

@@ -0,0 +1,347 @@
+package com.wtkj.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.wtkj.dto.MyTaskPageDTO;
+import com.wtkj.dto.ProjectTaskPageDTO;
+import com.wtkj.entity.*;
+import com.wtkj.service.*;
+import com.wtkj.vo.*;
+import com.wtkj.wrapper.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.system.user.entity.User;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-15 15:20
+ * @describe
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/task")
+@Api(value = "任务模块", tags = "任务模块")
+public class TaskController {
+
+	private final ITaskService taskService;
+
+	private final ITaskLogService taskLogService;
+
+	private final ITaskFileService taskFileService;
+
+	private final ITaskContractService taskContractService;
+
+	private final ITaskCostService taskCostService;
+
+	private final ITaskContractPayLogService payLogService;
+
+	/**
+	 * 我的任务分页
+	 */
+
+	@PostMapping("/my-task-page")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "我的任务列表", notes = "")
+	public R<IPage<TaskVO>> myTaskPage(@RequestBody @Valid MyTaskPageDTO dto) {
+		Query query = new Query();
+		query.setCurrent(dto.getCurrent());
+		query.setSize(dto.getSize());
+		IPage<Task> page = taskService.myTaskPage(dto, Condition.getPage(query));
+		return R.data(MyTaskWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 我的任务统计
+	 */
+	@GetMapping("/my-task-statistics")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "我的任务统计", notes = "")
+	public R myTask(@RequestParam Integer year, @RequestParam Integer month) {
+		return R.data(taskService.taskStatistics(null, year, month));
+	}
+
+	/**
+	 * 创建、修改任务
+	 */
+	@PostMapping("/submit")
+	@ApiOperation(value = "创建、修改任务", notes = "")
+	@ApiOperationSupport(order = 3)
+	public R<Boolean> submitTask(@RequestBody @Valid Task task) {
+		return R.status(taskService.submit(task));
+	}
+
+	/**
+	 * 项目任务列表
+	 */
+	@PostMapping("/project-task-page")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "项目任务列表", notes = "")
+	public R<IPage<TaskVO>> projectTask(@RequestBody @Valid ProjectTaskPageDTO dto) {
+		Query query = new Query();
+		query.setCurrent(dto.getCurrent());
+		query.setSize(dto.getSize());
+		IPage<Task> page = taskService.projectTaskPage(dto, Condition.getPage(query));
+		return R.data(TaskPageWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 删除任务
+	 */
+	@GetMapping("/delete-project-task")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "删除项目任务", notes = "传入ids")
+	public R<Boolean> deleteTask(String ids) {
+		return R.status(taskService.delete(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 任务详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "任务详情", notes = "传入任务主键id")
+	public R<TaskVO> detail(@RequestParam Long id) {
+		Task detail = taskService.getById(id);
+		return R.data(TaskWrapper.build().entityVO(detail));
+	}
+
+	/**
+	 * 任务成果文件
+	 */
+	@GetMapping("/result-file")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "任务成果文件", notes = "传入任务主键id")
+	public R<List<TaskFileVO>> files(@RequestParam Long id) {
+		List<TaskFile> files = taskFileService.fileList(id);
+		return R.data(TaskFileWrapper.build().listVO(files));
+	}
+
+	/**
+	 * 上传成果文件
+	 */
+	@GetMapping("/upload-file")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "上传成果文件", notes = "传入任务主键id,文件ids")
+	public R saveFile(@RequestParam Long taskId, @RequestParam String ids) {
+		return R.status(taskService.uploadFile(taskId, ids));
+	}
+
+	/**
+	 * 删除附件
+	 */
+	@GetMapping("/delete-file")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "删除附件", notes = "传入主键ids")
+	public R deleteFile(@RequestParam String ids) {
+		return R.status(taskService.deleteFile(ids));
+	}
+
+	/**
+	 * 移动文件
+	 */
+	@GetMapping("/move-file")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "移动文件", notes = "")
+	public R moveFile(@RequestParam Long stageId, @RequestParam Long folderId, @RequestParam String fileIds) {
+		return R.status(taskService.moveFile(stageId, folderId, fileIds));
+	}
+
+	/**
+	 * 任务相关动态
+	 */
+	@GetMapping("/task-log")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "任务相关动态", notes = "传入任务主键id")
+	public R<IPage<TaskLogVO>> taskLog(Long id, Query query) {
+		LambdaQueryWrapper<TaskLog> lqw = new LambdaQueryWrapper<>();
+		lqw.eq(TaskLog::getTaskId, id);
+		lqw.orderByDesc(TaskLog::getCreateTime);
+		IPage<TaskLog> page = taskLogService.page(Condition.getPage(query), lqw);
+		return R.data(TaskLogWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 任务组成员
+	 */
+	@GetMapping("/task-group-mem")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "任务组成员", notes = "传入任务主键id")
+	public R<List<User>> taskGroup(@RequestParam Long id) {
+		//todo 任务组成员
+		return R.data(taskLogService.getTaskGroupMen(id));
+	}
+
+	/**
+	 * 添加任务相关合同
+	 */
+	@PostMapping("/submit-task-contract")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "新增或者修改任务合同", notes = "")
+	public R<Boolean> submitContracts(@RequestBody @Valid TaskContract contract) {
+		return R.status(taskContractService.saveOrUpdate(contract));
+
+	}
+
+	/**
+	 * 删除任务合同
+	 */
+	@GetMapping("/delete-task-contract")
+	@ApiOperationSupport(order = 14)
+	@ApiOperation(value = "删除任务合同", notes = "传入主键ids")
+	public R<Boolean> deleteContracts(@RequestParam String ids) {
+		return R.status(taskContractService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 任务合同分页
+	 */
+	@GetMapping("/task-contract-page")
+	@ApiOperationSupport(order = 15)
+	@ApiOperation(value = "任务合同分页", notes = "传入主键taskId,分页参数")
+	public R<IPage<TaskContractVO>> contractPage(@RequestParam Long taskId, Query query) {
+		IPage<TaskContract> page = taskContractService.pageByTaskId(taskId, Condition.getPage(query));
+		return R.data(TaskContractWrapper.build().pageVO(page));
+	}
+
+
+	/**
+	 * 任务成本核算
+	 */
+	@PostMapping("/submit-task-cost")
+	@ApiOperationSupport(order = 16)
+	@ApiOperation(value = "新增或修改任务成本", notes = "")
+	public R<Boolean> submitCost(@RequestBody @Valid TaskCost cost) {
+		return R.data(taskCostService.saveOrUpdate(cost));
+	}
+
+	/**
+	 * 任务成本详情
+	 */
+	@GetMapping("/task-cost-detail")
+	@ApiOperationSupport(order = 17)
+	@ApiOperation(value = "成本详情", notes = "")
+	public R<TaskCostVO> costDetail(@RequestParam Long id) {
+		TaskCost detail = taskCostService.getById(id);
+		return R.data(TaskCostWrapper.build().entityVO(detail));
+	}
+
+	/**
+	 * 删除成本记录
+	 */
+	@GetMapping("/delete-task-cost")
+	@ApiOperationSupport(order = 18)
+	@ApiOperation(value = "删除成本记录", notes = "传入主键ids")
+	public R<Boolean> deleteCost(@RequestParam String ids) {
+		return R.status(taskCostService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 成本分页
+	 */
+	@GetMapping("/task-cost-page")
+	@ApiOperationSupport(order = 19)
+	@ApiOperation(value = "成本分页", notes = "传入taskId,分页参数")
+	public R<IPage<TaskCostVO>> costPage(@RequestParam Long taskId, Query query) {
+		IPage<TaskCost> page = taskCostService.pageByTaskId(taskId, Condition.getPage(query));
+		return R.data(TaskCostWrapper.build().pageVO(page));
+	}
+
+	/**
+	 * 成本统计
+	 */
+	@GetMapping("/task-cost-statistics")
+	@ApiOperationSupport(order = 20)
+	@ApiOperation(value = "任务成本统计", notes = "传入taskId")
+	public R<JSONObject> costStatistics(@RequestParam Long taskId) {
+		return R.data(taskCostService.costStatistics(taskId));
+	}
+
+	/**
+	 * 今日待完成
+	 */
+	@GetMapping("/today-todo-task")
+	@ApiOperationSupport(order = 21)
+	@ApiOperation(value = "登录用户指定日期待完成任务", notes = "")
+	public R<List<Task>> todayTodo(@RequestParam String date) {
+		return R.data(taskService.todayTodo(AuthUtil.getUserId(), date));
+	}
+
+	/**
+	 * 今日逾期
+	 */
+	@GetMapping("/today-expire-task")
+	@ApiOperationSupport(order = 22)
+	@ApiOperation(value = "登录用户指定日期逾期任务", notes = "")
+	public R<List<Task>> todayExpire(@RequestParam String date) {
+		return R.data(taskService.todayExpire(AuthUtil.getUserId(), date));
+	}
+
+
+	/**
+	 * 任务协作单位
+	 */
+	@GetMapping("/task-cops")
+	@ApiOperationSupport(order = 23)
+	@ApiOperation(value = "协作单位列表", notes = "")
+	public R cops(@RequestParam Long projectId) {
+		return R.data(taskService.taskCops(projectId));
+	}
+
+
+	/**
+	 * 修改、添加合同付款记录
+	 */
+	@PostMapping("/submit-pay-log")
+	@ApiOperationSupport(order = 24)
+	@ApiOperation(value = "添加付款记录", notes = "")
+	public R submitPayLog(@RequestBody @Valid TaskContractPayLog payLog) {
+		return R.status(payLogService.submit(payLog));
+	}
+
+	/**
+	 * 删除付款记录
+	 */
+	@GetMapping("/delete-pay-log")
+	@ApiOperationSupport(order = 25)
+	@ApiOperation(value = "删除付款记录", notes = "")
+	public R deletePayLog(@RequestParam String ids, @RequestParam Long contractId) {
+		return R.status(payLogService.delete(Func.toLongList(ids), contractId));
+	}
+
+	/**
+	 * 付款记录详情
+	 */
+	@GetMapping("/pay-log-page")
+	@ApiOperationSupport(order = 26)
+	@ApiOperation(value = "付款记录分页", notes = "")
+	public R payLogPage(@RequestParam Long contractId, Query query) {
+		IPage<TaskContractPayLog> page = payLogService.pageByContractId(contractId, Condition.getPage(query));
+		return R.data(TaskContractPayLogWrapper.build().pageVO(page));
+	}
+
+
+	/**
+	 * 付款记录详情
+	 */
+	@GetMapping("/pay-log-detail")
+	@ApiOperationSupport(order = 27)
+	@ApiOperation(value = "付款记录详情", notes = "")
+	public R payLogDetail(@RequestParam Long id) {
+		TaskContractPayLog byId = payLogService.getById(id);
+		return R.data(TaskContractPayLogWrapper.build().entityVO(byId));
+	}
+
+}
+

+ 12 - 12
blade-service/wt-okr/src/main/java/com/wtkj/controller/TypeAndStageController.java → blade-service/wutong-okr/src/main/java/com/wtkj/controller/TypeAndStageController.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import com.wtkj.entity.TypeAndStage;
+import com.wtkj.entity.TemplateTypeAndStage;
 import com.wtkj.service.ITypeAndStageService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -35,11 +35,11 @@ public class TypeAndStageController {
 	@GetMapping("/page")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "项目类型分页", notes = " ")
-	public R<IPage<TypeAndStage>> page(Query query) {
-		LambdaQueryWrapper<TypeAndStage> lqw = Wrappers.lambdaQuery();
-		lqw.eq(TypeAndStage::getParentId, 0);
-		lqw.orderByDesc(TypeAndStage::getCreateTime);
-		IPage<TypeAndStage> page = typeAndStageService.page(Condition.getPage(query), lqw);
+	public R<IPage<TemplateTypeAndStage>> page(Query query) {
+		LambdaQueryWrapper<TemplateTypeAndStage> lqw = Wrappers.lambdaQuery();
+		lqw.eq(TemplateTypeAndStage::getParentId, 0);
+		lqw.orderByDesc(TemplateTypeAndStage::getCreateTime);
+		IPage<TemplateTypeAndStage> page = typeAndStageService.page(Condition.getPage(query), lqw);
 		return R.data(page);
 	}
 
@@ -49,9 +49,9 @@ public class TypeAndStageController {
 	@GetMapping("/v2/stage-list")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "阶段列表", notes = "传入parentId")
-	public R<List<TypeAndStage>> list(@RequestParam(value = "parentId") Long parentId) {
-		List<TypeAndStage> list = typeAndStageService.list(new LambdaQueryWrapper<TypeAndStage>().eq(TypeAndStage::getParentId, parentId)
-			.orderByAsc(TypeAndStage::getSort));
+	public R<List<TemplateTypeAndStage>> list(@RequestParam(value = "parentId") Long parentId) {
+		List<TemplateTypeAndStage> list = typeAndStageService.list(new LambdaQueryWrapper<TemplateTypeAndStage>().eq(TemplateTypeAndStage::getParentId, parentId)
+			.orderByAsc(TemplateTypeAndStage::getSort));
 		return R.data(list);
 	}
 
@@ -61,8 +61,8 @@ public class TypeAndStageController {
 	@GetMapping("/submit")
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "新增或者修改", notes = "传入typeAndStage")
-	public R submit(@RequestBody TypeAndStage typeAndStage) {
-		return R.status(typeAndStageService.submit(typeAndStage));
+	public R submit(@RequestBody TemplateTypeAndStage templateTypeAndStage) {
+		return R.status(typeAndStageService.submit(templateTypeAndStage));
 	}
 
 
@@ -73,7 +73,7 @@ public class TypeAndStageController {
 	@ApiOperation(value = "查看类型或阶段详情", notes = "传入id")
 	@GetMapping("/v2/detail")
 	public R detail(Long id) {
-		TypeAndStage detail = typeAndStageService.getById(id);
+		TemplateTypeAndStage detail = typeAndStageService.getById(id);
 		return R.data(detail);
 	}
 

+ 90 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/handler/EsFileHandler.java

@@ -0,0 +1,90 @@
+package com.wtkj.handler;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.wtkj.config.KafkaConstant;
+import com.wtkj.entity.FileAndFolder;
+import com.wtkj.handler.es.Doc;
+import com.wtkj.service.IFileAndFolderService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.elasticsearch.action.index.IndexRequest;
+import org.elasticsearch.client.RequestOptions;
+import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.common.xcontent.XContentType;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.kafka.support.Acknowledgment;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+import static com.wtkj.config.MagicValue.PROJECT_RESOURCE_INDEX;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-27 11:31
+ * @describe
+ */
+@Slf4j
+@Component
+public class EsFileHandler {
+
+	@Resource
+	private RestHighLevelClient client;
+	@Resource
+	private IFileAndFolderService fileAndFolderService;
+
+
+	/**
+	 * 文件上传转为图片以后通知消息  --->保存至es
+	 */
+	@KafkaListener(groupId = "parse-file-group", topics = KafkaConstant.PARSE_SUCCESS_MESSAGE, containerFactory = "ackContainerFactory")
+	public void handSaveFileToEs(ConsumerRecord record, Acknowledgment ack) {
+		try {
+			String message = (String) record.value();
+			log.info("收到文件解析成功消息,即将处理存入es逻辑:{}", message);
+
+			JSONObject msg = (JSONObject) JSONObject.parse(message);
+			Long fileId = msg.getLong("fileId");
+			String content = msg.getString("content");
+			Integer currentPage = msg.getInteger("currentPage");
+
+			LambdaQueryWrapper<FileAndFolder> lqw = new LambdaQueryWrapper<>();
+			lqw.eq(FileAndFolder::getBladeFileId, fileId);
+			lqw.eq(FileAndFolder::getType, 1);
+			List<FileAndFolder> files = fileAndFolderService.list(lqw);
+			//避免重复处理
+			if (!CollectionUtils.isEmpty(files) && files.size() == 1) {
+				for (FileAndFolder file : files) {
+					Long projectId = file.getProjectId();
+					//使用自定义类作为数据存储容器
+					Doc doc = new Doc();
+					doc.setId(IdWorker.getIdStr());
+					doc.setContent(content);
+					doc.setFileId(String.valueOf(fileId));
+					doc.setFileName(file.getTitle());
+					doc.setCreateUser(String.valueOf(file.getCreateUser()));
+					doc.setCurrentPage(currentPage);
+					doc.setProjectId(String.valueOf(projectId));
+
+					//创建文档
+					IndexRequest indexRequest = new IndexRequest(PROJECT_RESOURCE_INDEX);
+					indexRequest.id(doc.getId());
+					indexRequest.timeout("1s");
+					//将数据放入请求,将对象装为json格式
+					indexRequest.source(JSONObject.toJSONString(doc), XContentType.JSON);
+					client.index(indexRequest, RequestOptions.DEFAULT);
+					//log.info("文档插入操作结果:" + putResponse.toString());
+
+				}
+			}
+		} catch (Exception e) {
+			log.error("文件存入es异常:" + e.getMessage());
+		} finally {
+			ack.acknowledge();
+		}
+	}
+}

+ 94 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/handler/Schedule.java

@@ -0,0 +1,94 @@
+package com.wtkj.handler;
+
+import com.wtkj.entity.Project;
+import com.wtkj.entity.ProjectStage;
+import com.wtkj.entity.Task;
+import com.wtkj.service.IProjectService;
+import com.wtkj.service.IProjectStageService;
+import com.wtkj.service.ITaskService;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-10-05 11:47
+ * @describe 定时任务扫描任务状态
+ */
+@Configuration
+@Slf4j
+public class Schedule {
+
+	@Autowired
+	private ITaskService taskService;
+	@Autowired
+	private IProjectService projectService;
+	@Autowired
+	private IProjectStageService stageService;
+	@Autowired
+	private BladeRedis redis;
+
+
+	@Scheduled(cron = "0 0 3 * * ?")
+	private void task() {
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 设置日期格式
+		String now = LocalDate.now().format(formatter);
+		//今天过期的任务
+		List<Task> tasks = taskService.getTodayToExpire(now);
+		if (!CollectionUtils.isEmpty(tasks)) {
+			tasks.forEach(task -> {
+				task.setTaskStatus(6);
+				task.setIsExpire(1);
+				Long projectId = task.getProjectId();
+				Project byId = projectService.getById(projectId);
+				if (byId != null) {
+					byId.setTodoTask(Math.max(byId.getTodoTask() - 1, 0));
+					projectService.updateById(byId);
+				}
+			});
+			taskService.updateBatchById(tasks);
+		}
+	}
+
+	@Scheduled(cron = "0 0 4 * * ?")
+	private void stageStatusTask() {
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 设置日期格式
+		//1.是否有逾期任务
+		List<Task> tasks = taskService.getByStatus(6);
+		if (!CollectionUtils.isEmpty(tasks)) {
+			int expireSize = tasks.size();
+			tasks.forEach(task -> {
+				Long stageId = task.getStageId();
+				ProjectStage stage = stageService.getById(stageId);
+				if (stage != null) {
+					//有逾期 就为异常
+					stage.setStageStatus(2);
+
+					//失控  --->阶段下任务逾期数量 > 平均每天完成任务量
+					//1.阶段周期
+					List<LocalDate> dateList = redis.get("dateList::" + stageId);
+					if (!CollectionUtils.isEmpty(dateList)) {
+						int size = dateList.size();
+						List<Task> allTask = taskService.listByStageId(stageId);
+						if (!CollectionUtils.isEmpty(allTask)) {
+							int taskAmount = allTask.size();
+							// 理想每天任务完成量
+							float avg = (float) taskAmount / size;
+							if (expireSize > avg) {
+								stage.setStageStatus(3);
+							}
+						}
+					}
+					stageService.updateById(stage);
+				}
+			});
+		}
+	}
+}

+ 30 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/handler/es/Doc.java

@@ -0,0 +1,30 @@
+package com.wtkj.handler.es;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-27 14:50
+ * @describe
+ */
+@Data
+public class Doc implements Serializable {
+
+	private static final long serialVersionUID = -1L;
+
+	private String id;
+
+	private String projectId;
+
+	private String fileId;
+
+	private String fileName;
+
+	private String createUser;
+
+	private String content;
+
+	private Integer currentPage;
+}

+ 12 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/mapper/AnnouncementMapper.java

@@ -0,0 +1,12 @@
+package com.wtkj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.wtkj.entity.Announcement;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-23 11:13
+ * @describe
+ */
+public interface AnnouncementMapper extends BaseMapper<Announcement> {
+}

+ 6 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/mapper/AnnouncementMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.wtkj.mapper.AnnouncementMapper">
+
+
+</mapper>

+ 20 - 0
blade-service/wutong-okr/src/main/java/com/wtkj/mapper/AnnouncementSendMapper.java

@@ -0,0 +1,20 @@
+package com.wtkj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.wtkj.entity.AnnouncementSend;
+
+import java.util.List;
+
+/**
+ * @author Blizzard
+ * @create at 2023-09-23 11:15
+ * @describe
+ */
+public interface AnnouncementSendMapper extends BaseMapper<AnnouncementSend> {
+	List<AnnouncementSend> selectAnnouncementSendPage(IPage<AnnouncementSend> page, Long userId);
+
+	Integer notReadCount(Long userId);
+
+	List<AnnouncementSend> allNotRead(Long userId);
+}

Some files were not shown because too many files changed in this diff