123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705 |
- package com.fdkankan.scene.service.impl;
- import cn.hutool.core.collection.CollUtil;
- import cn.hutool.core.collection.ConcurrentHashSet;
- import cn.hutool.core.date.DateUtil;
- import cn.hutool.core.date.TimeInterval;
- import cn.hutool.core.exceptions.ExceptionUtil;
- import cn.hutool.core.io.FileUtil;
- import cn.hutool.core.util.StrUtil;
- import cn.hutool.core.util.ZipUtil;
- import cn.hutool.extra.spring.SpringUtil;
- import cn.hutool.http.HttpUtil;
- import cn.hutool.json.JSONObject;
- import cn.hutool.json.JSONUtil;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.serializer.SerializerFeature;
- import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
- import com.fdkankan.common.constant.*;
- import com.fdkankan.common.exception.BusinessException;
- import com.fdkankan.common.util.FileUtils;
- import com.fdkankan.scene.bean.*;
- import com.fdkankan.scene.config.FdkkLaserConfig;
- import com.fdkankan.scene.config.ServiceConfig;
- import com.fdkankan.scene.entity.*;
- import com.fdkankan.scene.oss.OssUtil;
- import com.fdkankan.scene.service.*;
- import com.fdkankan.model.constants.UploadFilePath;
- import com.fdkankan.redis.constant.RedisKey;
- import com.fdkankan.redis.util.RedisUtil;
- import com.fdkankan.scene.bean.ImageType;
- import com.fdkankan.scene.vo.SceneEditControlsVO;
- import com.fdkankan.scene.vo.SceneViewInfo;
- import com.google.common.collect.Lists;
- import lombok.extern.slf4j.Slf4j;
- import lombok.var;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.scheduling.annotation.Async;
- import org.springframework.stereotype.Service;
- import javax.annotation.Resource;
- import java.io.File;
- import java.io.FileInputStream;
- import java.math.BigDecimal;
- import java.nio.charset.Charset;
- import java.nio.charset.StandardCharsets;
- import java.util.*;
- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Future;
- import java.util.concurrent.atomic.AtomicInteger;
- import java.util.stream.Collectors;
- /**
- * <p>
- * TODO
- * </p>
- *
- * @author dengsixing
- * @since 2022/2/22
- **/
- @Slf4j
- @Service
- public class SceneDownloadHandlerServiceImpl {
- private static final String[] prefixArr = new String[]{
- UploadFilePath.DATA_VIEW_PATH,
- UploadFilePath.VOICE_VIEW_PATH,
- UploadFilePath.VIDEOS_VIEW_PATH,
- UploadFilePath.IMG_VIEW_PATH,
- UploadFilePath.USER_VIEW_PATH,
- };
- private static final String[] prefixArr4v3 = new String[]{
- "data/data%s/", "images/images%s/", "voice/voice%s/", "video/video%s/"
- };
- private static final List<ImageType> imageTypes = Lists.newArrayList();
- static{
- imageTypes.add(ImageType.builder().name("4k_face").size("4096").ranges(new String[]{"0", "511", "1023", "1535", "2047","2559","3071","3583"}).build());
- imageTypes.add(ImageType.builder().name("2k_face").size("2048").ranges(new String[]{"0", "511", "1023", "1535"}).build());
- imageTypes.add(ImageType.builder().name("1k_face").size("1024").ranges(new String[]{"0", "511"}).build());
- imageTypes.add(ImageType.builder().name("512_face").size("512").ranges(new String[]{"0"}).build());
- }
- @Value("${url.v3.getInfo}")
- private String v3GetInfoUrl;
- @Value("${path.v4school}")
- private String v4localPath;
- @Value("${path.v3school}")
- private String v3localPath;
- @Value("${path.zip-local}")
- private String zipLocalFormat;
- @Value("${path.source-local}")
- private String sourceLocal;
- @Value("${path.zip-oss}")
- private String zipOssFormat;
- @Value("${path.zip-root}")
- private String wwwroot;
- @Value("${zip.nThreads}")
- private int zipNthreads;
- @Value("${fyun.bucket:4dkankan}")
- private String bucket;
- @Value("${download.config.resource-url}")
- private String resourceUrl;
- @Value("${download.config.public-url}")
- private String publicUrl;
- @Value("${download.config.exe-name}")
- private String exeName;
- @Value("${download.config.exe-content}")
- private String exeContent;
- @Value("${download.config.exe-content-v3}")
- private String exeContentV3;
- @Autowired
- private RedisUtil redisUtil;
- @Resource
- private OssUtil ossUtil;
- @Autowired
- private IScenePlusService scenePlusService;
- @Autowired
- private IScenePlusExtService scenePlusExtService;
- @Autowired
- private ISceneProService sceneProService;
- @Autowired
- ISceneDownloadLogService sceneDownloadLogService;
- @Async("sceneDownLoadExecutror")
- public void download(DownLoadTaskBean downLoadTaskBean){
- //场景码
- String num = null;
- try {
- num = downLoadTaskBean.getNum();
- log.info("场景下载开始 - num[{}] - threadName[{}]", num, Thread.currentThread().getName());
- long startTime = Calendar.getInstance().getTimeInMillis();
- //执行场景下载逻辑
- this.downloadHandler(downLoadTaskBean);
- //耗时
- long consumeTime = Calendar.getInstance().getTimeInMillis() - startTime;
- log.info("场景下载结束 - num[{}] - threadName[{}] - consumeTime[{}]", num, Thread.currentThread().getName(), consumeTime);
- }catch (Exception e){
- sceneDownloadLogService.update(
- new LambdaUpdateWrapper<SceneDownloadLog>()
- .eq(SceneDownloadLog::getSceneNum,num)
- .set(SceneDownloadLog::getStatus,2)
- );
- log.error(ExceptionUtil.stacktraceToString(e));
- }finally {
- if(StrUtil.isNotEmpty(num)){
- //本地正在下载任务出队
- CurrentDownloadNumUtil.removeSceneNum(num, "v4");
- //删除正在下载任务
- redisUtil.lRemove(RedisKey.SCENE_DOWNLOAD_ING, 1, num);
- }
- }
- }
- @Async("sceneDownLoadExecutror")
- public void downloadV3(DownLoadTaskBean downLoadTaskBean){
- //场景码
- String num = null;
- try {
- num = downLoadTaskBean.getSceneNum();
- log.info("v3场景下载开始 - num[{}] - threadName[{}]", num, Thread.currentThread().getName());
- long startTime = Calendar.getInstance().getTimeInMillis();
- //执行场景下载逻辑
- this.downloadHandlerV3(downLoadTaskBean);
- //耗时
- long consumeTime = Calendar.getInstance().getTimeInMillis() - startTime;
- log.info("v3场景下载结束 - num[{}] - threadName[{}] - consumeTime[{}]", num, Thread.currentThread().getName(), consumeTime);
- }catch (Exception e){
- log.error(ExceptionUtil.stacktraceToString(e));
- }finally {
- if(StrUtil.isNotEmpty(num)){
- //本地正在下载任务出队
- CurrentDownloadNumUtil.removeSceneNum(num, "v3");
- //删除正在下载任务
- redisUtil.lRemove(RedisKey.SCENE_V3_DOWNLOAD_ING, 1, num);
- }
- }
- }
- public void downloadHandler(DownLoadTaskBean downLoadTaskBean) throws Exception{
- String num = downLoadTaskBean.getNum();
- //zip包路径
- String zipPath = null;
- try {
- TimeInterval timer = DateUtil.timer();
- //删除资源目录
- FileUtil.del(String.format(this.sourceLocal, num, ""));
- ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
- if(Objects.isNull(scenePlus))
- throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
- ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
- String bucket = scenePlusExt.getYunFileBucket();
- Set<String> cacheKeys = new ConcurrentHashSet<>();
- Map<String, List<String>> allFiles = this.getAllFiles(num, v4localPath, bucket);
- List<String> ossFilePaths = allFiles.get("ossFilePaths");
- List<String> v4localFilePaths = allFiles.get("localFilePaths");
- //key总个数
- int total = ossFilePaths.size() + v4localFilePaths.size();
- AtomicInteger count = new AtomicInteger(0);
- //定义压缩包
- zipPath = String.format(this.zipLocalFormat, num);
- File zipFile = new File(zipPath);
- if(!zipFile.getParentFile().exists()){
- zipFile.getParentFile().mkdirs();
- }
- SceneViewInfo sceneViewInfo = this.getSceneJson(num, bucket);
- String resolution = sceneViewInfo.getSceneResolution();
- //国际版存在已经切好图的情况,下载时不需要再切图,只需要把文件直接下载下来打包就可以了
- if(SceneKind.FACE.code().equals(sceneViewInfo.getSceneKind())){
- resolution = "notNeadCut";
- }
- int imagesVersion = -1;
- Integer version = sceneViewInfo.getVersion();
- if(Objects.nonNull(version)){
- imagesVersion = version;
- }
- //固定文件写入
- this.zipLocalFiles(v4localFilePaths, v4localPath, num, count, total, "v4");
- log.info("打包固定文件耗时, num:{}, time:{}", num, timer.intervalRestart());
- //oss文件写入
- this.zipOssFiles(bucket, ossFilePaths, num, count, total, resolution, imagesVersion, cacheKeys, "v4");
- log.info("打包oss文件耗时, num:{}, time:{}", num, timer.intervalRestart());
- //重新写入scene.json(去掉密码访问设置)
- this.zipSceneJson(num, sceneViewInfo);
- //写入启动命令
- this.zipBat(num, "v4", downLoadTaskBean.getLang());
- //打压缩包
- ZipUtil.zip(String.format(this.sourceLocal, num, ""), zipPath, Charset.forName("GBK"), true);
- //上传压缩包
- String uploadPath = String.format(this.zipOssFormat, num);
- ossUtil.uploadFile(bucket, uploadPath, zipPath, false);
- ServiceConfig serviceConfig = SpringUtil.getBean(ServiceConfig.class);
- //更新进度100
- String url = "/" + uploadPath + "?t=" + Calendar.getInstance().getTimeInMillis();
- this.updateProgress(null, num, SceneDownloadProgressStatus.DOWNLOAD_SUCCESS.code(), url, "v4");
- }catch (Exception e){
- //更新进度为下载失败
- this.updateProgress( null, num, SceneDownloadProgressStatus.DOWNLOAD_FAILED.code(), null, "v4");
- throw e;
- }finally {
- FileUtil.del(zipPath);
- FileUtil.del(String.format(this.sourceLocal, num, ""));
- }
- }
- private SceneViewInfo getSceneJson(String num, String bucket){
- String sceneJsonData = redisUtil.get(String.format(RedisKey.SCENE_JSON, num));
- if(StrUtil.isEmpty(sceneJsonData)){
- sceneJsonData = ossUtil.getFileContent(bucket, String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json");
- }
- sceneJsonData = sceneJsonData.replace(this.publicUrl, "");
- SceneViewInfo sceneInfoVO = JSON.parseObject(sceneJsonData, SceneViewInfo.class);
- sceneInfoVO.setScenePassword(null);
- if(Objects.isNull(sceneInfoVO.getFloorPlanAngle())){
- sceneInfoVO.setFloorPlanAngle(0f);
- }
- if(Objects.isNull(sceneInfoVO.getFloorPlanCompass())){
- sceneInfoVO.setFloorPlanCompass(0f);
- }
- SceneEditControlsVO controls = sceneInfoVO.getControls();
- if(Objects.isNull(controls.getShowShare())){
- controls.setShowShare(CommonStatus.YES.code().intValue());
- }
- if(Objects.isNull(controls.getShowCapture())){
- controls.setShowCapture(CommonStatus.YES.code().intValue());
- }
- if(Objects.isNull(controls.getShowBillboardTitle())){
- controls.setShowBillboardTitle(CommonStatus.YES.code().intValue());
- }
- return sceneInfoVO;
- }
- public void downloadHandlerV3(DownLoadTaskBean downLoadTaskBean) throws Exception{
- String num = downLoadTaskBean.getSceneNum();
- //zip包路径
- String zipPath = null;
- try {
- TimeInterval timer = DateUtil.timer();
- //删除资源目录
- FileUtil.del(String.format(this.sourceLocal, num, ""));
- ScenePro scenePro = sceneProService.getByNum(num);
- if(Objects.isNull(scenePro))
- throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
- Set<String> cacheKeys = new ConcurrentHashSet<>();
- Map<String, List<String>> allFiles = this.getAllFilesV3(num, v3localPath, bucket);
- List<String> ossFilePaths = allFiles.get("ossFilePaths");
- List<String> v3localFilePaths = allFiles.get("localFilePaths");
- //key总个数
- int total = ossFilePaths.size() + v3localFilePaths.size();
- AtomicInteger count = new AtomicInteger(0);
- //定义压缩包
- zipPath = String.format(this.zipLocalFormat, num);
- File zipFile = new File(zipPath);
- if(!zipFile.getParentFile().exists()){
- zipFile.getParentFile().mkdirs();
- }
- int imagesVersion =0;
- String resolution = "2k";
- JSONObject getInfoJson = this.getInfo(num);
- imagesVersion = getInfoJson.getInt("imagesVersion");
- // 转台、激光显示4k图片
- if(getInfoJson.getInt("sceneSource") == 3 || getInfoJson.getInt("sceneSource") == 4){
- resolution = "4k";
- }
- //固定文件写入
- timer.intervalRestart();
- this.zipLocalFiles(v3localFilePaths, v3localPath, num, count, total, "v3");
- log.info("打包固定文件耗时, num:{}, time:{}", num, timer.intervalRestart());
- //oss文件写入
- this.zipOssFiles(null, ossFilePaths, num, count, total, resolution, imagesVersion, cacheKeys, "v3");
- log.info("打包oss文件耗时, num:{}, time:{}", num, timer.intervalRestart());
- //重新写入scene.json(去掉密码访问设置)
- this.zipGetInfoJson(num, getInfoJson);
- //写入启动命令
- this.zipBat(num, "v3", downLoadTaskBean.getLang());
- //打压缩包
- ZipUtil.zip(String.format(this.sourceLocal, num, ""), zipPath);
- //上传压缩包
- String uploadPath = String.format(this.zipOssFormat, num);
- ossUtil.uploadFile(bucket, uploadPath, zipPath, false);
- ServiceConfig serviceConfig = SpringUtil.getBean(ServiceConfig.class);
- //更新进度100
- String url = "/" + uploadPath + "?t=" + Calendar.getInstance().getTimeInMillis();
- this.updateProgress(null, num, SceneDownloadProgressStatus.DOWNLOAD_SUCCESS.code(), url, "v3");
- }catch (Exception e){
- //更新进度为下载失败
- this.updateProgress( null, num, SceneDownloadProgressStatus.DOWNLOAD_FAILED.code(), null, "v3");
- throw e;
- }finally {
- FileUtil.del(zipPath);
- FileUtil.del(String.format(this.sourceLocal, num, ""));
- }
- }
- private JSONObject getInfo(String num){
- String url = String.format(v3GetInfoUrl, num);
- String getInfoResult = HttpUtil.get(url);
- JSONObject jsonObject = JSONUtil.parseObj(getInfoResult);
- if(Objects.isNull(jsonObject)
- || !ServerCode.SUCCESS.code().equals(jsonObject.getInt("code"))
- || Objects.isNull(jsonObject.getJSONObject("data"))){
- throw new RuntimeException("获取getInfo信息失败,url=" + url);
- }
- JSONObject data = jsonObject.getJSONObject("data");
- if (data.getInt("sceneSource") != 2)
- {
- data.set("sceneScheme", 3);
- }
- data.set("needKey", 0);
- data.set("sceneKey", "");
- return data;
- }
- private void zipOssFiles(String bucket, List<String> ossFilePaths, String num, AtomicInteger count,
- int total, String resolution, int imagesVersion, Set<String> cacheKeys, String version) throws Exception{
- if(CollUtil.isEmpty(ossFilePaths)){
- return;
- }
- String imageNumPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
- if("v3".equals(version)){
- imageNumPath = String.format("images/images%s/", num);
- }
- ExecutorService executorService = Executors.newFixedThreadPool(this.zipNthreads);
- List<Future> futureList = new ArrayList<>();
- for (String filePath : ossFilePaths) {
- String finalImageNumPath = imageNumPath;
- Callable<Boolean> call = new Callable() {
- @Override
- public Boolean call() throws Exception {
- zipOssFilesHandler(bucket, num, count, total, resolution,
- imagesVersion, cacheKeys,filePath, finalImageNumPath, version);
- return true;
- }
- };
- futureList.add(executorService.submit(call));
- }
- //这里一定要加阻塞,不然会导致oss文件还没打包好,主程序已经结束返回了
- Boolean zipSuccess = true;
- for (Future future : futureList) {
- try {
- future.get();
- }catch (Exception e){
- log.error("打包oss文件失败", e);
- zipSuccess = false;
- }
- }
- if(!zipSuccess){
- throw new Exception("打包oss文件失败");
- }
- }
- private void zipOssFilesHandler(String bucket, String num,
- AtomicInteger count, int total, String resolution,
- int imagesVersion, Set<String> cacheKeys,
- String filePath, String imageNumPath, String version) throws Exception{
- if(filePath.endsWith("/")){
- //更新进度
- this.updateProgress(new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
- num, SceneDownloadProgressStatus.DOWNLOADING.code(), null, version);
- return;
- }
- //某个目录不需要打包
- if(filePath.contains(imageNumPath + "panorama/panorama_edit/"))
- return;
- //切图
- if(!"notNeadCut".equals(resolution)){
- if((filePath.contains(imageNumPath + "panorama/") && filePath.contains("tiles/" + resolution))
- || filePath.contains(imageNumPath + "tiles/" + resolution + "/")) {
- this.processImage(num, filePath, resolution, imagesVersion, cacheKeys);
- //更新进度
- this.updateProgress(new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
- num, SceneDownloadProgressStatus.DOWNLOADING.code(), null, version);
- return;
- }
- }
- //其他文件打包
- this.ProcessFiles(bucket, num, filePath, this.wwwroot, cacheKeys);
- //更新进度
- this.updateProgress(new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
- num, SceneDownloadProgressStatus.DOWNLOADING.code(), null, version);
- }
- private void zipLocalFiles(List<String> localFilePaths, String v3localPath, String num, AtomicInteger count, int total, String version) throws Exception{
- String sourcePath = String.format(this.sourceLocal, num, "");
- String localPath = "v4".equals(version) ? this.v4localPath : this.v3localPath;
- for (String localFilePath : localFilePaths) {
- try (FileInputStream in = new FileInputStream(new File(localFilePath));){
- // this.zipInputStream(out, localFilePath.replace(v3localPath, ""), in);
- FileUtil.copy(localFilePath, localFilePath.replace(localPath, sourcePath), true);
- }catch (Exception e){
- throw e;
- }
- //更新进度
- this.updateProgress(
- new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
- num, SceneDownloadProgressStatus.DOWNLOAD_COMPRESSING.code(), null, version);
- }
- //写入code.txt
- // this.zipBytes(out, "code.txt", num.getBytes());
- FileUtil.writeUtf8String(num, String.format(sourceLocal, num, "code.txt"));
- }
- private void zipBat(String num, String version, String lang) throws Exception{
- String batContent = String.format(this.exeContent, num, lang);
- if("v3".equals(version)){
- batContent = String.format(this.exeContentV3, num, lang);
- }
- // this.zipBytes(out, exeName, batContent.getBytes());
- FileUtil.writeUtf8String(batContent, String.format(this.sourceLocal, num, exeName));
- //更新进度为90%
- this.updateProgress(new BigDecimal("0.9").divide(new BigDecimal("0.8"), 6, BigDecimal.ROUND_HALF_UP), num,
- SceneDownloadProgressStatus.DOWNLOAD_COMPRESSING.code(), null, version);
- }
- private Map<String, List<String>> getAllFiles(String num, String v4localPath, String bucket) throws Exception{
- //列出oss所有文件路径
- List<String> ossFilePaths = new ArrayList<>();
- for (String prefix : prefixArr) {
- prefix = String.format(prefix, num);
- List<String> keys = ossUtil.listFiles(bucket, prefix);
- if(CollUtil.isEmpty(keys)){
- continue;
- }
- keys = keys.stream().filter(key->{
- if(key.contains("x-oss-process")){
- return false;
- }
- return true;
- }).collect(Collectors.toList());
- ossFilePaths.addAll(keys);
- }
- //列出v3local所有文件路径
- File file = new File(v4localPath);
- List<String> localFilePaths = FileUtils.list(file);
- HashMap<String, List<String>> map = new HashMap<>();
- map.put("ossFilePaths", ossFilePaths);
- map.put("localFilePaths", localFilePaths);
- return map;
- }
- private Map<String, List<String>> getAllFilesV3(String num, String v3localPath, String bucket) throws Exception{
- //列出oss所有文件路径
- List<String> ossFilePaths = new ArrayList<>();
- for (String prefix : prefixArr4v3) {
- prefix = String.format(prefix, num);
- List<String> keys = ossUtil.listFiles(bucket, prefix);
- if(CollUtil.isEmpty(keys)){
- continue;
- }
- keys = keys.stream().filter(key->{
- if(key.contains("x-oss-process")){
- return false;
- }
- return true;
- }).collect(Collectors.toList());
- ossFilePaths.addAll(keys);
- }
- //列出v3local所有文件路径
- File file = new File(v3localPath);
- List<String> localFilePaths = FileUtils.list(file);
- HashMap<String, List<String>> map = new HashMap<>();
- map.put("ossFilePaths", ossFilePaths);
- map.put("localFilePaths", localFilePaths);
- return map;
- }
- private void zipSceneJson(String num, SceneViewInfo sceneViewInfo) throws Exception{
- //访问密码置0
- SceneEditControlsVO controls = sceneViewInfo.getControls();
- controls.setShowLock(CommonStatus.NO.code().intValue());
- String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json";
- FileUtil.writeUtf8String(JSON.toJSONString(sceneViewInfo, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullNumberAsZero), String.format(this.sourceLocal, num, this.wwwroot + sceneJsonPath));
- }
- private void zipGetInfoJson(String num, JSONObject getInfo) throws Exception{
- //访问密码置0
- String getInfoKey = String.format("data/data%s/", num) + "getInfo.json";
- String getInfoStr = getInfo.toString().replace(this.publicUrl , "");
- FileUtil.writeUtf8String(getInfoStr, String.format(this.sourceLocal, num, this.wwwroot + getInfoKey));
- }
- private void processImage(String sceneNum, String key, String resolution, int imagesVersion, Set<String> imgKeys) throws Exception{
- if(key.contains("x-oss-process") || key.endsWith("/")){
- return;
- }
- String fileName = key.substring(key.lastIndexOf("/")+1, key.indexOf("."));
- String ext = key.substring(key.lastIndexOf("."));
- String[] arr = fileName.split("_skybox");
- String dir = arr[0];
- String num = arr[1];
- if(StrUtil.isEmpty(fileName)
- || StrUtil.isEmpty(ext)
- || (".jpg".equals(ext) && ".png".equals(ext))
- || StrUtil.isEmpty(dir)
- || StrUtil.isEmpty(num)){
- throw new Exception("本地下载图片资源不符合规则,key:" + key);
- }
- for (ImageType imageType : imageTypes) {
- if(imageType.getName().equals("4k_face") && !"4k".equals(resolution)){
- continue;
- }
- List<ImageTypeDetail> items = Lists.newArrayList();
- String[] ranges = imageType.getRanges();
- for(int i = 0; i < ranges.length; i++){
- String x = ranges[i];
- for(int j = 0; j < ranges.length; j++){
- String y = ranges[j];
- items.add(
- ImageTypeDetail.builder()
- .i(String.valueOf(i))
- .j(String.valueOf(j))
- .x(x)
- .y(y)
- .build()
- );
- }
- }
- for (ImageTypeDetail item : items) {
- String par = "?x-oss-process=image/resize,m_lfit,w_" + imageType.getSize() + "/crop,w_512,h_512,x_" + item.getX() + ",y_" + item.getY();
- var url = this.resourceUrl + key + par;
- var fky = key.split("/" + resolution + "/")[0] + "/" + dir + "/" + imageType.getName() + num + "_" + item.getI() + "_" + item.getJ() + ext;
- if(imgKeys.contains(fky)){
- continue;
- }
- imgKeys.add(fky);
- // HttpUtil.downloadFile(url, String.format(sourceLocal, sceneNum, this.wwwroot + fky));
- this.downloadFile(url, String.format(sourceLocal, sceneNum, this.wwwroot + fky));
- }
- }
- }
- public void downloadFile(String url, String path){
- File file = new File(path);
- if(!file.getParentFile().exists()){
- file.getParentFile().mkdirs();
- }
- HttpUtil.downloadFile(url, path);
- }
- public void ProcessFiles(String bucket, String num, String key, String prefix, Set<String> cacheKeys) throws Exception{
- if(cacheKeys.contains(key)){
- return;
- }
- if(key.equals(String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json")){
- return;
- }
- cacheKeys.add(key);
- String fileName = key.substring(key.lastIndexOf("/") + 1);
- // String url = this.resourceUrl + key.replace(fileName, URLEncoder.encode(fileName, "UTF-8")) + "?t=" + Calendar.getInstance().getTimeInMillis();
- // HttpUtil.downloadFile(url, String.format(sourceLocal, num, prefix + key));
- ossUtil.downloadFile(bucket, key,String.format(sourceLocal, num, prefix + key.replace(FdkkLaserConfig.getProfile(bucket),"")));
- // this.downloadFile(url, String.format(sourceLocal, num, prefix + key));
- }
- public void updateProgress(BigDecimal precent, String num, Integer status, String url, String version){
- SceneDownloadProgressStatus progressStatus = SceneDownloadProgressStatus.get(status);
- switch (progressStatus){
- case DOWNLOAD_SUCCESS:
- precent = new BigDecimal("100");
- break;
- case DOWNLOAD_FAILED:
- precent = new BigDecimal("0");
- break;
- default:
- precent = precent.multiply(new BigDecimal("0.8")).multiply(new BigDecimal("100"));
- }
- DownLoadProgressBean progress = null;
- String key = String.format(RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4, num);
- if("v3".equals(version)){
- key = String.format(RedisKey.PREFIX_DOWNLOAD_PROGRESS, num);
- }
- String progressStr = redisUtil.get(key);
- if(StrUtil.isEmpty(progressStr)){
- progress = DownLoadProgressBean.builder().percent(precent.intValue()).status(status).url(url).build();
- }else{
- progress = JSONUtil.toBean(progressStr, DownLoadProgressBean.class);
- //如果下载失败,进度不变
- if(status == SceneDownloadProgressStatus.DOWNLOAD_FAILED.code() && progress.getPercent() != null){
- precent = new BigDecimal(progress.getPercent());
- }
- progress.setPercent(precent.intValue());
- progress.setStatus(status);
- progress.setUrl(url);
- }
- redisUtil.set(key, JSONUtil.toJsonStr(progress));
- }
- }
|