Raod 3 years ago
parent d3a6734530
commit 6837371810

@ -9,8 +9,12 @@ import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.Char
import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardObjectDto; import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardObjectDto;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** /**
* @desc controller * @desc controller
* @website https://gitee.com/anji-plus/gaea * @website https://gitee.com/anji-plus/gaea
@ -62,4 +66,27 @@ public class ReportDashboardController {
return ResponseBean.builder().data(reportDashboardService.getChartData(dto)).build(); return ResponseBean.builder().data(reportDashboardService.getChartData(dto)).build();
} }
/**
*
* @param reportCode
* @return
*/
@GetMapping("/export/{reportCode}")
@Permission(code = "view", name = "导出大屏")
public ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response, @PathVariable("reportCode") String reportCode) {
return reportDashboardService.exportDashboard(request, response, reportCode);
}
/**
*
* @param dto
* @return
*/
@PostMapping("/import")
@Permission(code = "design", name = "导入大屏")
public ResponseBean importDashboard(@RequestBody ChartDto dto) {
return ResponseBean.builder().data(reportDashboardService.getChartData(dto)).build();
}
} }

@ -6,6 +6,10 @@ import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.Char
import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardObjectDto; import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardObjectDto;
import com.anjiplus.template.gaea.business.modules.dashboard.controller.param.ReportDashboardParam; import com.anjiplus.template.gaea.business.modules.dashboard.controller.param.ReportDashboardParam;
import com.anjiplus.template.gaea.business.modules.dashboard.dao.entity.ReportDashboard; import com.anjiplus.template.gaea.business.modules.dashboard.dao.entity.ReportDashboard;
import org.springframework.http.ResponseEntity;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** /**
* @desc ReportDashboard * @desc ReportDashboard
@ -35,4 +39,14 @@ public interface ReportDashboardService extends GaeaBaseService<ReportDashboardP
* @return * @return
*/ */
Object getChartData(ChartDto dto); Object getChartData(ChartDto dto);
/**
* zip
* @param request
* @param response
* @param reportCode
* @return
*/
ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response, String reportCode);
} }

@ -13,6 +13,9 @@ import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.Repo
import com.anjiplus.template.gaea.business.modules.dashboard.dao.ReportDashboardMapper; import com.anjiplus.template.gaea.business.modules.dashboard.dao.ReportDashboardMapper;
import com.anjiplus.template.gaea.business.modules.dashboard.service.ChartStrategy; import com.anjiplus.template.gaea.business.modules.dashboard.service.ChartStrategy;
import com.anjiplus.template.gaea.business.modules.dashboard.service.ReportDashboardService; import com.anjiplus.template.gaea.business.modules.dashboard.service.ReportDashboardService;
import com.anjiplus.template.gaea.business.modules.file.entity.GaeaFile;
import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService;
import com.anjiplus.template.gaea.business.modules.file.util.FileUtils;
import com.anjiplus.template.gaea.business.util.DateUtil; import com.anjiplus.template.gaea.business.util.DateUtil;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.dto.ReportDashboardWidgetDto; import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.dto.ReportDashboardWidgetDto;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.dto.ReportDashboardWidgetValueDto; import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.dto.ReportDashboardWidgetValueDto;
@ -22,17 +25,29 @@ import com.anjiplus.template.gaea.business.modules.dashboardwidget.service.Repor
import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.DataSetDto; import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.DataSetDto;
import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.OriginalDataDto; import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.OriginalDataDto;
import com.anjiplus.template.gaea.business.modules.dataset.service.DataSetService; import com.anjiplus.template.gaea.business.modules.dataset.service.DataSetService;
import com.anjiplus.template.gaea.business.util.FileUtil;
import com.anjiplus.template.gaea.business.util.UuidUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.net.URLEncoder;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
@ -42,6 +57,7 @@ import java.util.*;
* @date 2021-04-12 14:52:21.761 * @date 2021-04-12 14:52:21.761
**/ **/
@Service @Service
@Slf4j
//@RequiredArgsConstructor //@RequiredArgsConstructor
public class ReportDashboardServiceImpl implements ReportDashboardService, InitializingBean, ApplicationContextAware { public class ReportDashboardServiceImpl implements ReportDashboardService, InitializingBean, ApplicationContextAware {
@ -54,6 +70,18 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi
@Autowired @Autowired
private DataSetService dataSetService; private DataSetService dataSetService;
@Autowired
private GaeaFileService gaeaFileService;
@Value("${customer.file.downloadPath:''}")
private String fileDownloadPath;
@Value("${customer.file.dist-path:''}")
private String dictPath;
private final static String ZIP_PATH = "/zip/";
private final static String JSON_PATH = "dashboard.json";
private Map<String, ChartStrategy> queryServiceImplMap = new HashMap<>(); private Map<String, ChartStrategy> queryServiceImplMap = new HashMap<>();
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
@ -165,6 +193,97 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi
// return getTarget(chartType).transform(dto, result.getData()); // return getTarget(chartType).transform(dto, result.getData());
} }
/**
* zip
*
* @param request
* @param response
* @param reportCode
* @return
*/
@Override
public ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response, String reportCode) {
String userAgent = request.getHeader("User-Agent");
boolean isIeBrowser = userAgent.indexOf("MSIE") > 0;
ReportDashboardObjectDto detail = getDetail(reportCode);
List<ReportDashboardWidgetDto> widgets = detail.getDashboard().getWidgets();
detail.setWidgets(widgets);
detail.getDashboard().setWidgets(null);
//1.组装临时目录,/app/disk/upload/zip/临时文件夹
String path = dictPath + ZIP_PATH + UuidUtil.generateShortUuid();
//将涉及到的图片保存下来1.背景图2.组件为图片的)
String backgroundImage = detail.getDashboard().getBackgroundImage();
zipLoadImage(backgroundImage, path);
detail.getWidgets().stream()
.filter(reportDashboardWidgetDto -> "widget-image".equals(reportDashboardWidgetDto.getType()))
.forEach(reportDashboardWidgetDto -> {
String imageAddress = reportDashboardWidgetDto.getValue().getSetup().getString("imageAdress");
zipLoadImage(imageAddress, path);
});
//2.将大屏设计到的json文件保存
String jsonPath = path + "/" + JSON_PATH;
FileUtil.WriteStringToFile(jsonPath, JSONObject.toJSONString(detail));
//将path文件夹打包zip
String zipPath = path + ".zip";
FileUtil.compress(path, zipPath);
File file = new File(zipPath);
ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
builder.contentLength(file.length());
//application/octet-stream 二进制数据流(最常见的文件下载)
builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
if (isIeBrowser) {
builder.header("Content-Disposition", "attachment; filename=" + reportCode + ".zip");
} else {
builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + reportCode + ".zip");
}
//删除zip文件
file.delete();
//删除path临时文件夹
FileUtil.delete(path);
log.info("删除临时文件:{}{}", zipPath, path);
return builder.body(FileUtils.readFileToByteArray(file));
}
/**
*
* @param imageAddress
* @param path
*/
private void zipLoadImage(String imageAddress, String path) {
//http://10.108.26.197:9095/file/download/1d9bcd35-82a1-4f08-9465-b66b930b6a8d
if (imageAddress.trim().startsWith(fileDownloadPath)) {
//以fileDownloadPath为前缀的代表为上传的图片
String fileName = imageAddress.substring(fileDownloadPath.length() + 1);
//根据fileId从gaea_file中读出filePath
LambdaQueryWrapper<GaeaFile> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(GaeaFile::getFileId, fileName);
GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper);
if (null != gaeaFile) {
String fileType = gaeaFile.getFileType();
path = path + "/image/" + fileName + "." + fileType;
//path = /app/disk/upload/zip/UUID/image
//原始文件的路径
String filePath = gaeaFile.getFilePath();
FileUtil.copyFileUsingFileChannels(filePath, path);
}
}
}
public ChartStrategy getTarget(String type) { public ChartStrategy getTarget(String type) {
for (String s : queryServiceImplMap.keySet()) { for (String s : queryServiceImplMap.keySet()) {
if (s.contains(type)) { if (s.contains(type)) {

@ -3,7 +3,6 @@ package com.anjiplus.template.gaea.business.util;
import com.anji.plus.gaea.code.ResponseCode; import com.anji.plus.gaea.code.ResponseCode;
import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import sun.misc.BASE64Encoder;
import java.io.*; import java.io.*;
import java.net.URL; import java.net.URL;

@ -8,3 +8,4 @@ spring:
customer: customer:
file: file:
dist-path: D:\Workspace\AJ-Report\report-core\upload dist-path: D:\Workspace\AJ-Report\report-core\upload
downloadPath: http://127.0.0.1:9095/file/download

Loading…
Cancel
Save