1106

代码:

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"
}
View Code

根据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,'_')+')')+'';
}
View Code

猜你喜欢

转载自www.cnblogs.com/pengfei25/p/9916731.html