Переглянути джерело

Merge branch 'master' of http://192.168.2.241:3000/lifan/tofly-pms

wangzhun 10 місяців тому
батько
коміт
507c707a8f
24 змінених файлів з 666 додано та 99 видалено
  1. 16 4
      auth-sdk/pom.xml
  2. 2 0
      auth-sdk/src/main/java/com/tofly/security/component/config/BaseSecurityConfig.java
  3. 3 1
      auth-sdk/src/main/java/com/tofly/security/component/user/User.java
  4. 23 15
      pms-report/pom.xml
  5. 2 1
      pms-report/src/main/java/com/tofly/report/PmsReportApplication.java
  6. 55 8
      pms-report/src/main/java/com/tofly/report/jmreport/config/JimuReportTokenService.java
  7. 3 1
      pms-report/src/main/resources/application-dev.yml
  8. 73 0
      pms-report/src/main/resources/application-pro.yml
  9. 1 1
      pms-report/src/main/resources/application.yml
  10. 56 13
      pms-service/src/main/java/com/tofly/pms/testmanage/controller/BugInfoController.java
  11. 69 5
      pms-service/src/main/java/com/tofly/pms/testmanage/controller/SystemItemWController.java
  12. 15 0
      pms-service/src/main/java/com/tofly/pms/testmanage/entity/BugInfo.java
  13. 13 0
      pms-service/src/main/java/com/tofly/pms/working/controller/FeedBackPlanController.java
  14. 4 0
      pms-service/src/main/java/com/tofly/pms/working/controller/HoursWController.java
  15. 47 5
      pms-service/src/main/java/com/tofly/pms/working/controller/TaskWController.java
  16. 2 0
      pms-service/src/main/java/com/tofly/pms/working/entity/TaskW.java
  17. 32 0
      pms-service/src/main/java/com/tofly/pms/working/mapper/HoursWMapper.java
  18. 103 21
      pms-service/src/main/java/com/tofly/pms/working/service/impl/HoursWServiceImpl.java
  19. 5 3
      pms-service/src/main/java/com/tofly/pms/working/service/impl/TaskWServiceImpl.java
  20. 4 0
      pms-service/src/main/java/com/tofly/pms/working/vo/FeedBackWithPlanVo.java
  21. 20 0
      pms-service/src/main/java/com/tofly/pms/working/vo/TodayTaskCompleteVo.java
  22. 12 3
      pms-service/src/main/resources/mapper/BugInfoMapper.xml
  23. 98 11
      pms-service/src/main/resources/mapper/HoursWMapper.xml
  24. 8 7
      pms-service/src/main/resources/mapper/PlanListMapper.xml

+ 16 - 4
auth-sdk/pom.xml

@@ -19,7 +19,6 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
-            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -68,16 +67,29 @@
             <groupId>com.github.ben-manes.caffeine</groupId>
             <artifactId>caffeine</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
+        </dependency>
     </dependencies>
 
+<!--    <build>-->
+<!--        <plugins>-->
+<!--            <plugin>-->
+<!--                <groupId>org.springframework.boot</groupId>-->
+<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
+<!--                <configuration>-->
+<!--                    <classifier>exec</classifier>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
+<!--        </plugins>-->
+<!--    </build>-->
     <build>
         <plugins>
+            <!-- SpringBoot启动 -->
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <classifier>exec</classifier>
-                </configuration>
             </plugin>
         </plugins>
     </build>

+ 2 - 0
auth-sdk/src/main/java/com/tofly/security/component/config/BaseSecurityConfig.java

@@ -12,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@@ -72,6 +73,7 @@ public class BaseSecurityConfig extends WebSecurityConfigurerAdapter {
     @Autowired
     private ObjectMapper objectMapper;
 
+    @Lazy
     @Autowired
     private AuthenticationManager authenticationManager;
 

+ 3 - 1
auth-sdk/src/main/java/com/tofly/security/component/user/User.java

@@ -31,7 +31,9 @@ public class User extends SearchTextBasedWithAdditionalInfo<UserId>
   @Length(fieldName = "last name")
   private String lastName;
   /** 平台的用户详情 */
-  @Getter @Setter private UserDetailsDTO userDetailsDTO;
+  @Getter
+  @Setter
+  private UserDetailsDTO userDetailsDTO;
 
   public User() {
     super();

+ 23 - 15
pms-report/pom.xml

@@ -14,13 +14,12 @@
     <name>pms-report</name>
     <description>pms-report</description>
 
-
     <properties>
         <jimureport.version>1.7.4</jimureport.version>
         <java.version>11</java.version>
         <minio.version>8.0.3</minio.version>
         <!-- DB驱动 -->
-        <mysql-connector-java.version>8.0.27</mysql-connector-java.version>
+<!--        <mysql-connector-java.version>8.0.27</mysql-connector-java.version>-->
     </properties>
 
 
@@ -30,18 +29,27 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+            <scope>compile</scope>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.tofly</groupId>-->
+<!--            <artifactId>auth-sdk</artifactId>-->
+<!--            <version>1.0.0</version>-->
+<!--        </dependency>-->
         <!-- JimuReport -->
         <dependency>
             <groupId>org.jeecgframework.jimureport</groupId>
             <artifactId>jimureport-spring-boot-starter</artifactId>
             <version>${jimureport.version}</version>
         </dependency>
-        <dependency>
-            <groupId>com.tofly</groupId>
-            <artifactId>auth-sdk</artifactId>
-            <version>1.0.0</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>-->
+<!--        </dependency>-->
         <!-- JimuReport mogodb/redis支持包(按需添加) -->
         <dependency>
             <groupId>org.jeecgframework.jimureport</groupId>
@@ -79,7 +87,7 @@
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
-            <version>${mysql-connector-java.version}</version>
+            <version>8.0.31</version>
             <scope>runtime</scope>
         </dependency>
         <!-- oracle驱动-->
@@ -97,12 +105,12 @@
         <!--           <scope>runtime</scope>-->
         <!--       </dependency>-->
         <!-- postgresql驱动-->
-        <!--        <dependency>-->
-        <!--            <groupId>org.postgresql</groupId>-->
-        <!--            <artifactId>postgresql</artifactId>-->
-        <!--            <version>42.2.6</version>-->
-        <!--            <scope>runtime</scope>-->
-        <!--        </dependency>-->
+                <dependency>
+                    <groupId>org.postgresql</groupId>
+                    <artifactId>postgresql</artifactId>
+                    <version>42.2.6</version>
+                    <scope>runtime</scope>
+                </dependency>
         <!-- ===需要什么数据库,手工打开注释=== -->
         <!-- 达梦驱动-->
         <!--        <dependency>-->

+ 2 - 1
pms-report/src/main/java/com/tofly/report/PmsReportApplication.java

@@ -5,7 +5,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
-@SpringBootApplication(exclude={MongoAutoConfiguration.class},scanBasePackages = {"org.jeecg.modules.jmreport","com.tofly"})
+@SpringBootApplication(exclude={MongoAutoConfiguration.class},
+        scanBasePackages = {"org.jeecg.modules.jmreport","com.tofly"})
 @EnableDiscoveryClient
 public class PmsReportApplication {
 

+ 55 - 8
pms-report/src/main/java/com/tofly/report/jmreport/config/JimuReportTokenService.java

@@ -1,8 +1,14 @@
 package com.tofly.report.jmreport.config;
 
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -11,9 +17,13 @@ import javax.servlet.http.HttpServletRequest;
  * 1.自定义获取登录token
  * 2.自定义获取登录用户
  */
+@Slf4j
 @Component
 public class JimuReportTokenService implements JmReportTokenServiceI {
 
+
+    private static String tokenSigningKey = "1qaz2wsx3edc4rfv5tgb6yhn7ujm1qaz2wsx3edc4rfv5tgb6yhn7ujm1qaz2wsx3edc4rfv5tgb6yhn7ujm1qaz2wsx3edc4rfv5tgb6yhn7ujm";
+
     /**
      * 通过请求获取Token
      * @param request
@@ -21,9 +31,34 @@ public class JimuReportTokenService implements JmReportTokenServiceI {
      */
     @Override
     public String getToken(HttpServletRequest request) {
-         //System.out.println("---------call---------getToken-----------------------");
-        //return TokenUtils.getTokenByRequest(request);
-        return "123456";
+        try {
+            String token = request.getParameter("token");
+            if (!StringUtils.isEmpty(token)) {
+                if (token.startsWith("Bearer")) {
+                    token = token.replace("Bearer", "").trim();
+                }
+                if (token.startsWith("bearer")) {
+                    token = token.replace("bearer", "").trim();
+                }
+                return token;
+            } else {
+                token = request.getHeader("X-Authorization");
+                if (!StringUtils.isEmpty(token)) {
+                    if (token.startsWith("Bearer")) {
+                        token = token.replace("Bearer", "").trim();
+                    }
+                    if (token.startsWith("bearer")) {
+                        token = token.replace("bearer", "").trim();
+                    }
+                    return token;
+                }
+            }
+            return null;
+        } catch (Exception e) {
+            log.info(e.getMessage());
+            return null;
+        }
+//        return "123456";
     }
 
     /**
@@ -53,8 +88,20 @@ public class JimuReportTokenService implements JmReportTokenServiceI {
      */
     @Override
     public String getUsername(String token) {
-        // return JwtUtil.getUsername(token);
-        return "admin";
+        try {
+            String jwt = getToken();
+            if (!StringUtils.isEmpty(jwt)) {
+                Claims claims = Jwts.parser()
+                        .setSigningKey(tokenSigningKey)
+                        .parseClaimsJws(jwt)
+                        .getBody();
+                return claims.get("sub", String.class);
+            }
+            return null;
+        } catch (Exception e) {
+            //e.printStackTrace();
+            throw new RuntimeException("token is null");
+        }
     }
 
     /**
@@ -75,9 +122,9 @@ public class JimuReportTokenService implements JmReportTokenServiceI {
      */
     @Override
     public Boolean verifyToken(String token) {
-        System.out.println("---------verify-----Token---------------");
-//        return TokenUtils.verifyToken(token, sysBaseAPI, redisUtil);
-        return true;
+        String username = getUsername(token);
+        return StringUtils.isNotBlank(username);
+//        return true;
     }
 
     /**

+ 3 - 1
pms-report/src/main/resources/application-dev.yml

@@ -18,6 +18,8 @@ spring:
 
   application:
     name: pms-report-service
+  main:
+    allow-bean-definition-overriding: true
 
 #持久层框架
 minidao:
@@ -66,6 +68,6 @@ jeecg:
 #输出sql日志
 logging:
   level:
-    org.jeecg.modules.jmreport: info
+    org.jeecg.modules.jmreport: debug
 server:
   port: 10026

+ 73 - 0
pms-report/src/main/resources/application-pro.yml

@@ -0,0 +1,73 @@
+
+
+spring:
+  #数据库
+  datasource:
+    url: jdbc:postgresql://192.168.2.5:5432/pms
+    username: postgres
+    password: tofly@zs
+    driver-class-name: org.postgresql.Driver
+  cloud:
+    nacos:
+      discovery:
+        namespace: tofly-pms
+        server-addr: http://192.168.2.5:8848
+        #server-addr: localhost:8848
+        username: nacos
+        password: nacos
+
+  application:
+    name: pms-report-service
+  main:
+    allow-bean-definition-overriding: true
+
+#持久层框架
+minidao:
+  base-package: org.jeecg.modules.jmreport.*
+jeecg:
+  # local|minio|alioss
+  uploadType: local
+  # local
+  path:
+    #文件路径
+    upload: /opt/upload
+  # alioss
+  oss:
+    endpoint: ??
+    accessKey: ??
+    secretKey: ??
+    bucketName: jimureport
+  # minio
+  minio:
+    minio_url: http://minio.jeecg.com
+    minio_name: ??
+    minio_pass: ??
+    bucketName: ??
+  #大屏报表参数设置
+  jmreport:
+    #多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离)
+    saasMode:
+    # 平台上线安全配置
+    firewall:
+      # 数据源安全 (开启后,不允许使用平台数据源、SQL解析加签并且不允许查询数据库)
+      dataSourceSafe: false
+      # 低代码开发模式(dev:开发模式,prod:发布模式—关闭在线报表设计功能,分配角色admin、lowdeveloper可放开限制)
+      lowCodeMode: dev
+    # 展示列数
+    col: 100
+    # 展示行数
+    row: 200
+    #自定义API接口的前缀 #{api_base_path}和#{domainURL}的值
+    apiBasePath: http://192.168.2.17:10827/report-service
+
+    pageSize:
+      - 10
+      - 20
+      - 30
+      - 40
+#输出sql日志
+logging:
+  level:
+    org.jeecg.modules.jmreport: debug
+server:
+  port: 10026

+ 1 - 1
pms-report/src/main/resources/application.yml

@@ -1,3 +1,3 @@
 spring:
   profiles:
-    active: dev
+    active: pro

+ 56 - 13
pms-service/src/main/java/com/tofly/pms/testmanage/controller/BugInfoController.java

@@ -1,6 +1,7 @@
 package com.tofly.pms.testmanage.controller;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.fastjson.JSON;
@@ -17,6 +18,7 @@ import com.tofly.pms.testmanage.dto.BugInfoBatchDto;
 import com.tofly.pms.testmanage.dto.BugUpdateDto;
 import com.tofly.pms.testmanage.entity.BugInfo;
 import com.tofly.pms.testmanage.entity.BugLog;
+import com.tofly.pms.testmanage.mapper.BugInfoMapper;
 import com.tofly.pms.testmanage.service.BugInfoService;
 import com.tofly.pms.testmanage.service.BugLogService;
 import com.tofly.pms.testmanage.service.SystemItemService;
@@ -29,6 +31,8 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -50,6 +54,8 @@ public class BugInfoController {
     private SystemItemService systemItemService;
     @Autowired
     private ProjectTeamWService projectTeamWService;
+    @Autowired
+    private BugInfoMapper bugInfoMapper;
 
     /**
      * 通过ID查询单条数据
@@ -72,14 +78,35 @@ public class BugInfoController {
      */
     @ApiOperation("分页查询")
     @GetMapping
-    public ResponseEntity<Page<BugInfo>> paginQuery(BugInfo bugInfo, Page page) {
+    public ResponseEntity<Page<BugInfo>> paginQuery(BugInfo bugInfo, Page<BugInfo> page) {
         String title = bugInfo.getTitle();
         bugInfo.setTitle(null);
         LambdaQueryWrapper<BugInfo> wrapper = new QueryWrapper<>(bugInfo).lambda()
                 .like(StringUtils.isNotBlank(title), BugInfo::getTitle, title)
-                .eq(BugInfo::getDeleted,0)
+                .eq(BugInfo::getDeleted, 0)
                 .orderByDesc(BugInfo::getCreateTime);
-        final Page page1 = bugInfoService.page(page, wrapper);
+        final Page<BugInfo> page1 = bugInfoService.page(page, wrapper);
+        List<BugInfo> records = page1.getRecords();
+        if (CollectionUtil.isNotEmpty(records)) {
+            for (BugInfo record : records) {
+                String adviseDate = record.getAdviseTime();
+                Date startDate = null;
+                if (StringUtils.isNotBlank(adviseDate)) {
+                    startDate = DateUtil.parse(adviseDate, "yyyy-MM-dd");
+                }
+                // 0 正常 1 逾期 2 待开始
+                Date nowDate = new Date();
+                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+                String format = df.format(nowDate);
+                nowDate = DateUtil.parse(format, "yyyy-MM-dd");
+                if (Objects.nonNull(startDate) && startDate.before(nowDate)) {
+                    record.setTimeStatus(1);
+                } else {
+                    record.setTimeStatus(0);
+                }
+            }
+        }
+
         return ResponseEntity.ok(page1);
     }
 
@@ -180,26 +207,26 @@ public class BugInfoController {
         for (String s : split) {
             Integer id = Integer.valueOf(s);
             BugInfo byId = bugInfoService.getById(id);
-            if(Objects.isNull(byId)){
+            if (Objects.isNull(byId)) {
                 continue;
             }
-            if(!Objects.equals(userID,byId.getCreateUser())){
+            if (!Objects.equals(userID, byId.getCreateUser())) {
                 Integer projectId = byId.getProjectId();
                 ProjectTeamW one = projectTeamWService.getOne(Wrappers.lambdaQuery(ProjectTeamW.class)
                         .eq(ProjectTeamW::getProjectId, projectId)
                         .and(wr -> wr.like(ProjectTeamW::getAdminId, userID)
                                 .or()
                                 .like(ProjectTeamW::getTestId, userID)));
-                if(Objects.isNull(one)){
+                if (Objects.isNull(one)) {
                     RoleClient roleClient = SpringUtil.getBean(RoleClient.class);
                     Boolean has = roleClient.getHasRoleByUserId(userID, "所有功能");
-                    if(!has){
+                    if (!has) {
                         throw new BusinessException("没有权限");
                     }
                 }
             }
             byId.setDeleted(1);
-            bugInfoService.updateById(byId);
+            bugInfoMapper.updateById(byId);
         }
         return ResponseEntity.ok(Boolean.TRUE);
     }
@@ -232,7 +259,7 @@ public class BugInfoController {
         Page<BugInfo> page1;
         LambdaQueryWrapper<BugInfo> wrapper = Wrappers
                 .lambdaQuery(bugInfo)
-                .eq(BugInfo::getDeleted,0)
+                .eq(BugInfo::getDeleted, 0)
                 .like(BugInfo::getHeadId, tokenUserID)
                 .eq(StringUtils.isNotBlank(severity), BugInfo::getSeverity, severity)
                 .eq(StringUtils.isNotBlank(urgency), BugInfo::getUrgency, urgency)
@@ -265,6 +292,22 @@ public class BugInfoController {
                 Integer functionId = record.getFunctionId();
                 String name = systemItemService.getFullNameByFunctionId(functionId);
                 record.setFullFunctionName(name);
+
+                String adviseDate = record.getAdviseTime();
+                Date startDate = null;
+                if (StringUtils.isNotBlank(adviseDate)) {
+                    startDate = DateUtil.parse(adviseDate, "yyyy-MM-dd");
+                }
+                // 0 正常 1 逾期 2 待开始
+                Date nowDate = new Date();
+                DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+                String format = df.format(nowDate);
+                nowDate = DateUtil.parse(format, "yyyy-MM-dd");
+                if (Objects.nonNull(startDate) && startDate.before(nowDate)) {
+                    record.setTimeStatus(1);
+                } else {
+                    record.setTimeStatus(0);
+                }
             }
         }
         return ResponseEntity.ok(page1);
@@ -319,7 +362,7 @@ public class BugInfoController {
         }
         final Page<BugInfo> page1 = bugInfoService.page(page,
                 Wrappers.lambdaQuery(bugInfo)
-                        .eq(BugInfo::getDeleted,0)
+                        .eq(BugInfo::getDeleted, 0)
                         .like(BugInfo::getSureId, tokenUserID)
                         .eq(BugInfo::getStatus, "2")
                         .in(CollectionUtil.isNotEmpty(bugIdList), BugInfo::getId, bugIdList));
@@ -358,16 +401,16 @@ public class BugInfoController {
         }
         List<BugInfo> list1 = bugInfoService.list(Wrappers.lambdaQuery(bugInfo)
                 .like(BugInfo::getSureId, tokenUserID)
-                .eq(BugInfo::getDeleted,0)
+                .eq(BugInfo::getDeleted, 0)
                 .eq(BugInfo::getStatus, "2"));
         List<BugInfo> list2 = bugInfoService.list(Wrappers.lambdaQuery(bugInfo)
                 .like(BugInfo::getSureId, tokenUserID)
                 .eq(BugInfo::getStatus, "2")
-                .eq(BugInfo::getDeleted,0)
+                .eq(BugInfo::getDeleted, 0)
                 .in(BugInfo::getId, bugIdList2));
         List<BugInfo> list3 = bugInfoService.list(Wrappers.lambdaQuery(bugInfo)
                 .like(BugInfo::getSureId, tokenUserID)
-                .eq(BugInfo::getDeleted,0)
+                .eq(BugInfo::getDeleted, 0)
                 .eq(BugInfo::getStatus, "2")
                 .in(BugInfo::getId, bugIdList3));
         Map<String, Integer> res = new LinkedHashMap<>(3);

+ 69 - 5
pms-service/src/main/java/com/tofly/pms/testmanage/controller/SystemItemWController.java

@@ -172,6 +172,21 @@ public class SystemItemWController {
     @ApiOperation("新增数据")
     @PostMapping
     public ResponseEntity<SystemItem> add(@RequestBody SystemItem systemItem) {
+        String userID = UserTokenUtil.getTokenUserID();
+        Assert.notBlank(userID, "当前用户不合法");
+        SystemItem byId = systemItemService.getById(systemItem);
+        long one = projectTeamWService.count(Wrappers.lambdaQuery(ProjectTeamW.class)
+                .eq(ProjectTeamW::getProjectId, byId.getProjectId())
+                .and(wr -> wr.like(ProjectTeamW::getAdminId, userID)
+                        .or()
+                        .like(ProjectTeamW::getTestId, userID)));
+        if (one==0) {
+            RoleClient roleClient = SpringUtil.getBean(RoleClient.class);
+            Boolean has = roleClient.getHasRoleByUserId(userID, "所有功能");
+            if (!has) {
+                throw new ValidateException("当前用户没有权限操作");
+            }
+        }
         systemItemService.save(systemItem);
         return ResponseEntity.ok(systemItem);
     }
@@ -185,7 +200,42 @@ public class SystemItemWController {
     @ApiOperation("批量新增修改数据")
     @PostMapping("saveOrUpdateBatch")
     public ResponseEntity<SystemItemBatchDto> saveOrUpdateBatch(@RequestBody SystemItemBatchDto systemItemBatchDto) {
-        systemItemService.saveOrUpdateBatch(systemItemBatchDto.getDatas());
+        List<SystemItem> datas = systemItemBatchDto.getDatas();
+        String userID = UserTokenUtil.getTokenUserID();
+        Assert.notBlank(userID, "当前用户不合法");
+        List<SystemItem> hasId = datas.stream().filter(data -> Objects.nonNull(data.getId())).collect(Collectors.toList());
+        for (SystemItem data : hasId) {
+            SystemItem byId = systemItemService.getById(data);
+            long one = projectTeamWService.count(Wrappers.lambdaQuery(ProjectTeamW.class)
+                    .eq(ProjectTeamW::getProjectId, byId.getProjectId())
+                    .and(wr -> wr.like(ProjectTeamW::getAdminId, userID)
+                            .or()
+                            .like(ProjectTeamW::getTestId, userID)));
+            if (one==0) {
+                RoleClient roleClient = SpringUtil.getBean(RoleClient.class);
+                Boolean has = roleClient.getHasRoleByUserId(userID, "所有功能");
+                if (!has) {
+                    throw new ValidateException("当前用户没有权限操作");
+                }
+            }
+            systemItemService.updateById(data);
+        }
+        List<SystemItem> noId = datas.stream().filter(data -> Objects.isNull(data.getId())).collect(Collectors.toList());
+        for (SystemItem data : noId) {
+            long one = projectTeamWService.count(Wrappers.lambdaQuery(ProjectTeamW.class)
+                    .eq(ProjectTeamW::getProjectId, data.getProjectId())
+                    .and(wr -> wr.like(ProjectTeamW::getAdminId, userID)
+                            .or()
+                            .like(ProjectTeamW::getTestId, userID)));
+            if (one == 0) {
+                RoleClient roleClient = SpringUtil.getBean(RoleClient.class);
+                Boolean has = roleClient.getHasRoleByUserId(userID, "所有功能");
+                if (!has) {
+                    throw new ValidateException("当前用户没有权限操作");
+                }
+            }
+            systemItemService.save(data);
+        }
         return ResponseEntity.ok(systemItemBatchDto);
     }
 
@@ -201,12 +251,12 @@ public class SystemItemWController {
         String userID = UserTokenUtil.getTokenUserID();
         Assert.notBlank(userID, "当前用户不合法");
         SystemItem byId = systemItemService.getById(systemItem);
-        ProjectTeamW one = projectTeamWService.getOne(Wrappers.lambdaQuery(ProjectTeamW.class)
+        long one = projectTeamWService.count(Wrappers.lambdaQuery(ProjectTeamW.class)
                 .eq(ProjectTeamW::getProjectId, byId.getProjectId())
                 .and(wr -> wr.like(ProjectTeamW::getAdminId, userID)
                         .or()
                         .like(ProjectTeamW::getTestId, userID)));
-        if (Objects.isNull(one)) {
+        if (one==0) {
             RoleClient roleClient = SpringUtil.getBean(RoleClient.class);
             Boolean has = roleClient.getHasRoleByUserId(userID, "所有功能");
             if (!has) {
@@ -233,12 +283,12 @@ public class SystemItemWController {
         final String[] split = ids.split(",");
         for (String s : split) {
             SystemItem byId = systemItemService.getById(Integer.valueOf(s));
-            ProjectTeamW one = projectTeamWService.getOne(Wrappers.lambdaQuery(ProjectTeamW.class)
+            long one = projectTeamWService.count(Wrappers.lambdaQuery(ProjectTeamW.class)
                     .eq(ProjectTeamW::getProjectId, byId.getProjectId())
                     .and(wr -> wr.like(ProjectTeamW::getAdminId, userID)
                             .or()
                             .like(ProjectTeamW::getTestId, userID)));
-            if (Objects.isNull(one)) {
+            if (one==0) {
                 RoleClient roleClient = SpringUtil.getBean(RoleClient.class);
                 Boolean has = roleClient.getHasRoleByUserId(userID, "所有功能");
                 if (!has) {
@@ -275,6 +325,20 @@ public class SystemItemWController {
                                                   @RequestParam("projectId") Integer projectId,
                                                   @RequestParam("systemId") Integer systemId) throws Exception {
 
+        String userID = UserTokenUtil.getTokenUserID();
+        Assert.notBlank(userID, "当前用户不合法");
+        long one = projectTeamWService.count(Wrappers.lambdaQuery(ProjectTeamW.class)
+                .eq(ProjectTeamW::getProjectId, projectId)
+                .and(wr -> wr.like(ProjectTeamW::getAdminId, userID)
+                        .or()
+                        .like(ProjectTeamW::getTestId, userID)));
+        if (one==0) {
+            RoleClient roleClient = SpringUtil.getBean(RoleClient.class);
+            Boolean has = roleClient.getHasRoleByUserId(userID, "所有功能");
+            if (!has) {
+                throw new ValidateException("当前用户没有权限操作");
+            }
+        }
         ImportExcelHelper<SystemItemExcelModel> helper = new ImportExcelHelper<>(new SystemItemListener(1));
         List<SystemItemExcelModel> importData = helper.getList(file, SystemItemExcelModel.class, 0, 1);
         if (CollectionUtil.isEmpty(importData)) {

+ 15 - 0
pms-service/src/main/java/com/tofly/pms/testmanage/entity/BugInfo.java

@@ -2,6 +2,7 @@ package com.tofly.pms.testmanage.entity;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.tofly.pms.fegin.UserClient;
 import com.tofly.pms.fegin.vo.UserVo;
 import com.tofly.pms.file.entity.File;
@@ -16,6 +17,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.lang.reflect.Field;
@@ -192,6 +194,19 @@ public class BugInfo implements Serializable, Cloneable {
     @ApiModelProperty(value = "是否删除")
     private Integer deleted;
 
+    /**
+     * 完成时间  即状态变更为已完成的时候的操作时间
+     */
+    @ApiModelProperty(value = "完成时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date completeTime;
+
+
+    @ApiModelProperty(value = "是否逾期 1是 0否")
+    //结束时间 <当前时间
+    private Integer timeStatus;
+
     public void setProcessingModeAnnotation() {
         try {
             Field field = this.getClass().getDeclaredField("processingMode");

+ 13 - 0
pms-service/src/main/java/com/tofly/pms/working/controller/FeedBackPlanController.java

@@ -8,8 +8,10 @@ import com.tofly.pms.working.dto.FeedBackPlanDto;
 import com.tofly.pms.working.dto.FeedBackQueryDto;
 import com.tofly.pms.working.entity.FeedBackPlan;
 import com.tofly.pms.working.entity.Feedback;
+import com.tofly.pms.working.entity.TaskW;
 import com.tofly.pms.working.service.FeedBackPlanService;
 import com.tofly.pms.working.service.FeedBackService;
+import com.tofly.pms.working.service.TaskWService;
 import com.tofly.pms.working.vo.FeedBackWithPlanVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -33,6 +35,8 @@ public class FeedBackPlanController {
     private FeedBackPlanService feedBackPlanService;
     @Autowired
     private FeedBackService feedBackService;
+    @Autowired
+    private TaskWService taskWService;
 
     /**
      * 通过ID查询单条数据
@@ -90,6 +94,15 @@ public class FeedBackPlanController {
                 feedBackWithPlanVo.setFeedBackPlan(plans.get(0));
 
             }
+            //意见关联的任务数量统计
+            Integer id = record.getId();
+           long tatalTask = taskWService.count(Wrappers.<TaskW>lambdaQuery().eq(TaskW::getFeedbackId, id)
+                    .eq(TaskW::getDeleted,0));
+            long completedTask = taskWService.count(Wrappers.<TaskW>lambdaQuery().eq(TaskW::getFeedbackId, id)
+                    .eq(TaskW::getDeleted,0)
+                    .eq(TaskW::getStatus,'3'));
+            feedBackWithPlanVo.setTotalTask(tatalTask);
+            feedBackWithPlanVo.setCompletedTask(completedTask);
             datas.add(feedBackWithPlanVo);
         }
         page1.setRecords(datas);

+ 4 - 0
pms-service/src/main/java/com/tofly/pms/working/controller/HoursWController.java

@@ -184,6 +184,10 @@ public class HoursWController {
      * 逾期:任务状态为处理中且任务结束时间小于今天。
      * 被驳回:任务状态为被驳回的任务。
      * 内容参考如下:
+     * 今日任务情况:今日完成0个,逾期1个,被驳回1个,待处理1个。今日创建*个,确认*个,驳回*个,待确认*个。
+     *
+     * 今日bug情况:今日完成0个,逾期0个,被驳回0个,待处理1个。今日创建*个,验证*个,驳回*个,待验证*个。
+     *
      * 今日任务情况:今日完成3个,逾期1个,被驳回1个,待处理2个。
      * 今日bug情况:今日完成5个,逾期4个,被驳回2个,待处理1个。
      * 【任务完成明细】

+ 47 - 5
pms-service/src/main/java/com/tofly/pms/working/controller/TaskWController.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -77,15 +78,21 @@ public class TaskWController {
     @GetMapping
     public ResponseEntity<Page<TaskW>> paginQuery(TaskW taskW, Page<TaskW> page, String orderBy, String ascOrDesc) {
 
+        List<OrderItem> orders = page.getOrders();
+        page.setOrders(null);
         String title = taskW.getTitle();
         taskW.setTitle(null);
         LambdaQueryWrapper<TaskW> taskWLambdaQueryWrapper = Wrappers.lambdaQuery(taskW)
                 .like(StringUtils.isNotBlank(title), TaskW::getTitle, title)
                 .eq(TaskW::getDeleted, 0);
         if (StringUtils.isNotBlank(orderBy)) {
-            taskWLambdaQueryWrapper.last("order by " + orderBy + " " + ascOrDesc);
+            taskWLambdaQueryWrapper.last("order by " + orderBy + " " + ascOrDesc + " NULLS last ");
+        } else if (CollectionUtil.isNotEmpty(orders) && StringUtils.isNotBlank(orders.get(0).getColumn())) {
+
+            taskWLambdaQueryWrapper.last("order by " + orders.get(0).getColumn() + (orders.get(0).isAsc() ? " asc" : " desc") + " NULLS last ");
+
         } else {
-            taskWLambdaQueryWrapper.orderByDesc(TaskW::getCreateDate);
+            taskWLambdaQueryWrapper.orderByDesc(TaskW::getCreateDate).last("NULLS last ");
         }
         final Page<TaskW> page1 = taskWService.page(page,
                 taskWLambdaQueryWrapper
@@ -311,6 +318,24 @@ public class TaskWController {
         return ResponseEntity.ok(Boolean.TRUE);
     }
 
+    @ApiOperation("统计当前人员的待处理,已驳回任务以及项目数据")
+    @GetMapping("/countCurrentUserTask")
+    public ResponseEntity countCurrentUserTask(Integer projectId, String title) {
+        final String tokenUserID = UserTokenUtil.getTokenUserID();
+        final List<TaskW> list = taskWService.list(Wrappers.<TaskW>lambdaQuery()
+                .eq(TaskW::getDeleted, 0)
+                .eq(TaskW::getHeadId, tokenUserID).in(TaskW::getStatus, "1", "4")
+                .eq(projectId != null, TaskW::getProjectId, projectId)
+                .like(StringUtils.isNotBlank(title), TaskW::getTitle, title));
+        if(CollectionUtil.isNotEmpty(list)){
+            Map<String, Long> collect = list.stream().collect(Collectors.groupingBy(TaskW::getStatus, Collectors.counting()));
+            return ResponseEntity.ok(collect);
+        }
+        return ResponseEntity.ok(0);
+
+
+    }
+
     @ApiOperation("查询当前人员的待处理,已驳回任务以及项目数据")
     @GetMapping("/getCurrentUserTask")
     public ResponseEntity getCurrentUserTask(Integer projectId, String status, String title) {
@@ -362,7 +387,25 @@ public class TaskWController {
         }
         return ResponseEntity.ok(newList);
     }
-
+    @ApiOperation("统计当前人员的待确认数据")
+    @GetMapping("/countCurrentUserTaskConfirm")
+    public ResponseEntity countCurrentUserTaskConfirm(Integer projectId, boolean isAll, String title) {
+        final String tokenUserID = UserTokenUtil.getTokenUserID();
+        List<Integer> taskIdList = tasklogWService.getTaskIdList(isAll);
+        final List<TaskW> list = taskWService.list(Wrappers.<TaskW>lambdaQuery()
+                .eq(TaskW::getDeleted, 0)
+                .like(TaskW::getConfirmId, tokenUserID)
+                .in(TaskW::getStatus, "2")
+                .eq(projectId != null, TaskW::getProjectId, projectId)
+                .in(CollectionUtil.isNotEmpty(taskIdList), TaskW::getId, taskIdList)
+                .like(StringUtils.isNotBlank(title), TaskW::getTitle, title)
+        );
+        if(CollectionUtil.isNotEmpty(list)){
+            Map<String, Long> collect = list.stream().collect(Collectors.groupingBy(TaskW::getStatus, Collectors.counting()));
+            return ResponseEntity.ok(collect);
+        }
+        return ResponseEntity.ok(0);
+    }
     /**
      * @param projectId
      * @param status
@@ -455,8 +498,7 @@ public class TaskWController {
         List<TaskW> taskWList = taskWService.list(Wrappers.lambdaQuery(TaskW.class)
                 .eq(TaskW::getDeleted, 0)
                 .eq(TaskW::getProjectId, projectId)
-                .eq(TaskW::getHeadId, tokenUserID)
-                .in(TaskW::getStatus, "1", "4"));
+                .eq(TaskW::getHeadId, tokenUserID));
         return Result.success(taskWList);
     }
 

+ 2 - 0
pms-service/src/main/java/com/tofly/pms/working/entity/TaskW.java

@@ -203,6 +203,8 @@ public class TaskW implements Serializable, Cloneable {
     @ApiModelProperty(value = "逻辑删除:1 已经删除;0 未删除")
     @TableField(value = "deleted", fill = FieldFill.INSERT)
     private Integer deleted;
+    @ApiModelProperty(value = "意见id")
+    private Integer feedbackId;
 
     public TaskW deepClone() throws Exception {
         try (ByteArrayOutputStream baos = new ByteArrayOutputStream();

+ 32 - 0
pms-service/src/main/java/com/tofly/pms/working/mapper/HoursWMapper.java

@@ -113,4 +113,36 @@ public interface HoursWMapper extends BaseMapper<HoursW> {
     List<String> getBugTitleList(@Param("projectId") Integer projectId,
                                  @Param("userId") String userId,
                                  @Param("date") LocalDate date);
+
+    Integer getCreateTask(@Param("projectId") Integer projectId,
+                          @Param("userId") String userId,
+                          @Param("date") LocalDate date);
+
+   Integer getVerifyTask(@Param("projectId") Integer projectId,
+                        @Param("userId") String userId,
+                        @Param("date") LocalDate date);
+
+    Integer getRegressionTask(@Param("projectId") Integer projectId,
+                              @Param("userId") String userId,
+                              @Param("date") LocalDate date);
+
+    Integer getAwaitVerifyTask(@Param("projectId") Integer projectId,
+                               @Param("userId") String userId,
+                               @Param("date") LocalDate date);
+
+    Integer getCreateBug(@Param("projectId") Integer projectId,
+                         @Param("userId") String userId,
+                         @Param("date") LocalDate date);
+
+    Integer getVerifyBug(@Param("projectId") Integer projectId,
+                         @Param("userId") String userId,
+                         @Param("date") LocalDate date);
+
+    Integer getRegressionBug(@Param("projectId") Integer projectId,
+                             @Param("userId") String userId,
+                             @Param("date") LocalDate date);
+
+    Integer getAwaitVerifyBug(@Param("projectId") Integer projectId,
+                              @Param("userId") String userId,
+                              @Param("date") LocalDate date);
 }

+ 103 - 21
pms-service/src/main/java/com/tofly/pms/working/service/impl/HoursWServiceImpl.java

@@ -29,10 +29,16 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.lang.reflect.Method;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.function.Function;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 /**
@@ -51,6 +57,7 @@ public class HoursWServiceImpl extends ServiceImpl<HoursWMapper, HoursW>
     private UserUtils userUtils;
     @Autowired
     private HolidaysService holidaysService;
+    private static final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
 
     @Override
     public HoursW queryById(Integer id) {
@@ -213,38 +220,113 @@ public class HoursWServiceImpl extends ServiceImpl<HoursWMapper, HoursW>
         LocalDate date = LocalDate.now();
         TodayTaskCompleteVo todayTaskCompleteVo = new TodayTaskCompleteVo();
         //查询今天完成的任务数量
-        Integer completeTask = baseMapper.getCompleteTask(projectId, userId, date);
+        CompletableFuture<Integer> completeTaskFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getCompleteTask(projectId, userId, date), executorService);
+//        Integer completeTask = baseMapper.getCompleteTask(projectId, userId, date);
         //  今日逾期任务
-        Integer overdueTask = baseMapper.getOverdueTask(projectId, userId, date);
+        CompletableFuture<Integer> overdueTaskFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getOverdueTask(projectId, userId, date), executorService);
+//        Integer overdueTask = baseMapper.getOverdueTask(projectId, userId, date);
         //今日被驳回任务
-        Integer rejectTask = baseMapper.getRejectTask(projectId, userId, date);
+        CompletableFuture<Integer> rejectTaskFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getRejectTask(projectId, userId, date), executorService);
+//        Integer rejectTask = baseMapper.getRejectTask(projectId, userId, date);
         //今日待处理任务
-        Integer todoTask = baseMapper.getTodoTask(projectId, userId, date);
+        CompletableFuture<Integer> todoTaskFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getTodoTask(projectId, userId, date), executorService);
+//        Integer todoTask = baseMapper.getTodoTask(projectId, userId, date);
+        //今日创建的任务
+        CompletableFuture<Integer> createTaskFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getCreateTask(projectId, userId, date), executorService);
+        //今日确认任务
+        CompletableFuture<Integer> verifyTaskFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getVerifyTask(projectId, userId, date), executorService);
+        //今日驳回任务
+        CompletableFuture<Integer> regressionTaskFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getRegressionTask(projectId, userId, date), executorService);
+        //今日待确认任务
+        CompletableFuture<Integer> awaitVerifyTaskFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getAwaitVerifyTask(projectId, userId, date), executorService);
+
         //今日完成bug
-        Integer completeBug = baseMapper.getCompleteBug(projectId, userId, date);
+        CompletableFuture<Integer> completeBugFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getCompleteBug(projectId, userId, date), executorService);
+//        Integer completeBug = baseMapper.getCompleteBug(projectId, userId, date);
         //今日逾期bug
-        Integer overdueBug = baseMapper.getOverdueBug(projectId, userId, date);
+        CompletableFuture<Integer> overdueBugFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getOverdueBug(projectId, userId, date), executorService);
+//        Integer overdueBug = baseMapper.getOverdueBug(projectId, userId, date);
         //今日被驳回bug
-        Integer rejectBug = baseMapper.getRejectBug(projectId, userId, date);
+        CompletableFuture<Integer> rejectBugFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getRejectBug(projectId, userId, date), executorService);
+//        Integer rejectBug = baseMapper.getRejectBug(projectId, userId, date);
         //今日待处理bug
-        Integer todoBug = baseMapper.getTodoBug(projectId, userId, date);
+        CompletableFuture<Integer> todoBugFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getTodoBug(projectId, userId, date), executorService);
+//        Integer todoBug = baseMapper.getTodoBug(projectId, userId, date);
+
+
+        //今日创建的bug
+        CompletableFuture<Integer> createBugFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getCreateBug(projectId, userId, date), executorService);
+        //今日确认bug
+        CompletableFuture<Integer> verifyBugFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getVerifyBug(projectId, userId, date), executorService);
+        //今日驳回bug
+        CompletableFuture<Integer> regressionBugFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getRegressionBug(projectId, userId, date), executorService);
+        //今日待确认bug
+        CompletableFuture<Integer> awaitVerifyBugFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getAwaitVerifyBug(projectId, userId, date), executorService);
+
+
         //任务完成明细
-        List<TaskCompleteVo> taskCompleteVoList = baseMapper.getTaskCompleteVoList(projectId, userId, date);
+        CompletableFuture<List<TaskCompleteVo>> taskCompleteVoListFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getTaskCompleteVoList(projectId, userId, date), executorService);
+//        List<TaskCompleteVo> taskCompleteVoList = baseMapper.getTaskCompleteVoList(projectId, userId, date);
         //bug完成明细
-        List<String> bugTitleList = baseMapper.getBugTitleList(projectId, userId, date);
-        todayTaskCompleteVo.setCompleteTask(completeTask);
-        todayTaskCompleteVo.setOverdueTask(overdueTask);
-        todayTaskCompleteVo.setRejectTask(rejectTask);
-        todayTaskCompleteVo.setTodoTask(todoTask);
-        todayTaskCompleteVo.setCompleteBug(completeBug);
-        todayTaskCompleteVo.setOverdueBug(overdueBug);
-        todayTaskCompleteVo.setRejectBug(rejectBug);
-        todayTaskCompleteVo.setTodoBug(todoBug);
-        todayTaskCompleteVo.setTaskCompleteVoList(taskCompleteVoList);
-        todayTaskCompleteVo.setBugTitleList(bugTitleList);
+        CompletableFuture< List<String>> bugTitleListFuture = CompletableFuture.supplyAsync(() ->
+                baseMapper.getBugTitleList(projectId, userId, date), executorService);
+//        List<String> bugTitleList = baseMapper.getBugTitleList(projectId, userId, date);
+        CompletableFuture.allOf(completeTaskFuture,
+                overdueTaskFuture,
+                rejectTaskFuture,
+                todoTaskFuture,
+                completeBugFuture,
+                overdueBugFuture,
+                rejectBugFuture,
+                todoBugFuture,
+                taskCompleteVoListFuture,
+                bugTitleListFuture,
+                createTaskFuture,
+                verifyTaskFuture,
+                regressionTaskFuture,
+                awaitVerifyTaskFuture,
+                createBugFuture,
+                verifyBugFuture,
+                regressionBugFuture,
+                awaitVerifyBugFuture
+        ).join();
+        todayTaskCompleteVo.setAwaitVerifyTask(awaitVerifyTaskFuture.join());
+        todayTaskCompleteVo.setAwaitVerifyBug(awaitVerifyBugFuture.join());
+        todayTaskCompleteVo.setVerifyTask(verifyTaskFuture.join());
+        todayTaskCompleteVo.setVerifyBug(verifyBugFuture.join());
+        todayTaskCompleteVo.setCreateTask(createTaskFuture.join());
+        todayTaskCompleteVo.setCreateBug(createBugFuture.join());
+        todayTaskCompleteVo.setRegressionTask(regressionTaskFuture.join());
+        todayTaskCompleteVo.setRegressionBug(regressionBugFuture.join());
+        todayTaskCompleteVo.setCompleteTask(completeTaskFuture.join());
+        todayTaskCompleteVo.setOverdueTask(overdueTaskFuture.join());
+        todayTaskCompleteVo.setRejectTask(rejectTaskFuture.join());
+        todayTaskCompleteVo.setTodoTask(todoTaskFuture.join());
+        todayTaskCompleteVo.setCompleteBug(completeBugFuture.join());
+        todayTaskCompleteVo.setOverdueBug(overdueBugFuture.join());
+        todayTaskCompleteVo.setRejectBug(rejectBugFuture.join());
+        todayTaskCompleteVo.setTodoBug(todoBugFuture.join());
+        todayTaskCompleteVo.setTaskCompleteVoList(taskCompleteVoListFuture.join());
+        todayTaskCompleteVo.setBugTitleList(bugTitleListFuture.join());
         return todayTaskCompleteVo;
     }
-
     private void transferData(List<CheckHoursVo> exportData, List<List<Object>> dataList) {
         if (CollectionUtil.isEmpty(exportData)) {
             return;

+ 5 - 3
pms-service/src/main/java/com/tofly/pms/working/service/impl/TaskWServiceImpl.java

@@ -463,11 +463,11 @@ public class TaskWServiceImpl extends ServiceImpl<TaskWMapper, TaskW> implements
 
     private void taskResultByProcessingMode(TaskW taskW) {
         String processingMode = taskW.getProcessingMode();
+        Integer id = taskW.getId();
+        TaskW dbEntity = baseMapper.selectById(id);
+        String confirmId = dbEntity.getConfirmId();
         if (Objects.equals(processingMode, "10")) {
             //验证结果通过-->任务完成
-            Integer id = taskW.getId();
-            TaskW dbEntity = baseMapper.selectById(id);
-            String confirmId = dbEntity.getConfirmId();
             String userId = UserTokenUtil.getTokenUserID();
             confirmId = removeUserId(confirmId, userId);
             if (StringUtils.isBlank(confirmId)) {
@@ -483,9 +483,11 @@ public class TaskWServiceImpl extends ServiceImpl<TaskWMapper, TaskW> implements
         } else if (Objects.equals(processingMode, "11")) {
             //验证结果不通过-->任务驳回
             taskW.setStatus("4");
+            taskW.setConfirmId(dbEntity.getConfirmId() + "," + dbEntity.getAlreadyConfirmId());
         } else if (Objects.equals(processingMode, "12")) {
             //验证结果 转派他人继续处理-->任务待确认
             taskW.setStatus("1");
+            taskW.setConfirmId(dbEntity.getConfirmId() + "," + dbEntity.getAlreadyConfirmId());
         }
         baseMapper.updateById(taskW);
         //生成日志

+ 4 - 0
pms-service/src/main/java/com/tofly/pms/working/vo/FeedBackWithPlanVo.java

@@ -93,6 +93,10 @@ public class FeedBackWithPlanVo implements Serializable {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @TableField(value = "create_date", fill = FieldFill.INSERT)
     private Date createDate ;
+    @ApiModelProperty(value = "意见关联的总任务数")
+    private Long totalTask;
+    @ApiModelProperty(value = "意见关联的完成的任务数")
+    private Long completedTask;
 
     private FeedBackPlan feedBackPlan;
 }

+ 20 - 0
pms-service/src/main/java/com/tofly/pms/working/vo/TodayTaskCompleteVo.java

@@ -20,6 +20,15 @@ public class TodayTaskCompleteVo {
     private Integer rejectTask;
     @ApiModelProperty(value = "今日待处理任务")
     private Integer todoTask;
+//    今日创建*个,确认*个,驳回*个,待确认*个。退回
+@ApiModelProperty(value = "今日创建任务")
+private Integer createTask;
+    @ApiModelProperty(value = "今日确认任务")
+    private Integer verifyTask;
+    @ApiModelProperty(value = "今日驳回任务")
+    private Integer regressionTask;
+    @ApiModelProperty(value = "待确认任务")
+    private Integer awaitVerifyTask;
     @ApiModelProperty(value = "今日完成bug")
     private Integer completeBug;
     @ApiModelProperty(value = "今日逾期bug")
@@ -28,6 +37,17 @@ public class TodayTaskCompleteVo {
     private Integer rejectBug;
     @ApiModelProperty(value = "今日待处理bug")
     private Integer todoBug;
+
+
+    @ApiModelProperty(value = "今日创建bug")
+    private Integer createBug;
+    @ApiModelProperty(value = "今日确认bug")
+    private Integer verifyBug;
+    @ApiModelProperty(value = "今日驳回bug")
+    private Integer regressionBug;
+    @ApiModelProperty(value = "待确认bug")
+    private Integer awaitVerifyBug;
+
     @ApiModelProperty(value = "任务完成明细")
     private List<TaskCompleteVo> taskCompleteVoList;
     @ApiModelProperty(value = "bug完成明细")

+ 12 - 3
pms-service/src/main/resources/mapper/BugInfoMapper.xml

@@ -298,8 +298,11 @@
             and status = '3'
         </if>
         <if test="fix ==3">
-            and status != '3'
+            and status = '4'
         </if>
+       <if test="fix ==4">
+           and status = '2'
+       </if>
         <if test="startTime !=null">
             and create_time &gt;= #{startTime}
         </if>
@@ -318,7 +321,10 @@
             and status = '3'
         </if>
         <if test="fix ==3">
-            and status != '3'
+            and status = '4'
+        </if>
+        <if test="fix ==4">
+            and status = '2'
         </if>
         <if test="startTime !=null">
             and create_time &gt;= #{startTime}
@@ -336,7 +342,10 @@
             and status = '3'
         </if>
         <if test="fix ==3">
-            and status != '3'
+            and status = '4'
+        </if>
+        <if test="fix ==4">
+            and status = '2'
         </if>
         <if test="startTime !=null">
             and create_time &gt;= #{startTime}

+ 98 - 11
pms-service/src/main/resources/mapper/HoursWMapper.xml

@@ -158,16 +158,18 @@
         sum(COALESCE(temp3.duration, 0)) as duration
         from (select su.real_name, org.name, su.id, su.status
         from public.sys_user su
-        left join public.tk_user_organization_mapping tuom on su.id = tuom.user_id
-        left join public.tk_organization org on org.id = tuom.organization_id
-        <where>
+        inner join (select user_id,max(organization_id) organization_id from public.tk_user_organization_mapping
+        group by user_id
+        ) tuom on su.id = tuom.user_id
+        inner join public.tk_organization org on org.id = tuom.organization_id
+        where su.username != 'sysadmin'
             <if test="deptId != null and deptId != ''">
                 and org.id = #{deptId}
             </if>
             <if test="realName != null and realName != ''">
                 and su.real_name = #{realName}
             </if>
-        </where>
+
         ) temp1
         cross join (select distinct work_date
         from business.tf_pm_workinghours_w
@@ -179,7 +181,7 @@
         group by work_date, create_user) temp3
         on temp3.work_date = temp2.work_date and temp1.id = temp3.create_user
         group by temp1.real_name, temp1.name, temp1.status, temp3.work_date
-        order by temp1.name,temp1.real_name, temp3.work_date
+        order by  temp1.status, temp1.name,temp1.real_name, temp3.work_date
     </select>
     <select id="statisticsByOrgIdList" resultType="com.tofly.pms.working.entity.Workingreport">
         select *
@@ -190,24 +192,39 @@
         org.id as dept_id,
         #{month} as month
         from public.sys_user su
-        left join public.tk_user_organization_mapping tuom on su.id = tuom.user_id
-        left join public.tk_organization org on org.id = tuom.organization_id
+        inner join (select user_id,max(organization_id) organization_id from public.tk_user_organization_mapping
+        group by user_id
+        ) tuom on su.id = tuom.user_id
+        inner join public.tk_organization org on org.id = tuom.organization_id
         left join public.tk_organization org2 on org.parent_id = org2.id
-        where org.id in
+        where su.username != 'sysadmin' and org.id in
         <foreach collection="orgIdList" item="item" separator="," open="(" close=")">
             #{item}
         </foreach>
         ) temp1
-        left join (select wh.create_user,
+        inner join (select wh.create_user,
         wh.project_id,
         project.name as project_name,
         project.contract_name as contract_name,
+        project.custom_name as customer_name,
         sum(COALESCE(duration, 0)) as project_work_hours
         from business.tf_pm_workinghours_w wh
         inner join business.tf_pm_project_w project on wh.project_id = project.id
-        where work_date like concat(#{month}, '%')
-        group by wh.create_user, wh.project_id, project.name,project.contract_name) temp2
+        where wh.work_date like concat(#{month}, '%')
+        group by wh.create_user, wh.project_id, project.name,project.contract_name, project.custom_name
+        union all
+        select wh.create_user,
+        wh.project_id,
+        '其他' as project_name,
+        '其他' as contract_name,
+        '其他' as customer_name,
+        sum(COALESCE(duration, 0)) as project_work_hours
+        from business.tf_pm_workinghours_w wh
+        where wh.work_date like concat(#{month}, '%')
+        and wh.register_type='7'
+        group by wh.create_user, wh.project_id) temp2
         on temp1.user_id = temp2.create_user
+        order by temp1.user_id,temp1.dept_id,temp2.project_id
     </select>
     <select id="getCompleteTask" resultType="java.lang.Integer">
         select count(distinct task.id)
@@ -311,5 +328,75 @@
           and bug.deleted = 0
         group by bug.title
     </select>
+    <select id="getCreateTask" resultType="java.lang.Integer">
+        select count(1)
+        from business.tf_pm_task_w task
+        where task.project_id = #{projectId}
+          and task.create_user = #{userId}
+          and date (task.create_date) = #{date}
+          and task.deleted = 0
+    </select>
+    <select id="getVerifyTask" resultType="java.lang.Integer">
+        select count(1)
+        from business.tf_pm_task_w task
+        where task.project_id = #{projectId}
+          and task.status = '3'
+          and task.already_confirm_id like concat('%', #{userId}, '%')
+          and date (task.complete_time) = #{date}
+          and task.deleted = 0
+    </select>
+    <select id="getRegressionTask" resultType="java.lang.Integer">
+        select count(distinct task.id) from business.tf_pm_task_w task
+        inner join business.tf_pm_tasklog_w tlog on tlog.task_id = task.id
+        where task.project_id =  #{projectId}
+          and tlog.source_status = '4'
+          and tlog.create_date =  #{date}
+          and tlog.create_user = #{userId}
+          and task.deleted = 0
+    </select>
+    <select id="getAwaitVerifyTask" resultType="java.lang.Integer">
+        select count(1)
+        from business.tf_pm_task_w task
+        where task.project_id = #{projectId}
+          and task.status = '2'
+          and task.confirm_id like concat('%', #{userId}, '%')
+          and date (task.complete_time) = #{date}
+          and task.deleted = 0
+    </select>
+    <select id="getCreateBug" resultType="java.lang.Integer">
+        select count(1)
+        from business.tf_pm_bug_w bug
+        where bug.project_id = #{projectId}
+          and bug.create_user = #{userId}
+          and date (bug.create_time) = #{date}
+          and bug.deleted = 0
+    </select>
+    <select id="getVerifyBug" resultType="java.lang.Integer">
+        select count(1)
+        from business.tf_pm_bug_w bug
+        where bug.project_id = #{projectId}
+          and bug.status = '3'
+          and bug.sure_id like concat('%', #{userId}, '%')
+          and date (bug.complete_time) = #{date}
+          and bug.deleted = 0
+    </select>
+    <select id="getRegressionBug" resultType="java.lang.Integer">
+        select count(distinct bug.id) from business.tf_pm_bug_w bug
+        inner join business.tf_pm_buglog_w blog on bLog.bug_id = bug.id
+        where bug.project_id =  #{projectId}
+          and bLog.status = '4'
+          and bLog.handle_time =  #{date}
+          and bLog.handle_user = #{userId}
+          and bug.deleted = 0
+    </select>
+    <select id="getAwaitVerifyBug" resultType="java.lang.Integer">
+        select count(1)
+        from business.tf_pm_bug_w bug
+        where bug.project_id = #{projectId}
+          and bug.status = '2'
+          and bug.sure_id like concat('%', #{userId}, '%')
+          and date (bug.complete_time) = #{date}
+          and bug.deleted = 0
+    </select>
 
 </mapper>

+ 8 - 7
pms-service/src/main/resources/mapper/PlanListMapper.xml

@@ -8,14 +8,15 @@
         sum(B.accure_time) working_Day,
         count(Case when b.status='3' then 1 end) task_Count_Close,
         count(b.id) task_Count_Total
-        FROm business.tf_pm_plan_list_w c left join business.tf_pm_plan_w A  on c.id = a.list_id
-        left join business.tf_pm_task_w b on a.id = b.plan_id
-        where b.deleted = 0
-        <if test="planList !=null">
-            <if test="planList.projectId !=null">
-                and c.project_id = #{planList.projectId}
+        FROm business.tf_pm_plan_list_w c left join business.tf_pm_plan_w A on c.id = a.list_id
+        left join business.tf_pm_task_w b on a.id = b.plan_id and b.deleted = 0
+        <where>
+            <if test="planList !=null">
+                <if test="planList.projectId !=null">
+                    and c.project_id = #{planList.projectId}
+                </if>
             </if>
-        </if>
+        </where>
         group by c.id
         order by c.create_date desc
     </select>