20260118:优化获取modbus首地址(从redis中获取)

This commit is contained in:
George 2026-01-18 00:09:44 +08:00
parent d12016e04a
commit 271e2102db
4 changed files with 25 additions and 46 deletions

View File

@ -468,28 +468,18 @@ public class ModbusProtocol implements IProtocol {
* 获取寄存器最小modbus地址,从最小的寄存器地址开始解码
*/
private String getCacheModbusAddress(Long productId, int salveId, int code) {
// String key = RedisKeyBuilder.buildModbusRuntimeCacheKey(serialNumber);
// Set<String> commandSet = redisCache.zRange(key, 0, -1);
//
// // 1. 遍历匹配指令
// for (String command : commandSet) {
// try {
// Mparams params = ModbusUtils.getModbusParams(command);
// redisCache.zRem(key, command); // 删除缓存
// if (params.getSlaveId() == salveId && params.getCode() == code) {
// return String.valueOf(params.getAddress());
// }
// } catch (Exception e) {
// log.warn("解析指令异常: {}", e.getMessage());
// }
// }
// todo 拿缓存
// 1、从modbus拿缓存
Map<Integer, List<ModbusConfig>> modbusConfigMap = modbusConfigCache.getModbusConfigCacheByProductId(productId);
if (modbusConfigMap != null) {
Integer addr = modbusConfigMap.keySet().stream().min(Integer::compare).orElse(-1);
if (addr >= 0) {
log.debug("=>从缓存中获取最小modbus地址,产品:[{}],从机地址:[{}],功能码:[{}],地址:[{}]", productId, salveId, code, addr);
return String.valueOf(addr);
}
}
// 2. 无匹配时查询数据库
try {
// Device device = deviceMapper.selectDeviceBySerialNumber(serialNumber);
// if (device == null) return "0";
List<ModbusConfig> configs = modbusConfigMapper.selectModbusConfigListByProductId(productId);
if (CollectionUtils.isEmpty(configs)) return "0";

View File

@ -45,5 +45,5 @@ public interface IModbusConfigCache {
* @param identify 标识符
* @return ModbusConfig
*/
public List<ModbusConfig> getSingleModbusConfig(Long productId, String identify);
List<ModbusConfig> getSingleModbusConfig(Long productId, String identify);
}

View File

@ -41,16 +41,16 @@ public class ModbusConfigCacheImpl implements IModbusConfigCache {
*/
@Override
public Map<Integer, List<ModbusConfig>> getModbusConfigCacheByProductId(Long productId) {
// Map<Integer, List<ModbusConfig>> resultMap = new HashMap<>();
// String modbusKey = RedisKeyBuilder.buildModbusKey(productId);
// Map<String,String> map = redisCache.hashEntity(modbusKey);
// if (!CollectionUtils.isEmpty(map)){
// for (Map.Entry<String, String> entry : map.entrySet()) {
// List<ModbusConfig> modbusConfigList = JSON.parseArray(entry.getValue(), ModbusConfig.class);
// resultMap.put(Integer.parseInt(entry.getKey()), modbusConfigList);
// }
// return resultMap;
// }
Map<Integer, List<ModbusConfig>> resultMap = new HashMap<>();
String modbusKey = RedisKeyBuilder.buildModbusKey(productId);
Map<String,String> map = redisCache.hashEntity(modbusKey);
if (!CollectionUtils.isEmpty(map)){
for (Map.Entry<String, String> entry : map.entrySet()) {
List<ModbusConfig> modbusConfigList = JSON.parseArray(entry.getValue(), ModbusConfig.class);
resultMap.put(Integer.parseInt(entry.getKey()), modbusConfigList);
}
return resultMap;
}
return setModbusConfigCacheByProductId(productId);
}

View File

@ -5,34 +5,23 @@ import com.fastbee.common.core.protocol.modbus.ModbusCode;
import com.fastbee.common.exception.ServiceException;
import com.fastbee.common.utils.DateUtils;
import com.fastbee.common.utils.SecurityUtils;
import com.fastbee.common.utils.poi.ExcelUtil;
import com.fastbee.iot.cache.IModbusConfigCache;
import com.fastbee.iot.domain.DeviceJob;
import com.fastbee.iot.domain.ModbusConfig;
import com.fastbee.iot.domain.ThingsModel;
import com.fastbee.iot.mapper.ModbusConfigMapper;
import com.fastbee.iot.model.ThingsModels.PropertyDto;
import com.fastbee.iot.model.ThingsModels.ThingsModelValueItem;
import com.fastbee.iot.model.modbus.ModbusDataImport;
import com.fastbee.iot.model.modbus.ModbusIoImport;
import com.fastbee.iot.service.IDeviceJobService;
import com.fastbee.iot.service.IModbusConfigService;
import com.fastbee.iot.service.IThingsModelService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.quartz.SchedulerException;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -106,8 +95,8 @@ public class ModbusConfigServiceImpl implements IModbusConfigService {
*/
@Override
public void addOrUpModbusConfigBatch(List<ModbusConfig> modbusConfigList, Long productId, Long[] ids) {
assert !Objects.isNull(productId) : "产品id不能为空";
assert !CollectionUtils.isEmpty(modbusConfigList) : "modbus配置数据不能为空";
Assert.notNull(productId, "产品id不能为空");
Assert.isTrue(!CollectionUtils.isEmpty(modbusConfigList), "modbus配置数据不能为空");
if (!CollectionUtils.isEmpty(Arrays.asList(ids))) {
//要删除的id集合不为空,则先进行删除操作
this.deleteModbusConfigByIds(ids);
@ -160,8 +149,8 @@ public class ModbusConfigServiceImpl implements IModbusConfigService {
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult importIOModbus(List<ModbusIoImport> list, Long productId, Integer type) {
assert !CollectionUtils.isEmpty(list) : "导入IO寄存器列表为空";
assert !Objects.isNull(productId) : "产品id为空";
Assert.notNull(productId, "产品id为空");
Assert.isTrue(!CollectionUtils.isEmpty(list), "导入IO寄存器列表为空");
int success = 0;
int failure = 0;
StringBuilder succSb = new StringBuilder();