| | |
| | | package com.dji.sample.manage.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.dji.sample.component.redis.RedisConst; |
| | | import com.dji.sample.component.redis.RedisOpsUtils; |
| | | import com.dji.sample.manage.dao.IDevicePayloadMapper; |
| | | import com.dji.sample.manage.model.dto.DeviceDTO; |
| | | import com.dji.sample.manage.model.dto.DeviceDictionaryDTO; |
| | | import com.dji.sample.manage.model.dto.DevicePayloadDTO; |
| | | import com.dji.sample.manage.model.entity.DevicePayloadEntity; |
| | | import com.dji.sample.manage.model.enums.DeviceDomainEnum; |
| | | import com.dji.sample.manage.model.receiver.DevicePayloadReceiver; |
| | | import com.dji.sample.manage.model.receiver.FirmwareVersionReceiver; |
| | | import com.dji.sample.manage.service.ICapacityCameraService; |
| | | import com.dji.sample.manage.service.IDeviceDictionaryService; |
| | | import com.dji.sample.manage.service.IDevicePayloadService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.Optional; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | * @version 0.1 |
| | | * @date 2021/11/19 |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | @Transactional |
| | | public class DevicePayloadServiceImpl implements IDevicePayloadService { |
| | |
| | | |
| | | @Autowired |
| | | private ICapacityCameraService capacityCameraService; |
| | | |
| | | @Autowired |
| | | private RedisOpsUtils redisOps; |
| | | |
| | | @Override |
| | | public Integer checkPayloadExist(String payloadSn) { |
| | |
| | | |
| | | @Override |
| | | public Boolean savePayloadDTOs(List<DevicePayloadReceiver> payloadReceiverList) { |
| | | if (payloadReceiverList.isEmpty()) { |
| | | return true; |
| | | } |
| | | |
| | | String deviceSn = payloadReceiverList.get(0).getDeviceSn(); |
| | | String key = RedisConst.DEVICE_ONLINE_PREFIX + deviceSn; |
| | | DeviceDTO device = (DeviceDTO) redisOps.get(key); |
| | | List<DevicePayloadDTO> payloads = new ArrayList<>(); |
| | | |
| | | for (DevicePayloadReceiver payloadReceiver : payloadReceiverList) { |
| | | int payloadId = this.saveOnePayloadDTO(payloadReceiver); |
| | | if (payloadId <= 0) { |
| | | return false; |
| | | } |
| | | payloads.add(this.receiver2Dto(payloadReceiver)); |
| | | } |
| | | |
| | | if (payloads.isEmpty()) { |
| | | payloads = this.getDevicePayloadEntitiesByDeviceSn(deviceSn); |
| | | } |
| | | device.setPayloadsList(payloads); |
| | | redisOps.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn(), device, RedisConst.DEVICE_ALIVE_SECOND); |
| | | return true; |
| | | } |
| | | |
| | |
| | | .eq(DevicePayloadEntity::getDeviceSn, deviceSn)); |
| | | capacityCameraService.deleteCapacityCameraByDeviceSn(deviceSn); |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public void updateFirmwareVersion(FirmwareVersionReceiver receiver) { |
| | | mapper.update(DevicePayloadEntity.builder() |
| | | .firmwareVersion(receiver.getFirmwareVersion()) |
| | | .build() |
| | | , new LambdaUpdateWrapper<DevicePayloadEntity>() |
| | | .eq(DevicePayloadEntity::getDeviceSn, receiver.getSn())); |
| | | } |
| | | |
| | | @Override |
| | | public void saveDeviceBasicPayload(List<DevicePayloadReceiver> payloadReceiverList, Long timestamp) { |
| | | if (payloadReceiverList.isEmpty()) { |
| | | return; |
| | | } |
| | | String deviceSn = payloadReceiverList.stream().findAny().get().getDeviceSn(); |
| | | String key = RedisConst.STATE_PAYLOAD_PREFIX + deviceSn; |
| | | // Solve timing problems |
| | | long last = (long) Objects.requireNonNullElse(redisOps.get(key), 0L); |
| | | if (last > timestamp) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | // Filter unsaved payload information. |
| | | Set<String> payloadSns = this.getDevicePayloadEntitiesByDeviceSn(payloadReceiverList.get(0).getDeviceSn()) |
| | | .stream().map(DevicePayloadDTO::getPayloadSn).collect(Collectors.toSet()); |
| | | |
| | | Set<String> newPayloadSns = payloadReceiverList.stream().map(DevicePayloadReceiver::getSn).collect(Collectors.toSet()); |
| | | Set<String> needToDel = payloadSns.stream().filter(sn -> !newPayloadSns.contains(sn)).collect(Collectors.toSet()); |
| | | this.deletePayloadsByPayloadsSn(needToDel); |
| | | |
| | | List<DevicePayloadReceiver> needToSave = payloadReceiverList.stream() |
| | | .filter(payload -> !payloadSns.contains(payload.getSn())).collect(Collectors.toList()); |
| | | |
| | | // Save the new payload information. |
| | | boolean isSave = this.savePayloadDTOs(needToSave); |
| | | if (isSave) { |
| | | redisOps.setWithExpire(key, timestamp, RedisConst.DEVICE_ALIVE_SECOND); |
| | | } |
| | | log.debug("The result of saving the payloads is {}.", isSave); |
| | | } |
| | | |
| | | @Override |
| | | public void deletePayloadsByPayloadsSn(Collection<String> payloadSns) { |
| | | if (CollectionUtils.isEmpty(payloadSns)) { |
| | | return; |
| | | } |
| | | mapper.delete(new LambdaUpdateWrapper<DevicePayloadEntity>() |
| | | .or(wrapper -> payloadSns.forEach(sn -> wrapper.eq(DevicePayloadEntity::getPayloadSn, sn)))); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | if (arr.length == 3) { |
| | | Optional<DeviceDictionaryDTO> dictionaryOpt = dictionaryService |
| | | .getOneDictionaryInfoByDomainTypeSubType(DeviceDomainEnum.PAYLOAD.getVal(), |
| | | arr[0], arr[1]); |
| | | .getOneDictionaryInfoByTypeSubType(arr[0], arr[1]); |
| | | dictionaryOpt.ifPresent(dictionary -> |
| | | builder.payloadName(dictionary.getDeviceName()) |
| | | .payloadDesc(dictionary.getDeviceDesc())); |
| | |
| | | |
| | | return builder |
| | | .payloadSn(dto.getSn()) |
| | | .version(dto.getVersion()) |
| | | .deviceSn(dto.getSn() |
| | | .substring(0, |
| | | dto.getSn().indexOf("-"))) |
| | | .deviceSn(dto.getDeviceSn()) |
| | | .build(); |
| | | } |
| | | |
| | | private DevicePayloadDTO receiver2Dto(DevicePayloadReceiver receiver) { |
| | | DevicePayloadDTO.DevicePayloadDTOBuilder builder = DevicePayloadDTO.builder(); |
| | | if (receiver == null) { |
| | | return builder.build(); |
| | | } |
| | | return builder.payloadSn(receiver.getSn()) |
| | | .payloadName(receiver.getPayloadIndex()) |
| | | .build(); |
| | | } |
| | | |