package com.fdkankan.scene.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.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.fdkankan.common.constant.ErrorCode; import com.fdkankan.common.constant.OperationType; import com.fdkankan.common.constant.ServerCode; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.common.util.FileUtils; import com.fdkankan.common.util.OBJToGLBUtil; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.model.constants.ConstantFilePath; import com.fdkankan.model.constants.UploadFilePath; import com.fdkankan.model.utils.ComputerUtil; import com.fdkankan.scene.bean.BoxModelBean; import com.fdkankan.scene.entity.SceneEditInfo; import com.fdkankan.scene.entity.ScenePlus; import com.fdkankan.scene.entity.ScenePlusExt; import com.fdkankan.scene.service.IBoxModelService; import com.fdkankan.scene.service.ISceneEditInfoService; import com.fdkankan.scene.service.IScenePlusExtService; import com.fdkankan.scene.service.IScenePlusService; import com.fdkankan.scene.vo.BaseJsonDataParamVO; import com.fdkankan.scene.vo.DeleteSidParamVO; import com.fdkankan.web.response.ResultData; import com.google.common.collect.Lists; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Calendar; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; /** *
* TODO *
* * @author dengsixing * @since 2022/10/19 **/ @Slf4j @Service public class BoxModelServiceImpl implements IBoxModelService { @Autowired private FYunFileServiceInterface fYunFileService; @Autowired private IScenePlusService scenePlusService; @Autowired private ISceneEditInfoService sceneEditInfoService; @Autowired private IScenePlusExtService scenePlusExtService; @Override public ResultData uploadBoxModel(String num, String sid, MultipartFile file) throws Exception { ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(Objects.isNull(scenePlus)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); String bucket = scenePlusExt.getYunFileBucket(); if(!file.getOriginalFilename().endsWith(".zip")){ throw new BusinessException(ErrorCode.FAILURE_CODE_7015); } if(!FileUtils.checkFileSizeIsLimit(file.getSize(), 5, "M")){ throw new BusinessException(ErrorCode.FAILURE_CODE_7023, "5M"); } String path = String.format(ConstantFilePath.SCENE_USER_PATH_V4, num) + "boxModel/" + sid + "/"; String zipPath = path + file.getOriginalFilename(); String srcPath = path + "data/"; String glbPath = path + sid + ".glb"; FileUtil.del(path); FileUtil.mkParentDirs(zipPath); file.transferTo(new File(zipPath)); //解压 ZipUtil.unzip(zipPath,srcPath); //校验是否包含目录,如果包含目录提示错误 File srcFile = new File(srcPath); Arrays.stream(srcFile.listFiles()).forEach(subFile->{ if(subFile.isDirectory()){ throw new BusinessException(ErrorCode.FAILURE_CODE_5065); } }); //转glb OBJToGLBUtil.objToGlb(srcPath, glbPath); if(!ComputerUtil.checkComputeCompleted(glbPath, 3, 2000)){ throw new BusinessException(ErrorCode.FAILURE_CODE_7013); } //上传glb fYunFileService.uploadFile(bucket, glbPath, String.format(UploadFilePath.USER_EDIT_PATH, num) + "boxModels/" + sid + ".glb"); return ResultData.ok(sid + ".glb"); } public static void main(String[] args) { ZipUtil.unzip("F:\\test\\新建文件夹\\police模型\\police模型.zip","F:\\test\\新建文件夹\\police模型\\maps"); } @Override public ResultData saveBoxModel(BaseJsonDataParamVO param) throws Exception { JSONObject data = param.getData(); String sid = data.getString("sid"); if(StrUtil.isEmpty(sid)){ throw new BusinessException(ServerCode.PARAM_REQUIRED, sid); } ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum()); if(Objects.isNull(scenePlus)) throw new BusinessException(ErrorCode.FAILURE_CODE_5005); ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId()); //生成boxVideos数据 String boxPhotos = this.createBoxModels(param.getNum(), scenePlusExt.getYunFileBucket(), sid, data, sceneEditInfo, OperationType.ADDORUPDATE.code()); //更新数据库 this.updateBoxModels(sceneEditInfo, boxPhotos); return ResultData.ok(); } @Override public ResultData deleteBoxModel(DeleteSidParamVO param) throws Exception { ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum()); if(Objects.isNull(scenePlus)) throw new BusinessException(ErrorCode.FAILURE_CODE_5005); ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId()); //根据sid移除json String boxModels = this.createBoxModels(param.getNum(), scenePlusExt.getYunFileBucket(), param.getSid(), null, sceneEditInfo, OperationType.DELETE.code()); //写数据库 this.updateBoxModels(sceneEditInfo, boxModels); return ResultData.ok(); } private void updateBoxModels(SceneEditInfo sceneEditInfo, String boxModels){ sceneEditInfoService.update(new LambdaUpdateWrapper