var SelectorSource = {};
/*时间格式化*/
Date.prototype.format = function (format) {
    var o =
    {
        "M+": this.getMonth() + 1,                   //month
        "d+": this.getDate(),                        //day
        "h+": this.getHours(),                       //hour
        "m+": this.getMinutes(),                     //minute
        "s+": this.getSeconds(),                     //second
        "q+": Math.floor((this.getMonth() + 3) / 3), //quarter
        "S": this.getMilliseconds()                  //millisecond
    }
    if (/(y+)/.test(format))
        format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(format))
            format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
    return format;
}

layui.define(['form', 'vue', 'element', 'jquery', 'table'],function (exports) {
    var form = layui.form,
        layer = layui.layer,
        element = layui.element,
        $ = layui.jquery,
        excel = layui.excel,
        table = layui.table;

    //获取url的参数值
    $.getUrlParam = function (name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]); return null;
    }
    var clearData = null,
        u = function () {
             this.config = {
                 tokenInvalid: "登入信息已失效,系统将自动跳转到登入页!",
                 urlLogin: "/Login/Index",
                 titleError: "错误信息",
                 titleadd: "新增",
                 titleDeleteSuccess: "删除成功",
                 titleSelectOneRowData: "请至少选择一条数据",
                 titleConfirmDelete: "确定要删除所选信息",
                 msgOpenTime:200
             }
        }
    //cookie Token 失效返回登入页
    u.prototype.cookieVerification = function () {
        var i = this;
        var cookie = i.cookie("Token");
        if (cookie == null) {
            layer.msg(i.config.tokenInvalid, { icon: 6, shade: 0.4, time: 1000 });
            setTimeout(function () {
                window.location.href = i.config.urlLogin;
            }, 1500);
        }
    }

    //cookie set ,read[value 是空 read]
    u.prototype.cookie = function (key, value, options) {
        if (typeof value !== "undefined") {//write
            options = options || {}
            var cookie = encodeURIComponent(key) + "=" + encodeURIComponent(value);
            if (typeof options.expries === "number") {
                var date = new Date();
                date.setDate(date.getDate() + options.expries);
                cookie += ";expries=" + date.toUTCString();
            }
            if (options.path)
                cookie += ";path=" + options.path;
            if (options.domain)
                cookie += ";domain=" + options.domain;
            if (options.secure)
                cookie += ";secure";
            document.cookie = cookie;
        }
        var cookies = document.cookie.split(";");
        for (var i = 0; i < cookies.length; i++) {
            var readCookie = cookies[i].split("=");
            var name = decodeURIComponent(readCookie.shift());
            if ($.trim(name)  === key) return decodeURIComponent(readCookie.join("="));
        }
        return null;
    }

    //ajax
    u.prototype.ajax = function (parameter) {
        var i = this;
        i.cookieVerification();
        //在这里可以判断cooke 失效 重定性
        var index = layer.load();
        var objs = $.extend({
            dataType: "json",
            data: parameter.data,
            error: function (xmlHttpRequest, textStatus, errorThrown) {
                layer.alert(errorThrown, { icon: 2, shadeClose: true, title: i.config.errorTitle });
            },
            success: parameter.success,
            type: "post",
            beforeSend: function (request) {
                request.setRequestHeader("Authorization", "x");
            },
            complete: function (xmlHttpRequest, status) {
                layer.close(index);
            }
        }, parameter);
        $.ajax(objs);
    }

    // add or edit from  init vue data
    u.prototype.initAddVueData = function (vm) {
        if (clearData == null) console.log(" vml 属性 clearData 数据为空。");
        var i = this;
        //清空初始化 vue 对象 
        var allKeys = Object.keys(vm.$data);
        //新增的时候删除 编辑data 属性【delete】
        for (var item in allKeys) {
            if (!Object.prototype.hasOwnProperty.call(allKeys, item)) continue;
            var isOk = true;
            for (var tempKey in clearData) {
                if (!Object.prototype.hasOwnProperty.call(clearData, tempKey)) continue;
                if (allKeys[item] == tempKey) {
                    isOk = false;
                    break;
                }
            }
            if (isOk && clearData != null) Vue.delete(vm.$data, allKeys[item]);
        }
        if (clearData != null) Object.assign(vm.$data, clearData);
        Vue.set(vm.$data, "disabled", false);
        Vue.set(vm.$data, "readonly", false);
    }

    /*
     * 表单扩展验证 layui 自带的 存在bug 在某些时候额外处理一遍
     */
    u.prototype.requiredExtend = function (form) {
        var result = true;
        for (var i = 0; i < form.length; i++) {
            if (form[i].nodeName == "SELECT") {
                var seElem = $(form[i]),
                    seValue = seElem.find("option:selected").val(),
                    seVerify = seElem.attr("lay-verify");
                if (seVerify === "required" && (seValue == null || seValue === "")) {
                    result = false;
                    layer.msg("必填项不能为空", { icon: 2, shift: 6 });
                    $(form[i + 1]).focus();
                    form[i + 1].style.cssText += 'border-color: red !important;';
                    break;
                }
            }
        }
        return result;
    }

    /*
     * 清除下拉框数据
     */
    u.prototype.clearSelect = function (tableName, $, form) {
        $('.ClearSelector_' + tableName).each(function () {
            var selDom = ($(this));
            selDom.val("");
        });
        form.render("select");
    }

    /*
    * ajax 成功状态判断
    */
    u.prototype.successBefore = function (result) {
        var i = this;
        var isOk = false;
        if (result.Code !== 200 || !result.Status) {
            layer.alert(result.Message, { icon: 2, shadeClose: true, title: i.config.errorTitle });
            isOk = true;
        }
        return isOk;
    }

    /*
    * excel  导出数据【tableObj】当前表格信息,【result】后台返回的数据 http://excel.wj2015.com/
    */
    u.prototype.ExcelExportData = function (tableObj, result) {
        setTimeout(function () {
            var tableCols = tableObj.config.cols[0],
                //第一行是列头,后面的是数据
                resultData = [],
                exelData = [],
                tempChTitle = [];
            for (var i = 0; i < tableCols.length; i++) {
                if (tableCols[i].type == "normal") {
                    exelData[tableCols[i].field] = tableCols[i].title;
                    tempChTitle.push(tableCols[i].title);
                }
            }
            resultData.push(tempChTitle);
            var title = Object.keys(exelData);
            for (var xp = 0; xp < result.data.length; xp++) {
                var nowData = [];
                for (var j = 0; j < title.length; j++) {
                    var cols = title[j];
                    nowData.push(result.data[xp][cols]);
                }
                resultData.push(nowData);
            }
            var curmenu = JSON.parse(sessionStorage.getItem("curmenu")),
                newTime = new Date().format("yyyymmddhhMMss"),
                fileName = curmenu == null ? newTime : curmenu.title + newTime;
            excel.exportExcel({ sheet1: resultData }, fileName + ".xlsx", 'xlsx');
            layer.msg("导出完成!", { icon: 6, shade: 0.4, time: 200 });
        }, 0);
    }

    /*
    * excel  下载模板 读取的表格table 列 过滤 noExel属性, 且读取 type=normal的
    */
    u.prototype.exelDownTemplate = function (mainList) {
        var tableCols = mainList.Table.config.cols[0],
            //第一行是列头,第2行是中文描述 
            resultData = [],
            englishTitle = [],
            chTitle = [];
        for (var i = 0; i < tableCols.length; i++) {
            if (typeof (tableCols[i].noExel) != "undefined" || tableCols[i].noExel) continue;
            if (tableCols[i].type === "normal") {
                englishTitle[tableCols[i].field] = tableCols[i].title;
                chTitle.push(tableCols[i].title);
            }
        }
        resultData.push(Object.keys(englishTitle));
        resultData.push(chTitle);
        var curmenu = JSON.parse(sessionStorage.getItem("curmenu")),
            newTime = new Date().format("yyyymmddhhMMss"),
            fileName = curmenu == null ? newTime : curmenu.title + newTime;
        excel.exportExcel({ sheet1: resultData }, "模板"+fileName + ".xlsx", 'xlsx');
    }

    /*
     *创建select【dom】 $dom,【dataSource】数据源,【selLabel】 text, 【selValue】 value,【isRender】layui 重新渲染 次方法有可能多次调用
    */
    u.prototype.createSelectElement = function ($dom, dataSource, selLabel, selValue, isRender,key) {
        if (dataSource == null || dataSource.length===0) {
            console.log("数据源:[" + key + "]配置有误或者当前url查询无数据,请联系管理员!");
            return;
        }
        if ($dom == null) return;
        //组装html 元素 一次性写入文档节点
        var tempArr = [];
        tempArr.push("<option selected value='' >请选择</option>");
        for (var k = 0; k < dataSource.length; k++) {
            tempArr.push("<option value = '" + dataSource[k][selValue] + "'>" + dataSource[k][selLabel] + "</option>");
        }
        for (var i = 0; i < $dom.length; i++) {
            if ($dom[i].length == 0) continue;
            $dom[i].empty();
            $dom[i].append(tempArr.join(""));
            $dom[i][0].setAttribute("lay-search","")

        }
        if (isRender) form.render('select'); 
    }

    /*
    * 字典数组对象查询 通过属性 Property
    */
    u.prototype.arrFilterByProperty = function (property, propertyValue) {
        return window.top.sysDic.data.filter(item => item[property] === propertyValue);
    }

    var objUniversal = {
        mmain: function (areaName, tableName, vm, vmq, editInfo, selfBtn, mainList) {
            clearData = Object.assign({}, vm.$data);
            var sysU = new u();

            mainList.Load();

            //监听行单击事件(双击事件为:rowDouble)
            table.on('row(mainList)', function (obj) {
                table.on('checkbox(mainList)', function (obj) {
                    obj.checked ? obj.tr.addClass('layui-table-click') : obj.tr.removeClass('layui-table-click')
                });
            });

            //监听表格排序 initSort 【field】排序字段、【排序方式】、【initSort】记录初始排序,如果不设的话,将无法标记表头的排序状态
            table.on('sort(mainList)', function (obj) {
                var urlLoad = "/" + areaName + "/" + tableName + '/Load';
                table.reload('mainList', { url: urlLoad , initSort: obj, method: "post", where: { field: obj.field, order: obj.type } });
            });

            var openWidth = mainList["openWidth"] == null ? ["750px", "450px"] : mainList.openWidth;

            //头工具栏事件
            table.on('toolbar(mainList)', function (obj) {
                sysU.cookieVerification();
                var checkStatus = table.checkStatus('mainList'),
                    //选中的行数
                    count = checkStatus.data.length,
                    tableObj = obj;
                //数据 false分页
                Vue.set(vmq.$data, "Exel", false);
                switch (obj.event) {
                    //新增数据
                    case "tabAdd":
                    case "btnAdd":
                        $("#modifyForm form")[0].reset();
                        if (selfBtn['DomConfig'] !== undefined) {
                            var add = selfBtn['DomConfig'].call(null,
                                function() {
                                    sysU.initAddVueData(vm);
                                });
                            if (add) return;
                        } else {
                            $("#modifyForm form")[0].reset();
                            sysU.initAddVueData(vm);
                        }
                        var addOpenIndex = layer.open({
                            title: sysU.config.titleadd,
                            area: openWidth,
                            maxmin: true,
                            type: 1,
                            content: $('#modifyForm'),
                            btn: ['保存', '关闭'],
                            end: function (index, layero) {
                                layer.close(index);
                                sysU.clearSelect(tableName, $, form);
                            },
                            success: function(layero, index) {
                                form.render().verify();
                                form.on("submit(fromAdd)", function (data) {
                                    var result = sysU.requiredExtend(data.form);
                                    if (!result) return;
                                    var ajaxConfig = {
                                        data: { entity: vm.$data },
                                        url: "/" + areaName + "/" + tableName + "/Ins",
                                        success: function (result) {
                                            if (sysU.successBefore(result)) return;
                                            layer.close(addOpenIndex);
                                            layer.msg('新增成功', { icon: 6, shade: 0.4, time: sysU.config.msgOpenTime });
                                            mainList.Load();
                                            if (selfBtn['SaveSuccess'] !== undefined) selfBtn['SaveSuccess'].call(null, "Add");
                                            if (selfBtn["allActionAfter"] !== undefined) selfBtn["allActionAfter"].call(null, null);
                                        }
                                    };
                                    sysU.ajax(ajaxConfig);
                                });
                            },
                            yes: function (index, layero) {
                                if (mainList["action"]) {
                                    mainList['actionMethod'].call(null, "add", addOpenIndex);
                                    return;
                                }
                                layero.find('button[name=fromAdd]').click(); 
                            }
                        });
                        break;
                    //编辑单笔数据
                    case "btnEdit":
                        if (count === 1) {
                            $("#modifyForm form")[0].reset();
                            if (selfBtn["DomConfig"] !== undefined) {
                                var r = selfBtn["DomConfig"].call(null,
                                    function() {
                                        editInfo(checkStatus.data[0]);
                                        Vue.set(vm.$data, "disabled", true);
                                        Vue.set(vm.$data, "readonly", true);
                                    }, checkStatus.data[0]);
                                if (r) return;
                            } else {
                                editInfo(checkStatus.data[0]);
                                Vue.set(vm.$data, "disabled", true);
                                Vue.set(vm.$data, "readonly", true);
                            }
                            var eiditOpenIndex = layer.open({
                                title: '编辑',
                                area: openWidth,
                                maxmin: true,
                                type: 1,
                                content: $('#modifyForm'),
                                btn: ['保存', '关闭'],
                                end: function (index, layero) {
                                    layer.close(index);
                                    sysU.clearSelect(tableName, $, form);
                                },
                                success: function (layero, index) {
                                    form.render().verify();
                                    form.on("submit(fromUpdate)", function (data) {
                                        var result = sysU.requiredExtend(data.form);
                                        if (!result) return;
                                        var ajaxConfig = {
                                            data: { entity: vm.$data },
                                            url: "/" + areaName + "/" + tableName + "/Upd",
                                            success: function (result) {
                                                if (sysU.successBefore(result)) return;
                                                layer.msg("修改成功!", { icon: 6, shade: 0.4, time: sysU.config.msgOpenTime });
                                                layer.close(eiditOpenIndex);
                                                mainList.Load();
                                                if (selfBtn['SaveSuccess'] !== undefined) selfBtn['SaveSuccess'].call(null, "Edit");
                                                if (selfBtn["allActionAfter"] !== undefined) selfBtn["allActionAfter"].call(null, null);
                                            }
                                        };
                                        sysU.ajax(ajaxConfig);
                                    });
                                },
                                yes: function (index, layero) {
                                    if (mainList["action"]) {
                                        mainList['actionMethod'].call(null, "edit", eiditOpenIndex);
                                        return;
                                    }
                                    layero.find('button[name=fromUpdate]').click(); 
                                }
                            });
                        }
                        else
                            layer.alert("请选择一条数据", { icon: 2, shadeClose: true, title: "错误信息" });
                        break;
                    //上传数据
                    case "btnUpload":
                        var url = "/" + areaName + "/" + tableName + "/Import";
                        objUniversal.ImportExcel(sysU, url, mainList);
                        break;
                    //导出数据 
                    case "btnExport":
                        //数据 true不分页
                        Vue.set(vmq.$data, "Exel", true);
                        var ajaxConfig = {
                            data: vmq.$data,
                            url: "/" + areaName + "/" + tableName + "/Export",
                            success: function (result) {
                                if (result.code !== 0 || result.count <= 0) {
                                    layer.msg("该条件没有查询到数据!", { icon: 6, shade: 0.4, time: sysU.config.msgOpenTime });
                                    return;
                                }
                                sysU.ExcelExportData(tableObj, result);
                            }
                        };
                        sysU.ajax(ajaxConfig);
                        break;
                    //检索按钮,弹出检索区
                    case "btnSelect":
                        panelSearch();
                        if (selfBtn["DomConfig"] !== undefined) selfBtn["DomConfig"].call(null, null);
                        break;
                    //刷新数据
                    case "btnRefresh":
                        mainList.Load();
                        $('.layui-collapse').hide();
                        break;
                    //批量删除数据
                    case "btnDelete":
                        if (count == 0) {
                            layer.alert(sysU.config.titleSelectOneRowData, { icon: 2, shadeClose: true, title: sysU.config.titleError });
                            return;
                        }
                        //删除前方法
                        if (selfBtn['SaveBefore'] !== undefined) selfBtn['SaveBefore'].call(null, "Delete", checkStatus);
                        var urlDelete = mainList["urlDelete"] == null ? `/${areaName}/${tableName}/DelByIds` : mainList["urlDelete"];
                        //是否确定删除
                        layer.confirm(sysU.config.titleConfirmDelete, { icon: 3 }, function (index) {
                            var data = checkStatus.data; //获取选中行的数据
                            var ajaxConfig = {
                                data: { ids: data.map(function (e) { return e.id; }) },
                                url: urlDelete,
                                success: function (result) {
                                    if (sysU.successBefore(result)) return;
                                    layer.close(index);
                                    layer.msg(sysU.config.titleDeleteSuccess, { icon: 6, shade: 0.4, time: sysU.config.msgOpenTime });
                                    mainList.Load();
                                    if (selfBtn['SaveSuccess'] !== undefined) selfBtn['SaveSuccess'].call(null, "Delete");
                                    $('.layui-collapse').hide();
                                    if (selfBtn["allActionAfter"] !== undefined) selfBtn["allActionAfter"].call(null, null);
                                }
                            };
                            sysU.ajax(ajaxConfig);
                        });
                        break;
                }

                //自定义按钮方法遍历
                for (var key in selfBtn) {
                    if (!Object.prototype.hasOwnProperty.call(selfBtn, key)) continue;
                    if (obj.event == key)
                        selfBtn[key]();
                }
            });

            //监听页面主按钮操作
            var active = {
                //检索区的查询按钮 
                btnQuery: function () {
                    //不导出
                    Vue.set(vmq.$data, "Exel", false);
                    table.reload('mainList', {
                        page: { curr: 1 },
                        url: "/" + areaName + "/" + tableName + "/Load",
                        method: "post",
                        where: vmq.$data
                    });
                    panelSearch();
                },

                //检索区重置按钮
                btnReset: function () {
                    for (var item in vmq.$data) {
                        vmq.$data[item] = null;
                        $("[name='q" + item + "']").val('');
                        layui.form.render(); //下拉框等页面元素需要重渲染
                    }
                },

                //检索区关闭按钮
                btnClose: function () {
                    panelSearch();
                },

                //下载模板
                btnTemplate: function () {
                    sysU.exelDownTemplate(mainList);
                }
            };

            $('.layui-btn').on('click', function () {
                var type = $(this).data('type');
                active[type] ? active[type].call(this) : "";
            });


            function panelSearch() {
                $('#panelSearch').toggle("fast");
            }
        },

        BindSelector: function (vml, selector, fnCallBack, seData) {
            if (selector == null) return;
            var sysU = new u();
         
            let vmList = vml[0];
            let fn = fnCallBack;
            var allSelector = Object.keys(selector),
                seLength = allSelector.length,
                index = 0;
            allSelector.forEach(function (key) {
                let selectObj = {
                    Dom: selector[key]["Dom"],
                    SelType: selector[key].SelType,
                    SelFrom: selector[key].SelFrom,
                    SelLabel: selector[key].SelLabel,
                    SelValue: selector[key].SelValue
                };
                if (selectObj.SelType === "FromUrl") {
                    var ajaxConfig = {
                        data: { limit: 1000 },
                        url: selectObj.SelFrom, 
                        success: function (result) {
                            if (result.data === 0 ) {
                                layer.alert(result.Message, { icon: 2, shadeClose: true, title: i.config.errorTitle });
                                return;
                            }
                            SelectorSource[key] = result.data;
                            if (typeof seData != "undefined" && seData != null) seData[key] = result.data;
                            sysU.createSelectElement(selectObj.Dom, result.data, selectObj.SelLabel, selectObj.SelValue,false, selectObj.SelFrom);
                            objUniversal.bindSelectorAfter(vmList);
                            if (index >= seLength&& fn != null) fn();
                        }
                    };
                    sysU.ajax(ajaxConfig);
                }
                else if (selectObj.SelType === "FromDict") {
                    var tempData = sysU.arrFilterByProperty("DictType", selectObj.SelFrom);
                    SelectorSource[key] = tempData;
                    if (typeof seData != "undefined" && seData != null) seData[key] = tempData;
                    sysU.createSelectElement(selectObj.Dom, tempData, selectObj.SelLabel, selectObj.SelValue, false, selectObj.SelFrom);
                    if (index >= seLength && fn != null) fn();
                }
                index++;
            });
            objUniversal.bindSelectorAfter(vmList);
        },

        mainDtl: function (selfbtn, All) {
            var sysU = new u();
            var DtlShowbool = {};//所有折叠的当前状态
            var Dtl = {};//当前点击All数据
            var Value = {};//主表数据缓存数据
            var Values = new Array();//主表数据缓存数据集合
            //所有折叠状态初始化
            for (i = 0; i < All.length; i++) {
                DtlShowbool[All[i].TableNameDtl] = false;
            }

            //监听单元格点击
            table.on('tool(mainList)', function (obj) {
                var Dtlbtn = {};
                var mainListDtl;
                for (i = 0; i < All.length; i++) {
                    if (obj.event === All[i].TableNameDtl) {
                        Dtl = All[i];
                    }
                }
                if (Dtl == {}) return;
                for (i = 0; i < Object.keys(Dtl.NameDtl).length; i++) {
                    //主表数据赋值
                    Value[Object.keys(Dtl.NameDtl)[i]] = obj.data[Dtl.NameDtl[Object.keys(Dtl.NameDtl)[i]]];
                    Values[Dtl.TableNameDtl] = Value;
                    //重载赋值(防止主子表字段名不一样)
                    if (obj.data[Dtl.NameDtl[Object.keys(Dtl.NameDtl)[i]]] != null) {
                        Dtl.vmqDtl.$data[Object.keys(Dtl.NameDtl)[i]] = obj.data[Dtl.NameDtl[Object.keys(Dtl.NameDtl)[i]]];
                    } else {
                        Dtl.vmqDtl.$data[Object.keys(Dtl.NameDtl)[i]] = '###';
                    }
                }
                //重载方法
                mainListDtl = {
                    mainListDtl: function (mainDtl) {
                        mainDtl.mainListDtl.Load(mainDtl.vmqDtl.$data);
                    }
                };
                //监听折叠
                element.on('collapse(DisplayDtl)', function (data) {
                    //记录当前折叠状态
                    DtlShowbool[data.title[0].id.split('_')[1]] = data.show;
                    //头工具栏事件
                    table.on('toolbar(mainListDtl' + data.title[0].id.split('_')[1] + ')', function (obj) {
                        for (i = 0; i < All.length; i++) {
                            if (obj.event.split('_')[1] === All[i].TableNameDtl) {
                                Dtlbtn = All[i];
                            }
                        }
                        var checkStatus = table.checkStatus('mainListDtl' + Dtlbtn.TableNameDtl);
                        var count = checkStatus.data.length;//选中的行数
                        switch (obj.event) {
                            case 'tabAddDtl_' + Dtlbtn.TableNameDtl:  //跳转至单据页面,新增数据
                                //新增前的处理方法
                                if (selfbtn['DomConfig_' + Dtlbtn.TableNameDtl] !== undefined) {
                                    var rtn = selfbtn['DomConfig_' + Dtlbtn.TableNameDtl].call(null, "Add", Dtlbtn.vmqDtl._data);
                                    if (rtn == false) { return null; }
                                }

                                layer.open({
                                    type: 1
                                    , area: ['600px', '500px']
                                    , content: $('#modifyFormDtl_' + Dtlbtn.TableNameDtl)
                                    , success: function (layero, index) {
                                        for (i = 0; i < Object.keys(Values[Dtlbtn.TableNameDtl]).length; i++) {
                                            Dtlbtn.vmDtl.$set(Object.keys(Values[Dtlbtn.TableNameDtl])[i], Value[Object.keys(Values[Dtlbtn.TableNameDtl])[i]])
                                        }
                                    }
                                    , btn: ['保存', '取消']
                                    , yes: function (index, layero) {
                                        //保存前方法
                                        if (selfbtn['SaveBefore_' + Dtlbtn.TableNameDtl] !== undefined) {
                                            var rtn = selfbtn['SaveBefore_' + Dtlbtn.TableNameDtl].call(null, "Add");
                                            if (rtn != null) {
                                                if ($(rtn[0]).context.tagName == "SELECT") {
                                                    $($(rtn[0]).next()[0].children[0].firstChild).attr("placeholder", "此项为必填项");
                                                }
                                                layer.msg("必填项不能为空", { icon: 2, shadeClose: true });
                                                $(rtn).focus();
                                                return null;
                                            }
                                        }

                                        //新增
                                        $.ajax({
                                            url: "/" + Dtlbtn.AreaNameDtl + "/" + Dtlbtn.TableNameDtl + "/Ins",
                                            type: "post",
                                            data: { entity: Dtlbtn.vmDtl.$data },
                                            dataType: "json",
                                            success: function (result) {
                                                if (result.Code == 200 && result.Status) {
                                                    layer.msg('新增成功', { icon: 6, shade: 0.4, time: sysU.config.msgOpenTime });
                                                    mainListDtl.mainListDtl(Dtlbtn);//重载TABLE
                                                    if (selfbtn["allActionAfter"] !== undefined) selfbtn["allActionAfter"].call(null, null);
                                                    //新增成功回调方法
                                                    if (selfbtn['SaveSuccess_' + Dtlbtn.TableNameDtl] !== undefined) {
                                                        selfbtn['SaveSuccess_' + Dtlbtn.TableNameDtl].call(null, "Add");
                                                    }
                                                }
                                                else {
                                                    layer.alert(result.Message, { icon: 2, shadeClose: true, title: "错误信息" });
                                                }
                                            },
                                            error: function (XMLHttpRequest, textStatus, errorThrown) {
                                                layer.alert(errorThrown, { icon: 2, shadeClose: true, title: "错误信息" });
                                            }
                                        });
                                        layer.close(index);
                                    }
                                    , btn2: function (index, layero) {
                                        Dtlbtn.vmDtl.$set('$data', {});
                                        layer.close(index);
                                    }
                                    , end: function (index, layero) {
                                        sysU.clearSelect(Dtlbtn.TableNameDtl, $, form);
                                        Dtlbtn.vmDtl.$set('$data', {});
                                    }
                                });
                                break;
                            case 'btnRefreshDtl_' + Dtlbtn.TableNameDtl:  //刷新数据
                                mainListDtl.mainListDtl(Dtlbtn);
                                break;
                            case 'btnEditDtl_' + Dtlbtn.TableNameDtl: //编辑单笔数据
                                if (count == 1) {
                                    Dtlbtn.EditInfoDtl(checkStatus.data[0]);
                                    //编辑前的处理方法
                                    if (selfbtn['DomConfig_' + Dtlbtn.TableNameDtl] !== undefined) {
                                        var rtn = selfbtn['DomConfig_' + Dtlbtn.TableNameDtl].call(null, "Edit", Dtlbtn.vmqDtl._data);
                                        if (rtn == false) { return null; }
                                    }

                                    layer.open({
                                        type: 1
                                        , area: ['600px', '500px']
                                        , content: $('#modifyFormDtl_' + Dtlbtn.TableNameDtl)
                                        , success: function (layero, index) {

                                        }
                                        , btn: ['保存', '取消']
                                        , yes: function (index, layero) {
                                            //保存前方法
                                            if (selfbtn['SaveBefore_' + Dtlbtn.TableNameDtl] !== undefined) {
                                                var rtn = selfbtn['SaveBefore_' + Dtlbtn.TableNameDtl].call(null, "Edit");
                                                if (rtn != null) {
                                                    if ($(rtn[0]).context.tagName == "SELECT") {
                                                        $($(rtn[0]).next()[0].children[0].firstChild).attr("placeholder", "此项为必填项");
                                                    }
                                                    layer.msg("必填项不能为空", { icon: 2, shadeClose: true });
                                                    $(rtn).focus();
                                                    return null;
                                                }
                                            }

                                            //编辑
                                            $.ajax({
                                                url: "/" + Dtl.AreaNameDtl + "/" + Dtlbtn.TableNameDtl + "/Upd",
                                                type: "POST",
                                                data: { entity: Dtlbtn.vmDtl.$data },
                                                dataType: "json",
                                                success: function (result) {
                                                    if (result.Code == 200 && result.Status) {
                                                        layer.msg("修改成功!", { icon: 6, shade: 0.4, time: sysU.config.msgOpenTime });
                                                        mainListDtl.mainListDtl(Dtlbtn);
                                                        //保存成功方法
                                                        if (selfbtn['SaveSuccess_' + Dtlbtn.TableNameDtl] !== undefined) {
                                                            selfbtn['SaveSuccess_' + Dtlbtn.TableNameDtl].call(null, "Edit");
                                                        }
                                                        if (selfbtn["allActionAfter"] !== undefined) selfbtn["allActionAfter"].call(null, null);

                                                    } else {
                                                        layer.alert(result.Message, { icon: 2, shadeClose: true, title: "错误信息" });
                                                    }
                                                }

                                            });
                                            layer.close(index);
                                        }
                                        , btn2: function (index, layero) {
                                            Dtlbtn.vmDtl.$set('$data', {});
                                            layer.close(index);
                                        }
                                        , end: function (index, layero) {
                                            sysU.clearSelect(Dtlbtn.TableNameDtl, $, form);
                                            Dtlbtn.vmDtl.$set('$data', {});
                                        }
                                    });
                                }
                                else
                                    layer.alert("请选择一条数据", { icon: 2, shadeClose: true, title: "错误信息" });
                                break;
                            case 'btnDeleteDtl_' + Dtlbtn.TableNameDtl:   //批量删除数据
                                if (count > 0) {
                                    //删除前方法
                                    if (selfbtn['DomConfig_' + Dtlbtn.TableNameDtl] !== undefined) {
                                        var rtn = selfbtn['DomConfig_' + Dtlbtn.TableNameDtl].call(null, "Delete", Dtlbtn.vmqDtl._data);
                                        if (rtn == false) { return null; }
                                    }

                                    layer.confirm('确定要删除所选信息', { icon: 3 }, function (index) {
                                        var data = checkStatus.data; //获取选中行的数据

                                        $.ajax({
                                            url: "/" + Dtlbtn.AreaNameDtl + "/" + Dtlbtn.TableNameDtl + "/DelByIds",
                                            type: "post",
                                            data: { ids: data.map(function (e) { return e.Id; }) },
                                            dataType: "json",
                                            success: function (result) {
                                                if (result.Code == 200 && result.Status) {
                                                    layer.msg('删除成功', { icon: 6, shade: 0.4, time: sysU.config.msgOpenTime });
                                                    layer.close(index);
                                                    mainListDtl.mainListDtl(Dtlbtn);//重载TABLE
                                                    //保存成功方法
                                                    if (selfbtn['SaveSuccess_' + Dtlbtn.TableNameDtl] !== undefined) {
                                                        selfbtn['SaveSuccess_' + Dtlbtn.TableNameDtl].call(null, "Delete");
                                                    }
                                                    if (selfbtn["allActionAfter"] !== undefined) selfbtn["allActionAfter"].call(null, null);
                                                }
                                                else {
                                                    layer.alert(result.Message, { icon: 2, shadeClose: true, title: "错误信息" });
                                                }
                                            },
                                            error: function (XMLHttpRequest, textStatus, errorThrown) {
                                                layer.alert(errorThrown, { icon: 2, shadeClose: true, title: "错误信息" });
                                            }
                                        });
                                    });
                                }
                                else
                                    layer.alert("请至少选择一条数据", { icon: 2, shadeClose: true, title: "错误信息" });
                                break;
                            //导出数据
                            case 'btnExportDtl_' + Dtlbtn.TableNameDtl:
                                debugger
                                var index = layer.load();
                                $.ajax({
                                    url: "/" + Dtlbtn.AreaNameDtl + "/" + Dtlbtn.TableNameDtl + "/Export",
                                    type: "POST",
                                    data: Dtlbtn.vmqDtl._data,
                                    dataType: "json",
                                    success: function (result) {
                                        layer.close(index);
                                        var ExportTitle = new Array();
                                        var ExportData = result.data;
                                        for (var i = 0; i < result.count; i++) {
                                            var data = result.data[i];
                                            for (var item in data) {
                                                if (i == 0) {
                                                    ExportTitle.push(item);
                                                }
                                            }
                                        }
                                        table.exportFile(ExportTitle, ExportData, 'csv')

                                        layer.msg("导出完成!", { icon: 6, shade: 0.4, time: sysU.config.msgOpenTime });
                                    },
                                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                                        layer.close(index);
                                        layer.alert(errorThrown, { icon: 2, shadeClose: true, title: "错误信息" });
                                    }
                                });
                                break;
                        }

                        for (var key in selfbtn) {
                            if (obj.event == key)
                                selfbtn[key]();
                        }
                    });
                });
                //单元格对checkbox失效
                $(obj.tr[1]).click();
                //字体颜色转换
                obj.tr.siblings().find('.' + Dtl.TableNameDtl + 'Class').css('color', 'cornflowerblue');
                obj.tr.find('.' + Dtl.TableNameDtl + 'Class').css('color', 'sandybrown');
                //显示折叠
                $('.layui-collapse').show();
                $('#DisplayDtl' + Dtl.TableNameDtl).show();
                for (i = 0; i < Object.keys(DtlShowbool).length; i++) {
                    if (DtlShowbool[Object.keys(DtlShowbool)[i]] == true && Object.keys(DtlShowbool)[i] != DtlShowbool[Dtl.TableNameDtl]) {
                        //关闭其他折叠
                        $('#title_' + Object.keys(DtlShowbool)[i]).click();
                        DtlShowbool[Object.keys(DtlShowbool)[i]] = false;
                    }
                }
                if (DtlShowbool[Dtl.TableNameDtl] == false) {
                    //打开当前数据对应折叠
                    $('#title_' + Dtl.TableNameDtl).click();
                }
                mainListDtl.mainListDtl(Dtl);
            });
        },

        //下拉框绑定
        BindSelectorExtend: function (vml, data, sysU) {
            let vmList = vml[0];
            for (var i = 0; i < data.length; i++) {
                sysU.createSelectElement(data[i].Dom, data[i].data, data[i].SelLabel, data[i].SelValue, false, "BindSelectorExtend");
            }
            objUniversal.bindSelectorAfter(vmList);
        },

        bindSelectorAfter: function (vmList) {
            //搜索框下拉触发选择事件,完成vue赋值
            form.on('select(qform)', function (data) {
                vmList['vmq'].$data[$(data.elem).data("model")] = data.value;
            });

            //编辑页面 下拉触发选择事件,完成vue赋值
            form.on('select(eform)', function (data) {
                if (vmList['vmDtl' + $(data.elem)[0].classList[1].split('_')[1]] == undefined) {
                    vmList['vm'].$data[$(data.elem).data("model")] = data.value;
                } else {
                    vmList['vmDtl' + $(data.elem)[0].classList[1].split('_')[1]].$data[$(data.elem).data("model")] = data.value;
                }
            });

            setTimeout(function () { form.render('select'); }, 10);
        },

        ImportExcel: function (sysU,url, mainList) {
            layer.open({
                type: 1,
                skin: 'layui-layer-molv',
                anim: 1,
                id: 'LAY_layuipro', //设定一个id,防止重复弹出
                btnAlign: 'c',
                moveType: 1, //拖拽模式,0或者1
                title: "请选择需导入的文件:", //不显示标题
                area: ['400px', '300px'], //宽高
                content: $('#ImportData'), //捕获的元素
                scrollbar: false,
                btn: ['导入', '关闭'],
                yes: function () {
                    var index1 = layer.load();
                    var fileObj = document.getElementById("excelfile").files[0]; // js 获取文件对象
                    if (typeof (fileObj) == "undefined" || fileObj.size <= 0) {
                        layer.alert("请先选择需要上传的文件!", { skin: 'layui-layer-molv', anim: 1, icon: 2 });
                        layer.close(index1);
                        return;
                    }
                    var formFile = new FormData();
                    formFile.append("excelfile", fileObj); //加入文件对象
                    var ajaxConfig = {
                        data: formFile,
                        url: url,
                        cache: false,//上传文件无需缓存
                        processData: false,//用于对data参数进行序列化处理 这里必须false
                        contentType: false, //必须
                        success: function (result) {
                            if (result.Code == 200) {
                                if (result.Status) {
                                    layer.msg(result.Message, { icon: 6 });
                                }
                                else {
                                    layer.alert(result.Message, { icon: 2, shade: 0.4, shadeClose: true, title: '导入失败' });
                                }
                                $('#excelfile').val("");
                                mainList.Load();
                            }
                            layer.closeAll();
                        }
                    };
                    sysU.ajax(ajaxConfig);
                },
                cancel: function (index) {
                    layer.close(index);
                }
            });
        },

        u: u
    };

    exports('Universal', objUniversal);
});

function GetLabel(DataKey, columnKey, reKey, columnKeyValue) {
    var temp = SelectorSource[DataKey];
    if (temp == null) return columnKeyValue;
    var result = "";
    for (var i = 0; i < temp.length; i++) {
        if (temp[i][columnKey] != columnKeyValue) continue;
        result= temp[i][reKey];
    }
    return result;
}

var sbList = {};
function loadMenus(modulecode, areaMenus) {
    if (sbList[areaMenus] != undefined) { return sbList[areaMenus]; }
    var urlMenu = `/base/SysModule/LoadAuthorizedMenus?modulecode=${modulecode}&AreaMenus=${areaMenus}`;
    var strArr = [];
    $.ajax({
        url: urlMenu,
        success: function (data) {
            if (data === "") { return }
            var elementJosn = JSON.parse(data);
            for (var i = 0; i < elementJosn.length; i++) {
                strArr.push(`<a href='javascript:;' lay-event=${elementJosn[i].DomId} class='layui-btn layui-btn-sm ${elementJosn[i].Class}'>`);
                if (elementJosn[i].Icon != null && elementJosn[i].Icon != '') {
                    strArr.push(`<i class='layui-icon'>${elementJosn[i].Icon}</i>`);
                }
                strArr.push(`${elementJosn[i].Name} </a>`);
            }
            var tempStr = strArr.join("");
            sbList[areaMenus] = tempStr;
            var quanxian = $(".layui-btn-container");
            if (quanxian.length > 1) {
                quanxian.eq(1).append(tempStr);
            } else {
                quanxian.append(tempStr);
            }
        }
    });

}