修改
This commit is contained in:
parent
67dca0d4d4
commit
0ab142e1c4
@ -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;
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -25,7 +25,7 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableSwagger2WebMvc
|
@EnableSwagger2WebMvc
|
||||||
@Profile({"!prod"})
|
@Profile({"test"})
|
||||||
public class SwaggerConfig {
|
public class SwaggerConfig {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,6 +8,9 @@ import com.ycwl.basic.annotation.IgnoreLogReq;
|
|||||||
import com.ycwl.basic.annotation.IgnoreToken;
|
import com.ycwl.basic.annotation.IgnoreToken;
|
||||||
import com.ycwl.basic.annotation.RequestToFile;
|
import com.ycwl.basic.annotation.RequestToFile;
|
||||||
import com.ycwl.basic.aspectj.HttpSaver;
|
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.DeviceMapper;
|
||||||
import com.ycwl.basic.mapper.FaceSampleMapper;
|
import com.ycwl.basic.mapper.FaceSampleMapper;
|
||||||
import com.ycwl.basic.mapper.SourceMapper;
|
import com.ycwl.basic.mapper.SourceMapper;
|
||||||
@ -69,6 +72,7 @@ import java.util.concurrent.TimeUnit;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.ycwl.basic.constant.StorageConstant.PHOTO_PATH;
|
import static com.ycwl.basic.constant.StorageConstant.PHOTO_PATH;
|
||||||
|
import static com.ycwl.basic.service.task.impl.TaskFaceServiceImpl.generateEntityId;
|
||||||
|
|
||||||
@IgnoreToken
|
@IgnoreToken
|
||||||
@RestController
|
@RestController
|
||||||
@ -85,8 +89,10 @@ public class ViidController {
|
|||||||
private DeviceRepository deviceRepository;
|
private DeviceRepository deviceRepository;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ScenicRepository scenicRepository;
|
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 注册注销基础接口
|
// region 注册注销基础接口
|
||||||
/**
|
/**
|
||||||
@ -203,8 +209,6 @@ public class ViidController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private FaceSampleMapper faceSampleMapper;
|
private FaceSampleMapper faceSampleMapper;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private TaskFaceService taskFaceService;
|
|
||||||
private final SimpleDateFormat sdfTime = new SimpleDateFormat("yyyyMMddHHmmss");
|
private final SimpleDateFormat sdfTime = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||||
|
|
||||||
|
|
||||||
@ -268,6 +272,13 @@ public class ViidController {
|
|||||||
} else {
|
} else {
|
||||||
scenicStorageAdapter = StorageFactory.use("video");
|
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();
|
FacePositionObject facePosition = new FacePositionObject();
|
||||||
facePosition.setLtY(face.getLeftTopY());
|
facePosition.setLtY(face.getLeftTopY());
|
||||||
facePosition.setLtX(face.getLeftTopX());
|
facePosition.setLtX(face.getLeftTopX());
|
||||||
@ -301,7 +312,14 @@ public class ViidController {
|
|||||||
faceSample.setFaceUrl(url);
|
faceSample.setFaceUrl(url);
|
||||||
faceSampleMapper.add(faceSample);
|
faceSampleMapper.add(faceSample);
|
||||||
executor.execute(() -> {
|
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())) {
|
if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) {
|
||||||
DynamicTaskGenerator.addTask(faceSample.getId());
|
DynamicTaskGenerator.addTask(faceSample.getId());
|
||||||
}
|
}
|
||||||
@ -355,7 +373,14 @@ public class ViidController {
|
|||||||
faceSampleMapper.add(faceSample);
|
faceSampleMapper.add(faceSample);
|
||||||
DynamicTaskGenerator.addTask(faceSample.getId());
|
DynamicTaskGenerator.addTask(faceSample.getId());
|
||||||
executor.execute(() -> {
|
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())) {
|
if (deviceConfig != null && Integer.valueOf(1).equals(deviceConfig.getEnablePreBook())) {
|
||||||
DynamicTaskGenerator.addTask(faceSample.getId());
|
DynamicTaskGenerator.addTask(faceSample.getId());
|
||||||
}
|
}
|
||||||
|
@ -74,14 +74,6 @@ public class CustomExceptionHandle {
|
|||||||
@ExceptionHandler(value = Exception.class)
|
@ExceptionHandler(value = Exception.class)
|
||||||
public ApiResponse<String> handle(Exception e) {
|
public ApiResponse<String> handle(Exception e) {
|
||||||
LOGGER.error("系统异常 -> {}", e.getMessage(), 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);
|
return ApiResponse.buildResult(BizCodeEnum.SERVER_UNKONWN_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ public class FaceDetectLog {
|
|||||||
private String matchLocalRecord;
|
private String matchLocalRecord;
|
||||||
|
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private List<SearchFaceResponse.Data.MatchListItem.FaceItemsItem> matchRawRecord;
|
private List matchRawRecord;
|
||||||
|
|
||||||
public static FaceDetectLog quickCreate(String reason) {
|
public static FaceDetectLog quickCreate(String reason) {
|
||||||
FaceDetectLog log = new FaceDetectLog();
|
FaceDetectLog log = new FaceDetectLog();
|
||||||
@ -53,19 +53,19 @@ public class FaceDetectLog {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FaceDetectLog fillResponse(SearchFaceResponse response) {
|
public FaceDetectLog fillResponse(Object response) {
|
||||||
this.matchRawResult = JSONObject.toJSONString(response.getData());
|
this.matchRawResult = JSONObject.toJSONString(response);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<MatchLocalRecord> matchLocalRecord() {
|
public List matchLocalRecord() {
|
||||||
if (matchLocalRecord == null) {
|
if (matchLocalRecord == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return JSONArray.parseArray(matchLocalRecord, MatchLocalRecord.class);
|
return JSONArray.parseArray(matchLocalRecord, MatchLocalRecord.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void matchLocalRecord(List<MatchLocalRecord> matchLocalRecord) {
|
public void matchLocalRecord(List matchLocalRecord) {
|
||||||
if (matchLocalRecord == null) {
|
if (matchLocalRecord == null) {
|
||||||
this.matchLocalRecord = null;
|
this.matchLocalRecord = null;
|
||||||
} else {
|
} else {
|
||||||
|
@ -10,7 +10,6 @@ public class MatchLocalRecord {
|
|||||||
private String deviceName;
|
private String deviceName;
|
||||||
private String faceUrl;
|
private String faceUrl;
|
||||||
private Float score;
|
private Float score;
|
||||||
private Float confidence;
|
|
||||||
private String idStr;
|
private String idStr;
|
||||||
private Date shotDate;
|
private Date shotDate;
|
||||||
private Boolean matched;
|
private Boolean matched;
|
||||||
|
@ -3,6 +3,7 @@ package com.ycwl.basic.model.pc.scenic.entity;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.ycwl.basic.facebody.enums.FaceBodyAdapterType;
|
||||||
import com.ycwl.basic.storage.enums.StorageType;
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ -75,4 +76,7 @@ public class ScenicConfigEntity {
|
|||||||
private String watermarkType;
|
private String watermarkType;
|
||||||
private String watermarkScenicText;
|
private String watermarkScenicText;
|
||||||
private String watermarkDtFormat;
|
private String watermarkDtFormat;
|
||||||
|
|
||||||
|
private FaceBodyAdapterType faceType;
|
||||||
|
private String faceConfigJson;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.ycwl.basic.printer.ticket;
|
package com.ycwl.basic.printer.ticket;
|
||||||
|
|
||||||
import cn.hutool.Hutool;
|
|
||||||
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpRequest;
|
||||||
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpResponse;
|
||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.ycwl.basic.printer.ticket;
|
||||||
|
|
||||||
|
public class TicketPrinterFactory {
|
||||||
|
}
|
@ -1,9 +1,13 @@
|
|||||||
package com.ycwl.basic.service.pc.impl;
|
package com.ycwl.basic.service.pc.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.ycwl.basic.biz.OrderBiz;
|
import com.ycwl.basic.biz.OrderBiz;
|
||||||
import com.ycwl.basic.enums.StatisticEnum;
|
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.FaceSampleMapper;
|
||||||
import com.ycwl.basic.mapper.SourceMapper;
|
import com.ycwl.basic.mapper.SourceMapper;
|
||||||
import com.ycwl.basic.mapper.StatisticsMapper;
|
import com.ycwl.basic.mapper.StatisticsMapper;
|
||||||
@ -37,6 +41,7 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -62,8 +67,6 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private SourceMapper sourceMapper;
|
private SourceMapper sourceMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private FaceSampleMapper faceSampleMapper;
|
|
||||||
@Autowired
|
|
||||||
private OrderBiz orderBiz;
|
private OrderBiz orderBiz;
|
||||||
@Autowired
|
@Autowired
|
||||||
private FaceRepository faceRepository;
|
private FaceRepository faceRepository;
|
||||||
@ -120,8 +123,6 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FaceRecognizeResp faceUpload(MultipartFile file, Long scenicId, Long userId) {
|
public FaceRecognizeResp faceUpload(MultipartFile file, Long scenicId, Long userId) {
|
||||||
|
|
||||||
|
|
||||||
//1、上传人脸照片
|
//1、上传人脸照片
|
||||||
IStorageAdapter adapter = StorageFactory.use("faces");
|
IStorageAdapter adapter = StorageFactory.use("faces");
|
||||||
String filePath = StorageUtil.joinPath("user-faces", DateUtils.format(new Date(),"yyyy-MM-dd"));
|
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);
|
String faceUrl = adapter.uploadFile(file, filePath, fileName);
|
||||||
Long newFaceId = SnowFlakeUtil.getLongId();
|
Long newFaceId = SnowFlakeUtil.getLongId();
|
||||||
Long oldFaceId = null;
|
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;
|
float strictScore = 0.6F;
|
||||||
if (userDbSearchResult == null) {
|
if (userDbSearchResult == null) {
|
||||||
// 都是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()) {
|
} 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) {
|
} 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 {
|
} else {
|
||||||
// 有匹配结果,且能匹配旧的数据
|
// 有匹配结果,且能匹配旧的数据
|
||||||
Optional<Long> faceAny = userDbSearchResult.getSampleListIds().stream().filter(_faceId -> {
|
Optional<Long> faceAny = userDbSearchResult.getSampleListIds().stream().filter(_faceId -> {
|
||||||
@ -155,8 +165,8 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
oldFaceId = faceAny.get();
|
oldFaceId = faceAny.get();
|
||||||
FaceRespVO oldFace = faceMapper.getById(oldFaceId);
|
FaceRespVO oldFace = faceMapper.getById(oldFaceId);
|
||||||
if (oldFace == null) {
|
if (oldFace == null) {
|
||||||
faceService.deleteFaceSample(USER_FACE_DB_NAME+scenicId, oldFaceId.toString());
|
faceBodyAdapter.deleteFace(USER_FACE_DB_NAME+scenicId, oldFaceId.toString());
|
||||||
faceService.addFaceSample(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString());
|
faceBodyAdapter.addFace(USER_FACE_DB_NAME+scenicId, newFaceId.toString(), faceUrl, newFaceId.toString());
|
||||||
oldFaceId = null;
|
oldFaceId = null;
|
||||||
} else {
|
} else {
|
||||||
newFaceId = oldFaceId;
|
newFaceId = oldFaceId;
|
||||||
@ -210,30 +220,27 @@ public class FaceServiceImpl implements FaceService {
|
|||||||
if (face == null) {
|
if (face == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
SearchFaceRespVo scenicDbSearchResult = faceService.searchFace(face.getScenicId(), face.getFaceUrl());
|
|
||||||
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId());
|
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 (scenicDbSearchResult.getSampleListIds() != null && scenicDbSearchResult.getFirstMatchRate() != null && !scenicDbSearchResult.getSampleListIds().isEmpty()) {
|
||||||
if (scenicConfig != null && scenicConfig.getFaceDetectHelperThreshold() != null && scenicConfig.getFaceDetectHelperThreshold() > 0) {
|
if (scenicConfig != null && scenicConfig.getFaceDetectHelperThreshold() != null && scenicConfig.getFaceDetectHelperThreshold() > 0) {
|
||||||
if (scenicDbSearchResult.getSampleListIds().size() < scenicConfig.getFaceDetectHelperThreshold()) {
|
if (scenicDbSearchResult.getSampleListIds().size() < scenicConfig.getFaceDetectHelperThreshold()) {
|
||||||
// 补救逻辑
|
// 补救逻辑
|
||||||
Long faceSampleId = scenicDbSearchResult.getSampleListIds().get(0);
|
Long resultItem = scenicDbSearchResult.getSampleListIds().get(0);
|
||||||
FaceSampleEntity faceSample = faceRepository.getFaceSample(faceSampleId);
|
FaceSampleEntity faceSample = faceRepository.getFaceSample(resultItem);
|
||||||
if (faceSample != null) {
|
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 faceEntity = new FaceEntity();
|
||||||
faceEntity.setId(faceId);
|
faceEntity.setId(faceId);
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
package com.ycwl.basic.service.pc.impl;
|
package com.ycwl.basic.service.pc.impl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import com.github.pagehelper.PageInfo;
|
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.ScenicAccountMapper;
|
||||||
import com.ycwl.basic.mapper.ScenicMapper;
|
import com.ycwl.basic.mapper.ScenicMapper;
|
||||||
import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity;
|
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 org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
||||||
|
|
||||||
@ -77,8 +81,6 @@ public class ScenicServiceImpl implements ScenicService {
|
|||||||
account.setIsSuper(1);
|
account.setIsSuper(1);
|
||||||
scenicAccountMapper.add(account);
|
scenicAccountMapper.add(account);
|
||||||
if (add > 0) {
|
if (add > 0) {
|
||||||
taskFaceService.createFaceDB(scenicId.toString());
|
|
||||||
taskFaceService.assureFaceDB(scenicId.toString());
|
|
||||||
return ApiResponse.success(true);
|
return ApiResponse.success(true);
|
||||||
} else {
|
} else {
|
||||||
return ApiResponse.fail("景区添加失败");
|
return ApiResponse.fail("景区添加失败");
|
||||||
@ -90,12 +92,17 @@ public class ScenicServiceImpl implements ScenicService {
|
|||||||
public ApiResponse<Boolean> deleteById(Long id) {
|
public ApiResponse<Boolean> deleteById(Long id) {
|
||||||
int i = scenicMapper.deleteById(id);
|
int i = scenicMapper.deleteById(id);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
scenicMapper.deleteConfigByScenicId(id);
|
|
||||||
scenicAccountMapper.deleteByScenicId(id);
|
scenicAccountMapper.deleteByScenicId(id);
|
||||||
(new Thread(() -> {
|
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(id);
|
||||||
taskFaceService.deleteFaceDB(id.toString());
|
if (scenicConfig != null && scenicConfig.getFaceType() != null) {
|
||||||
taskFaceService.deleteFaceDB(USER_FACE_DB_NAME + id.toString());
|
IFaceBodyAdapter adapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType());
|
||||||
})).start();
|
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);
|
scenicRepository.clearCache(id);
|
||||||
return ApiResponse.success(true);
|
return ApiResponse.success(true);
|
||||||
}else {
|
}else {
|
||||||
@ -131,7 +138,6 @@ public class ScenicServiceImpl implements ScenicService {
|
|||||||
int i = scenicMapper.update(scenicUpdateReq);
|
int i = scenicMapper.update(scenicUpdateReq);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
scenicRepository.clearCache(scenicUpdateReq.getId());
|
scenicRepository.clearCache(scenicUpdateReq.getId());
|
||||||
taskFaceService.assureFaceDB(scenicUpdateReq.getId().toString());
|
|
||||||
return ApiResponse.success(true);
|
return ApiResponse.success(true);
|
||||||
}else {
|
}else {
|
||||||
return ApiResponse.fail("景区修改失败");
|
return ApiResponse.fail("景区修改失败");
|
||||||
@ -144,7 +150,6 @@ public class ScenicServiceImpl implements ScenicService {
|
|||||||
int i = scenicMapper.updateStatus(id);
|
int i = scenicMapper.updateStatus(id);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
scenicRepository.clearCache(id);
|
scenicRepository.clearCache(id);
|
||||||
taskFaceService.assureFaceDB(id.toString());
|
|
||||||
return ApiResponse.success(true);
|
return ApiResponse.success(true);
|
||||||
}else {
|
}else {
|
||||||
return ApiResponse.fail("景区状态修改失败");
|
return ApiResponse.fail("景区状态修改失败");
|
||||||
@ -159,7 +164,6 @@ public class ScenicServiceImpl implements ScenicService {
|
|||||||
int i = scenicMapper.addConfig(scenicConfig);
|
int i = scenicMapper.addConfig(scenicConfig);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
scenicRepository.clearCache(scenicConfig.getScenicId());
|
scenicRepository.clearCache(scenicConfig.getScenicId());
|
||||||
taskFaceService.assureFaceDB(scenicConfig.getScenicId().toString());
|
|
||||||
return ApiResponse.success(true);
|
return ApiResponse.success(true);
|
||||||
}else {
|
}else {
|
||||||
return ApiResponse.fail("景区配置添加失败");
|
return ApiResponse.fail("景区配置添加失败");
|
||||||
@ -171,7 +175,6 @@ public class ScenicServiceImpl implements ScenicService {
|
|||||||
int i = scenicMapper.updateConfigById(scenicConfig);
|
int i = scenicMapper.updateConfigById(scenicConfig);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
scenicRepository.clearCache(scenicConfig.getScenicId());
|
scenicRepository.clearCache(scenicConfig.getScenicId());
|
||||||
taskFaceService.assureFaceDB(scenicConfig.getScenicId().toString());
|
|
||||||
return ApiResponse.success(true);
|
return ApiResponse.success(true);
|
||||||
}else {
|
}else {
|
||||||
return ApiResponse.fail("景区配置修改失败");
|
return ApiResponse.fail("景区配置修改失败");
|
||||||
|
@ -1,33 +1,20 @@
|
|||||||
package com.ycwl.basic.service.task;
|
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 com.ycwl.basic.model.task.resp.SearchFaceRespVo;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
public interface TaskFaceService {
|
public interface TaskFaceService {
|
||||||
|
|
||||||
SearchFaceRespVo searchFace(Long faceId);
|
SearchFaceRespVo searchFace(Long faceId);
|
||||||
|
|
||||||
SearchFaceRespVo searchFace(Long scenicId, String faceUrl);
|
SearchFaceRespVo searchFace(IFaceBodyAdapter adapter, String dbName, String faceUrl, String reason);
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
void batchDeleteExpiredFace(Long scenicId);
|
void batchDeleteExpiredFace(Long scenicId);
|
||||||
|
|
||||||
void deleteFaceDB(String scenicId);
|
|
||||||
|
|
||||||
void createFaceDB(String scenicId);
|
|
||||||
|
|
||||||
void assureFaceDB(String scenicId);
|
|
||||||
|
|
||||||
String uploadFile(MultipartFile file, Long userId);
|
String uploadFile(MultipartFile file, Long userId);
|
||||||
|
|
||||||
boolean deleteFaceSample(String dbName, String entityId);
|
boolean deleteFaceSample(String dbName, String entityId);
|
||||||
|
|
||||||
|
boolean assureFaceDb(IFaceBodyAdapter faceBodyAdapter, String dbName);
|
||||||
}
|
}
|
||||||
|
@ -3,23 +3,19 @@ package com.ycwl.basic.service.task.impl;
|
|||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
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.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.ListFaceEntitiesRequest;
|
||||||
import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse;
|
import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse;
|
||||||
import com.aliyuncs.facebody.model.v20191230.SearchFaceRequest;
|
import com.aliyuncs.facebody.model.v20191230.SearchFaceRequest;
|
||||||
import com.aliyuncs.facebody.model.v20191230.SearchFaceResponse;
|
import com.aliyuncs.facebody.model.v20191230.SearchFaceResponse;
|
||||||
import com.ycwl.basic.biz.OrderBiz;
|
import com.ycwl.basic.biz.OrderBiz;
|
||||||
import com.ycwl.basic.config.FaceDetectConfig;
|
|
||||||
import com.ycwl.basic.constant.FaceConstant;
|
import com.ycwl.basic.constant.FaceConstant;
|
||||||
import com.ycwl.basic.exception.BaseException;
|
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.FaceDetectLogMapper;
|
||||||
import com.ycwl.basic.mapper.FaceMapper;
|
import com.ycwl.basic.mapper.FaceMapper;
|
||||||
import com.ycwl.basic.mapper.FaceSampleMapper;
|
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.scenic.entity.ScenicConfigEntity;
|
||||||
import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity;
|
import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity;
|
||||||
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
|
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.model.task.resp.SearchFaceRespVo;
|
||||||
import com.ycwl.basic.ratelimiter.FixedRateLimiter;
|
import com.ycwl.basic.ratelimiter.FixedRateLimiter;
|
||||||
import com.ycwl.basic.repository.DeviceRepository;
|
import com.ycwl.basic.repository.DeviceRepository;
|
||||||
@ -63,17 +58,17 @@ import java.io.IOException;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
|
||||||
|
|
||||||
@ -87,8 +82,6 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ScenicMapper scenicMapper;
|
private ScenicMapper scenicMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private FaceDetectConfig faceDetectConfig;
|
|
||||||
@Autowired
|
|
||||||
private RedisTemplate<String, String> redisTemplate;
|
private RedisTemplate<String, String> redisTemplate;
|
||||||
@Autowired
|
@Autowired
|
||||||
private FaceDetectLogMapper logMapper;
|
private FaceDetectLogMapper logMapper;
|
||||||
@ -98,11 +91,6 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
private SourceMapper sourceMapper;
|
private SourceMapper sourceMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private OrderBiz orderBiz;
|
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 FixedRateLimiter deleteEntityLimiter = new FixedRateLimiter(600, TimeUnit.MILLISECONDS);
|
||||||
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 1024, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1024));
|
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 DeviceRepository deviceRepository;
|
||||||
|
|
||||||
private IAcsClient getClient() {
|
private IAcsClient getClient() {
|
||||||
DefaultProfile profile = DefaultProfile.getProfile(
|
AliFaceBodyAdapter use = (AliFaceBodyAdapter) FaceBodyFactory.use();
|
||||||
faceDetectConfig.getRegion(),faceDetectConfig.getAccessKeyId(), faceDetectConfig.getAccessKeySecret());
|
return use.getClient().getClient();
|
||||||
IAcsClient client = new DefaultAcsClient(profile);
|
|
||||||
return client;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -127,7 +113,15 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
Long scenicId = faceRespVO.getScenicId();
|
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) {
|
if (respVo != null) {
|
||||||
FaceEntity faceEntity = new FaceEntity();
|
FaceEntity faceEntity = new FaceEntity();
|
||||||
faceEntity.setId(faceId);
|
faceEntity.setId(faceId);
|
||||||
@ -184,29 +178,14 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SearchFaceRespVo searchFace(Long scenicId, String faceUrl) {
|
public SearchFaceRespVo searchFace(IFaceBodyAdapter adapter, String dbName, String faceUrl, String reason) {
|
||||||
return searchFace(scenicId.toString(), faceUrl, "预留字段");
|
assureFaceDb(adapter, dbName);
|
||||||
}
|
|
||||||
|
|
||||||
@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();
|
|
||||||
SearchFaceRequest request = new SearchFaceRequest();
|
SearchFaceRequest request = new SearchFaceRequest();
|
||||||
request.setDbName(dbName);
|
request.setDbName(dbName);
|
||||||
request.setImageUrl(faceUrl);
|
request.setImageUrl(faceUrl);
|
||||||
request.setLimit(200);
|
request.setLimit(200);
|
||||||
// request.setQualityScoreThreshold(60f);
|
// request.setQualityScoreThreshold(60f);
|
||||||
FaceDetectLog logEntity = FaceDetectLog.quickCreate(reason, request);
|
FaceDetectLog logEntity = FaceDetectLog.quickCreate(reason, request);
|
||||||
try {
|
|
||||||
searchFaceLimiter.acquire();
|
|
||||||
} catch (InterruptedException ignored) {
|
|
||||||
}
|
|
||||||
float threshold = 0.525F;
|
float threshold = 0.525F;
|
||||||
int tourMinutes = -1;
|
int tourMinutes = -1;
|
||||||
if (StringUtils.isNumeric(dbName)) {
|
if (StringUtils.isNumeric(dbName)) {
|
||||||
@ -223,26 +202,30 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
final float _threshold = threshold;
|
final float _threshold = threshold;
|
||||||
List<Long> acceptFaceSampleIds;
|
List<Long> acceptFaceSampleIds;
|
||||||
try {
|
try {
|
||||||
SearchFaceResponse response = client.getAcsResponse(request);
|
SearchFaceResp response = adapter.searchFace(dbName, faceUrl);
|
||||||
logEntity.fillResponse(response);
|
logEntity.fillResponse(response);
|
||||||
List<SearchFaceResponse.Data.MatchListItem> matchList = response.getData().getMatchList();
|
List<SearchFaceResultItem> records = response.getResult();
|
||||||
if (matchList.isEmpty()) {
|
if (records.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
SearchFaceRespVo respVo = new SearchFaceRespVo();
|
SearchFaceRespVo respVo = new SearchFaceRespVo();
|
||||||
respVo.setScore(matchList.get(0).getQualitieScore());
|
respVo.setScore(response.getOriginalFaceScore());
|
||||||
respVo.setSearchResultJson(JSON.toJSONString(matchList.get(0)));
|
respVo.setSearchResultJson(JSON.toJSONString(records));
|
||||||
if (matchList.get(0).getFaceItems().isEmpty()) {
|
if (records.isEmpty()) {
|
||||||
return respVo;
|
return respVo;
|
||||||
}
|
}
|
||||||
List<SearchFaceResponse.Data.MatchListItem.FaceItemsItem> records = matchList.get(0).getFaceItems();
|
|
||||||
logEntity.setMatchRawRecord(records);
|
logEntity.setMatchRawRecord(records);
|
||||||
acceptFaceSampleIds = records.stream()
|
acceptFaceSampleIds = records.stream()
|
||||||
.filter(record -> record.getScore() > _threshold)
|
.filter(record -> record.getScore() > _threshold)
|
||||||
.map(SearchFaceResponse.Data.MatchListItem.FaceItemsItem::getExtraData)
|
.map(SearchFaceResultItem::getExtData)
|
||||||
.filter(StringUtils::isNumeric)
|
.filter(StringUtils::isNumeric)
|
||||||
.map(Long::valueOf)
|
.map(Long::valueOf)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
if (acceptFaceSampleIds.isEmpty()) {
|
||||||
|
respVo.setFirstMatchRate(0f);
|
||||||
|
respVo.setSampleListIds(Collections.emptyList());
|
||||||
|
return respVo;
|
||||||
|
}
|
||||||
List<FaceSampleEntity> faceSampleList = new ArrayList<>();
|
List<FaceSampleEntity> faceSampleList = new ArrayList<>();
|
||||||
if (StringUtils.isNumeric(dbName)) { // 景区
|
if (StringUtils.isNumeric(dbName)) { // 景区
|
||||||
faceSampleList = faceSampleMapper.listByIds(acceptFaceSampleIds);
|
faceSampleList = faceSampleMapper.listByIds(acceptFaceSampleIds);
|
||||||
@ -258,19 +241,25 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
log.info("时间范围逻辑:最高匹配:{},时间范围需要在:{}~{}间", firstFaceSample, startDate, endDate);
|
log.info("时间范围逻辑:最高匹配:{},时间范围需要在:{}~{}间", firstFaceSample, startDate, endDate);
|
||||||
} else {
|
} else {
|
||||||
|
acceptFaceSampleIds = faceSampleList.stream()
|
||||||
|
.map(FaceSampleEntity::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
log.info("时间范围逻辑:景区未限制");
|
log.info("时间范围逻辑:景区未限制");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
acceptFaceSampleIds = faceSampleList.stream()
|
||||||
|
.map(FaceSampleEntity::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
log.info("时间范围逻辑:最高匹配ID:{},未找到", firstFaceSampleId);
|
log.info("时间范围逻辑:最高匹配ID:{},未找到", firstFaceSampleId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
List<MatchLocalRecord> collect = new ArrayList<>();
|
List<MatchLocalRecord> collect = new ArrayList<>();
|
||||||
for (SearchFaceResponse.Data.MatchListItem.FaceItemsItem item : records) {
|
for (SearchFaceResultItem item : records) {
|
||||||
MatchLocalRecord record = new MatchLocalRecord();
|
MatchLocalRecord record = new MatchLocalRecord();
|
||||||
record.setIdStr(item.getExtraData());
|
record.setIdStr(item.getExtData());
|
||||||
record.setFaceSampleId(Long.parseLong(item.getExtraData()));
|
record.setFaceSampleId(Long.parseLong(item.getExtData()));
|
||||||
if (StringUtils.isNumeric(item.getDbName())) {
|
if (StringUtils.isNumeric(item.getDbName())) {
|
||||||
Optional<FaceSampleEntity> optionalFse = faceSampleList.stream().filter(face -> face.getId().equals(Long.parseLong(item.getExtraData()))).findAny();
|
Optional<FaceSampleEntity> optionalFse = faceSampleList.stream().filter(face -> face.getId().equals(Long.parseLong(item.getExtData()))).findAny();
|
||||||
if (optionalFse.isPresent()) {
|
if (optionalFse.isPresent()) {
|
||||||
DeviceEntity device = deviceRepository.getDevice(optionalFse.get().getDeviceId());
|
DeviceEntity device = deviceRepository.getDevice(optionalFse.get().getDeviceId());
|
||||||
if (device != null) {
|
if (device != null) {
|
||||||
@ -285,11 +274,10 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
}
|
}
|
||||||
record.setScore(item.getScore());
|
record.setScore(item.getScore());
|
||||||
record.setMatched(item.getScore() > _threshold);
|
record.setMatched(item.getScore() > _threshold);
|
||||||
record.setConfidence(item.getConfidence());
|
|
||||||
collect.add(record);
|
collect.add(record);
|
||||||
}
|
}
|
||||||
logEntity.setMatchLocalRecord(JSONObject.toJSONString(collect));
|
logEntity.setMatchLocalRecord(JSONObject.toJSONString(collect));
|
||||||
respVo.setFirstMatchRate(matchList.get(0).getFaceItems().get(0).getScore());
|
respVo.setFirstMatchRate(response.getFirstMatchRate());
|
||||||
respVo.setSampleListIds(acceptFaceSampleIds);
|
respVo.setSampleListIds(acceptFaceSampleIds);
|
||||||
return respVo;
|
return respVo;
|
||||||
} catch (Exception e) {
|
} 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
|
@Override
|
||||||
public void batchDeleteExpiredFace(Long scenicId) {
|
public void batchDeleteExpiredFace(Long scenicId) {
|
||||||
log.info("当前景区{},开始删除人脸样本", scenicId);
|
log.info("当前景区{},开始删除人脸样本", scenicId);
|
||||||
@ -384,6 +324,37 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
|||||||
}
|
}
|
||||||
} catch (Exception ignored) {
|
} 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<DeviceEntity> devices = deviceRepository.getAllDeviceByScenicId(scenicId);
|
List<DeviceEntity> devices = deviceRepository.getAllDeviceByScenicId(scenicId);
|
||||||
listFaceEntitiesRequest.setDbName(String.valueOf(scenicId));
|
listFaceEntitiesRequest.setDbName(String.valueOf(scenicId));
|
||||||
listFaceEntitiesRequest.setOrder("asc");
|
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<ListFaceDbsResponse.Data.DbListItem> dbList = new ArrayList<>();
|
|
||||||
IAcsClient client = getClient();
|
|
||||||
while (true) {
|
|
||||||
ListFaceDbsRequest request = new ListFaceDbsRequest();
|
|
||||||
request.setLimit(200L);
|
|
||||||
request.setOffset(offset);
|
|
||||||
ListFaceDbsResponse response = client.getAcsResponse(request);
|
|
||||||
List<ListFaceDbsResponse.Data.DbListItem> 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
|
@Override
|
||||||
public String uploadFile(MultipartFile file, Long userId) {
|
public String uploadFile(MultipartFile file, Long userId) {
|
||||||
if (file.isEmpty()) {
|
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) {
|
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) {
|
public Boolean removeFaceDBCache(String dbName) {
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
package com.ycwl.basic.task;
|
package com.ycwl.basic.task;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.ycwl.basic.biz.TemplateBiz;
|
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.FaceMapper;
|
||||||
import com.ycwl.basic.mapper.FaceSampleMapper;
|
import com.ycwl.basic.mapper.FaceSampleMapper;
|
||||||
import com.ycwl.basic.mapper.ScenicMapper;
|
import com.ycwl.basic.mapper.ScenicMapper;
|
||||||
import com.ycwl.basic.mapper.TemplateMapper;
|
import com.ycwl.basic.mapper.TemplateMapper;
|
||||||
import com.ycwl.basic.model.pc.face.entity.FaceEntity;
|
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.faceSample.resp.FaceSampleRespVO;
|
||||||
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
|
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.model.task.resp.SearchFaceRespVo;
|
||||||
import com.ycwl.basic.repository.FaceRepository;
|
import com.ycwl.basic.repository.FaceRepository;
|
||||||
import com.ycwl.basic.repository.ScenicRepository;
|
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.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.DelayQueue;
|
import java.util.concurrent.DelayQueue;
|
||||||
import java.util.concurrent.Delayed;
|
import java.util.concurrent.Delayed;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -116,7 +113,14 @@ public class DynamicTaskGenerator {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.info("开始执行任务:{}", task);
|
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在人脸样本库中,则创建任务
|
// 如果人脸样本ID在人脸样本库中,则创建任务
|
||||||
if (!userDbSearchResult.getSampleListIds().isEmpty()) {
|
if (!userDbSearchResult.getSampleListIds().isEmpty()) {
|
||||||
log.info("人脸样本ID在人脸样本库中,创建任务:{}", task);
|
log.info("人脸样本ID在人脸样本库中,创建任务:{}", task);
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.ycwl.basic.mapper.FaceSampleMapper">
|
<mapper namespace="com.ycwl.basic.mapper.FaceSampleMapper">
|
||||||
<insert id="add">
|
<insert id="add">
|
||||||
insert into face_sample(id, scenic_id, device_id, source_id, face_url, match_sample_ids, first_match_rate, match_result,`status`, create_at)
|
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}, #{sourceId}, #{faceUrl}, #{matchSampleIds}, #{firstMatchRate}, #{matchResult},#{status},#{createAt})
|
values (#{id}, #{scenicId}, #{deviceId}, #{faceUrl}, #{matchSampleIds}, #{firstMatchRate}, #{matchResult},#{status},#{createAt})
|
||||||
</insert>
|
</insert>
|
||||||
<update id="update">
|
<update id="update">
|
||||||
update face_sample
|
update face_sample
|
||||||
@ -14,9 +14,6 @@
|
|||||||
<if test="deviceId!= null ">
|
<if test="deviceId!= null ">
|
||||||
device_id = #{deviceId},
|
device_id = #{deviceId},
|
||||||
</if>
|
</if>
|
||||||
<if test="sourceId!= null ">
|
|
||||||
source_id = #{sourceId},
|
|
||||||
</if>
|
|
||||||
<if test="faceUrl!= null and faceUrl!= ''">
|
<if test="faceUrl!= null and faceUrl!= ''">
|
||||||
face_url = #{faceUrl},
|
face_url = #{faceUrl},
|
||||||
</if>
|
</if>
|
||||||
@ -52,7 +49,7 @@
|
|||||||
</if>
|
</if>
|
||||||
</delete>
|
</delete>
|
||||||
<select id="list" resultType="com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO">
|
<select id="list" resultType="com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO">
|
||||||
select f.id, f.scenic_id, s.name scenicName, device_id, d.name deviceName, face_url, source_id, f.score, match_sample_ids, first_match_rate, match_result, f.`status`, f.create_at
|
select f.id, f.scenic_id, s.name scenicName, device_id, d.name deviceName, face_url, f.score, match_sample_ids, first_match_rate, match_result, f.`status`, f.create_at
|
||||||
from face_sample f
|
from face_sample f
|
||||||
left join scenic s on s.id = f.scenic_id
|
left join scenic s on s.id = f.scenic_id
|
||||||
left join device d on d.id = f.device_id
|
left join device d on d.id = f.device_id
|
||||||
@ -63,9 +60,6 @@
|
|||||||
<if test="deviceId!= null and deviceId!= ''">
|
<if test="deviceId!= null and deviceId!= ''">
|
||||||
and device_id = #{deviceId}
|
and device_id = #{deviceId}
|
||||||
</if>
|
</if>
|
||||||
<if test="sourceId!= null and sourceId!= ''">
|
|
||||||
and source_id = #{sourceId}
|
|
||||||
</if>
|
|
||||||
<if test="matchSampleIds!= null and matchSampleIds!= ''">
|
<if test="matchSampleIds!= null and matchSampleIds!= ''">
|
||||||
and match_sample_ids like concat('%', #{matchSampleIds}, '%')
|
and match_sample_ids like concat('%', #{matchSampleIds}, '%')
|
||||||
</if>
|
</if>
|
||||||
@ -82,7 +76,7 @@
|
|||||||
ORDER BY f.create_at desc
|
ORDER BY f.create_at desc
|
||||||
</select>
|
</select>
|
||||||
<select id="getById" resultType="com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO">
|
<select id="getById" resultType="com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO">
|
||||||
select id, scenic_id, device_id, face_url, match_sample_ids, first_match_rate, source_id, match_result,`status`, create_at
|
select id, scenic_id, device_id, face_url, match_sample_ids, first_match_rate, match_result,`status`, create_at
|
||||||
from face_sample
|
from face_sample
|
||||||
where id = #{id}
|
where id = #{id}
|
||||||
</select>
|
</select>
|
||||||
|
@ -111,7 +111,9 @@
|
|||||||
broker_direct_rate=#{brokerDirectRate},
|
broker_direct_rate=#{brokerDirectRate},
|
||||||
watermark_type=#{watermarkType},
|
watermark_type=#{watermarkType},
|
||||||
watermark_scenic_text=#{watermarkScenicText},
|
watermark_scenic_text=#{watermarkScenicText},
|
||||||
watermark_dt_format=#{watermarkDtFormat}
|
watermark_dt_format=#{watermarkDtFormat},
|
||||||
|
face_type=#{faceType},
|
||||||
|
face_config_json=#{faceConfigJson}
|
||||||
</set>
|
</set>
|
||||||
where id = #{id}
|
where id = #{id}
|
||||||
</update>
|
</update>
|
||||||
|
@ -31,6 +31,13 @@
|
|||||||
<if test="endTime!= null">
|
<if test="endTime!= null">
|
||||||
and create_time <= #{endTime}
|
and create_time <= #{endTime}
|
||||||
</if>
|
</if>
|
||||||
|
and member_id in (select member_id from statistics where type = 1
|
||||||
|
<if test="startTime!= null">
|
||||||
|
and create_time >= #{startTime}
|
||||||
|
</if>
|
||||||
|
<if test="endTime!= null">
|
||||||
|
and create_time <= #{endTime}
|
||||||
|
</if>)
|
||||||
group by member_id
|
group by member_id
|
||||||
)a
|
)a
|
||||||
</select>
|
</select>
|
||||||
|
@ -9,7 +9,6 @@ import com.aliyuncs.facebody.model.v20191230.GetFaceEntityResponse;
|
|||||||
import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesRequest;
|
import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesRequest;
|
||||||
import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse;
|
import com.aliyuncs.facebody.model.v20191230.ListFaceEntitiesResponse;
|
||||||
import com.aliyuncs.profile.DefaultProfile;
|
import com.aliyuncs.profile.DefaultProfile;
|
||||||
import com.ycwl.basic.config.FaceDetectConfig;
|
|
||||||
import com.ycwl.basic.mapper.FaceMapper;
|
import com.ycwl.basic.mapper.FaceMapper;
|
||||||
import com.ycwl.basic.mapper.FaceSampleMapper;
|
import com.ycwl.basic.mapper.FaceSampleMapper;
|
||||||
import com.ycwl.basic.mapper.ScenicMapper;
|
import com.ycwl.basic.mapper.ScenicMapper;
|
||||||
@ -57,8 +56,6 @@ public class FaceCleanerTest {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private FaceSampleMapper faceSampleMapper;
|
private FaceSampleMapper faceSampleMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private FaceDetectConfig faceDetectConfig;
|
|
||||||
@Autowired
|
|
||||||
private ScenicMapper scenicMapper;
|
private ScenicMapper scenicMapper;
|
||||||
|
|
||||||
private IAcsClient getClient() {
|
private IAcsClient getClient() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user