修改IDevice+IStor
This commit is contained in:
parent
7a55a0b843
commit
80c8dc2b3c
@ -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.AliOssDeviceChecker;
|
||||||
import com.ycwl.basic.device.checker.impl.AlwaysOnDeviceChecker;
|
import com.ycwl.basic.device.checker.impl.AlwaysOnDeviceChecker;
|
||||||
import com.ycwl.basic.device.enums.DeviceStoreTypeEnum;
|
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.IDeviceStorageOperator;
|
||||||
import com.ycwl.basic.device.operator.impl.AliOssStorageOperator;
|
import com.ycwl.basic.device.operator.LocalStorageOperator;
|
||||||
import com.ycwl.basic.device.operator.impl.LocalStorageOperator;
|
|
||||||
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
|
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
|
||||||
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
|
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.ycwl.basic.device.checker.impl;
|
package com.ycwl.basic.device.checker.impl;
|
||||||
|
|
||||||
import com.ycwl.basic.device.checker.IDeviceStatusChecker;
|
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.DeviceConfigEntity;
|
||||||
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
|
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.ycwl.basic.device.entity.alioss;
|
package com.ycwl.basic.device.entity.alioss;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class DeviceAliOssConfig {
|
public class DeviceAliOssConfig {
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,8 @@ import java.util.Date;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface IDeviceStorageOperator extends IDeviceCommon {
|
public interface IDeviceStorageOperator extends IDeviceCommon {
|
||||||
|
void loadConfig(String configJson);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取指定时间范围内的文件列表
|
* 获取指定时间范围内的文件列表
|
||||||
*
|
*
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -187,10 +187,4 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
return ApiResponse.success(resp);
|
return ApiResponse.success(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ApiResponse<FaceRespVO> getFaceByMemberId(Long memberId) {
|
|
||||||
// TODO: 修改
|
|
||||||
return ApiResponse.success(faceMapper.getByMemberId(memberId, 3928516560393736192L));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -185,15 +185,14 @@ public class TaskTaskServiceImpl implements TaskService {
|
|||||||
@Override
|
@Override
|
||||||
public void autoCreateTaskByFaceId(Long id) {
|
public void autoCreateTaskByFaceId(Long id) {
|
||||||
FaceRespVO faceRespVO = faceMapper.getById(id);
|
FaceRespVO faceRespVO = faceMapper.getById(id);
|
||||||
if (StringUtils.isNotBlank(faceRespVO.getMatchSampleIds())) {
|
if (!StringUtils.isNotBlank(faceRespVO.getMatchSampleIds())) {
|
||||||
List<FaceSampleRespVO> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
|
|
||||||
if (faceSampleList.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
List<TemplateEntity> templateList = templateMapper.listByScenicId(faceRespVO.getScenicId());
|
List<FaceSampleRespVO> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
|
||||||
|
if (faceSampleList.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<TemplateEntity> templateList = templateMapper.listEnabledByScenicId(faceRespVO.getScenicId());
|
||||||
if (templateList == null || templateList.isEmpty()) {
|
if (templateList == null || templateList.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,4 @@ public interface FaceService {
|
|||||||
ApiResponse<Integer> update(FaceEntity face);
|
ApiResponse<Integer> update(FaceEntity face);
|
||||||
|
|
||||||
ApiResponse faceUpload(MultipartFile file, Long scrnicId);
|
ApiResponse faceUpload(MultipartFile file, Long scrnicId);
|
||||||
|
|
||||||
ApiResponse<FaceRespVO> getFaceByMemberId(Long memberId);
|
|
||||||
}
|
}
|
||||||
|
@ -38,15 +38,15 @@ public class StorageFactory {
|
|||||||
return get(storageType);
|
return get(storageType);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static Map<String, IStorageAdapter> definedName = new HashMap<>();
|
protected static Map<String, IStorageAdapter> namedStorage = new HashMap<>();
|
||||||
protected static IStorageAdapter defaultStorage = null;
|
protected static IStorageAdapter defaultStorage = null;
|
||||||
|
|
||||||
public static void register(String name, IStorageAdapter adapter) {
|
public static void register(String name, IStorageAdapter adapter) {
|
||||||
definedName.put(name, adapter);
|
namedStorage.put(name, adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IStorageAdapter use(String name) {
|
public static IStorageAdapter use(String name) {
|
||||||
IStorageAdapter adapter = definedName.get(name);
|
IStorageAdapter adapter = namedStorage.get(name);
|
||||||
if (adapter == null) {
|
if (adapter == null) {
|
||||||
throw new StorageUndefinedException("未定义的存储方式:"+name);
|
throw new StorageUndefinedException("未定义的存储方式:"+name);
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,11 @@ public abstract class AStorageAdapter implements IStorageAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUrlForDownload(String... path) {
|
||||||
|
return getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), path);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUrlForUpload(String... path) {
|
public String getUrlForUpload(String... path) {
|
||||||
return getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), path);
|
return getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), path);
|
||||||
|
@ -5,18 +5,29 @@ import com.aliyun.oss.ClientException;
|
|||||||
import com.aliyun.oss.HttpMethod;
|
import com.aliyun.oss.HttpMethod;
|
||||||
import com.aliyun.oss.OSS;
|
import com.aliyun.oss.OSS;
|
||||||
import com.aliyun.oss.OSSClientBuilder;
|
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.aliyun.oss.model.PutObjectRequest;
|
import com.aliyun.oss.model.PutObjectRequest;
|
||||||
import com.ycwl.basic.storage.entity.AliOssStorageConfig;
|
import com.ycwl.basic.storage.entity.AliOssStorageConfig;
|
||||||
import com.ycwl.basic.storage.entity.StorageConfig;
|
import com.ycwl.basic.storage.entity.StorageConfig;
|
||||||
|
import com.ycwl.basic.storage.entity.StorageFileObject;
|
||||||
import com.ycwl.basic.storage.exceptions.StorageConfigException;
|
import com.ycwl.basic.storage.exceptions.StorageConfigException;
|
||||||
|
import com.ycwl.basic.storage.exceptions.StorageException;
|
||||||
import com.ycwl.basic.storage.exceptions.UploadFileFailedException;
|
import com.ycwl.basic.storage.exceptions.UploadFileFailedException;
|
||||||
import com.ycwl.basic.storage.utils.StorageUtil;
|
import com.ycwl.basic.storage.utils.StorageUtil;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
final public class AliOssAdapter extends AStorageAdapter {
|
final public class AliOssAdapter extends AStorageAdapter {
|
||||||
private AliOssStorageConfig config;
|
private AliOssStorageConfig config;
|
||||||
@ -80,6 +91,13 @@ final public class AliOssAdapter extends AStorageAdapter {
|
|||||||
return config.getUrl() + "/" + buildPath(path);
|
return config.getUrl() + "/" + buildPath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUrlForDownload(Date expireDate, String... path) {
|
||||||
|
OSS ossClient = getOssClient();
|
||||||
|
URL url = ossClient.generatePresignedUrl(config.getBucketName(), buildPath(path), expireDate, HttpMethod.GET);
|
||||||
|
return url.toString();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUrlForUpload(Date expireDate, String... path) {
|
public String getUrlForUpload(Date expireDate, String... path) {
|
||||||
OSS ossClient = getOssClient();
|
OSS ossClient = getOssClient();
|
||||||
@ -87,6 +105,68 @@ final public class AliOssAdapter extends AStorageAdapter {
|
|||||||
return url.toString();
|
return url.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<StorageFileObject> listDir(String... path) {
|
||||||
|
OSS ossClient = getOssClient();
|
||||||
|
ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request(config.getBucketName());
|
||||||
|
listObjectsV2Request.setPrefix(buildPath(path));
|
||||||
|
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.stream().map(item -> {
|
||||||
|
StorageFileObject object = new StorageFileObject();
|
||||||
|
object.setPath(item.getKey().substring(0, item.getKey().lastIndexOf("/")));
|
||||||
|
object.setName(item.getKey().substring(item.getKey().lastIndexOf("/") + 1));
|
||||||
|
object.setSize(item.getSize());
|
||||||
|
object.setRawObject(item);
|
||||||
|
return object;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
} catch (OSSException e) {
|
||||||
|
throw new StorageException("列举文件失败:" + e.getErrorMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteDir(String... path) {
|
||||||
|
List<StorageFileObject> objectList = listDir(buildPath(path));
|
||||||
|
OSS ossClient = getOssClient();
|
||||||
|
if (objectList.isEmpty()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
int idx = 0;
|
||||||
|
int batchSize = 999;
|
||||||
|
while (objectList.size() > idx) {
|
||||||
|
if (objectList.size() - idx < batchSize) {
|
||||||
|
batchSize = objectList.size() - idx;
|
||||||
|
}
|
||||||
|
List<StorageFileObject> subList = objectList.subList(idx, idx + batchSize);
|
||||||
|
idx += batchSize;
|
||||||
|
DeleteObjectsRequest request = new DeleteObjectsRequest(config.getBucketName());
|
||||||
|
request.setKeys(subList.stream().map(StorageFileObject::getFullPath).collect(Collectors.toList()));
|
||||||
|
try {
|
||||||
|
ossClient.deleteObjects(request);
|
||||||
|
} catch (OSSException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private OSS getOssClient() {
|
private OSS getOssClient() {
|
||||||
OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
|
OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
|
||||||
return ossClient;
|
return ossClient;
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
package com.ycwl.basic.storage.adapters;
|
package com.ycwl.basic.storage.adapters;
|
||||||
|
|
||||||
import com.ycwl.basic.storage.entity.StorageConfig;
|
import com.ycwl.basic.storage.entity.StorageConfig;
|
||||||
|
import com.ycwl.basic.storage.entity.StorageFileObject;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public interface IStorageAdapter {
|
public interface IStorageAdapter {
|
||||||
@ -16,6 +18,10 @@ public interface IStorageAdapter {
|
|||||||
String uploadFile(MultipartFile file, String ...path);
|
String uploadFile(MultipartFile file, String ...path);
|
||||||
boolean deleteFile(String ...path);
|
boolean deleteFile(String ...path);
|
||||||
String getUrl(String ...path);
|
String getUrl(String ...path);
|
||||||
|
String getUrlForDownload(String ...path);
|
||||||
|
String getUrlForDownload(Date expireDate, String ...path);
|
||||||
String getUrlForUpload(String ...path);
|
String getUrlForUpload(String ...path);
|
||||||
String getUrlForUpload(Date expireDate, String ...path);
|
String getUrlForUpload(Date expireDate, String ...path);
|
||||||
|
List<StorageFileObject> listDir(String ...path);
|
||||||
|
boolean deleteDir(String ...path);
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package com.ycwl.basic.storage.adapters;
|
package com.ycwl.basic.storage.adapters;
|
||||||
|
|
||||||
import com.ycwl.basic.storage.entity.StorageConfig;
|
import com.ycwl.basic.storage.entity.StorageConfig;
|
||||||
|
import com.ycwl.basic.storage.entity.StorageFileObject;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class LocalStorageAdapter extends AStorageAdapter{
|
public class LocalStorageAdapter extends AStorageAdapter{
|
||||||
@ -32,8 +35,23 @@ public class LocalStorageAdapter extends AStorageAdapter{
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUrlForDownload(Date expireDate, String... path) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUrlForUpload(Date expireDate, String... path) {
|
public String getUrlForUpload(Date expireDate, String... path) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<StorageFileObject> listDir(String... path) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteDir(String... path) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.ycwl.basic.storage.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class StorageFileObject {
|
||||||
|
private String path;
|
||||||
|
private String name;
|
||||||
|
private Long size;
|
||||||
|
private Object rawObject;
|
||||||
|
|
||||||
|
public String getFullPath() {
|
||||||
|
return path + "/" + name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFullPath(String path) {
|
||||||
|
this.path = path.substring(0, path.lastIndexOf("/"));
|
||||||
|
this.name = path.substring(path.lastIndexOf("/") + 1);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user