diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/MediaTransferRecord.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/MediaTransferRecord.java new file mode 100644 index 000000000..5a2c8852d --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/model/MediaTransferRecord.java @@ -0,0 +1,37 @@ +package com.accompany.business.model; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import java.util.Date; + +@Data +@TableName("media_transfer_record") +public class MediaTransferRecord { + + @TableId(type = IdType.INPUT) + private String id; + + private Long uid; + + private String provider; + + private String inputPath; + + private String outputPath; + + private String redisKey; + + private Long price; + + private String ip; + + private String deviceId; + + private Date createTime; + + private Date updateTime; + + private Byte status; // 0-处理中, 1-成功, 2-失败 + + private String errorMsg; +} \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/MediaTransferRecordMapper.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/MediaTransferRecordMapper.java new file mode 100644 index 000000000..f036fabaf --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/mybatismapper/MediaTransferRecordMapper.java @@ -0,0 +1,9 @@ +package com.accompany.business.mybatismapper; + +import com.accompany.business.model.MediaTransferRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MediaTransferRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/TencentDataUniverseService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/MediaTransferService.java similarity index 50% rename from accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/TencentDataUniverseService.java rename to accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/MediaTransferService.java index e15b08052..a2c6788f5 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/TencentDataUniverseService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/MediaTransferService.java @@ -1,16 +1,12 @@ package com.accompany.business.service; -import com.accompany.common.config.TencentCosConfig; +import com.accompany.business.model.MediaTransferRecord; +import com.accompany.business.mybatismapper.MediaTransferRecordMapper; +import com.accompany.common.constant.Constant; import com.accompany.common.redis.RedisKey; import com.accompany.common.utils.EnvComponent; -import com.accompany.common.utils.UUIDUtil; import com.accompany.core.base.SpringContextHolder; import com.accompany.core.service.common.JedisService; -import com.alibaba.fastjson2.JSON; -import com.qcloud.cos.COSClient; -import com.qcloud.cos.model.ciModel.job.MediaJobObject; -import com.qcloud.cos.model.ciModel.job.MediaJobResponse; -import com.qcloud.cos.model.ciModel.job.MediaJobsRequest; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -21,51 +17,34 @@ import java.net.URL; @Slf4j @Service -public class TencentDataUniverseService { +public class MediaTransferService { @Autowired - private TencentCosConfig tencentCosConfig; - @Autowired - private COSClient client; + private TencentDataInfiniteService tencentDataInfiniteService; @Autowired private EnvComponent envComponent; + @Autowired + private MediaTransferRecordMapper mediaTransferRecordMapper; @SneakyThrows @Async public void transfer2Gif(Long uid, String avatar, String redisKey, Long price, String ip, String deviceId) { - URL url = new URL(avatar); String inputPath = url.getPath(); String outputPath = inputPath.replace(".mp4", ".gif"); String outputAvatar = url.getHost() + outputPath; - //1.创建任务请求对象 - MediaJobsRequest request = new MediaJobsRequest(); - //2.添加请求参数 参数详情请见 API 接口文档 - request.setBucketName(tencentCosConfig.getBucket()); - request.setTag("Animation"); - request.getInput().setObject(inputPath); - request.getOperation().setTemplateId(tencentCosConfig.getGifJobTemplateId()); - request.getOperation().getOutput().setBucket(tencentCosConfig.getBucket()); - request.getOperation().getOutput().setRegion(tencentCosConfig.getRegion()); - request.getOperation().getOutput().setObject(outputPath); - //3.调用接口,获取任务响应对象 - MediaJobResponse response = client.createMediaJobs(request); - log.info("tencent mp4转码gif 任务提交结果: {}", JSON.toJSONString(response)); + String taskId = tencentDataInfiniteService.transfer2Gif(uid, inputPath, outputPath, redisKey, price, ip, deviceId); //正式环境等回调 if (!envComponent.getDevOrNativeEnv()){ return; } - String taskId = UUIDUtil.get(); SpringContextHolder.getBean(UploadAvatarService.class).cacheReviewAvatar(redisKey, String.valueOf(uid), outputAvatar, price); SpringContextHolder.getBean(JedisService.class).hset(RedisKey.user_avatar_review_task.getKey(), taskId, String.valueOf(uid)); SpringContextHolder.getBean(UploadAvatarService.class).updateAvatar(outputAvatar, uid, redisKey, taskId); } - public void handleResult(MediaJobObject jobsDetail) { - - } -} +} \ No newline at end of file diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/TencentDataInfiniteService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/TencentDataInfiniteService.java new file mode 100644 index 000000000..a66933e46 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/TencentDataInfiniteService.java @@ -0,0 +1,93 @@ +package com.accompany.business.service; + +import com.accompany.business.model.MediaTransferRecord; +import com.accompany.business.mybatismapper.MediaTransferRecordMapper; +import com.accompany.business.service.netease.YidunCheckUtil; +import com.accompany.common.config.TencentCosConfig; +import com.accompany.common.constant.Constant; +import com.accompany.common.status.BusiStatus; +import com.accompany.core.exception.ServiceException; +import com.alibaba.fastjson2.JSON; +import com.qcloud.cos.COSClient; +import com.qcloud.cos.model.ciModel.job.MediaJobObject; +import com.qcloud.cos.model.ciModel.job.MediaJobResponse; +import com.qcloud.cos.model.ciModel.job.MediaJobsRequest; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class TencentDataInfiniteService { + + @Autowired + private TencentCosConfig tencentCosConfig; + @Autowired + private COSClient client; + @Autowired + private MediaTransferRecordMapper mediaTransferRecordMapper; + + private final String channel = "tencent"; + + @SneakyThrows + public String transfer2Gif(Long uid, String inputPath, String outputPath, String redisKey, Long price, String ip, String deviceId) { + //1.创建任务请求对象 + MediaJobsRequest request = new MediaJobsRequest(); + //2.添加请求参数 参数详情请见 API 接口文档 + request.setBucketName(tencentCosConfig.getBucket()); + request.setTag("Animation"); + request.getInput().setObject(inputPath); + request.getOperation().setTemplateId(tencentCosConfig.getGifJobTemplateId()); + request.getOperation().getOutput().setBucket(tencentCosConfig.getBucket()); + request.getOperation().getOutput().setRegion(tencentCosConfig.getRegion()); + request.getOperation().getOutput().setObject(outputPath); + //3.调用接口,获取任务响应对象 + MediaJobResponse response = client.createMediaJobs(request); + log.info("tencent mp4转码gif 任务提交结果: {}", JSON.toJSONString(response)); + MediaJobObject jobsDetail = response.getJobsDetail(); + if (null == jobsDetail || !"Success".equals(jobsDetail.getCode())){ + throw new ServiceException(BusiStatus.SERVERBUSY); + } + + String taskId = jobsDetail.getJobId(); + String id = String.join("_", taskId, channel); + + // 创建记录实体 + MediaTransferRecord mediaTransferRecord = new MediaTransferRecord(); + mediaTransferRecord.setId(id); + mediaTransferRecord.setUid(uid); + mediaTransferRecord.setProvider(channel); // 默认使用腾讯云 + mediaTransferRecord.setInputPath(inputPath); + mediaTransferRecord.setOutputPath(outputPath); + mediaTransferRecord.setRedisKey(redisKey); + mediaTransferRecord.setPrice(price); + mediaTransferRecord.setIp(ip); + mediaTransferRecord.setDeviceId(deviceId); + mediaTransferRecord.setStatus(Constant.status.delete); // 处理中 + mediaTransferRecordMapper.insert(mediaTransferRecord); + + return taskId; + } + + public void handleResult(MediaJobObject jobsDetail) { + if (null == jobsDetail || !"Success".equals(jobsDetail.getCode())){ + throw new ServiceException(BusiStatus.PARAMERROR); + } + + //todo 校验jobsDetail + + String id = String.join("_", jobsDetail.getJobId(), channel); + MediaTransferRecord record = mediaTransferRecordMapper.selectById(id); + if (null == record){ + throw new ServiceException(BusiStatus.ALREADY_NOTEXISTS_CONFIG); + } + + //todo 失败退钱 + + //record.setStatus(); + mediaTransferRecordMapper.updateById(record); + + YidunCheckUtil.reviewAvatar(record.getUid(), record.getOutputPath(), record.getRedisKey(), record.getPrice(), record.getIp(), record.getDeviceId()); + } +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/UploadAvatarService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/UploadAvatarService.java index 8aad397ca..8ced21616 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/UploadAvatarService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/UploadAvatarService.java @@ -30,8 +30,6 @@ import com.accompany.core.model.Users; import com.accompany.core.service.base.BaseService; import com.accompany.core.service.user.UsersBaseService; import com.accompany.core.util.I18NMessageSourceUtil; -import com.qcloud.cos.model.ciModel.template.MediaTemplateRequest; -import com.qcloud.cos.model.ciModel.template.MediaTemplateResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -65,7 +63,7 @@ public class UploadAvatarService extends BaseService { private final Long gifAvatarGoldPrice = 10000L; @Autowired - private TencentDataUniverseService tencentDataUniverseService; + private MediaTransferService mediaTransferService; public long getGifAvatarGoldPrice(){ return gifAvatarGoldPrice; @@ -205,7 +203,7 @@ public class UploadAvatarService extends BaseService { public void reviewAvatar(Long uid, String avatar, String redisKey, Long price, String ip, String deviceId) { if (ImageFileUtils.isMp4(avatar)){ - tencentDataUniverseService.transfer2Gif(uid, avatar, redisKey, price, ip, deviceId); + mediaTransferService.transfer2Gif(uid, avatar, redisKey, price, ip, deviceId); return; } YidunCheckUtil.reviewAvatar(uid, avatar, redisKey, price, ip, deviceId); diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/TencentCosMediaCallbackController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/TencentCosMediaCallbackController.java index 2dd8d6007..4cfcdc21a 100644 --- a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/TencentCosMediaCallbackController.java +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/TencentCosMediaCallbackController.java @@ -1,7 +1,7 @@ package com.accompany.business.controller; import com.accompany.business.common.BaseController; -import com.accompany.business.service.TencentDataUniverseService; +import com.accompany.business.service.TencentDataInfiniteService; import com.accompany.common.result.BusiResult; import com.accompany.common.status.BusiStatus; import com.accompany.core.exception.ServiceException; @@ -28,7 +28,7 @@ import javax.annotation.Resource; public class TencentCosMediaCallbackController extends BaseController { @Resource - private TencentDataUniverseService service; + private TencentDataInfiniteService service; @ApiOperation("易盾图片审核结果上报") @PostMapping("/callback")