You've already forked FrameTour-BE
加个普通水印、推送订单纠正、水印预览和下载
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user