加个普通水印、推送订单纠正、水印预览和下载

This commit is contained in:
2025-03-18 18:23:18 +08:00
parent 46f6532164
commit 26dc53ca6a
20 changed files with 408 additions and 188 deletions

View File

@ -1,16 +1,27 @@
package com.ycwl.basic.service.impl.mobile;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ycwl.basic.biz.OrderBiz;
import com.ycwl.basic.biz.TaskStatusBiz;
import com.ycwl.basic.constant.BaseContextHandler;
import com.ycwl.basic.constant.StorageConstant;
import com.ycwl.basic.image.watermark.ImageWatermarkFactory;
import com.ycwl.basic.image.watermark.entity.WatermarkInfo;
import com.ycwl.basic.image.watermark.enums.ImageWatermarkOperatorEnum;
import com.ycwl.basic.image.watermark.exception.ImageWatermarkException;
import com.ycwl.basic.image.watermark.operator.IOperator;
import com.ycwl.basic.mapper.*;
import com.ycwl.basic.model.mobile.goods.*;
import com.ycwl.basic.model.mobile.order.IsBuyRespVO;
import com.ycwl.basic.model.mobile.order.PriceObj;
import com.ycwl.basic.model.pc.face.entity.FaceEntity;
import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
import com.ycwl.basic.model.pc.mp.MpConfigEntity;
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
import com.ycwl.basic.model.pc.source.entity.SourceWatermarkEntity;
import com.ycwl.basic.model.pc.source.req.SourceReqQuery;
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
@ -25,21 +36,30 @@ import com.ycwl.basic.repository.VideoTaskRepository;
import com.ycwl.basic.service.mobile.GoodsService;
import com.ycwl.basic.repository.TemplateRepository;
import com.ycwl.basic.service.task.TaskService;
import com.ycwl.basic.storage.StorageFactory;
import com.ycwl.basic.storage.adapters.IStorageAdapter;
import com.ycwl.basic.storage.enums.StorageAcl;
import com.ycwl.basic.utils.ApiResponse;
import com.ycwl.basic.utils.DateUtils;
import com.ycwl.basic.utils.WxMpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Author:longbinbin
* @Date:2024/12/5 15:04
*/
@Slf4j
@Service
public class GoodsServiceImpl implements GoodsService {
@Autowired
@ -427,4 +447,206 @@ public class GoodsServiceImpl implements GoodsService {
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(query.getScenicId());
sourceReqQuery.setIsBuy(query.getIsBuy());
sourceReqQuery.setMemberId(face.getMemberId());
sourceReqQuery.setType(sourceType);
sourceReqQuery.setFaceId(query.getFaceId());
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.getMemberId(), query.getScenicId(), query.getSourceType(), query.getFaceId());
if (!isBuy.isBuy()) {
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId());
if (scenicConfig != null && ((scenicConfig.getAntiScreenRecordType() & 2) == 0)) {
// 未启用水印
return defaultUrlList;
}
IStorageAdapter adapter;
if (scenicConfig != null && scenicConfig.getStoreType() != null) {
adapter = StorageFactory.get(scenicConfig.getStoreType());
adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), 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().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() + ".png");
try {
HttpUtil.downloadFile(item.getUrl(), 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(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
public List<GoodsUrlVO> sourceGoodsListDownload(GoodsReqQuery query) {
List<File> tmpFile = new ArrayList<>();
FaceEntity face = faceRepository.getFace(query.getFaceId());
if (face == null) {
return Collections.emptyList();
}
IsBuyRespVO isBuy = orderBiz.isBuy(face.getMemberId(), query.getScenicId(), query.getSourceType(), query.getFaceId());
if (!isBuy.isBuy()) {
return Collections.emptyList();
}
Integer sourceType = query.getSourceType();
SourceReqQuery sourceReqQuery = new SourceReqQuery();
sourceReqQuery.setScenicId(query.getScenicId());
sourceReqQuery.setIsBuy(query.getIsBuy());
sourceReqQuery.setMemberId(face.getMemberId());
sourceReqQuery.setType(sourceType);
sourceReqQuery.setFaceId(query.getFaceId());
List<SourceRespVO> list = sourceMapper.listUser(sourceReqQuery);
if (query.getGoodsId() != null) {
list = list.stream().filter(source -> source.getId().equals(query.getGoodsId())).collect(Collectors.toList());
}
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());
ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId());
MpConfigEntity scenicMpConfig = scenicRepository.getScenicMpConfig(face.getScenicId());
if (scenicMpConfig == null) {
log.warn("未配置小程序参数,无法生成二维码");
return defaultUrlList;
}
if (scenicConfig != null && scenicConfig.getWatermarkType() != null) {
ImageWatermarkOperatorEnum type = ImageWatermarkOperatorEnum.getByCode(scenicConfig.getWatermarkType());
if (type != null) {
IStorageAdapter adapter;
if (scenicConfig != null && scenicConfig.getStoreType() != null) {
adapter = StorageFactory.get(scenicConfig.getStoreType());
adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class));
} else {
adapter = StorageFactory.use("assets-ext");
}
IOperator operator = ImageWatermarkFactory.get(type);
List<SourceWatermarkEntity> watermarkEntityList = sourceMapper.listSourceWatermark(list.stream().map(SourceRespVO::getId).collect(Collectors.toList()), face.getId(), type.getType());
File qrcode = new File("qrcode_"+face.getId()+".jpg");
try {
String urlLink = WxMpUtil.generateUrlLink(scenicMpConfig.getAppId(), scenicMpConfig.getAppSecret(), "pages/videoSynthesis/index", "scenicId=" + face.getScenicId() + "&faceId=" + face.getId());
QrCodeUtil.generate(urlLink + "?cq=", 300, 300, qrcode);
} catch (Exception e) {
log.error("generateWXQRCode error", e);
return defaultUrlList;
}
tmpFile.add(qrcode);
List<GoodsUrlVO> collect = defaultUrlList.stream().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() + "_" + type.getType() + ".png");
try {
HttpUtil.downloadFile(item.getUrl(), dstFile);
} catch (Exception e) {
log.error("downloadFile error", e);
return;
}
tmpFile.add(dstFile);
WatermarkInfo info = new WatermarkInfo();
info.setOriginalFile(dstFile);
info.setQrcodeFile(qrcode);
info.setScenicLine(scenicConfig.getWatermarkScenicText());
info.setDatetime(item.getCreateTime());
info.setDtFormat(scenicConfig.getWatermarkDtFormat());
info.setWatermarkedFile(watermarkedFile);
try {
operator.process(info);
} catch (ImageWatermarkException e) {
log.error("process error", e);
return;
}
String url = adapter.uploadFile(watermarkedFile, StorageConstant.PHOTO_WATERMARKED_PATH, watermarkedFile.getName());
adapter.setAcl(StorageAcl.PUBLIC_READ, StorageConstant.PHOTO_WATERMARKED_PATH, watermarkedFile.getName());
sourceMapper.addSourceWatermark(item.getGoodsId(), face.getId(), type.getType(), url);
tmpFile.add(watermarkedFile);
item.setUrl(url);
}
}).collect(Collectors.toList());
for (File file : tmpFile) {
file.delete();
}
return collect;
}
}
return defaultUrlList;
}
}

View File

@ -44,4 +44,8 @@ public interface GoodsService {
VideoTaskStatusVO getTaskStatusByScenicId(Long userId, Long scenicId);
ApiResponse<GoodsDetailVO> sourceGoodsInfo(Long sourceId);
List<GoodsUrlVO> sourceGoodsListPreview(GoodsReqQuery query);
List<GoodsUrlVO> sourceGoodsListDownload(GoodsReqQuery query);
}