package com.dji.sample.manage.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.dji.sample.manage.dao.ICapacityCameraMapper; import com.dji.sample.manage.model.dto.CapacityCameraDTO; import com.dji.sample.manage.model.dto.CapacityVideoDTO; import com.dji.sample.manage.model.dto.DeviceDictionaryDTO; import com.dji.sample.manage.model.entity.CapacityCameraEntity; import com.dji.sample.manage.model.enums.DeviceDomainEnum; import com.dji.sample.manage.model.receiver.CapacityCameraReceiver; import com.dji.sample.manage.service.ICameraVideoService; import com.dji.sample.manage.service.ICapacityCameraService; import com.dji.sample.manage.service.IDeviceDictionaryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * @author sean.zhou * @date 2021/11/19 * @version 0.1 */ @Service @Transactional public class CapacityCameraServiceImpl implements ICapacityCameraService { @Autowired private ICapacityCameraMapper mapper; @Autowired private ICameraVideoService cameraVideoService; @Autowired private IDeviceDictionaryService dictionaryService; @Override public List getCapacityCameraByDeviceSn(String deviceSn) { List capacityCamerasList = mapper.selectList( new LambdaQueryWrapper() .eq(CapacityCameraEntity::getDeviceSn, deviceSn)) .stream() .map(this::entityConvertToDto) .collect(Collectors.toList()); capacityCamerasList.forEach(capacityCamera -> { // Set the lens data for this camera. capacityCamera.setVideosList( cameraVideoService.getCameraVideosByCameraId(capacityCamera.getId())); }); return capacityCamerasList; } @Override public Boolean checkExist(String deviceSn, String cameraIndex) { return mapper.selectOne( new LambdaQueryWrapper() .eq(CapacityCameraEntity::getDeviceSn, deviceSn) .eq(CapacityCameraEntity::getCameraIndex, cameraIndex) .last(" limit 1")) != null; } @Override public Boolean deleteCapacityCameraByDeviceSn(String deviceSn) { List capacityCamerasList = this.getCapacityCameraByDeviceSn(deviceSn); // Return directly if no data exists in the database. if (capacityCamerasList.isEmpty()) { return true; } List cameraIds = capacityCamerasList .stream() .map(CapacityCameraDTO::getId) .collect(Collectors.toList()); List videoIds = capacityCamerasList .stream() .flatMap(camera -> camera.getVideosList().stream()) .map(CapacityVideoDTO::getId) .collect(Collectors.toList()); return mapper.deleteBatchIds(cameraIds) > 0 && cameraVideoService.deleteCameraVideosById(videoIds); } @Override public Boolean saveCapacityCameraReceiverList(List capacityCameraReceivers, String deviceSn) { for (CapacityCameraReceiver cameraDTO : capacityCameraReceivers) { CapacityCameraEntity cameraEntity = receiverConvertToEntity(cameraDTO); cameraEntity.setDeviceSn(deviceSn); int cameraId = this.saveOneCapacityCameraEntity(cameraEntity); if (cameraId <= 0) { continue; } boolean saveVideo = cameraVideoService.saveCameraVideoDTOList( cameraDTO.getVideosList(), cameraId); if (!saveVideo) { return false; } } return true; } /** * Save the camera live capability data of the device. * @param cameraEntity * @return */ private Integer saveOneCapacityCameraEntity(CapacityCameraEntity cameraEntity) { boolean exist = checkExist( cameraEntity.getDeviceSn(), cameraEntity.getCameraIndex()); if (exist) { return -1; } return mapper.insert(cameraEntity) > 0 ? cameraEntity.getId() : 0; } /** * Convert the received camera capability object into a database entity object. * @param receiver * @return */ private CapacityCameraEntity receiverConvertToEntity(CapacityCameraReceiver receiver) { CapacityCameraEntity.CapacityCameraEntityBuilder builder = CapacityCameraEntity.builder(); if (receiver == null) { return builder.build(); } int[] indexArr = Arrays.stream(receiver.getCameraIndex().split("-")) .map(Integer::valueOf) .mapToInt(Integer::intValue) .toArray(); // The cameraIndex consists of type and subType and the index of the payload hanging on the drone. // type-subType-index if (indexArr.length == 3) { Optional dictionaryOpt = dictionaryService .getOneDictionaryInfoByDomainTypeSubType( DeviceDomainEnum.PAYLOAD.getVal(), indexArr[0], indexArr[1]); dictionaryOpt.ifPresent(dictionary -> builder.name(dictionary.getDeviceName())); } return builder .availableVideoNumber(receiver.getAvailableVideoNumber()) .coexistVideoNumberMax(receiver.getCoexistVideoNumberMax()) .cameraIndex(receiver.getCameraIndex()) .build(); } /** * Convert database entity objects into camera data transfer object. * @param entity * @return */ private CapacityCameraDTO entityConvertToDto(CapacityCameraEntity entity) { CapacityCameraDTO.CapacityCameraDTOBuilder builder = CapacityCameraDTO.builder(); if (entity != null) { builder .id(entity.getId()) .name(entity.getName()) .description(entity.getDescription()) .deviceSn(entity.getDeviceSn()) .index(entity.getCameraIndex()) .build(); } return builder.build(); } }