refactor(goods): 移除预览功能并优化水印处理逻辑

- 移除了 sourceGoodsListPreview 接口及相关实现
- 新增 WatermarkEdgeService 和 FaceService 依赖注入
- 实现边缘端水印处理支持,包含降级机制
- 优化二维码和头像文件处理流程
- 统一水印处理的异常处理和资源清理逻辑
This commit is contained in:
2026-01-16 17:19:31 +08:00
parent e9a4c26a83
commit 83e47ed843
3 changed files with 0 additions and 97 deletions

View File

@@ -53,12 +53,6 @@ public class AppGoodsController {
return ApiResponse.success(count); return ApiResponse.success(count);
} }
@PostMapping("/sourceGoodsList/preview")
public ApiResponse<List<GoodsUrlVO>> sourceGoodsListPreview(@RequestBody GoodsReqQuery query) {
List<GoodsUrlVO> goodsUrlList = goodsService.sourceGoodsListPreview(query);
return ApiResponse.success(goodsUrlList);
}
@PostMapping("/sourceGoodsList/download") @PostMapping("/sourceGoodsList/download")
public ApiResponse<List<GoodsUrlVO>> sourceGoodsListDownload(@RequestBody GoodsReqQuery query) { public ApiResponse<List<GoodsUrlVO>> sourceGoodsListDownload(@RequestBody GoodsReqQuery query) {
List<GoodsUrlVO> goodsUrlList = goodsService.sourceGoodsListDownload(query); List<GoodsUrlVO> goodsUrlList = goodsService.sourceGoodsListDownload(query);

View File

@@ -38,8 +38,6 @@ public interface GoodsService {
ApiResponse<GoodsDetailVO> sourceGoodsInfo(Long sourceId); ApiResponse<GoodsDetailVO> sourceGoodsInfo(Long sourceId);
List<GoodsUrlVO> sourceGoodsListPreview(GoodsReqQuery query);
List<GoodsUrlVO> sourceGoodsListDownload(GoodsReqQuery query); List<GoodsUrlVO> sourceGoodsListDownload(GoodsReqQuery query);
Integer sourceGoodsCount(GoodsReqQuery query); Integer sourceGoodsCount(GoodsReqQuery query);

View File

@@ -534,95 +534,6 @@ public class GoodsServiceImpl implements GoodsService {
return ApiResponse.success(goodsDetailVO); return ApiResponse.success(goodsDetailVO);
} }
@Override
public List<GoodsUrlVO> sourceGoodsListPreview(GoodsReqQuery query) {
List<File> tmpFile = new ArrayList<>();
FaceEntity face = faceRepository.getFace(query.getFaceId());
if (face == null) {
return Collections.emptyList();
}
Integer sourceType = query.getSourceType();
SourceReqQuery sourceReqQuery = new SourceReqQuery();
sourceReqQuery.setScenicId(face.getScenicId());
sourceReqQuery.setIsBuy(query.getIsBuy());
sourceReqQuery.setType(sourceType);
sourceReqQuery.setFaceId(face.getId());
List<SourceRespVO> list = sourceMapper.listUser(sourceReqQuery);
if (!Integer.valueOf(2).equals(query.getSourceType())) {
return list.stream().map(source -> {
GoodsUrlVO goodsUrlVO = new GoodsUrlVO();
goodsUrlVO.setGoodsType(source.getType());
goodsUrlVO.setGoodsId(source.getId());
goodsUrlVO.setUrl(source.getVideoUrl());
goodsUrlVO.setCreateTime(source.getCreateTime());
return goodsUrlVO;
}).collect(Collectors.toList());
}
List<GoodsUrlVO> defaultUrlList = list.stream().map(source -> {
GoodsUrlVO goodsUrlVO = new GoodsUrlVO();
goodsUrlVO.setGoodsType(source.getType());
goodsUrlVO.setGoodsId(source.getId());
goodsUrlVO.setUrl(source.getUrl());
goodsUrlVO.setCreateTime(source.getCreateTime());
return goodsUrlVO;
}).collect(Collectors.toList());
IsBuyRespVO isBuy = orderBiz.isBuy(face.getScenicId(), face.getMemberId(), face.getId(), query.getSourceType(), face.getId());
if (!isBuy.isBuy()) {
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(face.getScenicId());
if (configManager != null && ((configManager.getInteger("anti_screen_record_type") & 2) == 0)) {
// 未启用水印
return defaultUrlList;
}
IStorageAdapter adapter;
if (configManager != null && configManager.getEnum("store_type", StorageType.class) != null) {
adapter = StorageFactory.get(configManager.getEnum("store_type", StorageType.class));
adapter.loadConfig(JacksonUtil.parseObject(configManager.getString("store_config_json"), Map.class));
} else {
adapter = StorageFactory.use("assets-ext");
}
IOperator operator = ImageWatermarkFactory.get(ImageWatermarkOperatorEnum.WATERMARK);
List<SourceWatermarkEntity> watermarkEntityList = sourceMapper.listSourceWatermark(defaultUrlList.stream().map(GoodsUrlVO::getGoodsId).collect(Collectors.toList()), null, ImageWatermarkOperatorEnum.WATERMARK.getType());
List<GoodsUrlVO> collect = defaultUrlList.stream().parallel().peek(item -> {
Optional<SourceWatermarkEntity> any = watermarkEntityList.stream()
.filter(watermark -> watermark.getSourceId().equals(item.getGoodsId()))
.findAny();
if (any.isPresent()) {
item.setUrl(any.get().getWatermarkUrl());
} else {
// 生成
File dstFile = new File(item.getGoodsId() + ".jpg");
File watermarkedFile = new File(item.getGoodsId() + "_" + ImageWatermarkOperatorEnum.WATERMARK.getType() + "." + ImageWatermarkOperatorEnum.WATERMARK.getPreferFileType());
try {
HttpUtil.downloadFile(item.getUrl().replace("oss.zhentuai.com", "frametour-assets.oss-cn-shanghai-internal.aliyuncs.com"), dstFile);
} catch (Exception e) {
log.error("downloadFile error", e);
return;
}
tmpFile.add(dstFile);
WatermarkInfo info = new WatermarkInfo();
info.setOriginalFile(dstFile);
info.setWatermarkedFile(watermarkedFile);
try {
operator.process(info);
} catch (ImageWatermarkException e) {
log.error("process error", e);
return;
}
String url = adapter.uploadFile(null, watermarkedFile, StorageConstant.PHOTO_WATERMARKED_PATH, watermarkedFile.getName());
adapter.setAcl(StorageAcl.PUBLIC_READ, StorageConstant.PHOTO_WATERMARKED_PATH, watermarkedFile.getName());
sourceMapper.addSourceWatermark(item.getGoodsId(), null, ImageWatermarkOperatorEnum.WATERMARK.getType(), url);
tmpFile.add(watermarkedFile);
item.setUrl(url);
}
}).collect(Collectors.toList());
for (File file : tmpFile) {
file.delete();
}
return collect;
}
return defaultUrlList;
}
@Override @Override
public List<GoodsUrlVO> sourceGoodsListDownload(GoodsReqQuery query) { public List<GoodsUrlVO> sourceGoodsListDownload(GoodsReqQuery query) {
List<File> tmpFile = new ArrayList<>(); List<File> tmpFile = new ArrayList<>();