//标的价格控制 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 = ""; 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 = "".template(rowObject.EncryptId, "查看", rowObject.CommodityCode, rowObject.UnderlyingCode); if (rowObject.CommodityCode === "篮子标的") { html += "".template(rowObject.id, "报价参数", rowObject.UnderlyingCode, rowObject.LaunchState || '0'); } else { html += "".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 = "".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 = ""; 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 = `
文件:
下载模板
`; 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;