dengsixing 10 ماه پیش
والد
کامیت
44e1b394de

+ 6 - 0
pom.xml

@@ -84,6 +84,12 @@
 
         <dependency>
             <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-fyun-obs</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
             <artifactId>4dkankan-utils-model</artifactId>
             <version>3.0.0-SNAPSHOT</version>
         </dependency>

+ 19 - 0
src/main/java/com/fdkankan/download/constant/ScrbCanstant.java

@@ -0,0 +1,19 @@
+package com.fdkankan.download.constant;
+
+public class ScrbCanstant {
+
+     public static class ObsCanstant{
+
+        public static final String scene_zip_key = "scene/zip/%s.zip";
+
+
+    }
+
+    public static class CmdCanstant{
+
+        public static final String cut_image = "cropFolde";
+
+
+    }
+
+}

+ 42 - 0
src/main/java/com/fdkankan/download/constant/UserEditDataType.java

@@ -0,0 +1,42 @@
+package com.fdkankan.download.constant;
+
+/**
+ * 文件业务类型
+ */
+public enum UserEditDataType {
+
+    BOX_MODEL("boxModel", "boxModelHandler"),
+    FLOORPLAN("floorplan", "floorplanHandler"),
+
+    FILTERS("filters", "filtersHandler"),
+    ;
+
+    private String code;
+    private String message;
+
+    private UserEditDataType(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public String code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+
+    public static UserEditDataType get(Integer code){
+        UserEditDataType[] values = UserEditDataType.values();
+        String enumValue = null;
+        for(UserEditDataType eachValue : values){
+            enumValue = eachValue.code();
+            if(enumValue.equals(code)){
+                return eachValue;
+            }
+        }
+        return null;
+    }
+
+}

+ 34 - 0
src/main/java/com/fdkankan/download/controller/ScrbController.java

@@ -0,0 +1,34 @@
+package com.fdkankan.download.controller;
+
+
+import com.fdkankan.download.service.IScrbService;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * pro场景表 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2022-10-17
+ */
+@RestController
+@RequestMapping("/download/scrb")
+public class ScrbController {
+
+    @Autowired
+    private IScrbService scrbService;
+
+    @PostMapping("/syncScene")
+    public ResultData syncScene(String num) throws Exception {
+        scrbService.syncScene(num);
+        return ResultData.ok();
+    }
+
+
+}
+

+ 4 - 0
src/main/java/com/fdkankan/download/factory/DemoFactory.java

@@ -0,0 +1,4 @@
+package com.fdkankan.download.factory;
+
+public interface DemoFactory {
+}

+ 66 - 0
src/main/java/com/fdkankan/download/factory/UserEditData/BoxModelHandler.java

@@ -0,0 +1,66 @@
+package com.fdkankan.download.factory.UserEditData;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.download.entity.SceneEditInfo;
+import com.fdkankan.download.entity.ScenePlus;
+import com.fdkankan.download.service.ISceneEditInfoService;
+import com.fdkankan.download.service.IScenePlusService;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+
+/**
+ * 初始化空间模型
+ */
+@Component("boxModelHandler")
+public class BoxModelHandler implements UserEditDataHandler {
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Override
+    public void init(String num, Map<String, Object> params) {
+        String modelEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num) + "boxModels";
+        String modelViewPath = String.format(UploadFilePath.USER_VIEW_PATH, num) + "boxModels";
+        String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json";
+
+        //修改数据库,将boxModels字段置为空
+        ScenePlus scenePlus = scenePlusService.getByNum(num);
+        SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+        sceneEditInfoService.update(new LambdaUpdateWrapper<SceneEditInfo>().set(SceneEditInfo::getBoxModels, null).eq(SceneEditInfo::getId, sceneEditInfo.getId()));
+
+        //更新scene.json
+        if(fYunFileService.fileExist(sceneJsonPath)){
+            String sceneJsonStr = fYunFileService.getFileContent(sceneJsonPath);
+            JSONObject sceneJson = JSON.parseObject(sceneJsonStr);
+            sceneJson.remove("boxModels");
+            sceneJsonStr = sceneJson.toJSONString();
+            fYunFileService.uploadFile(sceneJsonStr.getBytes(StandardCharsets.UTF_8), sceneJsonPath);
+            //scenejson写入缓存
+            redisUtil.set(String.format(RedisKey.SCENE_JSON, num), sceneJsonStr);
+        }
+
+        //删除oss资源
+        if(fYunFileService.fileExist(modelEditPath)){
+            fYunFileService.deleteFolder(modelEditPath);
+        }
+        if(fYunFileService.fileExist(modelViewPath)){
+            fYunFileService.deleteFolder(modelViewPath);
+        }
+    }
+}

+ 141 - 0
src/main/java/com/fdkankan/download/factory/UserEditData/FiltersHandler.java

@@ -0,0 +1,141 @@
+package com.fdkankan.download.factory.UserEditData;
+
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.SceneSource;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.download.entity.SceneEditInfo;
+import com.fdkankan.download.entity.SceneEditInfoExt;
+import com.fdkankan.download.entity.ScenePlus;
+import com.fdkankan.download.entity.ScenePlusExt;
+import com.fdkankan.download.service.ISceneEditInfoExtService;
+import com.fdkankan.download.service.ISceneEditInfoService;
+import com.fdkankan.download.service.IScenePlusExtService;
+import com.fdkankan.download.service.IScenePlusService;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.model.utils.SceneUtil;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 初始化空间模型
+ */
+@Slf4j
+@Component("filtersHandler")
+public class FiltersHandler implements UserEditDataHandler {
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Value("${env:gn}")
+    private String env;
+    @Resource
+    private RedisLockUtil redisLockUtil;
+
+    @Override
+    public void init(String num, Map<String, Object> params) throws Exception {
+
+        //国际服且看看且没有滤镜数据的才需要生成默认滤镜信息
+        if(!"eur".equals(env)){
+            return;
+        }
+        log.info("国际环境,开始初始化滤镜,num:{}", num);
+        ScenePlus scenePlus = scenePlusService.getByNum(num);
+        if(scenePlus.getSceneSource() != SceneSource.BM.code()){
+            return;
+        }
+        log.info("看看场景,开始初始化滤镜,num:{}", num);
+        ScenePlusExt scenePlusExt = scenePlusExtService.getByScenePlusId(scenePlus.getId());
+        String dataSource = scenePlusExt.getDataSource();
+        SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
+//        if(Objects.nonNull(sceneEditInfoExt.getFilters())
+//                && sceneEditInfoExt.getFilters() == CommonStatus.YES.code().intValue()){
+//            return;
+//        }
+
+        //获取全景图id
+        String visionPath = dataSource + File.separator + "results" + File.separator + "vision.txt";
+        List<String> panoramaUuidList = SceneUtil.getPanoramaUuidList(visionPath);
+        //{saturation: 0.35, brightness: 0.35, contrast: 0.4, temperature: 0.25, id: "0"}
+        List<JSONObject> collect = panoramaUuidList.stream().map(v -> {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("id", v);
+            jsonObject.put("saturation", new BigDecimal(-4).divide(new BigDecimal(20)).setScale(2));//饱和度
+            jsonObject.put("brightness", new BigDecimal(0).divide(new BigDecimal(20)).setScale(2));//亮度
+            jsonObject.put("contrast", new BigDecimal(0).divide(new BigDecimal(20)).setScale(2));//对比度
+            jsonObject.put("temperature", new BigDecimal(2).divide(new BigDecimal(20)).setScale(2));//对比度
+            return jsonObject;
+        }).collect(Collectors.toList());
+
+        String key = String.format(RedisKey.SCENE_filter_DATA,num);
+        List<String> filterList = collect.stream().map(item->JSON.toJSONString(item)).collect(Collectors.toList());
+        log.info("滤镜数据,filterList,{}",JSON.toJSONString(filterList));
+        redisUtil.del(key);
+        redisUtil.lRightPushAll(key, filterList);
+
+        String userViewPath = String.format(UploadFilePath.USER_VIEW_PATH, num);
+        List<String> list = redisUtil.lGet(key, 0, -1);
+        JSONArray jsonArray = new JSONArray();
+        list.stream().forEach(str->jsonArray.add(JSON.parseObject(str)));
+        fYunFileService.uploadFile(JSON.toJSONBytes(jsonArray), userViewPath + "filter.json");
+
+        //写本地文件,作为备份
+        this.writeFilter(num);
+
+        sceneEditInfoExt.setFilters(CommonStatus.YES.code().intValue());
+        sceneEditInfoExtService.updateById(sceneEditInfoExt);
+
+    }
+
+    private void writeFilter(String num) throws Exception{
+
+        String filterPath = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "filter.json";
+
+        String key = String.format(RedisKey.SCENE_filter_DATA, num);
+        List<String> filters = redisUtil.lGet(key, 0, -1);
+        if(CollUtil.isEmpty(filters)){
+            FileUtils.deleteFile(filterPath);
+            return;
+        }
+
+        String lockKey = String.format(RedisLockKey.LOCK_filter_JSON, num);
+        String lockVal = cn.hutool.core.lang.UUID.randomUUID().toString();
+        boolean lock = redisLockUtil.lock(lockKey, lockVal, RedisKey.EXPIRE_TIME_1_MINUTE);
+        if(!lock){
+            return;
+        }
+        try{
+            FileUtils.writeFile(filterPath, JSON.toJSONString(filters));
+        }finally {
+            redisLockUtil.unlockLua(lockKey, lockVal);
+        }
+    }
+}

+ 56 - 0
src/main/java/com/fdkankan/download/factory/UserEditData/FloorplanHandler.java

@@ -0,0 +1,56 @@
+package com.fdkankan.download.factory.UserEditData;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.download.entity.SceneEditInfo;
+import com.fdkankan.download.entity.ScenePlus;
+import com.fdkankan.download.service.ISceneEditInfoService;
+import com.fdkankan.download.service.IScenePlusExtService;
+import com.fdkankan.download.service.IScenePlusService;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.redis.util.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 初始化空间模型
+ */
+@Component("floorplanHandler")
+public class FloorplanHandler implements UserEditDataHandler {
+
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    @Override
+    public void init(String num, Map<String, Object> params) {
+        String floorplanCadJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH, num).concat("floorplan_cad.json");
+        String fileContent = fYunFileService.getFileContent(floorplanCadJsonPath);
+        if(StrUtil.isEmpty(fileContent)){
+            return;
+        }
+        JSONObject jsonObject = JSON.parseObject(fileContent);
+        JSONArray floors = jsonObject.getJSONArray("floors");
+        if(floors.size() < 2){
+            return;
+        }
+
+        ScenePlus scenePlus = scenePlusService.getByNum(num);
+        SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+        sceneEditInfo.setFloorPlanUser(CommonStatus.NO.code());
+        sceneEditInfoService.updateById(sceneEditInfo);
+    }
+}

+ 9 - 0
src/main/java/com/fdkankan/download/factory/UserEditData/UserEditDataHandler.java

@@ -0,0 +1,9 @@
+package com.fdkankan.download.factory.UserEditData;
+
+import java.util.Map;
+
+public interface UserEditDataHandler {
+
+    void init(String num, Map<String, Object> params) throws Exception;
+
+}

+ 9 - 0
src/main/java/com/fdkankan/download/factory/UserEditData/UserEditDataHandlerFactory.java

@@ -0,0 +1,9 @@
+package com.fdkankan.download.factory.UserEditData;
+
+import cn.hutool.extra.spring.SpringUtil;
+
+public class UserEditDataHandlerFactory {
+    public static UserEditDataHandler getHandler(String name){
+        return SpringUtil.getBean(name);
+    }
+}

+ 12 - 0
src/main/java/com/fdkankan/download/service/IScrbService.java

@@ -0,0 +1,12 @@
+package com.fdkankan.download.service;
+
+import java.util.Map;
+import java.util.Set;
+
+public interface IScrbService {
+
+    void syncScene(String num) throws Exception;
+
+    public void initUserEditData(String num, Set<String> bizs, Map<String, Map<String ,Object>> params) throws Exception;
+
+}

+ 124 - 0
src/main/java/com/fdkankan/download/service/impl/ScrbServiceImpl.java

@@ -0,0 +1,124 @@
+package com.fdkankan.download.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ZipUtil;
+import com.alibaba.fastjson.JSON;
+import com.fdkankan.common.util.CmdUtils;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.download.constant.ScrbCanstant;
+import com.fdkankan.download.constant.UserEditDataType;
+import com.fdkankan.download.entity.*;
+import com.fdkankan.download.factory.UserEditData.UserEditDataHandler;
+import com.fdkankan.download.factory.UserEditData.UserEditDataHandlerFactory;
+import com.fdkankan.download.service.*;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.*;
+
+@Slf4j
+@Service
+public class ScrbServiceImpl implements IScrbService {
+
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneEditControlsService sceneEditControlsService;
+
+    @Override
+    public void syncScene(String num) throws Exception {
+
+        String basePath = "/mnt/scrb/";
+        String zipPath = basePath + num + ".zip";
+        String scenePath = basePath + "num/";
+
+        //下载zip包、解压
+        String key = String.format(ScrbCanstant.ObsCanstant.scene_zip_key, num);
+        fYunFileService.downloadFile(key, zipPath);
+        ZipUtil.unzip(zipPath, basePath);
+
+        //切图
+        String tilesPath =  scenePath + "scene_view_data/" + num + "/images/tiles/";
+        String skyboxPath = tilesPath + "4k";
+        CmdUtils.callLine(ScrbCanstant.CmdCanstant.cut_image + skyboxPath + " " + tilesPath);
+        //删除4k图
+        FileUtil.del(skyboxPath);
+
+        //上传文件
+        List<File> files = FileUtil.loopFiles(scenePath + "scene_view_data/");
+        files.stream().forEach(file -> {
+            fYunFileService.uploadFile(file.getAbsolutePath(), file.getAbsolutePath().replace(scenePath, ""));
+        });
+
+        files = FileUtil.loopFiles(scenePath + "scene_result_data/");
+        files.stream().forEach(file -> {
+            fYunFileService.uploadFile(file.getAbsolutePath(), file.getAbsolutePath().replace(scenePath, ""));
+        });
+
+        //插入数据库,如果是重推,不需要执行这部
+        ScenePlus scenePlus = scenePlusService.getByNum(num);
+        if(Objects.isNull(scenePlus)){
+            String scenePlusStr = FileUtil.readUtf8String(scenePath + "scenePlus.txt");
+            scenePlus = JSON.parseObject(scenePlusStr, ScenePlus.class);
+            scenePlus.setId(null);
+            scenePlusService.save(scenePlus);
+
+            String scenePlusExtStr = FileUtil.readUtf8String(scenePath + "scenePlusExt.txt");
+            ScenePlusExt scenePlusExt = JSON.parseObject(scenePlusExtStr, ScenePlusExt.class);
+            scenePlusExt.setId(null);
+            scenePlusExt.setPlusId(scenePlus.getId());
+            scenePlusExtService.save(scenePlusExt);
+
+            String sceneEditInfoStr = FileUtil.readUtf8String(scenePath + "sceneEditInfo.txt");
+            SceneEditInfo sceneEditInfo = JSON.parseObject(sceneEditInfoStr, SceneEditInfo.class);
+            sceneEditInfo.setId(null);
+            sceneEditInfo.setScenePlusId(scenePlus.getId());
+            sceneEditInfoService.save(sceneEditInfo);
+
+            String sceneEditInfoExtStr = FileUtil.readUtf8String(scenePath + "sceneEditInfoExt.txt");
+            SceneEditInfoExt sceneEditInfoExt = JSON.parseObject(sceneEditInfoExtStr, SceneEditInfoExt.class);
+            sceneEditInfoExt.setId(null);
+            sceneEditInfoExt.setScenePlusId(scenePlus.getId());
+            sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
+            sceneEditInfoExtService.save(sceneEditInfoExt);
+
+            String sceneEditControlsStr = FileUtil.readUtf8String(scenePath + "sceneEditControls.txt");
+            SceneEditControls sceneEditControls = JSON.parseObject(sceneEditControlsStr, SceneEditControls.class);
+            sceneEditControls.setId(null);
+            sceneEditControls.setEditInfoId(sceneEditInfo.getId());
+            sceneEditControlsService.save(sceneEditControls);
+        }
+
+        //清除用户编辑业务数据
+        Set<String> bizs = new HashSet<>();
+        bizs.add(UserEditDataType.BOX_MODEL.message());
+        bizs.add(UserEditDataType.FLOORPLAN.message());
+        bizs.add(UserEditDataType.FILTERS.message());
+        this.initUserEditData(num, bizs, null);
+    }
+
+    @Override
+    public void initUserEditData(String num, Set<String> bizs, Map<String, Map<String ,Object>> params) throws Exception {
+        if(StrUtil.isEmpty(num) || CollUtil.isEmpty(bizs)){
+            return;
+        }
+        for (String biz : bizs) {
+            UserEditDataHandler handler = UserEditDataHandlerFactory.getHandler(biz);
+            handler.init(num, CollUtil.isEmpty(params) ? null : params.get(biz));
+        }
+    }
+}