You've already forked FrameTour-BE
乱七八糟的修改,其他外围流程逻辑完善
This commit is contained in:
@ -15,6 +15,7 @@ import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
|
||||
import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
|
||||
import com.ycwl.basic.service.pc.FaceService;
|
||||
import com.ycwl.basic.service.task.TaskFaceService;
|
||||
import com.ycwl.basic.service.task.TaskService;
|
||||
import com.ycwl.basic.utils.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@ -26,6 +27,8 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Author:longbinbin
|
||||
@ -45,6 +48,8 @@ public class FaceServiceImpl implements FaceService {
|
||||
|
||||
@Value("${face.score}")
|
||||
private float faceScore;
|
||||
@Autowired
|
||||
private TaskService taskTaskService;
|
||||
|
||||
@Override
|
||||
public ApiResponse<PageInfo<FaceRespVO>> pageQuery(FaceReqQuery faceReqQuery) {
|
||||
@ -110,53 +115,55 @@ public class FaceServiceImpl implements FaceService {
|
||||
log.info("当前登录用户信息:{}",worker);
|
||||
|
||||
//1、上传人脸照片
|
||||
String facaeUrl = uploadFileALiOss(file, userId);
|
||||
String faceUrl = uploadFileALiOss(file, userId);
|
||||
SearchFaceRespVo searchFaceRespVo = faceService.searchFace(scenicId, faceUrl);
|
||||
float score = searchFaceRespVo.getScore();
|
||||
if (score<faceScore) {
|
||||
//校验失败,删除,提示重新上传
|
||||
ossUtil.deleteFileByUrl(faceUrl);
|
||||
|
||||
throw new BaseException("人脸照片校验失败,请重新上传");
|
||||
}
|
||||
// 2、查看人脸是否已上传
|
||||
FaceRespVO faceRespVO=faceMapper.getByMemberId(userId);
|
||||
FaceRespVO faceRespVO=faceMapper.getByMemberId(userId, scenicId);
|
||||
|
||||
FaceEntity faceEntity = new FaceEntity();
|
||||
faceEntity.setScore(searchFaceRespVo.getScore());
|
||||
faceEntity.setMatchResult(searchFaceRespVo.getSearchResultJson());
|
||||
faceEntity.setMatchSampleIds(searchFaceRespVo.getSampleListIds().stream().map(String::valueOf).collect(Collectors.joining(",")));
|
||||
faceEntity.setCreateAt(new Date());
|
||||
faceEntity.setScenicId(scenicId);
|
||||
faceEntity.setMemberId(userId);
|
||||
faceEntity.setFaceUrl(faceUrl);
|
||||
if (faceRespVO==null) {
|
||||
//新增人脸
|
||||
faceEntity.setId(SnowFlakeUtil.getLongId());
|
||||
faceEntity.setMemberId(userId);
|
||||
faceEntity.setFaceUrl(facaeUrl);
|
||||
// faceEntity.setScore();
|
||||
// faceEntity.setMatchSampleIds();
|
||||
// faceEntity.setFirstMatchRate();
|
||||
// faceEntity.setMatchResult();
|
||||
//TODO 人脸数据存库
|
||||
faceMapper.add(faceEntity);
|
||||
taskTaskService.autoCreateTaskByFaceId(faceEntity.getId());
|
||||
}else {
|
||||
//2、更新人脸
|
||||
faceRespVO.setFaceUrl(facaeUrl);
|
||||
BeanUtil.copyProperties(faceRespVO,faceEntity);
|
||||
faceEntity.setId(faceRespVO.getId());
|
||||
faceMapper.update(faceEntity);
|
||||
if (!Objects.equals(
|
||||
faceRespVO.getMatchSampleIds(),
|
||||
searchFaceRespVo.getSampleListIds().stream().map(String::valueOf).collect(Collectors.joining(","))
|
||||
)) {
|
||||
taskTaskService.autoCreateTaskByFaceId(faceEntity.getId());
|
||||
}
|
||||
}
|
||||
SearchFaceRespVo faceRespVo = faceService.searchFace(scenicId, faceEntity.getId());
|
||||
float score = faceRespVo.getScore();
|
||||
if (score<faceScore) {
|
||||
//校验失败,删除,提示重新上传
|
||||
ossUtil.deleteFile(facaeUrl);
|
||||
|
||||
throw new BaseException("人脸照片校验失败,请重新上传");
|
||||
}else {
|
||||
StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq();
|
||||
statisticsRecordAddReq.setMemberId(userId);
|
||||
statisticsRecordAddReq.setType(StatisticEnum.UPLOAD_FACE.code);
|
||||
statisticsRecordAddReq.setScenicId(scenicId);
|
||||
statisticsRecordAddReq.setMorphId(faceEntity.getId());
|
||||
statisticsMapper.addStatisticsRecord(statisticsRecordAddReq);
|
||||
//校验成功,保存用户人脸信息,将访问人脸照片访问地址响应给前端
|
||||
return ApiResponse.success(facaeUrl);
|
||||
}
|
||||
|
||||
|
||||
|
||||
StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq();
|
||||
statisticsRecordAddReq.setMemberId(userId);
|
||||
statisticsRecordAddReq.setType(StatisticEnum.UPLOAD_FACE.code);
|
||||
statisticsRecordAddReq.setScenicId(scenicId);
|
||||
statisticsRecordAddReq.setMorphId(faceEntity.getId());
|
||||
statisticsMapper.addStatisticsRecord(statisticsRecordAddReq);
|
||||
return ApiResponse.success(faceUrl);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResponse<FaceRespVO> getFaceByMemberId(Long memberId) {
|
||||
return ApiResponse.success(faceMapper.getByMemberId(memberId));
|
||||
// TODO: 修改
|
||||
return ApiResponse.success(faceMapper.getByMemberId(memberId, 3928516560393736192L));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -11,7 +11,6 @@ import com.aliyuncs.facebody.model.v20191230.SearchFaceRequest;
|
||||
import com.aliyuncs.facebody.model.v20191230.SearchFaceResponse;
|
||||
import com.ycwl.basic.config.FaceDetectConfig;
|
||||
import com.ycwl.basic.exception.BaseException;
|
||||
import com.ycwl.basic.mapper.DeviceMapper;
|
||||
import com.ycwl.basic.mapper.FaceMapper;
|
||||
import com.ycwl.basic.mapper.FaceSampleMapper;
|
||||
import com.ycwl.basic.mapper.ScenicMapper;
|
||||
@ -46,9 +45,6 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
||||
private FaceSampleMapper faceSampleMapper;
|
||||
@Autowired
|
||||
private ScenicMapper scenicMapper;
|
||||
private static final String DATE_FORMAT="yyyyMMddHHmmssSSS";
|
||||
@Autowired
|
||||
private DeviceMapper deviceMapper;
|
||||
@Autowired
|
||||
private FaceDetectConfig faceDetectConfig;
|
||||
|
||||
@ -61,10 +57,24 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
||||
@Override
|
||||
public SearchFaceRespVo searchFace(Long scenicId, Long faceId) {
|
||||
FaceRespVO faceRespVO = faceMapper.getById(faceId);
|
||||
SearchFaceRespVo respVo = searchFace(scenicId, faceRespVO.getFaceUrl());
|
||||
if (respVo != null) {
|
||||
FaceEntity faceEntity = new FaceEntity();
|
||||
faceEntity.setId(faceId);
|
||||
faceEntity.setMatchResult(respVo.getSearchResultJson());
|
||||
faceEntity.setScore(respVo.getScore());
|
||||
faceEntity.setMatchSampleIds(StringUtils.join(respVo.getSampleListIds(), ","));
|
||||
faceMapper.update(faceEntity);
|
||||
}
|
||||
return respVo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SearchFaceRespVo searchFace(Long scenicId, String faceUrl) {
|
||||
IAcsClient client = getClient();
|
||||
SearchFaceRequest request = new SearchFaceRequest();
|
||||
request.setDbName(scenicId.toString());
|
||||
request.setImageUrl(faceRespVO.getFaceUrl());
|
||||
request.setImageUrl(faceUrl);
|
||||
request.setLimit(100);
|
||||
request.setQualityScoreThreshold(80F);
|
||||
try {
|
||||
@ -74,18 +84,13 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
||||
return null;
|
||||
}
|
||||
SearchFaceRespVo respVo = new SearchFaceRespVo();
|
||||
FaceEntity faceEntity = new FaceEntity();
|
||||
faceEntity.setId(faceId);
|
||||
faceEntity.setMatchResult(JSON.toJSONString(matchList));
|
||||
faceEntity.setScore(matchList.get(0).getQualitieScore());
|
||||
List<SearchFaceResponse.Data.MatchListItem.FaceItemsItem> faceItems = matchList.get(0).getFaceItems().stream()
|
||||
.filter(faceItemsItem -> faceItemsItem.getConfidence() > 50).collect(Collectors.toList());
|
||||
List<Long> faceSampleIds = faceItems.stream()
|
||||
.map(SearchFaceResponse.Data.MatchListItem.FaceItemsItem::getExtraData)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toList());
|
||||
faceEntity.setMatchSampleIds(StringUtils.join(faceSampleIds, ","));
|
||||
faceMapper.update(faceEntity);
|
||||
respVo.setSearchResultJson(JSON.toJSONString(matchList.get(0)));
|
||||
respVo.setSampleListIds(faceSampleIds);
|
||||
respVo.setScore(matchList.get(0).getQualitieScore());
|
||||
return respVo;
|
||||
@ -93,7 +98,6 @@ public class TaskFaceServiceImpl implements TaskFaceService {
|
||||
log.error("人脸搜索失败:{}", e.getMessage());
|
||||
throw new BaseException(e.getMessage());
|
||||
}
|
||||
// return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -2,6 +2,11 @@ package com.ycwl.basic.service.impl.task;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.ycwl.basic.constant.TaskConstant;
|
||||
import com.ycwl.basic.device.DeviceFactory;
|
||||
import com.ycwl.basic.device.operator.IDeviceStorageOperator;
|
||||
import com.ycwl.basic.mapper.DeviceMapper;
|
||||
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
|
||||
import com.ycwl.basic.model.pc.device.entity.DeviceEntity;
|
||||
import com.ycwl.basic.mapper.FaceMapper;
|
||||
import com.ycwl.basic.mapper.FaceSampleMapper;
|
||||
import com.ycwl.basic.mapper.RenderWorkerMapper;
|
||||
@ -12,9 +17,11 @@ import com.ycwl.basic.mapper.VideoMapper;
|
||||
import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
|
||||
import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
|
||||
import com.ycwl.basic.model.pc.renderWorker.entity.RenderWorkerEntity;
|
||||
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
|
||||
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
|
||||
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
|
||||
import com.ycwl.basic.model.pc.task.resp.TaskRespVO;
|
||||
import com.ycwl.basic.model.pc.template.entity.TemplateEntity;
|
||||
import com.ycwl.basic.model.pc.template.req.TemplateReqQuery;
|
||||
import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
|
||||
import com.ycwl.basic.model.pc.video.entity.VideoEntity;
|
||||
@ -23,6 +30,7 @@ import com.ycwl.basic.model.task.req.TaskReqVo;
|
||||
import com.ycwl.basic.model.task.req.WorkerAuthReqVo;
|
||||
import com.ycwl.basic.model.task.resp.TaskSyncRespVo;
|
||||
import com.ycwl.basic.service.task.TaskService;
|
||||
import com.ycwl.basic.task.VideoPieceGetter;
|
||||
import com.ycwl.basic.utils.OssUtil;
|
||||
import com.ycwl.basic.utils.SnowFlakeUtil;
|
||||
import lombok.NonNull;
|
||||
@ -38,6 +46,7 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -163,6 +172,92 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
return respVO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void taskStart(@NonNull Long taskId, @NonNull WorkerAuthReqVo req) {
|
||||
TaskRespVO task = taskMapper.getById(taskId);
|
||||
if (task == null) {
|
||||
return;
|
||||
}
|
||||
RenderWorkerEntity worker = getWorker(req);
|
||||
if (worker == null) {
|
||||
return;
|
||||
}
|
||||
TaskEntity taskUpdate = new TaskEntity();
|
||||
taskUpdate.setId(taskId);
|
||||
taskUpdate.setWorkerId(worker.getId());
|
||||
taskMapper.setStart(taskUpdate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void autoCreateTaskByFaceId(Long id) {
|
||||
FaceRespVO faceRespVO = faceMapper.getById(id);
|
||||
List<FaceSampleRespVO> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
|
||||
if (faceSampleList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<TemplateEntity> templateList = templateMapper.listByScenicId(faceRespVO.getScenicId());
|
||||
if (templateList == null || templateList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
autoCreateTaskByFaceIdAndTempalteId(id, templateList.get(0).getId(), 1);
|
||||
}
|
||||
@Override
|
||||
public void autoCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId) {
|
||||
autoCreateTaskByFaceIdAndTempalteId(faceId, templateId, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void autoCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic) {
|
||||
FaceRespVO faceRespVO = faceMapper.getById(faceId);
|
||||
List<FaceSampleRespVO> faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList()));
|
||||
if (faceSampleList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<SourceEntity> sourceList = sourceMapper.listBySampleIds(faceSampleList.stream().map(FaceSampleRespVO::getId).collect(Collectors.toList()));
|
||||
if (sourceList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
Thread taskThread = new Thread(() -> {
|
||||
List<SourceEntity> vSourceList = sourceMapper.listVideoBySampleIds(faceSampleList.stream().map(FaceSampleRespVO::getId).collect(Collectors.toList()));
|
||||
List<VideoPieceGetter.Task> tasks = faceSampleList.stream().map(sample -> {
|
||||
Optional<SourceEntity> optional = vSourceList.stream().filter(video -> video.getFaceSampleId().equals(sample.getId())).findFirst();
|
||||
if (optional.isPresent()) {
|
||||
return null;
|
||||
}
|
||||
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
|
||||
task.setFaceSampleId(sample.getId());
|
||||
task.setDeviceId(sample.getDeviceId());
|
||||
task.setCreateTime(sample.getCreateAt());
|
||||
return task;
|
||||
}).filter(Objects::nonNull).collect(Collectors.toList());
|
||||
VideoPieceGetter.Task task = new VideoPieceGetter.Task();
|
||||
task.setType("callback");
|
||||
task.setCallback(() -> {
|
||||
List<SourceEntity> videoSourceList = sourceMapper.listVideoBySampleIds(faceSampleList.stream().map(FaceSampleRespVO::getId).collect(Collectors.toList()));
|
||||
Map<String, List<SourceEntity>> sourcesMap = videoSourceList.stream()
|
||||
.peek(item -> item.setUrl(item.getVideoUrl()))
|
||||
.collect(Collectors.groupingBy(item -> item.getDeviceId().toString()));
|
||||
TaskEntity taskEntity = new TaskEntity();
|
||||
taskEntity.setId(SnowFlakeUtil.getLongId());
|
||||
taskEntity.setScenicId(faceRespVO.getScenicId());
|
||||
taskEntity.setFaceId(faceId);
|
||||
taskEntity.setMemberId(faceRespVO.getMemberId());
|
||||
taskEntity.setTemplateId(templateId);
|
||||
taskEntity.setTaskParams(JSON.toJSONString(sourcesMap));
|
||||
taskEntity.setStatus(0);
|
||||
taskEntity.setAutomatic(automatic);
|
||||
taskMapper.add(taskEntity);
|
||||
});
|
||||
if (!tasks.isEmpty()) {
|
||||
tasks.forEach(VideoPieceGetter::addTask);
|
||||
VideoPieceGetter.addTask(task);
|
||||
} else {
|
||||
task.getCallback().onInvoke();
|
||||
}
|
||||
});
|
||||
taskThread.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void taskSuccess(@NonNull Long taskId, @NonNull WorkerAuthReqVo req) {
|
||||
TaskRespVO task = taskMapper.getById(taskId);
|
||||
@ -177,7 +272,7 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
taskUpdate.setId(taskId);
|
||||
taskUpdate.setStatus(1);
|
||||
taskUpdate.setWorkerId(worker.getId());
|
||||
taskMapper.update(taskUpdate);
|
||||
taskMapper.setSuccess(taskUpdate);
|
||||
VideoEntity video = videoMapper.findByTaskId(taskId);
|
||||
if (video != null) {
|
||||
video.setVideoUrl(task.getVideoUrl());
|
||||
@ -210,7 +305,7 @@ public class TaskTaskServiceImpl implements TaskService {
|
||||
taskUpdate.setId(taskId);
|
||||
taskUpdate.setStatus(2);
|
||||
taskUpdate.setWorkerId(worker.getId());
|
||||
taskMapper.update(taskUpdate);
|
||||
taskMapper.setFail(taskUpdate);
|
||||
taskMapper.deassign(taskId);
|
||||
}
|
||||
|
||||
|
@ -20,4 +20,5 @@ public interface TaskService {
|
||||
ApiResponse<Boolean> deleteById(Long id);
|
||||
ApiResponse<Boolean> update(TaskEntity task);
|
||||
ApiResponse<Boolean> updateStatus(Long id,Integer status);
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.ycwl.basic.service.task;
|
||||
|
||||
import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
|
||||
import com.ycwl.basic.model.task.resp.AddFaceRespVo;
|
||||
import com.ycwl.basic.model.task.resp.SearchFaceRespVo;
|
||||
|
||||
@ -7,6 +8,8 @@ public interface TaskFaceService {
|
||||
|
||||
SearchFaceRespVo searchFace(Long scenicId, Long faceId);
|
||||
|
||||
SearchFaceRespVo searchFace(Long scenicId, String faceUrl);
|
||||
|
||||
AddFaceRespVo addFaceSample(Long faceSampleId);
|
||||
|
||||
void batchDeleteFace(Long scenicId);
|
||||
|
@ -11,9 +11,17 @@ public interface TaskService {
|
||||
|
||||
TemplateRespVO workerGetTemplate(Long templateId, WorkerAuthReqVo req);
|
||||
|
||||
void autoCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId);
|
||||
|
||||
void autoCreateTaskByFaceIdAndTempalteId(Long faceId, Long templateId, int automatic);
|
||||
|
||||
void taskSuccess(Long taskId, WorkerAuthReqVo req);
|
||||
|
||||
void taskFail(Long taskId, WorkerAuthReqVo req);
|
||||
|
||||
String getUploadUrl(Long taskId, WorkerAuthReqVo req);
|
||||
|
||||
void taskStart(Long taskId, WorkerAuthReqVo req);
|
||||
|
||||
void autoCreateTaskByFaceId(Long id);
|
||||
}
|
||||
|
Reference in New Issue
Block a user