package com.fdkankan.scene.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.CharsetUtil; 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.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.config.FdkkLaserConfig; import com.fdkankan.scene.constant.ConstantFileLocPath; import com.fdkankan.scene.entity.SceneEditInfo; import com.fdkankan.scene.entity.ScenePlus; import com.fdkankan.scene.entity.ScenePlusExt; import com.fdkankan.scene.oss.OssUtil; 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.util.OBJToGLBExtUtil; 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 lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.nio.file.FileSystemException; import java.util.*; /** *
* TODO *
* * @author dengsixing * @since 2022/10/19 **/ @Slf4j @Service public class BoxModelServiceImpl implements IBoxModelService { @Autowired private IScenePlusService scenePlusService; @Autowired private ISceneEditInfoService sceneEditInfoService; @Autowired private IScenePlusExtService scenePlusExtService; @Autowired private OssUtil ossUtil; @Resource private FdkkLaserConfig fdkkLaserConfig; @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 = scenePlusExt.getDataSource() + String.format(ConstantFilePath.SCENE_USER_PATH_V4, num).replace("/",File.separator) + "boxModel" + File.separator + sid + File.separator; try { String zipPath = path + file.getOriginalFilename(); String srcPath = path + "data" + File.separator; String glbPath = path + sid + ".glb"; FileUtil.del(path); FileUtil.mkParentDirs(zipPath); file.transferTo(new File(zipPath)); //解压 ZipUtil.unzip(zipPath,srcPath, CharsetUtil.CHARSET_GBK); //校验是否包含目录,如果包含目录提示错误 File srcFile = new File(srcPath); Arrays.stream(srcFile.listFiles()).forEach(subFile->{ if(subFile.isDirectory()){ throw new BusinessException(ErrorCode.FAILURE_CODE_5065); } }); //转glb OBJToGLBExtUtil.objToGlb(fdkkLaserConfig.buildCallPath, srcPath, glbPath); if(!ComputerUtil.checkComputeCompleted(glbPath, 10, 2000)){ throw new BusinessException(ErrorCode.FAILURE_CODE_7013); } //上传glb ossUtil.uploadFile(bucket,String.format(UploadFilePath.USER_EDIT_PATH, num) + "boxModels" + File.separator + sid + ".glb", glbPath, false); //上传原始obj相关文件 String objPath = String.format(UploadFilePath.USER_EDIT_PATH, num) + "boxModels" + File.separator + sid + File.separator; //先删除旧的,只需要保留最新的 ossUtil.deleteObject(scenePlusExt.getYunFileBucket(), objPath); List