/*
|
* 【机场1】从 dock2 原类 com.ard.sample.manage.service.impl.CommandServiceImpl 复制/独立适配(DJI Dock 1 / M30)。
|
* 与 dock2 原类同服务共存;本文件内的适配差异以「// 机场1:」内联注释标出。
|
*/
|
package com.ard.sample.dock1.manage.service.impl;
|
|
import com.ard.sample.common.error.CommonErrorEnum;
|
import com.ard.sample.common.model.ResponseResult;
|
import com.ard.sample.component.mqtt.model.*;
|
import com.ard.sample.component.mqtt.service.IMessageSenderService;
|
import com.ard.common.core.redis.RedisConst;
|
import com.ard.common.core.redis.RedisOpsUtils;
|
import com.ard.sample.manage.model.dto.DeviceDTO;
|
import com.ard.sample.manage.model.param.CommandParam;
|
import com.ard.sample.dock1.manage.service.ICommandService;
|
import com.ard.sample.manage.service.IDeviceService;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.integration.mqtt.support.MqttHeaders;
|
import org.springframework.messaging.MessageHeaders;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.UUID;
|
import com.ard.sample.manage.service.impl.CommandServiceImpl;
|
|
/**
|
* Description:
|
* Author: lsy
|
* Date: 2025年09月24日9:00
|
**/
|
@Slf4j
|
@Service
|
public class Dock1CommandServiceImpl implements ICommandService {
|
|
@Autowired
|
private ObjectMapper mapper;
|
@Resource
|
private IDeviceService deviceService;
|
@Resource
|
private IMessageSenderService messageSenderService;
|
/**
|
* 负载控制-拍照
|
* @param sn
|
* @return
|
*/
|
@Override
|
public ResponseResult cameraPhotoTake(String sn, CommandParam param) {
|
|
boolean isExist = deviceService.checkDeviceOnline(sn);
|
if (!isExist) {
|
return ResponseResult.error("The dock is offline.");
|
}
|
String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + sn + TopicConst.SERVICES_SUF;
|
String bid = UUID.randomUUID().toString();
|
ServiceReply serviceReplyOpt = messageSenderService.publishWithReply(
|
topic, CommonTopicResponse.builder()
|
.tid(UUID.randomUUID().toString())
|
.bid(bid)
|
.method("camera_photo_take")
|
.timestamp(System.currentTimeMillis())
|
.data(param)
|
.build());
|
|
ServiceReply<EventsOutputReceiver> serviceReply = mapper.convertValue(
|
serviceReplyOpt, new TypeReference<ServiceReply<EventsOutputReceiver>>() {});
|
if (ResponseResult.CODE_SUCCESS != serviceReply.getResult()) {
|
return ResponseResult.error(serviceReply.getResult(), CommonErrorEnum.getMsgByCode(serviceReply.getResult()));
|
}
|
// if (controlMethodEnum.getProgress()) {
|
// RedisOpsUtils.setWithExpire(serviceIdentifier + RedisConst.DELIMITER + bid, sn,
|
// RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND);
|
// }
|
return ResponseResult.success();
|
}
|
|
// 机场1:不复制原 ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_CAMERA_PHOTO_TAKE_PROGRESS),消费职责由共享层原类承担
|
public void handleCameraPhotoTakeProgress(CommonTopicReceiver receiver, MessageHeaders headers) {
|
String key = receiver.getMethod() + RedisConst.DELIMITER + receiver.getBid();
|
if (RedisOpsUtils.getExpire(key) <= 0) {
|
return;
|
}
|
String sn = RedisOpsUtils.get(key).toString();
|
|
EventsReceiver<EventsOutputReceiver> eventsReceiver = mapper.convertValue(receiver.getData(),
|
new TypeReference<EventsReceiver<EventsOutputReceiver>>(){});
|
eventsReceiver.setBid(receiver.getBid());
|
eventsReceiver.setSn(sn);
|
|
log.info("SN: {}, {} ===> CameraPhotoTak progress: {}",
|
sn, receiver.getMethod(), eventsReceiver.getOutput().getProgress().toString());
|
|
if (eventsReceiver.getResult() != ResponseResult.CODE_SUCCESS) {
|
log.error("SN: {}, {} ===> Error code: {}", sn, receiver.getMethod(), eventsReceiver.getResult());
|
}
|
|
if (eventsReceiver.getOutput().getProgress().getPercent() == 100 ||
|
EventsResultStatusEnum.find(eventsReceiver.getOutput().getStatus()).getEnd()) {
|
RedisOpsUtils.del(key);
|
}
|
|
DeviceDTO device = (DeviceDTO) RedisOpsUtils.get(RedisConst.DEVICE_ONLINE_PREFIX + sn);
|
// webSocketMessageService.sendBatch(
|
// WebSocketManager.getValueWithWorkspaceAndUserType(
|
// device.getWorkspaceId(), UserTypeEnum.WEB.getVal()),
|
// CustomWebSocketMessage.builder()
|
// .data(eventsReceiver)
|
// .timestamp(System.currentTimeMillis())
|
// .bizCode(receiver.getMethod())
|
// .build());
|
|
if (receiver.getNeedReply() != null && receiver.getNeedReply() == 1) {
|
String topic = headers.get(MqttHeaders.RECEIVED_TOPIC) + TopicConst._REPLY_SUF;
|
messageSenderService.publish(topic,
|
CommonTopicResponse.builder()
|
.tid(receiver.getTid())
|
.bid(receiver.getBid())
|
.method(receiver.getMethod())
|
.timestamp(System.currentTimeMillis())
|
.data(RequestsReply.success())
|
.build());
|
}
|
}
|
}
|