You've already forked FrameTour-BE
- 新增DeviceRepository依赖注入 - 获取设备配置管理器并检查裁剪配置 - 根据裁剪配置设置缩略图URL -优化sourceEntity数据处理逻辑
138 lines
4.5 KiB
Java
138 lines
4.5 KiB
Java
package com.ycwl.basic.service;
|
|
|
|
import com.ycwl.basic.dto.ZTSourceMessage;
|
|
import com.ycwl.basic.integration.common.manager.DeviceConfigManager;
|
|
import com.ycwl.basic.mapper.SourceMapper;
|
|
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
|
|
import com.ycwl.basic.repository.DeviceRepository;
|
|
import com.ycwl.basic.utils.SnowFlakeUtil;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.logging.log4j.util.Strings;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.sql.Timestamp;
|
|
import java.time.LocalDateTime;
|
|
import java.util.Date;
|
|
|
|
/**
|
|
* ZT-Source数据处理服务
|
|
* 负责将ZT-Source消息转换并保存到数据库
|
|
*
|
|
* @author system
|
|
* @date 2024/12/27
|
|
*/
|
|
@Slf4j
|
|
@Service
|
|
@RequiredArgsConstructor
|
|
public class ZTSourceDataService {
|
|
|
|
private final SourceMapper sourceMapper;
|
|
private final DeviceRepository deviceRepository;
|
|
|
|
/**
|
|
* 处理ZT-Source消息,仅处理照片类型(sourceType=2)
|
|
*
|
|
* @param message ZT-Source消息
|
|
* @return 是否处理成功
|
|
*/
|
|
public boolean processZTSourceMessage(ZTSourceMessage message) {
|
|
try {
|
|
// 仅处理照片类型的消息
|
|
if (!message.isPhoto()) {
|
|
log.debug("跳过非照片类型消息: sourceId={}, sourceType={}",
|
|
message.getSourceId(), message.getSourceType());
|
|
return false;
|
|
}
|
|
|
|
// 检查必要字段
|
|
if (!validateMessage(message)) {
|
|
log.warn("消息校验失败: {}", message);
|
|
return false;
|
|
}
|
|
|
|
// 转换为SourceEntity
|
|
SourceEntity sourceEntity = convertToSourceEntity(message);
|
|
DeviceConfigManager configManager = deviceRepository.getDeviceConfigManager(sourceEntity.getDeviceId());
|
|
if (configManager != null) {
|
|
if (Strings.isNotBlank(configManager.getString("crop_config"))) {
|
|
sourceEntity.setUrl(message.getThumbnailUrl());
|
|
}
|
|
}
|
|
|
|
// 保存到数据库
|
|
int result = sourceMapper.addFromZTSource(sourceEntity);
|
|
|
|
if (result > 0) {
|
|
log.info("成功保存ZT-Source照片素材: sourceId={}, entityId={}, scenicId={}, deviceId={}",
|
|
message.getSourceId(), sourceEntity.getId(), message.getScenicId(), message.getDeviceId());
|
|
return true;
|
|
} else {
|
|
log.error("保存ZT-Source照片素材失败: sourceId={}", message.getSourceId());
|
|
return false;
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
log.error("处理ZT-Source消息异常: sourceId={}, error={}",
|
|
message.getSourceId(), e.getMessage(), e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 校验消息必要字段
|
|
*/
|
|
private boolean validateMessage(ZTSourceMessage message) {
|
|
if (message.getScenicId() == null) {
|
|
log.warn("scenicId不能为空: sourceId={}", message.getSourceId());
|
|
return false;
|
|
}
|
|
|
|
if (message.getDeviceId() == null) {
|
|
log.warn("deviceId不能为空: sourceId={}", message.getSourceId());
|
|
return false;
|
|
}
|
|
|
|
if (message.getSourceUrl() == null || message.getSourceUrl().trim().isEmpty()) {
|
|
log.warn("sourceUrl不能为空: sourceId={}", message.getSourceId());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 将ZTSourceMessage转换为SourceEntity
|
|
*/
|
|
private SourceEntity convertToSourceEntity(ZTSourceMessage message) {
|
|
SourceEntity entity = new SourceEntity();
|
|
|
|
// 生成ID
|
|
entity.setId(SnowFlakeUtil.getLongId());
|
|
|
|
// 基本字段映射
|
|
entity.setScenicId(message.getScenicId());
|
|
entity.setDeviceId(message.getDeviceId());
|
|
entity.setUrl(message.getSourceUrl()); // 使用sourceUrl,不使用缩略图
|
|
entity.setType(2); // 照片类型
|
|
|
|
// 人脸样本ID处理
|
|
entity.setFaceSampleId(message.getFaceSampleId());
|
|
|
|
// 位置信息JSON处理
|
|
entity.setPosJson(message.getPosJson());
|
|
|
|
// 时间处理
|
|
Date shootTime = message.getShootTime();
|
|
if (shootTime != null) {
|
|
entity.setCreateTime(shootTime);
|
|
} else {
|
|
entity.setCreateTime(new Date());
|
|
}
|
|
|
|
log.debug("转换ZTSourceMessage到SourceEntity: sourceId={} -> entityId={}",
|
|
message.getSourceId(), entity.getId());
|
|
|
|
return entity;
|
|
}
|
|
} |