feat(face): 添加摄影师拍照功能支持

- 在ContentPageVO中新增origUrl字段用于存储原始图片地址
- 集成DeviceV2DTO设备数据结构支持摄影师设备管理
- 添加SourceRepository依赖注入实现资源数据访问
- 实现景区模式2下的摄影师拍照内容展示逻辑
- 支持按设备分组显示摄影师拍摄的照片内容
- 添加摄影师拍照相关的购买状态和锁定类型控制
- 更新人脸识别页面查询返回摄影师拍摄的内容列表
- 优化景区配置管理器变量
This commit is contained in:
2026-02-13 20:06:23 +08:00
parent 383f9c4a31
commit 90fb0df69c
2 changed files with 67 additions and 10 deletions

View File

@@ -25,6 +25,7 @@ public class ContentPageVO {
private int lockType; private int lockType;
// 内容id contentType为0或1时才有值 // 内容id contentType为0或1时才有值
private Long contentId; private Long contentId;
private String origUrl;
private String videoUrl; private String videoUrl;
// 模版id // 模版id
private Long templateId; private Long templateId;

View File

@@ -12,6 +12,7 @@ import com.ycwl.basic.face.pipeline.enums.FaceMatchingScene;
import com.ycwl.basic.face.pipeline.factory.FaceMatchingPipelineFactory; import com.ycwl.basic.face.pipeline.factory.FaceMatchingPipelineFactory;
import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter;
import com.ycwl.basic.facebody.entity.SearchFaceResultItem; import com.ycwl.basic.facebody.entity.SearchFaceResultItem;
import com.ycwl.basic.integration.device.dto.device.DeviceV2DTO;
import com.ycwl.basic.mapper.FaceSampleMapper; import com.ycwl.basic.mapper.FaceSampleMapper;
import com.ycwl.basic.mapper.ProjectMapper; import com.ycwl.basic.mapper.ProjectMapper;
import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.mapper.SourceMapper;
@@ -60,6 +61,7 @@ import com.ycwl.basic.repository.FaceRepository;
import com.ycwl.basic.repository.MemberRelationRepository; import com.ycwl.basic.repository.MemberRelationRepository;
import com.ycwl.basic.repository.OrderRepository; import com.ycwl.basic.repository.OrderRepository;
import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.repository.SourceRepository;
import com.ycwl.basic.repository.TemplateRepository; import com.ycwl.basic.repository.TemplateRepository;
import com.ycwl.basic.repository.VideoRepository; import com.ycwl.basic.repository.VideoRepository;
import com.ycwl.basic.repository.VideoTaskRepository; import com.ycwl.basic.repository.VideoTaskRepository;
@@ -210,6 +212,8 @@ public class FaceServiceImpl implements FaceService {
private OrderRepository orderRepository; private OrderRepository orderRepository;
@Autowired @Autowired
private com.ycwl.basic.biz.FaceStatusManager faceStatusManager; private com.ycwl.basic.biz.FaceStatusManager faceStatusManager;
@Autowired
private SourceRepository sourceRepository;
@Override @Override
public ApiResponse<PageInfo<FaceRespVO>> pageQuery(FaceReqQuery faceReqQuery) { public ApiResponse<PageInfo<FaceRespVO>> pageQuery(FaceReqQuery faceReqQuery) {
@@ -472,7 +476,47 @@ public class FaceServiceImpl implements FaceService {
if (face == null) { if (face == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
Long userId = face.getMemberId(); Long userId = Long.parseLong(BaseContextHandler.getUserId());
ScenicConfigManager scenicConfig = scenicRepository.getScenicConfigManager(face.getScenicId());
if (Integer.valueOf(2).equals(scenicConfig.getInteger("scenic_mode", 0))) {
List<ContentPageVO> result = new ArrayList<>();
// 摄影师拍照
List<DeviceV2DTO> deviceList = deviceRepository.getAllDeviceByScenicId(face.getScenicId());
List<SourceEntity> sourceEntityList = sourceMapper.listSourceByFaceRelation(face.getId(), 2);
for (SourceEntity sourceEntity : sourceEntityList) {
ContentPageVO content = new ContentPageVO();
content.setName("摄影师拍照");
deviceList.stream().filter(device -> device.getId().equals(sourceEntity.getDeviceId())).findFirst().ifPresent(device -> {
content.setGroup(device.getName());
});
content.setContentId(sourceEntity.getId());
content.setGoodsType(2);
content.setContentType(2);
content.setScenicId(sourceEntity.getScenicId());
content.setSourceType(2);
content.setOrigUrl(sourceEntity.getUrl());
content.setTemplateCoverUrl(sourceEntity.getThumbUrl());
content.setIsBuy(sourceEntity.getIsBuy());
content.setLockType(-1);
result.add(content);
}
List<Long> containedDeviceId = sourceEntityList.stream().map(SourceEntity::getDeviceId).filter(Objects::nonNull).distinct().toList();
deviceList.stream().filter(device -> !containedDeviceId.contains(device.getId())).forEach(device -> {
ContentPageVO content = new ContentPageVO();
content.setName(device.getName());
content.setGroup(device.getName());
content.setContentId(device.getId());
content.setGoodsType(2);
content.setContentType(2);
content.setScenicId(face.getScenicId());
content.setSourceType(2);
content.setTemplateCoverUrl("");
content.setIsBuy(0);
content.setLockType(1);
result.add(content);
});
return result;
}
List<TemplateRespVO> templateList = templateRepository.getTemplateListByScenicId(face.getScenicId()); List<TemplateRespVO> templateList = templateRepository.getTemplateListByScenicId(face.getScenicId());
List<ContentPageVO> contentList = templateList.stream().map(template -> { List<ContentPageVO> contentList = templateList.stream().map(template -> {
/// select t.id templateId, t.scenic_id, t.`group`, t.`name`, pid, t.cover_url templateCoverUrl, /// select t.id templateId, t.scenic_id, t.`group`, t.`name`, pid, t.cover_url templateCoverUrl,
@@ -607,7 +651,6 @@ public class FaceServiceImpl implements FaceService {
sourceVideoContent.setGroup("直出原片"); sourceVideoContent.setGroup("直出原片");
sourceImageContent.setGroup("直出原片"); sourceImageContent.setGroup("直出原片");
sourceAiCamContent.setGroup("智能连连拍"); sourceAiCamContent.setGroup("智能连连拍");
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(face.getScenicId());
if (!scenicConfigFacade.isDisableSourceImage(face.getScenicId())) { if (!scenicConfigFacade.isDisableSourceImage(face.getScenicId())) {
IsBuyRespVO isBuyRespVO = orderBiz.isBuy(face.getScenicId(), userId, faceId, SourceType.IMAGE.getCode(), faceId); IsBuyRespVO isBuyRespVO = orderBiz.isBuy(face.getScenicId(), userId, faceId, SourceType.IMAGE.getCode(), faceId);
sourceImageContent.setSourceType(isBuyRespVO.getGoodsType()); sourceImageContent.setSourceType(isBuyRespVO.getGoodsType());
@@ -679,7 +722,7 @@ public class FaceServiceImpl implements FaceService {
} else if (type == 3) { } else if (type == 3) {
sourceAiCamContent.setSourceType(13); sourceAiCamContent.setSourceType(13);
sourceAiCamContent.setLockType(-1); sourceAiCamContent.setLockType(-1);
sourceAiCamContent.setTemplateCoverUrl(configManager.getString("ai_camera_cover_url")); sourceAiCamContent.setTemplateCoverUrl(scenicConfig.getString("ai_camera_cover_url"));
} }
}); });
return contentList; return contentList;
@@ -793,6 +836,18 @@ public class FaceServiceImpl implements FaceService {
} }
return statusResp; return statusResp;
} }
if (Integer.valueOf(2).equals(scenicConfig.getInteger("scenic_mode", 0))) {
// 摄影模式
if (!countUser.isEmpty()) {
statusResp.setStep3Status(true);
statusResp.setDisplayText("帧途AI已为您记录" + countUser.size() + "张大片");
return statusResp;
} else {
statusResp.setStep3Status(false);
statusResp.setDisplayText("Hey,去拍摄点免费拍照吧");
return statusResp;
}
} else {
VideoTaskStatusVO taskStatusByFaceId = goodsService.getTaskStatusByFaceId(faceId); VideoTaskStatusVO taskStatusByFaceId = goodsService.getTaskStatusByFaceId(faceId);
if (Integer.valueOf(1).equals(taskStatusByFaceId.getStatus())) { if (Integer.valueOf(1).equals(taskStatusByFaceId.getStatus())) {
if (taskStatusByFaceId.getCount() > 0) { if (taskStatusByFaceId.getCount() > 0) {
@@ -806,6 +861,7 @@ public class FaceServiceImpl implements FaceService {
statusResp.setStep3Status(false); statusResp.setStep3Status(false);
statusResp.setDisplayText("帧途AI正在为您渲染vlog,请稍候"); statusResp.setDisplayText("帧途AI正在为您渲染vlog,请稍候");
} }
}
return statusResp; return statusResp;
} }