ke
2024-05-15 d2c1cbb1cb2f008b3c858485a383720da67b029f
全景图更新切图功能kl  5-15 15
6 files modified
3 files added
288 ■■■■ changed files
skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/constant/LauncherConstant.java 4 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-ops-api/skjcmanager-resource-api/src/main/java/cn/gistack/resource/entity/FormateTuEntity.java 25 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-ops-api/skjcmanager-resource-api/src/main/java/cn/gistack/resource/entity/QieTuEntity.java 3 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-ops-api/skjcmanager-resource-api/src/main/java/cn/gistack/resource/feign/IOssClient.java 5 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-ops-api/skjcmanager-resource-api/src/main/java/cn/gistack/resource/feign/IOssClientFallback.java 5 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-ops/skjcmanager-resource/src/main/java/cn/gistack/resource/feign/OssClient.java 41 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/controller/SkPanoramaController.java 174 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/entity/ParamEntity.java 12 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/utils/PanoramaUtilDict.java 19 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/constant/LauncherConstant.java
@@ -40,7 +40,7 @@
    /**
     * nacos dev 地址
     */
    String NACOS_DEV_ADDR = "127.0.0.1:8849";
    String NACOS_DEV_ADDR = "127.0.0.1:8848";
    /**
     * nacos prod 地址
@@ -50,7 +50,7 @@
    String NACOS_USERNAME = "nacos";
    String NACOS_PASSWORD = "1qaz!QAZ";
    String NACOS_PASSWORD = "nacos";
    /**
     * nacos test 地址
skjcmanager/skjcmanager-ops-api/skjcmanager-resource-api/src/main/java/cn/gistack/resource/entity/FormateTuEntity.java
New file
@@ -0,0 +1,25 @@
package cn.gistack.resource.entity;
import lombok.Data;
@Data
public class FormateTuEntity {
    private String picName;
    private String id;
    private String linshiUrl;
    private String resGuid;
    /**
     * 原始全景图片宽
     */
    private Integer  picheight;
    /**
     * 原始全景图片长
     */
    private Integer  picwidth;
}
skjcmanager/skjcmanager-ops-api/skjcmanager-resource-api/src/main/java/cn/gistack/resource/entity/QieTuEntity.java
@@ -2,6 +2,7 @@
import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -12,4 +13,6 @@
    private String resGuid;
    private ArrayList<FormateTuEntity> list;
}
skjcmanager/skjcmanager-ops-api/skjcmanager-resource-api/src/main/java/cn/gistack/resource/feign/IOssClient.java
@@ -28,8 +28,13 @@
    String API_PREFIX = "/client";
    String UPLOAD_QIETU = API_PREFIX + "/upload-qietu";
    String UPLOAD_FORMATETU = API_PREFIX + "/upload-formate";
    @PostMapping(UPLOAD_QIETU)
    R uploadQietu(@RequestBody QieTuEntity qieTuEntity) throws IOException;
    @PostMapping(UPLOAD_FORMATETU)
    R uploadFormate(@RequestBody QieTuEntity qieTuEntity) throws IOException;
    String UPLOAD_FILE = API_PREFIX + "uploadFile";
skjcmanager/skjcmanager-ops-api/skjcmanager-resource-api/src/main/java/cn/gistack/resource/feign/IOssClientFallback.java
@@ -42,7 +42,10 @@
        return R.fail("切图上传,远程调用失败");
    }
    @Override
    public R uploadFormate(QieTuEntity qieTuEntity) throws IOException {
        return R.fail("格式化图片上传,远程调用失败");
    }
    @Override
skjcmanager/skjcmanager-ops/skjcmanager-resource/src/main/java/cn/gistack/resource/feign/OssClient.java
@@ -1,6 +1,7 @@
package cn.gistack.resource.feign;
import cn.gistack.resource.builder.oss.OssBuilder;
import cn.gistack.resource.entity.FormateTuEntity;
import cn.gistack.resource.entity.QieTuEntity;
import cn.gistack.resource.panoramaUtils.QietuResult;
import com.alibaba.fastjson.JSON;
@@ -39,8 +40,9 @@
    @Override
    @PostMapping(UPLOAD_QIETU)
    public R uploadQietu(QieTuEntity qieTuEntity) throws IOException {
//    public R uploadQietu(HashMap<String,String> qietuHashMap,String resGuid) throws IOException {
        HashMap<String,String> qietuHashMap = qieTuEntity.getQietuHashMap();
        System.err.println("切图的路径:"+qietuHashMap);
        String resGuid = qieTuEntity.getResGuid();
        List<String> qieTuUrlList = new ArrayList<String>();
@@ -81,6 +83,43 @@
        return R.data(result);
    }
    @Override
    @PostMapping(UPLOAD_FORMATETU)
    public R uploadFormate(QieTuEntity qieTuEntity) throws IOException {
        ArrayList<FormateTuEntity> list = qieTuEntity.getList();
//        Set<String> mapKey = qietuHashMap.keySet();
        if(list != null && list.size()>0) {
            for (FormateTuEntity item : list) {
                String picName = item.getPicName();
                String url = item.getLinshiUrl();
                Path qietuPath = Paths.get(url);
                File qietufile = qietuPath.toFile();
                FileInputStream fileInputStream = new FileInputStream(qietufile);
                BladeFile bladeFile = ossBuilder.template().putFile(picName, fileInputStream);
                fileInputStream.close(); // 关闭文件流
                String link = bladeFile.getLink();
                // 临时图片上传完成后删除临时文件
                if (qietufile.exists()) {
                    // 删除指定文件,不存在报异常
                    FileUtils.forceDelete(qietufile);
                }
                item.setLinshiUrl(link);
            }
        }
        QieTuEntity result = new QieTuEntity();
        result.setList(list);
        return R.data(result);
    }
    @PostMapping(value = UPLOAD_FILE)
    public String uploadFile(String fileName,  MultipartFile file) throws Exception{
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/controller/SkPanoramaController.java
@@ -18,9 +18,12 @@
import cn.gistack.resource.entity.FormateTuEntity;
import cn.gistack.resource.entity.QieTuEntity;
import cn.gistack.resource.feign.IOssClient;
import cn.gistack.sm.skPanorama.entity.ParamEntity;
import cn.gistack.sm.skPanorama.utils.Img4JavaUtil;
import cn.gistack.sm.skPanorama.utils.PanoramaUtilDict;
import cn.gistack.sm.skPanoramaState.entity.SkPanoramaStateEntity;
import cn.gistack.sm.skPanoramaState.service.ISkPanoramaStateService;
import com.alibaba.fastjson.JSONObject;
@@ -245,43 +248,44 @@
    }
     */
    private static final String  linShiBaseUrl = "/data/panorama/qietu/";
    @GetMapping("/cutPicture2")
    public R cutPicture2(SkPanoramaEntity skPanorama)
        throws IOException, InterruptedException, IM4JavaException, IllegalAccessException {
        // 临时文件路径
        String  linShiBaseUrl = "/data/panorama/qietu/";
        SkPanoramaEntity entity = skPanoramaService.getOne(Condition.getQueryWrapper(skPanorama));
        String picUrl = entity.getPicUrl();
        String picName = entity.getPicName();
        String resGuid = entity.getResGuid();
        // 获取文件名
        String dirPath = linShiBaseUrl + resGuid + "/"; //临时文件夹路径
        String lingshiPic = linShiBaseUrl + resGuid + "/" + picName; //临时文件
        File dir = new File(dirPath);
        if (dir.isDirectory()) {
            // 清除该目录下的文件及子目录文件而不删除该目录文件夹。该目录不存在会报错
            FileUtils.cleanDirectory(dir);
        } else {
            dir.mkdirs();
        }
        // 线上全景图路径,下载到临时路径
        URL url = new URL(picUrl);
        InputStream inputStream = url.openStream();
        OutputStream outputStream = new FileOutputStream(lingshiPic);
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        inputStream.close();
        outputStream.close();
        Path lingshiqjPath = Paths.get(lingshiPic);
        File lingshiqjfile = lingshiqjPath.toFile(); // 获取临时全景文件,准备切图
//        File dir = new File(dirPath);
//        if (dir.isDirectory()) {
//            // 清除该目录下的文件及子目录文件而不删除该目录文件夹。该目录不存在会报错
//            FileUtils.cleanDirectory(dir);
//        } else {
//            dir.mkdirs();
//        }
//        // 线上全景图路径,下载到临时路径
//        URL url = new URL(picUrl);
//        InputStream inputStream = url.openStream();
//        OutputStream outputStream = new FileOutputStream(lingshiPic);
//        byte[] buffer = new byte[4096];
//        int bytesRead;
//        while ((bytesRead = inputStream.read(buffer)) != -1) {
//            outputStream.write(buffer, 0, bytesRead);
//        }
//        inputStream.close();
//        outputStream.close();
//        Path lingshiqjPath = Paths.get(lingshiPic);
//        File lingshiqjfile = lingshiqjPath.toFile(); // 获取临时全景文件,准备切图
        File lingshiqjfile = getquanjingFile(dirPath,lingshiPic,entity);
        /**
         * 这里开始切图
@@ -314,7 +318,7 @@
                Img4JavaUtil.cropImg(picUrl ,lastiUrl ,biliWidth,biliHeight,x,y);// 切图存放进临时图片中
                qietuHashMap.put(outpicName,lastiUrl);
                System.err.println(lastiUrl);
//                System.err.println(lastiUrl);
            }
        }
@@ -327,8 +331,9 @@
        /************************************切图结束********************************************/
        // 上传切片全景图
        System.err.println(qietuHashMap.size());
        System.err.println(resGuid);
        System.err.println("切图的路径数量"+qietuHashMap.size());
        System.err.println("水库编码"+resGuid);
        QieTuEntity qieTuEntity = new QieTuEntity();
        qieTuEntity.setQietuHashMap(qietuHashMap);
        qieTuEntity.setResGuid(resGuid);
@@ -349,12 +354,129 @@
        entity.setQiecol(col);
        entity.setPicwidth(width);
        entity.setPicheight(height);
        entity.setStatus(PanoramaUtilDict.panorama_status_3);
        skPanoramaService.updateById(entity);
        return R.status(true);
    }
    private File getquanjingFile (String dirPath ,String linshiUrl , SkPanoramaEntity skPanorama) throws IOException {
        SkPanoramaEntity entity = skPanoramaService.getOne(Condition.getQueryWrapper(skPanorama));
        String picUrl = entity.getPicUrl();
        String picName = entity.getPicName();
        String resGuid = entity.getResGuid();
        File dir = new File(dirPath);
        if (dir.isDirectory()) {
            // 清除该目录下的文件及子目录文件而不删除该目录文件夹。该目录不存在会报错
            FileUtils.cleanDirectory(dir);
        } else {
            dir.mkdirs();
        }
        // 线上全景图路径,下载到临时路径
        URL url = new URL(picUrl);
        InputStream inputStream = url.openStream();
        OutputStream outputStream = new FileOutputStream(linshiUrl);
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        inputStream.close();
        outputStream.close();
        Path lingshiqjPath = Paths.get(linshiUrl);
        File lingshiqjfile = lingshiqjPath.toFile(); // 获取临时全景文件
        return  lingshiqjfile;
    }
    /**
     * 图片格式化
     * 将图片转化为长宽比为2:1的比例
     */
    private static final String  linShiformateBaseUrl = "/data/panorama/formate/";
    @GetMapping("/formatePic")
    public R  formatePic(ParamEntity param) throws IOException, InterruptedException, IM4JavaException {
        List<String> idlist = param.getSkPanoramaIdList();
        ArrayList<SkPanoramaEntity> panoramalist = new ArrayList<SkPanoramaEntity>();
        ArrayList<FormateTuEntity> list = new ArrayList<FormateTuEntity>();
        if (idlist!= null && idlist.size()>0) {
            for (String id : idlist ) {
                FormateTuEntity formateTuEntity = new FormateTuEntity();
                SkPanoramaEntity skPanorama = new SkPanoramaEntity();
                skPanorama.setId(Long.valueOf(id));
                SkPanoramaEntity entity = skPanoramaService.getOne(Condition.getQueryWrapper(skPanorama));
                String picUrl = entity.getPicUrl();
                String picName = entity.getPicName();
                String resGuid = entity.getResGuid();
                // 获取文件名
                String dirPath = linShiformateBaseUrl + resGuid + "/"; //临时文件夹路径
                String lingshiPic = linShiformateBaseUrl + resGuid + "/" + picName; //临时文件
                String lingshigeshibiliPic = linShiformateBaseUrl + resGuid + "/geshibili/" + picName; //格式化后的临时文件
                File lingshiqjfile = getquanjingFile(dirPath,lingshiPic,entity);
                /**************进行格式化******************/
                // 获取原始全景图图片信息
                HashMap<String, Integer> imgInfoRT = Img4JavaUtil.getImgInfoRT(lingshiqjfile);
                Integer width = imgInfoRT.get("width");
                Integer height = imgInfoRT.get("height");
                Integer newWidth = height * 2;
                Img4JavaUtil.resizeImg(lingshiPic,lingshigeshibiliPic, newWidth , height);
                Path lingshiformPath = Paths.get(lingshigeshibiliPic);
                File lingshiformFile = lingshiformPath.toFile(); // 获取临时全景文件
                if(lingshiformFile.exists()) {
                    formateTuEntity.setPicName(picName);
                    formateTuEntity.setId(id);
                    formateTuEntity.setResGuid(resGuid);
                    formateTuEntity.setLinshiUrl(lingshigeshibiliPic);
                    formateTuEntity.setPicheight(height);
                    formateTuEntity.setPicwidth(newWidth);
                    list.add(formateTuEntity);
                }
            } // for循环结束
            QieTuEntity qieTuEntity = new QieTuEntity();
            qieTuEntity.setList(list);
            R r = iOssClient.uploadFormate(qieTuEntity);
            Object data = r.getData();
            QieTuEntity result = JSONObject.parseObject(JSONObject.toJSONString(data),QieTuEntity.class);
            ArrayList<FormateTuEntity> newList = result.getList();
            if (newList != null && newList.size()>0) {
                for (FormateTuEntity item : newList) {
                    SkPanoramaEntity skPanoramaEntity = new SkPanoramaEntity();
                    String id = item.getId();
                    String linshiUrl = item.getLinshiUrl();// 格式化后图片路径
                    Integer picheight = item.getPicheight();
                    Integer picwidth = item.getPicwidth();
                    skPanoramaEntity.setId(Long.valueOf(id));
                    skPanoramaEntity.setPicUrl(linshiUrl);
                    skPanoramaEntity.setPicheight(picheight);
                    skPanoramaEntity.setPicwidth(picwidth);
                    skPanoramaEntity.setStatus(PanoramaUtilDict.panorama_status_2);
                    panoramalist.add(skPanoramaEntity);
                }
            }
        }
        boolean b = skPanoramaService.updateBatchById(panoramalist);
        return R.status(true);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/entity/ParamEntity.java
New file
@@ -0,0 +1,12 @@
package cn.gistack.sm.skPanorama.entity;
import lombok.Data;
import java.util.List;
@Data
public class ParamEntity {
    private List<String> skPanoramaIdList;
}
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/skPanorama/utils/PanoramaUtilDict.java
New file
@@ -0,0 +1,19 @@
package cn.gistack.sm.skPanorama.utils;
public class PanoramaUtilDict {
    /**
     * 全景图上传状态
     * 1,已上传
     */
    public static final Integer panorama_status_1 = 1;
    /**
     * 全景图上传状态
     * 2,已格式化
     */
    public static final Integer panorama_status_2 = 2;
    /**
     * 全景图上传状态
     * 3,已切图
     */
    public static final Integer panorama_status_3 = 3;
}