const inputFormatNegative = Object.freeze({ precision: 2, negative: true }); var totalPv = 0; var totalPnl = 0; var totalPvClient = 0; var totalPnlClient = 0; var g_grid = {}; $(function () { var PostData = {}; //控件选择时的触发事件 main.setTradeDatePicker("", "#ValueDate", page.calcDate); //默认初始值赋值逻辑 $("#ValueDate").val(page.valueDate || page.calcDate); $("#ValueDate").prop("disabled", true); $("#ParentFlag").val(page.ParentFlag ? "True" : "False"); PostData.ValueDate = $("#ValueDate").val(); PostData.ClientId = $("#ClientId").val(); PostData.TradeTypes = ["收益互换"]; PostData.ParentFlag = $("#ParentFlag").val(); var url = $("#ClientId").val() > 0 ? '/trade_span/clientTradePositionQuery' : ''; var grid = jQuery('#listGrid').jqGrid({ url: url, datatype: 'json', height: 'auto', width: '96%', multiselect: true, autowidth: false, shrinkToFit: false, viewrecords: true, jsonReader: { repeatitems: false }, caption: '', mtype: 'POST', onSortCol: onSortCol, postData: PostData, afterInsertRow: AfterInsertRow, onSelectRow: rowclick, ondblClickRow: rowdblclick, onSelectAll: allRowSelect, colModel: colModelGrid, pager: jQuery('#pagerGrid'), pagerpos: 'left', rowNum: 100, rowList: [100, 1000], footerrow: true, loadComplete: gridComplete, grouping: true }); g_grid = jQuery('#listGrid'); let underlyingCtrl = new tradeHelper.UnderlyingSelectCtrl('#UnderlyingId').setFlag(tradeHelper.UnderlyingSelectFlag.OtcTrade); $(".datepicker").datepicker({ changeMonth: true, changeYear: true, showButtonPanel: true, showOtherMonths: true, selectOtherMonths: true }); try { SetAceDropDown(); } catch (e) { // } function AfterInsertRow(rowid, aData) { } }); function onSortCol(index, icol, sortorder) { g_sort.name = index; g_sort.order = sortorder; } const minusDoubleFormat = function (cellValue, options, rowObject) { return otcformat.trading.greek(-cellValue); }; var g_sort = { name: "TradeNumber", order: "desc" }; var i = 0; var colModelGrid = (function () { var col = [ { name: 'EncryptTradeId', label: 'EncryptTradeId', index: 'EncryptTradeId', sortIndex: i++, width: 70, align: 'center', hidden: true, optionHide: true }, { name: 'TradeId', label: 'TradeId', index: 'TradeId', key: true, sortIndex: i++, width: 70, align: 'center', hidden: true, optionHide: true }, { name: 'ClientName', label: '客户名称', index: 'ClientName', width: 180, sortIndex: i++, sorttype: "text", align: 'center' }, { name: 'TradeNumber', label: '交易编号', index: 'TradeNumber', width: 180, sortIndex: i++, sorttype: "text", align: 'center' }, { name: 'TradeDate', label: '交易日期', index: 'TradeDate', width: 90, sorttype: "date", align: 'center', sortIndex: i++, formatter: 'date' }, { name: 'ExerciseDate', label: '到期日期', index: 'ExerciseDate', width: 100, sorttype: "date", align: 'center', sortIndex: i++, formatter: 'date' }, { name: 'trade.SettlementDate', label: '结算日期', index: 'trade.SettlementDate', width: 100, sorttype: "date", align: 'center', sortIndex: i++, sortable: false, formatter: 'date' }, { name: 'trade.SettlementFlag', label: '是否延期结算', index: 'trade.SettlementFlag', sortIndex: i++, width: 100, align: 'center', sortable: false, formatter: YesOrNoFormat }, { name: 'TradeMultipleType', label: '结构类型', index: 'TradeMultipleType', width: 120, align: 'center', sortable: false, sortIndex: i++ }, { name: 'trade.trade_swap.PayUnderlyingCode', label: '标的代码(支付方)', index: 'trade.trade_swap.PayUnderlyingCode', width: 80, sortable: false, sortIndex: i++, align: 'center' }, { name: 'trade.trade_swap.PaySpotPrice', label: '期初标的价格(支付方)', index: 'trade.trade_swap.PaySpotPrice', width: 100, sortable: false, sortIndex: i++, align: 'center', formatter: otcformat.trading.umprice }, { name: 'trade.trade_swap.PayTradeAmount', label: '交易数量(支付方)', index: 'trade.trade_swap.PayTradeAmount', width: 100, align: 'center', sortable: false, sortIndex: i++, formatter: function (cellValue, options, rowObject) { return otcformat.trading.notional(page.IsUseDisplayNotional ? (rowObject.CountRatio || 1) * cellValue : cellValue); } }, { name: 'trade.trade_swap.PayLongShort', label: '多空方向(支付方)', index: 'trade.trade_swap.PayLongShort', width: 90, sortable: false, sortIndex: i++, align: 'center' }, { name: 'trade.trade_swap.PaySwapTimeAndRate', label: '互换利率(支付方)', index: 'trade.trade_swap.PaySwapTimeAndRate', width: 100, align: 'center', sortable: false, sortIndex: i++, formatter: SwapTimeAndRateFormat }, { name: 'trade.trade_swap.PaySingleFee', label: '单位交易费用(支付方)', index: 'trade.trade_swap.PaySingleFee', width: 90, sortable: false, sortIndex: i++, align: 'center', formatter: TradeSinglePriceFormat }, { name: 'trade.trade_swap.PayTradePrice', label: '交易费用(支付方)', index: 'trade.trade_swap.PayTradePrice', width: 90, sortable: false, sortIndex: i++, align: 'center', formatter: otcformat.trading.tradePrice }, { name: 'trade.trade_swap.PayMarginRate', label: '初始预付金率(支付方)', index: 'trade.trade_swap.PayMarginRate', width: 100, align: 'center', sortable: false, sortIndex: i++, formatter: otcformat.trading.marginRateP }, { name: 'trade.trade_swap.GetUnderlyingCode', label: '标的代码(收取方)', index: 'trade.trade_swap.GetUnderlyingCode', width: 80, sortable: false, sortIndex: i++, align: 'center' }, { name: 'trade.trade_swap.GetSpotPrice', label: '期初标的价格(收取方)', index: 'trade.trade_swap.GetSpotPrice', width: 100, sortable: false, sortIndex: i++, align: 'center', formatter: otcformat.trading.umprice }, { name: 'trade.trade_swap.GetTradeAmount', label: '交易数量(收取方)', index: 'trade.trade_swap.GetTradeAmount', width: 100, align: 'center', sortable: false, sortIndex: i++, formatter: function (cellValue, options, rowObject) { return otcformat.trading.notional(page.IsUseDisplayNotional ? (rowObject.CountRatio || 1) * cellValue : cellValue); } }, { name: 'trade.trade_swap.GetLongShort', label: '多空方向(收取方)', index: 'trade.trade_swap.GetLongShort', width: 90, sortable: false, sortIndex: i++, align: 'center' }, { name: 'trade.trade_swap.GetSwapTimeAndRate', label: '互换利率(收取方)', index: 'trade.trade_swap.GetSwapTimeAndRate', width: 100, align: 'center', sortable: false, sortIndex: i++, formatter: SwapTimeAndRateFormat }, { name: 'trade.trade_swap.GetSingleFee', label: '单位交易费用(收取方)', index: 'trade.trade_swap.GetSingleFee', width: 90, sortable: false, sortIndex: i++, align: 'center', formatter: GETTradeSinglePriceFormat }, { name: 'trade.trade_swap.GetTradePrice', label: '交易费用(收取方)', index: 'trade.trade_swap.GetTradePrice', width: 90, sortable: false, sortIndex: i++, align: 'center', formatter: otcformat.trading.tradePrice }, { name: 'trade.trade_swap.GetMarginRate', label: '初始预付金率(收取方)', index: 'trade.trade_swap.GetMarginRate', width: 100, align: 'center', sortable: false, sortIndex: i++, formatter: otcformat.trading.marginRateP }, { name: 'OriginalStockEqvNotional', label: '名义本金', index: 'OriginalStockEqvNotional', width: 120, align: 'center', sortable: false, sortIndex: i++, formatter: otcformat.trading.stockEqvNotional }, { name: 'trade.trade_swap.AnnualDays', label: '年化天数', index: 'trade.trade_swap.AnnualDays', width: 120, align: 'center', sortable: false, sortIndex: i++ }, { name: 'UnderlyingCode', label: '标的代码', index: 'UnderlyingCode', width: 100, align: 'center', sortIndex: i++, optionHide: true, hide: true }, { name: 'UnderlyingPrice', label: '当前标的价格', index: 'UnderlyingPrice', width: 100, align: 'center', sortIndex: i++, }, { name: page.isPvRounded ? 'RoundedPv' : 'Pv', label: '持仓市值', index: page.isPvRounded ? 'RoundedPv' : 'Pv', width: 120, align: 'center', sortable: false, sortIndex: i++, formatter: otcformat.trading.tradePrice, summaryType: 'sum' }, { name: 'TradeAmount', label: '持仓数量', index: 'TradeAmount', sortIndex: i++, width: 120, align: 'center', sortable: false, formatter: function (cellvalue, options, rowObject) { return otcformat.trading.notional(page.IsUseDisplayNotional ? tradeHelper.getTradeAmountV(rowObject.trade, rowObject.TradeAmount, 1) * (rowObject.CountRatio || 1) : tradeHelper.getTradeAmountV(rowObject.trade, rowObject.TradeAmount, 1)); } }, { name: page.isPvRounded ? 'RoundedPnl' : 'Pnl', label: '持仓盈亏', index: page.isPvRounded ? 'RoundedPnl' : 'Pnl', width: 120, align: 'center', sortable: false, sortIndex: i++, formatter: otcformat.trading.tradePrice, summaryType: 'sum' }, ]; return col; }()); function gridComplete() { var jgrid = $(this); var rowNum = parseInt(jgrid.getGridParam('records'), 10); if (rowNum > 0) { $(".ui-jqgrid-sdiv").show(); var totalPv = arguments[0].Sum == null ? "" : (page.isPvRounded ? arguments[0].Sum.RoundedPvSum : arguments[0].Sum.PvSum); var totalPnl = arguments[0].Sum == null ? "" : (page.isPvRounded ? arguments[0].Sum.RoundedDailyPnLSum : arguments[0].Sum.DailyPnLSum); if (page.isPvRounded) { jgrid.footerData("set", { ClientName: "合计", RoundedPv: totalPv, RoundedPnl: totalPnl }); } else { jgrid.footerData("set", { ClientName: "合计", Pv: totalPv, Pnl: totalPnl }); } $(".ui-jqgrid-sortable").css("text-align", "center"); var newHeight = $(window).height() - 270; $(".ui-jqgrid .ui-jqgrid-bdiv").css("cssText", "height: " + newHeight + "px!important;"); $('.ui-jqgrid-bdiv', '#gbox_listGrid').floatingScroll(); if ($("#PvSum").val() == "" && $("#PnlSum").val() == "") { $("#PvSum").val(otcformat.trading.tradePrice(totalPv)); $("#PvSum").css('color', totalPv > 0 ? 'red' : (totalPv < 0 ? 'green' : '')); $("#PnlSum").val(otcformat.trading.tradePrice(totalPnl)); $("#PnlSum").css('color', totalPnl > 0 ? 'red' : (totalPnl < 0 ? 'green' : '')); totalPvClient = numeral(otcformat.trading.tradePrice(totalPv)).value(); totalPnlClient = numeral(otcformat.trading.tradePrice(totalPnl)).value(); } } else { $(".ui-jqgrid-sdiv").hide(); } //jgrid.sortGrid(g_sort.name, g_sort.order); main.setcolumnChooser(jgrid, page.configcolumn); $(".selftooltip").tooltip({ html: true, show: 50000, trigger: "hover" }); } function rowdblclick(rowid) { var rowData = $(this).getRowData(rowid); if (rowData.EncryptTradeId) { starttradeView(rowData.TradeMultipleType, rowData.EncryptTradeId); } } function starttradeView(tradetype, id) { if (tradetype.indexOf("远期") >= 0) { let srcurl = "/forwardtrade/tradeView/?enid=" + id + "&isFromPositionReport=true"; main.open("查看远期交易", srcurl, { area: ['1260px', '100%'] }); } else { let srcurl = "/trade/tradeView/?enid=" + id + "&isFromPositionReport=true"; main.open("查看交易", srcurl, { area: ['1260px', '100%'] }); } } function TradeSinglePriceFormat(cellValue, options, rowObject) { if (rowObject.IsUsePremiumRate) { return otcformat.trading.premiumRateP(rowObject.PremiumRate); } else { return otcformat.trading.tradeSinglePrice(cellValue); } } function YesOrNoFormat(cellValue, options, rowObject) { return cellValue ? "是" : "否"; } function GETTradeSinglePriceFormat(cellValue, options, rowObject) { if (rowObject.trade.trade_swap.IsGetFloatingProfit == false && rowObject.trade.trade_swap.GetUnAnnualRate < 1 && rowObject.trade.trade_swap.GetUnAnnualRate > 0) { return otcformat.trading.premiumRateP(rowObject.trade.trade_swap.GetUnAnnualRate); } else { if (!rowObject.trade.trade_swap.IsShare) { return rowObject.trade.trade_swap.PayContractSize == 0 ? 0 : otcformat.trading.tradeSinglePrice(cellValue / rowObject.trade.trade_swap.PayContractSize); } return otcformat.trading.tradeSinglePrice(cellValue); } } function SwapTimeAndRateFormat(cellValue, options, rowObject) { if (cellValue != null && cellValue.indexOf(";") > 0) { var spCellValue = cellValue.split(";")[1]; if (spCellValue != null && spCellValue.indexOf(",") > 0) { return otcformat.trading.premiumRateP(spCellValue.split(",")[0]); } else { return otcformat.trading.premiumRateP(spCellValue); } } return otcformat.trading.premiumRateP(cellValue); } function unformat(cellValue, options, rowObject) { return numeral(cellValue).value(); } function rowclick(id) { setFooter(); } function allRowSelect(rowids, status) { setFooter(); } function reloadTradeMarketReport() { //重新加载 SearchClick(true); } //搜索持仓明细 function SearchClick(isSearchclick) { var listGrid = $('#listGrid'); listGrid.jqGrid('setGridParam', { url: '/trade_span/clientTradePositionQuery', datatype: 'json' }) listGrid.appendPostData({ ClientId: $("#ClientId").val() }); listGrid.appendPostData({ TradeNumber: $("#TradeNumber").val() }); listGrid.appendPostData({ ValueDate: $("#ValueDate").val() }); listGrid.appendPostData({ ParentFlag: $("#ParentFlag").val() }); listGrid.appendPostData({ BookIds: $("#AssetId").val() }) listGrid.appendPostData({ AssetIdGroupList: $("#GroupId").val() }) listGrid.appendPostData({ UnderlyingIds: $("#UnderlyingId").val() }); listGrid.appendPostData({ TradeDateStart: $("#DateFromTradeDate").val() }); listGrid.appendPostData({ TradeDateEnd: $("#DateToTradeDate").val() }); listGrid.appendPostData({ ExerciseDateStart: $("#DateFromExerciseDate").val() }); listGrid.appendPostData({ ExerciseDateEnd: $("#DateToExerciseDate").val() }); if (!$("#ValueDate").val()) { main.message("请选择要查看报告的结束日期!"); return; } if ($("#ValueDate").val() > page.calcDate) { main.message("结束日期不能大于当前系统日期!"); return; } if ($("#ValueDate").val() < $("#ValueDateFrom").val()) { main.message("起始日期不能大于结束日期!"); return; } if (typeof (isSearchclick) != "undefined" && isSearchclick) { //点击搜索时默认第一页 listGrid.jqGrid('setGridParam', { page: 1 }); } listGrid.trigger('reloadGrid'); history.replaceState(null, null, window.location.href.replace(/([?&]clientId)=[^&]+/, '$1=' + $("#ClientId").val())); var req = {}; req.ValueDate = $("#ValueDate").val(); req.ClientId = $("#ClientId").val(); req.ParentFlag = $("#ParentFlag").val(); req.TradeTypes = ["收益互换"]; main.post("/trade_span/clientTradePositionQuery", { req: req }).done(function (resp) { var pvSum = otcformat.trading.tradePrice(page.isPvRounded ? resp.Sum.RoundedPvSum : resp.Sum.PvSum); var pnlSum = otcformat.trading.tradePrice(page.isPvRounded ? resp.Sum.RoundedDailyPnLSum : resp.Sum.DailyPnLSum); $("#PvSum").val(pvSum); $("#PvSum").css('color', (page.isPvRounded ? resp.Sum.RoundedPvSum : resp.Sum.PvSum) > 0 ? 'red' : ((page.isPvRounded ? resp.Sum.RoundedPvSum : resp.Sum.PvSum) < 0 ? 'green' : '')); $("#PnlSum").val(pnlSum); $("#PnlSum").css('color', (page.isPvRounded ? resp.Sum.RoundedDailyPnLSum : resp.Sum.DailyPnLSum) > 0 ? 'red' : ((page.isPvRounded ? resp.Sum.RoundedDailyPnLSum : resp.Sum.DailyPnLSum) < 0 ? 'green' : '')); totalPvClient = numeral(pvSum).value(); totalPnlClient = numeral(pnlSum).value(); }); } function showChiCang() { main.showcolumnChooser(jQuery('#listGrid'), page.configcolumn); } function locationChange(tab) { if ($("#ValueDate").val() > page.calcDate) { main.message("结束日期不能大于当前系统日期!"); return; } window.location.href = tab + "?clientId=" + $("#ClientId").val() + "&valueDate=" + $("#ValueDate").val() + "&ParentFlag=" + $("#ParentFlag").val(); return; } function batchSetPrices() { var jgrid = $("#listGrid"); var rowObjs = main.GetGridObjs(jgrid); var pricesDic = []; if (rowObjs.length > 0) { rowObjs.forEach(obj => { if (!pricesDic.find(t => t.key == obj.UnderlyingCode)) { pricesDic.push({ key: obj.UnderlyingCode, value: numeral(obj.UnderlyingPrice ? obj.UnderlyingPrice : $("#priceInput" + obj.TradeId).val()).value() }); } }); vuePrice.pricesDic = pricesDic; $('#priceModal').modal('show'); } else { main.alert("请选择需要设置的交易"); } } function setFooter() { var jgrid = $("#listGrid"); var rowObjs = main.GetGridObjs(jgrid); var pvSum = rowObjs.length > 0 ? 0 : totalPv; var roundedPvSum = rowObjs.length > 0 ? 0 : totalPv; var pnlSum = rowObjs.length > 0 ? 0 : totalPnl; var roundedPnlSum = rowObjs.length > 0 ? 0 : totalPnl; rowObjs.forEach(obj => { pvSum += numeral(obj.Pv).value(); roundedPvSum += numeral(obj.RoundedPv).value(); pnlSum += numeral(obj.Pnl).value(); roundedPnlSum += numeral(obj.RoundedPnl).value(); }); if (page.isPvRounded) { jgrid.footerData("set", { ClientName: "合计", RoundedPv: roundedPvSum, RoundedPnl: roundedPnlSum }); } else { jgrid.footerData("set", { ClientName: "合计", Pv: pvSum, Pnl: pnlSum }); } $("#PvSum").val(otcformat.trading.tradePrice(totalPvClient)); $("#PvSum").css('color', totalPvClient > 0 ? 'red' : (totalPvClient < 0 ? 'green' : '')); $("#PnlSum").val(otcformat.trading.tradePrice(totalPnlClient)); $("#PnlSum").css('color', totalPnlClient > 0 ? 'red' : (totalPnlClient < 0 ? 'green' : '')); } var vuePrice = new Vue({ el: "#priceModal", data: { pricesDic: [] }, created: function () { }, methods: { closeModal: function () { $('#priceModal').modal('hide'); }, saveModal: function () { var thisobj = this; var request = {}; var tradeIds = []; var listGrid = $("#listGrid"); var rowObjs = main.GetGridObjs(listGrid); rowObjs.forEach(obj => { tradeIds.push(obj.TradeId); }); request.TradeIds = tradeIds; request.ValueDate = $("#ValueDate").val(); request.PricesDic = thisobj.pricesDic; main.post("/pricing/AjaxCalcSwapTrades", { request: request }).done(function (resp) { rowObjs.forEach(obj => { var optionValue = resp.obj.TradeOptionValueDic[obj.TradeId]; var needRowData = {}; needRowData.UnderlyingPrice = numeral(thisobj.pricesDic.find(t => t.key == obj.UnderlyingCode).value).value(); needRowData.TradeId = obj.TradeId; needRowData.Pv = -optionValue.Pv; needRowData.RoundedPv = -optionValue.Pv; needRowData.Pnl = -optionValue.Pnl; needRowData.RoundedPnl = -optionValue.Pnl; var pvGap = (-optionValue.Pv) - (page.isPvRounded ? obj.RoundedPv : obj.Pv); var pnlGap = (-optionValue.Pnl) - (page.isPvRounded ? obj.RoundedPnl : obj.Pnl); totalPv = numeral(otcformat.trading.tradePrice(totalPv + pvGap)).value(); totalPnl = numeral(otcformat.trading.tradePrice(totalPnl + pnlGap)).value(); totalPvClient = numeral(otcformat.trading.tradePrice(totalPvClient + pvGap)).value(); totalPnlClient = numeral(otcformat.trading.tradePrice(totalPnlClient + pnlGap)).value(); listGrid.setRowData(obj.TradeId, needRowData); }); setFooter(); }); $('#priceModal').modal('hide'); } }, components: { 'vue-number-input': FastVue.vueNumberInput() } });