From 2d2ea6c509c1af75878b07083aa19fd45dc6c55d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=90=8D=E9=94=90?= <1565842059@qq.com> Date: Tue, 14 Jul 2026 17:21:58 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(swaptrade):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E5=90=88=E7=BA=A6=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增导出列名配置数组 eodSwapExportColumnNames - 实现框架合约标签页导出列名自动同步 - 移除冗余的分组表头初始化逻辑 - 添加导出方式选择对话框支持两种导出模式 - 扩展工具函数支持自定义导出列名参数 - 重构导出逻辑统一处理不同导出场景 ``` --- .../Scripts/app/swaptrade/EodPositionRisks.js | 111 ++++++++++-------- YLErpWeb/wwwroot/Scripts/utils.js | 28 +++-- 2 files changed, 79 insertions(+), 60 deletions(-) diff --git a/YLErpWeb/wwwroot/Scripts/app/swaptrade/EodPositionRisks.js b/YLErpWeb/wwwroot/Scripts/app/swaptrade/EodPositionRisks.js index 045d5dc2..3ecf2873 100644 --- a/YLErpWeb/wwwroot/Scripts/app/swaptrade/EodPositionRisks.js +++ b/YLErpWeb/wwwroot/Scripts/app/swaptrade/EodPositionRisks.js @@ -1,5 +1,6 @@ var queryurl = '/swaptrade2/EodPositionRiskQuery'; var cloumnTargetName = "eodSwapPositionList"; +var eodSwapExportColumnNames = []; $(function () { var PostData = {}; $("#DateValueDate").datepicker({ @@ -18,6 +19,11 @@ $(function () { $("#myTab li:eq(1)").addClass("active"); cloumnTargetName = "eodSwapList"; colModelGrid = colModelGridEodSwap(); + eodSwapExportColumnNames = colModelGrid.filter(function (col) { + return !col.optionHide; + }).map(function (col) { + return col.name; + }); } PostData.ValueDate = $("#DateValueDate").val(); var grid = jQuery('#listGrid').jqGrid({ @@ -705,13 +711,10 @@ function gridComplete() { if (arguments[0].Sum) { jgrid.footerData("set", { 'position.dv01': arguments[0].Sum["DV"] }); } - //框架合约Tab:在列设置应用完成后初始化可折叠分组表头 - //setcolumnChooser 会 remapColumns 重排列,必须在它完成后再 setGroupHeaders,否则分组边界错位 + //框架合约Tab:列设置应用完成后补充期间付息提示。 if (page.tabIndex == 2) { - var defer = main.setcolumnChooser(jgrid, page.configcolumn_data); + var defer = main.setcolumnChooser(jgrid, cloumnTargetName); $.when(defer).done(function () { - normalizeEodSwapColumnsForGroupHeaders(jgrid, eodSwapGroupConfig); - main.initCollapsibleGroupHeaders(jgrid, eodSwapGroupConfig); jgrid.jqGrid('setLabel', 'PeriodAmount', null, null, { title: '合约期间内的期间付息金额(无关乎派息支付日)' }); @@ -734,19 +737,66 @@ function starttradeView(id) { main.open("查看交易", srcurl); } -//导出当前可见列(需求《估值模块V1》4.2:与前端宽表可见字段、列名、顺序一致) -//折叠收起的列自动不可见、不导出。不调用后端模板导出,口径独立。 function exportVisibleColumns() { var jgrid = jQuery('#listGrid'); var dateStr = $("#DateValueDate").val() || ''; var tabName = page.tabIndex == 2 ? '框架合约' : '日终持仓'; var fileName = '日终持仓风险_互换_' + tabName + (dateStr ? '_' + dateStr : ''); - var groupConfig = page.tabIndex == 2 ? eodSwapGroupConfig : null; if (page.tabIndex != 2) { - main.exportVisibleColumnsToExcel(jgrid, fileName, groupConfig); + main.exportVisibleColumnsToExcel(jgrid, fileName, null); return; } + main.open2('选择导出方式', '
请选择导出方式
', { + area: ['520px', '265px'], + btn: ['导出标准格式', '导出界面上全部数据'], + btnAlign: 'c', + success: function (layero) { + layero.find('.layui-layer-content').css({ + padding: '32px 36px', + fontSize: '15px', + lineHeight: '24px' + }); + layero.find('.layui-layer-btn').css({ + padding: '0 0 42px', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + gap: '24px' + }); + layero.find('.layui-layer-btn a').css({ + minWidth: '140px', + width: 'auto', + height: '42px', + lineHeight: '42px', + fontSize: '16px', + margin: '0', + padding: '0 20px', + boxSizing: 'border-box', + whiteSpace: 'nowrap' + }); + }, + yes: function (index) { + exportEodSwapRows(jgrid, fileName, eodSwapGroupConfig, eodSwapExportColumnNames); + layer.close(index); + }, + btn2: function (index) { + exportEodSwapRows(jgrid, fileName, null, getVisibleEodSwapBusinessColumnNames(jgrid)); + layer.close(index); + } + }); +} + +function getVisibleEodSwapBusinessColumnNames(jgrid) { + var colModel = jgrid.jqGrid('getGridParam', 'colModel') || []; + return colModel.filter(function (col) { + return col.hidden !== true && !col.optionHide && col.name !== 'cb' && col.name !== 'rn'; + }).map(function (col) { + return col.name; + }); +} + +function exportEodSwapRows(jgrid, fileName, groupConfig, exportColumnNames) { var exportPostData = $.extend({}, GetPostData(), { page: 1, rows: 0, @@ -760,52 +810,11 @@ function exportVisibleColumns() { traditional: true, data: exportPostData }).done(function (result) { - main.exportVisibleColumnsToExcel(jgrid, fileName, groupConfig, result && result.rows ? result.rows : []); + main.exportVisibleColumnsToExcel(jgrid, fileName, groupConfig, result && result.rows ? result.rows : [], exportColumnNames); }).fail(function () { main.message && main.message('导出失败,无法获取筛选后的全部数据'); }); } - -function normalizeEodSwapColumnsForGroupHeaders(jgrid, groupConfig) { - var colModel = jgrid.jqGrid('getGridParam', 'colModel') || []; - var currentNames = colModel.map(function (c) { return c.name; }); - var groupedNames = []; - var groupedNameMap = {}; - groupConfig.forEach(function (group) { - (group.columns || []).forEach(function (name) { - if (!groupedNameMap[name] && currentNames.indexOf(name) >= 0) { - groupedNameMap[name] = true; - groupedNames.push(name); - } - }); - }); - - var firstGroupedIndex = currentNames.findIndex(function (name) { return groupedNameMap[name]; }); - if (firstGroupedIndex < 0) { - return; - } - - var prefixNames = currentNames.slice(0, firstGroupedIndex).filter(function (name) { - return !groupedNameMap[name]; - }); - var suffixNames = currentNames.slice(firstGroupedIndex).filter(function (name) { - return !groupedNameMap[name]; - }); - var desiredNames = prefixNames.concat(groupedNames).concat(suffixNames); - if (desiredNames.join('|') === currentNames.join('|')) { - return; - } - - var perm = desiredNames.map(function (name) { - return currentNames.indexOf(name); - }).filter(function (idx) { - return idx >= 0; - }); - if (perm.length === currentNames.length) { - jgrid.jqGrid("remapColumns", perm, true); - } -} - //---------------------------Formatter--------------------------------- function PriceFormat(cellValue, options, rowObject) { return otcformat.trading.umprice(cellValue); diff --git a/YLErpWeb/wwwroot/Scripts/utils.js b/YLErpWeb/wwwroot/Scripts/utils.js index 1114e8e7..a615eda2 100644 --- a/YLErpWeb/wwwroot/Scripts/utils.js +++ b/YLErpWeb/wwwroot/Scripts/utils.js @@ -1211,19 +1211,29 @@ main.refreshCollapsibleGroupHeaders = function (jgrid) { * @param {string} fileName 导出文件名(不含扩展名) * @param {Array} groupConfig 可选,分组表头配置,每项 { title: string, columns: string[] } * @param {Array} exportRows 可选,后端返回的全部筛选结果;未传时导出当前页 + * @param {Array} exportColumnNames 可选,指定导出的列名及顺序;未传时导出当前可见列 */ -main.exportVisibleColumnsToExcel = function (jgrid, fileName, groupConfig, exportRows) { +main.exportVisibleColumnsToExcel = function (jgrid, fileName, groupConfig, exportRows, exportColumnNames) { 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 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 = {}; - visibleCols.forEach(function (col) { + exportCols.forEach(function (col) { var colIndex = colModel.indexOf(col); var rawValue = $.jgrid.getAccessor(row, col.name); var formattedValue = gridElement && gridElement.formatter @@ -1234,7 +1244,7 @@ main.exportVisibleColumnsToExcel = function (jgrid, fileName, groupConfig, expor return formattedRow; }); } - var headerLabels = visibleCols.map(function (c) { return c.label || c.name; }); + var headerLabels = exportCols.map(function (c) { return c.label || c.name; }); // 构建 HTML table,用 style 保持 mso-number-format 让金额不被科学计数法破坏 var html = ''; @@ -1242,7 +1252,7 @@ main.exportVisibleColumnsToExcel = function (jgrid, fileName, groupConfig, expor html += ''; //表头:有分组配置时导出两级表头(分类 + 字段),否则保持原单级表头。 if (groupConfig && groupConfig.length) { - html += buildGroupHeaderHtml(visibleCols, groupConfig); + html += buildGroupHeaderHtml(exportCols, groupConfig); } html += '' + headerLabels.map(function (l) { return ''; @@ -1250,8 +1260,8 @@ main.exportVisibleColumnsToExcel = function (jgrid, fileName, groupConfig, expor //数据行 for (var i = 0; i < rows.length; i++) { html += ''; - for (var c = 0; c < visibleCols.length; c++) { - var val = rows[i][visibleCols[c].name]; + for (var c = 0; c < exportCols.length; c++) { + var val = rows[i][exportCols[c].name]; if (val === undefined || val === null) val = ''; html += ''; }
' + escapeXml(l) + '
' + escapeXml(String(val)) + '