192.168.9.165 4 tuần trước cách đây
mục cha
commit
d8435f629c

+ 14 - 4
src/main/java/com/fdkankan/scene/ApplicationRunner.java

@@ -1,9 +1,13 @@
 package com.fdkankan.scene;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.CommonSuccessStatus;
+import com.fdkankan.common.constant.DownloadStatus;
 import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.config.FdkkLaserConfig;
@@ -62,8 +66,14 @@ public class ApplicationRunner implements CommandLineRunner {
         Integer javaPort = config.getInteger("laserPort");
         fdkkLaserConfig.setLaserPort(javaPort);
 
-
-        redisUtil.del(RedisKey.SCENE_DOWNLOAD_ING);
+        //项目重启,正在下载中的场景要改为失败状态,并删除redis缓存
+        List<String> downloadIngNums = redisUtil.lGet(RedisKey.SCENE_DOWNLOAD_ING, 0, -1);
+        if(CollUtil.isNotEmpty(downloadIngNums)){
+            for (String downloadIngNum : downloadIngNums) {
+                sceneDownloadLogService.updateStatusSceneNum(downloadIngNum, DownloadStatus.FAILD.code());
+            }
+            redisUtil.del(RedisKey.SCENE_DOWNLOAD_ING);
+        }
         Set keyFormatSet = redisUtil.keys(String.format(keyFormat, "*"));
         Set PREFIX_DOWNLOAD_PROGRESS_V4_SET = redisUtil.keys(String.format(RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4, "*"));
         for (Object o : keyFormatSet) {
@@ -72,7 +82,7 @@ public class ApplicationRunner implements CommandLineRunner {
         for (Object o : PREFIX_DOWNLOAD_PROGRESS_V4_SET) {
             redisUtil.del(o.toString());
         }
-        redisUtil.del(RedisKey.SCENE_DOWNLOADS_TASK_V4);
+//        redisUtil.del(RedisKey.SCENE_DOWNLOADS_TASK_V4);
         redisUtil.del(RedisKeyExt.BUILD_SCENE_OFFLINE_MESH);
 
 
@@ -86,7 +96,7 @@ public class ApplicationRunner implements CommandLineRunner {
                 sceneFileBuildService.updateById(sceneFileBuildEntity);
                 if (sceneFileBuildEntity.getBuildType().equals(BuildType.BUILD_MESH_OFFLINE)){
                     //路径不存在改为失败
-                    sceneDownloadLogService.removeBySceneNum(sceneFileBuildEntity.getSceneNum());
+//                    sceneDownloadLogService.updateStatusSceneNum(sceneFileBuildEntity.getSceneNum(), DownloadStatus.FAILD.code());
                     String key = String.format(RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4, sceneFileBuildEntity.getSceneNum());
                     redisUtil.del(key);
                     redisUtil.lRemove(RedisKey.SCENE_DOWNLOAD_ING, 1, sceneFileBuildEntity.getSceneNum());

+ 33 - 25
src/main/java/com/fdkankan/scene/service/impl/SceneDownloadHandlerServiceImpl.java

@@ -7,7 +7,6 @@ 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;
@@ -45,8 +44,6 @@ 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;
@@ -154,24 +151,7 @@ public class SceneDownloadHandlerServiceImpl {
             long consumeTime = Calendar.getInstance().getTimeInMillis() - startTime;
 
             log.info("场景下载结束 - num[{}] - threadName[{}] - consumeTime[{}]", num, Thread.currentThread().getName(), consumeTime);
-            //成功请求
-            Date endDate = new Date();
-            sceneFileBuildService.updateTimeAndStatus(downLoadTaskBean.getNum(),4,null,  endDate, BuildType.BUILD_MESH_OFFLINE,endDate);
-
-            //离线包下载成功,更新场景最后修改时间为当前时间
-            scenePlusService.update(new LambdaUpdateWrapper<ScenePlus>().set(ScenePlus::getLastEditTime, endDate).eq(ScenePlus::getNum, downLoadTaskBean.getNum()));
-
-            SceneFileBuildEntity buildBySceneNum = sceneFileBuildService.findBuildBySceneNum(num, BuildType.BUILD_MESH_OFFLINE);
-            if (buildBySceneNum != null&&!downLoadTaskBean.isFusion()){
-                SceneBuildLogEntity logEntity=new SceneBuildLogEntity();
-                logEntity.setSceneNum(num);
-                logEntity.setStartBuildTime(buildBySceneNum.getStartBuildTime());
-                logEntity.setEndBuildTime(endDate);
-                logEntity.setBuildType(buildBySceneNum.getBuildType());
-                logEntity.setFusionId(downLoadTaskBean.getFusionId());
-                sceneBuildLogService.save(logEntity);
-                laserClient.addNotifications(2,num,BuildType.BUILD_MESH_OFFLINE);
-            }
+
 
         }catch (Exception e){
             sceneDownloadLogService.update(
@@ -179,10 +159,7 @@ public class SceneDownloadHandlerServiceImpl {
                     .eq(SceneDownloadLog::getSceneNum,num)
                     .set(SceneDownloadLog::getStatus,2)
             );
-            Date date = new Date();
-            sceneFileBuildService.updateTimeAndStatus(num,-1,null,  new Date(), BuildType.BUILD_MESH_OFFLINE,date);
             log.info("场景下载失败 - num[{}] - threadName[{}]", num, Thread.currentThread().getName());
-            scenePlusService.update(new LambdaUpdateWrapper<ScenePlus>().set(ScenePlus::getLastEditTime, date).eq(ScenePlus::getNum, num));
             log.error(ExceptionUtil.stacktraceToString(e));
             if (!downLoadTaskBean.isFusion()) {
                 laserClient.addNotifications(3,num, BuildType.BUILD_MESH_OFFLINE);
@@ -211,6 +188,7 @@ public class SceneDownloadHandlerServiceImpl {
         //zip包路径
         String zipPath = null;
         try {
+
             TimeInterval timer = DateUtil.timer();
 
             //删除资源目录
@@ -278,9 +256,18 @@ public class SceneDownloadHandlerServiceImpl {
 //            String url = "/" + uploadPath + "?t=" + Calendar.getInstance().getTimeInMillis();
             this.updateProgress(null, num, SceneDownloadProgressStatus.DOWNLOAD_SUCCESS.code(), resultPath, "v4");
 
+            sceneDownloadLogService.updateStatusSceneNum(num, DownloadStatus.SUCCESS.code());
+
+            //成功请求
+            updateStatusAndLastEditTime(downLoadTaskBean,4);
+
+
+
         }catch (Exception e){
             //更新进度为下载失败
             this.updateProgress( null, num, SceneDownloadProgressStatus.DOWNLOAD_FAILED.code(), null, "v4");
+            sceneDownloadLogService.updateStatusSceneNum(num, DownloadStatus.FAILD.code());
+            updateStatusAndLastEditTime(downLoadTaskBean,-1);
             throw e;
         }
 //        finally {
@@ -289,6 +276,28 @@ public class SceneDownloadHandlerServiceImpl {
 //        }
     }
 
+    private void updateStatusAndLastEditTime(DownLoadTaskBean downLoadTaskBean, Integer status) {
+        Date endDate = new Date();
+        sceneFileBuildService.updateTimeAndStatus(downLoadTaskBean.getNum(),status,null,  endDate, BuildType.BUILD_MESH_OFFLINE,endDate);
+        //离线包下载成功,更新场景最后修改时间为当前时间
+        scenePlusService.update(new LambdaUpdateWrapper<ScenePlus>().set(ScenePlus::getLastEditTime, endDate).eq(ScenePlus::getNum, downLoadTaskBean.getNum()));
+        if(status != 4){//失败状态直接终止
+            return;
+        }
+        //添加下载完成记录(非融合下载)
+        SceneFileBuildEntity buildBySceneNum = sceneFileBuildService.findBuildBySceneNum(downLoadTaskBean.getNum(), BuildType.BUILD_MESH_OFFLINE);
+        if (buildBySceneNum != null&&!downLoadTaskBean.isFusion()){
+            SceneBuildLogEntity logEntity=new SceneBuildLogEntity();
+            logEntity.setSceneNum(downLoadTaskBean.getNum());
+            logEntity.setStartBuildTime(buildBySceneNum.getStartBuildTime());
+            logEntity.setEndBuildTime(endDate);
+            logEntity.setBuildType(buildBySceneNum.getBuildType());
+            logEntity.setFusionId(downLoadTaskBean.getFusionId());
+            sceneBuildLogService.save(logEntity);
+            laserClient.addNotifications(2,downLoadTaskBean.getNum(),BuildType.BUILD_MESH_OFFLINE);
+        }
+    }
+
     private SceneViewInfo getSceneJson(String num, String bucket){
         String sceneJsonData = redisUtil.get(String.format(RedisKey.SCENE_JSON, num));
         if(StrUtil.isEmpty(sceneJsonData)){
@@ -419,7 +428,6 @@ public class SceneDownloadHandlerServiceImpl {
             }catch (Exception e){
                 throw e;
             }
-//            Thread.sleep(500);
             //更新进度
             this.updateProgress(
                 new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),

+ 6 - 31
src/main/java/com/fdkankan/scene/service/impl/SceneDownloadLogServiceImpl.java

@@ -230,21 +230,12 @@ public class SceneDownloadLogServiceImpl extends ServiceImpl<ISceneDownloadLogMa
                 .eq(SceneDownloadLog::getSceneNum, num)
 //                .eq(SceneDownloadLog::getLang, lang)
                 .last("limit 1"));
-        List<String> taskList = redisUtil.lGet(RedisKey.SCENE_DOWNLOADS_TASK_V4, 0, -1);
-        boolean onTask = false;
-        if(CollUtil.isNotEmpty(taskList) && taskList.contains(num)){
-            onTask = true;
-        }
-        List<String> downloadingList = redisUtil.lGet(RedisKey.SCENE_DOWNLOAD_ING, 0, -1);
-        boolean onDownloading = false;
-        if(CollUtil.isNotEmpty(downloadingList) && downloadingList.contains(num)){
-            onDownloading = true;
-        }
-        if(Objects.isNull(sceneDownloadLog) || (!onTask && !onDownloading)){//如果没有记录,则没有生成过
+        if(Objects.isNull(sceneDownloadLog) ){//如果没有记录,则没有生成过
             result.put("status", -1);
             return result;
         }
 
+        //-1 未生成 ,0:正在生成 1,完成  2,下载失败 3,重新生成
         Integer status = sceneDownloadLog.getStatus();
         //成功或者失败,直接返回
         if(status == DownloadStatus.SUCCESS.code() || status == DownloadStatus.FAILD.code()){
@@ -256,10 +247,11 @@ public class SceneDownloadLogServiceImpl extends ServiceImpl<ISceneDownloadLogMa
             }
             return result;
         }
-        //下载中,从redis中获取下载进度,并根据状态更新数据库
+        //数据库有记录,且状态是0,代表进行中或者还没开始
+        //查询redis进度条
         String key=String.format(RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4,num);
-        if (!redisUtil.hasKey(key)){
-            result.put("status", DownloadStatus.DOWNLOADING.code());
+        if (!redisUtil.hasKey(key)){//没有进度条,证明还没开始
+            result.put("status", 3);//3代表排队中
             result.put("percent", 0);
             return result;
         }
@@ -267,30 +259,13 @@ public class SceneDownloadLogServiceImpl extends ServiceImpl<ISceneDownloadLogMa
         String processStr = redisUtil.get(key);
         downLoadProgressBean = JSONObject.parseObject(processStr, DownLoadProgressBean.class);
         if (downLoadProgressBean.getStatus()== 1002){//下载成功,更新数据库表
-            //写库
-            sceneDownloadLog.setStatus(DownloadStatus.SUCCESS.code());
-            sceneDownloadLog.setDownloadUrl(downLoadProgressBean.getUrl());
-            sceneDownloadLog.setUpdateTime(new Date());
-            this.updateById(sceneDownloadLog);
-//            final Scene scene = sceneService.getBySceneCode(num);
-//            downLoadProgressBean.setUrl(this.publicUrl+":"+fdkkLaserConfig.getLaserPort()+ "/" + scene.getMapping() +downLoadProgressBean.getUrl());
             result.put("status", DownloadStatus.SUCCESS.code());
             result.put("percent", 100);
-            result.put("rebuildOffline", this.rebuildOffline(sceneDownloadLog));
             result.put("path", downLoadProgressBean.getUrl());
             result.put("buildOfflineEndTime", sceneDownloadLog.getUpdateTime());
             return result;
         }
         if(downLoadProgressBean.getStatus()== 1003){//下载失败,更新数据库表
-            //写库
-            sceneDownloadLog.setStatus(DownloadStatus.FAILD.code());
-            sceneDownloadLog.setUpdateTime(new Date());
-            this.updateById(sceneDownloadLog);
-            Date date = new Date();
-            sceneFileBuildService.updateTimeAndStatus(sceneDownloadLog.getSceneNum(),-1,null,  new Date(), BuildType.BUILD_MESH_OFFLINE,date);
-            scenePlusService.update(new LambdaUpdateWrapper<ScenePlus>().set(ScenePlus::getLastEditTime, date).eq(ScenePlus::getNum, sceneDownloadLog.getSceneNum()));
-
-
             result.put("status", DownloadStatus.SUCCESS.code());
             result.put("percent", downLoadProgressBean.getPercent());
             return result;