Răsfoiți Sursa

pms 瑞都日报汇总 按照队伍汇总

zhangcl 1 săptămână în urmă
părinte
comite
91e7b7d4f5

+ 45 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/IotRdDailyReportController.java

@@ -963,6 +963,51 @@ public class IotRdDailyReportController {
         return success(reportSummaries);
     }
 
+    @GetMapping("/reportTeamSummary")
+    @Operation(summary = "移动端 瑞都日报汇总 分别按照 队伍 井号 日期报 汇总")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:query')")
+    public CommonResult<List<IotRdDailyReportSummaryTeamRespVO>> reportTeamSummary(@Valid IotRdDailyReportPageReqVO pageReqVO) {
+        // 根据查询参数筛选出 符合条件 的记录id 再传入 分页查询
+        Set<Long> projectIds = new HashSet<>();
+        Set<Long> taskIds = new HashSet<>();
+        // 移动端搜索条件 标识 合同名称 任务井号 ... 移动端兼容:searchKey 不为空时 自动填充未填的 contractName / taskName
+        String searchKey = pageReqVO.getSearchKey();
+        if (StrUtil.isNotBlank(searchKey)) {
+            if (StrUtil.isBlank(pageReqVO.getContractName())) {
+                pageReqVO.setContractName(searchKey);
+            }
+            if (StrUtil.isBlank(pageReqVO.getTaskName())) {
+                pageReqVO.setTaskName(searchKey);
+            }
+        }
+
+        if (StrUtil.isNotBlank(pageReqVO.getContractName())) {
+            IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
+            reqVO.setContractName(pageReqVO.getContractName());
+            List<IotProjectInfoDO> projects = iotProjectInfoService.getIotProjectInfos(reqVO);
+            if (CollUtil.isNotEmpty(projects)) {
+                projects.forEach(project -> {
+                    projectIds.add(project.getId());
+                });
+                pageReqVO.setProjectIds(projectIds);
+            }
+        }
+        if (StrUtil.isNotBlank(pageReqVO.getTaskName())) {
+            IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
+            reqVO.setSearchKey(pageReqVO.getTaskName());
+            List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(reqVO);
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    taskIds.add(task.getId());
+                });
+                pageReqVO.setTaskIds(taskIds);
+            }
+        }
+        List<IotRdDailyReportSummaryTeamRespVO> reportSummaries = iotRdDailyReportService.reportTeamSummary(pageReqVO);
+        // 设置日报的关联信息 部门(施工队伍) 项目 任务 带班干部 日报填报人
+        return success(reportSummaries);
+    }
+
     @GetMapping("/statistics")
     @Operation(summary = "瑞都日报 统计")
     @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:query')")

+ 29 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportSummaryTeamRespVO.java

@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 瑞都日报 移动端汇总日报 队伍维度 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotRdDailyReportSummaryTeamRespVO {
+
+    @Schema(description = "队伍名称")
+    private String teamName;
+
+    @Schema(description = "队伍下包含的井数量")
+    private Integer wellCount;
+
+    @Schema(description = "队伍下包含的日报数量")
+    private Integer reportCount;
+
+    @Schema(description = "等级 队伍 井 日期 ")
+    private String level;
+
+    @Schema(description = "队伍下包含的井数量列表")
+    private List<IotRdDailyReportSummaryWellRespVO> wells;
+
+}

+ 35 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportSummaryWellRespVO.java

@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 瑞都日报 移动端汇总日报 井维度 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotRdDailyReportSummaryWellRespVO {
+
+    @Schema(description = "等级 队伍 井 日期")
+    private String level;
+
+    @Schema(description = "井id")
+    private Long taskId;
+
+    @Schema(description = "井名称 可能重名")
+    private String wellName;
+
+    @Schema(description = "井包含的日报数量")
+    private Integer reportCount;
+
+    @Schema(description = "井下包含的已填写日报数量")
+    private String filledCount;
+
+    @Schema(description = "井下包含未填写日报数量")
+    private String unfilledCount;
+
+    @Schema(description = "井下包含的每天的 日报 列表")
+    private List<IotRdDailyReportShortRespVO> reports;
+
+}

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportService.java

@@ -196,4 +196,12 @@ public interface IotRdDailyReportService {
      * @return 瑞都日报 按照年 月 日 列表
      */
     List<IotRdDailyReportSummaryYearRespVO> reportSummary(IotRdDailyReportPageReqVO pageReqVO);
+
+    /**
+     * 瑞都日报 按照 队伍 井号 日报 汇总
+     *
+     * @param pageReqVO 无分页查询
+     * @return 瑞都日报 按照 队伍 井号 日报 列表
+     */
+    List<IotRdDailyReportSummaryTeamRespVO> reportTeamSummary(IotRdDailyReportPageReqVO pageReqVO);
 }

+ 110 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java

@@ -3763,6 +3763,116 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         return result;
     }
 
+    @Override
+    public List<IotRdDailyReportSummaryTeamRespVO> reportTeamSummary(IotRdDailyReportPageReqVO pageReqVO) {
+        // 查询选择部门下面所有子部门
+        Set<Long> ids = new HashSet<>();
+        if (Objects.nonNull(pageReqVO.getDeptId())) {
+            ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            ids.add(pageReqVO.getDeptId());
+            pageReqVO.setDeptIds(ids);
+        }
+        // searchKey 兼容移动端查询的情况
+        if (StrUtil.isNotBlank(pageReqVO.getSearchKey())) {
+            if (CollUtil.isEmpty(pageReqVO.getProjectIds()) && CollUtil.isEmpty(pageReqVO.getTaskIds())) {
+                return new ArrayList<>();
+            }
+        } else {
+            // PC 端 AND 检查:各自条件必须匹配到对应 ID
+            if (StrUtil.isNotBlank(pageReqVO.getContractName()) && CollUtil.isEmpty(pageReqVO.getProjectIds())) {
+                return new ArrayList<>();
+            }
+            if (StrUtil.isNotBlank(pageReqVO.getTaskName()) && CollUtil.isEmpty(pageReqVO.getTaskIds())) {
+                return new ArrayList<>();
+            }
+        }
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        PageResult<IotRdDailyReportDO> pageReports = iotRdDailyReportMapper.selectPage(pageReqVO);
+        List<IotRdDailyReportDO> dailyReports = pageReports.getList();
+        if (CollUtil.isEmpty(dailyReports)) {
+            return Collections.emptyList();
+        }
+        // 按照 年 月 日 汇总统计 日报数据
+        List<IotRdDailyReportSummaryTeamRespVO> result = new ArrayList<>();
+        // 设备部门信息
+        Map<Long, DeptDO> tempDeptMap = deptService.getDeptMap(convertList(dailyReports, IotRdDailyReportDO::getDeptId));
+        // key井id   value井名称
+        Map<Long, String> taskPair = new HashMap<>();
+
+        List<Long> taskIds = dailyReports.stream()
+                .map(IotRdDailyReportDO::getTaskId)
+                .filter(Objects::nonNull)  // 过滤 null taskId,避免后续查询异常
+                .collect(Collectors.toList());
+
+        if (CollUtil.isNotEmpty(taskIds)) {
+            IotProjectTaskPageReqVO taskReqVO = new IotProjectTaskPageReqVO();
+            taskReqVO.setTaskIds(taskIds);
+            List<IotProjectTaskDO> tasks = iotProjectTaskMapper.selectList(taskReqVO);
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    taskPair.put(task.getId(), task.getWellName());
+                    // 大概率集合中只有1个元素 集合中的元素就是 队伍id
+                    Set<Long> deptIds = task.getDeptIds();
+
+                });
+            }
+        }
+        // 1. 按队伍分组
+        Map<Long, List<IotRdDailyReportDO>> deptGroup = dailyReports.stream()
+                .filter(r -> r.getDeptId() != null)
+                .collect(Collectors.groupingBy(IotRdDailyReportDO::getDeptId));
+
+        deptGroup.forEach((deptId, reportsOfDept) -> {
+            // 构造队伍 VO
+            IotRdDailyReportSummaryTeamRespVO teamVO = new IotRdDailyReportSummaryTeamRespVO();
+            DeptDO dept = tempDeptMap.get(deptId);
+            teamVO.setTeamName(dept != null ? dept.getName() : "未知队伍");
+            teamVO.setReportCount(reportsOfDept.size());
+            // 统计井数量(去重)
+            Set<Long> wellIds = reportsOfDept.stream()
+                    .map(IotRdDailyReportDO::getTaskId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+            teamVO.setWellCount(wellIds.size());
+            teamVO.setLevel(""); // 按需设置
+
+            // 2. 按井分组
+            Map<Long, List<IotRdDailyReportDO>> wellGroup = reportsOfDept.stream()
+                    .filter(r -> r.getTaskId() != null)
+                    .collect(Collectors.groupingBy(IotRdDailyReportDO::getTaskId));
+
+            List<IotRdDailyReportSummaryWellRespVO> wellVOs = new ArrayList<>();
+            wellGroup.forEach((taskId, reportsOfWell) -> {
+                IotRdDailyReportSummaryWellRespVO wellVO = new IotRdDailyReportSummaryWellRespVO();
+                wellVO.setTaskId(taskId);
+                wellVO.setWellName(taskPair.getOrDefault(taskId, "未知井"));
+                wellVO.setReportCount(reportsOfWell.size());
+                // 根据 status 统计(此处按需求:status=1 表示已填写,其他为未填写)
+                long filled = reportsOfWell.stream().filter(r -> r.getStatus() != null && r.getStatus() == 1).count();
+                long unfilled = reportsOfWell.size() - filled;
+                wellVO.setFilledCount(String.valueOf(filled));
+                wellVO.setUnfilledCount(String.valueOf(unfilled));
+                // 日报列表
+                List<IotRdDailyReportShortRespVO> shortReports = reportsOfWell.stream()
+                        .map(r -> {
+                            IotRdDailyReportShortRespVO shortVO = new IotRdDailyReportShortRespVO();
+                            shortVO.setId(r.getId());
+                            shortVO.setReportName(r.getReportName());
+                            return shortVO;
+                        })
+                        .collect(Collectors.toList());
+                wellVO.setReports(shortReports);
+                wellVO.setLevel(""); // 按需设置
+                wellVOs.add(wellVO);
+            });
+
+            teamVO.setWells(wellVOs);
+            result.add(teamVO);
+        });
+
+        return result;
+    }
+
     /**
      * 按项目部维度 汇总 统计数据
      * @param dailyReports 日报数据列表