diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java index 4a1588a5..c6332e58 100644 --- a/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/modules/file/service/impl/GaeaFileServiceImpl.java @@ -12,6 +12,7 @@ import com.anjiplus.template.gaea.business.code.ResponseCode; import com.anjiplus.template.gaea.business.modules.file.dao.GaeaFileMapper; 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.util.ResponseUtil2; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; @@ -159,7 +160,7 @@ public class GaeaFileServiceImpl implements GaeaFileService { byte[] fileBytes = gaeaOSSTemplate.downloadFile(fileObjectName); // 根据文件后缀来判断,是显示图片\视频\音频,还是下载文件 - return ResponseUtil.writeBody(originalFilename, fileBytes, isIEBrowser); + return ResponseUtil2.writeBody(originalFilename, fileBytes, isIEBrowser); } catch (Exception e) { log.error("file download error", e); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage()); diff --git a/report-core/src/main/java/com/anjiplus/template/gaea/business/util/ResponseUtil2.java b/report-core/src/main/java/com/anjiplus/template/gaea/business/util/ResponseUtil2.java new file mode 100644 index 00000000..fe0aeda2 --- /dev/null +++ b/report-core/src/main/java/com/anjiplus/template/gaea/business/util/ResponseUtil2.java @@ -0,0 +1,60 @@ +package com.anjiplus.template.gaea.business.util; + +import com.anji.plus.gaea.oss.exceptions.GaeaOSSException; +import com.anji.plus.gaea.oss.utils.ResponseUtil; +import com.anji.plus.gaea.oss.utils.StringPatternUtil; +import org.springframework.http.CacheControl; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; + +import java.net.URLEncoder; + +public class ResponseUtil2 extends ResponseUtil { + /** + * 根据文件后缀来判断,是显示图片\视频\音频,还是下载文件 + * @param fileObjectName 文件原始名称,如:订单导入.xls banner.png + * @param fileBytes 文件字节流 + * @param isIEBrowser 是否是IE浏览器 + * @return + */ + public static ResponseEntity writeBody(String fileObjectName, byte[] fileBytes, boolean isIEBrowser){ + try{ + if(StringUtils.isEmpty(fileObjectName) || !fileObjectName.contains(".")){ + throw new GaeaOSSException("original file name or type is empty"); + } + // 文件后缀名 + String fileSuffixName = fileObjectName.substring(fileObjectName.lastIndexOf(".")); + + // 初始化响应体 + ResponseEntity.BodyBuilder builder = ResponseEntity.ok(); + builder.contentLength(fileBytes.length); + + // 判断文件是图片视频还是文件 + String pattern1 = "(.png|.jpg|.jpeg|.bmp|.gif|.icon|.svg)"; + String pattern2 = "(.flv|.swf|.mkv|.avi|.rm|.rmvb|.mpeg|.mpg|.ogg|.ogv|.mov|.wmv|.mp4|.webm|.wav|.mid|.mp3|.aac)"; + if (StringPatternUtil.StringMatchIgnoreCase(fileSuffixName, pattern1)) { + if (fileSuffixName.equalsIgnoreCase(".svg")) { + builder.cacheControl(CacheControl.noCache()).contentType(MediaType.parseMediaType("image/svg+xml")); + } else { + builder.cacheControl(CacheControl.noCache()).contentType(MediaType.IMAGE_PNG); + } + } else if (StringPatternUtil.StringMatchIgnoreCase(fileSuffixName, pattern2)) { + builder.header("Content-Type", "video/mp4; charset=UTF-8"); + } else { + //application/octet-stream 二进制数据流(最常见的文件下载) + builder.contentType(MediaType.APPLICATION_OCTET_STREAM); + fileObjectName = URLEncoder.encode(fileObjectName, "UTF-8"); + if (isIEBrowser) { + builder.header("Content-Disposition", "attachment; filename=" + fileObjectName); + } else { + builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + fileObjectName); + } + } + return builder.body(fileBytes); + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } +} diff --git a/report-ui/src/views/bigscreenDesigner/designer/tools/configure/percentCharts/widget-gauge.js b/report-ui/src/views/bigscreenDesigner/designer/tools/configure/percentCharts/widget-gauge.js index 83c24aa9..0634028b 100644 --- a/report-ui/src/views/bigscreenDesigner/designer/tools/configure/percentCharts/widget-gauge.js +++ b/report-ui/src/views/bigscreenDesigner/designer/tools/configure/percentCharts/widget-gauge.js @@ -31,6 +31,14 @@ export const widgetGauge = { placeholder: '', value: '' }, + { + type: 'el-input-number', + label: '最大值', + name: 'maxValue', + require: false, + placeholder: '', + value: 100, + }, [ { name: "圆环设置", diff --git a/report-ui/src/views/bigscreenDesigner/designer/widget/percent/widgetGauge.vue b/report-ui/src/views/bigscreenDesigner/designer/widget/percent/widgetGauge.vue index 8cba6ed5..6ff88df8 100644 --- a/report-ui/src/views/bigscreenDesigner/designer/widget/percent/widgetGauge.vue +++ b/report-ui/src/views/bigscreenDesigner/designer/widget/percent/widgetGauge.vue @@ -111,7 +111,11 @@ export default { }, detail: { valueAnimation: true, - formatter: "{value} %", + formatter: function(value) { + const max = series[0].max; // 获取最大值 + const formattedValue = (value / max * 100).toFixed(0); // 计算格式化后的数值 + return formattedValue + ' %'; // 拼接百分号 + }, color: "white", fontSize: 18, }, @@ -263,7 +267,11 @@ export default { }; const detail = { valueAnimation: true, - formatter: "{value} %", + formatter: function(value) { + const max = series[0].max; // 获取最大值 + const formattedValue = (value / max * 100).toFixed(0); // 计算格式化后的数值 + return formattedValue + ' %'; // 拼接百分号 + }, color: optionsSetup.detailColor, fontSize: optionsSetup.detailFontSize, fontWeight: optionsSetup.detailFontWeight, @@ -274,6 +282,7 @@ export default { series[0].splitLine = splitLine; series[0].axisLabel = axisLabel; series[0].detail = detail; + series[0].max = optionsSetup.maxValue; } }, setOptionsData(e, paramsConfig) {