Files
zszq-trs/YLErpWeb/wwwroot/Scripts/app/underlying/underlyinglist.js
T

517 lines
20 KiB
JavaScript

//标的价格控制
const updatePriceCtrl = (new function () {
const consRender = _.template(($('#priceCtrlTpl').html() || '').trim().replace(/[\r\n]+\s+/g, '') || ' ');
this.jqgridFormat = function (cellValue, options, rowObject) {
if (rowObject.CommodityCode === '篮子标的' || rowObject.CommodityCode === '组合标的') return cellValue;
return consRender({ price: cellValue || '0', id: rowObject.id })
}
this.showInput = function () {
let $e = $(event.target);
$e.closest('.underlying-price').addClass('input');
$e.next().find('input').focus();
}
this.onInputKeyDown = function () {
event.stopPropagation();
let $input = $(event.target);
if (event.keyCode === 13) {
$input.blur();
} else if (event.keyCode === 27) {
$input.val($input.data('value'));
$input.closest('.underlying-price').removeClass('input');
}
}
this.removeInput = function () {
$(event.target).closest('.underlying-price').removeClass('input');
}
var blurTime = 0;
function __blurPrice($input) {
$input = $input || $(event.target);
let newPrice = parseFloat($input.val());
let oldPrice = parseFloat($input.data('value')) || 0;
if (!newPrice || Math.abs(newPrice - oldPrice) < 1e-5) {
$input.val($input.data('value'));
$input.closest('.underlying-price').removeClass('input');
} else {
let id = parseInt($input.data('id'));
let userData = $("#listGrid").getGridParam('userData').find(x => x.id === id);
main.post("/underlying_manager/AjaxSetUnderlyingPrice", { id: id, price: newPrice }, false).done(function () {
userData.Price = newPrice;
$("#listGrid").jqGrid('setRowData', id, userData);
});
}
}
this.blurPrice = function ($input) {
let time = new Date().getTime();
if (blurTime + 100 < time) {
__blurPrice();
}
blurTime = time + 100;
}
});
const colModelGrid = function () {
function dateFmt(cellValue) {
return (cellValue || '').substring(0, 10);
}
return [{
name: '1', label: '操作', index: '1', width: 210, formatter: showToolName, sortable: false
}, {
name: '2', label: '除权设置', index: '2', width: 90, formatter: SetDividEnd, sortable: false
}, {
name: 'LaunchState', label: '启用', index: 'LaunchState', width: 45, formatter: launchUnderlying,
}, {
name: 'id', label: 'id', index: 'id', width: 1, hidden: true, optionHide: true,
}, {
name: 'UnderlyingInstrumentType', label: 'UnderlyingInstrumentType', index: 'UnderlyingInstrumentType', width: 1, hidden: true, optionHide: true,
}, {
name: 'EncryptId', label: 'EncryptId', index: 'EncryptId', width: 0, hidden: true, optionHide: true,
}, {
name: 'MarketName', label: '交易所', index: 'MarketName', width: 140
}, {
name: 'UnderlyingCode', label: '标的资产码', index: 'UnderlyingCode', width: 80
}, {
name: 'UnderlyingName', label: '标的名称', index: 'UnderlyingName', width: 180
}, {
name: 'UnderlyingEnName', label: '标的英文名称', index: 'UnderlyingEnName', width: 180, sortable: false
}, {
name: 'BBGTicker', label: 'BBGTicker', index: 'BBGTicker', width: 180
}, {
name: 'Price', label: '标的价格', index: 'Price', width: 90, formatter: updatePriceCtrl.jqgridFormat
}, {
name: 'UnderlyingInstrumentTypeCn', label: '资产类型', index: 'UnderlyingInstrumentTypeCn', width: 100, sortable: false
}, {
name: 'UnderlyingType', label: '标的品种类型', index: 'UnderlyingType', width: 130, hidden: true
}, {
name: 'MaturityDate', label: '标的到期日', index: 'MaturityDate', width: 100, formatter: dateFmt
}, {
name: 'CloseDate', label: '标的交割日', index: 'CloseDate', width: 100, formatter: dateFmt
}, {
name: 'UnderlyingState', label: '标的状态', index: 'UnderlyingState', width: 80,
formatter(cellValue) {
if (cellValue === 'Live') return '正常';
if (cellValue === 'Matured') return '已过期';
return cellValue;
}
}, {
name: 'UnderlyingStatus', label: '交易状态', index: 'UnderlyingStatus', width: 80
}, {
name: 'LinkTo', label: '关联指数', index: 'LinkTo', width: 80, sortable: false
},{
name: 'VolatilityRate', label: 'Span波动率变动', index: 'LinkTo', width: 110, sortable: false
},{
name: 'UpDownLimit', label: 'Span涨跌幅度', index: 'LinkTo', width: 110, sortable: false
},{
name: 'MarginRate', label: '预付金比例', index: 'LinkTo', width: 80, sortable: false
},{
name: 'Beta', label: 'Beta', index: 'Beta', width: 45, sortable: false
}, {
name: 'OptName', label: '操作人名', index: 'OptName', width: 80, sortable: false
}, {
name: 'OptDate', label: '创建日期', width: 90, formatter: dateFmt
}];
};
var g_grid = {};
$(function () {
$(".datepicker").datepicker({ changeMonth: true, changeYear: true, showButtonPanel: true, showOtherMonths: true, selectOtherMonths: true });
var PostData = { LaunchState: $("#LaunchState").val() };
var grid = jQuery('#listGrid').jqGrid({
url: '/underlying_manager/underlying_managerQuery',
datatype: 'json',
height: 'auto',
width: '90%',
autowidth: false,
shrinkToFit: false,
viewrecords: true,
jsonReader: { repeatitems: false, userdata: 'rows' },
cmTemplate: { align: 'center', width: 120 },
mtype: 'POST',
postData: PostData,
colModel: colModelGrid(),
pager: jQuery('#pagerGrid'),
pagerpos: 'left',
rowNum: 20,
rowList: [20, 30, 50, 200, 10000],
loadComplete:gridComplete,
footerrow: false
});
g_grid = jQuery('#listGrid');
document.onkeydown = function keyEnter(event) {
try {
var e = event || window.event;
(e.keyCode === 13) && SearchClick(true);
} catch (e) {
//
}
};
SetAceDropDown();
});
//设置除权
function SetDividEnd(cellValue, options, rowObject) {
if (rowObject.UnderlyingInstrumentType !== "Stock" || rowObject.CommodityCode === "篮子标的" || !g_dividend) return "";
var imageHtml = "<input type=\"button\" value=\"除权\" class=\"wentiEdit btn-info\" onclick=\"openDividEnd('" + rowObject.EncryptId + "');\" />";
return imageHtml;
}
function openDividEnd(enid) {
var url = "/ex_dividend_info/underlying_dividend_info?unid=" + enid;
main.open("个股除权设置", url, { area: ['60%', '50%'] });
}
function showToolName(cellValue, options, rowObject) {
var html = "<input type=\"button\" class=\"wentiEdit\" title='查看标的管理' onclick=\"startunderlying_managerView('{0}','{2}','{3}')\" value=\"{1}\" />".template(rowObject.EncryptId, "查看", rowObject.CommodityCode, rowObject.UnderlyingCode);
if (rowObject.CommodityCode === "篮子标的") {
html += "<input type=\"button\" disabled class=\"wentiEdit\" title='报价参数' onclick=\"openQuotationParameter('{0}','{2}','{3}')\" value=\"{1}\" />".template(rowObject.id, "报价参数", rowObject.UnderlyingCode, rowObject.LaunchState || '0');
}
else {
html += "<input type=\"button\" class=\"wentiEdit\" title='报价参数' onclick=\"openQuotationParameter('{0}','{2}','{3}')\" value=\"{1}\" />".template(rowObject.id, "报价参数", rowObject.UnderlyingCode, rowObject.LaunchState || '0');
}
return html;
}
function gridComplete() {
var jgrid = $(this);
$('.ui-jqgrid-bdiv', '#gbox_listGrid').floatingScroll();
$.when(main.setcolumnChooser(jgrid, configcolumn_data_bdzc)).always(function () {
const colModel = jgrid.jqGrid('getGridParam', 'colModel');
const priceIndex = colModel.findIndex(x => x.name === 'Price');
const instrumentTypeIndex = colModel.findIndex(x => x.name === 'UnderlyingInstrumentTypeCn');
jgrid.jqGrid('showCol', 'UnderlyingInstrumentTypeCn');
if (priceIndex >= 0 && instrumentTypeIndex >= 0 && instrumentTypeIndex !== priceIndex + 1) {
const perm = colModel.map((_, index) => index);
perm.splice(instrumentTypeIndex, 1);
perm.splice(perm.indexOf(priceIndex) + 1, 0, instrumentTypeIndex);
jgrid.jqGrid('remapColumns', perm, true);
}
});
}
function showcolumnChooser() {
var jgrid = jQuery('#listGrid');
main.showcolumnChooser(jgrid, configcolumn_data_bdzc);
}
function openQuotationParameter(id, ucode, launchState) {
if (launchState === '0') {
main.message("进行波动率及报价管理,请先启用该标的");
return false;
}
var url = "/underlying_manager/pop_parameterEdit?display=info&under_id=" + id;
main.open(ucode + "报价参数", url, { area: ["1200px", "600px"] });
}
function startAddunderlying_manager() {
main.open("新增标的", "/underlying_manager/underlying_managerEdit/0", { area: ['1200px', '80%'] });
}
function startAddsSyntheticUnderlyingManager() {
main.open("新增组合标的", "/SyntheticUnderlying/SyntheticUnderlyingEdit", { area: ['1300px', '85%'] });
}
function startAddBasketunderlying_manager() {
main.open("新增篮子组合", "/BasketUnderlying/BasketUnderlyingSetting", { area: ['1000px', '85%'] });
}
function startunderlying_managerView(id, CommodityCode, syntheticUnderlyingName) {
if (CommodityCode === "组合标的") {
let url = "/SyntheticUnderlying/SyntheticUnderlyingView?syntheticUnderlyingName=" + encodeURIComponent(syntheticUnderlyingName);
main.open("组合标的查看", url, { area: ['1200px', '96%'] });
}
else if (CommodityCode === "篮子标的") {
let url = "/BasketUnderlying/PopBasketUnderlyingSettingView?basketUnderlyingName=" + encodeURIComponent(syntheticUnderlyingName);
main.open("篮子标的查看", url, { area: ['1000px', '80%'] });
}
else {
let url = "/underlying_manager/underlying_managerView/?enid=" + id;
main.open("查看", url, { area: ['1200px', '96%'] });
}
}
function reloadunderlying_manager() {
//重新加载
SearchClick();
}
function syntheticUnderlyingSettingCallback(syntheticUnderlyingId) {
//重新加载
SearchClick();
}
function SearchClick(isSearchclick) {
var listGrid = $('#listGrid');
listGrid.appendPostData({ MarketCode: $("#MarketCode").val() });
listGrid.appendPostData({ Underlying: $("#Underlying").val() });
listGrid.appendPostData({ UnderlyingCode: $("#UnderlyingCode").val() });
listGrid.appendPostData({ UnderlyingInstrumentType: ($("#UnderlyingInstrumentType").val() || []).join() });
listGrid.appendPostData({ UnderlyingType: ($("#UnderlyingTypeId").val() || []).join() });
listGrid.appendPostData({ MaturityDateStart: $("#DateFromMaturityDate").val() });
listGrid.appendPostData({ MaturityDateEnd: $("#DateToMaturityDate").val() });
listGrid.appendPostData({ UnderlyingState: $("#UnderlyingState").val() });
listGrid.appendPostData({ UnderlyingStatus: $("#UnderlyingStatus").val() });
listGrid.appendPostData({ TradeUnit: $("#TradeUnit").val() });
listGrid.appendPostData({ QuotationUnit: $("#QuotationUnit").val() });
listGrid.appendPostData({ MinChangePrice: $("#MinChangePrice").val() });
listGrid.appendPostData({ PriceLimits: $("#PriceLimits").val() });
listGrid.appendPostData({ Months: $("#Months").val() });
listGrid.appendPostData({ TradeTime: $("#TradeTime").val() });
listGrid.appendPostData({ DeliveryGrade: $("#DeliveryGrade").val() });
listGrid.appendPostData({ DeliveryPlace: $("#DeliveryPlace").val() });
listGrid.appendPostData({ MinDiposit: $("#MinDiposit").val() });
listGrid.appendPostData({ DeliveryType: $("#DeliveryType").val() });
listGrid.appendPostData({ TradeCode: $("#TradeCode").val() });
listGrid.appendPostData({ ListedExchangeName: $("#ListedExchangeName").val() });
listGrid.appendPostData({ Desc: $("#Desc").val() });
listGrid.appendPostData({ OptName: $("#OptName").val() });
listGrid.appendPostData({ OptDateStart: $("#DateFromOptDate").val() });
listGrid.appendPostData({ OptDateEnd: $("#DateToOptDate").val() });
listGrid.appendPostData({ LaunchState: $("#LaunchState").val() });
$("#CheckboxAll").prop("checked", false);
if (isSearchclick) {
//点击搜索时默认第一页
listGrid.jqGrid('setGridParam', {
page: 1
});
}
listGrid.trigger('reloadGrid');
}
function setLauch(uid, launchState, obj) {
var uids = [];
uids.push(uid);
main.post("/trade/CheckUnderlyingTrade", { uids: uids }).done(function (res) {
if (res.obj.length > 0 && launchState !== '1') {
main.message("有" + res.obj.length + "笔交易还在使用此标的");
} else {
main.confirm(launchState === '1' ? "确认启用选中标的?" : "确认不启用选中标的?", function () {
main.post("/underlying_manager/UpdateById", { id: uid, LaunchState: launchState }).done(function (res) {
SearchClick();
//var opthtml = " style='cursor:pointer' title='设置启用或禁用标的' onclick=\"setLauch('{0}','{1}',this)\" ".template(uid, res.obj.LaunchState === "1" ? "0" : "1");
//var imgpicture = res.obj.LaunchState === "1" ? "/Images/yes.gif" : "/Images/no.gif";
//var temphtml = "<img src='{0}' {1}>".template(imgpicture, opthtml);
//$(obj).parent().html(temphtml);
});
});
}
});
}
function launchUnderlying(cellValue, options, rowObject) {
var opthtml = "";
if (g_canlaunch) {
opthtml = " style='cursor:pointer' title='设置启用或禁用标的' onclick=\"setLauch('{0}','{1}',this)\" ".template(rowObject.id, cellValue === "1" ? "0" : "1");
}
var html = "<img src='{0}' {1}>";
html = cellValue === "1" ? html.template("/Images/yes.gif", opthtml) : html.template("/Images/no.gif", opthtml);
return html;
}
function updateSelectedLaunchState(doLaunch) {
var ggrid = jQuery('#listGrid');
var rowIds = ggrid.jqGrid('getGridParam', 'selarrrow');
if (rowIds.length === 0) {
main.alert(doLaunch === 1 ? "请选择要启用的标的" : "请选择不启用的标的");
return false;
}
var ids = [];
for (var i = 0; i < rowIds.length; i++) {
ids.push(ggrid.getRowData(rowIds[i])['id']);
}
main.post("/trade/CheckUnderlyingTrade", { uids: ids }).done(function (res) {
if (res.obj.length > 0 && doLaunch !== 1) {
main.message("有" + res.obj.length + "笔交易还在使用这些标的,请检查后再批量取消启用");
} else {
main.confirm(doLaunch === 1 ? "确认启用选中标的?" : "确认不启用选中标的?", function () {
//启用 所有
var checkAll = $("#CheckboxAll").prop("checked");
var postData = { ids: ids, LaunchState: doLaunch === 1 ? "1" : "0" };
if (checkAll) {
postData = $.extend(postData, ggrid.getPostData());
postData.LaunchState = doLaunch === 1 ? "1" : "0";
postData.isCheckAll = true;
}
main.post("/underlying_manager/UpdateByIds", postData).done(function (res) {
jQuery('#listGrid').trigger("reloadGrid");
});
});
}
});
}
function updateLaunchStateForSTStock(doLaunch) {
main.confirm(doLaunch === 1 ? "确认启用所有ST股?" : "确认取消启用所有ST股?", function () {
var postData = { LaunchState: doLaunch === 1 ? "1" : "0" };
main.post("/underlying_manager/UpdateLaunchStateForSTStock", postData).done(function (res) {
jQuery('#listGrid').trigger("reloadGrid");
});
});
}
//导入预付金参数
function importMarginParams() {
main.infopage('标的预付金参数导入', "/underlying_manager/MarginParams");
}
function uploadChange() {
$('#uploadfileButton').val($('#uploadfile').val());
}
function upload() {
if (!$("#uploadfile").get(0).value.length) {
main.alert("请选择要上传的文件!");
return;
}
var fd = new FormData();
/*上传的文件file*/
fd.append("file", $("#uploadfile").get(0).files[0]);
$.ajax({
url: "/ex_dividend_info/ImportDividendInfo",
type: "POST",
processData: false,
contentType: false,
data: fd,
success: function (res) {
if (!res.success) {
main.alert(res.msg);
} else {
$("#uploadfile").val("");
$("#uploadfileButton").val("");
layer.closeAll();
main.message(res.msg);
}
},
beforeSend(jqXHR) {
main.waitMe(true);
},
complete(jqXHR, textStatus) {
main.waitMe(false);
}
});
}
function importDividendInfo() {
var htmlContent = `
<div style="padding:5px">
<span>文件:</span >
<input type="file" accept=".xlsx" id="uploadfile" style="display: none" onchange=uploadChange() >
<input style="width:90%; height: 28px; text-align: left;" type="button" id="uploadfileButton" onclick="$('#uploadfile').click();" value="请选择..." />
<div style="margin: 5px; float: right;">
<a class="btn btn-primary" href="/download/ImportTemplate/个股除权信息模板">下载模板</a>
<input type="button" class="btn btn-primary" onclick="upload()" value="上传文件">
</div>
</div>`;
main.open2("个股除权信息导入",
htmlContent,
{
area: ["400px", "130px"],
zIndex: 1000
});
}
//板块性质配置
function showBlockConfig() {
main.infopage('板块性质别名配置', '/UnderlyingBlock/UnderlyingBlockConfig');
}
function importUnderlying() {
$("#modalFileUpload").modal('show');
uploadfileInit();
$("#Content").width("680px")
}
function downTemplate() {
window.open("../App_Docs/导入模板/标的导入模板.xlsx");
}
function uploadUnderlying() {
let fileName = $("#uploadfileButton").val();
if (!fileName) {
return main.alert("请选择要导入的文件!");
}
let index = fileName.lastIndexOf(".");
let fileEx = index > 0 ? fileName.substr(index).toLowerCase() : '';
if (fileEx !== '.xlsx') {
return main.alert("只能上传.xlsx类型的文件!");
}
function success(data) {
if (data.success) {
_reloadData = 'reloadData';
main.alert(!data.totalNum ? '导入成功!' : "共 {0} 条数据,导入成功 {1} 条数据!".template(data.totalNum, data.successNum));
reloadunderlying_manager();
$("#modalFileUpload").modal('hide');
} else {
main.alert("导入失败:" + data.msg);
$("#modalFileUpload").modal('hide');
}
}
main.confirm("确定导入?", UploadFile.bind(null, { inputId: 'openFile', url: '/underlying_manager/UploadUnderlying', success: success }));
}
function UploadFile(options) {
if (!options || !options.url || !options.inputId) {
throw '[UploadFile]参数错误';
}
let file = $("#uploadfile").prop('files');
if (!file || !file[0]) return;
file = file[0];
var formData = new FormData();
formData.append("file", file, file.name);
formData.append("upload_file", true);
$.ajax({
type: "POST",
url: options.url,
xhr: function () {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
myXhr.upload.addEventListener('progress', options.progressFn, false);
}
return myXhr;
},
beforeSend() {
main.waitMe("show");
},
success: options.success,
error(error) {
main.alert("导入失败:" + error.statusText);
},
complete(result) {
main.waitMe("hide");
$('#' + options.inputId).val('');
},
async: true,
data: formData,
cache: false,
contentType: false,
processData: false,
timeout: 60000
});
}
window.reloadData = SearchClick;