From 66bc902a0765131988f65ac1557301ce72efbfa0 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Wed, 4 Feb 2026 14:55:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E9=87=87=E9=9B=86?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/scheduled/coretask/DeviceTask.java | 68 +++++++++---------- .../iot/service/device/DeviceServiceImpl.java | 14 ++++ 2 files changed, 47 insertions(+), 35 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java index 4da601470..55e235b1d 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceBasicStat import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceStatusEnum; import cn.iocoder.yudao.module.iot.controller.admin.device.enums.TaskTypeEnum; import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.core.Task; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceSaveReqVO; import cn.iocoder.yudao.module.iot.controller.admin.devicemodelrules.vo.PointRulesRespVO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO; @@ -17,6 +18,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactMod import cn.iocoder.yudao.module.iot.dal.mysql.deviceoperationrecord.DeviceOperationRecordMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicepointrules.DevicePointRulesMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicewarinningrecord.DeviceWarinningRecordMapper; +import cn.iocoder.yudao.module.iot.service.device.DeviceService; import cn.iocoder.yudao.module.iot.service.device.TDengineService; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -48,6 +50,9 @@ public class DeviceTask implements Task { @Resource private TDengineService tDengineService; + @Resource + private DeviceService deviceService; + @Resource private DevicePointRulesMapper devicePointRulesMapper; @@ -103,13 +108,6 @@ public class DeviceTask implements Task { logger.info("执行设备任务,任务ID: {}, 参数: {}, 时间: {}", taskId, taskParam, currentTime); - // 解析参数,假设格式为 deviceId:deviceCode -// String[] params = taskParam.split(":"); -// if (params.length >= 2) { -// Long deviceId = Long.parseLong(params[0]); -// String deviceCode = params[1]; -// executeDeviceLogic(deviceId, deviceCode); -// } executeDeviceLogic(taskId,taskParam); @@ -148,32 +146,6 @@ public class DeviceTask implements Task { OpcUtils.disconnect(); } - /** - * 具体的设备执行逻辑 - */ -// private void executeDeviceLogic(Long sourceDeviceId, String param) { -// logger.info("执行设备逻辑,源设备ID: {},参数: {}", sourceDeviceId, param); -// -// // 1. 计算实际设备ID -// Long deviceId = sourceDeviceId - 1000000L; -// logger.info("处理后设备ID: {}", deviceId); -// -// if (deviceId == null) { -// throw new RuntimeException("设备ID不能为空"); -// } -// -// // 2. 获取设备信息 -// DeviceDO device = getDeviceInfo(deviceId); -// -// // 3. 连接OPC服务器 -// connectOpcServer(device); -// -// // 4. 处理数据读取和入库 -// processDeviceData(deviceId, device); -// -// // 5. 断开连接 -// OpcUtils.disconnect(); -// } /** * 获取设备信息 @@ -201,6 +173,8 @@ public class DeviceTask implements Task { boolean connected = OpcUtils.connect(device.getUrl(), username, password, 10); if (!connected) { + //停止任务 + deviceService.connectDevice(new DeviceSaveReqVO().setId(device.getId()).setIsConnect(2)); throw new RuntimeException("连接OPC服务器失败,URL: " + device.getUrl()); } } @@ -213,11 +187,35 @@ public class DeviceTask implements Task { List points = getDevicePoints(deviceId); if (CollectionUtils.isEmpty(points)) { logger.warn("设备 {} 未配置点位", deviceId); + //更新状态为待机中 + DeviceOperationRecordDO record = new DeviceOperationRecordDO(); + record.setDeviceId(device.getId()); + record.setRule(DeviceStatusEnum.STANDBY.getCode()); + //TODO 创建人和更新人为内置默认管理员 + record.setCreator("1"); + record.setUpdater("1"); + deviceOperationRecordMapper.insert(record); return; } logger.info("设备 {} 需要读取 {} 个点位", deviceId, points.size()); + + DevicePointRulesDO devicePointRulesDO = devicePointRulesMapper.selectOne(Wrappers.lambdaQuery() + .eq(DevicePointRulesDO::getDeviceId, deviceId) + .eq(DevicePointRulesDO::getIdentifier, DeviceBasicStatusEnum.RUNNING)); + if(devicePointRulesDO !=null && devicePointRulesDO.getFieldRule() == null ){ + //更新状态为待机中 + DeviceOperationRecordDO record = new DeviceOperationRecordDO(); + record.setDeviceId(device.getId()); + record.setRule(DeviceStatusEnum.STANDBY.getCode()); + //TODO 创建人和更新人为内置默认管理员 + record.setCreator("1"); + record.setUpdater("1"); + deviceOperationRecordMapper.insert(record); + } + + // 2. 读取并处理数据 int successCount = 0; List validDataList = new ArrayList<>(); @@ -333,9 +331,9 @@ public class DeviceTask implements Task { // 2. 遍历规则 for (DevicePointRulesDO devicePointRulesDO : devicePointRulesDOList) { - if (StringUtils.isBlank(devicePointRulesDO.getFieldRule())) { + if (StringUtils.isBlank(devicePointRulesDO.getFieldRule())) { continue; - } + } // 3. 解析规则列表 List pointRulesVOList = JSON.parseArray( diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java index 4f15ac678..f881fc7d6 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java @@ -523,9 +523,16 @@ public class DeviceServiceImpl implements DeviceService { }else if(Objects.equals(createReqVO.getIsConnect(), DeviceConnectionStatusEnum.DISCONNECTED.getStatus())){ boolean disconnect = OpcUtils.disconnect(); if (disconnect){ + //更新连接状态 deviceDO.setStatus(String.valueOf(DeviceConnectionStatusEnum.DISCONNECTED.getStatus())); deviceMapper.updateById(deviceDO); + //停止定时任务 taskSchedulerManager.stopDeviceTask(deviceDO.getId()); + //更新运行状态 + updateOperationalStatus(deviceDO); + + + }else { throw exception(OPC_CLOSE_CONNECT_FAILURE); } @@ -536,6 +543,13 @@ public class DeviceServiceImpl implements DeviceService { return Boolean.TRUE; } + private void updateOperationalStatus(DeviceDO deviceDO) { + DeviceOperationRecordDO deviceOperationRecordDO = new DeviceOperationRecordDO(); + deviceOperationRecordDO.setDeviceId(deviceDO.getId()); + deviceOperationRecordDO.setRule(DeviceStatusEnum.OFFLINE.getCode()); + deviceOperationRecordMapper.insert(deviceOperationRecordDO); + } + private DeviceDO validateConnectRequest(DeviceSaveReqVO createReqVO) { if(createReqVO.getId() == null){ throw exception(DEVICE_ID_DOES_NOT_EXIST);