Browse Source

周、月各项目工时统计

fuyuhchuan 10 months ago
parent
commit
f8bcbb19fe

+ 5 - 3
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java

@@ -30,9 +30,10 @@ public class PmWorkReportController {
 
     /**
      * 周工作报告查询
+     *
      * @param startDate 开始时间
-     * @param endDate 结束时间
-     * @param id 报告id
+     * @param endDate   结束时间
+     * @param id        报告id
      * @return
      */
     @GetMapping("/week")
@@ -55,10 +56,11 @@ public class PmWorkReportController {
 
     /**
      * 统计工时
+     *
      * @return
      */
     @GetMapping("/workTimeTotal")
-    public ApiResult<List<Map<String, Object>>> weekWork(){
+    public ApiResult<List<Map<String, Object>>> weekWork() {
         return ApiResult.success(pmWorkReportService.countTime());
     }
 }

+ 14 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmWorkContentMapper.java

@@ -2,8 +2,15 @@ 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 org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
 /**
  * <p>
  * 工作内容表 Mapper 接口
@@ -15,4 +22,11 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface PmWorkContentMapper extends CrudMapper<PmWorkContent> {
 
+    List<PmProjectWorkTimeVo> workTimeCount(@Param("startTime") LocalDateTime startTime,
+                                            @Param("endTime") LocalDateTime endTime,
+                                            @Param("userId") Long userId);
+
+    List<PmProjectTotalWorkTimeVo> timeCount(@Param("startTime") LocalDateTime startTime,
+                                             @Param("endTime") LocalDateTime endTime,
+                                             @Param("userId") Long userId);
 }

+ 50 - 27
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -14,6 +14,7 @@ import com.usky.iot.service.PmProjectService;
 import com.usky.iot.service.PmWorkContentService;
 import com.usky.iot.service.PmWorkReportService;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.iot.service.vo.PmProjectTotalWorkTimeVo;
 import com.usky.iot.service.vo.PmProjectWorkTimeVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -23,6 +24,7 @@ import java.math.RoundingMode;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 
@@ -78,7 +80,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         LambdaQueryWrapper<PmWorkReport> queryWrapperR = Wrappers.lambdaQuery();
         queryWrapperR.select(PmWorkReport::getId, PmWorkReport::getReportDate, PmWorkReport::getSubmitDate, PmWorkReport::getTomorrowPlan, PmWorkReport::getCoordinateWork, PmWorkReport::getCcTo)
                 .eq(PmWorkReport::getSubmitterId, SecurityUtils.getUserId())
-                .between(PmWorkReport::getReportDate, startDate, endDate)
+                .between(PmWorkReport::getReportDate, startDate1, endDate1)
                 .orderByAsc(PmWorkReport::getReportDate)
                 .apply(reportId != 0, "id = " + reportId);
         List<PmWorkReport> reports = this.list(queryWrapperR);
@@ -260,50 +262,71 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         LocalDate today = LocalDate.now();
         LocalDate startOfWeek = today.with(TemporalAdjusters.previousOrSame(java.time.DayOfWeek.MONDAY));
         LocalDate endOfWeek = today.with(TemporalAdjusters.nextOrSame(java.time.DayOfWeek.SUNDAY));
+        LocalDateTime startOfWeekDateTime = startOfWeek.atStartOfDay();
+        LocalDateTime endOfWeekDateTime = endOfWeek.atTime(23, 59, 59);
         LocalDate startOfMonth = today.withDayOfMonth(1);
         LocalDate endOfMonth = today.withDayOfMonth(today.lengthOfMonth());
+        LocalDateTime startOfMonthDateTime = startOfMonth.atStartOfDay();
+        LocalDateTime endOfMonthDateTime = endOfMonth.atTime(23, 59, 59);
+
         BigDecimal weekTotal = BigDecimal.ZERO;
-        LambdaQueryWrapper<PmWorkContent> wrapperW = Wrappers.lambdaQuery();
-        wrapperW.eq(PmWorkContent::getSubmitterId,SecurityUtils.getUserId())
-                .between(PmWorkContent::getCreateTime,startOfWeek,endOfWeek);
-        List<PmWorkContent> week = pmWorkContentMapper.selectList(wrapperW);
-        if (week.isEmpty()){
-            weekTotalMap.put("WeekWorkTimeTotal",0);
-            weekMap.put("WeeklyData",week);
-        }
-        for (int i = 0; i < week.size(); i++) {
-            weekTotal = weekTotal.add(week.get(i).getWorkTime());
-        }
-        BigDecimal monthTotal = BigDecimal.ZERO;
-        LambdaQueryWrapper<PmWorkContent> wrapperM = Wrappers.lambdaQuery();
-        wrapperM.eq(PmWorkContent::getSubmitterId,SecurityUtils.getUserId())
-                .between(PmWorkContent::getCreateTime,startOfMonth,endOfMonth);
-        List<PmWorkContent> month = pmWorkContentMapper.selectList(wrapperW);
-        if (month.isEmpty()){
-            monthTotalMap.put("MonthWorkTimeTotal",0);
-            monthMap.put("MonthlyData",month);
+        List<PmProjectWorkTimeVo> week = pmWorkContentMapper.workTimeCount(startOfWeekDateTime, endOfWeekDateTime, SecurityUtils.getUserId());
+        if (week.isEmpty()) {
+            weekTotalMap.put("WeekWorkTimeTotal", 0);
+            weekMap.put("WeeklyData", week);
         }
-        for (int j = 0; j < month.size(); j++) {
-            monthTotal = monthTotal.add(month.get(j).getWorkTime());
+        List<PmProjectTotalWorkTimeVo> workTimeVoListW = pmWorkContentMapper.timeCount(startOfWeekDateTime, endOfWeekDateTime, SecurityUtils.getUserId());
+        for (int i = 0; i < workTimeVoListW.size(); i++) {
+            weekTotal = weekTotal.add(workTimeVoListW.get(i).getTotalWorkTime());
         }
+        BigDecimal totalPercentageW = BigDecimal.ZERO;
         for (int a = 0; a < week.size(); a++) {
             PmProjectWorkTimeVo workTimeVo = new PmProjectWorkTimeVo();
             workTimeVo.setProjectName(week.get(a).getProjectName());
             workTimeVo.setWorkTime(week.get(a).getWorkTime());
+            if (a != week.size() - 1) {
+                BigDecimal percentage = week.get(a).getWorkTime().divide(weekTotal, scale, roundingMode);
+                workTimeVo.setPercentage(percentage);
+                totalPercentageW = totalPercentageW.add(percentage);
+            } else {
+                BigDecimal lastPercentage = BigDecimal.ONE.subtract(totalPercentageW);
+                workTimeVo.setPercentage(lastPercentage);
+            }
             workTimeVo.setPercentage(week.get(a).getWorkTime().divide(weekTotal, scale, roundingMode));
             returnListW.add(workTimeVo);
         }
+
+        BigDecimal monthTotal = BigDecimal.ZERO;
+        List<PmProjectWorkTimeVo> month = pmWorkContentMapper.workTimeCount(startOfMonthDateTime, endOfMonthDateTime, SecurityUtils.getUserId());
+        if (month.isEmpty()) {
+            weekTotalMap.put("MonthWorkTimeTotal", 0);
+            weekMap.put("MonthlyData", month);
+        }
+        List<PmProjectTotalWorkTimeVo> workTimeVoListM = pmWorkContentMapper.timeCount(startOfMonthDateTime, endOfMonthDateTime, SecurityUtils.getUserId());
+        for (int i = 0; i < workTimeVoListM.size(); i++) {
+            monthTotal = monthTotal.add(workTimeVoListM.get(i).getTotalWorkTime());
+        }
+        BigDecimal totalPercentageM = BigDecimal.ZERO;
         for (int b = 0; b < month.size(); b++) {
             PmProjectWorkTimeVo workTimeVo = new PmProjectWorkTimeVo();
             workTimeVo.setProjectName(month.get(b).getProjectName());
             workTimeVo.setWorkTime(month.get(b).getWorkTime());
-            workTimeVo.setPercentage(month.get(b).getWorkTime().divide(weekTotal, scale, roundingMode));
+            if (b != month.size() - 1) {
+                BigDecimal percentage = month.get(b).getWorkTime().divide(monthTotal, scale, roundingMode);
+                workTimeVo.setPercentage(percentage);
+                totalPercentageM = totalPercentageM.add(percentage);
+            } else {
+                BigDecimal lastPercentage = BigDecimal.ONE.subtract(totalPercentageM);
+                workTimeVo.setPercentage(lastPercentage);
+            }
+
             returnListM.add(workTimeVo);
         }
-        weekTotalMap.put("WeekWorkTimeTotal",weekTotal);
-        monthTotalMap.put("MonthWorkTimeTotal",monthTotal);
-        weekMap.put("WeeklyData",returnListW);
-        monthMap.put("MonthlyData",returnListM);
+
+        weekTotalMap.put("WeekWorkTimeTotal", weekTotal);
+        monthTotalMap.put("MonthWorkTimeTotal", monthTotal);
+        weekMap.put("WeeklyData", returnListW);
+        monthMap.put("MonthlyData", returnListM);
         returnList.add(weekTotalMap);
         returnList.add(monthTotalMap);
         returnList.add(weekMap);

+ 19 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/PmProjectTotalWorkTimeVo.java

@@ -0,0 +1,19 @@
+package com.usky.iot.service.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-06-04 16:32
+ */
+@Data
+public class PmProjectTotalWorkTimeVo {
+    /**
+     * 总工时
+     */
+    private BigDecimal totalWorkTime;
+}
+

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

@@ -4,19 +4,30 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.usky.iot.domain.PmWorkContent">
-        <id column="id" property="id" />
-        <result column="report_id" property="reportId" />
-        <result column="project_id" property="projectId" />
-        <result column="project_name" property="projectName" />
-        <result column="submitter_id" property="submitterId" />
-        <result column="work_content" property="workContent" />
-        <result column="work_time" property="workTime" />
-        <result column="create_by" property="createBy" />
-        <result column="create_time" property="createTime" />
-        <result column="update_by" property="updateBy" />
-        <result column="update_time" property="updateTime" />
-        <result column="dept_id" property="deptId" />
-        <result column="tenant_id" property="tenantId" />
+        <id column="id" property="id"/>
+        <result column="report_id" property="reportId"/>
+        <result column="project_id" property="projectId"/>
+        <result column="project_name" property="projectName"/>
+        <result column="submitter_id" property="submitterId"/>
+        <result column="work_content" property="workContent"/>
+        <result column="work_time" property="workTime"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="dept_id" property="deptId"/>
+        <result column="tenant_id" property="tenantId"/>
     </resultMap>
+    <select id="workTimeCount" resultType="com.usky.iot.service.vo.PmProjectWorkTimeVo">
+        SELECT project_name, SUM(work_time) as workTime
+        FROM pm_work_content
+        WHERE submitter_id = #{userId} AND create_time BETWEEN #{startTime} AND #{endTime}
+        GROUP BY project_name
+    </select>
+    <select id="timeCount" resultType="com.usky.iot.service.vo.PmProjectTotalWorkTimeVo">
+    SELECT SUM(work_time) as totalWorkTime
+    FROM pm_work_content
+    WHERE submitter_id = #{userId} AND create_time BETWEEN #{startTime} AND #{endTime}
+</select>
 
 </mapper>