package com.fd.server.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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.OutputFileEntity; import com.fd.repository.FileRepository; import com.fd.repository.OutputFileRepository; import com.fd.server.RasterServer; import com.fd.util.FileUtils; import com.fd.util.R; import lombok.extern.log4j.Log4j2; 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.IOException; import java.util.Date; 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}") private String INPUT_FILE_PATH; @Value("${output.file.path}") 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; @Override public R deleteById(Long fileId) { // 删除服务器文件 Optional e = outputFileRepository.findById(fileId); if (!e.isPresent()) { return new R(50002, MsgCode.E50002); } OutputFileEntity fileEntity = e.get(); String fileName = fileEntity.getFileName(); // 文件 if (fileName.contains(".")) { // File file = new File(fileEntity.getGeojsonPath()); // file.delete(); } else { // 目录 // FileUtils.delAllFile(fileEntity.getSlicePath()); } // 删除数据库记录 outputFileRepository.deleteById(fileId); return new R(200, MsgCode.SUCCESS); } @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); FileUtils.base64ToFileWriter(entity.getSlicePath(), MOVE_FILE_TO_SERVER); // 修改前端的config.json 文件 writeJsonFile(param); // 成功,更新状态 entity.setStatus(8); outputFileRepository.save(entity); return new R(200, MsgCode.SUCCESS); } @Override public R uploadBigFile(MultipartFile file) { 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.setStatus(2); fileRepository.save(entity); OutputFileEntity outputFile = new OutputFileEntity(); outputFile.setUploadId(entity.getId()); outputFile.setUploadPath(entity.getFileUrl()); outputFile.setFileName(entity.getFileName()); outputFile.setStatus(2); 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 OutputFileEntity findById(Long fileId) { Optional o = outputFileRepository.findById(fileId); if (o.isPresent()) { return o.get(); } return null; } @Override public OutputFileEntity save(OutputFileEntity fileSchedule) { return outputFileRepository.save(fileSchedule); } private void writeJsonFile(ConfigJsonDto param) { String s = FileUtils.readFile(CONFIG_JSON_PATH); JSONObject original = JSON.parseObject(s); log.info("original: {}", s); JSONArray layers = JSON.parseArray(original.getString("layers")); JSONObject subJson = new JSONObject(); long cu = System.currentTimeMillis(); subJson.put("name", "raster_" + cu); // 需要唯一 subJson.put("text", param.getText()); subJson.put("type", "imagery"); // raster 就用这个类型 subJson.put("checked", false); subJson.put("show", true); subJson.put("url", param.getUrl()); layers.add(subJson); original.put("layers", layers); log.info("original update: {}", original.toJSONString()); try { FileUtils.fileWriter(JSON.toJSONString(original), CONFIG_JSON_PATH); } catch (IOException e) { e.printStackTrace(); } } }