AST语法树项目实战

301 阅读3分钟

1. 问题来源背景

最近涉及到老旧项目改造优化,公司自研的低代码平台,后端人员在代码增强里写前端代码涉及大量不规范的写法,我现在需要将其中的不规则写法全部纠正过来。

2. 需要解决的问题

纠正内容包括:
1,移除所有的debugger
2,将所有的$全局查询符修改为自定义的页面查询方法me.byId或者me.find

3. 目前代码现状

项目中后端写的代码大概是这个样子,这是随便截取了一个页面的代码增强部分

me.showDefineQuery = function(){
    _application.showDefineQuery({cmpName:me,gridId:'grid'});
}

me.toUppers = function(v){
    var queryForm = me.byId("queryForm");
    $("input[name='empNameSpell']",queryForm).val(v.toUpperCase());
    me.doFormQuery();
}
me.pageDesign = function(){
    _application.showPageDesign(me.dsName,me.container,me.dsSystemId,me.moduleName);
}

me.reset = function(){
    me.byId('queryForm').extqueryform('reset');
}
me.doFormQuery = function(){
    debugger;
    //     var a  = _application;
    //     _application._mask.initMask=new function(){};
    //     _application._showMask=new function(){};
    //      _application._mask.showAllMask=new function(){};
    //     _application._mask.hideMask=new function(){};
    me.byId("queryForm").extqueryform("doFormQuery");
    /*
    var queryFormData = me.byId("queryForm").extqueryform("getRowSet");
    var dc = new DataSet();
    dc.addRowSet(queryFormData);
    var  actionName = me.action;
    var  eventName = me.event;
    var  dsSystemId = me.dsSystemId;
     var  moduleName = me.moduleName;
    dc.setParameter("dsSystemId",dsSystemId);
     dc.setParameters(me.dataCenter.getParameters());
    var rowset = me.byId("grid").extgrid("getRowSetCopy");
     rowset.setQueryRowSetName(queryFormData.getName());
    dc.addRowSet(rowset);
    me.requestData({
        "module":moduleName,
        "action":actionName,
        "event":eventName,
        "dataSet":dc,
         modal:false,
        "success":function(){
          me.byId("grid").extgrid("refresh");
        }    
      });     */ 
}

me.pageDesign = function(){
    _application.showPageDesign(me.dsName,me.container,me.dsSystemId,me.moduleName);
}
me.save = function(){ 
    var dc = new DataSet();
    //  dc.setParameter("empId",me.dataCenter.getParameter("empId"));
    // me.byId("grid").extgrid("save",{"event":"save","dataSet":dc});
    me.byId("grid").extgrid("save",{"event":"save","dataSet":dc}); 
}

me.deleteRow = function(){
    me.byId("grid").extgrid("extRemoveRow"); 
}
me.addRow = function(){
    var dc = new DataSet();
    dc.setParameter("flag",0);//添加进入
    dc.setParameter("status",0);
    dc.setParameter("id",-1);
    dc.setParameter("dsName","4");
    me.requestComponent({
        action:"RsEmpAction",
        event:"showAddPage",
        dataSet:dc,
        container:me.container
    })
    /*me.showDialog({
         "action":"RsEmpAction",
         "event":"showAddPage",
         "dataSet":dc,
             "full":true,
       //    "height":500,
       //    "width":800,
          "title":"人员添加",
          "onComplete":function(){
               me.byId("grid").extgrid("doFormQuery");
          }
   })*/
}
me.exportExcelData = function(rowIndex){
    //m1.report/ReportAction/showReport.do?dsName=1&reportId=628027533523374080&dsSystemId=right
    var dc = new DataSet();
    var row = me.byId("grid").extgrid("getRow",rowIndex);
    var param1 = row.getItemValue("empNo");
    dc.setParameter("dsName","1");
    dc.setParameter("dsSystemId","right");
    dc.setParameter("param1",param1);
    dc.setParameter("reportId","628075011060748288");  
    me.showDialog({
        "module": "m1.report",
        "action":"ReportAction",
        "event":"showReportByParam",
        "dataSet":dc,
        "title":"简历导出",
        "width":1000,
        "height":700,
        "onComplete":function(data){
         
        }
    });
}
me.onClickDetails = function(rowIndex)
{
    debugger;
    var row = me.byId("grid").extgrid("getRow",rowIndex);
    var id = row.getItemValue("empId");
    var dc = new DataSet();
    dc.setParameter("flag",1);
    dc.setParameter("status",0);
    dc.setParameter("id",id);
    dc.setParameter("dsName","93");
    me.requestComponent({
        action:"RsEmpAction",
        event:"showAddPage",
        dataSet:dc,
        container:me.container
    })
    /*me.showDialog({
         "action":"RsEmpAction",
         "event":"showAddPage",
         "dataSet":dc,
          "full":true,
          "title":"人员添加",
          "onComplete":function(){
               me.byId("grid").extgrid("doFormQuery");
          }
   })*/
}
me.clickOrgan = function(n,o)
{
    var dc = new DataSet();  
    dc.setParameter("organNo",n);   
    me.requestData({
        module:"rlzy.inter",
        action:"RsDeptAction",
        event:"selectOrganTree",
        dataSet:dc,
        title:"选择部门",
        success:function(data){                  
            var set = data.getRowSet("com.tp.rlzy.inter.entity.dept.RsDept");
            $('#deptNo').extcombotree("clear");
            $('#deptNo').extcombotree("loadData",_application.initMenuData(set,"deptCode","deptName","upperDeptCode",n)); 
        }
    }); 
}

me.blinkClick = function(){
    //绑定双击dblclick 单击click by wuhebin 20180528
    me.byId("grid",me.container).find("table:first tbody tr").dblclick(function () {
        var checkboxObj =$(this).find('input[type=checkbox]').first();
        $.bsgrid.adaptAttrOrProp(checkboxObj, 'checked', false);
    }).click(function () {
        var checkboxObj =$(this).find('input[type=checkbox]').first();
        $.bsgrid.adaptAttrOrProp(checkboxObj, 'checked', true);
    });

}
me.init = function(){ 
    debugger;
    //     $("#grid table:first th,tr",me.container).find("td:eq(4)").css("color","red");
    //       var wIndex  = $("#grid table:first th[w_index='empName']",me.container);
    //     wIndex.css("color","red");
    //     $("#grid table:first tr:eq(0)",me.container).css("color","red");

    me.initColor();
    //me.blinkClick ();
    me.byId('grid').extgrid('options').settings.afterGridRefresh = function(){
        //me.blinkClick ();
        me.initColor();
    }

     //me.byId('empBirthday').extdate({dateFmt:'yyyy-MM-dd HH:mm:ss',maxDate:'%y-%M-%d %H:%m:%s}'})

}


me.initColor = function(){

    $("button span",me.container).each(function(index,item){
        var spanValue = $(this).html();
        if(spanValue && spanValue == "详细"){
            $(this).parent().removeAttr("class");
            $(this).parent().attr("class","m-r-xs btn btn-sm btn-info");
        }
        if(spanValue && spanValue == "员工归属明细"){
            $(this).parent().removeAttr("class");
            $(this).parent().attr("class","m-r-xs btn btn-sm btn-info");
        }
        if(spanValue && spanValue == "员工状态明细"){
            $(this).parent().removeAttr("class");
            $(this).parent().attr("class","m-r-xs btn btn-sm btn-info");
        }
        if(spanValue && spanValue == "详细(折叠Tab)"){
            $(this).parent().removeAttr("class");
            $(this).parent().attr("class","m-r-xs btn btn-sm btn-info");
        }
    })
}


me.exportT = function(){
    var rowSet = me.byId("grid").extgrid("getRowSet");
    var pageDsName = "2";                 
    var dc = new DataSet();
    var systemId = "rlzy.control";
    var gridId = "grid";
    var actionName = "RsEmpAction";
    var eventName = "show";
    dc.setParameter("pageDsName", pageDsName);
    dc.setParameter("moduleName", systemId);
    dc.setParameter("dsSystemId", systemId);
    dc.setParameter("gridId", gridId);
    dc.setParameter("rowSetName", rowSet._name);
    dc.setParameter("dsName", "exportExcelCloums");  
    _application.showDialog({
        module: "excelservice",
        action: "ExcelServiceAction",
        dataSet: dc,
        event: "showExcelCloum",
        title: "导出人力资源数据数据",
        height: 500,
        width: 650,
        modal: true,
        onComplete: function (data) 
        {

            me.doExport(data,rowSet,dc,systemId,actionName,eventName,pageDsName);


        }
    });

}
me.doExport = function(data,rowSet,dc,systemId,actionName,eventName,pageDsName){
    debugger;
    if(data && data.length > 0){
        var formRowSet = me.byId("queryForm").extqueryform("getRowSet");

        if(formRowSet)
        {
            rowSet.setQueryRowSetName(formRowSet.getName());
        }
        dc.addRowSet(rowSet);
        dc.addRowSet(formRowSet);
        dc.setParameter("exportColumns", data.toString());
        var _excelExportOptions = {};
        _excelExportOptions["module"] =systemId;
        _excelExportOptions["action"] =actionName;
        _excelExportOptions["event"] = eventName;
        _excelExportOptions["dsName"] = pageDsName;
        _excelExportOptions["dsSystemId"] = systemId;
        var base64 = new Base64();
        dc.setParameter("_excelExportOptions", base64.encode(JSON.toStr(_excelExportOptions)));
        _application.fileDownload({
            "module": "excelservice",
            "action": "ExcelServiceAction",
            "event": "exportGridData",
            "dataSet": dc
        });
    }
}

me.dis = function(){
    debugger;

    var queryFormData = me.byId("queryForm").extqueryform("getRowSet");
    var dc = new DataSet();
    dc.addRowSet(queryFormData);
    var  actionName = me.action;
    var  eventName = me.event;
    var  dsSystemId = me.dsSystemId;
    var  moduleName = me.moduleName;
    dc.setParameter("dsSystemId",dsSystemId);
    dc.setParameters(me.dataCenter.getParameters());
    var rowset = me.byId("grid").extgrid("getRowSetCopy");
    rowset.setQueryRowSetName(queryFormData.getName());
    dc.addRowSet(rowset);
    me.requestData({
        "module":moduleName,
        "action":actionName,
        "event":eventName,
        "dataSet":dc,
        modal:false,
        "success":function(){
            me.byId("grid").extgrid("refresh");
        }    
    });      



}


me.exportFile = function(){
    var dc = new DataSet();
    dc.setParameter("dsSystemId","rlzy.control");
    _application.fileDownload({
        "module": "rlzy.control",
        "action": "FileDownAction",
        "event": "downLoad",
        "dataSet": dc
    });


}


me.queryStatusBelong = function(rowIndex){
    debugger;
    var row = me.byId("grid").extgrid("getRow", rowIndex);
    var empNo = row.getItemValue("empNo");
    var dc = new DataSet();
    dc.setParameter("empNo", empNo);
    dc.setParameter("dsName","426");
     me.showDialog({
        "action":"RsEmpAction",
        "event":"showTransHis",
         "title":"员工状态明细",
        "dataSet":dc,
         "width":1000,
        "height":600, 
        "container":me.container
    });
}


me.queryBelong = function(rowIndex){
    debugger;
    var row = me.byId("grid").extgrid("getRow", rowIndex);
    var empNo = row.getItemValue("empNo");
    var dc = new DataSet();
    dc.setParameter("empNo", empNo);
    dc.setParameter("dsName","402");
     me.showDialog({
        "action":"RsEmpGwddAction",
        "event":"show",
         "title":"员工归属明细",
        "dataSet":dc,
         "width":1000,
        "height":600, 
        "container":me.container
    });
}

me.onClickDetailsByShendong = function(rowIndex)
{
    debugger;
    var row = me.byId("grid").extgrid("getRow",rowIndex);
    var id = row.getItemValue("empId");
    var dc = new DataSet();
    dc.setParameter("flag",1);
    dc.setParameter("status",0);
    dc.setParameter("id",id);
    dc.setParameter("dsName","49125");
    me.requestComponent({
        action:"RsEmpAction",
        event:"showAddPage",
        dataSet:dc,
        container:me.container
    })
}

4.开始着手解决

刚开始我是拒绝的,由于这种写法整天引起许多奇奇怪怪的问题,于是自己开始尝试处理解决。 1666492649640.png

4.1,移除debugger

这个问题解决我第一个就想到了用正则表达式处理

codeText.replace(/debugger;?/g, "");

考虑到注释部分,我排除了注释里面的debugger

codeText.replace(/(?<!\/\/.*)debugger;?/g, "");

4.2,替换$

4.2.1,正则替换法

我起初考虑如何用正则来处理$符,既然要我替换$(...),那我直接匹配$("#,关键词不就行了吗,但在实际处理发现,这个$符非常不好处理,它可以作为函数名,可以作为对象进行方法调用,它作为函数名时,参数可以是idclass变量字符串拼接$符二次或多次嵌套,这是正则无法编写的规则,还有foreach$(this)是要排除在外的。

大概需要处理的情况如下但并不局限于此

$("#id") => me.byId("#id")  
===  
  
$("#id",me.container) => me.byId("#id")  
===  
  
var form = me.byId("form");  
$("#id",form) => me.byId("#id", form)  
===  
  
$("#id",me.byId("form")) => me.byId("#id", me.byId("form"))  
===  
  
var form = $("#form") => var form = me.byId("#form")  
===  
  
$("#id .div_class span") => me.find("#id .div_class span")  
===  
  
$("#id .div_class span", me.container) => me.find("#id .div_class span")  
===  
  
var form = me.byId("form");  
$("#id .div_class span", form) => me.find("#id .div_class span", form)  
===  
  
$("#id .div_class span", me.byId("form")) => me.find("#id .div_class span", me.byId("form"))  
===

$("#id",$("form")) => me.byId("#id", me.byId("form"))  
===  
  
$(".form .tm-ext") => me.find(".form .tm-ext")  
===  
  
$("[id='123']") => me.find("[id='123']")  
===  
  
等等...

然后我只写了一个找出使用$符作为函数调用,匹配$(并排除注释及$(this)的情况的代码位置

codeText.match(/(?<!\/\/.*)\$\((?!this)/g);

然后由告诉后台开发人员根据代码提示的位置逐个修改之,有的页面可能比较少,还能接受,但有的页面逻辑关系复杂,需要改的有二三十个问题之多,这就让人有点接受不了了,本来后台人员对前台不熟悉,还要分析纷繁复杂的查询调用关系,实在有些不妥。

既然正则这条路走不通,我如何才能分析这些代码,让我更科学的修改呢?

4.2.2 AST分析替换

前端常用的脚手架工具,如webpack,babel,prettiereslint都是底层涉及对代码进行语法树分析,然后再逐个处理。我的项目何不也借此进行处理呢。

经过相关的资料查询,决定使用babel二次封装的AST语法树工具,下面是我查阅的相关文档

1, AST入门
2, AST树解释
3, AST树在线转换
4, AST详细转换如何写

下面是我最终解决$符替换的代码,只列出与ast相关的核心代码作为记录

安装

npm i @babel/parser @babel/traverse @babel/types @babel/generator -S

引入

const parser = require("@babel/parser");
const traverse = require("@babel/traverse");
const types = require("@babel/types");
const generator = require("@babel/generator");

解析替换

me.replaceJqToById = function() {
    //获取js代码增强中的代码
    var $content = $("#jsDefineModal");
    var myTextArea = $content.find("textarea");
    var jsEditor = myTextArea.data("jsEditor");
    var htmlText = jsEditor.getValue();
    //语法处理
    // 1.parse
    const ast = parser.parse(htmlText);
    // 2,traverse
    const visitor = {
        Identifier(path) {
            //匹配$()的情况
            if (path.node.name == "$" && path.parentPath.type == "CallExpression") {
                //获取$()的第一个参数
                var firstParam = path.parentPath.node.arguments[0];
                //如果这个参数存在且非表达式(即是字符串)时
                if (firstParam && firstParam.type != "ThisExpression") {
                    //如果第一个参数是以#开头,将$替换为me.byId,否则替换为me.find
                    let property = /^#/.test(firstParam.value) && !/\x20/.test(firstParam.value) ? "byId" : "find"; 
                    //替换语法树的节点
                    path.replaceWith(types.memberExpression(types.identifier("me"), types.identifier(property)));
                }
                //获取$()的第二个参数
                var secondParam = path.parentPath.node.arguments[1];
                //如果第二个参数类型是成员访问表达式,且形如me.container时
                if (secondParam && secondParam.type == "MemberExpression" && secondParam.object.name == "me" && secondParam.property.name == "container") {
                    //将第二个参数移除掉
                    path.parentPath.node.arguments.length = 1;
                }
            }
        }
    };
    // traverse 转换代码
    traverse.default(ast, visitor);
    // 3. generator 将 AST 转回成代码
    const resultText = generator.default(ast, {}, htmlText);
    //填充还原
    jsEditor.setValue(resultText.code);
};

5.总结

1,AST语法树分析功能强大稳定,经过分析之后的代码还原以后还自动添加了;
2,debugger移除其实也可以放到语法树中删除,但由于正则替换也比较稳定,所以没有后修改

最后附上替换优化后的代码

me.showDefineQuery = function() {
    _application.showDefineQuery({
        cmpName: me,
        gridId: 'grid'
    });
};
me.toUppers = function(v) {
    var queryForm = me.byId("queryForm");
    me.find("input[name='empNameSpell']", queryForm).val(v.toUpperCase());
    me.doFormQuery();
};
me.pageDesign = function() {
    _application.showPageDesign(me.dsName, me.container, me.dsSystemId, me.moduleName);
};
me.reset = function() {
    me.byId('queryForm').extqueryform('reset');
};
me.doFormQuery = function() {
    //     var a  = _application;
    //     _application._mask.initMask=new function(){};
    //     _application._showMask=new function(){};
    //      _application._mask.showAllMask=new function(){};
    //     _application._mask.hideMask=new function(){};
    me.byId("queryForm").extqueryform("doFormQuery");
    /*
    var queryFormData = me.byId("queryForm").extqueryform("getRowSet");
    var dc = new DataSet();
    dc.addRowSet(queryFormData);
    var  actionName = me.action;
    var  eventName = me.event;
    var  dsSystemId = me.dsSystemId;
     var  moduleName = me.moduleName;
    dc.setParameter("dsSystemId",dsSystemId);
     dc.setParameters(me.dataCenter.getParameters());
    var rowset = me.byId("grid").extgrid("getRowSetCopy");
     rowset.setQueryRowSetName(queryFormData.getName());
    dc.addRowSet(rowset);
    me.requestData({
        "module":moduleName,
        "action":actionName,
        "event":eventName,
        "dataSet":dc,
         modal:false,
        "success":function(){
          me.byId("grid").extgrid("refresh");
        }    
      });     */
};
me.pageDesign = function() {
    _application.showPageDesign(me.dsName, me.container, me.dsSystemId, me.moduleName);
};
me.save = function() {
    var dc = new DataSet(); //  dc.setParameter("empId",me.dataCenter.getParameter("empId"));
    // me.byId("grid").extgrid("save",{"event":"save","dataSet":dc});
    me.byId("grid").extgrid("save", {
        "event": "save",
        "dataSet": dc
    });
};
me.deleteRow = function() {
    me.byId("grid").extgrid("extRemoveRow");
};
me.addRow = function() {
    var dc = new DataSet();
    dc.setParameter("flag", 0); //添加进入
    dc.setParameter("status", 0);
    dc.setParameter("id", -1);
    dc.setParameter("dsName", "4");
    me.requestComponent({
        action: "RsEmpAction",
        event: "showAddPage",
        dataSet: dc,
        container: me.container
    });
    /*me.showDialog({
         "action":"RsEmpAction",
         "event":"showAddPage",
         "dataSet":dc,
             "full":true,
       //    "height":500,
       //    "width":800,
          "title":"人员添加",
          "onComplete":function(){
               me.byId("grid").extgrid("doFormQuery");
          }
    })*/
};
me.exportExcelData = function(rowIndex) {
    //m1.report/ReportAction/showReport.do?dsName=1&reportId=628027533523374080&dsSystemId=right
    var dc = new DataSet();
    var row = me.byId("grid").extgrid("getRow", rowIndex);
    var param1 = row.getItemValue("empNo");
    dc.setParameter("dsName", "1");
    dc.setParameter("dsSystemId", "right");
    dc.setParameter("param1", param1);
    dc.setParameter("reportId", "628075011060748288");
    me.showDialog({
        "module": "m1.report",
        "action": "ReportAction",
        "event": "showReportByParam",
        "dataSet": dc,
        "title": "简历导出",
        "width": 1000,
        "height": 700,
        "onComplete": function(data) {}
    });
};
me.onClickDetails = function(rowIndex) {
    var row = me.byId("grid").extgrid("getRow", rowIndex);
    var id = row.getItemValue("empId");
    var dc = new DataSet();
    dc.setParameter("flag", 1);
    dc.setParameter("status", 0);
    dc.setParameter("id", id);
    dc.setParameter("dsName", "93");
    me.requestComponent({
        action: "RsEmpAction",
        event: "showAddPage",
        dataSet: dc,
        container: me.container
    });
    /*me.showDialog({
         "action":"RsEmpAction",
         "event":"showAddPage",
         "dataSet":dc,
          "full":true,
          "title":"人员添加",
          "onComplete":function(){
               me.byId("grid").extgrid("doFormQuery");
          }
    })*/
};
me.clickOrgan = function(n, o) {
    var dc = new DataSet();
    dc.setParameter("organNo", n);
    me.requestData({
        module: "rlzy.inter",
        action: "RsDeptAction",
        event: "selectOrganTree",
        dataSet: dc,
        title: "选择部门",
        success: function(data) {
            var set = data.getRowSet("com.tp.rlzy.inter.entity.dept.RsDept");
            me.byId('#deptNo').extcombotree("clear");
            me.byId('#deptNo').extcombotree("loadData", _application.initMenuData(set, "deptCode", "deptName", "upperDeptCode", n));
        }
    });
};
me.blinkClick = function() {
    //绑定双击dblclick 单击click by wuhebin 20180528
    me.byId("grid", me.container).find("table:first tbody tr").dblclick(function() {
        var checkboxObj = $(this).find('input[type=checkbox]').first();
        $.bsgrid.adaptAttrOrProp(checkboxObj, 'checked', false);
    }).click(function() {
        var checkboxObj = $(this).find('input[type=checkbox]').first();
        $.bsgrid.adaptAttrOrProp(checkboxObj, 'checked', true);
    });
};
me.init = function() {
    //     $("#grid table:first th,tr",me.container).find("td:eq(4)").css("color","red");
    //       var wIndex  = $("#grid table:first th[w_index='empName']",me.container);
    //     wIndex.css("color","red");
    //     $("#grid table:first tr:eq(0)",me.container).css("color","red");
    me.initColor(); //me.blinkClick ();
    me.byId('grid').extgrid('options').settings.afterGridRefresh = function() {
        //me.blinkClick ();
        me.initColor();
    }; //me.byId('empBirthday').extdate({dateFmt:'yyyy-MM-dd HH:mm:ss',maxDate:'%y-%M-%d %H:%m:%s}'})
};
me.initColor = function() {
    me.find("button span").each(function(index, item) {
        var spanValue = $(this).html();
        if (spanValue && spanValue == "详细") {
            $(this).parent().removeAttr("class");
            $(this).parent().attr("class", "m-r-xs btn btn-sm btn-info");
        }
        if (spanValue && spanValue == "员工归属明细") {
            $(this).parent().removeAttr("class");
            $(this).parent().attr("class", "m-r-xs btn btn-sm btn-info");
        }
        if (spanValue && spanValue == "员工状态明细") {
            $(this).parent().removeAttr("class");
            $(this).parent().attr("class", "m-r-xs btn btn-sm btn-info");
        }
        if (spanValue && spanValue == "详细(折叠Tab)") {
            $(this).parent().removeAttr("class");
            $(this).parent().attr("class", "m-r-xs btn btn-sm btn-info");
        }
    });
};
me.exportT = function() {
    var rowSet = me.byId("grid").extgrid("getRowSet");
    var pageDsName = "2";
    var dc = new DataSet();
    var systemId = "rlzy.control";
    var gridId = "grid";
    var actionName = "RsEmpAction";
    var eventName = "show";
    dc.setParameter("pageDsName", pageDsName);
    dc.setParameter("moduleName", systemId);
    dc.setParameter("dsSystemId", systemId);
    dc.setParameter("gridId", gridId);
    dc.setParameter("rowSetName", rowSet._name);
    dc.setParameter("dsName", "exportExcelCloums");
    _application.showDialog({
        module: "excelservice",
        action: "ExcelServiceAction",
        dataSet: dc,
        event: "showExcelCloum",
        title: "导出人力资源数据数据",
        height: 500,
        width: 650,
        modal: true,
        onComplete: function(data) {
            me.doExport(data, rowSet, dc, systemId, actionName, eventName, pageDsName);
        }
    });
};
me.doExport = function(data, rowSet, dc, systemId, actionName, eventName, pageDsName) {
    if (data && data.length > 0) {
        var formRowSet = me.byId("queryForm").extqueryform("getRowSet");
        if (formRowSet) {
            rowSet.setQueryRowSetName(formRowSet.getName());
        }
        dc.addRowSet(rowSet);
        dc.addRowSet(formRowSet);
        dc.setParameter("exportColumns", data.toString());
        var _excelExportOptions = {};
        _excelExportOptions["module"] = systemId;
        _excelExportOptions["action"] = actionName;
        _excelExportOptions["event"] = eventName;
        _excelExportOptions["dsName"] = pageDsName;
        _excelExportOptions["dsSystemId"] = systemId;
        var base64 = new Base64();
        dc.setParameter("_excelExportOptions", base64.encode(JSON.toStr(_excelExportOptions)));
        _application.fileDownload({
            "module": "excelservice",
            "action": "ExcelServiceAction",
            "event": "exportGridData",
            "dataSet": dc
        });
    }
};
me.dis = function() {
    var queryFormData = me.byId("queryForm").extqueryform("getRowSet");
    var dc = new DataSet();
    dc.addRowSet(queryFormData);
    var actionName = me.action;
    var eventName = me.event;
    var dsSystemId = me.dsSystemId;
    var moduleName = me.moduleName;
    dc.setParameter("dsSystemId", dsSystemId);
    dc.setParameters(me.dataCenter.getParameters());
    var rowset = me.byId("grid").extgrid("getRowSetCopy");
    rowset.setQueryRowSetName(queryFormData.getName());
    dc.addRowSet(rowset);
    me.requestData({
        "module": moduleName,
        "action": actionName,
        "event": eventName,
        "dataSet": dc,
        modal: false,
        "success": function() {
            me.byId("grid").extgrid("refresh");
        }
    });
};
me.exportFile = function() {
    var dc = new DataSet();
    dc.setParameter("dsSystemId", "rlzy.control");
    _application.fileDownload({
        "module": "rlzy.control",
        "action": "FileDownAction",
        "event": "downLoad",
        "dataSet": dc
    });
};
me.queryStatusBelong = function(rowIndex) {
    var row = me.byId("grid").extgrid("getRow", rowIndex);
    var empNo = row.getItemValue("empNo");
    var dc = new DataSet();
    dc.setParameter("empNo", empNo);
    dc.setParameter("dsName", "426");
    me.showDialog({
        "action": "RsEmpAction",
        "event": "showTransHis",
        "title": "员工状态明细",
        "dataSet": dc,
        "width": 1000,
        "height": 600,
        "container": me.container
    });
};
me.queryBelong = function(rowIndex) {
    var row = me.byId("grid").extgrid("getRow", rowIndex);
    var empNo = row.getItemValue("empNo");
    var dc = new DataSet();
    dc.setParameter("empNo", empNo);
    dc.setParameter("dsName", "402");
    me.showDialog({
        "action": "RsEmpGwddAction",
        "event": "show",
        "title": "员工归属明细",
        "dataSet": dc,
        "width": 1000,
        "height": 600,
        "container": me.container
    });
};
me.onClickDetailsByShendong = function(rowIndex) {
    var row = me.byId("grid").extgrid("getRow", rowIndex);
    var id = row.getItemValue("empId");
    var dc = new DataSet();
    dc.setParameter("flag", 1);
    dc.setParameter("status", 0);
    dc.setParameter("id", id);
    dc.setParameter("dsName", "49125");
    me.requestComponent({
        action: "RsEmpAction",
        event: "showAddPage",
        dataSet: dc,
        container: me.container
    });
};