修复送照片,支持送原片

This commit is contained in:
2025-07-21 14:04:19 +08:00
parent a5a7957f9e
commit ceaf10977d
6 changed files with 69 additions and 27 deletions

View File

@@ -57,6 +57,7 @@ public interface SourceMapper {
int addRelations(List<MemberSourceEntity> list); int addRelations(List<MemberSourceEntity> list);
int updateRelation(MemberSourceEntity memberSourceEntity); int updateRelation(MemberSourceEntity memberSourceEntity);
int freeRelations(List<Long> ids, int type);
List<SourceRespVO> queryByRelation(SourceReqQuery sourceReqQuery); List<SourceRespVO> queryByRelation(SourceReqQuery sourceReqQuery);

View File

@@ -95,4 +95,5 @@ public class ScenicConfigEntity {
private String extraNotificationTime; private String extraNotificationTime;
private Integer photoFreeNum; private Integer photoFreeNum;
private Integer videoFreeNum;
} }

View File

@@ -44,6 +44,7 @@ import com.ycwl.basic.service.task.TaskService;
import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.adapters.IStorageAdapter;
import com.ycwl.basic.storage.utils.StorageUtil; import com.ycwl.basic.storage.utils.StorageUtil;
import com.ycwl.basic.task.VideoPieceGetter;
import com.ycwl.basic.utils.*; import com.ycwl.basic.utils.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -303,33 +304,34 @@ public class FaceServiceImpl implements FaceService {
} }
return memberSourceEntity; return memberSourceEntity;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
List<Long> freeSourceIds = new ArrayList<>();
List<MemberSourceEntity> photoSource = memberSourceEntityList.stream().filter(item -> item.getIsFree() == 0).filter(item -> Integer.valueOf(2).equals(item.getType())).toList();
if (isNew) { if (isNew) {
// 送照片逻辑
if (scenicConfig != null && scenicConfig.getPhotoFreeNum() != null && scenicConfig.getPhotoFreeNum() > 0) { if (scenicConfig != null && scenicConfig.getPhotoFreeNum() != null && scenicConfig.getPhotoFreeNum() > 0) {
List<Integer> randInt = new ArrayList<>(); if (scenicConfig.getPhotoFreeNum() > photoSource.size()) {
if (scenicConfig.getPhotoFreeNum() > memberSourceEntityList.size()) { freeSourceIds.addAll(photoSource.stream().map(MemberSourceEntity::getSourceId).toList());
for (MemberSourceEntity memberSourceEntity : memberSourceEntityList) {
memberSourceEntity.setIsFree(1);
}
} else { } else {
for (int i = 0; i < scenicConfig.getPhotoFreeNum(); i++) { freeSourceIds.addAll(photoSource.stream().limit(scenicConfig.getPhotoFreeNum()).map(MemberSourceEntity::getSourceId).toList());
// 随机
Integer idx;
while (true) {
idx = new Random().nextInt(memberSourceEntityList.size());
if (!randInt.contains(idx)) {
randInt.add(idx);
break;
}
}
memberSourceEntityList.get(idx).setIsFree(1);
}
} }
} }
} else { } else {
List<MemberSourceEntity> sourceEntitiesExist = sourceMapper.listByFaceRelation(face.getMemberId(), faceId, 2); // 重新切视频逻辑
memberSourceEntityList = memberSourceEntityList.stream().filter(memberSourceEntity -> { if (scenicConfig != null && !Integer.valueOf(1).equals(scenicConfig.getDisableSourceVideo())) {
return sourceEntitiesExist.stream().noneMatch(sourceEntity -> sourceEntity.getSourceId().equals(memberSourceEntity.getSourceId())); long videoCount = memberSourceEntityList.stream().filter(item -> item.getType().equals(1)).count();
}).toList(); 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()) { if (!memberSourceEntityList.isEmpty()) {
IsBuyRespVO isBuy = orderBiz.isBuy(face.getMemberId(), face.getScenicId(), memberSourceEntityList.getFirst().getType(), faceEntity.getId()); IsBuyRespVO isBuy = orderBiz.isBuy(face.getMemberId(), face.getScenicId(), memberSourceEntityList.getFirst().getType(), faceEntity.getId());
@@ -341,14 +343,12 @@ public class FaceServiceImpl implements FaceService {
} else { } else {
memberSourceEntity.setIsBuy(0); memberSourceEntity.setIsBuy(0);
} }
if (freeSourceIds.contains(memberSourceEntity.getSourceId())) {
memberSourceEntity.setIsFree(1);
}
} }
sourceMapper.addRelations(memberSourceEntityList); sourceMapper.addRelations(memberSourceEntityList);
taskTaskService.autoCreateTaskByFaceId(face.getId()); 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; return scenicDbSearchResult;

View File

@@ -7,7 +7,9 @@ import com.ycwl.basic.constant.StorageConstant;
import com.ycwl.basic.device.DeviceFactory; import com.ycwl.basic.device.DeviceFactory;
import com.ycwl.basic.device.entity.common.FileObject; import com.ycwl.basic.device.entity.common.FileObject;
import com.ycwl.basic.device.operator.IDeviceStorageOperator; 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.faceSample.entity.FaceSampleEntity;
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
import com.ycwl.basic.repository.DeviceRepository; import com.ycwl.basic.repository.DeviceRepository;
import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.FaceSampleMapper;
import com.ycwl.basic.mapper.SourceMapper; 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.device.entity.DeviceEntity;
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.repository.FaceRepository;
import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.repository.TemplateRepository; import com.ycwl.basic.repository.TemplateRepository;
import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.adapters.IStorageAdapter;
@@ -57,6 +61,8 @@ public class VideoPieceGetter {
@Autowired @Autowired
private FaceSampleMapper faceSampleMapper; private FaceSampleMapper faceSampleMapper;
@Autowired @Autowired
private FaceRepository faceRepository;
@Autowired
private DeviceRepository deviceRepository; private DeviceRepository deviceRepository;
@Autowired @Autowired
private SourceMapper sourceMapper; private SourceMapper sourceMapper;
@@ -68,6 +74,8 @@ public class VideoPieceGetter {
private TaskStatusBiz taskStatusBiz; private TaskStatusBiz taskStatusBiz;
@Autowired @Autowired
private VideoReUploader videoReUploader; private VideoReUploader videoReUploader;
@Autowired
private ScenicRepository scenicRepository;
@Data @Data
public static class Task { public static class Task {
@@ -220,6 +228,29 @@ public class VideoPieceGetter {
task.getCallback().onInvoke(); 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<MemberSourceEntity> sourceEntities = sourceMapper.listByFaceRelation(face.getScenicId(), face.getId(), 1);
if (sourceEntities.stream().noneMatch(item -> Integer.valueOf(1).equals(item.getIsFree()))) {
List<Long> 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) { private boolean doCut(Long deviceId, Long faceSampleId, Date baseTime, Task task) {

View File

@@ -127,7 +127,8 @@
image_source_pack_hint=#{imageSourcePackHint}, image_source_pack_hint=#{imageSourcePackHint},
video_source_pack_hint=#{videoSourcePackHint}, video_source_pack_hint=#{videoSourcePackHint},
extra_notification_time=#{extraNotificationTime}, extra_notification_time=#{extraNotificationTime},
photo_free_num= #{photoFreeNum} photo_free_num= #{photoFreeNum},
video_free_num= #{videoFreeNum}
</set> </set>
where id = #{id} where id = #{id}
</update> </update>

View File

@@ -42,6 +42,14 @@
</set> </set>
where member_id = #{memberId} and face_id = #{faceId} and `type` = #{type} where member_id = #{memberId} and face_id = #{faceId} and `type` = #{type}
</update> </update>
<update id="freeRelations">
update member_source
set is_free = 1
where type = #{type} and id in
<foreach item="item" collection="ids" open="(" separator="," close=")">
#{item}
</foreach>
</update>
<delete id="deleteById"> <delete id="deleteById">
delete from source where id = #{id} delete from source where id = #{id}
</delete> </delete>