Browse Source

转移仓库

buzhanyi 2 years ago
commit
b5a0b696e9
100 changed files with 9861 additions and 0 deletions
  1. 122 0
      application-webadmin/pom.xml
  2. 23 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/WebAdminApplication.java
  3. 13 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/AnkaibeiApplication.java
  4. 28 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/CostInFoApi.java
  5. 60 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/CostInFoServiceApi.java
  6. 17 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/LoginApi.java
  7. 28 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/LoginServiceApi.java
  8. 25 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ManHourInfoApi.java
  9. 45 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ManHourServiceApi.java
  10. 41 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ProjectInfoApi.java
  11. 91 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ProjectInfoServiceApi.java
  12. 47 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ProjectTeamApi.java
  13. 111 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ProjectTeamServiceApi.java
  14. 26 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/TaskInfoApi.java
  15. 52 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/TaskInfoServiceApi.java
  16. 59 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/config/LoginConfig.java
  17. 64 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/config/UserLoginInterceptor.java
  18. 136 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/ApplyForCostController.java
  19. 535 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/CostInfoController.java
  20. 99 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/FileController.java
  21. 51 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/LoginAnKaiBeiController.java
  22. 60 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/ManHourController.java
  23. 203 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/ProjectInfoController.java
  24. 210 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/ProjectTeamController.java
  25. 357 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/SubmitUserTaskController.java
  26. 92 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/TaskInfoController.java
  27. 106 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/AccesoryInfoEntity.java
  28. 185 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/CommunicationInfoEntity.java
  29. 198 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/CostInfoEntity.java
  30. 56 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/LoginTokenEntity.java
  31. 204 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ManHourInfoEntity.java
  32. 116 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ManHourJobInfo.java
  33. 124 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ProjectAuditInfoEntity.java
  34. 298 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ProjectInfoEntity.java
  35. 103 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ProjectTeamInfoEntity.java
  36. 139 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/PurchaseInfoEntity.java
  37. 56 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/RelevanceProjectInfoEntity.java
  38. 116 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/RepastExpenseEntity.java
  39. 124 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/RestsInfoEntity.java
  40. 266 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/TaskInfoEntity.java
  41. 115 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/TrafficExpenseEntity.java
  42. 289 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/TravelExpenseEntity.java
  43. 222 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/UserInfoEntity.java
  44. 69 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/enums/CodeEnum.java
  45. 47 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/enums/CostEnum.java
  46. 59 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/enums/ProjectPeriodEnum.java
  47. 58 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/enums/ProjectStatusEnum.java
  48. 23 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/AccesoryInfoMapper.java
  49. 26 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/CommunicationMapper.java
  50. 34 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/CostInfoMapper.java
  51. 17 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/LoginTokenMapper.java
  52. 28 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ManHourJobMapper.java
  53. 36 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ManHourMapper.java
  54. 26 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ProjectAuditInfoMapper.java
  55. 68 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ProjectInfoMapper.java
  56. 41 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ProjectTeamMapper.java
  57. 25 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/PurchaseInfoMapper.java
  58. 59 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/RelevanceProjectInfoMapper.java
  59. 17 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/RepastExpenseMapper.java
  60. 23 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/RestInfoMapper.java
  61. 53 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/TaskInfoMapper.java
  62. 17 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/TrafficExpenseMapper.java
  63. 17 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/TravelExpenseMapper.java
  64. 39 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/UserInfoMapper.java
  65. 24 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/ApplyForCostService.java
  66. 29 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/CostInfoService.java
  67. 24 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/FileService.java
  68. 17 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/LoginService.java
  69. 24 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/ManHourService.java
  70. 41 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/ProjectInfoService.java
  71. 45 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/ProjectTeamService.java
  72. 27 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/TaskInfoService.java
  73. 438 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/ApplyForCostServiceImpl.java
  74. 177 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/CostInfoServiceImpl.java
  75. 285 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/FileUtil.java
  76. 50 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/LoginServiceImpl.java
  77. 143 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/ManHourServiceImpl.java
  78. 452 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/ProjectInfoServiceImpl.java
  79. 242 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/ProjectTeamServiceImpl.java
  80. 178 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/TaskInfoServiceImpl.java
  81. 187 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/ApiMixin.java
  82. 172 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/FileUtis.java
  83. 169 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/FlowTaskStart.java
  84. 199 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/JwtUtil.java
  85. 155 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/RSAUtil.java
  86. 49 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/AccesoryInfoVo.java
  87. 18 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/BaseVo.java
  88. 55 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/CommunicationInfoVo.java
  89. 65 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/CostInfoVo.java
  90. 20 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/EchartsEntityVo.java
  91. 63 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ManHourInfoVo.java
  92. 46 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ProjectInfoVo.java
  93. 39 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ProjectTeamInfoVo.java
  94. 62 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/PurchaseInfoVo.java
  95. 40 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/RepastExpenseVo.java
  96. 92 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ResMsg.java
  97. 60 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/RestsInfoVo.java
  98. 30 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ReturnToken.java
  99. 50 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/TaskInfoVo.java
  100. 0 0
      application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/TrafficExpenseVo.java

+ 122 - 0
application-webadmin/pom.xml

@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>com.ankaibei.workFlow</groupId>
+        <artifactId>AnKaiBeiWorkFlow</artifactId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ankaibei-projectwebadmin</artifactId>
+    <version>1.0.0</version>
+    <name>application</name>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.anji-plus</groupId>
+            <artifactId>spring-boot-starter-captcha</artifactId>
+            <version>${ajcaptcha.version}</version>
+        </dependency>
+        <!-- aj-captcha 依赖data-redis作为缓存 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- 业务组件依赖 -->
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-redis</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-online-api</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-flow-online</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-log</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-minio</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-sequence</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-datafilter</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-swagger</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.ankaibei.workFlow</groupId>
+            <artifactId>common-dict</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.flowable</groupId>
+            <artifactId>flowable-engine-common</artifactId>
+            <version>6.6.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+                <filtering>false</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+                <filtering>false</filtering>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 23 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/WebAdminApplication.java

@@ -0,0 +1,23 @@
+package com.ankaibei.workFlow.webadmin;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+/**
+ * 应用服务启动类。
+ *
+ * @author Buzhanyi
+ * @date 2022-09-25
+ */
+@EnableAsync
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@ComponentScan({"com.ankaibei.workFlow.*", "org.flowable.engine.*"})
+public class WebAdminApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(WebAdminApplication.class, args);
+    }
+}

+ 13 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/AnkaibeiApplication.java

@@ -0,0 +1,13 @@
+//package com.ankaibei.workFlow.webadmin.ankaibei;
+//
+//import org.springframework.boot.SpringApplication;
+//import org.springframework.boot.autoconfigure.SpringBootApplication;
+//
+//@SpringBootApplication
+//public class AnkaibeiApplication {
+//
+//    public static void main(String[] args) {
+//        SpringApplication.run(AnkaibeiApplication.class, args);
+//    }
+//
+//}

+ 28 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/CostInFoApi.java

@@ -0,0 +1,28 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.ApiMixin;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.CostInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 14:44
+ */
+public interface CostInFoApi extends ApiMixin<CostInfoVo, Integer> {
+
+    ResMsg findCostInfoAll(CostInfoVo costInfoVo);
+
+    boolean deleteCostInfo(List<CostInfoVo> costInfoVoVos);
+
+    ResMsg updateCostInfo(CostInfoVo costInfoVo);
+
+    ResMsg findCostInfoDetails(CostInfoVo costInfoVo);
+
+    ResMsg findProjectAuditList(Long id, UserInfoVo userInfoVo);
+}

+ 60 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/CostInFoServiceApi.java

@@ -0,0 +1,60 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.CostInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.CostInfoService;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.CostInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 14:45
+ */
+@Service
+public class CostInFoServiceApi implements CostInFoApi {
+
+    @Autowired
+    private CostInfoService costInfoService;
+
+
+    @Override
+    public ResMsg findCostInfoAll(CostInfoVo costInfoVo) {
+        CostInfoEntity costInfoEntity = this.copyProperties(costInfoVo, CostInfoEntity.class);
+
+        return costInfoService.findCostInfoAll(costInfoEntity, costInfoVo.getPageIndex(), costInfoVo.getPageSize());
+    }
+
+    @Override
+    public boolean deleteCostInfo(List<CostInfoVo> costInfoVoVos) {
+        List<CostInfoEntity> costInfoEntities = this.copyProperties(costInfoVoVos, CostInfoEntity.class);
+        return costInfoService.deleteCostInfo(costInfoEntities);
+    }
+
+    @Override
+    public ResMsg updateCostInfo(CostInfoVo costInfoVo) {
+        CostInfoEntity costInfoEntity = this.copyProperties(costInfoVo, CostInfoEntity.class);
+
+        return costInfoService.updateCostInfo(costInfoEntity);
+    }
+
+    @Override
+    public ResMsg findCostInfoDetails(CostInfoVo costInfoVo) {
+        CostInfoEntity costInfoEntity = this.copyProperties(costInfoVo, CostInfoEntity.class);
+
+        return costInfoService.findCostInfoDetails(costInfoEntity);
+    }
+
+    @Override
+    public ResMsg findProjectAuditList(Long id, UserInfoVo userInfoVo) {
+
+        return costInfoService.findProjectAuditList(id, userInfoVo);
+    }
+
+}

+ 17 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/LoginApi.java

@@ -0,0 +1,17 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.ApiMixin;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/5 15:28
+ */
+public interface LoginApi extends ApiMixin<UserInfoVo, Integer> {
+
+    ResMsg login(UserInfoVo userInfoVo);
+}

+ 28 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/LoginServiceApi.java

@@ -0,0 +1,28 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.UserInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.LoginService;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/5 15:29
+ */
+@Service
+public class LoginServiceApi implements LoginApi {
+
+    @Resource
+    private LoginService loginService;
+
+    @Override
+    public ResMsg login(UserInfoVo userInfoVo) {
+        UserInfoEntity userInfoEntity = this.copyProperties(userInfoVo, UserInfoEntity.class);
+        return loginService.login(userInfoEntity);
+    }
+}

+ 25 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ManHourInfoApi.java

@@ -0,0 +1,25 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.ApiMixin;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ManHourInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/21 15:30
+ */
+public interface ManHourInfoApi extends ApiMixin<ManHourInfoVo, Integer> {
+
+
+    ResMsg findManHourAll(ManHourInfoVo manHourInfoVo);
+
+    ResMsg addManHour(ManHourInfoVo manHourInfoVo);
+
+    ResMsg deleteManHour(List<ManHourInfoVo> manHourInfoVos);
+
+}

+ 45 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ManHourServiceApi.java

@@ -0,0 +1,45 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ManHourInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ManHourJobInfo;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.ManHourService;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ManHourInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/21 15:31
+ */
+@Service
+public class ManHourServiceApi implements ManHourInfoApi {
+
+    @Autowired
+    private ManHourService manHourService;
+
+    @Override
+    public ResMsg findManHourAll(ManHourInfoVo manHourInfoVo) {
+        ManHourInfoEntity manHourInfoEntity = this.copyProperties(manHourInfoVo, ManHourInfoEntity.class);
+        return manHourService.findManHourAll(manHourInfoVo.getPageIndex(), manHourInfoVo.getPageSize(), manHourInfoEntity);
+    }
+
+    @Override
+    public ResMsg addManHour(ManHourInfoVo manHourInfoVo) {
+        ManHourInfoEntity manHourInfoEntity = this.copyProperties(manHourInfoVo, ManHourInfoEntity.class);
+        List<ManHourJobInfo> manHours = manHourInfoVo.getManHours();
+        return manHourService.addManHour(manHourInfoVo.getProjectId(), manHourInfoEntity, manHours);
+    }
+
+    @Override
+    public ResMsg deleteManHour(List<ManHourInfoVo> manHourInfoVos) {
+        return manHourService.deleteManHour(manHourInfoVos);
+    }
+
+
+}

+ 41 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ProjectInfoApi.java

@@ -0,0 +1,41 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.ApiMixin;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 11:08
+ */
+public interface ProjectInfoApi extends ApiMixin<ProjectInfoVo, Integer> {
+
+    ResMsg findProjectInfo(ProjectInfoVo projectInfoVo);
+
+    ResMsg findProjectInfoAll(String projectName);
+
+    ResMsg findProjectParticulars(ProjectInfoVo projectInfoVo);
+
+    ResMsg addProject(ProjectInfoVo projectInfoVo);
+
+    ResMsg updateProject(ProjectInfoVo projectInfoVo);
+
+    ResMsg findPrincipalProject(String userId);
+
+    ResMsg findAccesoryInfo(ProjectInfoVo projectInfoVo);
+
+    ResMsg findProjectNumber();
+
+    ResMsg substepOfProjectNum();
+
+    ResMsg findLastMonthProjectNumber();
+
+    ResMsg substepOfProjectNumAtLastMonth();
+
+    ResMsg deleteProjects(List<ProjectInfoVo> projectInfoVos);
+}

+ 91 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ProjectInfoServiceApi.java

@@ -0,0 +1,91 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.ProjectInfoService;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 11:11
+ */
+@Service
+public class ProjectInfoServiceApi implements ProjectInfoApi {
+
+    @Autowired
+    private ProjectInfoService projectInfoService;
+
+    @Override
+    public ResMsg findProjectInfo(ProjectInfoVo projectInfoVo) {
+        ProjectInfoEntity projectInfoEntity = this.copyProperties(projectInfoVo, ProjectInfoEntity.class);
+        return projectInfoService.findProjectInfo(projectInfoVo.getPageIndex(), projectInfoVo.getPageSize(), projectInfoEntity);
+    }
+
+    @Override
+    public ResMsg findProjectInfoAll(String projectName) {
+        return projectInfoService.findProjectInfoAll(projectName);
+    }
+
+    @Override
+    public ResMsg findProjectParticulars(ProjectInfoVo projectInfoVo) {
+        ProjectInfoEntity projectInfoEntity = this.copyProperties(projectInfoVo, ProjectInfoEntity.class);
+        return projectInfoService.findProjectParticulars(projectInfoEntity);
+    }
+
+    @Override
+    public ResMsg addProject(ProjectInfoVo projectInfoVo) {
+        ProjectInfoEntity projectInfoEntity = this.copyProperties(projectInfoVo, ProjectInfoEntity.class);
+        return projectInfoService.addProject(projectInfoEntity);
+    }
+
+    @Override
+    public ResMsg updateProject(ProjectInfoVo projectInfoVo) {
+        ProjectInfoEntity projectInfoEntity = this.copyProperties(projectInfoVo, ProjectInfoEntity.class);
+        return projectInfoService.updateProject(projectInfoEntity);
+    }
+
+    @Override
+    public ResMsg findPrincipalProject(String userId) {
+
+        return projectInfoService.findPrincipalProject(userId);
+    }
+
+    @Override
+    public ResMsg findAccesoryInfo(ProjectInfoVo projectInfoVo) {
+        ProjectInfoEntity projectInfoEntity = this.copyProperties(projectInfoVo, ProjectInfoEntity.class);
+        return projectInfoService.findAccesoryInfo(projectInfoEntity);
+    }
+
+    @Override
+    public ResMsg findProjectNumber() {
+
+        return projectInfoService.findProjectNumber();
+    }
+
+    @Override
+    public ResMsg substepOfProjectNum() {
+        return projectInfoService.substepOfProjectNum();
+    }
+
+    @Override
+    public ResMsg findLastMonthProjectNumber() {
+        return projectInfoService.findLastMonthProjectNumber();
+    }
+
+    @Override
+    public ResMsg substepOfProjectNumAtLastMonth() {
+        return projectInfoService.substepOfProjectNumAtLastMonth();
+    }
+
+    @Override
+    public ResMsg deleteProjects(List<ProjectInfoVo> projectInfoVos) {
+        return projectInfoService.deleteProjects(projectInfoVos);
+    }
+}

+ 47 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ProjectTeamApi.java

@@ -0,0 +1,47 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectTeamInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.ApiMixin;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectTeamInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/13 10:23
+ */
+public interface ProjectTeamApi extends ApiMixin<ProjectTeamInfoVo, Integer> {
+
+
+    ResMsg findProjectTeamAll(ProjectTeamInfoVo projectTeamInfoVo);
+
+    ResMsg findProjectTeamUser(UserInfoVo userInfoVo);
+
+    ResMsg updateProjectTeam(ProjectTeamInfoVo projectTeamInfoVo);
+
+    boolean deleteBatchUser(List<UserInfoVo> userInfoVos);
+
+    ResMsg addUser(UserInfoVo userInfoVo);
+
+    ResMsg updateUser(UserInfoVo userInfoVo);
+
+    ResMsg findById(Long userInfoVo);
+
+    ResMsg findPrincipal();
+
+    ResMsg findTeamUser(ProjectTeamInfoEntity projectTeamInfoEntity);
+
+    ResMsg addProjectTeam(ProjectTeamInfoVo projectTeamInfoVo);
+
+    ResMsg addProjectTeamUser(ProjectTeamInfoVo projectTeamInfoVo);
+
+    ResMsg removeUser(ProjectTeamInfoVo projectTeamInfoVo);
+
+    ResMsg findUserProject(Long userId);
+}

+ 111 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/ProjectTeamServiceApi.java

@@ -0,0 +1,111 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectTeamInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.UserInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.ProjectTeamService;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectTeamInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/13 10:24
+ */
+@Service
+public class ProjectTeamServiceApi implements ProjectTeamApi {
+
+    @Resource
+    private ProjectTeamService projectTeamService;
+
+    @Override
+    public ResMsg findProjectTeamAll(ProjectTeamInfoVo projectTeamInfoVo) {
+
+        ProjectTeamInfoEntity projectTeamInfoEntity = this.copyProperties(projectTeamInfoVo, ProjectTeamInfoEntity.class);
+        return projectTeamService.findProjectTeamAll(projectTeamInfoVo.getPageIndex(), projectTeamInfoVo.getPageSize(), projectTeamInfoEntity);
+    }
+
+    @Override
+    public ResMsg findProjectTeamUser(UserInfoVo userInfoVo) {
+        return projectTeamService.findProjectTeamUser(userInfoVo.getPageIndex(), userInfoVo.getPageSize(), userInfoVo.getProjectTeamId());
+    }
+
+    @Override
+    public ResMsg updateProjectTeam(ProjectTeamInfoVo projectTeamInfoVo) {
+        ProjectTeamInfoEntity projectTeamInfoEntity = this.copyProperties(projectTeamInfoVo, ProjectTeamInfoEntity.class);
+        return projectTeamService.updateProjectTeam(projectTeamInfoEntity);
+    }
+
+    @Override
+    public boolean deleteBatchUser(List<UserInfoVo> userInfoVos) {
+        List<UserInfoEntity> userInfoEntities = this.copyProperties(userInfoVos, UserInfoEntity.class);
+        return projectTeamService.deleteBatchUser(userInfoEntities);
+    }
+
+    @Override
+    public ResMsg addUser(UserInfoVo userInfoVo) {
+        UserInfoEntity userInfoEntity = this.copyProperties(userInfoVo, UserInfoEntity.class);
+        return projectTeamService.addUser(userInfoEntity);
+    }
+
+    @Override
+    public ResMsg updateUser(UserInfoVo userInfoVo) {
+        UserInfoEntity userInfoEntity = this.copyProperties(userInfoVo, UserInfoEntity.class);
+        return projectTeamService.updateUser(userInfoEntity);
+    }
+
+    @Override
+    public ResMsg findById(Long userId) {
+        return projectTeamService.findById(userId);
+    }
+
+    @Override
+    public ResMsg findPrincipal() {
+
+        return projectTeamService.findPrincipal();
+    }
+
+    @Override
+    public ResMsg findTeamUser(ProjectTeamInfoEntity projectTeamInfoEntity) {
+
+        return projectTeamService.findTeamUser(projectTeamInfoEntity);
+    }
+
+    @Override
+    public ResMsg addProjectTeam(ProjectTeamInfoVo projectTeamInfoVo) {
+
+        ProjectTeamInfoEntity projectTeamInfoEntity = this.copyProperties(projectTeamInfoVo, ProjectTeamInfoEntity.class);
+        return projectTeamService.addProjectTeam(projectTeamInfoEntity, projectTeamInfoVo.getUserIds());
+    }
+
+    @Override
+    public ResMsg addProjectTeamUser(ProjectTeamInfoVo projectTeamInfoVo) {
+        ProjectTeamInfoEntity projectTeamInfoEntity = this.copyProperties(projectTeamInfoVo, ProjectTeamInfoEntity.class);
+        return projectTeamService.addProjectTeamUser(projectTeamInfoEntity, projectTeamInfoVo.getUserIds());
+    }
+
+    @Override
+    public ResMsg removeUser(ProjectTeamInfoVo projectTeamInfoVo) {
+        ProjectTeamInfoEntity projectTeamInfoEntity = this.copyProperties(projectTeamInfoVo, ProjectTeamInfoEntity.class);
+        return projectTeamService.removeUser(projectTeamInfoEntity, projectTeamInfoVo.getUserIds());
+    }
+
+    @Override
+    public ResMsg findUserProject(Long userId) {
+
+        return projectTeamService.findUserProject(userId);
+    }
+
+    @Override
+    public boolean deleteBatch(List<ProjectTeamInfoVo> projectTeamInfoVos) {
+        List<ProjectTeamInfoEntity> projectTeamInfoEntities = this.copyProperties(projectTeamInfoVos, ProjectTeamInfoEntity.class);
+        return projectTeamService.deleteBatch(projectTeamInfoEntities);
+    }
+
+}

+ 26 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/TaskInfoApi.java

@@ -0,0 +1,26 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.ApiMixin;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.TaskInfoVo;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 17:16
+ */
+public interface TaskInfoApi extends ApiMixin<TaskInfoVo, Integer> {
+    ResMsg findTaskInfo(TaskInfoVo taskInfoVo);
+
+    ResMsg addTaskInfo(TaskInfoVo taskInfoVo);
+
+    ResMsg findTaskById(TaskInfoVo taskInfoVo);
+
+    ResMsg performTask(TaskInfoVo taskInfoVo);
+
+    ResMsg deleteTask(List<TaskInfoVo> taskInfoVos);
+}

+ 52 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/api/TaskInfoServiceApi.java

@@ -0,0 +1,52 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.api;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.TaskInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.TaskInfoService;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.TaskInfoVo;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 17:17
+ */
+@Service
+public class TaskInfoServiceApi implements TaskInfoApi {
+
+    @Resource
+    private TaskInfoService taskInfoService;
+
+    @Override
+    public ResMsg findTaskInfo(TaskInfoVo taskInfoVo) {
+        TaskInfoEntity taskInfoEntity = this.copyProperties(taskInfoVo, TaskInfoEntity.class);
+        return taskInfoService.findTaskInfo(taskInfoVo.getPageIndex(), taskInfoVo.getPageSize(), taskInfoEntity);
+    }
+
+    @Override
+    public ResMsg addTaskInfo(TaskInfoVo taskInfoVo) {
+        TaskInfoEntity taskInfoEntity = this.copyProperties(taskInfoVo, TaskInfoEntity.class);
+        return taskInfoService.addTaskInfo(taskInfoEntity, taskInfoVo.getTaskParticipant());
+    }
+
+    @Override
+    public ResMsg findTaskById(TaskInfoVo taskInfoVo) {
+        return taskInfoService.findTaskById(taskInfoVo);
+    }
+
+    @Override
+    public ResMsg performTask(TaskInfoVo taskInfoVo) {
+        TaskInfoEntity taskInfoEntity = this.copyProperties(taskInfoVo, TaskInfoEntity.class);
+        return taskInfoService.performTask(taskInfoEntity);
+    }
+
+    @Override
+    public ResMsg deleteTask(List<TaskInfoVo> taskInfoVos) {
+        return taskInfoService.deleteTask(taskInfoVos);
+    }
+
+}

+ 59 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/config/LoginConfig.java

@@ -0,0 +1,59 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 11:21
+ */
+
+@Configuration
+public class LoginConfig implements WebMvcConfigurer {
+
+    /**
+     * 服务器存储路径
+     */
+    final String basePath = "/ankaibei/upload/";
+    /**
+     * 上传服务器的映射路径
+     */
+    final String staticAccessPath = "/static/";
+    /**
+     * 本地存储路径
+     */
+    String locationPath = "D:/upload/";
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        ////注册TestInterceptor拦截器
+        //InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());
+        //registration.addPathPatterns("/manHour/**");
+        //registration.addPathPatterns("/project/**");
+        //registration.addPathPatterns("/projectteam/**");
+        //registration.addPathPatterns("/task/**");
+        //registration.addPathPatterns("/cost/**");
+        //registration.addPathPatterns("/apply/**");
+        //registration.excludePathPatterns("/login");
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+
+        //添加默认的静态资源访问路径
+        registry.addResourceHandler(staticAccessPath + "**")
+                .addResourceLocations("file:" + basePath);
+        registry.addResourceHandler(staticAccessPath + "**")
+                .addResourceLocations("file:" + locationPath);
+
+    }
+
+
+}
+

+ 64 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/config/UserLoginInterceptor.java

@@ -0,0 +1,64 @@
+//package com.ankaibei.workFlow.webadmin.ankaibei.config;
+//
+//import com.ankaibei.workFlow.webadmin.ankaibei.utils.JwtUtil;
+//import org.springframework.util.StringUtils;
+//import org.springframework.web.servlet.HandlerInterceptor;
+//import org.springframework.web.servlet.ModelAndView;
+//
+//import javax.servlet.ServletException;
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//import java.io.IOException;
+//
+//public class UserLoginInterceptor implements HandlerInterceptor {
+//
+//    /***
+//     * 在请求处理之前进行调用(Controller方法调用之前)
+//     */
+//    @Override
+//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+//        System.out.println("执行了拦截器的preHandle方法");
+//
+//        String token = request.getHeader("token");
+//        if (StringUtils.isEmpty(token)){
+//            error(request,response);
+//            return false;
+//        }
+//        if(!JwtUtil.findLoginToken(token)){
+//            error(request,response);
+//            return false;
+//        }
+//        return true;
+//        //如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
+//        //如果设置为true时,请求将会继续执行后面的操作
+//    }
+//
+//     /**
+//      *
+//      *请重新登录
+//      */
+//     private String error(HttpServletRequest request, HttpServletResponse response){
+//         try {
+//             request.getRequestDispatcher("/errorLogin").forward(request,response);
+//         } catch (ServletException e) {
+//             e.printStackTrace();
+//         } catch (IOException e) {
+//             e.printStackTrace();
+//         }
+//         return null;
+//     }
+//
+//    /***
+//     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
+//     */
+//    @Override
+//    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+//    }
+//
+//    /***
+//     * 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
+//     */
+//    @Override
+//    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+//    }
+//}

+ 136 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/ApplyForCostController.java

@@ -0,0 +1,136 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.ApplyForCostService;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.impl.FileUtil;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description: 费用申请
+ * @date 2022/9/26 16:14
+ */
+@RestController
+@RequestMapping("/apply")
+public class ApplyForCostController {
+
+    @Autowired
+    private ApplyForCostService applyForCostService;
+    @Resource
+    private FileUtil fileUtil;
+
+    /**
+     * 上传发票
+     * 返回文件上传后的路径
+     *
+     * @param invoicesList
+     * @return ResMsg
+     */
+    @CrossOrigin
+    @RequestMapping("/invoiceUpLoad")
+    public ResMsg invoiceUpLoad(@RequestParam(value = "invoicesList", required = false) List<MultipartFile> invoicesList) {
+        if (!StringUtils.isEmpty(invoicesList)) {
+            List<String> strings = fileUtil.uploadList(invoicesList);
+            if (strings != null) {
+                return new ResMsg(CodeEnum.OK, strings.toString());
+            }
+        } else {
+            return new ResMsg(CodeEnum.FAIL, "");
+        }
+        return new ResMsg(CodeEnum.OK);
+
+    }
+
+    /**
+     * 申请通讯费
+     *
+     * @param communicationInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/addCommunication")
+    public ResMsg addCommunication(@RequestBody CommunicationInfoVo communicationInfoVo) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        communicationInfoVo.setCreateUser(String.valueOf(userId));
+        return applyForCostService.addCommunication(communicationInfoVo);
+    }
+
+    /**
+     * 申请采购费
+     *
+     * @param purchaseInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/addpurchase")
+    public ResMsg addpurchase(@RequestBody PurchaseInfoVo purchaseInfoVo) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        purchaseInfoVo.setCreateUser(String.valueOf(userId));
+        return applyForCostService.addpurchase(purchaseInfoVo);
+    }
+
+    /**
+     * 申请其他费用
+     *
+     * @param restsInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/addRest")
+    public ResMsg addRest(@RequestBody RestsInfoVo restsInfoVo) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        restsInfoVo.setCreateUser(String.valueOf(userId));
+        return applyForCostService.addRest(restsInfoVo);
+    }
+
+    /**
+     * 申请交通费用
+     *
+     * @param trafficExpenseVo
+     * @return ResMsg
+     */
+    @RequestMapping("/trafficExpenseApply")
+    public ResMsg trafficExpenseApply(@RequestBody TrafficExpenseVo trafficExpenseVo, HttpServletRequest request) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        trafficExpenseVo.setApplicant(String.valueOf(userId));
+        return applyForCostService.trafficExpenseApply(trafficExpenseVo);
+    }
+
+    /**
+     * 申请餐饮费用
+     *
+     * @param RepastExpenseVo
+     * @return ResMsg
+     */
+    @RequestMapping("/repastExpenseApply")
+    public ResMsg repastExpenseApply(@RequestBody RepastExpenseVo RepastExpenseVo, HttpServletRequest request) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        RepastExpenseVo.setApplicant(String.valueOf(userId));
+        return applyForCostService.repastExpenseApply(RepastExpenseVo);
+    }
+
+    /**
+     * 申请差旅费用
+     *
+     * @param travelExpenseVo
+     * @return ResMsg
+     */
+    @RequestMapping("/travelExpenseApply")
+    public ResMsg travelExpenseApply(@RequestBody TravelExpenseVo travelExpenseVo, HttpServletRequest request) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        travelExpenseVo.setApplicant(String.valueOf(userId));
+        return applyForCostService.travelExpenseApply(travelExpenseVo);
+    }
+
+}

+ 535 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/CostInfoController.java

@@ -0,0 +1,535 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ankaibei.workFlow.common.core.annotation.DisableDataFilter;
+import com.ankaibei.workFlow.common.core.object.MyPageData;
+import com.ankaibei.workFlow.common.core.object.ResponseResult;
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.common.core.util.MyPageUtil;
+import com.ankaibei.workFlow.common.flow.dao.ProjectInfoFlowMapper;
+import com.ankaibei.workFlow.common.flow.service.FlowApiService;
+import com.ankaibei.workFlow.common.flow.service.FlowCategoryService;
+import com.ankaibei.workFlow.common.flow.service.FlowEntryService;
+import com.ankaibei.workFlow.common.flow.service.FlowWorkOrderService;
+import com.ankaibei.workFlow.common.flow.util.FlowOperationHelper;
+import com.ankaibei.workFlow.common.flow.vo.FlowTaskVo;
+import com.ankaibei.workFlow.common.flow.vo.ListRuntimeTaskRequestVo;
+import com.ankaibei.workFlow.common.flow.vo.TaskInfoVo;
+import com.ankaibei.workFlow.common.online.dto.OnlineFilterDto;
+import com.ankaibei.workFlow.common.online.model.OnlineColumn;
+import com.ankaibei.workFlow.common.online.model.OnlineDatasource;
+import com.ankaibei.workFlow.common.online.model.OnlineDatasourceRelation;
+import com.ankaibei.workFlow.common.online.model.OnlineTable;
+import com.ankaibei.workFlow.common.online.model.constant.FieldFilterType;
+import com.ankaibei.workFlow.common.online.model.constant.RelationType;
+import com.ankaibei.workFlow.common.online.service.OnlineOperationService;
+import com.ankaibei.workFlow.common.online.util.OnlineOperationHelper;
+import com.ankaibei.workFlow.webadmin.ankaibei.api.CostInFoApi;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.FlowTaskStart;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.CostInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:费用管理
+ * @date 2022/9/26 14:43
+ */
+@RestController
+@RequestMapping("/cost")
+public class CostInfoController {
+
+    @Autowired
+    private CostInFoApi costInFoApi;
+    @Autowired
+    private FlowApiService flowApiService;
+    @Autowired
+    private FlowEntryService flowEntryService;
+    @Autowired
+    private FlowCategoryService categoryService;
+    @Autowired
+    private ProjectInfoFlowMapper projectInfoFlowMapper;
+    @Autowired
+    private FlowOperationHelper flowOperationHelper;
+    @Autowired
+    private OnlineOperationHelper onlineOperationHelper;
+    @Autowired
+    private OnlineOperationService onlineOperationService;
+    @Autowired
+    private FlowTaskStart flowTaskStart;
+    @Autowired
+    private FlowWorkOrderService flowWorkOrderService;
+
+    /**
+     * 查询所有费用信息
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/findCostInfoAll")
+    public ResMsg findCostInfoAll(@RequestBody CostInfoVo costInfoVo) {
+
+        return costInFoApi.findCostInfoAll(costInfoVo);
+    }
+
+    /**
+     * 删除
+     *
+     * @param costInfoVoVos
+     * @return ResMsg
+     */
+    @RequestMapping("/deleteCostInfo")
+    public ResMsg deleteCostInfo(@RequestBody List<CostInfoVo> costInfoVoVos) {
+
+        if (costInFoApi.deleteCostInfo(costInfoVoVos)) {
+            return new ResMsg(CodeEnum.OK);
+        }
+        return new ResMsg(CodeEnum.FAIL);
+    }
+
+    /**
+     * 编辑
+     *
+     * @param costInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/updateCostInfo")
+    public ResMsg updateCostInfo(@RequestBody CostInfoVo costInfoVo) {
+
+        return costInFoApi.updateCostInfo(costInfoVo);
+    }
+
+    /**
+     * 查询费用详情  参数为类型和id
+     *
+     * @param costInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/findCostInfoDetails")
+    public ResMsg findCostInfoDetails(@RequestBody CostInfoVo costInfoVo) {
+
+        return costInFoApi.findCostInfoDetails(costInfoVo);
+    }
+
+    /**
+     * 查询项目审核列表
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/findProjectAuditList")
+    public ResMsg findProjectAuditList(@RequestBody UserInfoVo userInfoVo) {
+        Long id = TokenData.takeFromRequest().getUserId();
+        return costInFoApi.findProjectAuditList(id, userInfoVo);
+    }
+
+
+    /**
+     * 返回当前用户待办的任务列表。
+     * param processDefinitionName 流程定义名 (模糊查询)。
+     * param taskName              任务名称 (模糊查询)。
+     * param pageParam             分页对象。
+     *
+     * @return 返回当前用户待办的任务列表。如果指定流程标识,则仅返回该流程的待办任务列表。
+     */
+    @DisableDataFilter
+    @PostMapping("/listRuntimeTask")
+    public ResMsg listRuntimeTask(
+            @RequestBody ListRuntimeTaskRequestVo listRuntimeTaskRequestVo) {
+        String username = TokenData.takeFromRequest().getLoginName();
+        MyPageData<Task> pageData = flowApiService.getTaskListByUserName(
+                username, listRuntimeTaskRequestVo);
+        List<FlowTaskVo> flowTaskVoList = flowApiService.convertToFlowTaskList(pageData.getDataList());
+        //加上流程分类名称和关联的表单信息中的项目名称
+        List<FlowTaskVo> flowTaskVoListAd = new ArrayList<>();
+        for (FlowTaskVo taskVo : flowTaskVoList) {
+            String categoryName = categoryService.getById(flowEntryService.getById(taskVo.getEntryId()).getCategoryId()).getName();
+            taskVo.setCategoryName(categoryName);
+            //拿到任务所在表单中数据字段和对应的值(包含每个申请记录的项目名称和流程的任务变量)
+            JSONObject jsonData = viewUserTaskDatasource(taskVo.getProcessInstanceId(), taskVo.getTaskId()).getData();
+            Map<String, Object> masterAndOneToOne = (Map<String, Object>) jsonData.get("masterAndOneToOne");
+            if (masterAndOneToOne.get("project_id") != null) {
+                Integer projectId = Integer.parseInt(masterAndOneToOne.get("project_id").toString());
+                taskVo.setProjectId(projectId);
+                taskVo.setProjectName(projectInfoFlowMapper.getById(projectId).getProjectName());
+            } else if (masterAndOneToOne.get("project_name") != null) {
+                Integer projectId = Integer.parseInt(masterAndOneToOne.get("project_name").toString());
+                taskVo.setProjectId(projectId);
+                taskVo.setProjectName(projectInfoFlowMapper.getById(projectId).getProjectName());
+            }
+            if (masterAndOneToOne.get("application_fee") != null) {
+                taskVo.setApplicationFee(masterAndOneToOne.get("application_fee").toString());
+            }
+            if (masterAndOneToOne.get("total_money") != null) {
+                taskVo.setApplicationFee(masterAndOneToOne.get("total_money").toString());
+            }
+            if (masterAndOneToOne.get("accommodation_days") != null) {
+                taskVo.setAccommodationDays(masterAndOneToOne.get("accommodation_days").toString());
+            }
+            //取每条费用申请记录中的费用项,费用类型的直接取,工时和新建项目使用流程分类名称即可
+            if (masterAndOneToOne.get("cost_type") != null) {
+                taskVo.setCostType(masterAndOneToOne.get("cost_type").toString());
+            } else {
+                taskVo.setCostType(categoryName);
+            }
+            taskVo.setFlowTaskStatus(flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(taskVo.getProcessInstanceId()).getFlowStatus() + "");
+            if (StringUtils.isNotBlank(listRuntimeTaskRequestVo.getProjectName())) {
+                if (taskVo.getProjectName().contains(listRuntimeTaskRequestVo.getProjectName())) {
+                    flowTaskVoListAd.add(taskVo);
+                }
+            } else {
+                flowTaskVoListAd.add(taskVo);
+            }
+        }
+        return ResMsg.newInstance(CodeEnum.OK, MyPageUtil.makeResponseData(flowTaskVoListAd, pageData.getTotalCount()));
+    }
+
+    /**
+     * 返回当前用户待办的任务列表。(费用报销分类)
+     * param processDefinitionName 流程定义名 (模糊查询)。
+     * param taskName              任务名称 (模糊查询)。
+     * param pageParam             分页对象。
+     *
+     * @return 返回当前用户待办的任务列表。如果指定流程标识,则仅返回该流程的待办任务列表。
+     */
+    @DisableDataFilter
+    @PostMapping("/listRuntimeTaskByExpense")
+    public ResMsg listRuntimeTaskByExpense(
+            @RequestBody ListRuntimeTaskRequestVo listRuntimeTaskRequestVo) {
+        String username = TokenData.takeFromRequest().getLoginName();
+        ////---按照前端传递参数查询任务数量
+        //MyPageData<Task> pageData = flowApiService.getTaskListByUserName(
+        //        username, listRuntimeTaskRequestVo);
+        //Long totalCount = pageData.getTotalCount();
+        //---查询到所有的任务量
+        final Integer pageNum = listRuntimeTaskRequestVo.getPageNum();
+        listRuntimeTaskRequestVo.setPageNum(1);
+        listRuntimeTaskRequestVo.setPageSize(flowWorkOrderService.getCountByCondition(""));
+        MyPageData<Task> pageDataTwo = flowApiService.getTaskListByUserName(
+                username, listRuntimeTaskRequestVo);
+        List<FlowTaskVo> flowTaskVoList = flowApiService.convertToFlowTaskList(pageDataTwo.getDataList());
+        //---从所有的任务里取出一个分类的任务
+        List<FlowTaskVo> flowTaskVoListByExpense = new ArrayList<>();
+        for (FlowTaskVo taskVo : flowTaskVoList) {
+            String categoryName = categoryService.getById(flowEntryService.getById(taskVo.getEntryId()).getCategoryId()).getName();
+            taskVo.setCategoryName(categoryName);
+            if (categoryName.equals("费用报销")) {
+                //拿到任务所在表单中数据字段和对应的值(包含每个申请记录的项目名称和流程的任务变量)
+                JSONObject jsonData = viewUserTaskDatasource(taskVo.getProcessInstanceId(), taskVo.getTaskId()).getData();
+                Map<String, Object> masterAndOneToOne = (Map<String, Object>) jsonData.get("masterAndOneToOne");
+                if (masterAndOneToOne.get("project_name") != null) {
+                    Integer projectId = Integer.parseInt(masterAndOneToOne.get("project_name").toString());
+                    taskVo.setProjectName(projectInfoFlowMapper.getById(projectId).getProjectName());
+                }
+                if (masterAndOneToOne.get("application_fee") != null) {
+                    taskVo.setApplicationFee(masterAndOneToOne.get("application_fee").toString());
+                }
+                if (masterAndOneToOne.get("total_money") != null) {
+                    taskVo.setApplicationFee(masterAndOneToOne.get("total_money").toString());
+                }
+                if (masterAndOneToOne.get("accommodation_days") != null) {
+                    taskVo.setAccommodationDays(masterAndOneToOne.get("accommodation_days").toString());
+                }
+                //每个审批项在各自记录表中的主键id
+                if (masterAndOneToOne.get("id") != null) {
+                    taskVo.setApplyDataId(Integer.parseInt(masterAndOneToOne.get("id").toString()));
+                }
+                if (masterAndOneToOne.get("communication_id") != null) {
+                    taskVo.setApplyDataId(Integer.parseInt(masterAndOneToOne.get("communication_id").toString()));
+                }
+                if (masterAndOneToOne.get("purchase_id") != null) {
+                    taskVo.setApplyDataId(Integer.parseInt(masterAndOneToOne.get("purchase_id").toString()));
+                }
+                if (masterAndOneToOne.get("cost_type") != null) {
+                    taskVo.setCostType(masterAndOneToOne.get("cost_type").toString());
+                }
+                taskVo.setFlowTaskStatus(flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(taskVo.getProcessInstanceId()).getFlowStatus() + "");
+                if (StringUtils.isNotBlank(listRuntimeTaskRequestVo.getProjectName())) {
+                    if (taskVo.getProjectName().contains(listRuntimeTaskRequestVo.getProjectName())) {
+                        flowTaskVoListByExpense.add(taskVo);
+                    }
+                } else {
+                    flowTaskVoListByExpense.add(taskVo);
+                }
+            }
+        }
+        return PackageAgain(flowTaskVoListByExpense, pageNum);
+    }
+
+
+    /**
+     * 返回当前用户待办的任务列表。(员工工时分类)
+     * param processDefinitionName 流程定义名 (模糊查询)。
+     * param taskName              任务名称 (模糊查询)。
+     * param pageParam             分页对象。
+     *
+     * @return 返回当前用户待办的任务列表。如果指定流程标识,则仅返回该流程的待办任务列表。
+     */
+
+    @DisableDataFilter
+    @PostMapping("/listRuntimeTaskByManHour")
+    public ResMsg listRuntimeTaskByManHour(
+            @RequestBody ListRuntimeTaskRequestVo listRuntimeTaskRequestVo) {
+        String username = TokenData.takeFromRequest().getLoginName();
+        //MyPageData<Task> pageData = flowApiService.getTaskListByUserName(
+        //        username, listRuntimeTaskRequestVo);
+        //List<FlowTaskVo> flowTaskVoList = flowApiService.convertToFlowTaskList(pageData.getDataList());
+        //---查询到所有的任务量
+        final Integer pageNum = listRuntimeTaskRequestVo.getPageNum();
+        listRuntimeTaskRequestVo.setPageNum(1);
+        listRuntimeTaskRequestVo.setPageSize(flowWorkOrderService.getCountByCondition(""));
+        MyPageData<Task> pageDataTwo = flowApiService.getTaskListByUserName(
+                username, listRuntimeTaskRequestVo);
+        List<FlowTaskVo> flowTaskVoList = flowApiService.convertToFlowTaskList(pageDataTwo.getDataList());
+        //---从所有的任务里取出一个分类的任务
+        List<FlowTaskVo> flowTaskVoListByManHour = new ArrayList<>();
+        for (FlowTaskVo taskVo : flowTaskVoList) {
+            String categoryName = categoryService.getById(flowEntryService.getById(taskVo.getEntryId()).getCategoryId()).getName();
+            taskVo.setCategoryName(categoryName);
+            if (categoryName.equals("人员工时")) {
+                //拿到任务所在表单中数据字段和对应的值(包含每个申请记录的项目名称和流程的任务变量)
+                JSONObject jsonData = viewUserTaskDatasource(taskVo.getProcessInstanceId(), taskVo.getTaskId()).getData();
+                Map<String, Object> masterAndOneToOne = (Map<String, Object>) jsonData.get("masterAndOneToOne");
+                if (masterAndOneToOne.get("project_name") != null) {
+                    Integer projectId = Integer.parseInt(masterAndOneToOne.get("project_name").toString());
+                    taskVo.setProjectId(projectId);
+                    taskVo.setProjectName(projectInfoFlowMapper.getById(projectId).getProjectName());
+                }
+                if (masterAndOneToOne.get("man_id") != null) {
+                    taskVo.setApplyDataId(Integer.parseInt(masterAndOneToOne.get("man_id").toString()));
+                }
+                taskVo.setCostType(categoryName);
+                taskVo.setFlowTaskStatus(flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(taskVo.getProcessInstanceId()).getFlowStatus() + "");
+                if (StringUtils.isNotBlank(listRuntimeTaskRequestVo.getProjectName())) {
+                    if (taskVo.getProjectName().contains(listRuntimeTaskRequestVo.getProjectName())) {
+                        flowTaskVoListByManHour.add(taskVo);
+                    }
+                } else {
+                    flowTaskVoListByManHour.add(taskVo);
+                }
+            }
+        }
+        return PackageAgain(flowTaskVoListByManHour, pageNum);
+    }
+
+    /**
+     * 返回当前用户待办的任务列表。(操作项目信息分类)
+     * param processDefinitionName 流程定义名 (模糊查询)。
+     * param taskName              任务名称 (模糊查询)。
+     * param pageParam             分页对象。
+     *
+     * @return 返回当前用户待办的任务列表。如果指定流程标识,则仅返回该流程的待办任务列表。
+     */
+    @DisableDataFilter
+    @PostMapping("/listRuntimeTaskByProjectAdd")
+    public ResMsg listRuntimeTaskByProjectAdd(
+            @RequestBody ListRuntimeTaskRequestVo listRuntimeTaskRequestVo) {
+        String username = TokenData.takeFromRequest().getLoginName();
+        //MyPageData<Task> pageData = flowApiService.getTaskListByUserName(
+        //        username, listRuntimeTaskRequestVo);
+        //List<FlowTaskVo> flowTaskVoList = flowApiService.convertToFlowTaskList(pageData.getDataList());
+        //---查询到所有的任务量
+        final Integer pageNum = listRuntimeTaskRequestVo.getPageNum();
+        listRuntimeTaskRequestVo.setPageNum(1);
+        listRuntimeTaskRequestVo.setPageSize(flowWorkOrderService.getCountByCondition(""));
+        MyPageData<Task> pageDataTwo = flowApiService.getTaskListByUserName(
+                username, listRuntimeTaskRequestVo);
+        List<FlowTaskVo> flowTaskVoList = flowApiService.convertToFlowTaskList(pageDataTwo.getDataList());
+        //---从所有的任务里取出一个分类的任务
+        List<FlowTaskVo> flowTaskVoListByProjectAdd = new ArrayList<>();
+        for (FlowTaskVo taskVo : flowTaskVoList) {
+            String categoryName = categoryService.getById(flowEntryService.getById(taskVo.getEntryId()).getCategoryId()).getName();
+            taskVo.setCategoryName(categoryName);
+            if (categoryName.equals("新建项目")) {
+                //拿到任务所在表单中数据字段和对应的值(包含每个申请记录的项目名称和流程的任务变量)
+                JSONObject jsonData = viewUserTaskDatasource(taskVo.getProcessInstanceId(), taskVo.getTaskId()).getData();
+                Map<String, Object> masterAndOneToOne = (Map<String, Object>) jsonData.get("masterAndOneToOne");
+                if (masterAndOneToOne.get("project_id") != null) {
+                    Integer projectId = Integer.parseInt(masterAndOneToOne.get("project_id").toString());
+                    taskVo.setProjectId(projectId);
+                    taskVo.setProjectName(projectInfoFlowMapper.getById(projectId).getProjectName());
+                }
+                taskVo.setCostType(categoryName);
+                taskVo.setFlowTaskStatus(flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(taskVo.getProcessInstanceId()).getFlowStatus() + "");
+                if (StringUtils.isNotBlank(listRuntimeTaskRequestVo.getProjectName())) {
+                    if (taskVo.getProjectName().contains(listRuntimeTaskRequestVo.getProjectName())) {
+                        flowTaskVoListByProjectAdd.add(taskVo);
+                    }
+                } else {
+                    flowTaskVoListByProjectAdd.add(taskVo);
+                }
+            }
+        }
+        return PackageAgain(flowTaskVoListByProjectAdd, pageNum);
+    }
+
+    /**
+     * 返回当前用户待办的任务列表。(添加任务分类)
+     * param processDefinitionName 流程定义名 (模糊查询)。
+     * param taskName              任务名称 (模糊查询)。
+     * param pageParam             分页对象。
+     *
+     * @return 返回当前用户待办的任务列表。如果指定流程标识,则仅返回该流程的待办任务列表。
+     */
+    @DisableDataFilter
+    @PostMapping("/listRuntimeTaskByProjectTaskAdd")
+    public ResMsg listRuntimeTaskByProjectTaskAdd(
+            @RequestBody ListRuntimeTaskRequestVo listRuntimeTaskRequestVo) {
+        String username = TokenData.takeFromRequest().getLoginName();
+        //MyPageData<Task> pageData = flowApiService.getTaskListByUserName(
+        //        username, listRuntimeTaskRequestVo);
+        //List<FlowTaskVo> flowTaskVoList = flowApiService.convertToFlowTaskList(pageData.getDataList());
+        //---查询到所有的任务量
+        final Integer pageNum = listRuntimeTaskRequestVo.getPageNum();
+        listRuntimeTaskRequestVo.setPageNum(1);
+        listRuntimeTaskRequestVo.setPageSize(flowWorkOrderService.getCountByCondition(""));
+        MyPageData<Task> pageDataTwo = flowApiService.getTaskListByUserName(
+                username, listRuntimeTaskRequestVo);
+        List<FlowTaskVo> flowTaskVoList = flowApiService.convertToFlowTaskList(pageDataTwo.getDataList());
+        //---从所有的任务里取出一个分类的任务
+        List<FlowTaskVo> flowTaskVoListByTaskAdd = new ArrayList<>();
+        for (FlowTaskVo taskVo : flowTaskVoList) {
+            String categoryName = categoryService.getById(flowEntryService.getById(taskVo.getEntryId()).getCategoryId()).getName();
+            taskVo.setCategoryName(categoryName);
+            if (categoryName.equals("新建任务")) {
+                //拿到任务所在表单中数据字段和对应的值(包含每个申请记录的项目名称和流程的任务变量)
+                JSONObject jsonData = viewUserTaskDatasource(taskVo.getProcessInstanceId(), taskVo.getTaskId()).getData();
+                Map<String, Object> masterAndOneToOne = (Map<String, Object>) jsonData.get("masterAndOneToOne");
+                if (masterAndOneToOne.get("project_id") != null) {
+                    Integer projectId = Integer.parseInt(masterAndOneToOne.get("project_id").toString());
+                    taskVo.setProjectId(projectId);
+                    taskVo.setProjectName(projectInfoFlowMapper.getById(projectId).getProjectName());
+                }
+                if (masterAndOneToOne.get("task_id") != null) {
+                    taskVo.setApplyDataId(Integer.parseInt(masterAndOneToOne.get("task_id").toString()));
+                }
+                taskVo.setCostType(categoryName);
+                taskVo.setFlowTaskStatus(flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(taskVo.getProcessInstanceId()).getFlowStatus() + "");
+                if (StringUtils.isNotBlank(listRuntimeTaskRequestVo.getProjectName())) {
+                    if (taskVo.getProjectName().contains(listRuntimeTaskRequestVo.getProjectName())) {
+                        flowTaskVoListByTaskAdd.add(taskVo);
+                    }
+                } else {
+                    flowTaskVoListByTaskAdd.add(taskVo);
+                }
+            }
+        }
+        return PackageAgain(flowTaskVoListByTaskAdd, pageNum);
+    }
+
+    /**
+     * 获取当前流程实例的详情数据。包括主表数据、一对一从表数据、一对多从表数据列表等。
+     * 该接口无需数据权限过滤,因此用DisableDataFilter注解标注。如果当前系统没有支持数据权限过滤,该注解不会有任何影响。
+     *
+     * @param processInstanceId 当前运行时的流程实例Id。
+     * @param taskId            流程任务Id。
+     * @return 当前流程实例的详情数据。
+     */
+    public ResMsg<JSONObject> viewUserTaskDatasource(
+            String processInstanceId, String taskId) {
+        String errorMessage;
+        // 验证流程任务的合法性。
+        Task task = flowApiService.getProcessInstanceActiveTask(processInstanceId, taskId);
+        ProcessInstance instance = flowApiService.getProcessInstance(processInstanceId);
+        // 如果业务主数据为空,则直接返回。
+        if (StrUtil.isBlank(instance.getBusinessKey())) {
+            return ResMsg.newInstance(CodeEnum.OK);
+        }
+        ResponseResult<TaskInfoVo> taskInfoResult = flowOperationHelper.verifyAndGetRuntimeTaskInfo(task);
+        if (!taskInfoResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, taskInfoResult);
+        }
+        TaskInfoVo taskInfo = taskInfoResult.getData();
+        // 验证在线表单及其关联数据源的合法性。
+        ResponseResult<OnlineDatasource> datasourceResult = flowTaskStart.verifyAndGetOnlineDatasource(taskInfo.getFormId());
+        if (!datasourceResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, datasourceResult);
+        }
+
+        //datasource中columnMap为提交的申请的各个字段
+        OnlineDatasource datasource = datasourceResult.getData();
+        ResponseResult<List<OnlineDatasourceRelation>> relationListResult =
+                onlineOperationHelper.verifyAndGetRelationList(datasource.getDatasourceId(), null);
+        if (!relationListResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, relationListResult);
+        }
+        JSONObject jsonData = this.buildUserTaskData(
+                instance.getBusinessKey(), datasource.getMasterTable(), relationListResult.getData());
+        return ResMsg.newInstance(CodeEnum.OK, jsonData);
+    }
+
+
+    private JSONObject buildUserTaskData(
+            String businessKey, OnlineTable masterTable, List<OnlineDatasourceRelation> relationList) {
+        JSONObject jsonData = new JSONObject();
+        List<OnlineDatasourceRelation> oneToOneRelationList = relationList.stream()
+                .filter(r -> r.getRelationType().equals(RelationType.ONE_TO_ONE)).collect(Collectors.toList());
+        Map<String, Object> result =
+                onlineOperationService.getMasterData(masterTable, oneToOneRelationList, relationList, businessKey);
+        if (MapUtil.isEmpty(result)) {
+            return jsonData;
+        }
+        jsonData.put("masterAndOneToOne", result);
+        List<OnlineDatasourceRelation> oneToManyRelationList = relationList.stream()
+                .filter(r -> r.getRelationType().equals(RelationType.ONE_TO_MANY)).collect(Collectors.toList());
+        if (CollUtil.isEmpty(oneToManyRelationList)) {
+            return jsonData;
+        }
+        JSONObject oneToManyJsonData = new JSONObject();
+        jsonData.put("oneToMany", oneToManyJsonData);
+        for (OnlineDatasourceRelation relation : oneToManyRelationList) {
+            OnlineFilterDto filterDto = new OnlineFilterDto();
+            filterDto.setTableName(relation.getSlaveTable().getTableName());
+            OnlineColumn slaveColumn = relation.getSlaveTable().getColumnMap().get(relation.getSlaveColumnId());
+            filterDto.setColumnName(slaveColumn.getColumnName());
+            filterDto.setFilterType(FieldFilterType.EQUAL_FILTER);
+            OnlineColumn masterColumn = masterTable.getColumnMap().get(relation.getMasterColumnId());
+            Object columnValue = result.get(masterColumn.getColumnName());
+            filterDto.setColumnValue(columnValue);
+            List<Map<String, Object>> slaveResultList =
+                    onlineOperationService.getSlaveDataList(relation, CollUtil.newLinkedList(filterDto), null);
+            if (CollUtil.isNotEmpty(slaveResultList)) {
+                oneToManyJsonData.put(relation.getVariableName(), slaveResultList);
+            }
+        }
+        return jsonData;
+    }
+
+    private ResMsg PackageAgain(List<FlowTaskVo> flowTaskVoListByExpense, Integer pageNum) {
+        //重新进行包装分页
+        List<FlowTaskVo> flowTaskVoListByExpenseRsg = new ArrayList<>();
+        if (pageNum == 1) {
+            for (int i = 0; i < 10; i++) {
+                flowTaskVoListByExpenseRsg.add(flowTaskVoListByExpense.get(i));
+            }
+        } else {
+            for (int i = (pageNum - 1) * 10; i < pageNum * 10 - 1; i++) {
+                flowTaskVoListByExpenseRsg.add(flowTaskVoListByExpense.get(i));
+                if (i == flowTaskVoListByExpense.size() - 1) {
+                    break;
+                }
+            }
+        }
+        return ResMsg.newInstance(CodeEnum.OK, MyPageUtil.makeResponseData(flowTaskVoListByExpenseRsg, Long.valueOf(flowTaskVoListByExpense.size())));
+    }
+
+}

+ 99 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/FileController.java

@@ -0,0 +1,99 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import com.ankaibei.workFlow.common.core.annotation.NoAuthInterface;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.AccesoryInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.AccesoryInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.AccesoryInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author wenqi
+ */
+@RequestMapping(path = "/files")
+@RestController
+public class FileController {
+
+    @Resource
+    private AccesoryInfoMapper accesoryInfoMapper;
+
+    /**
+     * 服务器存储路径
+     */
+    final String basePath = "/ankaibei/uploadaccesory/";
+    /**
+     * 本地存储路径
+     */
+    String locationPath = "D:/upload/";
+
+    /**
+     * 上传附件
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping(value = "/uploadAccesory")
+    public ResMsg upload(AccesoryInfoVo file) throws IOException {
+        AccesoryInfoEntity accesoryInfoEntity = new AccesoryInfoEntity();
+        accesoryInfoEntity.setProjectId(file.getProjectId());
+        if (!StringUtils.isEmpty(file.getContract())) {
+            String uploading = uploading(file.getContract());
+            accesoryInfoEntity.setContract(uploading);
+        }
+        if (!StringUtils.isEmpty(file.getScheme())) {
+            String uploading = uploading(file.getScheme());
+            accesoryInfoEntity.setScheme(uploading);
+        }
+        if (!StringUtils.isEmpty(file.getPlan())) {
+            String uploading = uploading(file.getPlan());
+            accesoryInfoEntity.setPlan(uploading);
+        }
+        if (!StringUtils.isEmpty(file.getSubmitMaterial())) {
+            String uploading = uploading(file.getSubmitMaterial());
+            accesoryInfoEntity.setSubmitMaterial(uploading);
+        }
+        if (!StringUtils.isEmpty(file.getAcceptance())) {
+            String uploading = uploading(file.getAcceptance());
+            accesoryInfoEntity.setAcceptance(uploading);
+        }
+        accesoryInfoMapper.save(accesoryInfoEntity);
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    private String uploading(List<MultipartFile> files) throws IOException {
+        StringBuffer stringBuffer = new StringBuffer();
+        for (MultipartFile file : files) {
+            InputStream inputStream = file.getInputStream();
+            //文件后缀
+            String prefix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+            String fileName = UUID.randomUUID() + prefix;
+            Files.copy(inputStream, new File(basePath + fileName).toPath(), StandardCopyOption.REPLACE_EXISTING);
+            //拼接上传文件路径
+            String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
+                    .path("/" + "static/" + fileName)
+                    .toUriString();
+            stringBuffer.append(fileDownloadUri + ",");
+        }
+        return stringBuffer.toString();
+    }
+
+}

+ 51 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/LoginAnKaiBeiController.java

@@ -0,0 +1,51 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.webadmin.ankaibei.api.LoginApi;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+import com.ankaibei.workFlow.webadmin.upms.model.SysUser;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description: 登录页
+ * @date 2022/9/5 14:13
+ */
+@RestController
+public class LoginAnKaiBeiController {
+
+    @Resource
+    private LoginApi loginApi;
+
+    /**
+     * 登录
+     *
+     * @param userInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/login")
+    public ResMsg login(@RequestBody UserInfoVo userInfoVo) {
+
+        return loginApi.login(userInfoVo);
+    }
+
+    /**
+     * 重新登录提示
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/errorLogin")
+    public ResMsg error() {
+
+        return new ResMsg(CodeEnum.PLEASE_LOG_IN_AGAIN);
+    }
+
+}

+ 60 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/ManHourController.java

@@ -0,0 +1,60 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.webadmin.ankaibei.api.ManHourInfoApi;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ManHourInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description: 工时管理
+ * @date 2022/9/21 15:28
+ */
+@RestController
+@RequestMapping("/manHour")
+public class ManHourController {
+
+    @Autowired
+    private ManHourInfoApi manHourInfoApi;
+
+    /**
+     * 查询所有工时列表
+     */
+    @RequestMapping("/findManHourAll")
+    public ResMsg findManHourAll(@RequestBody ManHourInfoVo manHourInfoVo) {
+
+        return manHourInfoApi.findManHourAll(manHourInfoVo);
+    }
+
+    /**
+     * 新建工时
+     */
+    @RequestMapping("/addManHour")
+    public ResMsg addManHour(@RequestBody ManHourInfoVo manHourInfoVo, HttpServletRequest request) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        manHourInfoVo.setCreateUser(String.valueOf(userId));
+        return manHourInfoApi.addManHour(manHourInfoVo);
+    }
+
+    /**
+     * 删除
+     *
+     * @param manHourInfoVos
+     * @return ResMsg
+     */
+    @RequestMapping("/deleteManHour")
+    public ResMsg deleteManHour(@RequestBody List<ManHourInfoVo> manHourInfoVos) {
+        return manHourInfoApi.deleteManHour(manHourInfoVos);
+    }
+
+
+}

+ 203 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/ProjectInfoController.java

@@ -0,0 +1,203 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import com.ankaibei.workFlow.common.core.annotation.NoAuthInterface;
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.webadmin.ankaibei.api.ProjectInfoApi;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.impl.FileUtil;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletContext;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description: 项目管理
+ * @date 2022/9/14 11:06
+ */
+@RestController
+@RequestMapping("/project")
+public class ProjectInfoController {
+
+    @Autowired
+    private ProjectInfoApi projectInfoApi;
+
+    @Resource
+    private FileUtil fileUtil;
+
+    private final ServletContext context;
+
+    public ProjectInfoController(ServletContext context) {
+        this.context = context;
+    }
+
+
+    /**
+     * 查询项目
+     *
+     * @param projectInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/findProjectInfo")
+    public ResMsg findProjectInfo(@RequestBody ProjectInfoVo projectInfoVo) {
+
+        return projectInfoApi.findProjectInfo(projectInfoVo);
+    }
+
+    /**
+     * 查询项目--项目名称模糊查询
+     *
+     * @param projectName
+     * @return ResMsg
+     */
+    @NoAuthInterface
+    @RequestMapping("/findProjectInfoAll")
+    public ResMsg findProjectInfoAll(@RequestParam String projectName) {
+        return projectInfoApi.findProjectInfoAll(projectName);
+    }
+
+    /**
+     * 查询项目详情
+     *
+     * @param projectInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/findProjectParticulars")
+    public ResMsg findProjectParticulars(@RequestBody ProjectInfoVo projectInfoVo) {
+
+        return projectInfoApi.findProjectParticulars(projectInfoVo);
+    }
+
+    /**
+     * 项目数量趋势图(当月)
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/findProjectNumber")
+    public ResMsg findProjectNumber() {
+
+        return projectInfoApi.findProjectNumber();
+    }
+
+    /**
+     * 项目对应所属公司的数量分布图(当月)
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/substepOfProjectNum")
+    public ResMsg substepOfProjectNum() {
+        return projectInfoApi.substepOfProjectNum();
+    }
+
+    /**
+     * 项目数量趋势图(上月)
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/findLastMonthProjectNumber")
+    public ResMsg findLastMonthProjectNumber() {
+
+        return projectInfoApi.findLastMonthProjectNumber();
+    }
+
+    /**
+     * 项目对应所属公司的数量分布图(当月)
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/substepOfProjectNumAtLastMonth")
+    public ResMsg substepOfProjectNumAtLastMonth() {
+        return projectInfoApi.substepOfProjectNumAtLastMonth();
+    }
+
+    /**
+     * 查询附件信息
+     *
+     * @param projectInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/findAccesoryInfo")
+    public ResMsg findAccesoryInfo(@RequestBody ProjectInfoVo projectInfoVo) {
+
+        return projectInfoApi.findAccesoryInfo(projectInfoVo);
+    }
+
+
+    /**
+     * 查询当前登录人负责的项目
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/findPrincipalProject")
+    public ResMsg findPrincipalProject() {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        return projectInfoApi.findPrincipalProject(String.valueOf(userId));
+    }
+
+
+    /**
+     * 编辑项目
+     *
+     * @param projectInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/updateProject")
+    public ResMsg updateProject(@RequestBody ProjectInfoVo projectInfoVo) {
+
+        return projectInfoApi.updateProject(projectInfoVo);
+    }
+
+    /**
+     * 删除项目
+     *
+     * @param projectInfoVos
+     * @return ResMsg
+     */
+    @RequestMapping("/deleteProject")
+    public ResMsg deleteProject(@RequestBody List<ProjectInfoVo> projectInfoVos) {
+
+        return projectInfoApi.deleteProjects(projectInfoVos);
+    }
+
+    /**
+     * 新建项目
+     *
+     * @param projectInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/addProject")
+    public ResMsg addProject(@RequestBody ProjectInfoVo projectInfoVo) {
+
+
+        return projectInfoApi.addProject(projectInfoVo);
+    }
+
+    /**
+     * 文件上传
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/upload")
+    public ResMsg upload(MultipartFile upload) throws IOException {
+
+
+        return new ResMsg(CodeEnum.OK, fileUtil.uploadOne(upload));
+    }
+
+}

+ 210 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/ProjectTeamController.java

@@ -0,0 +1,210 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.webadmin.ankaibei.api.ProjectTeamApi;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectTeamInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.JwtUtil;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectTeamInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description: 人员管理
+ * @date 2022/9/13 10:20
+ */
+@RestController
+@RequestMapping("/projectteam")
+public class ProjectTeamController {
+
+    @Resource
+    private ProjectTeamApi projectTeamApi;
+
+    /**
+     * 查询项目组
+     *
+     * @param projectTeamInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/findProjectTeamAll")
+    public ResMsg findProjectTeamAll(@RequestBody ProjectTeamInfoVo projectTeamInfoVo) {
+
+        return projectTeamApi.findProjectTeamAll(projectTeamInfoVo);
+    }
+
+    /**
+     * 删除项目组
+     *
+     * @param projectTeamInfoVos
+     * @return ResMsg
+     */
+    @RequestMapping("/deleteProjectTeam")
+    public ResMsg deleteProjectTeam(@RequestBody List<ProjectTeamInfoVo> projectTeamInfoVos) {
+
+        if (projectTeamApi.deleteBatch(projectTeamInfoVos)) {
+            return new ResMsg(CodeEnum.OK);
+        }
+        return new ResMsg(CodeEnum.FAIL);
+    }
+
+    /**
+     * 添加项目组
+     *
+     * @param projectTeamInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/addProjectTeam")
+    public ResMsg addProjectTeam(@RequestBody ProjectTeamInfoVo projectTeamInfoVo) {
+
+        return projectTeamApi.addProjectTeam(projectTeamInfoVo);
+    }
+
+    /**
+     * 添加项目组人员
+     *
+     * @param projectTeamInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/addProjectTeamUser")
+    public ResMsg addProjectTeamUser(@RequestBody ProjectTeamInfoVo projectTeamInfoVo) {
+
+        return projectTeamApi.addProjectTeamUser(projectTeamInfoVo);
+    }
+
+
+    /**
+     * 编辑项目组
+     *
+     * @param projectTeamInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/updateProjectTeam")
+    public ResMsg updateProjectTeam(@RequestBody ProjectTeamInfoVo projectTeamInfoVo) {
+
+
+        return projectTeamApi.updateProjectTeam(projectTeamInfoVo);
+    }
+
+
+    /**
+     * 查询***项目的人员列表
+     *
+     * @param userInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/findProjectTeamUser")
+    public ResMsg findProjectTeamUser(@RequestBody UserInfoVo userInfoVo) {
+
+        return projectTeamApi.findProjectTeamUser(userInfoVo);
+    }
+
+    /**
+     * 查询人员所在的项目列表
+     *
+     * @return ResMsg
+     */
+    @RequestMapping("/findUserProject")
+    public ResMsg findUserProject() {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        return projectTeamApi.findUserProject(userId);
+    }
+
+    /**
+     * 删除人员
+     *
+     * @param userInfoVos
+     * @return ResMsg
+     */
+    @RequestMapping("/deleteUser")
+    public ResMsg deleteUser(@RequestBody List<UserInfoVo> userInfoVos) {
+
+        if (projectTeamApi.deleteBatchUser(userInfoVos)) {
+            return new ResMsg(CodeEnum.OK);
+        }
+        return new ResMsg(CodeEnum.FAIL);
+    }
+
+    /**
+     * 从项目组移除该人员
+     *
+     * @param projectTeamInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/removeUser")
+    public ResMsg removeUser(@RequestBody ProjectTeamInfoVo projectTeamInfoVo) {
+
+
+        return projectTeamApi.removeUser(projectTeamInfoVo);
+    }
+
+    /**
+     * 新增人员
+     *
+     * @param userInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/addUser")
+    public ResMsg addUser(@RequestBody UserInfoVo userInfoVo) {
+
+        return projectTeamApi.addUser(userInfoVo);
+    }
+
+    /**
+     * 编辑人员
+     *
+     * @param userInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/updateUser")
+    public ResMsg updateUser(@RequestBody UserInfoVo userInfoVo) {
+
+        return projectTeamApi.updateUser(userInfoVo);
+    }
+
+    /**
+     * 查询用户
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/findPrincipal")
+    public ResMsg findPrincipal() {
+
+        return projectTeamApi.findPrincipal();
+    }
+
+    /**
+     * 根据token查询用户信息
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/findById")
+    public ResMsg findById(HttpServletRequest request) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        return projectTeamApi.findById(userId);
+    }
+
+    /**
+     * 根据项目查询项目组人员
+     *
+     * @param
+     * @return ResMsg
+     */
+    @RequestMapping("/findTeamUser")
+    public ResMsg findTeamUser(@RequestBody ProjectTeamInfoEntity projectTeamInfoEntity) {
+        return projectTeamApi.findTeamUser(projectTeamInfoEntity);
+    }
+
+
+}

+ 357 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/SubmitUserTaskController.java

@@ -0,0 +1,357 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ankaibei.workFlow.common.core.annotation.DisableDataFilter;
+import com.ankaibei.workFlow.common.core.object.CallResult;
+import com.ankaibei.workFlow.common.core.object.ResponseResult;
+import com.ankaibei.workFlow.common.flow.constant.FlowApprovalType;
+import com.ankaibei.workFlow.common.flow.constant.FlowConstant;
+import com.ankaibei.workFlow.common.flow.constant.FlowTaskStatus;
+import com.ankaibei.workFlow.common.flow.exception.FlowOperationException;
+import com.ankaibei.workFlow.common.flow.model.FlowTaskComment;
+import com.ankaibei.workFlow.common.flow.model.FlowWorkOrder;
+import com.ankaibei.workFlow.common.flow.online.controller.SubmitUserTaskVo;
+import com.ankaibei.workFlow.common.flow.online.service.FlowOnlineOperationService;
+import com.ankaibei.workFlow.common.flow.online.service.impl.FlowOnlineOperationServiceImpl;
+import com.ankaibei.workFlow.common.flow.service.FlowApiService;
+import com.ankaibei.workFlow.common.flow.service.FlowWorkOrderService;
+import com.ankaibei.workFlow.common.flow.util.FlowOperationHelper;
+import com.ankaibei.workFlow.common.flow.vo.TaskInfoVo;
+import com.ankaibei.workFlow.common.log.annotation.OperationLog;
+import com.ankaibei.workFlow.common.log.model.constant.SysOperationLogType;
+import com.ankaibei.workFlow.common.online.model.OnlineDatasource;
+import com.ankaibei.workFlow.common.online.model.OnlineDatasourceRelation;
+import com.ankaibei.workFlow.common.online.model.OnlineTable;
+import com.ankaibei.workFlow.common.online.object.ColumnData;
+import com.ankaibei.workFlow.common.online.service.OnlineOperationService;
+import com.ankaibei.workFlow.common.online.util.OnlineOperationHelper;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CostEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.CommunicationMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.CostInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.ManHourMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.ProjectInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.PurchaseInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.RepastExpenseMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.RestInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.TaskInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.TrafficExpenseMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.TravelExpenseMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.FlowTaskStart;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/submitUserTask")
+public class SubmitUserTaskController {
+
+    @Autowired
+    private FlowTaskStart flowTaskStart;
+    @Autowired
+    private CostInfoMapper costInfoMapper;
+    @Autowired
+    private FlowApiService flowApiService;
+    @Autowired
+    private FlowOperationHelper flowOperationHelper;
+    @Autowired
+    private FlowWorkOrderService flowWorkOrderService;
+    @Autowired
+    private OnlineOperationHelper onlineOperationHelper;
+    @Autowired
+    private OnlineOperationService onlineOperationService;
+    @Autowired
+    private FlowOnlineOperationService flowOnlineOperationService;
+    @Autowired
+    private FlowOnlineOperationServiceImpl flowOnlineOperationServiceImpl;
+    @Resource
+    private ManHourMapper manHourMapper;
+    @Resource
+    private RestInfoMapper restInfoMapper;
+    @Resource
+    private TaskInfoMapper taskInfoMapper;
+    @Resource
+    private ProjectInfoMapper projectInfoMapper;
+    @Resource
+    private PurchaseInfoMapper purchaseInfoMapper;
+    @Resource
+    private TravelExpenseMapper travelExpenseMapper;
+    @Resource
+    private CommunicationMapper communicationMapper;
+    @Resource
+    private RepastExpenseMapper repastExpenseMapper;
+    @Resource
+    private TrafficExpenseMapper trafficExpenseMapper;
+
+
+    /**
+     * 提交流程的用户任务。(项目管理后台调用)    (批量同意和拒绝)
+     * 该接口无需数据权限过滤,因此用DisableDataFilter注解标注。如果当前系统没有支持数据权限过滤,该注解不会有任何影响。
+     * <p>
+     * processInstanceId  流程实例Id。
+     * taskId             流程任务Id。
+     * flowTaskCommentDto 流程审批数据。
+     * taskVariableData   流程任务变量数据。
+     * masterData         流程审批相关的主表数据。
+     * slaveData          流程审批相关的多个从表数据。
+     * copyData           传阅数据,格式为type和id,type的值参考FlowConstant中的常量值。
+     *
+     * @return 应答结果对象。
+     */
+    @DisableDataFilter
+    @OperationLog(type = SysOperationLogType.SUBMIT_TASK)
+    @PostMapping("/submitUserTaskBatch")
+    public ResMsg submitUserTaskBatch(
+            @RequestBody List<SubmitUserTaskVo> subVoList) {
+        for (SubmitUserTaskVo taskVo : subVoList) {
+            submitUserTaskOfAKB(taskVo);
+        }
+        return ResMsg.newInstance(CodeEnum.OK);
+    }
+
+
+    /**
+     * 提交流程的用户任务。(项目管理后台调用)
+     * 该接口无需数据权限过滤,因此用DisableDataFilter注解标注。如果当前系统没有支持数据权限过滤,该注解不会有任何影响。
+     * <p>
+     * processInstanceId  流程实例Id。
+     * taskId             流程任务Id。
+     * flowTaskCommentDto 流程审批数据。
+     * taskVariableData   流程任务变量数据。
+     * masterData         流程审批相关的主表数据。
+     * slaveData          流程审批相关的多个从表数据。
+     * copyData           传阅数据,格式为type和id,type的值参考FlowConstant中的常量值。
+     *
+     * @return 应答结果对象。
+     */
+    @DisableDataFilter
+    @OperationLog(type = SysOperationLogType.SUBMIT_TASK)
+    @PostMapping("/submitUserTaskOfAKB")
+    public ResMsg submitUserTaskOfAKB(
+            @RequestBody SubmitUserTaskVo subVo) {
+        String errorMessage;
+        // 验证流程任务的合法性。
+        Task task = flowApiService.getProcessInstanceActiveTask(subVo.getProcessInstanceId(), subVo.getTaskId());
+        ResponseResult<TaskInfoVo> taskInfoResult = flowOperationHelper.verifyAndGetRuntimeTaskInfo(task);
+        if (!taskInfoResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, taskInfoResult);
+        }
+        TaskInfoVo taskInfo = taskInfoResult.getData();
+        // 验证在线表单及其关联数据源的合法性。
+        ResponseResult<OnlineDatasource> datasourceResult = flowTaskStart.verifyAndGetOnlineDatasource(taskInfo.getFormId());
+        if (!datasourceResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, datasourceResult);
+        }
+        CallResult assigneeVerifyResult = flowApiService.verifyAssigneeOrCandidateAndClaim(task);
+        if (!assigneeVerifyResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, assigneeVerifyResult);
+        }
+        OnlineDatasource datasource = datasourceResult.getData();
+        OnlineTable masterTable = datasource.getMasterTable();
+        Long datasourceId = datasource.getDatasourceId();
+        ProcessInstance instance = flowApiService.getProcessInstance(subVo.getProcessInstanceId());
+        String dataId = instance.getBusinessKey();
+        // 这里把传阅数据放到任务变量中,是为了避免给流程数据操作方法增加额外的方法调用参数。
+        if (MapUtil.isNotEmpty(subVo.getCopyDat())) {
+            //if (taskVariableData == null) {
+            //    taskVariableData = new JSONObject();
+            //}
+            subVo.getTaskVariableData().put(FlowConstant.COPY_DATA_KEY, subVo.getCopyDat());
+        }
+        FlowTaskComment flowTaskComment = BeanUtil.copyProperties(subVo.getFlowTaskCommentDto(), FlowTaskComment.class);
+        if (StrUtil.isBlank(dataId)) {
+            return this.submitNewTaskOther(subVo.getProcessInstanceId(), subVo.getTaskId(),
+                    flowTaskComment, subVo.getTaskVariableData(), masterTable, subVo.getMasterData(), subVo.getSlaveData(), datasourceId);
+        }
+        try {
+            if (StrUtil.equals(flowTaskComment.getApprovalType(), FlowApprovalType.TRANSFER)) {
+                if (StrUtil.isBlank(flowTaskComment.getDelegateAssignee())) {
+                    errorMessage = "数据验证失败,加签或转办任务指派人不能为空!!";
+                    return ResMsg.newInstance(CodeEnum.DATA_VALIDATED_FAILED, errorMessage);
+                }
+            }
+            updateAndTakeTask(
+                    subVo, task, flowTaskComment, masterTable, dataId, datasourceId);
+        } catch (FlowOperationException e) {
+            log.error("Failed to call [FlowOnlineOperationService.updateAndTakeTask]", e);
+            return ResMsg.newInstance(CodeEnum.DATA_VALIDATED_FAILED, e.getMessage());
+        }
+        return ResMsg.newInstance(CodeEnum.OK);
+    }
+
+    private ResMsg submitNewTaskOther(
+            String processInstanceId,
+            String taskId,
+            FlowTaskComment flowTaskComment,
+            JSONObject taskVariableData,
+            OnlineTable masterTable,
+            JSONObject masterData,
+            JSONObject slaveData,
+            Long datasourceId) {
+        ResponseResult<List<ColumnData>> columnDataListResult =
+                onlineOperationHelper.buildTableData(masterTable, masterData, false, null);
+        if (!columnDataListResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, columnDataListResult);
+        }
+        // 保存在线表单提交的数据,同时启动流程和自动完成第一个用户任务。
+        if (slaveData == null) {
+            flowOnlineOperationService.saveNewAndTakeTask(
+                    processInstanceId,
+                    taskId,
+                    flowTaskComment,
+                    taskVariableData,
+                    masterTable,
+                    columnDataListResult.getData());
+        } else {
+            // 如果本次请求中包含从表数据,则一同插入。
+            ResponseResult<Map<OnlineDatasourceRelation, List<List<ColumnData>>>> slaveDataListResult =
+                    onlineOperationHelper.buildSlaveDataList(datasourceId, slaveData);
+            if (!slaveDataListResult.isSuccess()) {
+                return ResMsg.newInstance(CodeEnum.FAIL, slaveDataListResult);
+            }
+            saveNewAndTakeTask(
+                    processInstanceId,
+                    taskId,
+                    flowTaskComment,
+                    taskVariableData,
+                    masterTable,
+                    columnDataListResult.getData(),
+                    slaveDataListResult.getData());
+        }
+        return ResMsg.newInstance(CodeEnum.OK);
+    }
+
+    public void saveNewAndTakeTask(
+            String processInstanceId,
+            String taskId,
+            FlowTaskComment flowTaskComment,
+            JSONObject taskVariableData,
+            OnlineTable masterTable,
+            List<ColumnData> masterColumnDataList,
+            Map<OnlineDatasourceRelation, List<List<ColumnData>>> slaveColumnDataListMap) {
+        Object dataId = onlineOperationService.saveNewAndSlaveRelation(
+                masterTable, masterColumnDataList, slaveColumnDataListMap);
+        Assert.notNull(dataId);
+        Task task = flowApiService.getProcessInstanceActiveTask(processInstanceId, taskId);
+        flowApiService.setBusinessKeyForProcessInstance(processInstanceId, dataId);
+        Map<String, Object> variables =
+                flowApiService.initAndGetProcessInstanceVariables(task.getProcessDefinitionId());
+        if (taskVariableData == null) {
+            taskVariableData = new JSONObject();
+        }
+        taskVariableData.putAll(variables);
+        flowApiService.completeTask(task, flowTaskComment, taskVariableData);
+        ProcessInstance instance = flowApiService.getProcessInstance(processInstanceId);
+        FlowWorkOrder flowWorkOrder =
+                flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(instance.getProcessInstanceId());
+        if (flowWorkOrder == null) {
+            flowWorkOrderService.saveNew(instance, dataId, masterTable.getTableId(), null);
+        } else {
+            flowWorkOrder.setBusinessKey(dataId.toString());
+            flowWorkOrder.setUpdateTime(new Date());
+            flowWorkOrder.setFlowStatus(FlowTaskStatus.SUBMITTED);
+            flowWorkOrderService.updateById(flowWorkOrder);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void updateAndTakeTask(
+            SubmitUserTaskVo subVo,
+            Task task,
+            FlowTaskComment flowTaskComment,
+            OnlineTable masterTable,
+            String masterDataId,
+            Long datasourceId) {
+        int flowStatus = FlowTaskStatus.APPROVING;
+        if (flowTaskComment.getApprovalType().equals(FlowApprovalType.REFUSE)) {
+            flowStatus = FlowTaskStatus.REFUSED;
+        } else if (flowTaskComment.getApprovalType().equals(FlowApprovalType.STOP)) {
+            flowStatus = FlowTaskStatus.FINISHED;
+        }
+        flowWorkOrderService.updateFlowStatusByProcessInstanceId(task.getProcessInstanceId(), flowStatus);
+        this.handleMasterTableData(masterTable, subVo.getMasterData(), masterDataId);
+        if (subVo.getSlaveData() != null) {
+            for (Map.Entry<String, Object> relationEntry : subVo.getSlaveData().entrySet()) {
+                Long relationId = Long.parseLong(relationEntry.getKey());
+                flowOnlineOperationServiceImpl.handleSlaveTableData(
+                        relationId, relationEntry.getValue(), datasourceId, masterTable, subVo.getMasterData(), masterDataId);
+            }
+        }
+        if (flowTaskComment.getApprovalType().equals(FlowApprovalType.STOP)) {
+            Integer s = MapUtil.getInt(subVo.getTaskVariableData(), FlowConstant.LATEST_APPROVAL_STATUS_KEY);
+            flowWorkOrderService.updateLatestApprovalStatusByProcessInstanceId(task.getProcessInstanceId(), s);
+            CallResult stopResult = flowApiService.stopProcessInstance(
+                    task.getProcessInstanceId(), flowTaskComment.getTaskComment(), flowStatus);
+            if (!stopResult.isSuccess()) {
+                throw new FlowOperationException(stopResult.getErrorMessage());
+            }
+        } else {
+            flowApiService.completeTask(task, flowTaskComment, subVo.getTaskVariableData());
+        }
+        int flowTaskStatus = flowWorkOrderService.getFlowWorkOrderByProcessInstanceId(subVo.getProcessInstanceId()).getFlowStatus();
+        switch (CostEnum.getEnumByCode(subVo.getCostType())) {
+
+            case PROJECTADD:
+                projectInfoMapper.updateProjectFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+            case MANHOUR:
+                manHourMapper.updateManHourFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+            case PROJECTTASKADD:
+                taskInfoMapper.updateTaskFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+            case COMMUNICATION:
+                communicationMapper.updateCommunicationFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+                costInfoMapper.updateCostInfoFlowStatus(flowTaskStatus + "", subVo.getApplyDataId(), "通讯费");
+            case PURCHASE:
+                purchaseInfoMapper.updatePurchaseInfoFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+                costInfoMapper.updateCostInfoFlowStatus(flowTaskStatus + "", subVo.getApplyDataId(), "采购费");
+            case REST:
+                restInfoMapper.updateRestsFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+                costInfoMapper.updateCostInfoFlowStatus(flowTaskStatus + "", subVo.getApplyDataId(), "其他费用");
+            case TRANSPORTATION:
+                trafficExpenseMapper.updateTrafficFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+                costInfoMapper.updateCostInfoFlowStatus(flowTaskStatus + "", subVo.getApplyDataId(), "交通费");
+            case REPAST:
+                repastExpenseMapper.updateRepastFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+                costInfoMapper.updateCostInfoFlowStatus(flowTaskStatus + "", subVo.getApplyDataId(), "餐饮费");
+            case TRAVEL:
+                travelExpenseMapper.updateTravelFlowStatus(flowTaskStatus + "", subVo.getApplyDataId());
+                costInfoMapper.updateCostInfoFlowStatus(flowTaskStatus + "", subVo.getApplyDataId(), "差旅费");
+            default:
+        }
+    }
+
+    private void handleMasterTableData(OnlineTable masterTable, JSONObject masterData, String dataId) {
+        // 如果存在主表数据,就执行主表数据的更新。
+        if (masterData != null) {
+            Map<String, Object> originalMasterData =
+                    onlineOperationService.getMasterData(masterTable, null, null, dataId);
+            for (Map.Entry<String, Object> entry : originalMasterData.entrySet()) {
+                masterData.putIfAbsent(entry.getKey(), entry.getValue());
+            }
+            ResponseResult<List<ColumnData>> columnDataListResult =
+                    onlineOperationHelper.buildTableData(masterTable, masterData, true, null);
+            if (!columnDataListResult.isSuccess()) {
+                throw new FlowOperationException(columnDataListResult.getErrorMessage());
+            }
+            if (!onlineOperationService.update(masterTable, columnDataListResult.getData())) {
+                throw new FlowOperationException("主表数据不存在!");
+            }
+        }
+    }
+}

+ 92 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/controller/TaskInfoController.java

@@ -0,0 +1,92 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.controller;
+
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.webadmin.ankaibei.api.TaskInfoApi;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.JwtUtil;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.TaskInfoVo;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description: 任务列表
+ * @date 2022/9/14 17:14
+ */
+@RestController
+@RequestMapping("/task")
+public class TaskInfoController {
+
+    @Resource
+    private TaskInfoApi taskInfoApi;
+
+    /**
+     * 查询任务
+     *
+     * @param taskInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/findTaskInfo")
+    public ResMsg findTaskInfo(@RequestBody TaskInfoVo taskInfoVo) {
+
+        return taskInfoApi.findTaskInfo(taskInfoVo);
+    }
+
+    /**
+     * 查询任务详情
+     *
+     * @param taskInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/findTaskById")
+    public ResMsg findTaskById(@RequestBody TaskInfoVo taskInfoVo) {
+
+        return taskInfoApi.findTaskById(taskInfoVo);
+    }
+
+    /**
+     * 完成任务
+     *
+     * @param taskInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/performTask")
+    public ResMsg performTask(@RequestBody TaskInfoVo taskInfoVo) {
+
+        return taskInfoApi.performTask(taskInfoVo);
+    }
+
+    /**
+     * 新增任务
+     *
+     * @param taskInfoVo
+     * @return ResMsg
+     */
+    @RequestMapping("/addTaskInfo")
+    public ResMsg addTaskInfo(@RequestBody TaskInfoVo taskInfoVo) {
+        Long userId = TokenData.takeFromRequest().getUserId();
+        taskInfoVo.setTaskCreator(String.valueOf(userId));
+        return taskInfoApi.addTaskInfo(taskInfoVo);
+    }
+
+    /**
+     * 删除任务
+     *
+     * @param taskInfoVos
+     * @return ResMsg
+     */
+    @RequestMapping("/deleteTask")
+    public ResMsg deleteTask(@RequestBody List<TaskInfoVo> taskInfoVos) {
+        return taskInfoApi.deleteTask(taskInfoVos);
+    }
+
+
+}

+ 106 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/AccesoryInfoEntity.java

@@ -0,0 +1,106 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.util.Objects;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/10/13 16:13
+ */
+@Entity
+@Table(name = "accesory_info", schema = "ankaibei", catalog = "")
+public class AccesoryInfoEntity {
+    private Integer accesoryId;
+    private String contract;
+    private String scheme;
+    private String plan;
+    private String submitMaterial;
+    private String acceptance;
+    private String projectId;
+
+    @Id
+    @Column(name = "accesory_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getAccesoryId() {
+        return accesoryId;
+    }
+
+    public void setAccesoryId(int accesoryId) {
+        this.accesoryId = accesoryId;
+    }
+
+    @Basic
+    @Column(name = "contract")
+    public String getContract() {
+        return contract;
+    }
+
+    public void setContract(String contract) {
+        this.contract = contract;
+    }
+
+    @Basic
+    @Column(name = "scheme")
+    public String getScheme() {
+        return scheme;
+    }
+
+    public void setScheme(String scheme) {
+        this.scheme = scheme;
+    }
+
+    @Basic
+    @Column(name = "plan")
+    public String getPlan() {
+        return plan;
+    }
+
+    public void setPlan(String plan) {
+        this.plan = plan;
+    }
+
+    @Basic
+    @Column(name = "submit_material")
+    public String getSubmitMaterial() {
+        return submitMaterial;
+    }
+
+    public void setSubmitMaterial(String submitMaterial) {
+        this.submitMaterial = submitMaterial;
+    }
+
+    @Basic
+    @Column(name = "acceptance")
+    public String getAcceptance() {
+        return acceptance;
+    }
+
+    public void setAcceptance(String acceptance) {
+        this.acceptance = acceptance;
+    }
+
+    @Basic
+    @Column(name = "project_id")
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        AccesoryInfoEntity that = (AccesoryInfoEntity) o;
+        return accesoryId == that.accesoryId && Objects.equals(contract, that.contract) && Objects.equals(scheme, that.scheme) && Objects.equals(plan, that.plan) && Objects.equals(submitMaterial, that.submitMaterial) && Objects.equals(acceptance, that.acceptance) && Objects.equals(projectId, that.projectId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(accesoryId, contract, scheme, plan, submitMaterial, acceptance, projectId);
+    }
+}

+ 185 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/CommunicationInfoEntity.java

@@ -0,0 +1,185 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author
+ * @version 1.0
+ * @description: 通讯费表
+ * @date 2022/9/21 14:26
+ */
+@Entity
+@Table(name = "communication_info", schema = "ankaibei", catalog = "")
+public class CommunicationInfoEntity {
+    private Integer communicationId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 申请费用
+     */
+    private BigDecimal applicationFee;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建用户
+     */
+    private String createUser;
+    /**
+     * 开始时间
+     */
+    private Date createDate;
+    /**
+     * 结束时间
+     */
+    private Date endDate;
+    /**
+     * 发票
+     */
+    private String invoice;
+
+    /**
+     * 工作流任务处理类型
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 记录的创建时间
+     */
+    private Date createTime;
+
+
+    @Basic
+    @Column(name = "create_time")
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "flow_task_status")
+    public Integer getFlowTaskStatus() {
+        return flowTaskStatus;
+    }
+
+    public void setFlowTaskStatus(Integer flowTaskStatus) {
+        this.flowTaskStatus = flowTaskStatus;
+    }
+
+    @Id
+    @Column(name = "communication_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getCommunicationId() {
+        return communicationId;
+    }
+
+    public void setCommunicationId(Integer communicationId) {
+        this.communicationId = communicationId;
+    }
+
+    @Basic
+    @Column(name = "project_name")
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Basic
+    @Column(name = "application_fee")
+    public BigDecimal getApplicationFee() {
+        return applicationFee;
+    }
+
+    public void setApplicationFee(BigDecimal applicationFee) {
+        this.applicationFee = applicationFee;
+    }
+
+    @Basic
+    @Column(name = "remark")
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Basic
+    @Column(name = "create_user")
+    public String getCreateUser() {
+        return createUser;
+    }
+
+    public void setCreateUser(String createUser) {
+        this.createUser = createUser;
+    }
+
+    @Basic
+    @Column(name = "create_date")
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    @Basic
+    @Column(name = "invoice")
+    public String getInvoice() {
+        return invoice;
+    }
+
+    public void setInvoice(String invoice) {
+        this.invoice = invoice;
+    }
+
+    @Basic
+    @Column(name = "end_date")
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        CommunicationInfoEntity that = (CommunicationInfoEntity) o;
+        return communicationId == that.communicationId && Objects.equals(projectName, that.projectName) && Objects.equals(applicationFee, that.applicationFee) && Objects.equals(remark, that.remark) && Objects.equals(createUser, that.createUser) && Objects.equals(createDate, that.createDate);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(communicationId, projectName, applicationFee, remark, createUser, createDate);
+    }
+
+    @Override
+    public String toString() {
+        return "CommunicationInfoEntity{" +
+                "communicationId=" + communicationId +
+                ", projectName='" + projectName + '\'' +
+                ", applicationFee=" + applicationFee +
+                ", remark='" + remark + '\'' +
+                ", createUser='" + createUser + '\'' +
+                ", createDate=" + createDate +
+                ", endDate=" + endDate +
+                ", invoice='" + invoice + '\'' +
+                '}';
+    }
+}

+ 198 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/CostInfoEntity.java

@@ -0,0 +1,198 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/10/12 9:25
+ */
+@Entity
+@Table(name = "cost_info", schema = "ankaibei", catalog = "")
+public class CostInfoEntity {
+    private Integer costId;
+    private String costType;
+    private String costStatus;
+    private String relevanceUser;
+    private BigDecimal performAmount;
+    private Date happenDate;
+    private String projectName;
+    private Long proposer;
+    private Date paymentDate;
+    private Integer applyCostId;
+    private Date createDate;
+
+    /**
+     * 进入流程后获取到的流程实例的id
+     */
+    private String processInstanceId;
+
+    /**
+     * 工作流任务处理状态
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 流程定义Id
+     */
+    private String processDefinitionId;
+
+    @Basic
+    @Column(name = "process_definition_id")
+    public String getProcessDefinitionId() {
+        return processDefinitionId;
+    }
+
+    public void setProcessDefinitionId(String processDefinitionId) {
+        this.processDefinitionId = processDefinitionId;
+    }
+
+    @Basic
+    @Column(name = "process_instance_id")
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    @Basic
+    @Column(name = "flow_task_status")
+    public Integer getFlowTaskStatus() {
+        return flowTaskStatus;
+    }
+
+    public void setFlowTaskStatus(Integer flowTaskStatus) {
+        this.flowTaskStatus = flowTaskStatus;
+    }
+
+    @Id
+    @Column(name = "cost_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getCostId() {
+        return costId;
+    }
+
+    public void setCostId(Integer costId) {
+        this.costId = costId;
+    }
+
+    @Basic
+    @Column(name = "cost_type")
+    public String getCostType() {
+        return costType;
+    }
+
+    public void setCostType(String costType) {
+        this.costType = costType;
+    }
+
+    @Basic
+    @Column(name = "create_date")
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+
+    @Basic
+    @Column(name = "cost_status")
+    public String getCostStatus() {
+        return costStatus;
+    }
+
+    public void setCostStatus(String costStatus) {
+        this.costStatus = costStatus;
+    }
+
+    @Basic
+    @Column(name = "relevance_user")
+    public String getRelevanceUser() {
+        return relevanceUser;
+    }
+
+    public void setRelevanceUser(String relevanceUser) {
+        this.relevanceUser = relevanceUser;
+    }
+
+    @Basic
+    @Column(name = "perform_amount")
+    public BigDecimal getPerformAmount() {
+        return performAmount;
+    }
+
+    public void setPerformAmount(BigDecimal performAmount) {
+        this.performAmount = performAmount;
+    }
+
+    @Basic
+    @Column(name = "happen_date")
+    public Date getHappenDate() {
+        return happenDate;
+    }
+
+    public void setHappenDate(Date happenDate) {
+        this.happenDate = happenDate;
+    }
+
+    @Basic
+    @Column(name = "project_name")
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Basic
+    @Column(name = "proposer")
+    public Long getProposer() {
+        return proposer;
+    }
+
+    public void setProposer(Long proposer) {
+        this.proposer = proposer;
+    }
+
+    @Basic
+    @Column(name = "payment_date")
+    public Date getPaymentDate() {
+        return paymentDate;
+    }
+
+    public void setPaymentDate(Date paymentDate) {
+        this.paymentDate = paymentDate;
+    }
+
+    @Basic
+    @Column(name = "apply_cost_id")
+    public Integer getApplyCostId() {
+        return applyCostId;
+    }
+
+    public void setApplyCostId(Integer applyCostId) {
+        this.applyCostId = applyCostId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        CostInfoEntity that = (CostInfoEntity) o;
+        return costId == that.costId && Objects.equals(costType, that.costType) && Objects.equals(costStatus, that.costStatus) && Objects.equals(relevanceUser, that.relevanceUser) && Objects.equals(performAmount, that.performAmount) && Objects.equals(happenDate, that.happenDate) && Objects.equals(projectName, that.projectName) && Objects.equals(proposer, that.proposer) && Objects.equals(paymentDate, that.paymentDate) && Objects.equals(applyCostId, that.applyCostId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(costId, costType, costStatus, relevanceUser, performAmount, happenDate, projectName, proposer, paymentDate, applyCostId);
+    }
+}

+ 56 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/LoginTokenEntity.java

@@ -0,0 +1,56 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 10:50
+ */
+@Builder(toBuilder = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@Table(name = "login_token", schema = "ankaibei")
+public class LoginTokenEntity {
+    /**
+     * 用户id
+     */
+    @Id
+    @Column(name = "user_id")
+    private Integer userId;
+    /**
+     * 用户token
+     */
+    @Column(name = "user_token")
+    private String userToken;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUserToken() {
+        return userToken;
+    }
+
+    public void setUserToken(String userToken) {
+        this.userToken = userToken;
+    }
+
+    @Override
+    public String toString() {
+        return "LoginTokenEntity{" +
+                "userId=" + userId +
+                ", userToken='" + userToken + '\'' +
+                '}';
+    }
+}

File diff suppressed because it is too large
+ 204 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ManHourInfoEntity.java


+ 116 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ManHourJobInfo.java

@@ -0,0 +1,116 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:工时详细记录表
+ * @date 2022/9/21 14:28
+ */
+@Entity
+@Table(name = "man_hour_job_info", schema = "ankaibei", catalog = "")
+public class ManHourJobInfo {
+
+    /**
+     * 工时记录主键
+     */
+
+    @Id
+    @Column(name = "hour_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer hourId;
+    /**
+     * 主表主键
+     */
+    @Column(name = "man_id")
+    private Integer manId;
+    /**
+     * 工作日期
+     */
+    @Column(name = "manufacture_date")
+    private Date manufactureDate;
+
+    /**
+     * 工作时长(默认一天,小数点后只留1位)
+     */
+    @Column(name = "day")
+    private BigDecimal day;
+    /**
+     * 工作内容
+     */
+    @Column(name = "job_content")
+    private String jobContent;
+
+    public ManHourJobInfo() {
+    }
+
+
+    public Integer getHourId() {
+        return hourId;
+    }
+
+    public void setHourId(Integer hourId) {
+        this.hourId = hourId;
+    }
+
+
+    public Integer getManId() {
+        return manId;
+    }
+
+    public void setManId(Integer manId) {
+        this.manId = manId;
+    }
+
+
+    public Date getManufactureDate() {
+        return manufactureDate;
+    }
+
+    public void setManufactureDate(Date manufactureDate) {
+        this.manufactureDate = manufactureDate;
+    }
+
+    public BigDecimal getDay() {
+        return day;
+    }
+
+    public void setDay(BigDecimal day) {
+        this.day = day;
+    }
+
+    public String getJobContent() {
+        return jobContent;
+    }
+
+    public void setJobContent(String jobContent) {
+        this.jobContent = jobContent;
+    }
+
+    @Override
+    public String toString() {
+        return "ManHourJobInfo{" +
+                "hourId=" + hourId +
+                ", manId=" + manId +
+                ", manufactureDate=" + manufactureDate +
+                ", day=" + day +
+                ", jobContent='" + jobContent + '\'' +
+                '}';
+    }
+
+    public ManHourJobInfo(Integer hourId, Integer manId, Date manufactureDate, BigDecimal day, String jobContent) {
+        this.hourId = hourId;
+        this.manId = manId;
+        this.manufactureDate = manufactureDate;
+        this.day = day;
+        this.jobContent = jobContent;
+    }
+}

+ 124 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ProjectAuditInfoEntity.java

@@ -0,0 +1,124 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author
+ * @version 1.0
+ * @description: 项目审核表
+ * @date 2022/10/8 17:42
+ */
+@Entity
+@Table(name = "project_audit_info", schema = "ankaibei", catalog = "")
+public class ProjectAuditInfoEntity {
+    private Integer projectAuditId;
+    private String projectName;
+    private String printcipal;
+    private Date createDate;
+    private String auditStatus;
+    private Integer projectId;
+    /**
+     * 审批类型
+     */
+    private String approveType;
+    /**
+     * 当前事项
+     */
+    private String matter;
+
+    @Id
+    @Column(name = "project_audit_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getProjectAuditId() {
+        return projectAuditId;
+    }
+
+    public void setProjectAuditId(Integer projectAuditId) {
+        this.projectAuditId = projectAuditId;
+    }
+
+    @Basic
+    @Column(name = "approve_type")
+    public String getApproveType() {
+        return approveType;
+    }
+
+    public void setApproveType(String approveType) {
+        this.approveType = approveType;
+    }
+
+    @Basic
+    @Column(name = "matter")
+    public String getMatter() {
+        return matter;
+    }
+
+    public void setMatter(String matter) {
+        this.matter = matter;
+    }
+
+    @Basic
+    @Column(name = "project_name")
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Basic
+    @Column(name = "printcipal")
+    public String getPrintcipal() {
+        return printcipal;
+    }
+
+    public void setPrintcipal(String printcipal) {
+        this.printcipal = printcipal;
+    }
+
+    @Basic
+    @Column(name = "create_date")
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    @Basic
+    @Column(name = "audit_status")
+    public String getAuditStatus() {
+        return auditStatus;
+    }
+
+    public void setAuditStatus(String auditStatus) {
+        this.auditStatus = auditStatus;
+    }
+
+    @Basic
+    @Column(name = "project_id")
+    public Integer getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(Integer projectId) {
+        this.projectId = projectId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ProjectAuditInfoEntity that = (ProjectAuditInfoEntity) o;
+        return projectAuditId == that.projectAuditId && Objects.equals(projectName, that.projectName) && Objects.equals(printcipal, that.printcipal) && Objects.equals(createDate, that.createDate) && Objects.equals(auditStatus, that.auditStatus) && Objects.equals(projectId, that.projectId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(projectAuditId, projectName, printcipal, createDate, auditStatus, projectId);
+    }
+}

+ 298 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ProjectInfoEntity.java

@@ -0,0 +1,298 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:项目表
+ * @date 2022/9/14 11:01
+ */
+@Entity
+@Table(name = "project_info", schema = "ankaibei")
+public class ProjectInfoEntity {
+    private Integer projectId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 项目编码
+     */
+    private String projectCode;
+    /**
+     * 项目阶段
+     */
+    private String projectStage;
+    /**
+     * 项目状态
+     */
+    private String projectStatus;
+    /**
+     * 项目类型
+     */
+    private String projectType;
+    /**
+     * 关联客户
+     */
+    private String relevanceClient;
+    /**
+     * 项目金额
+     */
+    private String peojectMoney;
+    /**
+     * 人员成本
+     */
+    private BigDecimal staffCost;
+    /**
+     * 项目费用
+     */
+    private BigDecimal projectCost;
+    /**
+     * 总成本
+     */
+    private BigDecimal totalCost;
+    /**
+     * 客户联系人信息
+     */
+    private String linkmanPhone;
+    /**
+     * 项目负责人
+     */
+    private String projectPrincipal;
+    /**
+     * 项目节点
+     */
+    private String projectNode;
+    /**
+     * 描述
+     */
+    private String projectDescribe;
+    /**
+     * 立项时间
+     */
+    private Date createDate;
+    /**
+     * 进入流程后获取到的流程实例的id
+     */
+    private String processInstanceId;
+    /**
+     * 工作流任务处理状态
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 流程定义Id
+     */
+    private String processDefinitionId;
+
+    /**
+     * 是否已删除: 1=正常,-1=已删除
+     */
+    private String isDelete;
+
+    @Basic
+    @Column(name = "is_delete")
+    public String getIsDelete() {
+        return isDelete;
+    }
+
+    public void setIsDelete(String isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    @Basic
+    @Column(name = "process_definition_id")
+    public String getProcessDefinitionId() {
+        return processDefinitionId;
+    }
+
+    public void setProcessDefinitionId(String processDefinitionId) {
+        this.processDefinitionId = processDefinitionId;
+    }
+
+    @Basic
+    @Column(name = "process_instance_id")
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    @Basic
+    @Column(name = "flow_task_status")
+    public Integer getFlowTaskStatus() {
+        return flowTaskStatus;
+    }
+
+    public void setFlowTaskStatus(Integer flowTaskStatus) {
+        this.flowTaskStatus = flowTaskStatus;
+    }
+
+    @Id
+    @Column(name = "project_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(Integer projectId) {
+        this.projectId = projectId;
+    }
+
+    @Basic
+    @Column(name = "project_name")
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Basic
+    @Column(name = "project_code")
+    public String getProjectCode() {
+        return projectCode;
+    }
+
+    public void setProjectCode(String projectCode) {
+        this.projectCode = projectCode;
+    }
+
+    @Basic
+    @Column(name = "project_stage")
+    public String getProjectStage() {
+        return projectStage;
+    }
+
+    public void setProjectStage(String projectStage) {
+        this.projectStage = projectStage;
+    }
+
+    @Basic
+    @Column(name = "project_status")
+    public String getProjectStatus() {
+        return projectStatus;
+    }
+
+    public void setProjectStatus(String projectStatus) {
+        this.projectStatus = projectStatus;
+    }
+
+    @Basic
+    @Column(name = "project_type")
+    public String getProjectType() {
+        return projectType;
+    }
+
+    public void setProjectType(String projectType) {
+        this.projectType = projectType;
+    }
+
+    @Basic
+    @Column(name = "relevance_client")
+    public String getRelevanceClient() {
+        return relevanceClient;
+    }
+
+    public void setRelevanceClient(String relevanceClient) {
+        this.relevanceClient = relevanceClient;
+    }
+
+    @Basic
+    @Column(name = "peoject_money")
+    public String getPeojectMoney() {
+        return peojectMoney;
+    }
+
+    public void setPeojectMoney(String peojectMoney) {
+        this.peojectMoney = peojectMoney;
+    }
+
+    @Basic
+    @Column(name = "staff_cost")
+    public BigDecimal getStaffCost() {
+        return staffCost;
+    }
+
+    public void setStaffCost(BigDecimal staffCost) {
+        this.staffCost = staffCost;
+    }
+
+    @Basic
+    @Column(name = "project_cost")
+    public BigDecimal getProjectCost() {
+        return projectCost;
+    }
+
+    public void setProjectCost(BigDecimal projectCost) {
+        this.projectCost = projectCost;
+    }
+
+    @Basic
+    @Column(name = "total_cost")
+    public BigDecimal getTotalCost() {
+        return totalCost;
+    }
+
+    public void setTotalCost(BigDecimal totalCost) {
+        this.totalCost = totalCost;
+    }
+
+    @Basic
+    @Column(name = "linkman_phone")
+    public String getLinkmanPhone() {
+        return linkmanPhone;
+    }
+
+    public void setLinkmanPhone(String linkmanPhone) {
+        this.linkmanPhone = linkmanPhone;
+    }
+
+    @Basic
+    @Column(name = "project_principal")
+    public String getProjectPrincipal() {
+        return projectPrincipal;
+    }
+
+    public void setProjectPrincipal(String projectPrincipal) {
+        this.projectPrincipal = projectPrincipal;
+    }
+
+    @Basic
+    @Column(name = "project_node")
+    public String getProjectNode() {
+        return projectNode;
+    }
+
+    public void setProjectNode(String projectNode) {
+        this.projectNode = projectNode;
+    }
+
+    @Basic
+    @Column(name = "project_describe")
+    public String getProjectDescribe() {
+        return projectDescribe;
+    }
+
+    public void setProjectDescribe(String projectDescribe) {
+        this.projectDescribe = projectDescribe;
+    }
+
+    @Basic
+    @Column(name = "create_date")
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+}

+ 103 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/ProjectTeamInfoEntity.java

@@ -0,0 +1,103 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:项目组表
+ * @date 2022/9/5 14:37
+ */
+@Builder(toBuilder = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@Table(name = "project_team_info")
+public class ProjectTeamInfoEntity {
+
+    /**
+     * 项目组id
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "project_team_id")
+    private Integer projectTeamId;
+    /**
+     * 项目id
+     */
+    @Column(name = "project_id")
+    private String projectId;
+
+    /**
+     * 项目名称
+     */
+    @Transient
+    @TableField(exist = false)
+    private String projectName;
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_date")
+    private Date createDate;
+    /**
+     * 项目组名称
+     */
+    @Column(name = "project_team_name")
+    private String projectTeamName;
+
+    public Integer getProjectTeamId() {
+        return projectTeamId;
+    }
+
+    public void setProjectTeamId(Integer projectTeamId) {
+        this.projectTeamId = projectTeamId;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    public String getProjectTeamName() {
+        return projectTeamName;
+    }
+
+    public void setProjectTeamName(String projectTeamName) {
+        this.projectTeamName = projectTeamName;
+    }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Override
+    public String toString() {
+        return "ProjectTeamInfoEntity{" +
+                "projectTeamId=" + projectTeamId +
+                ", projectId='" + projectId + '\'' +
+                ", createDate='" + createDate + '\'' +
+                ", projectTeamName='" + projectTeamName + '\'' +
+                '}';
+    }
+}

+ 139 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/PurchaseInfoEntity.java

@@ -0,0 +1,139 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:采购费表
+ * @date 2022/9/21 14:28
+ */
+@Entity
+@Table(name = "purchase_info", schema = "ankaibei", catalog = "")
+public class PurchaseInfoEntity {
+    private Integer purchaseId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 采购日期
+     */
+    private Date purchaseDate;
+    /**
+     * 采购信息
+     */
+    private String purchaseMessage;
+    /**
+     * 创建用户
+     */
+    private String createUser;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalMoney;
+    /**
+     * 工作流任务处理类型
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 记录的创建时间
+     */
+    private Date createTime;
+
+
+    @Basic
+    @Column(name = "create_time")
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "flow_task_status")
+    public Integer getFlowTaskStatus() {
+        return flowTaskStatus;
+    }
+
+    public void setFlowTaskStatus(Integer flowTaskStatus) {
+        this.flowTaskStatus = flowTaskStatus;
+    }
+
+    @Id
+    @Column(name = "purchase_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getPurchaseId() {
+        return purchaseId;
+    }
+
+    public void setPurchaseId(Integer purchaseId) {
+        this.purchaseId = purchaseId;
+    }
+
+    @Basic
+    @Column(name = "project_name")
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Basic
+    @Column(name = "purchase_date")
+    public Date getPurchaseDate() {
+        return purchaseDate;
+    }
+
+    public void setPurchaseDate(Date purchaseDate) {
+        this.purchaseDate = purchaseDate;
+    }
+
+    @Basic
+    @Column(name = "purchase_message")
+    public String getPurchaseMessage() {
+        return purchaseMessage;
+    }
+
+    public void setPurchaseMessage(String purchaseMessage) {
+        this.purchaseMessage = purchaseMessage;
+    }
+
+    @Basic
+    @Column(name = "create_user")
+    public String getCreateUser() {
+        return createUser;
+    }
+
+    public void setCreateUser(String createUser) {
+        this.createUser = createUser;
+    }
+
+    @Basic
+    @Column(name = "total_money")
+    public BigDecimal getTotalMoney() {
+        return totalMoney;
+    }
+
+    public void setTotalMoney(BigDecimal createUser) {
+        this.totalMoney = createUser;
+    }
+
+    @Override
+    public String toString() {
+        return "PurchaseInfoEntity{" +
+                "purchaseId=" + purchaseId +
+                ", projectName='" + projectName + '\'' +
+                ", purchaseDate=" + purchaseDate +
+                ", purchaseMessage='" + purchaseMessage + '\'' +
+                ", createUser='" + createUser + '\'' +
+                '}';
+    }
+}

+ 56 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/RelevanceProjectInfoEntity.java

@@ -0,0 +1,56 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.math.BigInteger;
+
+/**
+ * @author
+ * @version 1.0
+ * @description: 项目组关联人员表
+ * @date 2022/10/8 17:42
+ */
+@Entity
+@Table(name = "relevance_project_info", schema = "ankaibei", catalog = "")
+public class RelevanceProjectInfoEntity {
+    private Integer relevanceId;
+    /**
+     * 项目组id
+     */
+    private Integer projectTeamId;
+    /**
+     * 用户id
+     */
+    private String userId;
+
+    @Id
+    @Column(name = "relevance_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getRelevanceId() {
+        return relevanceId;
+    }
+
+    public void setRelevanceId(Integer relevanceId) {
+        this.relevanceId = relevanceId;
+    }
+
+    @Basic
+    @Column(name = "project_team_id")
+    public Integer getProjectTeamId() {
+        return projectTeamId;
+    }
+
+    public void setProjectTeamId(Integer projectTeamId) {
+        this.projectTeamId = projectTeamId;
+    }
+
+    @Basic
+    @Column(name = "user_id")
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+}

+ 116 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/RepastExpenseEntity.java

@@ -0,0 +1,116 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:餐饮费用记录
+ * @date 2022/9/26 16:05
+ */
+@Entity
+@Table(name = "repast_expense", schema = "ankaibei", catalog = "")
+public class RepastExpenseEntity {
+    private Integer id;
+    private String projectName;
+    private String applicant;
+    private String subject;
+    private BigDecimal totalMoney;
+    /**
+     * 工作流任务处理类型
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 记录的创建时间
+     */
+    private Date createTime;
+
+
+    @Basic
+    @Column(name = "create_time")
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "flow_task_status")
+    public Integer getFlowTaskStatus() {
+        return flowTaskStatus;
+    }
+
+    public void setFlowTaskStatus(Integer flowTaskStatus) {
+        this.flowTaskStatus = flowTaskStatus;
+    }
+
+    @Id
+    @Column(name = "id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "project_name")
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Basic
+    @Column(name = "applicant")
+    public String getApplicant() {
+        return applicant;
+    }
+
+    public void setApplicant(String applicant) {
+        this.applicant = applicant;
+    }
+
+    @Basic
+    @Column(name = "subject")
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    @Basic
+    @Column(name = "total_money")
+    public BigDecimal getTotalMoney() {
+        return totalMoney;
+    }
+
+    public void setTotalMoney(BigDecimal totalMoney) {
+        this.totalMoney = totalMoney;
+    }
+
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        RepastExpenseEntity that = (RepastExpenseEntity) o;
+        return id == that.id && Objects.equals(projectName, that.projectName) && Objects.equals(applicant, that.applicant) && Objects.equals(subject, that.subject) && Objects.equals(totalMoney, that.totalMoney);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, projectName, applicant, subject, totalMoney);
+    }
+}

+ 124 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/RestsInfoEntity.java

@@ -0,0 +1,124 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.util.Date;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:其他费用申请表
+ * @date 2022/9/21 14:28
+ */
+@Entity
+@Table(name = "rests_info", schema = "ankaibei", catalog = "")
+public class RestsInfoEntity {
+    private Integer restsId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 时间
+     */
+    private Date createDate;
+    /**
+     * 其他信息
+     */
+    private String restsMessage;
+    /**
+     * 创建用户
+     */
+    private String createUser;
+    /**
+     * 工作流任务处理类型
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 记录的创建时间
+     */
+    private Date createTime;
+
+
+    @Basic
+    @Column(name = "create_time")
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "flow_task_status")
+    public Integer getFlowTaskStatus() {
+        return flowTaskStatus;
+    }
+
+    public void setFlowTaskStatus(Integer flowTaskStatus) {
+        this.flowTaskStatus = flowTaskStatus;
+    }
+
+    @Id
+    @Column(name = "rests_id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getRestsId() {
+        return restsId;
+    }
+
+    public void setRestsId(Integer restsId) {
+        this.restsId = restsId;
+    }
+
+    @Basic
+    @Column(name = "project_name")
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Basic
+    @Column(name = "create_date")
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    @Basic
+    @Column(name = "rests_message")
+    public String getRestsMessage() {
+        return restsMessage;
+    }
+
+    public void setRestsMessage(String restsMessage) {
+        this.restsMessage = restsMessage;
+    }
+
+
+    @Basic
+    @Column(name = "create_user")
+    public String getCreateUser() {
+        return createUser;
+    }
+
+    public void setCreateUser(String createUser) {
+        this.createUser = createUser;
+    }
+
+    @Override
+    public String toString() {
+        return "RestsInfoEntity{" +
+                "restsId=" + restsId +
+                ", projectName='" + projectName + '\'' +
+                ", createDate=" + createDate +
+                ", restsMessage='" + restsMessage + '\'' +
+                ", createUser='" + createUser + '\'' +
+                '}';
+    }
+}

File diff suppressed because it is too large
+ 266 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/TaskInfoEntity.java


+ 115 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/TrafficExpenseEntity.java

@@ -0,0 +1,115 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.entity;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:交通费用记录
+ * @date 2022/9/26 16:05
+ */
+@Entity
+@Table(name = "traffic_expense", schema = "ankaibei", catalog = "")
+public class TrafficExpenseEntity {
+    private Integer id;
+    private String projectName;
+    private String applicant;
+    private String subject;
+    private BigDecimal totalMoney;
+    /**
+     * 工作流任务处理类型
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 记录的创建时间
+     */
+    private Date createTime;
+
+
+    @Basic
+    @Column(name = "create_time")
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "flow_task_status")
+    public Integer getFlowTaskStatus() {
+        return flowTaskStatus;
+    }
+
+    public void setFlowTaskStatus(Integer flowTaskStatus) {
+        this.flowTaskStatus = flowTaskStatus;
+    }
+
+    @Id
+    @Column(name = "id")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Basic
+    @Column(name = "project_name")
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    @Basic
+    @Column(name = "applicant")
+    public String getApplicant() {
+        return applicant;
+    }
+
+    public void setApplicant(String applicant) {
+        this.applicant = applicant;
+    }
+
+    @Basic
+    @Column(name = "subject")
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    @Basic
+    @Column(name = "total_money")
+    public BigDecimal getTotalMoney() {
+        return totalMoney;
+    }
+
+    public void setTotalMoney(BigDecimal totalMoney) {
+        this.totalMoney = totalMoney;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TrafficExpenseEntity that = (TrafficExpenseEntity) o;
+        return id == that.id && Objects.equals(projectName, that.projectName) && Objects.equals(applicant, that.applicant) && Objects.equals(subject, that.subject) && Objects.equals(totalMoney, that.totalMoney);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, projectName, applicant, subject, totalMoney);
+    }
+}

File diff suppressed because it is too large
+ 289 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/TravelExpenseEntity.java


File diff suppressed because it is too large
+ 222 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/entity/UserInfoEntity.java


+ 69 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/enums/CodeEnum.java

@@ -0,0 +1,69 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.enums;
+
+/**
+ * @ClassName: AgentCodeEnum
+ * @author:
+ * @date: 2019/10/01
+ * @Copyright: 2019
+ */
+public enum CodeEnum {
+    //根据业务逻辑往下排
+    OK("200", "请求成功"),
+    PARAM_IS_NULL("202", "参数为空"),
+    NO_DATA("203", "无数据"),
+    FAIL("204", "失败"),
+    ACCOUNT_NO_PASSWORD_ERROR("205", "用户名或密码错误"),
+    MULTIPLE_DUPLICATE_ACCOUNTS_ARE_FOUND("206", "查询到多个重复账号"),
+    TNE_PROJECT_TEAM_NAME_ALREADY_EXISTS("207", "项目组名称已存在"),
+    THE_JOB_ID_ALREADY_EXISTS("208", "工号已存在"),
+    PHONE_ALREADY_EXISTS("209", "手机号已存在"),
+    TNE_PROJECT_NAME_ALREADY_EXISTS("210", "项目名称已存在"),
+    PLEASE_LOG_IN_AGAIN("211", "请重新登陆"),
+    PROJECT_TEAM_HAS_BEEN_ESTABLISHED_FOR_THE_PROJECT("212", "该项目已成立项目组"),
+    TASK_ALREADY_EXISTS("213", "任务名称已存在"),
+    DATA_VALIDATED_FAILED("90052", "数据验证失败,请核对!"),
+    ;
+
+
+    private final String code;
+    private final String reason;
+
+    CodeEnum(final String statusCode, final String reasonPhrase) {
+        this.code = statusCode;
+        this.reason = reasonPhrase;
+    }
+
+    /**
+     * Convert a numerical status code into the corresponding Status
+     *
+     * @param statusCode the numerical status code
+     * @return the matching Status or null is no matching Status is defined
+     */
+    public static CodeEnum fromCode(final String statusCode) {
+        for (CodeEnum s : CodeEnum.values()) {
+            if (s.code.equals(statusCode)) {
+                return s;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Get the associated status code
+     *
+     * @return the status code
+     */
+    public String getCode() {
+        return code;
+    }
+
+    /**
+     * Get the reason phrase
+     *
+     * @return the reason phrase
+     */
+    @Override
+    public String toString() {
+        return reason;
+    }
+}

+ 47 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/enums/CostEnum.java

@@ -0,0 +1,47 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.enums;
+
+/**
+ * 费用管理
+ *
+ * @return ResMsg
+ */
+public enum CostEnum {
+
+    COMMUNICATION("通讯费"),
+    PURCHASE("采购费"),
+    REST("其他费用"),
+    TRANSPORTATION("交通费"),
+    REPAST("餐饮费"),
+    TRAVEL("差旅费"),
+    PROJECTADD("新建项目"),
+    MANHOUR("人员工时"),
+    PROJECTTASKADD("新建任务");
+    /**
+     * 信息
+     */
+    private final String reason;
+
+    public String getReason() {
+        return reason;
+    }
+
+    CostEnum(String reason) {
+        this.reason = reason;
+    }
+
+    /**
+     * 通过枚举的code,查询对应的枚举项
+     *
+     * @param reason
+     * @return
+     */
+    public static CostEnum getEnumByCode(String reason) {
+        CostEnum[] values = CostEnum.values();
+        for (CostEnum statusEnums : values) {
+            if (statusEnums.getReason().equals(reason)) {
+                return statusEnums;
+            }
+        }
+        return null;
+    }
+}

+ 59 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/enums/ProjectPeriodEnum.java

@@ -0,0 +1,59 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.enums;
+
+/**
+ * @ClassName: ProjectPeriodEnum
+ * @author: LWQ
+ * @date:2022/09/14
+ * @Copyright: 2022
+ */
+public enum ProjectPeriodEnum {
+
+    BUSINESS_RESEARCHB("1", "商机调研"),
+    PRE_SALES("2", " 售前"),
+    PROJECT_START("3", " 立项启动(中标)"),
+    DELIVERY("4", " 交付(实习阶段)"),
+    CHECK_AND_ACCEPT("5", " 验收"),
+    POST_PROJECT_THE_RECEIVABLE("6", " 结项回款"),
+    CLOSE("7", " 关闭");
+
+    /**
+     * 状态码
+     */
+    private final String code;
+    /**
+     * 信息
+     */
+    private final String reason;
+
+    /**
+     * 666666
+     */
+    ProjectPeriodEnum(String code, String reason) {
+        this.code = code;
+        this.reason = reason;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    /**
+     * 通过枚举的code,查询对应的枚举项
+     *
+     * @param code
+     * @return
+     */
+    public static ProjectPeriodEnum getEnumByCode(String code) {
+        ProjectPeriodEnum[] values = ProjectPeriodEnum.values();
+        for (ProjectPeriodEnum statusEnums : values) {
+            if (statusEnums.getCode().equals(code)) {
+                return statusEnums;
+            }
+        }
+        return null;
+    }
+}

+ 58 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/enums/ProjectStatusEnum.java

@@ -0,0 +1,58 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.enums;
+
+/**
+ * @ClassName: ProjectPeriodEnum
+ * @author: LWQ
+ * @date:2022/09/14
+ * @Copyright: 2022
+ */
+public enum ProjectStatusEnum {
+
+    NORMAL("1", "正常"),
+    POSTPONE("2", " 延期"),
+    CANCEL("3", " 取消"),
+    RISKY("4", " 有风险"),
+    OUT_OF_CONTROL("5", " 失控"),
+    ;
+
+    /**
+     * 状态码
+     */
+    private final String code;
+    /**
+     * 信息
+     */
+    private final String reason;
+
+    /**
+     * 666666
+     */
+    ProjectStatusEnum(String code, String reason) {
+        this.code = code;
+        this.reason = reason;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    /**
+     * 通过枚举的code,查询对应的枚举项
+     *
+     * @param code
+     * @return
+     */
+    public static ProjectStatusEnum getEnumByCode(String code) {
+        ProjectStatusEnum[] values = ProjectStatusEnum.values();
+        for (ProjectStatusEnum statusEnums : values) {
+            if (statusEnums.getCode().equals(code)) {
+                return statusEnums;
+            }
+        }
+        return null;
+    }
+}

+ 23 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/AccesoryInfoMapper.java

@@ -0,0 +1,23 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.AccesoryInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.CommunicationInfoEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/10/13 16:14
+ */
+public interface AccesoryInfoMapper extends JpaRepository<AccesoryInfoEntity, Integer>, JpaSpecificationExecutor<AccesoryInfoEntity> {
+
+
+    List<AccesoryInfoEntity> findByProjectIdEquals(String projectId);
+
+}

+ 26 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/CommunicationMapper.java

@@ -0,0 +1,26 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.CommunicationInfoEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 17:03
+ */
+public interface CommunicationMapper extends JpaRepository<CommunicationInfoEntity, Integer>, JpaSpecificationExecutor<CommunicationInfoEntity> {
+
+
+    @Transactional
+    @Modifying
+    @Query(value = "update communication_info SET flow_task_status = ?1 WHERE communication_id = ?2", nativeQuery = true)
+    void updateCommunicationFlowStatus(String flowTaskStatus, Integer commId);
+
+}

+ 34 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/CostInfoMapper.java

@@ -0,0 +1,34 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.CostInfoEntity;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 14:27
+ */
+public interface CostInfoMapper extends JpaRepository<CostInfoEntity, Integer>, JpaSpecificationExecutor<CostInfoEntity> {
+
+    @Query(value = "SELECT co.cost_id costId,co.cost_type cosType,co.cost_status costStatus,co.relevance_user relevanceUser,co.perform_amount performAmount\n" +
+            ",co.happen_date happenDate,co.payment_date paymentDate,co.project_name projectName,co.flow_task_status flowTaskStatus,co.process_instance_id processInstanceId,co.process_definition_id processDefinitionId FROM cost_info co WHERE if( ?1 !='', co.flow_task_status = ?1 , 1=1) and if( ?2 !='', co.happen_date >=?2 , 1=1)  and if( ?3 !='', co.payment_date <=?3 , 1=1) order by co.create_date desc "
+            , countQuery = "SELECT count(1) from cost_info co WHERE if( ?1 !='', co.flow_task_status = ?1 , 1=1) and if( ?2 !='', co.happen_date >=?2 , 1=1)  and if( ?3 !='', co.payment_date <=?3 , 1=1) "
+            , nativeQuery = true)
+    Page<Map<String, String>> findCostInfoAll(Integer flowTaskStatus, Date happenDate, String paymentDate, Pageable page);
+
+
+    @Transactional
+    @Modifying
+    @Query(value = "update cost_info SET flow_task_status = ?1 WHERE apply_cost_id = ?2 and cost_type=?3 ", nativeQuery = true)
+    void updateCostInfoFlowStatus(String flowTaskStatus, Integer applyCostId, String costType);
+}

+ 17 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/LoginTokenMapper.java

@@ -0,0 +1,17 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.LoginTokenEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/21 15:34
+ */
+public interface LoginTokenMapper extends JpaRepository<LoginTokenEntity, Integer>, JpaSpecificationExecutor<LoginTokenEntity> {
+
+
+}

+ 28 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ManHourJobMapper.java

@@ -0,0 +1,28 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ManHourInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ManHourJobInfo;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/21 15:34
+ */
+public interface ManHourJobMapper extends JpaRepository<ManHourJobInfo, Integer>, JpaSpecificationExecutor<ManHourJobInfo> {
+
+    /**
+     * 删除工时
+     */
+    int deleteByManIdEquals(Integer manId);
+}

+ 36 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ManHourMapper.java

@@ -0,0 +1,36 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ManHourInfoEntity;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/21 15:34
+ */
+public interface ManHourMapper extends JpaRepository<ManHourInfoEntity, Integer>, JpaSpecificationExecutor<ManHourInfoEntity> {
+
+
+    @Query(value = "SELECT man.man_id manId,man.project_user projrctUser,man.project_name " +
+            "projectName,man.man_hour manHour,man.create_date create_date,man.flow_task_status flowTaskStatus,man.process_instance_id processInstanceId ,man.process_definition_id processDefinitionId " +
+            "from man_hour_info man WHERE  1=1 and if( ?1 !='', man.flow_task_status = ?1 , 1=1) and if( ?2 !='', man.create_date >=?2 , 1=1)  and if( ?3 !='', man.end_date <=?3 , 1=1)  order by man.create_date desc "
+            , countQuery = "SELECT count(1) from man_hour_info man WHERE  1=1 and if( ?1 !='', man.flow_task_status = ?1 , 1=1) and if( ?2 !='', man.create_date >=?2 , 1=1)  and if( ?3 !='', man.end_date <=?3 , 1=1)"
+            , nativeQuery = true)
+    Page<Map<String, String>> findManHourAll(Integer flowTaskStatus, Date createDate, String endDate, Pageable page);
+
+    @Transactional
+    @Modifying
+    @Query(value = "update man_hour_info SET flow_task_status = ?1 WHERE man_id = ?2", nativeQuery = true)
+    void updateManHourFlowStatus(String flowTaskStatus, Integer manId);
+
+}

+ 26 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ProjectAuditInfoMapper.java

@@ -0,0 +1,26 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.AccesoryInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectAuditInfoEntity;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/10/13 17:56
+ */
+public interface ProjectAuditInfoMapper extends JpaRepository<ProjectAuditInfoEntity, Integer>, JpaSpecificationExecutor<ProjectAuditInfoEntity> {
+
+    @Query(value = "SELECT p.project_audit_id projectAuditId,p.project_name projectName,p.printcipal printcipal,p.create_date createDate," +
+            "p.audit_status auditStatus,p.matter matter from project_audit_info p WHERE p.printcipal = ?1 "
+            , countQuery = "SELECT count(1) WHERE p.printcipal = ?1 ", nativeQuery = true)
+    Page<Map<String, String>> findByPrintcipalEquals(Long printcipal, Pageable page);
+}

File diff suppressed because it is too large
+ 68 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ProjectInfoMapper.java


+ 41 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/ProjectTeamMapper.java

@@ -0,0 +1,41 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectTeamInfoEntity;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/13 10:27
+ */
+public interface ProjectTeamMapper extends JpaRepository<ProjectTeamInfoEntity, Integer> {
+
+    /**
+     * 根据项目组名称查询
+     */
+    List<ProjectTeamInfoEntity> findByProjectTeamNameEquals(String projectTeamName);
+
+    /**
+     * 根据项目id查询
+     */
+    List<ProjectTeamInfoEntity> findByProjectIdEquals(String projectId);
+
+
+    /**
+     * 根据项目组名称查询分页
+     */
+    Page<ProjectTeamInfoEntity> findAllByProjectTeamNameLike(String projectTeamName, Pageable pageable);
+
+    /**
+     * 分页查询
+     */
+    @Override
+    Page<ProjectTeamInfoEntity> findAll(Pageable pageable);
+
+    List<Integer> findTeamUserByProjectId(Integer projectId);
+}

+ 25 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/PurchaseInfoMapper.java

@@ -0,0 +1,25 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.PurchaseInfoEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 18:05
+ */
+public interface PurchaseInfoMapper extends JpaRepository<PurchaseInfoEntity, Integer>, JpaSpecificationExecutor<PurchaseInfoEntity> {
+
+    @Transactional
+    @Modifying
+    @Query(value = "update purchase_info SET flow_task_status = ?1 WHERE purchase_id = ?2", nativeQuery = true)
+    void updatePurchaseInfoFlowStatus(String flowTaskStatus, Integer purchaseId);
+
+}

+ 59 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/RelevanceProjectInfoMapper.java

@@ -0,0 +1,59 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.RelevanceProjectInfoEntity;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.transaction.Transactional;
+import java.math.BigInteger;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/10/9 13:44
+ */
+public interface RelevanceProjectInfoMapper extends JpaRepository<RelevanceProjectInfoEntity, Integer>, JpaSpecificationExecutor<RelevanceProjectInfoEntity> {
+
+    /**
+     * 根据项目组id查询关联的人员
+     */
+    @Query(value = "SELECT p.user_id userId FROM relevance_project_info p WHERE p.project_team_id = ?1 ",
+            countQuery = "SELECT count(1) FROM relevance_project_info p WHERE p.project_team_id = ?1 ", nativeQuery = true)
+    Page<Map<String, Integer>> findByProjectTeamIdEquals(String projectTeamId, Pageable page);
+
+    /**
+     * 根据项目组id查询关联的人员
+     */
+    @Query(value = "SELECT p.user_id userId FROM relevance_project_info p WHERE p.project_team_id = ?1 ",
+            countQuery = "SELECT count(1) FROM relevance_project_info p WHERE p.project_team_id = ?1 ", nativeQuery = true)
+    List<String> findByProjectTeamIdEquals(String projectTeamId);
+
+    /**
+     * 根据用户id查询关联的项目组
+     */
+    @Query(value = "SELECT p.project_team_id projectTeamId FROM relevance_project_info p WHERE p.user_id = ?1 ",
+            countQuery = "SELECT count(1) FROM relevance_project_info p WHERE p.user_id = ?1 ", nativeQuery = true)
+    List<String> findByUserId(Long userId);
+
+    /**
+     * 根据用户id 项目组id查询该用户是否存在这个项目组
+     */
+    @Query(value = "SELECT count(1) FROM relevance_project_info p WHERE p.user_id = ?1 and p.project_team_id =?2 ", nativeQuery = true)
+    int findByuserIdbyrojectTeamid(String userId, Integer projectTeamId);
+
+    /**
+     * 移除项目组人员
+     */
+    @Transactional
+    @Modifying
+    @Query(value = "DELETE  FROM relevance_project_info  WHERE project_team_id=?1 AND user_id =?2 ", nativeQuery = true)
+    void removeUser(Integer projectTeamId, Long user);
+}

+ 17 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/RepastExpenseMapper.java

@@ -0,0 +1,17 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.RepastExpenseEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface RepastExpenseMapper extends JpaRepository<RepastExpenseEntity, Integer>, JpaSpecificationExecutor<RepastExpenseEntity> {
+    @Transactional
+    @Modifying
+    @Query(value = "update repast_expense SET flow_task_status = ?1 WHERE id = ?2", nativeQuery = true)
+    void updateRepastFlowStatus(String flowTaskStatus, Integer repastId);
+}

+ 23 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/RestInfoMapper.java

@@ -0,0 +1,23 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.RestsInfoEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 18:35
+ */
+public interface RestInfoMapper extends JpaRepository<RestsInfoEntity, Integer>, JpaSpecificationExecutor<RestsInfoEntity> {
+    @Transactional
+    @Modifying
+    @Query(value = "update rests_info SET flow_task_status = ?1 WHERE rests_id = ?2", nativeQuery = true)
+    void updateRestsFlowStatus(String flowTaskStatus, Integer projectId);
+}

+ 53 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/TaskInfoMapper.java

@@ -0,0 +1,53 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.TaskInfoEntity;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.Map;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 17:19
+ */
+public interface TaskInfoMapper extends JpaRepository<TaskInfoEntity, Integer>, JpaSpecificationExecutor<TaskInfoEntity> {
+
+
+    @Query(value = "SELECT t.task_id taskId,t.target_task targetTask,t.task_priority taskPriority,t.task_participant taskParticipant,t.start_time startTime,t.end_time endTime,\n" +
+            "t.task_status taskStatus,t.task_creator taskCreator,t.task_index taskIndex,t.task_standard taskStandard,t.task_statements\n" +
+            "taskStatements,t.project_id projectId,t.process_instance_id processInstanceId,t.flow_task_status flowTaskStatus,t.process_definition_id processDefinitionId  from task_info t WHERE if( ?1 !='', t.target_task = ?1 , 1=1) AND if( ?2 !='', t.task_status = ?2 , 1=1) and is_delete='1' order by t.create_date desc ",
+            countQuery = "select count(1)from task_info t WHERE if( ?1 !='', t.target_task = ?1 , 1=1) AND if( ?2 !='', t.task_status = ?2 , 1=1)", nativeQuery = true)
+    Page<Map<String, String>> findTaskInfo(String targetTask, String taskStatus, Pageable page);
+
+    /**
+     * 查询任务名称数量
+     *
+     * @param
+     * @param targetTask
+     * @return ResMsg
+     */
+    @Query
+    int countByTargetTaskEqualsAndIsDeleteEquals(String targetTask, String isDelete);
+
+    @Transactional
+    @Modifying
+    @Query(value = "UPDATE task_info t SET t.task_status = 4 WHERE t.task_id = ?1 ", nativeQuery = true)
+    int performTask(Integer taskId);
+
+    @Transactional
+    @Modifying
+    @Query(value = "update task_info SET flow_task_status = ?1 WHERE task_id = ?2", nativeQuery = true)
+    void updateTaskFlowStatus(String flowTaskStatus, Integer taskId);
+
+    @Transactional
+    @Modifying
+    @Query(value = "update task_info SET is_delete='-1' WHERE task_id = ?1", nativeQuery = true)
+    void deleteTask(Integer taskId);
+}

+ 17 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/TrafficExpenseMapper.java

@@ -0,0 +1,17 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.TrafficExpenseEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface TrafficExpenseMapper extends JpaRepository<TrafficExpenseEntity, Integer>, JpaSpecificationExecutor<TrafficExpenseEntity> {
+    @Transactional
+    @Modifying
+    @Query(value = "update traffic_expense SET flow_task_status = ?1 WHERE id = ?2", nativeQuery = true)
+    void updateTrafficFlowStatus(String flowTaskStatus, Integer trafficId);
+}

+ 17 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/TravelExpenseMapper.java

@@ -0,0 +1,17 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.TravelExpenseEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface TravelExpenseMapper extends JpaRepository<TravelExpenseEntity, Integer>, JpaSpecificationExecutor<TravelExpenseEntity> {
+    @Transactional
+    @Modifying
+    @Query(value = "update travel_expense SET flow_task_status = ?1 WHERE id = ?2", nativeQuery = true)
+    void updateTravelFlowStatus(String flowTaskStatus, Integer travelId);
+}

+ 39 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/mapper/UserInfoMapper.java

@@ -0,0 +1,39 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.mapper;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.UserInfoEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/5 14:20
+ */
+public interface UserInfoMapper extends JpaRepository<UserInfoEntity, String>, JpaSpecificationExecutor<UserInfoEntity> {
+
+
+    @Query(value = "SELECT user.user_id userId,user.show_name userName FROM work_sys_user user WHERE deleted_flag =1 ",
+            countQuery = "SELECT count(1) FROM work_sys_user WHERE deleted_flag =1", nativeQuery = true)
+    List<Map<String, String>> getProUserAll();
+
+    /**
+     * 根据id查询用户信息
+     */
+    @Query(value = "SELECT * FROM work_sys_user where user_id in (?1)"
+            , countQuery = "SELECT count(1) FROM work_sys_user where user_id in (?1)", nativeQuery = true)
+    List<UserInfoEntity> findAllByUserId(List<String> userIds);
+
+    /**
+     * 根据id查询用户信息
+     *
+     * @param userId
+     */
+    @Query(value = "SELECT * FROM work_sys_user where user_id = ?1"
+            , countQuery = "SELECT count(1) FROM work_sys_user where user_id in ?1", nativeQuery = true)
+    UserInfoEntity findByUserIdEquals(String userId);
+}

+ 24 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/ApplyForCostService.java

@@ -0,0 +1,24 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.*;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 16:17
+ */
+public interface ApplyForCostService {
+    ResMsg addCommunication(CommunicationInfoVo communicationInfoVo);
+
+    ResMsg addpurchase(PurchaseInfoVo purchaseInfoVo);
+
+    ResMsg addRest(RestsInfoVo restsInfoVo);
+
+    ResMsg trafficExpenseApply(TrafficExpenseVo trafficExpenseVo);
+
+    ResMsg repastExpenseApply(RepastExpenseVo repastExpenseVo);
+
+    ResMsg travelExpenseApply(TravelExpenseVo travelExpenseVo);
+}

+ 29 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/CostInfoService.java

@@ -0,0 +1,29 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.CostInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.UserInfoVo;
+
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 14:23
+ */
+public interface CostInfoService {
+
+    ResMsg addCostInfo(CostInfoEntity costInfoEntity);
+
+    ResMsg findCostInfoAll(CostInfoEntity costInfoEntity, Integer pageIndex, Integer pageSize);
+
+    boolean deleteCostInfo(List<CostInfoEntity> costInfoEntities);
+
+    ResMsg updateCostInfo(CostInfoEntity costInfoEntity);
+
+    ResMsg findCostInfoDetails(CostInfoEntity costInfoEntity);
+
+    ResMsg findProjectAuditList(Long id, UserInfoVo userInfoVo);
+}

+ 24 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/FileService.java

@@ -0,0 +1,24 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileNotFoundException;
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/27 17:35
+ */
+public interface FileService {
+    String uploadOne(MultipartFile voFile) throws FileNotFoundException;
+
+    List<String> uploadList(List<MultipartFile> voFileList);
+
+    String uploadListReturnStr(String filePath, List<MultipartFile> voFileList);
+
+    boolean deleteFile(String fileUrl);
+
+    boolean deleteFileList(List<String> fileUrlList);
+}

+ 17 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/LoginService.java

@@ -0,0 +1,17 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.UserInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/5 14:18
+ */
+public interface LoginService {
+
+
+    ResMsg login(UserInfoEntity userInfoEntity);
+}

+ 24 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/ManHourService.java

@@ -0,0 +1,24 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ManHourInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ManHourJobInfo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ManHourInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/21 15:32
+ */
+public interface ManHourService {
+
+    ResMsg findManHourAll(Integer pageIndex, Integer pageSize, ManHourInfoEntity manHourInfoEntity);
+
+    ResMsg addManHour(String projectId, ManHourInfoEntity manHourInfoEntity, List<ManHourJobInfo> manHours);
+
+    ResMsg deleteManHour(List<ManHourInfoVo> manHourInfoVos);
+}

+ 41 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/ProjectInfoService.java

@@ -0,0 +1,41 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 11:12
+ */
+public interface ProjectInfoService {
+
+    ResMsg findProjectInfo(Integer pageIndex, Integer pageSize, ProjectInfoEntity projectInfoEntity);
+
+    ResMsg findProjectInfoAll(String projectName);
+
+    ResMsg findProjectParticulars(ProjectInfoEntity projectInfoEntity);
+
+    ResMsg addProject(ProjectInfoEntity projectInfoEntity);
+
+    ResMsg updateProject(ProjectInfoEntity projectInfoEntity);
+
+    ResMsg deleteProjects(List<ProjectInfoVo> projectInfoVos);
+
+    ResMsg findPrincipalProject(String userId);
+
+    ResMsg findAccesoryInfo(ProjectInfoEntity projectInfoEntity);
+
+    ResMsg findProjectNumber();
+
+    ResMsg substepOfProjectNum();
+
+    ResMsg findLastMonthProjectNumber();
+
+    ResMsg substepOfProjectNumAtLastMonth();
+}

+ 45 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/ProjectTeamService.java

@@ -0,0 +1,45 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectTeamInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.UserInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/13 10:25
+ */
+public interface ProjectTeamService {
+
+    ResMsg findProjectTeamAll(Integer pageIndex, Integer pageSize, ProjectTeamInfoEntity projectTeamInfoEntity);
+
+    ResMsg findProjectTeamUser(Integer pageIndex, Integer pageSize, Integer projectTeamId);
+
+    boolean deleteBatch(List<ProjectTeamInfoEntity> projectTeamInfoVos);
+
+    ResMsg updateProjectTeam(ProjectTeamInfoEntity projectTeamInfoEntity);
+
+    boolean deleteBatchUser(List<UserInfoEntity> userInfoEntities);
+
+    ResMsg addUser(UserInfoEntity userInfoEntity);
+
+    ResMsg updateUser(UserInfoEntity userInfoEntity);
+
+    ResMsg findById(Long userId);
+
+    ResMsg findPrincipal();
+
+    ResMsg findTeamUser(ProjectTeamInfoEntity projectTeamInfoEntity);
+
+    ResMsg addProjectTeam(ProjectTeamInfoEntity projectTeamInfoEntity, List<Long> userIds);
+
+    ResMsg addProjectTeamUser(ProjectTeamInfoEntity projectTeamInfoEntity, List<Long> userIds);
+
+    ResMsg removeUser(ProjectTeamInfoEntity projectTeamInfoEntity, List<Long> userIds);
+
+    ResMsg findUserProject(Long userId);
+}

+ 27 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/TaskInfoService.java

@@ -0,0 +1,27 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service;
+
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.TaskInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.TaskInfoVo;
+
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 17:18
+ */
+public interface TaskInfoService {
+    ResMsg findTaskInfo(Integer pageIndex, Integer pageSize, TaskInfoEntity taskInfoEntity);
+
+    ResMsg addTaskInfo(TaskInfoEntity taskInfoEntity, List<Long> taskParticipant);
+
+    ResMsg deleteTask(List<TaskInfoVo> taskInfoVos);
+
+    ResMsg findTaskById(TaskInfoVo taskInfoVo);
+
+    ResMsg performTask(TaskInfoEntity taskInfoEntity);
+
+}

+ 438 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/ApplyForCostServiceImpl.java

@@ -0,0 +1,438 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ankaibei.workFlow.common.core.object.ResponseResult;
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.common.flow.constant.FlowConstant;
+import com.ankaibei.workFlow.common.flow.constant.FlowTaskStatus;
+import com.ankaibei.workFlow.common.flow.dto.FlowTaskCommentDto;
+import com.ankaibei.workFlow.common.flow.model.FlowEntry;
+import com.ankaibei.workFlow.common.flow.model.FlowEntryPublish;
+import com.ankaibei.workFlow.common.flow.vo.TaskInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.*;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.*;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.ApplyForCostService;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.CostInfoService;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.FlowTaskStart;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.*;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 16:18
+ */
+@Service
+public class ApplyForCostServiceImpl implements ApplyForCostService {
+
+    @Resource
+    private FileUtil fileUtil;
+    @Autowired
+    private FlowTaskStart flowTaskStart;
+    @Resource
+    private RestInfoMapper restInfoMapper;
+    @Resource
+    private UserInfoMapper userInfoMapper;
+    @Resource
+    private CostInfoService costInfoService;
+    @Resource
+    private PurchaseInfoMapper purchaseInfoMapper;
+    @Resource
+    private CommunicationMapper communicationMapper;
+    @Resource
+    private RepastExpenseMapper repastExpenseMapper;
+    @Resource
+    private TravelExpenseMapper travelExpenseMapper;
+    @Resource
+    private TrafficExpenseMapper trafficExpenseMapper;
+
+    @Override
+    public ResMsg addCommunication(CommunicationInfoVo communicationInfoVo) {
+        CommunicationInfoEntity communicationInfoEntity = new CommunicationInfoEntity();
+        BeanUtils.copyProperties(communicationInfoVo, communicationInfoEntity);
+        communicationInfoEntity.setCreateTime(new Date());
+        CommunicationInfoEntity save = communicationMapper.save(communicationInfoEntity);
+
+        /**
+         * 调用通讯费用申请流程的启动
+         * 获取开始节点之后的第一个任务节点的数据
+         * param processDefinitionKey 流程标识。
+         */
+        String processDefinitionKey = "projectCommunicationAppF";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        //将申请信息添加到流程引擎控制的表中,并添加关联
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("project_name", communicationInfoVo.getProjectName());
+        stringObjectHashMap.put("application_fee", communicationInfoVo.getApplicationFee());
+        stringObjectHashMap.put("remark", communicationInfoVo.getRemark());
+        stringObjectHashMap.put("communication_id", save.getCommunicationId());
+        stringObjectHashMap.put("cost_type", "通讯费");
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, null, masterData, null, null).getData();
+        CostInfoEntity costInfoEntity = new CostInfoEntity();
+        costInfoEntity.setCostType("通讯费");
+        UserInfoEntity userInfoEntity = findUser(communicationInfoVo.getCreateUser());
+        costInfoEntity.setRelevanceUser(userInfoEntity != null ? userInfoEntity.getShowName() : null);
+        costInfoEntity.setProjectName(communicationInfoVo.getProjectName());
+        costInfoEntity.setPerformAmount(communicationInfoVo.getTotalMoney());
+        costInfoEntity.setHappenDate(communicationInfoVo.getCreateDate());
+        costInfoEntity.setPaymentDate(communicationInfoVo.getEndDate());
+        costInfoEntity.setProposer(Long.valueOf(communicationInfoVo.getCreateUser()));
+        costInfoEntity.setApplyCostId(save.getCommunicationId());
+        costInfoEntity.setProcessInstanceId(map.get("processInstanceId"));
+        costInfoEntity.setProcessDefinitionId(map.get("processDefinitionId"));
+        costInfoEntity.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        costInfoService.addCostInfo(costInfoEntity);
+
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg addpurchase(PurchaseInfoVo purchaseInfoVo) {
+        PurchaseInfoEntity purchaseInfoEntity = new PurchaseInfoEntity();
+        BeanUtils.copyProperties(purchaseInfoVo, purchaseInfoEntity);
+        purchaseInfoEntity.setPurchaseMessage(JSON.toJSONString(purchaseInfoVo.getPurchaseMessage()));
+        purchaseInfoEntity.setCreateTime(new Date());
+        PurchaseInfoEntity save = purchaseInfoMapper.save(purchaseInfoEntity);
+
+        /**
+         * 调用采购费用申请流程的启动
+         * 获取开始节点之后的第一个任务节点的数据
+         * param processDefinitionKey 项目采购费用报销审批流程--流程标识。
+         */
+        String processDefinitionKey = "projectPurchaseApp";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        //将申请信息添加到流程引擎控制的表中,并添加关联
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("project_name", purchaseInfoVo.getProjectName());
+        stringObjectHashMap.put("purchase_message", purchaseInfoVo.getPurchaseMessage().toString());
+        stringObjectHashMap.put("purchase_date", purchaseInfoVo.getPurchaseDate());
+        stringObjectHashMap.put("create_user", purchaseInfoVo.getCreateUser());
+        stringObjectHashMap.put("purchase_id", save.getPurchaseId());
+        stringObjectHashMap.put("cost_type", "采购费");
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, null, masterData, null, null).getData();
+
+        CostInfoEntity costInfoEntity = new CostInfoEntity();
+        costInfoEntity.setCostType("采购费");
+        UserInfoEntity userInfoEntity = findUser(purchaseInfoVo.getCreateUser());
+        costInfoEntity.setRelevanceUser(userInfoEntity != null ? userInfoEntity.getShowName() : null);
+        costInfoEntity.setProjectName(purchaseInfoVo.getProjectName());
+        costInfoEntity.setPerformAmount(purchaseInfoVo.getTotalMoney());
+        costInfoEntity.setHappenDate(purchaseInfoVo.getPurchaseDate());
+        costInfoEntity.setProposer(Long.valueOf(purchaseInfoVo.getCreateUser()));
+        costInfoEntity.setApplyCostId(save.getPurchaseId());
+        costInfoEntity.setProcessInstanceId(map.get("processInstanceId"));
+        costInfoEntity.setProcessDefinitionId(map.get("processDefinitionId"));
+        costInfoEntity.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        costInfoService.addCostInfo(costInfoEntity);
+
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg addRest(RestsInfoVo restsInfoVo) {
+        RestsInfoEntity restsInfoEntity = new RestsInfoEntity();
+        BeanUtils.copyProperties(restsInfoVo, restsInfoEntity);
+        restsInfoEntity.setRestsMessage(JSON.toJSONString(restsInfoVo.getRestsMessage()));
+        restsInfoEntity.setCreateTime(new Date());
+        RestsInfoEntity save = restInfoMapper.save(restsInfoEntity);
+        /**
+         * 调用项目其他费用申请流程的启动
+         * 获取开始节点之后的第一个任务节点的数据
+         * param processDefinitionKey 项目其他费用报销审批流程--流程标识。
+         */
+        String processDefinitionKey = "projeRestsInfoApp";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        //将申请信息添加到流程引擎控制的表中,并添加关联
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("project_name", restsInfoEntity.getProjectName());
+        stringObjectHashMap.put("rests_message", restsInfoEntity.getRestsMessage().toString());
+        stringObjectHashMap.put("total_money", restsInfoVo.getTotalMoney());
+        stringObjectHashMap.put("create_date", restsInfoVo.getCreateDate());
+        stringObjectHashMap.put("create_user", restsInfoVo.getCreateUser());
+        stringObjectHashMap.put("id", save.getRestsId());
+        stringObjectHashMap.put("cost_type", "其他费用");
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, null, masterData, null, null).getData();
+
+        CostInfoEntity costInfoEntity = new CostInfoEntity();
+        costInfoEntity.setCostType("其他费用");
+        UserInfoEntity userInfoEntity = findUser(restsInfoVo.getCreateUser());
+        costInfoEntity.setRelevanceUser(userInfoEntity != null ? userInfoEntity.getShowName() : null);
+        costInfoEntity.setProjectName(restsInfoVo.getProjectName());
+        costInfoEntity.setPerformAmount(restsInfoVo.getTotalMoney());
+        costInfoEntity.setHappenDate(restsInfoVo.getCreateDate());
+        costInfoEntity.setProposer(Long.valueOf(restsInfoVo.getCreateUser()));
+        costInfoEntity.setApplyCostId(save.getRestsId());
+        costInfoEntity.setProcessInstanceId(map.get("processInstanceId"));
+        costInfoEntity.setProcessDefinitionId(map.get("processDefinitionId"));
+        costInfoEntity.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        costInfoService.addCostInfo(costInfoEntity);
+
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg trafficExpenseApply(TrafficExpenseVo trafficExpenseVo) {
+        TrafficExpenseEntity trafficExpense = new TrafficExpenseEntity();
+        BeanUtils.copyProperties(trafficExpenseVo, trafficExpense);
+        trafficExpense.setSubject(JSON.toJSONString(trafficExpenseVo.getSubject()));
+        trafficExpense.setCreateTime(new Date());
+        TrafficExpenseEntity save = trafficExpenseMapper.save(trafficExpense);
+        /**
+         * 调用项目交通费用申请流程的启动
+         * 获取开始节点之后的第一个任务节点的数据
+         * param processDefinitionKey 项目交通费用报销审批流程--流程标识。
+         */
+        String processDefinitionKey = "projectTrafficExpenseApp";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        //将申请信息添加到流程引擎控制的表中,并添加关联
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("project_name", trafficExpenseVo.getProjectName());
+        stringObjectHashMap.put("applicant", trafficExpenseVo.getApplicant());
+        stringObjectHashMap.put("subject", trafficExpenseVo.getSubject().toString());
+        stringObjectHashMap.put("total_money", trafficExpenseVo.getTotalMoney());
+        stringObjectHashMap.put("id", save.getId());
+        stringObjectHashMap.put("cost_type", "交通费");
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, null, masterData, null, null).getData();
+
+        CostInfoEntity costInfoEntity = new CostInfoEntity();
+        costInfoEntity.setCostType("交通费");
+        UserInfoEntity userInfoEntity = findUser(trafficExpenseVo.getApplicant());
+        costInfoEntity.setRelevanceUser(userInfoEntity != null ? userInfoEntity.getShowName() : null);
+        costInfoEntity.setProjectName(trafficExpenseVo.getProjectName());
+        costInfoEntity.setPerformAmount(trafficExpenseVo.getTotalMoney());
+        costInfoEntity.setProposer(Long.valueOf(trafficExpenseVo.getApplicant()));
+        costInfoEntity.setApplyCostId(save.getId());
+        costInfoEntity.setProcessInstanceId(map.get("processInstanceId"));
+        costInfoEntity.setProcessDefinitionId(map.get("processDefinitionId"));
+        costInfoEntity.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        costInfoService.addCostInfo(costInfoEntity);
+
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg repastExpenseApply(RepastExpenseVo repastExpenseVo) {
+        RepastExpenseEntity repastExpense = new RepastExpenseEntity();
+        BeanUtils.copyProperties(repastExpenseVo, repastExpense);
+        repastExpense.setSubject(JSON.toJSONString(repastExpenseVo.getSubject()));
+        repastExpense.setCreateTime(new Date());
+        RepastExpenseEntity save = repastExpenseMapper.save(repastExpense);
+        /**
+         * 调用项目餐饮用申请流程的启动
+         * 获取开始节点之后的第一个任务节点的数据
+         * param processDefinitionKey 项目餐饮费用报销审批流程--流程标识。
+         */
+        String processDefinitionKey = "projectRepastExpenseApp";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        //将申请信息添加到流程引擎控制的表中,并添加关联
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("project_name", repastExpenseVo.getProjectName());
+        stringObjectHashMap.put("applicant", repastExpenseVo.getApplicant());
+        stringObjectHashMap.put("subject", repastExpenseVo.getSubject().toString());
+        stringObjectHashMap.put("total_money", repastExpenseVo.getTotalMoney());
+        stringObjectHashMap.put("id", save.getId());
+        stringObjectHashMap.put("cost_type", "餐饮费");
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, null, masterData, null, null).getData();
+
+        CostInfoEntity costInfoEntity = new CostInfoEntity();
+        costInfoEntity.setCostType("餐饮费");
+        UserInfoEntity userInfoEntity = findUser(repastExpenseVo.getApplicant());
+        costInfoEntity.setRelevanceUser(userInfoEntity != null ? userInfoEntity.getShowName() : null);
+        costInfoEntity.setProjectName(repastExpenseVo.getProjectName());
+        costInfoEntity.setPerformAmount(repastExpenseVo.getTotalMoney());
+        costInfoEntity.setProposer(Long.valueOf(repastExpenseVo.getApplicant()));
+        costInfoEntity.setApplyCostId(save.getId());
+        costInfoEntity.setProcessInstanceId(map.get("processInstanceId"));
+        costInfoEntity.setProcessDefinitionId(map.get("processDefinitionId"));
+        costInfoEntity.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        costInfoService.addCostInfo(costInfoEntity);
+
+        return new ResMsg(CodeEnum.OK);
+    }
+
+
+    @Override
+    public ResMsg travelExpenseApply(TravelExpenseVo travelExpenseVo) {
+        TravelExpenseEntity travelExpense = new TravelExpenseEntity();
+        BeanUtils.copyProperties(travelExpenseVo, travelExpense);
+        travelExpense.setSubject(JSON.toJSONString(travelExpenseVo.getSubject()));
+        travelExpense.setCreateTime(new Date());
+        TravelExpenseEntity save = travelExpenseMapper.save(travelExpense);
+        /**
+         * 调用项目差旅费用申请流程的启动
+         * 获取开始节点之后的第一个任务节点的数据
+         * param processDefinitionKey 项目差旅费用报销审批流程--流程标识。
+         */
+        String processDefinitionKey = "projectTravelExpenseApp";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        //将申请信息添加到流程引擎控制的表中,并添加关联
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("project_name", travelExpenseVo.getProjectName());
+        stringObjectHashMap.put("applicant", travelExpenseVo.getApplicant());
+        stringObjectHashMap.put("subject", travelExpenseVo.getSubject().toString());
+        stringObjectHashMap.put("total_money", travelExpenseVo.getTotalMoney());
+        stringObjectHashMap.put("begin_time", travelExpenseVo.getBeginTime());
+        stringObjectHashMap.put("end_time", travelExpenseVo.getEndTime());
+        stringObjectHashMap.put("start_site", travelExpenseVo.getStartSite());
+        stringObjectHashMap.put("end_site", travelExpenseVo.getEndSite());
+        stringObjectHashMap.put("accommodation_fee", travelExpenseVo.getAccommodationFee());
+        stringObjectHashMap.put("accommodation_days", travelExpenseVo.getAccommodationDays());
+        stringObjectHashMap.put("total_fee", travelExpenseVo.getTotalFee());
+        stringObjectHashMap.put("accommodation_remark", travelExpenseVo.getAccommodationRemark());
+        stringObjectHashMap.put("accommodation_person", travelExpenseVo.getAccommodationPerson());
+        stringObjectHashMap.put("repast_fee", travelExpenseVo.getRepastFee());
+        stringObjectHashMap.put("repast_remark", travelExpenseVo.getRepastRemark());
+        stringObjectHashMap.put("repast_person", travelExpenseVo.getRepastPerson());
+
+        stringObjectHashMap.put("id", save.getId());
+        stringObjectHashMap.put("cost_type", "差旅费");
+
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+        HashMap<String, Object> taskVariableDataMap = new HashMap<>();
+
+        //流程的任务变量
+        taskVariableDataMap.put("accommodationDays", travelExpenseVo.getAccommodationDays());
+        JSONObject taskVariableData = (JSONObject) JSONObject.toJSON(taskVariableDataMap);
+        JSONObject copyData = null;
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, taskVariableData, masterData, null, copyData).getData();
+
+        CostInfoEntity costInfoEntity = new CostInfoEntity();
+        costInfoEntity.setCostType("差旅费");
+        UserInfoEntity userInfoEntity = findUser(travelExpenseVo.getApplicant());
+        costInfoEntity.setRelevanceUser(userInfoEntity != null ? userInfoEntity.getShowName() : null);
+        costInfoEntity.setProjectName(travelExpenseVo.getProjectName());
+        costInfoEntity.setPerformAmount(travelExpenseVo.getTotalMoney());
+        costInfoEntity.setProposer(Long.valueOf(travelExpenseVo.getApplicant()));
+        costInfoEntity.setApplyCostId(save.getId());
+        costInfoEntity.setProcessInstanceId(map.get("processInstanceId"));
+        costInfoEntity.setProcessDefinitionId(map.get("processDefinitionId"));
+        costInfoEntity.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        costInfoService.addCostInfo(costInfoEntity);
+
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    /**
+     * 查询用户信息
+     */
+    private UserInfoEntity findUser(String userId) {
+        Optional<UserInfoEntity> byId = userInfoMapper.findById(userId);
+        return byId.orElse(null);
+    }
+}

+ 177 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/CostInfoServiceImpl.java

@@ -0,0 +1,177 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.*;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CostEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.*;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.CostInfoService;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.*;
+import org.springframework.beans.BeanUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/26 14:25
+ */
+@Service
+public class CostInfoServiceImpl implements CostInfoService {
+
+    @Resource
+    private CostInfoMapper costInfoMapper;
+    @Resource
+    private ProjectInfoMapper projectInfoMapper;
+    @Resource
+    private CommunicationMapper communicationMapper;
+    @Resource
+    private PurchaseInfoMapper purchaseInfoMapper;
+    @Resource
+    private RestInfoMapper restInfoMapper;
+    @Resource
+    private TrafficExpenseMapper trafficExpenseMapper;
+    @Resource
+    private RepastExpenseMapper repastExpenseMapper;
+    @Resource
+    private TravelExpenseMapper travelExpenseMapper;
+    @Resource
+    private ProjectAuditInfoMapper projectAuditInfoMapper;
+
+    @Override
+    public ResMsg addCostInfo(CostInfoEntity costInfoEntity) {
+        costInfoEntity.setCostStatus("1");
+        costInfoEntity.setPaymentDate(costInfoEntity.getPaymentDate() == null ? new Date() : costInfoEntity.getPaymentDate());
+        costInfoEntity.setCreateDate(new Date());
+        costInfoMapper.save(costInfoEntity);
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg findCostInfoAll(CostInfoEntity costInfoEntity, Integer pageIndex, Integer pageSize) {
+        Pageable page = PageRequest.of(pageIndex - 1, pageSize);
+        String paymentDate = null;
+        if (costInfoEntity.getPaymentDate() != null) {
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            paymentDate = dateFormat.format(costInfoEntity.getPaymentDate()) + " 23:59:59";
+        }
+        Page<Map<String, String>> costInfoAll = costInfoMapper.findCostInfoAll(costInfoEntity.getFlowTaskStatus(), costInfoEntity.getHappenDate(), paymentDate, page);
+        return new ResMsg(CodeEnum.OK, ResMsg.getMap(costInfoAll.map(map -> {
+            Map<Object, Object> map1 = new HashMap<>();
+            map1.putAll(map);
+            String projectId = map.get("projectName");
+            Optional<ProjectInfoEntity> byId = projectInfoMapper.findById(Integer.valueOf(projectId));
+            map1.put("projectName", byId.orElse(null) != null ? byId.orElse(null).getProjectName() : null);
+            return map1;
+        }).getContent(), costInfoAll.getTotalElements()));
+    }
+
+    @Override
+    public boolean deleteCostInfo(List<CostInfoEntity> costInfoEntities) {
+        for (CostInfoEntity info : costInfoEntities) {
+            costInfoMapper.deleteById(info.getCostId());
+        }
+        return true;
+    }
+
+    @Override
+    public ResMsg updateCostInfo(CostInfoEntity costInfoEntity) {
+        Optional<CostInfoEntity> byId = costInfoMapper.findById(costInfoEntity.getCostId());
+        CostInfoEntity cost = byId.orElse(null);
+        if (StringUtils.isEmpty(cost)) {
+            return new ResMsg(CodeEnum.PARAM_IS_NULL);
+        }
+        costInfoEntity.setCostStatus(cost.getCostStatus() == null ? "1" : cost.getCostStatus());
+        costInfoEntity.setProposer(cost.getProposer() == null ? 1 : cost.getProposer());
+        costInfoMapper.save(costInfoEntity);
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg findCostInfoDetails(CostInfoEntity costInfoEntity) {
+        Optional<CostInfoEntity> byId = costInfoMapper.findById(costInfoEntity.getCostId());
+        CostInfoEntity costInfo = byId.orElse(null);
+        switch (CostEnum.getEnumByCode(costInfoEntity.getCostType())) {
+            case COMMUNICATION:
+                CommunicationInfoEntity communicationInfoEntity = communicationMapper.findById(costInfo.getApplyCostId()).orElse(null);
+                ProjectInfoEntity projectInfoEntity = projectInfoMapper.findById(Integer.valueOf(communicationInfoEntity.getProjectName())).orElse(null);
+                communicationInfoEntity.setProjectName(projectInfoEntity.getProjectName());
+                return new ResMsg(CodeEnum.OK, communicationInfoEntity);
+            case PURCHASE:
+                PurchaseInfoEntity purchaseInfoEntity = purchaseInfoMapper.findById(costInfo.getApplyCostId()).orElse(null);
+                String purchaseMessage = purchaseInfoEntity.getPurchaseMessage();
+                PurchaseInfoVo purchaseInfoVo = new PurchaseInfoVo();
+                BeanUtils.copyProperties(purchaseInfoEntity, purchaseInfoVo);
+                List<PurchaseInfoVo.PurChaseMessage> purChaseMessages = JSON.parseArray(purchaseMessage, PurchaseInfoVo.PurChaseMessage.class);
+                ProjectInfoEntity projectInfoEntity1 = projectInfoMapper.findById(Integer.valueOf(purchaseInfoEntity.getProjectName())).orElse(null);
+                purchaseInfoVo.setProjectName(projectInfoEntity1.getProjectName());
+                purchaseInfoVo.setPurchaseMessage(purChaseMessages);
+                return new ResMsg(CodeEnum.OK, purchaseInfoVo);
+            case REST:
+                RestsInfoEntity restsInfoEntity = restInfoMapper.findById(costInfo.getApplyCostId()).orElse(null);
+                String restsMessage = restsInfoEntity.getRestsMessage();
+                RestsInfoVo restsInfoVo = new RestsInfoVo();
+                BeanUtils.copyProperties(restsInfoEntity, restsInfoVo);
+                List<RestsInfoVo.RestsMessage> restsMessages = JSON.parseArray(restsMessage, RestsInfoVo.RestsMessage.class);
+                ProjectInfoEntity projectInfoEntity2 = projectInfoMapper.findById(Integer.valueOf(restsInfoEntity.getProjectName())).orElse(null);
+                restsInfoVo.setProjectName(projectInfoEntity2.getProjectName());
+                restsInfoVo.setRestsMessage(restsMessages);
+                return new ResMsg(CodeEnum.OK, restsInfoVo);
+            case TRANSPORTATION:
+                TrafficExpenseEntity trafficExpenseEntity = trafficExpenseMapper.findById(costInfo.getApplyCostId()).orElse(null);
+                String subject = trafficExpenseEntity.getSubject();
+                TrafficExpenseVo trafficExpenseVo = new TrafficExpenseVo();
+                BeanUtils.copyProperties(trafficExpenseEntity, trafficExpenseVo);
+                List<TrafficExpenseVo.TrafficExpenseSubject> trafficExpenseSubjects = JSON.parseArray(subject, TrafficExpenseVo.TrafficExpenseSubject.class);
+                ProjectInfoEntity projectInfoEntity3 = projectInfoMapper.findById(Integer.valueOf(trafficExpenseEntity.getProjectName())).orElse(null);
+                trafficExpenseVo.setProjectName(projectInfoEntity3.getProjectName());
+                trafficExpenseVo.setSubject(trafficExpenseSubjects);
+                return new ResMsg(CodeEnum.OK, trafficExpenseVo);
+            case REPAST:
+                RepastExpenseEntity repastExpenseEntity = repastExpenseMapper.findById(costInfo.getApplyCostId()).orElse(null);
+                String subject1 = repastExpenseEntity.getSubject();
+                RepastExpenseVo repastExpenseVo = new RepastExpenseVo();
+                BeanUtils.copyProperties(repastExpenseEntity, repastExpenseVo);
+                List<RepastExpenseVo.RepastExpenseSubject> repastExpenseSubjects = JSON.parseArray(subject1, RepastExpenseVo.RepastExpenseSubject.class);
+                ProjectInfoEntity projectInfoEntity4 = projectInfoMapper.findById(Integer.valueOf(repastExpenseEntity.getProjectName())).orElse(null);
+                repastExpenseVo.setProjectName(projectInfoEntity4.getProjectName());
+                repastExpenseVo.setSubject(repastExpenseSubjects);
+                return new ResMsg(CodeEnum.OK, repastExpenseVo);
+            case TRAVEL:
+                TravelExpenseEntity travelExpenseEntity = travelExpenseMapper.findById(costInfo.getApplyCostId()).orElse(null);
+                String subject2 = travelExpenseEntity.getSubject();
+                TravelExpenseVo travelExpenseVo = new TravelExpenseVo();
+                BeanUtils.copyProperties(travelExpenseEntity, travelExpenseVo);
+                List<TravelExpenseVo.TravelExpenseSubject> travelExpenseSubjects = JSON.parseArray(subject2, TravelExpenseVo.TravelExpenseSubject.class);
+                ProjectInfoEntity projectInfoEntity5 = projectInfoMapper.findById(Integer.valueOf(travelExpenseEntity.getProjectName())).orElse(null);
+                travelExpenseVo.setProjectName(projectInfoEntity5.getProjectName());
+                travelExpenseVo.setSubject(travelExpenseSubjects);
+                return new ResMsg(CodeEnum.OK, travelExpenseVo);
+            default:
+                break;
+        }
+        return new ResMsg(CodeEnum.NO_DATA);
+    }
+
+    @Override
+    public ResMsg findProjectAuditList(Long id, UserInfoVo userInfoVo) {
+        Pageable page = PageRequest.of(userInfoVo.getPageIndex() - 1, userInfoVo.getPageSize());
+        Page<Map<String, String>> byPrintcipalEquals = projectAuditInfoMapper.findByPrintcipalEquals(id, page);
+        return new ResMsg(CodeEnum.OK, ResMsg.getMap(byPrintcipalEquals.map(map -> {
+            Map<Object, Object> map1 = new HashMap<>();
+            map1.putAll(map);
+            String projectId = map.get("projectName");
+            Optional<ProjectInfoEntity> byId = projectInfoMapper.findById(Integer.valueOf(projectId));
+            map1.put("projectName", byId.orElse(null) != null ? byId.orElse(null).getProjectName() : null);
+            return map1;
+        }).getContent(), byPrintcipalEquals.getTotalElements()));
+    }
+}

+ 285 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/FileUtil.java

@@ -0,0 +1,285 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service.impl;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.service.FileService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/27 17:36
+ */
+@Service
+public class FileUtil implements FileService {
+
+    /**
+     * 服务器地址
+     */
+    final String baseUrl = "http://124.70.58.209:8077/api";
+    /**
+     *本地地址
+     */
+    //final String baseUrl="http://localhost:8077/api";
+    /**
+     * 服务器存储路径
+     */
+    final String basePath = "/data/ankaibei/upload/";
+    /**
+     * 上传服务器的映射路径
+     */
+    final String staticAccessPath = "/static/";
+    /**
+     * 本地存储路径
+     */
+    String locationPath = "D:/upload/";
+
+    /**
+     * 上传单图片
+     *
+     * @param (用类名即可,第一个字母改为小写,如一个类有单图片和多图片,多加个字段名) 例如:/account/img    or    /account/imgList
+     * @param voFile                                上传图片
+     * @return
+     */
+    @Override
+    public String uploadOne(MultipartFile voFile) throws FileNotFoundException {
+        File file = new File(basePath);
+        //文件夹不存在
+        if (!file.exists()) {
+            //创建文件夹
+            file.mkdirs();
+        }
+        //文件输出流
+        FileOutputStream fileOutputStream = null;
+        //缓冲输出流
+        BufferedOutputStream bufferedOutputStream = null;
+        //前端限制好,图片为空不让上传
+        //获取前端的图片文件
+//		MultipartFile voFile=vo.getImg();
+        //要上传的图片文件
+        File imgFile = null;
+        //要上传的图片名
+        String imgName = null;
+        //上传后图片的url
+        String imgUrl = null;
+        try {
+            //获取图片二进制数据
+            byte[] bytes = voFile.getBytes();
+            imgName = UUID.randomUUID() + ".jpg";
+            imgFile = new File(file, imgName);
+            //文件输出流对象
+            fileOutputStream = new FileOutputStream(imgFile);
+            //缓冲流对象
+            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+            //将图片数据写入文件
+            bufferedOutputStream.write(bytes);
+            //数据推出管道流
+            bufferedOutputStream.flush();
+            //关闭输出流
+            bufferedOutputStream.close();
+            //将图片的url写到类中
+            imgUrl = baseUrl + staticAccessPath + imgName;
+            return imgUrl;
+        } catch (IOException e) {//发生IO异常
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 上传列表图片
+     *
+     * @param (用类名即可,第一个字母改为小写,如一个类有单图片和多图片,多加个字段名) 例如:/account/img    or    /account/imgList
+     * @param voFileList                            上传图片列表
+     * @return
+     */
+    @Override
+    public List<String> uploadList(List<MultipartFile> voFileList) {
+        File file = new File(basePath);
+        //File file=new File(locationPath);
+        if (!file.exists()) {//文件夹不存在
+            file.mkdirs();//创建文件夹
+        }
+        //文件输出流
+        FileOutputStream fileOutputStream = null;
+        //缓冲输出流
+        BufferedOutputStream bufferedOutputStream = null;
+        //前端限制好,图片为空不让上传
+        //获取前端的图片文件
+//		MultipartFile voFile=vo.getImg();
+        //要上传的图片文件
+        File imgFile = null;
+        //要上传的图片名
+        String imgName = null;
+        //上传后图片的url
+        String imgUrl = null;
+        //单个文件
+        MultipartFile voFile = null;
+        //图片地址列表
+        List<String> imgUrlList = new ArrayList<>();
+        try {
+            for (int i = 0; i < voFileList.size(); i++) {
+                voFile = voFileList.get(i);
+                //获取图片二进制数据
+                byte[] bytes = voFile.getBytes();
+                imgName = UUID.randomUUID() + ".jpg";
+                imgFile = new File(file, imgName);
+                //文件输出流对象
+                fileOutputStream = new FileOutputStream(imgFile);
+                //缓冲流对象
+                bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+                //将图片数据写入文件
+                bufferedOutputStream.write(bytes);
+                //数据推出管道流
+                bufferedOutputStream.flush();
+                //关闭输出流
+                bufferedOutputStream.close();
+                //将图片的url写到类中
+                imgUrl = baseUrl + staticAccessPath + imgName;
+                imgUrlList.add(imgUrl);
+            }
+            return imgUrlList;
+        } catch (IOException e) {//发生IO异常
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 上传列表图片
+     *
+     * @param filePath   上传地址(用类名即可,第一个字母改为小写,如一个类有单图片和多图片,多加个字段名)
+     *                   例如:/account/img    or    /account/imgList
+     * @param voFileList 上传图片列表
+     * @return String类型,中间用;分割   注意!mysql表专用
+     */
+    @Override
+    public String uploadListReturnStr(String filePath, List<MultipartFile> voFileList) {
+        File file = new File(basePath + filePath);
+        if (!file.exists()) {//文件夹不存在
+            file.mkdirs();//创建文件夹
+        }
+        //文件输出流
+        FileOutputStream fileOutputStream = null;
+        //缓冲输出流
+        BufferedOutputStream bufferedOutputStream = null;
+        //前端限制好,图片为空不让上传
+        //获取前端的图片文件
+//		MultipartFile voFile=vo.getImg();
+        //要上传的图片文件
+        File imgFile = null;
+        //要上传的图片名
+        String imgName = null;
+        //上传后图片的url
+        String imgUrl = null;
+        //单个文件
+        MultipartFile voFile = null;
+        //图片地址列表
+        String imgUrlList = "";
+        try {
+            for (int i = 0; i < voFileList.size(); i++) {
+                voFile = voFileList.get(i);
+                //获取图片二进制数据
+                byte[] bytes = voFile.getBytes();
+                imgName = UUID.randomUUID() + ".jpg";
+                imgFile = new File(file, imgName);
+                //文件输出流对象
+                fileOutputStream = new FileOutputStream(imgFile);
+                //缓冲流对象
+                bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+                //将图片数据写入文件
+                bufferedOutputStream.write(bytes);
+                //数据推出管道流
+                bufferedOutputStream.flush();
+                //关闭输出流
+                bufferedOutputStream.close();
+                //将图片的url写到类中
+                imgUrl = baseUrl + filePath + "/" + imgName;
+                imgUrlList = imgUrlList + ";" + imgUrl;
+            }
+            return imgUrlList;
+        } catch (IOException e) {//发生IO异常
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 根据url删除单文件
+     *
+     * @param fileUrl 文件路径
+     * @return
+     */
+    @Override
+    public boolean deleteFile(String fileUrl) {
+        String path = getPath(fileUrl);
+        File file = null;
+        try {
+            file = new File(path);
+            file.delete();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 根据文件url删除文件集合
+     *
+     * @param fileUrlList
+     * @return
+     */
+    @Override
+    public boolean deleteFileList(List<String> fileUrlList) {
+        File file = null;
+        List<String> pathList = getPathList(fileUrlList);
+        if (pathList == null) {
+            return false;
+        }
+        for (String path : pathList) {
+            try {
+                file = new File(path);
+                file.delete();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 根据url转换成文件路径
+     *
+     * @param url
+     * @return
+     */
+    private String getPath(String url) {
+        //找到端口号所在下标,并移位至端口号之后
+        int i = url.indexOf(":8989") + 5;
+        //文件相对路径
+        String relativePath = url.substring(i);
+        String path = basePath + relativePath;
+        return path;
+    }
+
+    /**
+     * 根据url集合返回path集合
+     *
+     * @param urlList
+     * @return
+     */
+    private List<String> getPathList(List<String> urlList) {
+        List<String> pathList = new ArrayList<>();
+        for (String url : urlList) {
+            pathList.add(getPath(url));
+        }
+        return pathList;
+    }
+}

+ 50 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/LoginServiceImpl.java

@@ -0,0 +1,50 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service.impl;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.LoginTokenEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.UserInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.LoginTokenMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.UserInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.LoginService;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.JwtUtil;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ReturnToken;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/5 14:18
+ */
+@Service
+public class LoginServiceImpl implements LoginService {
+
+    @Resource
+    private UserInfoMapper loginMapper;
+    @Resource
+    private LoginTokenMapper loginTokenMapper;
+
+    @Override
+    public ResMsg login(UserInfoEntity userInfoEntity) {
+//
+//         List<UserInfoEntity> user = loginMapper.findByUserAcctEqualsAndUserStatusIsNot(userInfoEntity.getLoginName(),0);
+//        if(user.size()==0){
+//            return new ResMsg(CodeEnum.ACCOUNT_NO_PASSWORD_ERROR);
+//        }
+//        if(user.size()>1){
+//            return new ResMsg(CodeEnum.MULTIPLE_DUPLICATE_ACCOUNTS_ARE_FOUND);
+//        }
+//        UserInfoEntity userInfo = user.get(0);
+//        if(userInfoEntity.getPassword().equals(userInfo.getPassword())){
+//
+////            String token = JwtUtil.createTokenVo(userInfo.getLoginName(), userInfo.getUserId());
+////            loginTokenMapper.save(new LoginTokenEntity(userInfo.getUserId(),token));
+//            return new ResMsg(CodeEnum.OK);
+//        }
+        return new ResMsg(CodeEnum.ACCOUNT_NO_PASSWORD_ERROR);
+    }
+}

+ 143 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/ManHourServiceImpl.java

@@ -0,0 +1,143 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ankaibei.workFlow.common.core.object.ResponseResult;
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.common.flow.constant.FlowConstant;
+import com.ankaibei.workFlow.common.flow.constant.FlowTaskStatus;
+import com.ankaibei.workFlow.common.flow.dto.FlowTaskCommentDto;
+import com.ankaibei.workFlow.common.flow.model.FlowEntry;
+import com.ankaibei.workFlow.common.flow.model.FlowEntryPublish;
+import com.ankaibei.workFlow.common.flow.online.controller.FlowOnlineOperationController;
+import com.ankaibei.workFlow.common.flow.util.FlowOperationHelper;
+import com.ankaibei.workFlow.common.flow.vo.TaskInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.*;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.*;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.ManHourService;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.FlowTaskStart;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ManHourInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/21 15:33
+ */
+@Service
+public class ManHourServiceImpl implements ManHourService {
+
+    @Resource
+    private ManHourMapper manHourMapper;
+    @Autowired
+    private FlowTaskStart flowTaskStart;
+    @Resource
+    private UserInfoMapper userInfoMapper;
+    @Resource
+    private ManHourJobMapper manHourJobMapper;
+    @Resource
+    private ProjectInfoMapper projectInfoMapper;
+
+    @Override
+    public ResMsg findManHourAll(Integer pageIndex, Integer pageSize, ManHourInfoEntity manHourInfoEntity) {
+        Pageable page = PageRequest.of(pageIndex - 1, pageSize);
+        String endDate = null;
+        if (manHourInfoEntity.getEndDate() != null) {
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            endDate = dateFormat.format(manHourInfoEntity.getEndDate()) + " 23:59:59";
+        }
+
+        Page<Map<String, String>> manHourAll = manHourMapper.findManHourAll(manHourInfoEntity.getFlowTaskStatus(), manHourInfoEntity.getCreateDate(), endDate, page);
+        return new ResMsg(CodeEnum.OK, ResMsg.getMap(manHourAll.map(map -> {
+            Map<Object, Object> map1 = new HashMap<>();
+            map1.putAll(map);
+            String projectId = map.get("projectName");
+            Optional<ProjectInfoEntity> byId = projectInfoMapper.findById(Integer.valueOf(projectId));
+            map1.put("projectName", byId.orElse(null) != null ? byId.orElse(null).getProjectName() : null);
+            return map1;
+        }).getContent(), manHourAll.getTotalElements()));
+    }
+
+    @Override
+    public ResMsg addManHour(String projectId, ManHourInfoEntity manHourInfoEntity, List<ManHourJobInfo> manHours) {
+        Optional<UserInfoEntity> byId1 = userInfoMapper.findById(manHourInfoEntity.getCreateUser());
+        manHourInfoEntity.setProjectName(projectId);
+        manHourInfoEntity.setProjectUser(byId1.orElse(null) != null ? byId1.orElse(null).getShowName() : null);
+        //manHourInfoEntity.setManStatus("1");
+
+        /**
+         * 调用人员工时申请流程的启动
+         * 获取流程开始节点之后的第一个任务节点的数据
+         * param processDefinitionKey 项目人员工时接口审批流程--流程标识。
+         */
+        String processDefinitionKey = "manHourCountApply";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("project_user", manHourInfoEntity.getProjectUser());
+        stringObjectHashMap.put("project_name", manHourInfoEntity.getProjectName());
+        stringObjectHashMap.put("man_hour", "总计**时");
+        stringObjectHashMap.put("create_date", manHourInfoEntity.getCreateDate());
+        stringObjectHashMap.put("create_user", manHourInfoEntity.getCreateUser());
+        stringObjectHashMap.put("man_id", manHourInfoEntity.getManId());
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, null, masterData, null, null).getData();
+
+        manHourInfoEntity.setProcessInstanceId(map.get("processInstanceId"));
+        manHourInfoEntity.setProcessDefinitionId(map.get("processDefinitionId"));
+        manHourInfoEntity.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        BigDecimal day = new BigDecimal(0);
+        for (ManHourJobInfo manHour : manHours) {
+            day = day.add(manHour.getDay());
+        }
+        manHourInfoEntity.setManHour(day);
+        manHourInfoEntity.setCreateTime(new Date());
+        ManHourInfoEntity save = manHourMapper.save(manHourInfoEntity);
+        for (ManHourJobInfo manHour : manHours) {
+            manHour.setManId(save.getManId());
+            manHourJobMapper.save(manHour);
+        }
+
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg deleteManHour(List<ManHourInfoVo> manHourInfoVos) {
+
+        for (ManHourInfoVo info : manHourInfoVos) {
+            manHourMapper.deleteById(info.getManId());
+            manHourJobMapper.deleteByManIdEquals(info.getManId());
+        }
+
+        return null;
+    }
+
+}

+ 452 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/ProjectInfoServiceImpl.java

@@ -0,0 +1,452 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ankaibei.workFlow.common.core.object.ResponseResult;
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.common.flow.constant.FlowConstant;
+import com.ankaibei.workFlow.common.flow.constant.FlowTaskStatus;
+import com.ankaibei.workFlow.common.flow.dto.FlowTaskCommentDto;
+import com.ankaibei.workFlow.common.flow.model.FlowEntry;
+import com.ankaibei.workFlow.common.flow.model.FlowEntryPublish;
+import com.ankaibei.workFlow.common.flow.vo.TaskInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.*;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.ProjectPeriodEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.ProjectStatusEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.*;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.ProjectInfoService;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.FlowTaskStart;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.EchartsEntityVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ProjectInfoVo;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.upms.dao.SysDeptMapper;
+import com.ankaibei.workFlow.webadmin.upms.model.SysDept;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 11:13
+ */
+@Service
+public class ProjectInfoServiceImpl implements ProjectInfoService {
+
+    @Resource
+    private ProjectInfoMapper projectInfoMapper;
+    @Resource
+    private UserInfoMapper userInfoMapper;
+    @Resource
+    private SysDeptMapper sysDeptMapper;
+    @Resource
+    private AccesoryInfoMapper accesoryInfoMapper;
+    @Resource
+    private ProjectAuditInfoMapper projectAuditInfoMapper;
+    @Autowired
+    private FlowTaskStart flowTaskStart;
+
+
+    @Override
+    public ResMsg findProjectInfo(Integer pageIndex, Integer pageSize, ProjectInfoEntity projectInfoEntity) {
+        Pageable page = PageRequest.of(pageIndex - 1, pageSize);
+        Page<Map<String, String>> projectInfo = projectInfoMapper.findProjectInfo(projectInfoEntity.getProjectStatus(), projectInfoEntity.getProjectName(), page);
+        return new ResMsg(CodeEnum.OK, ResMsg.getMap(projectInfo.map(map -> {
+            Map<Object, Object> map1 = new HashMap<>();
+            map1.putAll(map);
+            UserInfoEntity userInfoEntity = userInfoMapper.findByUserIdEquals((map.get("projectPrincipal")));
+            map1.put("projectPrincipal", userInfoEntity != null ? userInfoEntity.getShowName() : null);
+            String projectStage = map.get("projectStage");
+            switch (ProjectPeriodEnum.getEnumByCode(projectStage)) {
+                case BUSINESS_RESEARCHB:
+                    map1.put("projectStage", ProjectPeriodEnum.BUSINESS_RESEARCHB.getReason());
+                    break;
+                case PRE_SALES:
+                    map1.put("projectStage", ProjectPeriodEnum.PRE_SALES.getReason());
+                    break;
+                case PROJECT_START:
+                    map1.put("projectStage", ProjectPeriodEnum.PROJECT_START.getReason());
+                    break;
+                case DELIVERY:
+                    map1.put("projectStage", ProjectPeriodEnum.DELIVERY.getReason());
+                    break;
+                case CHECK_AND_ACCEPT:
+                    map1.put("projectStage", ProjectPeriodEnum.CHECK_AND_ACCEPT.getReason());
+                    break;
+                case POST_PROJECT_THE_RECEIVABLE:
+                    map1.put("projectStage", ProjectPeriodEnum.POST_PROJECT_THE_RECEIVABLE.getReason());
+                    break;
+                case CLOSE:
+                    map1.put("projectStage", ProjectPeriodEnum.CLOSE.getReason());
+                    break;
+                default:
+                    break;
+            }
+            String projectStatus = (String) map.get("projectStatus");
+            switch (ProjectStatusEnum.getEnumByCode(projectStatus)) {
+                case NORMAL:
+                    map1.put("projectStatus", ProjectStatusEnum.NORMAL.getReason());
+                    break;
+                case POSTPONE:
+                    map1.put("projectStatus", ProjectStatusEnum.POSTPONE.getReason());
+                    break;
+                case CANCEL:
+                    map1.put("projectStatus", ProjectStatusEnum.CANCEL.getReason());
+                    break;
+                case RISKY:
+                    map1.put("projectStatus", ProjectStatusEnum.RISKY.getReason());
+                    break;
+                case OUT_OF_CONTROL:
+                    map1.put("projectStatus", ProjectStatusEnum.OUT_OF_CONTROL.getReason());
+                    break;
+                default:
+                    break;
+            }
+            return map1;
+        }).getContent(), projectInfo.getTotalElements()));
+    }
+
+    @Override
+    public ResMsg findProjectInfoAll(String projectName) {
+        List<ProjectInfoEntity> all = projectInfoMapper.findAllByProjectName(projectName);
+        return new ResMsg(CodeEnum.OK, all);
+    }
+
+    @Override
+    public ResMsg findProjectParticulars(ProjectInfoEntity projectInfoEntity) {
+        Optional<ProjectInfoEntity> byId = projectInfoMapper.findById(projectInfoEntity.getProjectId());
+        ProjectInfoEntity projectInfoEntity1 = byId.orElse(null);
+        Optional<UserInfoEntity> projectPrincipal = userInfoMapper.findById(projectInfoEntity1.getProjectPrincipal());
+        UserInfoEntity userInfoEntity = projectPrincipal.orElse(null);
+        projectInfoEntity1.setProjectPrincipal(userInfoEntity != null ? userInfoEntity.getShowName() : null);
+        return new ResMsg(CodeEnum.OK, projectInfoEntity1);
+    }
+
+    @Override
+    public ResMsg addProject(ProjectInfoEntity projectInfoEntity) {
+        List<ProjectInfoEntity> all = projectInfoMapper.findAll();
+        for (ProjectInfoEntity pro : all) {
+            if (projectInfoEntity.getProjectName().equals(pro.getProjectName())) {
+                return new ResMsg(CodeEnum.TNE_PROJECT_NAME_ALREADY_EXISTS);
+            }
+        }
+        projectInfoEntity.setProjectStage(ProjectPeriodEnum.BUSINESS_RESEARCHB.getCode());
+        projectInfoEntity.setProjectStatus(ProjectStatusEnum.NORMAL.getCode());
+        projectInfoEntity.setCreateDate(new Date());
+
+        /**
+         *调用新增项目信息申请流程的启动
+         *获取流程开始节点之后的第一个任务节点的数据
+         *param processDefinitionKey 新建项目信息审批流程--流程标识。
+         */
+        String processDefinitionKey = "ProjectAddApplyFlow";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("project_name", projectInfoEntity.getProjectName());
+        stringObjectHashMap.put("project_stage", projectInfoEntity.getProjectStage());
+        stringObjectHashMap.put("project_status", projectInfoEntity.getProjectStatus());
+        stringObjectHashMap.put("project_type", projectInfoEntity.getProjectType());
+        stringObjectHashMap.put("relevance_client", projectInfoEntity.getRelevanceClient());
+        stringObjectHashMap.put("peoject_money", projectInfoEntity.getPeojectMoney());
+        stringObjectHashMap.put("staff_cost", projectInfoEntity.getStaffCost());
+        stringObjectHashMap.put("project_cost", projectInfoEntity.getProjectCost());
+        stringObjectHashMap.put("total_cost", projectInfoEntity.getTotalCost());
+        stringObjectHashMap.put("linkman_phone", projectInfoEntity.getLinkmanPhone());
+        stringObjectHashMap.put("project_principal", projectInfoEntity.getProjectPrincipal());
+        stringObjectHashMap.put("project_node", projectInfoEntity.getProjectNode());
+        stringObjectHashMap.put("project_describe", projectInfoEntity.getProjectDescribe());
+        stringObjectHashMap.put("create_date", projectInfoEntity.getCreateDate());
+        ProjectInfoEntity save = projectInfoMapper.save(projectInfoEntity);
+        stringObjectHashMap.put("project_id", save.getProjectId());
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, null, masterData, null, null).getData();
+        save.setProcessDefinitionId(map.get("processDefinitionId"));
+        save.setProcessInstanceId(map.get("processInstanceId"));
+        save.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        save.setIsDelete("1");
+        projectInfoMapper.save(save);
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg updateProject(ProjectInfoEntity projectInfoEntity) {
+
+        projectInfoMapper.updateProject(projectInfoEntity.getProjectStage(), projectInfoEntity.getProjectStatus(), projectInfoEntity.getProjectId());
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg deleteProjects(List<ProjectInfoVo> projectInfoVos) {
+        //审批状态   已提交:0; 审批中:1; 被拒绝:2; 已结束:3; 提前停止:4; 已取消:5;
+        StringBuffer optional = new StringBuffer("项目:[");
+        int count = 0;
+        for (ProjectInfoVo info : projectInfoVos) {
+            ProjectInfoEntity byId = projectInfoMapper.getById(info.getProjectId());
+            if (byId.getFlowTaskStatus() > 1) {
+                projectInfoMapper.deleteProject(info.getProjectId());
+                count++;
+            } else {
+                optional.append(byId.getProjectName() + ",");
+            }
+        }
+        optional.replace(optional.length() - 1, optional.length(), "");
+        optional.append("] 审批未结束,不可删除!");
+        if (count == projectInfoVos.size()) {
+            return new ResMsg(CodeEnum.OK, "");
+        } else {
+            return new ResMsg(CodeEnum.FAIL, optional);
+        }
+    }
+
+    @Override
+    public ResMsg findPrincipalProject(String userId) {
+        //审批状态   已提交:0; 审批中:1; 被拒绝:2; 已结束:3; 提前停止:4; 已取消:5;
+        List<ProjectInfoEntity> byProjectPrincipalEquals = projectInfoMapper.findByProjectPrincipalEqualsAndIsDeleteEquals(userId, "1");
+
+        return new ResMsg(CodeEnum.OK, byProjectPrincipalEquals);
+    }
+
+    @Override
+    public ResMsg findAccesoryInfo(ProjectInfoEntity projectInfoEntity) {
+        List<AccesoryInfoEntity> byProjectIdEquals = accesoryInfoMapper.findByProjectIdEquals(String.valueOf(projectInfoEntity.getProjectId()));
+        return new ResMsg(CodeEnum.OK, byProjectIdEquals.get(0));
+    }
+
+    @Override
+    public ResMsg findProjectNumber() {
+        String startDate = getMonthDayOne();
+        String endDate = getToDay();
+        List<String> twoDaysDayDes = getTwoDaysDayDes(startDate, endDate);
+        List<Map<String, Object>> projectNumber = projectInfoMapper.findProjectNumber(twoDaysDayDes);
+        List<EchartsEntityVo> listDate = new ArrayList<>();
+        for (String list : twoDaysDayDes) {
+            EchartsEntityVo echartsEntity = new EchartsEntityVo();
+            echartsEntity.setTime(list);
+            boolean b = false;
+            for (Map<String, Object> num : projectNumber) {
+                if (list.equals(num.get("time"))) {
+                    echartsEntity.setNum(Integer.parseInt(num.get("num").toString()));
+                    listDate.add(echartsEntity);
+                    b = true;
+                    break;
+                }
+            }
+            if (!b) {
+                echartsEntity.setNum(0);
+                listDate.add(echartsEntity);
+            }
+        }
+        return new ResMsg(CodeEnum.OK, listDate);
+    }
+
+    @Override
+    public ResMsg substepOfProjectNum() {
+        //当月第一天         年--月--日
+        String startDate = getMonthDayOne();
+        //今日              年--月--日
+        String endDate = getToDay();
+        List<Map<String, Object>> projectNumber = projectInfoMapper.getProjectNumberOfMonth(startDate + " 00:00:00", endDate + " 23:59:59");
+        //获取姓名负责人。再查负责人所在公司
+        List<String> deptNameList = new ArrayList<>();
+        for (Map<String, Object> map : projectNumber) {
+            String projectPrincipal = map.get("projectPrincipal").toString();
+            UserInfoEntity byId = userInfoMapper.getById(projectPrincipal);
+            //部门上一级就是公司级别;
+            SysDept dept = sysDeptMapper.selectById(byId.getDeptId());
+            if (dept.getParentId() != null) {
+                SysDept sysDept = sysDeptMapper.selectById(dept.getParentId());
+                deptNameList.add(sysDept.getDeptName());
+            } else {
+                deptNameList.add(dept.getDeptName());
+            }
+        }
+        //统计数量
+        Map map = countListItemNum(deptNameList);
+        List<EchartsEntityVo> listDate = new ArrayList<>();
+        Set keyset = map.keySet();
+        for (Object key : keyset) {
+            EchartsEntityVo echartsVo = new EchartsEntityVo();
+            echartsVo.setDeptName(key.toString());
+            echartsVo.setNum(Integer.parseInt(map.get(key).toString()));
+            listDate.add(echartsVo);
+            System.out.println(key + "-" + map.get(key));
+        }
+        return new ResMsg(CodeEnum.OK, listDate);
+    }
+
+    @Override
+    public ResMsg findLastMonthProjectNumber() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar cal_1 = Calendar.getInstance();
+        cal_1.add(Calendar.MONTH, -1);
+        cal_1.set(Calendar.DAY_OF_MONTH, 1);
+        cal_1.set(Calendar.HOUR_OF_DAY, 0);
+        cal_1.set(Calendar.MINUTE, 0);
+        cal_1.set(Calendar.SECOND, 0);
+        //获取上个月第一天
+        String firstDay = format.format(cal_1.getTime());
+        Calendar cal_2 = Calendar.getInstance();
+        cal_2.set(Calendar.DAY_OF_MONTH, 0);
+        cal_2.set(Calendar.HOUR_OF_DAY, 23);
+        cal_2.set(Calendar.MINUTE, 59);
+        cal_2.set(Calendar.SECOND, 59);
+        //获取上个月最后一天
+        String lastDay = format.format(cal_2.getTime());
+        List<String> twoDaysDayDes = getTwoDaysDayDes(firstDay, lastDay);
+        List<Map<String, Object>> projectNumber = projectInfoMapper.findProjectNumber(twoDaysDayDes);
+        List<EchartsEntityVo> listDate = new ArrayList<>();
+        for (String list : twoDaysDayDes) {
+            EchartsEntityVo echartsEntity = new EchartsEntityVo();
+            echartsEntity.setTime(list);
+            boolean b = false;
+            for (Map<String, Object> num : projectNumber) {
+                if (list.equals(num.get("time"))) {
+                    echartsEntity.setNum(Integer.parseInt(num.get("num").toString()));
+                    listDate.add(echartsEntity);
+                    b = true;
+                    break;
+                }
+            }
+            if (!b) {
+                echartsEntity.setNum(0);
+                listDate.add(echartsEntity);
+            }
+        }
+        return new ResMsg(CodeEnum.OK, listDate);
+    }
+
+    @Override
+    public ResMsg substepOfProjectNumAtLastMonth() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        //获取上个月第一天
+        Calendar cal_1 = Calendar.getInstance();
+        cal_1.add(Calendar.MONTH, -1);
+        cal_1.set(Calendar.DAY_OF_MONTH, 1);
+        cal_1.set(Calendar.HOUR_OF_DAY, 0);
+        cal_1.set(Calendar.MINUTE, 0);
+        cal_1.set(Calendar.SECOND, 0);
+        String firstDay = format.format(cal_1.getTime());
+        //获取上个月最后一天
+        Calendar cal_2 = Calendar.getInstance();
+        cal_2.set(Calendar.DAY_OF_MONTH, 0);
+        cal_2.set(Calendar.HOUR_OF_DAY, 23);
+        cal_2.set(Calendar.MINUTE, 59);
+        cal_2.set(Calendar.SECOND, 59);
+        String lastDay = format.format(cal_2.getTime());
+        List<Map<String, Object>> projectNumber = projectInfoMapper.getProjectNumberOfMonth(firstDay + " 00:00:00", lastDay + " 23:59:59");
+        //获取项目负责人。再查负责人所在公司
+        List<String> deptNameList = new ArrayList<>();
+        for (Map<String, Object> map : projectNumber) {
+            String projectPrincipal = map.get("projectPrincipal").toString();
+            UserInfoEntity byId = userInfoMapper.getById(projectPrincipal);
+            //部门上一级就是公司级别;
+            SysDept dept = sysDeptMapper.selectById(byId.getDeptId());
+            if (dept.getParentId() != null) {
+                SysDept sysDept = sysDeptMapper.selectById(dept.getParentId());
+                deptNameList.add(sysDept.getDeptName());
+            } else {
+                deptNameList.add(dept.getDeptName());
+            }
+        }
+        //统计数量
+        Map map = countListItemNum(deptNameList);
+        List<EchartsEntityVo> listDate = new ArrayList<>();
+        Set keyset = map.keySet();
+        for (Object key : keyset) {
+            EchartsEntityVo echartsVo = new EchartsEntityVo();
+            echartsVo.setDeptName(key.toString());
+            echartsVo.setNum(Integer.parseInt(map.get(key).toString()));
+            listDate.add(echartsVo);
+            System.out.println(key + "-" + map.get(key));
+        }
+        return new ResMsg(CodeEnum.OK, listDate);
+    }
+
+    /**
+     * 获取一段时间内每一天的日期
+     */
+    private static List<String> getTwoDaysDayDes(String startDate, String endDate) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        List<String> dateList = new ArrayList<>();
+        try {
+            Date dateOne = sdf.parse(startDate);
+            Date dateTwo = sdf.parse(endDate);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(dateOne);
+            dateList.add(startDate);
+            while (dateTwo.after(calendar.getTime())) {
+                calendar.add(Calendar.DAY_OF_MONTH, 1);
+                dateList.add(sdf.format(calendar.getTime()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dateList;
+    }
+
+    /**
+     * 获取当月第一天
+     */
+    private static String getMonthDayOne() {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        String startDay = df.format(new Date());
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Integer.parseInt(startDay.substring(0, 4)), Integer.parseInt(startDay.substring(5, 7)) - 1, 1);
+        String firstDayOfMonth = new SimpleDateFormat("yyyy-MM-dd ").format(calendar.getTime());
+        return firstDayOfMonth;
+    }
+
+    /**
+     * 获取当天日期
+     */
+    private static String getToDay() {
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        String startDay = df.format(new Date());
+        return startDay;
+    }
+
+    /**
+     * 使用Lambda表达式实现过滤统计
+     */
+    public Map countListItemNum(List list) {
+// 使用Map存储List中每个元素的数量:key:元素   value:数量
+        Map result = new HashMap<>();
+        list.forEach(item -> {
+            long count = list.stream().filter(f ->
+                    item.equals(f)).count();
+            result.put(item, count);
+        });
+//// 遍历结果map
+//        result.forEach((k, v) -> {
+//            System.out.println(k + ":" + v);
+//        });
+        return result;
+    }
+
+
+}

+ 242 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/ProjectTeamServiceImpl.java

@@ -0,0 +1,242 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service.impl;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectTeamInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.RelevanceProjectInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.UserInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.ProjectInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.ProjectTeamMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.RelevanceProjectInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.UserInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.ProjectTeamService;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.upms.controller.SysUserController;
+import com.ankaibei.workFlow.webadmin.upms.vo.SysUserVo;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/13 10:26
+ */
+@Service
+public class ProjectTeamServiceImpl implements ProjectTeamService {
+
+    @Resource
+    private ProjectTeamMapper projectTeamMapper;
+    @Resource
+    private UserInfoMapper userInfoMapper;
+    @Resource
+    private RelevanceProjectInfoMapper relevanceProjectInfoMapper;
+    @Resource
+    private ProjectInfoMapper projectInfoMapper;
+    @Resource
+    private SysUserController sysUserController;
+
+
+    @Override
+    public ResMsg findProjectTeamAll(Integer pageIndex, Integer pageSize, ProjectTeamInfoEntity projectTeamInfoEntity) {
+        Pageable page = PageRequest.of(pageIndex - 1, pageSize);
+        Page<ProjectTeamInfoEntity> all;
+        if (StringUtils.isBlank(projectTeamInfoEntity.getProjectTeamName())) {
+            all = projectTeamMapper.findAll(page);
+        } else {
+            all = projectTeamMapper.findAllByProjectTeamNameLike(projectTeamInfoEntity.getProjectTeamName(), page);
+        }
+        return new ResMsg(CodeEnum.OK, ResMsg.getMap(all.map(map -> {
+            Optional<ProjectInfoEntity> byId = projectInfoMapper.findById(Integer.valueOf(map.getProjectId()));
+            ProjectInfoEntity projectInfoEntity = byId.orElse(null);
+            map.setProjectName(projectInfoEntity != null ? projectInfoEntity.getProjectName() : null);
+            return map;
+        }).getContent(), all.getTotalElements()));
+    }
+
+    @Override
+    public ResMsg findProjectTeamUser(Integer pageIndex, Integer pageSize, Integer projectTeamId) {
+        Pageable page = PageRequest.of(pageIndex - 1, pageSize);
+        Page<Map<String, Integer>> byProjectTeamIdEquals = relevanceProjectInfoMapper.findByProjectTeamIdEquals(String.valueOf(projectTeamId), page);
+        ArrayList<String> list = new ArrayList<>();
+        byProjectTeamIdEquals.map(map -> {
+            list.add(String.valueOf(map.get("userId")));
+            return null;
+        });
+        List<SysUserVo> userList = new ArrayList<>();
+        for (String str : list) {
+            userList.add(sysUserController.view(str).getData());
+        }
+        return new ResMsg(CodeEnum.OK, ResMsg.getMap(userList, byProjectTeamIdEquals.getTotalElements()));
+    }
+
+    @Override
+    public boolean deleteBatch(List<ProjectTeamInfoEntity> projectTeamInfoVos) {
+        for (ProjectTeamInfoEntity info : projectTeamInfoVos) {
+            projectTeamMapper.deleteById(info.getProjectTeamId());
+        }
+        return true;
+    }
+
+    @Override
+    public ResMsg updateProjectTeam(ProjectTeamInfoEntity projectTeamInfoEntity) {
+        List<ProjectTeamInfoEntity> all = projectTeamMapper.findAll();
+        for (ProjectTeamInfoEntity project : all) {
+            if (projectTeamInfoEntity.getProjectTeamName().equals(project.getProjectTeamName()) && !projectTeamInfoEntity.getProjectTeamId().equals(project.getProjectTeamId())) {
+                return new ResMsg(CodeEnum.TNE_PROJECT_TEAM_NAME_ALREADY_EXISTS);
+            }
+            if (projectTeamInfoEntity.getProjectTeamId().equals(project.getProjectTeamId())) {
+                project.setProjectTeamName(projectTeamInfoEntity.getProjectTeamName());
+                projectTeamMapper.save(project);
+            }
+
+        }
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public boolean deleteBatchUser(List<UserInfoEntity> userInfoEntities) {
+        for (UserInfoEntity info : userInfoEntities) {
+            userInfoMapper.deleteById(info.getUserId());
+        }
+        return true;
+    }
+
+    @Override
+    public ResMsg addUser(UserInfoEntity userInfoEntity) {
+        List<UserInfoEntity> all = userInfoMapper.findAll();
+//        for (UserInfoEntity info:all) {
+//            if(userInfoEntity.getJobNumber().equals(info.getJobNumber())){
+//                return new ResMsg(CodeEnum.THE_JOB_ID_ALREADY_EXISTS);
+//            }
+//            if(userInfoEntity.getUserPhone().equals(info.getUserPhone())){
+//                return new ResMsg(CodeEnum.PHONE_ALREADY_EXISTS);
+//            }
+//        }
+//        userInfoEntity.setCreateDate(new Date());
+        userInfoEntity.setUserStatus(1);
+        userInfoMapper.save(userInfoEntity);
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg updateUser(UserInfoEntity userInfoEntity) {
+//        List<UserInfoEntity> all = userInfoMapper.findAll();
+//        for (UserInfoEntity info:all) {
+//            if(userInfoEntity.getJobNumber().equals(info.getJobNumber()) && !userInfoEntity.getUserId().equals(info.getUserId())){
+//                return new ResMsg(CodeEnum.THE_JOB_ID_ALREADY_EXISTS);
+//            }
+//            if(userInfoEntity.getUserPhone().equals(info.getUserPhone()) && !userInfoEntity.getUserId().equals(info.getUserId())){
+//                return new ResMsg(CodeEnum.PHONE_ALREADY_EXISTS);
+//            }
+//            if(userInfoEntity.getUserId().equals(info.getUserId())){
+//                userInfoEntity.setCreateDate(new Date());
+//                userInfoMapper.save(userInfoEntity);
+//            }
+//        }
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg findById(Long userId) {
+        UserInfoEntity byUserIdEquals = userInfoMapper.findByUserIdEquals(String.valueOf(userId));
+        return new ResMsg(CodeEnum.OK, byUserIdEquals);
+    }
+
+    @Override
+    public ResMsg findPrincipal() {
+        List<Map<String, String>> byUserDutyEquals = userInfoMapper.getProUserAll();
+        return new ResMsg(CodeEnum.OK, byUserDutyEquals);
+    }
+
+    @Override
+    public ResMsg findTeamUser(ProjectTeamInfoEntity projectTeamInfoEntity) {
+        //获取项目组的团队id,
+        List<ProjectTeamInfoEntity> teams = projectTeamMapper.findByProjectIdEquals(projectTeamInfoEntity.getProjectId());
+        List<UserInfoEntity> allByUserId = new ArrayList<>();
+        if (teams.size() > 0) {
+            List<String> userIds = relevanceProjectInfoMapper.findByProjectTeamIdEquals(teams.get(0).getProjectTeamId() + "");
+            allByUserId = userInfoMapper.findAllByUserId(userIds);
+        }
+        return new ResMsg(CodeEnum.OK, allByUserId);
+    }
+
+    @Override
+    public ResMsg addProjectTeam(ProjectTeamInfoEntity projectTeamInfoEntity, List<Long> userIds) {
+        if (projectTeamMapper.findByProjectTeamNameEquals(projectTeamInfoEntity.getProjectTeamName()).size() > 0) {
+            return new ResMsg(CodeEnum.TNE_PROJECT_TEAM_NAME_ALREADY_EXISTS);
+        }
+        if (projectTeamMapper.findByProjectIdEquals(projectTeamInfoEntity.getProjectId()).size() > 0) {
+            return new ResMsg(CodeEnum.PROJECT_TEAM_HAS_BEEN_ESTABLISHED_FOR_THE_PROJECT);
+        }
+        projectTeamInfoEntity.setCreateDate(new Date());
+        ProjectTeamInfoEntity save = projectTeamMapper.save(projectTeamInfoEntity);
+        if (userIds.size() > 0) {
+            addProjectTeamUser(save, userIds);
+        }
+
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg addProjectTeamUser(ProjectTeamInfoEntity projectTeamInfoEntity, List<Long> userIds) {
+        List<String> list = new ArrayList<>();
+        for (Long user : userIds) {
+            int byuserIdbyrojectTeamid = relevanceProjectInfoMapper.findByuserIdbyrojectTeamid(String.valueOf(user), projectTeamInfoEntity.getProjectTeamId());
+            if (byuserIdbyrojectTeamid > 0) {
+                list.add(String.valueOf(user));
+                continue;
+            }
+            RelevanceProjectInfoEntity relevanceProjectInfoEntity = new RelevanceProjectInfoEntity();
+            relevanceProjectInfoEntity.setProjectTeamId(projectTeamInfoEntity.getProjectTeamId());
+            relevanceProjectInfoEntity.setUserId(String.valueOf(user));
+            relevanceProjectInfoMapper.save(relevanceProjectInfoEntity);
+        }
+        List<UserInfoEntity> allById = userInfoMapper.findAllById(list);
+        StringBuffer str = new StringBuffer();
+        if (allById.size() > 0) {
+            for (UserInfoEntity userId : allById) {
+                str.append(userId.getShowName() + ",");
+            }
+            int i = str.lastIndexOf(",");
+            str.deleteCharAt(i);
+            str.append("已存在");
+            return new ResMsg(CodeEnum.OK, str);
+        }
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg removeUser(ProjectTeamInfoEntity projectTeamInfoEntity, List<Long> userIds) {
+        for (Long user : userIds) {
+            relevanceProjectInfoMapper.removeUser(projectTeamInfoEntity.getProjectTeamId(), user);
+        }
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg findUserProject(Long userId) {
+        List<Integer> projectTeamIds = new ArrayList<>();
+        List<String> byUserId = relevanceProjectInfoMapper.findByUserId(userId);
+        for (String s : byUserId) {
+            projectTeamIds.add(Integer.valueOf(s));
+        }
+        List<ProjectTeamInfoEntity> allById = projectTeamMapper.findAllById(projectTeamIds);
+        List<Integer> list = new ArrayList<>();
+        for (ProjectTeamInfoEntity pro : allById) {
+            list.add(Integer.valueOf(pro.getProjectId()));
+        }
+        List<ProjectInfoEntity> allById1 = projectInfoMapper.findAllById(list);
+        return new ResMsg(CodeEnum.OK, allById1);
+    }
+}

+ 178 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/service/impl/TaskInfoServiceImpl.java

@@ -0,0 +1,178 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ankaibei.workFlow.common.core.object.ResponseResult;
+import com.ankaibei.workFlow.common.core.object.TokenData;
+import com.ankaibei.workFlow.common.flow.constant.FlowConstant;
+import com.ankaibei.workFlow.common.flow.constant.FlowTaskStatus;
+import com.ankaibei.workFlow.common.flow.dto.FlowTaskCommentDto;
+import com.ankaibei.workFlow.common.flow.model.FlowEntry;
+import com.ankaibei.workFlow.common.flow.model.FlowEntryPublish;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ProjectInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.TaskInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.UserInfoEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.ProjectInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.TaskInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.UserInfoMapper;
+import com.ankaibei.workFlow.webadmin.ankaibei.service.TaskInfoService;
+import com.ankaibei.workFlow.webadmin.ankaibei.utils.FlowTaskStart;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.TaskInfoVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 17:19
+ */
+@Service
+public class TaskInfoServiceImpl implements TaskInfoService {
+
+    @Resource
+    private TaskInfoMapper taskInfoMapper;
+    @Resource
+    private UserInfoMapper userInfoMapper;
+    @Resource
+    private ProjectInfoMapper projectInfoMapper;
+    @Autowired
+    private FlowTaskStart flowTaskStart;
+
+    @Override
+    public ResMsg findTaskInfo(Integer pageIndex, Integer pageSize, TaskInfoEntity taskInfoEntity) {
+        Pageable page = PageRequest.of(pageIndex - 1, pageSize);
+        Page<Map<String, String>> all = taskInfoMapper.findTaskInfo(taskInfoEntity.getTargetTask(), taskInfoEntity.getTaskStatus(), page);
+        return new ResMsg(CodeEnum.OK, ResMsg.getMap(all.map(map -> {
+            Map<Object, Object> map1 = new HashMap<>();
+            map1.putAll(map);
+            String projectId = map.get("projectId");
+            Optional<ProjectInfoEntity> byId = projectInfoMapper.findById(Integer.valueOf(projectId));
+            map1.put("projectId", byId.orElse(null) != null ? byId.orElse(null).getProjectName() : null);
+            String taskParticipant = map.get("taskParticipant");
+            String[] split = taskParticipant.split(",");
+            List<String> list = new ArrayList<>();
+            for (String userId : split) {
+                list.add(String.valueOf(userId));
+            }
+            List<UserInfoEntity> allByUserId = userInfoMapper.findAllByUserId(list);
+            StringBuffer str = new StringBuffer();
+            for (UserInfoEntity name : allByUserId) {
+                str.append(name.getShowName()).append(",");
+            }
+            map1.put("taskParticipant", str.toString());
+            return map1;
+        }).getContent(), all.getTotalElements()));
+    }
+
+    @Override
+    public ResMsg addTaskInfo(TaskInfoEntity taskInfoEntity, List<Long> taskParticipant) {
+        if (taskInfoMapper.countByTargetTaskEqualsAndIsDeleteEquals(taskInfoEntity.getTargetTask(), "1") > 1) {
+            return new ResMsg(CodeEnum.TASK_ALREADY_EXISTS);
+        }
+        if (taskParticipant.size() < 1) {
+            //(1 已分配 2未分配 3已延期)
+            taskInfoEntity.setTaskStatus("2");
+        } else {
+            taskInfoEntity.setTaskStatus("1");
+        }
+        StringBuffer str = new StringBuffer();
+        for (Long id : taskParticipant) {
+            str.append(id).append(",");
+        }
+        taskInfoEntity.setTaskParticipant(str.toString());
+        taskInfoEntity.setTaskCreator(taskInfoEntity.getTaskCreator());
+        taskInfoEntity.setCreateDate(new Date());
+        taskInfoEntity.setIsDelete("1");
+        TaskInfoEntity save = taskInfoMapper.save(taskInfoEntity);
+
+        /**
+         *调用新增项目任务申请流程的启动
+         *获取流程开始节点之后的第一个任务节点的数据
+         *param processDefinitionKey 新建项目任务审批流程--流程标识。
+         */
+        String processDefinitionKey = "projectTaskAddApply";
+        ResponseResult<FlowEntry> flowEntryResult = flowTaskStart.verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResMsg.newInstance(CodeEnum.FAIL, flowEntryResult);
+        }
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        String initTaskInfo = flowEntryPublish.getInitTaskInfo();
+        com.ankaibei.workFlow.common.flow.vo.TaskInfoVo taskInfo = StrUtil.isBlank(initTaskInfo)
+                ? null : JSON.parseObject(initTaskInfo, com.ankaibei.workFlow.common.flow.vo.TaskInfoVo.class);
+        if (taskInfo != null) {
+            String loginName = TokenData.takeFromRequest().getLoginName();
+            taskInfo.setAssignedMe(StrUtil.equalsAny(
+                    taskInfo.getAssignee(), loginName, FlowConstant.START_USER_NAME_VAR));
+        }
+        //用户在表单页面配置的操作按钮
+        FlowTaskCommentDto flowTaskCommentDto = new FlowTaskCommentDto();
+        //提交后进行到第二个节点
+        flowTaskCommentDto.setApprovalType("agree");
+        HashMap<String, Object> stringObjectHashMap = new HashMap<>();
+        stringObjectHashMap.put("target_task", taskInfoEntity.getTargetTask());
+        stringObjectHashMap.put("task_priority", taskInfoEntity.getTaskPriority());
+        stringObjectHashMap.put("task_participant", taskInfoEntity.getTaskParticipant());
+        stringObjectHashMap.put("task_plan", taskInfoEntity.getEndTime().toString());
+        stringObjectHashMap.put("task_creator", taskInfoEntity.getTaskCreator());
+        stringObjectHashMap.put("task_index", taskInfoEntity.getTaskIndex());
+        stringObjectHashMap.put("task_standard", taskInfoEntity.getTaskStandard());
+        stringObjectHashMap.put("task_statements", taskInfoEntity.getTaskStatements());
+        stringObjectHashMap.put("project_id", taskInfoEntity.getProjectId());
+        stringObjectHashMap.put("create_date", taskInfoEntity.getCreateDate());
+        stringObjectHashMap.put("task_id", save.getTaskId());
+        JSONObject masterData = (JSONObject) JSONObject.toJSON(stringObjectHashMap);
+        Map<String, String> map = flowTaskStart.startAndTakeUserTaskSS(processDefinitionKey, flowTaskCommentDto, null, masterData, null, null).getData();
+        save.setFlowTaskStatus(FlowTaskStatus.SUBMITTED);
+        save.setProcessInstanceId(map.get("processInstanceId"));
+        save.setProcessDefinitionId(map.get("processDefinitionId"));
+        taskInfoMapper.save(save);
+        return new ResMsg(CodeEnum.OK);
+    }
+
+    @Override
+    public ResMsg deleteTask(List<TaskInfoVo> taskInfoVos) {
+        //   //审批状态   已提交:0; 审批中:1; 被拒绝:2; 已结束:3; 提前停止:4; 已取消:5;
+        StringBuffer optional = new StringBuffer("任务:[");
+        int count = 0;
+        for (TaskInfoVo info : taskInfoVos) {
+            TaskInfoEntity byId = taskInfoMapper.getById(info.getTaskId());
+            if (byId.getFlowTaskStatus() > 1) {
+                taskInfoMapper.deleteTask(info.getTaskId());
+                count++;
+            } else {
+                optional.append(byId.getTargetTask() + ",");
+            }
+        }
+        optional.replace(optional.length() - 1, optional.length(), "");
+        optional.append("] 审批未结束,不可删除!");
+        if (count == taskInfoVos.size()) {
+            return new ResMsg(CodeEnum.OK, "");
+        } else {
+            return new ResMsg(CodeEnum.FAIL, optional);
+        }
+    }
+
+    @Override
+    public ResMsg findTaskById(TaskInfoVo taskInfoVo) {
+        Optional<TaskInfoEntity> byId = taskInfoMapper.findById(taskInfoVo.getTaskId());
+        return new ResMsg(CodeEnum.OK, byId.orElse(null));
+    }
+
+    @Override
+    public ResMsg performTask(TaskInfoEntity taskInfoEntity) {
+        if (taskInfoMapper.performTask(taskInfoEntity.getTaskId()) < 1) {
+            return new ResMsg(CodeEnum.FAIL);
+        }
+        return new ResMsg(CodeEnum.OK);
+    }
+}

+ 187 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/ApiMixin.java

@@ -0,0 +1,187 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.utils;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.vo.ResMsg;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author smartcyl
+ */
+public interface ApiMixin<Vo, ID> {
+    /**
+     * 通用查询
+     *
+     * @param vo 条件参数
+     * @return List<T>
+     */
+    default List<Vo> getList(Vo vo) {
+        return null;
+    }
+
+    /**
+     * 通用查询
+     *
+     * @return List<T>
+     */
+    default List<Vo> getList() {
+        return null;
+    }
+
+    /**
+     * 通用查询
+     *
+     * @param var1 id
+     * @return List<T>
+     */
+    default List<Vo> getList(Iterable<ID> var1) {
+        return null;
+    }
+
+    /**
+     * 通用查询
+     *
+     * @param id 条件参数
+     * @return List<T>
+     */
+    default Vo getById(ID id) {
+        return null;
+    }
+
+    /**
+     * 分页查询
+     *
+     * @param pageSize  分页条数
+     * @param pageIndex 页码
+     * @param vo        返回的实体
+     * @return ResMsg<Vo>
+     */
+    default ResMsg<String> getListByPage(Integer pageSize, Integer pageIndex, Vo vo) {
+        return null;
+    }
+
+    /**
+     * 分页查询
+     *
+     * @param pageSize  分页条数
+     * @param pageIndex 页码
+     * @return ResMsg<Vo>
+     */
+    default ResMsg<String> getListByPage(Integer pageSize, Integer pageIndex) {
+        return null;
+    }
+
+    /**
+     * 单个信息查询
+     *
+     * @param vo 返回的实体
+     * @return Vo
+     */
+    default Vo getInfo(Vo vo) {
+        return null;
+    }
+
+    /**
+     * 新增
+     *
+     * @param vo 实体
+     * @return boolean
+     */
+    default Vo addInfo(Vo vo) {
+        return null;
+    }
+
+    /**
+     * 删除
+     *
+     * @param vo 实体
+     * @return boolean
+     */
+    default boolean deleteInfo(Vo vo) {
+        return false;
+    }
+
+    default boolean deleteById(ID id) {
+        return false;
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param vos 实体
+     * @return boolean
+     */
+    default boolean deleteBatch(List<Vo> vos) {
+        return false;
+    }
+
+    /**
+     * 批量新增
+     *
+     * @param vos 实体
+     * @return boolean
+     */
+    default boolean saveBatch(List<Vo> vos) {
+        return false;
+    }
+
+    /**
+     * 新增
+     *
+     * @param vo 实体
+     * @return boolean
+     */
+    default boolean updateInfo(Vo vo) {
+        return false;
+    }
+
+    /**
+     * 通用的属性拷贝方法
+     *
+     * @param rList  来源
+     * @param zClass 目的
+     * @param <T>    来源实体
+     * @param <Z>    目的实体
+     * @return List<Z>
+     */
+    default <T, Z> List<Z> copyProperties(List<T> rList, Class<Z> zClass) {
+        List<Z> zList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(rList)) {
+            rList.forEach(t -> {
+                Z z = null;
+                try {
+                    z = zClass.newInstance();
+                } catch (InstantiationException | IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+                if (z != null) {
+                    BeanUtils.copyProperties(t, z);
+                    zList.add(z);
+                }
+            });
+        }
+        return zList;
+    }
+
+    /**
+     * 通用的属性拷贝方法
+     *
+     * @param t      来源
+     * @param zClass 目标类
+     * @return Z
+     */
+    default <T, Z> Z copyProperties(T t, Class<Z> zClass) {
+        Z z = null;
+        try {
+            z = zClass.newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            e.printStackTrace();
+        }
+        if (z != null) {
+            BeanUtils.copyProperties(t, z);
+        }
+        return z;
+    }
+}

+ 172 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/FileUtis.java

@@ -0,0 +1,172 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.utils;
+
+import org.springframework.util.ResourceUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletContext;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/22 11:20
+ */
+public class FileUtis {
+
+    //服务器地址
+    final static String baseUrl = "http://124.70.58.209:8077";
+    //获取编译文件夹下的static路径
+    static String basePath = "/ankaibei/upload";
+
+
+    private final ServletContext context;
+
+    public FileUtis(ServletContext context) {
+        this.context = context;
+    }
+
+    /**
+     * 上传文件
+     *
+     * @param upload
+     * @param
+     * @return
+     * @throws IOException
+     */
+    public static String UploadFile(MultipartFile upload) throws IOException {
+        String path = ResourceUtils.getURL("classpath:").getPath() + "static/upload";
+        System.out.println(path);
+        //判断该路径是否存在
+        File file = new File(path);
+        if (!file.exists()) {
+            //如果这个文件夹不存在的话,就创建这个文件
+            file.mkdirs();
+        }
+        //获取上传文件名称
+        String filename = upload.getOriginalFilename();
+        System.out.println(filename);
+        //把文件名称设置成唯一值 uuid 以防止文件名相同覆盖
+        String uuid = UUID.randomUUID().toString().replace("-", "");
+        //新文件名
+        filename = uuid + "_" + filename;
+        System.out.println(filename);
+        //完成文件上传
+        upload.transferTo(new File(path, filename));
+        String filePath = "upload/" + filename;
+        System.out.println(filePath);
+        return filePath;
+    }
+
+    /**
+     * 单图片上传
+     *
+     * @param
+     * @return
+     */
+    public static String uploadOne(MultipartFile voFile) throws FileNotFoundException {
+        String filePath = ResourceUtils.getURL("classpath:").getPath() + "static/upload";
+        File file = new File(filePath);
+        if (!file.exists()) {//文件夹不存在
+            file.mkdirs();//创建文件夹
+        }
+        //文件输出流
+        FileOutputStream fileOutputStream = null;
+        //缓冲输出流
+        BufferedOutputStream bufferedOutputStream = null;
+        //前端限制好,图片为空不让上传
+        //获取前端的图片文件
+//		MultipartFile voFile=vo.getImg();
+        //要上传的图片文件
+        File imgFile = null;
+        //要上传的图片名
+        String imgName = null;
+        //上传后图片的url
+        String imgUrl = null;
+        try {
+            //获取图片二进制数据
+            byte[] bytes = voFile.getBytes();
+            imgName = UUID.randomUUID() + ".jpg";
+            imgFile = new File(file, imgName);
+            //文件输出流对象
+            fileOutputStream = new FileOutputStream(imgFile);
+            //缓冲流对象
+            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+            //将图片数据写入文件
+            bufferedOutputStream.write(bytes);
+            //数据推出管道流
+            bufferedOutputStream.flush();
+            //关闭输出流
+            bufferedOutputStream.close();
+            //将图片的url写到类中
+            imgUrl = baseUrl + filePath + "/" + imgName;
+            System.out.println(imgUrl);
+            return imgUrl;
+        } catch (IOException e) {//发生IO异常
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 多图片上传
+     *
+     * @param
+     * @return
+     */
+    public static List<String> uploadList(List<MultipartFile> voFileList) {
+        String filePath = basePath;
+        File file = new File(filePath);
+        if (!file.exists()) {//文件夹不存在
+            file.mkdirs();//创建文件夹
+        }
+        //文件输出流
+        FileOutputStream fileOutputStream = null;
+        //缓冲输出流
+        BufferedOutputStream bufferedOutputStream = null;
+        //前端限制好,图片为空不让上传
+        //获取前端的图片文件
+//		MultipartFile voFile=vo.getImg();
+        //要上传的图片文件
+        File imgFile = null;
+        //要上传的图片名
+        String imgName = null;
+        //上传后图片的url
+        String imgUrl = null;
+        //单个文件
+        MultipartFile voFile = null;
+        //图片地址列表
+        List<String> imgUrlList = new ArrayList<>();
+        try {
+            for (int i = 0; i < voFileList.size(); i++) {
+                voFile = voFileList.get(i);
+                //获取图片二进制数据
+                byte[] bytes = voFile.getBytes();
+                imgName = UUID.randomUUID() + ".jpg";
+                imgFile = new File(file, imgName);
+                //文件输出流对象
+                fileOutputStream = new FileOutputStream(imgFile);
+                //缓冲流对象
+                bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
+                //将图片数据写入文件
+                bufferedOutputStream.write(bytes);
+                //数据推出管道流
+                bufferedOutputStream.flush();
+                //关闭输出流
+                bufferedOutputStream.close();
+                //将图片的url写到类中
+                imgUrl = baseUrl + filePath + "/" + imgName;
+                imgUrlList.add(imgUrl);
+            }
+            return imgUrlList;
+        } catch (IOException e) {//发生IO异常
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+}

+ 169 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/FlowTaskStart.java

@@ -0,0 +1,169 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.utils;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ankaibei.workFlow.common.core.annotation.DisableDataFilter;
+import com.ankaibei.workFlow.common.core.constant.ErrorCodeEnum;
+import com.ankaibei.workFlow.common.core.object.ResponseResult;
+import com.ankaibei.workFlow.common.flow.constant.FlowConstant;
+import com.ankaibei.workFlow.common.flow.dto.FlowTaskCommentDto;
+import com.ankaibei.workFlow.common.flow.model.FlowEntry;
+import com.ankaibei.workFlow.common.flow.model.FlowEntryPublish;
+import com.ankaibei.workFlow.common.flow.model.FlowTaskComment;
+import com.ankaibei.workFlow.common.flow.model.constant.FlowEntryStatus;
+import com.ankaibei.workFlow.common.flow.online.service.FlowOnlineOperationService;
+import com.ankaibei.workFlow.common.flow.service.FlowEntryService;
+import com.ankaibei.workFlow.common.flow.util.FlowOperationHelper;
+import com.ankaibei.workFlow.common.flow.vo.TaskInfoVo;
+import com.ankaibei.workFlow.common.online.model.OnlineDatasource;
+import com.ankaibei.workFlow.common.online.model.OnlineDatasourceRelation;
+import com.ankaibei.workFlow.common.online.model.OnlineFormDatasource;
+import com.ankaibei.workFlow.common.online.model.OnlineTable;
+import com.ankaibei.workFlow.common.online.object.ColumnData;
+import com.ankaibei.workFlow.common.online.service.OnlineFormService;
+import com.ankaibei.workFlow.common.online.util.OnlineOperationHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class FlowTaskStart {
+
+    @Autowired
+    private FlowEntryService flowEntryService;
+    @Autowired
+    private OnlineFormService onlineFormService;
+    @Autowired
+    private FlowOperationHelper flowOperationHelper;
+    @Autowired
+    private OnlineOperationHelper onlineOperationHelper;
+    @Autowired
+    private FlowOnlineOperationService flowOnlineOperationService;
+
+
+    /**
+     * 根据指定流程的主版本,发起一个流程实例,同时作为第一个任务节点的执行人,执行第一个用户任务。
+     * 该接口无需数据权限过滤,因此用DisableDataFilter注解标注。如果当前系统没有支持数据权限过滤,该注解不会有任何影响。
+     *
+     * @param processDefinitionKey 流程定义标识。
+     * @param flowTaskCommentDto   审批意见。
+     * @param taskVariableData     流程任务变量数据。
+     * @param masterData           流程审批相关的主表数据。
+     * @param slaveData            流程审批相关的多个从表数据。
+     * @param copyData             传阅数据,格式为type和id,type的值参考FlowConstant中的常量值。
+     * @return 应答结果对象。
+     */
+    @DisableDataFilter
+    public ResponseResult<Map<String, String>> startAndTakeUserTaskSS(
+            String processDefinitionKey, FlowTaskCommentDto flowTaskCommentDto, JSONObject taskVariableData,
+            JSONObject masterData, JSONObject slaveData, JSONObject copyData) {
+        String errorMessage;
+        // 1. 验证流程数据的合法性。
+        ResponseResult<FlowEntry> flowEntryResult = verifyAndGetFlowEntry(processDefinitionKey);
+        if (!flowEntryResult.isSuccess()) {
+            return ResponseResult.errorFrom(flowEntryResult);
+        }
+        // 2. 验证流程一个用户任务的合法性。
+        FlowEntryPublish flowEntryPublish = flowEntryResult.getData().getMainFlowEntryPublish();
+        if (!flowEntryPublish.getActiveStatus()) {
+            errorMessage = "数据验证失败,当前流程发布对象已被挂起,不能启动新流程!";
+            return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
+        }
+        ResponseResult<TaskInfoVo> taskInfoResult =
+                flowOperationHelper.verifyAndGetInitialTaskInfo(flowEntryPublish, true);
+        if (!taskInfoResult.isSuccess()) {
+            return ResponseResult.errorFrom(taskInfoResult);
+        }
+        TaskInfoVo taskInfo = taskInfoResult.getData();
+        // 3. 验证在线表单及其关联数据源的合法性。
+        ResponseResult<OnlineDatasource> datasourceResult = this.verifyAndGetOnlineDatasource(taskInfo.getFormId());
+        if (!datasourceResult.isSuccess()) {
+            return ResponseResult.errorFrom(datasourceResult);
+        }
+        OnlineDatasource datasource = datasourceResult.getData();
+        OnlineTable masterTable = datasource.getMasterTable();
+        // 4. 为本次流程操作构建数据。
+        ResponseResult<List<ColumnData>> columnDataListResult =
+                onlineOperationHelper.buildTableData(masterTable, masterData, false, null);
+        if (!columnDataListResult.isSuccess()) {
+            return ResponseResult.errorFrom(columnDataListResult);
+        }
+        // 这里把传阅数据放到任务变量中,是为了避免给流程数据操作方法增加额外的方法调用参数。
+        if (MapUtil.isNotEmpty(copyData)) {
+            if (taskVariableData == null) {
+                taskVariableData = new JSONObject();
+            }
+            taskVariableData.put(FlowConstant.COPY_DATA_KEY, copyData);
+        }
+        FlowTaskComment flowTaskComment = BeanUtil.copyProperties(flowTaskCommentDto, FlowTaskComment.class);
+        // 5. 保存在线表单提交的数据,同时启动流程和自动完成第一个用户任务。
+        //进入流程后获取到流程实例的id
+        String processInstanceId = "";
+        if (slaveData == null) {
+            processInstanceId = flowOnlineOperationService.saveNewAndStartProcess(
+                    flowEntryPublish.getProcessDefinitionId(),
+                    flowTaskComment,
+                    taskVariableData,
+                    masterTable,
+                    columnDataListResult.getData());
+        } else {
+            // 如果本次请求中包含从表数据,则一同插入。
+            ResponseResult<Map<OnlineDatasourceRelation, List<List<ColumnData>>>> slaveDataListResult =
+                    onlineOperationHelper.buildSlaveDataList(datasource.getDatasourceId(), slaveData);
+            if (!slaveDataListResult.isSuccess()) {
+                return ResponseResult.errorFrom(slaveDataListResult);
+            }
+            processInstanceId = flowOnlineOperationService.saveNewAndStartProcess(
+                    flowEntryPublish.getProcessDefinitionId(),
+                    flowTaskComment,
+                    taskVariableData,
+                    masterTable,
+                    columnDataListResult.getData(),
+                    slaveDataListResult.getData());
+        }
+        Map<String, String> map = new HashMap<>();
+        map.put("processDefinitionId", flowEntryPublish.getProcessDefinitionId());
+        map.put("processInstanceId", processInstanceId);
+        return ResponseResult.success(map);
+    }
+
+    /**
+     * 验证并获取流程对象。
+     *
+     * @param processDefinitionKey 流程引擎的流程定义标识。
+     * @return 流程对象。
+     */
+    public ResponseResult<FlowEntry> verifyAndGetFlowEntry(String processDefinitionKey) {
+        String errorMessage;
+        FlowEntry flowEntry = flowEntryService.getFlowEntryFromCache(processDefinitionKey);
+        if (flowEntry == null) {
+            errorMessage = "数据验证失败,该流程并不存在,请刷新后重试!";
+            return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
+        }
+        if (!flowEntry.getStatus().equals(FlowEntryStatus.PUBLISHED)) {
+            errorMessage = "数据验证失败,该流程尚未发布,请刷新后重试!";
+            return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
+        }
+        FlowEntryPublish flowEntryPublish =
+                flowEntryService.getFlowEntryPublishFromCache(flowEntry.getMainEntryPublishId());
+        flowEntry.setMainFlowEntryPublish(flowEntryPublish);
+        return ResponseResult.success(flowEntry);
+    }
+
+    public ResponseResult<OnlineDatasource> verifyAndGetOnlineDatasource(Long formId) {
+        List<OnlineFormDatasource> formDatasourceList = onlineFormService.getFormDatasourceListFromCache(formId);
+        if (CollUtil.isEmpty(formDatasourceList)) {
+            String errorMessage = "数据验证失败,流程任务绑定的在线表单Id [" + formId + "] 不存在,请修改流程图!";
+            return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
+        }
+        return onlineOperationHelper.verifyAndGetDatasource(formDatasourceList.get(0).getDatasourceId());
+    }
+
+//=========================================================================================================================================
+
+}

+ 199 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/JwtUtil.java

@@ -0,0 +1,199 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.utils;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.LoginTokenEntity;
+import com.ankaibei.workFlow.webadmin.ankaibei.mapper.LoginTokenMapper;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.*;
+
+/**
+ * <p>Title: JwtUtil</p>
+ * <p>Description: </p>
+ *
+ * @author liuwq
+ * @date 2021年12月3日
+ */
+@Component
+public class JwtUtil {
+
+    //加盐加密
+    private final static String TOKEN_SECRET = "hhhqsdcdjaljdjajdajdwijiajdiavbnko";
+
+    private static JwtUtil JwtUtils;
+
+    @Resource
+    private LoginTokenMapper loginTokenMapper;
+
+    @PostConstruct
+    public void init() {
+        JwtUtils = this;
+        JwtUtils.loginTokenMapper = this.loginTokenMapper;
+    }
+
+    /**
+     * token的生成
+     *
+     * @param
+     * @param subjectSNO 用户账号
+     * @param map
+     * @return token
+     */
+    public static String getToken(String subjectSNO, Map<String, Object> map) {
+        String token = "";
+        token = JWT.create().withAudience(subjectSNO)
+                .withClaim("userAcct", subjectSNO)//用户账号
+                .withClaim("userId", (Integer) map.get("userId")) //用户id
+                .sign(Algorithm.HMAC256(String.valueOf(UUID.randomUUID())));
+        return token;
+    }
+
+    /**
+     * 验证,并获取payload中的存储键值对信息
+     *
+     * @param token
+     * @return
+     * @throws Exception
+     */
+    public static Map<String, Claim> verifyToken(String token) {
+        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).build();
+        DecodedJWT decodedJWT = null;
+        try {
+            decodedJWT = jwtVerifier.verify(token);
+        } catch (JWTVerificationException e) {
+            throw new RuntimeException("Token已过期,请重新登录");
+        }
+        return decodedJWT.getClaims();
+    }
+
+    /**
+     * 验证token, 返回 true / false
+     *
+     * @param token
+     * @return
+     * @throws Exception
+     */
+    public static Boolean checkToken(String token) {
+        try {
+            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).build();
+            DecodedJWT decodedJWT = jwtVerifier.verify(token);
+            if (decodedJWT == null) {
+                return false;
+            }
+        } catch (JWTVerificationException e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+
+
+    /**
+     * 在没有进行验证token的情况下,
+     * <p>
+     * 根据参数名称,从token中获取荷载部分的参数的value值,
+     *
+     * @param token
+     * @param paramName
+     * @return
+     * @author zhou haijun
+     */
+    public static <T> T getValueOfPayloadByTokenAndParamName(String token, String paramName, Class<T> t) {
+        T as = JWT.decode(token).getClaim(paramName).as(t);
+        return as;
+    }
+
+    /**
+     * 获取当前网络ip
+     *
+     * @param request
+     * @return
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+        String ipAddress = request.getHeader("x-forwarded-for");
+        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+            ipAddress = request.getHeader("Proxy-Client-IP");
+        }
+        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+            ipAddress = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+            ipAddress = request.getRemoteAddr();
+            if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) {
+                //根据网卡取本机配置的IP
+                InetAddress inet = null;
+                try {
+                    inet = InetAddress.getLocalHost();
+                } catch (UnknownHostException e) {
+                    e.printStackTrace();
+                }
+                ipAddress = inet.getHostAddress();
+            }
+        }
+        //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+        if (ipAddress != null && ipAddress.length() > 15) { //"***.***.***.***".length() = 15
+            if (ipAddress.indexOf(",") > 0) {
+                ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+            }
+        }
+        return ipAddress;
+    }
+
+    /**
+     * 生成token信息
+     *
+     * @param loginAcct 账号
+     * @return TokenVo
+     */
+    public static String createTokenVo(String loginAcct, Integer userId) {
+
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("userId", userId);
+        String token = JwtUtil.getToken(loginAcct, map);
+        Map<String, Object> result = new HashMap<>(16);
+        return token;
+    }
+
+    /**
+     * 获取当天最大毫秒值
+     *
+     * @param
+     * @return ResMsg
+     */
+    public static long getDayMaxTime() {
+        Calendar todayEnd = Calendar.getInstance();
+        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
+        todayEnd.set(Calendar.MINUTE, 59);
+        todayEnd.set(Calendar.SECOND, 59);
+        todayEnd.set(Calendar.MILLISECOND, 999);
+        return todayEnd.getTime().getTime() - System.currentTimeMillis();
+    }
+
+    public static Boolean findLoginToken(String token) {
+        Integer userId = null;
+        try {
+            userId = getValueOfPayloadByTokenAndParamName(token, "userId", Integer.class);
+        } catch (Exception e) {
+            return false;
+        }
+        Optional<LoginTokenEntity> byId = JwtUtils.loginTokenMapper.findById(userId);
+        LoginTokenEntity loginTokenEntity = byId.orElse(null);
+        if (StringUtils.isEmpty(loginTokenEntity)) {
+            return false;
+        }
+        return loginTokenEntity.getUserToken().equals(token);
+    }
+
+
+}

File diff suppressed because it is too large
+ 155 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/utils/RSAUtil.java


+ 49 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/AccesoryInfoVo.java

@@ -0,0 +1,49 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/10/13 16:18
+ */
+@Data
+public class AccesoryInfoVo implements Serializable {
+
+    private Integer accesoryId;
+    /**
+     * 合同
+     */
+    @JSONField(serialize = false)
+    private List<MultipartFile> contract;
+    /**
+     * 方案
+     */
+    @JSONField(serialize = false)
+    private List<MultipartFile> scheme;
+    /**
+     * 计划
+     */
+    @JSONField(serialize = false)
+    private List<MultipartFile> plan;
+    /**
+     * 提交材料
+     */
+    @JSONField(serialize = false)
+    private List<MultipartFile> submitMaterial;
+    /**
+     * 验收单
+     */
+    @JSONField(serialize = false)
+    private List<MultipartFile> acceptance;
+    /**
+     * 项目id
+     */
+    private String projectId;
+}

+ 18 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/BaseVo.java

@@ -0,0 +1,18 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @author wenqi
+ */
+@Getter
+@Setter
+public class BaseVo implements Serializable {
+
+    private Integer pageIndex;
+    private Integer pageSize;
+
+}

+ 55 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/CommunicationInfoVo.java

@@ -0,0 +1,55 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description: 通讯费表
+ * @date 2022/9/21 14:26
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class CommunicationInfoVo extends BaseVo {
+    private Integer communicationId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 申请费用
+     */
+    private BigDecimal applicationFee;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建用户
+     */
+    private String createUser;
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+    /**
+     * 结束时间
+     */
+    private Date endDate;
+    /**
+     * 总金额
+     */
+    private BigDecimal totalMoney;
+    /**
+     * 发票
+     */
+    private String invoice;
+
+}

+ 65 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/CostInfoVo.java

@@ -0,0 +1,65 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import java.util.Date;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:费用管理表
+ * @date 2022/9/21 14:28
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class CostInfoVo extends BaseVo {
+    private Integer costId;
+    /**
+     * 费用项
+     */
+    private String costType;
+    /**
+     * 状态
+     */
+    private String costStatus;
+    /**
+     * 关联人员
+     */
+    private String relevanceUser;
+    /**
+     * 项目类型名称
+     */
+    private String projectName;
+    /**
+     * 执行金额
+     */
+    private Integer performAmount;
+    /**
+     * 发生日期
+     */
+    private Date happenDate;
+    /**
+     * 付款日期
+     */
+    private Date paymentDate;
+    /**
+     * 申请人
+     */
+    private Integer proposer;
+    /**
+     * 进入流程后获取到的流程实例的id
+     */
+    private String processInstanceId;
+    /**
+     * 工作流任务处理状态
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 流程定义Id
+     */
+    private String processDefinitionId;
+
+}

+ 20 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/EchartsEntityVo.java

@@ -0,0 +1,20 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import lombok.Data;
+
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/10/20 11:19
+ */
+@Data
+public class EchartsEntityVo {
+
+    private String time;
+    private Integer num;
+    //公司or部门名称
+    private String deptName;
+
+}

+ 63 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ManHourInfoVo.java

@@ -0,0 +1,63 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import com.ankaibei.workFlow.webadmin.ankaibei.entity.ManHourJobInfo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:工时管理表
+ * @date 2022/9/21 14:28
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ManHourInfoVo extends BaseVo {
+    private Integer manId;
+    /**
+     * 项目成员
+     */
+    private String projectUser;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 记录每一天的工时
+     */
+    private List<ManHourJobInfo> manHours;
+
+    /**
+     * 创建日期
+     */
+    private Date createDate;
+    /**
+     * 结束日期
+     */
+    private Date endDate;
+    /**
+     * 创建用户
+     */
+    private String createUser;
+
+    /**
+     * 项目id
+     */
+    private String projectId;
+    /**
+     * 进入流程后获取到的流程实例的id
+     */
+    private String processInstanceId;
+    /**
+     * 工作流任务处理状态
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 流程定义Id
+     */
+    private String processDefinitionId;
+
+}

+ 46 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ProjectInfoVo.java

@@ -0,0 +1,46 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 11:01
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProjectInfoVo extends BaseVo {
+    private Integer projectId;
+    private String projectName;
+    private String projectStage;
+    private String projectStatus;
+    private String projectType;
+    private String relevanceClient;
+    private String peojectMoney;
+    private BigDecimal staffCost;
+    private BigDecimal projectCost;
+    private BigDecimal totalCost;
+    private String linkmanPhone;
+    private String projectPrincipal;
+    private String projectNode;
+    private String projectDescribe;
+    private Date createDate;
+    /**
+     * 进入流程后获取到的流程实例的id
+     */
+    private String processInstanceId;
+    /**
+     * 工作流任务处理状态
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 流程定义Id
+     */
+    private String processDefinitionId;
+
+}

+ 39 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ProjectTeamInfoVo.java

@@ -0,0 +1,39 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/5 14:37
+ */
+@Data
+public class ProjectTeamInfoVo extends BaseVo {
+
+    /**
+     * 项目组id
+     */
+    private Integer projectTeamId;
+    /**
+     * 项目id
+     */
+    private String projectId;
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+    /**
+     * 项目组名称
+     */
+    private String projectTeamName;
+    /**
+     * 用户id集合
+     */
+    private List<Long> userIds;
+
+
+}

+ 62 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/PurchaseInfoVo.java

@@ -0,0 +1,62 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:采购费表
+ * @date 2022/9/21 14:28
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PurchaseInfoVo extends BaseVo {
+    private Integer purchaseId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 采购日期
+     */
+    private Date purchaseDate;
+    /**
+     * 采购信息
+     */
+    private List<PurChaseMessage> purchaseMessage;
+    /**
+     * 创建用户
+     */
+    private String createUser;
+    /**
+     * 总金额
+     */
+    private BigDecimal totalMoney;
+
+    @Data
+    @NoArgsConstructor
+    public static class PurChaseMessage {
+        //采购物品
+        private String purchaseGoods;
+        //采购金额
+        private BigDecimal purchaseMoney;
+        //采购数量
+        private Integer purchaseNumber;
+        //规格
+        private String specification;
+        //发票(存上传发票地址)
+        private String invoice;
+        //备注
+        private String remark;
+
+    }
+
+}

+ 40 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/RepastExpenseVo.java

@@ -0,0 +1,40 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author bbb
+ * @version 1.0
+ * @description: 餐饮费用记录
+ * @date 2022/9/26 16:05
+ */
+@Data
+public class RepastExpenseVo implements Serializable {
+    private int id;
+    private String projectName;
+    private String applicant;
+    private List<RepastExpenseSubject> subject;
+    private BigDecimal totalMoney;
+
+
+    @Data
+    public static class RepastExpenseSubject {
+        //金额,参与人员, 用餐时间,备注
+        private BigDecimal amount;
+        private String entourage;
+        @JsonFormat(timezone = "UTC", pattern = "yyyy-MM-dd HH:mm:ss")
+        private Date eatDate;
+        private String remark;
+        //发票(存上传发票地址)
+        private String invoice;
+    }
+
+}

+ 92 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ResMsg.java

@@ -0,0 +1,92 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import com.alibaba.fastjson.JSON;
+import com.ankaibei.workFlow.webadmin.ankaibei.enums.CodeEnum;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author
+ * @version 2019-10-08 16:17
+ * Description:返回信息
+ */
+@Data
+public class ResMsg<T> implements Serializable {
+
+    private String code;
+
+    private String msg;
+
+    private T data;
+
+    public ResMsg() {
+    }
+
+    public ResMsg(String code) {
+        this.code = code;
+    }
+
+    public ResMsg(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public ResMsg(String code, String msg, T data) {
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+    }
+
+
+    public ResMsg(CodeEnum CodeEnum) {
+        this(CodeEnum.getCode(), CodeEnum.toString());
+    }
+
+    public ResMsg(CodeEnum CodeEnum, T data) {
+        this(CodeEnum.getCode(), CodeEnum.toString(), data);
+    }
+
+    public static String toJsonString(CodeEnum CodeEnum) {
+        return JSON.toJSONString(new ResMsg(CodeEnum));
+    }
+
+    public static String toJsonString(CodeEnum CodeEnum, Object data) {
+        return JSON.toJSONString(new ResMsg(CodeEnum, data));
+    }
+
+    public static ResMsg newInstance(CodeEnum CodeEnum, Object data) {
+        return new ResMsg(CodeEnum, data);
+    }
+
+    public static ResMsg newInstance(String enumCode, String enumMsg, Object data) {
+        return new ResMsg(enumCode, enumMsg, data);
+    }
+
+    public static ResMsg error(CodeEnum CodeEnum, String message, Object data) {
+        return new ResMsg(CodeEnum.getCode(), message, data);
+    }
+
+    public static ResMsg error(String enumCode, String enumMsg) {
+        return new ResMsg(enumCode, enumMsg, null);
+    }
+
+    public static ResMsg newInstance(CodeEnum CodeEnum) {
+        return new ResMsg(CodeEnum, null);
+    }
+
+    public static String OK() {
+        return toJsonString(CodeEnum.OK);
+    }
+
+    public static Map<Object, Object> getMap(Object content, Object totalElements) {
+        Map<Object, Object> map = new HashMap<>();
+        map.put("content", content);
+        map.put("totalElements", totalElements);
+        return map;
+    }
+
+}
+

+ 60 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/RestsInfoVo.java

@@ -0,0 +1,60 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:其他费用申请表
+ * @date 2022/9/21 14:28
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class RestsInfoVo extends BaseVo {
+    private Integer restsId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 时间
+     */
+    private Date createDate;
+    /**
+     * 其他信息
+     */
+    private List<RestsMessage> restsMessage;
+    /**
+     * 创建用户
+     */
+    private String createUser;
+    /**
+     * 总金额
+     */
+    private BigDecimal totalMoney;
+
+    @Data
+    @NoArgsConstructor
+    public static class RestsMessage {
+        //费用明细
+        private String costBreakdown;
+        //数量
+        private Integer restsNumber;
+        //金额
+        private BigDecimal restsMoney;
+        //规格
+        private String specification;
+        //发票(存上传发票地址)
+        private String invoice;
+        //备注
+        private String remark;
+    }
+}

+ 30 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/ReturnToken.java

@@ -0,0 +1,30 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import lombok.Data;
+
+/**
+ * @author lwq
+ * @version 1.0
+ * @description:
+ * @date 2022/9/5 16:24
+ */
+@Data
+public class ReturnToken {
+    /**
+     * 用户名
+     */
+    private String userName;
+    /**
+     * token令牌
+     */
+    private String token;
+
+    public ReturnToken(String userName, String token) {
+        this.userName = userName;
+        this.token = token;
+    }
+
+
+    public ReturnToken() {
+    }
+}

+ 50 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/TaskInfoVo.java

@@ -0,0 +1,50 @@
+package com.ankaibei.workFlow.webadmin.ankaibei.vo;
+
+import jdk.internal.dynalink.linker.LinkerServices;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author
+ * @version 1.0
+ * @description:
+ * @date 2022/9/14 10:59
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class TaskInfoVo extends BaseVo {
+    private Integer taskId;
+    private String targetTask;
+    private String taskPriority;
+    private List<Long> taskParticipant;
+    /**
+     * 时间计划 开始时间
+     */
+    private Date startTime;
+    /**
+     * 时间计划 结束时间
+     */
+    private Date endTime;
+    private String taskStatus;
+    private String taskCreator;
+    private String taskIndex;
+    private String taskStandard;
+    private String taskStatements;
+    private String projectId;
+    /**
+     * 进入流程后获取到的流程实例的id
+     */
+    private String processInstanceId;
+    /**
+     * 工作流任务处理状态
+     */
+    private Integer flowTaskStatus;
+    /**
+     * 流程定义Id
+     */
+    private String processDefinitionId;
+
+}

+ 0 - 0
application-webadmin/src/main/java/com/ankaibei/workFlow/webadmin/ankaibei/vo/TrafficExpenseVo.java


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