关于当批量生存数据到数据库中时一直只有一条数据的问题 ...

打印 上一主题 下一主题

主题 969|帖子 969|积分 2907

@Override
@Transactional(rollbackFor = Exception.class)
public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyData) {
String IotId = iotMsgNotifyData.getHeader().getDeviceId();
LambdaQueryWrapper deviceLambdaQueryWrapper = new LambdaQueryWrapper();
deviceLambdaQueryWrapper.eq(Device::getIotId, IotId);
// 查到设备信息
Device device = deviceMapper.selectOne(deviceLambdaQueryWrapper);
if (ObjectUtil.isEmpty(device)) {
throw new BaseException("设备不存在");
}
// 从设备实体中获取数据,赋值到设备数据实体中
// 把IOT获取到设备数据复制到设备数据实体中
List dataList = new ArrayList();
DeviceData deviceData = BeanUtil.toBean(device, DeviceData.class);
iotMsgNotifyData.getBody().getServices().forEach(item -> {
// 把字符串格式化成LocalDateTime
LocalDateTime time = LocalDateTimeUtil.parse(item.getEventTime(), "yyyyMMdd'T'HHmmss'Z'");
LocalDateTime alarmTime = time.atZone(ZoneId.from(ZoneOffset.UTC))
.withZoneSameInstant(ZoneId.of("Asia/Shanghai"))
.toLocalDateTime();
item.getProperties().forEach((k, v) -> {
deviceData.setFunctionId(k);
deviceData.setAccessLocation(device.getRemark());
deviceData.setDataValue(v.toString());
deviceData.setAlarmTime(alarmTime);
// 批量生存数据
dataList.add(deviceData);
});
});
// saveBatch(dataList);
if (!saveBatch(dataList)) {
throw new BaseException("生存设备数据失败");
}
}
如上代码,没有将bean放置于循环之中,在颠末下面的循环语句举行其他数据添加时一直都是修改的一个数据导致只能添加一个数据进入数据库
应将加粗的代码放置于循环之中
@Override
@Transactional(rollbackFor = Exception.class)
public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyData) {
String IotId = iotMsgNotifyData.getHeader().getDeviceId();
LambdaQueryWrapper deviceLambdaQueryWrapper = new LambdaQueryWrapper();
deviceLambdaQueryWrapper.eq(Device::getIotId, IotId);
// 查到设备信息
Device device = deviceMapper.selectOne(deviceLambdaQueryWrapper);
if (ObjectUtil.isEmpty(device)) {
throw new BaseException("设备不存在");
}
// 从设备实体中获取数据,赋值到设备数据实体中
// 把IOT获取到设备数据复制到设备数据实体中
List dataList = new ArrayList();
iotMsgNotifyData.getBody().getServices().forEach(item -> {
// 把字符串格式化成LocalDateTime
LocalDateTime time = LocalDateTimeUtil.parse(item.getEventTime(), "yyyyMMdd'T'HHmmss'Z'");
LocalDateTime alarmTime = time.atZone(ZoneId.from(ZoneOffset.UTC))
.withZoneSameInstant(ZoneId.of("Asia/Shanghai"))
.toLocalDateTime();
DeviceData deviceData = BeanUtil.toBean(device, DeviceData.class);
item.getProperties().forEach((k, v) -> {
deviceData.setFunctionId(k);
deviceData.setAccessLocation(device.getRemark());
deviceData.setDataValue(v.toString());
deviceData.setAlarmTime(alarmTime);
// 批量生存数据
dataList.add(deviceData);
});
});
// saveBatch(dataList);
if (!saveBatch(dataList)) {
throw new BaseException("生存设备数据失败");
}
}
最后批量生存数据至数据库一直都只有四条,因将原来的数据转为一个bean,在bean中的id在数据库中是固定的以是后面修改的数据都是替换之前的数据并未一同生存至数据库中故再次修改代码如下:
@Override
@Transactional(rollbackFor = Exception.class)
public void batchInsertDeviceData(IotMsgNotifyData iotMsgNotifyData) {
String IotId = iotMsgNotifyData.getHeader().getDeviceId();
LambdaQueryWrapper deviceLambdaQueryWrapper = new LambdaQueryWrapper();
deviceLambdaQueryWrapper.eq(Device::getIotId,IotId);
//查到设备信息
Device device = deviceMapper.selectOne(deviceLambdaQueryWrapper);
if (ObjectUtil.isEmpty(device)){
throw  new BaseException("设备不存在");
}
ListdataList=new ArrayList();
  1.     //如果存在的话 把设备的信息 加到 传入的数据里
  2.     iotMsgNotifyData.getBody().getServices().forEach(item->{
  3.         //把字符串格式化成LocalDateTime
  4.         LocalDateTime time = LocalDateTimeUtil.parse(item.getEventTime(), "yyyyMMdd'T'HHmmss'Z'");
  5.         LocalDateTime alarmTime = time.atZone(ZoneId.from(ZoneOffset.UTC))
  6.                 .withZoneSameInstant(ZoneId.of("Asia/Shanghai"))
  7.                 .toLocalDateTime();
  8.         item.getProperties().forEach((k,v)->{
  9.             DeviceData build = DeviceData.builder().iotId(device.getIotId())
  10.                     .deviceName(device.getDeviceName())
  11.                     .productKey(device.getProductKey())
  12.                     .productName(device.getProductName())
  13.                     .functionId(k)
  14.                     .dataValue(v.toString())
  15.                     .alarmTime(alarmTime)
  16.                     .accessLocation(device.getRemark())
  17.                     .locationType(device.getLocationType())
  18.                     .physicalLocationType(device.getPhysicalLocationType())
  19.                     .deviceDescription("")
  20.                     .build();
  21.             dataList.add(build);
  22.         });
  23.         //批量保存
  24.         if (!saveBatch(dataList)) {
  25.             throw new BaseException("保存设备数据失败");
  26.         }
  27.     });
  28. }
复制代码
最终可以批量生存数据

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表