feat(ai-cam): 增强AI摄像头人脸检测逻辑
All checks were successful
ZhenTu-BE/pipeline/head This commit looks good

- 引入时间范围限制配置,支持按分钟设置检测窗口
- 创建DetectResult内部类,记录人脸检测的分数和时间信息
- 优化照片筛选逻辑,先按分数排序再应用时间范围过滤
- 更新设备类型名称,将"微单"改为"AI微单"
- 增强日志记录,提供更详细的调试信息
This commit is contained in:
2025-12-05 21:41:30 +08:00
parent 66775ea48b
commit fe3bda28b4
6 changed files with 29 additions and 5 deletions

View File

@@ -220,6 +220,7 @@ public class OrderBiz {
break;
case 1: // 视频原素材
case 2: // 照片原素材
case 13: // AI微单
sourceRepository.setUserIsBuyItem(order.getMemberId(), item.getGoodsType(), item.getGoodsId(), order.getId());
break;
case 3:

View File

@@ -86,7 +86,7 @@ public class AppOrderV2Controller {
TaskEntity task = videoTaskRepository.getTaskById(video.getTaskId());
request.setFaceId(task.getFaceId());
}
case RECORDING_SET, PHOTO_SET -> request.setFaceId(Long.valueOf(productItem.getProductId()));
case RECORDING_SET, PHOTO_SET, AI_CAM_PHOTO_SET -> request.setFaceId(Long.valueOf(productItem.getProductId()));
}
}
@@ -119,6 +119,14 @@ public class AppOrderV2Controller {
Integer count = sourceMapper.countUser(sourceReqQuery);
product.setQuantity(count);
break;
case AI_CAM_PHOTO_SET:
SourceReqQuery aiPhotoSetReqQuery = new SourceReqQuery();
aiPhotoSetReqQuery.setMemberId(currentUserId);
aiPhotoSetReqQuery.setType(13);
aiPhotoSetReqQuery.setFaceId(face.getId());
Integer _count = sourceMapper.countUser(aiPhotoSetReqQuery);
product.setQuantity(_count);
break;
default:
log.warn("未知的商品类型,跳过重复购买检查: productType={}", product.getProductType());
break;

View File

@@ -41,6 +41,9 @@ public class SourceRepository {
}
public void setUserIsBuyItem(Long memberId, int type, Long faceId, Long orderId) {
if (type == 13) {
type = 3; // compact
}
MemberSourceEntity memberSource = new MemberSourceEntity();
memberSource.setMemberId(memberId);
memberSource.setFaceId(faceId);

View File

@@ -575,7 +575,7 @@ public class GoodsServiceImpl implements GoodsService {
if (query.getGoodsId() != null) {
list = list.stream().filter(source -> source.getId().equals(query.getGoodsId())).toList();
}
if (!Integer.valueOf(2).equals(query.getSourceType())) {
if (Integer.valueOf(1).equals(query.getSourceType())) {
return list.stream().map(source -> {
GoodsUrlVO goodsUrlVO = new GoodsUrlVO();
goodsUrlVO.setGoodsType(source.getType());
@@ -594,7 +594,7 @@ public class GoodsServiceImpl implements GoodsService {
}
return true;
}).count();
IsBuyRespVO isBuy = orderBiz.isBuy(face.getScenicId(), face.getMemberId(), face.getId(), query.getSourceType(), face.getId());
IsBuyRespVO isBuy = orderBiz.isBuy(face.getScenicId(), face.getMemberId(), face.getId(), sourceType == 3 ? 13 : sourceType, face.getId());
if (count > 0) {
if (!isBuy.isBuy()) {
return Collections.emptyList();
@@ -831,6 +831,9 @@ public class GoodsServiceImpl implements GoodsService {
} else if (type == 2) {
goodsPageVO.setGoodsName("照片集");
goodsPageVO.setTemplateCoverUrl(scenicConfig.getString("photo_cover_url"));
} else if (type == 3) {
goodsPageVO.setGoodsName("AI微单");
goodsPageVO.setTemplateCoverUrl(scenicConfig.getString("ai_camera_cover_url"));
} else {
goodsPageVO.setGoodsName("未知商品");
}

View File

@@ -558,6 +558,7 @@ public class FaceServiceImpl implements FaceService {
sourceVideoContent.setGroup("直出原片");
sourceImageContent.setGroup("直出原片");
sourceAiCamContent.setGroup("直出原片");
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(face.getScenicId());
if (!scenicConfigFacade.isDisableSourceImage(face.getScenicId())) {
IsBuyRespVO isBuyRespVO = orderBiz.isBuy(face.getScenicId(), userId, faceId, SourceType.IMAGE.getCode(), faceId);
sourceImageContent.setSourceType(isBuyRespVO.getGoodsType());
@@ -599,7 +600,7 @@ public class FaceServiceImpl implements FaceService {
// AI微单:只有存在type=3的数据时才添加
boolean hasAiCam = sourceList.stream().anyMatch(source -> source.getType() == 3);
if (hasAiCam) {
IsBuyRespVO isBuyRespVO = orderBiz.isBuy(face.getScenicId(), userId, faceId, SourceType.AI_CAM.getCode(), faceId);
IsBuyRespVO isBuyRespVO = orderBiz.isBuy(face.getScenicId(), userId, faceId, 13, faceId);
sourceAiCamContent.setSourceType(isBuyRespVO.getGoodsType());
sourceAiCamContent.setContentId(isBuyRespVO.getGoodsId());
if (isBuyRespVO.isBuy()) {
@@ -629,7 +630,7 @@ public class FaceServiceImpl implements FaceService {
} else if (type == 3) {
sourceAiCamContent.setSourceType(13);
sourceAiCamContent.setLockType(-1);
sourceAiCamContent.setTemplateCoverUrl(list.getFirst().getUrl());
sourceAiCamContent.setTemplateCoverUrl(configManager.getString("ai_camera_cover_url"));
}
});
return contentList;

View File

@@ -177,6 +177,9 @@ public class OrderServiceImpl implements OrderService {
} else if (Integer.valueOf(2).equals(orderItemList.getFirst().getGoodsType())) {
item.setGoodsName("照片集");
item.setOrderType("照片集");
} else if (Integer.valueOf(3).equals(orderItemList.getFirst().getGoodsType())) {
item.setGoodsName("AI微单");
item.setOrderType("AI微单");
} else if (Integer.valueOf(0).equals(orderItemList.getFirst().getGoodsType())) {
item.setOrderType("旅行Vlog");
item.setGoodsName(orderItemList.getFirst().getGoodsName());
@@ -237,6 +240,9 @@ public class OrderServiceImpl implements OrderService {
} else if (Integer.valueOf(2).equals(orderItemList.getFirst().getGoodsType())) {
item.setGoodsName("照片集");
item.setOrderType("照片集");
} else if (Integer.valueOf(3).equals(orderItemList.getFirst().getGoodsType())) {
item.setGoodsName("AI微单");
item.setOrderType("AI微单");
} else if (Integer.valueOf(0).equals(orderItemList.getFirst().getGoodsType())) {
item.setOrderType("旅行Vlog");
item.setGoodsName(orderItemList.getFirst().getGoodsName());
@@ -940,11 +946,13 @@ public class OrderServiceImpl implements OrderService {
case PHOTO_SET -> 2;
case VLOG_VIDEO -> 0;
case RECORDING_SET -> 1;
case AI_CAM_PHOTO_SET -> 13;
default -> 0;
};
Long goodsId = switch (productItem.getProductType()) {
case PHOTO_LOG -> Long.valueOf(productItem.getProductId());
case PHOTO_SET, RECORDING_SET -> face.getId();
case AI_CAM_PHOTO_SET -> face.getId();
case VLOG_VIDEO -> {
List<MemberVideoEntity> videos = memberRelationRepository.listRelationByFaceAndTemplate(face.getId(), Long.valueOf(productItem.getProductId()));
yield videos.getFirst().getVideoId();