소스 검색

报告记录新增查询指定人所有人报;工时统计添加数据权限;优化部分代码

fuyuchuan 5 달 전
부모
커밋
275357a0bc
14개의 변경된 파일378개의 추가작업 그리고 191개의 파일을 삭제
  1. 1 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java
  2. 2 3
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmReceiveController.java
  3. 32 6
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java
  4. 0 19
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java
  5. 1 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmReceiveService.java
  6. 13 5
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java
  7. 0 15
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/config/DingTalkAndMessage.java
  8. 4 3
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java
  9. 6 2
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmReceiveServiceImpl.java
  10. 245 90
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java
  11. 9 4
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java
  12. 55 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkTimeExportTwoVO.java
  13. 0 6
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkTimeExportVO.java
  14. 10 36
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml

+ 1 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java

@@ -61,7 +61,7 @@ public class PmProjectController {
                                                      @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
                                                      @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize,
                                                      @RequestParam(value = "projectId", required = false) Integer projectId,
-                                                     @RequestParam(value = "visibleRange", required = false) Byte visibleRange) {
+                                                     @RequestParam(value = "visibleRange", required = false, defaultValue = "1") Byte visibleRange) {
         return ApiResult.success(pmProjectService.projectList(projectName, projectType, projectStatus, projectAscription, pageNum, pageSize, projectId, visibleRange));
     }
 

+ 2 - 3
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmReceiveController.java

@@ -40,10 +40,9 @@ public class PmReceiveController {
         pmReceiveService.updateReadFlag(reportId);
     }
 
-    @DataScope
     @GetMapping("/deptTest")
-    public List<SysUser> deptTest(){
-        return pmReceiveService.test();
+    public List<SysUser> deptTest(Integer tenantId){
+        return pmReceiveService.test(tenantId);
     }
 
 

+ 32 - 6
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java

@@ -9,6 +9,7 @@ import com.usky.common.log.enums.BusinessType;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.domain.PmWorkReport;
 import com.usky.iot.service.PmWorkContentService;
+import com.usky.iot.service.vo.WorkTimeExportTwoVO;
 import com.usky.iot.service.vo.WorkTimeExportVO;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,8 +47,9 @@ public class PmWorkContentController {
     public ApiResult<List<PmWorkContent>> pageList(@RequestParam(value = "startDate", required = false) String startDate,
                                                    @RequestParam(value = "endDate", required = false) String endDate,
                                                    @RequestParam(value = "projectName", required = false) String projectName,
-                                                   @RequestParam(value = "projectAscription", required = false, defaultValue = "1") Integer projectAscription) {
-        return ApiResult.success(pmWorkContentService.projectQuery(startDate, endDate, projectName, projectAscription));
+                                                   @RequestParam(value = "projectAscription", required = false, defaultValue = "1") Integer projectAscription,
+                                                   @RequestParam(value = "submitterId" , required = false) Long submitterId) {
+        return ApiResult.success(pmWorkContentService.projectQuery(startDate, endDate, projectName, projectAscription, submitterId));
     }
 
     /**
@@ -89,8 +91,8 @@ public class PmWorkContentController {
                                                     @RequestParam(value = "startDate", required = false) String startDate,
                                                     @RequestParam(value = "endDate", required = false) String endDate,
                                                     @RequestParam(value = "projectId", required = false) Integer projectId,
-                                                    @RequestParam(value = "userId", required = false) Long userId) {
-        return ApiResult.success(pmWorkContentService.reportPage(projectAscription, pageNum, pageSize, reportId, startDate, endDate, projectId, userId));
+                                                    @RequestParam(value = "submitterId", required = false) Long submitterId) {
+        return ApiResult.success(pmWorkContentService.reportPage(projectAscription, pageNum, pageSize, reportId, startDate, endDate, projectId, submitterId));
     }
 
     /**
@@ -105,7 +107,7 @@ public class PmWorkContentController {
      * @return
      */
     @GetMapping("/workHourStatistic")
-    public ApiResult<List<Object>> workHourStatistic(@RequestParam(value = "userId", required = false) Long userId,
+    public ApiResult<List<Object>> workHourStatistic(@RequestParam(value = "userId", required = false) List<Long> userId,
                                                      @RequestParam(value = "projectId", required = false) Integer projectId,
                                                      @RequestParam(value = "filter", required = false, defaultValue = "1") Integer filter,
                                                      @RequestParam(value = "startDate", required = false) String startDate,
@@ -137,7 +139,31 @@ public class PmWorkContentController {
                        @RequestParam(value = "endDate", required = false) String endDate) throws IOException {
         List<WorkTimeExportVO> list = pmWorkContentService.workHourStatisticExport(userId, projectId, startDate, endDate);
         ExcelUtil<WorkTimeExportVO> util = new ExcelUtil<WorkTimeExportVO>(WorkTimeExportVO.class);
-        util.exportExcel(response, list, "工时统计", "工时统计");
+        util.exportExcel(response, list, "工时明细", "工时明细");
+    }
+
+    /**
+     * 工时导出
+     *
+     * @param response
+     * @param userId
+     * @param projectId
+     * @param startDate
+     * @param endDate
+     * @throws IOException
+     */
+    @Log(title = "导出工时统计", businessType = BusinessType.EXPORT)
+    @PostMapping("/workHourExport")
+    public void export(HttpServletResponse response,
+                       @RequestParam(value = "userId", required = false) Long userId,
+                       @RequestParam(value = "projectId", required = false) Integer projectId,
+                       @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) throws IOException {
+        List<WorkTimeExportTwoVO> list = pmWorkContentService.workHourExport(userId, projectId, filter, startDate, endDate, workerOrProject);
+        ExcelUtil<WorkTimeExportTwoVO> util = new ExcelUtil<WorkTimeExportTwoVO>(WorkTimeExportTwoVO.class);
+        util.exportExcel(response, list, "工时明细", "工时明细");
     }
 
 }

+ 0 - 19
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java

@@ -57,14 +57,6 @@ public class PmWorkReportController {
         pmWorkReportService.addReport(pmWorkReport);
     }
 
-    /**
-     * 上传文件
-     */
-/*    @GetMapping("/uploadFiles")
-    public void uploadFiles(){
-        dingTalkAndMessage.uploadFiles();
-    }*/
-
     /**
      * 统计工时
      *
@@ -75,17 +67,6 @@ public class PmWorkReportController {
         return ApiResult.success(pmWorkReportService.countTime(dateType, dateNum));
     }
 
-    /**
-     * 测试定时发送
-     *
-     * @param
-     */
-    @GetMapping("/ScheduledTasks")
-    public void add(){
-        LocalDateTime now = LocalDateTime.now();
-        pmWorkReportService.timedSending(now);
-    }
-
     /**
      * 删除工作报告
      *

+ 1 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmReceiveService.java

@@ -26,7 +26,7 @@ public interface PmReceiveService extends CrudService<PmReceive> {
      */
     void updateReadFlag(Integer reportId);
 
-    List<SysUser> test();
+    List<SysUser> test( Integer tenantId);
 
 
 }

+ 13 - 5
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java

@@ -1,9 +1,11 @@
 package com.usky.iot.service;
 
+import com.ruoyi.common.datascope.annotation.DataScope;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.common.mybatis.core.CrudService;
 import com.usky.iot.domain.PmWorkReport;
+import com.usky.iot.service.vo.WorkTimeExportTwoVO;
 import com.usky.iot.service.vo.WorkTimeExportVO;
 
 import com.usky.system.domain.SysUser;
@@ -36,7 +38,7 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      * @param projectAscription 查询标识(1:我负责的;2:我收到,3:我发出的)
      * @return
      */
-    List<PmWorkContent> projectQuery(String startDate, String endDate, String projectName, Integer projectAscription);
+    List<PmWorkContent> projectQuery(String startDate, String endDate, String projectName, Integer projectAscription, Long submitterId);
 
     /**
      * 报告记录
@@ -57,8 +59,6 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      */
     List<SysUser> nickNames(List<Long> userIds);
 
-    List<SysUser> allNickName();
-
     /**
      * 报告详情分页列表
      * @param projectAscription 1:我负责;2:我收到;3:我发出
@@ -76,9 +76,9 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      * @param workerOrProject 打工仔还是项目(默认1:打工仔;2:项目)
      * @return 返回项目名(或牛马名)以及项目工时
      */
-    List<Object> workHourStatistic(Long userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject);
+    List<Object> workHourStatistic(List<Long> userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject);
 
-    /** 工时统计导出
+    /** 工时明细导出
      * @param userId          用户id
      * @param startDate       开始时间
      * @param endDate         结束时间
@@ -86,4 +86,12 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      */
     List<WorkTimeExportVO> workHourStatisticExport(Long userId, Integer projectId, String startDate, String endDate);
 
+    /** 工时统计导出
+     * @param userId          用户id
+     * @param startDate       开始时间
+     * @param endDate         结束时间
+     * @return 返回项目名(或牛马名)以及项目工时
+     */
+    List<WorkTimeExportTwoVO> workHourExport(Long userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject);
+
 }

+ 0 - 15
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/config/DingTalkAndMessage.java

@@ -343,20 +343,5 @@ public class DingTalkAndMessage {
         log.info(username + "的工作报告发送消息中心完成-----------------------------------");
     }
 
-/*    @Async("asyncServiceExecutor")
-    public void uploadFiles() {
-        log.info("开始上传文件-----------------------------------");
-        try {
-            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/media/upload");
-            OapiMediaUploadRequest req = new OapiMediaUploadRequest();
-            req.setType("image");
-            req.setMedia(new FileItem("E:/usky/Beckham.png"));
-            OapiMediaUploadResponse rsp = client.execute(req, "0d7b9367a43935fc8b85bc29bd80ac15");
-            System.out.println(rsp.getBody());
-        } catch (ApiException e) {
-            e.printStackTrace();
-        }
-    log.info("上传文件完成-----------------------------------");
-    }*/
 }
 

+ 4 - 3
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java

@@ -306,9 +306,10 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
     public Map<String, Integer> sum() {
         LambdaQueryWrapper<PmProject> lambdaQuery = Wrappers.lambdaQuery();
         lambdaQuery.eq(PmProject::getTenantId, SecurityUtils.getTenantId())
-                // .and(q -> q.eq(PmProject::getProjectHead, SecurityUtils.getUserId())
-                //         .or().apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
-                //         .or().eq(PmProject::getCreateBy, SecurityUtils.getUsername()))
+                .eq(PmProject::getVisibleRange, 1)
+                .and(q -> q.eq(PmProject::getProjectHead, SecurityUtils.getUserId())
+                        .or().apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
+                        .or().eq(PmProject::getCreateBy, SecurityUtils.getUsername()))
                 .eq(PmProject::getDelFlag, 0);
         Integer all = this.count(lambdaQuery);
 

+ 6 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmReceiveServiceImpl.java

@@ -59,12 +59,16 @@ public class PmReceiveServiceImpl extends AbstractCrudService<PmReceiveMapper, P
     }
 
 
+
+    @DataScope
     @Override
-    public List<SysUser> test() {
+    public List<SysUser> test(Integer tenantId) {
         String dataScopeSql = DataScopeContextHolder.getDataScopeSql();
         log.info("DataScopeContextHolder: "+ dataScopeSql);
         LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
-        usersQuery.apply(Objects.nonNull(dataScopeSql), dataScopeSql);
+        usersQuery.select(SysUser::getUserId, SysUser::getUserName)
+                .eq(SysUser::getDelFlag, 0).eq(SysUser::getStatus, tenantId)
+                .apply(Objects.nonNull(dataScopeSql), dataScopeSql);
         return sysUserMapper.selectList(usersQuery);
     }
 

+ 245 - 90
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -7,9 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.datascope.annotation.DataScope;
 import com.ruoyi.common.datascope.context.DataScopeContextHolder;
 import com.usky.common.core.bean.CommonPage;
-import com.usky.common.core.domain.R;
 import com.usky.common.core.exception.BusinessException;
-import com.usky.common.log.annotation.Log;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.domain.PmProject;
@@ -17,7 +15,6 @@ import com.usky.iot.domain.PmReceive;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.domain.PmWorkReport;
 import com.usky.iot.mapper.*;
-import com.usky.iot.service.PmProjectService;
 import com.usky.iot.service.PmWorkContentService;
 import com.usky.iot.service.vo.*;
 import com.usky.system.domain.SysUser;
@@ -178,13 +175,18 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
      * @return: java.util.List<com.usky.iot.domain.PmProject>
      **/
     @Override
-    public List<PmWorkContent> projectQuery(String startDate, String endDate, String projectName, Integer projectAscription) {
+    public List<PmWorkContent> projectQuery(String startDate, String endDate, String projectName, Integer projectAscription, Long submitterId) {
         LocalDateTime startDateTime = null;
         LocalDateTime endDateTime = null;
         LocalDate start = null;
         LocalDate end = null;
         List<PmWorkContent> workContentList = new ArrayList<>();
         List<Integer> reportIds = new ArrayList<>();
+
+        Set<Integer> reportIdsByDate = new HashSet<>();
+        Set<Integer> reportIdsBySubmitterId = new HashSet<>();
+        Set<Integer> finalReportIds = new HashSet<>();
+
         if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) {
             DateTimeFormatter formatter = null;
             try {
@@ -194,15 +196,29 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             }
             start = LocalDate.parse(startDate, formatter);
             end = LocalDate.parse(endDate, formatter);
-            // startDateTime = start.atStartOfDay();
-            // endDateTime = end.atTime(23, 59, 59);
+            startDateTime = start.atStartOfDay();
+            endDateTime = end.atTime(23, 59, 59);
             LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-            reportQuery.select(PmWorkReport::getId).between(PmWorkReport::getReportDate, start, end);
-            reportIds = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toList());
-            if (reportIds.isEmpty()){
-                return workContentList;
-            }
+            reportQuery.select(PmWorkReport::getId).between(PmWorkReport::getSubmitDate, startDateTime, endDateTime);
+            reportIdsByDate = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toSet());
+        }
+
+        if (submitterId != null) {
+            LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
+            reportQuery.select(PmWorkReport::getId).eq(PmWorkReport::getSubmitterId, submitterId);
+            reportIdsBySubmitterId = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toSet());
+        }
+
+        // 取交集
+        if (!reportIdsByDate.isEmpty() && !reportIdsBySubmitterId.isEmpty()) {
+            finalReportIds.addAll(reportIdsByDate);
+            finalReportIds.retainAll(reportIdsBySubmitterId);
+        } else if (!reportIdsByDate.isEmpty()) {
+            finalReportIds.addAll(reportIdsByDate);
+        } else if (!reportIdsBySubmitterId.isEmpty()) {
+            finalReportIds.addAll(reportIdsBySubmitterId);
         }
+        reportIds = new ArrayList<>(finalReportIds);
 
 
         LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
@@ -415,13 +431,6 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         return sysUserMapper.selectList(usersQuery);
     }
 
-    @Override
-    public List<SysUser> allNickName() {
-        LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
-        usersQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName).eq(SysUser::getTenantId, SecurityUtils.getTenantId()).eq(SysUser::getDelFlag, 0);
-        return sysUserMapper.selectList(usersQuery);
-    }
-
     /**
      * @description: 报告记录分页
      * @author: fu
@@ -432,13 +441,19 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     @Override
     public CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer reportId,
                                                String startDate, String endDate, Integer projectId, Long userId) {
-        // LocalDateTime startDateTime = null;
-        // LocalDateTime endDateTime = null;
+        LocalDateTime startDateTime = null;
+        LocalDateTime endDateTime = null;
         Integer tenantId = SecurityUtils.getTenantId();
         LocalDate start = null;
         LocalDate end = null;
         List<Integer> reportIds = new ArrayList<>();
         CommonPage<PmWorkReport> returnPage = new CommonPage<>(new ArrayList<>(), 0, pageSize, pageNum);
+
+        Set<Integer> reportIdsByUser = new HashSet<>();
+        Set<Integer> reportIdsByDate = new HashSet<>();
+        Set<Integer> reportIdsByProject = new HashSet<>();
+        Set<Integer> reportIdsSet = new HashSet<>();
+
         if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) {
             DateTimeFormatter formatter = null;
             try {
@@ -448,36 +463,63 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             }
             start = LocalDate.parse(startDate, formatter);
             end = LocalDate.parse(endDate, formatter);
-            // startDateTime = start.atStartOfDay();
-            // endDateTime = end.atTime(23, 59, 59);
+            startDateTime = start.atStartOfDay();
+            endDateTime = end.atTime(23, 59, 59);
+            LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
+            reportQuery.select(PmWorkReport::getId).eq(PmWorkReport::getReportStatus, 1).between(PmWorkReport::getSubmitDate, startDateTime, endDateTime);
+            reportIdsByDate = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toSet());
+        }
 
-            if (userId != null && userId > 0){
-                LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-                reportQuery.eq(PmWorkReport::getSubmitterId, userId);
-                IPage<PmWorkReport> reportPage = pmWorkReportMapper.selectPage(new Page<>(pageNum, pageSize), reportQuery);
-                return new CommonPage<>(reportPage.getRecords(), reportPage.getTotal(), pageSize, pageNum);
-            }
+        if (projectId != null) {
+            LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
+            contentLambdaQuery.select(PmWorkContent::getReportId).eq(PmWorkContent::getProjectId, projectId);
+            reportIdsByProject = pmWorkContentMapper.selectList(contentLambdaQuery).stream().map(PmWorkContent::getReportId).collect(Collectors.toSet());
+        }
 
+        if (userId != null) {
             LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-            reportQuery.select(PmWorkReport::getId).eq(PmWorkReport::getReportStatus, 1).between(PmWorkReport::getReportDate, start, end);
-            reportIds = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toList());
-            if (reportIds.isEmpty()){
+            reportQuery.eq(PmWorkReport::getSubmitterId, userId);
+            reportIdsByUser = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toSet());
+            if (reportIdsByProject.isEmpty() && reportIdsByUser.isEmpty()) {
                 return returnPage;
             }
         }
 
-        if (projectId != null && projectId > 0) {
-            LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
-            contentLambdaQuery.select(PmWorkContent::getReportId).eq(PmWorkContent::getProjectId, projectId);
-            reportIds.addAll(pmWorkContentMapper.selectList(contentLambdaQuery).stream().map(PmWorkContent::getReportId).collect(Collectors.toList()));
-            if (reportIds.isEmpty()) {
+        if (!reportIdsByUser.isEmpty() && !reportIdsByProject.isEmpty() && !reportIdsByDate.isEmpty()) {
+            reportIdsSet.addAll(reportIdsByUser);
+            reportIdsSet.retainAll(reportIdsByProject);
+            reportIdsSet.retainAll(reportIdsByDate);
+            if (reportIdsSet.isEmpty()) {
                 return returnPage;
             }
+        } else if (!reportIdsByUser.isEmpty() && !reportIdsByProject.isEmpty()) {
+            reportIdsSet.addAll(reportIdsByUser);
+            reportIdsSet.retainAll(reportIdsByProject);
+            if (reportIdsSet.isEmpty()) {
+                return returnPage;
+            }
+        } else if (!reportIdsByUser.isEmpty() && !reportIdsByDate.isEmpty()) {
+            reportIdsSet.addAll(reportIdsByUser);
+            reportIdsSet.retainAll(reportIdsByDate);
+            if (reportIdsSet.isEmpty()) {
+                return returnPage;
+            }
+        } else if (!reportIdsByProject.isEmpty() && !reportIdsByDate.isEmpty()) {
+            reportIdsSet.addAll(reportIdsByProject);
+            reportIdsSet.retainAll(reportIdsByDate);
+            if (reportIdsSet.isEmpty()) {
+                return returnPage;
+            }
+        } else if (!reportIdsByUser.isEmpty()) {
+            reportIdsSet.addAll(reportIdsByUser);
+        } else if (!reportIdsByProject.isEmpty()) {
+            reportIdsSet.addAll(reportIdsByProject);
+        } else if (!reportIdsByDate.isEmpty()) {
+            reportIdsSet.addAll(reportIdsByDate);
         }
-
+        reportIds = new ArrayList<>(reportIdsSet);
 
         List<PmWorkContent> pmWorkContentList = new ArrayList<>();
-        // Integer tenantId = SecurityUtils.getTenantId();
         Long userId2 = SecurityUtils.getUserId();
         List<Long> userIds = new ArrayList<>();
         List<Integer> receiveList = receive();
@@ -486,7 +528,6 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         }
 
         LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
-        // contentLambdaQuery.select(PmWorkContent::getReportId, PmWorkContent::getWorkContent, PmWorkContent::getWorkTime, PmWorkContent::getProjectName);
         if (reportId != null && reportId >= 0) {
             contentLambdaQuery.eq(PmWorkContent::getReportId, reportId);
             pmWorkContentList = pmWorkContentMapper.selectList(contentLambdaQuery);
@@ -571,16 +612,11 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         // 已读未读数量查询
         List<PmReceive> receives = new ArrayList<>();
         if (!receiveList.isEmpty()) {
-            receives = receives(receiveList);
+            receives = receives(reportIds2);
         }
 
         Map<Integer, List<PmReceive>> reportReceivesMap = new HashMap<>();
         if (!receives.isEmpty()) {
-            List<Long> uId = new ArrayList<>();
-            for (PmReceive pmReceive : receives) {
-                Long receiverId = pmReceive.getReceiverId();
-                uId.add(receiverId);
-            }
             reportReceivesMap = receives.stream().collect(Collectors.groupingBy(PmReceive::getReportId));
         }
 
@@ -630,7 +666,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
 
 
     /**
-     * @description: 获取报告接收人
+     * @description: 获取报告接收人-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [report]
@@ -643,7 +679,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     }
 
     /**
-     * @description: 获取时间段内报告列表(按报告时间查询)
+     * @description: 获取时间段内报告列表(按报告时间查询)-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [startDate, endDate]
@@ -657,7 +693,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     }
 
     /**
-     * @description: 项目查询
+     * @description: 项目查询-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [startDate, endDate]
@@ -676,31 +712,34 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         return pmProjectMapper.selectList(projectsQuery);
     }
 
-
-    private List<SysUser> userNameList(Long userId) {
+    /**
+     * @description: 获取用户列表-工具
+     * @author: fu
+     * @date: 2024/8/8 19:22
+     * @param: [userId]
+     * @return: java.util.List<com.usky.iot.domain.SysUser>
+     **/
+    private List<SysUser> userNameList(List<Long> userId) {
         LambdaQueryWrapper<SysUser> userNameQuery = Wrappers.lambdaQuery();
         userNameQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName, SysUser::getPhonenumber, SysUser::getAvatar,
                         SysUser::getSex, SysUser::getDeptId, SysUser::getAddress)
                 .eq(SysUser::getDelFlag, 0)
                 .eq(SysUser::getStatus, 0);
-        if (userId != null && userId != 0) {
-            userNameQuery.eq(SysUser::getUserId, userId);
+        if (!userId.isEmpty()) {
+            userNameQuery.in(SysUser::getUserId, userId);
             return sysUserMapper.selectList(userNameQuery);
         }
-        userNameQuery.apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()),DataScopeContextHolder.getDataScopeSql());
-        log.info("dataScopeSql: "+DataScopeContextHolder.getDataScopeSql());
-        //userNameQuery.eq(SysUser::getTenantId, tenantId).eq(SysUser::getDeptId, deptId);
+        userNameQuery.apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()), DataScopeContextHolder.getDataScopeSql());
         return sysUserMapper.selectList(userNameQuery);
     }
 
     /**
-     * @description: 工时统计
+     * @description: 工时统计-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [startDate, endDate, projectName, projectAscription]
      * @return: java.util.List<com.usky.iot.domain.PmWorkReport>
      **/
-    //@DataScope//数据权限注解
     private List<PmWorkContent> workTimeCount(List<Long> users, List<Integer> project, String startDate, String endDate) {
         List<PmWorkContent> pmWorkContentList = new ArrayList<>();
         Integer tenantId = SecurityUtils.getTenantId();
@@ -725,7 +764,6 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 return pmWorkContentList;
             }
         }
-        //workTimeQuery.apply(DataScopeContextHolder.getDataScopeSql());// 数据权限设置
         pmWorkContentList = pmWorkContentMapper.selectList(workTimeQuery);
 
         Map<String, PmWorkContent> workTimeMap = new HashMap<>();
@@ -742,11 +780,20 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         return new ArrayList<>(workTimeMap.values());
     }
 
+    /**
+     * @description: 工时统计
+     * @author: fu
+     * @date: 2024/8/8 19:22
+     * @param: [userId, projectId, startDate, endDate]
+     * @return: java.util.List<com.usky.iot.domain.WorkTimeExportVO>
+     **/
     @DataScope
     @Override
-    public List<Object> workHourStatistic(Long userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject) {
+    public List<Object> workHourStatistic(List<Long> userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject) {
         List<ProjectWorkTimeVO> projectWorkTime = new ArrayList<>();
         List<UserWorkTimeVO> userWorkTimeVO = new ArrayList<>();
+        List<ProjectWorkTimeVO> projectWorkTime1 = new ArrayList<>();
+        List<UserWorkTimeVO> userWorkTimeVO1 = new ArrayList<>();
         List<Object> returnList = new ArrayList<>();
         if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
             throw new BusinessException("请设置查询时间范围!");
@@ -837,6 +884,49 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 }
             }
             returnList.add(projectWorkTime);
+
+
+            returnList.add(pmProjectName);
+            // 重组返回数据结构
+            for (String uName : nickName) {
+                String name1 = uName;
+                UserWorkTimeVO userWorkTimeVO2 = new UserWorkTimeVO();
+                userWorkTimeVO2.setProjectOrPerson(name1);
+                List<BigDecimal> workTime1 = new ArrayList<>();
+                boolean hasNonZeroWorkTime1 = false;
+                if (userAndProjectD.isEmpty()) {
+                    for (String currentNickName : pmProjectName) {
+                        workTime1.add(BigDecimal.ZERO);
+                    }
+                } else {
+                    for (String currentNickName : pmProjectName) {
+                        boolean foundWorkTime = false;
+                        for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProjectD) {
+                            String userNickName = workHoursStatisticsVO.getNickName();
+                            String projectName = workHoursStatisticsVO.getProjectName();
+                            BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
+                            if (userNickName == name1 && projectName == currentNickName) {
+                                workTime1.add(userProjectWorkTime);
+                                if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                                    hasNonZeroWorkTime1 = true;
+                                }
+                                foundWorkTime = true;
+                                break;
+                            }
+                        }
+                        if (!foundWorkTime) {
+                            workTime1.add(BigDecimal.ZERO);
+                        }
+                    }
+                }
+                // 过滤0工时
+                if (filter != 2 || hasNonZeroWorkTime1) {
+                    userWorkTimeVO2.setWorkTime(workTime1);
+                    userWorkTimeVO.add(userWorkTimeVO2);
+                }
+            }
+            returnList.add(userWorkTimeVO);
+
         } else {
             returnList.add(pmProjectName);
             // 重组返回数据结构
@@ -852,47 +942,112 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                     }
                 } else {
                     for (String currentNickName : pmProjectName) {
-                    boolean foundWorkTime = false;
-                    for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProjectD) {
-                        String userNickName = workHoursStatisticsVO.getNickName();
-                        String projectName = workHoursStatisticsVO.getProjectName();
-                        BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
-                        if (userNickName == name && projectName == currentNickName) {
-                            workTime.add(userProjectWorkTime);
-                            if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
-                                hasNonZeroWorkTime = true;
+                        boolean foundWorkTime = false;
+                        for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProjectD) {
+                            String userNickName = workHoursStatisticsVO.getNickName();
+                            String projectName = workHoursStatisticsVO.getProjectName();
+                            BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
+                            if (userNickName == name && projectName == currentNickName) {
+                                workTime.add(userProjectWorkTime);
+                                if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                                    hasNonZeroWorkTime = true;
+                                }
+                                foundWorkTime = true;
+                                break;
                             }
-                            foundWorkTime = true;
-                            break;
+                        }
+                        if (!foundWorkTime) {
+                            workTime.add(BigDecimal.ZERO);
                         }
                     }
-                    if (!foundWorkTime) {
+                }
+                // 过滤0工时
+                if (filter != 2 || hasNonZeroWorkTime) {
+                    userWorkTimeVO2.setWorkTime(workTime);
+                    userWorkTimeVO.add(userWorkTimeVO2);
+                }
+            }
+            returnList.add(userWorkTimeVO);
+
+
+            returnList.add(nickName);
+            // 重组返回数据结构
+            for (String name : pmProjectName) {
+                ProjectWorkTimeVO projectWorkTimeVO = new ProjectWorkTimeVO();
+                projectWorkTimeVO.setProjectOrPerson(name);
+                List<BigDecimal> workTime = new ArrayList<>();
+                boolean hasNonZeroWorkTime = false;
+                if (userAndProject.isEmpty()) {
+                    for (String currentNickName : nickName) {
                         workTime.add(BigDecimal.ZERO);
                     }
+                } else {
+                    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 == name && userNickName == currentNickName) {
+                                workTime.add(userProjectWorkTime);
+                                if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                                    hasNonZeroWorkTime = true;
+                                }
+                                foundWorkTime = true;
+                                break;
+                            }
+                        }
+                        if (!foundWorkTime) {
+                            workTime.add(BigDecimal.ZERO);
+                        }
+                    }
+                }
+                // 过滤0工时
+                if (filter != 2 || hasNonZeroWorkTime) {
+                    projectWorkTimeVO.setWorkTime(workTime);
+                    projectWorkTime.add(projectWorkTimeVO);
                 }
             }
-            // 过滤0工时
-            if (filter != 2 || hasNonZeroWorkTime) {
-                userWorkTimeVO2.setWorkTime(workTime);
-                userWorkTimeVO.add(userWorkTimeVO2);
-            }
+            returnList.add(projectWorkTime);
         }
-        returnList.add(userWorkTimeVO);
-    }
         return returnList;
-}
+    }
+
+    /**
+     * 工时-明细-导出
+     * @param userId
+     * @param projectId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    @DataScope(deptAlias = "u")
+    @Override
+    public List<WorkTimeExportVO> workHourStatisticExport(Long userId, Integer projectId, String startDate, String
+            endDate) {
+        Integer tenantId = SecurityUtils.getTenantId();
+        LocalDate start = null;
+        LocalDate end = null;
+        if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) {
+            start = LocalDate.parse(startDate);
+            end = LocalDate.parse(endDate);
+        }
+        return pmWorkContentMapper.workHourStatisticExport(userId, projectId, start, end, tenantId);
+    }
 
-@DataScope
-@Override
-public List<WorkTimeExportVO> workHourStatisticExport(Long userId, Integer projectId, String startDate, String endDate) {
-    Integer tenantId = SecurityUtils.getTenantId();
-    LocalDate start = null;
-    LocalDate end = null;
-    if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) {
-        start = LocalDate.parse(startDate);
-        end = LocalDate.parse(endDate);
+    /**
+     * 工时-统计-导出
+     * @param userId
+     * @param projectId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    @DataScope
+    @Override
+    public List<WorkTimeExportTwoVO> workHourExport(Long userId, Integer projectId, Integer filter, String
+            startDate, String endDate, Integer workerOrProject) {
+        return Collections.emptyList();
     }
-    return pmWorkContentMapper.workHourStatisticExport(userId, projectId, start, end, tenantId);
-}
 
 }

+ 9 - 4
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -283,7 +283,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
 
             } catch (Exception e) {
                 e.printStackTrace();
-                throw new BusinessException("已存在重复数据,一人一天一篇报告");
+                throw new BusinessException("已存在重复数据,一人一天一篇报告");
             }
 
             // 获取报告中所有项目id
@@ -322,6 +322,8 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 if (StringUtils.isNotEmpty(ccTo)) {
                     // 推送消息中心
                     dingTalkAndMessage.sendAsyncMessage(newReport);
+                    // 存入报告消息表
+                    receiveMessages(ccTo, newReport.getId());
                 }
                 // 是否同步钉钉
                 if (pmWorkReport.getSendDingTalk().equals(1)) {
@@ -332,8 +334,6 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                     dingTalkAndMessage.sendDingTalkDailyReport(newReport, pmWorkContents);
                 }
 
-                // 存入报告消息表
-                receiveMessages(ccTo, newReport.getId());
             }
         } else {
             PmWorkReport rp = new PmWorkReport();
@@ -427,7 +427,12 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                     }
                 }
                 pmReceive.setReadFlag(0);
-                pmReceiveMapper.insert(pmReceive);
+                try {
+                    pmReceiveMapper.insert(pmReceive);
+                } catch (Exception e) {
+                    log.error("报告接收人:" + id + ",报告发送人:" + createBy + ",存入报告消息表失败!");
+                    throw new BusinessException(createBy + " 的工作报告存入报告消息表失败!");
+                }
             }
         }
     }

+ 55 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkTimeExportTwoVO.java

@@ -0,0 +1,55 @@
+package com.usky.iot.service.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ruoyi.common.core.annotation.Excel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-07-16 11:03
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WorkTimeExportTwoVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 日期
+     */
+    @Excel(name = "日期")
+    private LocalDate reportDate;
+
+    /**
+     *
+     */
+    @Excel(name = "账号名", align = Excel.Align.LEFT)
+    private String userName;
+
+    /**
+     *
+     */
+    @Excel(name = "员工名", align = Excel.Align.LEFT)
+    private String fullName;
+
+    /**
+     * 工时
+     */
+    @Excel(name = "耗时", align = Excel.Align.LEFT)
+    private BigDecimal workTime;
+
+    /**
+     * 工作内容
+     */
+    @Excel(name = "工作内容", width = 48, align = Excel.Align.LEFT)
+    private String workContent;
+
+}
+

+ 0 - 6
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkTimeExportVO.java

@@ -21,12 +21,6 @@ public class WorkTimeExportVO implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    /**
-     * 主键
-     */
-    @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
-
     /**
      * 日期
      */

+ 10 - 36
service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml

@@ -19,46 +19,20 @@
         <result column="tenant_id" property="tenantId"/>
     </resultMap>
     <select id="workTimeCount" resultType="com.usky.iot.service.vo.PmProjectWorkTimeVo">
-    SELECT pc.project_name, SUM(pc.work_time) as workTime
-    FROM pm_work_content pc
-    JOIN pm_work_report pr ON pc.report_id = pr.id
-    WHERE pr.submitter_id = #{userId}
-    AND pr.report_date BETWEEN #{startTime} AND #{endTime}
-    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>-->
-
-<!--    <select id="statisticsDept" resultType="com.usky.iot.service.vo.WorkHoursStatisticsVO">
-        SELECT u.nick_name as nickName, pc.project_name as projectName, SUM(pc.work_time) as workTime
+        SELECT pc.project_name, 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 pc.tenant_id = #{tenantId}
-        AND pc.dept_id = #{deptId}
-        AND pr.report_date BETWEEN #{startTime} AND #{endTime}
-        GROUP BY u.nick_name, pc.project_name
-    </select>-->
+            JOIN pm_work_report pr ON pc.report_id = pr.id
+        WHERE pr.submitter_id = #{userId}
+          AND pr.report_date BETWEEN #{startTime} AND #{endTime}
+        GROUP BY pc.project_name
+    </select>
 
     <select id="workHourStatisticExport" resultType="com.usky.iot.service.vo.WorkTimeExportVO">
-        SELECT pr.report_date AS reportDate, pr.create_by AS userName, pc.project_name AS projectName, pc.work_time AS workTime, pc.work_content AS workContent, u.nick_name AS fullName
+        SELECT pr.report_date AS reportDate, pr.create_by AS userName, pc.project_name AS projectName, pc.work_time AS
+        workTime, pc.work_content AS workContent, u.nick_name AS fullName
         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
+        JOIN pm_work_report pr ON pc.report_id = pr.id
         <if test="tenantId != null and tenantId != '' and tenantId != 0">
             AND pr.tenant_id = #{tenantId}
         </if>
@@ -72,7 +46,7 @@
             AND pr.report_date BETWEEN #{startTime} AND #{endTime}
         </if>
         <!-- 数据范围过滤 -->
-        <!-- ${params.dataScope} -->
+        ${params.dataScope}
         ORDER BY pr.report_date DESC
     </select>