فهرست منبع

Merge branch 'server-165' of uskycloud/usky-modules into master

gez 9 ماه پیش
والد
کامیت
b10985d7cf
26فایلهای تغییر یافته به همراه691 افزوده شده و 72 حذف شده
  1. 0 1
      service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/controller/web/BaseAlarmNoticeResultController.java
  2. 0 1
      service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/job/alarmLinkageJob.java
  3. 0 2
      service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/mqtt/alarm/Alarm.java
  4. 1 1
      service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/AlarmDetectorController.java
  5. 10 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/domain/PatrolInspectionPersonnel.java
  6. 19 4
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionAttendanceServiceImpl.java
  7. 1 1
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionEventServiceImpl.java
  8. 2 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionPersonnelServiceImpl.java
  9. 10 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/vo/PatrolInspectionPersonnelVo.java
  10. 2 0
      service-fire/service-fire-biz/src/main/resources/mapper/fire/PatrolInspectionPersonnelMapper.xml
  11. 7 0
      service-iot/service-iot-biz/pom.xml
  12. 19 2
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java
  13. 32 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java
  14. 5 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java
  15. 22 4
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/PmWorkContentMapper.java
  16. 15 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/SysUserMapper.java
  17. 66 41
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmProjectService.java
  18. 27 7
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java
  19. 96 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java
  20. 209 6
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java
  21. 23 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java
  22. 18 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/ProjectWorkTimeVO.java
  23. 18 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/UserWorkTimeVO.java
  24. 31 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/WorkHoursStatisticsVO.java
  25. 27 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/PmWorkContentMapper.xml
  26. 31 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/SysUserMapper.xml

+ 0 - 1
service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/controller/web/BaseAlarmNoticeResultController.java

@@ -38,7 +38,6 @@ public class BaseAlarmNoticeResultController {
      * @param size     每页条数
      * @return
      */
-    @Log(title = "关联设备查看分页", businessType = BusinessType.OTHER)
     @GetMapping("/resultInfo")
     public ApiResult<CommonPage<BaseAlarmNoticeResult>> resultInfo(@RequestParam(value = "receiver", required = false) String receiver,
                                                                    @RequestParam(value = "alarmId") Integer alarmId,

+ 0 - 1
service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/job/alarmLinkageJob.java

@@ -15,7 +15,6 @@ public class alarmLinkageJob {
     @Async("asyncServiceExecutor")
     public JSONObject addLinkage(String requestBody) {
         JSONObject eventVO = JSONObject.parseObject(requestBody);
-        System.out.println("hanceshi====="+eventVO.get("linkageAddress"));
         String resultString = HttpClientUtils.doPostJson(eventVO.get("linkageAddress").toString(),eventVO.toJSONString());
         JSONObject resultVO = JSONObject.parseObject(resultString);
         return resultVO;

+ 0 - 2
service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/mqtt/alarm/Alarm.java

@@ -92,8 +92,6 @@ public class Alarm implements MqttStrategy {
                     jsonObject.addProperty("deviceId",list6.get(0).getDeviceId());
                     jsonObject.addProperty("deviceType","JH");
                     jsonObject.addProperty("linkageAddress",list5.get(0).getLinkageAddress());
-                    System.out.println("hanceshi+++++"+list5.get(0).getLinkageAddress());
-                    System.out.println("hanceshi-----"+jsonObject.get("linkageAddress"));
                     JSONObject resultVo = AlarmLinkageJob.addLinkage(jsonObject.toString());
                 }
             }

+ 1 - 1
service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/AlarmDetectorController.java

@@ -47,7 +47,7 @@ public class AlarmDetectorController {
     /**
      * 物联网数据查询-右上侧统计图
      *
-     * @param field      字段名称
+     * @param field     字段名称
      * @param deviceCode 单位编号
      * @return
      */

+ 10 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/domain/PatrolInspectionPersonnel.java

@@ -140,4 +140,14 @@ public class PatrolInspectionPersonnel implements Serializable {
      * 服务内容
      */
     private String serviceContent;
+
+    /**
+     * 所属派遣公司
+     */
+    private String dispatchCompany;
+
+    /**
+     * 所属保安从业公司
+     */
+    private String securityCompany;
 }

+ 19 - 4
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionAttendanceServiceImpl.java

@@ -3,6 +3,7 @@ package com.usky.fire.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.usky.agbox.RemotePatrolAgBoxService;
@@ -28,10 +29,7 @@ import com.usky.system.RemoteDeptService;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 /**
@@ -94,6 +92,14 @@ public class PatrolInspectionAttendanceServiceImpl extends AbstractCrudService<P
 
         List<Map<String, Object>> resultList = new ArrayList<>();
 
+        List<Long> userIdList = new ArrayList<>();
+
+        for (PatrolInspectionAttendance attendance : attendancePage.getRecords()) {
+            userIdList.add(attendance.getOperatorId());
+        }
+        LambdaQueryWrapper<PatrolInspectionPersonnel> queryWrapper1 = Wrappers.lambdaQuery();
+        queryWrapper1.in(PatrolInspectionPersonnel::getUserId,userIdList);
+        List<PatrolInspectionPersonnel> personnelList = patrolInspectionPersonnelService.list(queryWrapper1);
         for (PatrolInspectionAttendance attendance : attendancePage.getRecords()) {
             Map<String, Object> map = new HashMap<>();
             map.put("id", attendance.getId());
@@ -112,6 +118,15 @@ public class PatrolInspectionAttendanceServiceImpl extends AbstractCrudService<P
             map.put("latitude", attendance.getLatitude());
             map.put("remarks", attendance.getRemarks());
             map.put("identificationNumber", attendance.getIdentificationNumber());
+            Integer attendanceIn = attendance.getOperatorId().intValue();
+            if (CollectionUtils.isNotEmpty(personnelList)){
+                for (PatrolInspectionPersonnel personnel : personnelList) {
+                    if (attendanceIn.equals(personnel.getUserId())){
+                        map.put("dispatchCompany", personnel.getDispatchCompany());
+                        map.put("securityCompany", personnel.getSecurityCompany());
+                    }
+                }
+            }
             resultList.add(map);
         }
         IPage<Map<String, Object>> resultPage = new Page<>();

+ 1 - 1
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionEventServiceImpl.java

@@ -136,7 +136,7 @@ public class PatrolInspectionEventServiceImpl extends AbstractCrudService<Patrol
         jsonObject.addProperty("infoType",2);
         jsonObject.addProperty("id",patrolInspectionEvent.getId());
         remoteMceService.addMce(jsonObject.toString());
-        String url = "http://sgdzpic.3322.org:5901";
+        String url = "http://192.168.10.118:5901";
         String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>  \n" +
                 "<Agent ID=\"SSJCZHQY0001\" Type=\"18\" Ver=\"1.2.0.0\">\n" +
                 "<DVRHeart State=\"1\" TotalSpace=\"XXXXX\" FreeSpace=\"XXXXXX\">\n" +

+ 2 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionPersonnelServiceImpl.java

@@ -158,6 +158,8 @@ public class PatrolInspectionPersonnelServiceImpl extends AbstractCrudService<Pa
                 patrolInspectionPersonnelVo.setPhoneNumber(list.get(i).getPhoneNumber());
                 patrolInspectionPersonnelVo.setMainPosition(list.get(i).getMainPosition());
                 patrolInspectionPersonnelVo.setServiceContent(list.get(i).getServiceContent());
+                patrolInspectionPersonnelVo.setDispatchCompany(list.get(i).getDispatchCompany());
+                patrolInspectionPersonnelVo.setSecurityCompany(list.get(i).getSecurityCompany());
                 for (int j = 0; j < userList.size(); j++) {
                     if (list.get(i).getUserId().longValue() == userList.get(j).getUserId()) {
                         patrolInspectionPersonnelVo.setName(userList.get(j).getNickName());

+ 10 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/vo/PatrolInspectionPersonnelVo.java

@@ -141,4 +141,14 @@ public class PatrolInspectionPersonnelVo implements Serializable {
      */
     private String serviceContent;
 
+    /**
+     * 所属派遣公司
+     */
+    private String dispatchCompany;
+
+    /**
+     * 所属保安从业公司
+     */
+    private String securityCompany;
+
 }

+ 2 - 0
service-fire/service-fire-biz/src/main/resources/mapper/fire/PatrolInspectionPersonnelMapper.xml

@@ -27,6 +27,8 @@
         <result column="phone_number" property="phoneNumber" />
         <result column="main_position" property="mainPosition" />
         <result column="service_content" property="serviceContent" />
+        <result column="dispatch_company" property="dispatchCompany" />
+        <result column="security_company" property="securityCompany" />
     </resultMap>
 
 </mapper>

+ 7 - 0
service-iot/service-iot-biz/pom.xml

@@ -66,6 +66,13 @@
             <version>0.0.1</version>
             <scope>compile</scope>
         </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-system-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
         <dependency>
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-mp</artifactId>

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

@@ -6,9 +6,12 @@ import com.usky.common.core.bean.CommonPage;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.domain.PmProject;
 import com.usky.iot.service.PmProjectService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
 import java.util.List;
 import java.util.Map;
 
@@ -38,6 +41,7 @@ public class PmProjectController {
 
     /**
      * 分页
+     *
      * @param projectName
      * @param projectType
      * @param projectStatus
@@ -58,6 +62,7 @@ public class PmProjectController {
 
     /**
      * 统计
+     *
      * @return
      */
     @GetMapping("/counting")
@@ -67,22 +72,34 @@ public class PmProjectController {
 
     /**
      * 新增、编辑项目
+     *
      * @param pmProject
      */
     @PostMapping("/add")
-    public void add(@RequestBody PmProject pmProject){
+    public void add(@RequestBody PmProject pmProject) {
         pmProjectService.addProject(pmProject);
     }
 
     /**
      * 删除
+     *
      * @param projectId 项目id
      */
     @GetMapping("/del")
-    public void del(@RequestParam Integer projectId){
+    public void del(@RequestParam Integer projectId) {
         pmProjectService.delProject(projectId);
     }
 
+    /**
+     * 人员、项目下拉
+     *
+     * @param identifying
+     * @return
+     */
+    @GetMapping("/userOrProject")
+    public ApiResult<List<Map<String, Object>>> userOrProject(@RequestParam(value = "identifying", required = false) Integer identifying) {
+        return ApiResult.success(pmProjectService.userOrProject(identifying));
+    }
 
 }
 

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

@@ -3,12 +3,14 @@ package com.usky.iot.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.iot.domain.PmWorkContent;
+import com.usky.iot.domain.PmWorkReport;
 import com.usky.iot.service.PmWorkContentService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
 import java.util.List;
 
 /**
@@ -29,13 +31,42 @@ 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 = "reportId", required = false) Integer reportId,
                                                    @RequestParam(value = "projectAscription", required = false, defaultValue = "1") Integer projectAscription) {
         if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
             startDate = LocalDate.now().toString();
             endDate = LocalDate.now().toString();
         }
-        return ApiResult.success(pmWorkContentService.projectQuery(startDate, endDate, projectName, projectAscription));
+        return ApiResult.success(pmWorkContentService.projectQuery(startDate, endDate, projectName, projectAscription, reportId));
     }
 
+
+
+    @GetMapping("/reportRecord")
+    public ApiResult<List<PmWorkReport>> reportRecord(@RequestParam(value = "startDate", required = false) String startDate,
+                                                      @RequestParam(value = "endDate", required = false) String endDate,
+                                                      @RequestParam(value = "projectName", required = false) String projectName,
+                                                      @RequestParam(value = "reportId", required = false) Integer reportId,
+                                                      @RequestParam(value = "projectAscription", required = false, defaultValue = "1") Integer projectAscription) {
+        if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
+            startDate = LocalDate.now().toString();
+            endDate = LocalDate.now().toString();
+        }
+        return ApiResult.success(pmWorkContentService.workReportQuery(startDate, endDate, projectName, projectAscription, reportId));
+    }
+
+    @GetMapping("/workHourStatistic")
+    public ApiResult<List<Object>> workHourStatistic(@RequestParam(value = "userId", required = false) Long userId,
+                                                     @RequestParam(value = "projectId", required = false) Integer projectId,
+                                                     @RequestParam(value = "filter", required = false, defaultValue = "1") Integer filter,
+                                                     @RequestParam(value = "startDate", required = false) String startDate,
+                                                     @RequestParam(value = "endDate", required = false) String endDate,
+                                                     @RequestParam(value = "workerOrProject", required = false, defaultValue = "1") Integer workerOrProject) {
+        if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
+            startDate = LocalDate.now().with(TemporalAdjusters.firstDayOfYear()).toString();
+            endDate = LocalDate.now().with(TemporalAdjusters.lastDayOfYear()).toString();
+        }
+        return ApiResult.success(pmWorkContentService.workHourStatistic(userId, projectId, filter, startDate, endDate, workerOrProject));
+    }
 }
 

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

@@ -2,7 +2,9 @@ package com.usky.iot.controller.web;
 
 
 import com.usky.common.core.bean.ApiResult;
+import com.usky.iot.domain.PmProject;
 import com.usky.iot.domain.PmWorkReport;
+import com.usky.iot.service.PmProjectService;
 import com.usky.iot.service.PmWorkReportService;
 import com.usky.iot.service.vo.PmProjectWorkTimeVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +30,9 @@ public class PmWorkReportController {
     @Autowired
     private PmWorkReportService pmWorkReportService;
 
+    @Autowired
+    private PmProjectService pmProjectService;
+
     /**
      * 周工作报告查询
      *

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

@@ -1,9 +1,10 @@
 package com.usky.iot.mapper;
 
+import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.common.mybatis.core.CrudMapper;
-import com.usky.iot.service.vo.PmProjectTotalWorkTimeVo;
 import com.usky.iot.service.vo.PmProjectWorkTimeVo;
+import com.usky.iot.service.vo.WorkHoursStatisticsVO;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
@@ -26,7 +27,24 @@ public interface PmWorkContentMapper extends CrudMapper<PmWorkContent> {
                                             @Param("endTime") LocalDateTime endTime,
                                             @Param("userId") Long userId);
 
-/*    List<PmProjectTotalWorkTimeVo> timeCount(@Param("startTime") LocalDateTime startTime,
-                                             @Param("endTime") LocalDateTime endTime,
-                                             @Param("userId") Long userId);*/
+    List<WorkHoursStatisticsVO> workHoursStatistics(@Param("startTime") LocalDate startTime,
+                                                    @Param("endTime") LocalDate endTime,
+                                                    @Param("userId") Long userId,
+                                                    @Param("tenantId") Integer tenantId);
+
+    /**
+     * 人员查询时增加部门隔离,项目维度不需要
+     *
+     * @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);
+
 }

+ 15 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/SysUserMapper.java

@@ -0,0 +1,15 @@
+package com.usky.iot.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.system.domain.SysUser;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-06-24 15:47
+ */
+@Repository
+public interface SysUserMapper extends CrudMapper<SysUser> {
+
+}

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

@@ -17,45 +17,70 @@ import java.util.Map;
  */
 public interface PmProjectService extends CrudService<PmProject> {
 
-     /**
-      * 新增、编辑项目
-      * @param project
-      */
-     void addProject(PmProject project);
-
-     /**
-      * 删除
-      * @param projectId 项目id
-      */
-     void delProject(Integer projectId);
-
-
-     List<PmProject> queryProject();
-
-     /**
-      * 分页
-      *
-      * @param projectName       项目名
-      * @param projectType       类型
-      * @param projectStatus     状态
-      * @param projectAscription 项目归属类型
-      * @param pageNum           页码
-      * @param pageSize          页大小
-      * @return
-      */
-     CommonPage<PmProject> projectList(String projectName, Integer projectType, Integer projectStatus, Integer projectAscription, Integer pageNum, Integer pageSize);
-
-     /**
-      * 查询项目名
-      *
-      * @param projectIds
-      * @return
-      */
-     List<PmProject> projectName(List<Integer> projectIds);
-
-     /**
-      * 所有、我负责、我参与项目数量统计
-      * @return
-      */
-     Map<String, Integer> sum();
+    /**
+     * 新增、编辑项目
+     *
+     * @param project
+     */
+    void addProject(PmProject project);
+
+    /**
+     * 删除
+     *
+     * @param projectId 项目id
+     */
+    void delProject(Integer projectId);
+
+
+    List<PmProject> queryProject();
+
+    /**
+     * 分页
+     *
+     * @param projectName       项目名
+     * @param projectType       类型
+     * @param projectStatus     状态
+     * @param projectAscription 项目归属类型
+     * @param pageNum           页码
+     * @param pageSize          页大小
+     * @return
+     */
+    CommonPage<PmProject> projectList(String projectName, Integer projectType, Integer projectStatus, Integer projectAscription, Integer pageNum, Integer pageSize);
+
+    /**
+     * 查询项目名
+     *
+     * @param projectIds
+     * @return
+     */
+    List<PmProject> projectName(List<Integer> projectIds);
+
+    /**
+     * 所有、我负责、我参与项目数量统计
+     *
+     * @return
+     */
+    Map<String, Integer> sum();
+
+    /**
+     * 人员查询(项目负责人、成员)
+     *
+     * @return
+     */
+    List<Map<String, Object>> projectUsers(Long userId);
+
+    /**
+     * 所有项目id和名称
+     *
+     * @return
+     */
+    List<Map<String, Object>> projectIdName(Integer projectId);
+
+    /**
+     * 人员或项目下拉
+     *
+     * @param identifying 标识:1,返回人员userId和nickName;2:返回ProjectId和ProjectName
+     * @return
+     */
+    List<Map<String, Object>> userOrProject(Integer identifying);
 }

+ 27 - 7
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java

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

+ 96 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java

@@ -11,14 +11,16 @@ import com.usky.iot.domain.PmProject;
 import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.mapper.PmProjectMapper;
 import com.usky.iot.mapper.PmWorkContentMapper;
+import com.usky.iot.mapper.SysUserMapper;
 import com.usky.iot.service.PmProjectService;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.system.domain.SysUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -34,6 +36,12 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
     @Autowired
     private PmWorkContentMapper pmWorkContentMapper;
 
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    @Autowired
+    private PmProjectMapper pmProjectMapper;
+
     @Override
     public void addProject(PmProject project) {
         if (Objects.isNull(project.getProjectWorkload())) {
@@ -199,4 +207,91 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         return sumMap;
     }
 
+
+    /**
+     * 查询所有项目负责人、成员和userid(此处逻辑为查询所有项目中的负责人、团队成员然后进行去重)
+     *
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> projectUsers(Long userId) {
+        List<Map<String, Object>> returnList = new ArrayList<>();
+        List<SysUser> userList = new ArrayList<>();
+        if (userId != null) {
+            LambdaQueryWrapper<SysUser> queryNameId = Wrappers.lambdaQuery();
+            queryNameId.select(SysUser::getUserId,SysUser::getNickName)
+                    .eq(SysUser::getUserId, userId);
+            userList = sysUserMapper.selectList(queryNameId);
+        }else{
+            LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
+            wrapper.select(PmProject::getProjectHead, PmProject::getProjectMember)
+                    .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
+                    .eq(PmProject::getDelFlag, 0);
+            List<PmProject> users = pmProjectMapper.selectList(wrapper);
+            List<Long> userIds = new ArrayList<>();
+            for (PmProject user : users) {
+                Long projectHead = user.getProjectHead();
+                userIds.add(projectHead);
+                Set<Long> projectMembers = Arrays.stream(user.getProjectMember().split(","))
+                        .map(Long::parseLong)
+                        .collect(Collectors.toSet());
+                userIds.addAll(projectMembers);
+            }
+            List<Long> finalList = userIds.stream().distinct().collect(Collectors.toList());
+            LambdaQueryWrapper<SysUser> wrapper2 = Wrappers.lambdaQuery();
+            wrapper2.select(SysUser::getUserId, SysUser::getNickName)
+                    .in(SysUser::getUserId, finalList);
+            userList = sysUserMapper.selectList(wrapper2);
+        }
+        for (SysUser user : userList) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", user.getUserId());
+            map.put("name", user.getNickName());
+            returnList.add(map);
+        }
+        return returnList;
+    }
+
+    /**
+     * 查询所有项目和id
+     *
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> projectIdName(Integer projectId) {
+        List<Map<String, Object>> returnList = new ArrayList<>();
+        LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
+        wrapper.select(PmProject::getId, PmProject::getProjectName)
+                .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
+                .eq(PmProject::getDelFlag, 0);
+        if (projectId != null) {
+            wrapper.eq(PmProject::getId, projectId);
+        }
+        List<PmProject> projects = pmProjectMapper.selectList(wrapper);
+        for (PmProject project : projects) {
+            Map<String, Object> returnMap = new HashMap<>();
+            returnMap.put("id", project.getId());
+            returnMap.put("name", project.getProjectName());
+            returnList.add(returnMap);
+        }
+        return returnList;
+    }
+
+    /**
+     * @param identifying 标识:1,返回人员userId和nickName;2:返回ProjectId和ProjectName
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> userOrProject(Integer identifying) {
+        Integer projectId = null;
+        Long userId = null;
+        List<Map<String, Object>> returnList = new ArrayList<>();
+        if (identifying == 1) {
+            returnList = projectUsers(userId);
+        } else if (identifying == 2) {
+            returnList = projectIdName(projectId);
+        }
+        return returnList;
+    }
+
 }

+ 209 - 6
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -1,18 +1,31 @@
 package com.usky.iot.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.common.security.utils.SecurityUtils;
+import com.usky.iot.domain.PmProject;
 import com.usky.iot.domain.PmWorkContent;
+import com.usky.iot.domain.PmWorkReport;
+import com.usky.iot.mapper.PmProjectMapper;
 import com.usky.iot.mapper.PmWorkContentMapper;
+import com.usky.iot.mapper.PmWorkReportMapper;
+import com.usky.iot.mapper.SysUserMapper;
+import com.usky.iot.service.PmProjectService;
 import com.usky.iot.service.PmWorkContentService;
 import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.iot.service.vo.ProjectWorkTimeVO;
+import com.usky.iot.service.vo.UserWorkTimeVO;
+import com.usky.iot.service.vo.WorkHoursStatisticsVO;
+import com.usky.system.domain.SysUser;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -25,6 +38,18 @@ import java.util.List;
 @Service
 public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentMapper, PmWorkContent> implements PmWorkContentService {
 
+    @Autowired
+    private PmWorkReportMapper pmWorkReportMapper;
+
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    @Autowired
+    private PmProjectMapper pmProjectMapper;
+
+    @Autowired
+    private PmProjectService pmProjectService;
+
     @Override
     public void deleteContent(Integer reportId) {
         LambdaQueryWrapper<PmWorkContent> deleteWrapper = Wrappers.lambdaQuery();
@@ -33,12 +58,20 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     }
 
     @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, Integer reportId) {
+        if (reportId != null && reportId != 0) {
+            LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
+            contentLambdaQuery.select(PmWorkContent::getProjectId, PmWorkContent::getProjectName)
+                    .eq(PmWorkContent::getReportId, reportId)
+                    .groupBy(PmWorkContent::getProjectId, PmWorkContent::getProjectName);
+            List<PmWorkContent> pmWorkContentList = this.list(contentLambdaQuery);
+            return pmWorkContentList;
+        }
         LocalDate start = LocalDate.parse(startDate);
         LocalDate end = LocalDate.parse(endDate);
-        String subQueryReports = "SELECT id FROM pm_work_report WHERE report_date BETWEEN '" + start + "' AND '" + end + "'";
-        String subQueryReport = "SELECT id FROM pm_work_report WHERE FIND_IN_SET('" + SecurityUtils.getUserId() + "', cc_to) > 0";
-        String subQueryProjects = "SELECT id FROM pm_project WHERE project_head = " + SecurityUtils.getUserId();
+        String subQueryReports = "SELECT id FROM pm_work_report WHERE report_date BETWEEN '" + start + "' AND '" + end + "' AND tenant_id = " + SecurityUtils.getTenantId();
+        String subQueryReport = "SELECT id FROM pm_work_report WHERE FIND_IN_SET('" + SecurityUtils.getUserId() + "', cc_to) > 0 AND tenant_id = " + SecurityUtils.getTenantId();
+        String subQueryProjects = "SELECT id FROM pm_project WHERE project_head = '" + SecurityUtils.getUserId() + "' AND tenant_id = " + SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
         contentLambdaQuery.select(PmWorkContent::getProjectId, PmWorkContent::getProjectName)
                 .inSql(PmWorkContent::getReportId, subQueryReports);
@@ -54,4 +87,174 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         List<PmWorkContent> pmWorkContentList = this.list(contentLambdaQuery);
         return pmWorkContentList;
     }
+
+    @Override
+    public List<PmWorkReport> workReportQuery(String startDate, String endDate, String projectName, Integer projectAscription, Integer reportId) {
+        List<PmWorkReport> reportList = new ArrayList<>();
+        List<PmWorkContent> pmWorkContentList = new ArrayList<>();
+        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);
+            PmWorkReport report = pmWorkReportMapper.selectOne(reportQuery);
+            LambdaQueryWrapper<PmWorkContent> contentQuery = Wrappers.lambdaQuery();
+            contentQuery.select(PmWorkContent::getWorkContent, PmWorkContent::getWorkTime, PmWorkContent::getProjectName)
+                    .eq(PmWorkContent::getReportId, reportId);
+            pmWorkContentList = this.list(contentQuery);
+            report.setWorkContents(pmWorkContentList);
+            reportList.add(report);
+        }else{
+            LocalDate start = LocalDate.parse(startDate);
+            LocalDate end = LocalDate.parse(endDate);
+            String subQueryReports = "SELECT id FROM pm_work_report WHERE report_date BETWEEN '" + start + "' AND '" + end + "' AND tenant_id = " + SecurityUtils.getTenantId();
+            String subQueryReport = "SELECT id FROM pm_work_report WHERE FIND_IN_SET('" + SecurityUtils.getUserId() + "', cc_to) > 0 AND tenant_id = " + SecurityUtils.getTenantId();
+            String subQueryProjects = "SELECT id FROM pm_project WHERE project_head = '" + SecurityUtils.getUserId() + "' AND tenant_id = " + SecurityUtils.getTenantId();
+            String reportIdList = "SELECT report_id FROM pm_work_content WHERE project_name = '" + projectName + "' AND tenant_id = " + SecurityUtils.getTenantId();
+            LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
+            contentLambdaQuery.select(PmWorkContent::getReportId, PmWorkContent::getWorkContent, PmWorkContent::getWorkTime, PmWorkContent::getProjectName)
+                    .inSql(PmWorkContent::getReportId, subQueryReports);
+            if (projectAscription == 1) {
+                contentLambdaQuery.inSql(PmWorkContent::getProjectId, subQueryProjects);
+            } else if (projectAscription == 2) {
+                contentLambdaQuery.inSql(PmWorkContent::getReportId, subQueryReport);
+            }
+            if (StringUtils.isNotBlank(projectName)) {
+                contentLambdaQuery.inSql(PmWorkContent::getReportId, reportIdList);
+            }
+            pmWorkContentList = this.list(contentLambdaQuery);
+            if (pmWorkContentList == null || pmWorkContentList.size() == 0) {
+                return reportList;
+            }
+            List<Integer> reportIds = new ArrayList<>();
+            for (PmWorkContent a : pmWorkContentList) {
+                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);
+            reportList = pmWorkReportMapper.selectList(reportQuery);
+        }
+        List<Long> userIds = new ArrayList<>();
+        for (PmWorkReport c : reportList) {
+            List<PmWorkContent> contents = new ArrayList<>();
+            for (PmWorkContent b : pmWorkContentList) {
+                if (b.getReportId() == c.getId()) {
+                    contents.add(b);
+                }
+            }
+            c.setWorkContents(contents);
+            userIds.add(c.getSubmitterId());
+        }
+        LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
+        usersQuery.select(SysUser::getUserId, SysUser::getNickName)
+                .in(SysUser::getUserId, userIds);
+        List<SysUser> nickNames = sysUserMapper.selectList(usersQuery);
+        for (PmWorkReport d : reportList) {
+            for (SysUser e : nickNames) {
+                if (e.getUserId().equals(d.getSubmitterId())) {
+                    d.setCreateBy(e.getNickName());
+                }
+            }
+        }
+        return reportList;
+    }
+
+    @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<>();
+        Integer tenantId = SecurityUtils.getTenantId();
+        List<Object> returnList = new ArrayList<>();
+        LocalDate start = LocalDate.parse(startDate);
+        LocalDate end = LocalDate.parse(endDate);
+        //找出租户下所有项目
+        List<Map<String, Object>> projectIdName = pmProjectService.projectIdName(projectId);
+        List<String> pmProjectName = projectIdName.stream()
+                .map(map -> (String) map.get("name"))
+                .collect(Collectors.toList());
+        //所有人员id和nickName
+        List<Map<String, Object>> users = pmProjectService.projectUsers(userId);
+        List<String> nickName = new ArrayList<>();
+        for (Map<String, Object> map : users) {
+            Object name = map.get("name");
+            nickName.add((String) name);
+        }
+        //统计userId每个项目所需工时
+        List<WorkHoursStatisticsVO> userAndProject = baseMapper.workHoursStatistics(start, end, userId, tenantId);
+        Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
+        List<WorkHoursStatisticsVO> userAndProjectD = baseMapper.statisticsDept(start, end, userId, tenantId, deptId);
+        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;
+                for (String currentNickName : nickName) {
+                    boolean foundWorkTime = false;
+                    for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProject) {
+                        String userNickName = workHoursStatisticsVO.getNickName();
+                        String projectName = workHoursStatisticsVO.getProjectName();
+                        BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
+                        if (projectName.equals(name) && userNickName.equals(currentNickName)) {
+                            workTime.add(userProjectWorkTime);
+                            if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                                hasNonZeroWorkTime = true;
+                            }
+                            foundWorkTime = true;
+                            break;
+                        }
+                    }
+                    if (!foundWorkTime) {
+                        workTime.add(BigDecimal.ZERO);
+                    }
+                }
+                if (filter != 2 || hasNonZeroWorkTime) {
+                    projectWorkTimeVO.setWorkTime(workTime);
+                    projectWorkTime.add(projectWorkTimeVO);
+                }
+            }
+            returnList.add(projectWorkTime);
+        } else {
+            returnList.add(pmProjectName);
+            //重组返回数据结构
+            for (String uName : nickName) {
+                String name = uName;
+                UserWorkTimeVO userWorkTimeVO2 = new UserWorkTimeVO();
+                userWorkTimeVO2.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.equals(name) && projectName.equals(currentNickName)) {
+                            workTime.add(userProjectWorkTime);
+                            if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                                hasNonZeroWorkTime = true;
+                            }
+                            foundWorkTime = true;
+                            break;
+                        }
+                    }
+                    if (!foundWorkTime) {
+                        workTime.add(BigDecimal.ZERO);
+                    }
+                }
+                if (filter != 2 || hasNonZeroWorkTime) {
+                    userWorkTimeVO2.setWorkTime(workTime);
+                    userWorkTimeVO.add(userWorkTimeVO2);
+                }
+            }
+            returnList.add(userWorkTimeVO);
+        }
+        return returnList;
+    }
+
 }

+ 23 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -1,7 +1,9 @@
 package com.usky.iot.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+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.domain.PmProject;
@@ -14,6 +16,7 @@ import com.usky.iot.service.PmWorkContentService;
 import com.usky.iot.service.PmWorkReportService;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.iot.service.vo.PmProjectWorkTimeVo;
+import com.usky.system.RemoteMceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -24,6 +27,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -49,6 +53,9 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
     @Autowired
     private PmWorkContentService pmWorkContentService;
 
+    @Autowired
+    private RemoteMceService remoteMceService;
+
     /**
      * 获取时间内工作报告
      *
@@ -224,6 +231,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             newReport.setTenantId(SecurityUtils.getTenantId());
             newReport.setTotalHours(totalWorkTime);
             pmWorkReportMapper.insert(newReport);
+            Integer id = newReport.getId();
             //获取报告中所有项目id
             List<Integer> projectIds = new ArrayList<>();
             for (PmWorkContent b1 : pmWorkReport.getWorkContents()) {
@@ -251,6 +259,21 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 newContent.setDeptId(SecurityUtils.getLoginUser().getSysUser().getDeptId());
                 newContent.setTenantId(SecurityUtils.getTenantId());
                 pmWorkContentMapper.insert(newContent);
+                //推送消息中心
+                String infoContent = SecurityUtils.getLoginUser().getSysUser().getNickName() + "的工作报告";
+                String[] strArr = newReport.getCcTo().split(",");
+                List<Long> ids = Arrays.stream(strArr)
+                        .map(Long::parseLong)
+                        .collect(Collectors.toList());
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("infoTitle", "工作报告");
+                jsonObject.put("infoContent", infoContent);
+                jsonObject.put("infoType", 5);
+                jsonObject.put("id", id);
+                jsonObject.put("userIds", ids);
+                String jsonStr = jsonObject.toString();
+                remoteMceService.addMce(jsonStr);
+                System.out.println("Serialized JSON: " + jsonStr);
             }
         } else {
             PmWorkReport rp = new PmWorkReport();

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

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

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

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

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

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

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

@@ -27,4 +27,31 @@
     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
+        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>
+
 </mapper>

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

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.iot.mapper.SysUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.system.domain.SysUser">
+        <id column="user_id" property="userId" />
+        <result column="dept_id" property="deptId" />
+        <result column="user_name" property="userName" />
+        <result column="nick_name" property="nickName" />
+        <result column="user_type" property="userType" />
+        <result column="email" property="email" />
+        <result column="phonenumber" property="phonenumber" />
+        <result column="sex" property="sex" />
+        <result column="full_name" property="fullName" />
+        <result column="avatar" property="avatar" />
+        <result column="password" property="password" />
+        <result column="status" property="status" />
+        <result column="del_flag" property="delFlag" />
+        <result column="login_ip" property="loginIp" />
+        <result column="login_date" property="loginDate" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="remark" property="remark" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="address" property="address" />
+    </resultMap>
+
+</mapper>