diff --git a/src/main/java/com/ycwl/basic/config/FaceDetectConfig.java b/src/main/java/com/ycwl/basic/config/FaceDetectConfig.java deleted file mode 100644 index 42ed1c2..0000000 --- a/src/main/java/com/ycwl/basic/config/FaceDetectConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ycwl.basic.config; - -import com.ycwl.basic.storage.entity.AliOssStorageConfig; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.stereotype.Component; - -/** - * 阿里云OSS配置 - * - * @author songmingsong - **/ -@Data -@Component -public class FaceDetectConfig { - @Value("${aliFace.accessKeyId}") - private String accessKeyId; - @Value("${aliFace.accessKeySecret}") - private String accessKeySecret; - @Value("${aliFace.region}") - private String region; -} diff --git a/src/main/java/com/ycwl/basic/config/SchedulerConfig.java b/src/main/java/com/ycwl/basic/config/SchedulerConfig.java deleted file mode 100644 index 3d28290..0000000 --- a/src/main/java/com/ycwl/basic/config/SchedulerConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.ycwl.basic.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; - -@Configuration -@EnableScheduling -public class SchedulerConfig { - - @Bean - public ThreadPoolTaskScheduler taskScheduler() { - ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); - scheduler.setPoolSize(128); - scheduler.setThreadNamePrefix("Scheduler-"); - return scheduler; - } -} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/config/SwaggerConfig.java b/src/main/java/com/ycwl/basic/config/SwaggerConfig.java index cdbc45b..8bd71e6 100644 --- a/src/main/java/com/ycwl/basic/config/SwaggerConfig.java +++ b/src/main/java/com/ycwl/basic/config/SwaggerConfig.java @@ -25,7 +25,7 @@ import java.util.List; */ @Configuration @EnableSwagger2WebMvc -@Profile({"!prod"}) +@Profile({"test"}) public class SwaggerConfig { /** 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 9928b59..b4e610c 100644 --- a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java +++ b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java @@ -8,6 +8,9 @@ import com.ycwl.basic.annotation.IgnoreLogReq; import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.annotation.RequestToFile; import com.ycwl.basic.aspectj.HttpSaver; +import com.ycwl.basic.facebody.FaceBodyFactory; +import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; +import com.ycwl.basic.facebody.entity.AddFaceResp; import com.ycwl.basic.mapper.DeviceMapper; import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.SourceMapper; @@ -69,6 +72,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.ycwl.basic.constant.StorageConstant.PHOTO_PATH; +import static com.ycwl.basic.service.task.impl.TaskFaceServiceImpl.generateEntityId; @IgnoreToken @RestController @@ -85,8 +89,10 @@ public class ViidController { private DeviceRepository deviceRepository; @Autowired private ScenicRepository scenicRepository; + @Autowired + private TaskFaceService taskFaceService; - private final ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 1024, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(1024)); + private final ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 4096, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(4096)); // region 注册注销基础接口 /** @@ -203,8 +209,6 @@ public class ViidController { @Autowired private FaceSampleMapper faceSampleMapper; - @Autowired - private TaskFaceService taskFaceService; private final SimpleDateFormat sdfTime = new SimpleDateFormat("yyyyMMddHHmmss"); @@ -268,6 +272,13 @@ public class ViidController { } 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; + } FacePositionObject facePosition = new FacePositionObject(); facePosition.setLtY(face.getLeftTopY()); facePosition.setLtX(face.getLeftTopX()); @@ -301,7 +312,14 @@ public class ViidController { faceSample.setFaceUrl(url); faceSampleMapper.add(faceSample); executor.execute(() -> { - taskFaceService.addFaceSample(faceSample.getId()); + if (faceBodyAdapter != null) { + taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString()); + AddFaceResp addFaceResp = faceBodyAdapter.addFace(scenicId.toString(), generateEntityId(faceSample), url, newFaceSampleId.toString()); + if (addFaceResp != null) { + faceSample.setScore(addFaceResp.getScore()); + faceSampleMapper.update(faceSample); + } + } if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) { DynamicTaskGenerator.addTask(faceSample.getId()); } @@ -355,7 +373,14 @@ public class ViidController { faceSampleMapper.add(faceSample); DynamicTaskGenerator.addTask(faceSample.getId()); executor.execute(() -> { - taskFaceService.addFaceSample(faceSample.getId()); + if (faceBodyAdapter != null) { + taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString()); + AddFaceResp addFaceResp = faceBodyAdapter.addFace(scenicId.toString(), generateEntityId(faceSample), url, newFaceSampleId.toString()); + if (addFaceResp != null) { + faceSample.setScore(addFaceResp.getScore()); + faceSampleMapper.update(faceSample); + } + } if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) { DynamicTaskGenerator.addTask(faceSample.getId()); } diff --git a/src/main/java/com/ycwl/basic/exception/CustomExceptionHandle.java b/src/main/java/com/ycwl/basic/exception/CustomExceptionHandle.java index e7e16b6..be7cc4f 100644 --- a/src/main/java/com/ycwl/basic/exception/CustomExceptionHandle.java +++ b/src/main/java/com/ycwl/basic/exception/CustomExceptionHandle.java @@ -74,14 +74,6 @@ public class CustomExceptionHandle { @ExceptionHandler(value = Exception.class) public ApiResponse handle(Exception e) { LOGGER.error("系统异常 -> {}", e.getMessage(), e); - ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attributes != null) { - try { - HttpSaver.saveRequestToFile(attributes.getRequest()); - } catch (IOException ex) { - LOGGER.error("保存请求信息失败 -> {}", e.getMessage(), e); - } - } return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR); } diff --git a/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/entity/FaceDetectLog.java b/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/entity/FaceDetectLog.java index 5e9b4dc..24127d0 100644 --- a/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/entity/FaceDetectLog.java +++ b/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/entity/FaceDetectLog.java @@ -33,7 +33,7 @@ public class FaceDetectLog { private String matchLocalRecord; @TableField(exist = false) - private List matchRawRecord; + private List matchRawRecord; public static FaceDetectLog quickCreate(String reason) { FaceDetectLog log = new FaceDetectLog(); @@ -53,19 +53,19 @@ public class FaceDetectLog { return this; } - public FaceDetectLog fillResponse(SearchFaceResponse response) { - this.matchRawResult = JSONObject.toJSONString(response.getData()); + public FaceDetectLog fillResponse(Object response) { + this.matchRawResult = JSONObject.toJSONString(response); return this; } - public List matchLocalRecord() { + public List matchLocalRecord() { if (matchLocalRecord == null) { return null; } return JSONArray.parseArray(matchLocalRecord, MatchLocalRecord.class); } - public void matchLocalRecord(List matchLocalRecord) { + public void matchLocalRecord(List matchLocalRecord) { if (matchLocalRecord == null) { this.matchLocalRecord = null; } else { diff --git a/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java b/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java index 0886ca2..a786692 100644 --- a/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java +++ b/src/main/java/com/ycwl/basic/model/pc/faceDetectLog/resp/MatchLocalRecord.java @@ -10,7 +10,6 @@ public class MatchLocalRecord { private String deviceName; private String faceUrl; private Float score; - private Float confidence; private String idStr; private Date shotDate; private Boolean matched; diff --git a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java index c18a772..1ec3673 100644 --- a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java @@ -3,6 +3,7 @@ package com.ycwl.basic.model.pc.scenic.entity; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.ycwl.basic.facebody.enums.FaceBodyAdapterType; import com.ycwl.basic.storage.enums.StorageType; import lombok.Data; @@ -75,4 +76,7 @@ public class ScenicConfigEntity { private String watermarkType; private String watermarkScenicText; private String watermarkDtFormat; + + private FaceBodyAdapterType faceType; + private String faceConfigJson; } diff --git a/src/main/java/com/ycwl/basic/printer/ticket/FeiETicketPrinter.java b/src/main/java/com/ycwl/basic/printer/ticket/FeiETicketPrinter.java index ac2ce3a..9e0dc58 100644 --- a/src/main/java/com/ycwl/basic/printer/ticket/FeiETicketPrinter.java +++ b/src/main/java/com/ycwl/basic/printer/ticket/FeiETicketPrinter.java @@ -1,6 +1,5 @@ package com.ycwl.basic.printer.ticket; -import cn.hutool.Hutool; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; diff --git a/src/main/java/com/ycwl/basic/printer/ticket/TicketPrinterFactory.java b/src/main/java/com/ycwl/basic/printer/ticket/TicketPrinterFactory.java new file mode 100644 index 0000000..1a7f00d --- /dev/null +++ b/src/main/java/com/ycwl/basic/printer/ticket/TicketPrinterFactory.java @@ -0,0 +1,4 @@ +package com.ycwl.basic.printer.ticket; + +public class TicketPrinterFactory { +} 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 0d19893..d2b382e 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 @@ -1,9 +1,13 @@ package com.ycwl.basic.service.pc.impl; +import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.ycwl.basic.biz.OrderBiz; import com.ycwl.basic.enums.StatisticEnum; +import com.ycwl.basic.facebody.FaceBodyFactory; +import com.ycwl.basic.facebody.adapter.AliFaceBodyAdapter; +import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.mapper.StatisticsMapper; @@ -37,6 +41,7 @@ import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; @@ -62,8 +67,6 @@ public class FaceServiceImpl implements FaceService { @Autowired private SourceMapper sourceMapper; @Autowired - private FaceSampleMapper faceSampleMapper; - @Autowired private OrderBiz orderBiz; @Autowired private FaceRepository faceRepository; @@ -120,8 +123,6 @@ public class FaceServiceImpl implements FaceService { @Override public FaceRecognizeResp faceUpload(MultipartFile file, Long scenicId, Long userId) { - - //1、上传人脸照片 IStorageAdapter adapter = StorageFactory.use("faces"); String filePath = StorageUtil.joinPath("user-faces", DateUtils.format(new Date(),"yyyy-MM-dd")); @@ -131,17 +132,26 @@ public class FaceServiceImpl implements FaceService { String faceUrl = adapter.uploadFile(file, filePath, fileName); Long newFaceId = SnowFlakeUtil.getLongId(); Long oldFaceId = null; - SearchFaceRespVo userDbSearchResult = faceService.searchFace(USER_FACE_DB_NAME+scenicId, faceUrl, "判断是否为用户上传过的人脸"); + 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(); + } + faceService.assureFaceDb(faceBodyAdapter, USER_FACE_DB_NAME+scenicId); + SearchFaceRespVo userDbSearchResult = faceService.searchFace(faceBodyAdapter, USER_FACE_DB_NAME+scenicId, faceUrl, "判断是否为用户上传过的人脸"); float strictScore = 0.6F; if (userDbSearchResult == null) { // 都是null了,那得是新的 - faceService.addFaceSample(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString()); + faceBodyAdapter.addFace(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString()); } else if (userDbSearchResult.getSampleListIds() == null || userDbSearchResult.getSampleListIds().isEmpty()) { // 没有匹配到过,也得是新的 - faceService.addFaceSample(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString()); + faceBodyAdapter.addFace(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString()); } else if (userDbSearchResult.getFirstMatchRate() < strictScore) { // 有匹配结果,但是不匹配旧的 - faceService.addFaceSample(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString()); + faceBodyAdapter.addFace(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString()); } else { // 有匹配结果,且能匹配旧的数据 Optional faceAny = userDbSearchResult.getSampleListIds().stream().filter(_faceId -> { @@ -155,8 +165,8 @@ public class FaceServiceImpl implements FaceService { oldFaceId = faceAny.get(); FaceRespVO oldFace = faceMapper.getById(oldFaceId); if (oldFace == null) { - faceService.deleteFaceSample(USER_FACE_DB_NAME+scenicId, oldFaceId.toString()); - faceService.addFaceSample(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString()); + faceBodyAdapter.deleteFace(USER_FACE_DB_NAME+scenicId, oldFaceId.toString()); + faceBodyAdapter.addFace(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString()); oldFaceId = null; } else { newFaceId = oldFaceId; @@ -210,30 +220,27 @@ public class FaceServiceImpl implements FaceService { if (face == null) { return null; } - SearchFaceRespVo scenicDbSearchResult = faceService.searchFace(face.getScenicId(), face.getFaceUrl()); ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId()); + 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(); + } + SearchFaceRespVo scenicDbSearchResult = faceService.searchFace(faceBodyAdapter, String.valueOf(face.getScenicId()), face.getFaceUrl(), "人脸识别"); if (scenicDbSearchResult.getSampleListIds() != null && scenicDbSearchResult.getFirstMatchRate() != null && !scenicDbSearchResult.getSampleListIds().isEmpty()) { if (scenicConfig != null && scenicConfig.getFaceDetectHelperThreshold() != null && scenicConfig.getFaceDetectHelperThreshold() > 0) { if (scenicDbSearchResult.getSampleListIds().size() < scenicConfig.getFaceDetectHelperThreshold()) { // 补救逻辑 - Long faceSampleId = scenicDbSearchResult.getSampleListIds().get(0); - FaceSampleEntity faceSample = faceRepository.getFaceSample(faceSampleId); + Long resultItem = scenicDbSearchResult.getSampleListIds().get(0); + FaceSampleEntity faceSample = faceRepository.getFaceSample(resultItem); if (faceSample != null) { // 以这个结果为人脸库的匹配结果 - scenicDbSearchResult = faceService.searchFace(face.getScenicId().toString(), faceSample.getFaceUrl(), "补救措施1:人脸数太少少于设定值"+scenicConfig.getFaceDetectHelperThreshold()); + scenicDbSearchResult = faceService.searchFace(faceBodyAdapter, String.valueOf(face.getScenicId()), faceSample.getFaceUrl(), "人脸补救措施1"); } } } -// if (scenicDbSearchResult.getFirstMatchRate() > 0.7) { -// // 如果匹配度高于阈值,则使用景区第一张人脸去匹配景区库 -// // 找第一张人脸 -// Long faceSampleId = scenicDbSearchResult.getSampleListIds().get(0); -// FaceSampleEntity faceSample = faceRepository.getFaceSample(faceSampleId); -// if (faceSample != null) { -// // 以这个结果为人脸库的匹配结果 -// scenicDbSearchResult = faceService.searchFace(face.getScenicId().toString(), faceSample.getFaceUrl(), "补救措施2:存在得分够高"); -// } -// } } FaceEntity faceEntity = new FaceEntity(); faceEntity.setId(faceId); 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 fe3c33f..da9c6e2 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 @@ -1,7 +1,10 @@ package com.ycwl.basic.service.pc.impl; +import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.ycwl.basic.facebody.FaceBodyFactory; +import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.mapper.ScenicAccountMapper; import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity; @@ -21,6 +24,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Map; import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; @@ -77,8 +81,6 @@ public class ScenicServiceImpl implements ScenicService { account.setIsSuper(1); scenicAccountMapper.add(account); if (add > 0) { - taskFaceService.createFaceDB(scenicId.toString()); - taskFaceService.assureFaceDB(scenicId.toString()); return ApiResponse.success(true); } else { return ApiResponse.fail("景区添加失败"); @@ -90,12 +92,17 @@ public class ScenicServiceImpl implements ScenicService { public ApiResponse deleteById(Long id) { int i = scenicMapper.deleteById(id); if (i > 0) { - scenicMapper.deleteConfigByScenicId(id); scenicAccountMapper.deleteByScenicId(id); - (new Thread(() -> { - taskFaceService.deleteFaceDB(id.toString()); - taskFaceService.deleteFaceDB(USER_FACE_DB_NAME + id.toString()); - })).start(); + 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(); + } + scenicMapper.deleteConfigByScenicId(id); scenicRepository.clearCache(id); return ApiResponse.success(true); }else { @@ -131,7 +138,6 @@ public class ScenicServiceImpl implements ScenicService { int i = scenicMapper.update(scenicUpdateReq); if (i > 0) { scenicRepository.clearCache(scenicUpdateReq.getId()); - taskFaceService.assureFaceDB(scenicUpdateReq.getId().toString()); return ApiResponse.success(true); }else { return ApiResponse.fail("景区修改失败"); @@ -144,7 +150,6 @@ public class ScenicServiceImpl implements ScenicService { int i = scenicMapper.updateStatus(id); if (i > 0) { scenicRepository.clearCache(id); - taskFaceService.assureFaceDB(id.toString()); return ApiResponse.success(true); }else { return ApiResponse.fail("景区状态修改失败"); @@ -159,7 +164,6 @@ public class ScenicServiceImpl implements ScenicService { int i = scenicMapper.addConfig(scenicConfig); if (i > 0) { scenicRepository.clearCache(scenicConfig.getScenicId()); - taskFaceService.assureFaceDB(scenicConfig.getScenicId().toString()); return ApiResponse.success(true); }else { return ApiResponse.fail("景区配置添加失败"); @@ -171,7 +175,6 @@ public class ScenicServiceImpl implements ScenicService { int i = scenicMapper.updateConfigById(scenicConfig); if (i > 0) { scenicRepository.clearCache(scenicConfig.getScenicId()); - taskFaceService.assureFaceDB(scenicConfig.getScenicId().toString()); return ApiResponse.success(true); }else { return ApiResponse.fail("景区配置修改失败"); 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 b34a975..475b8d0 100644 --- a/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java +++ b/src/main/java/com/ycwl/basic/service/task/TaskFaceService.java @@ -1,33 +1,20 @@ package com.ycwl.basic.service.task; -import com.ycwl.basic.model.task.resp.AddFaceSampleRespVo; +import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.multipart.MultipartFile; public interface TaskFaceService { SearchFaceRespVo searchFace(Long faceId); - SearchFaceRespVo searchFace(Long scenicId, String faceUrl); - - SearchFaceRespVo searchFace(String dbName, String faceUrl); - - SearchFaceRespVo searchFace(String dbName, String faceUrl, String reason); - - AddFaceSampleRespVo addFaceSample(Long faceSampleId); - - AddFaceSampleRespVo addFaceSample(String dbName, String entityId, String faceUrl, String extData); + SearchFaceRespVo searchFace(IFaceBodyAdapter adapter, String dbName, String faceUrl, String reason); void batchDeleteExpiredFace(Long scenicId); - void deleteFaceDB(String scenicId); - - void createFaceDB(String scenicId); - - void assureFaceDB(String scenicId); - String uploadFile(MultipartFile file, Long userId); boolean deleteFaceSample(String dbName, String entityId); + + boolean assureFaceDb(IFaceBodyAdapter faceBodyAdapter, String dbName); } 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 41f4dcc..2b2e74a 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 @@ -3,23 +3,19 @@ package com.ycwl.basic.service.task.impl; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.facebody.model.v20191230.AddFaceEntityRequest; -import com.aliyuncs.facebody.model.v20191230.AddFaceRequest; -import com.aliyuncs.facebody.model.v20191230.AddFaceResponse; -import com.aliyuncs.facebody.model.v20191230.CreateFaceDbRequest; -import com.aliyuncs.facebody.model.v20191230.DeleteFaceDbRequest; import com.aliyuncs.facebody.model.v20191230.DeleteFaceEntityRequest; -import com.aliyuncs.facebody.model.v20191230.ListFaceDbsRequest; -import com.aliyuncs.facebody.model.v20191230.ListFaceDbsResponse; import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesRequest; import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse; import com.aliyuncs.facebody.model.v20191230.SearchFaceRequest; import com.aliyuncs.facebody.model.v20191230.SearchFaceResponse; import com.ycwl.basic.biz.OrderBiz; -import com.ycwl.basic.config.FaceDetectConfig; import com.ycwl.basic.constant.FaceConstant; import com.ycwl.basic.exception.BaseException; +import com.ycwl.basic.facebody.FaceBodyFactory; +import com.ycwl.basic.facebody.adapter.AliFaceBodyAdapter; +import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; +import com.ycwl.basic.facebody.entity.SearchFaceResp; +import com.ycwl.basic.facebody.entity.SearchFaceResultItem; import com.ycwl.basic.mapper.FaceDetectLogMapper; import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceSampleMapper; @@ -37,7 +33,6 @@ import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity; -import com.ycwl.basic.model.task.resp.AddFaceSampleRespVo; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.ratelimiter.FixedRateLimiter; import com.ycwl.basic.repository.DeviceRepository; @@ -63,17 +58,17 @@ import java.io.IOException; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import java.util.stream.Stream; import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; @@ -87,8 +82,6 @@ public class TaskFaceServiceImpl implements TaskFaceService { @Autowired private ScenicMapper scenicMapper; @Autowired - private FaceDetectConfig faceDetectConfig; - @Autowired private RedisTemplate redisTemplate; @Autowired private FaceDetectLogMapper logMapper; @@ -98,11 +91,6 @@ public class TaskFaceServiceImpl implements TaskFaceService { private SourceMapper sourceMapper; @Autowired private OrderBiz orderBiz; - // 阿里云人脸检索限制qps=2 - private final FixedRateLimiter addEntityLimiter = new FixedRateLimiter(600, TimeUnit.MILLISECONDS); - // 阿里云人脸检索限制qps=5 - private final FixedRateLimiter searchFaceLimiter = new FixedRateLimiter(200, TimeUnit.MILLISECONDS); - private final FixedRateLimiter deleteDbLimiter = new FixedRateLimiter(600, TimeUnit.MILLISECONDS); private final FixedRateLimiter deleteEntityLimiter = new FixedRateLimiter(600, TimeUnit.MILLISECONDS); private final ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 1024, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1024)); @@ -112,10 +100,8 @@ public class TaskFaceServiceImpl implements TaskFaceService { private DeviceRepository deviceRepository; private IAcsClient getClient() { - DefaultProfile profile = DefaultProfile.getProfile( - faceDetectConfig.getRegion(),faceDetectConfig.getAccessKeyId(), faceDetectConfig.getAccessKeySecret()); - IAcsClient client = new DefaultAcsClient(profile); - return client; + AliFaceBodyAdapter use = (AliFaceBodyAdapter) FaceBodyFactory.use(); + return use.getClient().getClient(); } @Override @@ -127,7 +113,15 @@ public class TaskFaceServiceImpl implements TaskFaceService { return vo; } Long scenicId = faceRespVO.getScenicId(); - SearchFaceRespVo respVo = searchFace(scenicId.toString(), faceRespVO.getFaceUrl(), "系统定时任务检索"); + 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(); + } + SearchFaceRespVo respVo = searchFace(faceBodyAdapter, scenicId.toString(), faceRespVO.getFaceUrl(), "系统定时任务检索"); if (respVo != null) { FaceEntity faceEntity = new FaceEntity(); faceEntity.setId(faceId); @@ -184,29 +178,14 @@ public class TaskFaceServiceImpl implements TaskFaceService { } @Override - public SearchFaceRespVo searchFace(Long scenicId, String faceUrl) { - return searchFace(scenicId.toString(), faceUrl, "预留字段"); - } - - @Override - public SearchFaceRespVo searchFace(String dbName, String faceUrl) { - return searchFace(dbName, faceUrl, "预留字段"); - } - - @Override - public SearchFaceRespVo searchFace(String dbName, String faceUrl, String reason) { - assureFaceDB(dbName); - IAcsClient client = getClient(); + public SearchFaceRespVo searchFace(IFaceBodyAdapter adapter, String dbName, String faceUrl, String reason) { + assureFaceDb(adapter, dbName); SearchFaceRequest request = new SearchFaceRequest(); request.setDbName(dbName); request.setImageUrl(faceUrl); request.setLimit(200); // request.setQualityScoreThreshold(60f); FaceDetectLog logEntity = FaceDetectLog.quickCreate(reason, request); - try { - searchFaceLimiter.acquire(); - } catch (InterruptedException ignored) { - } float threshold = 0.525F; int tourMinutes = -1; if (StringUtils.isNumeric(dbName)) { @@ -223,26 +202,30 @@ public class TaskFaceServiceImpl implements TaskFaceService { final float _threshold = threshold; List acceptFaceSampleIds; try { - SearchFaceResponse response = client.getAcsResponse(request); + SearchFaceResp response = adapter.searchFace(dbName, faceUrl); logEntity.fillResponse(response); - List matchList = response.getData().getMatchList(); - if (matchList.isEmpty()) { + List records = response.getResult(); + if (records.isEmpty()) { return null; } SearchFaceRespVo respVo = new SearchFaceRespVo(); - respVo.setScore(matchList.get(0).getQualitieScore()); - respVo.setSearchResultJson(JSON.toJSONString(matchList.get(0))); - if (matchList.get(0).getFaceItems().isEmpty()) { + respVo.setScore(response.getOriginalFaceScore()); + respVo.setSearchResultJson(JSON.toJSONString(records)); + if (records.isEmpty()) { return respVo; } - List records = matchList.get(0).getFaceItems(); logEntity.setMatchRawRecord(records); acceptFaceSampleIds = records.stream() .filter(record -> record.getScore() > _threshold) - .map(SearchFaceResponse.Data.MatchListItem.FaceItemsItem::getExtraData) + .map(SearchFaceResultItem::getExtData) .filter(StringUtils::isNumeric) .map(Long::valueOf) .collect(Collectors.toList()); + if (acceptFaceSampleIds.isEmpty()) { + respVo.setFirstMatchRate(0f); + respVo.setSampleListIds(Collections.emptyList()); + return respVo; + } List faceSampleList = new ArrayList<>(); if (StringUtils.isNumeric(dbName)) { // 景区 faceSampleList = faceSampleMapper.listByIds(acceptFaceSampleIds); @@ -258,19 +241,25 @@ public class TaskFaceServiceImpl implements TaskFaceService { .collect(Collectors.toList()); log.info("时间范围逻辑:最高匹配:{},时间范围需要在:{}~{}间", firstFaceSample, startDate, endDate); } else { + acceptFaceSampleIds = faceSampleList.stream() + .map(FaceSampleEntity::getId) + .collect(Collectors.toList()); log.info("时间范围逻辑:景区未限制"); } } else { + acceptFaceSampleIds = faceSampleList.stream() + .map(FaceSampleEntity::getId) + .collect(Collectors.toList()); log.info("时间范围逻辑:最高匹配ID:{},未找到", firstFaceSampleId); } } List collect = new ArrayList<>(); - for (SearchFaceResponse.Data.MatchListItem.FaceItemsItem item : records) { + for (SearchFaceResultItem item : records) { MatchLocalRecord record = new MatchLocalRecord(); - record.setIdStr(item.getExtraData()); - record.setFaceSampleId(Long.parseLong(item.getExtraData())); + record.setIdStr(item.getExtData()); + record.setFaceSampleId(Long.parseLong(item.getExtData())); if (StringUtils.isNumeric(item.getDbName())) { - Optional optionalFse = faceSampleList.stream().filter(face -> face.getId().equals(Long.parseLong(item.getExtraData()))).findAny(); + Optional optionalFse = faceSampleList.stream().filter(face -> face.getId().equals(Long.parseLong(item.getExtData()))).findAny(); if (optionalFse.isPresent()) { DeviceEntity device = deviceRepository.getDevice(optionalFse.get().getDeviceId()); if (device != null) { @@ -285,11 +274,10 @@ public class TaskFaceServiceImpl implements TaskFaceService { } record.setScore(item.getScore()); record.setMatched(item.getScore() > _threshold); - record.setConfidence(item.getConfidence()); collect.add(record); } logEntity.setMatchLocalRecord(JSONObject.toJSONString(collect)); - respVo.setFirstMatchRate(matchList.get(0).getFaceItems().get(0).getScore()); + respVo.setFirstMatchRate(response.getFirstMatchRate()); respVo.setSampleListIds(acceptFaceSampleIds); return respVo; } catch (Exception e) { @@ -300,54 +288,6 @@ public class TaskFaceServiceImpl implements TaskFaceService { } } - @Override - public AddFaceSampleRespVo addFaceSample(Long faceSampleId) { - FaceSampleRespVO faceSampleRespVO = faceSampleMapper.getById(faceSampleId); - String entityId = generateEntityId(faceSampleRespVO); - AddFaceSampleRespVo respVo = addFaceSample(faceSampleRespVO.getScenicId().toString(), entityId, faceSampleRespVO.getFaceUrl(), faceSampleId.toString()); - FaceSampleEntity faceSampleEntity = new FaceSampleEntity(); - faceSampleEntity.setId(faceSampleId); - if (respVo != null) { - faceSampleEntity.setScore(respVo.getScore()); - } - faceSampleEntity.setUpdateAt(new Date()); - faceSampleMapper.update(faceSampleEntity); - return respVo; - } - - @Override - public AddFaceSampleRespVo addFaceSample(String dbName, String entityId, String faceUrl, String extData) { - assureFaceDB(dbName); - AddFaceEntityRequest request = new AddFaceEntityRequest(); - request.setDbName(dbName); - request.setEntityId(entityId); - IAcsClient client = getClient(); - try { - addEntityLimiter.acquire(); - } catch (InterruptedException ignored) { - } - try { - client.getAcsResponse(request); - } catch (ClientException e) { - log.error("addFaceEntity, {}/{}", dbName, entityId, e); - return null; - } - AddFaceRequest addFaceRequest = new AddFaceRequest(); - addFaceRequest.setDbName(dbName); - addFaceRequest.setEntityId(entityId); - addFaceRequest.setImageUrl(faceUrl); - addFaceRequest.setExtraData(extData); - AddFaceSampleRespVo respVo = new AddFaceSampleRespVo(); - try { - AddFaceResponse acsResponse = client.getAcsResponse(addFaceRequest); - respVo.setScore(acsResponse.getData().getQualitieScore()); - return respVo; - } catch (ClientException e) { - log.error("addFace, {}/{}", dbName, entityId, e); - return null; - } - } - @Override public void batchDeleteExpiredFace(Long scenicId) { log.info("当前景区{},开始删除人脸样本", scenicId); @@ -384,6 +324,37 @@ public class TaskFaceServiceImpl implements TaskFaceService { } } catch (Exception ignored) { } + listFaceEntitiesRequest.setDbName(String.valueOf(scenicId)); + listFaceEntitiesRequest.setEntityIdPrefix(""); + try { + AtomicInteger count = new AtomicInteger(0); + IAcsClient client = getClient(); + while (true) { + listFaceEntitiesRequest.setOffset(count.get()); + ListFaceEntitiesResponse listFaceEntitiesResponse = client.getAcsResponse(listFaceEntitiesRequest); + if (listFaceEntitiesResponse == null || listFaceEntitiesResponse.getData() == null || listFaceEntitiesResponse.getData().getEntities() == null || listFaceEntitiesResponse.getData().getEntities().isEmpty()) { + break; + } + 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(entity.getDbName(), entity.getEntityId()); + } else { + count.incrementAndGet(); + log.info("当前景区{},人脸样本:{}未过期", scenicId, entity.getEntityId()); + } + }); + } + } catch (Exception ignored) { + } List devices = deviceRepository.getAllDeviceByScenicId(scenicId); listFaceEntitiesRequest.setDbName(String.valueOf(scenicId)); listFaceEntitiesRequest.setOrder("asc"); @@ -439,98 +410,6 @@ public class TaskFaceServiceImpl implements TaskFaceService { }); } - @Override - public void deleteFaceDB(String dbName) { - ListFaceEntitiesRequest request = new ListFaceEntitiesRequest(); - request.setDbName(dbName); - request.setLimit(200); - IAcsClient client = getClient(); - try { - while (true) { - ListFaceEntitiesResponse response = client.getAcsResponse(request); - if (response.getData().getTotalCount() == 0) { - break; - } - response.getData().getEntities().forEach(entity -> { - DeleteFaceEntityRequest deleteFaceEntityRequest = new DeleteFaceEntityRequest(); - deleteFaceEntityRequest.setDbName(entity.getDbName()); - deleteFaceEntityRequest.setEntityId(entity.getEntityId()); - try { - deleteEntityLimiter.acquire(); - } catch (InterruptedException ignored) { - } - try { - client.getAcsResponse(deleteFaceEntityRequest); - } catch (ClientException e) { - log.error("删除人脸数据失败!", e); - } - }); - } - DeleteFaceDbRequest deleteFaceDbRequest = new DeleteFaceDbRequest(); - deleteFaceDbRequest.setName(dbName); - try { - deleteDbLimiter.acquire(); - } catch (InterruptedException ignored) { - } - client.getAcsResponse(deleteFaceDbRequest); - removeFaceDBCache(dbName); - } catch (ClientException e) { - log.error("删除人脸数据库失败!", e); - } - } - - @Override - public void createFaceDB(String dbName) { - try { - CreateFaceDbRequest request = new CreateFaceDbRequest(); - request.setName(dbName); - IAcsClient client = getClient(); - client.getAcsResponse(request); - addFaceDBCache(dbName); - } catch (ClientException e) { - log.error("阿里云添加人脸数据库失败!", e); - } - } - - @Override - public void assureFaceDB(String dbName) { - if (redisTemplate.hasKey(FaceConstant.FACE_DB_NAME_PFX + dbName)) { - return; - } - try { - long offset = 0; - List dbList = new ArrayList<>(); - IAcsClient client = getClient(); - while (true) { - ListFaceDbsRequest request = new ListFaceDbsRequest(); - request.setLimit(200L); - request.setOffset(offset); - ListFaceDbsResponse response = client.getAcsResponse(request); - List list = response.getData().getDbList(); - if (list == null || list.isEmpty()) { - break; - } else { - dbList.addAll(list); - offset += list.size(); - } - } - boolean mismatch; - if (dbList.isEmpty()) { - clearFaceDBCache(); - mismatch = true; - } else { - mismatch = dbList.stream().peek(item -> { - redisTemplate.opsForValue().set(FaceConstant.FACE_DB_NAME_PFX + dbName, "1"); - }).noneMatch(db -> db.getName().equals(dbName)); - } - if (mismatch) { - createFaceDB(dbName); - } - } catch (ClientException e) { - log.error("阿里云确保人脸数据库失败!", e); - } - } - @Override public String uploadFile(MultipartFile file, Long userId) { if (file.isEmpty()) { @@ -572,8 +451,28 @@ public class TaskFaceServiceImpl implements TaskFaceService { } } + @Override + public boolean assureFaceDb(IFaceBodyAdapter faceBodyAdapter, String dbName) { + if (redisTemplate.hasKey(FaceConstant.FACE_DB_NAME_PFX + dbName)) { + return true; + } + try { + if (!faceBodyAdapter.assureFaceDb(dbName)) { + log.info("创建人脸库失败!"); + removeFaceDBCache(dbName); + return false; + } + addFaceDBCache(dbName); + return true; + } catch (Exception e) { + log.error("创建人脸库失败!", e); + removeFaceDBCache(dbName); + return false; + } + } + public void addFaceDBCache(String dbName) { - redisTemplate.opsForValue().set(FaceConstant.FACE_DB_NAME_PFX + dbName, "1"); + redisTemplate.opsForValue().set(FaceConstant.FACE_DB_NAME_PFX + dbName, "1", 2, TimeUnit.HOURS); } public Boolean removeFaceDBCache(String dbName) { diff --git a/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java b/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java index 72d2ba3..29458a0 100644 --- a/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java +++ b/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java @@ -1,19 +1,17 @@ package com.ycwl.basic.task; +import com.alibaba.fastjson.JSONObject; import com.ycwl.basic.biz.TemplateBiz; +import com.ycwl.basic.facebody.FaceBodyFactory; +import com.ycwl.basic.facebody.adapter.AliFaceBodyAdapter; +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; import com.ycwl.basic.mapper.TemplateMapper; import com.ycwl.basic.model.pc.face.entity.FaceEntity; -import com.ycwl.basic.model.pc.face.resp.FaceRespVO; import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; -import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; -import com.ycwl.basic.model.pc.template.entity.TemplateConfigEntity; -import com.ycwl.basic.model.pc.template.req.TemplateReqQuery; -import com.ycwl.basic.model.pc.template.resp.TemplateRespVO; import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.repository.FaceRepository; import com.ycwl.basic.repository.ScenicRepository; @@ -28,10 +26,9 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; @@ -116,7 +113,14 @@ public class DynamicTaskGenerator { return; } log.info("开始执行任务:{}", task); - SearchFaceRespVo userDbSearchResult = faceService.searchFace(USER_FACE_DB_NAME+faceSample.getScenicId(), faceSample.getFaceUrl(), "预约流程检索"); + 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(); + } + SearchFaceRespVo userDbSearchResult = faceService.searchFace(faceBodyAdapter, USER_FACE_DB_NAME+faceSample.getScenicId(), faceSample.getFaceUrl(), "预约流程检索"); // 如果人脸样本ID在人脸样本库中,则创建任务 if (!userDbSearchResult.getSampleListIds().isEmpty()) { log.info("人脸样本ID在人脸样本库中,创建任务:{}", task); diff --git a/src/main/resources/mapper/FaceSampleMapper.xml b/src/main/resources/mapper/FaceSampleMapper.xml index 4884d10..730b735 100644 --- a/src/main/resources/mapper/FaceSampleMapper.xml +++ b/src/main/resources/mapper/FaceSampleMapper.xml @@ -2,8 +2,8 @@ - insert into face_sample(id, scenic_id, device_id, source_id, face_url, match_sample_ids, first_match_rate, match_result,`status`, create_at) - values (#{id}, #{scenicId}, #{deviceId}, #{sourceId}, #{faceUrl}, #{matchSampleIds}, #{firstMatchRate}, #{matchResult},#{status},#{createAt}) + insert into face_sample(id, scenic_id, device_id, face_url, match_sample_ids, first_match_rate, match_result,`status`, create_at) + values (#{id}, #{scenicId}, #{deviceId}, #{faceUrl}, #{matchSampleIds}, #{firstMatchRate}, #{matchResult},#{status},#{createAt}) update face_sample @@ -14,9 +14,6 @@ device_id = #{deviceId}, - - source_id = #{sourceId}, - face_url = #{faceUrl}, @@ -52,7 +49,7 @@ diff --git a/src/main/resources/mapper/ScenicMapper.xml b/src/main/resources/mapper/ScenicMapper.xml index 0bd3b87..75463b8 100644 --- a/src/main/resources/mapper/ScenicMapper.xml +++ b/src/main/resources/mapper/ScenicMapper.xml @@ -111,7 +111,9 @@ broker_direct_rate=#{brokerDirectRate}, watermark_type=#{watermarkType}, watermark_scenic_text=#{watermarkScenicText}, - watermark_dt_format=#{watermarkDtFormat} + watermark_dt_format=#{watermarkDtFormat}, + face_type=#{faceType}, + face_config_json=#{faceConfigJson} where id = #{id} diff --git a/src/main/resources/mapper/StatisticsMapper.xml b/src/main/resources/mapper/StatisticsMapper.xml index 61035c3..50d008a 100644 --- a/src/main/resources/mapper/StatisticsMapper.xml +++ b/src/main/resources/mapper/StatisticsMapper.xml @@ -31,6 +31,13 @@ and create_time <= #{endTime} + and member_id in (select member_id from statistics where type = 1 + + and create_time >= #{startTime} + + + and create_time <= #{endTime} + ) group by member_id )a diff --git a/src/test/java/com/ycwl/basic/task/FaceCleanerTest.java b/src/test/java/com/ycwl/basic/task/FaceCleanerTest.java index 8ef5817..f05ba46 100644 --- a/src/test/java/com/ycwl/basic/task/FaceCleanerTest.java +++ b/src/test/java/com/ycwl/basic/task/FaceCleanerTest.java @@ -9,7 +9,6 @@ import com.aliyuncs.facebody.model.v20191230.GetFaceEntityResponse; import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesRequest; import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse; import com.aliyuncs.profile.DefaultProfile; -import com.ycwl.basic.config.FaceDetectConfig; import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.ScenicMapper; @@ -57,8 +56,6 @@ public class FaceCleanerTest { @Autowired private FaceSampleMapper faceSampleMapper; @Autowired - private FaceDetectConfig faceDetectConfig; - @Autowired private ScenicMapper scenicMapper; private IAcsClient getClient() {