Преглед на файлове

Merge branch 'feature-uploadMatterproData-20221124' into release

# Conflicts:
#	src/main/java/com/fdkankan/scene/generate/AutoGenerate.java
dsx преди 1 година
родител
ревизия
23d6d014cc

+ 21 - 0
src/main/java/com/fdkankan/scene/controller/Scene3dNumMatterProController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * matter_pro场景码 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-11-24
+ */
+@RestController
+@RequestMapping("/scene/scene3dNumMatterPro")
+public class Scene3dNumMatterProController {
+
+}
+

+ 53 - 0
src/main/java/com/fdkankan/scene/controller/inner/InnerController.java

@@ -0,0 +1,53 @@
+package com.fdkankan.scene.controller.inner;
+
+import com.fdkankan.scene.service.IInnerApiService;
+import com.fdkankan.web.annotation.CheckInnerApiPermit;
+import com.fdkankan.web.controller.BaseController;
+import com.fdkankan.web.response.ResultData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * <p>
+ * 内部接口控制器
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/8/19
+ **/
+@RestController
+@RequestMapping("/service/scenev3/_inner")
+public class InnerController extends BaseController {
+
+    @Autowired
+    private IInnerApiService innerApiService;
+
+    /**
+     * 上传matterpro数据
+     */
+    @CheckInnerApiPermit
+    @PostMapping("/uploadMatterproData")
+    public ResultData uploadMatterproData(@RequestParam(value = "sceneName",required = false) String sceneName,
+        @RequestParam(value = "userName",required = false) String userName,
+        @RequestParam(value = "floor",required = false) String floor,
+        @RequestParam(value = "sceneKind",defaultValue = "tiles") String sceneKind,
+        @RequestParam(value = "file",required = false) MultipartFile file) throws Exception {
+        return innerApiService.uploadMatterproData(sceneName,userName,floor,sceneKind,file);
+    }
+
+    /**
+     * 查询上传matterpro数据状态
+     */
+    @CheckInnerApiPermit
+    @GetMapping("/getUploadMatterproDataStatus")
+    public ResultData getUploadMatterproDataStatus(@RequestParam(value = "num",required = true) String num) throws Exception {
+        return innerApiService.getUploadMatterproDataStatus(num);
+    }
+
+}

+ 60 - 0
src/main/java/com/fdkankan/scene/entity/Scene3dNumMatterPro.java

@@ -0,0 +1,60 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * matter_pro场景码
+ * </p>
+ *
+ * @author 
+ * @since 2022-11-24
+ */
+@Getter
+@Setter
+@TableName("t_scene_3d_num_matter_pro")
+public class Scene3dNumMatterPro implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("used")
+    private Integer used;
+
+    @TableField("folder_name")
+    private String folderName;
+
+    @TableField("code")
+    private String code;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+
+}

+ 18 - 0
src/main/java/com/fdkankan/scene/mapper/IScene3dNumMatterProMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.entity.Scene3dNumMatterPro;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * matter_pro场景码 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-11-24
+ */
+@Mapper
+public interface IScene3dNumMatterProMapper extends BaseMapper<Scene3dNumMatterPro> {
+
+}

+ 21 - 0
src/main/java/com/fdkankan/scene/service/IInnerApiService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.web.response.ResultData;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/11/24
+ **/
+public interface IInnerApiService {
+
+    ResultData uploadMatterproData(String sceneName,String userName,String floor,String sceneKind, MultipartFile file) throws Exception;
+
+    ResultData getUploadMatterproDataStatus(String num);
+
+}

+ 18 - 0
src/main/java/com/fdkankan/scene/service/IScene3dNumMatterProService.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.entity.Scene3dNumMatterPro;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * matter_pro场景码 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-11-24
+ */
+public interface IScene3dNumMatterProService extends IService<Scene3dNumMatterPro> {
+
+    Scene3dNumMatterPro findSceneNum();
+
+}

+ 258 - 0
src/main/java/com/fdkankan/scene/service/impl/InnerApiServiceImpl.java

@@ -0,0 +1,258 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.RuntimeUtil;
+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.ErrorCode;
+import com.fdkankan.common.constant.SceneKind;
+import com.fdkankan.common.constant.SceneStatus;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.utils.CreateObjUtil;
+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 com.fdkankan.scene.entity.Scene3dNumMatterPro;
+import com.fdkankan.scene.entity.ScenePro;
+import com.fdkankan.scene.entity.SceneProEdit;
+import com.fdkankan.scene.entity.User;
+import com.fdkankan.scene.service.IInnerApiService;
+import com.fdkankan.scene.service.IScene3dNumMatterProService;
+import com.fdkankan.scene.service.ISceneProEditService;
+import com.fdkankan.scene.service.ISceneProService;
+import com.fdkankan.scene.service.IUserService;
+import com.fdkankan.web.response.ResultData;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import lombok.extern.slf4j.Slf4j;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/11/24
+ **/
+@Slf4j
+@Service
+public class InnerApiServiceImpl implements IInnerApiService {
+
+    @Value("${main.url}")
+    private String mainUrl;
+    @Value("${scene.pro.v3.url}")
+    private String sceneProV3Url;
+    @Autowired
+    private IScene3dNumMatterProService scene3dNumMatterProService;
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private ISceneProService sceneProService;
+    @Autowired
+    private ISceneProEditService sceneProEditService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+
+    @Override
+    public ResultData uploadMatterproData(String sceneName, String userName, String floor, String sceneKind, MultipartFile file) throws Exception {
+        if(file == null || file.getSize() <=0){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
+        }
+
+        if(!file.getOriginalFilename().toLowerCase().endsWith(".zip") && !file.getOriginalFilename().toLowerCase().endsWith(".rar")){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5026);
+        }
+
+        boolean lock = redisLockUtil.lock(RedisLockKey.LOCK_GET_MATTERPRO_NUM, RedisKey.EXPIRE_TIME_1_MINUTE);
+        if(!lock){
+            throw new BusinessException(ErrorCode.SYSTEM_BUSY);
+        }
+        Scene3dNumMatterPro numEntity = scene3dNumMatterProService.findSceneNum();
+        String sceneNum = numEntity.getCode();
+        numEntity.setUsed(1);
+        scene3dNumMatterProService.updateById(numEntity);
+        redisLockUtil.unlockLua(RedisLockKey.LOCK_GET_MATTERPRO_NUM);
+
+        String dataSource = ConstantFilePath.BUILD_MODEL_PATH + UUID.randomUUID() + File.separator ;
+        JSONObject result = new JSONObject();
+        result.put("num", sceneNum);
+        result.put("dataSource", dataSource);
+        result.put("status", SceneStatus.wait.code());
+        String key = String.format(RedisKey.SCENE_UPLOAD_MATTERPRO_NUM, sceneNum);
+        redisUtil.set(key, result.toJSONString(), RedisKey.CAMERA_EXPIRE_7_TIME);
+
+        File data = new File(dataSource + file.getOriginalFilename());
+        if(!data.getParentFile().exists()){
+            data.getParentFile().mkdirs();
+        }
+        file.transferTo(data);
+
+        CompletableFuture.runAsync(() -> {
+            try {
+                if(file.getOriginalFilename().toLowerCase().endsWith(".zip")){
+                    CreateObjUtil.unZip(dataSource + file.getOriginalFilename(), dataSource);
+                }
+                if(file.getOriginalFilename().toLowerCase().endsWith(".rar")){
+                    CreateObjUtil.unRarWithPath(dataSource + file.getOriginalFilename(), dataSource);
+//            log.info("解压rar开始");
+//            String command = "unrar x " + dataSource + file.getOriginalFilename() + " " + dataSource;
+//            RuntimeUtil.exec(command);
+//            log.info("解压rar完毕:" + command);
+                }
+
+                Thread.sleep(2000L);
+
+                //删除压缩包
+                new File(dataSource + file.getOriginalFilename()).delete();
+
+                List<String> fileList = new ArrayList<>();
+                FileUtils.readfilePath(dataSource, fileList);
+                String ossPath = "";
+                Map<String, String> uploadMap = new HashMap<>();
+                for (String filePath : fileList) {
+                    ossPath = filePath.replace(dataSource, "images/images" + sceneNum + "/");
+                    if(ossPath.endsWith("/")){
+                        ossPath = ossPath.substring(0, ossPath.lastIndexOf("/"));
+                    }
+                    uploadMap.put(filePath, ossPath);
+                }
+                fYunFileService.uploadMulFiles(uploadMap);
+
+                ScenePro sceneProEntity = new ScenePro();
+                sceneProEntity.setDataSource(dataSource);
+                sceneProEntity.setNum(sceneNum);
+                sceneProEntity.setSceneDec("<p>四维看看 让空间讲故事</p>");
+                //默认场景名称,若有传场景名称,则以传的为准
+                sceneProEntity.setSceneName("手动上传场景");
+                if(StrUtil.isNotEmpty(sceneName)){
+                    sceneProEntity.setSceneName(sceneName);
+                }
+                sceneProEntity.setWebSite(mainUrl + "/" + sceneProV3Url + sceneNum);
+                sceneProEntity.setStatus(-2);
+                sceneProEntity.setPayStatus(1);
+                //默认用户id,若有传用户信息,则以传的为准
+                sceneProEntity.setUserId(2285L);
+                if(StrUtil.isNotEmpty(userName)){
+                    User userEntity = userService.findByUserName(userName);
+                    if(userEntity != null){
+                        sceneProEntity.setUserId(userEntity.getId());
+                    }
+                }
+                sceneProEntity.setSceneScheme(SceneKind.FACE.code().equals(sceneKind) ? 3 : 10);
+                sceneProEntity.setSceneSource(14);
+                sceneProEntity.setBuildType("V3");
+                sceneProEntity.setCreateTime(Calendar.getInstance().getTime());
+                sceneProService.save(sceneProEntity);
+
+                SceneProEdit sceneProEditEntity = new SceneProEdit();
+                sceneProEditEntity.setProId(sceneProEntity.getId());
+                sceneProEditEntity.setMapVisi(0);
+                sceneProEditEntity.setM2dVisi(1);
+                sceneProEditEntity.setM3dVisi(1);
+                sceneProEditEntity.setPanoVisi(1);
+                sceneProEditEntity.setCadImgVisi(0);
+                sceneProEditService.save(sceneProEditEntity);
+
+                JSONObject scenejson = JSONObject.parseObject(JSONObject.toJSONString(sceneProEntity));
+                scenejson.put("thumbImg", 0);
+                scenejson.put("version", 0);
+                scenejson.put("floorLogo", 0);
+                scenejson.put("sceneKey", "");
+                scenejson.put("public", 0);
+                scenejson.put("visions", 1);
+                scenejson.put("createTime", new DateTime(new Date()).toString("yyyy-MM-dd HH:mm"));
+
+                scenejson.put("floorPublishVer", sceneProEditEntity.getFloorPublishVer());
+                scenejson.put("floorEditVer", sceneProEditEntity.getFloorEditVer());
+                scenejson.put("entry", null);
+
+                scenejson.put("hots", 0);
+
+                FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data/data"+sceneNum+File.separator+"scene.json", scenejson.toString());
+
+                JSONObject floors = new JSONObject();
+                JSONArray floorArr = new JSONArray();
+                JSONObject floorObject = new JSONObject();
+                if(StrUtil.isEmpty(floor)){
+                    floorObject = new JSONObject();
+                    floorObject.put("id", 0);
+                    floorObject.put("subgroup", 0);
+                    floorObject.put("name", "1楼");
+                    floorObject.put("segment", new JSONArray());
+                    floorObject.put("vertex", new JSONArray());
+
+                    floorArr.add(floorObject);
+                }else {
+                    for(int i = 0; i < Integer.parseInt(floor); i ++){
+                        floorObject = new JSONObject();
+                        floorObject.put("id", i);
+                        floorObject.put("subgroup", i);
+                        floorObject.put("name", i+ 1 + "楼");
+                        floorObject.put("segment", new JSONArray());
+                        floorObject.put("vertex", new JSONArray());
+
+                        floorArr.add(floorObject);
+                    }
+                }
+                floors.put("floors", floorArr);
+                FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data/data"+sceneNum+File.separator+"floor.json",floors.toJSONString());
+                fYunFileService.uploadFile(ConstantFilePath.SCENE_PATH+"data/data"+sceneNum+File.separator+"floor.json", "data/data"+sceneNum+File.separator+"floor.json");
+                result.put("status", SceneStatus.NO_DISPLAY.code());
+                redisUtil.set(key, result.toJSONString(), RedisKey.CAMERA_EXPIRE_7_TIME);
+            }catch (Exception e){
+                result.put("status", SceneStatus.FAILD.code());
+                redisUtil.set(key, result.toJSONString(), RedisKey.CAMERA_EXPIRE_7_TIME);
+            }
+        });
+
+        return ResultData.ok(result);
+    }
+
+    @Override
+    public ResultData getUploadMatterproDataStatus(String num) {
+        String key = String.format(RedisKey.SCENE_UPLOAD_MATTERPRO_NUM, num);
+        String jsonStr = redisUtil.get(key);
+        if(StrUtil.isEmpty(jsonStr)){
+            throw new BusinessException(-1, "数据已过期,请前往个人中心查看");
+        }
+        JSONObject jsonObject = JSON.parseObject(jsonStr);
+        if(jsonObject.getInteger("status").equals(SceneStatus.NO_DISPLAY.code())){
+            ScenePro scenePro = sceneProService.findBySceneNum(num);
+            return ResultData.ok(scenePro);
+        }
+        return ResultData.ok(JSON.parseObject(jsonStr));
+    }
+
+    public static void main(String[] args) {
+//        List<String> fileList = new ArrayList<>();
+//        FileUtils.readfilePath("F:\\test\\wwwroot\\1115", fileList);
+////        List<String> strings = FileUtil.listFileNames("F:\\test\\wwwroot\\1115");
+//        fileList.stream().forEach(s-> System.out.println(s));
+//        System.out.println(FileUtil.getPrefix("1115.rar"));
+        FileUtil.move(new File("F:\\test\\wwwroot\\1115"), new File("F:\\test\\wwwroot"), true);
+
+
+    }
+}

+ 27 - 0
src/main/java/com/fdkankan/scene/service/impl/Scene3dNumMatterProServiceImpl.java

@@ -0,0 +1,27 @@
+package com.fdkankan.scene.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.scene.entity.Scene3dNumMatterPro;
+import com.fdkankan.scene.mapper.IScene3dNumMatterProMapper;
+import com.fdkankan.scene.service.IScene3dNumMatterProService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * matter_pro场景码 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-11-24
+ */
+@Service
+public class Scene3dNumMatterProServiceImpl extends ServiceImpl<IScene3dNumMatterProMapper, Scene3dNumMatterPro> implements IScene3dNumMatterProService {
+
+    @Override
+    public Scene3dNumMatterPro findSceneNum() {
+        return this.getOne(new LambdaQueryWrapper<Scene3dNumMatterPro>()
+            .eq(Scene3dNumMatterPro::getUsed, CommonStatus.NO.code()).last(" limit 1"));
+    }
+}

+ 5 - 0
src/main/resources/mapper/scene/Scene3dNumMatterProMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.scene.mapper.IScene3dNumMatterProMapper">
+
+</mapper>