From 32c0c86584313a9b04a7783466077c2b6688f939 Mon Sep 17 00:00:00 2001 From: George Date: Mon, 18 May 2026 21:37:40 +0800 Subject: [PATCH] =?UTF-8?q?20260518:1=E3=80=81=E5=88=86=E4=BA=AB=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=88=A0=E9=99=A4=E5=8F=AA=E5=88=A0=E9=99=A4=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E5=88=86=E4=BA=AB=E8=AE=B0=E5=BD=95=EF=BC=9B2?= =?UTF-8?q?=E3=80=81=E5=A4=A7=E5=B1=8Fenter=E7=99=BB=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E8=BE=93=E5=85=A5=E6=A1=86=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../consumer/DevicePropFetchConsumer.java | 12 +- .../fastbee/iot/mapper/DeviceUserMapper.java | 13 +- .../iot/service/impl/DeviceServiceImpl.java | 113 ++++++++++++------ .../mapper/iot/DeviceRecordMapper.xml | 1 + .../resources/mapper/iot/DeviceUserMapper.xml | 16 +++ yack-view/docs/操作手册.md | 101 ++++++++++++++++ yack-view/src/views/login/index.vue | 5 +- 7 files changed, 213 insertions(+), 48 deletions(-) create mode 100644 yack-view/docs/操作手册.md diff --git a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/consumer/DevicePropFetchConsumer.java b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/consumer/DevicePropFetchConsumer.java index e81f91bb..ddc0a773 100644 --- a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/consumer/DevicePropFetchConsumer.java +++ b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/consumer/DevicePropFetchConsumer.java @@ -149,6 +149,7 @@ public class DevicePropFetchConsumer { if (StringUtils.isNotEmpty(tcpObject)) { // 原有的事务ID处理逻辑 + log.info("tcpObject[{}],处理Modbus tcp事务ID", tcpObject); String tcpRuntimeCacheKey = RedisKeyBuilder.buildModbusTcpRuntimeCacheKey(subSerialNumber); for (String command : commandList) { String tranNo = command.substring(0, 4); @@ -156,12 +157,14 @@ public class DevicePropFetchConsumer { Object stringHashValue = redisCache.getStringHashValue(tcpRuntimeCacheKey, String.valueOf(i)); if (Objects.nonNull(stringHashValue)) { tcpCommandList.add(command); + log.info("command[{}],添加Modbus原指令", command); continue; } String modbusTcpId = redisCache.getCacheModbusTcpId(modbusJobList.get(0).getSubSerialNumber()); String hexString = String.format("%04x", Integer.parseInt(modbusTcpId)); String newTcpData = hexString + command.substring(4); redisCache.cacheModbusTcpData(subSerialNumber, modbusTcpId, newTcpData); + log.info("command[{}],添加Modbus修改后的指令", newTcpData); tcpCommandList.add(newTcpData); } } @@ -172,14 +175,15 @@ public class DevicePropFetchConsumer { } else { modbusPollMsg.setCommandList(tcpCommandList); } - DeviceStatusVO deviceStatusVO = deviceService.selectDeviceStatusAndTransportStatus(modbusPollMsg.getSerialNumber()); + String serialNumber = modbusPollMsg.getSerialNumber(); + DeviceStatusVO deviceStatusVO = deviceService.selectDeviceStatusAndTransportStatus(serialNumber); modbusPollMsg.setTransport(deviceStatusVO.getTransport()); - Session session = sessionStore.getSession(modbusPollMsg.getSerialNumber()); + Session session = sessionStore.getSession(serialNumber); if (enabled && Objects.isNull(session)) { - log.info("设备:[{}],不在线", modbusPollMsg.getSerialNumber()); + log.info("设备:[{}],不在线", serialNumber); return modbusPollMsg; } - log.info("执行modbus轮询指令:[{}]", JSON.toJSONString(commandList)); + log.info("jobId[{}],serialNumber[{}],执行modbus轮询指令:[{}]", jobId, serialNumber, JSON.toJSONString(modbusPollMsg.getCommandList())); return modbusPollMsg; } diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceUserMapper.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceUserMapper.java index 372da972..de24c312 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceUserMapper.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/mapper/DeviceUserMapper.java @@ -1,14 +1,13 @@ package com.fastbee.iot.mapper; -import java.util.List; - import com.fastbee.common.core.domain.entity.SysUser; -import com.fastbee.framework.mybatis.mapper.BaseMapperX; import com.fastbee.iot.domain.DeviceUser; import com.fastbee.iot.model.UserIdDeviceIdModel; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.List; + /** * 设备用户Mapper接口 * @@ -57,6 +56,14 @@ public interface DeviceUserMapper { */ public int updateDeviceUser(DeviceUser deviceUser); + /** + * 批量修改设备用户 + * + * @param deviceUserList 设备用户 + * @return 结果 + */ + int updateDeviceUserBatch(List deviceUserList); + /** * 删除设备用户 * diff --git a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java index c7c9bb3e..fff7d438 100644 --- a/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java +++ b/fastbee-service/fastbee-iot-service/src/main/java/com/fastbee/iot/service/impl/DeviceServiceImpl.java @@ -342,12 +342,14 @@ public class DeviceServiceImpl implements IDeviceService { Device device = deviceMapper.selectDeviceByDeviceId(deviceId); SysUser user = getLoginUser().getUser(); Long sceneUserId; + Long deptUserId = user.getDept().getDeptUserId(); if (null == user.getDeptId()) { sceneUserId = user.getUserId(); } else { - sceneUserId = user.getDept().getDeptUserId(); + sceneUserId = deptUserId; } // 2.3版本更改 设备管理者和设备拥有者为true,普通用户如果不是设备所有者,只能删除设备用户和用户自己的设备关联分组信息 + // 删除当前层级分配记录,将设备改回到上一级 boolean isGeneralUser; if (isAdmin(user.getUserId())) { isGeneralUser = false; @@ -355,7 +357,7 @@ public class DeviceServiceImpl implements IDeviceService { // 终端用户和非设备所属机构用户不允许删除设备 if (null == user.getDeptId()) { isGeneralUser = true; - } else if (!Objects.equals(device.getTenantId(), user.getDept().getDeptUserId())) { + } else if (!Objects.equals(device.getTenantId(), deptUserId)) { isGeneralUser = true; } else { isGeneralUser = false; @@ -398,6 +400,23 @@ public class DeviceServiceImpl implements IDeviceService { // 删除用户分组中的设备 普通用户,且不是设备所有者。 deviceMapper.deleteDeviceGroupByDeviceId(new UserIdDeviceIdModel(user.getUserId(), deviceId)); } else { + // 删除当前层级分配记录,将设备改回到上一级 + DeviceRecord params = new DeviceRecord(); + params.setDeviceId(deviceId); + params.setType(DeviceRecordTypeEnum.ASSIGNMENT_DETAIL.getType()); + params.setTargetDeptId(user.getDeptId()); + List deviceRecords = deviceRecordMapper.selectDeviceRecordList(params); + if (!CollectionUtils.isEmpty(deviceRecords)) { + DeviceRecord deviceRecord = deviceRecords.get(0); + if (deviceRecord.getTargetDeptId().equals(user.getDeptId())) { + deviceRecordMapper.deleteDeviceRecordById(deviceRecord.getId()); + int result = deviceMapper.updateTenantIdByDeptIds(deviceRecord.getTenantId(), deviceRecord.getTenantName(), Collections.singletonList(deviceId)); + if (result > 0) { + return AjaxResult.success("已解除设备分享关系"); + } + } + } + if (null != shareSceneIds && shareSceneIds.length > 0) { sceneService.deleteSceneBySceneIds(shareSceneIds); } @@ -1896,24 +1915,31 @@ public class DeviceServiceImpl implements IDeviceService { @Override public AjaxResult assignment(Long deptId, String deviceIds) { - SysUser user = getLoginUser().getUser(); - SysDept sysDept = sysDeptMapper.selectDeptById(deptId); - if (null == sysDept || null == sysDept.getDeptUserId()) { + SysUser currSysUser = getLoginUser().getUser(); + // 目标机构 + SysDept destSysDept = sysDeptMapper.selectDeptById(deptId); + if (null == destSysDept || null == destSysDept.getDeptUserId()) { return AjaxResult.error("机构不存在或未绑定管理员,请调整后重试!"); } - Long deptUserId = sysDept.getDeptUserId(); - SysUser sysUser = userService.selectUserById(deptUserId); - if (null == sysUser) { + Long destDeptUserId = destSysDept.getDeptUserId(); + SysUser destSysUser = userService.selectUserById(destDeptUserId); + if (null == destSysUser) { return AjaxResult.error("机构管理员不存在"); } - List deviceIdList = Arrays.stream(deviceIds.split(",")).map(d -> Long.parseLong(d.trim())).distinct() + List deviceIdList = Arrays.stream(deviceIds.split(",")) + .map(d -> Long.parseLong(d.trim())).distinct() .collect(Collectors.toList()); - int result = deviceMapper.updateTenantIdByDeptIds(deptUserId, sysUser.getUserName(), deviceIdList); + int result = deviceMapper.updateTenantIdByDeptIds(destDeptUserId, destSysUser.getUserName(), deviceIdList); DeviceRecord deviceRecord = new DeviceRecord(); - deviceRecord.setOperateDeptId(user.getDeptId()).setTargetDeptId(deptId).setTargetDeptId(deptId) + Long currDeptUserId = currSysUser.getDept().getDeptUserId(); + Long currDeptId = currSysUser.getDeptId(); + deviceRecord.setOperateDeptId(currDeptId) + .setTargetDeptId(deptId) .setDistributeType(DeviceDistributeTypeEnum.SELECT.getType()) - .setType(DeviceRecordTypeEnum.ASSIGNMENT.getType()).setTotal(deviceIdList.size()) - .setTenantId(user.getDept().getDeptUserId()).setTenantName(user.getDept().getDeptUserName()); + .setType(DeviceRecordTypeEnum.ASSIGNMENT.getType()) + .setTotal(deviceIdList.size()) + .setTenantId(currDeptUserId) + .setTenantName(currSysUser.getDept().getDeptUserName()); if (result > 0) { deviceRecord.setStatus(StatusEnum.SUCCESS.getStatus()); deviceRecord.setSuccessQuantity(deviceIdList.size()); @@ -1923,54 +1949,63 @@ public class DeviceServiceImpl implements IDeviceService { deviceRecord.setSuccessQuantity(0); deviceRecord.setFailQuantity(deviceIdList.size()); } - deviceRecord.setCreateBy(user.getUserName()); + deviceRecord.setCreateBy(currSysUser.getUserName()); int insertRecordStatus = deviceRecordMapper.insertDeviceRecord(deviceRecord); List deviceRecordList = new ArrayList<>(); List deviceList = deviceMapper.selectDeviceListByDeviceIds(deviceIdList); for (Device device : deviceList) { - DeviceRecord deviceRecord1 = new DeviceRecord(); - deviceRecord1.setOperateDeptId(user.getDeptId()).setTargetDeptId(deptId).setDeviceId(device.getDeviceId()) - .setProductId(device.getProductId()).setSerialNumber(device.getSerialNumber()) - .setType(DeviceRecordTypeEnum.ASSIGNMENT_DETAIL.getType()).setParentId(deviceRecord.getId()) + DeviceRecord deviceRecordDetail = new DeviceRecord(); + deviceRecordDetail.setOperateDeptId(currDeptId) + .setTargetDeptId(deptId) + .setDeviceId(device.getDeviceId()) + .setProductId(device.getProductId()) + .setSerialNumber(device.getSerialNumber()) + .setType(DeviceRecordTypeEnum.ASSIGNMENT_DETAIL.getType()) + .setParentId(deviceRecord.getId()) .setDistributeType(DeviceDistributeTypeEnum.SELECT.getType()) - .setTenantId(user.getDept().getDeptUserId()).setTenantName(user.getDept().getDeptUserName()); - deviceRecord1 - .setStatus(insertRecordStatus > 0 ? StatusEnum.SUCCESS.getStatus() : StatusEnum.FAIL.getStatus()); - deviceRecord1.setCreateBy(user.getUserName()); - deviceRecordList.add(deviceRecord1); + .setTenantId(currDeptUserId) + .setTenantName(currSysUser.getDept().getDeptUserName()) + .setStatus(insertRecordStatus > 0 ? StatusEnum.SUCCESS.getStatus() : StatusEnum.FAIL.getStatus()) + .setCreateBy(currSysUser.getUserName()); + deviceRecordList.add(deviceRecordDetail); } + // 批量插入设备分配记录 deviceRecordMapper.insertBatch(deviceRecordList); return result > 0 ? AjaxResult.success("分配设备成功") : AjaxResult.error("分配设备失败"); } @Override public AjaxResult recovery(String deviceIds, Long recoveryDeptId) { - LoginUser loginUser = getLoginUser(); - Long deptId = loginUser.getDeptId(); - SysDept sysDept = sysDeptMapper.selectDeptById(deptId); - if (null == sysDept || null == sysDept.getDeptUserId()) { + SysUser currSysUser = getLoginUser().getUser(); + Long currDeptId = currSysUser.getDeptId(); + SysDept currSysDept = sysDeptMapper.selectDeptById(currDeptId); + if (null == currSysDept || null == currSysDept.getDeptUserId()) { return AjaxResult.error("机构不存在或未绑定管理员,请调整后重试!"); } - Long deptUserId = sysDept.getDeptUserId(); - SysUser sysUser = userService.selectUserById(deptUserId); + Long currDeptUserId = currSysDept.getDeptUserId(); + SysUser sysUser = userService.selectUserById(currDeptUserId); if (null == sysUser) { return AjaxResult.error("机构管理员不存在"); } - List deviceIdList = Arrays.stream(deviceIds.split(",")).map(d -> Long.parseLong(d.trim())).distinct() + List deviceIdList = Arrays.stream(deviceIds.split(",")) + .map(d -> Long.parseLong(d.trim())).distinct() .collect(Collectors.toList()); - int result = deviceMapper.updateTenantIdByDeptIds(deptUserId, sysUser.getUserName(), deviceIdList); + int result = deviceMapper.updateTenantIdByDeptIds(currDeptUserId, sysUser.getUserName(), deviceIdList); List deviceRecordList = new ArrayList<>(); List deviceList = deviceMapper.selectDeviceListByDeviceIds(deviceIdList); for (Device device : deviceList) { - DeviceRecord deviceRecord1 = new DeviceRecord(); - deviceRecord1.setOperateDeptId(deptId).setTargetDeptId(recoveryDeptId).setDeviceId(device.getDeviceId()) - .setProductId(device.getProductId()).setSerialNumber(device.getSerialNumber()) + DeviceRecord deviceRecord = new DeviceRecord(); + deviceRecord.setOperateDeptId(currDeptId) + .setTargetDeptId(recoveryDeptId) + .setDeviceId(device.getDeviceId()) + .setProductId(device.getProductId()) + .setSerialNumber(device.getSerialNumber()) .setType(DeviceRecordTypeEnum.RECOVERY.getType()) - .setTenantId(loginUser.getUser().getDept().getDeptUserId()) - .setTenantName(loginUser.getUser().getDept().getDeptUserName()); - deviceRecord1.setStatus(result > 0 ? StatusEnum.SUCCESS.getStatus() : StatusEnum.FAIL.getStatus()); - deviceRecord1.setCreateBy(loginUser.getUsername()); - deviceRecordList.add(deviceRecord1); + .setTenantId(currSysUser.getDept().getDeptUserId()) + .setTenantName(currSysUser.getDept().getDeptUserName()) + .setStatus(result > 0 ? StatusEnum.SUCCESS.getStatus() : StatusEnum.FAIL.getStatus()) + .setCreateBy(currSysUser.getUserName()); + deviceRecordList.add(deviceRecord); } deviceRecordMapper.insertBatch(deviceRecordList); return result > 0 ? AjaxResult.success("回收设备成功") : AjaxResult.error("回收设备失败"); diff --git a/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceRecordMapper.xml b/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceRecordMapper.xml index cb9916b4..a6757228 100644 --- a/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceRecordMapper.xml +++ b/fastbee-service/fastbee-iot-service/src/main/resources/mapper/iot/DeviceRecordMapper.xml @@ -52,6 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and create_time between #{params.beginTime} and #{params.endTime} + order by create_time desc