package com.fd.server.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.fd.constant.Command; import com.fd.constant.MsgCode; import com.fd.constant.TypeCode; import com.fd.dto.ConfigJsonDto; import com.fd.dto.PageDto; import com.fd.entity.FileEntity; //import com.fd.entity.LayerEntity; import com.fd.entity.OutputFileEntity; import com.fd.entity.StyleEntity; import com.fd.repository.FileRepository; //import com.fd.repository.LayerRepository; import com.fd.repository.OutputFileRepository; import com.fd.repository.StyleRepository; import com.fd.server.CmdServer; import com.fd.server.RasterServer; import com.fd.util.FileUtils; import com.fd.util.R; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Optional; /** * Created by Owen on 2019/11/21 0021 15:29 */ @Log4j2 @Service public class RasterServerImpl implements RasterServer { @Value("${input.file.path.raster}") private String INPUT_FILE_PATH; @Value("${output.file.path.raster}") private String OUTPUT_FILE_PATH; @Value("${copy.file.path.raster}") private String MOVE_FILE_TO_SERVER; // config.json 地址 @Value("${config.path}") private String CONFIG_JSON_PATH; // config.json teileset 的相对路径 @Value("${config.tileset}") private String CONFIG_TILESET; @Autowired private FileRepository fileRepository; @Autowired private OutputFileRepository outputFileRepository; @Autowired private CmdServer cmdServer; @Autowired private StyleRepository styleRepository; @Override public R deleteById(Long fileId) { // 删除服务器文件 // 删除服务器文件 Optional e = outputFileRepository.findById(fileId); if (!e.isPresent()) { return new R(50002, MsgCode.E50002); } OutputFileEntity fileEntity = e.get(); // 删除配置文件config.json制定行 StyleEntity styleEntity = styleRepository.findByOutputFileIdTop(fileId); if (styleEntity != null) { deleteRowConfigJson(styleEntity); } // 删除数据库记录 outputFileRepository.deleteById(fileId); fileRepository.deleteById(fileEntity.getUploadId()); styleRepository.deleteByOutputFileId(fileId); // 文件 if (fileEntity.getUploadPath() != null) { FileUtils.delFolder(fileEntity.getUploadPath()); } if (fileEntity.getCoordGeneralPath() != null) { FileUtils.delFolder(fileEntity.getCoordGeneralPath()); } if (fileEntity.getUnZipPath() != null) { FileUtils.delFolder(fileEntity.getUnZipPath()); } if (fileEntity.getGeojsonPath() != null) { FileUtils.delFolder(fileEntity.getGeojsonPath()); } if (fileEntity.getCoordStrictPath() != null) { FileUtils.delFolder(fileEntity.getCoordStrictPath()); } if (fileEntity.getSlicePath() != null) { FileUtils.delFolder(fileEntity.getSlicePath()); } return new R(200, MsgCode.SUCCESS); } /** * 删除指定行的config.json 数据 */ private void deleteRowConfigJson(StyleEntity entity) { String s = FileUtils.readFile(CONFIG_JSON_PATH); JSONObject original = JSON.parseObject(s); log.info("original: {}", s); JSONArray layers = JSON.parseArray(original.getString("layers")); for (int i = 0; i < layers.size(); i++) { JSONObject o = (JSONObject) layers.get(i); if (o.getString("name").equals(entity.getName())) { // 删除对象 layers.remove(i); } } // 更新json original.put("layers", layers); log.info("original update: {}", original.toJSONString()); // 更新config.json try { FileUtils.fileWriter(JSON.toJSONString(original), CONFIG_JSON_PATH); } catch (IOException e) { e.printStackTrace(); } } // @Override // public R moveFileToServer(Long fileId, ConfigJsonDto param) { // Optional o = outputFileRepository.findById(fileId); // if (!o.isPresent()) { // log.info("id:{} 不存在", fileId); // return new R(50002, MsgCode.E50002); // } // // // 把数据移动到指定服务位置 // OutputFileEntity entity = o.get(); // FileUtils.createDir(MOVE_FILE_TO_SERVER); // // try { // org.apache.commons.io.FileUtils.copyDirectoryToDirectory(new File(entity.getSlicePath()), new File(MOVE_FILE_TO_SERVER)); // // 修改前端的config.json 文件 // String lastName = StringUtils.substringAfterLast(entity.getSlicePath(), "/"); // log.info("lastName: {}", lastName); // writeJsonFile(param, lastName, entity); // // //修改linux 文件权限 // String cmd = Command.CMD_CHOMD_755; // String slice = MOVE_FILE_TO_SERVER + lastName; // cmd = cmd.replace("@path", slice); // log.info("cmd: {}", cmd); // cmdServer.exeCmdInt(cmd); // // // 成功,更新状态 // entity.setStatus(8); // entity.setUpdateTime(new Date()); // outputFileRepository.save(entity); // return new R(200, MsgCode.SUCCESS); // } catch (IOException e) { // // entity.setStatus(10); // entity.setUpdateTime(new Date()); // outputFileRepository.save(entity); // e.printStackTrace(); // return new R(51004, MsgCode.E51004, e); // } // } @Override public R moveFileToServer(Long fileId, ConfigJsonDto param) { Optional o = outputFileRepository.findById(fileId); if (!o.isPresent()) { log.info("id:{} 不存在", fileId); return new R(50002, MsgCode.E50002); } // 把数据移动到指定服务位置 OutputFileEntity entity = o.get(); // FileUtils.createDir(MOVE_FILE_TO_SERVER); try { // org.apache.commons.io.FileUtils.copyDirectoryToDirectory(new File(entity.getSlicePath()), new File(MOVE_FILE_TO_SERVER)); // 修改前端的config.json 文件 String lastName = StringUtils.substringAfterLast(entity.getSlicePath(), "/"); log.info("lastName: {}", lastName); writeJsonFile(param, lastName, entity); //修改linux 文件权限 // String cmd = Command.CMD_CHOMD_755; // String slice = MOVE_FILE_TO_SERVER + lastName; // cmd = cmd.replace("@path", slice); // log.info("cmd: {}", cmd); // cmdServer.exeCmdInt(cmd); // 成功,更新状态 entity.setStatus(8); entity.setUpdateTime(new Date()); outputFileRepository.save(entity); return new R(200, MsgCode.SUCCESS); } catch (Exception e) { entity.setStatus(10); entity.setUpdateTime(new Date()); outputFileRepository.save(entity); e.printStackTrace(); return new R(51004, MsgCode.E51004, e); } } @Override public R uploadBigFile(MultipartFile file, String strCoord) { long start = System.currentTimeMillis(); if (file.isEmpty() || file.getSize() <= 0) { log.info("文件为空"); return new R(50001, MsgCode.E50001); } // 文件名全名 String fullFileName = file.getOriginalFilename(); // 创建目录路径 FileUtils.createDir(INPUT_FILE_PATH); // 拼接唯一文件名 long timeMillis = System.currentTimeMillis(); // String fileName = timeMillis + "_" + fullFileName; String fileName = fullFileName; // 文件保存路径 String filePath = INPUT_FILE_PATH + fileName; // 写文件到本地 try { FileUtils.bigFileWrite(file.getInputStream(), filePath); } catch (IOException e) { e.printStackTrace(); } log.info("filePath: {}", filePath); // 保存信息到db FileEntity entity = new FileEntity(); entity.setFileName(fileName); entity.setFileUrl(filePath); entity.setCreateTime(new Date()); entity.setUpdateTime(new Date()); entity.setType(TypeCode.FILE_TYPE_RASTER); entity.setCoord(strCoord); entity.setStatus(2); entity.setResStatus(0); fileRepository.save(entity); OutputFileEntity outputFile = new OutputFileEntity(); outputFile.setUploadId(entity.getId()); outputFile.setUploadPath(entity.getFileUrl()); outputFile.setFileName(entity.getFileName()); outputFile.setStatus(2); outputFile.setResStatus(0); outputFile.setCoord(strCoord); outputFile.setType(TypeCode.FILE_TYPE_RASTER); outputFile.setCreateTime(new Date()); outputFile.setUpdateTime(new Date()); outputFile = outputFileRepository.save(outputFile); long end = System.currentTimeMillis(); log.info("end uploadBigFile, total time: {} s", (end - start)/1000); return new R(200, outputFile); } // @Override // public R findByType(String fileTypeRaster, PageDto pageDto) { // Page page = outputFileRepository.findByType(fileTypeRaster, PageRequest.of(pageDto.getPageNum(), pageDto.getPageSize(), Sort.by("createTime").descending())); // return new R(200, page); // } @Override public R findByType(String fileTypeRaster, PageDto pageDto) { Page page = outputFileRepository.findByTypeAndResStatus(fileTypeRaster, 0, PageRequest.of(pageDto.getPageNum(), pageDto.getPageSize(), Sort.by("createTime").descending())); return new R(200, page); } @Override public OutputFileEntity findById(Long fileId) { Optional o = outputFileRepository.findById(fileId); if (o.isPresent()) { return o.get(); } return null; } @Override public List findByFileName(String fileName) { // return fileRepository.findByFileNameAndType(fileName, TypeCode.FILE_TYPE_RASTER); return fileRepository.findByFileNameAndTypeAndResStatus(fileName, TypeCode.FILE_TYPE_RASTER, 0); } @Override public OutputFileEntity save(OutputFileEntity fileSchedule) { return outputFileRepository.save(fileSchedule); } @Override public FileEntity findByInputFileId(Long fileId) { Optional o = fileRepository.findById(fileId); if (o.isPresent()) { return o.get(); } return null; } @Override public FileEntity saveInputFile(FileEntity fileEntity) { return fileRepository.save(fileEntity); } private void writeJsonFile(ConfigJsonDto param, String lastName, OutputFileEntity entity) { String s = FileUtils.readFile(CONFIG_JSON_PATH); StyleEntity styleEntity = styleRepository.findByOutputFileIdTop(entity.getId()); if (styleEntity == null) { styleEntity = new StyleEntity(); styleEntity.setOutputFileId(entity.getId()); styleEntity.setCreateTime(new Date()); styleEntity.setResStatus(0); } JSONObject original = JSON.parseObject(s); log.info("original: {}", s); JSONArray layers = JSON.parseArray(original.getString("layers")); JSONObject subJson = new JSONObject(); long cu = System.currentTimeMillis(); // 需要唯一 String name = "raster_" + cu; subJson.put("name", name); subJson.put("text", param.getText()); // raster 就用这个类型 subJson.put("type", "imagery"); subJson.put("checked", false); subJson.put("show", true); String slicePath = entity.getSlicePath(); slicePath = slicePath.replace("/root/gis/cesium", ""); subJson.put("url", slicePath); layers.add(subJson); original.put("layers", layers); log.info("original update: {}", original.toJSONString()); try { FileUtils.fileWriter(JSON.toJSONString(original), CONFIG_JSON_PATH); // 将图层信息保存到db // 前端需要layer信息 styleEntity.setLayer(subJson.toJSONString()); styleEntity.setUpdateTime(new Date()); styleEntity.setName(name); styleRepository.save(styleEntity); } catch (IOException e) { e.printStackTrace(); } } }