Files
zszq-trs/YLErpWeb/wwwroot/Scripts/app/risk/CalcWinLossCalcSwap.js
T
2024-05-09 14:06:26 +08:00

664 lines
23 KiB
JavaScript

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()
}
});