瀏覽代碼

pms 瑞都日报

zhangcl 5 天之前
父節點
當前提交
967abc4925
共有 42 個文件被更改,包括 2862 次插入5 次删除
  1. 37 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/AttachmentCategoryEnum.java
  2. 34 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/AttachmentTypeEnum.java
  3. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportattrs/IotDailyReportAttrsController.java
  4. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportattrs/vo/IotDailyReportAttrsPageReqVO.java
  5. 2 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportattrs/vo/IotDailyReportAttrsRespVO.java
  6. 2 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportattrs/vo/IotDailyReportAttrsSaveReqVO.java
  7. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskPageReqVO.java
  8. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskRespVO.java
  9. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskSaveReqVO.java
  10. 425 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/IotRdDailyReportController.java
  11. 150 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportPageReqVO.java
  12. 264 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportRespVO.java
  13. 145 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportSaveReqVO.java
  14. 26 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportStatisticsItemVO.java
  15. 59 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreport/vo/IotRdDailyReportStatisticsRespVO.java
  16. 93 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreportitem/IotRdDailyReportItemController.java
  17. 61 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreportitem/vo/IotRdDailyReportItemPageReqVO.java
  18. 72 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreportitem/vo/IotRdDailyReportItemRespVO.java
  19. 51 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreportitem/vo/IotRdDailyReportItemSaveReqVO.java
  20. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/vo/IotRyDailyReportRespVO.java
  21. 6 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/vo/IotRyDailyReportSaveReqVO.java
  22. 5 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotdailyreportattrs/IotDailyReportAttrsDO.java
  23. 20 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttask/IotProjectTaskDO.java
  24. 207 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotrddailyreport/IotRdDailyReportDO.java
  25. 80 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotrddailyreportitem/IotRdDailyReportItemDO.java
  26. 8 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotrydailyreport/IotRyDailyReportDO.java
  27. 15 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotattachment/IotAttachmentMapper.java
  28. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdailyreportattrs/IotDailyReportAttrsMapper.java
  29. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotprojecttask/IotProjectTaskMapper.java
  30. 106 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrddailyreport/IotRdDailyReportMapper.java
  31. 36 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrddailyreportitem/IotRdDailyReportItemMapper.java
  32. 177 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/dailyreport/CreateRdDailyReportOrderJob.java
  33. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotattachment/IotAttachmentService.java
  34. 7 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotattachment/IotAttachmentServiceImpl.java
  35. 9 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdailyreportattrs/IotDailyReportAttrsService.java
  36. 7 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdailyreportattrs/IotDailyReportAttrsServiceImpl.java
  37. 85 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportService.java
  38. 464 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreport/IotRdDailyReportServiceImpl.java
  39. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreportitem/IotRdDailyReportItemService.java
  40. 71 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreportitem/IotRdDailyReportItemServiceImpl.java
  41. 8 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java
  42. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java

+ 37 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/AttachmentCategoryEnum.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.pms.enums;
+
+/**
+ * @description: 附件类别
+ * @author: ruiqi
+ * @create: 2025-10-20
+ **/
+public enum AttachmentCategoryEnum {
+    MAINTENANCE("MAINTENANCE", "保养", 1),
+    REPAIR("REPAIR", "维修", 2),
+    INSPECTION("INSPECTION", "巡检", 3),
+    OPERATION_RECORD("OPERATION_RECORD", "运行记录", 4),
+    DAILY_REPORT("DAILY_REPORT", "日报", 5),
+    QHSE("QHSE", "QHSE", 6);
+
+    private String code;
+    private String msg;
+    private Integer num;
+
+    AttachmentCategoryEnum(String code, String msg, Integer num) {
+        this.code = code;
+        this.msg = msg;
+        this.num = num;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+}

+ 34 - 0
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/AttachmentTypeEnum.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.pms.enums;
+
+/**
+ * @description: 附件 细分项
+ * @author: ruiqi
+ * @create: 2025-10-20
+ **/
+public enum AttachmentTypeEnum {
+    EXTERNAL_RENTAL("EXTERNAL_RENTAL", "外租设备", 1),
+    CONSTRUCTION_DESIGN("CONSTRUCTION_DESIGN", "施工设计", 2),
+    COMPLETION_REPORT("COMPLETION_REPORT", "完工报告", 3);
+
+    private String code;
+    private String msg;
+    private Integer num;
+
+    AttachmentTypeEnum(String code, String msg, Integer num) {
+        this.code = code;
+        this.msg = msg;
+        this.num = num;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public Integer getNum() {
+        return num;
+    }
+}

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportattrs/IotDailyReportAttrsController.java

@@ -77,6 +77,14 @@ public class IotDailyReportAttrsController {
         return success(BeanUtils.toBean(pageResult, IotDailyReportAttrsRespVO.class));
         return success(BeanUtils.toBean(pageResult, IotDailyReportAttrsRespVO.class));
     }
     }
 
 
+    @GetMapping("/dailyReportAttrs")
+    @Operation(summary = "获得日报扩展模板属性列表")
+    @PreAuthorize("@ss.hasPermission('rq:iot-daily-report-attrs:query')")
+    public CommonResult<List<IotDailyReportAttrsRespVO>> dailyReportAttrs(@Valid IotDailyReportAttrsPageReqVO pageReqVO) {
+        List<IotDailyReportAttrsDO> dailyReportAttrs = iotDailyReportAttrsService.getIotDailyReportAttrs(pageReqVO);
+        return success(BeanUtils.toBean(dailyReportAttrs, IotDailyReportAttrsRespVO.class));
+    }
+
     @GetMapping("/export-excel")
     @GetMapping("/export-excel")
     @Operation(summary = "导出日报扩展模板属性 Excel")
     @Operation(summary = "导出日报扩展模板属性 Excel")
     @PreAuthorize("@ss.hasPermission('rq:iot-daily-report-attrs:export')")
     @PreAuthorize("@ss.hasPermission('rq:iot-daily-report-attrs:export')")

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

@@ -8,6 +8,7 @@ import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.format.annotation.DateTimeFormat;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.List;
 
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
 
@@ -81,4 +82,9 @@ public class IotDailyReportAttrsPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
     private LocalDateTime[] createTime;
 
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "施工工艺id集合", example = "123,234")
+    private List<String> techniqueIds;
 }
 }

+ 2 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportattrs/vo/IotDailyReportAttrsRespVO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportattrs.vo;
 package cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportattrs.vo;
 
 
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -82,7 +83,7 @@ public class IotDailyReportAttrsRespVO {
 
 
     @Schema(description = "不同专业公司的扩展属性")
     @Schema(description = "不同专业公司的扩展属性")
     @ExcelProperty("不同专业公司的扩展属性")
     @ExcelProperty("不同专业公司的扩展属性")
-    private String extProperty;
+    private IotTaskAttrModelProperty extProperty;
 
 
     @Schema(description = "排序值")
     @Schema(description = "排序值")
     @ExcelProperty("排序值")
     @ExcelProperty("排序值")

+ 2 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotdailyreportattrs/vo/IotDailyReportAttrsSaveReqVO.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportattrs.vo;
 package cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportattrs.vo;
 
 
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
 
 
@@ -59,7 +60,7 @@ public class IotDailyReportAttrsSaveReqVO {
     private String minValue;
     private String minValue;
 
 
     @Schema(description = "不同专业公司的扩展属性")
     @Schema(description = "不同专业公司的扩展属性")
-    private String extProperty;
+    private IotTaskAttrModelProperty extProperty;
 
 
     @Schema(description = "排序值")
     @Schema(description = "排序值")
     private Integer sort;
     private Integer sort;

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

@@ -88,4 +88,7 @@ public class IotProjectTaskPageReqVO extends PageParam {
     @Schema(description = "搜索关键字")
     @Schema(description = "搜索关键字")
     private String searchKey;
     private String searchKey;
 
 
+    @Schema(description = "公司id")
+    private Long companyId;
+
 }
 }

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

@@ -51,6 +51,10 @@ public class IotProjectTaskRespVO {
     @ExcelProperty("责任人([123,234])")
     @ExcelProperty("责任人([123,234])")
     private Set<Long> responsiblePerson;
     private Set<Long> responsiblePerson;
 
 
+    @Schema(description = "工单填报人([123,234])")
+    @ExcelProperty("工单填报人([123,234])")
+    private Set<Long> submitter;
+
     @Schema(description = "设计工作量")
     @Schema(description = "设计工作量")
     @ExcelProperty("设计工作量")
     @ExcelProperty("设计工作量")
     private String workloadDesign;
     private String workloadDesign;

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

@@ -38,6 +38,9 @@ public class IotProjectTaskSaveReqVO {
     @Schema(description = "责任人([123,234])")
     @Schema(description = "责任人([123,234])")
     private Set<Long> responsiblePerson;
     private Set<Long> responsiblePerson;
 
 
+    @Schema(description = "工单填报人([123,234])")
+    private Set<Long> submitter;
+
     @Schema(description = "设计工作量")
     @Schema(description = "设计工作量")
     private String workloadDesign;
     private String workloadDesign;
 
 

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

@@ -0,0 +1,425 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+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.iotattachment.vo.IotAttachmentPageReqVO;
+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.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;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportStatisticsRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSimpleRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportattrs.IotDailyReportAttrsDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
+import cn.iocoder.yudao.module.pms.enums.AttachmentCategoryEnum;
+import cn.iocoder.yudao.module.pms.enums.AttachmentTypeEnum;
+import cn.iocoder.yudao.module.pms.service.IotDeviceService;
+import cn.iocoder.yudao.module.pms.service.iotattachment.IotAttachmentService;
+import cn.iocoder.yudao.module.pms.service.iotdailyreportattrs.IotDailyReportAttrsService;
+import cn.iocoder.yudao.module.pms.service.iotprojectinfo.IotProjectInfoService;
+import cn.iocoder.yudao.module.pms.service.iotprojecttask.IotProjectTaskService;
+import cn.iocoder.yudao.module.pms.service.iotrddailyreport.IotRdDailyReportService;
+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.service.dept.DeptService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+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 = "管理后台 - 瑞都日报")
+@RestController
+@RequestMapping("/pms/iot-rd-daily-report")
+@Validated
+public class IotRdDailyReportController {
+
+    @Resource
+    private IotRdDailyReportService iotRdDailyReportService;
+
+    @Resource
+    private IotProjectInfoService iotProjectInfoService;
+
+    @Resource
+    private IotProjectTaskService iotProjectTaskService;
+
+    @Resource
+    private DeptService deptService;
+
+    @Resource
+    private IotDeviceService iotDeviceService;
+
+    @Resource
+    private IotDailyReportAttrsService iotDailyReportAttrsService;
+
+    @Resource
+    private IotAttachmentService iotAttachmentService;
+
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建瑞都日报")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:create')")
+    public CommonResult<Long> createIotRdDailyReport(@Valid @RequestBody IotRdDailyReportSaveReqVO createReqVO) {
+        return success(iotRdDailyReportService.createIotRdDailyReport(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新瑞都日报")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:update')")
+    public CommonResult<Boolean> updateIotRdDailyReport(@Valid @RequestBody IotRdDailyReportSaveReqVO updateReqVO) {
+        iotRdDailyReportService.updateIotRdDailyReport(updateReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/approval")
+    @Operation(summary = "审批日报")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:update')")
+    public CommonResult<Boolean> approvalRdDailyReport(@Valid @RequestBody IotRdDailyReportSaveReqVO updateReqVO) {
+        iotRdDailyReportService.approvalRdDailyReport(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除瑞都日报")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:delete')")
+    public CommonResult<Boolean> deleteIotRdDailyReport(@RequestParam("id") Long id) {
+        iotRdDailyReportService.deleteIotRdDailyReport(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得瑞都日报")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:query')")
+    public CommonResult<IotRdDailyReportRespVO> getIotRdDailyReport(@RequestParam("id") Long id) {
+        IotRdDailyReportDO iotRdDailyReport = iotRdDailyReportService.getIotRdDailyReport(id);
+        // 查询日报相关的 项目 任务 施工工艺
+        return success(buildDailyReport(iotRdDailyReport));
+    }
+
+    /**
+     * 查询日报对应的项目 任务信息
+     * @param dailyReport
+     * @return
+     */
+    private IotRdDailyReportRespVO buildDailyReport(IotRdDailyReportDO dailyReport) {
+        IotRdDailyReportRespVO dailyReportVO = BeanUtils.toBean(dailyReport, IotRdDailyReportRespVO.class);
+        // 查询施工工艺集合
+        Set<Long> techniqueIds = dailyReportVO.getTechniqueIds();
+        // List<DictDataDO> techniques = dictDataService.getDictDataListByDictType("rq_iot_project_technology_rd");
+        if (CollUtil.isNotEmpty(techniqueIds)) {
+            Set<String> stringTechniqueIds = techniqueIds.stream()
+                    .map(lg -> lg.toString())
+                    .collect(Collectors.toSet());
+            IotDailyReportAttrsPageReqVO pageReqVO = new IotDailyReportAttrsPageReqVO();
+            pageReqVO.setTechniqueIds(new ArrayList<>(stringTechniqueIds));
+            List<IotDailyReportAttrsDO> attrs = iotDailyReportAttrsService.getIotDailyReportAttrs(pageReqVO);
+            dailyReportVO.setDailyReportAttrs(attrs);
+        }
+        // 查询日报对应的项目信息
+        if (ObjUtil.isNotEmpty(dailyReport.getProjectId())) {
+            IotProjectInfoDO project = iotProjectInfoService.getIotProjectInfo(dailyReport.getProjectId());
+            dailyReportVO.setContractName(project.getContractName());
+            dailyReportVO.setManufactureName(project.getManufactureName());
+            dailyReportVO.setCompanyId(project.getDeptId());
+        }
+        // 查询日报对应的任务信息
+        if (ObjUtil.isNotEmpty(dailyReport.getTaskId())) {
+            IotProjectTaskDO task = iotProjectTaskService.getIotProjectTask(dailyReport.getTaskId());
+            dailyReportVO.setTaskName(StrUtil.join("-", task.getWellName(), task.getLocation()));
+            dailyReportVO.setWellName(task.getWellName());
+            dailyReportVO.setLocation(task.getLocation());
+            Set<Long> deviceIds = task.getDeviceIds();
+            Set<Long> responsiblePersonIds = task.getResponsiblePerson();
+            if (CollUtil.isNotEmpty(deviceIds)) {
+                // 查询设备id集合对应的设备详情
+                List<IotDeviceRespVO> devices = iotDeviceService.getDeviceList(deviceIds);
+                if (CollUtil.isNotEmpty(devices)) {
+                    String deviceNames = devices.stream()
+                            .map(IotDeviceRespVO::getDeviceName) // 提取每个设备的deviceName
+                            .collect(Collectors.joining(","));   // 用逗号拼接所有名称
+                    dailyReportVO.setDeviceNames(deviceNames);
+                }
+                // 查询设备id集合关联的设备列表
+                IotDevicePageReqVO deviceReqVO = new IotDevicePageReqVO();
+                deviceReqVO.setDeviceIds(new ArrayList<>(deviceIds));
+                List<IotDeviceDO> selectedDevices = iotDeviceService.getDevicesByDepts(deviceReqVO);
+                List<IotDeviceSimpleRespVO> simpleDevices = BeanUtils.toBean(selectedDevices, IotDeviceSimpleRespVO.class);
+                dailyReportVO.setSelectedDevices(simpleDevices);
+            }
+            if (CollUtil.isNotEmpty(responsiblePersonIds)) {
+                List<AdminUserRespDTO> users = adminUserApi.getUserList(responsiblePersonIds);
+                String userNames = users.stream()
+                        .map(AdminUserRespDTO::getNickname) // 提取每个员工的nickName
+                        .collect(Collectors.joining(","));   // 用逗号拼接所有名称
+                dailyReportVO.setResponsiblePersonNames(userNames);
+            }
+        }
+        // 查询当前日报关联的附件信息
+        IotAttachmentPageReqVO reqVO = new IotAttachmentPageReqVO();
+        reqVO.setBizId(dailyReport.getId());
+        reqVO.setCategory(AttachmentCategoryEnum.DAILY_REPORT.getCode());
+        reqVO.setType(AttachmentTypeEnum.EXTERNAL_RENTAL.getCode());
+        List<IotAttachmentDO> attachments = iotAttachmentService.getIotAttachments(reqVO);
+        if (CollUtil.isNotEmpty(attachments)) {
+            dailyReportVO.setAttachments(attachments);
+        }
+        // 查询日报对应的部门信息
+        if (ObjUtil.isNotEmpty(dailyReport.getDeptId())) {
+            DeptDO dept = deptService.getDept(dailyReport.getDeptId());
+            dailyReportVO.setDeptName(dept.getName());
+        }
+
+        return dailyReportVO;
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得瑞都日报分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:query')")
+    public CommonResult<PageResult<IotRdDailyReportRespVO>> getIotRdDailyReportPage(@Valid IotRdDailyReportPageReqVO pageReqVO) {
+        PageResult<IotRdDailyReportDO> pageResult = iotRdDailyReportService.getIotRdDailyReportPage(pageReqVO);
+        // 设置日报的关联信息 部门(施工队伍) 项目 任务 带班干部 日报填报人
+        return success(new PageResult<>(buildDailyReportList(pageResult.getList()), pageResult.getTotal()));
+    }
+
+    @GetMapping("/statistics")
+    @Operation(summary = "瑞都日报 统计")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:query')")
+    public CommonResult<List<IotRdDailyReportStatisticsRespVO>> statistics(@Valid IotRdDailyReportPageReqVO pageReqVO) {
+        List<IotRdDailyReportStatisticsRespVO> result = iotRdDailyReportService.statistics(pageReqVO);
+        // 瑞都日报 按照项目部统计
+        List<IotRdDailyReportStatisticsRespVO> projectReports = new ArrayList<>();
+        return success(result);
+    }
+
+    /**
+     * 设置日报的关联信息 部门(施工队伍) 项目 任务 带班干部 日报填报人
+     * @param reports
+     * @return
+     */
+    private List<IotRdDailyReportRespVO> buildDailyReportList(List<IotRdDailyReportDO> reports) {
+        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任务井号-施工区域
+        Map<Long, String> taskPair = new HashMap<>();
+        //  key任务id     value任务关联的带班干部名称
+        Map<Long, String> taskResponsiblePair = new HashMap<>();
+        //  key任务id     value任务关联的填报人名称
+        Map<Long, String> taskSubmitterPair = new HashMap<>();
+        //  key任务id     value工作量数据集合
+        Map<Long, List<IotTaskAttrModelProperty>> taskWorkloadPair = new HashMap<>();
+        Set<Long> userIds = new HashSet<>();
+        DataPermissionUtils.executeIgnore(() -> {
+            // 查询日报关联的项目信息
+            IotProjectInfoPageReqVO reqVO = new IotProjectInfoPageReqVO();
+            reqVO.setProjectIds(convertList(reports, IotRdDailyReportDO::getProjectId));
+            List<IotProjectInfoDO> projects = iotProjectInfoService.getIotProjectInfos(reqVO);
+            if (CollUtil.isNotEmpty(projects)) {
+                projects.forEach(project -> {
+                    projectPair.put(project.getId(), project.getContractName());
+                });
+            }
+            // 查询日报关联的任务信息
+            IotProjectTaskPageReqVO taskReqVO = new IotProjectTaskPageReqVO();
+            taskReqVO.setTaskIds(convertList(reports, IotRdDailyReportDO::getTaskId));
+            List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(taskReqVO);
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    Set<Long> personIds = task.getResponsiblePerson();
+                    Set<Long> submitterIds = task.getSubmitter();
+                    taskPair.put(task.getId(), task.getWellName());
+                    userIds.addAll(Optional.ofNullable(personIds).orElse(Collections.emptySet()));
+                    userIds.addAll(Optional.ofNullable(submitterIds).orElse(Collections.emptySet()));
+                    // 获取所有任务的工作量数据
+                    List<IotTaskAttrModelProperty> extProperties = task.getExtProperty();
+                    taskWorkloadPair.put(task.getId(), extProperties);
+                });
+            }
+            // 查询所有 带班干部 填报人 的姓名
+            Map<Long, AdminUserRespDTO> userMap;
+            if (CollUtil.isNotEmpty(userIds)) {
+                userMap = adminUserApi.getUserMap(userIds);
+            } else {
+                userMap = Collections.emptyMap();
+            }
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    // 安全获取带班干部ID集合(避免null)
+                    Set<Long> responsibleIds = Optional.ofNullable(task.getResponsiblePerson())
+                            .orElse(Collections.emptySet());
+                    // 转换ID集合为姓名字符串(用逗号分隔)
+                    String responsibleNames = responsibleIds.stream()
+                            // 映射ID到姓名(用户不存在时用空字符串)
+                            .map(userId -> Optional.ofNullable(userMap.get(userId))
+                                    .map(AdminUserRespDTO::getNickname)
+                                    .orElse(""))
+                            // 过滤空字符串(避免多余逗号)
+                            .filter(name -> !name.isEmpty())
+                            // 拼接姓名
+                            .collect(Collectors.joining(","));
+                    // 存入映射关系
+                    taskResponsiblePair.put(task.getId(), responsibleNames);
+                    // 工单填报人
+                    Set<Long> submitterIds = Optional.ofNullable(task.getSubmitter())
+                            .orElse(Collections.emptySet());
+                    // 转换ID集合为姓名字符串(用逗号分隔)
+                    String submitterNames = submitterIds.stream()
+                            // 映射ID到姓名(用户不存在时用空字符串)
+                            .map(userId -> Optional.ofNullable(userMap.get(userId))
+                                    .map(AdminUserRespDTO::getNickname)
+                                    .orElse(""))
+                            // 过滤空字符串(避免多余逗号)
+                            .filter(name -> !name.isEmpty())
+                            // 拼接姓名
+                            .collect(Collectors.joining(","));
+                    // 存入映射关系
+                    taskSubmitterPair.put(task.getId(), submitterNames);
+                });
+            }
+            // 查询所有任务的工作量数据 单位相同的工作量属性值合并处理
+            for (IotRdDailyReportDO report : reports) {
+                // 设置每个任务的工作量数据  单位相同的工作量值作合并处理
+                List<IotTaskAttrModelProperty> taskAttrs = report.getExtProperty();
+                // 这里暂时使用枚举 统计每个单位下的 工作量
+                // 桥塞(个数)      钻可溶桥塞  钻复合桥塞           bridge_plug
+                // 趟数           通刮洗 冲砂                    run_count
+                // 井数           累计施工-井                    cumulative_working_well
+                // 小时H                                       hour_count
+                // 天数D
+                // 水方量(方)                                   water_volume
+                // 台次           当日泵车台次 当日仪表/混砂        daily_tools_sand   daily_pump_trips
+                // 段数           累计施工-层                    cumulative_working_layers
+                // 暂存不同单位的工作量属性值
+                BigDecimal tempTotalBridgePlug = BigDecimal.ZERO;
+                BigDecimal tempTotalRunCount = BigDecimal.ZERO;
+                BigDecimal tempTotalCumulativeWorkingWell = BigDecimal.ZERO;
+                BigDecimal tempTotalHourCount = BigDecimal.ZERO;
+                BigDecimal tempTotalWaterVolume = BigDecimal.ZERO;
+                BigDecimal tempTotalPumpTrips = BigDecimal.ZERO;
+                BigDecimal tempTotalCumulativeWorkingLayers = BigDecimal.ZERO;
+                BigDecimal tempTotalMixSand = BigDecimal.ZERO;
+                if (CollUtil.isNotEmpty(taskAttrs)) {
+                    for (IotTaskAttrModelProperty attr : taskAttrs) {
+                        String unit = attr.getUnit();   // 工作量单位
+                        String actualValueStr = attr.getActualValue();  // 工作量属性的实际值
+                        // 处理实际值:避免null或非数字字符串导致的异常
+                        BigDecimal actualValue = BigDecimal.ZERO;
+                        if (StrUtil.isNotBlank(actualValueStr)) {  // 假设使用Hutool的StrUtil,或自行判断null/空
+                            try {
+                                actualValue = new BigDecimal(actualValueStr);
+                            } catch (NumberFormatException e) {
+                                // 若字符串格式错误,默认按0处理(可根据业务调整)
+                                actualValue = BigDecimal.ZERO;
+                            }
+                        }
+                        if ("个数".equals(unit)) {
+                            // 钻可溶桥塞  钻复合桥塞
+                            tempTotalBridgePlug = tempTotalBridgePlug.add(actualValue);
+                        }
+                        if ("趟数".equals(unit)) {
+                            tempTotalRunCount = tempTotalRunCount.add(actualValue);
+                        }
+                        if ("小时".equals(unit)) {
+                            tempTotalHourCount = tempTotalHourCount.add(actualValue);
+                        }
+                        if ("天数".equals(unit)) {
+                            // 将 actualValue 换算成 H
+                            BigDecimal hours = actualValue.multiply(new BigDecimal("24"));
+                            tempTotalHourCount = tempTotalHourCount.add(hours);
+                        }
+                        if ("方".equals(unit)) {
+                            tempTotalWaterVolume = tempTotalWaterVolume.add(actualValue);
+                        }
+                        if ("井数".equals(unit)) {
+                            tempTotalCumulativeWorkingWell = tempTotalCumulativeWorkingWell.add(actualValue);
+                        }
+                        if ("段数".equals(unit)) {
+                            tempTotalCumulativeWorkingLayers = tempTotalCumulativeWorkingLayers.add(actualValue);
+                        }
+                        if ("台次".equals(unit) && "当日泵车台次".equals(attr.getName())) {
+                            tempTotalPumpTrips = tempTotalPumpTrips.add(actualValue);
+                        }
+                        if ("台次".equals(unit) && ("当日仪表".equals(attr.getName()) || "当日混砂".equals(attr.getName()))) {
+                            tempTotalMixSand = tempTotalMixSand.add(actualValue);
+                        }
+                    }
+                    report.setCumulativeWorkingWell(tempTotalCumulativeWorkingWell);
+                    report.setCumulativeWorkingLayers(tempTotalCumulativeWorkingLayers);
+                    report.setDailyPumpTrips(tempTotalPumpTrips);
+                    report.setDailyToolsSand(tempTotalMixSand);
+                    report.setRunCount(tempTotalRunCount);
+                    report.setBridgePlug(tempTotalBridgePlug);
+                    report.setWaterVolume(tempTotalWaterVolume);
+                    report.setHourCount(tempTotalHourCount);
+                }
+            }
+        });
+        return BeanUtils.toBean(reports, IotRdDailyReportRespVO.class, (reportVO) -> {
+            // 部门信息
+            findAndThen(deptMap, reportVO.getDeptId(), dept -> reportVO.setDeptName(dept.getName()));
+            // 日报关联的项目信息
+            findAndThen(projectPair, reportVO.getProjectId(), contractName -> reportVO.setContractName(contractName));
+            // 日报关联的任务信息
+            findAndThen(taskPair, reportVO.getTaskId(), taskName -> reportVO.setTaskName(taskName));
+            // 日报关联的责任人
+            findAndThen(taskResponsiblePair, reportVO.getTaskId(), responsibleNames -> reportVO.setResponsiblePersonNames(responsibleNames));
+            // 日报关联的填报人
+            findAndThen(taskSubmitterPair, reportVO.getTaskId(), submitterNames -> reportVO.setSubmitterNames(submitterNames));
+        });
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出瑞都日报 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotRdDailyReportExcel(@Valid IotRdDailyReportPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotRdDailyReportDO> list = iotRdDailyReportService.getIotRdDailyReportPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "瑞都日报.xls", "数据", IotRdDailyReportRespVO.class,
+                        BeanUtils.toBean(list, IotRdDailyReportRespVO.class));
+    }
+
+}

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

@@ -0,0 +1,150 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 瑞都日报分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotRdDailyReportPageReqVO extends PageParam {
+
+    @Schema(description = "施工队伍id", example = "22577")
+    private Long deptId;
+
+    @Schema(description = "日报名称", example = "西南压裂项目部/2025-10-17日报填报")
+    private String reportName;
+
+    @Schema(description = "项目id", example = "32587")
+    private Long projectId;
+
+    @Schema(description = "任务id", example = "15678")
+    private Long taskId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂... )")
+    private String projectClassification;
+
+    @Schema(description = "施工工艺([123,233])")
+    private String techniqueIds;
+
+    @Schema(description = "施工设备([123,233])")
+    private String deviceIds;
+
+    @Schema(description = "时间节点-开始")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] startTime;
+
+    @Schema(description = "时间节点-结束")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] endTime;
+
+    @Schema(description = "累计施工井")
+    private BigDecimal cumulativeWorkingWell;
+
+    @Schema(description = "累计施工层")
+    private BigDecimal cumulativeWorkingLayers;
+
+    @Schema(description = "当日泵车台次")
+    private BigDecimal dailyPumpTrips;
+
+    @Schema(description = "当日仪表/混砂")
+    private BigDecimal dailyToolsSand;
+
+    @Schema(description = "趟数", example = "29453")
+    private BigDecimal runCount;
+
+    @Schema(description = "桥塞")
+    private BigDecimal bridgePlug;
+
+    @Schema(description = "水方量")
+    private BigDecimal waterVolume;
+
+    @Schema(description = "时间H", example = "5062")
+    private BigDecimal hourCount;
+
+    @Schema(description = "当日油耗(吨)")
+    private BigDecimal dailyFuel;
+
+    @Schema(description = "当日用电量(kWh)")
+    private BigDecimal dailyPowerUsage;
+
+    @Schema(description = "生产时间(H)")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private BigDecimal[] productionTime;
+
+    @Schema(description = "非生产时间(H)")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private BigDecimal[] nonProductionTime;
+
+    @Schema(description = "非生产时间原因", example = "不喜欢")
+    private String rdNptReason;
+
+    @Schema(description = "施工开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] constructionStartDate;
+
+    @Schema(description = "施工结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] constructionEndDate;
+
+    @Schema(description = "当日生产情况生产动态", example = "2")
+    private String productionStatus;
+
+    @Schema(description = "外租情况(可能有附件)")
+    private String externalRental;
+
+    @Schema(description = "下步工作计划")
+    private String nextPlan;
+
+    @Schema(description = "施工状态(动迁上井/动迁下井/施工准备/施工...)", example = "1")
+    private String rdStatus;
+
+    @Schema(description = "故障情况")
+    private String malfunction;
+
+    @Schema(description = "故障误工h")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private BigDecimal[] faultDowntime;
+
+    @Schema(description = "人员情况")
+    private String personnel;
+
+    @Schema(description = "全员数量")
+    private BigDecimal totalStaffNum;
+
+    @Schema(description = "休假人员数量")
+    private BigDecimal leaveStaffNum;
+
+    @Schema(description = "不同专业公司的扩展属性值")
+    private String extProperty;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "随便")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "2")
+    private Integer status;
+
+    @Schema(description = "流程实例id", example = "16415")
+    private String processInstanceId;
+
+    @Schema(description = "审批状态 未提交、审批中、审批通过、审批不通过、已取消", example = "1")
+    private Integer auditStatus;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

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

@@ -0,0 +1,264 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
+
+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;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.List;
+import java.util.Set;
+
+@Schema(description = "管理后台 - 瑞都日报 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotRdDailyReportRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13853")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "施工队伍id", example = "22577")
+    @ExcelProperty("施工队伍id")
+    private Long deptId;
+
+    @Schema(description = "日报名称", example = "西南压裂项目部/2025-10-17日报填报")
+    @ExcelProperty("日报名称")
+    private String reportName;
+
+    @Schema(description = "项目id", example = "32587")
+    @ExcelProperty("项目id")
+    private Long projectId;
+
+    @Schema(description = "任务id", example = "15678")
+    @ExcelProperty("任务id")
+    private Long taskId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂... )")
+    @ExcelProperty("项目类别(钻井 修井 注氮 酸化压裂... )")
+    private String projectClassification;
+
+    @Schema(description = "施工工艺([123,233])")
+    @ExcelProperty("施工工艺([123,233])")
+    private Set<Long> techniqueIds;
+
+    @Schema(description = "施工设备([123,233])")
+    @ExcelProperty("施工设备([123,233])")
+    private Set<Long> deviceIds;
+
+    @Schema(description = "时间节点-开始")
+    @ExcelProperty("时间节点-开始")
+    private LocalTime startTime;
+
+    @Schema(description = "时间节点-结束")
+    @ExcelProperty("时间节点-结束")
+    private LocalTime endTime;
+
+    @Schema(description = "累计施工井")
+    @ExcelProperty("累计施工井")
+    private BigDecimal cumulativeWorkingWell;
+
+    @Schema(description = "累计施工层")
+    @ExcelProperty("累计施工层")
+    private BigDecimal cumulativeWorkingLayers;
+
+    @Schema(description = "当日泵车台次")
+    @ExcelProperty("当日泵车台次")
+    private BigDecimal dailyPumpTrips;
+
+    @Schema(description = "当日仪表/混砂")
+    @ExcelProperty("当日仪表/混砂")
+    private BigDecimal dailyToolsSand;
+
+    @Schema(description = "趟数", example = "29453")
+    @ExcelProperty("趟数")
+    private BigDecimal runCount;
+
+    @Schema(description = "桥塞")
+    @ExcelProperty("桥塞")
+    private BigDecimal bridgePlug;
+
+    @Schema(description = "水方量")
+    @ExcelProperty("水方量")
+    private BigDecimal waterVolume;
+
+    @Schema(description = "时间H", example = "5062")
+    @ExcelProperty("时间H")
+    private BigDecimal hourCount;
+
+    @Schema(description = "当日油耗(吨)")
+    @ExcelProperty("当日油耗(吨)")
+    private BigDecimal dailyFuel;
+
+    @Schema(description = "当日用电量(kWh)")
+    @ExcelProperty("当日用电量(kWh)")
+    private BigDecimal dailyPowerUsage;
+
+    @Schema(description = "生产时间(H)")
+    @ExcelProperty("生产时间(H)")
+    private BigDecimal productionTime;
+
+    @Schema(description = "非生产时间(H)")
+    @ExcelProperty("非生产时间(H)")
+    private BigDecimal nonProductionTime;
+
+    @Schema(description = "非生产时间原因", example = "不喜欢")
+    @ExcelProperty("非生产时间原因")
+    private String rdNptReason;
+
+    @Schema(description = "施工开始日期")
+    @ExcelProperty("施工开始日期")
+    private LocalDateTime constructionStartDate;
+
+    @Schema(description = "施工结束日期")
+    @ExcelProperty("施工结束日期")
+    private LocalDateTime constructionEndDate;
+
+    @Schema(description = "当日生产情况生产动态", example = "2")
+    @ExcelProperty("当日生产情况生产动态")
+    private String productionStatus;
+
+    @Schema(description = "外租情况(可能有附件)")
+    @ExcelProperty("外租情况(可能有附件)")
+    private String externalRental;
+
+    @Schema(description = "下步工作计划")
+    @ExcelProperty("下步工作计划")
+    private String nextPlan;
+
+    @Schema(description = "施工状态(动迁上井/动迁下井/施工准备/施工...)", example = "1")
+    @ExcelProperty("施工状态(动迁上井/动迁下井/施工准备/施工...)")
+    private String rdStatus;
+
+    @Schema(description = "故障情况")
+    @ExcelProperty("故障情况")
+    private String malfunction;
+
+    @Schema(description = "故障误工h")
+    @ExcelProperty("故障误工h")
+    private BigDecimal faultDowntime;
+
+    @Schema(description = "人员情况")
+    @ExcelProperty("人员情况")
+    private String personnel;
+
+    @Schema(description = "全员数量")
+    @ExcelProperty("全员数量")
+    private BigDecimal totalStaffNum;
+
+    @Schema(description = "休假人员数量")
+    @ExcelProperty("休假人员数量")
+    private BigDecimal leaveStaffNum;
+
+    @Schema(description = "不同专业公司的扩展属性值")
+    @ExcelProperty("不同专业公司的扩展属性值")
+    private List<IotTaskAttrModelProperty> extProperty;
+
+    @Schema(description = "排序值")
+    @ExcelProperty("排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "随便")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "2")
+    @ExcelProperty("状态(0启用 1禁用)")
+    private Integer status;
+
+    @Schema(description = "流程实例id", example = "16415")
+    @ExcelProperty("流程实例id")
+    private String processInstanceId;
+
+    @Schema(description = "审批状态 未提交、审批中、审批通过、审批不通过、已取消", example = "1")
+    @ExcelProperty("审批状态 未提交、审批中、审批通过、审批不通过、已取消")
+    private Integer auditStatus;
+
+    @Schema(description = "审批意见", example = "审核通过")
+    @ExcelProperty("审批意见")
+    private String opinion;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "日报填写时间")
+    @ExcelProperty("日报填写时间")
+    private LocalDateTime fillTime;
+
+    @Schema(description = "审批时间")
+    @ExcelProperty("审批时间")
+    private LocalDateTime approvalTime;
+
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "时间节点区域 startTime-endTime", example = "8:00 - 8:00")
+    @ExcelProperty("时间节点区域")
+    private String timeRange;
+
+    @Schema(description = "部门名称", example = "压裂二队")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
+    @Schema(description = "合同/项目名称", example = "酸化压裂合同")
+    @ExcelProperty("合同/项目名称")
+    private String contractName;
+
+    @Schema(description = "任务名称", example = "YS45-211平台-山西兴县")
+    @ExcelProperty("任务名称")
+    private String taskName;
+
+    @Schema(description = "井号", example = "YS45-211平台")
+    @ExcelProperty("井号")
+    private String wellName;
+
+    @Schema(description = "施工地点", example = "山西兴县")
+    @ExcelProperty("施工地点")
+    private String location;
+
+    @Schema(description = "客户名称", example = "YS45-211平台-山西兴县")
+    @ExcelProperty("客户名称")
+    private String manufactureName;
+
+    @Schema(description = "施工工艺(多个逗号分隔)", example = "压裂大包,主压裂车...")
+    @ExcelProperty("施工工艺(多个逗号分隔)")
+    private String techniqueNames;
+
+    @Schema(description = "设备配置", example = "黑EN9500,黑EN7958...")
+    @ExcelProperty("设备配置")
+    private String deviceNames;
+
+    @Schema(description = "带班干部姓名", example = "张三,李四...")
+    @ExcelProperty("带班干部")
+    private String responsiblePersonNames;
+
+    @Schema(description = "填报人姓名", example = "张三,李四...")
+    @ExcelProperty("填报人姓名")
+    private String submitterNames;
+
+    @Schema(description = "公司id", example = "125")
+    @ExcelProperty("公司id")
+    private Long companyId;
+
+    @Schema(description = "工作量属性", example = "累计施工-层,当日泵车台次...")
+    @ExcelProperty("工作量属性")
+    private List<IotDailyReportAttrsDO> dailyReportAttrs;
+
+    /**
+     * 扩展属性
+     */
+    @Schema(description = "附件列表", example = "https://aims.deepoil.cc/admin-api/infra/file/29/get/人力资源.png")
+    @ExcelProperty("附件列表")
+    private List<IotAttachmentDO> attachments;
+
+    @Schema(description = "施工设备列表", example = "https://aims.deepoil.cc/admin-api/infra/file/29/get/人力资源.png")
+    @ExcelProperty("施工设备列表")
+    private List<IotDeviceSimpleRespVO> selectedDevices;
+}

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

@@ -0,0 +1,145 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotattachment.vo.IotAttachmentSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Set;
+
+@Schema(description = "管理后台 - 瑞都日报新增/修改 Request VO")
+@Data
+public class IotRdDailyReportSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13853")
+    private Long id;
+
+    @Schema(description = "施工队伍id", example = "22577")
+    private Long deptId;
+
+    @Schema(description = "日报名称", example = "西南压裂项目部/2025-10-17日报填报")
+    private String reportName;
+
+    @Schema(description = "项目id", example = "32587")
+    private Long projectId;
+
+    @Schema(description = "任务id", example = "15678")
+    private Long taskId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂... )")
+    private String projectClassification;
+
+    @Schema(description = "施工工艺([123,233])")
+    private Set<Long> techniqueIds;
+
+    @Schema(description = "施工设备([123,233])")
+    private Set<Long> deviceIds;
+
+    @Schema(description = "时间节点-开始")
+    private String startTime;
+
+    @Schema(description = "时间节点-结束")
+    private String endTime;
+
+    @Schema(description = "累计施工井")
+    private BigDecimal cumulativeWorkingWell;
+
+    @Schema(description = "累计施工层")
+    private BigDecimal cumulativeWorkingLayers;
+
+    @Schema(description = "当日泵车台次")
+    private BigDecimal dailyPumpTrips;
+
+    @Schema(description = "当日仪表/混砂")
+    private BigDecimal dailyToolsSand;
+
+    @Schema(description = "趟数", example = "29453")
+    private BigDecimal runCount;
+
+    @Schema(description = "桥塞")
+    private BigDecimal bridgePlug;
+
+    @Schema(description = "水方量")
+    private BigDecimal waterVolume;
+
+    @Schema(description = "时间H", example = "5062")
+    private BigDecimal hourCount;
+
+    @Schema(description = "当日油耗(吨)")
+    private BigDecimal dailyFuel;
+
+    @Schema(description = "当日用电量(kWh)")
+    private BigDecimal dailyPowerUsage;
+
+    @Schema(description = "生产时间(H)")
+    private BigDecimal productionTime;
+
+    @Schema(description = "非生产时间(H)")
+    private BigDecimal nonProductionTime;
+
+    @Schema(description = "非生产时间原因", example = "不喜欢")
+    private String rdNptReason;
+
+    @Schema(description = "施工开始日期")
+    private LocalDateTime constructionStartDate;
+
+    @Schema(description = "施工结束日期")
+    private LocalDateTime constructionEndDate;
+
+    @Schema(description = "当日生产情况生产动态", example = "2")
+    private String productionStatus;
+
+    @Schema(description = "外租情况(可能有附件)")
+    private String externalRental;
+
+    @Schema(description = "下步工作计划")
+    private String nextPlan;
+
+    @Schema(description = "施工状态(动迁上井/动迁下井/施工准备/施工...)", example = "1")
+    private String rdStatus;
+
+    @Schema(description = "故障情况")
+    private String malfunction;
+
+    @Schema(description = "故障误工h")
+    private BigDecimal faultDowntime;
+
+    @Schema(description = "人员情况")
+    private String personnel;
+
+    @Schema(description = "全员数量")
+    private BigDecimal totalStaffNum;
+
+    @Schema(description = "休假人员数量")
+    private BigDecimal leaveStaffNum;
+
+    @Schema(description = "不同专业公司的扩展属性值")
+    private List<IotTaskAttrModelProperty> extProperty;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "随便")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "2")
+    private Integer status;
+
+    @Schema(description = "流程实例id", example = "16415")
+    private String processInstanceId;
+
+    @Schema(description = "审批状态 未提交0、审批中10、审批通过20、审批不通过30、已取消40", example = "1")
+    private Integer auditStatus;
+
+    @Schema(description = "审批意见", example = "审核通过")
+    private String opinion;
+
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "附件列表")
+    private List<IotAttachmentSaveReqVO> attachments;
+}

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

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 瑞都日报 统计 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotRdDailyReportStatisticsItemVO {
+
+    @Schema(description = "施工工艺名称", example = "压裂大包")
+    @ExcelProperty("施工工艺名称")
+    private String technique;
+
+    @Schema(description = "工作量", example = "2")
+    @ExcelProperty("工作量")
+    private BigDecimal workload;
+
+    @Schema(description = "单位")
+    @ExcelProperty("单位")
+    private String unit;
+}

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

@@ -0,0 +1,59 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Schema(description = "管理后台 - 瑞都日报 统计 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotRdDailyReportStatisticsRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13853")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "项目部id", example = "125")
+    @ExcelProperty("项目部id")
+    private Long deptId;
+
+    @Schema(description = "项目部名称", example = "西南压裂项目部")
+    @ExcelProperty("项目部名称")
+    private String projectDeptName;
+
+    @Schema(description = "队伍名称", example = "压裂二队")
+    @ExcelProperty("队伍名称")
+    private String deptName;
+
+    @Schema(description = "任务id", example = "15678")
+    @ExcelProperty("任务id")
+    private Long taskId;
+
+    @Schema(description = "甲方")
+    @ExcelProperty("甲方")
+    private String manufactureName;
+
+    @Schema(description = "井号")
+    @ExcelProperty("井号")
+    private String wellName;
+
+    @Schema(description = "施工工艺 多个逗号分隔")
+    @ExcelProperty("施工工艺")
+    private String techniques;
+
+    @Schema(description = "总工作量")
+    @ExcelProperty("总工作量")
+    private BigDecimal workloadDesign;
+
+    @Schema(description = "已完成工作量")
+    @ExcelProperty("已完成工作量")
+    private BigDecimal finishedWorkload;
+
+    @Schema(description = "工作量明细")
+    @ExcelProperty("工作量明细")
+    private List<IotRdDailyReportStatisticsItemVO> items;
+}

+ 93 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreportitem/IotRdDailyReportItemController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo.IotRdDailyReportItemPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo.IotRdDailyReportItemRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo.IotRdDailyReportItemSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreportitem.IotRdDailyReportItemDO;
+import cn.iocoder.yudao.module.pms.service.iotrddailyreportitem.IotRdDailyReportItemService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 瑞都日报 (工作量)明细")
+@RestController
+@RequestMapping("/pms/iot-rd-daily-report-item")
+@Validated
+public class IotRdDailyReportItemController {
+
+    @Resource
+    private IotRdDailyReportItemService iotRdDailyReportItemService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建瑞都日报 (工作量)明细")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report-item:create')")
+    public CommonResult<Long> createIotRdDailyReportItem(@Valid @RequestBody IotRdDailyReportItemSaveReqVO createReqVO) {
+        return success(iotRdDailyReportItemService.createIotRdDailyReportItem(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新瑞都日报 (工作量)明细")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report-item:update')")
+    public CommonResult<Boolean> updateIotRdDailyReportItem(@Valid @RequestBody IotRdDailyReportItemSaveReqVO updateReqVO) {
+        iotRdDailyReportItemService.updateIotRdDailyReportItem(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除瑞都日报 (工作量)明细")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report-item:delete')")
+    public CommonResult<Boolean> deleteIotRdDailyReportItem(@RequestParam("id") Long id) {
+        iotRdDailyReportItemService.deleteIotRdDailyReportItem(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得瑞都日报 (工作量)明细")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report-item:query')")
+    public CommonResult<IotRdDailyReportItemRespVO> getIotRdDailyReportItem(@RequestParam("id") Long id) {
+        IotRdDailyReportItemDO iotRdDailyReportItem = iotRdDailyReportItemService.getIotRdDailyReportItem(id);
+        return success(BeanUtils.toBean(iotRdDailyReportItem, IotRdDailyReportItemRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得瑞都日报 (工作量)明细分页")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report-item:query')")
+    public CommonResult<PageResult<IotRdDailyReportItemRespVO>> getIotRdDailyReportItemPage(@Valid IotRdDailyReportItemPageReqVO pageReqVO) {
+        PageResult<IotRdDailyReportItemDO> pageResult = iotRdDailyReportItemService.getIotRdDailyReportItemPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotRdDailyReportItemRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出瑞都日报 (工作量)明细 Excel")
+    @PreAuthorize("@ss.hasPermission('pms:iot-rd-daily-report-item:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotRdDailyReportItemExcel(@Valid IotRdDailyReportItemPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotRdDailyReportItemDO> list = iotRdDailyReportItemService.getIotRdDailyReportItemPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "瑞都日报 (工作量)明细.xls", "数据", IotRdDailyReportItemRespVO.class,
+                        BeanUtils.toBean(list, IotRdDailyReportItemRespVO.class));
+    }
+
+}

+ 61 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreportitem/vo/IotRdDailyReportItemPageReqVO.java

@@ -0,0 +1,61 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 瑞都日报 (工作量)明细分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotRdDailyReportItemPageReqVO extends PageParam {
+
+    @Schema(description = "日报id", example = "14332")
+    private Long reportId;
+
+    @Schema(description = "施工队伍id", example = "11886")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "13694")
+    private Long projectId;
+
+    @Schema(description = "任务id", example = "29127")
+    private Long taskId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂... )")
+    private String projectClassification;
+
+    @Schema(description = "施工工艺")
+    private String technique;
+
+    @Schema(description = "工作量属性标识符(bridgePlug waterVolume...)")
+    private String reportAttrIdentifier;
+
+    @Schema(description = "工作量属性名称(泵车台次 仪表/混砂...)", example = "芋艿")
+    private String reportAttrName;
+
+    @Schema(description = "工作量属性值")
+    private BigDecimal reportAttrValue;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "2")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 72 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreportitem/vo/IotRdDailyReportItemRespVO.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 瑞都日报 (工作量)明细 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotRdDailyReportItemRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14985")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "日报id", example = "14332")
+    @ExcelProperty("日报id")
+    private Long reportId;
+
+    @Schema(description = "施工队伍id", example = "11886")
+    @ExcelProperty("施工队伍id")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "13694")
+    @ExcelProperty("项目id")
+    private Long projectId;
+
+    @Schema(description = "任务id", example = "29127")
+    @ExcelProperty("任务id")
+    private Long taskId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂... )")
+    @ExcelProperty("项目类别(钻井 修井 注氮 酸化压裂... )")
+    private String projectClassification;
+
+    @Schema(description = "施工工艺")
+    @ExcelProperty("施工工艺")
+    private String technique;
+
+    @Schema(description = "工作量属性标识符(bridgePlug waterVolume...)")
+    @ExcelProperty("工作量属性标识符(bridgePlug waterVolume...)")
+    private String reportAttrIdentifier;
+
+    @Schema(description = "工作量属性名称(泵车台次 仪表/混砂...)", example = "芋艿")
+    @ExcelProperty("工作量属性名称(泵车台次 仪表/混砂...)")
+    private String reportAttrName;
+
+    @Schema(description = "工作量属性值")
+    @ExcelProperty("工作量属性值")
+    private BigDecimal reportAttrValue;
+
+    @Schema(description = "排序值")
+    @ExcelProperty("排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "2")
+    @ExcelProperty("状态(0启用 1禁用)")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 51 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrddailyreportitem/vo/IotRdDailyReportItemSaveReqVO.java

@@ -0,0 +1,51 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 瑞都日报 (工作量)明细新增/修改 Request VO")
+@Data
+public class IotRdDailyReportItemSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14985")
+    private Long id;
+
+    @Schema(description = "日报id", example = "14332")
+    private Long reportId;
+
+    @Schema(description = "施工队伍id", example = "11886")
+    private Long deptId;
+
+    @Schema(description = "项目id", example = "13694")
+    private Long projectId;
+
+    @Schema(description = "任务id", example = "29127")
+    private Long taskId;
+
+    @Schema(description = "项目类别(钻井 修井 注氮 酸化压裂... )")
+    private String projectClassification;
+
+    @Schema(description = "施工工艺")
+    private String technique;
+
+    @Schema(description = "工作量属性标识符(bridgePlug waterVolume...)")
+    private String reportAttrIdentifier;
+
+    @Schema(description = "工作量属性名称(泵车台次 仪表/混砂...)", example = "芋艿")
+    private String reportAttrName;
+
+    @Schema(description = "工作量属性值")
+    private BigDecimal reportAttrValue;
+
+    @Schema(description = "排序值")
+    private Integer sort;
+
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+
+    @Schema(description = "状态(0启用 1禁用)", example = "2")
+    private Integer status;
+
+}

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/vo/IotRyDailyReportRespVO.java

@@ -73,6 +73,14 @@ public class IotRyDailyReportRespVO {
     @ExcelProperty("当月油耗(吨)")
     @ExcelProperty("当月油耗(吨)")
     private BigDecimal monthlyFuel;
     private BigDecimal monthlyFuel;
 
 
+    @Schema(description = "当日上油数量(吨)")
+    @ExcelProperty("当日上油数量(吨)")
+    private BigDecimal dailyOilVolume;
+
+    @Schema(description = "柴油剩余数量(吨)")
+    @ExcelProperty("柴油剩余数量(吨)")
+    private BigDecimal remainDieselVolume;
+
     @Schema(description = "生产时间(H)")
     @Schema(description = "生产时间(H)")
     @ExcelProperty("生产时间(H)")
     @ExcelProperty("生产时间(H)")
     private BigDecimal productionTime;
     private BigDecimal productionTime;

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

@@ -55,6 +55,12 @@ public class IotRyDailyReportSaveReqVO {
     @Schema(description = "当月油耗(吨)")
     @Schema(description = "当月油耗(吨)")
     private BigDecimal monthlyFuel;
     private BigDecimal monthlyFuel;
 
 
+    @Schema(description = "当日上油数量(吨)")
+    private BigDecimal dailyOilVolume;
+
+    @Schema(description = "柴油剩余数量(吨)")
+    private BigDecimal remainDieselVolume;
+
     @Schema(description = "生产时间(H)")
     @Schema(description = "生产时间(H)")
     private BigDecimal productionTime;
     private BigDecimal productionTime;
 
 

+ 5 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotdailyreportattrs/IotDailyReportAttrsDO.java

@@ -1,9 +1,12 @@
 package cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportattrs;
 package cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportattrs;
 
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import lombok.*;
 import lombok.*;
 
 
 /**
 /**
@@ -93,7 +96,8 @@ public class IotDailyReportAttrsDO extends BaseDO {
     /**
     /**
      * 不同专业公司的扩展属性
      * 不同专业公司的扩展属性
      */
      */
-    private String extProperty;
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private IotTaskAttrModelProperty extProperty;
     /**
     /**
      * 排序值
      * 排序值
      */
      */

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

@@ -64,7 +64,13 @@ public class IotProjectTaskDO extends BaseDO {
     /**
     /**
      * 责任人([123,234])
      * 责任人([123,234])
      */
      */
-    private String responsiblePerson;
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Set<Long> responsiblePerson;
+    /**
+     * 工单填报人([123,234])
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Set<Long> submitter;
     /**
     /**
      * 设计工作量
      * 设计工作量
      */
      */
@@ -74,9 +80,21 @@ public class IotProjectTaskDO extends BaseDO {
      */
      */
     private String workloadUnit;
     private String workloadUnit;
     /**
     /**
-     * 状态
+     * 状态 瑞恒施工状态
      */
      */
     private String status;
     private String status;
+    /**
+     * 瑞都施工状态(动迁上井 动迁下井 ...)
+     */
+    private String rdStatus;
+    /**
+     * 瑞鹰钻井施工状态(开钻前准备 钻进 ...)
+     */
+    private String rigStatus;
+    /**
+     * 瑞鹰修井施工状态(开工准备 施工 ...)
+     */
+    private String repairStatus;
     /**
     /**
      * 用户名
      * 用户名
      */
      */

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

@@ -0,0 +1,207 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import lombok.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 瑞都日报 DO
+ *
+ * @author ruiqi
+ */
+@TableName(value="rq_iot_rd_daily_report", autoResultMap = true)
+@KeySequence("rq_iot_rd_daily_report_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotRdDailyReportDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 施工队伍id
+     */
+    private Long deptId;
+    /**
+     * 日报名称 西南压裂项目部/2025-10-17日报填报
+     */
+    private String reportName;
+    /**
+     * 项目id
+     */
+    private Long projectId;
+    /**
+     * 任务id
+     */
+    private Long taskId;
+    /**
+     * 项目类别(钻井 修井 注氮 酸化压裂... )
+     */
+    private String projectClassification;
+    /**
+     * 施工工艺([123,233])
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Set<Long> techniqueIds;
+    /**
+     * 施工设备([123,233])
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Set<Long> deviceIds;
+    /**
+     * 时间节点-开始
+     */
+    private LocalTime startTime;
+    /**
+     * 时间节点-结束
+     */
+    private LocalTime endTime;
+    /**
+     * 累计施工井
+     */
+    private BigDecimal cumulativeWorkingWell;
+    /**
+     * 累计施工层
+     */
+    private BigDecimal cumulativeWorkingLayers;
+    /**
+     * 当日泵车台次
+     */
+    private BigDecimal dailyPumpTrips;
+    /**
+     * 当日仪表/混砂
+     */
+    private BigDecimal dailyToolsSand;
+    /**
+     * 趟数
+     */
+    private BigDecimal runCount;
+    /**
+     * 桥塞
+     */
+    private BigDecimal bridgePlug;
+    /**
+     * 水方量
+     */
+    private BigDecimal waterVolume;
+    /**
+     * 时间H
+     */
+    private BigDecimal hourCount;
+    /**
+     * 当日油耗(吨)
+     */
+    private BigDecimal dailyFuel;
+    /**
+     * 当日用电量(kWh)
+     */
+    private BigDecimal dailyPowerUsage;
+    /**
+     * 生产时间(H)
+     */
+    private BigDecimal productionTime;
+    /**
+     * 非生产时间(H)
+     */
+    private BigDecimal nonProductionTime;
+    /**
+     * 非生产时间原因
+     */
+    private String rdNptReason;
+    /**
+     * 施工开始日期
+     */
+    private LocalDateTime constructionStartDate;
+    /**
+     * 施工结束日期
+     */
+    private LocalDateTime constructionEndDate;
+    /**
+     * 当日生产情况生产动态
+     */
+    private String productionStatus;
+    /**
+     * 外租情况(可能有附件)
+     */
+    private String externalRental;
+    /**
+     * 下步工作计划
+     */
+    private String nextPlan;
+    /**
+     * 施工状态(动迁上井/动迁下井/施工准备/施工...)
+     */
+    private String rdStatus;
+    /**
+     * 故障情况
+     */
+    private String malfunction;
+    /**
+     * 故障误工h
+     */
+    private BigDecimal faultDowntime;
+    /**
+     * 人员情况
+     */
+    private String personnel;
+    /**
+     * 全员数量
+     */
+    private BigDecimal totalStaffNum;
+    /**
+     * 休假人员数量
+     */
+    private BigDecimal leaveStaffNum;
+    /**
+     * 不同专业公司的扩展属性值
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private List<IotTaskAttrModelProperty> extProperty;
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态(1填写中 2待填写 3已完成)
+     */
+    private Integer status;
+    /**
+     * 流程实例id
+     */
+    private String processInstanceId;
+    /**
+     * 审批状态 未提交、审批中、审批通过、审批不通过、已取消
+     */
+    private Integer auditStatus;
+    /**
+     * 审核意见
+     */
+    private String opinion;
+    /**
+     * 日报填写时间
+     */
+    private LocalDateTime fillTime;
+    /**
+     * 审批时间
+     */
+    private LocalDateTime approvalTime;
+
+}

+ 80 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotrddailyreportitem/IotRdDailyReportItemDO.java

@@ -0,0 +1,80 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreportitem;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 瑞都日报 (工作量)明细 DO
+ *
+ * @author ruiqi
+ */
+@TableName("rq_iot_rd_daily_report_item")
+@KeySequence("rq_iot_rd_daily_report_item_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotRdDailyReportItemDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 日报id
+     */
+    private Long reportId;
+    /**
+     * 施工队伍id
+     */
+    private Long deptId;
+    /**
+     * 项目id
+     */
+    private Long projectId;
+    /**
+     * 任务id
+     */
+    private Long taskId;
+    /**
+     * 项目类别(钻井 修井 注氮 酸化压裂... )
+     */
+    private String projectClassification;
+    /**
+     * 施工工艺
+     */
+    private String technique;
+    /**
+     * 工作量属性标识符(bridgePlug waterVolume...)
+     */
+    private String reportAttrIdentifier;
+    /**
+     * 工作量属性名称(泵车台次 仪表/混砂...)
+     */
+    private String reportAttrName;
+    /**
+     * 工作量属性值
+     */
+    private BigDecimal reportAttrValue;
+    /**
+     * 排序值
+     */
+    private Integer sort;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 状态(0启用 1禁用)
+     */
+    private Integer status;
+
+}

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

@@ -85,6 +85,14 @@ public class IotRyDailyReportDO extends BaseDO {
      * 当月油耗(吨)
      * 当月油耗(吨)
      */
      */
     private BigDecimal monthlyFuel;
     private BigDecimal monthlyFuel;
+    /**
+     * 当日上油数量(吨)
+     */
+    private BigDecimal dailyOilVolume;
+    /**
+     * 柴油剩余数量(吨)
+     */
+    private BigDecimal remainDieselVolume;
     /**
     /**
      * 生产时间(H)
      * 生产时间(H)
      */
      */

+ 15 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotattachment/IotAttachmentMapper.java

@@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotattachment.vo.IotAttachme
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 
 
+import java.util.List;
+
 /**
 /**
  * 附件 Mapper
  * 附件 Mapper
  *
  *
@@ -29,4 +31,17 @@ public interface IotAttachmentMapper extends BaseMapperX<IotAttachmentDO> {
                 .orderByDesc(IotAttachmentDO::getId));
                 .orderByDesc(IotAttachmentDO::getId));
     }
     }
 
 
+    default List<IotAttachmentDO> attachments(IotAttachmentPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotAttachmentDO>()
+                .eqIfPresent(IotAttachmentDO::getCategory, reqVO.getCategory())
+                .eqIfPresent(IotAttachmentDO::getBizId, reqVO.getBizId())
+                .eqIfPresent(IotAttachmentDO::getType, reqVO.getType())
+                .likeIfPresent(IotAttachmentDO::getFilename, reqVO.getFilename())
+                .eqIfPresent(IotAttachmentDO::getFileType, reqVO.getFileType())
+                .eqIfPresent(IotAttachmentDO::getFilePath, reqVO.getFilePath())
+                .eqIfPresent(IotAttachmentDO::getFileSize, reqVO.getFileSize())
+                .eqIfPresent(IotAttachmentDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotAttachmentDO::getCreateTime, reqVO.getCreateTime()));
+    }
+
 }
 }

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdailyreportattrs/IotDailyReportAttrsMapper.java

@@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportattrs.vo.IotDa
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportattrs.IotDailyReportAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportattrs.IotDailyReportAttrsDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 
 
+import java.util.List;
+
 /**
 /**
  * 日报扩展模板属性 Mapper
  * 日报扩展模板属性 Mapper
  *
  *
@@ -41,4 +43,30 @@ public interface IotDailyReportAttrsMapper extends BaseMapperX<IotDailyReportAtt
                 .orderByDesc(IotDailyReportAttrsDO::getId));
                 .orderByDesc(IotDailyReportAttrsDO::getId));
     }
     }
 
 
+    default List<IotDailyReportAttrsDO> dailyReportAttrs(IotDailyReportAttrsPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotDailyReportAttrsDO>()
+                .eqIfPresent(IotDailyReportAttrsDO::getTemplateId, reqVO.getTemplateId())
+                .eqIfPresent(IotDailyReportAttrsDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotDailyReportAttrsDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotDailyReportAttrsDO::getProjectClassification, reqVO.getProjectClassification())
+                .eqIfPresent(IotDailyReportAttrsDO::getWellType, reqVO.getWellType())
+                .eqIfPresent(IotDailyReportAttrsDO::getWellCategory, reqVO.getWellCategory())
+                .eqIfPresent(IotDailyReportAttrsDO::getTechnique, reqVO.getTechnique())
+                .inIfPresent(IotDailyReportAttrsDO::getTechnique, reqVO.getTechniqueIds())
+                .likeIfPresent(IotDailyReportAttrsDO::getName, reqVO.getName())
+                .eqIfPresent(IotDailyReportAttrsDO::getIdentifier, reqVO.getIdentifier())
+                .eqIfPresent(IotDailyReportAttrsDO::getDataType, reqVO.getDataType())
+                .eqIfPresent(IotDailyReportAttrsDO::getRequired, reqVO.getRequired())
+                .eqIfPresent(IotDailyReportAttrsDO::getUnit, reqVO.getUnit())
+                .eqIfPresent(IotDailyReportAttrsDO::getAccessMode, reqVO.getAccessMode())
+                .eqIfPresent(IotDailyReportAttrsDO::getDefaultValue, reqVO.getDefaultValue())
+                .eqIfPresent(IotDailyReportAttrsDO::getMaxValue, reqVO.getMaxValue())
+                .eqIfPresent(IotDailyReportAttrsDO::getMinValue, reqVO.getMinValue())
+                .eqIfPresent(IotDailyReportAttrsDO::getExtProperty, reqVO.getExtProperty())
+                .eqIfPresent(IotDailyReportAttrsDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotDailyReportAttrsDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotDailyReportAttrsDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotDailyReportAttrsDO::getCreateTime, reqVO.getCreateTime()));
+    }
+
 }
 }

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

@@ -108,6 +108,7 @@ public interface IotProjectTaskMapper extends BaseMapperX<IotProjectTaskDO> {
      */
      */
     default LambdaQueryWrapperX<IotProjectTaskDO> buildCommonQuery(IotProjectTaskPageReqVO reqVO) {
     default LambdaQueryWrapperX<IotProjectTaskDO> buildCommonQuery(IotProjectTaskPageReqVO reqVO) {
         return new LambdaQueryWrapperX<IotProjectTaskDO>()
         return new LambdaQueryWrapperX<IotProjectTaskDO>()
+                .eqIfPresent(IotProjectTaskDO::getDeptId, reqVO.getCompanyId())
                 .eqIfPresent(IotProjectTaskDO::getProjectId, reqVO.getProjectId())
                 .eqIfPresent(IotProjectTaskDO::getProjectId, reqVO.getProjectId())
                 .likeIfPresent(IotProjectTaskDO::getWellName, reqVO.getWellName())
                 .likeIfPresent(IotProjectTaskDO::getWellName, reqVO.getWellName())
                 .eqIfPresent(IotProjectTaskDO::getWellType, reqVO.getWellType())
                 .eqIfPresent(IotProjectTaskDO::getWellType, reqVO.getWellType())

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

@@ -0,0 +1,106 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreport;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 瑞都日报 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotRdDailyReportMapper extends BaseMapperX<IotRdDailyReportDO> {
+
+    default PageResult<IotRdDailyReportDO> selectPage(IotRdDailyReportPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotRdDailyReportDO>()
+                .eqIfPresent(IotRdDailyReportDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotRdDailyReportDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotRdDailyReportDO::getTaskId, reqVO.getTaskId())
+                .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));
+    }
+
+    default List<IotRdDailyReportDO> dailyReports(IotRdDailyReportPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotRdDailyReportDO>()
+                .eqIfPresent(IotRdDailyReportDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotRdDailyReportDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotRdDailyReportDO::getTaskId, reqVO.getTaskId())
+                .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()));
+    }
+}

+ 36 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotrddailyreportitem/IotRdDailyReportItemMapper.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreportitem;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo.IotRdDailyReportItemPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreportitem.IotRdDailyReportItemDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 瑞都日报 (工作量)明细 Mapper
+ *
+ * @author ruiqi
+ */
+@Mapper
+public interface IotRdDailyReportItemMapper extends BaseMapperX<IotRdDailyReportItemDO> {
+
+    default PageResult<IotRdDailyReportItemDO> selectPage(IotRdDailyReportItemPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotRdDailyReportItemDO>()
+                .eqIfPresent(IotRdDailyReportItemDO::getReportId, reqVO.getReportId())
+                .eqIfPresent(IotRdDailyReportItemDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotRdDailyReportItemDO::getProjectId, reqVO.getProjectId())
+                .eqIfPresent(IotRdDailyReportItemDO::getTaskId, reqVO.getTaskId())
+                .eqIfPresent(IotRdDailyReportItemDO::getProjectClassification, reqVO.getProjectClassification())
+                .eqIfPresent(IotRdDailyReportItemDO::getTechnique, reqVO.getTechnique())
+                .eqIfPresent(IotRdDailyReportItemDO::getReportAttrIdentifier, reqVO.getReportAttrIdentifier())
+                .likeIfPresent(IotRdDailyReportItemDO::getReportAttrName, reqVO.getReportAttrName())
+                .eqIfPresent(IotRdDailyReportItemDO::getReportAttrValue, reqVO.getReportAttrValue())
+                .eqIfPresent(IotRdDailyReportItemDO::getSort, reqVO.getSort())
+                .eqIfPresent(IotRdDailyReportItemDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotRdDailyReportItemDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(IotRdDailyReportItemDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(IotRdDailyReportItemDO::getId));
+    }
+
+}

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

@@ -0,0 +1,177 @@
+package cn.iocoder.yudao.module.pms.job.dailyreport;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
+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.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;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
+import cn.iocoder.yudao.module.pms.message.PmsMessage;
+import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
+import cn.iocoder.yudao.module.pms.service.iotmaintenancebom.IotMaintenanceBomService;
+import cn.iocoder.yudao.module.pms.service.iotmainworkorderbom.IotMainWorkOrderBomService;
+import cn.iocoder.yudao.module.pms.service.iotprojecttask.IotProjectTaskService;
+import cn.iocoder.yudao.module.pms.service.iotrddailyreport.IotRdDailyReportService;
+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.service.dept.DeptService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.*;
+
+import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
+
+@Component
+@Slf4j
+public class CreateRdDailyReportOrderJob implements JobHandler {
+    @Resource
+    private IotDevicePersonService iotDevicePersonService;
+    @Resource
+    private IotMaintenanceBomService iotMaintenanceBomService;
+    @Autowired
+    private IotRdDailyReportService iotRdDailyReportService;
+
+    @Resource
+    private IotProjectTaskService iotProjectTaskService;
+    @Resource
+    private AdminUserApi adminUserApi;
+    @Resource
+    private IotMainWorkOrderBomService iotMainWorkOrderBomService;
+
+    @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
+    private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
+    @Resource
+    private PmsMessage pmsMessage;
+    @Resource
+    private DeptService deptService;
+
+    @Override
+    @TenantIgnore
+    public String execute(String param) throws Exception {
+
+        // 查询 SAP同步领料单 开始时间 结束时间 数据字典
+        String createTime = DictFrameworkUtils.parseDictDataValue("rq_iot_rd_daily_report_createtime", "生成时间");
+
+        // 查询所有瑞都的项目任务 以‘井号-时间’ 为唯一键 当天创建时间 内没有生成过日报 就自动生成
+        IotRdDailyReportPageReqVO pageReqVO = new IotRdDailyReportPageReqVO();
+        List<IotRdDailyReportDO> dailyReports = iotRdDailyReportService.dailyReports(pageReqVO);
+        LocalDateTime currentDate = LocalDateTime.now();
+        String currentFormatDateStr = LocalDateTimeUtil.format(currentDate, "yyyy-MM-dd");
+        // 前一天的日期
+        LocalDateTime yesterday = currentDate.minusDays(1);
+        // 需要生成日报的 任务(井号) 集合
+        Set<Long> taskIds = new HashSet<>();
+        if (CollUtil.isNotEmpty(dailyReports)) {
+            dailyReports.forEach(report -> {
+                // 查询当天生成的日报
+                LocalDateTime createDate = report.getCreateTime();
+                String formatDateStr = LocalDateTimeUtil.format(createDate, "yyyy-MM-dd");
+                if (formatDateStr.equals(currentFormatDateStr)) {
+                    taskIds.add(report.getTaskId());
+                }
+            });
+        }
+        // 查询瑞都相关的项目任务 根据每个任务的填报人进行工单生成和推送
+        IotProjectTaskPageReqVO taskReqVO = new IotProjectTaskPageReqVO();
+        taskReqVO.setCompanyId(163l);
+        List<IotProjectTaskDO> tasks = iotProjectTaskService.projectTasks(taskReqVO);
+        Set<Long> userIds = new HashSet<>();
+        List<IotRdDailyReportDO> reports = new ArrayList<>();
+        Map<Long, Long> taskSubmitterPair = new HashMap<>();
+        if (CollUtil.isNotEmpty(tasks)) {
+            tasks.forEach(task -> {
+                // 查询当前任务的 工单填报人
+                Set<Long> submitterIds = task.getSubmitter();
+                if (CollUtil.isNotEmpty(submitterIds)) {
+                    // 查询工单填报人所在部门
+                    userIds.addAll(submitterIds);
+                    taskSubmitterPair.put(task.getId(), new ArrayList<>(submitterIds).get(0));
+                }
+            });
+            // 查询所有任务配置的工单填报人的信息
+            Map<Long, AdminUserRespDTO> users = adminUserApi.getUserMap(userIds);
+            Set<Long> deptIds = new HashSet<>();
+            if (CollUtil.isNotEmpty(users)) {
+                // 统一查询所有用户所属的部门信息
+                users.forEach((userId, user) -> {
+                    deptIds.add(user.getDeptId());
+                });
+            }
+            Map<Long, DeptDO> deptPair = deptService.getDeptMap(deptIds);
+            // 以任务为维度 生成瑞都日报 部门为任务配置的工单填报人对应的部门
+            tasks.forEach(task -> {
+                if (!taskIds.contains(task.getId()) && CollUtil.isNotEmpty(task.getSubmitter())) {
+                    // 生成当天的日报
+                    IotRdDailyReportDO report = new IotRdDailyReportDO();
+                    if (taskSubmitterPair.containsKey(task.getId())) {
+                        Long userId = taskSubmitterPair.get(task.getId());
+                        if (users.containsKey(userId)) {
+                            AdminUserRespDTO user = users.get(userId);
+                            report.setDeptId(user.getDeptId());
+                            // 根据用户部门名称 生成日报标题
+                            if (deptPair.containsKey(user.getDeptId())) {
+                                DeptDO dept = deptPair.get(user.getDeptId());
+                                String deptName = dept.getName();
+                                String[] multiLangDeptNames = deptName.split("~~");
+                                report.setReportName(multiLangDeptNames[0] + "/" + currentFormatDateStr + "日报填报" );
+                            }
+                        }
+                    }
+                    report.setProjectId(task.getProjectId());
+                    report.setTaskId(task.getId());
+                    report.setDeviceIds(task.getDeviceIds());
+                    report.setStartTime(LocalTime.of(8, 0, 0));
+                    report.setEndTime(LocalTime.of(8, 0, 0));
+                    report.setConstructionStartDate(yesterday);
+                    report.setConstructionEndDate(currentDate);
+                    report.setCreateTime(LocalDateTime.now());
+                    reports.add(report);
+                }
+            });
+        }
+        if (CollUtil.isNotEmpty(reports)) {
+            iotRdDailyReportService.batchAddDailyReports(reports);
+        }
+
+        // 向工单责任人发送 站内信及 钉钉消息
+        /* if (CollUtil.isNotEmpty(workOrders)) {
+            // 先查询所有工单责任人的手机号
+            Set<Long> personIds = new HashSet<>(convertList(workOrders, order -> Long.valueOf(order.getResponsiblePerson())));
+            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());
+                }
+            });
+            // 异步多线程发送 站内信 钉钉 消息
+            workOrders.forEach(order -> {
+                CountDownLatch latch = new CountDownLatch(workOrders.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);
+                        }
+                    } finally {
+                        latch.countDown();
+                    }
+                });
+            });
+        } */
+        return "创建成功";
+    }
+}

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotattachment/IotAttachmentService.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotattachment.vo.IotAttachme
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
 
 
 import javax.validation.Valid;
 import javax.validation.Valid;
+import java.util.List;
 
 
 /**
 /**
  * 附件 Service 接口
  * 附件 Service 接口
@@ -52,4 +53,12 @@ public interface IotAttachmentService {
      */
      */
     PageResult<IotAttachmentDO> getIotAttachmentPage(IotAttachmentPageReqVO pageReqVO);
     PageResult<IotAttachmentDO> getIotAttachmentPage(IotAttachmentPageReqVO pageReqVO);
 
 
+    /**
+     * 获得附件列表
+     *
+     * @param pageReqVO 列表查询
+     * @return 附件列表
+     */
+    List<IotAttachmentDO> getIotAttachments(IotAttachmentPageReqVO pageReqVO);
+
 }
 }

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

@@ -11,6 +11,8 @@ import org.springframework.validation.annotation.Validated;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 
 
+import java.util.List;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_ATTACHMENT_NOT_EXISTS;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_ATTACHMENT_NOT_EXISTS;
 
 
@@ -68,4 +70,9 @@ public class IotAttachmentServiceImpl implements IotAttachmentService {
         return iotAttachmentMapper.selectPage(pageReqVO);
         return iotAttachmentMapper.selectPage(pageReqVO);
     }
     }
 
 
+    @Override
+    public List<IotAttachmentDO> getIotAttachments(IotAttachmentPageReqVO pageReqVO) {
+        return iotAttachmentMapper.attachments(pageReqVO);
+    }
+
 }
 }

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdailyreportattrs/IotDailyReportAttrsService.java

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotdailyreportattrs.vo.IotDa
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportattrs.IotDailyReportAttrsDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportattrs.IotDailyReportAttrsDO;
 
 
 import javax.validation.Valid;
 import javax.validation.Valid;
+import java.util.List;
 
 
 /**
 /**
  * 日报扩展模板属性 Service 接口
  * 日报扩展模板属性 Service 接口
@@ -52,4 +53,12 @@ public interface IotDailyReportAttrsService {
      */
      */
     PageResult<IotDailyReportAttrsDO> getIotDailyReportAttrsPage(IotDailyReportAttrsPageReqVO pageReqVO);
     PageResult<IotDailyReportAttrsDO> getIotDailyReportAttrsPage(IotDailyReportAttrsPageReqVO pageReqVO);
 
 
+    /**
+     * 获得日报扩展模板属性列表
+     *
+     * @param pageReqVO 列表查询
+     * @return 日报扩展模板属性列表
+     */
+    List<IotDailyReportAttrsDO> getIotDailyReportAttrs(IotDailyReportAttrsPageReqVO pageReqVO);
+
 }
 }

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

@@ -11,6 +11,8 @@ import org.springframework.validation.annotation.Validated;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 
 
+import java.util.List;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DAILY_REPORT_ATTRS_NOT_EXISTS;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DAILY_REPORT_ATTRS_NOT_EXISTS;
 
 
@@ -68,4 +70,9 @@ public class IotDailyReportAttrsServiceImpl implements IotDailyReportAttrsServic
         return iotDailyReportAttrsMapper.selectPage(pageReqVO);
         return iotDailyReportAttrsMapper.selectPage(pageReqVO);
     }
     }
 
 
+    @Override
+    public List<IotDailyReportAttrsDO> getIotDailyReportAttrs(IotDailyReportAttrsPageReqVO pageReqVO) {
+        return iotDailyReportAttrsMapper.dailyReportAttrs(pageReqVO);
+    }
+
 }
 }

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

@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.pms.service.iotrddailyreport;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportStatisticsRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 瑞都日报 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotRdDailyReportService {
+
+    /**
+     * 创建瑞都日报
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotRdDailyReport(@Valid IotRdDailyReportSaveReqVO createReqVO);
+
+    /**
+     * 更新瑞都日报
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotRdDailyReport(@Valid IotRdDailyReportSaveReqVO updateReqVO);
+
+    /**
+     * 审批瑞都日报
+     *
+     * @param updateReqVO 更新信息
+     */
+    void approvalRdDailyReport(@Valid IotRdDailyReportSaveReqVO updateReqVO);
+
+    /**
+     * 删除瑞都日报
+     *
+     * @param id 编号
+     */
+    void deleteIotRdDailyReport(Long id);
+
+    /**
+     * 获得瑞都日报
+     *
+     * @param id 编号
+     * @return 瑞都日报
+     */
+    IotRdDailyReportDO getIotRdDailyReport(Long id);
+
+    /**
+     * 获得瑞都日报分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 瑞都日报分页
+     */
+    PageResult<IotRdDailyReportDO> getIotRdDailyReportPage(IotRdDailyReportPageReqVO pageReqVO);
+
+    /**
+     * 获得瑞都日报列表
+     *
+     * @param pageReqVO 列表查询
+     * @return 瑞都日报列表
+     */
+    List<IotRdDailyReportDO> dailyReports(IotRdDailyReportPageReqVO pageReqVO);
+
+    /**
+     * 批量 新增日报工单
+     *
+     * @param
+     */
+    void batchAddDailyReports(List<IotRdDailyReportDO> reports);
+
+    /**
+     * 瑞都 日报 按项目部统计
+     *
+     * @param
+     */
+    List<IotRdDailyReportStatisticsRespVO> statistics(IotRdDailyReportPageReqVO pageReqVO);
+}

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

@@ -0,0 +1,464 @@
+package cn.iocoder.yudao.module.pms.service.iotrddailyreport;
+
+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.iotattachment.vo.IotAttachmentSaveReqVO;
+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.iotrddailyreport.vo.IotRdDailyReportPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportStatisticsItemVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportStatisticsRespVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotattachment.IotAttachmentDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojectinfo.IotProjectInfoDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreport.IotRdDailyReportDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotattachment.IotAttachmentMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotprojectinfo.IotProjectInfoMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttask.IotProjectTaskMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreport.IotRdDailyReportMapper;
+import cn.iocoder.yudao.module.pms.enums.AttachmentCategoryEnum;
+import cn.iocoder.yudao.module.pms.enums.AttachmentTypeEnum;
+import cn.iocoder.yudao.module.supplier.enums.common.SupplierAuditStatusEnum;
+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 com.google.common.collect.ImmutableMap;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_RD_DAILY_REPORT_NOT_EXISTS;
+
+/**
+ * 瑞都日报 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotRdDailyReportServiceImpl implements IotRdDailyReportService {
+
+    @Resource
+    private IotRdDailyReportMapper iotRdDailyReportMapper;
+    @Resource
+    private IotProjectInfoMapper iotProjectInfoMapper;
+    @Resource
+    private IotProjectTaskMapper iotProjectTaskMapper;
+    @Resource
+    private IotAttachmentMapper iotAttachmentMapper;
+    @Resource
+    private DictDataService dictDataService;
+    @Resource
+    private DeptService deptService;
+
+    @Override
+    public Long createIotRdDailyReport(IotRdDailyReportSaveReqVO createReqVO) {
+        // 插入
+        IotRdDailyReportDO iotRdDailyReport = BeanUtils.toBean(createReqVO, IotRdDailyReportDO.class);
+        iotRdDailyReportMapper.insert(iotRdDailyReport);
+        // 返回
+        return iotRdDailyReport.getId();
+    }
+
+    @Override
+    public void updateIotRdDailyReport(IotRdDailyReportSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotRdDailyReportExists(updateReqVO.getId());
+        // 更新
+        IotRdDailyReportDO updateObj = BeanUtils.toBean(updateReqVO, IotRdDailyReportDO.class);
+        // 设置 日报填写状态 保存 已完成
+        updateObj.setStatus(1);
+        // 设置 日报审批状态为 审批中 auditStatus = 10
+        updateObj.setAuditStatus(10);
+        iotRdDailyReportMapper.updateById(updateObj);
+        // 如果上传了附件 保存附件
+        if (CollUtil.isNotEmpty(updateReqVO.getAttachments())) {
+            List<IotAttachmentSaveReqVO> attachments = updateReqVO.getAttachments();
+            List<IotAttachmentDO> tobeAddedAttachments = new ArrayList<>();
+            attachments.forEach(att -> {
+                IotAttachmentDO attachment = new IotAttachmentDO();
+                attachment.setBizId(att.getBizId());
+                attachment.setCategory(AttachmentCategoryEnum.DAILY_REPORT.getCode());
+                attachment.setType(AttachmentTypeEnum.EXTERNAL_RENTAL.getCode());
+                attachment.setFilePath(att.getFilePath());
+                attachment.setFileSize(att.getFileSize());
+                attachment.setFilename(att.getFilename());
+                attachment.setFileType(att.getFileType());
+                attachment.setRemark(att.getRemark());
+                tobeAddedAttachments.add(attachment);
+            });
+            if (CollUtil.isNotEmpty(tobeAddedAttachments)) {
+                // 先删除再新增
+                int count = iotAttachmentMapper.deleteByMap(ImmutableMap.of(
+                        "category", AttachmentCategoryEnum.DAILY_REPORT.getCode(),
+                        "biz_id", updateObj.getId(),
+                        "type", AttachmentTypeEnum.EXTERNAL_RENTAL.getCode()
+                ));
+                iotAttachmentMapper.insertBatch(tobeAddedAttachments);
+            }
+        }
+    }
+
+    @Override
+    public void approvalRdDailyReport(IotRdDailyReportSaveReqVO updateReqVO) {
+        // 如果审批拒绝 修改日报 填报状态 status = 0 填写中  审批状态 auditStatus = 审批不通过
+        // 审批通过 设置 日报审批状态 auditStatus = 审批通过
+        // 校验存在
+        IotRdDailyReportDO dailyReport = validateIotRdDailyReportExists(updateReqVO.getId());
+        dailyReport.setAuditStatus(updateReqVO.getAuditStatus());
+        if (SupplierAuditStatusEnum.REJECT.getStatus().equals(updateReqVO.getAuditStatus())) {
+            dailyReport.setStatus(0);
+        }
+        dailyReport.setOpinion(updateReqVO.getOpinion());
+        iotRdDailyReportMapper.updateById(dailyReport);
+    }
+
+    @Override
+    public void deleteIotRdDailyReport(Long id) {
+        // 校验存在
+        validateIotRdDailyReportExists(id);
+        // 删除
+        iotRdDailyReportMapper.deleteById(id);
+    }
+
+    private IotRdDailyReportDO validateIotRdDailyReportExists(Long id) {
+        IotRdDailyReportDO dailyReport = iotRdDailyReportMapper.selectById(id);
+        if (ObjUtil.isEmpty(dailyReport)) {
+            throw exception(IOT_RD_DAILY_REPORT_NOT_EXISTS);
+        }
+        return dailyReport;
+    }
+
+    @Override
+    public IotRdDailyReportDO getIotRdDailyReport(Long id) {
+        return iotRdDailyReportMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotRdDailyReportDO> getIotRdDailyReportPage(IotRdDailyReportPageReqVO pageReqVO) {
+        return iotRdDailyReportMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<IotRdDailyReportDO> dailyReports(IotRdDailyReportPageReqVO pageReqVO) {
+        return iotRdDailyReportMapper.dailyReports(pageReqVO);
+    }
+
+    @Override
+    public void batchAddDailyReports(List<IotRdDailyReportDO> reports) {
+        iotRdDailyReportMapper.insertBatch(reports);
+    }
+
+    @Override
+    public List<IotRdDailyReportStatisticsRespVO> statistics(IotRdDailyReportPageReqVO pageReqVO) {
+        List<IotRdDailyReportStatisticsRespVO> result = new ArrayList<>();
+        // 按照项目部统计日报 先查询瑞都所有部门 163l
+        Set<Long> rdChildDeptIds = deptService.getChildDeptIdListFromCache(163l);
+        List<DeptDO> depts =deptService.getDeptList(rdChildDeptIds);
+        // key队伍id      value队伍所属项目部id
+        Map<Long, Long> teamProjectPair = new HashMap<>();
+        Set<Long> projectDeptIds = new HashSet<>();
+        // key项目部id     value项目部名称
+        Map<Long, String> projectDeptPair = new HashMap<>();
+        // key队伍id     value队伍名称
+        Map<Long, String> teamDeptPair = new HashMap<>();
+        if (CollUtil.isNotEmpty(depts)) {
+            depts.forEach(dept -> {
+                if (dept.getName().contains("项目部")) {
+                    projectDeptIds.add(dept.getId());
+                    projectDeptPair.put(dept.getId(), dept.getName());
+                } else {
+                    teamProjectPair.put(dept.getId(), dept.getParentId());
+                    teamDeptPair.put(dept.getId(), dept.getName());
+                }
+            });
+        }
+        // 查询所有瑞都日报
+        IotRdDailyReportPageReqVO reqVO = new IotRdDailyReportPageReqVO();
+        List<IotRdDailyReportDO> dailyReports = iotRdDailyReportMapper.dailyReports(reqVO);
+        // key项目id   value项目甲方名称
+        Map<Long, String> projectPair = new HashMap<>();
+        //  key任务id     value任务井号
+        Map<Long, String> taskPair = new HashMap<>();
+        //  施工工艺 key字典键值     value字典标签
+        Map<String, String> techniqueDictPair = new HashMap<>();
+        //  key任务id     value任务工作量
+        Map<Long, BigDecimal> taskWorkloadPair = new HashMap<>();
+        //  key任务id     value任务工艺名称
+        Map<Long, String> taskTechniquePair = new HashMap<>();
+        if (CollUtil.isNotEmpty(dailyReports)) {
+            // 查询施工工艺字典数据
+            List<DictDataDO> rdTechniques = dictDataService.getDictDataListByDictType("rq_iot_project_technology_rd");
+            if (CollUtil.isNotEmpty(rdTechniques)) {
+                rdTechniques.forEach(tech -> {
+                    techniqueDictPair.put(tech.getValue(), tech.getLabel());
+                });
+            }
+
+            // 查询日报关联的项目信息
+            IotProjectInfoPageReqVO projectReqVO = new IotProjectInfoPageReqVO();
+            projectReqVO.setProjectIds(convertList(dailyReports, IotRdDailyReportDO::getProjectId));
+            List<IotProjectInfoDO> projects = iotProjectInfoMapper.selectList(projectReqVO);
+            if (CollUtil.isNotEmpty(projects)) {
+                projects.forEach(project -> {
+                    projectPair.put(project.getId(), project.getManufactureName());
+                });
+            }
+            // 查询日报关联的任务信息
+            IotProjectTaskPageReqVO taskReqVO = new IotProjectTaskPageReqVO();
+            taskReqVO.setTaskIds(convertList(dailyReports, IotRdDailyReportDO::getTaskId));
+            List<IotProjectTaskDO> tasks = iotProjectTaskMapper.selectList(taskReqVO);
+            if (CollUtil.isNotEmpty(tasks)) {
+                tasks.forEach(task -> {
+                    taskPair.put(task.getId(), task.getWellName());
+                    // 获取所有任务的工作量数据
+                    taskWorkloadPair.put(task.getId(), new BigDecimal(task.getWorkloadDesign()));
+                    if (techniqueDictPair.containsKey(task.getTechnique())) {
+                        String techniqueName = techniqueDictPair.get(task.getTechnique());
+                        taskTechniquePair.put(task.getId(), techniqueName);
+                    }
+                });
+            }
+            // 设置 小队 任务已经完成的工作量集合 (按照不同的单位统计任务的不同工作量)
+            // key队伍id      value队伍工作量数据
+            Map<Long, BigDecimal> bridgePlugPair = new HashMap<>();
+            Map<Long, BigDecimal> runCountPair = new HashMap<>();
+            Map<Long, BigDecimal> cumulativeWorkingWellPair = new HashMap<>();
+            Map<Long, BigDecimal> hourCountPair = new HashMap<>();
+            Map<Long, BigDecimal> waterVolumePair = new HashMap<>();
+            Map<Long, BigDecimal> pumpTripsPair = new HashMap<>();
+            Map<Long, BigDecimal> cumulativeWorkingLayersPair = new HashMap<>();
+            Map<Long, BigDecimal> mixSandPair = new HashMap<>();
+
+            dailyReports.forEach(report -> {
+                // 设置每个任务的工作量数据  单位相同的工作量值作合并处理
+                List<IotTaskAttrModelProperty> taskAttrs = report.getExtProperty();
+                // 暂存不同单位的工作量属性值
+                BigDecimal tempTotalBridgePlug = BigDecimal.ZERO;               // 桥塞(个数)
+                BigDecimal tempTotalRunCount = BigDecimal.ZERO;                 // 趟数
+                BigDecimal tempTotalCumulativeWorkingWell = BigDecimal.ZERO;    // 井数
+                BigDecimal tempTotalHourCount = BigDecimal.ZERO;                // 小时H
+                BigDecimal tempTotalWaterVolume = BigDecimal.ZERO;              // 水方量(方)
+                BigDecimal tempTotalPumpTrips = BigDecimal.ZERO;
+                BigDecimal tempTotalCumulativeWorkingLayers = BigDecimal.ZERO;  // 段数  累计施工-层
+                BigDecimal tempTotalMixSand = BigDecimal.ZERO;                  // 台次 当日泵车台次 当日仪表/混砂
+                if (CollUtil.isNotEmpty(taskAttrs)) {
+                    for (IotTaskAttrModelProperty attr : taskAttrs) {
+                        String unit = attr.getUnit();   // 工作量单位
+                        String actualValueStr = attr.getActualValue();  // 工作量属性的实际值
+                        // 处理实际值:避免null或非数字字符串导致的异常
+                        BigDecimal actualValue = BigDecimal.ZERO;
+                        if (StrUtil.isNotBlank(actualValueStr)) {  // 假设使用Hutool的StrUtil,或自行判断null/空
+                            try {
+                                actualValue = new BigDecimal(actualValueStr);
+                            } catch (NumberFormatException e) {
+                                // 若字符串格式错误,默认按0处理(可根据业务调整)
+                                actualValue = BigDecimal.ZERO;
+                            }
+                        }
+                        if ("个数".equals(unit)) {
+                            // 钻可溶桥塞  钻复合桥塞
+                            tempTotalBridgePlug = tempTotalBridgePlug.add(actualValue);
+                            if (bridgePlugPair.containsKey(report.getDeptId())) {
+                                BigDecimal tempBridgePlug = bridgePlugPair.get(report.getDeptId());
+                                bridgePlugPair.put(report.getDeptId(), tempTotalBridgePlug.add(tempBridgePlug));
+                            } else {
+                                bridgePlugPair.put(report.getDeptId(), 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));
+                            } else {
+                                runCountPair.put(report.getDeptId(), 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));
+                            } else {
+                                hourCountPair.put(report.getDeptId(), tempTotalHourCount);
+                            }
+                        }
+                        if ("天数".equals(unit)) {
+                            // 将 actualValue 换算成 H
+                            BigDecimal hours = actualValue.multiply(new BigDecimal("24"));
+                            tempTotalHourCount = tempTotalHourCount.add(hours);
+                            if (hourCountPair.containsKey(report.getDeptId())) {
+                                BigDecimal tempHourCount = hourCountPair.get(report.getDeptId());
+                                hourCountPair.put(report.getDeptId(), tempTotalHourCount.add(tempHourCount));
+                            } else {
+                                hourCountPair.put(report.getDeptId(), 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));
+                            } else {
+                                waterVolumePair.put(report.getDeptId(), 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));
+                            } else {
+                                cumulativeWorkingWellPair.put(report.getDeptId(), tempTotalCumulativeWorkingWell);
+                            }
+                        }
+                        if ("段数".equals(unit)) {
+                            // 累计施工层
+                            tempTotalCumulativeWorkingLayers = tempTotalCumulativeWorkingLayers.add(actualValue);
+                            if (cumulativeWorkingLayersPair.containsKey(report.getDeptId())) {
+                                BigDecimal tempWorkingLayer = cumulativeWorkingLayersPair.get(report.getDeptId());
+                                cumulativeWorkingLayersPair.put(report.getDeptId(), tempTotalCumulativeWorkingLayers.add(tempWorkingLayer));
+                            } else {
+                                cumulativeWorkingLayersPair.put(report.getDeptId(), 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));
+                            } else {
+                                pumpTripsPair.put(report.getDeptId(), tempTotalPumpTrips);
+                            }
+                        }
+                        if ("台次".equals(unit) && ("当日仪表".equals(attr.getName()) || "当日混砂".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));
+                            } else {
+                                mixSandPair.put(report.getDeptId(), tempTotalMixSand);
+                            }
+                        }
+                    }
+                }
+            });
+            // 循环遍历所有瑞都日报后 重新组装每个队伍的工作量数据
+            // 将 deptId-projectId-taskId 作为唯一键 生成汇总统计报表
+            Set<String> deptIdTaskIds = new HashSet<>();
+            dailyReports.forEach(report -> {
+                // uniqueKey = deptId-taskId
+                String uniqueKey = StrUtil.join("-", report.getDeptId(), report.getProjectId(), report.getTaskId());
+                deptIdTaskIds.add(uniqueKey);
+            });
+            // deptIdTaskIds 集合中就是要显示的汇总报表数据
+            if (CollUtil.isNotEmpty(deptIdTaskIds)) {
+                deptIdTaskIds.forEach(dt -> {
+                    // 拆分 uniqueKey
+                    String[] deptIdTaskIdArray = dt.split("-");
+                    Long deptId = Long.valueOf(deptIdTaskIdArray[0]);
+                    Long projectId = Long.valueOf(deptIdTaskIdArray[1]);
+                    Long taskId = Long.valueOf(deptIdTaskIdArray[2]);
+                    IotRdDailyReportStatisticsRespVO uniqueReport = new IotRdDailyReportStatisticsRespVO();
+                    List<IotRdDailyReportStatisticsItemVO> items = new ArrayList<>();
+                    if (teamDeptPair.containsKey(deptId)) {
+                        uniqueReport.setDeptName(teamDeptPair.get(deptId));
+                    }
+                    if (teamProjectPair.containsKey(deptId)) {
+                        Long parentId = teamProjectPair.get(deptId);
+                        if (projectDeptPair.containsKey(parentId)) {
+                            uniqueReport.setProjectDeptName(projectDeptPair.get(parentId));
+                        }
+                    }
+                    if (projectPair.containsKey(projectId)) {
+                        uniqueReport.setManufactureName(projectPair.get(projectId));
+                    }
+                    if (taskPair.containsKey(taskId)) {
+                        uniqueReport.setWellName(taskPair.get(taskId));
+                    }
+                    if (taskTechniquePair.containsKey(taskId)) {
+                        uniqueReport.setTechniques(taskTechniquePair.get(taskId));
+                    }
+                    // 总工作量
+                    if (taskWorkloadPair.containsKey(taskId)) {
+                        uniqueReport.setWorkloadDesign(taskWorkloadPair.get(taskId));
+                    }
+                    // 以队伍为维度 设置每种施工工艺的工作量 总和
+                    if (bridgePlugPair.containsKey(deptId)) {
+                        // 钻可溶桥塞  钻复合桥塞
+                        IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
+                        item.setUnit("个数");
+                        item.setWorkload(bridgePlugPair.get(deptId));
+                        items.add(item);
+                    }
+                    if (runCountPair.containsKey(deptId)) {
+                        // 通刮洗  冲砂
+                        IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
+                        item.setUnit("趟数");
+                        item.setWorkload(runCountPair.get(deptId));
+                        items.add(item);
+                    }
+                    if (hourCountPair.containsKey(deptId)) {
+                        // 液氮泵车(时间D)  千型泵车(时间H)
+                        IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
+                        item.setUnit("小时");
+                        item.setWorkload(hourCountPair.get(deptId));
+                        items.add(item);
+                    }
+                    if (waterVolumePair.containsKey(deptId)) {
+                        // 注水
+                        IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
+                        item.setUnit("方");
+                        item.setWorkload(waterVolumePair.get(deptId));
+                        items.add(item);
+                    }
+                    if (cumulativeWorkingWellPair.containsKey(deptId)) {
+                        // 连续油管常规作业
+                        IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
+                        item.setUnit("井数");
+                        item.setWorkload(cumulativeWorkingWellPair.get(deptId));
+                        items.add(item);
+                    }
+                    if (cumulativeWorkingLayersPair.containsKey(deptId)) {
+                        // 压裂大包 压裂总包
+                        IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
+                        item.setUnit("段数");
+                        item.setWorkload(cumulativeWorkingLayersPair.get(deptId));
+                        items.add(item);
+                    }
+                    if (pumpTripsPair.containsKey(deptId)) {
+                        // 主压裂车 当日泵车台次
+                        IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
+                        item.setUnit("台次");
+                        item.setWorkload(pumpTripsPair.get(deptId));
+                        items.add(item);
+                    }
+                    if (mixSandPair.containsKey(deptId)) {
+                        // 当日仪表/混砂 台次
+                        IotRdDailyReportStatisticsItemVO item = new IotRdDailyReportStatisticsItemVO();
+                        item.setUnit("台次");
+                        item.setWorkload(mixSandPair.get(deptId));
+                        items.add(item);
+                    }
+                    uniqueReport.setItems(items);
+                    result.add(uniqueReport);
+                });
+            }
+        }
+        return result;
+    }
+
+}

+ 55 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreportitem/IotRdDailyReportItemService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.service.iotrddailyreportitem;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo.IotRdDailyReportItemPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo.IotRdDailyReportItemSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreportitem.IotRdDailyReportItemDO;
+
+import javax.validation.Valid;
+
+/**
+ * 瑞都日报 (工作量)明细 Service 接口
+ *
+ * @author ruiqi
+ */
+public interface IotRdDailyReportItemService {
+
+    /**
+     * 创建瑞都日报 (工作量)明细
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotRdDailyReportItem(@Valid IotRdDailyReportItemSaveReqVO createReqVO);
+
+    /**
+     * 更新瑞都日报 (工作量)明细
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotRdDailyReportItem(@Valid IotRdDailyReportItemSaveReqVO updateReqVO);
+
+    /**
+     * 删除瑞都日报 (工作量)明细
+     *
+     * @param id 编号
+     */
+    void deleteIotRdDailyReportItem(Long id);
+
+    /**
+     * 获得瑞都日报 (工作量)明细
+     *
+     * @param id 编号
+     * @return 瑞都日报 (工作量)明细
+     */
+    IotRdDailyReportItemDO getIotRdDailyReportItem(Long id);
+
+    /**
+     * 获得瑞都日报 (工作量)明细分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 瑞都日报 (工作量)明细分页
+     */
+    PageResult<IotRdDailyReportItemDO> getIotRdDailyReportItemPage(IotRdDailyReportItemPageReqVO pageReqVO);
+
+}

+ 71 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrddailyreportitem/IotRdDailyReportItemServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.pms.service.iotrddailyreportitem;
+
+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.iotrddailyreportitem.vo.IotRdDailyReportItemPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreportitem.vo.IotRdDailyReportItemSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotrddailyreportitem.IotRdDailyReportItemDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotrddailyreportitem.IotRdDailyReportItemMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_RD_DAILY_REPORT_ITEM_NOT_EXISTS;
+
+/**
+ * 瑞都日报 (工作量)明细 Service 实现类
+ *
+ * @author ruiqi
+ */
+@Service
+@Validated
+public class IotRdDailyReportItemServiceImpl implements IotRdDailyReportItemService {
+
+    @Resource
+    private IotRdDailyReportItemMapper iotRdDailyReportItemMapper;
+
+    @Override
+    public Long createIotRdDailyReportItem(IotRdDailyReportItemSaveReqVO createReqVO) {
+        // 插入
+        IotRdDailyReportItemDO iotRdDailyReportItem = BeanUtils.toBean(createReqVO, IotRdDailyReportItemDO.class);
+        iotRdDailyReportItemMapper.insert(iotRdDailyReportItem);
+        // 返回
+        return iotRdDailyReportItem.getId();
+    }
+
+    @Override
+    public void updateIotRdDailyReportItem(IotRdDailyReportItemSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotRdDailyReportItemExists(updateReqVO.getId());
+        // 更新
+        IotRdDailyReportItemDO updateObj = BeanUtils.toBean(updateReqVO, IotRdDailyReportItemDO.class);
+        iotRdDailyReportItemMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotRdDailyReportItem(Long id) {
+        // 校验存在
+        validateIotRdDailyReportItemExists(id);
+        // 删除
+        iotRdDailyReportItemMapper.deleteById(id);
+    }
+
+    private void validateIotRdDailyReportItemExists(Long id) {
+        if (iotRdDailyReportItemMapper.selectById(id) == null) {
+            throw exception(IOT_RD_DAILY_REPORT_ITEM_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotRdDailyReportItemDO getIotRdDailyReportItem(Long id) {
+        return iotRdDailyReportItemMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotRdDailyReportItemDO> getIotRdDailyReportItemPage(IotRdDailyReportItemPageReqVO pageReqVO) {
+        return iotRdDailyReportItemMapper.selectPage(pageReqVO);
+    }
+
+}

+ 8 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java

@@ -107,4 +107,12 @@ public interface DictDataService {
      */
      */
     List<DictDataDO> getDictDataListByDictType(String dictType);
     List<DictDataDO> getDictDataListByDictType(String dictType);
 
 
+    /**
+     * 获得指定数据类型 指定value集合 的字典数据列表
+     *
+     * @param dictType 字典类型
+     * @return 字典数据列表
+     */
+    List<DictDataDO> getDictDataListByDictTypeAndValues(String dictType, Collection<String> values);
+
 }
 }

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java

@@ -176,4 +176,9 @@ public class DictDataServiceImpl implements DictDataService {
         return list;
         return list;
     }
     }
 
 
+    @Override
+    public List<DictDataDO> getDictDataListByDictTypeAndValues(String dictType, Collection<String> values) {
+        return dictDataMapper.selectByDictTypeAndValues(dictType, values);
+    }
+
 }
 }