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 '| ' + escapeXml(l) + ' | ';
@@ -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(String(val)) + ' | ';
}