feat(puzzle): 更新拼图生成中的日期显示逻辑

- 在PuzzleGenerationOrchestrator中注入SourceMapper依赖
- 新增getMaxCreateTimeByFaceId方法查询图片素材最大创建时间
- 修改拼图模板生成逻辑使用图片素材最大创建时间作为dateStr值
- 移除硬编码当前日期,改为基于实际素材时间
- 更新FaceMatchingOrchestrator中相同的日期处理逻辑
- 从跳过重复检测的元素键集合中移除dateStr字段
This commit is contained in:
2026-02-20 20:11:11 +08:00
parent 39c955b55c
commit 7454111615
5 changed files with 29 additions and 3 deletions

View File

@@ -2,6 +2,7 @@ package com.ycwl.basic.face.pipeline.helper;
import cn.hutool.core.date.DateUtil;
import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO;
import com.ycwl.basic.mapper.SourceMapper;
import com.ycwl.basic.puzzle.dto.PuzzleGenerateRequest;
import com.ycwl.basic.puzzle.dto.PuzzleGenerateResponse;
import com.ycwl.basic.puzzle.dto.PuzzleTemplateDTO;
@@ -44,6 +45,9 @@ public class PuzzleGenerationOrchestrator {
@Autowired
private ScenicRepository scenicRepository;
@Autowired
private SourceMapper sourceMapper;
/**
* 异步生成景区所有启用的拼图模板
*
@@ -74,6 +78,11 @@ public class PuzzleGenerationOrchestrator {
// 3. 准备公共动态数据
Map<String, String> baseDynamicData = buildBaseDynamicData(faceId, faceUrl, scenicBasic);
// 4. 设置dateStr为图片素材的最大创建时间
Date maxCreateTime = sourceMapper.getMaxCreateTimeByFaceId(faceId);
baseDynamicData.put("dateStr", DateUtil.format(
maxCreateTime != null ? maxCreateTime : new Date(), "yyyy.MM.dd"));
// 4. 使用虚拟线程池并行生成所有模板
java.util.concurrent.atomic.AtomicInteger successCount = new java.util.concurrent.atomic.AtomicInteger(0);
java.util.concurrent.atomic.AtomicInteger failCount = new java.util.concurrent.atomic.AtomicInteger(0);
@@ -121,7 +130,6 @@ public class PuzzleGenerationOrchestrator {
baseDynamicData.put("faceId", String.valueOf(faceId));
baseDynamicData.put("scenicName", scenicBasic.getName());
baseDynamicData.put("scenicText", scenicBasic.getName());
baseDynamicData.put("dateStr", DateUtil.format(new Date(), "yyyy.MM.dd"));
return baseDynamicData;
}

View File

@@ -143,6 +143,13 @@ public interface SourceMapper {
*/
List<Long> getDeviceIdsByFaceId(Long faceId);
/**
* 获取faceId关联的图片素材的最大创建时间
* @param faceId 人脸ID
* @return 最大创建时间,无记录时返回null
*/
Date getMaxCreateTimeByFaceId(Long faceId);
/**
* 根据faceId和设备ID获取source
* @param faceId 人脸ID

View File

@@ -25,7 +25,7 @@ import java.util.stream.Collectors;
@Component
@RequiredArgsConstructor
public class PuzzleDuplicationDetector {
private final Set<String> skippedElementKeys = Set.of("dateStr");
private final Set<String> skippedElementKeys = Set.of();
private final PuzzleGenerationRecordMapper recordMapper;
/**

View File

@@ -405,7 +405,9 @@ public class FaceMatchingOrchestrator {
baseDynamicData.put("faceId", String.valueOf(faceId));
baseDynamicData.put("scenicName", scenicBasic.getName());
baseDynamicData.put("scenicText", scenicBasic.getName());
baseDynamicData.put("dateStr", DateUtil.format(new Date(), "yyyy.MM.dd"));
Date maxCreateTime = sourceMapper.getMaxCreateTimeByFaceId(faceId);
baseDynamicData.put("dateStr", DateUtil.format(
maxCreateTime != null ? maxCreateTime : new Date(), "yyyy.MM.dd"));
templateList
.forEach(template -> {

View File

@@ -464,6 +464,15 @@
ORDER BY s.device_id ASC
</select>
<select id="getMaxCreateTimeByFaceId" resultType="java.util.Date">
SELECT MAX(s.create_time)
FROM member_source ms
INNER JOIN source s ON ms.source_id = s.id
WHERE ms.face_id = #{faceId}
AND s.type = 2
AND ms.deleted = 0
</select>
<select id="getSourceByFaceAndDeviceId" resultType="com.ycwl.basic.model.pc.source.entity.SourceEntity">
SELECT s.*
FROM source s