Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

Zimo 7 tuntia sitten
vanhempi
commit
8ece9bd9ef

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

@@ -66,6 +66,9 @@ public class IotDeviceRunLogPageReqVO extends PageParam {
 
     private String fillContent;
 
+    @Schema(description = "是否累计", example = "1累计值  0非累计值")
+    private Integer isSum;
+
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
@@ -87,4 +90,7 @@ public class IotDeviceRunLogPageReqVO extends PageParam {
 
     @Schema(description = "保养开始时间")
     private LocalDateTime actualStartTime;
+
+    @Schema(description = "创建时间 yyyy-MM-dd", example = "2026-06-17")
+    private String createTimeStr;
 }

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

@@ -79,4 +79,9 @@ public class IotOpeationFillPageReqVO extends PageParam {
     private String userName;
     private int isReport;
     private List<Long> deptIds;
+
+    private Collection<Long> deviceIds;
+
+    @Schema(description = "创建时间 yyyy-MM-dd", example = "2026-06-17")
+    private String createTimeStr;
 }

+ 20 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotrydailyreport/IotRyDailyReportController.java

@@ -2353,10 +2353,20 @@ public class IotRyDailyReportController {
         Long deptId = pageReqVO.getDeptId();
         // 钻井或修井部门 队伍
         List<Long> zjOrXjDeptIds = new ArrayList<>();
+        // 可用的部门id集合
+        Set<Long> availableDeptIds = new HashSet<>();
         if (ObjUtil.isNotEmpty(deptId)) {
             // 查询指定部门下所有子部门
             Set<Long> childDeptIds = deptService.getChildDeptIdListFromCache(deptId);
             Map<Long, DeptDO> allDeptPair = deptService.getDeptMap(childDeptIds);
+            // 过滤掉关闭的部门
+            if (CollUtil.isNotEmpty(allDeptPair)) {
+                allDeptPair.forEach((tempDeptId, dept) -> {
+                    if (0 == dept.getStatus()) {
+                        availableDeptIds.add(tempDeptId);
+                    }
+                });
+            }
             // 钻井日报汇总 分母为 钻井施工队伍  修井日报汇总分母分母为修井施工队伍
             // 1钻井  2修井
             String projectClassification = pageReqVO.getProjectClassification();
@@ -2374,6 +2384,13 @@ public class IotRyDailyReportController {
                 });
             }
         }
+        // 取 availableDeptIds zjOrXjDeptIds 2个集合的交集 当前查询条件下 的钻井 或 修井 部门id集合
+        Set<Long> overlapDeptIds = Stream.of(availableDeptIds)
+                .filter(Objects::nonNull)
+                .flatMap(Set::stream)
+                .filter(tempDeptId -> CollUtil.isNotEmpty(zjOrXjDeptIds) && zjOrXjDeptIds.contains(tempDeptId))
+                .collect(Collectors.toSet());
+
 
         // 统计设备利用率 查询非 dt zx 状态的日报
         // 钻井:日报状态 过滤掉 ‘等停dt’    修井:日报状态过滤掉 ‘等停dt’、‘整修zx’
@@ -2386,7 +2403,7 @@ public class IotRyDailyReportController {
         List<IotRyDailyReportDO> dailyReports = iotRyDailyReportMapper.dailyReports(pageReqVO);
         if (CollUtil.isNotEmpty(dailyReports)) {
             for (IotRyDailyReportDO dailyReport : dailyReports) {
-                if (zjOrXjDeptIds.contains(dailyReport.getDeptId())) {
+                if (overlapDeptIds.contains(dailyReport.getDeptId())) {
                     ++reportCount;
                 }
             }
@@ -2407,10 +2424,10 @@ public class IotRyDailyReportController {
         }
 
         // 所有项目部包含的队伍数量>0 并且 指定时间区间天数大于0
-        if (daysCount > 0 && zjOrXjDeptIds.size() > 0) {
+        if (daysCount > 0 && overlapDeptIds.size() > 0) {
             // 当前项目部 设备利用率 公式 reportCount/(currentTeamNum*daysCount)
             // 计算设备利用率(处理除数为0的情况)
-            rate = new BigDecimal((double) reportCount / (zjOrXjDeptIds.size() * daysCount))
+            rate = new BigDecimal((double) reportCount / (overlapDeptIds.size() * daysCount))
                     .setScale(4, RoundingMode.HALF_UP)  // 保留4位小数,四舍五入
                     .doubleValue();
         }

+ 25 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicerunlog/IotDeviceRunLogMapper.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotdevicerunlog;
 
+import cn.hutool.core.util.StrUtil;
 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;
@@ -48,6 +49,30 @@ public interface IotDeviceRunLogMapper extends BaseMapperX<IotDeviceRunLogDO> {
                 .orderByDesc(IotDeviceRunLogDO::getId));
     }
 
+    default List<IotDeviceRunLogDO> selectList(IotDeviceRunLogPageReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<IotDeviceRunLogDO>()
+                .eqIfPresent(IotDeviceRunLogDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotDeviceRunLogDO::getDeviceId, reqVO.getDeviceId())
+                .inIfPresent(IotDeviceRunLogDO::getDeviceId, reqVO.getDeviceIds())
+                .eqIfPresent(IotDeviceRunLogDO::getDeviceCode, reqVO.getDeviceCode())
+                .eqIfPresent(IotDeviceRunLogDO::getDeviceComp, reqVO.getDeviceComp())
+                .eqIfPresent(IotDeviceRunLogDO::getPointCode, reqVO.getPointCode())
+                .likeIfPresent(IotDeviceRunLogDO::getPointName, reqVO.getPointName())
+                .eqIfPresent(IotDeviceRunLogDO::getType, reqVO.getType())
+                .eqIfPresent(IotDeviceRunLogDO::getValue, reqVO.getValue())
+                .eqIfPresent(IotDeviceRunLogDO::getFillContent, reqVO.getFillContent())
+                .betweenIfPresent(IotDeviceRunLogDO::getTime, reqVO.getTime())
+                .betweenIfPresent(IotDeviceRunLogDO::getDailyRunTime, reqVO.getDailyRunTime())
+                .betweenIfPresent(IotDeviceRunLogDO::getTotalRunTime, reqVO.getTotalRunTime())
+                .eqIfPresent(IotDeviceRunLogDO::getDailyMileage, reqVO.getDailyMileage())
+                .eqIfPresent(IotDeviceRunLogDO::getTotalMileage, reqVO.getTotalMileage())
+                .eqIfPresent(IotDeviceRunLogDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(IotDeviceRunLogDO::getIsSum, reqVO.getIsSum())
+                .betweenIfPresent(IotDeviceRunLogDO::getCreateTime, reqVO.getCreateTime())
+                .apply(StrUtil.isNotBlank(reqVO.getCreateTimeStr()),
+                        "DATE(create_time) = {0}", reqVO.getCreateTimeStr()));
+    }
+
     /**
      * 查询指定设备 运行记录模板属性对应的累计时长 累计里程
      * @param deviceIds

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

@@ -5,7 +5,10 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 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.*;
+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.maintain.vo.IotMaintainPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.stat.vo.AllOrderResp;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
@@ -54,6 +57,15 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
                 .orderByDesc(IotOpeationFillDO::getId));
     }
 
+    /**
+     * 根据条件查询 运行记录 列表
+     *
+     * @param reqVO     查询条件
+     * @return 返回符合条件的瑞恒日报记录
+     */
+    @TenantIgnore
+    List<IotOpeationFillDO> selectList(@Param("reqVO") IotOpeationFillPageReqVO reqVO);
+
     /**
      * 根据条件查询日报记录
      *

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

@@ -15,6 +15,8 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
 import cn.iocoder.yudao.module.pms.constant.PmsConstants;
 import cn.iocoder.yudao.module.pms.controller.admin.iotcarzhbd.vo.IotCarZhbdPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicecategorytemplateattrs.vo.IotDeviceProperty;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttask.vo.IotProjectTaskPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrddailyreport.vo.IotRdDailyReportSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotrhdailyreport.vo.*;
@@ -22,6 +24,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcarzhbd.IotCarZhbdDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdailyreportfuel.IotDailyReportFuelDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttask.IotProjectTaskDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotrhdailyreport.IotRhDailyReportDO;
@@ -254,18 +257,84 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
             // throw exception(IOT_PROJECT_TASK_NOT_RELATED);
         }
 
-        // 查询当前任务下关联的所有设备 查询这些设备的当日注气量 进而计算累计注气量
-        IotDevicePageReqVO deptDeviceReqVO = new IotDevicePageReqVO();
-        deptDeviceReqVO.setDeptId(createReqVO.getDeptId());
-        List<IotDeviceDO> deptDevices = iotDeviceMapper.selectList(deptDeviceReqVO);
-        Set<String> deviceCodes = new HashSet<>();
-        if (CollUtil.isNotEmpty(deptDevices)) {
+        // 查询当前队伍的运行记录 找到注水量 注水时间 赋值到日报的 注水时间
+        Set<Long> deviceTypeIds = new HashSet<>();
+        List<DictDataDO> deviceTypeDictData = dictDataService.getDictDataListByDictType("rq_iot_rh_water_injection_device_type");
+        if (CollUtil.isNotEmpty(deviceTypeDictData)) {
+            deviceTypeDictData.forEach(data -> {
+                String value = data.getValue();
+                if (NumberUtil.isNumber(value)) {
+                    Long longValue = Long.valueOf(value);
+                    deviceTypeIds.add(longValue);
+                }
+            });
+        }
+        // 查询 注水泵 类别 下包含的设备
+        if (CollUtil.isNotEmpty(deviceTypeIds)) {
+            // 查询当前任务下关联的 注水泵 设备 查询这些设备在运行记录中填写的 注水时间
+            IotDevicePageReqVO deptDeviceReqVO = new IotDevicePageReqVO();
+            deptDeviceReqVO.setDeptId(createReqVO.getDeptId());
+            deptDeviceReqVO.setAssetClasses(new ArrayList<>(deviceTypeIds));
+            List<IotDeviceDO> deptDevices = iotDeviceMapper.selectList(deptDeviceReqVO);
+            Set<Long> pumpDeviceIds = new HashSet<>();
+            if (CollUtil.isNotEmpty(deptDevices)) {
+                deptDevices.forEach(device -> {
+                    pumpDeviceIds.add(device.getId());
+                });
+            }
+
+            DataPermissionUtils.executeIgnore(() -> {
+                BigDecimal maxWaterInjectionTime = BigDecimal.ZERO;
+                // 过滤数据权限 查询 运行记录 日志
+                // 根据 当前日期 deptId pumpDeviceIds 查询运行记录工单关联的 deviceId
+                String reportDateStr = LocalDateTimeUtil.format(reportDate, DatePattern.NORM_DATE_PATTERN);
+                IotOpeationFillPageReqVO fillReqVO = new IotOpeationFillPageReqVO();
+                fillReqVO.setCreateTimeStr(reportDateStr);
+                fillReqVO.setDeptId(deptId);
+                fillReqVO.setDeviceIds(pumpDeviceIds);
+                List<IotOpeationFillDO> fills = iotOpeationFillMapper.selectList(fillReqVO);
+                Set<Long> fillPumpDeviceIds = new HashSet<>();
+                if (CollUtil.isNotEmpty(fills)) {
+                    fills.forEach(fill -> {
+                        fillPumpDeviceIds.add(fill.getDeviceId());
+                    });
+                }
+                // 根据 device_id createTime is_sum=0 在表 rq_iot_device_run_log 中查询 "当日运转时间H" 的值  fill_content
+                // 如果有多个注水泵的 运转时间 取 较大值
+                if (CollUtil.isNotEmpty(fillPumpDeviceIds)) {
+                    IotDeviceRunLogPageReqVO runLogReqVO = new IotDeviceRunLogPageReqVO();
+                    runLogReqVO.setCreateTimeStr(reportDateStr);
+                    runLogReqVO.setDeviceIds(new ArrayList<>(fillPumpDeviceIds));
+                    runLogReqVO.setIsSum(0);
+                    List<IotDeviceRunLogDO> runLogs = iotDeviceRunLogMapper.selectList(runLogReqVO);
+                    if (CollUtil.isNotEmpty(runLogs)) {
+                        // 查询 注水泵 当日注水时间 参数名称
+                        DictTypeDO pointNameDict = dictTypeService.getDictType("rq_iot_rh_water_point_name");
+                        if (ObjUtil.isNotEmpty(pointNameDict) && StrUtil.isNotBlank(pointNameDict.getRemark())) {
+                            String pointName = pointNameDict.getRemark();
+                            // 当日填报的 注水泵 的运行时间 即 注水时间
+                            maxWaterInjectionTime = runLogs.stream()
+                                    .filter(log -> pointName.equals(log.getPointName()))
+                                    .map(IotDeviceRunLogDO::getFillContent)
+                                    .filter(StrUtil::isNotBlank)
+                                    .filter(NumberUtil::isNumber)
+                                    .map(BigDecimal::new)
+                                    .max(BigDecimal::compareTo)
+                                    .orElse(BigDecimal.ZERO);
+                            iotRhDailyReport.setDailyInjectWaterTime(maxWaterInjectionTime);
+                        }
+                    }
+                }
+            });
+        }
+
+        /* if (CollUtil.isNotEmpty(deptDevices)) {
             deptDevices.forEach(device -> {
                 deviceCodes.add(device.getDeviceCode());
             });
             // 查询当前小队在运行记录填报结果表中 生产日报虚拟设备id 查询当年的日报
             // 然后根据 虚拟设备id 在 rq_iot_device_run_log 表中查询 日报中填写的 当日注气量
-            List<IotOpeationFillDO> reports = iotOpeationFillMapper.selectReportsByYear(createReqVO.getDeptId(), LocalDateTime.now().getYear());
+             List<IotOpeationFillDO> reports = iotOpeationFillMapper.selectReportsByYear(createReqVO.getDeptId(), LocalDateTime.now().getYear());
             Set<Long> reportDeviceIds = new HashSet<>();
             if (CollUtil.isNotEmpty(reports)) {
                 reports.forEach(report -> {
@@ -275,7 +344,7 @@ public class IotRhDailyReportServiceImpl implements IotRhDailyReportService {
                 BigDecimal currentYearFillContentSum = iotDeviceRunLogMapper.selectCurrentYearFillContentSum(createReqVO.getDeptId(), reportDeviceIds);
                 iotRhDailyReport.setTotalGasInjection(currentYearFillContentSum);
             }
-        }
+        } */
 
         BigDecimal capacity = queryCapacity(createReqVO.getDeptId());
         // 计算运行时效 当日注气量/产能

+ 5 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotrydailyreport/IotRyDailyReportServiceImpl.java

@@ -2188,11 +2188,12 @@ public class IotRyDailyReportServiceImpl implements IotRyDailyReportService {
 
         // 构建项目部映射和父子部门关系
         depts.forEach(dept -> {
-            if ("3".equals(dept.getType())) {
-                projectDeptIds.add(dept.getId());
-                teamDeptPair.put(dept.getId(), dept);
+            if (0 == dept.getStatus()) {
+                if ("3".equals(dept.getType())) {
+                    teamDeptPair.put(dept.getId(), dept);
+                }
+                teamProjectIdPair.put(dept.getId(), dept.getParentId());
             }
-            teamProjectIdPair.put(dept.getId(), dept.getParentId());
         });
 
         // key施工队伍id    value施工井数量

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -776,6 +776,34 @@
         </if>
     </select>
 
+    <select id="selectList" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO"
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+        SELECT * FROM rq_iot_opeation_fill
+        <where>
+            <if test="reqVO.deviceCode != null and reqVO.deviceCode != ''">
+                AND device_code = #{reqVO.deviceCode}
+            </if>
+            <if test="reqVO.deviceName != null and reqVO.deviceName != ''">
+                AND device_name LIKE CONCAT('%', #{reqVO.deviceName}, '%')
+            </if>
+            <if test="reqVO.deptId != null">
+                AND dept_id = #{reqVO.deptId}
+            </if>
+            <if test="reqVO.deviceIds != null and reqVO.deviceIds.size() > 0">
+                AND device_id IN
+                <foreach collection="reqVO.deviceIds" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+            <if test="reqVO.createTime != null and reqVO.createTime.length == 2">
+                AND create_time BETWEEN #{reqVO.createTime[0]} AND #{reqVO.createTime[1]}
+            </if>
+            <if test="reqVO.createTimeStr != null and reqVO.createTimeStr != ''">
+                AND DATE(create_time) = #{reqVO.createTimeStr}
+            </if>
+        </where>
+    </select>
+
 
     <select id="getAttrsById" parameterType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO">