Bladeren bron

老邓写的代码

dengsixing 3 jaren geleden
bovenliggende
commit
8da862d7a8

+ 12 - 0
pom.xml

@@ -77,6 +77,18 @@
         </dependency>
 
         <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-wechat</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-image</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>

+ 15 - 2
src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java

@@ -2,6 +2,7 @@ package com.fdkankan.scene.bean;
 
 import com.alibaba.fastjson.JSONObject;
 import java.util.Date;
+import java.util.List;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -88,6 +89,16 @@ public class SceneJsonBean {
      */
     private Integer version;
 
+    /**
+     * 版本
+     */
+    private Integer imgVersion;
+
+    /**
+     * 版本
+     */
+    private Integer linkVersion;
+
 //    /**
 //     * 户型图文件路径集合
 //     */
@@ -170,7 +181,9 @@ public class SceneJsonBean {
      */
     private Float floorPlanCompass;
 
-
-
+    /**
+     * 马赛克列表
+     */
+    private List<JSONObject> mosaicList;
 
 }

+ 12 - 0
src/main/java/com/fdkankan/scene/entity/SceneEditInfo.java

@@ -104,6 +104,18 @@ public class SceneEditInfo implements Serializable {
     private Integer version;
 
     /**
+     * 版本
+     */
+    @TableField("img_version")
+    private Integer imgVersion;
+
+    /**
+     * 版本
+     */
+    @TableField("link_version")
+    private Integer linkVersion;
+
+    /**
      * 是否上传模型
      */
     @TableField("is_upload_obj")

+ 6 - 2
src/main/java/com/fdkankan/scene/listener/RabbitMqListener.java

@@ -1,8 +1,10 @@
 package com.fdkankan.scene.listener;
 
+import com.alibaba.fastjson.JSON;
 import com.fdkankan.scene.service.ISceneUpgradeToV4Service;
 import com.rabbitmq.client.Channel;
 import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.amqp.core.Message;
 import org.springframework.amqp.rabbit.annotation.Queue;
@@ -43,9 +45,11 @@ public class RabbitMqListener {
         String correlationId = (String) correlation;
         String msg = new String(message.getBody(), StandardCharsets.UTF_8);
         log.info("场景升级开始,队列名:{},id:{},消息体:{}", upgradeToV4, correlationId, msg);
-        long sceneProId = Long.parseLong(msg);
+        HashMap hashMap = JSON.parseObject(msg, HashMap.class);
+        int sceneProId = (int)hashMap.get("sceneProId");
+        boolean reUpgrade = (boolean)hashMap.get("reUpgrade");
         //迁移数据
-        sceneUpgradeToV4Service.upgrade(sceneProId);
+        sceneUpgradeToV4Service.upgrade(sceneProId,reUpgrade);
         log.info("场景升级结束,队列名:{},id:{}", upgradeToV4, correlationId);
         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
     }

+ 1 - 1
src/main/java/com/fdkankan/scene/service/ISceneUpgradeToV4Service.java

@@ -10,6 +10,6 @@ package com.fdkankan.scene.service;
  **/
 public interface ISceneUpgradeToV4Service {
 
-    void upgrade(long sceneProId) throws Exception;
+    void upgrade(long sceneProId, boolean reUpgrade) throws Exception;
 
 }

+ 3 - 2
src/main/java/com/fdkankan/scene/service/impl/SceneProAppServiceImpl.java

@@ -13,7 +13,6 @@ import com.fdkankan.common.response.ResultData;
 import com.fdkankan.model.utils.CreateObjUtil;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.common.util.OkHttpUtils;
-import com.fdkankan.common.util.WeiXinUtils;
 import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.scene.bean.RequestSceneEdit;
@@ -23,6 +22,7 @@ import com.fdkankan.scene.mapper.ISceneProMapper;
 import com.fdkankan.scene.service.ISceneProAppService;
 import com.fdkankan.scene.service.ISceneProEditService;
 import com.fdkankan.scene.service.ISceneProService;
+import com.fdkankan.wechat.WeiXinUtils;
 import java.io.File;
 import java.io.InputStream;
 import java.io.PrintWriter;
@@ -32,6 +32,7 @@ import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import javax.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import net.coobird.thumbnailator.Thumbnails;
 import org.apache.commons.lang3.StringUtils;
@@ -51,7 +52,7 @@ public class SceneProAppServiceImpl extends ServiceImpl<ISceneProMapper, ScenePr
     private ISceneProService sceneProService;
     @Autowired
     private ISceneProEditService sceneProEditService;
-    @Autowired
+    @Resource
     private FYunFileServiceInterface fYunFileService;
     @Value("${hot.domain.list}")
     private String hotDomainList;

+ 1 - 1
src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -8,6 +8,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.image.MatrixToImageWriterUtil;
 import com.fdkankan.model.constants.ConstantFileName;
 import com.fdkankan.model.constants.ConstantFilePath;
 import com.fdkankan.common.constant.ConstantUrl;
@@ -18,7 +19,6 @@ import com.fdkankan.common.response.ResultData;
 import com.fdkankan.model.utils.ConvertUtils;
 import com.fdkankan.model.utils.CreateObjUtil;
 import com.fdkankan.common.util.FileUtils;
-import com.fdkankan.common.util.MatrixToImageWriterUtil;
 import com.fdkankan.common.util.OkHttpUtils;
 import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;

+ 91 - 47
src/main/java/com/fdkankan/scene/service/impl/SceneUpgradeToV4Service.java

@@ -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());
+    }
 }