代码:
var treeCode = $.query.get("treeCode");//字符串类型 var typeIndex=$.query.get("time"); var companyCode = user.region; var selObj={}//公式拆分后单个code对应的值 $(function(){ getCode(); initTime(); }) /** * 1.首先调用接口的到所有表格的信息 * 2.将所有的code公式进行拆分用“,”分割传到后台的到单个code的值 * 3.利用写好的方法传入公式,以及单个code的值,得到单个公式所对应的值 * 4.构建表格 */ function getCode(){ $.post("CompanyEnergyClassTable4_list.action",{ departCode:user.region, code:treeCode }, function(data, statusText){ var _data=data.resultList; for(var i=0;i<_data.length;i++){ _data[i]=eval('('+_data[i]+')'); } initData(_data); }) } function initData(rowData){ console.log(rowData); var hArr=[],hObj={};//表头的信息 var hstr="" var tblArr=[]; var codeStr="";//所有code公式的集合传入后台 for(var i=0;i<rowData.length;i++){ var _row=rowData[i]; if(_row.treeCode==treeCode){ //表头 for(var j=0;j<12;j++){ if(_row["tagCode"+j]!=="0"&&_row["tagCode"+j]!==undefined){ hArr.push(_row["tagCode"+j].split("-")); } } }else{ tblArr.push(rowData[i]); } } //得出所有的code集合 for(var k=0;k<tblArr.length;k++){ for(var m=0;m<hArr.length;m++){ var _code= tblArr[k]["tagCode"+(m+1)]; if(_code=="0"){continue} if (!!codeStr) {codeStr += ";"} if(_code.indexOf('[')!==-1){ codeStr += formulaToCode(_code).join(';'); }else{ codeStr += _code; } } } //将code公式传入后台获取数据 $.ajax({ url : "dlcReport_findDataBySnameAndDate.action", type:"POST", dataType : "json", data:{ //date:$("#systemtime").val(), date:"2018-10-01", sname:codeStr }, success : function(data,status) { //rowData=evalFormulaToRes(treeSelObj,data.dataVOList); //单个code对应的值 selObj=data.dataVOList.reduce(function(o,v,i){ o[v.sname]=v.data; return o; },{}) } }); var datas=arrayToTree(tblArr,"treeCode","treePCode"); initTblData(datas); } function initTblData(rows){ console.log(rows); var bstr=""; } /** * @desc 获取构建表头的字符串 * @param {*} arr [a-a1,a-a2....] */ function getHstr(carr){ //得出层级的obj var obj={},str=""; var cjarr=[]; for(var i=0;i<carr.length;i++){ var _arr=carr[i]; if(obj[_arr[0]]===undefined){ obj[_arr[0]]={"len":0}; } if(obj[_arr[0]][_arr[1]]===undefined){ obj[_arr[0]][_arr[1]]={"len":0}; obj[_arr[0]]["len"]++; } } //得出二维数组 for(var j=0;j<carr.length;j++){ for(var k=0;k<carr[j].length;k++){ // if(obj[]) } } console.log(carr); return str; } function initTime(){ if(typeIndex=="year"){ initTimeFormate("yyyy","yyyy",4); }else if(typeIndex=="month"){ initTimeFormate("yyyy-mm","yyyy-MM",3); }else{ initTimeFormate(); } } /** * 初始化时间插件 */ function initTimeFormate(format1, format2, view, end) { format1 = !!format1 ? format1 : "yyyy-mm-dd"; format2 = !!format2 ? format2 : "yyyy-MM-dd"; view = !!view ? view : 2; var selector = end ? $("#systemtime_end") : $("#systemtime"); selector.datetimepicker('remove'); selector.datetimepicker({ //language: parent.judgeNationalLanguage(), language:"zh", format: format1, autoclose: true, startView: view, minView: end ? 2 : view }).on("click", function () { selector.datetimepicker('show'); }); if(end){ $("#systemtime").val(new Date().Format('yyyy-MM-01')); selector.val(new Date().Format(format2)); }else{ selector.val(new Date().Format(format2)); } } /** * 工具函数 将ID、ParentID这种数据格式转换为树格式 */ function arrayToTree(data, id, pid){ var g = this, p = this.options; var childrenName = "children"; if (!data || !data.length) return []; var targetData = []; //存储数据的容器(返回) var records = {}; var itemLength = data.length; //数据集合的个数 for (var i = 0; i < itemLength; i++) { var o = data[i]; o.tLevel=o[id].length/3-1; var key = getKey(o[id]); records[key] = o; } for (var i = 0; i < itemLength; i++) { var currentData = data[i]; var key = getKey(currentData[pid]); var parentData = records[key]; if (!parentData) { targetData.push(currentData); continue; } parentData[childrenName] = parentData[childrenName] || []; parentData[childrenName].push(currentData); } return targetData; function getKey(key) { if (typeof (key) == "string") key = key.replace(/[.]/g, '').toLowerCase(); return key; } } function formatul(formatul,data){ for(var key in data){ formatul=formatul.replaceAll("["+key+"]",data[key]); } //被除数是否为0 var bcs = formatul.substring(formatul.indexOf('/')+1,formatul.length); if(formatul=="0/0"){ return formatul = "-"; }else if(Number(bcs)=="0"){ return formatul = "-"; }else{ try{ return eval("("+formatul+")"); }catch(e){ return ""; } } }
页面:
数据来源
层级
{ code: "100001", energyFml: "0.0", id: "2654", name: "原料工序", remark: "0", state: "0", sumType: "0", tagCode1: "工序总消耗量-工序总消耗量", tagCode2: "南线矿浆磨、矿场-矿浆磨制消耗量", tagCode3: "南线矿浆磨、矿场-对应产量", tagCode4: "南线矿浆磨、矿场-单耗", tagCode5: "南线矿浆磨、矿场-矿浆单耗目标值", tagCode6: "南线矿浆磨、矿场-矿场消耗量", tagCode7: "南线矿浆磨、矿场-对应产量", tagCode8: "南线矿浆磨、矿场-单耗", tagCode9: "南线矿浆磨、矿场-矿场单耗目标值", tagCode10: "0", tagCode11: "0", tagCode12: "0", treeCode: "111", treePCode: "000", type: "0", unit: "0" },{ code: "100001", energyFml: "0.0", id: "2657", name: "水", remark: "0", state: "0", sumType: "0", tagCode1: "[YLGX_WNXMCF2_TSUM]+[YLGX_WDXRC2XSB_TSUM]", tagCode2: "[YLGX_WNXMCF2_TSUM]+[YLGX_WDXRC2XSB_TSUM]", tagCode3: "0", tagCode4: "0", tagCode5: "0", tagCode6: "0", tagCode7: "0", tagCode8: "0", tagCode9: "0", tagCode10: "0", tagCode11: "0", tagCode12: "0", treeCode: "101101111", treePCode: "101111", type: "0", unit: "0", },{ code: "100001", energyFml: "0.0", id: "2658", name: "电", remark: "0", state: "0", sumType: "0", tagCode1: "[ELC_81_EPdel]+[ELC_83_EPdel]+[ELC_90_EPdel]+[ELC_72_EPdel]+[ELC_84_EPdel]+[ELC_86_EPdel]+[ELC_89_EPdel]-[ELC_190_EPdel]-[ELC_87_EPdel]+[ELC_88_EPdel]+[ELC_91_EPdel]-[ELC_92_EPdel]+[ELC_90_EPdel]+[ELC_89_EPdel]+[ELC_190_EPdel]+[ELC_91_EPdel]+[ELC_166_EPdel]+[ELC_167_EPdel]+[ELC_168_EPdel]+[ELC_92_EPdel]+[ELC_165_EPdel]", tagCode2: "[ELC_81_EPdel]+[ELC_83_EPdel]+[ELC_90_EPdel]+[ELC_72_EPdel]+[ELC_84_EPdel]+[ELC_86_EPdel]+[ELC_89_EPdel]-[ELC_190_EPdel]-[ELC_87_EPdel]+[ELC_88_EPdel]+[ELC_91_EPdel]-[ELC_92_EPdel]", tagCode3: "DSJ_KJM_N", tagCode4: "([ELC_81_EPdel]+[ELC_83_EPdel]+[ELC_90_EPdel]+[ELC_72_EPdel]+[ELC_84_EPdel]+[ELC_86_EPdel]+[ELC_89_EPdel]-[ELC_190_EPdel]-[ELC_87_EPdel]+[ELC_88_EPdel]+[ELC_91_EPdel]-[ELC_92_EPdel])/[DSJ_KJM_N]", tagCode5: "PTDZ_YLGX_KJDH_DMBZ", tagCode6: "[ELC_90_EPdel]+[ELC_89_EPdel]+[ELC_190_EPdel]+[ELC_91_EPdel]+[ELC_166_EPdel]+[ELC_167_EPdel]+[ELC_168_EPdel]+[ELC_92_EPdel]+[ELC_165_EPdel]", tagCode7: "[DSJ_KJM_N]", tagCode8: "([ELC_90_EPdel]+[ELC_89_EPdel]+[ELC_190_EPdel]+[ELC_91_EPdel]+[ELC_166_EPdel]+[ELC_167_EPdel]+[ELC_168_EPdel]+[ELC_92_EPdel]+[ELC_165_EPdel])/[DSJ_KJM_N]", tagCode9: "PTDZ_YLGX_KCDH_DMBZ", tagCode10: "0", tagCode11: "0", tagCode12: "0", treeCode: "102101111", treePCode: "101111", type: "0", unit: "0" },{ code: "100001", energyFml: "0.0", id: "2655", name: "原料工序", remark: "0", state: "0", sumType: "0", tagCode1: "0", tagCode2: "0", tagCode3: "0", tagCode4: "0", tagCode5: "0", tagCode6: "0", tagCode7: "0", tagCode8: "0", tagCode9: "0", tagCode10: "0", tagCode11: "0", tagCode12: "0", treeCode: "101111", treePCode: "111", type: "0", unit: "0" }
根据code去后台查到的数据格式
公式的函数
String.prototype.replaceAll = stringReplaceAll; function stringReplaceAll(AFindText,ARepText){ var raRegExp = new RegExp(AFindText.replace(/([\(\)\[\]\{\}\^\$\+\-\*\?\.\"\'\|\/\\])/g,"\\$1"),"ig"); return this.replace(raRegExp,ARepText); } function formatul(formatul,data){ for(var key in data){ formatul=formatul.replaceAll("["+key+"]",data[key]); } //被除数是否为0 var bcs = formatul.substring(formatul.indexOf('/')+1,formatul.length); if(formatul=="0/0"){ return formatul = "-"; }else if(Number(bcs)=="0"){ return formatul = "-"; }else{ try{ return eval("("+formatul+")"); }catch(e){ return ""; } } } function getParam(s){ var param={}; var start=s.indexOf("[",0); while(start<s.length&&!(start<0)){ var end=s.indexOf("]",start); if(typeof(param[s.substring(start+1,end)])=="undefined"){ param[s.substring(start+1,end)]=s.substring(start+1,end); } start=s.indexOf("[",end); } return param; } if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement, fromIndex) { var k; if (this == null) {throw new TypeError('"this" is null or not defined');} var O = Object(this); var len = O.length >>> 0; if (len === 0) {return -1;} var n = +fromIndex || 0; if (Math.abs(n) === Infinity) {n = 0;} if (n >= len) {return -1;} k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); while (k < len) { if (k in O && O[k] === searchElement) {return k;} k++; } return -1; }; } if(window.console===undefined){ var console={ log:function(str){alert(str)}, error:function(str){alert(str)}, warn:function(str){alert(str)}, info:function(str){alert(str)} } } /** * @desc 根据公式获取code * @param {string} str 公式字符串 * @return {array} _arr code组成的数组 */ function formulaToCode(str){ var _arr=str.match(/\[.+?\]/g).join('').replace(/\]/g,'').split(/\[/); _arr.shift(); return _arr; } /** * @desc 把请求到的单个code分散数据重新组合成按照公式的数据。 * @desc 这个方法对应的要求说明: * 1.没有计算公式的code不能含有[]字符 * 2.接口数据不能只有sname和data两个字段 * 3.code只能是字母或下划线(_)开头的字母、数字和下划线组成的字符串(即:符合javascript变量命名要求) * 4.不同设备不能使用相同的公式 * @param {Object} obj 用 “公式:设备对象”组成的对象。 * @param {Array} res 请求回来的数据数组对象,如:res.jsonList * @return {Array} resArr 数据数组对象 */ function evalFormulaToRes(obj,res,other){ other=other===undefined?['sname','data']:other; var resArr=[];//用于存放返回的数据对象 if(res.length==0){return resArr;}//没有数据 //1.解析res数组生成_tempO和_tempA for(var i=0,_tempO={},_tempA={};i<res.length;i++){ if(_tempO[res[i].sname]===undefined){ _tempO[res[i].sname]={}; _tempA[res[i].sname]=[]; } var keys=''; for(var k in res[i]){ if(other.indexOf(k)===-1){ keys+=''+res[i][k]; } } if(keys===''){keys='tempIndex'+i} _tempO[res[i].sname][keys]=res[i]; _tempA[res[i].sname].push(res[i]); } //2.外层循环每个公式 for(var k in obj){ if(k.split(/[\[\+\-\*\/]/g).length<3){//2.1.如果公式是单个code,不存在运算直接concat进resArr var key=k.replace(/\[|\]/g,''); if(_tempA[k]!==undefined){ resArr=resArr.concat(_tempA[k]); }else if(_tempA[key]!==undefined){ resArr=resArr.concat(_tempA[key]); } }else{//2.2.公式存在运算 //2.2.1.取出每个code var _arr=formulaToCode(k); //2.2.2.根据每个code找出数据对象,把找到的数据对象的所有属性tempResArr if(_arr.length>0){ for(var i=0,tempResArr={},len=0;i<_arr.length;i++){ if(_tempO[_arr[i]]!==undefined){ for(var n in _tempO[_arr[i]]){ tempResArr[n]=_tempO[_arr[i]][n]; } } } } //2.2.3.循环tempResArr找出里面,每个属性生成变量 for(var ks in tempResArr){ var to=JSON.parse(JSON.stringify(tempResArr[ks])) to.sname=k;to.data=formulaToData(_arr,_tempO,k,ks); if(isNaN(to.data)||to.data==Infinity){ console.error('错误:"'+k+'"数据除以0'); to.data=0; } resArr.push(to); } } } return resArr; } /** * @desc 将公式转换为数据 * @param {*} _arr * @param {*} _tempO * @param {*} k * @param {*} ks */ function formulaToData(_arr,_tempO,k,ks){ for(var i=0;i<_arr.length;i++){ var _str=''; if(_tempO[_arr[i]]===undefined){//没有code _str='var _'+_arr[i]+'_='+0; }else{ var _to=_tempO[_arr[i]][ks];//有code没有某个属性 if(_to===undefined){ _str='var _'+_arr[i]+'_='+0; }else{ _str='var _'+_arr[i]+'_='+_to.data; } } eval(_str); } return eval('('+k.replace(/\[|\]/g,'_')+')')+''; }