Explorar el Código

Merge branch 'dailyReport'

zhangcl hace 18 horas
padre
commit
f857d9e24b
Se han modificado 19 ficheros con 631 adiciones y 67 borrados
  1. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/constant/PmsConstants.java
  2. 42 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/IotProjectTaskController.java
  3. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskPageReqVO.java
  4. 42 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskPlatformVO.java
  5. 11 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskRespVO.java
  6. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskSaveReqVO.java
  7. 170 6
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/IotRdDailyReportController.java
  8. 21 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportPageReqVO.java
  9. 14 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportRespVO.java
  10. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttask/IotProjectTaskDO.java
  11. 12 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotrddailyreport/IotRdDailyReportDO.java
  12. 7 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttask/IotProjectTaskMapper.java
  13. 64 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrddailyreport/IotRdDailyReportMapper.java
  14. 55 14
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/dailyreport/CreateRdDailyReportOrderJob.java
  15. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/message/PmsMessage.java
  16. 74 3
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskServiceImpl.java
  17. 7 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportService.java
  18. 86 39
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java
  19. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/iotprojecttask/IotProjectTaskMapper.xml

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/constant/PmsConstants.java

@@ -12,6 +12,8 @@ public interface PmsConstants {
     String GENERATE_OPERATE = "generateOperate";
     String GENERATE_OPERATE_TEMPLATE = "generate-operate";
 
+    String DAILY_REPORT = "rdDailyReport";
+
     String MAINTAIN_OUT = "maintainOut";
     String MAINTAIN_OUT_TEMPLATE = "maintain-out";
 

+ 42 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/IotProjectTaskController.java

@@ -11,6 +11,7 @@ import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPlatformVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotTaskSaveVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
@@ -35,6 +36,7 @@ import java.util.*;
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
 
 
 @Tag(name = "管理后台 - 项目信息任务拆分")
@@ -94,7 +96,46 @@ public class IotProjectTaskController {
             idList.add(pageReqVO.getDeptId());
         } */
         PageResult<IotProjectTaskDO> pageResult = iotProjectTaskService.getIotProjectTaskPage1(pageReqVO, idList);
-        return success(BeanUtils.toBean(pageResult, IotProjectTaskRespVO.class));
+
+        return success(new PageResult<>(buildTasks(pageResult.getList()), pageResult.getTotal()));
+    }
+
+    /**
+     * 组装 设备-bom 关联关系对象
+     * @param pagedTasks
+     * @return
+     */
+    private List<IotProjectTaskRespVO> buildTasks(List<IotProjectTaskDO> pagedTasks) {
+        if (CollUtil.isEmpty(pagedTasks)) {
+            return Collections.emptyList();
+        }
+        Map<Long, List<IotProjectTaskPlatformVO>> platformWellPair = new HashMap<>();
+        // 循环每个任务 找到任务 关联的平台井
+        if (CollUtil.isNotEmpty(pagedTasks)) {
+            pagedTasks.forEach(task -> {
+                String platformGroup = task.getPlatformGroup();
+                if (StrUtil.isNotBlank(platformGroup)) {
+                    // 根据 platformGroup 查询关联的平台井
+                    IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
+                    reqVO.setPlatformGroup(platformGroup);
+                    List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(reqVO);
+                    List<IotProjectTaskPlatformVO> platforms = new ArrayList<>();
+                    tasks.forEach(groupTask -> {
+                        IotProjectTaskPlatformVO tempPlatform = new IotProjectTaskPlatformVO();
+                        tempPlatform.setId(groupTask.getId());
+                        tempPlatform.setWellName(groupTask.getWellName());
+                        tempPlatform.setWorkloadDesign(groupTask.getWorkloadDesign());
+                        platforms.add(tempPlatform);
+                    });
+                    platformWellPair.put(task.getId(), platforms);
+                }
+            });
+        }
+        // 2. 拼接数据
+        return BeanUtils.toBean(pagedTasks, IotProjectTaskRespVO.class, (taskVO) -> {
+            // 2.1 拼接平台井信息
+            findAndThen(platformWellPair, taskVO.getId(), tasks -> taskVO.setPlatformWells(tasks));
+        });
     }
 
     @GetMapping("/list")

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskPageReqVO.java

@@ -21,6 +21,9 @@ public class IotProjectTaskPageReqVO extends PageParam {
     @Schema(description = "项目id", example = "2988")
     private Long projectId;
 
+    @Schema(description = "平台井组", example = "982oierwweo9823")
+    private String platformGroup;
+
     @Schema(description = "井号", example = "赵六")
     private String wellName;
 
@@ -91,4 +94,7 @@ public class IotProjectTaskPageReqVO extends PageParam {
     @Schema(description = "公司id")
     private Long companyId;
 
+    @Schema(description = "定时任务标识 Y")
+    private String jobFlag;
+
 }

+ 42 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskPlatformVO.java

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo;
+
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Set;
+
+@Schema(description = "管理后台 - 项目任务 平台井 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotProjectTaskPlatformVO {
+
+    @Schema(description = "主键id", example = "284")
+    private Long id;
+
+    @Schema(description = "井号", example = "#2988")
+    private String wellName;
+
+    @Schema(description = "设计工作量", example = "123")
+    private String workloadDesign;
+
+    @Schema(description = "日报id", example = "314")
+    private Long reportId;
+
+    @Schema(description = "当前平台关联井已经选择的扩展属性值")
+    private List<IotTaskAttrModelProperty> extProperty;
+
+    @Schema(description = "当前平台关联井已经选择的施工工艺")
+    private Set<Long> techniqueIds;
+
+    @Schema(description = "当前平台关联井已经选择的施工工艺 数据字典label值")
+    private String techniqueNames;
+
+    @Schema(description = "任务状态", example = "sg")
+    private String rdStatus;
+
+    @Schema(description = "任务状态 数据字典label值", example = "施工")
+    private String rdStatusLabel;
+}

+ 11 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskRespVO.java

@@ -23,6 +23,14 @@ public class IotProjectTaskRespVO {
     @ExcelProperty("项目id")
     private Long projectId;
 
+    @Schema(description = "平台井标识 0非平台井 1平台井", example = "1")
+    @ExcelProperty("平台井标识 0非平台井 1平台井")
+    private Integer platformWell;
+
+    @Schema(description = "平台井组", example = "984r98roori928392")
+    @ExcelProperty("平台井组")
+    private String platformGroup;
+
     @Schema(description = "井号", example = "赵六")
     @ExcelProperty("井号")
     private String wellName;
@@ -111,4 +119,7 @@ public class IotProjectTaskRespVO {
 
     @Schema(description = "施工队伍", example = "THA1,THA2")
     private String deptNames;
+
+    @Schema(description = "平台井明细", example = "[{\"井号\": #233, \"工作量\": 234}]")
+    private List<IotProjectTaskPlatformVO> platformWells;
 }

+ 6 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskSaveReqVO.java

@@ -17,6 +17,12 @@ public class IotProjectTaskSaveReqVO {
     @Schema(description = "项目id", example = "2988")
     private Long projectId;
 
+    @Schema(description = "平台井标识 0非平台井 1平台井", example = "1")
+    private Integer platformWell;
+
+    @Schema(description = "平台井组", example = "463e3996-be48-4758-8229-c1351cbf3e37")
+    private String platformGroup;
+
     @Schema(description = "井号", example = "赵六")
     private String wellName;
 

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

@@ -14,6 +14,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotattachment.vo.IotAttachme
 import cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportattrs.vo.IotDailyReportAttrsPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojectinfo.vo.IotProjectInfoPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPlatformVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportSaveReqVO;
@@ -39,7 +40,9 @@ import cn.iocoder.yudao.module.pms.service.iotrddailyreport.IotRdDailyReportServ
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
+import cn.iocoder.yudao.module.system.service.dict.DictDataService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -90,6 +93,9 @@ public class IotRdDailyReportController {
     @Resource
     private AdminUserApi adminUserApi;
 
+    @Resource
+    private DictDataService dictDataService;
+
     @PostMapping("/create")
     @Operation(summary = "创建瑞都日报")
     @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:create')")
@@ -105,6 +111,14 @@ public class IotRdDailyReportController {
         return success(true);
     }
 
+    @PostMapping("/saveBatch")
+    @Operation(summary = "批量更新瑞都日报 平台井")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:update')")
+    public CommonResult<Boolean> saveBatch(@Valid @RequestBody List<IotRdDailyReportSaveReqVO> reports) {
+        iotRdDailyReportService.saveBatch(reports);
+        return success(true);
+    }
+
     @PutMapping("/approval")
     @Operation(summary = "审批日报")
     @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:update')")
@@ -204,7 +218,86 @@ public class IotRdDailyReportController {
             DeptDO dept = deptService.getDept(dailyReport.getDeptId());
             dailyReportVO.setDeptName(dept.getName());
         }
+        // 日报任务对应的平台井列表
+        if (1 == dailyReport.getPlatformWell()) {
+            IotProjectTaskPageReqVO pageReqVO = new IotProjectTaskPageReqVO();
+            pageReqVO.setPlatformGroup(dailyReport.getTaskPlatform());
+            List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(pageReqVO);
+            // 查询相同平台井组关联的 日报
+            IotRdDailyReportPageReqVO reportReqVO  = new IotRdDailyReportPageReqVO();
+            reportReqVO.setPlatformGroup(dailyReport.getPlatformGroup());
+            List<IotRdDailyReportDO> reports = iotRdDailyReportService.dailyReports(reportReqVO);
+            // key任务id  value日报id
+            Map<Long, Long> reportPair = new HashMap<>();
+            // key任务id  value平台井日报已经设置的多种属性
+            Map<Long, IotProjectTaskPlatformVO> platformPair = new HashMap<>();
+            //  施工状态 key字典键值     value字典标签
+            Map<String, String> statusDictPair = new HashMap<>();
+            //  施工工艺 key字典键值     value字典标签
+            Map<String, String> techniqueDictPair = new HashMap<>();
+            if (CollUtil.isNotEmpty(reports)) {
+                // 查询施工工艺字典数据
+                List<DictDataDO> rdStatusDicts = dictDataService.getDictDataListByDictType("rdStatus");
+                // 查询施工工艺字典数据
+                List<DictDataDO> rdTechniquesDicts = dictDataService.getDictDataListByDictType("rq_iot_project_technology_rd");
+                if (CollUtil.isNotEmpty(rdStatusDicts)) {
+                    rdStatusDicts.forEach(tech -> {
+                        statusDictPair.put(tech.getValue(), tech.getLabel());
+                    });
+                }
+                if (CollUtil.isNotEmpty(rdTechniquesDicts)) {
+                    rdTechniquesDicts.forEach(tech -> {
+                        techniqueDictPair.put(tech.getValue(), tech.getLabel());
+                    });
+                }
+                reports.forEach(report -> {
+                    // 保养平台井关联的多个日报使用
+                    reportPair.put(report.getTaskId(), report.getId());
+                    // 设置 平台关联井 已经设置的 属性 施工状态 施工工艺 工作量属性
+                    // 查询 平台关联井详情使用
 
+                    IotProjectTaskPlatformVO platformVO = new IotProjectTaskPlatformVO();
+                    platformVO.setRdStatus(report.getRdStatus());
+                    if (StrUtil.isNotBlank(report.getRdStatus()) && statusDictPair.containsKey(report.getRdStatus())) {
+                        platformVO.setRdStatusLabel(statusDictPair.get(report.getRdStatus()));
+                    }
+                    if (CollUtil.isNotEmpty(report.getTechniqueIds())) {
+                        String techniqueNames = report.getTechniqueIds().stream()
+                                .map(lg -> ObjUtil.isNotEmpty(lg) ? lg.toString() : StrUtil.EMPTY) // 将Long转为String,匹配techniqueDictPair的key类型
+                                .map(key -> techniqueDictPair.getOrDefault(key, key)) // 取label,无则用原key
+                                .collect(Collectors.joining(",")); // 逗号拼接
+                        platformVO.setTechniqueNames(techniqueNames);
+                    } else {
+                        platformVO.setTechniqueNames(""); // 空集合时设为空字符串(或null,根据业务需求)
+                    }
+                    platformVO.setTechniqueIds(report.getTechniqueIds());
+                    platformVO.setExtProperty(report.getExtProperty());
+                    platformPair.put(report.getTaskId(), platformVO);
+                });
+            }
+            List<IotProjectTaskPlatformVO> platforms = new ArrayList<>();
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    IotProjectTaskPlatformVO platform = new IotProjectTaskPlatformVO();
+                    platform.setId(task.getId());
+                    platform.setWellName(task.getWellName());
+                    platform.setWorkloadDesign(task.getWorkloadDesign());
+                    if (reportPair.containsKey(task.getId())) {
+                        platform.setReportId(reportPair.get(task.getId()));
+                    }
+                    if (platformPair.containsKey(task.getId())) {
+                        IotProjectTaskPlatformVO tempPlatform = platformPair.get(task.getId());
+                        platform.setRdStatus(tempPlatform.getRdStatus());
+                        platform.setRdStatusLabel(tempPlatform.getRdStatusLabel());
+                        platform.setTechniqueIds(tempPlatform.getTechniqueIds());
+                        platform.setTechniqueNames(tempPlatform.getTechniqueNames());
+                        platform.setExtProperty(tempPlatform.getExtProperty());
+                    }
+                    platforms.add(platform);
+                });
+                dailyReportVO.setPlatforms(platforms);
+            }
+        }
         return dailyReportVO;
     }
 
@@ -212,6 +305,31 @@ public class IotRdDailyReportController {
     @Operation(summary = "获得瑞都日报分页")
     @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:query')")
     public CommonResult<PageResult<IotRdDailyReportRespVO>> getIotRdDailyReportPage(@Valid IotRdDailyReportPageReqVO pageReqVO) {
+        // 根据查询参数筛选出 符合条件 的记录id 再传入 分页查询
+        Set<Long> projectIds = new HashSet<>();
+        Set<Long> taskIds = new HashSet<>();
+        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);
+            }
+        }
         PageResult<IotRdDailyReportDO> pageResult = iotRdDailyReportService.getIotRdDailyReportPage(pageReqVO);
         // 设置日报的关联信息 部门(施工队伍) 项目 任务 带班干部 日报填报人
         return success(new PageResult<>(buildDailyReportList(pageResult.getList()), pageResult.getTotal()));
@@ -221,6 +339,31 @@ public class IotRdDailyReportController {
     @Operation(summary = "瑞都日报 统计")
     @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:query')")
     public CommonResult<List<IotRdDailyReportStatisticsRespVO>> statistics(@Valid IotRdDailyReportPageReqVO pageReqVO) {
+        // 根据查询参数筛选出 符合条件 的记录id 再传入 分页查询
+        Set<Long> projectIds = new HashSet<>();
+        Set<Long> taskIds = new HashSet<>();
+        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<IotRdDailyReportStatisticsRespVO> result = iotRdDailyReportService.statistics(pageReqVO);
         // 瑞都日报 按照项目部统计
         List<IotRdDailyReportStatisticsRespVO> projectReports = new ArrayList<>();
@@ -236,9 +379,6 @@ public class IotRdDailyReportController {
         if (CollUtil.isEmpty(reports)) {
             return Collections.emptyList();
         }
-        // 设备部门信息
-        Map<Long, DeptDO> deptMap = deptService.getDeptMap(
-                convertList(reports, IotRdDailyReportDO::getDeptId));
         // key项目id   value项目合同号
         Map<Long, String> projectPair = new HashMap<>();
         //  key任务id     value任务井号-施工区域
@@ -249,7 +389,11 @@ public class IotRdDailyReportController {
         Map<Long, String> taskSubmitterPair = new HashMap<>();
         //  key任务id     value工作量数据集合
         Map<Long, List<IotTaskAttrModelProperty>> taskWorkloadPair = new HashMap<>();
+        //  key任务id     value任务关联的施工队伍名称 多个逗号分隔
+        Map<Long, String> taskTeamsPair = new HashMap<>();
         Set<Long> userIds = new HashSet<>();
+        // 当前页所有日报关联任务的 施工队伍id 集合
+        Set<Long> currentPageDeptIds = new HashSet<>();
         DataPermissionUtils.executeIgnore(() -> {
             // 查询日报关联的项目信息
             IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
@@ -268,6 +412,9 @@ public class IotRdDailyReportController {
                 tasks.forEach(task -> {
                     Set<Long> personIds = task.getResponsiblePerson();
                     Set<Long> submitterIds = task.getSubmitter();
+                    // 施工队伍id集合
+                    Set<Long> deptIds = task.getDeptIds();
+                    currentPageDeptIds.addAll(Optional.ofNullable(deptIds).orElse(Collections.emptySet()));
                     taskPair.put(task.getId(), task.getWellName());
                     userIds.addAll(Optional.ofNullable(personIds).orElse(Collections.emptySet()));
                     userIds.addAll(Optional.ofNullable(submitterIds).orElse(Collections.emptySet()));
@@ -276,6 +423,8 @@ public class IotRdDailyReportController {
                     taskWorkloadPair.put(task.getId(), extProperties);
                 });
             }
+            // 查询当前页所有日报关联的任务的施工队伍名称
+            Map<Long, DeptDO> deptMap = deptService.getDeptMap(currentPageDeptIds);
             // 查询所有 带班干部 填报人 的姓名
             Map<Long, AdminUserRespDTO> userMap;
             if (CollUtil.isNotEmpty(userIds)) {
@@ -285,6 +434,21 @@ public class IotRdDailyReportController {
             }
             if (CollUtil.isNotEmpty(tasks)) {
                 tasks.forEach(task -> {
+                    // 安全获取施工队伍ID集合(避免null)
+                    Set<Long> deptIds = Optional.ofNullable(task.getDeptIds())
+                            .orElse(Collections.emptySet());
+                    // 转换ID集合为队伍名称字符串(用逗号分隔)
+                    String deptNames = deptIds.stream()
+                            // 映射ID到队伍名称(队伍不存在时用空字符串)
+                            .map(deptId -> Optional.ofNullable(deptMap.get(deptId))
+                                    .map(DeptDO::getName)
+                                    .orElse(""))
+                            // 过滤空字符串(避免多余逗号)
+                            .filter(name -> !name.isEmpty())
+                            // 拼接部门名称
+                            .collect(Collectors.joining(","));
+                    // 存入映射关系
+                    taskTeamsPair.put(task.getId(), deptNames);
                     // 安全获取带班干部ID集合(避免null)
                     Set<Long> responsibleIds = Optional.ofNullable(task.getResponsiblePerson())
                             .orElse(Collections.emptySet());
@@ -380,7 +544,7 @@ public class IotRdDailyReportController {
                         if ("台次".equals(unit) && "当日泵车台次".equals(attr.getName())) {
                             tempTotalPumpTrips = tempTotalPumpTrips.add(actualValue);
                         }
-                        if ("台次".equals(unit) && ("当日仪表".equals(attr.getName()) || "当日混砂".equals(attr.getName()))) {
+                        if ("台次".equals(unit) && ("当日仪表/混砂".equals(attr.getName()))) {
                             tempTotalMixSand = tempTotalMixSand.add(actualValue);
                         }
                     }
@@ -396,8 +560,8 @@ public class IotRdDailyReportController {
             }
         });
         return BeanUtils.toBean(reports, IotRdDailyReportRespVO.class, (reportVO) -> {
-            // 部门信息
-            findAndThen(deptMap, reportVO.getDeptId(), dept -> reportVO.setDeptName(dept.getName()));
+            // 部门信息 任务中关联的施工队伍
+            findAndThen(taskTeamsPair, reportVO.getTaskId(), deptNames -> reportVO.setDeptName(deptNames));
             // 日报关联的项目信息
             findAndThen(projectPair, reportVO.getProjectId(), contractName -> reportVO.setContractName(contractName));
             // 日报关联的任务信息

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

@@ -10,6 +10,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.util.Collection;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -28,6 +29,9 @@ public class IotRdDailyReportPageReqVO extends PageParam {
     @Schema(description = "项目id", example = "32587")
     private Long projectId;
 
+    @Schema(description = "平台井组", example = "463e3996-be48-4758-8229-c1351cbf3e37")
+    private String platformGroup;
+
     @Schema(description = "任务id", example = "15678")
     private Long taskId;
 
@@ -147,4 +151,21 @@ public class IotRdDailyReportPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "项目/合同名称", example = "测试")
+    private String contractName;
+
+    @Schema(description = "任务标识", example = "#33 - 一厂")
+    private String taskName;
+
+    @Schema(description = "项目id集合", example = "测试")
+    private Collection<Long> projectIds;
+
+    @Schema(description = "任务id集合", example = "测试")
+    private Collection<Long> taskIds;
+
+    @Schema(description = "部门id集合", example = "[123,223]")
+    private Collection<Long> deptIds;
 }

+ 14 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportRespVO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
 
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPlatformVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSimpleRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportattrs.IotDailyReportAttrsDO;
@@ -28,6 +29,14 @@ public class IotRdDailyReportRespVO {
     @ExcelProperty("施工队伍id")
     private Long deptId;
 
+    @Schema(description = "平台井标识 2非平台井 1平台井 0默认值", example = "1")
+    @ExcelProperty("平台井标识 2非平台井 1平台井 0默认值")
+    private Integer platformWell;
+
+    @Schema(description = "平台井组", example = "463e3996-be48-4758-8229-c1351cbf3e37")
+    @ExcelProperty("平台井组")
+    private String platformGroup;
+
     @Schema(description = "日报名称", example = "西南压裂项目部/2025-10-17日报填报")
     @ExcelProperty("日报名称")
     private String reportName;
@@ -203,7 +212,7 @@ public class IotRdDailyReportRespVO {
     @ExcelProperty("时间节点区域")
     private String timeRange;
 
-    @Schema(description = "部门名称", example = "压裂二队")
+    @Schema(description = "部门名称", example = "压裂二队,压裂五队")
     @ExcelProperty("部门名称")
     private String deptName;
 
@@ -277,4 +286,8 @@ public class IotRdDailyReportRespVO {
     @Schema(description = "施工设备列表", example = "https://aims.deepoil.cc/admin-api/infra/file/29/get/人力资源.png")
     @ExcelProperty("施工设备列表")
     private List<IotDeviceSimpleRespVO> selectedDevices;
+
+    @Schema(description = "平台井列表", example = "[]")
+    @ExcelProperty("平台井列表")
+    private List<IotProjectTaskPlatformVO> platforms;
 }

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttask/IotProjectTaskDO.java

@@ -36,6 +36,14 @@ public class IotProjectTaskDO extends BaseDO {
      * 项目id
      */
     private Long projectId;
+    /**
+     * 平台井标识 0非平台井 1平台井
+     */
+    private Integer platformWell;
+    /**
+     * 平台井组
+     */
+    private String platformGroup;
     /**
      * 井号
      */

+ 12 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotrddailyreport/IotRdDailyReportDO.java

@@ -44,10 +44,22 @@ public class IotRdDailyReportDO extends BaseDO {
      * 项目id
      */
     private Long projectId;
+    /**
+     * 平台井标识 2非平台井 1平台井 0默认值
+     */
+    private Integer platformWell;
+    /**
+     * 平台井组
+     */
+    private String platformGroup;
     /**
      * 任务id
      */
     private Long taskId;
+    /**
+     * 任务 平台井组
+     */
+    private String taskPlatform;
     /**
      * 项目类别(钻井 修井 注氮 酸化压裂... )
      */

+ 7 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttask/IotProjectTaskMapper.java

@@ -89,7 +89,12 @@ public interface IotProjectTaskMapper extends BaseMapperX<IotProjectTaskDO> {
                     .or()
                     .like(IotProjectTaskDO::getLocation, reqVO.getSearchKey()));
         }
-
+        // 定时任务 如果是平台井 只生成主井号任务
+        if (ObjUtil.isNotEmpty(reqVO.getJobFlag())) {
+            wrapper.and(wq -> wq.eq(IotProjectTaskDO::getPlatformWell, 0)
+                    .or()
+                    .eq(IotProjectTaskDO::getPlatformWell, 1));
+        }
         return selectList(wrapper);
     }
 
@@ -112,6 +117,7 @@ public interface IotProjectTaskMapper extends BaseMapperX<IotProjectTaskDO> {
                 .eqIfPresent(IotProjectTaskDO::getProjectId, reqVO.getProjectId())
                 .likeIfPresent(IotProjectTaskDO::getWellName, reqVO.getWellName())
                 .eqIfPresent(IotProjectTaskDO::getWellType, reqVO.getWellType())
+                .eqIfPresent(IotProjectTaskDO::getPlatformGroup, reqVO.getPlatformGroup())
                 .eqIfPresent(IotProjectTaskDO::getLocation, reqVO.getLocation())
                 .eqIfPresent(IotProjectTaskDO::getTechnique, reqVO.getTechnique())
                 .eqIfPresent(IotProjectTaskDO::getWorkloadDesign, reqVO.getWorkloadDesign())

+ 64 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrddailyreport/IotRdDailyReportMapper.java

@@ -17,7 +17,7 @@ import java.util.List;
 @Mapper
 public interface IotRdDailyReportMapper extends BaseMapperX<IotRdDailyReportDO> {
 
-    default PageResult<IotRdDailyReportDO> selectPage(IotRdDailyReportPageReqVO reqVO) {
+    /* default PageResult<IotRdDailyReportDO> selectPage(IotRdDailyReportPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<IotRdDailyReportDO>()
                 .eqIfPresent(IotRdDailyReportDO::getDeptId, reqVO.getDeptId())
                 .eqIfPresent(IotRdDailyReportDO::getProjectId, reqVO.getProjectId())
@@ -59,13 +59,26 @@ public interface IotRdDailyReportMapper extends BaseMapperX<IotRdDailyReportDO>
                 .eqIfPresent(IotRdDailyReportDO::getAuditStatus, reqVO.getAuditStatus())
                 .betweenIfPresent(IotRdDailyReportDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(IotRdDailyReportDO::getId));
+    } */
+
+    default PageResult<IotRdDailyReportDO> selectPage(IotRdDailyReportPageReqVO reqVO) {
+        LambdaQueryWrapperX<IotRdDailyReportDO> wrapper = buildCommonQuery(reqVO)
+                .eqIfPresent(IotRdDailyReportDO::getProjectId, reqVO.getProjectId());
+
+        wrapper.and(wq -> wq.eq(IotRdDailyReportDO::getPlatformWell, 0)
+                .or()
+                .eq(IotRdDailyReportDO::getPlatformWell, 1));
+        return selectPage(reqVO, wrapper);
     }
 
     default List<IotRdDailyReportDO> dailyReports(IotRdDailyReportPageReqVO reqVO) {
         return selectList(new LambdaQueryWrapperX<IotRdDailyReportDO>()
-                .eqIfPresent(IotRdDailyReportDO::getDeptId, reqVO.getDeptId())
+                .inIfPresent(IotRdDailyReportDO::getDeptId, reqVO.getDeptIds())
                 .eqIfPresent(IotRdDailyReportDO::getProjectId, reqVO.getProjectId())
+                .inIfPresent(IotRdDailyReportDO::getProjectId, reqVO.getProjectIds())
+                .eqIfPresent(IotRdDailyReportDO::getPlatformGroup, reqVO.getPlatformGroup())
                 .eqIfPresent(IotRdDailyReportDO::getTaskId, reqVO.getTaskId())
+                .inIfPresent(IotRdDailyReportDO::getTaskId, reqVO.getTaskIds())
                 .eqIfPresent(IotRdDailyReportDO::getProjectClassification, reqVO.getProjectClassification())
                 .eqIfPresent(IotRdDailyReportDO::getTechniqueIds, reqVO.getTechniqueIds())
                 .eqIfPresent(IotRdDailyReportDO::getDeviceIds, reqVO.getDeviceIds())
@@ -103,4 +116,53 @@ public interface IotRdDailyReportMapper extends BaseMapperX<IotRdDailyReportDO>
                 .eqIfPresent(IotRdDailyReportDO::getAuditStatus, reqVO.getAuditStatus())
                 .betweenIfPresent(IotRdDailyReportDO::getCreateTime, reqVO.getCreateTime()));
     }
+
+    /**
+     * 构建 瑞都日报 公共查询条件
+     * @param reqVO 查询条件
+     */
+    default LambdaQueryWrapperX<IotRdDailyReportDO> buildCommonQuery(IotRdDailyReportPageReqVO reqVO) {
+        return new LambdaQueryWrapperX<IotRdDailyReportDO>()
+                .inIfPresent(IotRdDailyReportDO::getDeptId, reqVO.getDeptIds())
+                .inIfPresent(IotRdDailyReportDO::getProjectId, reqVO.getProjectIds())
+                .eqIfPresent(IotRdDailyReportDO::getTaskId, reqVO.getTaskId())
+                .inIfPresent(IotRdDailyReportDO::getTaskId, reqVO.getTaskIds())
+                .eqIfPresent(IotRdDailyReportDO::getProjectClassification, reqVO.getProjectClassification())
+                .eqIfPresent(IotRdDailyReportDO::getTechniqueIds, reqVO.getTechniqueIds())
+                .eqIfPresent(IotRdDailyReportDO::getDeviceIds, reqVO.getDeviceIds())
+                .betweenIfPresent(IotRdDailyReportDO::getStartTime, reqVO.getStartTime())
+                .betweenIfPresent(IotRdDailyReportDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(IotRdDailyReportDO::getCumulativeWorkingWell, reqVO.getCumulativeWorkingWell())
+                .eqIfPresent(IotRdDailyReportDO::getCumulativeWorkingLayers, reqVO.getCumulativeWorkingLayers())
+                .eqIfPresent(IotRdDailyReportDO::getDailyPumpTrips, reqVO.getDailyPumpTrips())
+                .eqIfPresent(IotRdDailyReportDO::getDailyToolsSand, reqVO.getDailyToolsSand())
+                .eqIfPresent(IotRdDailyReportDO::getRunCount, reqVO.getRunCount())
+                .eqIfPresent(IotRdDailyReportDO::getBridgePlug, reqVO.getBridgePlug())
+                .eqIfPresent(IotRdDailyReportDO::getWaterVolume, reqVO.getWaterVolume())
+                .eqIfPresent(IotRdDailyReportDO::getHourCount, reqVO.getHourCount())
+                .eqIfPresent(IotRdDailyReportDO::getDailyFuel, reqVO.getDailyFuel())
+                .eqIfPresent(IotRdDailyReportDO::getDailyPowerUsage, reqVO.getDailyPowerUsage())
+                .betweenIfPresent(IotRdDailyReportDO::getProductionTime, reqVO.getProductionTime())
+                .betweenIfPresent(IotRdDailyReportDO::getNonProductionTime, reqVO.getNonProductionTime())
+                .eqIfPresent(IotRdDailyReportDO::getRdNptReason, reqVO.getRdNptReason())
+                .betweenIfPresent(IotRdDailyReportDO::getConstructionStartDate, reqVO.getConstructionStartDate())
+                .betweenIfPresent(IotRdDailyReportDO::getConstructionEndDate, reqVO.getConstructionEndDate())
+                .eqIfPresent(IotRdDailyReportDO::getProductionStatus, reqVO.getProductionStatus())
+                .eqIfPresent(IotRdDailyReportDO::getExternalRental, reqVO.getExternalRental())
+                .eqIfPresent(IotRdDailyReportDO::getNextPlan, reqVO.getNextPlan())
+                .eqIfPresent(IotRdDailyReportDO::getRdStatus, reqVO.getRdStatus())
+                .eqIfPresent(IotRdDailyReportDO::getMalfunction, reqVO.getMalfunction())
+                .betweenIfPresent(IotRdDailyReportDO::getFaultDowntime, reqVO.getFaultDowntime())
+                .eqIfPresent(IotRdDailyReportDO::getPersonnel, reqVO.getPersonnel())
+                .eqIfPresent(IotRdDailyReportDO::getTotalStaffNum, reqVO.getTotalStaffNum())
+                .eqIfPresent(IotRdDailyReportDO::getLeaveStaffNum, reqVO.getLeaveStaffNum())
+                .eqIfPresent(IotRdDailyReportDO::getExtProperty, reqVO.getExtProperty())
+                .eqIfPresent(IotRdDailyReportDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotRdDailyReportDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotRdDailyReportDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(IotRdDailyReportDO::getProcessInstanceId, reqVO.getProcessInstanceId())
+                .eqIfPresent(IotRdDailyReportDO::getAuditStatus, reqVO.getAuditStatus())
+                .betweenIfPresent(IotRdDailyReportDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotRdDailyReportDO::getId);
+    }
 }

+ 55 - 14
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/dailyreport/CreateRdDailyReportOrderJob.java

@@ -2,9 +2,11 @@ package cn.iocoder.yudao.module.pms.job.dailyreport;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.pms.constant.PmsConstants;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
@@ -28,7 +30,9 @@ import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
 
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
 
 @Component
@@ -82,8 +86,10 @@ public class CreateRdDailyReportOrderJob implements JobHandler {
             });
         }
         // 查询瑞都相关的项目任务 根据每个任务的填报人进行工单生成和推送
+        // 平台井任务只生成主井号任务 关联井在日报中聚合处理
         IotProjectTaskPageReqVO taskReqVO = new IotProjectTaskPageReqVO();
         taskReqVO.setCompanyId(163l);
+        taskReqVO.setJobFlag(StrUtil.EMPTY);
         List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(taskReqVO);
         Set<Long> userIds = new HashSet<>();
         List<IotRdDailyReportDO> reports = new ArrayList<>();
@@ -129,49 +135,84 @@ public class CreateRdDailyReportOrderJob implements JobHandler {
                     }
                     report.setProjectId(task.getProjectId());
                     report.setTaskId(task.getId());
+                    report.setPlatformWell(task.getPlatformWell());
+                    report.setPlatformGroup(StrUtil.EMPTY);
+                    report.setTaskPlatform(task.getPlatformGroup());
                     report.setDeviceIds(task.getDeviceIds());
                     report.setStartTime(LocalTime.of(8, 0, 0));
                     report.setEndTime(LocalTime.of(8, 0, 0));
                     report.setConstructionStartDate(yesterday);
                     report.setConstructionEndDate(currentDate);
+                    Set<Long> submitters = task.getSubmitter();
+                    report.setCreator(String.valueOf(new ArrayList<>(submitters).get(0)));
                     report.setCreateTime(LocalDateTime.now());
                     reports.add(report);
                 }
             });
         }
         if (CollUtil.isNotEmpty(reports)) {
+            Map<String, List<IotRdDailyReportDO>> platformPair = new HashMap<>();
+            // 替换 日报的 platformGroup 以区分不同的任务
+            reports.forEach(report -> {
+                String taskPlatform = report.getTaskPlatform();
+                if (platformPair.containsKey(taskPlatform)) {
+                    List<IotRdDailyReportDO> tempReports = platformPair.get(taskPlatform);
+                    tempReports.add(report);
+                    platformPair.put(taskPlatform, tempReports);
+                } else {
+                    List<IotRdDailyReportDO> tempReports = new ArrayList<>();
+                    tempReports.add(report);
+                    platformPair.put(taskPlatform, tempReports);
+                }
+            });
+            if (CollUtil.isNotEmpty(platformPair)) {
+                platformPair.forEach((taskPlatform, platformReports) -> {
+                    // 相同的任务 如果是平台井 则重新生成 uuid 不利用项目任务的uuid
+                    String tempUuid = StrUtil.uuid();
+                    platformReports.forEach(report -> {
+                        report.setPlatformGroup(tempUuid);
+                    });
+                });
+            }
             iotRdDailyReportService.batchAddDailyReports(reports);
         }
 
-        // 向工单责任人发送 站内信及 钉钉消息
-        /* if (CollUtil.isNotEmpty(workOrders)) {
-            // 先查询所有工单责任人的手机号
-            Set<Long> personIds = new HashSet<>(convertList(workOrders, order -> Long.valueOf(order.getResponsiblePerson())));
+        // 向日报 填报人 发送 站内信及 钉钉消息
+        if (CollUtil.isNotEmpty(reports)) {
+            List<IotRdDailyReportDO> msgReports = new ArrayList<>();
+            // 如果日报是平台井 只发送主井任务
+            reports.forEach(report -> {
+                if (1 == report.getPlatformWell() || 0 == report.getPlatformWell()) {
+                    msgReports.add(report);
+                }
+            });
+            // 先查询所有 日报填报人的手机号
+            Set<Long> personIds = new HashSet<>(convertList(msgReports, report -> Long.valueOf(report.getCreator())));
             Map<Long, AdminUserRespDTO> users = adminUserApi.getUserMap(personIds);
-            // 建立保养工单与 用户手机号的 对应关系
+            // 建立日报与 用户手机号的 对应关系
             Map<Long, String> orderMobilePair = new HashMap<>();
-            workOrders.forEach(order -> {
-                if (users.containsKey(Long.valueOf(order.getResponsiblePerson()))) {
-                    AdminUserRespDTO user = users.get(Long.valueOf(order.getResponsiblePerson()));
-                    orderMobilePair.put(order.getId(), user.getMobile());
+            msgReports.forEach(report -> {
+                if (users.containsKey(Long.valueOf(report.getCreator()))) {
+                    AdminUserRespDTO user = users.get(Long.valueOf(report.getCreator()));
+                    orderMobilePair.put(report.getId(), user.getMobile());
                 }
             });
             // 异步多线程发送 站内信 钉钉 消息
-            workOrders.forEach(order -> {
-                CountDownLatch latch = new CountDownLatch(workOrders.size());
+            msgReports.forEach(order -> {
+                CountDownLatch latch = new CountDownLatch(msgReports.size());
                 pmsThreadPoolTaskExecutor.execute(() -> {
                     try {
                         if (orderMobilePair.containsKey(order.getId())) {
                             String mobile = orderMobilePair.get(order.getId());
-                            pmsMessage.sendMessage(order.getId(), order.getName(), PmsConstants.GENERATE_MAINTENANCE,
-                                    Long.valueOf(order.getResponsiblePerson()), mobile);
+                            pmsMessage.sendMessage(order.getId(), order.getReportName(), PmsConstants.DAILY_REPORT,
+                                    Long.valueOf(order.getCreator()), mobile);
                         }
                     } finally {
                         latch.countDown();
                     }
                 });
             });
-        } */
+        }
         return "创建成功";
     }
 }

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/message/PmsMessage.java

@@ -79,6 +79,9 @@ public class PmsMessage {
             if (PmsConstants.GENERATE_MAINTENANCE.equals(businessType)) {
                 msg = "您有新的保养工单 " + name + ",请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
             }
+            if (PmsConstants.DAILY_REPORT.equals(businessType)) {
+                msg = "您有新的生产日报 " + name + ",请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
+            }
             if (PmsConstants.GENERATE_OPERATION.equals(businessType)) {
                 msg = "您有新的运行记录工单 " + name + ",请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
             }

+ 74 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotprojecttask/IotProjectTaskServiceImpl.java

@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.pms.service.iotprojecttask;
 
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
@@ -19,6 +21,8 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_NOT_EXISTS;
@@ -52,8 +56,20 @@ public class IotProjectTaskServiceImpl implements IotProjectTaskService {
     @Override
     public Boolean createIotProjectTaskList(List<IotProjectTaskSaveReqVO> list) {
         List<IotProjectTaskDO> taskDOS = new ArrayList<>();
+        // 如果是瑞都的平台井,生成uuid关联平台井多个任务
+        AtomicBoolean platformWell = new AtomicBoolean(false);
+        list.forEach(task -> {
+            if (1 == task.getPlatformWell()) {
+                platformWell.set(true);
+            }
+        });
+        String platformGroup = StrUtil.EMPTY;
+        if (platformWell.get()) {
+            platformGroup = StrUtil.uuid();
+        }
         for (IotProjectTaskSaveReqVO saveReqVO:list) {
             IotProjectTaskDO iotProjectTask = BeanUtils.toBean(saveReqVO, IotProjectTaskDO.class);
+            iotProjectTask.setPlatformGroup(platformGroup);
             // 将项目的 deptId 赋值给 任务的 deptId
             IotProjectInfoDO project = iotProjectInfoMapper.selectById(iotProjectTask.getProjectId());
             iotProjectTask.setDeptId(project.getDeptId());
@@ -76,14 +92,67 @@ public class IotProjectTaskServiceImpl implements IotProjectTaskService {
     @Override
     public void updateIotProjectTaskList(List<IotProjectTaskSaveReqVO> list) {
         List<IotProjectTaskDO> taskDOS = new ArrayList<>();
+        // 如果是瑞都的平台井,使用已有的 platformGroup 关联平台井多个任务
+        AtomicBoolean platformWell = new AtomicBoolean(false);
+        AtomicReference<String> platformGroup = new AtomicReference<>(StrUtil.EMPTY);
+        list.forEach(task -> {
+            if (1 == task.getPlatformWell()) {
+                platformWell.set(true);
+                platformGroup.set(task.getPlatformGroup());
+            }
+        });
+        // 查询系统中已有的关联平台井 保存时入参集合中没有的平台井 需要删除掉
+        List<Long> existTaskIds = new ArrayList<>();
+
+        List<IotProjectTaskDO> tobeAddedTasks = new ArrayList<>();
+        List<IotProjectTaskDO> tobeDeletedTasks = new ArrayList<>();
+        List<Long> deletedTaskIds = new ArrayList<>();
+        // 本次保存中包含的任务id集合
+        List<Long> currentTaskIds = new ArrayList<>();
         for (IotProjectTaskSaveReqVO saveReqVO:list) {
             IotProjectTaskDO updateObj = BeanUtils.toBean(saveReqVO, IotProjectTaskDO.class);
             // 校验施工区域 下拉列表数据字典 是否包含在 已有的数据字典值集合中
             // 如果不包含 新增数据字典值
             iotProjectInfoService.saveDictData(saveReqVO.getDictType(), updateObj.getLocation());
-            taskDOS.add(updateObj);
+            if (ObjUtil.isEmpty(updateObj.getId())) {
+                // 新增加的任务 瑞都平台井
+                updateObj.setPlatformGroup(platformGroup.get());
+                tobeAddedTasks.add(updateObj);
+            } else {
+                taskDOS.add(updateObj);
+            }
+            if (ObjUtil.isNotEmpty(saveReqVO.getId())) {
+                currentTaskIds.add(saveReqVO.getId());
+            }
+        }
+        // 找到需要删除的 平台井任务
+        if (StrUtil.isNotBlank(platformGroup.get())) {
+            IotProjectTaskPageReqVO reqVO = new IotProjectTaskPageReqVO();
+            reqVO.setPlatformGroup(platformGroup.get());
+            List<IotProjectTaskDO> groupedTasks = iotProjectTaskMapper.selectList(reqVO);
+            if (CollUtil.isNotEmpty(groupedTasks)) {
+                groupedTasks.forEach(task -> {
+                    existTaskIds.add(task.getId());
+                    if (!currentTaskIds.contains(task.getId())) {
+                        // 本次保存的任务中没有在已有任务集合中的需要删除
+                        tobeDeletedTasks.add(task);
+                        deletedTaskIds.add(task.getId());
+                    }
+                });
+            }
+        }
+        if (CollUtil.isNotEmpty(taskDOS)) {
+            // 需要更新的任务
+            iotProjectTaskMapper.updateBatch(taskDOS);
+        }
+        if (CollUtil.isNotEmpty(tobeAddedTasks)) {
+            // 瑞都平台井 需要新增的任务
+            iotProjectTaskMapper.insertBatch(tobeAddedTasks);
+        }
+        if (CollUtil.isNotEmpty(tobeDeletedTasks)) {
+            // 本次保存的任务中没有在已有任务集合中的需要删除
+            iotProjectTaskMapper.deleteByIds(deletedTaskIds);
         }
-        iotProjectTaskMapper.updateBatch(taskDOS);
     }
 
     @Override
@@ -117,7 +186,9 @@ public class IotProjectTaskServiceImpl implements IotProjectTaskService {
 
     @Override
     public PageResult<IotProjectTaskDO> getIotProjectTaskPage1(IotProjectTaskPageReqVO pageReqVO, Collection<Long> deptIds) {
-        return iotProjectTaskMapper.selectPage1(pageReqVO, deptIds);
+        PageResult<IotProjectTaskDO> pagedTasks = iotProjectTaskMapper.selectPage1(pageReqVO, deptIds);
+
+        return pagedTasks;
     }
 
     @Override

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

@@ -82,4 +82,11 @@ public interface IotRdDailyReportService {
      * @param
      */
     List<IotRdDailyReportStatisticsRespVO> statistics(IotRdDailyReportPageReqVO pageReqVO);
+
+    /**
+     * 批量更新瑞都日报 平台井
+     *
+     * @param
+     */
+    void saveBatch(List<IotRdDailyReportSaveReqVO> reports);
 }

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

@@ -109,6 +109,14 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                 ));
                 iotAttachmentMapper.insertBatch(tobeAddedAttachments);
             }
+        } else {
+            // 如果传递的附件列表为空 则删除已有的附件
+            // 先删除再新增
+            int count = iotAttachmentMapper.deleteByMap(ImmutableMap.of(
+                    "category", AttachmentCategoryEnum.DAILY_REPORT.getCode(),
+                    "biz_id", updateObj.getId(),
+                    "type", AttachmentTypeEnum.EXTERNAL_RENTAL.getCode()
+            ));
         }
     }
 
@@ -149,6 +157,22 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
 
     @Override
     public PageResult<IotRdDailyReportDO> getIotRdDailyReportPage(IotRdDailyReportPageReqVO pageReqVO) {
+        // 查询选择部门下面所有子部门
+        Set<Long> ids = new HashSet<>();
+        if (Objects.nonNull(pageReqVO.getDeptId())) {
+            ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            ids.add(pageReqVO.getDeptId());
+            pageReqVO.setDeptIds(ids);
+        }
+        // 检查contractName不为空但projectIds为空的情况
+        if (StrUtil.isNotBlank(pageReqVO.getContractName()) && (CollUtil.isEmpty(pageReqVO.getProjectIds()))) {
+            return new PageResult<>(Collections.emptyList(), 0L);
+        }
+        // 检查taskName不为空但taskIds为空的情况
+        if (StrUtil.isNotBlank(pageReqVO.getTaskName()) && (CollUtil.isEmpty(pageReqVO.getTaskIds()))) {
+            return new PageResult<>(Collections.emptyList(), 0L);
+        }
+
         return iotRdDailyReportMapper.selectPage(pageReqVO);
     }
 
@@ -165,6 +189,14 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
     @Override
     public List<IotRdDailyReportStatisticsRespVO> statistics(IotRdDailyReportPageReqVO pageReqVO) {
         List<IotRdDailyReportStatisticsRespVO> result = new ArrayList<>();
+        // 检查contractName不为空但projectIds为空的情况
+        if (StrUtil.isNotBlank(pageReqVO.getContractName()) && (CollUtil.isEmpty(pageReqVO.getProjectIds()))) {
+            return result;
+        }
+        // 检查taskName不为空但taskIds为空的情况
+        if (StrUtil.isNotBlank(pageReqVO.getTaskName()) && (CollUtil.isEmpty(pageReqVO.getTaskIds()))) {
+            return result;
+        }
         // 按照项目部统计日报 先查询瑞都所有部门 163l
         Set<Long> rdChildDeptIds = deptService.getChildDeptIdListFromCache(163l);
         List<DeptDO> depts =deptService.getDeptList(rdChildDeptIds);
@@ -186,9 +218,14 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                 }
             });
         }
-        // 查询所有瑞都日报
-        IotRdDailyReportPageReqVO reqVO = new IotRdDailyReportPageReqVO();
-        List<IotRdDailyReportDO> dailyReports = iotRdDailyReportMapper.dailyReports(reqVO);
+        // 查询所有瑞都日报 设置组织机构查询条件
+        Set<Long> ids = new HashSet<>();
+        if (Objects.nonNull(pageReqVO.getDeptId())) {
+            ids = deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            ids.add(pageReqVO.getDeptId());
+            pageReqVO.setDeptIds(ids);
+        }
+        List<IotRdDailyReportDO> dailyReports = iotRdDailyReportMapper.dailyReports(pageReqVO);
         // key项目id   value项目甲方名称
         Map<Long, String> projectPair = new HashMap<>();
         //  key任务id     value任务井号
@@ -269,7 +306,7 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                 });
             }
             // 设置 小队 任务已经完成的工作量集合 (按照不同的单位统计任务的不同工作量)
-            // key队伍id      value队伍工作量数据
+            // key任务井id      value队伍工作量数据
             Map<Long, BigDecimal> bridgePlugPair = new HashMap<>();
             Map<Long, BigDecimal> runCountPair = new HashMap<>();
             Map<Long, BigDecimal> cumulativeWorkingWellPair = new HashMap<>();
@@ -310,27 +347,27 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                             tempTotalBridgePlug = tempTotalBridgePlug.add(actualValue);
                             if (bridgePlugPair.containsKey(report.getDeptId())) {
                                 BigDecimal tempBridgePlug = bridgePlugPair.get(report.getDeptId());
-                                bridgePlugPair.put(report.getDeptId(), tempTotalBridgePlug.add(tempBridgePlug));
+                                bridgePlugPair.put(report.getTaskId(), tempTotalBridgePlug.add(tempBridgePlug));
                             } else {
-                                bridgePlugPair.put(report.getDeptId(), tempTotalBridgePlug);
+                                bridgePlugPair.put(report.getTaskId(), tempTotalBridgePlug);
                             }
                         }
                         if ("趟数".equals(unit)) {
                             tempTotalRunCount = tempTotalRunCount.add(actualValue);
                             if (runCountPair.containsKey(report.getDeptId())) {
                                 BigDecimal tempRunCount = runCountPair.get(report.getDeptId());
-                                runCountPair.put(report.getDeptId(), tempTotalRunCount.add(tempRunCount));
+                                runCountPair.put(report.getTaskId(), tempTotalRunCount.add(tempRunCount));
                             } else {
-                                runCountPair.put(report.getDeptId(), tempTotalRunCount);
+                                runCountPair.put(report.getTaskId(), tempTotalRunCount);
                             }
                         }
                         if ("小时".equals(unit)) {
                             tempTotalHourCount = tempTotalHourCount.add(actualValue);
                             if (hourCountPair.containsKey(report.getDeptId())) {
                                 BigDecimal tempHourCount = hourCountPair.get(report.getDeptId());
-                                hourCountPair.put(report.getDeptId(), tempTotalHourCount.add(tempHourCount));
+                                hourCountPair.put(report.getTaskId(), tempTotalHourCount.add(tempHourCount));
                             } else {
-                                hourCountPair.put(report.getDeptId(), tempTotalHourCount);
+                                hourCountPair.put(report.getTaskId(), tempTotalHourCount);
                             }
                         }
                         if ("天数".equals(unit)) {
@@ -339,27 +376,27 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                             tempTotalHourCount = tempTotalHourCount.add(hours);
                             if (hourCountPair.containsKey(report.getDeptId())) {
                                 BigDecimal tempHourCount = hourCountPair.get(report.getDeptId());
-                                hourCountPair.put(report.getDeptId(), tempTotalHourCount.add(tempHourCount));
+                                hourCountPair.put(report.getTaskId(), tempTotalHourCount.add(tempHourCount));
                             } else {
-                                hourCountPair.put(report.getDeptId(), tempTotalHourCount);
+                                hourCountPair.put(report.getTaskId(), tempTotalHourCount);
                             }
                         }
                         if ("方".equals(unit)) {
                             tempTotalWaterVolume = tempTotalWaterVolume.add(actualValue);
                             if (waterVolumePair.containsKey(report.getDeptId())) {
                                 BigDecimal tempWaterVolume = waterVolumePair.get(report.getDeptId());
-                                waterVolumePair.put(report.getDeptId(), tempTotalWaterVolume.add(tempWaterVolume));
+                                waterVolumePair.put(report.getTaskId(), tempTotalWaterVolume.add(tempWaterVolume));
                             } else {
-                                waterVolumePair.put(report.getDeptId(), tempTotalWaterVolume);
+                                waterVolumePair.put(report.getTaskId(), tempTotalWaterVolume);
                             }
                         }
                         if ("井数".equals(unit)) {
                             tempTotalCumulativeWorkingWell = tempTotalCumulativeWorkingWell.add(actualValue);
                             if (cumulativeWorkingWellPair.containsKey(report.getDeptId())) {
                                 BigDecimal tempWorkingWell = cumulativeWorkingWellPair.get(report.getDeptId());
-                                cumulativeWorkingWellPair.put(report.getDeptId(), tempTotalCumulativeWorkingWell.add(tempWorkingWell));
+                                cumulativeWorkingWellPair.put(report.getTaskId(), tempTotalCumulativeWorkingWell.add(tempWorkingWell));
                             } else {
-                                cumulativeWorkingWellPair.put(report.getDeptId(), tempTotalCumulativeWorkingWell);
+                                cumulativeWorkingWellPair.put(report.getTaskId(), tempTotalCumulativeWorkingWell);
                             }
                         }
                         if ("段数".equals(unit)) {
@@ -367,27 +404,27 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                             tempTotalCumulativeWorkingLayers = tempTotalCumulativeWorkingLayers.add(actualValue);
                             if (cumulativeWorkingLayersPair.containsKey(report.getDeptId())) {
                                 BigDecimal tempWorkingLayer = cumulativeWorkingLayersPair.get(report.getDeptId());
-                                cumulativeWorkingLayersPair.put(report.getDeptId(), tempTotalCumulativeWorkingLayers.add(tempWorkingLayer));
+                                cumulativeWorkingLayersPair.put(report.getTaskId(), tempTotalCumulativeWorkingLayers.add(tempWorkingLayer));
                             } else {
-                                cumulativeWorkingLayersPair.put(report.getDeptId(), tempTotalCumulativeWorkingLayers);
+                                cumulativeWorkingLayersPair.put(report.getTaskId(), tempTotalCumulativeWorkingLayers);
                             }
                         }
                         if ("台次".equals(unit) && "当日泵车台次".equals(attr.getName())) {
                             tempTotalPumpTrips = tempTotalPumpTrips.add(actualValue);
                             if (pumpTripsPair.containsKey(report.getDeptId())) {
                                 BigDecimal tempPumpTrips = pumpTripsPair.get(report.getDeptId());
-                                pumpTripsPair.put(report.getDeptId(), tempTotalPumpTrips.add(tempPumpTrips));
+                                pumpTripsPair.put(report.getTaskId(), tempTotalPumpTrips.add(tempPumpTrips));
                             } else {
-                                pumpTripsPair.put(report.getDeptId(), tempTotalPumpTrips);
+                                pumpTripsPair.put(report.getTaskId(), tempTotalPumpTrips);
                             }
                         }
-                        if ("台次".equals(unit) && ("当日仪表".equals(attr.getName()) || "当日混砂".equals(attr.getName()))) {
+                        if ("台次".equals(unit) && ("当日仪表/混砂".equals(attr.getName()))) {
                             tempTotalMixSand = tempTotalMixSand.add(actualValue);
                             if (mixSandPair.containsKey(report.getDeptId())) {
                                 BigDecimal tempMixSand = mixSandPair.get(report.getDeptId());
-                                mixSandPair.put(report.getDeptId(), tempTotalMixSand.add(tempMixSand));
+                                mixSandPair.put(report.getTaskId(), tempTotalMixSand.add(tempMixSand));
                             } else {
-                                mixSandPair.put(report.getDeptId(), tempTotalMixSand);
+                                mixSandPair.put(report.getTaskId(), tempTotalMixSand);
                             }
                         }
                     }
@@ -440,60 +477,60 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
                         uniqueReport.setWorkloadDesign(taskWorkloadPair.get(taskId));
                     }
                     // 以队伍为维度 设置每种施工工艺的工作量 总和
-                    if (bridgePlugPair.containsKey(deptId)) {
+                    if (bridgePlugPair.containsKey(taskId)) {
                         // 钻可溶桥塞  钻复合桥塞
                         IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
                         item.setUnit("个数");
-                        item.setWorkload(bridgePlugPair.get(deptId));
+                        item.setWorkload(bridgePlugPair.get(taskId));
                         items.add(item);
                     }
-                    if (runCountPair.containsKey(deptId)) {
+                    if (runCountPair.containsKey(taskId)) {
                         // 通刮洗  冲砂
                         IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
                         item.setUnit("趟数");
-                        item.setWorkload(runCountPair.get(deptId));
+                        item.setWorkload(runCountPair.get(taskId));
                         items.add(item);
                     }
-                    if (hourCountPair.containsKey(deptId)) {
+                    if (hourCountPair.containsKey(taskId)) {
                         // 液氮泵车(时间D)  千型泵车(时间H)
                         IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
                         item.setUnit("小时");
-                        item.setWorkload(hourCountPair.get(deptId));
+                        item.setWorkload(hourCountPair.get(taskId));
                         items.add(item);
                     }
-                    if (waterVolumePair.containsKey(deptId)) {
+                    if (waterVolumePair.containsKey(taskId)) {
                         // 注水
                         IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
                         item.setUnit("方");
-                        item.setWorkload(waterVolumePair.get(deptId));
+                        item.setWorkload(waterVolumePair.get(taskId));
                         items.add(item);
                     }
-                    if (cumulativeWorkingWellPair.containsKey(deptId)) {
+                    if (cumulativeWorkingWellPair.containsKey(taskId)) {
                         // 连续油管常规作业
                         IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
                         item.setUnit("井数");
-                        item.setWorkload(cumulativeWorkingWellPair.get(deptId));
+                        item.setWorkload(cumulativeWorkingWellPair.get(taskId));
                         items.add(item);
                     }
-                    if (cumulativeWorkingLayersPair.containsKey(deptId)) {
+                    if (cumulativeWorkingLayersPair.containsKey(taskId)) {
                         // 压裂大包 压裂总包
                         IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
                         item.setUnit("段数");
-                        item.setWorkload(cumulativeWorkingLayersPair.get(deptId));
+                        item.setWorkload(cumulativeWorkingLayersPair.get(taskId));
                         items.add(item);
                     }
-                    if (pumpTripsPair.containsKey(deptId)) {
+                    if (pumpTripsPair.containsKey(taskId)) {
                         // 主压裂车 当日泵车台次
                         IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
                         item.setUnit("台次");
-                        item.setWorkload(pumpTripsPair.get(deptId));
+                        item.setWorkload(pumpTripsPair.get(taskId));
                         items.add(item);
                     }
-                    if (mixSandPair.containsKey(deptId)) {
+                    if (mixSandPair.containsKey(taskId)) {
                         // 当日仪表/混砂 台次
                         IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
                         item.setUnit("台次");
-                        item.setWorkload(mixSandPair.get(deptId));
+                        item.setWorkload(mixSandPair.get(taskId));
                         items.add(item);
                     }
                     uniqueReport.setItems(items);
@@ -504,4 +541,14 @@ public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
         return result;
     }
 
+    @Override
+    public void saveBatch(List<IotRdDailyReportSaveReqVO> reports) {
+        if (CollUtil.isEmpty(reports)) {
+            throw exception(IOT_RD_DAILY_REPORT_NOT_EXISTS);
+        }
+        reports.forEach(report -> {
+            updateIotRdDailyReport(report);
+        });
+    }
+
 }

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/iotprojecttask/IotProjectTaskMapper.xml

@@ -41,6 +41,7 @@
         and a.project_id = b.id
         and a.deleted = 0
         and b.deleted = 0
+        and (a.platform_well = 0 or a.platform_well = 1)
         <if test="manufactureName != null  and manufactureName != ''">
         and b.manufacture_name like concat('%', #{manufactureName}, '%')
         </if>