package com.glxp.api.controller.sync; import cn.hutool.core.util.StrUtil; import com.github.pagehelper.PageInfo; import com.glxp.api.common.enums.ResultEnum; import com.glxp.api.common.res.BaseResponse; import com.glxp.api.common.util.ResultVOUtils; import com.glxp.api.entity.sync.BasicDownloadStatusEntity; import com.glxp.api.http.sync.SpGetHttpClient; import com.glxp.api.req.sync.BasicDownloadRequest; import com.glxp.api.req.system.DeleteRequest; import com.glxp.api.res.PageSimpleResponse; import com.glxp.api.service.sync.BasicDownloadService; import com.glxp.api.util.RedisUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.List; @Slf4j @RestController public class SpsSyncDownloadController { @Resource BasicDownloadService basicDownloadService; @Resource RedisUtil redisUtil; @Resource SpGetHttpClient spGetHttp; @GetMapping("/spssync/download/basic/udiinfo/getStatus") public BaseResponse getStatus(BasicDownloadRequest basicDownloadRequest) { List basicDownloadStatusEntities = basicDownloadService.filterDownloadStatus(basicDownloadRequest); return ResultVOUtils.success(basicDownloadStatusEntities); } @GetMapping("/spssync/download/basic/udiinfo/filter") public BaseResponse filterStatus(BasicDownloadRequest basicDownloadRequest) { List basicDownloadStatusEntities = basicDownloadService.filterDownloadStatus(basicDownloadRequest); PageInfo pageInfo; pageInfo = new PageInfo<>(basicDownloadStatusEntities); PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); pageSimpleResponse.setTotal(pageInfo.getTotal()); pageSimpleResponse.setList(basicDownloadStatusEntities); return ResultVOUtils.success(pageSimpleResponse); } @PostMapping("/spssync/download/basic/udiinfo/deleteByStatus") public BaseResponse deleteByStatus(@RequestBody DeleteRequest deleteRequest) { boolean b = basicDownloadService.deleteById(deleteRequest.getId()); redisUtil.del(deleteRequest.getId()); if (b) return ResultVOUtils.success("删除成功!"); else return ResultVOUtils.error(500, "删除失败!"); } @PostMapping("/spssync/download/basic/udiinfo/updateStatus") public BaseResponse updateStatus(@RequestBody BasicDownloadStatusEntity basicDownloadStatusEntity) { basicDownloadStatusEntity.setEndTime(new Date()); basicDownloadStatusEntity.setUpdateTime(new Date()); boolean b = basicDownloadService.updateDownloadStatus(basicDownloadStatusEntity); if (b) return ResultVOUtils.success("更新成功!"); else return ResultVOUtils.error(500, "更新成功!"); } @GetMapping("/spssync/download/basic/connect/test") public BaseResponse testConnect() { return spGetHttp.testConnect(); } @GetMapping("/sps/sync/download/info/file") public void downloadFile(HttpServletResponse response, String id){ if (StrUtil.isBlank(id)) { throw new RuntimeException("缺少唯一标识"); } BasicDownloadStatusEntity info = basicDownloadService.getById(id); if (info == null) { throw new RuntimeException("数据不存在"); } if (StrUtil.isBlank(info.getCacheFilePath())) { throw new RuntimeException("文件未生成"); } File file = new File(info.getCacheFilePath()); if (!file.exists()) { throw new RuntimeException("文件丢失"); } String[] split = info.getCacheFilePath().split("/"); String enFileName = URLEncoder.encode(split[split.length - 1], StandardCharsets.UTF_8); // 设值返回文件属性,浏览器会根据属性调用下载文件方法 response.addHeader("Content-Disposition", "attachment;filename=" + enFileName); // 前端获取文件名,需要解码 response.addHeader("downLoadName", enFileName); // 定义输出流 ServletOutputStream outputStream = null; FileInputStream fileInputStream = null; try { outputStream = response.getOutputStream(); // 定义输出类型为二进制流输出 response.setContentType("application/octet-stream"); fileInputStream = new FileInputStream(file); byte[] bytes = new byte[fileInputStream.available()]; fileInputStream.read(bytes); // 把流写入response outputStream.write(bytes); // flush落盘 outputStream.flush(); // 关闭输出流 outputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } }