Browse Source

工时统计接口

fuyuhchuan 9 months ago
parent
commit
ba81559e33

+ 14 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java

@@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
 import java.util.List;
 
 /**
@@ -51,5 +52,18 @@ public class PmWorkContentController {
         }
         return ApiResult.success(pmWorkContentService.workReportQuery(startDate, endDate, projectName, projectAscription));
     }
+
+    @GetMapping("/workHourStatistic")
+    public ApiResult<List<Object>> workHourStatistic(@RequestParam(value = "userId", required = false) Long userId,
+                                                           @RequestParam(value = "filter", required = false, defaultValue = "1") Integer filter,
+                                                           @RequestParam(value = "startDate", required = false) String startDate,
+                                                           @RequestParam(value = "endDate", required = false) String endDate,
+                                                           @RequestParam(value = "workerOrProject", required = false, defaultValue = "1") Integer workerOrProject) {
+        if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
+            startDate = LocalDate.now().with(TemporalAdjusters.firstDayOfYear()).toString();
+            endDate = LocalDate.now().with(TemporalAdjusters.lastDayOfYear()).toString();
+        }
+        return ApiResult.success(pmWorkContentService.workHourStatistic(userId, filter, startDate, endDate, workerOrProject));
+    }
 }
 

+ 6 - 4
service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmWorkContentMapper.java

@@ -2,8 +2,8 @@ package com.usky.iot.mapper;
 
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.common.mybatis.core.CrudMapper;
-import com.usky.iot.service.vo.PmProjectTotalWorkTimeVo;
 import com.usky.iot.service.vo.PmProjectWorkTimeVo;
+import com.usky.iot.service.vo.WorkHoursStatisticsVO;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
@@ -26,7 +26,9 @@ public interface PmWorkContentMapper extends CrudMapper<PmWorkContent> {
                                             @Param("endTime") LocalDateTime endTime,
                                             @Param("userId") Long userId);
 
-/*    List<PmProjectTotalWorkTimeVo> timeCount(@Param("startTime") LocalDateTime startTime,
-                                             @Param("endTime") LocalDateTime endTime,
-                                             @Param("userId") Long userId);*/
+    List<WorkHoursStatisticsVO> workHoursStatistics(@Param("startTime") LocalDate startTime,
+                                                    @Param("endTime") LocalDate endTime,
+                                                    @Param("userId") Long userId,
+                                                    @Param("tenantId") Integer tenantId);
+
 }

+ 19 - 9
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java

@@ -3,9 +3,6 @@ package com.usky.iot.service;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.common.mybatis.core.CrudService;
 import com.usky.iot.domain.PmWorkReport;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -20,15 +17,17 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
 
     /**
      * 清空报告内容
+     *
      * @param reportId 报告id
      */
     void deleteContent(Integer reportId);
 
     /**
      * 报告记录中查询项目名与id
-     * @param startDate 开始时间
-     * @param endDate 结束时间
-     * @param projectName 项目名
+     *
+     * @param startDate         开始时间
+     * @param endDate           结束时间
+     * @param projectName       项目名
      * @param projectAscription 查询标识(1:我负责的;2:抄送我的)
      * @return
      */
@@ -36,12 +35,23 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
 
     /**
      * 报告记录
-     * @param startDate 开始时间
-     * @param endDate 结束时间
-     * @param projectName 项目名
+     *
+     * @param startDate         开始时间
+     * @param endDate           结束时间
+     * @param projectName       项目名
      * @param projectAscription 查询标识(1:我负责的;2:抄送我的)
      * @return
      */
     List<PmWorkReport> workReportQuery(String startDate, String endDate, String projectName, Integer projectAscription);
 
+    /**
+     * @param userId          用户id
+     * @param filter          是否过滤0工时(默认1:不过滤;2:过滤)
+     * @param startDate       开始时间
+     * @param endDate         结束时间
+     * @param workerOrProject 打工仔还是项目(默认1:打工仔;2:项目)
+     * @return 返回项目名(或牛马名)以及项目工时
+     */
+    List<Object> workHourStatistic(Long userId, Integer filter, String startDate, String endDate, Integer workerOrProject);
+
 }

+ 110 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -1,23 +1,30 @@
 package com.usky.iot.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.common.security.utils.SecurityUtils;
+import com.usky.iot.domain.PmProject;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.domain.PmWorkReport;
+import com.usky.iot.mapper.PmProjectMapper;
 import com.usky.iot.mapper.PmWorkContentMapper;
 import com.usky.iot.mapper.PmWorkReportMapper;
 import com.usky.iot.mapper.SysUserMapper;
 import com.usky.iot.service.PmWorkContentService;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.iot.service.vo.ProjectWorkTimeVO;
+import com.usky.iot.service.vo.UserWorkTimeVO;
+import com.usky.iot.service.vo.WorkHoursStatisticsVO;
 import com.usky.system.domain.SysUser;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -36,6 +43,9 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     @Autowired
     private SysUserMapper sysUserMapper;
 
+    @Autowired
+    private PmProjectMapper pmProjectMapper;
+
     @Override
     public void deleteContent(Integer reportId) {
         LambdaQueryWrapper<PmWorkContent> deleteWrapper = Wrappers.lambdaQuery();
@@ -124,4 +134,102 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         }
         return reportList;
     }
+
+    @Override
+    public List<Object> workHourStatistic(Long userId, Integer filter, String startDate, String endDate, Integer workerOrProject) {
+        List<ProjectWorkTimeVO> projectWorkTime = new ArrayList<>();
+        List<UserWorkTimeVO> userWorkTimeVO = new ArrayList<>();
+        Integer tenantId = SecurityUtils.getTenantId();
+        List<Object> returnList = new ArrayList<>();
+        LocalDate start = LocalDate.parse(startDate);
+        LocalDate end = LocalDate.parse(endDate);
+        //找出租户下所有项目
+        LambdaQueryWrapper<PmProject> projectQuery = Wrappers.lambdaQuery();
+        projectQuery.select(PmProject::getProjectName)
+                .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
+                .orderByAsc(PmProject::getProjectName);
+        List<PmProject> projects = pmProjectMapper.selectList(projectQuery);
+        List<String> pmProjectName = projects.stream()
+                .map(PmProject::getProjectName)
+                .collect(Collectors.toList());
+        //统计userId每个项目所需工时
+        List<WorkHoursStatisticsVO> userAndProject = baseMapper.workHoursStatistics(start, end, userId, tenantId);
+        List<String> nickName = userAndProject.stream()
+                .map(WorkHoursStatisticsVO::getNickName)
+                .distinct()
+                .collect(Collectors.toList());
+        if (workerOrProject != 2) {
+            returnList.add(nickName);
+            //重组返回数据结构
+            for (PmProject project : projects) {
+                String name = project.getProjectName();
+                ProjectWorkTimeVO projectWorkTimeVO = new ProjectWorkTimeVO();
+                projectWorkTimeVO.setProjectName(name);
+                List<BigDecimal> workTime = new ArrayList<>();
+                boolean hasNonZeroWorkTime = false;
+                for (String currentNickName : nickName) {
+                    boolean foundWorkTime = false;
+                    for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProject) {
+                        String userNickName = workHoursStatisticsVO.getNickName();
+                        String projectName = workHoursStatisticsVO.getProjectName();
+                        BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
+                        if (projectName.equals(name) && userNickName.equals(currentNickName)) {
+                            workTime.add(userProjectWorkTime);
+                            if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                                hasNonZeroWorkTime = true;
+                            }
+                            foundWorkTime = true;
+                            break;
+                        }
+                    }
+                    if (!foundWorkTime) {
+                        workTime.add(BigDecimal.ZERO);
+                    }
+                }
+                if (filter != 2 || hasNonZeroWorkTime) {
+                    projectWorkTimeVO.setWorkTime(workTime);
+                    projectWorkTime.add(projectWorkTimeVO);
+                }
+            }
+            returnList.add(projectWorkTime);
+        } else {
+            returnList.add(pmProjectName);
+            //重组返回数据结构
+            for (String uName : nickName) {
+                String name = uName;
+                UserWorkTimeVO userWorkTimeVO2 = new UserWorkTimeVO();
+                userWorkTimeVO2.setUserNickName(name);
+                List<BigDecimal> workTime = new ArrayList<>();
+                boolean hasNonZeroWorkTime = false;
+                for (String currentNickName : pmProjectName) {
+                    boolean foundWorkTime = false;
+                    for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProject) {
+                        String userNickName = workHoursStatisticsVO.getNickName();
+                        String projectName = workHoursStatisticsVO.getProjectName();
+                        BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
+                        if (userNickName.equals(name) && projectName.equals(currentNickName)) {
+                            workTime.add(userProjectWorkTime);
+                            if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                                hasNonZeroWorkTime = true;
+                            }
+                            foundWorkTime = true;
+                            break;
+                        }
+                    }
+                    if (!foundWorkTime) {
+                        workTime.add(BigDecimal.ZERO);
+                    }
+                }
+                if (filter != 2 || hasNonZeroWorkTime) {
+                    userWorkTimeVO2.setWorkTime(workTime);
+                    userWorkTimeVO.add(userWorkTimeVO2);
+                }
+            }
+            returnList.add(userWorkTimeVO);
+        }
+
+
+        return returnList;
+    }
+
 }

+ 18 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/ProjectWorkTimeVO.java

@@ -0,0 +1,18 @@
+package com.usky.iot.service.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-06-27 14:15
+ */
+@Data
+public class ProjectWorkTimeVO {
+    private String projectName;
+    private List<BigDecimal> workTime;
+}
+

+ 18 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/UserWorkTimeVO.java

@@ -0,0 +1,18 @@
+package com.usky.iot.service.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-06-27 14:15
+ */
+@Data
+public class UserWorkTimeVO {
+    private String userNickName;
+    private List<BigDecimal> workTime;
+}
+

+ 31 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkHoursStatisticsVO.java

@@ -0,0 +1,31 @@
+package com.usky.iot.service.vo;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-06-25 11:32
+ */
+@Data
+public class WorkHoursStatisticsVO {
+
+    /**
+     * 员工昵称
+     */
+    private String nickName;
+
+    /**
+     * 项目名
+     */
+    private String projectName;
+
+    /**
+     * 工时
+     */
+    private BigDecimal workTime;
+
+}
+

+ 13 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml

@@ -27,4 +27,17 @@
     GROUP BY pc.project_name
     </select>
 
+    <select id="workHoursStatistics" resultType="com.usky.iot.service.vo.WorkHoursStatisticsVO">
+        SELECT u.nick_name as nickName, pc.project_name as projectName, SUM(pc.work_time) as workTime
+        FROM pm_work_content pc
+        JOIN pm_work_report pr ON pc.report_id = pr.id
+        JOIN sys_user u ON pc.submitter_id = u.user_id
+        <if test="userId != null and userId != '' and userId != 0 ">
+            AND pr.submitter_id = #{userId}
+        </if>
+        AND pr.report_date BETWEEN #{startTime} AND #{endTime}
+        AND pc.tenant_id = #{tenantId}
+        GROUP BY u.nick_name, pc.project_name
+    </select>
+
 </mapper>

+ 1 - 1
service-iot/service-iot-biz/src/main/resources/mapper/iot/SysUserMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="com.usky.iot.mapper.SysUserMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.usky.system.domain.SysUser">
+    <resultMap id="BaseResultMap" type="com.usky.iot.domain.SysUser">
         <id column="user_id" property="userId" />
         <result column="dept_id" property="deptId" />
         <result column="user_name" property="userName" />