Selaa lähdekoodia

Merge branch 'fu-dev' of uskycloud/usky-modules into master

gez 5 kuukautta sitten
vanhempi
commit
121dedc00d
22 muutettua tiedostoa jossa 831 lisäystä ja 297 poistoa
  1. 10 3
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java
  2. 15 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmReceiveController.java
  3. 37 23
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java
  4. 5 23
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java
  5. 5 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmProject.java
  6. 10 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmWorkReport.java
  7. 4 16
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmWorkContentMapper.java
  8. 1 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmProjectService.java
  9. 5 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmReceiveService.java
  10. 15 10
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java
  11. 1 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkReportService.java
  12. 5 17
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/config/DingTalkAndMessage.java
  13. 34 12
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java
  14. 29 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmReceiveServiceImpl.java
  15. 505 129
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java
  16. 26 13
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java
  17. 44 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/PmWorkHourStatisticRequestVO.java
  18. 55 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkTimeExportTwoVO.java
  19. 0 6
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkTimeExportVO.java
  20. 1 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmProjectMapper.xml
  21. 22 43
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml
  22. 2 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkReportMapper.xml

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

@@ -60,8 +60,9 @@ public class PmProjectController {
                                                      @RequestParam(value = "projectAscription", required = false, defaultValue = "0") Integer projectAscription,
                                                      @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) {
-        return ApiResult.success(pmProjectService.projectList(projectName, projectType, projectStatus, projectAscription, pageNum, pageSize, projectId));
+                                                     @RequestParam(value = "projectId", required = false) Integer projectId,
+                                                     @RequestParam(value = "visibleRange", required = false, defaultValue = "1") Byte visibleRange) {
+        return ApiResult.success(pmProjectService.projectList(projectName, projectType, projectStatus, projectAscription, pageNum, pageSize, projectId, visibleRange));
     }
 
     /**
@@ -89,11 +90,17 @@ public class PmProjectController {
      *
      * @param projectId 项目id
      */
-    @GetMapping("/del")
+    @DeleteMapping("/delNew")
     public void del(@RequestParam Integer projectId) {
         pmProjectService.delProject(projectId);
     }
 
+    //回退代码
+    @GetMapping("/del")
+    public void del2(@RequestParam Integer projectId) {
+        pmProjectService.delProject(projectId);
+    }
+
     /**
      * 人员、项目下拉
      *

+ 15 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmReceiveController.java

@@ -1,8 +1,14 @@
 package com.usky.iot.controller.web;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.datascope.annotation.DataScope;
+import com.ruoyi.common.datascope.context.DataScopeContextHolder;
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.log.annotation.Log;
 import com.usky.iot.service.PmReceiveService;
+import com.usky.system.domain.SysUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestHeader;
@@ -11,6 +17,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+import java.util.Objects;
+
 /**
  * <p>
  * 报告接收表 前端控制器
@@ -31,5 +40,11 @@ public class PmReceiveController {
         pmReceiveService.updateReadFlag(reportId);
     }
 
+    @GetMapping("/deptTest")
+    public List<SysUser> deptTest(Integer tenantId){
+        return pmReceiveService.test(tenantId);
+    }
+
+
 }
 

+ 37 - 23
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java

@@ -9,6 +9,8 @@ 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.PmWorkHourStatisticRequestVO;
+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;
@@ -18,6 +20,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -46,8 +49,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));
     }
 
     /**
@@ -88,21 +92,21 @@ public class PmWorkContentController {
                                                     @RequestParam(value = "reportId", required = false) Integer reportId,
                                                     @RequestParam(value = "startDate", required = false) String startDate,
                                                     @RequestParam(value = "endDate", required = false) String endDate,
-                                                    @RequestParam(value = "projectId", required = false) Integer projectId) {
-        return ApiResult.success(pmWorkContentService.reportPage(projectAscription, pageNum, pageSize, reportId, startDate, endDate, projectId));
+                                                    @RequestParam(value = "projectId", required = false) Integer projectId,
+                                                    @RequestParam(value = "submitterId", required = false) Long submitterId) {
+        return ApiResult.success(pmWorkContentService.reportPage(projectAscription, pageNum, pageSize, reportId, startDate, endDate, projectId, submitterId));
     }
 
     /**
-     * 工时统计
-     *
-     * @param userId
-     * @param projectId
-     * @param filter
-     * @param startDate
-     * @param endDate
-     * @param workerOrProject
+     * 工时统计-新
      * @return
      */
+    @PostMapping("/workHourStatisticNew")
+    public ApiResult<List<Object>> workHourStatistic(@RequestBody PmWorkHourStatisticRequestVO requestVO) {
+        return ApiResult.success(pmWorkContentService.workHourStatisticNew(requestVO));
+    }
+
+    //回退代码
     @GetMapping("/workHourStatistic")
     public ApiResult<List<Object>> workHourStatistic(@RequestParam(value = "userId", required = false) Long userId,
                                                      @RequestParam(value = "projectId", required = false) Integer projectId,
@@ -117,25 +121,35 @@ public class PmWorkContentController {
         return ApiResult.success(pmWorkContentService.workHourStatistic(userId, projectId, filter, startDate, endDate, workerOrProject));
     }
 
+/**
+ * 工时明细导出
+ *
+ * @param response
+ */
+    @Log(title = "导出工时明细", businessType = BusinessType.EXPORT)
+    @PostMapping("/workHourStatisticExport")
+    public void export(HttpServletResponse response, @RequestBody PmWorkHourStatisticRequestVO requestVO){
+        List<WorkTimeExportVO> list = pmWorkContentService.workHourStatisticExport(requestVO);
+        ExcelUtil<WorkTimeExportVO> util = new ExcelUtil<WorkTimeExportVO>(WorkTimeExportVO.class);
+        util.exportExcel(response, list, "工时明细", "工时明细");
+    }
+
     /**
-     * 工时明细导出
+     * 工时导出
      *
      * @param response
-     * @param userId
-     * @param projectId
-     * @param startDate
-     * @param endDate
-     * @throws IOException
      */
-    @Log(title = "工时统计", businessType = BusinessType.EXPORT)
-    @PostMapping("/workHourStatisticExport")
+    @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) throws IOException {
-        List<WorkTimeExportVO> list = pmWorkContentService.workHourStatisticExport(userId, projectId, startDate, endDate);
-        ExcelUtil<WorkTimeExportVO> util = new ExcelUtil<WorkTimeExportVO>(WorkTimeExportVO.class);
+                       @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, "工时统计", "工时统计");
     }
 

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

@@ -3,6 +3,8 @@ package com.usky.iot.controller.web;
 
 import com.aliyuncs.exceptions.ClientException;
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.iot.domain.PmWorkReport;
 import com.usky.iot.service.PmWorkReportService;
 import com.usky.iot.service.config.DingTalkAndMessage;
@@ -29,9 +31,6 @@ public class PmWorkReportController {
     @Autowired
     private PmWorkReportService pmWorkReportService;
 
-    @Autowired
-    private DingTalkAndMessage dingTalkAndMessage;
-
     /**
      * 周工作报告查询
      *
@@ -52,19 +51,12 @@ public class PmWorkReportController {
      *
      * @param
      */
+    @Log(title = "添加工作报告", businessType = BusinessType.INSERT)
     @PostMapping("/add")
-    public void add(@RequestBody PmWorkReport pmWorkReport)  throws ClientException {
+    public void add(@RequestBody PmWorkReport pmWorkReport) {
         pmWorkReportService.addReport(pmWorkReport);
     }
 
-    /**
-     * 上传文件
-     */
-/*    @GetMapping("/uploadFiles")
-    public void uploadFiles(){
-        dingTalkAndMessage.uploadFiles();
-    }*/
-
     /**
      * 统计工时
      *
@@ -75,22 +67,12 @@ public class PmWorkReportController {
         return ApiResult.success(pmWorkReportService.countTime(dateType, dateNum));
     }
 
-    /**
-     * 测试定时发送
-     *
-     * @param
-     */
-    @GetMapping("/ScheduledTasks")
-    public void add(){
-        LocalDateTime now = LocalDateTime.now();
-        pmWorkReportService.timedSending(now);
-    }
-
     /**
      * 删除工作报告
      *
      * @param reportId 报告id
      */
+    @Log(title = "删除工作报告", businessType = BusinessType.DELETE)
     @DeleteMapping("/del/{reportId}")
     public void del(@PathVariable("reportId") Integer reportId) {
         pmWorkReportService.deleteContent(reportId);

+ 5 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmProject.java

@@ -114,4 +114,9 @@ public class PmProject implements Serializable {
      */
     @TableField(exist = false)
     private Long submissions;
+
+    /**
+     * 项目可见范围(1:公开;2:私有,指定人(创建人、负责人、项目成员)可见)
+     */
+    private Byte visibleRange;
 }

+ 10 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmWorkReport.java

@@ -147,4 +147,14 @@ public class PmWorkReport implements Serializable {
     @TableField(exist = false)
     private String avatar;
 
+    /**
+     * 报告附件
+     */
+    private String reportFile;
+
+    /**
+     * 报告图片
+     */
+    private String reportImage;
+
 }

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

@@ -3,6 +3,7 @@ package com.usky.iot.mapper;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.common.mybatis.core.CrudMapper;
 import com.usky.iot.service.vo.PmProjectWorkTimeVo;
+import com.usky.iot.service.vo.PmWorkHourStatisticRequestVO;
 import com.usky.iot.service.vo.WorkHoursStatisticsVO;
 import com.usky.iot.service.vo.WorkTimeExportVO;
 import org.apache.ibatis.annotations.Param;
@@ -33,23 +34,10 @@ public interface PmWorkContentMapper extends CrudMapper<PmWorkContent> {
                                                     @Param("userId") Long userId,
                                                     @Param("tenantId") Integer tenantId);*/
 
+
     /**
-     * 人员查询时增加部门隔离,项目维度不需要
-     *
-     * @param userId
+     * 导出工时明细
      * @return
      */
-/*
-    List<WorkHoursStatisticsVO> statisticsDept(@Param("startTime") LocalDate startTime,
-                                               @Param("endTime") LocalDate endTime,
-                                               @Param("userId") Long userId,
-                                               @Param("tenantId") Integer tenantId,
-                                               @Param("deptId") Long deptId);
-*/
-
-    List<WorkTimeExportVO> workHourStatisticExport(@Param("userId") Long userId,
-                                                   @Param("projectId") Integer projectId,
-                                                   @Param("startTime") LocalDate startTime,
-                                                   @Param("endTime") LocalDate endTime,
-                                                   @Param("tenantId") Integer tenantId);
+    List<WorkTimeExportVO> workHourStatisticExport(PmWorkHourStatisticRequestVO requestVO);
 }

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

@@ -54,7 +54,7 @@ public interface PmProjectService extends CrudService<PmProject> {
      * @param pageSize          页大小
      * @return
      */
-    CommonPage<PmProject> projectList(String projectName, Integer projectType, Integer projectStatus, Integer projectAscription, Integer pageNum, Integer pageSize, Integer projectId);
+    CommonPage<PmProject> projectList(String projectName, Integer projectType, Integer projectStatus, Integer projectAscription, Integer pageNum, Integer pageSize, Integer projectId, Byte visibleRange);
 
     /**
      * 查询项目名

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

@@ -2,6 +2,9 @@ package com.usky.iot.service;
 
 import com.usky.iot.domain.PmReceive;
 import com.usky.common.mybatis.core.CrudService;
+import com.usky.system.domain.SysUser;
+
+import java.util.List;
 
 /**
  * <p>
@@ -23,5 +26,7 @@ public interface PmReceiveService extends CrudService<PmReceive> {
      */
     void updateReadFlag(Integer reportId);
 
+    List<SysUser> test( Integer tenantId);
+
 
 }

+ 15 - 10
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java

@@ -1,9 +1,12 @@
 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.PmWorkHourStatisticRequestVO;
+import com.usky.iot.service.vo.WorkTimeExportTwoVO;
 import com.usky.iot.service.vo.WorkTimeExportVO;
 
 import com.usky.system.domain.SysUser;
@@ -36,7 +39,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 +60,6 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      */
     List<SysUser> nickNames(List<Long> userIds);
 
-    List<SysUser> allNickName();
-
     /**
      * 报告详情分页列表
      * @param projectAscription 1:我负责;2:我收到;3:我发出
@@ -66,24 +67,28 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      * @param pageSize 页大小
      * @return
      */
-    CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer report, String startDate, String endDate, Integer projectId);
+    CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer report, String startDate, String endDate, Integer projectId, Long userId);
 
     /** 工时统计页面
-     * @param userId          用户id
-     * @param filter          是否过滤0工时(默认1:不过滤;2:过滤)
-     * @param startDate       开始时间
-     * @param endDate         结束时间
-     * @param workerOrProject 打工仔还是项目(默认1:打工仔;2:项目)
      * @return 返回项目名(或牛马名)以及项目工时
      */
+    List<Object> workHourStatisticNew(PmWorkHourStatisticRequestVO requestVO);
+    //回退代码
     List<Object> workHourStatistic(Long userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject);
 
+
+    /** 工时明细导出
+     * @return
+     */
+    List<WorkTimeExportVO> workHourStatisticExport(PmWorkHourStatisticRequestVO requestVO);
+
+
     /** 工时统计导出
      * @param userId          用户id
      * @param startDate       开始时间
      * @param endDate         结束时间
      * @return 返回项目名(或牛马名)以及项目工时
      */
-    List<WorkTimeExportVO> workHourStatisticExport(Long userId, Integer projectId, String startDate, String endDate);
+    List<WorkTimeExportTwoVO> workHourExport(Long userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject);
 
 }

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

@@ -33,7 +33,7 @@ public interface PmWorkReportService extends CrudService<PmWorkReport> {
      * 新增、编辑工作报告
      * @param pmWorkReport 工作报告
      */
-    void addReport(PmWorkReport pmWorkReport)  throws ClientException;
+    void addReport(PmWorkReport pmWorkReport);
 
     /**
      * 工时计算

+ 5 - 17
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/config/DingTalkAndMessage.java

@@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.taobao.api.ApiException;
 import com.taobao.api.FileItem;
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.exception.BusinessException;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.constant.dingTalkConstant;
 import com.usky.iot.domain.MceMbuser;
@@ -308,11 +309,13 @@ public class DingTalkAndMessage {
         log.info(username + "的工作报告开始发送消息中心-----------------------------------");
         List<Long> userId = new ArrayList<>();
         if (!newReport.getCcTo().isEmpty()) {
-            userId = Optional.ofNullable(newReport.getCcTo())
+            userId = Optional.of(newReport.getCcTo())
                     .map(ccTo -> Arrays.stream(ccTo.split(","))
                             .map(Long::parseLong)
                             .collect(Collectors.toList()))
                     .orElse(Collections.emptyList());
+        } else {
+            throw new BusinessException( newReport.getCreateBy() + "的报告:" + newReport.getId() + ",抄送人为空,无需发送消息中心");
         }
         LambdaQueryWrapper<SysUser> nickNameQuery = Wrappers.lambdaQuery();
         nickNameQuery.select(SysUser::getNickName)
@@ -325,7 +328,7 @@ public class DingTalkAndMessage {
         jsonObject.put("id", newReport.getId());
         jsonObject.put("infoTypeName", INFO_TITLE);
         jsonObject.put("userName", newReport.getCreateBy());
-        if (userId != null && !userId.isEmpty()) {
+        if (!userId.isEmpty()) {
             jsonObject.put("userIds", userId);
         }
         try {
@@ -343,20 +346,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("上传文件完成-----------------------------------");
-    }*/
 }
 

+ 34 - 12
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java

@@ -66,6 +66,23 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         String userName = SecurityUtils.getUsername();
         Integer tenantId = SecurityUtils.getTenantId();
         LocalDateTime now = LocalDateTime.now();
+
+        if (project.getVisibleRange() == null){
+            project.setVisibleRange((byte) 1);
+        }
+
+        if (Objects.isNull(project.getId())) {
+            String projectName = project.getProjectName();
+            LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
+            wrapper.eq(PmProject::getProjectName, projectName)
+                    .eq(PmProject::getTenantId, tenantId)
+                    .eq(PmProject::getDelFlag, 0);
+            PmProject pmProject = pmProjectMapper.selectOne(wrapper);
+            if (Objects.nonNull(pmProject)) {
+                throw new BusinessException("已存在同名项目!请检查后重试");
+            }
+        }
+
         if (Objects.isNull(project.getProjectWorkload())) {
             if (Objects.isNull(project.getId())) {
                 project.setCreateBy(userName);
@@ -79,10 +96,10 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
                 this.updateById(project);
             }
         } else {
-            if (project.getProjectWorkload().scale() > 2) {
-                throw new BusinessException("计划人/天小数位超出长度请重新输入");
-            } else if (project.getProjectWorkload().precision() - project.getProjectWorkload().scale() > 4) {
-                throw new BusinessException("计划人/天整数位超出长度请重新输入");
+            if (project.getProjectWorkload().scale() > 1) {
+                throw new BusinessException("计划人/天小数位超出长度请重新输入");
+            } else if (project.getProjectWorkload().precision() - project.getProjectWorkload().scale() > 5) {
+                throw new BusinessException("计划人/天整数位超出长度请重新输入");
             } else {
                 if (Objects.isNull(project.getId())) {
                     project.setCreateBy(userName);
@@ -187,14 +204,15 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
      * @return
      */
     @Override
-    public CommonPage<PmProject> projectList(String projectName, Integer projectType, Integer projectStatus, Integer projectAscription, Integer pageNum, Integer pageSize, Integer projectId) {
+    public CommonPage<PmProject> projectList(String projectName, Integer projectType, Integer projectStatus, Integer projectAscription, Integer pageNum, Integer pageSize, Integer projectId, Byte visibleRange) {
         IPage<PmProject> page = new Page<>(pageNum, pageSize);
         Long userId = SecurityUtils.getUserId();
         String username = SecurityUtils.getUsername();
         String nickName = SecurityUtils.getLoginUser().getSysUser().getNickName();
         Integer tenantId = SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmProject> lambdaQuery = Wrappers.lambdaQuery();
-        lambdaQuery.eq(PmProject::getTenantId, SecurityUtils.getTenantId()).eq(PmProject::getDelFlag, 0);
+        lambdaQuery.eq(PmProject::getTenantId, SecurityUtils.getTenantId()).eq(PmProject::getDelFlag, 0)
+                .eq(visibleRange != null, PmProject::getVisibleRange, visibleRange);
         if (projectId != null && projectId != 0) {
             lambdaQuery.eq(PmProject::getId, projectId);
             page = this.page(page, lambdaQuery);
@@ -202,9 +220,12 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         }
         switch (projectAscription) {
             case 0:
-/*                lambdaQuery.and(q -> q.eq(PmProject::getProjectHead, userId)
-                        .or().apply(FIND_IN_SET_SQL, userId)
-                        .or().eq(PmProject::getCreateBy, username));*/
+                if (visibleRange != null && visibleRange == 1) {
+                    break;
+                }
+                lambdaQuery.and(q -> q.eq(PmProject::getProjectHead, userId)
+                        .or().apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
+                        .or().eq(PmProject::getCreateBy, username));
                 break;
             case 1:
                 lambdaQuery.eq(PmProject::getProjectHead, userId);
@@ -288,9 +309,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()))
+                .and(q -> q.eq(PmProject::getProjectHead, SecurityUtils.getUserId())
+                        .or().eq(PmProject::getVisibleRange, 1)
+                        .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);
 

+ 29 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmReceiveServiceImpl.java

@@ -3,15 +3,24 @@ package com.usky.iot.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.datascope.annotation.DataScope;
+import com.ruoyi.common.datascope.context.DataScopeContextHolder;
+import com.usky.common.log.annotation.Log;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.domain.PmReceive;
 import com.usky.iot.mapper.PmReceiveMapper;
+import com.usky.iot.mapper.SysUserMapper;
 import com.usky.iot.service.PmReceiveService;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.system.domain.SysUser;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -21,12 +30,16 @@ import java.time.LocalDateTime;
  * @author han
  * @since 2024-07-09
  */
+@Slf4j
 @Service
 public class PmReceiveServiceImpl extends AbstractCrudService<PmReceiveMapper, PmReceive> implements PmReceiveService {
 
     @Autowired
     private PmReceiveMapper pmReceiveMapper;
 
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
     @Override
     public void add(PmReceive receive) {
 
@@ -44,4 +57,20 @@ public class PmReceiveServiceImpl extends AbstractCrudService<PmReceiveMapper, P
                 .eq(PmReceive::getReceiverId, userId);
         pmReceiveMapper.update(null, updateWrapper);
     }
+
+
+
+    @DataScope
+    @Override
+    public List<SysUser> test(Integer tenantId) {
+        String dataScopeSql = DataScopeContextHolder.getDataScopeSql();
+        log.info("DataScopeContextHolder: "+ dataScopeSql);
+        LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
+        usersQuery.select(SysUser::getUserId, SysUser::getUserName)
+                .eq(SysUser::getDelFlag, 0).eq(SysUser::getStatus, tenantId)
+                .apply(Objects.nonNull(dataScopeSql), dataScopeSql);
+        return sysUserMapper.selectList(usersQuery);
+    }
+
+
 }

+ 505 - 129
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -7,7 +7,6 @@ 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.mybatis.core.AbstractCrudService;
 import com.usky.common.security.utils.SecurityUtils;
@@ -16,10 +15,10 @@ 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;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +28,7 @@ import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -40,6 +40,7 @@ import java.util.stream.Collectors;
  * @author fu
  * @since 2024-05-20
  */
+@Slf4j
 @Service
 public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentMapper, PmWorkContent> implements PmWorkContentService {
 
@@ -175,13 +176,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 {
@@ -191,15 +197,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();
@@ -412,13 +432,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
@@ -427,14 +440,21 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
      * @return: java.util.List<com.usky.system.domain.PmWorkContent>
      **/
     @Override
-    public CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer reportId, String startDate, String endDate, Integer projectId) {
-        // LocalDateTime startDateTime = null;
-        // LocalDateTime endDateTime = null;
+    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;
         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 {
@@ -444,29 +464,64 @@ 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::getReportDate, start, end);
-            reportIds = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toList());
-            if (reportIds.isEmpty()){
-                return returnPage;
-            }
+            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 (projectId != null && projectId > 0) {
+        if (projectId != null) {
             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()) {
+            reportIdsByProject = pmWorkContentMapper.selectList(contentLambdaQuery).stream().map(PmWorkContent::getReportId).collect(Collectors.toSet());
+        }
+
+        if (userId != null) {
+            LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
+            reportQuery.eq(PmWorkReport::getSubmitterId, userId);
+            reportIdsByUser = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toSet());
+            if (reportIdsByProject.isEmpty() && reportIdsByUser.isEmpty()) {
                 return returnPage;
             }
         }
 
+        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 userId = SecurityUtils.getUserId();
+        Long userId2 = SecurityUtils.getUserId();
         List<Long> userIds = new ArrayList<>();
         List<Integer> receiveList = receive();
         if (receiveList.isEmpty() && projectAscription == 2) {
@@ -474,7 +529,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);
@@ -526,7 +580,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
 
         // 查询已读状态
         LambdaQueryWrapper<PmReceive> statusQuery = Wrappers.lambdaQuery();
-        statusQuery.select(PmReceive::getReportId, PmReceive::getReadFlag).eq(PmReceive::getReceiverId, userId);
+        statusQuery.select(PmReceive::getReportId, PmReceive::getReadFlag).eq(PmReceive::getReceiverId, userId2);
         if (reportId != null && reportId != 0) {
             statusQuery.eq(PmReceive::getReportId, reportId);
         } else if (!receiveList.isEmpty()) {
@@ -559,16 +613,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));
         }
 
@@ -613,51 +662,12 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             }
         }
 
-        return new CommonPage<>(reportList, reportPage.getTotal(), pageSize, pageNum);
+        return new CommonPage<PmWorkReport>(reportList, reportPage.getTotal(), pageSize, pageNum);
     }
 
-    /*private PmReportReadersVO readCount() {
-        List<PmReceive> receives = receives(receiveList);
-        List<Long> uId = new ArrayList<>();
-        for (PmReceive pmReceive : receives) {
-            Long receiverId = pmReceive.getReceiverId();
-            uId.add(receiverId);
-        }
-
-        Set<Long> userIdSet = new HashSet<>();
-        for (PmWorkReport report : reportList) {
-            Long submitterId = report.getSubmitterId();
-            userIdSet.add(submitterId);
-        }
-        List<Long> userIdList = new ArrayList<>(userIdSet);
-
-        List<SysUser> sysUsers = nickNames(userIdList);
-
-        Map<Integer, List<PmReceive>> reportReceivesMap = receives.stream()
-                .collect(Collectors.groupingBy(PmReceive::getReportId));
-
-        if (sysUsers != null) {
-            for (PmWorkReport report : reportList) {
-                List<Long> readAlready = new ArrayList<>();
-                List<Long> readNotAlready = new ArrayList<>();
-                int readCount = 0;
-                int unreadCount = 0;
-                List<PmReceive> reportReceives = reportReceivesMap.getOrDefault(report.getId(), Collections.emptyList());
-                for (PmReceive pmReceive : reportReceives) {
-                    if (pmReceive.getReadFlag() == 1) {
-                        readCount++;
-                        readAlready.add(pmReceive.getReceiverId());
-                    } else {
-                        unreadCount++;
-                        readNotAlready.add(pmReceive.getReceiverId());
-                    }
-                }
-
-                PmReportReadersVO readUnreadVO = new PmReportReadersVO(readAlready, readNotAlready, readCount, unreadCount);
-    }*/
 
     /**
-     * @description: 获取报告接收人
+     * @description: 获取报告接收人-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [report]
@@ -670,7 +680,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     }
 
     /**
-     * @description: 获取时间段内报告列表(按报告时间查询)
+     * @description: 获取时间段内报告列表(按报告时间查询)-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [startDate, endDate]
@@ -684,7 +694,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     }
 
     /**
-     * @description: 项目查询
+     * @description: 项目查询-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [startDate, endDate]
@@ -695,7 +705,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
         LambdaQueryWrapper<PmProject> projectsQuery = Wrappers.lambdaQuery();
         projectsQuery.select(PmProject::getId, PmProject::getProjectName);
-        if (projectId != null && projectId != 0) {
+        if (projectId != null && projectId >= 0) {
             projectsQuery.eq(PmProject::getId, projectId);
             return pmProjectMapper.selectList(projectsQuery);
         }
@@ -703,32 +713,33 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         return pmProjectMapper.selectList(projectsQuery);
     }
 
-    @DataScope(userAlias = "d")
-    private List<SysUser> userNameList(Long userId) {
-        Integer tenantId = SecurityUtils.getTenantId();
-        Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
+    /**
+     * @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)
-                .eq(SysUser::getDelFlag, 0)
-                .eq(SysUser::getStatus, 0);
-        if (userId != null && userId != 0) {
-            userNameQuery.eq(SysUser::getUserId, userId);
+                SysUser::getSex, SysUser::getDeptId, SysUser::getAddress);
+        if (!userId.isEmpty()) {
+            userNameQuery.eq(SysUser::getDelFlag, 0).eq(SysUser::getStatus, 0).in(SysUser::getUserId, userId);
             return sysUserMapper.selectList(userNameQuery);
+        } else {
+            userNameQuery.eq(SysUser::getUserId, SecurityUtils.getUserId());
         }
-        // userNameQuery.apply(DataScopeContextHolder.getDataScopeSql());
-        userNameQuery.eq(SysUser::getTenantId, tenantId).eq(SysUser::getDeptId, deptId);
         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();
@@ -753,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<>();
@@ -770,12 +780,45 @@ 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]
+     *      * @param userId          用户id
+     *      * @param filter          是否过滤0工时(默认1:不过滤;2:过滤)
+     *      * @param startDate       开始时间
+     *      * @param endDate         结束时间
+     *      * @param workerOrProject 打工仔还是项目(默认1:打工仔;2:项目)
+     * @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> workHourStatisticNew(PmWorkHourStatisticRequestVO requestVO) {
+        List<Long> userId = new ArrayList<>();
+        if (requestVO.getUserIds() != null) {
+            userId = requestVO.getUserIds();
+        }
+        Integer projectId = requestVO.getProjectId();
+        Integer filter = 1;
+        if (requestVO.getFilter() != null) {
+            filter = requestVO.getFilter();
+        }
+        String startDate = requestVO.getStartDate();
+        String endDate = requestVO.getEndDate();
+        Integer workerOrProject = 1;
+        if (requestVO.getWorkerOrProject() != null) {
+            workerOrProject = requestVO.getWorkerOrProject();
+        }
+        if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
+            startDate = LocalDate.now().with(TemporalAdjusters.firstDayOfYear()).toString();
+            endDate = LocalDate.now().with(TemporalAdjusters.lastDayOfYear()).toString();
+        }
+
         List<ProjectWorkTimeVO> projectWorkTime = new ArrayList<>();
         List<UserWorkTimeVO> userWorkTimeVO = new ArrayList<>();
         List<Object> returnList = new ArrayList<>();
+
         if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
             throw new BusinessException("请设置查询时间范围!");
         }
@@ -865,6 +908,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);
             // 重组返回数据结构
@@ -880,46 +966,336 @@ 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;
     }
+
+    //回退代码
+    @DataScope
+    @Override
+    public List<Object> workHourStatistic(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("请设置查询时间范围!");
+        }
+
+        List<PmProject> pmProjects = projects(projectId);
+        List<String> pmProjectName = new ArrayList<>();
+        List<Integer> pmProjectId = new ArrayList<>();
+        for (PmProject project : pmProjects) {
+            pmProjectName.add(project.getProjectName());
+            pmProjectId.add(project.getId());
+        }
+
+        List<Long> userIdS = new ArrayList<>();
+        if (userId != null) {
+            userIdS.add(userId);
+        }
+        List<SysUser> users = userNameList(userIdS);
+        List<Long> userIds = new ArrayList<>();
+        List<String> nickName = new ArrayList<>();
+        for (SysUser user : users) {
+            userIds.add(user.getUserId());
+            nickName.add(user.getNickName());
+        }
+
+        // 统计userId每个项目所需工时
+        List<WorkHoursStatisticsVO> userAndProject = new ArrayList<>();
+        List<PmWorkContent> pmWorkContentList = workTimeCount(userIds, pmProjectId, startDate, endDate);
+        if (!pmWorkContentList.isEmpty()) {
+            for (PmWorkContent content : pmWorkContentList) {
+                WorkHoursStatisticsVO workHoursStatisticsVO = new WorkHoursStatisticsVO();
+                Long submitterId = content.getSubmitterId();
+                Integer projectId1 = content.getProjectId();
+                BigDecimal workTime = content.getWorkTime();
+                workHoursStatisticsVO.setWorkTime(workTime);
+                for (SysUser user : users) {
+                    Long userId1 = user.getUserId();
+                    String nickName1 = user.getNickName();
+                    if (userId1.equals(submitterId)) {
+                        workHoursStatisticsVO.setNickName(nickName1);
+                    }
+                }
+                for (PmProject project : pmProjects) {
+                    Integer projectId2 = project.getId();
+                    String projectName = project.getProjectName();
+                    if (projectId2 == projectId1) {
+                        workHoursStatisticsVO.setProjectName(projectName);
+                    }
+                }
+                userAndProject.add(workHoursStatisticsVO);
+            }
+        }
+        List<WorkHoursStatisticsVO> userAndProjectD = userAndProject;
+
+        if (workerOrProject != 1) {
+            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);
+                }
+            }
+            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);
+            // 重组返回数据结构
+            for (String uName : nickName) {
+                String name = uName;
+                UserWorkTimeVO userWorkTimeVO2 = new UserWorkTimeVO();
+                userWorkTimeVO2.setProjectOrPerson(name);
+                List<BigDecimal> workTime = new ArrayList<>();
+                boolean hasNonZeroWorkTime = false;
+                if (userAndProjectD.isEmpty()) {
+                    for (String currentNickName : pmProjectName) {
+                        workTime.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 == name && projectName == 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) {
+                    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);
+                }
+            }
+            returnList.add(projectWorkTime);
+        }
         return returnList;
-}
+    }
 
-@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
+     */
+    @DataScope(deptAlias = "u")
+    @Override
+    public List<WorkTimeExportVO> workHourStatisticExport(PmWorkHourStatisticRequestVO requestVO) {
+        List<Long> userIds = new ArrayList<>();
+        if (Objects.isNull(requestVO.getUserIds()) || requestVO.getUserIds().isEmpty()){
+            userIds.add(SecurityUtils.getUserId());
+            requestVO.setUserIds(userIds);
+        }
+        return pmWorkContentMapper.workHourStatisticExport(requestVO);
+    }
+
+    /**
+     * 工时-统计-导出
+     * @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);
-}
 
 }

+ 26 - 13
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -201,7 +201,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
      */
     @Transactional
     @Override
-    public void addReport(PmWorkReport pmWorkReport) throws ClientException {
+    public void addReport(PmWorkReport pmWorkReport) {
         Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
         String userName = SecurityUtils.getUsername();
         Long userId = SecurityUtils.getUserId();
@@ -222,9 +222,12 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 // 单个工时大于零
                 if (workTime == null) {
                     throw new BusinessException("工时不能为空,请检查!");
-                }
-                if (workTime.compareTo(BigDecimal.ZERO) <= 0) {
+                } else if (workTime.compareTo(BigDecimal.ZERO) <= 0) {
                     throw new BusinessException("工时必须大于零!");
+                } else if (workTime.scale() > 1) {
+                    throw new BusinessException("工时小数位超出长度,请重新输入!");
+                } else if (workTime.precision() - workTime.scale() > 3) {
+                    throw new BusinessException("工时整数位超出长度,请重新输入!");
                 }
 
                 String workContent1 = workContent.getWorkContent();
@@ -248,9 +251,6 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         if (totalWorkTime.compareTo(maxWorkTimePerDay) >= 0) {
             throw new BusinessException("一天24小时都不够你用,请检查当日总工时!");
         }
-        if (totalWorkTime.compareTo(BigDecimal.ZERO) <= 0) {
-            throw new BusinessException("工时必须大于零!");
-        }
 
         // 判断是否携带reportId,不写带则为新增报告,携带则为编辑(更新)项目
         if (rid == null) {
@@ -267,6 +267,8 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             newReport.setTenantId(tenantId);
             newReport.setTotalHours(totalWorkTime);
             newReport.setSendDingTalk(pmWorkReport.getSendDingTalk());
+            newReport.setReportFile(pmWorkReport.getReportFile());
+            newReport.setReportImage(pmWorkReport.getReportImage());
             if (pmWorkReport.getIsRegularlySend() == 1 && timingTime != null) {
                 if (timingTime.isAfter(currentTimePlusMinutes)) {
                     newReport.setIsRegularlySend(pmWorkReport.getIsRegularlySend());
@@ -281,7 +283,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
 
             } catch (Exception e) {
                 e.printStackTrace();
-                throw new BusinessException("已存在重复数据,一人一天一篇报告");
+                throw new BusinessException("已存在重复数据,一人一天一篇报告");
             }
 
             // 获取报告中所有项目id
@@ -320,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)) {
@@ -330,8 +334,6 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                     dingTalkAndMessage.sendDingTalkDailyReport(newReport, pmWorkContents);
                 }
 
-                // 存入报告消息表
-                receiveMessages(ccTo, newReport.getId());
             }
         } else {
             PmWorkReport rp = new PmWorkReport();
@@ -352,6 +354,8 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             rp.setUpdateTime(dateTime);
             rp.setTotalHours(totalWorkTime);
             rp.setIsRegularlySend(pmWorkReport.getIsRegularlySend());
+            rp.setReportFile(pmWorkReport.getReportFile());
+            rp.setReportImage(pmWorkReport.getReportImage());
             if (pmWorkReport.getReportStatus().equals(0) && pmWorkReport.getIsRegularlySend().equals(1)) {
                 if (timingTime != null && timingTime.isAfter(currentTimePlusMinutes)) {
                     rp.setTimingTime(timingTime);
@@ -382,12 +386,16 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 pmWorkContentMapper.insert(e);
                 contentsList.add(e);
             }
-            if (pmWorkReport.getIsRegularlySend() == 0) {
-                receiveMessages(ccTo, rid);
+            if (pmWorkReport.getIsRegularlySend().equals(0)) {
                 rp.setTimingTime(null);
                 rp.setReportStatus(1);
                 pmWorkReportMapper.updateById(rp);
+                if (StringUtils.isNotBlank(ccTo)) {
+                    receiveMessages(ccTo, rid);
+                }
+                dingTalkAndMessage.sendAsyncMessage(rp);
             }
+
         }
     }
 
@@ -421,7 +429,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 + " 的工作报告存入报告消息表失败!");
+                }
             }
         }
     }
@@ -638,7 +651,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 .orderByAsc(PmWorkReport::getReportDate);
         List<PmWorkReport> timedReports = pmWorkReportMapper.selectList(reports);
 
-        if (timedReports.isEmpty()){
+        if (timedReports.isEmpty()) {
             return timedReports;
         }
         List<Integer> reportIds = timedReports.stream().map(PmWorkReport::getId).collect(Collectors.toList());

+ 44 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/PmWorkHourStatisticRequestVO.java

@@ -0,0 +1,44 @@
+package com.usky.iot.service.vo;
+
+import com.usky.common.core.bean.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * @author fu
+ * @date 2024/9/20
+ */
+@Data
+public class PmWorkHourStatisticRequestVO extends BaseEntity {
+    /**
+     * 用户id集合
+     */
+    private List<Long> userIds;
+
+    /**
+     * 项目id
+     */
+    private Integer projectId;
+
+    /**
+     * 过滤标识 是否过滤0工时(默认1:不过滤;2:过滤)
+     **/
+    private Integer filter;
+
+    /**
+     * 开始时间
+     */
+    private String startDate;
+
+    /**
+     * 结束时间
+     */
+    private String endDate;
+
+    /**
+     * 人员 or 项目 打工仔还是项目(默认1:打工仔;2:项目)
+     */
+    private Integer workerOrProject;
+}

+ 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;
-
     /**
      * 日期
      */

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

@@ -21,6 +21,7 @@
         <result column="dept_id" property="deptId" />
         <result column="tenant_id" property="tenantId" />
         <result column="del_flag" property="delFlag" />
+        <result column="visible_range" property="visibleRange" />
     </resultMap>
 
 </mapper>

+ 22 - 43
service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml

@@ -19,58 +19,37 @@
         <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
-        <if test="tenantId != null and tenantId != '' and tenantId != 0">
-            AND pr.tenant_id = #{tenantId}
-        </if>
-        <if test="projectId != null and projectId != '' and projectId != 0">
+        JOIN pm_work_report pr ON pc.report_id = pr.id
+        <if test="projectId != null and projectId != 0">
             AND pr.id = #{projectId}
         </if>
-        <if test="userId != null and userId != '' and userId != 0">
-            AND pr.submitter_id = #{userId}
+        <if test="userIds != null">
+            AND pr.submitter_id IN
+            <foreach collection="userIds" item="userId" open="(" separator="," close=")">
+                #{userId}
+            </foreach>
+        </if>
+        <if test="startDate != null and startDate != ''"><!-- 开始时间检索 -->
+            and date_format(pr.report_date,'%y%m%d') >= date_format(#{startDate},'%y%m%d')
         </if>
-        <if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
-            AND pr.report_date BETWEEN #{startTime} AND #{endTime}
+        <if test="endDate != null and endDate != ''"><!-- 结束时间检索 -->
+            and date_format(pr.report_date,'%y%m%d') &lt;= date_format(#{endDate},'%y%m%d')
         </if>
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
         ORDER BY pr.report_date DESC
     </select>
 

+ 2 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkReportMapper.xml

@@ -22,6 +22,8 @@
         <result column="timing_time" property="timingTime" />
         <result column="report_status" property="reportStatus" />
         <result column="is_regularly_send" property="isRegularlySend" />
+        <result column="report_file" property="reportFile" />
+        <result column="report_image" property="reportImage" />
     </resultMap>
 
 </mapper>