修改IDevice+IStor

This commit is contained in:
2024-12-29 11:09:13 +08:00
parent 7a55a0b843
commit 80c8dc2b3c
19 changed files with 300 additions and 232 deletions

View File

@ -4,9 +4,9 @@ import com.ycwl.basic.device.checker.IDeviceStatusChecker;
import com.ycwl.basic.device.checker.impl.AliOssDeviceChecker;
import com.ycwl.basic.device.checker.impl.AlwaysOnDeviceChecker;
import com.ycwl.basic.device.enums.DeviceStoreTypeEnum;
import com.ycwl.basic.device.operator.AliOssStorageOperator;
import com.ycwl.basic.device.operator.IDeviceStorageOperator;
import com.ycwl.basic.device.operator.impl.AliOssStorageOperator;
import com.ycwl.basic.device.operator.impl.LocalStorageOperator;
import com.ycwl.basic.device.operator.LocalStorageOperator;
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;

View File

@ -1,7 +1,6 @@
package com.ycwl.basic.device.checker.impl;
import com.ycwl.basic.device.checker.IDeviceStatusChecker;
import com.ycwl.basic.device.checker.helper.CommonDeviceChecker;
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
import lombok.Setter;

View File

@ -1,7 +1,6 @@
package com.ycwl.basic.device.entity.alioss;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
@Data
public class DeviceAliOssConfig {

View File

@ -0,0 +1,12 @@
package com.ycwl.basic.device.operator;
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
import lombok.Setter;
public abstract class ADeviceStorageOperator implements IDeviceStorageOperator {
@Setter
protected DeviceEntity device;
@Setter
protected DeviceConfigEntity deviceConfig;
}

View File

@ -0,0 +1,109 @@
package com.ycwl.basic.device.operator;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter;
import com.ycwl.basic.storage.entity.AliOssStorageConfig;
import com.ycwl.basic.storage.entity.StorageFileObject;
import com.ycwl.basic.storage.enums.StorageType;
import lombok.extern.slf4j.Slf4j;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class AliOssStorageOperator extends ADeviceStorageOperator {
private IStorageAdapter adapter;
public AliOssStorageOperator(String configJson) {
loadConfig(configJson);
}
@Override
public void loadConfig(String configJson) {
AliOssStorageConfig config = JSON.parseObject(configJson, AliOssStorageConfig.class);
adapter = StorageFactory.get(StorageType.ALI_OSS, config);
}
private List<StorageFileObject> getOssObjectListByPrefix(String prefix) {
return adapter.listDir(prefix);
}
private List<FileObject> getOssFileListByPrefix(String prefix) {
List<StorageFileObject> objectList = getOssObjectListByPrefix(prefix);
if (objectList == null) {
return null;
}
return objectList.stream().filter(item -> item.getName().endsWith(".ts")).map(item -> {
FileObject object = new FileObject();
object.setPath(item.getPath());
object.setUrl(adapter.getUrlForDownload(item.getFullPath()));
object.setNeedDownload(true);
String[] splitDir = item.getPath().split("/");
String splitDate = splitDir[splitDir.length - 1];
String[] splitExt = item.getName().split("\\.", 2);
String[] splitDt = splitExt[0].split("_", 2);
String createTime = splitDt[0];
String endTime = splitDt[1];
object.setName(item.getName());
object.setEndTime(DateUtil.parse(splitDate+endTime, "yyyyMMddHHmmss"));
object.setCreateTime(DateUtil.parse(splitDate+createTime, "yyyyMMddHHmmss"));
return object;
}).collect(Collectors.toList());
}
private boolean removeFilesByPrefix(String prefix) {
return adapter.deleteDir(prefix);
}
@Override
public List<FileObject> getFileListByDtRange(Date startDate, Date endDate) {
if (startDate == null || endDate == null) {
return null;
}
List<FileObject> fileList = new ArrayList<>();
if (startDate.after(endDate)) {
return fileList;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
calendar.set(Calendar.SECOND, 0);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd/HHmm");
while (calendar.getTime().before(endDate)) {
String prefix = dateFormat.format(calendar.getTime());
List<FileObject> fileListByPrefix = getOssFileListByPrefix(prefix);
if (fileListByPrefix == null) {
return null;
}
fileList.addAll(fileListByPrefix);
calendar.add(Calendar.MINUTE, 1);
}
calendar.clear();
return fileList.stream()
.sorted(Comparator.comparing(FileObject::getCreateTime))
.filter(item -> item.getCreateTime().after(startDate))
.filter(item -> item.getCreateTime().before(endDate))
.collect(Collectors.toList());
}
@Override
public boolean removeFilesBeforeDate(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd/");
calendar.add(Calendar.DAY_OF_MONTH, -1);
String prefix = dateFormat.format(calendar.getTime());
return removeFilesByPrefix(prefix);
}
}

View File

@ -7,6 +7,8 @@ import java.util.Date;
import java.util.List;
public interface IDeviceStorageOperator extends IDeviceCommon {
void loadConfig(String configJson);
/**
* 获取指定时间范围内的文件列表
*

View File

@ -0,0 +1,37 @@
package com.ycwl.basic.device.operator;
import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
import lombok.Setter;
import java.util.Collections;
import java.util.Date;
import java.util.List;
public class LocalStorageOperator implements IDeviceStorageOperator {
@Setter
private DeviceEntity device;
@Setter
private DeviceConfigEntity deviceConfig;
public LocalStorageOperator(String configJson) {
loadConfig(configJson);
}
@Override
public void loadConfig(String configJson) {
}
@Override
public List<FileObject> getFileListByDtRange(Date startDate, Date endDate) {
return Collections.emptyList();
}
@Override
public boolean removeFilesBeforeDate(Date date) {
return false;
}
}

View File

@ -1,24 +0,0 @@
package com.ycwl.basic.device.operator.helper;
import com.alibaba.fastjson.JSON;
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
import lombok.Setter;
public abstract class CommonPieceGetter<C> {
protected C config;
@Setter
private DeviceEntity device;
@Setter
private DeviceConfigEntity deviceConfig;
public CommonPieceGetter(String configJson) {
config = JSON.parseObject(configJson, getConfigClass());
}
@SuppressWarnings("unchecked")
private Class<C> getConfigClass() {
return (Class<C>) ((java.lang.reflect.ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
}

View File

@ -1,160 +0,0 @@
package com.ycwl.basic.device.operator.impl;
import cn.hutool.core.date.DateUtil;
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.ListObjectsV2Request;
import com.aliyun.oss.model.ListObjectsV2Result;
import com.aliyun.oss.model.OSSObjectSummary;
import com.ycwl.basic.device.entity.alioss.DeviceAliOssConfig;
import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.device.operator.IDeviceStorageOperator;
import com.ycwl.basic.device.operator.helper.CommonPieceGetter;
import lombok.extern.slf4j.Slf4j;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class AliOssStorageOperator extends CommonPieceGetter<DeviceAliOssConfig> implements IDeviceStorageOperator {
public AliOssStorageOperator(String configJson) {
super(configJson);
}
private OSS getClient() {
return new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
}
private List<OSSObjectSummary> getOssObjectListByPrefix(String prefix) {
OSS ossClient = getClient();
ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request(config.getBucketName());
listObjectsV2Request.setPrefix(config.getPrefix() + prefix);
listObjectsV2Request.setMaxKeys(1000);
boolean isTruncated = true;
String continuationToken = null;
List<OSSObjectSummary> objectList = new ArrayList<>();
try {
while (isTruncated) {
if (continuationToken != null) {
listObjectsV2Request.setContinuationToken(continuationToken);
}
// 列举文件。
ListObjectsV2Result result = ossClient.listObjectsV2(listObjectsV2Request);
objectList.addAll(result.getObjectSummaries());
isTruncated = result.isTruncated();
continuationToken = result.getNextContinuationToken();
}
return objectList;
} catch (OSSException e) {
log.error("获取OSS文件列表失败", e);
}
return null;
}
private List<FileObject> getOssFileListByPrefix(String prefix) {
OSS ossClient = getClient();
List<OSSObjectSummary> objectList = getOssObjectListByPrefix(prefix);
if (objectList == null) {
return null;
}
return objectList.stream().filter(item -> item.getKey().endsWith(".ts")).map(item -> {
FileObject object = new FileObject();
object.setPath(item.getKey());
URL url = ossClient.generatePresignedUrl(item.getBucketName(), item.getKey(), DateUtil.offsetHour(new Date(), 8), HttpMethod.GET);
object.setUrl(url.toString());
object.setNeedDownload(true);
String[] splitDir = item.getKey().split("/");
String splitDate = splitDir[splitDir.length - 2];
String splitName = splitDir[splitDir.length - 1];
String[] splitExt = splitName.split("\\.", 2);
String[] splitDt = splitExt[0].split("_", 2);
String createTime = splitDt[0];
String endTime = splitDt[1];
object.setName(splitName);
object.setEndTime(DateUtil.parse(splitDate+endTime, "yyyyMMddHHmmss"));
object.setCreateTime(DateUtil.parse(splitDate+createTime, "yyyyMMddHHmmss"));
return object;
}).collect(Collectors.toList());
}
private boolean removeFilesByPrefix(String prefix) {
OSS ossClient = getClient();
List<OSSObjectSummary> objectList = getOssObjectListByPrefix(prefix);
if (objectList == null) {
return false;
}
int idx = 0;
int batchSize = 999;
while (objectList.size() > idx) {
if (objectList.size() - idx < batchSize) {
batchSize = objectList.size() - idx;
}
List<OSSObjectSummary> subList = objectList.subList(idx, idx + batchSize);
idx += batchSize;
DeleteObjectsRequest request = new DeleteObjectsRequest(config.getBucketName());
request.setKeys(subList.stream().map(OSSObjectSummary::getKey).collect(Collectors.toList()));
try {
ossClient.deleteObjects(request);
} catch (OSSException e) {
return false;
}
}
ossClient.shutdown();
return true;
}
@Override
public List<FileObject> getFileListByDtRange(Date startDate, Date endDate) {
if (startDate == null || endDate == null) {
return null;
}
List<FileObject> fileList = new ArrayList<>();
if (startDate.after(endDate)) {
return fileList;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
calendar.set(Calendar.SECOND, 0);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd/HHmm");
while (calendar.getTime().before(endDate)) {
String prefix = dateFormat.format(calendar.getTime());
List<FileObject> fileListByPrefix = getOssFileListByPrefix(prefix);
if (fileListByPrefix == null) {
return null;
}
fileList.addAll(fileListByPrefix);
calendar.add(Calendar.MINUTE, 1);
}
calendar.clear();
return fileList.stream()
.sorted(Comparator.comparing(FileObject::getCreateTime))
.filter(item -> item.getCreateTime().after(startDate))
.filter(item -> item.getCreateTime().before(endDate))
.collect(Collectors.toList());
}
@Override
public boolean removeFilesBeforeDate(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd/");
calendar.add(Calendar.DAY_OF_MONTH, -1);
String prefix = dateFormat.format(calendar.getTime());
return removeFilesByPrefix(prefix);
}
}

View File

@ -1,26 +0,0 @@
package com.ycwl.basic.device.operator.impl;
import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.device.entity.local.DeviceLocalConfig;
import com.ycwl.basic.device.operator.IDeviceStorageOperator;
import com.ycwl.basic.device.operator.helper.CommonPieceGetter;
import java.util.Collections;
import java.util.Date;
import java.util.List;
public class LocalStorageOperator extends CommonPieceGetter<DeviceLocalConfig> implements IDeviceStorageOperator {
public LocalStorageOperator(String configJson) {
super(configJson);
}
@Override
public List<FileObject> getFileListByDtRange(Date startDate, Date endDate) {
return Collections.emptyList();
}
@Override
public boolean removeFilesBeforeDate(Date date) {
return false;
}
}