From 26dc53ca6abb31937737f27dc5f68982f0afe1e9 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 18 Mar 2025 18:23:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E4=B8=AA=E6=99=AE=E9=80=9A=E6=B0=B4?= =?UTF-8?q?=E5=8D=B0=E3=80=81=E6=8E=A8=E9=80=81=E8=AE=A2=E5=8D=95=E7=BA=A0?= =?UTF-8?q?=E6=AD=A3=E3=80=81=E6=B0=B4=E5=8D=B0=E9=A2=84=E8=A7=88=E5=92=8C?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ycwl/basic/biz/OrderBiz.java | 10 +- .../controller/mobile/AppGoodsController.java | 13 + .../watermark/ImageWatermarkFactory.java | 8 +- .../image/watermark/entity/WatermarkInfo.java | 3 + .../enums/ImageWatermarkOperatorEnum.java | 4 + .../DefaultImageWatermarkOperator.java | 46 ++++ .../operator/LeicaWatermarkOperator.java | 2 +- .../com/ycwl/basic/mapper/SourceMapper.java | 5 +- .../ycwl/basic/mapper/StatisticsMapper.java | 2 + .../model/mobile/goods/GoodsReqQuery.java | 1 + .../basic/model/mobile/goods/GoodsUrlVO.java | 26 ++ .../pc/source/entity/MemberSourceEntity.java | 1 - .../source/entity/SourceWatermarkEntity.java | 12 + .../service/impl/mobile/GoodsServiceImpl.java | 222 ++++++++++++++++++ .../basic/service/mobile/GoodsService.java | 4 + .../ycwl/basic/task/ImageWatermarkTask.java | 170 -------------- src/main/resources/mapper/SourceMapper.xml | 26 +- .../resources/mapper/StatisticsMapper.xml | 10 + src/main/resources/watermark.png | Bin 0 -> 98203 bytes .../operator/WatermarkOperatorTest.java | 31 +++ 20 files changed, 408 insertions(+), 188 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/image/watermark/operator/DefaultImageWatermarkOperator.java create mode 100644 src/main/java/com/ycwl/basic/model/mobile/goods/GoodsUrlVO.java create mode 100644 src/main/java/com/ycwl/basic/model/pc/source/entity/SourceWatermarkEntity.java delete mode 100644 src/main/java/com/ycwl/basic/task/ImageWatermarkTask.java create mode 100644 src/main/resources/watermark.png create mode 100644 src/test/java/com/ycwl/basic/image/watermark/operator/WatermarkOperatorTest.java diff --git a/src/main/java/com/ycwl/basic/biz/OrderBiz.java b/src/main/java/com/ycwl/basic/biz/OrderBiz.java index 37e9f79..6991a56 100644 --- a/src/main/java/com/ycwl/basic/biz/OrderBiz.java +++ b/src/main/java/com/ycwl/basic/biz/OrderBiz.java @@ -240,18 +240,12 @@ public class OrderBiz { StatisticsRecordAddReq statisticsRecordAddReq = new StatisticsRecordAddReq(); statisticsRecordAddReq.setMemberId(order.getMemberId()); - Calendar calendar = Calendar.getInstance(); - calendar.setTime(goodsCreateTime); - calendar.set(Calendar.HOUR_OF_DAY, 21); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - // TODO: 他的购买的内容于内容生成当天晚9点之前算现场订单,否则算推送订单 - if(calendar.getTime().compareTo(payAt)>0){// + Long enterType = statisticsMapper.getUserRecentEnterType(order.getMemberId(), order.getCreateAt()); + if(!Long.valueOf(1014).equals(enterType)){// statisticsRecordAddReq.setType(StatisticEnum.ON_SITE_PAYMENT.code); }else { statisticsRecordAddReq.setType(StatisticEnum.POST_PAYMENT.code); } - calendar.clear(); statisticsRecordAddReq.setScenicId(order.getScenicId()); statisticsRecordAddReq.setMorphId(orderId); statisticsMapper.addStatisticsRecord(statisticsRecordAddReq); diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppGoodsController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppGoodsController.java index 8f4b7ef..3a80258 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppGoodsController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppGoodsController.java @@ -40,6 +40,19 @@ public class AppGoodsController { return ApiResponse.success(goodsDetailVOS); } + @PostMapping("/sourceGoodsList/preview") + public ApiResponse> sourceGoodsListPreview(@RequestBody GoodsReqQuery query) { + List goodsUrlList = goodsService.sourceGoodsListPreview(query); + return ApiResponse.success(goodsUrlList); + } + + @PostMapping("/sourceGoodsList/download") + public ApiResponse> sourceGoodsListDownload(@RequestBody GoodsReqQuery query) { + List goodsUrlList = goodsService.sourceGoodsListDownload(query); + return ApiResponse.success(goodsUrlList); + } + + @ApiOperation("成片vlog商品详情") @GetMapping("/getVideoGoodsDetail/{videoId}") @IgnoreToken diff --git a/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java b/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java index 5e456fb..cf48d4e 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java +++ b/src/main/java/com/ycwl/basic/image/watermark/ImageWatermarkFactory.java @@ -3,6 +3,7 @@ package com.ycwl.basic.image.watermark; import com.ycwl.basic.image.watermark.enums.ImageWatermarkOperatorEnum; import com.ycwl.basic.image.watermark.exception.ImageWatermarkUnsupportedException; import com.ycwl.basic.image.watermark.operator.IOperator; +import com.ycwl.basic.image.watermark.operator.DefaultImageWatermarkOperator; import com.ycwl.basic.image.watermark.operator.LeicaWatermarkOperator; import com.ycwl.basic.image.watermark.operator.NormalWatermarkOperator; @@ -12,13 +13,18 @@ public class ImageWatermarkFactory { if (type == null) { throw new ImageWatermarkUnsupportedException(watermarkType); } + return get(type); + } + public static IOperator get(ImageWatermarkOperatorEnum type) { switch (type) { + case WATERMARK: + return new DefaultImageWatermarkOperator(); case NORMAL: return new NormalWatermarkOperator(); case LEICA: return new LeicaWatermarkOperator(); default: - throw new ImageWatermarkUnsupportedException(watermarkType); + throw new ImageWatermarkUnsupportedException("不支持的类型"+type.name()); } } } diff --git a/src/main/java/com/ycwl/basic/image/watermark/entity/WatermarkInfo.java b/src/main/java/com/ycwl/basic/image/watermark/entity/WatermarkInfo.java index 9782e38..f4b36c0 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/entity/WatermarkInfo.java +++ b/src/main/java/com/ycwl/basic/image/watermark/entity/WatermarkInfo.java @@ -9,6 +9,9 @@ import java.util.Date; @Data public class WatermarkInfo { private File originalFile; + /** + * 输出文件 + */ private File watermarkedFile; private File qrcodeFile; private String scenicLine; diff --git a/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java b/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java index 447c0a7..eea6983 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java +++ b/src/main/java/com/ycwl/basic/image/watermark/enums/ImageWatermarkOperatorEnum.java @@ -1,6 +1,10 @@ package com.ycwl.basic.image.watermark.enums; +import lombok.Getter; + +@Getter public enum ImageWatermarkOperatorEnum { + WATERMARK("defW"), LEICA("leica"), NORMAL("normal"); diff --git a/src/main/java/com/ycwl/basic/image/watermark/operator/DefaultImageWatermarkOperator.java b/src/main/java/com/ycwl/basic/image/watermark/operator/DefaultImageWatermarkOperator.java new file mode 100644 index 0000000..3a1e3a6 --- /dev/null +++ b/src/main/java/com/ycwl/basic/image/watermark/operator/DefaultImageWatermarkOperator.java @@ -0,0 +1,46 @@ +package com.ycwl.basic.image.watermark.operator; + +import com.ycwl.basic.image.watermark.entity.WatermarkInfo; +import com.ycwl.basic.image.watermark.exception.ImageWatermarkException; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +@Slf4j +public class DefaultImageWatermarkOperator implements IOperator { + @Override + public File process(WatermarkInfo info) throws ImageWatermarkException { + BufferedImage baseImage; + BufferedImage watermarkImage; + InputStream logoInputStream = getClass().getResourceAsStream("/watermark.png"); + if (logoInputStream == null) { + throw new ImageWatermarkException("无法找到 watermark.png 资源文件"); + } + try { + baseImage = ImageIO.read(info.getOriginalFile()); + watermarkImage = ImageIO.read(logoInputStream); + } catch (IOException e) { + throw new ImageWatermarkException("图片打开失败"); + } + // 新图像画布 + BufferedImage newImage = new BufferedImage(baseImage.getWidth(), baseImage.getHeight(), BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = newImage.createGraphics(); + g2d.drawImage(baseImage, 0, 0, null); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f)); + g2d.drawImage(watermarkImage, 0, 0, baseImage.getWidth(), baseImage.getHeight(), null); + try { + ImageIO.write(newImage, "jpg", info.getWatermarkedFile()); + } catch (IOException e) { + throw new ImageWatermarkException("图片保存失败"); + } finally { + g2d.dispose(); + } + return info.getWatermarkedFile(); + } +} diff --git a/src/main/java/com/ycwl/basic/image/watermark/operator/LeicaWatermarkOperator.java b/src/main/java/com/ycwl/basic/image/watermark/operator/LeicaWatermarkOperator.java index 962eafc..869d345 100644 --- a/src/main/java/com/ycwl/basic/image/watermark/operator/LeicaWatermarkOperator.java +++ b/src/main/java/com/ycwl/basic/image/watermark/operator/LeicaWatermarkOperator.java @@ -46,7 +46,7 @@ public class LeicaWatermarkOperator implements IOperator { public static int EXTRA_BORDER_PX = 0; public static Color BG_COLOR = Color.WHITE; public static int LOGO_SIZE = 50; - public static int LOGO_EXTRA_BORDER = 10; + public static int LOGO_EXTRA_BORDER = 20; public static int LOGO_FONT_SIZE = 38; public static Color logoTextColor = new Color(0x33, 0x33, 0x33); public static int QRCODE_SIZE = 80; diff --git a/src/main/java/com/ycwl/basic/mapper/SourceMapper.java b/src/main/java/com/ycwl/basic/mapper/SourceMapper.java index 8d20e49..b9e2240 100644 --- a/src/main/java/com/ycwl/basic/mapper/SourceMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/SourceMapper.java @@ -2,6 +2,7 @@ package com.ycwl.basic.mapper; import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; import com.ycwl.basic.model.pc.source.entity.SourceEntity; +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 org.apache.ibatis.annotations.Mapper; @@ -55,7 +56,6 @@ public interface SourceMapper { int addRelations(List list); int updateRelation(MemberSourceEntity memberSourceEntity); - int updateWaterUrl(MemberSourceEntity memberSourceEntity); List queryByRelation(SourceReqQuery sourceReqQuery); @@ -75,4 +75,7 @@ public interface SourceMapper { int deleteNotBuyRelations(Long scenicId, Date endDate); int deleteNotBuyFaceRelation(Long userId, Long faceId); + List listSourceWatermark(List sourceIds, Long faceId, String watermarkType); + + void addSourceWatermark(Long sourceId, Long faceId, String type, String url); } diff --git a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java index 276194b..36fd8c8 100644 --- a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java @@ -91,4 +91,6 @@ public interface StatisticsMapper { int addStatisticsRecord(StatisticsRecordAddReq req); List getBrokerIdListForUser(Long memberId, Date startTime, Date endTime); + + Long getUserRecentEnterType(Long memberId, Date endTime); } diff --git a/src/main/java/com/ycwl/basic/model/mobile/goods/GoodsReqQuery.java b/src/main/java/com/ycwl/basic/model/mobile/goods/GoodsReqQuery.java index 9df1732..d77b333 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/goods/GoodsReqQuery.java +++ b/src/main/java/com/ycwl/basic/model/mobile/goods/GoodsReqQuery.java @@ -14,6 +14,7 @@ public class GoodsReqQuery { @ApiModelProperty("是否已购买 0否 1是") private Integer isBuy; private Long faceId; + private Long goodsId; @ApiModelProperty("景区id") private Long scenicId; @ApiModelProperty("源素材商品类型 1视频 2图像") diff --git a/src/main/java/com/ycwl/basic/model/mobile/goods/GoodsUrlVO.java b/src/main/java/com/ycwl/basic/model/mobile/goods/GoodsUrlVO.java new file mode 100644 index 0000000..182fd7a --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/mobile/goods/GoodsUrlVO.java @@ -0,0 +1,26 @@ +package com.ycwl.basic.model.mobile.goods; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Author:longbinbin + * @Date:2024/12/5 15:10 + */ +@Data +@ApiModel("商品详情") +public class GoodsUrlVO { + @ApiModelProperty("商品类型 0:vlog 1:成片视频 2:源素材") + private Integer goodsType; + @ApiModelProperty("商品id goodsType=0时为videoId,goodsType=2时为sourceId") + private Long goodsId; + @ApiModelProperty("图片文件存储地址") + private String url; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; +} diff --git a/src/main/java/com/ycwl/basic/model/pc/source/entity/MemberSourceEntity.java b/src/main/java/com/ycwl/basic/model/pc/source/entity/MemberSourceEntity.java index 1e232ac..aeadd5d 100644 --- a/src/main/java/com/ycwl/basic/model/pc/source/entity/MemberSourceEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/source/entity/MemberSourceEntity.java @@ -15,5 +15,4 @@ public class MemberSourceEntity { private Integer isBuy; private Long orderId; private Integer isFree; - private String waterUrl; } diff --git a/src/main/java/com/ycwl/basic/model/pc/source/entity/SourceWatermarkEntity.java b/src/main/java/com/ycwl/basic/model/pc/source/entity/SourceWatermarkEntity.java new file mode 100644 index 0000000..2897dca --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/source/entity/SourceWatermarkEntity.java @@ -0,0 +1,12 @@ +package com.ycwl.basic.model.pc.source.entity; + +import lombok.Data; + +@Data +public class SourceWatermarkEntity { + private Integer id; + private Long sourceId; + private Long faceId; + private String watermarkType; + private String watermarkUrl; +} diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java index 4d9e020..1210d53 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java @@ -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 sourceGoodsListPreview(GoodsReqQuery query) { + List 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 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 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 watermarkEntityList = sourceMapper.listSourceWatermark(defaultUrlList.stream().map(GoodsUrlVO::getGoodsId).collect(Collectors.toList()), null, ImageWatermarkOperatorEnum.WATERMARK.getType()); + List collect = defaultUrlList.stream().peek(item -> { + Optional 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 sourceGoodsListDownload(GoodsReqQuery query) { + List 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 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 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 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 collect = defaultUrlList.stream().peek(item -> { + Optional 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; + } } diff --git a/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java b/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java index e1b4d0e..2755698 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java +++ b/src/main/java/com/ycwl/basic/service/mobile/GoodsService.java @@ -44,4 +44,8 @@ public interface GoodsService { VideoTaskStatusVO getTaskStatusByScenicId(Long userId, Long scenicId); ApiResponse sourceGoodsInfo(Long sourceId); + + List sourceGoodsListPreview(GoodsReqQuery query); + + List sourceGoodsListDownload(GoodsReqQuery query); } diff --git a/src/main/java/com/ycwl/basic/task/ImageWatermarkTask.java b/src/main/java/com/ycwl/basic/task/ImageWatermarkTask.java deleted file mode 100644 index 02d869c..0000000 --- a/src/main/java/com/ycwl/basic/task/ImageWatermarkTask.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.ycwl.basic.task; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.extra.qrcode.QrCodeUtil; -import cn.hutool.http.HttpUtil; -import com.alibaba.fastjson.JSONObject; -import com.ycwl.basic.image.watermark.ImageWatermarkFactory; -import com.ycwl.basic.image.watermark.entity.WatermarkInfo; -import com.ycwl.basic.image.watermark.exception.ImageWatermarkException; -import com.ycwl.basic.image.watermark.operator.IOperator; -import com.ycwl.basic.mapper.SourceMapper; -import com.ycwl.basic.model.pc.face.entity.FaceEntity; -import com.ycwl.basic.model.pc.mp.MpConfigEntity; -import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; -import com.ycwl.basic.model.pc.scenic.entity.ScenicEntity; -import com.ycwl.basic.model.pc.source.entity.MemberSourceEntity; -import com.ycwl.basic.model.pc.source.entity.SourceEntity; -import com.ycwl.basic.notify.entity.WxMpSrvConfig; -import com.ycwl.basic.repository.FaceRepository; -import com.ycwl.basic.repository.ScenicRepository; -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.WxMpUtil; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import static com.ycwl.basic.constant.StorageConstant.PHOTO_WATERMARKED_PATH; - - -@Component -@EnableScheduling -@Slf4j -public class ImageWatermarkTask { - @Autowired - private FaceRepository faceRepository; - @Autowired - private ScenicRepository scenicRepository; - @Autowired - private SourceMapper sourceMapper; - - @Data - @AllArgsConstructor - public static class Task { - public Long memberId; - public Long faceId; - } - - public static ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); - - public static void addTask(Long memberId, Long faceId) { - queue.add(new Task(memberId, faceId)); - } - - @Scheduled(fixedRate = 200L) - public void doTask() { - Task task = queue.poll(); - if (task == null) { - return; - } - log.info("poll task: {}/{}", task, queue.size()); - new Thread(() -> { - try { - runTask(task); - } catch (Exception e) { - log.error("run task error", e); - } - }).start(); - } - - public void runTask(Task task) { - // 生成二维码 - FaceEntity face = faceRepository.getFace(task.faceId); - if (face == null) { - return; - } - ScenicEntity scenic = scenicRepository.getScenic(face.getScenicId()); - if (scenic == null) { - return; - } - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId()); - MpConfigEntity scenicMpConfig = scenicRepository.getScenicMpConfig(face.getScenicId()); - if (scenicMpConfig == null) { - return; - } - List sourceEntities = sourceMapper.listImageByFaceRelation(task.memberId, task.faceId); - if (sourceEntities == null || sourceEntities.isEmpty()) { - return; - } - File qrcode = new File("qrcode_"+face.getMemberId()+".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; - } - IStorageAdapter adapter = StorageFactory.get(scenicConfig.getStoreType()); - adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class)); - // TODO - WatermarkInfo info = new WatermarkInfo(); - info.setQrcodeFile(qrcode); - final ThreadPoolExecutor executor = new ThreadPoolExecutor(16, 128, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(128)); - for (SourceEntity sourceEntity : sourceEntities) { - executor.execute(() -> { - String url; - try { - IOperator operator = ImageWatermarkFactory.get(scenicConfig.getWatermarkType()); - File dstFile = new File(sourceEntity.getId() + ".jpg"); - File watermarkedFile = new File(sourceEntity.getId() + "_w.png"); - try { - HttpUtil.downloadFile(sourceEntity.getUrl(), dstFile); - } catch (Exception e) { - log.error("downloadFile error", e); - return; - } - info.setOriginalFile(dstFile); - info.setScenicLine(scenicConfig.getWatermarkScenicText()); - info.setDatetime(sourceEntity.getCreateTime()); - info.setDtFormat(scenicConfig.getWatermarkDtFormat()); - info.setWatermarkedFile(watermarkedFile); - try { - operator.process(info); - } catch (ImageWatermarkException e) { - log.error("process error", e); - return; - } - url = adapter.uploadFile(watermarkedFile, PHOTO_WATERMARKED_PATH, watermarkedFile.getName()); - adapter.setAcl(StorageAcl.PUBLIC_READ, PHOTO_WATERMARKED_PATH, watermarkedFile.getName()); - } catch (ImageWatermarkException e) { - // 不支持 - url = sourceEntity.getUrl(); - } - - MemberSourceEntity memberSource = new MemberSourceEntity(); - memberSource.setMemberId(task.memberId); - memberSource.setScenicId(face.getScenicId()); - memberSource.setFaceId(task.faceId); - memberSource.setType(sourceEntity.getType()); - memberSource.setSourceId(sourceEntity.getId()); - memberSource.setWaterUrl(url); - sourceMapper.updateWaterUrl(memberSource); - }); - } - try { - Thread.sleep(2000L); - log.info("executor等待被结束![A:{}/T:{}/F:{}]", executor.getActiveCount(), executor.getTaskCount(), executor.getCompletedTaskCount()); - executor.shutdown(); - executor.awaitTermination(30, TimeUnit.SECONDS); - log.info("executor已结束![A:{}/T:{}/F:{}]", executor.getActiveCount(), executor.getTaskCount(), executor.getCompletedTaskCount()); - } catch (InterruptedException e) { - return; - } - } -} diff --git a/src/main/resources/mapper/SourceMapper.xml b/src/main/resources/mapper/SourceMapper.xml index 19ba769..df35dd5 100644 --- a/src/main/resources/mapper/SourceMapper.xml +++ b/src/main/resources/mapper/SourceMapper.xml @@ -16,6 +16,10 @@ (#{item.scenicId}, #{item.faceId}, #{item.memberId}, #{item.sourceId}, #{item.isBuy}, #{item.type}, #{item.orderId}, #{item.isFree}) + + insert source_watermark(source_id, face_id, watermark_type, watermark_url) + values (#{sourceId}, #{faceId}, #{type}, #{url}) + update source @@ -38,11 +42,6 @@ where member_id = #{memberId} and face_id = #{faceId} and `type` = #{type} - - update member_source - set water_url = #{waterUrl} - where member_id = #{memberId} and source_id = #{sourceId} and `type` = #{type} - delete from source where id = #{id} @@ -130,7 +129,7 @@ limit 1 + diff --git a/src/main/resources/mapper/StatisticsMapper.xml b/src/main/resources/mapper/StatisticsMapper.xml index d4cb6d7..7b37cf8 100644 --- a/src/main/resources/mapper/StatisticsMapper.xml +++ b/src/main/resources/mapper/StatisticsMapper.xml @@ -263,4 +263,14 @@ ) a order by createTime desc + \ No newline at end of file diff --git a/src/main/resources/watermark.png b/src/main/resources/watermark.png new file mode 100644 index 0000000000000000000000000000000000000000..9cdd8d996a4e5e29ad4ff371e362e6e651f282ee GIT binary patch literal 98203 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 literal 0 HcmV?d00001 diff --git a/src/test/java/com/ycwl/basic/image/watermark/operator/WatermarkOperatorTest.java b/src/test/java/com/ycwl/basic/image/watermark/operator/WatermarkOperatorTest.java new file mode 100644 index 0000000..32d1e1a --- /dev/null +++ b/src/test/java/com/ycwl/basic/image/watermark/operator/WatermarkOperatorTest.java @@ -0,0 +1,31 @@ +package com.ycwl.basic.image.watermark.operator; + +import com.ycwl.basic.image.watermark.entity.WatermarkInfo; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.File; + + +@SpringBootTest +@RunWith(SpringRunner.class) +public class WatermarkOperatorTest { + @Test + public void testProcess() throws Exception { + WatermarkInfo info = new WatermarkInfo(); + info.setOriginalFile(new File("e2d32de7-6e85-4e07-b42f-477347073539.jpg")); + info.setQrcodeFile(new File("cxzh_t.jpg")); + info.setScenicLine("川西竹海一日游!"); + info.setDatetimeLine("2XXX年XX月XX日 留念"); + info.setWatermarkedFile(new File("test2.png")); + IOperator operator = new NormalWatermarkOperator(); + operator.process(info); + info.setWatermarkedFile(new File("test1.png")); + operator = new LeicaWatermarkOperator(); + operator.process(info); + } + +} \ No newline at end of file