dengsixing 1 год назад
Родитель
Сommit
79842e74d1

+ 167 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneCustomServiceImpl.java

@@ -0,0 +1,167 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.img.ImgUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.fdkankan.common.constant.CommonOperStatus;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.DateExtUtil;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.fyun.config.FYunFileConfig;
+import com.fdkankan.model.constants.ConstantFilePath;
+//import com.fdkankan.rabbitmq.util.RabbitMqProducer;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.scene.bean.BodySegmentStatusBean;
+import com.fdkankan.scene.service.ISceneCustomService;
+//import com.fdkankan.scene.util.OssBodySegmentUtil;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+@Slf4j
+@Service("sceneService")
+public class SceneCustomServiceImpl implements ISceneCustomService {
+
+    @Value("${queue.bodySegment:body-segment}")
+    private String queueName;
+    @Value("${oss.bodySegment.bucket:4dkankan-huadong}")
+    private String bodySegmentBucket;
+    @Value("${oss.bodySegment.point:oss-cn-shanghai.aliyuncs.com}")
+    private String bodySegmentHost;
+
+//    @Autowired
+//    private OssBodySegmentUtil ossBodySegmentUtil;
+    @Autowired
+    private RedisUtil redisUtil;
+//    @Autowired
+//    private RabbitMqProducer rabbitMqProducer;
+//    @Autowired
+//    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    public FYunFileConfig fYunFileConfig;
+
+    @Override
+    public ResultData uploadBodySegment(MultipartFile file, Integer rotate) throws Exception {
+
+        if(!FileUtils.checkFileSizeIsLimit(file.getSize(), 10, "M")){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_4003, "10M");
+        }
+
+        String uuid = UUID.randomUUID().toString();
+
+        String fileName = file.getOriginalFilename();
+        String extName = fileName.substring(fileName.lastIndexOf("."));
+        File tempFile = File.createTempFile(uuid, extName);
+        file.transferTo(tempFile);
+
+        //判断是否需要旋转
+        if(Objects.nonNull(rotate) && rotate != 0){
+            Image rotateImg = ImgUtil.rotate(ImageIO.read(tempFile), rotate);
+            File tempRotateFile = File.createTempFile(uuid + "-rotate", extName);
+            ImgUtil.write(rotateImg, tempRotateFile);
+            tempFile = tempRotateFile;
+        }
+
+        //校验像素
+        BufferedImage bufferedImage = ImgUtil.read(tempFile.getPath());
+        Float scale = 1F;
+        Float widthScale = 1F;
+        Float heightScale = 1F;
+        int width = bufferedImage.getWidth();
+        int height = bufferedImage.getHeight();
+        if(width > 2000){
+            widthScale = new BigDecimal(2000).divide(new BigDecimal(width),5, BigDecimal.ROUND_DOWN).floatValue();
+        }
+        if(height > 2000){
+            heightScale = new BigDecimal(2000).divide(new BigDecimal(height),5, BigDecimal.ROUND_DOWN).floatValue();
+        }
+        scale = widthScale > heightScale ? heightScale : widthScale;
+        ImgUtil.scale(new File(tempFile.getPath()), new File(tempFile.getPath()), scale);
+
+        String orgImgOssPath = "body_segment/original/" + tempFile.getName();
+//        ossBodySegmentUtil.uploadOss(tempFile.getPath(), orgImgOssPath);
+//        fYunFileService.uploadFile(bodySegmentBucket, tempFile.getPath(), orgImgOssPath);
+
+        BodySegmentStatusBean bodySegmentStatusBean = BodySegmentStatusBean.builder().uuid(uuid).status(CommonOperStatus.WAITING.code()).build();
+        redisUtil.set(String.format(RedisKey.SCENE_BODY_SEGMENT, uuid), JSON.toJSONString(bodySegmentStatusBean), RedisKey.CAMERA_EXPIRE_7_TIME);
+
+        Map<String, String> map = new HashMap<>();
+        map.put("uuid", uuid);
+        map.put("imgUrl", "https://" +  bodySegmentBucket + "." + bodySegmentHost + "/" + orgImgOssPath);
+//        rabbitMqProducer.sendByWorkQueue(queueName, map);
+
+        return ResultData.ok(uuid);
+    }
+
+    public static void main(String[] args) throws IOException {
+        Image rotateImg = ImgUtil.rotate(ImageIO.read(FileUtil.file("C:\\Users\\dsx\\Desktop\\IMG_6633.HEIC.JPG")), 90);
+        ImgUtil.write(rotateImg, FileUtil.file("C:\\Users\\dsx\\Desktop\\IMG_6633.HEIC_2.JPG"));
+    }
+
+    @Override
+    public void bodySegmentHandler(String imgUrl, String uuid) {
+        String progress = redisUtil.hget(RedisKey.SCENE_BODY_SEGMENT, uuid);
+        BodySegmentStatusBean bodySegmentStatusBean = null;
+        try {
+            if(StrUtil.isEmpty(progress)){
+                bodySegmentStatusBean = JSON.parseObject(progress, BodySegmentStatusBean.class);
+            }
+            if(Objects.isNull(bodySegmentStatusBean)){
+                bodySegmentStatusBean = new BodySegmentStatusBean();
+                bodySegmentStatusBean.setUuid(uuid);
+            }
+            String dir = ConstantFilePath.BASE_PATH + "/bodySegment/" +
+                    DateExtUtil.format(Calendar.getInstance().getTime(), DateExtUtil.dateStyle6);
+            String fileName = uuid + ".png";
+            String imgPath = dir + "/" + fileName;
+//            ossBodySegmentUtil.extracted(imgUrl, dir, fileName);
+            if(!FileUtil.exist(imgPath)){
+                throw new Exception("提取图片失败");
+            }
+            String targetOssImgPath = "body_segment/segment/" + uuid + ".png";
+//            fYunFileService.uploadFile(imgPath, targetOssImgPath);
+            bodySegmentStatusBean.setStatus(CommonOperStatus.SUCCESS.code());
+            bodySegmentStatusBean.setImageUrl(fYunFileConfig.getHost() + targetOssImgPath);
+            redisUtil.set(String.format(RedisKey.SCENE_BODY_SEGMENT, uuid), JSON.toJSONString(bodySegmentStatusBean), RedisKey.CAMERA_EXPIRE_7_TIME);
+        } catch (Exception e) {
+            bodySegmentStatusBean.setStatus(CommonOperStatus.FAILD.code());
+            redisUtil.set(String.format(RedisKey.SCENE_BODY_SEGMENT, uuid), JSON.toJSONString(bodySegmentStatusBean), RedisKey.CAMERA_EXPIRE_7_TIME);
+        }finally {
+            try {
+                //免费版qps不能大于2,故休眠一秒
+                Thread.sleep(1000L);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public ResultData getBodySegmentStatus(String uuid) {
+
+        String progress = redisUtil.get(String.format(RedisKey.SCENE_BODY_SEGMENT, uuid));
+        if(StrUtil.isEmpty(progress)){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5038);
+        }
+        BodySegmentStatusBean bodySegmentStatusBean = JSON.parseObject(progress, BodySegmentStatusBean.class);
+        return ResultData.ok(bodySegmentStatusBean);
+    }
+}