var main = main || { version: "1.2" }; main.getMaturityDayPicture = function (minDay) { //获取 var picture = ""; if (minDay <= 1) { picture = "light_red.png"; } else if (minDay <= 2) { picture = "light_yellow.png"; } else if (minDay <= 3) { picture = "light_green.png"; } return picture; }; main.isDate = function (d) { return moment(d).isValid() && /(\d)+\-(\d)+\-(\d)+/.test(d); }; var g_columnset = false; var g_targetName = ""; var g_subgridobj = ""; main.setcolumnChooser = function (jgrid, targetName, isReturnSub) { //设置显示列 只设置一次 if (g_columnset && g_targetName === targetName) return; g_columnset = true; g_targetName = targetName; return main.post("/configcolumn/columnchose", { targetname: targetName }, { suppressError: true, waitMe: false }).done(function (res) { if (res.obj && res.obj.data) { var columndata = JSON.parse(res.obj.data); columndata = _.uniqBy(columndata, "name"); var perm = new Array(); var canremap = true; //检查column列是否被更新,如果更新调用 /System/RemoveColumnConfig var current_colModel = jgrid.jqGrid('getGridParam', 'colModel'); var ss = _.filter(current_colModel.map(o => o.name), (val, i, iteratee) => _.includes(iteratee, val, i + 1)); ss.length && console.log("存在重复值" + ss); var newCols = []; var cbSetDataIndex = columndata.findIndex(o => o.name == "cb"); if (cbSetDataIndex >= 0) { columndata.splice(cbSetDataIndex, 1); } var cbIndex = current_colModel.findIndex(o => o.name == "cb"); if (cbIndex>=0) { columndata.unshift(current_colModel[cbIndex]); } $.each(current_colModel, function (i, d) { var isExist = columndata.some(function (dd, ii) { return dd.name === d.name; }); if (!isExist) { newCols.push(d.name); columndata.push(d); } }); if (isReturnSub) g_subgridobj = columndata; var undefinedColumnIndexList = _.range(0, current_colModel.length); columndata.forEach(function (item, index) { if (item !== null && (item.hidden || $.inArray(item.name, newCols) >= 0)) { jgrid.setGridParam().hideCol([item.name]); } else { jgrid.setGridParam().showCol([item.name]); } var i = current_colModel.findIndex(o => o.name == item.name); if (i >= 0) { perm.push(i); _.remove(undefinedColumnIndexList, o => o === i); } }); if (undefinedColumnIndexList.length > 0) { perm = perm.concat(undefinedColumnIndexList); } if (canremap) { jgrid.jqGrid("remapColumns", perm, true); } //jgrid.trigger("reloadGrid"); } }); }; main.setcolumnChooser2 = function (jgrid, targetName, isReturnSub) { //设置显示列 只设置一次 if (g_columnset && g_targetName === targetName) return; g_columnset = true; g_targetName = targetName; return main.post("/configcolumn/columnchose", { targetname: targetName }, { suppressError: true }).done(function (res) { if (res.obj && res.obj.data) { var columndata = JSON.parse(res.obj.data); columndata = _.uniqBy(columndata, "name"); var perm = new Array(); var canremap = true; //检查column列是否被更新,如果更新调用 /System/RemoveColumnConfig var current_colModel = jgrid.jqGrid('getGridParam', 'colModel'); var ss = _.filter(current_colModel.map(o => o.name), (val, i, iteratee) => _.includes(iteratee, val, i + 1)); ss.length && console.log("存在重复值" + ss); var newCols = []; $.each(current_colModel, function (i, d) { var isExist = columndata.some(function (dd, ii) { return dd.name === d.name; }); if (!isExist) { newCols.push(d.name); columndata.push(d); } //isMatch = isMatch && isExist; }); if (isReturnSub) g_subgridobj = columndata; var tempGroupHeader = jgrid.getGridParam("groupHeader"); var groupHeaders = tempGroupHeader.groupHeaders; var groupIndex = 0, groupIndexArray = []; var colModel = jgrid.jqGrid('getGridParam', 'colModel'); if (tempGroupHeader) { jgrid.jqGrid('destroyGroupHeader', true); groupHeaders.forEach(function (item, index) { groupIndexArray[index] = []; var startIndex = -1; for (var i = 0; i < colModel.length; i++) { if (item.startColumnName === colModel[i].name) { groupIndexArray[index].push(colModel[i].name); startIndex = i; } else if (startIndex >= 0) { if (i < startIndex + item.numberOfColumns) { groupIndexArray[index].push(colModel[i].name); } else { break; } } } item.startColumnName = null; }); } var currentGroupShowCount = -1; var isInArray = false; columndata.forEach(function (item, index) { isInArray = false; if (tempGroupHeader && !main.isEmpty(groupIndexArray) && groupIndex < groupIndexArray.length) { if (main.isEmpty(groupIndexArray[groupIndex])) { //groupIndexArray.splice(groupIndex, 1); if (currentGroupShowCount === 0) { //groupHeaders.splice(groupIndex, 1); //groupIndexArray.splice(groupIndex, 1); //groupIndex--; groupHeaders[groupIndex].notShow = true; } groupIndex++; currentGroupShowCount = -1; } if (!main.isEmpty(groupIndexArray[groupIndex])) { if (currentGroupShowCount === -1) { currentGroupShowCount = groupIndexArray[groupIndex].length; } var currentGroupColumnIndex = groupIndexArray[groupIndex].findIndex(function (currentValue) { return item.name === currentValue; }); if (currentGroupColumnIndex > -1) { if (groupHeaders[groupIndex].startColumnName === null) { groupHeaders[groupIndex].startColumnName = item.name; } isInArray = true; groupIndexArray[groupIndex].splice(currentGroupColumnIndex, 1); } } } if (item !== null && (item.hidden || $.inArray(item.name, newCols) >= 0)) { jgrid.setGridParam().hideCol([item.name]); if (isInArray && currentGroupShowCount > 0) { currentGroupShowCount--; } } else { jgrid.setGridParam().showCol([item.name]); } var i = colModel.findIndex(o => o.name == item.name); if (i >= 0) { perm.push(i); } }); if (currentGroupShowCount === 0) { groupHeaders[groupIndex].notShow = true; } if (canremap) { jgrid.jqGrid("remapColumns", perm, true); } if (tempGroupHeader) { var tempGroupHeaders = groupHeaders.slice(0); for (var i = groupHeaders.length - 1; i >= 0; i--) { if (groupHeaders[i].notShow) { groupHeaders[i].notShow = false; groupHeaders.splice(i, 1); } } jgrid.jqGrid('setGroupHeaders', tempGroupHeader); tempGroupHeader = jgrid.getGridParam("groupHeader"); tempGroupHeader.groupHeaders = tempGroupHeaders; } //jgrid.trigger("reloadGrid"); } }); }; main.showcolumnChooser = function (jgrid, targetName, options) { options = options || {}; var _options = { width: 550, dialog_opts: { modal: false, minWidth: 470, height: 470, show: 'blind', hide: 'explode', dividerLocation: 0.5 }, done: function (perm) { if (perm) { this.jqGrid("remapColumns", perm, true); var colModel = jgrid.jqGrid('getGridParam', 'colModel'); if (options.liteOnly) { colModel = colModel.map(function (x) { return { name: x.name, hidden: x.hidden }; }); } main.post("/configcolumn/saveconfig", { targetname: targetName, data: JSON.stringify(colModel) }).done(function (res) { $(window).trigger("resize"); }); } } }; jgrid.jqGrid('columnChooser', _options); }; main.showcolumnChooser2 = function (jgrid, targetName, opts) { var _d = $.Deferred(); var defaultOpts = { width: 580, dialog_opts: { modal: false, minWidth: 470, height: 700, show: 'blind', hide: 'explode', dividerLocation: 0.5 }, done: function (perm) { if (perm) { var colModel = jgrid.jqGrid('getGridParam', 'colModel'); main.post("/configcolumn/saveconfig", { targetname: targetName, data: JSON.stringify(colModel) }).done(_d.resolve); } } }; if (opts !== undefined && opts !== null) { $.extend(defaultOpts, opts); } jgrid.jqGrid('columnChooser2', defaultOpts); return _d.promise(); }; main.setsubcolumnChooser = function (jgrid, targetName, isReturnSub, removecb, removesubgrid) { //子列设置显示列 return main.post("/configcolumn/columnchose", { targetname: targetName }, { suppressError: true }).done(function (res) { if (res.obj && res.obj.data) { var columndata = JSON.parse(res.obj.data); columndata = _.uniqBy(columndata, "name"); var perm = new Array(); var canremap = true; var addNum = 0; //检查column列是否被更新,如果更新调用 /System/RemoveColumnConfig var current_colModel = jgrid.jqGrid('getGridParam', 'colModel'); var ss = _.filter(current_colModel.map(o => o.name), (val, i, iteratee) => _.includes(iteratee, val, i + 1)); ss.length && console.log("存在重复值" + ss); var newCols = []; $.each(current_colModel, function (i, d) { var isExist = columndata.some(function (dd, ii) { return dd.name === d.name; }); if (!isExist) { newCols.push(d.name); columndata.push(d); } }); if (isReturnSub) g_subgridobj = columndata; var colModel = jgrid.jqGrid('getGridParam', 'colModel'); columndata.forEach(function (item, index) { if (item !== null && (item.hidden || $.inArray(item.name, newCols) >= 0)) { jgrid.setGridParam().hideCol([item.name]); } else { jgrid.setGridParam().showCol([item.name]); } var i = colModel.findIndex(o => o.name == item.name); if (i >= 0) { perm.push(i); } }); if (canremap) { jgrid.jqGrid("remapColumns", perm, true); } } }); }; main.showsubcolumnChooser = function (jgrid, targetName, options) { options = options || {}; var _options = { width: 550, dialog_opts: { modal: false, minWidth: 470, height: 470, show: 'blind', hide: 'explode', dividerLocation: 0.5 }, done: function (perm) { var subList = []; if (options.expandSubs !== 'none') { var rowIds = $("#listGrid").jqGrid('getDataIDs'); for (var k = 0; k < rowIds.length; k++) { var curIndex = rowIds[k]; var curRowData = $("#listGrid").jqGrid('getRowData', curIndex); var curCheckId = "jqg_listGrid_" + curIndex; var cbTableId = "listGrid_" + curIndex + "_t"; var expanded = $("#" + curCheckId).parent().parent().find(".sgexpanded"); if (expanded.length > 0) { subList.push($("#" + curCheckId).parent().parent().attr("id")); } } } if (!perm) return; this.jqGrid("remapColumns", perm, true); $.each(subList, function (index, value) { var sub = "listGrid_" + value + "_t"; if (value !== 1) { $("#" + sub).jqGrid("remapColumns", perm, true); } }); var colModel = jgrid.jqGrid('getGridParam', 'colModel'); if (options.liteOnly) { colModel = colModel.map(function (x) { return { name: x.name, hidden: x.hidden }; }); } main.post("/configcolumn/saveconfig", { targetname: targetName, data: JSON.stringify(colModel) }).done(function (res) { //页面加载 window.location.href = window.location.href.replace(/#/g, ''); }); } }; jgrid.jqGrid('columnChooser', _options); }; //映射已经保存下来的列配置 main.mapSavedColModel = function (savedData, originals) { if (!savedData) return originals; var columndata = JSON.parse(savedData); //必需完全匹配才可以 var isMatch = originals.length === columndata.length; if (isMatch) { $.each(originals, function (i, d) { var item = columndata.find(dd => dd.name === d.name); if (!item) { isMatch = false; return false; } item.formatter = d.formatter; }); } if (!isMatch) { main.post("/configcolumn/removeConfig", { targetname: targetName }); return originals; } return columndata; }; main.hasEventFunction = function (ele, eventName, func) { var eventsData = $(ele).data("events"); if (main.isEmpty(eventsData)) { return false; } if (!eventsData[eventName]) { return false; } for (var i = 0; i < eventsData[eventName].length; i++) { if (eventsData[eventName][i].handler === func) { return true; } } return false; }; main.loadJs = function (url, callback) { var script = document.createElement('script'); script.type = "text/javascript"; if (typeof callback !== "undefined") { if (script.readyState) { script.onreadystatechange = function () { if (script.readyState === "loaded" || script.readyState === "complete") { script.onreadystatechange = null; callback(); } }; } else { script.onload = function () { callback(); }; } } script.src = url; document.body.appendChild(script); }; main.toExcel = function (jqGrid, fileName, fileType, include, notInclude, formatters, useGroupHeader, numberWithTab) { var callbackFunc = function () { if (typeof jqGrid === "string") { jqGrid = $("#" + jqGrid); } else { jqGrid = $(jqGrid); } fileType = fileType || "xls"; include = include || []; notInclude = notInclude || []; formatters = formatters || []; useGroupHeader = useGroupHeader || false; if (typeof include === "string") { include = include.split(","); } if (typeof notInclude === "string") { notInclude = notInclude.split(","); } var colModel = []; var colModelOriginal = jQuery.extend(true, [], $(jqGrid).jqGrid('getGridParam', 'colModel')); var groupHeader = jqGrid.getGridParam("groupHeader"); var groupHeaders, groupIndex, isInGroup, groupColumnCount, tempNumberOfColumns; if (groupHeader) { groupHeaders = groupHeader.groupHeaders; groupIndex = 0; isInGroup = false; groupColumnCount = 0; tempNumberOfColumns = 0; } var j = 0; var formatterArray = []; var cellattrArray = []; for (var i = 0; i < colModelOriginal.length; i++) { if (useGroupHeader && groupHeader) { if (groupIndex < groupHeaders.length) { if (colModelOriginal[i].name === groupHeaders[groupIndex].startColumnName) { isInGroup = true; tempNumberOfColumns = groupHeaders[groupIndex].numberOfColumns; groupHeaders[groupIndex].numberOfColumns = 0; groupColumnCount++; groupHeaders[groupIndex].title = groupHeaders[groupIndex].titleText.replace(/<[^>]+>/g, ""); } else if (isInGroup) { groupColumnCount++; } } } if (!colModelOriginal[i].hidden && colModelOriginal[i].name !== "cb" && colModelOriginal[i].name !== "subgrid" && $.inArray(colModelOriginal[i].label, notInclude) === -1 || $.inArray(colModelOriginal[i].label, include) > -1) { if (useGroupHeader && groupHeader && isInGroup) { if (groupHeaders[groupIndex].startColumnName === null) { groupHeaders[groupIndex].startColumnName = colModelOriginal[i].name; } groupHeaders[groupIndex].numberOfColumns++; } var curCol = { colName: colModelOriginal[i].label, fieldName: colModelOriginal[i].name, colIndex: j++, keepFormatter: false }; if (!main.isEmpty(formatters)) { var colFormatter = formatters.find(function (currentValue) { return colModelOriginal[i].label === currentValue.colName; }); if (colFormatter) { colModelOriginal[i].formatter = colFormatter.formatter; curCol.keepFormatter = true; } } if (colModelOriginal[i].formatter !== undefined && colModelOriginal[i].formatter !== null) { if (typeof colModelOriginal[i].formatter === "string") { if (colModelOriginal[i].formatter === "number" || colModelOriginal[i].formatter === "number2") { curCol.formatter = "number";//"number2"; } else { curCol.formatter = colModelOriginal[i].formatter; } formatterArray[j - 1] = curCol.formatter; } else if (typeof colModelOriginal[i].formatter === "function") { formatterArray[j - 1] = colModelOriginal[i].formatter; curCol.formatter = function (colValue, rowModel, colIndex) { var formaterFunc = formatterArray[colIndex]; return formaterFunc(colValue, null, rowModel); }; } } else { formatterArray[j - 1] = null; } if (colModelOriginal[i].cellattr !== undefined && colModelOriginal[i].cellattr !== null) { if (typeof colModelOriginal[i].cellattr === "function") { cellattrArray[j - 1] = colModelOriginal[i].cellattr; curCol.cellattr = function (colValue, rowModel, colIndex) { var cellattrFunc = cellattrArray[colIndex]; return cellattrFunc(colValue, null, rowModel); }; } } else { cellattrArray[j - 1] = null; } colModel.push(curCol); } else if (useGroupHeader && groupHeader && colModelOriginal[i].name === groupHeaders[groupIndex].startColumnName) { groupHeaders[groupIndex].startColumnName = null; } if (useGroupHeader && groupHeader && isInGroup && groupColumnCount >= tempNumberOfColumns) { groupIndex++; isInGroup = false; groupColumnCount = 0; } } var rowDatas = main.GetSortedGridObjs(jqGrid); if (!main.isEmpty(rowDatas)) { $.each(colModel, function () { if (!this.keepFormatter) { this.formatter = null; } }); $.fn.exportToExcel({ data: rowDatas, colModel: colModel, groupHeader: useGroupHeader ? groupHeader : null, fileName: fileName, fileType: fileType, numberWithTab: numberWithTab }); return; } var url = $(jqGrid).jqGrid('getGridParam', 'url'); var postData = $(jqGrid).jqGrid('getPostData'); postData.rows = 0; postData.PageSize = 0; $.fn.exportToExcel({ url: url, remote: true, postData: postData, colModel: colModel, groupHeader: useGroupHeader ? groupHeader : null, fileName: fileName, fileType: fileType, numberWithTab: numberWithTab }); }; if ($("script[src*='exportUtil.js']").length === 0) { main.loadJs("/Statics/libs/v1/exportUtil.js?t=0.9", callbackFunc); } else { callbackFunc(); } }; //只需要初始化一次 const __holiDays = (function () { function getDatas() { var val = []; main.post("/calendar/GetCalendarsV2", "", { async: false }).done(function (res) { if (res.version === '多日历') { val = "多日历"; } else { for (var i = 0; i < res.length; i++) { var tempcal = eval(res[i].HolidayJson); val = val.concat(tempcal); } } }); return val; } var results; return function () { if (results) return results; return results = getDatas(); }; })(); //为页面所有日期设置交易时间才可选择 deadline 之后的都不能选择 main.setTradeDatePicker = function (maturedate, picker, deadline, sel, hasHolidays) { var natDays = __holiDays(); function noWeekendsOrHolidays(date) { var deadlinetemp = $(this).attr("deadline"); if (deadlinetemp) deadline = deadlinetemp; if (deadline && date > moment(deadline)) return [false]; return nationalDays(date); } function nationalDays(date) { if (natDays === '多日历') { if (moment(date).isoWeekday() > 5) { return [false]; } } else { var m = date.getMonth(); var d = date.getDate(); var y = date.getFullYear(); for (var i = 0; i < natDays.length - 1; i++) { var myDate = new Date(natDays[i]); if (!hasHolidays && m === myDate.getMonth() && d === myDate.getDate() && y === myDate.getFullYear()) { return [false]; } } } if (maturedate && date > maturedate) { return [false]; //大于到期日的都不能选 } return [true]; } $(picker || ".datepicker").datepicker({ beforeShowDay: noWeekendsOrHolidays, changeMonth: true, changeYear: true, showButtonPanel: true, showOtherMonths: true, selectOtherMonths: true, onSelect: sel }); }; main.checkPhone = function (id) { var tagObj = $("#" + id); var phoneNumb = tagObj.val(); if (phoneNumb === "" || phoneNumb) { var reg = /^1[345789]\d{9}$/; if (!reg.test(phoneNumb)) { main.notify("手机号码不符合要求,请重新输入!"); if (tagObj) { tagObj.focus(); } return false; } } return true; }; main.isEmpty = function (obj) { if (obj === undefined || obj === null) { return true; } if (typeof obj === "string" && obj === "") { return true; } if (obj instanceof Array && obj.length === 0) { return true; } if (typeof obj === "object" && $.isEmptyObject(obj)) { return true; } return false; }; //两元素交换位置 main.eleExchange = function (eleA, eleB) { var n = eleA.next(), p = eleB.prev(); eleB.insertBefore(n); eleA.insertAfter(p); }; //layer弹窗和新页面 (function () { function getWindowClientArea(window) { let document = window.document; let width = 0, height = 0; // 获取窗口宽度 if (window.innerWidth) width = window.innerWidth; else if ((document.body) && (document.body.clientWidth)) width = document.body.clientWidth; // 获取窗口高度 if (window.innerHeight) height = window.innerHeight; else if ((document.body) && (document.body.clientHeight)) height = document.body.clientHeight; // 通过深入 Document 内部对 body 进行检测,获取窗口大小 if (document.documentElement && document.documentElement.clientHeight && document.documentElement.clientWidth) { height = document.documentElement.clientHeight; width = document.documentElement.clientWidth; } return { width: width, height: height }; } /** * 打开弹窗 * @param {any} title 弹窗标题 * @param {any} url 弹窗url * @param {any} options 弹窗选项(layer选项) */ main.open = function (title, url, options) { let defaultOptions = { type: 2, title: title, shadeClose: false, shade: 0.4, area: ['95%', '95%'], content: url, maxmin: true }; if (window.parent && window.parent !== window) { let parent = window.parent, layerWin = window; while (parent.parent && parent.parent !== parent) { layerWin = parent; parent = parent.parent; } let area = getWindowClientArea(layerWin); $.extend(defaultOptions, { area: [area.width + 'px', area.height + 'px'] }, options); let successFn = defaultOptions.success; defaultOptions.success = function (layero, index) { let win = layero.find('iframe')[0].contentWindow; win.opener = layerWin; successFn && successFn(); layerWin.onunload = function () { win.opener = null; }; layerWin.onbeforeunload = function () { win.opener = null; }; }; return parent.layer.open(defaultOptions); } options && $.extend(defaultOptions, options); return layer.open(defaultOptions); }; /** * 打开单一弹窗(同时关闭弹窗的弹窗) * @param {any} title * @param {any} url * @param {any} options */ main.openMono = function (title, url, options) { var index = window.parent.main.open(title, url, options); if (window.parent !== window) { var layer = window.parent.layer; layer.close(layer.getFrameIndex(window.name)); } return index; }; //打开非iframe弹窗 main.open2 = function (title, html, options) { var defaultOptions = { type: 1, title: title, shadeClose: false, shade: 0.4, area: ['95%', '95%'], content: html }; if (options !== undefined && options !== null) { $.extend(defaultOptions, options); } return layer.open(defaultOptions); }; //main.open main.infopage = function (title, url, options) { return main.open(title, url, typeof options === 'object' ? $.extend({ area: ['700px', '90%'] }, options) : { area: ['700px', '90%'] }); }; //刷新父窗体(页面或数据) main.parentReload = function (reload) { let winp = window.opener || window.parent; if (!winp || !reload) return; if (reload.startsWith('#')) { winp.history.replaceState(null, null, _.trimStart(reload, '#')); winp.location.reload(); } else if (reload === 'reload' || reload === true) { winp.location.reload(); } else if (reload === 'reloadData') { winp.reloadData && winp.reloadData(); } else if (typeof reload === 'string') { reload = winp[reload]; typeof reload === 'function' && reload(); } }; //刷新父窗体数据 main.parentReloadData = main.parentReload.bind(null, 'reloadData'); //以下为layer扩展 if (!layer || !layer.open) return; //关闭当前IFrame layer.closeMe = function (reload, message) { if (!window.parent || window.parent === window) return; main.parentReload(reload); message && (typeof (message) === "string" || typeof (message) === "number") && parent.main.message(message); let index; if (window.name) { index = parent.layer.getFrameIndex(window.name); index && parent.layer.close(index); } if (!index) { parent.layer.closeAll(); } }; /** * 激发顶层window的事件 * @param {string} winLoc 窗体位置:'top' or 'parent',默认'parent' * @param {string} type 事件类型 * @param {any} data 事件数据 */ layer.raiseParentEvent = function (winLoc, type, data) { let win; if (winLoc === 'top') { win = window.top; } else { win = window.opener || window.parent; } if (win) { win.$('body').trigger(type, data); } }; /** * 调用顶层window的方法 * @param {string} winLoc 窗体位置:'top' or 'parent',默认'parent' * @param {string} method 方法名称 * @param {any} data 方法参数,apply数组 */ layer.callParentMethod = layer.invokeParentMethod = function (winLoc, method, data) { let win; if (winLoc === 'top') { win = window.top; } else { win = window.opener || window.parent; } if (method && win && typeof win[method] === 'function') { if (data && !Array.isArray(data)) { data = [data]; } win[method].apply(win, data); } }; //别名 layer.closeSelf = layer.closeMe; }()); main.toDate = function (cellValue, options, rowObject) { return new moment(cellValue).format("YYYY-MM-DD"); }; main.toTime = function (cellValue, options, rowObject) { return new moment(cellValue).format("YYYY-MM-DD HH:mm"); }; main.SetDropdownText = function (idname, textname) { $("#" + textname).val($("#" + idname).find(":selected").text()); }; main.GetGridObjs = function (ggrid) { var rowIds = ggrid.jqGrid('getGridParam', 'selarrrow'); var ors = []; for (var i = 0; i < rowIds.length; i++) { var or = ggrid.getRowData(rowIds[i]); ors.push(or); } return ors; }; main.GetSortedGridObjs = function (ggrid) { var rowIds = ggrid.jqGrid('getGridParam', 'selarrrow'); var rowDatas = ggrid.getRowData(); if (main.isEmpty(rowIds)) { return []; } var ors = $.grep(rowDatas, function (ele, index) { return rowIds.some(function (rowId) { return rowId === ele.id; }); }); ors.forEach(function (item, index) { if (item !== null) { Object.keys(item).forEach(function (key) { const regex = /#=(.*?)#/g; var result = regex.exec(item[key]); if (result) { item[key] = result[1]; } }); } }); return ors; }; main.GetGridIds = function (ggrid, propname) { var rowIds = ggrid.jqGrid('getGridParam', 'selarrrow'); var ors = []; for (var i = 0; i < rowIds.length; i++) { var or = {}; if (propname) { or = ggrid.getRowData(rowIds[i])[propname]; } else or = ggrid.getRowData(rowIds[i]).id; ors.push(or); } return ors; }; //jqgrid,选中行不勾选,只在点击checkbox时勾选 true 可以选,false不可以 main.disableRowCheck = function (rowid, e) { var $myGrid = $(this), i = $.jgrid.getCellIndex($(e.target).closest('td')[0]), cm = $myGrid.jqGrid('getGridParam', 'colModel'); return (cm[i].name === 'cb') && $(e.target).prop("tagName") !== "TD"; }; main.toInt = function (val, opt, data) { var numdata = numeral(val).format("0"); if (numdata === "NaN") numdata = 0; return numdata; }; main.toNumber = function (data, decimalPlaces) { var formatStr = "0."; if (decimalPlaces !== undefined && decimalPlaces !== null) { for (var i = 0; i < decimalPlaces; i++) { formatStr += "0"; } } else { formatStr = "0.00"; } return numeral(data).format(formatStr); }; main.toNumberExcludingNaN = function (data, decimalPlaces) { var formatStr = "0."; if (decimalPlaces !== undefined && decimalPlaces !== null) { for (var i = 0; i < decimalPlaces; i++) { formatStr += "0"; } } else { formatStr = "0.00"; } var numdata = numeral(data).format(formatStr); if (numdata === "NaN") numdata = 0; return numdata; }; main.toNumberExcludingNaNEx = function (data, decimalPlaces) { var formatStr = "0."; if (decimalPlaces !== undefined && decimalPlaces !== null) { for (var i = 0; i < decimalPlaces; i++) { formatStr += "0"; } } else { formatStr = "0.00"; } var numdata = numeral(data).format(formatStr); if (numdata === "NaN" || numdata === "-NaN" || numdata === 0) numdata = "0.00"; return numdata; }; //得到url参数值 main.getUrlParam = function (name) { var urlPara = window.location.search.substr(1).split("&"); var paraCounts = urlPara.length; for (var i = 0; i < paraCounts; i++) { if (urlPara[i].substr(0, urlPara[i].indexOf("=")).indexOf(name) > -1) { return urlPara[i].substr(urlPara[i].indexOf("=") + 1); } } return ""; }; //转换为中文财务数字 main.changeMoneyToChinese = function (money) { var hundredMillion = 100000000; var tenThousand = 10000; var countOfHundredMillion = Math.floor(money / hundredMillion); var countOfTenThousand = Math.floor((money % hundredMillion) / tenThousand); var lessThanTenThousand = money % tenThousand; var result = lessThanTenThousand.toFixed(2); if (countOfTenThousand > 0) { result = countOfTenThousand + "万" + result; } if (countOfHundredMillion > 0) { result = countOfHundredMillion + "亿" + result; } return result; }; main.downloadFiles = (function () { //解决pdf文件自动打开的问题 function downloadFile(file_path) { var a = document.createElement('A'); a.href = file_path; a.download = file_path.substr(file_path.lastIndexOf('/') + 1); document.body.appendChild(a); a.click(); document.body.removeChild(a); } return function (files) { if (files instanceof Array) { let downFn = files.length > 1 ? downloadFile : window.open; $.each(files, function (index, val) { val && setTimeout(downFn.bind(null, val), 500); }); } else { if (files !== undefined && files !== null && files !== "") { window.open(files); } } }; }()); //清除非数字字符 main.clearNoNum = function (num) { num = num + ""; num = num.replace(/[^\d.]/g, ""); //清除“数字”和“.”以外的字符 num = num.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的 num = num.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); num = num.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');//只能输入两个小数 if (num.indexOf(".") < 0 && num !== "") {//以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02的金额 num = parseFloat(num); } return num; }; //转换为中文大写金额 main.toChineseCapital = function (numstr) { var unit = "千百拾亿千百拾万千百拾元角分", str = ""; var p = numstr.indexOf('.'); if (p < 0) { numstr += '00'; } else { numstr = numstr.substring(0, p) + numstr.substr(p + 1, 2); } unit = unit.substr(unit.length - numstr.length); for (var i = 0; i < numstr.length; i++) { str += '零壹贰叁肆伍陆柒捌玖'.charAt(numstr.charAt(i)) + unit.charAt(i); } return str.replace(/零(千|百|拾|角|分)/g, "零").replace(/(零)+/g, "").replace(/零(万|亿|元)/g, "$1").replace(/(亿)万|壹(拾)/g, "$1$2").replace(/^元零?|零分/g, "").replace(/元$/g, "元"); } main.formartDate = function (time,formatStr) { if (!formatStr) { formatStr = "YYYY-MM-DD"; } var momDate = new moment(time); if (!momDate.isValid() || typeof time === "undefined") return ""; return momDate.format(formatStr); } ///校验邮件地址 main.checkEmail = function (email) { const regex = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/; return regex.test(email); } /** * 可折叠分组表头工具(适用于 jqGrid 4.5.4,不依赖 free-jqGrid / Guriddo 商业版) * * 背景:jqGrid 4.5.4 的 setGroupHeaders 只能生成静态合并表头,不支持点击折叠。 * 本方法在 setGroupHeaders 基础上补齐"点击分组表头折叠/展开"交互, * 并复用本文件 setcolumnChooser2 已验证的 destroyGroupHeader → 显隐列 → setGroupHeaders 重建模式。 * * 用法: * main.initCollapsibleGroupHeaders($('#listGrid'), [ * { title: '基本信息', columns: ['交易日', '簿记账户'] }, * { title: '名义本金', columns: ['合约名义本金', '多头', '空头'] } * ]); * * @param {jQuery} jgrid jqGrid 容器(如 $('#listGrid')) * @param {Array} groupConfig 分组配置,每项 { title: string, columns: string[] } * - title 分组表头显示名 * - columns 该组包含的列(使用 colModel.name) * 注意:columns 里若包含已被 setcolumnChooser 隐藏的列,会被自动跳过,不影响重建。 */ main.initCollapsibleGroupHeaders = function (jgrid, groupConfig) { if (!groupConfig || !groupConfig.length) return; // 存储各分组的折叠状态,key=title,value=true 表示已折叠 var collapseState = {}; // 根据 groupConfig + 当前 colModel 可见性,构造 setGroupHeaders 所需的 groupHeaders 参数。 // 关键:折叠的分组仍需保留一个表头单元格作为"展开锚点",否则用户无法再次展开。 function buildGroupHeaders() { var colModel = jgrid.jqGrid('getGridParam', 'colModel'); var visibleNames = colModel.filter(function (c) { return !c.hidden; }).map(function (c) { return c.name; }); var groupHeaders = []; for (var g = 0; g < groupConfig.length; g++) { var group = groupConfig[g]; var visibleColsInGroup = group.columns.filter(function (n) { return visibleNames.indexOf(n) > -1; }); //整组都不可见:若是被折叠的分组,仍需保留锚点(下方 applyGroupHeaders 已保留首列); //若是被 setcolumnChooser 主动隐藏的分组,则跳过不渲染表头 if (!visibleColsInGroup.length && !collapseState[group.title]) continue; //锚点列:折叠态下 numberOfColumns=1(首列被保留);展开态为该组可见列数 var count = visibleColsInGroup.length || 1; var icon = collapseState[group.title] ? '▶' : '▼'; var titleClass = collapseState[group.title] ? 'group-header-title group-collapsed' : 'group-header-title'; groupHeaders.push({ startColumnName: group.columns[0], //锚点列始终是首列(折叠时首列被保留) numberOfColumns: count, titleText: '' + icon + ' ' + group.title + '' }); } return groupHeaders; } // 应用一次分组表头(含折叠态显隐),复用 destroyGroupHeader → setGroupHeaders 模式 function applyGroupHeaders() { jgrid.jqGrid('destroyGroupHeader', true); // true: 不恢复为单行表头 // 按折叠状态显隐列:折叠的分组保留首列作为锚点(避免整组表头消失无法展开) for (var g = 0; g < groupConfig.length; g++) { var group = groupConfig[g]; if (collapseState[group.title]) { //折叠:隐藏除首列外的所有列,保留首列作为锚点 if (group.columns.length > 1) { jgrid.setGridParam().hideCol(group.columns.slice(1)); } jgrid.setGridParam().showCol([group.columns[0]]); } else { //展开:恢复该组所有列 jgrid.setGridParam().showCol(group.columns); } } var groupHeaders = buildGroupHeaders(); if (groupHeaders.length) { jgrid.jqGrid('setGroupHeaders', { useColSpanStyle: true, groupHeaders: groupHeaders }); } //保存到 jqGrid 参数,便于与 setcolumnChooser 协调 jgrid.jqGrid('setGridParam', { collapsibleGroupConfig: groupConfig, collapseState: collapseState }); bindHeaderClick(); } // 给分组表头单元格绑定 click(事件委托,重建表头后仍生效) function bindHeaderClick() { var hbox = jgrid.closest('.ui-jqgrid').find('.ui-jqgrid-hdiv'); hbox.off('click.collapsibleGroup').on('click.collapsibleGroup', '.group-header-title', function (e) { e.stopPropagation(); var idx = $(this).attr('data-group'); var group = groupConfig[idx]; if (!group) return; collapseState[group.title] = !collapseState[group.title]; applyGroupHeaders(); }); } applyGroupHeaders(); }; /** * 重建已初始化的可折叠分组表头。 * 供 setcolumnChooser / 列重排后调用,确保分组边界与最新的列顺序/可见性同步。 * @param {jQuery} jgrid */ main.refreshCollapsibleGroupHeaders = function (jgrid) { var cfg = jgrid.jqGrid('getGridParam', 'collapsibleGroupConfig'); if (!cfg) return; // 复用已有的 collapseState var state = jgrid.jqGrid('getGridParam', 'collapseState') || {}; // 重新初始化(groupConfig 同引用,collapseState 重建以剔除已失效的分组) main.initCollapsibleGroupHeaders(jgrid, cfg); // 回填状态 var freshState = jgrid.jqGrid('getGridParam', 'collapseState') || {}; Object.keys(state).forEach(function (k) { if (k in freshState) freshState[k] = state[k]; }); }; /** * 导出 jqGrid 可见列为 Excel(零依赖,基于 HTML table + ms-excel MIME)。 * * 设计目标:导出内容与前端表格"当前可见列"完全一致(需求《估值模块V1》4.2)。 * 不依赖第三方库,不调用后端导出接口,避免与 C# 模板导出口径混淆。 * * @param {jQuery} jgrid jqGrid 容器 * @param {string} fileName 导出文件名(不含扩展名) * @param {Array} groupConfig 可选,分组表头配置,每项 { title: string, columns: string[] } * @param {Array} exportRows 可选,后端返回的全部筛选结果;未传时导出当前页 */ main.exportVisibleColumnsToExcel = function (jgrid, fileName, groupConfig, exportRows) { var colModel = jgrid.jqGrid('getGridParam', 'colModel'); // 只导出可见列(hidden !== true),与折叠状态联动:收起的列自动不可见 var visibleCols = colModel.filter(function (c) { return c.hidden !== true && c.name !== 'cb' && c.name !== 'rn'; }); if (!visibleCols.length) { main.message && main.message("没有可导出的列"); return; } var rows = exportRows || jgrid.jqGrid('getRowData'); if (exportRows) { var gridElement = jgrid[0]; rows = exportRows.map(function (row, rowIndex) { var formattedRow = {}; visibleCols.forEach(function (col) { var colIndex = colModel.indexOf(col); var rawValue = $.jgrid.getAccessor(row, col.name); var formattedValue = gridElement && gridElement.formatter ? gridElement.formatter(rowIndex + 1, rawValue, colIndex, row, 'add') : rawValue; formattedRow[col.name] = $('
| ' + escapeXml(l) + ' | '; }).join('') + '
|---|
| ' + escapeXml(String(val)) + ' | '; } html += '