From fe3bda28b4ba1da48df5e0bd3602ddc9c4c34b01 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Fri, 5 Dec 2025 21:41:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai-cam):=20=E5=A2=9E=E5=BC=BAAI=E6=91=84?= =?UTF-8?q?=E5=83=8F=E5=A4=B4=E4=BA=BA=E8=84=B8=E6=A3=80=E6=B5=8B=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入时间范围限制配置,支持按分钟设置检测窗口 - 创建DetectResult内部类,记录人脸检测的分数和时间信息 - 优化照片筛选逻辑,先按分数排序再应用时间范围过滤 - 更新设备类型名称,将"微单"改为"AI微单" - 增强日志记录,提供更详细的调试信息 --- src/main/java/com/ycwl/basic/biz/OrderBiz.java | 1 + .../basic/controller/mobile/AppOrderV2Controller.java | 10 +++++++++- .../com/ycwl/basic/repository/SourceRepository.java | 3 +++ .../basic/service/mobile/impl/GoodsServiceImpl.java | 7 +++++-- .../ycwl/basic/service/pc/impl/FaceServiceImpl.java | 5 +++-- .../ycwl/basic/service/pc/impl/OrderServiceImpl.java | 8 ++++++++ 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ycwl/basic/biz/OrderBiz.java b/src/main/java/com/ycwl/basic/biz/OrderBiz.java index bf6481dc..f1731a34 100644 --- a/src/main/java/com/ycwl/basic/biz/OrderBiz.java +++ b/src/main/java/com/ycwl/basic/biz/OrderBiz.java @@ -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: diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppOrderV2Controller.java b/src/main/java/com/ycwl/basic/controller/mobile/AppOrderV2Controller.java index 1793552f..706748ae 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppOrderV2Controller.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppOrderV2Controller.java @@ -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; diff --git a/src/main/java/com/ycwl/basic/repository/SourceRepository.java b/src/main/java/com/ycwl/basic/repository/SourceRepository.java index 324ea8e3..c070c1ce 100644 --- a/src/main/java/com/ycwl/basic/repository/SourceRepository.java +++ b/src/main/java/com/ycwl/basic/repository/SourceRepository.java @@ -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); diff --git a/src/main/java/com/ycwl/basic/service/mobile/impl/GoodsServiceImpl.java b/src/main/java/com/ycwl/basic/service/mobile/impl/GoodsServiceImpl.java index c24bcce3..22a35b49 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/impl/GoodsServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/mobile/impl/GoodsServiceImpl.java @@ -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("未知商品"); } 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 55936f21..ab168d68 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 @@ -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; diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java index c06a4203..ab4e47f7 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java @@ -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 videos = memberRelationRepository.listRelationByFaceAndTemplate(face.getId(), Long.valueOf(productItem.getProductId())); yield videos.getFirst().getVideoId();