diff --git a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java index 74957e3..a0fce10 100644 --- a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java +++ b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java @@ -38,6 +38,7 @@ import com.ycwl.basic.model.viid.resp.SystemTimeResp; import com.ycwl.basic.model.viid.resp.VIIDBaseResp; import com.ycwl.basic.repository.DeviceRepository; 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; @@ -93,6 +94,8 @@ public class ViidController { @Autowired private TaskFaceService taskFaceService; private final Map executors = new ConcurrentHashMap<>(); + @Autowired + private ScenicService scenicService; private ThreadPoolExecutor getExecutor(String deviceId) { ThreadPoolExecutor executor = executors.get(deviceId); @@ -273,21 +276,8 @@ public class ViidController { if (scenicId == null) { continue; } - IStorageAdapter scenicStorageAdapter; - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); - if (scenicConfig != null && scenicConfig.getStoreType() != null) { - scenicStorageAdapter = StorageFactory.get(scenicConfig.getStoreType()); - scenicStorageAdapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class)); - } else { - scenicStorageAdapter = StorageFactory.use("video"); - } - IFaceBodyAdapter faceBodyAdapter; - if (scenicConfig != null && scenicConfig.getFaceType() != null) { - faceBodyAdapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType()); - faceBodyAdapter.loadConfig(JSONObject.parseObject(scenicConfig.getFaceConfigJson(), Map.class)); - } else { - faceBodyAdapter = null; - } + IStorageAdapter scenicStorageAdapter = scenicService.getScenicStorageAdapter(scenicId); + IFaceBodyAdapter faceBodyAdapter = scenicService.getScenicFaceBodyAdapter(scenicId); FacePositionObject facePosition = new FacePositionObject(); facePosition.setLtY(face.getLeftTopY()); facePosition.setLtX(face.getLeftTopX()); diff --git a/src/main/java/com/ycwl/basic/controller/vpt/VptController.java b/src/main/java/com/ycwl/basic/controller/vpt/VptController.java index 90ae452..e7e66fa 100644 --- a/src/main/java/com/ycwl/basic/controller/vpt/VptController.java +++ b/src/main/java/com/ycwl/basic/controller/vpt/VptController.java @@ -7,9 +7,11 @@ import com.ycwl.basic.constant.StorageConstant; import com.ycwl.basic.device.entity.common.FileObject; import com.ycwl.basic.device.operator.VptPassiveStorageOperator; import com.ycwl.basic.device.operator.VptPassiveStorageOperator; +import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.wvp.WvpSyncReqVo; import com.ycwl.basic.repository.ScenicRepository; +import com.ycwl.basic.service.pc.ScenicService; import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.enums.StorageAcl; @@ -18,6 +20,7 @@ import com.ycwl.basic.utils.ApiResponse; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -35,11 +38,8 @@ import java.util.Map; @RequestMapping("/vpt/v1/") public class VptController { - private final ScenicRepository scenicRepository; - - public VptController(ScenicRepository scenicRepository) { - this.scenicRepository = scenicRepository; - } + @Autowired + private ScenicService scenicService; @IgnoreLogReq @PostMapping("/scenic/{scenicId}/sync") @@ -48,14 +48,7 @@ public class VptController { } @PostMapping("/scenic/{scenicId}/{taskId}/uploadUrl") public String uploadUrl(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId) { - IStorageAdapter adapter; - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); - 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(scenicId); String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4"); String urlForUpload = adapter.getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), "video/mp4", filename); urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com"); @@ -63,14 +56,7 @@ public class VptController { } @PostMapping("/scenic/{scenicId}/{taskId}/success") public ApiResponse success(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId, @RequestBody FileObject fileObject) { - IStorageAdapter adapter; - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); - 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(scenicId); String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4"); fileObject.setUrl(adapter.getUrl(filename)); adapter.setAcl(StorageAcl.PUBLIC_READ, filename); diff --git a/src/main/java/com/ycwl/basic/controller/wvp/WvpController.java b/src/main/java/com/ycwl/basic/controller/wvp/WvpController.java index fda783d..415635e 100644 --- a/src/main/java/com/ycwl/basic/controller/wvp/WvpController.java +++ b/src/main/java/com/ycwl/basic/controller/wvp/WvpController.java @@ -10,6 +10,7 @@ import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.wvp.WvpSyncReqVo; import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.pc.DeviceService; +import com.ycwl.basic.service.pc.ScenicService; import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.enums.StorageAcl; @@ -39,7 +40,7 @@ public class WvpController { @Autowired private DeviceService deviceService; @Autowired - private ScenicRepository scenicRepository; + private ScenicService scenicService; @IgnoreLogReq @PostMapping("/scenic/{scenicId}/sync") @@ -50,14 +51,7 @@ public class WvpController { @PostMapping("/scenic/{scenicId}/{taskId}/uploadUrl") public String uploadUrl(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId) { - IStorageAdapter adapter; - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); - 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(scenicId); String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4"); String urlForUpload = adapter.getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), "video/mp4", filename); urlForUpload = urlForUpload.replace("-internal.aliyuncs.com", ".aliyuncs.com"); @@ -65,14 +59,7 @@ public class WvpController { } @PostMapping("/scenic/{scenicId}/{taskId}/success") public ApiResponse success(@PathVariable("scenicId") Long scenicId, @PathVariable("taskId") Long taskId, @RequestBody FileObject fileObject) { - IStorageAdapter adapter; - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); - 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(scenicId); String filename = StorageUtil.joinPath(StorageConstant.VIDEO_PIECE_PATH, taskId.toString() + ".mp4"); fileObject.setUrl(adapter.getUrl(filename)); adapter.setAcl(StorageAcl.PUBLIC_READ, filename); diff --git a/src/main/java/com/ycwl/basic/service/pc/ScenicService.java b/src/main/java/com/ycwl/basic/service/pc/ScenicService.java index 83acdee..47d9ba1 100644 --- a/src/main/java/com/ycwl/basic/service/pc/ScenicService.java +++ b/src/main/java/com/ycwl/basic/service/pc/ScenicService.java @@ -1,10 +1,12 @@ package com.ycwl.basic.service.pc; import com.github.pagehelper.PageInfo; +import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicAddOrUpdateReq; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; +import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.utils.ApiResponse; import java.util.List; @@ -31,4 +33,8 @@ public interface ScenicService { ScenicConfigEntity getConfig(Long id); void saveConfig(Long configId, ScenicConfigEntity config); + + IStorageAdapter getScenicStorageAdapter(Long scenicId); + + IFaceBodyAdapter getScenicFaceBodyAdapter(Long scenicId); } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java index d0803f9..c15cee0 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java @@ -28,6 +28,7 @@ import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.repository.FaceRepository; import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.pc.FaceService; +import com.ycwl.basic.service.pc.ScenicService; import com.ycwl.basic.service.task.TaskFaceService; import com.ycwl.basic.service.task.TaskService; import com.ycwl.basic.storage.StorageFactory; @@ -75,6 +76,8 @@ public class FaceServiceImpl implements FaceService { private VideoMapper videoMapper; @Autowired private ScenicRepository scenicRepository; + @Autowired + private ScenicService scenicService; @Override public ApiResponse> pageQuery(FaceReqQuery faceReqQuery) { @@ -303,7 +306,8 @@ public class FaceServiceImpl implements FaceService { new Thread(() -> { sourceMapper.deleteNotBuyFaceRelation(face.getMemberId(), faceId); videoMapper.deleteNotBuyFaceRelations(face.getMemberId(), faceId); - faceService.deleteFaceSample(face.getScenicId(), USER_FACE_DB_NAME+face.getScenicId().toString(), faceId.toString()); + IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(face.getScenicId()); + adapter.deleteFace(USER_FACE_DB_NAME+face.getScenicId().toString(), faceId.toString()); }).start(); return ApiResponse.success("删除成功"); } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/ScenicServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/ScenicServiceImpl.java index da9c6e2..37c2ca5 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/ScenicServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/ScenicServiceImpl.java @@ -15,6 +15,8 @@ import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; 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; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.SnowFlakeUtil; import lombok.extern.slf4j.Slf4j; @@ -25,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; @@ -93,17 +96,15 @@ public class ScenicServiceImpl implements ScenicService { int i = scenicMapper.deleteById(id); if (i > 0) { scenicAccountMapper.deleteByScenicId(id); - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(id); - if (scenicConfig != null && scenicConfig.getFaceType() != null) { - IFaceBodyAdapter adapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType()); - adapter.loadConfig(JSONObject.parseObject(scenicConfig.getFaceConfigJson(), Map.class)); - (new Thread(() -> { - adapter.deleteFaceDb(id.toString()); - adapter.deleteFaceDb(USER_FACE_DB_NAME + id); - })).start(); - } + IFaceBodyAdapter adapter = getScenicFaceBodyAdapter(id); + (new Thread(() -> { + adapter.deleteFaceDb(id.toString()); + adapter.deleteFaceDb(USER_FACE_DB_NAME + id); + })).start(); scenicMapper.deleteConfigByScenicId(id); scenicRepository.clearCache(id); + scenicFaceBodyAdapterMap.remove(id); + scenicStorageAdapterMap.remove(id); return ApiResponse.success(true); }else { return ApiResponse.fail("景区删除失败"); @@ -194,5 +195,39 @@ public class ScenicServiceImpl implements ScenicService { } scenicMapper.updateConfigById(config); scenicRepository.clearCache(config.getScenicId()); + scenicFaceBodyAdapterMap.remove(config.getScenicId()); + scenicStorageAdapterMap.remove(config.getScenicId()); + } + + + private static final Map scenicStorageAdapterMap = new ConcurrentHashMap<>(); + @Override + public IStorageAdapter getScenicStorageAdapter(Long scenicId) { + return scenicStorageAdapterMap.computeIfAbsent(scenicId, (key) -> { + IStorageAdapter adapter; + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); + if (scenicConfig != null && scenicConfig.getStoreType() != null) { + adapter = StorageFactory.get(scenicConfig.getStoreType()); + adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class)); + } else { + adapter = StorageFactory.use("video"); + } + return adapter; + }); + } + private static final Map scenicFaceBodyAdapterMap = new ConcurrentHashMap<>(); + @Override + public IFaceBodyAdapter getScenicFaceBodyAdapter(Long scenicId) { + return scenicFaceBodyAdapterMap.computeIfAbsent(scenicId, (key) -> { + IFaceBodyAdapter adapter; + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); + if (scenicConfig != null && scenicConfig.getFaceType() != null) { + adapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType()); + adapter.loadConfig(JSONObject.parseObject(scenicConfig.getFaceConfigJson(), Map.class)); + } else { + adapter = FaceBodyFactory.use(); + } + return adapter; + }); } } diff --git a/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java b/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java index a387334..e944cb3 100644 --- a/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java +++ b/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java @@ -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); diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java index 3487671..28f3940 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java @@ -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 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 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 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); diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java index b829567..d191ce3 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java @@ -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())) { // 生成 diff --git a/src/main/java/com/ycwl/basic/task/FaceCleaner.java b/src/main/java/com/ycwl/basic/task/FaceCleaner.java index 9c494b0..07ef7dd 100644 --- a/src/main/java/com/ycwl/basic/task/FaceCleaner.java +++ b/src/main/java/com/ycwl/basic/task/FaceCleaner.java @@ -3,6 +3,7 @@ package com.ycwl.basic.task; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.ycwl.basic.constant.StorageConstant; +import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.ScenicMapper; @@ -10,6 +11,7 @@ import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.mapper.VideoMapper; import com.ycwl.basic.model.pc.face.req.FaceReqQuery; import com.ycwl.basic.model.pc.face.resp.FaceRespVO; +import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import com.ycwl.basic.model.pc.faceSample.req.FaceSampleReqQuery; import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; @@ -20,6 +22,7 @@ import com.ycwl.basic.model.pc.source.resp.SourceRespVO; import com.ycwl.basic.model.pc.video.req.VideoReqQuery; import com.ycwl.basic.model.pc.video.resp.VideoRespVO; 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; @@ -37,6 +40,7 @@ import java.util.Map; import java.util.Objects; import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; +import static com.ycwl.basic.service.task.impl.TaskFaceServiceImpl.generateEntityId; @Component @EnableScheduling @@ -46,8 +50,6 @@ public class FaceCleaner { @Autowired private ScenicMapper scenicMapper; @Autowired - private TaskFaceService faceService; - @Autowired private FaceSampleMapper faceSampleMapper; @Autowired private SourceMapper sourceMapper; @@ -57,39 +59,66 @@ public class FaceCleaner { private ScenicRepository scenicRepository; @Autowired private FaceMapper faceMapper; + @Autowired + private ScenicService scenicService; - @Scheduled(cron = "0 0 4 * * ?") + @Scheduled(cron = "0 0 1 * * ?") public void clean(){ ScenicReqQuery scenicQuery = new ScenicReqQuery(); List scenicList = scenicMapper.list(scenicQuery); scenicList.forEach(scenic -> { - log.info("当前景区{},开始删除人脸样本", scenic.getName()); - faceService.batchDeleteExpiredFace(scenic.getId()); + log.info("当前景区{},开始删除人脸样本", scenic.getId()); + IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(scenic.getId()); + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); + Integer sampleStoreDay = scenicConfig.getSampleStoreDay(); + if (sampleStoreDay == null) { + log.info("当前景区{},人脸样本保存天数未设置,默认7天", scenic.getId()); + sampleStoreDay = 7; + } + Date sampleEndDate = DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -sampleStoreDay); + List faceSampleList = faceSampleMapper.listEntityBeforeDate(scenic.getId(), sampleEndDate); + if (faceSampleList.isEmpty()) { + log.info("当前景区{},人脸样本为空", scenic.getId()); + return; + } + faceSampleList.forEach(faceSample -> { + boolean success = adapter.deleteFace(String.valueOf(scenic.getId()), generateEntityId(faceSample)); + if (success) { + log.info("当前景区{},人脸样本ID{},删除成功", scenic.getId(), faceSample.getId()); + faceSampleMapper.deleteById(faceSample.getId()); + } else { + log.info("当前景区{},人脸样本ID{},删除失败", scenic.getId(), faceSample.getId()); + } + }); }); } - @Scheduled(cron = "0 0 3 * * ?") + @Scheduled(cron = "0 45 2 * * ?") public void deleteExpireFace() { ScenicReqQuery scenicQuery = new ScenicReqQuery(); List scenicList = scenicMapper.list(scenicQuery); scenicList.parallelStream().forEach(scenic -> { + log.info("当前景区{},开始删除用户人脸", scenic.getId()); ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); - Integer sampleStoreDay = scenicConfig.getSampleStoreDay(); - if (sampleStoreDay == null) { + IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(scenic.getId()); + Integer faceStoreDay = scenicConfig.getFaceStoreDay(); + if (faceStoreDay == null) { log.info("当前景区{},人脸样本保存天数未设置,默认3天", scenic.getName()); - sampleStoreDay = 3; + faceStoreDay = 3; } FaceReqQuery req = new FaceReqQuery(); req.setScenicId(scenic.getId()); - req.setUpdateEndTime(DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -sampleStoreDay)); + req.setUpdateEndTime(DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -faceStoreDay)); List list = faceMapper.list(req); list.forEach(face -> { - boolean result = faceService.deleteFaceSample(face.getScenicId(), USER_FACE_DB_NAME+face.getScenicId(), face.getId().toString()); + boolean result = adapter.deleteFace(USER_FACE_DB_NAME+face.getScenicId(), face.getId().toString()); if (result) { + log.info("当前景区{},人脸样本ID{},删除成功", scenic.getId(), face.getId()); faceMapper.deleteById(face.getId()); + } else { + log.info("当前景区{},人脸样本ID{},删除失败", scenic.getId(), face.getId()); } }); - log.info("当前景区{},删除人脸样本{}个", scenic.getName(), list.size()); }); } @@ -174,7 +203,7 @@ public class FaceCleaner { }); } - @Scheduled(cron = "0 0 5 * * ?") + @Scheduled(cron = "0 0 1 * * ?") public void clearOss(){ cleanFaceSampleOss(); cleanSourceOss(); @@ -196,9 +225,7 @@ public class FaceCleaner { log.info("开始清理源视频素材文件"); List list = sourceMapper.list(new SourceReqQuery()); scenicMapper.list(new ScenicReqQuery()).forEach(scenic -> { - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); - IStorageAdapter adapter = StorageFactory.get(scenicConfig.getStoreType()); - adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class)); + IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenic.getId()); log.info("开始清理视频文件"); List fileObjectList = adapter.listDir(StorageConstant.VIDEO_PIECE_PATH); fileObjectList.parallelStream().forEach(fileObject -> { @@ -225,9 +252,7 @@ public class FaceCleaner { log.info("开始清理视频文件"); List list = videoMapper.list(new VideoReqQuery()); scenicMapper.list(new ScenicReqQuery()).forEach(scenic -> { - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); - IStorageAdapter adapter = StorageFactory.get(scenicConfig.getStoreType()); - adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class)); + IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenic.getId()); log.info("开始清理视频文件"); List fileObjectList = adapter.listDir(StorageConstant.VLOG_PATH); fileObjectList.parallelStream().forEach(fileObject -> {