Jelajahi Sumber

'解决冲突'

james 7 bulan lalu
induk
melakukan
49663e7842
31 mengubah file dengan 1415 tambahan dan 541 penghapusan
  1. 3 3
      service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/PatrolInspectionPlanController.java
  2. 16 4
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java
  3. 15 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmReceiveController.java
  4. 37 23
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java
  5. 16 12
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java
  6. 10 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmProject.java
  7. 10 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmWorkReport.java
  8. 5 19
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmWorkContentMapper.java
  9. 11 3
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmProjectService.java
  10. 5 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmReceiveService.java
  11. 15 10
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java
  12. 7 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkReportService.java
  13. 84 31
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/config/DingTalkAndMessage.java
  14. 170 47
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java
  15. 29 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmReceiveServiceImpl.java
  16. 648 210
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java
  17. 84 32
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java
  18. 44 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/PmWorkHourStatisticRequestVO.java
  19. 55 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkTimeExportTwoVO.java
  20. 0 6
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkTimeExportVO.java
  21. 1 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmProjectMapper.xml
  22. 22 43
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml
  23. 2 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkReportMapper.xml
  24. 5 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingDeviceController.java
  25. 5 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingFloorController.java
  26. 5 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingRoomController.java
  27. 48 48
      service-website/service-website-api/src/main/java/com/usky/website/factory/RemoteUserFallbackFactory.java
  28. 5 0
      service-website/service-website-biz/src/main/java/com/usky/website/controller/web/SiteArticleController.java
  29. 5 0
      service-website/service-website-biz/src/main/java/com/usky/website/controller/web/SiteCategoryController.java
  30. 5 0
      service-website/service-website-biz/src/main/java/com/usky/website/controller/web/SiteReviewController.java
  31. 48 48
      usky-module-demo/usky-module-demo-api/src/main/java/com/usky/demo/factory/RemoteUserFallbackFactory.java

+ 3 - 3
service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/PatrolInspectionPlanController.java

@@ -34,7 +34,7 @@ public class PatrolInspectionPlanController {
      * @param patrolInspectionPlanVo
      * @return
      */
-    @Log(title = "巡检计划", businessType = BusinessType.INSERT)
+    @Log(title = "新增巡检计划", businessType = BusinessType.INSERT)
     @PostMapping("addPatrolInspectionPlan")
     public ApiResult<Void> addPatrolInspectionPlan(@RequestBody PatrolInspectionPlanVo patrolInspectionPlanVo) {
         patrolInspectionPlanService.addPatrolInspectionPlan(patrolInspectionPlanVo);
@@ -47,7 +47,7 @@ public class PatrolInspectionPlanController {
      * @param patrolInspectionPlanVo
      * @return
      */
-    @Log(title = "巡检计划", businessType = BusinessType.UPDATE)
+    @Log(title = "修改巡检计划", businessType = BusinessType.UPDATE)
     @PostMapping("updatePatrolInspectionPlan")
     public ApiResult<Void> updatePatrolInspectionPlan(@RequestBody PatrolInspectionPlanVo patrolInspectionPlanVo) {
         patrolInspectionPlanService.updatePatrolInspectionPlan(patrolInspectionPlanVo);
@@ -60,7 +60,7 @@ public class PatrolInspectionPlanController {
      * @param id 计划ID
      * @return
      */
-    @Log(title = "巡检计划", businessType = BusinessType.DELETE)
+    @Log(title = "删除巡检计划", businessType = BusinessType.DELETE)
     @GetMapping("delPatrolInspectionPlan")
     public ApiResult<Void> delPatrolInspectionPlan(@RequestParam(value = "id") Integer id) {
         patrolInspectionPlanService.delPatrolInspectionPlan(id);

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

@@ -43,7 +43,7 @@ public class PmProjectController {
     }
 
     /**
-     * 分页
+     * 项目列表分页
      *
      * @param projectName
      * @param projectType
@@ -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);
+    }
+
     /**
      * 人员、项目下拉
      *
@@ -143,5 +150,10 @@ public class PmProjectController {
         return ApiResult.success(pmProjectService.usersProjectWorkTime(projectId, startDate, endDate));
     }
 
+    @GetMapping("/joinProject")
+    public void projectIdName(@RequestParam(value = "projectId") Integer projectId) {
+        pmProjectService.joinProject(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, "工时统计", "工时统计");
     }
 

+ 16 - 12
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java

@@ -3,8 +3,11 @@ 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;
 import com.usky.iot.service.vo.PmProjectTotalWorkTimeVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -24,6 +27,7 @@ import java.util.Map;
 @RestController
 @RequestMapping("/pmWorkReport")
 public class PmWorkReportController {
+
     @Autowired
     private PmWorkReportService pmWorkReportService;
 
@@ -47,8 +51,9 @@ 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);
     }
 
@@ -62,24 +67,23 @@ 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);
     }
+
+    /**
+     * 定时报告查询
+     */
+    @GetMapping("/timedReports")
+    public ApiResult<List<PmWorkReport>> timedReportQuery() {
+        return ApiResult.success(pmWorkReportService.timedReportQuery());
+    }
+
 }

+ 10 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/PmProject.java

@@ -2,6 +2,7 @@ package com.usky.iot.domain;
 
 import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import java.io.Serializable;
@@ -108,6 +109,14 @@ public class PmProject implements Serializable {
      */
     private Integer delFlag;
 
+    /**
+     * 提交次数
+     */
+    @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;
+
 }

+ 5 - 19
service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmWorkContentMapper.java

@@ -3,10 +3,12 @@ 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;
 import org.springframework.stereotype.Repository;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -32,26 +34,10 @@ public interface PmWorkContentMapper extends CrudMapper<PmWorkContent> {
                                                     @Param("userId") Long userId,
                                                     @Param("tenantId") Integer tenantId);*/
 
+
     /**
-     * 人员查询时增加部门隔离,项目维度不需要
-     *
-     * @param startTime
-     * @param endTime
-     * @param userId
-     * @param tenantId
+     * 导出工时明细
      * @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);
 }

+ 11 - 3
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);
 
     /**
      * 查询项目名
@@ -101,7 +101,7 @@ public interface PmProjectService extends CrudService<PmProject> {
     void exitProject(Integer projectId);
 
     /**
-     * 项目概览-项目工时统计
+     * 项目概览-项目-工时统计
      *
      * @param projectId
      * @param startDate
@@ -111,10 +111,18 @@ public interface PmProjectService extends CrudService<PmProject> {
     PmProjectWorkTimeTwoVo projectWorkTime(Integer projectId, String startDate, String endDate);
 
     /**
-     * 项目概览-人员项目工时统计
+     * 项目概览-人员-项目工时统计
      *
      * @param projectId
      * @return
      */
     PmUsersProjectWorkTimeVO usersProjectWorkTime(Integer projectId, String startDate, String endDate);
+
+    /**
+     * 加入项目
+     *
+     * @param projectId
+     * @return
+     */
+    void joinProject(Integer projectId);
 }

+ 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);
 
 }

+ 7 - 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);
 
     /**
      * 工时计算
@@ -52,4 +52,10 @@ public interface PmWorkReportService extends CrudService<PmWorkReport> {
      */
     void deleteContent(Integer reportId);
 
+    /**
+     * 定时报告查询
+     * @return
+     */
+    List<PmWorkReport> timedReportQuery();
+
 }

+ 84 - 31
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/config/DingTalkAndMessage.java

@@ -7,13 +7,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiMediaUploadRequest;
 import com.dingtalk.api.request.OapiReportCreateRequest;
 import com.dingtalk.api.request.OapiV2UserGetbymobileRequest;
+import com.dingtalk.api.response.OapiMediaUploadResponse;
 import com.dingtalk.api.response.OapiReportCreateResponse;
 import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
 import com.fasterxml.jackson.databind.JsonNode;
 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;
@@ -86,7 +91,7 @@ public class DingTalkAndMessage {
         try {
             client = createClient();
         } catch (Exception e) {
-            log.error("获取钉钉token异常:" + e);
+            log.error("DingTalkAndMessage client = createClient() 获取钉钉token异常:" + e);
         }
         com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest getAccessTokenRequest = new com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest()
                 .setAppKey(dingTalkConstant.DING_TALK_CLIENT_ID)
@@ -100,16 +105,16 @@ public class DingTalkAndMessage {
         } catch (Exception _err) {
             TeaException err = new TeaException(_err.getMessage(), _err);
             if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-                log.error("获取钉钉token异常:" + err.code + err.message);
+                log.error("DingTalkAndMessage TeaException err = new TeaException(_err.getMessage(), _err) 获取钉钉token异常:" + err.code + err.message);
             }
         }
         return responseBody.getBody().accessToken;
     }
 
     /**
-     * 获取钉钉userId
+     * 获取钉钉userId,优先从数据库中找,没有则调用钉钉接口查
      *
-     * @param userId 平台userid
+     * @param userId userid
      * @return
      */
     public String getDingTalkUserId(Long userId) {
@@ -117,47 +122,91 @@ public class DingTalkAndMessage {
         if (userId == null) {
             return dingTalkId;
         }
-        LambdaQueryWrapper<MceMbuser> dingTalkQuery = Wrappers.lambdaQuery();
-        dingTalkQuery.select(MceMbuser::getDingTalkId, MceMbuser::getUserId)
-                .eq(MceMbuser::getUserId, userId);
-        MceMbuser mceMbuser = mceMbuserMapper.selectOne(dingTalkQuery);
+        SysUser user = userPhoneNumber(userId);
+        String mobile = user.getPhonenumber();
+        String userName = user.getUserName();
+        LocalDateTime now = LocalDateTime.now();
+
+        dingTalkId = getDingTalkId(userId, mobile, dingTalkId);
+        MceMbuser mceMbuser = getMceMbuser(userId);
+
         if (mceMbuser != null) {
             String dingId = mceMbuser.getDingTalkId();
             if (StringUtils.isNotBlank(dingId)) {
                 return dingId;
+            } else {
+                // 钉钉userid存入注册表
+                MceMbuser mbuser = new MceMbuser();
+                mbuser.setDingTalkId(dingTalkId);
+                mbuser.setPhone(mobile);
+                mbuser.setUserId(userId);
+                mbuser.setUpdateBy(userName);
+                mbuser.setUpdateTime(now);
+                mceMbuserMapper.updateById(mbuser);
             }
         } else {
-            LambdaQueryWrapper<SysUser> phoneQuery = Wrappers.lambdaQuery();
-            phoneQuery.select(SysUser::getPhonenumber, SysUser::getUserName)
-                    .eq(SysUser::getUserId, userId);
-            SysUser user = sysUserMapper.selectOne(phoneQuery);
-            String mobile = user.getPhonenumber();
-            try {
-                String accessToken = getDingTalkToken();
-                DingTalkClient client = new DefaultDingTalkClient(dingTalkConstant.DING_TALK_USERID_URL);
-                OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
-                req.setMobile(mobile);
-                OapiV2UserGetbymobileResponse rsp = client.execute(req, accessToken);
-                ObjectMapper objectMapper = new ObjectMapper();
-                JsonNode rootNode = objectMapper.readTree(rsp.getBody());
-                JsonNode resultNode = rootNode.get("result");
-                dingTalkId = resultNode.get("userid").asText();
-            } catch (Exception e) {
-                log.error("获取userid:" + userId + "的钉钉ID失败", e);
-            }
-
             // 钉钉userid存入注册表
             MceMbuser mbuser = new MceMbuser();
             mbuser.setDingTalkId(dingTalkId);
             mbuser.setPhone(mobile);
             mbuser.setUserId(userId);
-            mbuser.setCreateBy(user.getUserName());
-            mbuser.setCreateTime(LocalDateTime.now());
+            mbuser.setCreateBy(userName);
+            mbuser.setCreateTime(now);
             mceMbuserMapper.insert(mbuser);
         }
         return dingTalkId;
     }
 
+    /**
+     * 获取用户 消息中心_注册表信息
+     *
+     * @param userId
+     * @return
+     */
+    private MceMbuser getMceMbuser(Long userId) {
+        LambdaQueryWrapper<MceMbuser> dingTalkQuery = Wrappers.lambdaQuery();
+        dingTalkQuery.eq(MceMbuser::getUserId, userId);
+        return mceMbuserMapper.selectOne(dingTalkQuery);
+    }
+
+    /**
+     * 获取钉钉userId
+     *
+     * @param userId 平台userid
+     * @return
+     */
+    private String getDingTalkId(Long userId, String mobile, String dingTalkId) {
+        try {
+            String accessToken = getDingTalkToken();
+            DingTalkClient client = new DefaultDingTalkClient(dingTalkConstant.DING_TALK_USERID_URL);
+            OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
+            req.setMobile(mobile);
+            OapiV2UserGetbymobileResponse rsp = client.execute(req, accessToken);
+            ObjectMapper objectMapper = new ObjectMapper();
+            JsonNode rootNode = objectMapper.readTree(rsp.getBody());
+            JsonNode resultNode = rootNode.get("result");
+            dingTalkId = resultNode.get("userid").asText();
+        } catch (Exception e) {
+            log.error("获取userid:" + userId + "的钉钉ID失败", e);
+        }
+        return dingTalkId;
+    }
+
+    /**
+     * @description: 获取用户信息
+     * @author: fu
+     * @date: 2024/8/22 15:14
+     * @param: [userId]
+     * @return: java.lang.String
+     **/
+    private SysUser userPhoneNumber(Long userId) {
+        LambdaQueryWrapper<SysUser> phoneQuery = Wrappers.lambdaQuery();
+        phoneQuery.select(SysUser::getUserId, SysUser::getPhonenumber, SysUser::getUserName, SysUser::getNickName,
+                        SysUser::getAvatar, SysUser::getSex, SysUser::getDeptId, SysUser::getTenantId)
+                .eq(SysUser::getUserId, userId);
+        return sysUserMapper.selectOne(phoneQuery);
+    }
+
     @Async("asyncServiceExecutor")// 异步发送
     public void sendDingTalkDailyReport(PmWorkReport workReport, List<PmWorkContent> workContents) {
         String userName = workReport.getCreateBy();
@@ -260,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)
@@ -276,7 +327,8 @@ public class DingTalkAndMessage {
         jsonObject.put("infoType", INFO_TYPE);
         jsonObject.put("id", newReport.getId());
         jsonObject.put("infoTypeName", INFO_TITLE);
-        if (userId != null && !userId.isEmpty()) {
+        jsonObject.put("userName", newReport.getCreateBy());
+        if (!userId.isEmpty()) {
             jsonObject.put("userIds", userId);
         }
         try {
@@ -293,5 +345,6 @@ public class DingTalkAndMessage {
         }
         log.info(username + "的工作报告发送消息中心完成-----------------------------------");
     }
+
 }
 

+ 170 - 47
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java

@@ -30,6 +30,7 @@ import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * <p>
@@ -57,12 +58,31 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
     @Autowired
     private PmWorkContentService pmWorkContentService;
 
+    private static final String FIND_IN_SET_SQL = "FIND_IN_SET(?, project_member) > 0";
+
     @Override
     public void addProject(PmProject project) {
         Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
         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);
@@ -76,15 +96,16 @@ 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);
                     project.setCreateTime(now);
                     project.setDeptId(deptId);
+                    project.setTenantId(tenantId);
                     this.save(project);
                 } else {
                     project.setUpdateBy(userName);
@@ -114,23 +135,59 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
     }
 
     /**
-     * 添加工作报告下拉框
+     * 添加工作报告项目下拉框
      * 查询当前租户所有项目
      *
      * @return 只返回项目id和名称
      */
     @Override
     public List<PmProject> queryProject() {
+        Integer tenantId = SecurityUtils.getTenantId();
+        Long userId = SecurityUtils.getUserId();
         LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
         wrapper.select(PmProject::getId, PmProject::getProjectName)
-                .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
+                .eq(PmProject::getTenantId, tenantId)
                 .eq(PmProject::getDelFlag, 0)
                 .and(qw -> qw
-                        .eq(PmProject::getProjectHead, SecurityUtils.getUserId())
+                        .eq(PmProject::getProjectHead, userId)
                         .or().apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
                 )
                 .in(PmProject::getProjectStatus, 1, 2, 3);
         List<PmProject> list = this.list(wrapper);
+        if (list.isEmpty()){
+            return list;
+        }
+
+        List<Integer> projectIds = list.stream().map(PmProject::getId).collect(Collectors.toList());
+        LambdaQueryWrapper<PmWorkContent> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(PmWorkContent::getProjectId)
+                .eq(PmWorkContent::getSubmitterId, userId)
+                .in(PmWorkContent::getProjectId, projectIds)
+                .between(PmWorkContent::getCreateTime, LocalDateTime.now().minusDays(29), LocalDateTime.now());
+        List<PmWorkContent> pmWorkContents = pmWorkContentMapper.selectList(queryWrapper);
+        if (pmWorkContents.isEmpty()){
+            for (PmProject project : list){
+                project.setSubmissions(0L);
+            }
+            return list;
+        }
+
+        Map<Integer, Long> projectIdCountMap = pmWorkContents.stream()
+                .collect(Collectors.groupingBy(PmWorkContent::getProjectId, Collectors.counting()));
+
+        for (PmProject project : list) {
+            Integer id = project.getId();
+            Long aLong = projectIdCountMap.getOrDefault(id,0L);
+            project.setSubmissions(aLong);
+        }
+        //降序排序
+        Collections.sort(list, new Comparator<PmProject>() {
+            @Override
+            public int compare(PmProject p1, PmProject p2) {
+                return Long.compare(p2.getSubmissions(), p1.getSubmissions());
+            }
+        });
+
         return list;
     }
 
@@ -147,29 +204,39 @@ 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);
             return new CommonPage<>(page.getRecords(), page.getTotal(), pageSize, pageNum);
         }
-        if (projectAscription == 0) {
-            lambdaQuery.and(q -> q.eq(PmProject::getProjectHead, userId)
-                    .or().apply("FIND_IN_SET('" + userId + "', project_member) > 0")
-                    .or().eq(PmProject::getCreateBy, username));
-        } else if (projectAscription == 1) {
-            lambdaQuery.eq(PmProject::getProjectHead, userId);
-        } else if (projectAscription == 2) {
-            lambdaQuery.apply("FIND_IN_SET('" + userId + "', project_member) > 0");
+        switch (projectAscription) {
+            case 0:
+                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);
+                break;
+            case 2:
+                lambdaQuery.apply("FIND_IN_SET('" + userId + "', project_member) > 0");
+                break;
+            default:
+                throw new BusinessException("查询项目列表参数错误");
         }
-        if (!projectName.isEmpty()) {
+        if (StringUtils.isNotBlank(projectName)) {
             lambdaQuery.like(PmProject::getProjectName, projectName);
         }
         if (projectType != 0) {
@@ -179,6 +246,10 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
             lambdaQuery.eq(PmProject::getProjectStatus, projectStatus);
         }
         lambdaQuery.orderByDesc(PmProject::getCreateTime);
+        List<PmProject> pmProjects = pmProjectMapper.selectList(lambdaQuery);
+        if (pmProjects.isEmpty()){
+            return new CommonPage<>(pmProjects, 0, pageSize, pageNum);
+        }
 
         // 替换创建人和更新人名字(username→nickname)
         LambdaQueryWrapper<SysUser> query = Wrappers.lambdaQuery();
@@ -239,6 +310,7 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         LambdaQueryWrapper<PmProject> lambdaQuery = Wrappers.lambdaQuery();
         lambdaQuery.eq(PmProject::getTenantId, SecurityUtils.getTenantId())
                 .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);
@@ -289,7 +361,7 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
             for (PmProject user : users) {
                 Long projectHead = user.getProjectHead();
                 userIds.add(projectHead);
-                if (user.getProjectMember() != null && StringUtils.isNotBlank(user.getProjectMember())){
+                if (user.getProjectMember() != null && StringUtils.isNotBlank(user.getProjectMember())) {
                     Set<Long> projectMembers = Arrays.stream(user.getProjectMember().split(","))
                             .map(Long::parseLong)
                             .collect(Collectors.toSet());
@@ -393,7 +465,7 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate startTime = null;
         LocalDate endTime = null;
-        if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)){
+        if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) {
             try {
                 startTime = LocalDate.parse(startDate, formatter);
                 endTime = LocalDate.parse(endDate, formatter);
@@ -423,7 +495,7 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
                 .eq(PmWorkContent::getProjectId, projectId)
                 .in(PmWorkContent::getReportId, reportIds);
         List<PmWorkContent> pmWorkContents = pmWorkContentMapper.selectList(wrapper);
-        for (PmWorkReport report : pmWorkReports){
+        for (PmWorkReport report : pmWorkReports) {
             Integer id = report.getId();
             LocalDate reportDate = report.getReportDate();
             if (pmWorkContents.stream().anyMatch(content -> content.getReportId().equals(id))) {
@@ -460,12 +532,17 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
      **/
     @Override
     public PmUsersProjectWorkTimeVO usersProjectWorkTime(Integer projectId, String startDate, String endDate) {
+
+        if (projectId == null || projectId <= 0) {
+            throw new BusinessException("查询项目工时项目id有误!");
+        }
+
         PmUsersProjectWorkTimeVO workTimeCount = new PmUsersProjectWorkTimeVO();
 
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate startTime = null;
         LocalDate endTime = null;
-        if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)){
+        if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) {
             try {
                 startTime = LocalDate.parse(startDate, formatter);
                 endTime = LocalDate.parse(endDate, formatter);
@@ -478,33 +555,79 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
             endTime = LocalDate.now().minusDays(29);
         }
 
-        if (projectId != null) {
-            List<String> users = new ArrayList<>();
-            List<BigDecimal> workTime = new ArrayList<>();
-
-            LambdaQueryWrapper<PmWorkReport> wrapper2 = Wrappers.lambdaQuery();
-            wrapper2.select(PmWorkReport::getId);
-            wrapper2.between(PmWorkReport::getReportDate, startTime, endTime);
-            List<Integer> reportIds = pmWorkReportMapper.selectList(wrapper2).stream().map(PmWorkReport::getId).collect(Collectors.toList());
-
-            LambdaQueryWrapper<PmWorkContent> wrapper = Wrappers.lambdaQuery();
-            wrapper.select(PmWorkContent::getSubmitterId, PmWorkContent::getWorkTime)
-                    .eq(PmWorkContent::getProjectId, projectId)
-                    .eq(PmWorkContent::getTenantId, SecurityUtils.getTenantId());
-            if (!reportIds.isEmpty()){
-                wrapper.in(PmWorkContent::getReportId, reportIds);
-            }
-            List<PmWorkContent> pmWorkContents = pmWorkContentMapper.selectList(wrapper);
-            List<Long> userIds = pmWorkContents.stream().map(PmWorkContent::getSubmitterId).distinct().collect(Collectors.toList());
-            List<SysUser> sysUsers = pmWorkContentService.nickNames(userIds);
-            for (SysUser sysUser : sysUsers) {
-                users.add(sysUser.getNickName());
-                workTime.add(pmWorkContents.stream().filter(pmWorkContent -> pmWorkContent.getSubmitterId().equals(sysUser.getUserId())).map(PmWorkContent::getWorkTime).reduce(BigDecimal.ZERO, BigDecimal::add));
-                workTimeCount.setUsers(users);
-                workTimeCount.setWorkTime(workTime);
-            }
+        LambdaQueryWrapper<PmWorkReport> wrapper2 = Wrappers.lambdaQuery();
+        wrapper2.select(PmWorkReport::getId);
+        wrapper2.between(PmWorkReport::getReportDate, startTime, endTime);
+        List<Integer> reportIds = pmWorkReportMapper.selectList(wrapper2).stream().map(PmWorkReport::getId).collect(Collectors.toList());
+
+        // 项目成员与实际填写报告的人员可能会有差异
+        LambdaQueryWrapper<PmWorkContent> wrapper = Wrappers.lambdaQuery();
+        wrapper.select(PmWorkContent::getSubmitterId, PmWorkContent::getWorkTime)
+                .eq(PmWorkContent::getProjectId, projectId)
+                .eq(PmWorkContent::getTenantId, SecurityUtils.getTenantId());
+        if (!reportIds.isEmpty()) {
+            wrapper.in(PmWorkContent::getReportId, reportIds);
+        }
+        List<PmWorkContent> pmWorkContents = pmWorkContentMapper.selectList(wrapper);
+        Set<Long> userIds = pmWorkContents.stream().map(PmWorkContent::getSubmitterId).collect(Collectors.toSet());
+
+        LambdaQueryWrapper<PmProject> wrapper1 = Wrappers.lambdaQuery();
+        wrapper1.select(PmProject::getProjectMember)
+                .eq(PmProject::getId, projectId);
+        if (StringUtils.isNotBlank(pmProjectMapper.selectOne(wrapper1).getProjectMember())) {
+            List<Long> userIds1 = Arrays.stream(pmProjectMapper.selectOne(wrapper1).getProjectMember().split(",")).map(Long::parseLong).collect(Collectors.toList());
+            userIds.addAll(userIds1);
+        }
+
+        List<Long> userIds1 = new ArrayList<>(userIds);
+        List<SysUser> sysUsers = pmWorkContentService.nickNames(userIds1);
+        BigDecimal totalWorkTime = BigDecimal.ZERO;
+
+        List<String> users2 = new ArrayList<>();
+        List<BigDecimal> workTime1 = new ArrayList<>();
+
+        for (SysUser sysUser : sysUsers) {
+            users2.add(sysUser.getNickName());
+            BigDecimal userWorkTime = pmWorkContents.stream()
+                    .filter(pmWorkContent -> pmWorkContent.getSubmitterId().equals(sysUser.getUserId()))
+                    .map(PmWorkContent::getWorkTime)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            workTime1.add(userWorkTime);
+            totalWorkTime = totalWorkTime.add(userWorkTime);
         }
+        workTimeCount.setUsers(users2);
+        if (reportIds.isEmpty()) {
+            List<BigDecimal> workTime = IntStream.range(0, users2.size())
+                    .mapToObj(index -> BigDecimal.ZERO)
+                    .collect(Collectors.toList());
+            workTimeCount.setWorkTime(workTime);
+            return workTimeCount;
+        }
+        workTimeCount.setWorkTime(workTime1);
+
         return workTimeCount;
     }
 
+    /**
+     * @description: 项目成员加入项目
+     * @author: fu
+     * @date: 2024/8/12 15:44
+     * @param: [projectId]
+     * @return: void
+     **/
+    @Override
+    public void joinProject(Integer projectId) {
+        Long userId = SecurityUtils.getUserId();
+        PmProject pmProject = pmProjectMapper.selectById(projectId);
+        if (pmProject == null) {
+            throw new BusinessException("加入项目不存在!请刷新后重试");
+        }
+        pmProject.setProjectMember(pmProject.getProjectMember() + "," + userId);
+        try {
+            pmProjectMapper.updateById(pmProject);
+        } catch (Exception e) {
+            throw new BusinessException("加入项目失败!请联系管理员");
+        }
+    }
+
 }

+ 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);
+    }
+
+
 }

+ 648 - 210
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.exception.BusinessException;
 import com.usky.common.mybatis.core.AbstractCrudService;
@@ -13,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;
@@ -26,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;
 
@@ -37,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 {
 
@@ -55,6 +59,13 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     @Autowired
     private PmProjectMapper pmProjectMapper;
 
+    /**
+     * @description: 删除报告内容
+     * @author: fu
+     * @date: 2024/8/7 17:48
+     * @param: [reportId]
+     * @return: void
+     **/
     @Override
     public void deleteContent(Integer reportId) {
         LambdaQueryWrapper<PmWorkContent> deleteWrapper = Wrappers.lambdaQuery();
@@ -73,9 +84,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
         Integer tenantId = SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-        reportQuery.select(PmWorkReport::getId)
-                .eq(PmWorkReport::getTenantId, tenantId)
-                .eq(PmWorkReport::getDeptId, deptId);
+        reportQuery.select(PmWorkReport::getId).eq(PmWorkReport::getTenantId, tenantId).eq(PmWorkReport::getDeptId, deptId);
         if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) {
             LocalDate start = null;
             LocalDate end = null;
@@ -107,11 +116,8 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         Long userId = SecurityUtils.getUserId();
         Integer tenantId = SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-        reportQuery.select(PmWorkReport::getId)
-                .eq(PmWorkReport::getTenantId, tenantId)
-                .apply("FIND_IN_SET(" + userId + ", cc_to) > 0");
-        List<PmWorkReport> reportIds = pmWorkReportMapper.selectList(reportQuery);
-        return reportIds.stream().map(PmWorkReport::getId).collect(Collectors.toList());
+        reportQuery.select(PmWorkReport::getId).eq(PmWorkReport::getTenantId, tenantId).apply("FIND_IN_SET(" + userId + ", cc_to) > 0").orderByDesc(PmWorkReport::getReportDate);
+        return pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toList());
     }
 
     /**
@@ -123,17 +129,9 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
      **/
     private List<Integer> sentOut() {
         Long userid = SecurityUtils.getUserId();
-        Integer tenantId = SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-        reportQuery.select(PmWorkReport::getId)
-                .eq(PmWorkReport::getTenantId, tenantId)
-                .eq(PmWorkReport::getSubmitterId, userid);
-        List<PmWorkReport> reportIds = pmWorkReportMapper.selectList(reportQuery);
-        List<Integer> rIds = new ArrayList<>();
-        for (PmWorkReport report : reportIds) {
-            rIds.add(report.getId());
-        }
-        return rIds;
+        reportQuery.select(PmWorkReport::getId).eq(PmWorkReport::getSubmitterId, userid).orderByDesc(PmWorkReport::getSubmitDate);
+        return pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toList());
     }
 
     /**
@@ -147,15 +145,8 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         Long userId = SecurityUtils.getUserId();
         Integer tenantId = SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmProject> projectQuery = Wrappers.lambdaQuery();
-        projectQuery.select(PmProject::getId)
-                .eq(PmProject::getTenantId, tenantId)
-                .eq(PmProject::getProjectHead, userId);
-        List<PmProject> projectIds = pmProjectMapper.selectList(projectQuery);
-        List<Integer> rIds = new ArrayList<>();
-        for (PmProject project : projectIds) {
-            rIds.add(project.getId());
-        }
-        return rIds;
+        projectQuery.select(PmProject::getId).eq(PmProject::getTenantId, tenantId).eq(PmProject::getProjectHead, userId);
+        return pmProjectMapper.selectList(projectQuery).stream().map(PmProject::getId).collect(Collectors.toList());
     }
 
     /**
@@ -168,9 +159,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     private List<Integer> reportList(String projectName) {
         Integer tenantId = SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmWorkContent> projectQuery = Wrappers.lambdaQuery();
-        projectQuery.select(PmWorkContent::getReportId)
-                .eq(PmWorkContent::getProjectName, projectName)
-                .eq(PmWorkContent::getTenantId, tenantId);
+        projectQuery.select(PmWorkContent::getReportId).eq(PmWorkContent::getProjectName, projectName).eq(PmWorkContent::getTenantId, tenantId);
         List<PmWorkContent> projectIds = pmWorkContentMapper.selectList(projectQuery);
         List<Integer> rIds = new ArrayList<>();
         for (PmWorkContent contenReportId : projectIds) {
@@ -187,12 +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 {
@@ -202,18 +197,33 @@ 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());
+            reportQuery.select(PmWorkReport::getId).between(PmWorkReport::getSubmitDate, startDateTime, endDateTime);
+            reportIdsByDate = pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toSet());
         }
 
-        List<PmWorkContent> workContentList = new ArrayList<>();
+        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();
-        contentLambdaQuery.select(PmWorkContent::getProjectId, PmWorkContent::getProjectName);
+        contentLambdaQuery.select(PmWorkContent::getProjectId);
         switch (projectAscription) {
             case 1:
                 List<Integer> headProjects = head();
@@ -245,10 +255,21 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         if (!reportIds.isEmpty()) {
             contentLambdaQuery.in(PmWorkContent::getReportId, reportIds);
         }
-        contentLambdaQuery.groupBy(PmWorkContent::getProjectId)
-                .groupBy(PmWorkContent::getProjectName);
+        contentLambdaQuery.groupBy(PmWorkContent::getProjectId);
         workContentList = pmWorkContentMapper.selectList(contentLambdaQuery);
 
+        List<Integer> workContentIds = workContentList.stream().map(PmWorkContent::getProjectId).distinct().collect(Collectors.toList());
+        if (workContentIds.isEmpty()) {
+            return workContentList;
+        }
+        LambdaQueryWrapper<PmProject> projectQuery = Wrappers.lambdaQuery();
+        projectQuery.select(PmProject::getId, PmProject::getProjectName).in(PmProject::getId, workContentIds);
+        Map<Integer, String> projectNameMap = pmProjectMapper.selectList(projectQuery).stream().collect(Collectors.toMap(PmProject::getId, PmProject::getProjectName));
+
+        workContentList.forEach(workContent -> {
+            workContent.setProjectName(projectNameMap.get(workContent.getProjectId()));
+        });
+
         return workContentList;
     }
 
@@ -278,18 +299,16 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         List<PmWorkReport> reportList2 = new ArrayList<>();
         List<PmWorkContent> pmWorkContentList = new ArrayList<>();
         List<Long> userIds = new ArrayList<>();
-        if (reportId != null && reportId != 0) {
+        if (reportId != null && reportId > 0) {
             LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-            reportQuery.select(PmWorkReport::getId, PmWorkReport::getCoordinateWork, PmWorkReport::getTomorrowPlan, PmWorkReport::getCcTo, PmWorkReport::getSubmitterId,
-                            PmWorkReport::getCreateTime, PmWorkReport::getReportDate)
-                    .eq(PmWorkReport::getId, reportId);
+            reportQuery.eq(PmWorkReport::getId, reportId);
             PmWorkReport report = pmWorkReportMapper.selectOne(reportQuery);
             if (report == null) {
-                throw new BusinessException("报告已经不存在了哟");
+                throw new BusinessException("该报告已被删除!");
             }
+
             LambdaQueryWrapper<PmWorkContent> contentQuery = Wrappers.lambdaQuery();
-            contentQuery.select(PmWorkContent::getWorkContent, PmWorkContent::getWorkTime, PmWorkContent::getProjectName)
-                    .eq(PmWorkContent::getReportId, reportId);
+            contentQuery.select(PmWorkContent::getWorkContent, PmWorkContent::getWorkTime, PmWorkContent::getProjectName).eq(PmWorkContent::getReportId, reportId);
             pmWorkContentList = this.list(contentQuery);
             report.setWorkContents(pmWorkContentList);
             reportList.add(report);
@@ -338,16 +357,10 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 reportIds.add(a.getReportId());
             }
             LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-            reportQuery.select(PmWorkReport::getId, PmWorkReport::getCoordinateWork, PmWorkReport::getTomorrowPlan, PmWorkReport::getCcTo, PmWorkReport::getSubmitterId,
-                            PmWorkReport::getCreateTime, PmWorkReport::getReportDate)
-                    .in(PmWorkReport::getId, reportIds)
-                    .orderByDesc(PmWorkReport::getCreateTime);
+            reportQuery.select(PmWorkReport::getId, PmWorkReport::getCoordinateWork, PmWorkReport::getTomorrowPlan, PmWorkReport::getCcTo, PmWorkReport::getSubmitterId, PmWorkReport::getCreateTime, PmWorkReport::getReportDate).in(PmWorkReport::getId, reportIds).orderByDesc(PmWorkReport::getCreateTime);
             reportList = pmWorkReportMapper.selectList(reportQuery);
             LambdaQueryWrapper<PmReceive> statusQuery = Wrappers.lambdaQuery();
-            statusQuery.select(PmReceive::getReportId, PmReceive::getReadFlag)
-                    .eq(PmReceive::getReceiverId, SecurityUtils.getUserId())
-                    .eq(PmReceive::getTenantId, SecurityUtils.getTenantId())
-                    .in(PmReceive::getReportId, reportIds);
+            statusQuery.select(PmReceive::getReportId, PmReceive::getReadFlag).eq(PmReceive::getReceiverId, SecurityUtils.getUserId()).eq(PmReceive::getTenantId, SecurityUtils.getTenantId()).in(PmReceive::getReportId, reportIds);
             List<PmReceive> receiveList = pmReceiveMapper.selectList(statusQuery);
             for (PmWorkReport c : reportList) {
                 List<PmWorkContent> contents = new ArrayList<>();
@@ -376,11 +389,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             }
             List<Long> ids = null;
             if (!d.getCcTo().isEmpty()) {
-                ids = Optional.ofNullable(d.getCcTo())
-                        .map(ccTo -> Arrays.stream(ccTo.split(","))
-                                .map(Long::parseLong)
-                                .collect(Collectors.toList()))
-                        .orElse(Collections.emptyList());
+                ids = Optional.ofNullable(d.getCcTo()).map(ccTo -> Arrays.stream(ccTo.split(",")).map(Long::parseLong).collect(Collectors.toList())).orElse(Collections.emptyList());
             }
             List<SysUser> nickNameList = null;
             if (CollectionUtils.isNotEmpty(ids)) {
@@ -416,25 +425,13 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     @Override
     public List<SysUser> nickNames(List<Long> userIds) {
         LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
-        usersQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName, SysUser::getPhonenumber, SysUser::getAvatar,
-                        SysUser::getSex, SysUser::getDeptId)
-                .eq(SysUser::getTenantId, SecurityUtils.getTenantId())
-                .eq(SysUser::getDelFlag, 0);
+        usersQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName, SysUser::getPhonenumber, SysUser::getAvatar, SysUser::getSex, SysUser::getDeptId).eq(SysUser::getTenantId, SecurityUtils.getTenantId()).eq(SysUser::getDelFlag, 0);
         if (!userIds.isEmpty()) {
             usersQuery.in(SysUser::getUserId, userIds);
         }
         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
@@ -443,12 +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) {
+    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 {
@@ -458,34 +464,77 @@ 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());
+            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()));
+            contentLambdaQuery.select(PmWorkContent::getReportId).eq(PmWorkContent::getProjectId, projectId);
+            reportIdsByProject = pmWorkContentMapper.selectList(contentLambdaQuery).stream().map(PmWorkContent::getReportId).collect(Collectors.toSet());
         }
 
-        CommonPage<PmWorkReport> returnPage = new CommonPage<>(new ArrayList<>(), 0, pageSize, pageNum);
-        Integer tenantId = SecurityUtils.getTenantId();
-        Long userId = SecurityUtils.getUserId();
+        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<>();
+        Long userId2 = SecurityUtils.getUserId();
         List<Long> userIds = new ArrayList<>();
         List<Integer> receiveList = receive();
-        if (receiveList.isEmpty()) {
+        if (receiveList.isEmpty() && projectAscription == 2) {
             return returnPage;
         }
 
         LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
-        contentLambdaQuery.select(PmWorkContent::getReportId, PmWorkContent::getWorkContent, PmWorkContent::getWorkTime, PmWorkContent::getProjectName);
-        if (reportId != null && reportId > 0) {
+        if (reportId != null && reportId >= 0) {
             contentLambdaQuery.eq(PmWorkContent::getReportId, reportId);
+            pmWorkContentList = pmWorkContentMapper.selectList(contentLambdaQuery);
+            if (pmWorkContentList.isEmpty()) {
+                throw new BusinessException("该报告已被删除!");
+            }
         } else {
             switch (projectAscription) {
                 case 1:
@@ -511,33 +560,27 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             if (!reportIds.isEmpty()) {
                 contentLambdaQuery.in(PmWorkContent::getReportId, reportIds);
             }
-        }
-        List<PmWorkContent> pmWorkContentList = pmWorkContentMapper.selectList(contentLambdaQuery);
-        if (pmWorkContentList.isEmpty()) {
-            if (reportId != null && reportId > 0) {
-                throw new BusinessException("该报告已被删除!");
+            pmWorkContentList = pmWorkContentMapper.selectList(contentLambdaQuery);
+            if (pmWorkContentList.isEmpty()) {
+                return returnPage;
             }
-            return returnPage;
         }
+
         List<Integer> reportIds2 = pmWorkContentList.stream().distinct().map(PmWorkContent::getReportId).collect(Collectors.toList());
 
         LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-        reportQuery.select(PmWorkReport::getId, PmWorkReport::getCoordinateWork, PmWorkReport::getTomorrowPlan, PmWorkReport::getCcTo, PmWorkReport::getSubmitterId,
-                        PmWorkReport::getSubmitDate, PmWorkReport::getReportDate, PmWorkReport::getCreateBy)
-                .eq(PmWorkReport::getReportStatus, 1);
+        reportQuery.eq(PmWorkReport::getTenantId, tenantId).eq(PmWorkReport::getReportStatus, 1);
         if (reportId != null && reportId != 0) {
             reportQuery.eq(PmWorkReport::getId, reportId);
         } else {
-            reportQuery.in(PmWorkReport::getId, reportIds2)
-                    .orderByDesc(PmWorkReport::getCreateTime);
+            reportQuery.in(PmWorkReport::getId, reportIds2).orderByDesc(PmWorkReport::getSubmitDate);
         }
         IPage<PmWorkReport> reportPage = pmWorkReportMapper.selectPage(new Page<>(pageNum, pageSize), reportQuery);
         List<PmWorkReport> reportList = reportPage.getRecords();
 
         // 查询已读状态
         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()) {
@@ -552,9 +595,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         }
 
         for (PmWorkReport report : reportList) {
-            List<PmWorkContent> contents = pmWorkContentList.stream()
-                    .filter(content -> content.getReportId().equals(report.getId()))
-                    .collect(Collectors.toList());
+            List<PmWorkContent> contents = pmWorkContentList.stream().filter(content -> content.getReportId().equals(report.getId())).collect(Collectors.toList());
             report.setWorkContents(contents);
             userIds.add(report.getSubmitterId());
 
@@ -564,21 +605,21 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             // 创建人名字替换
             if (!userIds.isEmpty()) {
                 List<SysUser> nickNames = nickNames(userIds);
-                Map<Long, String> userNicknameMap = nickNames.stream()
-                        .collect(Collectors.toMap(SysUser::getUserId, SysUser::getNickName));
+                Map<Long, String> userNicknameMap = nickNames.stream().collect(Collectors.toMap(SysUser::getUserId, SysUser::getNickName));
                 report.setCreateBy(userNicknameMap.get(report.getSubmitterId()));
             }
         }
 
-
         // 已读未读数量查询
-        List<PmReceive> receives = receives(receiveList);
-        List<Long> uId = new ArrayList<>();
-        for (PmReceive pmReceive : receives) {
-            Long receiverId = pmReceive.getReceiverId();
-            uId.add(receiverId);
+        List<PmReceive> receives = new ArrayList<>();
+        if (!receiveList.isEmpty()) {
+            receives = receives(reportIds2);
         }
 
+        Map<Integer, List<PmReceive>> reportReceivesMap = new HashMap<>();
+        if (!receives.isEmpty()) {
+            reportReceivesMap = receives.stream().collect(Collectors.groupingBy(PmReceive::getReportId));
+        }
 
         Set<Long> userIdSet = new HashSet<>();
         for (PmWorkReport report : reportList) {
@@ -589,23 +630,22 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
 
         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());
+                if (!reportReceivesMap.isEmpty()) {
+                    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());
+                        }
                     }
                 }
 
@@ -622,11 +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);
     }
 
+
     /**
-     * @description: 获取报告接收人
+     * @description: 获取报告接收人-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [report]
@@ -634,13 +675,12 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
      **/
     private List<PmReceive> receives(List<Integer> reports) {
         LambdaQueryWrapper<PmReceive> queryWrapper = Wrappers.lambdaQuery();
-        queryWrapper.select(PmReceive::getReportId, PmReceive::getReadFlag, PmReceive::getReceiverId)
-                .in(PmReceive::getReportId, reports);
+        queryWrapper.select(PmReceive::getReportId, PmReceive::getReadFlag, PmReceive::getReceiverId).in(PmReceive::getReportId, reports);
         return pmReceiveMapper.selectList(queryWrapper);
     }
 
     /**
-     * @description: 获取报告列表
+     * @description: 获取时间段内报告列表(按报告时间查询)-工具
      * @author: fu
      * @date: 2024/8/8 19:22
      * @param: [startDate, endDate]
@@ -648,21 +688,24 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
      **/
     private List<Integer> reports(LocalDate startDate, LocalDate endDate) {
         LambdaQueryWrapper<PmWorkReport> reportsQuery = Wrappers.lambdaQuery();
-        reportsQuery.select(PmWorkReport::getId)
-                .between(PmWorkReport::getReportDate, startDate, endDate)
-                .groupBy(PmWorkReport::getId);
+        reportsQuery.select(PmWorkReport::getId).between(PmWorkReport::getReportDate, startDate, endDate);
         List<PmWorkReport> pmWorkReportList = pmWorkReportMapper.selectList(reportsQuery);
-        return pmWorkReportList.stream()
-                .map(PmWorkReport::getId)
-                .collect(Collectors.toList());
+        return pmWorkReportList.stream().map(PmWorkReport::getId).collect(Collectors.toList());
     }
 
+    /**
+     * @description: 项目查询-工具
+     * @author: fu
+     * @date: 2024/8/8 19:22
+     * @param: [startDate, endDate]
+     * @return: java.util.List<java.lang.Integer>
+     **/
     private List<PmProject> projects(Integer projectId) {
         Integer tenantId = SecurityUtils.getTenantId();
         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);
         }
@@ -670,30 +713,41 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         return pmProjectMapper.selectList(projectsQuery);
     }
 
-    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.eq(SysUser::getTenantId, tenantId)
-                .eq(SysUser::getDeptId, deptId);
         return sysUserMapper.selectList(userNameQuery);
     }
 
-    //@DataScope//数据权限注解
+    /**
+     * @description: 工时统计-工具
+     * @author: fu
+     * @date: 2024/8/8 19:22
+     * @param: [startDate, endDate, projectName, projectAscription]
+     * @return: java.util.List<com.usky.iot.domain.PmWorkReport>
+     **/
     private List<PmWorkContent> workTimeCount(List<Long> users, List<Integer> project, String startDate, String endDate) {
+        List<PmWorkContent> pmWorkContentList = new ArrayList<>();
         Integer tenantId = SecurityUtils.getTenantId();
         Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
         LambdaQueryWrapper<PmWorkContent> workTimeQuery = Wrappers.lambdaQuery();
         workTimeQuery.select(PmWorkContent::getSubmitterId, PmWorkContent::getReportId, PmWorkContent::getProjectId, PmWorkContent::getProjectName,
-                PmWorkContent::getWorkTime, PmWorkContent::getDeptId, PmWorkContent::getTenantId);
+                        PmWorkContent::getWorkTime, PmWorkContent::getDeptId, PmWorkContent::getTenantId)
+                .eq(PmWorkContent::getTenantId, tenantId).eq(PmWorkContent::getDeptId, deptId);
         if (!users.isEmpty()) {
             workTimeQuery.in(PmWorkContent::getSubmitterId, users);
         }
@@ -704,11 +758,13 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             LocalDate start = LocalDate.parse(startDate);
             LocalDate end = LocalDate.parse(endDate);
             List<Integer> reports = reports(start, end);
-            workTimeQuery.in(PmWorkContent::getReportId, reports);
+            if (!reports.isEmpty()) {
+                workTimeQuery.in(PmWorkContent::getReportId, reports);
+            } else {
+                return pmWorkContentList;
+            }
         }
-        workTimeQuery.eq(PmWorkContent::getTenantId, tenantId).eq(PmWorkContent::getDeptId, deptId);
-        // workTimeQuery.apply(DataScopeContextHolder.getDataScopeSql());// 数据权限设置
-        List<PmWorkContent> pmWorkContentList = pmWorkContentMapper.selectList(workTimeQuery);
+        pmWorkContentList = pmWorkContentMapper.selectList(workTimeQuery);
 
         Map<String, PmWorkContent> workTimeMap = new HashMap<>();
         for (PmWorkContent content : pmWorkContentList) {
@@ -724,13 +780,46 @@ 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)) {
+
+        if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
             throw new BusinessException("请设置查询时间范围!");
         }
 
@@ -753,27 +842,29 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         // 统计userId每个项目所需工时
         List<WorkHoursStatisticsVO> userAndProject = new ArrayList<>();
         List<PmWorkContent> pmWorkContentList = workTimeCount(userIds, pmProjectId, startDate, endDate);
-        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);
+        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);
+                for (PmProject project : pmProjects) {
+                    Integer projectId2 = project.getId();
+                    String projectName = project.getProjectName();
+                    if (projectId2 == projectId1) {
+                        workHoursStatisticsVO.setProjectName(projectName);
+                    }
                 }
+                userAndProject.add(workHoursStatisticsVO);
             }
-            userAndProject.add(workHoursStatisticsVO);
         }
         List<WorkHoursStatisticsVO> userAndProjectD = userAndProject;
 
@@ -785,31 +876,81 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 projectWorkTimeVO.setProjectOrPerson(name);
                 List<BigDecimal> workTime = new ArrayList<>();
                 boolean hasNonZeroWorkTime = false;
-                for (String currentNickName : nickName) {
-                    boolean foundWorkTime = false;
-                    for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProject) {
-                        String userNickName = workHoursStatisticsVO.getNickName();
-                        String projectName = workHoursStatisticsVO.getProjectName();
-                        BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
-                        if (projectName == name && userNickName == currentNickName) {
-                            workTime.add(userProjectWorkTime);
-                            if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
-                                hasNonZeroWorkTime = true;
+                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;
                             }
-                            foundWorkTime = true;
-                            break;
                         }
-                    }
-                    if (!foundWorkTime) {
-                        workTime.add(BigDecimal.ZERO);
+                        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);
             // 重组返回数据结构
@@ -819,45 +960,342 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 userWorkTimeVO2.setProjectOrPerson(name);
                 List<BigDecimal> workTime = new ArrayList<>();
                 boolean hasNonZeroWorkTime = false;
-                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;
+                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;
                             }
-                            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;
+    }
+
+    //回退代码
+    @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);
                         }
                     }
-                    if (!foundWorkTime) {
+                }
+                // 过滤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;
     }
 
+    /**
+     * 工时-明细-导出
+     * @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);
+    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(userId, projectId, start, end, tenantId);
+        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();
     }
 
 }

+ 84 - 32
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -113,9 +113,9 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         // 固定返回七条数据,没有内容也要设置时间给前端渲染
         LambdaQueryWrapper<PmWorkReport> queryWrapperR = Wrappers.lambdaQuery();
         queryWrapperR.eq(PmWorkReport::getSubmitterId, SecurityUtils.getUserId())
-                .between(PmWorkReport::getReportDate, startDate1, endDate1)
-                .orderByAsc(PmWorkReport::getReportDate)
-                .apply(reportId != 0, "id = " + reportId);
+                .between(reportId == 0, PmWorkReport::getReportDate, startDate1, endDate1)
+                .eq(reportId != 0, PmWorkReport::getId, reportId)
+                .orderByAsc(PmWorkReport::getReportDate);
         List<PmWorkReport> reports = baseMapper.selectList(queryWrapperR);
         if (reports.isEmpty()) {
             List<PmWorkReport> reports1 = new ArrayList<>();
@@ -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();
@@ -216,25 +216,28 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         List<PmWorkContent> workContents = pmWorkReport.getWorkContents();
         if (workContents == null) {
             throw new BusinessException("报告内容不能为空,请检查!");
-        } else{
-           for (PmWorkContent workContent : workContents){
-               BigDecimal workTime = workContent.getWorkTime();
-               // 单个工时大于零
-               if (workTime == null){
-                   throw new BusinessException("工时不能为空,请检查!");
-               }
-               if (workTime.compareTo(BigDecimal.ZERO) <= 0){
-                   throw new BusinessException("工时必须大于零!");
-               }
-
-               String workContent1 = workContent.getWorkContent();
-               //工作内容不允许为空或空字符串
-               if (StringUtils.isBlank(workContent1)){
-                   throw new BusinessException("工作内容不能为空,请检查!");
-               }
-           }
+        } else {
+            for (PmWorkContent workContent : workContents) {
+                BigDecimal workTime = workContent.getWorkTime();
+                // 单个工时大于零
+                if (workTime == null) {
+                    throw new BusinessException("工时不能为空,请检查!");
+                } 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();
+                // 工作内容不允许为空或空字符串
+                if (StringUtils.isBlank(workContent1)) {
+                    throw new BusinessException("工作内容不能为空,请检查!");
+                }
+            }
         }
-            Set<Integer> projectIds2 = new HashSet<>();
+        Set<Integer> projectIds2 = new HashSet<>();
         for (PmWorkContent workContent : pmWorkReport.getWorkContents()) {
             if (!projectIds2.add(workContent.getProjectId())) {
                 throw new BusinessException("存在重复项目,请检查!");
@@ -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 + " 的工作报告存入报告消息表失败!");
+                }
             }
         }
     }
@@ -596,7 +609,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
     @Transactional
     @Override
     public void deleteContent(Integer reportId) {
-        if (reportId == null || reportId < 0){
+        if (reportId == null || reportId < 0) {
             throw new BusinessException("报告id不正确,删除报告失败!");
         }
 
@@ -622,5 +635,44 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         }
     }
 
+    /**
+     * @description: 查询定时报告
+     * @author: fu
+     * @date: 2024/8/7 20:17
+     * @param: []
+     * @return: java.util.List<com.usky.iot.domain.PmWorkReport>
+     **/
+    @Override
+    public List<PmWorkReport> timedReportQuery() {
+        Long userId = SecurityUtils.getUserId();
+        LambdaQueryWrapper<PmWorkReport> reports = Wrappers.lambdaQuery();
+        reports.eq(PmWorkReport::getSubmitterId, userId)
+                .eq(PmWorkReport::getReportStatus, 0)
+                .orderByAsc(PmWorkReport::getReportDate);
+        List<PmWorkReport> timedReports = pmWorkReportMapper.selectList(reports);
+
+        if (timedReports.isEmpty()) {
+            return timedReports;
+        }
+        List<Integer> reportIds = timedReports.stream().map(PmWorkReport::getId).collect(Collectors.toList());
+
+        LambdaQueryWrapper<PmWorkContent> reportContents = Wrappers.lambdaQuery();
+        reportContents.in(PmWorkContent::getReportId, reportIds);
+        List<PmWorkContent> pmWorkContentList = pmWorkContentMapper.selectList(reportContents);
+        for (PmWorkReport report : timedReports) {
+            Integer id = report.getId();
+            List<PmWorkContent> workContents = new ArrayList<>();
+            for (PmWorkContent content : pmWorkContentList) {
+                Integer reportId = content.getReportId();
+                if (reportId.equals(id)) {
+                    workContents.add(content);
+                }
+            }
+            report.setWorkContents(workContents);
+        }
+
+        return timedReports;
+    }
+
 
 }

+ 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>

+ 5 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingDeviceController.java

@@ -3,6 +3,8 @@ package com.usky.meeting.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.meeting.domain.MeetingDevice;
 import com.usky.meeting.service.MeetingDeviceService;
 import com.usky.meeting.service.vo.MeetingDeviceRequestVO;
@@ -43,6 +45,7 @@ public class MeetingDeviceController {
      * @param meetingDevice
      * @return
      */
+    @Log(title = "新增-会议设备", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult<Void> add(@RequestBody MeetingDevice meetingDevice){
         meetingDeviceService.add(meetingDevice);
@@ -54,6 +57,7 @@ public class MeetingDeviceController {
      * @param meetingDevice
      * @return
      */
+    @Log(title = "修改-会议设备", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult<Void> edit(@RequestBody MeetingDevice meetingDevice){
         meetingDeviceService.edit(meetingDevice);
@@ -65,6 +69,7 @@ public class MeetingDeviceController {
      * @param deviceId
      * @return
      */
+    @Log(title = "删除-会议设备", businessType = BusinessType.DELETE)
     @DeleteMapping
     public ApiResult<Void> remove(@RequestParam Long deviceId){
         meetingDeviceService.remove(deviceId);

+ 5 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingFloorController.java

@@ -3,6 +3,8 @@ package com.usky.meeting.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.meeting.domain.MeetingFloor;
 import com.usky.meeting.service.MeetingFloorService;
 import com.usky.meeting.service.vo.MeetingFloorRequestVO;
@@ -43,6 +45,7 @@ public class MeetingFloorController {
      * @param meetingFloor
      * @return
      */
+    @Log(title = "新增-会议楼层", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult<Void> add(@RequestBody MeetingFloor meetingFloor){
         meetingFloorService.add(meetingFloor);
@@ -54,6 +57,7 @@ public class MeetingFloorController {
      * @param meetingFloor
      * @return
      */
+    @Log(title = "修改-会议楼层", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult<Void> edit(@RequestBody MeetingFloor meetingFloor){
         meetingFloorService.edit(meetingFloor);
@@ -65,6 +69,7 @@ public class MeetingFloorController {
      * @param floorId
      * @return
      */
+    @Log(title = "删除-会议楼层", businessType = BusinessType.DELETE)
     @DeleteMapping
     public ApiResult<Void> remove(@RequestParam(value = "floorId") Long floorId){
         meetingFloorService.remove(floorId);

+ 5 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingRoomController.java

@@ -4,6 +4,8 @@ package com.usky.meeting.controller.web;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.security.utils.SecurityUtils;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.meeting.domain.MeetingRoom;
 import com.usky.meeting.repository.MeetingDeviceRepository;
 import com.usky.meeting.service.MeetingRoomService;
@@ -83,6 +85,7 @@ public class MeetingRoomController {
      * @param meetingRoom
      * @return
      */
+    @Log(title = "新增-会议室", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult<Void> add(@RequestBody MeetingRoom meetingRoom){
         meetingRoomService.add(meetingRoom);
@@ -94,6 +97,7 @@ public class MeetingRoomController {
      * @param meetingRoom
      * @return
      */
+    @Log(title = "修改-会议室", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult<Void> edit(@RequestBody MeetingRoom meetingRoom){
         meetingRoomService.edit(meetingRoom);
@@ -105,6 +109,7 @@ public class MeetingRoomController {
      * @param roomId
      * @return
      */
+    @Log(title = "删除-会议室", businessType = BusinessType.DELETE)
     @DeleteMapping
     public ApiResult<Void> remove(@RequestParam Long roomId){
         meetingRoomService.remove(roomId);

+ 48 - 48
service-website/service-website-api/src/main/java/com/usky/website/factory/RemoteUserFallbackFactory.java

@@ -1,48 +1,48 @@
-package com.usky.website.factory;
-
-import com.usky.common.core.bean.ApiResult;
-import com.usky.common.core.exception.BusinessException;
-import com.usky.website.RemoteUserService;
-import com.usky.website.domain.SysUserVO;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.springframework.cloud.openfeign.FallbackFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.List;
-
-
-/**
- * 用户服务降级处理
- *
- * @author ruoyi
- */
-@Component
-public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
-{
-    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
-
-    @Override
-    public RemoteUserService create(Throwable throwable)
-    {
-        log.error("用户服务调用失败:{}", throwable.getMessage());
-        return new RemoteUserService() {
-            @Override
-            public ApiResult<List<SysUserVO>> getByUserName(String userName) {
-                throw new BusinessException(throwable.getMessage());
-            }
-
-            @Override
-            public ApiResult<List<SysUserVO>> add(SysUserVO sysUserVO) {
-                throw new BusinessException(throwable.getMessage());
-            }
-
-            @Override
-            public ApiResult<String> upload(MultipartFile file) {
-                throw new BusinessException(throwable.getMessage());
-            }
-        };
-    }
-}
+//package com.usky.website.factory;
+//
+//import com.usky.common.core.bean.ApiResult;
+//import com.usky.common.core.exception.BusinessException;
+//import com.usky.website.RemoteUserService;
+//import com.usky.website.domain.SysUserVO;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//
+//import org.springframework.cloud.openfeign.FallbackFactory;
+//import org.springframework.stereotype.Component;
+//import org.springframework.web.multipart.MultipartFile;
+//
+//import java.util.List;
+//
+//
+///**
+// * 用户服务降级处理
+// *
+// * @author ruoyi
+// */
+//@Component
+//public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
+//{
+//    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+//
+//    @Override
+//    public RemoteUserService create(Throwable throwable)
+//    {
+//        log.error("用户服务调用失败:{}", throwable.getMessage());
+//        return new RemoteUserService() {
+//            @Override
+//            public ApiResult<List<SysUserVO>> getByUserName(String userName) {
+//                throw new BusinessException(throwable.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<SysUserVO>> add(SysUserVO sysUserVO) {
+//                throw new BusinessException(throwable.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<String> upload(MultipartFile file) {
+//                throw new BusinessException(throwable.getMessage());
+//            }
+//        };
+//    }
+//}

+ 5 - 0
service-website/service-website-biz/src/main/java/com/usky/website/controller/web/SiteArticleController.java

@@ -3,6 +3,8 @@ package com.usky.website.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.website.domain.SiteArticle;
 import com.usky.website.service.SiteArticleService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,6 +54,7 @@ public class SiteArticleController {
      * @param siteArticle
      * @return
      */
+    @Log(title = "新增-官网内容", businessType = BusinessType.INSERT)
     @CacheEvict(cacheNames = "siteArticle",allEntries = true)
     @PostMapping("addSiteArticle")
     public ApiResult<Void> addSiteArticle(@RequestBody SiteArticle siteArticle) {
@@ -65,6 +68,7 @@ public class SiteArticleController {
      * @param siteArticle
      * @return
      */
+    @Log(title = "修改-官网内容", businessType = BusinessType.UPDATE)
     @CacheEvict(cacheNames = "siteArticle",allEntries = true)
     @PutMapping("updateSiteArticle")
     public ApiResult<Void> updateSiteArticle(@RequestBody SiteArticle siteArticle) {
@@ -78,6 +82,7 @@ public class SiteArticleController {
      * @param id 主键ID
      * @return
      */
+    @Log(title = "删除-官网内容", businessType = BusinessType.DELETE)
     @CacheEvict(cacheNames = "siteArticle",allEntries = true)
     @DeleteMapping("delSiteArticle")
     public ApiResult<Void> delSiteArticle(@RequestParam(value = "id") Integer id) {

+ 5 - 0
service-website/service-website-biz/src/main/java/com/usky/website/controller/web/SiteCategoryController.java

@@ -2,6 +2,8 @@ package com.usky.website.controller.web;
 
 
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.website.domain.SiteCategory;
 import com.usky.website.service.SiteCategoryService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,6 +56,7 @@ public class SiteCategoryController {
      * @param siteCategory
      * @return
      */
+    @Log(title = "新增官网栏目", businessType = BusinessType.INSERT)
     @CacheEvict(cacheNames="siteCategory", allEntries=true)
     @PostMapping("addSiteCategory")
     public ApiResult<Void> addSiteCategory(@RequestBody SiteCategory siteCategory) {
@@ -67,6 +70,7 @@ public class SiteCategoryController {
      * @param siteCategory
      * @return
      */
+    @Log(title = "修改官网栏目", businessType = BusinessType.UPDATE)
     @CacheEvict(cacheNames="siteCategory", allEntries=true)
     @PutMapping("updateSiteCategory")
     public ApiResult<Void> updateSiteCategory(@RequestBody SiteCategory siteCategory) {
@@ -80,6 +84,7 @@ public class SiteCategoryController {
      * @param id 主键ID
      * @return
      */
+    @Log(title = "删除官网栏目", businessType = BusinessType.DELETE)
     @CacheEvict(cacheNames="siteCategory", allEntries=true)
     @DeleteMapping("delSiteCategory")
     public ApiResult<Void> delSiteCategory(@RequestParam(value = "id") Integer id) {

+ 5 - 0
service-website/service-website-biz/src/main/java/com/usky/website/controller/web/SiteReviewController.java

@@ -4,6 +4,8 @@ package com.usky.website.controller.web;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.utils.poi.ExcelUtil;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.website.domain.SiteReview;
 import com.usky.website.service.SiteReviewService;
 import com.usky.website.service.vo.SiteReviewExportVO;
@@ -38,6 +40,7 @@ public class SiteReviewController {
      * @param siteReview
      * @return
      */
+    @Log(title = "新增-客户信息渠道", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult<Void> add(@RequestBody SiteReview siteReview){
         siteReviewService.add(siteReview);
@@ -61,12 +64,14 @@ public class SiteReviewController {
      * @param siteReview
      * @return
      */
+    @Log(title = "修改-客户信息反馈表", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult<Void> edit(@RequestBody SiteReview siteReview){
         siteReviewService.edit(siteReview);
         return ApiResult.success();
     }
 
+    @Log(title = "导出-客户信息反馈表", businessType = BusinessType.EXPORT)
     @PostMapping("export")
     public void export(@RequestBody SiteReviewRequestVO requestVO, HttpServletResponse response) throws IOException{
         List<SiteReviewExportVO> list = siteReviewService.recordListExport(requestVO);

+ 48 - 48
usky-module-demo/usky-module-demo-api/src/main/java/com/usky/demo/factory/RemoteUserFallbackFactory.java

@@ -1,48 +1,48 @@
-package com.usky.demo.factory;
-
-import com.usky.common.core.bean.ApiResult;
-import com.usky.common.core.exception.BusinessException;
-import com.usky.demo.RemoteUserService;
-import com.usky.demo.domain.SysUserVO;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.springframework.cloud.openfeign.FallbackFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.List;
-
-
-/**
- * 用户服务降级处理
- *
- * @author ruoyi
- */
-@Component
-public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
-{
-    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
-
-    @Override
-    public RemoteUserService create(Throwable throwable)
-    {
-        log.error("用户服务调用失败:{}", throwable.getMessage());
-        return new RemoteUserService() {
-            @Override
-            public ApiResult<List<SysUserVO>> getByUserName(String userName) {
-                throw new BusinessException(throwable.getMessage());
-            }
-
-            @Override
-            public ApiResult<List<SysUserVO>> add(SysUserVO sysUserVO) {
-                throw new BusinessException(throwable.getMessage());
-            }
-
-            @Override
-            public ApiResult<String> upload(MultipartFile file) {
-                throw new BusinessException(throwable.getMessage());
-            }
-        };
-    }
-}
+//package com.usky.demo.factory;
+//
+//import com.usky.common.core.bean.ApiResult;
+//import com.usky.common.core.exception.BusinessException;
+//import com.usky.demo.RemoteUserService;
+//import com.usky.demo.domain.SysUserVO;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//
+//import org.springframework.cloud.openfeign.FallbackFactory;
+//import org.springframework.stereotype.Component;
+//import org.springframework.web.multipart.MultipartFile;
+//
+//import java.util.List;
+//
+//
+///**
+// * 用户服务降级处理
+// *
+// * @author ruoyi
+// */
+//@Component
+//public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
+//{
+//    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+//
+//    @Override
+//    public RemoteUserService create(Throwable throwable)
+//    {
+//        log.error("用户服务调用失败:{}", throwable.getMessage());
+//        return new RemoteUserService() {
+//            @Override
+//            public ApiResult<List<SysUserVO>> getByUserName(String userName) {
+//                throw new BusinessException(throwable.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<List<SysUserVO>> add(SysUserVO sysUserVO) {
+//                throw new BusinessException(throwable.getMessage());
+//            }
+//
+//            @Override
+//            public ApiResult<String> upload(MultipartFile file) {
+//                throw new BusinessException(throwable.getMessage());
+//            }
+//        };
+//    }
+//}