From 348a3801dfc2f136327b2a9071cb8a3fce1af886 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 27 Jan 2025 03:38:17 +0800 Subject: [PATCH] 2 --- .../java/com/ycwl/basic/biz/TemplateBiz.java | 68 ++++++++++++++++++- .../basic/model/pc/face/req/FaceReqQuery.java | 1 + .../service/impl/mobile/WxPayServiceImpl.java | 11 ++- .../service/impl/pc/FaceServiceImpl.java | 7 ++ .../task/impl/TaskTaskServiceImpl.java | 4 -- .../ycwl/basic/task/VideoTaskGenerator.java | 59 ++++++++++++++++ 6 files changed, 136 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/task/VideoTaskGenerator.java diff --git a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java index 277294e..a0be5fd 100644 --- a/src/main/java/com/ycwl/basic/biz/TemplateBiz.java +++ b/src/main/java/com/ycwl/basic/biz/TemplateBiz.java @@ -10,6 +10,7 @@ import com.ycwl.basic.model.pc.template.entity.TemplateConfigEntity; import com.ycwl.basic.repository.FaceRepository; import com.ycwl.basic.repository.SourceRepository; import com.ycwl.basic.repository.TemplateRepository; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -18,6 +19,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; +@Slf4j @Component public class TemplateBiz { @Autowired @@ -29,8 +31,11 @@ public class TemplateBiz { @Autowired private SourceRepository sourceRepository; - public boolean determineTemplateCanGenerate(Long templateId, Long faceId) { + return determineTemplateCanGenerate(templateId, faceId, true); + } + + public boolean determineTemplateCanGenerate(Long templateId, Long faceId, boolean scanSource) { List placeholderList = templateRepository.getTemplatePlaceholder(templateId); TemplateConfigEntity templateConfig = templateRepository.getTemplateConfig(templateId); int minimalPlaceholderFill = 1; @@ -47,8 +52,65 @@ public class TemplateBiz { if (faceSampleList.isEmpty()) { return false; } - List sourceEntities = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId); - long count = sourceEntities.stream().map(SourceEntity::getDeviceId).filter(deviceId -> placeholderList.contains(deviceId.toString())).count(); + long count; + if (scanSource) { + List sourceEntities = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId); + count = sourceEntities.stream() + .map(SourceEntity::getDeviceId) + .distinct() + .filter(deviceId -> placeholderList.contains(deviceId.toString())) + .count(); + } else { + count = faceSampleList.stream() + .map(FaceSampleEntity::getDeviceId) + .distinct() + .filter(deviceId -> placeholderList.contains(deviceId.toString())) + .count(); + } + return count >= minimalPlaceholderFill; + } + + public boolean determineTemplateCanAutoGenerate(Long templateId, Long faceId) { + return determineTemplateCanAutoGenerate(templateId, faceId, true); + } + + public boolean determineTemplateCanAutoGenerate(Long templateId, Long faceId, boolean scanSource) { + List placeholderList = templateRepository.getTemplatePlaceholder(templateId); + TemplateConfigEntity templateConfig = templateRepository.getTemplateConfig(templateId); + Integer minimalPlaceholderFill = null; + if (null != templateConfig) { + if (null != templateConfig.getAutomaticPlaceholderFill()) { + minimalPlaceholderFill = templateConfig.getAutomaticPlaceholderFill(); + } + } + if (minimalPlaceholderFill == null) { + // 未开启 + log.info("模板:{},未配置最小自动生成功能,默认不生成", templateId); + return false; + } + if (minimalPlaceholderFill <= 0) { + return true; + } + FaceEntity face = faceRepository.getFace(faceId); + List faceSampleList = faceRepository.getFaceSampleList(faceId); + if (faceSampleList.isEmpty()) { + return false; + } + long count; + if (scanSource) { + List sourceEntities = sourceMapper.listVideoByScenicFaceRelation(face.getScenicId(), faceId); + count = sourceEntities.stream() + .map(SourceEntity::getDeviceId) + .distinct() + .filter(deviceId -> placeholderList.contains(deviceId.toString())) + .count(); + } else { + count = faceSampleList.stream() + .map(FaceSampleEntity::getDeviceId) + .distinct() + .filter(deviceId -> placeholderList.contains(deviceId.toString())) + .count(); + } return count >= minimalPlaceholderFill; } diff --git a/src/main/java/com/ycwl/basic/model/pc/face/req/FaceReqQuery.java b/src/main/java/com/ycwl/basic/model/pc/face/req/FaceReqQuery.java index cba2db3..cfe8d21 100644 --- a/src/main/java/com/ycwl/basic/model/pc/face/req/FaceReqQuery.java +++ b/src/main/java/com/ycwl/basic/model/pc/face/req/FaceReqQuery.java @@ -32,4 +32,5 @@ public class FaceReqQuery extends BaseQueryParameterReq { private String matchResult; private Date startTime; private Date endTime; + private Integer finishedJourney; } diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java index 976e16f..8ca2cf5 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java @@ -380,15 +380,12 @@ public class WxPayServiceImpl implements WxPayService { */ public String decryptToString(byte[] associatedData, byte[] nonce, String ciphertext) throws GeneralSecurityException, IOException { try { - Cipher cipher = Cipher.getInstance(HttpConstant.AES_GCM_NoPadding); - - SecretKeySpec key = new SecretKeySpec(wechatConfig.getKeyPath().getBytes(), HttpConstant.AES); - GCMParameterSpec spec = new GCMParameterSpec(NumberConstant.ONE_HUNDRED_TWENTY_EIGHT, nonce);// 规定为128 - + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + SecretKeySpec key = new SecretKeySpec(wechatConfig.getApiV3().getBytes(), "AES"); + GCMParameterSpec spec = new GCMParameterSpec(128, nonce); cipher.init(Cipher.DECRYPT_MODE, key, spec); cipher.updateAAD(associatedData); - - return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), String.valueOf(StandardCharsets.UTF_8)); + return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), StandardCharsets.UTF_8); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { throw new IllegalStateException(e); } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java index 4d7b782..68e2ba6 100644 --- a/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java @@ -170,6 +170,13 @@ public class FaceServiceImpl implements FaceService { faceEntity.setFaceUrl(faceUrl); faceEntity.setId(newFaceId); faceMapper.add(faceEntity); + } else { + //更新人脸 + FaceEntity faceEntity = new FaceEntity(); + faceEntity.setId(oldFaceId); + faceEntity.setFaceUrl(faceUrl); + faceMapper.update(faceEntity); + faceRepository.clearFaceCache(oldFaceId); } StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq(); statisticsRecordAddReq.setMemberId(userId); diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java index c21717a..fbf600c 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java @@ -371,10 +371,6 @@ public class TaskTaskServiceImpl implements TaskService { memberVideoEntity.setIsBuy(1); } memberVideoEntity.setVideoId(video.getId()); - // 已经生成了 - new Thread(() -> { - sendVideoGeneratedServiceNotification(list.get(0).getId(), face.getMemberId()); - }).start(); } } videoMapper.addRelation(memberVideoEntity); diff --git a/src/main/java/com/ycwl/basic/task/VideoTaskGenerator.java b/src/main/java/com/ycwl/basic/task/VideoTaskGenerator.java new file mode 100644 index 0000000..4260e28 --- /dev/null +++ b/src/main/java/com/ycwl/basic/task/VideoTaskGenerator.java @@ -0,0 +1,59 @@ +package com.ycwl.basic.task; + +import cn.hutool.core.date.DateUtil; +import com.ycwl.basic.biz.TemplateBiz; +import com.ycwl.basic.mapper.FaceMapper; +import com.ycwl.basic.mapper.FaceSampleMapper; +import com.ycwl.basic.mapper.TemplateMapper; +import com.ycwl.basic.model.pc.face.req.FaceReqQuery; +import com.ycwl.basic.model.pc.face.resp.FaceRespVO; +import com.ycwl.basic.model.task.resp.SearchFaceRespVo; +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.impl.TaskTaskServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +@EnableScheduling +@Component +public class VideoTaskGenerator { + @Autowired + private FaceMapper faceMapper; + @Autowired + private TaskFaceService taskFaceService; + @Autowired + private ScenicRepository scenicRepository; + @Autowired + private TemplateMapper templateMapper; + @Autowired + private TemplateBiz templateBiz; + @Autowired + private FaceSampleMapper faceSampleMapper; + @Autowired + private TaskTaskServiceImpl taskTaskService; + + @Scheduled(cron = "0 0 18 * * *") + public void generateVideoTask() { + // 指定,获取指定日期的未完成人脸样本,并生成任务 + Long scenicId = 3946669713328836608L; + Long templateId = 3947461229940969472L; + FaceReqQuery query = new FaceReqQuery(); + query.setScenicId(scenicId); + query.setStartTime(DateUtil.beginOfDay(new Date())); + query.setEndTime(DateUtil.endOfDay(new Date())); + List list = faceMapper.list(query); + list.stream().parallel().forEach(face -> { + taskFaceService.searchFace(face.getId()); + boolean canAutoGenerate = templateBiz.determineTemplateCanAutoGenerate(templateId, face.getId(), false); + if (canAutoGenerate) { + taskTaskService.autoCreateTaskByFaceId(face.getId()); + } + }); + } +}