Authored by 鲁尚清

详情表格下载-动态数据配置-(差excel.js引入)

@@ -149,7 +149,7 @@ export function getDetailTableDataNoPage(params,urlObj){ @@ -149,7 +149,7 @@ export function getDetailTableDataNoPage(params,urlObj){
149 //下载表格 149 //下载表格
150 export function getBResourcePage(params,urlObj){ 150 export function getBResourcePage(params,urlObj){
151 return request({ 151 return request({
152 - url: 'api-web/detail/table/notpage?resId='+params.resId+'&access_token='+urlObj.token, 152 + url: 'api-web/bResourcePage/findById?resId='+params.resId+'&access_token='+urlObj.token,
153 method: 'get', 153 method: 'get',
154 }) 154 })
155 } 155 }
@@ -191,12 +191,11 @@ @@ -191,12 +191,11 @@
191 <script> 191 <script>
192 import vue from "vue"; 192 import vue from "vue";
193 import VueSuperSlide from "vue-superslide"; 193 import VueSuperSlide from "vue-superslide";
194 -import {getDetailTableData,getDetailTableDataNoPage,getResType,getTrendBaseUrl} from "@/api/platform"; 194 +import {getDetailTableData,getDetailTableDataNoPage,getResType,getTrendBaseUrl,saveClearAalarm,getBResourcePage} from "@/api/platform";
195 import customDialog from "../../designerComponents/customDialog"; 195 import customDialog from "../../designerComponents/customDialog";
196 import customMenuBox from "../../designerComponents/customMenuBox";//下探组件 196 import customMenuBox from "../../designerComponents/customMenuBox";//下探组件
197 import textToImage from "../../designerComponents/textToImage";//文字转图片 197 import textToImage from "../../designerComponents/textToImage";//文字转图片
198 import textToBg from "../../designerComponents/textToBg"; 198 import textToBg from "../../designerComponents/textToBg";
199 -import {saveClearAalarm} from "../../../../../../api/platform";  
200 import {Message} from "element-ui"; 199 import {Message} from "element-ui";
201 //文字转背景 200 //文字转背景
202 201
@@ -794,7 +793,7 @@ export default { @@ -794,7 +793,7 @@ export default {
794 793
795 // 计算 奇偶背景色 794 // 计算 奇偶背景色
796 bodyTable(index) { 795 bodyTable(index) {
797 - var styleJson = {}; 796 + let styleJson = {};
798 if (index % 2) { 797 if (index % 2) {
799 styleJson["background-color"] = this.optionsSetUp.eventColor 798 styleJson["background-color"] = this.optionsSetUp.eventColor
800 } else { 799 } else {
@@ -803,7 +802,7 @@ export default { @@ -803,7 +802,7 @@ export default {
803 return styleJson; 802 return styleJson;
804 }, 803 },
805 tableRowHeight(){ 804 tableRowHeight(){
806 - var styleJson = {}; 805 + let styleJson = {};
807 if(this.optionsSetUp.rowHeight){ 806 if(this.optionsSetUp.rowHeight){
808 styleJson['height'] = this.optionsSetUp.rowHeight+'px'; 807 styleJson['height'] = this.optionsSetUp.rowHeight+'px';
809 styleJson['line-height'] = this.optionsSetUp.rowHeight+'px'; 808 styleJson['line-height'] = this.optionsSetUp.rowHeight+'px';
@@ -814,7 +813,7 @@ export default { @@ -814,7 +813,7 @@ export default {
814 return styleJson; 813 return styleJson;
815 }, 814 },
816 tableFiledWidth(index){ 815 tableFiledWidth(index){
817 - var styleJson = {}; 816 + let styleJson = {};
818 if(this.optionsSetUp.dynamicAddTable[index] && this.optionsSetUp.dynamicAddTable[index].width ){ 817 if(this.optionsSetUp.dynamicAddTable[index] && this.optionsSetUp.dynamicAddTable[index].width ){
819 styleJson["width"] = this.optionsSetUp.dynamicAddTable[index].width; 818 styleJson["width"] = this.optionsSetUp.dynamicAddTable[index].width;
820 } 819 }
@@ -1000,17 +999,166 @@ export default { @@ -1000,17 +999,166 @@ export default {
1000 this.dialogName = dialogName; 999 this.dialogName = dialogName;
1001 return dialogName; 1000 return dialogName;
1002 }, 1001 },
  1002 + formatFunction(date, fmt) {
  1003 + if (/(y+)/.test(fmt)) {
  1004 + fmt = fmt.replace(
  1005 + RegExp.$1,
  1006 + (date.getFullYear() + "").substr(4 - RegExp.$1.length)
  1007 + );
  1008 + }
  1009 + const o = {
  1010 + "M+": date.getMonth() + 1, // 月份
  1011 + "d+": date.getDate(), // 日
  1012 + "h+": date.getHours(), // 小时
  1013 + "m+": date.getMinutes(), // 分
  1014 + "s+": date.getSeconds(), // 秒
  1015 + "q+": Math.floor((date.getMonth() + 3) / 3), // 季度
  1016 + S: date.getMilliseconds() // 毫秒
  1017 + };
  1018 + for (var k in o) {
  1019 + if (new RegExp("(" + k + ")").test(fmt)) {
  1020 + fmt = fmt.replace(
  1021 + RegExp.$1,
  1022 + RegExp.$1.length == 1
  1023 + ? o[k]
  1024 + : ("00" + o[k]).substr(("" + o[k]).length)
  1025 + );
  1026 + }
  1027 + }
  1028 + return fmt;
  1029 + },
1003 //下载 1030 //下载
1004 - downloadTableList(title, resId, kpiId, flagPrifix, sortBy, order){  
1005 - let kpiIdArr=[];  
1006 - let param={  
1007 - sortBy:this.sortBy 1031 + async downloadTableList(title, resId, kpiId, flagPrifix, sortBy, order){
  1032 + let titleName=this.tableStyle.tableName;
  1033 + if (!titleName) {
  1034 + titleName = "下载";
  1035 + }
  1036 + let sheetName=titleName;
  1037 + let params={
  1038 + resId:this.getUrlToken.resId
1008 } 1039 }
1009 - this.header.map(item=>{  
1010 - if(item.sort){  
1011 - kpiIdArr.push(item.key) 1040 + const { success,data } = await getBResourcePage(params,this.getUrlToken);
  1041 + console.log("success",success,data)
  1042 + if(success){
  1043 + let ResourceData=data[0];
  1044 + let resTypeName=ResourceData.resTypeName;
  1045 + let resName=ResourceData.resName;
  1046 + // let timeName=new Date().format("yyyyMMddhhmmss",24);
  1047 + let timeName=this.formatFunction(new Date(), 'yyyyMMddhhmmss')
  1048 + let title =resTypeName+'-'+resName+'-'+titleName+'-'+timeName;
  1049 +console.log("title",title)
  1050 + let kpiIdArr=[];
  1051 + let kpiIds='';
  1052 + this.header.map(item=>{
  1053 + if(item.sort && item.key!='KPIF74D9D2B'){
  1054 + kpiIdArr.push(item.key)
  1055 + }
  1056 + })
  1057 + if(kpiIdArr && kpiIdArr.length>0){
  1058 + kpiIds=kpiIdArr.join(',');
1012 } 1059 }
1013 - }) 1060 + let param={
  1061 + resId:this.getUrlToken.resId,
  1062 + kpiId:kpiIds,
  1063 + flagPrifix:this.getUrlToken.flag,
  1064 + }
  1065 + let sort=this.sortBy;
  1066 + if(sort){
  1067 + param.sortBy=sort;
  1068 + }
  1069 + if(this.order){
  1070 + param.order=this.order;
  1071 + }
  1072 + this.getDetail(param,title)
  1073 + }
  1074 +
  1075 +
  1076 + },
  1077 + async getDetail(param,title,sheetName){
  1078 + const { success,data } = await getDetailTableDataNoPage(param,this.getUrlToken);
  1079 + if(success){
  1080 + let rowList = [];
  1081 + let headList = [];
  1082 + let resData = data[0];
  1083 + let header = resData.header;
  1084 + let content = resData.content;
  1085 + //封装content数据
  1086 + if (content && content.length > 0) {
  1087 + $.each(content, function (indx, con) {
  1088 + let values=[];
  1089 + $.each(con, function (inx, item) {
  1090 + values.push(item.kpiValue?item.kpiValue:'');
  1091 + });
  1092 + rowList.push(values);
  1093 + });
  1094 + }
  1095 + $.each(header,function (i,v) {
  1096 + headList.push(v.name);
  1097 + });
  1098 + //下载表格
  1099 + this.exportDataExcel(title, headList, rowList,sheetName);
  1100 + }
  1101 + },
  1102 + /**
  1103 + * 导出数据至excel 可以修改sheet
  1104 + *
  1105 + * @return null
  1106 + * @author lsq by 徐毫杰
  1107 + * @date 2022-03-01
  1108 + * @param title 导出excel文件名
  1109 + * @param headList 导出excel列头
  1110 + * @param rowList 导出excel数据
  1111 + * @param sheet 导出excel sheet页
  1112 + */
  1113 + exportDataExcel(title, headList, rowList, sheetName) {
  1114 + rowList.unshift(headList);
  1115 + let sheet = XLSX.utils.aoa_to_sheet(rowList);
  1116 + this.openDownloadDialog(sheet2blob(sheet,sheetName), title+'.xlsx');
  1117 + },
  1118 + // 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
  1119 + sheet2blob(sheet, sheetName) {
  1120 + sheetName = sheetName || 'sheet1';
  1121 + var workbook = {
  1122 + SheetNames: [sheetName],
  1123 + Sheets: {}
  1124 + };
  1125 + workbook.Sheets[sheetName] = sheet;
  1126 + // 生成excel的配置项
  1127 + var wopts = {
  1128 + bookType: 'xlsx', // 要生成的文件类型
  1129 + bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
  1130 + type: 'binary'
  1131 + };
  1132 + var wbout = XLSX.write(workbook, wopts);
  1133 + var blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});
  1134 + // 字符串转ArrayBuffer
  1135 + function s2ab(s) {
  1136 + var buf = new ArrayBuffer(s.length);
  1137 + var view = new Uint8Array(buf);
  1138 + for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  1139 + return buf;
  1140 + }
  1141 + return blob;
  1142 + },
  1143 + //通用的打开下载对话框方法,没有测试过具体兼容性
  1144 + //url 下载地址,也可以是一个blob对象,必选
  1145 + //saveName 保存文件名,可选
  1146 + openDownloadDialog(url, saveName) {
  1147 + if(typeof url == 'object' && url instanceof Blob)
  1148 + {
  1149 + url = URL.createObjectURL(url); // 创建blob地址
  1150 + }
  1151 + let aLink = document.createElement('a');
  1152 + aLink.href = url;
  1153 + aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
  1154 + let event;
  1155 + if(window.MouseEvent) event = new MouseEvent('click');
  1156 + else
  1157 + {
  1158 + event = document.createEvent('MouseEvents');
  1159 + event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  1160 + }
  1161 + aLink.dispatchEvent(event);
1014 }, 1162 },
1015 //获取资源类型 1163 //获取资源类型
1016 async getResTypeData(){ 1164 async getResTypeData(){
@@ -401,7 +401,9 @@ export default { @@ -401,7 +401,9 @@ export default {
401 series[0].data = data 401 series[0].data = data
402 series[0].detail = detail 402 series[0].detail = detail
403 this.dataValue=(num?num:'0') +'%'; 403 this.dataValue=(num?num:'0') +'%';
404 - this.tableDataValue=val[0]; 404 + if(val[0]){
  405 + this.tableDataValue=val[0];
  406 + }
405 this.setTrend(val[0]) 407 this.setTrend(val[0])
406 }, 408 },
407 dynamicDataFn(val, refreshTime) { 409 dynamicDataFn(val, refreshTime) {
@@ -418,7 +420,9 @@ export default { @@ -418,7 +420,9 @@ export default {
418 getEchartData(val) { 420 getEchartData(val) {
419 const data = this.queryEchartsData(val); 421 const data = this.queryEchartsData(val);
420 data.then(res => { 422 data.then(res => {
421 - this.tableDataValue=res.map; 423 + if(res.map){
  424 + this.tableDataValue=res.map;
  425 + }
422 this.setTrend(res[0].value) 426 this.setTrend(res[0].value)
423 this.renderingFn(res); 427 this.renderingFn(res);
424 }); 428 });
@@ -182,7 +182,6 @@ export default { @@ -182,7 +182,6 @@ export default {
182 }, 182 },
183 async init(){ 183 async init(){
184 const reportCode = this.$route.query.reportCode; 184 const reportCode = this.$route.query.reportCode;
185 - console.log("aaa",this.$route.query)  
186 let locationUrl=this.$route.query; 185 let locationUrl=this.$route.query;
187 let resId=locationUrl.resId; 186 let resId=locationUrl.resId;
188 let token=locationUrl.access_token; 187 let token=locationUrl.access_token;
@@ -191,7 +190,6 @@ export default { @@ -191,7 +190,6 @@ export default {
191 }, 190 },
192 handlerData() { 191 handlerData() {
193 const resData = this.optionsData; 192 const resData = this.optionsData;
194 - console.log("resdata",resData)  
195 resData.dataType == "staticData" 193 resData.dataType == "staticData"
196 ? this.handlerStaticData(resData.staticData) 194 ? this.handlerStaticData(resData.staticData)
197 : this.handlerDynamicData(resData.dynamicData, resData.refreshTime); 195 : this.handlerDynamicData(resData.dynamicData, resData.refreshTime);
@@ -202,7 +200,6 @@ export default { @@ -202,7 +200,6 @@ export default {
202 }, 200 },
203 handlerDynamicData(data, refreshTime) { 201 handlerDynamicData(data, refreshTime) {
204 if (!data) return; 202 if (!data) return;
205 - console.log("资源",data)  
206 if (this.ispreview) { 203 if (this.ispreview) {
207 this.getEchartData(data); 204 this.getEchartData(data);
208 this.flagInter = setInterval(() => { 205 this.flagInter = setInterval(() => {
@@ -215,7 +212,6 @@ export default { @@ -215,7 +212,6 @@ export default {
215 getEchartData(val) { 212 getEchartData(val) {
216 const data = this.queryEchartsData(val); 213 const data = this.queryEchartsData(val);
217 data.then(res => { 214 data.then(res => {
218 - console.log("def",res)  
219 if(res && res[0].code==0){ 215 if(res && res[0].code==0){
220 this.healthNumData = res[0].data; 216 this.healthNumData = res[0].data;
221 217