package com.fdkankan.contro.service.impl; import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.ZipUtil; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fdkankan.common.constant.ErrorCode; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.common.util.CmdUtils; import com.fdkankan.contro.bean.SendCallAlgorithmDetail; import com.fdkankan.contro.constant.ZipConstant; import com.fdkankan.contro.entity.OrigFileUpload; import com.fdkankan.contro.entity.OrigFileUploadBatch; import com.fdkankan.contro.entity.User; import com.fdkankan.contro.service.*; import com.fdkankan.contro.vo.SendCallAlgorithmParam; import com.fdkankan.contro.vo.UploadSceneOrigParamVo; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.model.constants.ConstantFilePath; import com.fdkankan.rabbitmq.util.RabbitMqProducer; import com.fdkankan.web.util.RSAEncrypt; import lombok.extern.slf4j.Slf4j; import net.lingala.zip4j.core.ZipFile; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class JmgaServiceImpl implements IJmgaService { @Autowired private IOrigFileUploadBatchService origFileUploadBatchService; @Autowired private IOrigFileUploadService origFileUploadService; @Resource private FYunFileServiceInterface fileServiceInterface; @Resource private RabbitMqProducer mqProducer; @Resource private FYunFileServiceInterface fYunFileService; @Autowired private ISceneFileBuildService sceneFileBuildService; @Autowired private IUserService userService; @Override public void checkFileWhole(String uuid, String dataSource, JSONObject fdageData) { int camType = fdageData.getJSONObject("cam").getIntValue("type"); //从data.fdage中获取需要上传的文件列表 JSONArray points = fdageData.getJSONArray("points"); if(CollUtil.isEmpty(points)){ return; } List fileList = new ArrayList<>(); for (Object point : points) { JSONObject pointJson = (JSONObject) point; if(camType == 5){//圆周率相机 String name = pointJson.getString("name"); fileList.add(name); }else{//四维相机 JSONArray imgs = pointJson.getJSONArray("imgs"); if(CollUtil.isEmpty(imgs)){ continue; } for (Object img : imgs) { JSONObject imgJson = (JSONObject) img; String name = imgJson.getString("name"); fileList.add(name); } } } //查询当前待通知计算批次文件是否存在 List batchList = origFileUploadBatchService.list(new LambdaQueryWrapper().eq(OrigFileUploadBatch::getUuid, uuid)); if(CollUtil.isNotEmpty(batchList)){ Set batchIds = batchList.stream().map(v -> v.getBatchId()).collect(Collectors.toSet()); List origFileList = origFileUploadService.list(new LambdaQueryWrapper().in(OrigFileUpload::getBatchId, batchIds)); //过滤出不存在的 fileList = fileList.stream().filter(v -> origFileList.stream().noneMatch(k -> k.getFileName().equals(v))).collect(Collectors.toList()); } // //查询oss文件目录是否存在 // String homePath = SceneUtil.getHomePath(dataSource); // List ossKeyList = fileServiceInterface.listRemoteFiles(homePath); // fileList = fileList.stream().filter(v->ossKeyList.stream().noneMatch(k->FileUtil.getName(k).equals(v))).collect(Collectors.toList()); // if(CollUtil.isNotEmpty(fileList)){ String args = JSON.toJSONString(fileList); if(fileList.size() > 5){ args = fileList.size() + "个文件"; } throw new BusinessException(ErrorCode.FAILURE_CODE_4001, args); } } @Override public void sendStatus(Map param) { mqProducer.sendByWorkQueue("jmga-event-notice", param); } @Override public void checkLackFile(String dataSource) { String dataFdagePath = dataSource.concat(File.separator).concat("capture").concat(File.separator).concat("data.fdage"); if(!FileUtil.exist(dataFdagePath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage("data.fdage")); } JSONObject fdageData = null; try { fdageData = JSON.parseObject(FileUtil.readUtf8String(dataFdagePath)); }catch (Exception e){ throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage("data.fdage")); } int camType = fdageData.getJSONObject("cam").getIntValue("type"); if(camType == 1 || camType == 2 || camType == 9 || camType == 10 || camType == 11){ Integer shootCount = fdageData.getJSONArray("points").size(); if(shootCount > 0){//有点位代表架站式 String parametersPath = dataSource.concat(File.separator).concat("capture").concat(File.separator).concat("parameters.json"); if(!FileUtil.exist(parametersPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage("parameters.json")); } String sfmDataBinPath = dataSource.concat(File.separator).concat("capture").concat(File.separator).concat("sfm_data.bin"); if(!FileUtil.exist(sfmDataBinPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage("sfm_data.bin")); } String upName = camType > 2 ? "Up.txt" : "Up.xml"; String upTxtPath = dataSource.concat(File.separator).concat("capture").concat(File.separator).concat(upName); if(!FileUtil.exist(upTxtPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage(upName)); } } } if(camType == 5){ String parametersPath = dataSource.concat(File.separator).concat("capture").concat(File.separator).concat("images/parameters.json"); if(!FileUtil.exist(parametersPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage("parameters.json")); } String sfmDataBinPath = dataSource.concat(File.separator).concat("capture").concat(File.separator).concat("result/reconstruction/sfm_data.bin"); if(!FileUtil.exist(sfmDataBinPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage("sfm_data.bin")); } } //从data.fdage中获取需要上传的文件列表 JSONArray points = fdageData.getJSONArray("points"); if(CollUtil.isEmpty(points)){ return; } for (Object point : points) { JSONObject pointJson = (JSONObject) point; if(camType == 5){//圆周率相机 String name = pointJson.getString("name"); this.checkFileAvailable(dataSource, name); }else{//四维相机 JSONArray imgs = pointJson.getJSONArray("imgs"); for (Object img : imgs) { JSONObject imgJson = (JSONObject) img; String name = imgJson.getString("name"); this.checkFileAvailable(dataSource, name); } } } } private void checkFileAvailable(String dataSource, String fileName){ List fileList = FileUtil.loopFiles(dataSource.concat(File.separator).concat("capture")); if(CollUtil.isEmpty(fileList)){ throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage(fileName)); } for (File file : fileList) { if(file.getName().equals(fileName) && file.length() > 0){ return; } } throw new BusinessException(ErrorCode.FAILURE_CODE_4001.code(), ErrorCode.FAILURE_CODE_4001.formatMessage(fileName)); } @Override public void uploadSceneOrig(UploadSceneOrigParamVo param) throws Exception { User user = userService.getById(param.getUserId()); if(Objects.isNull(user)){ throw new BusinessException(ErrorCode.USER_NOT_EXIST); } String uuid = UUID.randomUUID().toString(); String zipName = uuid + ".zip"; String zipDir = "/oss/4dkankan/bd_server/"; fYunFileService.downloadFileByCommand(zipDir + zipName, param.getFilePath()); // fYunFileService.deleteFile(param.getFilePath()); //解压缩 // String unzipCmd = "unzip -P " + ZipConstant.zipPassword + " " + zipDir + zipName + " -d " + zipDir + uuid; // CmdUtils.callLineSh(unzipCmd); ZipFile zipFile = new ZipFile(new File(zipDir + zipName)); if (zipFile.isEncrypted()) { zipFile.setPassword(ZipConstant.zipPassword); zipFile.extractAll(zipDir + uuid); } else { ZipUtil.unzip(zipDir + zipName, zipDir + uuid); } // FileUtil.del(zipDir + zipName); //去读data.fdage File dataFdageFile = FileUtil.loopFiles(zipDir + uuid).stream().filter(v -> v.getName().equals("data.fdage")).findFirst().get(); if(dataFdageFile == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_4002.code(), ErrorCode.FAILURE_CODE_4002.formatMessage("data.fdage")); } JSONObject dataFdageObj = JSONObject.parseObject(FileUtil.readUtf8String(dataFdageFile)); int camType = dataFdageObj.getJSONObject("cam").getIntValue("type"); String snCode = dataFdageObj.getJSONObject("cam").getString("uuid"); String uuidTime = dataFdageObj.getString("uuidtime"); String uniCode = snCode + "_" + uuidTime; String fileId = sceneFileBuildService.getFileId(snCode, uniCode); String homePath = "/oss/4dkankan/" + ConstantFilePath.OSS_PREFIX + snCode + "/" + fileId + "/" + uniCode; FileUtil.mkdir(homePath); String cpCmd = "cp -p -r " + zipDir + uuid + "/*/* " + homePath; CmdUtils.callLineSh(cpCmd); // FileUtil.del(zipDir + uuid); String params = snCode + "#" + fileId + "#" + uniCode; String encode = Base64.encode(RSAEncrypt.encrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile()), params.getBytes(StandardCharsets.UTF_8))); if(camType == 9 || camType == 10 || camType == 11){ sceneFileBuildService.turntableUploadSuccess(encode, user); }else{ sceneFileBuildService.uploadSuccessBuild(encode, user); } } @Override public void noticeBuildBd(String ossHost, String uuid, String dir) { String prefix = "http://" + ossHost + "/"; String path = "/oss/4dkankan/bd_server/" + dir; List files = FileUtil.loopFiles(path).stream().filter(file -> !file.getAbsolutePath().contains("backup")).collect(Collectors.toList()); files.parallelStream().forEach(file ->{ String url = prefix.concat(file.getAbsolutePath().substring(1).replace("/4dkankan","")); SendCallAlgorithmDetail detail = new SendCallAlgorithmDetail(); detail.setFileName(FileUtil.getName(file.getAbsolutePath())); detail.setUuid(uuid); SendCallAlgorithmParam param = new SendCallAlgorithmParam(); param.setFilepath(url); param.setDetails(detail); HttpUtil.post("http://127.0.0.1:8085/api/scene/file/sendCallAlgorithm", JSON.toJSONString(param)); }); } }