Ver Fonte

✨ feat: 完善运行记录 page2 分页查询及工单明细聚合

- 支持按当前部门及其子部门查询运行记录工单
- 支持按工单名称和负责人进行模糊搜索
- 支持按工单状态和创建时间范围筛选
- 分页查询主表后批量查询对应设备明细,避免逐条查询
- 聚合设备编号、设备名称及已填、未填设备数量
- 排除日报虚拟设备,不计入设备数量统计
- 修复 MyBatis 自定义 selectList 与 BaseMapper 方法重名导致的参数绑定异常
- 使用专用明细 SQL,避免非表字段参与 MyBatis-Plus 自动查询
Zimo há 3 dias atrás
pai
commit
11f0c5891e

Diff do ficheiro suprimidas por serem muito extensas
+ 277 - 261
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/IotOpeationFillController.java


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

@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+import java.time.LocalDateTime;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+import org.springframework.format.annotation.DateTimeFormat;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 运行记录列表 Request VO")
+@Data
+public class IotOperationRecordPageVO extends PageParam {
+    @Schema(description = "公司 ID")
+    @NotNull(message = "公司 ID 不能为空")
+    private Long deptId;
+
+    @Schema(description = "查询内容")
+    private String fillContent;
+
+    @Schema(description = "工单状态")
+    @Min(value = 0, message = "工单状态不正确")
+    @Max(value = 3, message = "工单状态不正确")
+    private Integer orderStatus;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+}

+ 4 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotopeationfill/IotOpeationFillMapper.java

@@ -40,6 +40,9 @@ import java.util.Set;
 @Mapper
 @Mapper
 public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
 public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
 
 
+    @TenantIgnore
+    List<IotOpeationFillDO> selectListByOrderIds(@Param("orderIds") Collection<Long> orderIds);
+
     default PageResult<IotOpeationFillDO> selectPage(IotOpeationFillPageReqVO reqVO) {
     default PageResult<IotOpeationFillDO> selectPage(IotOpeationFillPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<IotOpeationFillDO>()
         return selectPage(reqVO, new LambdaQueryWrapperX<IotOpeationFillDO>()
                 .eqIfPresent(IotOpeationFillDO::getDeviceCode, reqVO.getDeviceCode())
                 .eqIfPresent(IotOpeationFillDO::getDeviceCode, reqVO.getDeviceCode())
@@ -64,7 +67,7 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
      * @return 返回符合条件的瑞恒日报记录
      * @return 返回符合条件的瑞恒日报记录
      */
      */
     @TenantIgnore
     @TenantIgnore
-    List<IotOpeationFillDO> selectList(@Param("reqVO") IotOpeationFillPageReqVO reqVO);
+    List<IotOpeationFillDO> selectListByReqVO(@Param("reqVO") IotOpeationFillPageReqVO reqVO);
 
 
     /**
     /**
      * 根据条件查询日报记录
      * 根据条件查询日报记录

+ 36 - 13
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotopeationfill/IotOpeationFillOrderMapper.java

@@ -1,19 +1,17 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill;
 package cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill;
 
 
+import java.util.Collection;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
-import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOperationRecordPageVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.Collection;
-import java.util.List;
 
 
 /**
 /**
  * 运行记录填报 Mapper
  * 运行记录填报 Mapper
@@ -23,6 +21,31 @@ import java.util.List;
 @Mapper
 @Mapper
 public interface IotOpeationFillOrderMapper extends BaseMapperX<IotOpeationFillOrderDO> {
 public interface IotOpeationFillOrderMapper extends BaseMapperX<IotOpeationFillOrderDO> {
 
 
+    @TenantIgnore
+    default PageResult<IotOpeationFillOrderDO> selectPage(IotOperationRecordPageVO reqVO,
+            Collection<Long> deptIds) {
+        String keyword = StrUtil.trim(reqVO.getFillContent());
+        LambdaQueryWrapperX<IotOpeationFillOrderDO> queryWrapper = new LambdaQueryWrapperX<IotOpeationFillOrderDO>()
+                .in(IotOpeationFillOrderDO::getDeptId, deptIds)
+                .eqIfPresent(IotOpeationFillOrderDO::getOrderStatus, reqVO.getOrderStatus())
+                .betweenIfPresent(IotOpeationFillOrderDO::getCreateTime, reqVO.getCreateTime());
+        if (StrUtil.isNotBlank(keyword)) {
+            queryWrapper.and(wrapper -> wrapper
+                    .like(IotOpeationFillOrderDO::getOrderName, keyword)
+                    .or()
+                    .like(IotOpeationFillOrderDO::getUserName, keyword)
+                    .or()
+                    .exists("SELECT 1 FROM rq_iot_opeation_fill fill "
+                            + "WHERE fill.order_id = rq_iot_opeation_fill_order.id "
+                            + "AND fill.deleted = 0 "
+                            + "AND (fill.device_name LIKE CONCAT('%', {0}, '%') "
+                            + "OR fill.device_code LIKE CONCAT('%', {1}, '%'))",
+                            keyword, keyword));
+        }
+        return selectPage(reqVO, queryWrapper
+                .orderByDesc(IotOpeationFillOrderDO::getCreateTime));
+    }
+
     @TenantIgnore
     @TenantIgnore
     default PageResult<IotOpeationFillOrderDO> selectPage(IotOpeationFillPageReqVO reqVO) {
     default PageResult<IotOpeationFillOrderDO> selectPage(IotOpeationFillPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<IotOpeationFillOrderDO>()
         return selectPage(reqVO, new LambdaQueryWrapperX<IotOpeationFillOrderDO>()
@@ -35,11 +58,11 @@ public interface IotOpeationFillOrderMapper extends BaseMapperX<IotOpeationFillO
                 .betweenIfPresent(IotOpeationFillOrderDO::getCreateTime, reqVO.getCreateTime())
                 .betweenIfPresent(IotOpeationFillOrderDO::getCreateTime, reqVO.getCreateTime())
                 .orderByDesc(IotOpeationFillOrderDO::getId));
                 .orderByDesc(IotOpeationFillOrderDO::getId));
     }
     }
+
     @TenantIgnore
     @TenantIgnore
-    default PageResult<IotOpeationFillOrderDO>  selectPage1(IotOpeationFillPageReqVO reqVO,
-                                                           Collection<Long> deptIds,
-                                                           Collection<Long> orderIds
-                                                           ) {
+    default PageResult<IotOpeationFillOrderDO> selectPage1(IotOpeationFillPageReqVO reqVO,
+            Collection<Long> deptIds,
+            Collection<Long> orderIds) {
         return selectPage(reqVO, new LambdaQueryWrapperX<IotOpeationFillOrderDO>()
         return selectPage(reqVO, new LambdaQueryWrapperX<IotOpeationFillOrderDO>()
                 .inIfPresent(IotOpeationFillOrderDO::getDeptId, deptIds)
                 .inIfPresent(IotOpeationFillOrderDO::getDeptId, deptIds)
                 .inIfPresent(IotOpeationFillOrderDO::getId, orderIds)
                 .inIfPresent(IotOpeationFillOrderDO::getId, orderIds)
@@ -52,4 +75,4 @@ public interface IotOpeationFillOrderMapper extends BaseMapperX<IotOpeationFillO
                 .orderByAsc(IotOpeationFillOrderDO::getDeptId));
                 .orderByAsc(IotOpeationFillOrderDO::getDeptId));
 
 
     }
     }
-}
+}

+ 28 - 28
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillService.java

@@ -1,8 +1,19 @@
 package cn.iocoder.yudao.module.pms.service.iotopeationfill;
 package cn.iocoder.yudao.module.pms.service.iotopeationfill;
 
 
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.validation.Valid;
+
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsRespVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOperationRecordPageVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
@@ -11,12 +22,6 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModel
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
 
 
-import javax.validation.Valid;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 /**
 /**
  * 运行记录填报 Service 接口
  * 运行记录填报 Service 接口
  *
  *
@@ -47,6 +52,7 @@ public interface IotOpeationFillService {
     void deleteIotOpeationFill(Long id);
     void deleteIotOpeationFill(Long id);
 
 
     int upFill1(IotOpeationFillSaveReqVO vo);
     int upFill1(IotOpeationFillSaveReqVO vo);
+
     int upFill2(IotOpeationFillSaveReqVO vo);
     int upFill2(IotOpeationFillSaveReqVO vo);
 
 
     /**
     /**
@@ -79,7 +85,8 @@ public interface IotOpeationFillService {
 
 
     /**
     /**
      * 查询 指定部门 指定日期的 瑞鹰日报
      * 查询 指定部门 指定日期的 瑞鹰日报
-     * @param deptId 部门id
+     *
+     * @param deptId        部门id
      * @param reportDateStr yyyy-MM-dd格式的日期
      * @param reportDateStr yyyy-MM-dd格式的日期
      * @return
      * @return
      */
      */
@@ -87,7 +94,8 @@ public interface IotOpeationFillService {
 
 
     /**
     /**
      * 查询 指定部门 指定日期的 瑞恒日报
      * 查询 指定部门 指定日期的 瑞恒日报
-     * @param deptId 部门id
+     *
+     * @param deptId        部门id
      * @param reportDateStr yyyy-MM-dd格式的日期
      * @param reportDateStr yyyy-MM-dd格式的日期
      * @return
      * @return
      */
      */
@@ -109,14 +117,10 @@ public interface IotOpeationFillService {
 
 
     List<IotOpeationFillDO> flList(IotOpeationFillDO vo);
     List<IotOpeationFillDO> flList(IotOpeationFillDO vo);
 
 
-    PageResult<IotOpeationFillOrderDO> fillList2(IotOpeationFillPageReqVO vo,Collection<Long> deptIds);
-
-
-
+    PageResult<IotOpeationFillOrderDO> fillList2(IotOpeationFillPageReqVO vo, Collection<Long> deptIds);
 
 
     int insertLog(List<IotDeviceRunLogDO> logDO);
     int insertLog(List<IotDeviceRunLogDO> logDO);
 
 
-
     int insertLog1(IotDeviceRunLogDO logDO);
     int insertLog1(IotDeviceRunLogDO logDO);
 
 
     int updateLog(IotDeviceRunLogDO logDO);
     int updateLog(IotDeviceRunLogDO logDO);
@@ -125,6 +129,7 @@ public interface IotOpeationFillService {
 
 
     /**
     /**
      * 更新填写状态
      * 更新填写状态
+     *
      * @param vo
      * @param vo
      * @return
      * @return
      */
      */
@@ -132,6 +137,7 @@ public interface IotOpeationFillService {
 
 
     /**
     /**
      * 批量更新状态
      * 批量更新状态
+     *
      * @param list
      * @param list
      * @return
      * @return
      */
      */
@@ -148,6 +154,7 @@ public interface IotOpeationFillService {
 
 
     /**
     /**
      * 更新工单状态
      * 更新工单状态
+     *
      * @param vo
      * @param vo
      * @return
      * @return
      */
      */
@@ -157,22 +164,16 @@ public interface IotOpeationFillService {
 
 
     int updateFillOrder2(IotDeviceRunLogDO vo);
     int updateFillOrder2(IotDeviceRunLogDO vo);
 
 
-
-
-
     List<IotOpeationFillDO> devList(IotOpeationFillDO fillDO);
     List<IotOpeationFillDO> devList(IotOpeationFillDO fillDO);
 
 
-
     List<IotOpeationFillDO> orderList(IotOpeationFillDO fillDO);
     List<IotOpeationFillDO> orderList(IotOpeationFillDO fillDO);
 
 
-
     List<IotOpeationFillDO> delList(IotOpeationFillDO fillDO);
     List<IotOpeationFillDO> delList(IotOpeationFillDO fillDO);
 
 
     int delRepeat(IotOpeationFillDO fillDO);
     int delRepeat(IotOpeationFillDO fillDO);
 
 
     int delRepeatOrder(IotOpeationFillDO fillDO);
     int delRepeatOrder(IotOpeationFillDO fillDO);
 
 
-
     PageResult<IotOpeationFillOrderDO> fillRecords(IotOpeationFillPageReqVO vo);
     PageResult<IotOpeationFillOrderDO> fillRecords(IotOpeationFillPageReqVO vo);
 
 
     PageResult<IotDeviceRespVO> getFillDevices1(IotOpeationFillPageReqVO vo);
     PageResult<IotDeviceRespVO> getFillDevices1(IotOpeationFillPageReqVO vo);
@@ -185,6 +186,7 @@ public interface IotOpeationFillService {
 
 
     /**
     /**
      * 日报执行方法
      * 日报执行方法
+     *
      * @return
      * @return
      */
      */
     List<IotOpeationFillDO> reportMethod(List<IotOpeationFillOrderDO> orderList);
     List<IotOpeationFillDO> reportMethod(List<IotOpeationFillOrderDO> orderList);
@@ -199,21 +201,18 @@ public interface IotOpeationFillService {
 
 
     IotDeviceRunLogDO reportData(IotDeviceRunLogDO runLogDO);
     IotDeviceRunLogDO reportData(IotDeviceRunLogDO runLogDO);
 
 
-
-
-        // 批量查询已存在的日志
+    // 批量查询已存在的日志
     List<IotDeviceRunLogDO> batchQueryExistingLogs(List<IotDeviceRunLogDO> logList);
     List<IotDeviceRunLogDO> batchQueryExistingLogs(List<IotDeviceRunLogDO> logList);
 
 
-        // 批量插入
+    // 批量插入
     int batchInsertLogs(List<IotDeviceRunLogDO> logList);
     int batchInsertLogs(List<IotDeviceRunLogDO> logList);
 
 
-        // 批量更新普通日志
+    // 批量更新普通日志
     int batchUpdateLogs(List<IotDeviceRunLogDO> logList);
     int batchUpdateLogs(List<IotDeviceRunLogDO> logList);
 
 
-        // 批量更新累计日志
+    // 批量更新累计日志
     int batchUpdateSumLogs(List<IotDeviceRunLogDO> logList);
     int batchUpdateSumLogs(List<IotDeviceRunLogDO> logList);
 
 
-
     IotDeviceRunLogDO maxReportData(IotDeviceRunLogDO runLogDO);
     IotDeviceRunLogDO maxReportData(IotDeviceRunLogDO runLogDO);
 
 
     List<IotDeviceRunLogDO> batchQueryMaxReportData(List<IotDeviceRunLogDO> queryLogs);
     List<IotDeviceRunLogDO> batchQueryMaxReportData(List<IotDeviceRunLogDO> queryLogs);
@@ -238,4 +237,5 @@ public interface IotOpeationFillService {
 
 
     List<IotOpeationFillDO> reportList2(IotOpeationFillDO fillDO);
     List<IotOpeationFillDO> reportList2(IotOpeationFillDO fillDO);
 
 
-}
+    PageResult<IotOpeationFillOrderDO> getOperationRecordPage(Set<Long> deptIds, IotOperationRecordPageVO vo);
+}

+ 124 - 72
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillServiceImpl.java

@@ -1,7 +1,36 @@
 package cn.iocoder.yudao.module.pms.service.iotopeationfill;
 package cn.iocoder.yudao.module.pms.service.iotopeationfill;
 
 
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPEATION_FILL_NOT_EXISTS;
+
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.StringJoiner;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+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.iotmodeltemplateattrs.vo.IotModelTemplateAttrsRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsRespVO;
-import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOperationRecordPageVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
@@ -12,24 +41,6 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFil
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillOrderMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillOrderMapper;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-
-
-import java.security.SecureRandom;
-import java.util.*;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPEATION_FILL_NOT_EXISTS;
 
 
 /**
 /**
  * 运行记录填报 Service 实现类
  * 运行记录填报 Service 实现类
@@ -113,7 +124,6 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return iotOpeationFillMapper.selectPage(pageReqVO);
         return iotOpeationFillMapper.selectPage(pageReqVO);
     }
     }
 
 
-
     @Override
     @Override
     public List<IotOpeationFillDO> getFillDevices(List<Long> deviceIds) {
     public List<IotOpeationFillDO> getFillDevices(List<Long> deviceIds) {
         return iotOpeationFillMapper.getFillDevices(deviceIds);
         return iotOpeationFillMapper.getFillDevices(deviceIds);
@@ -122,9 +132,6 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
     @Override
     @Override
     public List<IotModelTemplateAttrsDO> getAttrsById(IotModelTemplateAttrsRespVO vo) {
     public List<IotModelTemplateAttrsDO> getAttrsById(IotModelTemplateAttrsRespVO vo) {
 
 
-
-
-
         return iotOpeationFillMapper.getAttrsById(vo);
         return iotOpeationFillMapper.getAttrsById(vo);
     }
     }
 
 
@@ -153,19 +160,20 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return iotOpeationFillMapper.selectRhFillReports(deptId, reportDateStr);
         return iotOpeationFillMapper.selectRhFillReports(deptId, reportDateStr);
     }
     }
 
 
-
     @Override
     @Override
     public PageResult<IotOpeationFillOrderDO> fillRecords(IotOpeationFillPageReqVO vo) {
     public PageResult<IotOpeationFillOrderDO> fillRecords(IotOpeationFillPageReqVO vo) {
-        IPage<IotOpeationFillOrderDO> fillOrderDOIPage = iotOpeationFillMapper.fillRecords(Page.of(vo.getPageNo(), vo.getPageSize()),vo.getDeviceId(),vo.getOrderName(),vo.getOrderStatus());
-        return new PageResult<>(fillOrderDOIPage.getRecords(),fillOrderDOIPage.getTotal());
+        IPage<IotOpeationFillOrderDO> fillOrderDOIPage = iotOpeationFillMapper.fillRecords(
+                Page.of(vo.getPageNo(), vo.getPageSize()), vo.getDeviceId(), vo.getOrderName(), vo.getOrderStatus());
+        return new PageResult<>(fillOrderDOIPage.getRecords(), fillOrderDOIPage.getTotal());
     }
     }
 
 
     @Override
     @Override
     public PageResult<IotOpeationFillDO> fillListPage(IotOpeationFillPageVO vo) {
     public PageResult<IotOpeationFillDO> fillListPage(IotOpeationFillPageVO vo) {
 
 
-        IPage<IotOpeationFillDO> fillPage = iotOpeationFillMapper.fillListPage(Page.of(vo.getPageNo(), vo.getPageSize()),vo.getOrderId());
+        IPage<IotOpeationFillDO> fillPage = iotOpeationFillMapper
+                .fillListPage(Page.of(vo.getPageNo(), vo.getPageSize()), vo.getOrderId());
 
 
-        return new PageResult<>(fillPage.getRecords(),fillPage.getTotal());
+        return new PageResult<>(fillPage.getRecords(), fillPage.getTotal());
     }
     }
 
 
     @Override
     @Override
@@ -175,8 +183,8 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
          */
          */
 
 
         List<IotOpeationFillDO> fills = iotOpeationFillMapper.fills(deviceIds);
         List<IotOpeationFillDO> fills = iotOpeationFillMapper.fills(deviceIds);
-        if(fills.size()>0){
-            iotOpeationFillMapper.upFill(deptId,deviceIds);
+        if (fills.size() > 0) {
+            iotOpeationFillMapper.upFill(deptId, deviceIds);
         }
         }
     }
     }
 
 
@@ -217,12 +225,9 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         fillRespVO.setDeptId(vo.getDeptId());
         fillRespVO.setDeptId(vo.getDeptId());
         List<IotOpeationFillDO> fillList = iotOpeationFillMapper.getOrderIds(fillRespVO);
         List<IotOpeationFillDO> fillList = iotOpeationFillMapper.getOrderIds(fillRespVO);
         List<Long> orderIds = fillList.stream().map(IotOpeationFillDO::getOrderId).collect(Collectors.toList());
         List<Long> orderIds = fillList.stream().map(IotOpeationFillDO::getOrderId).collect(Collectors.toList());
-        return iotOpeationFillOrderMapper.selectPage1(vo,deptIds,orderIds);
+        return iotOpeationFillOrderMapper.selectPage1(vo, deptIds, orderIds);
     }
     }
 
 
-
-
-
     @Override
     @Override
     public int insertLog(List<IotDeviceRunLogDO> logDO) {
     public int insertLog(List<IotDeviceRunLogDO> logDO) {
         return iotOpeationFillMapper.insertLog(logDO);
         return iotOpeationFillMapper.insertLog(logDO);
@@ -313,27 +318,26 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return iotOpeationFillMapper.delRepeatOrder(fillDO);
         return iotOpeationFillMapper.delRepeatOrder(fillDO);
     }
     }
 
 
-
-
     @Override
     @Override
     public PageResult<IotDeviceRespVO> getFillDevices1(IotOpeationFillPageReqVO vo) {
     public PageResult<IotDeviceRespVO> getFillDevices1(IotOpeationFillPageReqVO vo) {
 
 
         Set<Long> idList = new HashSet<>();
         Set<Long> idList = new HashSet<>();
-        if(Objects.nonNull(vo.getDeptId())){
-            idList =  deptService.getChildDeptIdListFromCache(vo.getDeptId());
+        if (Objects.nonNull(vo.getDeptId())) {
+            idList = deptService.getChildDeptIdListFromCache(vo.getDeptId());
             idList.add(vo.getDeptId());
             idList.add(vo.getDeptId());
         }
         }
 
 
-
-        IPage<IotDeviceRespVO> fillOrderDOIPage = iotOpeationFillMapper.getFillDevices1(Page.of(vo.getPageNo(), vo.getPageSize()), idList);
-        return new PageResult<>(fillOrderDOIPage.getRecords(),fillOrderDOIPage.getTotal());
+        IPage<IotDeviceRespVO> fillOrderDOIPage = iotOpeationFillMapper
+                .getFillDevices1(Page.of(vo.getPageNo(), vo.getPageSize()), idList);
+        return new PageResult<>(fillOrderDOIPage.getRecords(), fillOrderDOIPage.getTotal());
     }
     }
 
 
     @Override
     @Override
     public PageResult<IotDeviceCountData> deviceCountList(IotOpeationFillPageReqVO vo) {
     public PageResult<IotDeviceCountData> deviceCountList(IotOpeationFillPageReqVO vo) {
-        IPage<IotDeviceCountData> countDataIPage = iotOpeationFillMapper.deviceCountList(Page.of(vo.getPageNo(),vo.getPageSize()),
-                vo.getDeptId(),vo.getCreateTime(),vo.getIsFill(),vo.getOrderName());
-        return new PageResult<>(countDataIPage.getRecords(),countDataIPage.getTotal());
+        IPage<IotDeviceCountData> countDataIPage = iotOpeationFillMapper.deviceCountList(
+                Page.of(vo.getPageNo(), vo.getPageSize()),
+                vo.getDeptId(), vo.getCreateTime(), vo.getIsFill(), vo.getOrderName());
+        return new PageResult<>(countDataIPage.getRecords(), countDataIPage.getTotal());
     }
     }
 
 
     @Override
     @Override
@@ -350,23 +354,20 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
     public List<IotOpeationFillDO> reportMethod(List<IotOpeationFillOrderDO> orderList) {
     public List<IotOpeationFillDO> reportMethod(List<IotOpeationFillOrderDO> orderList) {
         List<IotOpeationFillDO> devList = new ArrayList<>();
         List<IotOpeationFillDO> devList = new ArrayList<>();
 
 
-
         Set<Long> rhIdList = deptService.getChildDeptIdListFromCache(157L);
         Set<Long> rhIdList = deptService.getChildDeptIdListFromCache(157L);
         rhIdList.add(157L);
         rhIdList.add(157L);
 
 
-
-        Set<Long> ryIdList =  deptService.getChildDeptIdListFromCache(158L);
+        Set<Long> ryIdList = deptService.getChildDeptIdListFromCache(158L);
         ryIdList.add(158L);
         ryIdList.add(158L);
 
 
-
-        //判断工单主数据是否有值
-        if(orderList.size()>0){
-            //遍历工单主数据,根据dept_id查询是否为小队
-            for (IotOpeationFillOrderDO orderDO:orderList) {
+        // 判断工单主数据是否有值
+        if (orderList.size() > 0) {
+            // 遍历工单主数据,根据dept_id查询是否为小队
+            for (IotOpeationFillOrderDO orderDO : orderList) {
 
 
                 IotDeviceRunLogDO runLogDO = new IotDeviceRunLogDO();
                 IotDeviceRunLogDO runLogDO = new IotDeviceRunLogDO();
                 runLogDO.setDeptId(orderDO.getDeptId());
                 runLogDO.setDeptId(orderDO.getDeptId());
-                //获取队伍类型
+                // 获取队伍类型
                 IotDeviceRunLogDO teamType = iotOpeationFillMapper.getTeamType(runLogDO);
                 IotDeviceRunLogDO teamType = iotOpeationFillMapper.getTeamType(runLogDO);
 
 
                 List<IotOpeationFillOrderDO> childList = iotOpeationFillMapper.childList(orderDO);
                 List<IotOpeationFillOrderDO> childList = iotOpeationFillMapper.childList(orderDO);
@@ -384,20 +385,19 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
                     exitDev = iotOpeationFillMapper.orderDO1(fillDO);
                     exitDev = iotOpeationFillMapper.orderDO1(fillDO);
                 } while (exitDev != null); // 如果存在则继续循环生成新的随机数
                 } while (exitDev != null); // 如果存在则继续循环生成新的随机数
 
 
-
-                //如果是小队,则证明该部门为小队,创建对应日报虚拟设备
-                if(childList.size()==0){
+                // 如果是小队,则证明该部门为小队,创建对应日报虚拟设备
+                if (childList.size() == 0) {
                     IotOpeationFillDO devOrder = new IotOpeationFillDO();
                     IotOpeationFillDO devOrder = new IotOpeationFillDO();
                     devOrder.setDeviceCode("");
                     devOrder.setDeviceCode("");
                     devOrder.setDeviceName("生产日报");
                     devOrder.setDeviceName("生产日报");
 
 
-                    if(rhIdList.contains(orderDO.getDeptId())){
+                    if (rhIdList.contains(orderDO.getDeptId())) {
                         devOrder.setDeviceCategoryId(RH_CLASS_ID);
                         devOrder.setDeviceCategoryId(RH_CLASS_ID);
-                    }else if(ryIdList.contains(orderDO.getDeptId())&&teamType!=null){
-                        //队伍类型为zj则日报设备分类为钻井,否则为修井
-                        if(teamType.getPointCode().equals("zj")){
+                    } else if (ryIdList.contains(orderDO.getDeptId()) && teamType != null) {
+                        // 队伍类型为zj则日报设备分类为钻井,否则为修井
+                        if (teamType.getPointCode().equals("zj")) {
                             devOrder.setDeviceCategoryId(RY_ZJ_CLASS_ID);
                             devOrder.setDeviceCategoryId(RY_ZJ_CLASS_ID);
-                        }else{
+                        } else {
                             devOrder.setDeviceCategoryId(RY_XJ_CLASS_ID);
                             devOrder.setDeviceCategoryId(RY_XJ_CLASS_ID);
                         }
                         }
                     }
                     }
@@ -415,16 +415,16 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return devList;
         return devList;
     }
     }
 
 
-
     // 使用SecureRandom确保随机数的安全性
     // 使用SecureRandom确保随机数的安全性
     private static final SecureRandom random = new SecureRandom();
     private static final SecureRandom random = new SecureRandom();
 
 
     // 8位数字的最小值和最大值
     // 8位数字的最小值和最大值
-    private static final int MIN_8_DIGIT = 10000000;  // 最小的8位整数
-    private static final int MAX_8_DIGIT = 99999999;  // 最大的8位整数
+    private static final int MIN_8_DIGIT = 10000000; // 最小的8位整数
+    private static final int MAX_8_DIGIT = 99999999; // 最大的8位整数
 
 
     /**
     /**
      * 生成8位整型随机数
      * 生成8位整型随机数
+     *
      * @return 8位整数(范围:10000000 - 99999999)
      * @return 8位整数(范围:10000000 - 99999999)
      */
      */
     public static int generate8DigitInteger() {
     public static int generate8DigitInteger() {
@@ -432,8 +432,6 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return MIN_8_DIGIT + random.nextInt(MAX_8_DIGIT - MIN_8_DIGIT + 1);
         return MIN_8_DIGIT + random.nextInt(MAX_8_DIGIT - MIN_8_DIGIT + 1);
     }
     }
 
 
-
-
     @Override
     @Override
     public IotOpeationFillDO isReport(IotOpeationFillDO fillDO) {
     public IotOpeationFillDO isReport(IotOpeationFillDO fillDO) {
         return iotOpeationFillMapper.isReport(fillDO);
         return iotOpeationFillMapper.isReport(fillDO);
@@ -517,8 +515,7 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
                         // Value 映射:替换为你的实际字段 getter(如 getIsReport()、getStatus())
                         // Value 映射:替换为你的实际字段 getter(如 getIsReport()、getStatus())
                         IotOpeationFillDO::getIsReport,
                         IotOpeationFillDO::getIsReport,
                         // 冲突解决策略(可选):若 Key 重复,取第一个值(或自定义逻辑)
                         // 冲突解决策略(可选):若 Key 重复,取第一个值(或自定义逻辑)
-                        (v1, v2) -> v1
-                ));
+                        (v1, v2) -> v1));
         return map;
         return map;
     }
     }
 
 
@@ -550,10 +547,11 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
                 // 第一个参数:Map 的 Key(取自 DO 的 Long 字段)
                 // 第一个参数:Map 的 Key(取自 DO 的 Long 字段)
                 // 第二个参数:Map 的 Value(DO 本身)
                 // 第二个参数:Map 的 Value(DO 本身)
                 .collect(Collectors.toMap(
                 .collect(Collectors.toMap(
-                        IotOpeationFillDO::getDeviceId,  // 示例:用 id 作为 Key,替换为实际字段(如 getOrderId())
-                        Function.identity(),       // Value:DO本身(简化写法)
-                        (oldValue, newValue) -> oldValue  // 重复Key时保留旧值(核心修复点)
-                        // 可选:如需保留新值,改为 (oldValue, newValue) -> newValue           // Value 直接是 DO 实例(可简化为 Function.identity())
+                        IotOpeationFillDO::getDeviceId, // 示例:用 id 作为 Key,替换为实际字段(如 getOrderId())
+                        Function.identity(), // Value:DO本身(简化写法)
+                        (oldValue, newValue) -> oldValue // 重复Key时保留旧值(核心修复点)
+                // 可选:如需保留新值,改为 (oldValue, newValue) -> newValue // Value 直接是 DO 实例(可简化为
+                // Function.identity())
                 ));
                 ));
         return fillDOMap;
         return fillDOMap;
     }
     }
@@ -563,4 +561,58 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return iotOpeationFillMapper.reportList2(fillDO);
         return iotOpeationFillMapper.reportList2(fillDO);
     }
     }
 
 
+    @Override
+    public PageResult<IotOpeationFillOrderDO> getOperationRecordPage(Set<Long> deptIds,
+            IotOperationRecordPageVO vo) {
+        if (deptIds.isEmpty()) {
+            return PageResult.empty();
+        }
+        PageResult<IotOpeationFillOrderDO> records = iotOpeationFillOrderMapper.selectPage(vo, deptIds);
+        if (records.getList().isEmpty()) {
+            return records;
+        }
+
+        List<Long> recordIds = records.getList().stream()
+                .map(IotOpeationFillOrderDO::getId)
+                .collect(Collectors.toList());
+        List<IotOpeationFillDO> fills = iotOpeationFillMapper.selectListByOrderIds(recordIds);
+        Map<Long, List<IotOpeationFillDO>> fillsByOrderId = fills.stream()
+                .collect(Collectors.groupingBy(IotOpeationFillDO::getOrderId));
+
+        for (IotOpeationFillOrderDO record : records.getList()) {
+            if (record.getCreateTime() != null && record.getUpdateTime() != null
+                    && record.getCreateTime().isEqual(record.getUpdateTime())) {
+                record.setUpdateTime(null);
+            }
+
+            List<IotOpeationFillDO> orderFills = fillsByOrderId.get(record.getId());
+            if (orderFills == null || orderFills.isEmpty()) {
+                continue;
+            }
+
+            StringJoiner devices = new StringJoiner(", ");
+            int allDev = 0;
+            int fillDev = 0;
+            int unFillDev = 0;
+            for (IotOpeationFillDO fill : orderFills) {
+                devices.add(fill.getDeviceCode() + "/" + fill.getDeviceName());
+                // 与 page1 保持一致:日报虚拟设备不参与设备数量统计
+                if (fill.getDeviceName() != null && !"日报填报".equals(fill.getDeviceName())) {
+                    allDev++;
+                    if (fill.getIsFill() == 1) {
+                        fillDev++;
+                    } else if (fill.getIsFill() == 0) {
+                        unFillDev++;
+                    }
+                }
+            }
+            record.setFillList(devices.toString());
+            record.setAllDev(allDev);
+            record.setFillDev(fillDev);
+            record.setUnFillDev(unFillDev);
+        }
+
+        return records;
+    }
+
 }
 }

+ 2 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrhdailyreport/IotRhDailyReportServiceImpl.java

@@ -329,7 +329,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                     fillReqVO.setCreateTimeStr(reportDateStr);
                     fillReqVO.setCreateTimeStr(reportDateStr);
                     fillReqVO.setDeptId(deptId);
                     fillReqVO.setDeptId(deptId);
                     fillReqVO.setDeviceIds(pumpDeviceIds);
                     fillReqVO.setDeviceIds(pumpDeviceIds);
-                    List<IotOpeationFillDO> fills = iotOpeationFillMapper.selectList(fillReqVO);
+                    List<IotOpeationFillDO> fills = iotOpeationFillMapper.selectListByReqVO(fillReqVO);
                     Set<Long> fillPumpDeviceIds = new HashSet<>();
                     Set<Long> fillPumpDeviceIds = new HashSet<>();
                     if (CollUtil.isNotEmpty(fills)) {
                     if (CollUtil.isNotEmpty(fills)) {
                         fills.forEach(fill -> {
                         fills.forEach(fill -> {
@@ -4375,4 +4375,4 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
         return iotRhDailyReportMapper.relocationDays(reqVO);
         return iotRhDailyReportMapper.relocationDays(reqVO);
     }
     }
 
 
-}
+}

+ 18 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -776,7 +776,7 @@
         </if>
         </if>
     </select>
     </select>
 
 
-    <select id="selectList" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO"
+    <select id="selectListByReqVO" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         SELECT * FROM rq_iot_opeation_fill
         SELECT * FROM rq_iot_opeation_fill
         <where>
         <where>
@@ -804,6 +804,23 @@
         </where>
         </where>
     </select>
     </select>
 
 
+    <select id="selectListByOrderIds"
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+        SELECT id,
+               device_code,
+               device_name,
+               order_id,
+               is_fill,
+               is_report
+        FROM rq_iot_opeation_fill
+        WHERE deleted = 0
+          AND order_id IN
+        <foreach collection="orderIds" item="orderId" open="(" separator="," close=")">
+            #{orderId}
+        </foreach>
+        ORDER BY id ASC
+    </select>
+
 
 
     <select id="getAttrsById" parameterType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO"
     <select id="getAttrsById" parameterType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO">
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO">

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff