避免重复创建

This commit is contained in:
2025-04-07 09:46:16 +08:00
parent 389c28300f
commit 84287df87b
10 changed files with 128 additions and 221 deletions

View File

@@ -10,8 +10,6 @@ public interface TaskFaceService {
SearchFaceRespVo searchFace(IFaceBodyAdapter adapter, String dbName, String faceUrl, String reason);
void batchDeleteExpiredFace(Long scenicId);
String uploadFile(MultipartFile file, Long userId);
boolean deleteFaceSample(Long scenicId, String dbName, String entityId);

View File

@@ -35,6 +35,7 @@ import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
import com.ycwl.basic.repository.DeviceRepository;
import com.ycwl.basic.repository.FaceRepository;
import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.service.pc.ScenicService;
import com.ycwl.basic.service.task.TaskFaceService;
import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter;
@@ -46,6 +47,7 @@ import com.ycwl.basic.utils.ratelimiter.IRateLimiter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.aliyuncs.IAcsClient;
@@ -77,8 +79,6 @@ public class TaskFaceServiceImpl implements TaskFaceService {
@Autowired
private FaceSampleMapper faceSampleMapper;
@Autowired
private ScenicMapper scenicMapper;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private FaceDetectLogMapper logMapper;
@@ -93,6 +93,9 @@ public class TaskFaceServiceImpl implements TaskFaceService {
private ScenicRepository scenicRepository;
@Autowired
private DeviceRepository deviceRepository;
@Autowired
@Lazy
private ScenicService scenicService;
private IAcsClient getClient() {
AliFaceBodyAdapter use = (AliFaceBodyAdapter) FaceBodyFactory.use();
@@ -295,118 +298,6 @@ public class TaskFaceServiceImpl implements TaskFaceService {
}
}
@Override
public void batchDeleteExpiredFace(Long scenicId) {
log.info("当前景区{},开始删除人脸样本", scenicId);
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId);
Integer sampleStoreDay = scenicConfig.getSampleStoreDay();
if (sampleStoreDay == null) {
log.info("当前景区{},人脸样本保存天数未设置,默认7天", scenicId);
sampleStoreDay = 7;
}
Date endDate = DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -sampleStoreDay);
ListFaceEntitiesRequest listFaceEntitiesRequest = new ListFaceEntitiesRequest();
AtomicInteger count = new AtomicInteger(0);
IAcsClient client = getClient();
FixedRateLimiter limiter = new FixedRateLimiter(2);
listFaceEntitiesRequest.setDbName(USER_FACE_DB_NAME + String.valueOf(scenicId));
listFaceEntitiesRequest.setToken(null);
listFaceEntitiesRequest.setEntityIdPrefix("");
count.set(0);
while (true) {
try {
listFaceEntitiesRequest.setOffset(count.get());
try {
limiter.acquire();
} catch (InterruptedException ignored) {
}
ListFaceEntitiesResponse listFaceEntitiesResponse = client.getAcsResponse(listFaceEntitiesRequest);
if (listFaceEntitiesResponse == null || listFaceEntitiesResponse.getData() == null || listFaceEntitiesResponse.getData().getEntities() == null || listFaceEntitiesResponse.getData().getEntities().isEmpty()) {
break;
}
listFaceEntitiesRequest.setToken(listFaceEntitiesResponse.getData().getToken());
listFaceEntitiesResponse.getData().getEntities().forEach(entity -> {
String entityId = entity.getEntityId();
String[] split = entityId.split("_");
if (split.length != 2) {
return;
}
String dateString = split[1];
if (StringUtils.isBlank(dateString)) {
return;
}
if (DateUtils.parse(dateString, DATE_FORMAT).before(endDate)) {
deleteFaceSample(scenicId, entity.getDbName(), entity.getEntityId());
} else {
count.incrementAndGet();
log.info("当前景区{},人脸样本:{}未过期", scenicId, entity.getEntityId());
}
});
} catch (Exception e) {
log.error("当前景区{},删除人脸样本失败", scenicId, e);
}
}
List<DeviceEntity> devices = deviceRepository.getAllDeviceByScenicId(scenicId);
listFaceEntitiesRequest.setDbName(String.valueOf(scenicId));
listFaceEntitiesRequest.setToken(null);
listFaceEntitiesRequest.setOrder("asc");
devices.forEach(device -> {
count.set(0);
listFaceEntitiesRequest.setEntityIdPrefix(device.getId() + "_");
try {
while (true) {
listFaceEntitiesRequest.setOffset(count.get());
try {
limiter.acquire();
} catch (InterruptedException ignored) {
}
ListFaceEntitiesResponse listFaceEntitiesResponse = client.getAcsResponse(listFaceEntitiesRequest);
if (listFaceEntitiesResponse == null || listFaceEntitiesResponse.getData() == null || listFaceEntitiesResponse.getData().getEntities() == null || listFaceEntitiesResponse.getData().getEntities().isEmpty()) {
break;
}
listFaceEntitiesRequest.setToken(listFaceEntitiesResponse.getData().getToken());
listFaceEntitiesResponse.getData().getEntities().forEach(entity -> {
String entityId = entity.getEntityId();
String[] split = entityId.split("_");
if (split.length != 2) {
return;
}
String deviceId = split[0];
if (StringUtils.isBlank(deviceId)) {
return;
}
String dateString = split[1];
if (StringUtils.isBlank(dateString)) {
return;
}
if (DateUtils.parse(dateString, DATE_FORMAT).before(endDate)) {
deleteFaceSample(scenicId, entity.getDbName(), entity.getEntityId());
} else {
count.incrementAndGet();
log.info("当前景区{},人脸样本:{}未过期", scenicId, entity.getEntityId());
}
});
}
} catch (Exception ignored) {
}
});
List<FaceSampleEntity> faceSampleList = faceSampleMapper.listEntityBeforeDate(scenicId, endDate);
if (faceSampleList.isEmpty()) {
log.info("当前景区{},人脸样本为空", scenicId);
return;
}
faceSampleList.forEach(faceSample -> {
boolean success = deleteFaceSample(scenicId, String.valueOf(scenicId), generateEntityId(faceSample));
if (success) {
log.info("当前景区{},人脸样本ID{},删除成功", scenicId, faceSample.getId());
faceSampleMapper.deleteById(faceSample.getId());
} else {
log.info("当前景区{},人脸样本ID{},删除失败", scenicId, faceSample.getId());
}
});
}
@Override
public String uploadFile(MultipartFile file, Long userId) {
if (file.isEmpty()) {
@@ -434,16 +325,10 @@ public class TaskFaceServiceImpl implements TaskFaceService {
@Override
public boolean deleteFaceSample(Long scenicId, String dbName, String entityId) {
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId);
IFaceBodyAdapter faceBodyAdapter;
if (scenicConfig != null && scenicConfig.getFaceType() != null) {
faceBodyAdapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType());
faceBodyAdapter.loadConfig(JSONObject.parseObject(scenicConfig.getFaceConfigJson(), Map.class));
} else {
faceBodyAdapter = FaceBodyFactory.use();
}
IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(scenicId);
log.info("删除{}人脸实体:{}", dbName, entityId);
try {
faceBodyAdapter.deleteFace(dbName, entityId);
adapter.deleteFace(dbName, entityId);
return true;
} catch (Exception e) {
log.error("删除人脸样本失败!", e);

View File

@@ -49,6 +49,7 @@ import com.ycwl.basic.repository.OrderRepository;
import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.repository.VideoRepository;
import com.ycwl.basic.repository.VideoTaskRepository;
import com.ycwl.basic.service.pc.ScenicService;
import com.ycwl.basic.service.task.TaskService;
import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter;
@@ -117,6 +118,9 @@ public class TaskTaskServiceImpl implements TaskService {
private VideoRepository videoRepository;
@Autowired
private OrderRepository orderRepository;
@Autowired
private ScenicService scenicService;
private final ReentrantLock lock = new ReentrantLock();
@Autowired
private TaskStatusBiz taskStatusBiz;
@@ -585,14 +589,8 @@ public class TaskTaskServiceImpl implements TaskService {
}
videoMapper.add(video);
}
IStorageAdapter adapter;
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(task.getScenicId());
if (scenicConfig != null && scenicConfig.getStoreType() != null) {
adapter = StorageFactory.get(scenicConfig.getStoreType());
adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class));
} else {
adapter = StorageFactory.use("video");
}
IStorageAdapter adapter = scenicService.getScenicStorageAdapter(task.getScenicId());
String filename = StorageUtil.joinPath(StorageConstant.VLOG_PATH, task.getId() + "_" + task.getScenicId() + ".mp4");
adapter.setAcl(StorageAcl.PUBLIC_READ, filename);
int isBuy = 0;
@@ -651,14 +649,7 @@ public class TaskTaskServiceImpl implements TaskService {
if (task == null) {
return null;
}
IStorageAdapter adapter;
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(task.getScenicId());
if (scenicConfig != null && scenicConfig.getStoreType() != null) {
adapter = StorageFactory.get(scenicConfig.getStoreType());
adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class));
} else {
adapter = StorageFactory.use("video");
}
IStorageAdapter adapter = scenicService.getScenicStorageAdapter(task.getScenicId());
String filename = StorageUtil.joinPath(StorageConstant.VLOG_PATH, task.getId() + "_" + task.getScenicId() + ".mp4");
if (StringUtils.isBlank(task.getVideoUrl())) {
// 生成