This commit is contained in:
2025-01-16 18:28:04 +08:00
parent 0bba613001
commit bbcbdd2839
24 changed files with 436 additions and 111 deletions

View File

@ -1,13 +1,12 @@
package com.ycwl.basic.task;
import com.ycwl.basic.biz.TemplateBiz;
import com.ycwl.basic.mapper.DeviceMapper;
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.entity.FaceSampleEntity;
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;
@ -16,8 +15,13 @@ 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;
import com.ycwl.basic.repository.TemplateRepository;
import com.ycwl.basic.service.task.TaskFaceService;
import com.ycwl.basic.service.task.TaskService;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
@ -28,6 +32,12 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME;
@Component
@EnableScheduling
@ -45,6 +55,14 @@ public class DynamicTaskGenerator {
private TaskService taskService;
@Autowired
private TemplateBiz templateBiz;
@Autowired
private FaceSampleMapper faceSampleMapper;
@Autowired
private ScenicRepository scenicRepository;
@Autowired
private TemplateRepository templateRepository;
@Autowired
private FaceRepository faceRepository;
@Scheduled(cron = "0 0 * * * ?")
public void dynamicTask() {
@ -113,4 +131,83 @@ public class DynamicTaskGenerator {
}
}
}
@Data
@AllArgsConstructor
public static class Task implements Delayed {
public Long faceSampleId;
public Date startTime;
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(startTime.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(this.getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));
}
}
public static DelayQueue<Task> queue = new DelayQueue<>();
public static void addTask(Long faceSampleId) {
Date createTime = new Date();
// 两分钟后
createTime.setTime(createTime.getTime() + 120000L);
queue.add(new Task(faceSampleId, createTime));
}
@Scheduled(fixedRate = 30000L)
public void doTask() {
Task task = queue.poll();
if (task == null) {
return;
}
log.info("开始执行任务:{}", task);
// 根据人脸照片获取人脸样本ID
FaceSampleRespVO faceSample = faceSampleMapper.getById(task.getFaceSampleId());
if (faceSample == null) {
log.info("人脸样本ID{}不存在", task.getFaceSampleId());
return;
}
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(faceSample.getScenicId());
if (scenicConfig == null) {
log.info("当前景区{},无配置", faceSample.getScenicId());
return;
}
if (!Integer.valueOf(1).equals(scenicConfig.getBookRoutine()) && !Integer.valueOf(3).equals(scenicConfig.getBookRoutine())) {
log.info("当前景区{}未启用预约流程,跳过", faceSample.getScenicId());
return;
}
SearchFaceRespVo userDbSearchResult = faceService.searchFace(USER_FACE_DB_NAME, faceSample.getFaceUrl());
// 如果人脸样本ID在人脸样本库中则创建任务
if (!userDbSearchResult.getSampleListIds().isEmpty()) {
log.info("人脸样本ID在人脸样本库中创建任务{}", task);
// 找
List<Long> faceIdList = userDbSearchResult.getSampleListIds().stream().filter(faceId -> {
FaceEntity face = faceRepository.getFace(faceId);
if (face == null) {
return false;
}
return face.getScenicId().equals(faceSample.getScenicId());
}).collect(Collectors.toList());
if (faceIdList.isEmpty()) {
log.info("本景区人脸样本ID不在人脸样本库中忽略任务{}", task);
return;
}
List<TemplateRespVO> templateList = templateRepository.getTemplateListByScenicId(faceSample.getScenicId());
if (templateList == null || templateList.isEmpty()) {
log.info("当前景区{},无模板配置", faceSample.getScenicId());
return;
}
faceIdList.forEach(faceId -> {
log.info("自动下发任务人脸ID{}", faceId);
taskService.autoCreateTaskByFaceId(faceId);
});
} else {
log.info("人脸样本ID不在人脸样本库中忽略任务{}", task);
}
}
}