sean.zhou
2022-03-21 17835b967b48f2676cce3bbed081c6580602ee1c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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<CapacityCameraDTO> getCapacityCameraByDeviceSn(String deviceSn) {
        List<CapacityCameraDTO> capacityCamerasList = mapper.selectList(
                new LambdaQueryWrapper<CapacityCameraEntity>()
                        .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<CapacityCameraEntity>()
                        .eq(CapacityCameraEntity::getDeviceSn, deviceSn)
                        .eq(CapacityCameraEntity::getCameraIndex, cameraIndex)
                        .last(" limit 1")) != null;
    }
 
    @Override
    public Boolean deleteCapacityCameraByDeviceSn(String deviceSn) {
 
        List<CapacityCameraDTO> capacityCamerasList = this.getCapacityCameraByDeviceSn(deviceSn);
        // Return directly if no data exists in the database.
        if (capacityCamerasList.isEmpty()) {
            return true;
        }
 
        List<Integer> cameraIds = capacityCamerasList
                .stream()
                .map(CapacityCameraDTO::getId)
                .collect(Collectors.toList());
 
        List<Integer> 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<CapacityCameraReceiver> 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<DeviceDictionaryDTO> 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();
    }
}