Files
zszq-trs/YLErpWeb/wwwroot/Scripts/utils.js
T

1307 lines
49 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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=titlevalue=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] ? '&#9654;' : '&#9660;';
var titleClass = collapseState[group.title] ? 'group-header-title group-collapsed' : 'group-header-title';
groupHeaders.push({
startColumnName: group.columns[0], //锚点列始终是首列(折叠时首列被保留)
numberOfColumns: count,
titleText: '<span class="' + titleClass + '" data-group="' + g + '">' + icon + '&nbsp;' + group.title + '</span>'
});
}
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 可选,后端返回的全部筛选结果;未传时导出当前页
* @param {Array} exportColumnNames 可选,指定导出的列名及顺序;未传时导出当前可见列
*/
main.exportVisibleColumnsToExcel = function (jgrid, fileName, groupConfig, exportRows, exportColumnNames) {
var colModel = jgrid.jqGrid('getGridParam', 'colModel');
var exportCols;
if (Array.isArray(exportColumnNames)) {
exportCols = exportColumnNames.map(function (name) {
for (var i = 0; i < colModel.length; i++) {
if (colModel[i].name === name) return colModel[i];
}
}).filter(function (col) { return col && col.name !== 'cb' && col.name !== 'rn'; });
} else {
// 只导出可见列(hidden !== true),与折叠状态联动:收起的列自动不可见
exportCols = colModel.filter(function (c) { return c.hidden !== true && c.name !== 'cb' && c.name !== 'rn'; });
}
if (!exportCols.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 = {};
exportCols.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] = $('<div>').html(formattedValue == null ? '' : String(formattedValue)).text().replace(/\u00a0/g, '');
});
return formattedRow;
});
}
var headerLabels = exportCols.map(function (c) { return c.label || c.name; });
// 构建 HTML table,用 style 保持 mso-number-format 让金额不被科学计数法破坏
var html = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">';
html += '<head><meta charset="UTF-8"><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Sheet1</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>';
html += '<body><table border="1">';
//表头:有分组配置时导出两级表头(分类 + 字段),否则保持原单级表头。
if (groupConfig && groupConfig.length) {
html += buildGroupHeaderHtml(exportCols, groupConfig);
}
html += '<tr>' + headerLabels.map(function (l) {
return '<th style="background:#f0f0f0;font-weight:bold;">' + escapeXml(l) + '</th>';
}).join('') + '</tr>';
//数据行
for (var i = 0; i < rows.length; i++) {
html += '<tr>';
for (var c = 0; c < exportCols.length; c++) {
var val = rows[i][exportCols[c].name];
if (val === undefined || val === null) val = '';
html += '<td>' + escapeXml(String(val)) + '</td>';
}
html += '</tr>';
}
html += '</table></body></html>';
var blob = new Blob(['\ufeff' + html], { type: 'application/vnd.ms-excel;charset=utf-8' });
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = (fileName || 'export') + '.xls';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
setTimeout(function () { URL.revokeObjectURL(url); }, 1000);
function escapeXml(s) {
return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
function buildGroupHeaderHtml(cols, config) {
var titleByColumn = {};
config.forEach(function (group) {
(group.columns || []).forEach(function (name) {
titleByColumn[name] = group.title || '';
});
});
var cells = [];
for (var i = 0; i < cols.length; i++) {
var title = titleByColumn[cols[i].name] || '';
var colspan = 1;
while (i + colspan < cols.length && (titleByColumn[cols[i + colspan].name] || '') === title) {
colspan++;
}
cells.push('<th colspan="' + colspan + '" style="background:#d9edf7;font-weight:bold;text-align:center;">' + escapeXml(title) + '</th>');
i += colspan - 1;
}
return '<tr>' + cells.join('') + '</tr>';
}
};