feat(swaptrade): 优化框架合约导出功能 - 新增导出列名配置数组 eodSwapExportColumnNames - 实现框架合约标签页导出列名自动同步 - 移除冗余的分组表头初始化逻辑 - 添加导出方式选择对话框支持两种导出模式 - 扩展工具函数支持自定义导出列名参数 - 重构导出逻辑统一处理不同导出场景 ```
1307 lines
49 KiB
JavaScript
1307 lines
49 KiB
JavaScript
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: '<span class="' + titleClass + '" data-group="' + g + '">' + icon + ' ' + 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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
||
}
|
||
|
||
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>';
|
||
}
|
||
};
|