From ceaf10977dbf5d55b6a7bcda3b8b5e267f6a3692 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 21 Jul 2025 14:04:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=81=E7=85=A7=E7=89=87?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E9=80=81=E5=8E=9F=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ycwl/basic/mapper/SourceMapper.java | 1 + .../pc/scenic/entity/ScenicConfigEntity.java | 1 + .../service/pc/impl/FaceServiceImpl.java | 52 +++++++++---------- .../com/ycwl/basic/task/VideoPieceGetter.java | 31 +++++++++++ src/main/resources/mapper/ScenicMapper.xml | 3 +- src/main/resources/mapper/SourceMapper.xml | 8 +++ 6 files changed, 69 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/ycwl/basic/mapper/SourceMapper.java b/src/main/java/com/ycwl/basic/mapper/SourceMapper.java index 17bb9f9..b664447 100644 --- a/src/main/java/com/ycwl/basic/mapper/SourceMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/SourceMapper.java @@ -57,6 +57,7 @@ public interface SourceMapper { int addRelations(List list); int updateRelation(MemberSourceEntity memberSourceEntity); + int freeRelations(List ids, int type); List queryByRelation(SourceReqQuery sourceReqQuery); diff --git a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java index 2fabd67..4be6a60 100644 --- a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java @@ -95,4 +95,5 @@ public class ScenicConfigEntity { private String extraNotificationTime; private Integer photoFreeNum; + private Integer videoFreeNum; } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java index 68a3a26..9eecaa9 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java @@ -44,6 +44,7 @@ import com.ycwl.basic.service.task.TaskService; import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.utils.StorageUtil; +import com.ycwl.basic.task.VideoPieceGetter; import com.ycwl.basic.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -303,33 +304,34 @@ public class FaceServiceImpl implements FaceService { } return memberSourceEntity; }).collect(Collectors.toList()); + List freeSourceIds = new ArrayList<>(); + List photoSource = memberSourceEntityList.stream().filter(item -> item.getIsFree() == 0).filter(item -> Integer.valueOf(2).equals(item.getType())).toList(); if (isNew) { + // 送照片逻辑 if (scenicConfig != null && scenicConfig.getPhotoFreeNum() != null && scenicConfig.getPhotoFreeNum() > 0) { - List randInt = new ArrayList<>(); - if (scenicConfig.getPhotoFreeNum() > memberSourceEntityList.size()) { - for (MemberSourceEntity memberSourceEntity : memberSourceEntityList) { - memberSourceEntity.setIsFree(1); - } + if (scenicConfig.getPhotoFreeNum() > photoSource.size()) { + freeSourceIds.addAll(photoSource.stream().map(MemberSourceEntity::getSourceId).toList()); } else { - for (int i = 0; i < scenicConfig.getPhotoFreeNum(); i++) { - // 随机 - Integer idx; - while (true) { - idx = new Random().nextInt(memberSourceEntityList.size()); - if (!randInt.contains(idx)) { - randInt.add(idx); - break; - } - } - memberSourceEntityList.get(idx).setIsFree(1); - } + freeSourceIds.addAll(photoSource.stream().limit(scenicConfig.getPhotoFreeNum()).map(MemberSourceEntity::getSourceId).toList()); } } } else { - List sourceEntitiesExist = sourceMapper.listByFaceRelation(face.getMemberId(), faceId, 2); - memberSourceEntityList = memberSourceEntityList.stream().filter(memberSourceEntity -> { - return sourceEntitiesExist.stream().noneMatch(sourceEntity -> sourceEntity.getSourceId().equals(memberSourceEntity.getSourceId())); - }).toList(); + // 重新切视频逻辑 + if (scenicConfig != null && !Integer.valueOf(1).equals(scenicConfig.getDisableSourceVideo())) { + long videoCount = memberSourceEntityList.stream().filter(item -> item.getType().equals(1)).count(); + long photoCount = memberSourceEntityList.stream().filter(item -> item.getType().equals(2)).count(); + if (photoCount > videoCount) { + VideoPieceGetter.Task task = new VideoPieceGetter.Task(); + task.faceId = faceId; + task.faceSampleIds = sampleListIds; + task.templateId = null; + task.memberId = face.getMemberId(); + task.callback = () -> { + log.info("task callback: {}", task); + }; + VideoPieceGetter.addTask(task); + } + } } if (!memberSourceEntityList.isEmpty()) { IsBuyRespVO isBuy = orderBiz.isBuy(face.getMemberId(), face.getScenicId(), memberSourceEntityList.getFirst().getType(), faceEntity.getId()); @@ -341,14 +343,12 @@ public class FaceServiceImpl implements FaceService { } else { memberSourceEntity.setIsBuy(0); } + if (freeSourceIds.contains(memberSourceEntity.getSourceId())) { + memberSourceEntity.setIsFree(1); + } } sourceMapper.addRelations(memberSourceEntityList); taskTaskService.autoCreateTaskByFaceId(face.getId()); -// VideoPieceGetter.Task task = new VideoPieceGetter.Task(); -// task.faceId = face.getId(); -// task.faceSampleIds = sampleListIds; -// task.memberId = face.getMemberId(); -// VideoPieceGetter.addTask(task); } } return scenicDbSearchResult; diff --git a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java index 7051a77..f8bd89e 100644 --- a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java +++ b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java @@ -7,7 +7,9 @@ import com.ycwl.basic.constant.StorageConstant; import com.ycwl.basic.device.DeviceFactory; import com.ycwl.basic.device.entity.common.FileObject; import com.ycwl.basic.device.operator.IDeviceStorageOperator; +import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; +import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.repository.DeviceRepository; import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.SourceMapper; @@ -16,6 +18,8 @@ import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity; +import com.ycwl.basic.repository.FaceRepository; +import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.repository.TemplateRepository; import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.adapters.IStorageAdapter; @@ -57,6 +61,8 @@ public class VideoPieceGetter { @Autowired private FaceSampleMapper faceSampleMapper; @Autowired + private FaceRepository faceRepository; + @Autowired private DeviceRepository deviceRepository; @Autowired private SourceMapper sourceMapper; @@ -68,6 +74,8 @@ public class VideoPieceGetter { private TaskStatusBiz taskStatusBiz; @Autowired private VideoReUploader videoReUploader; + @Autowired + private ScenicRepository scenicRepository; @Data public static class Task { @@ -220,6 +228,29 @@ public class VideoPieceGetter { task.getCallback().onInvoke(); } } + if (task.getFaceId() != null) { + FaceEntity face = faceRepository.getFace(task.getFaceId()); + if (face != null) { + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId()); + if (scenicConfig != null) { + // 免费送 + List sourceEntities = sourceMapper.listByFaceRelation(face.getScenicId(), face.getId(), 1); + if (sourceEntities.stream().noneMatch(item -> Integer.valueOf(1).equals(item.getIsFree()))) { + List freeSourceRelationIds = new ArrayList<>(); + if (scenicConfig.getVideoFreeNum() != null && scenicConfig.getVideoFreeNum() > 0) { + if (scenicConfig.getVideoFreeNum() > sourceEntities.size()) { + freeSourceRelationIds.addAll(sourceEntities.stream().map(MemberSourceEntity::getId).toList()); + } else { + freeSourceRelationIds.addAll(sourceEntities.stream().limit(scenicConfig.getVideoFreeNum()).map(MemberSourceEntity::getId).toList()); + } + } + if (!freeSourceRelationIds.isEmpty()) { + sourceMapper.freeRelations(freeSourceRelationIds, 1); + } + } + } + } + } } private boolean doCut(Long deviceId, Long faceSampleId, Date baseTime, Task task) { diff --git a/src/main/resources/mapper/ScenicMapper.xml b/src/main/resources/mapper/ScenicMapper.xml index 52d297c..29b7c85 100644 --- a/src/main/resources/mapper/ScenicMapper.xml +++ b/src/main/resources/mapper/ScenicMapper.xml @@ -127,7 +127,8 @@ image_source_pack_hint=#{imageSourcePackHint}, video_source_pack_hint=#{videoSourcePackHint}, extra_notification_time=#{extraNotificationTime}, - photo_free_num= #{photoFreeNum} + photo_free_num= #{photoFreeNum}, + video_free_num= #{videoFreeNum} where id = #{id} diff --git a/src/main/resources/mapper/SourceMapper.xml b/src/main/resources/mapper/SourceMapper.xml index 5dfedb3..cfe1545 100644 --- a/src/main/resources/mapper/SourceMapper.xml +++ b/src/main/resources/mapper/SourceMapper.xml @@ -42,6 +42,14 @@ where member_id = #{memberId} and face_id = #{faceId} and `type` = #{type} + + update member_source + set is_free = 1 + where type = #{type} and id in + + #{item} + + delete from source where id = #{id}