Files
zszq-trs/YLErpWeb/wwwroot/Scripts/app/risk/quotaSetting.js
T

455 lines
18 KiB
JavaScript

var g_grid = {};
var quotaSettings = {};
var underlyingId = 0;
var disabledQuotaIndexs = ["止损金额", "Delta金额", "浮动盈亏"];
var quotaMonitorMultiple = 10000;
$(function () {
FastVue.numberInput(document.getElementById('QuotaRange-PercentDays'), { precision: 0 });
var postData = GetPostData();
var obj = {
datatype: 'local',
multiselect: false,
height: 'auto',
width: '90%',
autowidth: false,
shrinkToFit: false,
viewrecords: true,
colModel: colModel,
jsonReader: { repeatitems: false },
caption: '',
mtype: 'POST',
postData: postData,
afterInsertRow: AfterInsertRow,
onSelectRow: rowclick,
ondblClickRow: rowdblclick,
footerrow: false,
loadComplete: gridComplete,
onPaging: onJqgridPaging
};
g_grid = jQuery('#listGrid1').jqGrid(obj);
$.ajax({
type: "Post",
async: false,
url: "/risk/QuotaSettingQuery",
contentType: false,
processData: false,
success: function (res) {
$("#BusinessTotalScale").val(res.BusinessTotalScale);
$("#BusinessAvailableFunds").val(res.BusinessAvailableFunds);
$("#SingleUnderlyingRate").val(res.SingleUnderlyingRate);
quotaSettings = res.QuotaSettings;
_.forEach(quotaSettings, (item) => {
if (item.QuotaIndex.indexOf("名义本金") != -1) {
item.QuotaIndex = item.QuotaIndex + "(万)";
}
if (item.Percent) {
item.QuotaUpperLimit = item.QuotaUpperLimit == null || item.QuotaUpperLimit == undefined || item.QuotaUpperLimit == "NaN" || item.QuotaUpperLimit === "" ? "" : (Number.parseFloat(item.QuotaUpperLimit) * 100).toFixed(2);
item.QuotaLowerLimit = item.QuotaLowerLimit == null || item.QuotaLowerLimit == undefined || item.QuotaLowerLimit == "NaN" || item.QuotaLowerLimit === "" ? "" : (Number.parseFloat(item.QuotaLowerLimit) * 100).toFixed(2);
item.WarningUpperLimit = item.WarningUpperLimit == null || item.WarningUpperLimit == undefined || item.WarningUpperLimit == "NaN" || item.WarningUpperLimit === "" ? "" : (Number.parseFloat(item.WarningUpperLimit) * 100).toFixed(2);
item.WarningLowerLimit = item.WarningLowerLimit == null || item.WarningLowerLimit == undefined || item.WarningLowerLimit == "NaN" || item.WarningLowerLimit === "" ? "" : (Number.parseFloat(item.WarningLowerLimit) * 100).toFixed(2);
} else {
item.QuotaUpperLimit = item.QuotaUpperLimit == null || item.QuotaUpperLimit == undefined || item.QuotaUpperLimit == "NaN" || item.QuotaUpperLimit === "" ? "" : Number.parseFloat(item.QuotaUpperLimit).toFixed(2);
item.QuotaLowerLimit = item.QuotaLowerLimit == null || item.QuotaLowerLimit == undefined || item.QuotaLowerLimit == "NaN" || item.QuotaLowerLimit === "" ? "" : Number.parseFloat(item.QuotaLowerLimit).toFixed(2);
item.WarningUpperLimit = item.WarningUpperLimit == null || item.WarningUpperLimit == undefined || item.WarningUpperLimit == "NaN" || item.WarningUpperLimit === "" ? "" : Number.parseFloat(item.WarningUpperLimit).toFixed(2);
item.WarningLowerLimit = item.WarningLowerLimit == null || item.WarningLowerLimit == undefined || item.WarningLowerLimit == "NaN" || item.WarningLowerLimit === "" ? "" : Number.parseFloat(item.WarningLowerLimit).toFixed(2);
}
});
setRows(res)
},
beforeSend(jqXHR) {
main.waitMe(true);
},
complete(jqXHR, textStatus) {
main.waitMe(false);
}
});
var defaultValue = { Name: '全部', Code: '全部', id: '0' };
pageData.clients.unshift(defaultValue);
var width = 152;
for (var i = 0; i < pageData.clients.length; i++) {
let ele = document.createElement('span')
ele.innerText = pageData.clients[i].Name;
ele.style.fontSize = '14px';
document.documentElement.append(ele);
var charLength = ele.offsetWidth + 28;//滚动条
document.documentElement.removeChild(ele);
if (charLength > width) {
width = charLength
}
}
FastVue.autocomplete('QuotaRange-ClienetId', {
nameField: 'Name',
valueField: 'id',
searchField: ['Name', 'PinYin'],//如果不设置则只搜索nameField
lookup: pageData.clients,
width: width,
onSelect: (data) => {
setRows();
}
}).setData(defaultValue)
//簿记
pageData.assetUnits.unshift(defaultValue);
var width = 152;
for (var i = 0; i < pageData.assetUnits.length; i++) {
let ele = document.createElement('span')
ele.innerText = pageData.assetUnits[i].Name;
ele.style.fontSize = '14px';
document.documentElement.append(ele);
var charLength = ele.offsetWidth + 28;//滚动条
document.documentElement.removeChild(ele);
if (charLength > width) {
width = charLength
}
}
FastVue.autocomplete('QuotaRange-AssetUnitId', {
nameField: 'Name',
valueField: 'id',
searchField: ['Name', 'PinYin'],//如果不设置则只搜索nameField
lookup: pageData.assetUnits,
width: width,
onSelect: (data) => {
setRows();
}
}).setData(defaultValue)
//标的资产
var selFlag = tradeHelper.UnderlyingSelectFlag;
var underlyingCtrl = tradeHelper.UnderlyingAutoComplete('QuotaRange-UnderlyingId', { UseAll:true, SelectFlag: selFlag.UsePinYinFilter | selFlag.UseForTrading | selFlag.IncludeSynthetic | selFlag.IncludeMatured | selFlag.IncludeBasket | selFlag.CheckLaunch, BlackLimit: 2, });
underlyingCtrl.setFlag(tradeHelper.UnderlyingSelectFlag.OtcTrade);
underlyingCtrl.onSelect((data) => {
underlyingId = data.id;
setRows();
});
underlyingCtrl.setData(defaultValue);
$("#QuotaType").on("change", function (e) {
setRows();
$("#listGrid1").jqGrid('setGridWidth', $('#remark').width());
});
});
function GetPostData() {
var postData = {};
postData.TradeNumber = $("#TradeNumber").val();
postData.ClientId = $("#ClientId").val();
postData.ClientNumber = $("#ClientNumber").val();
postData.UnderlyingId = $("#UnderlyingId").val();
postData.SummaryType = $("#myTab .active a").text();
return postData;
}
function setRows() {
$("#QuotaRange-UnderlyingId").parents(".search-group").hide();
$("#QuotaRange-ClienetId").parents(".search-group").hide();
$("#QuotaRange-PercentDays").parents(".search-group").hide();
$("#QuotaRange-AssetUnitId").parents(".search-group").hide();
var quotaType = $("#QuotaType").val();
var rows = quotaSettings;
var range = 0;
switch (quotaType) {
case "3":
$("#QuotaRange-UnderlyingId").parents(".search-group").show();
range = underlyingId;
break;
case "5":
$("#QuotaRange-ClienetId").parents(".search-group").show();
range = $("#QuotaRange-ClienetId").val() | 0;
break;
case "18":
$("#QuotaRange-AssetUnitId").parents(".search-group").show();
range = $("#QuotaRange-AssetUnitId").val() | 0;
break;
case "15":
$("#QuotaRange-PercentDays").parents(".search-group").show();
//range = $("#QuotaRange-PercentDays").val() | 0;
break;
}
if (range != 0) {
var exist = false;
_.forEach(rows, (item) => {
if (item.QuotaRange == range && item.QuotaType == $("#QuotaType").val()) {
exist = true;
return;
}
});
if (!exist) {
range = 0;
}
}
g_grid.jqGrid("clearGridData");
for (var i = 0; i < rows.length; i++) {
if (rows[i].QuotaType != quotaType) {
continue;
}
if (rows[i].QuotaType == "15") {
$("#QuotaRange-PercentDays").val(rows[i].QuotaRange);
} else if (rows[i].QuotaRange != range) {
continue;
}
g_grid.jqGrid('addRowData', rows[i].id, rows[i]);
g_grid.jqGrid('editRow', rows[i].id, false);
}
$(".editable").on("input", function () {
var inputValue = $(this).val();
var showValue = toThousands(inputValue, false);
$(this).val(showValue);
});
}
function changePercent(obj) {
if (obj.text === "%") {
obj.text = "¥";
obj.title = '点击后切换成百分比';
} else {
obj.text = "%";
obj.title = '点击后切换成数值';
}
}
function gridComplete(obj) {
$("#listGrid1_QuotaIndex").css("background", "#BBF8F9");
$("#listGrid1_QuotaLowerLimit,#listGrid1_QuotaUpperLimit").css("background", "#EE7280");
$("#listGrid1_WarningLowerLimit,#listGrid1_WarningUpperLimit").css("background", "#F4F262");
$("#listGrid1").jqGrid('setGridWidth', $('#remark').width() - 20);
}
function save() {
var arr = [];
var quotaType = $("#QuotaType").val();
var remark = $("#remark").val();
var quotaRange = 0;
switch (quotaType) {
case "3":
quotaRange = underlyingId;
break;
case "5":
quotaRange = $("#QuotaRange-ClienetId").val();
break;
case "15":
quotaRange = $("#QuotaRange-PercentDays").val();
break;
case "18":
quotaRange = $("#QuotaRange-AssetUnitId").val();
break;
default:
break;
}
var ids = g_grid.getDataIDs();
_.forEach(ids, (v) => {
var item = g_grid.getRowData(v);
item.QuotaType = quotaType;
item.Precheck = $("#Precheck_" + v).prop("checked");
item.QuotaRange = quotaRange;
var index = item.QuotaIndex.indexOf('<');
if (index > 0) {
item.QuotaIndex = item.QuotaIndex.substring(0, index)
}
item.Percent = item.Percent.indexOf("%") >= 0;
if (item.Percent) {
item.QuotaUpperLimit = $("#" + v + "_QuotaUpperLimit").val() === "" ? "NaN" : removeThousands($("#" + v + "_QuotaUpperLimit").val()) / 100;
item.QuotaLowerLimit = $("#" + v + "_QuotaLowerLimit").val() === "" ? "NaN" : removeThousands($("#" + v + "_QuotaLowerLimit").val()) / 100;
item.WarningUpperLimit = $("#" + v + "_WarningUpperLimit").val() === "" ? "NaN" : removeThousands($("#" + v + "_WarningUpperLimit").val()) / 100;
item.WarningLowerLimit = $("#" + v + "_WarningLowerLimit").val() === "" ? "NaN" : removeThousands($("#" + v + "_WarningLowerLimit").val()) / 100;
} else {
item.QuotaUpperLimit = $("#" + v + "_QuotaUpperLimit").val() === "" ? "NaN" : removeThousands($("#" + v + "_QuotaUpperLimit").val());
item.QuotaLowerLimit = $("#" + v + "_QuotaLowerLimit").val() === "" ? "NaN" : removeThousands($("#" + v + "_QuotaLowerLimit").val());
item.WarningUpperLimit = $("#" + v + "_WarningUpperLimit").val() === "" ? "NaN" : removeThousands($("#" + v + "_WarningUpperLimit").val());
item.WarningLowerLimit = $("#" + v + "_WarningLowerLimit").val() === "" ? "NaN" : removeThousands($("#" + v + "_WarningLowerLimit").val());
if (item.QuotaIndex.indexOf("名义本金") != -1) {
item.QuotaIndex = item.QuotaIndex.replace("(万)", "");
item.QuotaUpperLimit = item.QuotaUpperLimi == "NaN" ?"NaN": item.QuotaUpperLimit * quotaMonitorMultiple;
item.QuotaLowerLimit = item.QuotaLowerLimit == "NaN" ? "NaN" : item.QuotaLowerLimit * quotaMonitorMultiple;
item.WarningUpperLimit = item.WarningUpperLimit == "NaN" ? "NaN" : item.WarningUpperLimit * quotaMonitorMultiple;
item.WarningLowerLimit = item.WarningLowerLimit == "NaN" ? "NaN" : item.WarningLowerLimit * quotaMonitorMultiple;
}
}
arr.push(item);
})
var res = {
BusinessTotalScale: $("#BusinessTotalScale").val(),
BusinessAvailableFunds: $("#BusinessAvailableFunds").val(),
SingleUnderlyingRate: $("#SingleUnderlyingRate").val(),
QuotaSettings: arr,
Remark: remark,
};
$.ajax({
type: "Post",
url: "/risk/SaveQuotaSetting",
data: res,
dataType: "json",
success: function (res) {
if (res && res.msg) {
main.alert(res.msg, function () {
layer.closeMe();
});
}
},
beforeSend(jqXHR) {
main.waitMe(true);
},
complete(jqXHR, textStatus) {
main.waitMe(false);
}
});
}
// 千分位展示
function toThousands(num, percent) {
if (percent) {
return num;
}
num = num.toString().replace(/,/g, "");
var parts = num.split('.');
let integerPart = parts[0];
const regex = /(\d+)(\d{3})/;
while (regex.test(integerPart)) {
integerPart = integerPart.replace(regex, '$1,$2');
}
// 返回处理后的整数部分和小数部分(如果有)
return parts.length === 2 ? integerPart + '.' + parts[1] : integerPart;
}
// 移除千分位
function removeThousands(num) {
return Number(num.replace(/,/g, ""));
}
const tipObj = {
"Delta敞口(多空比)": "单一合约品种所有合约(含现货)多头合计Delta与空头合计Delta的比值",
Delta净敞口比例: "场内场外的净敞口/场外期权应对冲delta\r\ndelta多空相加的时候要轧差\r\n场外期权应对冲delta约等于-场外期权delta",
产品占用资金限额: "主体为“产品”的对手方购买场外期权支付的期权费及缴纳的初始预付金合计",
轧差集中度: "(本次交易的挂钩标的券面+所有存续合约中该券的券面)/该券的发行量"
};
var colModel = [
{
name: 'id',
label: '',
index: 'id',
width: 120,
align: 'left',
sortable: false,
hidden: true
}, {
name: 'QuotaIndex',
label: '限额指标',
index: 'QuotaIndex',
width: 150,
align: 'center',
sortable: false,
formatter: function (cellvalue, options, rowObject) {
var html = cellvalue;
if (tipObj[cellvalue]) {
html += '<div style="float: right;width: 0px;"><i class="fa fa-question" title="' + tipObj[cellvalue] + '" aria-hidden="true" style="float: right;"></i></div>';
}
return html;
}
}, {
name: 'Precheck',
label: '事前检查',
index: 'Precheck',
width: 60,
align: 'center',
sortable: false,
formatter: function (cellvalue, options, rowObject) {
var html = "";
if (disabledQuotaIndexs.indexOf(rowObject.QuotaIndex)>=0) {
html += '<input class="search-input" type="checkbox" name="Precheck_{0}" value="on" {1} id="Precheck_{0}" disabled="disabled">'.template(rowObject.id, (cellvalue ? "checked" : ""));
} else {
html += '<input class="search-input" type="checkbox" name="Precheck_{0}" value="on" {1} id="Precheck_{0}">'.template(rowObject.id, (cellvalue ? "checked" : ""));
}
return html;
}
}, {
name: 'QuotaLowerLimit',
label: '限额下限',
index: 'QuotaLowerLimit',
width: 168,
align: 'left',
sortable: false,
editable: true,
edittype: 'text',
formatter: function (cellvalue, options, rowObject) {
return cellvalue == null || cellvalue == undefined || cellvalue == "NaN" ? "" : toThousands(cellvalue, rowObject.Percent);
}
}, {
name: 'QuotaUpperLimit',
label: '限额上限',
index: 'QuotaUpperLimit',
width: 168,
align: 'right',
sortable: false,
editable: true,
edittype: 'text',
formatter: function (cellvalue, options, rowObject) {
return cellvalue == null || cellvalue == undefined || cellvalue == "NaN" ? "" : toThousands(cellvalue, rowObject.Percent);
}
}, {
name: 'WarningLowerLimit',
label: '预警下限',
index: 'WarningLowerLimit',
width: 168,
align: 'right',
sortable: false,
editable: true,
edittype: 'text',
formatter: function (cellvalue, options, rowObject) {
return cellvalue == null || cellvalue == undefined || cellvalue == "NaN" ? "" : toThousands(cellvalue, rowObject.Percent);
}
}, {
name: 'WarningUpperLimit',
label: '预警上限',
index: 'WarningUpperLimit',
width: 168,
align: 'right',
sortable: false,
editable: true,
edittype: 'text',
formatter: function (cellvalue, options, rowObject) {
return cellvalue == null || cellvalue == undefined || cellvalue == "NaN" ? "" : toThousands(cellvalue, rowObject.Percent);
}
},
{
name: 'Percent',
label: ' ',
index: 'Percent',
width: 40,
align: 'center',
sortable: false,
formatter: function (cellvalue, options, rowObject) {
var html = "<a href='javascript:;' ";
if (rowObject.QuotaType != 15) {
switch (rowObject.QuotaIndex) {
case "集中度":
case "VaR值":
case "止损金额":
case "Delta敞口":
case "权益类业务规模":
case "非权益类业务规模":
case "本年累计盈亏":
case "浮动盈亏":
case "DV": // DV是绝对值指标,不允许百分比模式
break;
default:
html += "onclick='changePercent(this)' ";
if (cellvalue) {
html += "title='点击后切换成数值'";
}
else {
html += "title='点击后切换成百分比'";
}
break;
}
}
if (cellvalue) {
html += ">%</a>";
}
else {
html += ">¥</a>";
}
return html;
},
}
];