|
@@ -9,12 +9,12 @@ import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.fdkankan.common.constant.CommonStatus;
|
|
|
-import com.fdkankan.model.constants.ConstantFilePath;
|
|
|
import com.fdkankan.common.constant.RecStatus;
|
|
|
-import com.fdkankan.common.util.FileUtil;
|
|
|
+import com.fdkankan.common.response.ResultData;
|
|
|
import com.fdkankan.common.util.FileUtils;
|
|
|
-import com.fdkankan.common.util.MatrixToImageWriterUtil;
|
|
|
import com.fdkankan.fyun.face.FYunFileServiceInterface;
|
|
|
+import com.fdkankan.image.MatrixToImageWriterUtil;
|
|
|
+import com.fdkankan.model.constants.ConstantFilePath;
|
|
|
import com.fdkankan.model.constants.UploadFilePath;
|
|
|
import com.fdkankan.model.utils.SceneUtil;
|
|
|
import com.fdkankan.redis.constant.RedisKey;
|
|
@@ -51,7 +51,10 @@ import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Map.Entry;
|
|
|
+import java.util.Objects;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+import javax.annotation.Resource;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
@@ -96,13 +99,15 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
private ISceneProService sceneProService;
|
|
|
@Autowired
|
|
|
private IScenePlusExtService scenePlusExtService;
|
|
|
- @Autowired
|
|
|
+ @Resource
|
|
|
private FYunFileServiceInterface fYunFileService;
|
|
|
@Autowired
|
|
|
private RedisUtil redisUtil;
|
|
|
+ @Value("${repair.caches-images:yes}")
|
|
|
+ private String copyCachesImages;
|
|
|
|
|
|
@Override
|
|
|
- public void upgrade(long sceneProId) throws Exception{
|
|
|
+ public void upgrade(long sceneProId, boolean reUpgrade) throws Exception{
|
|
|
|
|
|
ScenePro scenePro = sceneProService.getById(sceneProId);
|
|
|
//线程开始,正在执行线程数+1
|
|
@@ -111,27 +116,20 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
String imagePath = String.format("images/images%s/", num);
|
|
|
String videoPath = String.format("video/video%s/", num);
|
|
|
String voicePath = String.format("voice/voice%s/", num);
|
|
|
- String dataViewPath = String.format("scene_view_data/%s/data/", num);
|
|
|
- String imageViewPath = String.format("scene_view_data/%s/images/", num);
|
|
|
- String videoViewPath = String.format("scene_view_data/%s/video/", num);
|
|
|
- String voiceViewPath = String.format("scene_view_data/%s/voice/", num);
|
|
|
+ String dataViewPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
|
|
|
+ String imageViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
|
|
|
+ String videoViewPath = String.format(UploadFilePath.VIDEOS_VIEW_PATH, num);
|
|
|
+ String voiceViewPath = String.format(UploadFilePath.VOICE_VIEW_PATH, num);
|
|
|
long consumTime = 0;
|
|
|
long startTime = Calendar.getInstance().getTimeInMillis();
|
|
|
SceneRepairLog sceneRepairLog = null;
|
|
|
try {
|
|
|
- sceneRepairLog = sceneRepairLogService.getOne(new LambdaQueryWrapper<SceneRepairLog>().eq(SceneRepairLog::getNum, num));
|
|
|
- if(sceneRepairLog == null){
|
|
|
- sceneRepairLog = SceneRepairLog.builder()
|
|
|
- .num(scenePro.getNum())
|
|
|
- .reason("")
|
|
|
- .state(0).build();
|
|
|
- }else{
|
|
|
- sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
|
|
|
- sceneRepairLog.setReason("");
|
|
|
- sceneRepairLog.setState(0);
|
|
|
- }
|
|
|
- //写入日志
|
|
|
- sceneRepairLogService.saveOrUpdate(sceneRepairLog);
|
|
|
+ sceneRepairLog = sceneRepairLogService.getOne(
|
|
|
+ new LambdaQueryWrapper<SceneRepairLog>()
|
|
|
+ .eq(SceneRepairLog::getNum, num).eq(SceneRepairLog::getState, 0)
|
|
|
+ .orderByDesc(SceneRepairLog::getId)
|
|
|
+ .last("limit 1"));
|
|
|
+ this.upgradeLog(sceneRepairLog, num, 0, null, null);
|
|
|
|
|
|
SceneProEdit sceneProEdit = sceneProEditService.getOne(
|
|
|
new LambdaQueryWrapper<SceneProEdit>()
|
|
@@ -240,6 +238,11 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
|
|
|
sceneEditInfo.setTitle(scenePro.getSceneName());
|
|
|
sceneEditInfo.setVersion(sceneEditInfo.getVersion() + 1);
|
|
|
+ if(reUpgrade){//场景重算再掉的升级时,需要把imgVersion累加
|
|
|
+ sceneEditInfo.setImgVersion(sceneEditInfo.getImgVersion() + 1);
|
|
|
+ //如果是重算升级,需要重置平面图标识为否
|
|
|
+ sceneEditInfo.setFloorPlanUser(CommonStatus.NO.code().intValue());
|
|
|
+ }
|
|
|
sceneEditInfoService.updateById(sceneEditInfo);
|
|
|
|
|
|
}
|
|
@@ -266,26 +269,33 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
|
|
|
|
|
|
//将全景图缓存到缓存目录
|
|
|
- List<String> imagesList = cn.hutool.core.io.FileUtil.listFileNames(path + "/caches/images");
|
|
|
- String cachedImagesPath = String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
|
|
|
- //先清除旧的全景图
|
|
|
- cn.hutool.core.io.FileUtil.del(cachedImagesPath);
|
|
|
- String visionPath = path + "/results/vision.txt";
|
|
|
- List<String> panoramaImageList = SceneUtil.getPanoramaImageList(visionPath);
|
|
|
- imagesList.stream().forEach(fileName -> {
|
|
|
- if(panoramaImageList.contains(fileName)){
|
|
|
- String srcPath = path + "/caches/images/" + fileName;
|
|
|
- String targetPath = cachedImagesPath + fileName;
|
|
|
- log.info("源文件:{}, 目标文件:{}", srcPath, targetPath);
|
|
|
- cn.hutool.core.io.FileUtil.copy(srcPath, targetPath, true);
|
|
|
+ try {
|
|
|
+ List<String> imagesList = cn.hutool.core.io.FileUtil.listFileNames(path + "/caches/images");
|
|
|
+ String cachedImagesPath = String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
|
|
|
+ //先清除旧的全景图
|
|
|
+ cn.hutool.core.io.FileUtil.del(cachedImagesPath);
|
|
|
+ String visionPath = path + "/results/vision.txt";
|
|
|
+ List<String> panoramaImageList = SceneUtil.getPanoramaImageList(visionPath);
|
|
|
+ imagesList.stream().forEach(fileName -> {
|
|
|
+ if(panoramaImageList.contains(fileName)){
|
|
|
+ String srcPath = path + "/caches/images/" + fileName;
|
|
|
+ String targetPath = cachedImagesPath + fileName;
|
|
|
+ log.info("源文件:{}, 目标文件:{}", srcPath, targetPath);
|
|
|
+ cn.hutool.core.io.FileUtil.copy(srcPath, targetPath, true);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("拷贝全景图失败,num="+num, e);
|
|
|
+ if("yes".equals(copyCachesImages)){
|
|
|
+ throw e;
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
|
|
|
//户型图上传
|
|
|
String userEditPath = UploadFilePath.USER_EDIT_PATH + "floor-cad-%s.%s";
|
|
|
String userViewPath = UploadFilePath.USER_VIEW_PATH + "floor-cad-%s.%s";
|
|
|
String floorCadPath = path + "/results/floorplan_cad";
|
|
|
- List<String> floorCadList = FileUtil.getFileList(floorCadPath);
|
|
|
+ List<String> floorCadList = FileUtils.getFileList(floorCadPath);
|
|
|
if(CollUtil.isNotEmpty(floorCadList)){
|
|
|
floorCadList.stream().forEach(str->{
|
|
|
String substring = str.substring(str.lastIndexOf(File.separator) + 1);
|
|
@@ -309,6 +319,16 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
fYunFileService.copyFileInBucket(entry.getValue(), entry.getKey());
|
|
|
}
|
|
|
|
|
|
+ //上传vision.txt、vision2.txt
|
|
|
+ String visionTxtPath = scenePro.getDataSource() + "/results/vision.txt";
|
|
|
+ String vision2TxtPath = scenePro.getDataSource() + "/results/vision2.txt";
|
|
|
+ if(cn.hutool.core.io.FileUtil.exist(visionTxtPath)){
|
|
|
+ fYunFileService.uploadFile(visionTxtPath, imageViewPath + "vision.txt");
|
|
|
+ }
|
|
|
+ if(cn.hutool.core.io.FileUtil.exist(vision2TxtPath)){
|
|
|
+ fYunFileService.uploadFile(visionTxtPath, imageViewPath + "vision2.txt");
|
|
|
+ }
|
|
|
+
|
|
|
//完成数据库操作更新进度条为10
|
|
|
this.updateProgress(num, 90, ProgressStatus.DO_OSS.code());
|
|
|
|
|
@@ -329,8 +349,12 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
fYunFileService.copyFileInBucket(imagePath + "floorLogoImg.png", viewUsersPath + "floorLogo-user.png");
|
|
|
}
|
|
|
if("user".equals(sceneProEdit.getBgMusic())){
|
|
|
- fYunFileService.copyFileInBucket(imagePath + sceneProEdit.getBgMusicName(), editUsersPath + "music-user.mp3");
|
|
|
- fYunFileService.copyFileInBucket(imagePath + sceneProEdit.getBgMusicName(), viewUsersPath + "music-user.mp3");
|
|
|
+ String extName = "mp3";
|
|
|
+ if(StrUtil.isNotEmpty(sceneProEdit.getBgMusicName())){
|
|
|
+ extName = cn.hutool.core.io.FileUtil.extName(sceneProEdit.getBgMusicName());
|
|
|
+ }
|
|
|
+ fYunFileService.copyFileInBucket(imagePath + sceneProEdit.getBgMusicName(), editUsersPath + "music-user." + extName);
|
|
|
+ fYunFileService.copyFileInBucket(imagePath + sceneProEdit.getBgMusicName(), viewUsersPath + "music-user." + extName);
|
|
|
}
|
|
|
if(existLoadingLogo){
|
|
|
fYunFileService.copyFileInBucket(imagePath + "logo-main.png", editUsersPath + "loadingLogo-user.png");
|
|
@@ -401,6 +425,8 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
sceneJson.setVideos(JSON.parseObject(scenePro.getVideos()));
|
|
|
}
|
|
|
sceneJson.setVersion(sceneEditInfo.getVersion());
|
|
|
+ //发布马赛克列表
|
|
|
+ sceneJson.setMosaicList(this.getMosaicList(num));
|
|
|
//上传sceneJson文件
|
|
|
String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", num);
|
|
|
fYunFileService.uploadFile(JSON.toJSONBytes(sceneJson), sceneJsonPath);
|
|
@@ -411,10 +437,7 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
|
|
|
|
|
|
//记录日志
|
|
|
- sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
|
|
|
- sceneRepairLog.setState(1);
|
|
|
- sceneRepairLog.setConsumTime(consumTime);
|
|
|
- sceneRepairLogService.updateById(sceneRepairLog);
|
|
|
+ this.upgradeLog(sceneRepairLog, num, 1, null, consumTime);
|
|
|
|
|
|
//处理scenepro的升级状态和协作关系
|
|
|
sceneProService.upgradeToV4ResultSync(
|
|
@@ -433,11 +456,7 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
|
|
|
//记录日志
|
|
|
consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
|
|
|
- sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
|
|
|
- sceneRepairLog.setState(2);
|
|
|
- sceneRepairLog.setReason(ExceptionUtil.stacktraceToString(e));
|
|
|
- sceneRepairLog.setConsumTime(consumTime);
|
|
|
- sceneRepairLogService.updateById(sceneRepairLog);
|
|
|
+ this.upgradeLog(sceneRepairLog, num, 2, ExceptionUtil.stacktraceToString(e, 3000), consumTime);
|
|
|
} finally {
|
|
|
String lockKey = String.format(RedisLockKey.LOCK_SCENE_UPGRADE_V4, num);
|
|
|
redisUtil.del(lockKey);
|
|
@@ -559,4 +578,29 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
|
|
|
.num(num).status(status)
|
|
|
.progress(progress).build()));
|
|
|
}
|
|
|
+
|
|
|
+ private void upgradeLog(SceneRepairLog sceneRepairLog, String num, int status, String reason, Long consumTime){
|
|
|
+ //写入升级日志
|
|
|
+ if(Objects.isNull(sceneRepairLog)){
|
|
|
+ sceneRepairLog = new SceneRepairLog();
|
|
|
+ sceneRepairLog.setNum(num);
|
|
|
+ }
|
|
|
+ sceneRepairLog.setConsumTime(consumTime);
|
|
|
+ sceneRepairLog.setState(status);
|
|
|
+ sceneRepairLog.setReason(reason);
|
|
|
+ sceneRepairLog.setCreateTime(Calendar.getInstance().getTime());
|
|
|
+ sceneRepairLogService.saveOrUpdate(sceneRepairLog);
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<JSONObject> getMosaicList(String num) throws Exception {
|
|
|
+
|
|
|
+ String key = String.format(RedisKey.SCENE_MOSAIC_DATA, num);
|
|
|
+ Map<String, String> map = redisUtil.hmget(key);
|
|
|
+ if(CollUtil.isEmpty(map)){
|
|
|
+ ResultData.ok(new String[0]);
|
|
|
+ }
|
|
|
+ return map.values().stream()
|
|
|
+ .map(mosaic-> JSON.parseObject(mosaic))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
}
|