//otcformat禁止千分位分组 window.otcformat.options.disableGrouping = true; const consVarieties = ylotc.varieties.filter(x => x.Name != "组合标的"); const consClients = ylotc.clients; const consTraders = page.traderList; const consAssetUnits = pageVue.CanSelectTrader ? ylotc.assetunits : ylotc.assetunits.filter(x => x.TraderIds.includes(pageVue.Trade.TraderId)); const consUnderlyingFlag = (function () { let unSelFlag = tradeHelper.UnderlyingSelectFlag; return unSelFlag.UseForTrading | unSelFlag.IncludeMatured | unSelFlag.CommodityFutures | unSelFlag.StockIF | unSelFlag.CommoditySpot | unSelFlag.CheckLaunch | unSelFlag.IncludeBasket | unSelFlag.IncludeSynthetic; }()); const consUnderlyingFlag2 = (function () { let unSelFlag = tradeHelper.UnderlyingSelectFlag; return unSelFlag.UseForTrading | unSelFlag.IncludeMatured | unSelFlag.CommodityFutures | unSelFlag.StockIF | unSelFlag.CommoditySpot | unSelFlag.CheckLaunch | unSelFlag.IncludeBasket; }()); //定价格式化(来自配置) const consFormat = otcformat.trading; const InputFormatPercent = Object.freeze({ precision: 2, append: '%' }); const InputFormatLots = Object.freeze({ precision: 2, append: '手' }); const InputFormatUmPrice = Object.freeze({ precision: consFormat.umprice.precision, append: '', negative: true }); const InputFormatOpenCommission = Object.freeze({ precision: consFormat.tradeSinglePrice.precision, append: '元/手', negative: true }); const InputFormatSinglePrice = Object.freeze({ precision: consFormat.tradeSinglePrice.precision, append: '' }); //预付金率输入格式 const inputFormatMarginRate = Object.freeze({ precision: consFormat.marginRateP.precision, append: '%' }); //表单提交处理 const submitHandler = (new function () { function checkDate(value) { let date = new Date(value); return date.valueOf(); } function checkSubmitData(trade) { if (!trade.UnderlyingId) { return "请设置标的信息"; } if (!trade.ClientId) { return "请设置客户名称"; } if (!trade.AssetId) { return "请设置簿记账户"; } if (!trade.TradeDate) { return '交易日期 必须填写'; } if (!checkDate(trade.TradeDate)) { return '交易日期 填写错误'; } //if (trade.TradeDate > pageVue.SysDate) { // return "交易日期不能是未来日期"; //} if (!trade.ExerciseDate) { return '到期日期 必须填写'; } if (!checkDate(trade.ExerciseDate)) { return '到期日期 填写错误'; } if (trade.TradeDate > trade.ExerciseDate) { return "交易日应该在到期日之前"; } if (trade.ExerciseDate > trade.MaturityDate) { return "到期日必需在标的到期日之前"; } if (checkDate(trade.SettlementDate) && trade.SettlementDate < trade.ExerciseDate) { return "结算日应该在到期日之前"; } if (vue.isShowActualExerciseDate && page.showZeQi) { if (!trade.MetaDic['ActualExerciseDate']) { return '实际到期日期 必须填写'; } if (!checkDate(trade.MetaDic['ActualExerciseDate'])) { return '实际到期日期 填写错误'; } if (trade.MetaDic['ActualExerciseDate'] > trade.MaturityDate) { return "实际到期日期到期日必需在标的到期日之前"; } if (trade.TradeDate > trade.MetaDic['ActualExerciseDate']) { return "交易日应该在实际到期日期之前"; } } if (!trade.BuySell) { return '交易方向 必须填写'; } let lots = parseFloat(trade.Lots) || 0; if (lots < 1e-5) { return '交易手数 必须大于0'; } let amount = parseFloat(trade.TradeAmount) || 0; if (amount < 1e-5) { return '交易数量 必须大于0'; } if (!trade.Strike) { return '交割价格 必须填写'; } if (!trade.SpotPrice) { return '期初标的价格 必须填写'; } } function setRemark(callback, trade, flag) { if (page.needRemark) { $("#extendInfo #editRemarks").val(""); layer.open({ type: 1, title: "请填写修改说明", shadeClose: false, shade: 0.4, area: ['600px', '280px'], content: $("#extendInfo"), btn: ['保存', '取消'], yes: function (index, layero) { var remark = $("#extendInfo #editRemarks").val(); if (!remark) { main.alert("交易编辑时,说明为必填字段"); return; } trade.MetaDic["remark"] = remark; callback(trade, flag); layer.close(index); }, cancel: function (index, layero) { layer.close(index); } }); } else { callback(trade, flag); } } this.checkData = function (trade) { let error = checkSubmitData(trade); if (error) { return main.alert(error); } return true; } this.saveTrade = function (trade, flag) { if (!flag) { setRemark(this.saveTrade, trade, 1); return; } let error = checkSubmitData(trade); if (error) { return main.alert(error); } trade.ObservationDates = $("#setObservationDatesBtn").data().observationdates; trade.ObservationStart = $("#setObservationDatesBtn").data().observationstart; trade.MetaDic["主协议编号"] = $("#MainProtocolCode").val(); trade.MetaDic["补充协议编号"] = $("#SupProtocolCode").val(); trade.MetaDic["中央对手方清算"] = $("#IsCentralClearing").val(); trade.MetaDic["中央清算平台"] = $("#CentralClearingPaltform").val(); trade.MetaDic["交易平台"] = $("#TradingPaltform").val(); trade.MetaDic["ExchangeRate"] = $("#ExchangeRate").val(); if (page.showCCR) { //if (trade.MarginTemplateName === "系统默认") { trade.MetaDic["ccr_k"] = trade.ccr_k; //} trade.MetaDic["ignoreRiskExposure"] = trade.ignoreRiskExposure; } var tags = new Array(); $(".tag-context .tag-item").each(function (i, v) { tags.push({ Id: $(v).data("id"), Name: $(v).data("name") }); }); trade.Tags = tags; $("#btn_save").prop('disabled', true); main.post("/forwardtrade/TradeEditJson", trade).done(function (resp) { window.location.href = "/trade/tradeview?abstract=1&enid=" + resp.obj.EncryptId; }).always(function () { $("#btn_save").prop('disabled', false); }); }; }()); var autoVariety, autoUnderlying, autoBasisUnderlying, salesCommissionCtrl; let autoMarginTemplateName; function __init(vue) { salesCommissionCtrl = new SalesCommissionCtrl(document.getElementById('salesCommissionCtrl'), pageVue.Trade.SalesCommission); //标的品种 autoVariety = FastVue.autocomplete(document.getElementById('VarietyId'), { lookup: consVarieties, nameField: 'Name', valueField: 'id', searchField: ['Name', 'Code', 'PinYin'], onSelect: function (data) { vue.changeVariety(data, 'select'); } }); //标的资产 autoUnderlying = tradeHelper.UnderlyingAutoComplete('UnderlyingCode', { BlackLimit: 1 }).setFlag(consUnderlyingFlag); autoUnderlying.onSelect(vue.changeUnderlying); autoBasisUnderlying = tradeHelper.UnderlyingAutoComplete('BasisUnderlyingCode', { BlackLimit: 1 }).setFlag(consUnderlyingFlag2); autoBasisUnderlying.onSelect(vue.changeBasisUnderlying); //组合标的控件 synthenticPriceCtrl.init({ getSynthetic(input) { return vue.viewState.synthetic; }, setSynthetic(input, synthetic) { vue.viewState.synthetic = synthetic; vue.trade.SpotPrice = synthetic.Price; vue.changeSpotPrice(); } }); //标的控件初始化 if (vue.trade.UnderlyingCode) { autoUnderlying.selectByCode(vue.trade.UnderlyingCode); } else { autoUnderlying.selectFirst(); } //挂钩标的初始化 if (vue.trade.BasisUnderlyingCode) { autoBasisUnderlying.selectByCode(vue.trade.BasisUnderlyingCode); } else { vue.updateKey.basisUnderlying = 1; } //交易员 if (pageVue.CanSelectTrader) { autoTrader = FastVue.autocomplete(document.getElementById('TraderId'), { nameField: 'Name', valueField: 'id', searchField: ['Name', 'PinYin'], lookup: consTraders, onSelect(data) { vue.trade.TraderId = data.id; vue.trade.TraderName = data.Name; } }); let traderId = pageVue.Trade.TraderId; let trader = traderId ? consTraders.find(x => x.id === traderId) : null; //if (!trader && pageVue.IsNew) { // trader = consTraders[0]; // trader && (vue.trade.TraderId = trader.id); //} autoTrader.setData(trader); } //簿记账户 let autoAssetUnit = FastVue.autocomplete(document.getElementById('AssetId'), { nameField: 'Name', valueField: 'id', searchField: ['Name', 'PinYin'], lookup: consAssetUnits, onSelect(data) { vue.trade.AssetId = data.id; } }); let assetId = pageVue.Trade.AssetId; let asset = assetId ? consAssetUnits.find(x => x.id === assetId) : null; if (!asset && pageVue.IsNew) { asset = consAssetUnits[0]; asset && (vue.trade.AssetId = asset.id); } autoAssetUnit.setData(asset); autoMarginTemplateName = FastVue.autocomplete(document.getElementById('MarginTemplateName'), { nameField: 'Text', valueField: 'Value', searchField: ['Text'], lookup: page.tradeMarginTemplateItems, onSelect(data) { vue.trade.MarginTemplateName = data.Value; vue.changeMarginTemplate(); } }); let marginTemplateName = pageVue.Trade.MarginTemplateName; let marginTemplate = marginTemplateName ? page.tradeMarginTemplateItems.find(x => x.Value === marginTemplateName) : null; if (!marginTemplate && pageVue.IsNew) { marginTemplate = page.tradeMarginTemplateItems[0]; marginTemplate && (vue.trade.MarginTemplateName = marginTemplate.Value); } autoMarginTemplateName.setData(marginTemplate); //客户名称 if (pageVue.CanSelectClient) { var width = 152; for (var i = 0; i < consClients.length; i++) { let ele = document.createElement('span') ele.innerText = consClients[i].Name; ele.style.fontSize = '14px'; document.documentElement.append(ele); var charLength = ele.offsetWidth + 28;//滚动条 document.documentElement.removeChild(ele); if (charLength > width) { width = charLength } } let autoClient = FastVue.autocomplete(document.getElementById('ClientId'), { nameField: 'Name', valueField: 'id', searchField: ['Name', 'PinYin'], width: width, lookup: consClients, onSelect: vue.changeClient }); let clientId = pageVue.Trade.ClientId; let client = clientId ? consClients.find(x => x.id === clientId) : null; !client && pageVue.IsNew && (client = consClients[0]); autoClient.setData(client); vue.changeClient(client); } if (!vue.trade.StructureType) { vue.trade.StructureType = "远期"; } $("#IsCentralClearing").val(vue.trade.MetaDic["中央对手方清算"]); $("#CentralClearingPaltform").val(vue.trade.MetaDic["中央清算平台"]); $("#TradingPaltform").val(vue.trade.MetaDic["交易平台"]); //远期组合标的时,需处理标的2的价格 if (vue.viewState.synthetic != null) { $("#SpotPrice2").val("").attr('disabled', 'disabled'); vue.trade.SpotPrice1 = vue.trade.SpotPrice; } } var vue = new Vue({ el: '#form1', data: { trade: pageVue.Trade, viewState: { variety: tradeHelper.getEmptyVariety(), underlying: tradeHelper.getEmptyUnderlying(), synthetic: null, Extend: { TradingPlace: "柜台市场", ClearingAgency: "交易员方" }, priceModel: page.ForwardTradePriceModel,//0=标准模式;1=挂钩标的模式 }, tradeMarginTemplates: page.tradeMarginTemplates, updateKey: { variety: 0, underlying: pageVue.IsNew ? 1 : 0, instrumentType: 0, basisUnderlying: pageVue.IsNew ? 1 : 0, client: 0 }, countRatio: 1, isShowActualExerciseDate: false, codes: [] }, created() { for ([k, v] of Object.entries(this.trade)) { v && k.endsWith('Date') && (this.trade[k] = v.substring(0, 10)); } if (this.trade.MetaDic['组合标的']) { this.viewState.synthetic = JSON.parse(this.trade.MetaDic['组合标的']); } this.viewState.Extend.TradingPlace = this.trade.MetaDic["交易场所"] || ""; this.viewState.Extend.ClearingAgency = this.trade.MetaDic["清算机构"] || ""; this.trade.ccr_k = this.trade.MetaDic["ccr_k"] || "1"; this.trade.ignoreRiskExposure = this.trade.MetaDic["ignoreRiskExposure"] || "0"; if (page.ForwardTradePriceModel === 0 && this.trade.MetaDic["期初信息"]) { var spotInfo = JSON.parse(this.trade.MetaDic["期初信息"]); this.trade.SpotPrice1 = spotInfo[0]; if (spotInfo.length > 1) { this.trade.SpotPrice2 = spotInfo[1]; } } if (page.ForwardValueIsSupplyOrPay === 2) { this.trade.MetaDic["IsSupplyForwardValue"] = this.trade.MetaDic["IsSupplyForwardValue"] == null ? "-1" : this.trade.MetaDic["IsSupplyForwardValue"]; } else { this.trade.MetaDic["IsSupplyForwardValue"] = this.trade.MetaDic["IsSupplyForwardValue"] == null ? "0" : this.trade.MetaDic["IsSupplyForwardValue"]; } this.calcForwardValue(); }, mounted() { __init(this); $("#MainProtocolCode").val(this.trade.MetaDic["主协议编号"]); $("#SupProtocolCode").val(this.trade.MetaDic["补充协议编号"]); let observationUnit = this.trade.MetaDic["敲入观察周期"]; if (observationUnit != null && observationUnit != undefined && observationUnit != "") { num = observationUnit.substring(0, observationUnit.length - 1); unit = observationUnit.substring(observationUnit.length - 1, observationUnit.length); unitStr = "天"; switch (unit) { case "W": unitStr = "周"; break; case "M": unitStr = "月"; break; case "Y": unitStr = "年"; break; } $("#ObservationRate").val("每" + num + unitStr).attr('lang', num + unit); } if (this.trade.UnderlyingCode != null) this.codes.push(this.trade.UnderlyingCode); if (this.trade.BasisUnderlyingCode != null) this.codes.push(this.trade.BasisUnderlyingCode); if (this.codes.length > 0) this.IsCodesExistsCommoditySpot(this.codes); }, methods: { //变更客户 changeClient(yldata) { let client = yldata || { id: 0 }; $("#IsCentralClearing").val(client.IsCentralClearing); $("#CentralClearingPaltform").val(client.CentralClearingPaltform); $("#TradingPaltform").val(client.TradingPaltform); this.clientCanSell = !!client.CanSell; this.trade.ClientId = client.id; !client.CanSell && (this.trade.BuySell = '卖出'); this.getMainProtocolCode(); if (pageVue.IsNew || this.updateKey.client !== 0) { salesCommissionCtrl.changeSalesmen(client.id); let data = page.tradeMarginTemplateItems[client.MarginOptionType == 3 ? 1 : 0]; this.trade.MarginTemplateName = data.Value; autoMarginTemplateName.setData(data); this.changeMarginTemplate(); } this.updateKey.client++; this.resetTradePrice(true); }, //变更标的类型 changeInstrumentType() { let nowTime = new Date().getTime(); if (nowTime < this.updateKey.variety + 300 || nowTime < this.updateKey.underlying + 300) return; this.updateKey.instrumentType = nowTime; autoUnderlying.selectFirst({ InstrumentTypes: [this.trade.UnderlyingInstrumentType] }); }, //设置标的品种 changeVariety(variety, flag) { if (flag === 'select') { if (this.viewState.variety.id === variety.id) return; this.updateKey.variety = new Date().getTime(); this.trade.UnderlyingInstrumentType = variety.InstrumentType; this.trade.QuoteCurrency = this.viewState.variety.QuoteCurrency; autoUnderlying.setVarietyId(variety.id); Object.assign(this.viewState.underlying, tradeHelper.getEmptyUnderlying(variety.id)); autoUnderlying.selectFirst(variety.id); } else { this.trade.QuoteCurrency = variety?.QuoteCurrency; autoVariety.setData(variety); } Object.assign(this.viewState.variety, variety || tradeHelper.getEmptyVariety()); this.countRatio = variety.CountRatio; this.calcForwardValue(); }, //变更标的 changeUnderlying(data) { if (data.id == 0) { return; } let trade = this.trade; let editFirst = this.updateKey.underlying === 0; this.updateKey.underlying = new Date().getTime(); Object.assign(this.viewState.underlying, data); trade.UnderlyingId = data.id; trade.UnderlyingCode = data.Code; this.trade.UnderlyingCode = trade.UnderlyingCode; trade.UnderlyingInstrumentType = data.InstrumentType; $('#UnderlyingCode').attr('title', data.Code); autoUnderlying.setVarietyId(data.VarietyId); this.changeVariety(data.VarietyId ? ylotc.varieties.find(x => x.id === data.VarietyId) : null); if (editFirst) { return; } if (data.IsSynthetic) { this.$nextTick(() => { }); this.clearBasisUnderlyingCode(); this.getSyntheticPrices(data.Code, trade.TradeDate); $("#SpotPrice2").attr('disabled', 'disabled'); } else { this.getSpotPrice(); $("#SpotPrice2").removeAttr('disabled'); this.viewState.synthetic = null; } this.changeLots(); }, changeTradeDate() { this.getNoRiskRate(); this.getSpotPrice(); }, changeExerciseDate() { if (this.trade.SettlementDate !== this.trade.ExerciseDate) { this.trade.SettlementDate = this.trade.ExerciseDate; } this.getNoRiskRate(); }, changeActualExerciseDate() { }, //获取无风险利率 getNoRiskRate() { var self = this; main.post("/pricing/AjaxGetNoRiskRate", { startDate: this.trade.TradeDate, endDate: this.trade.ExerciseDate }).done(function (resp) { self.trade.NoRiskRate = resp.obj.toFixed(4); }); }, //变更挂钩标的 changeBasisUnderlying(data) { let trade = this.trade; let editFirst = this.updateKey.basisUnderlying === 0; this.updateKey.basisUnderlying = 1; autoBasisUnderlying.setFlag(consUnderlyingFlag); trade.BasisUnderlyingId = data.id; trade.BasisUnderlyingCode = data.Code; $('#BasisUnderlyingCode').attr('title', data.Code); if (editFirst) { return; } //todo 计算期初价格 期初价格 = 挂钩标的价格 + 基差 this.getSpotPrice(); }, //清空挂钩标的 clearBasisUnderlyingCode() { autoBasisUnderlying.setValue(''); this.trade.BasisUnderlyingId = ''; this.trade.BasisUnderlyingCode = ''; this.getSpotPrice(); this.trade.BasisGap = 0; this.trade.SpotPrice2 = ""; }, //变更基差 changeBasisGap() { this.getSpotPrice(); }, changeCustomPrice() { var price = this.trade.SpotPrice1; if (this.trade.BasisUnderlyingCode) { price = price - this.trade.SpotPrice2; } this.trade.SpotPrice = consFormat.umprice(price); this.changeSpotPrice(); }, //变更预付金模板 changeMarginTemplate() { if (this.trade.MarginTemplateName === "系统默认") { this.trade.MarginType = 0; this.trade.MarginRate = 0; this.trade.PositionMarginRate = 0; } else if (this.trade.MarginTemplateName === "无预付金") { this.trade.MarginType = 1; this.trade.MarginRate = 0; this.trade.PositionMarginRate = 0; } else { this.tradeMarginTemplates.forEach(x => { if (this.trade.MarginTemplateName === x.Name) { this.trade.MarginType = x.MarginType; this.trade.MarginRate = x.InitialMarginRatio; if (this.trade.MarginType == 3) { this.trade.PositionMarginRate = 0; } else { this.trade.PositionMarginRate = x.PositionMarginRatio; } } }); } }, //获取组合标的价格 getSyntheticPrices(underlyingCode, tradedate) { let self = this; main.post('/pricing/AjaxGetSyntheticPriceModel', { underlyingCode: underlyingCode, tradedate: tradedate }, false).done(function (resp) { self.viewState.synthetic = resp.obj; }); }, syntheticUnderlyingSetting() { if (!this.viewState.synthetic || !this.trade.UnderlyingCode) { return; } var url = "/SyntheticUnderlying/SyntheticUnderlyingView?syntheticUnderlyingName=" + encodeURIComponent(this.trade.UnderlyingCode); main.open("合成价差期权标的设置", url, {}); }, //变更多头空头 changeOptionType() { this.resetTradePrice(true); }, //计算远期价值 //(交割价格- 期初价格) * 成交数量 * CountRatio *(多-1,空1)]*(买入1,卖出 - 1) calcForwardValue() { let forwardValue = ((parseFloat(this.trade.Strike || 0)) - parseFloat((this.trade.SpotPrice || 0))) * this.trade.TradeAmount * this.countRatio * (this.trade.OptionType == "看涨" ? -1 : 1) * (this.trade.BuySell == "买入" ? 1 : -1); this.trade.ForwardValue = consFormat.umprice(forwardValue); return forwardValue; }, //重置开仓总费用 //补偿远期价值+开仓费用 resetTradePrice(blCalcForwardValue) { let forwardValue = blCalcForwardValue ? this.calcForwardValue() : parseFloat(this.trade.ForwardValue); let supplyPrice = this.trade.MetaDic["IsSupplyForwardValue"] == "1" ? forwardValue : this.trade.MetaDic["IsSupplyForwardValue"] == "-1" ? -forwardValue : 0; let tradePrice = supplyPrice + this.trade.OpenCommission * this.trade.Lots; this.trade.TradePrice = consFormat.TradePrice(tradePrice); }, //变更交易手数 changeLots() { this.trade.Notional = consFormat.notional(this.trade.Lots * this.viewState.underlying.ContractSize); this.trade.OriginalNotional = this.trade.Notional; this.trade.TradeAmount = consFormat.notional(this.trade.Lots * this.viewState.underlying.ContractSize / this.viewState.underlying.CountRatio); this.resetTradePrice(true); }, //变更交易数量 changeTradeAmount() { this.trade.Lots = _.round(this.trade.TradeAmount * this.viewState.underlying.CountRatio / this.viewState.underlying.ContractSize, InputFormatLots.precision); this.trade.Notional = consFormat.notional(this.trade.TradeAmount * this.viewState.underlying.CountRatio); this.trade.OriginalNotional = this.trade.Notional; this.resetTradePrice(true); }, //获取期初价格 getSpotPrice() { if (this.viewState.priceModel === 0) { this.getSpotPriceStandardMode(); } else { this.getSpotPriceHookPriceMode(); } }, getSpotPriceStandardMode() { var self = this; this.getPrice(this.trade.UnderlyingCode, (obj) => { self.trade.SpotPrice1 = consFormat.umprice(Number(obj.price)); self.trade.SpotPrice = consFormat.umprice(Number(self.trade.SpotPrice1 || 0) - Number(self.trade.SpotPrice2 || 0)); self.viewState.synthetic = obj.synthetic; self.changeSpotPrice(false); }); if (this.trade.BasisUnderlyingCode) { this.getPrice(this.trade.BasisUnderlyingCode, (obj) => { self.trade.SpotPrice2 = consFormat.umprice(Number(obj.price)); self.trade.SpotPrice = consFormat.umprice(Number(self.trade.SpotPrice1 || 0) - Number(self.trade.SpotPrice2 || 0)); self.changeSpotPrice(false); }); } }, getSpotPriceHookPriceMode() { var self = this; if (this.trade.BasisUnderlyingCode) { this.getPrice(this.trade.BasisUnderlyingCode, (obj) => { self.trade.SpotPrice = consFormat.umprice(Number(obj.price) + Number(self.trade.BasisGap || 0)); self.changeSpotPrice(false); }); } else { this.getPrice(this.trade.UnderlyingCode, (obj) => { self.trade.SpotPrice = consFormat.umprice(obj.price); self.changeSpotPrice(false); }); } }, //获取标的价格 getPrice(underlyingCode, doneCallback) { main.post("/pricing/AjaxGetUnderlyingPrice", { underlyingCode: underlyingCode, tradeDate: this.trade.TradeDate }) .done(function (resp) { if (typeof (doneCallback) === 'function') { doneCallback(resp.obj); } }); }, //变更期初价格 changeSpotPrice() { let SpotPrice = this.trade.SpotPrice || 0; if (!SpotPrice || SpotPrice === '-') { SpotPrice = 0; } else { let precision = consFormat.umprice.precision || 0; if (precision < 2) precision = 2; let regex = new RegExp('^-?\\d*(\\.\\d{0,' + precision + '})?'); let match = regex.exec(SpotPrice); if (match) { if (match[0] !== SpotPrice) { this.trade.SpotPrice = match[0]; SpotPrice = parseFloat(match[0]); } } else { this.trade.SpotPrice = SpotPrice = 0; } } if (this.viewState.underlying.IsSynthetic) { this.trade.SpotPrice1 = this.trade.SpotPrice; } this.resetTradePrice(true); }, changeSupplyForwardValue() { this.resetTradePrice(true); }, blurSpotPrice() { !this.trade.SpotPrice && (this.trade.SpotPrice !== 0) && (this.trade.SpotPrice = 0); }, getPriceTick() { return this.viewState.variety ? parseFloat(this.viewState.variety.PriceTick) || 0.1 : 0.1; }, //变更交割价格 changeStrike() { this.resetTradePrice(true); }, //名义本金 保存交易的时候会重新计算 --- 这个是为了计算浙期的初始预付金 //priceModel 基差价差 名义本金 取 最大 changeStockEqvNotional() { if (this.viewState.priceModel === 0 && this.trade.SpotPrice1 != null && this.trade.SpotPrice2 != null) { let SpotPrice1 = parseFloat(this.trade.SpotPrice1 || 0); let SpotPrice2 = parseFloat(this.trade.SpotPrice2 || 0); if (SpotPrice1 > SpotPrice2) { this.trade.StockEqvNotional = consFormat.StockEqvNotional(this.trade.SpotPrice1 * this.trade.Notional); } else { this.trade.StockEqvNotional = consFormat.StockEqvNotional(this.trade.SpotPrice2 * this.trade.Notional); } } }, saveTrade() { this.trade.SalesCommission = salesCommissionCtrl.getValue(); if (this.viewState.synthetic) { this.trade.MetaDic["组合标的"] = JSON.stringify(this.viewState.synthetic); } else { delete this.trade.MetaDic["组合标的"]; } if (this.viewState.priceModel === 0) { var spotInfo = [consFormat.umprice(this.trade.SpotPrice1)]; if (this.trade.BasisUnderlyingCode) { spotInfo.push(consFormat.umprice(this.trade.SpotPrice2)); } this.trade.MetaDic["期初信息"] = JSON.stringify(spotInfo); } else { delete this.trade.MetaDic["期初信息"]; } this.trade.MetaDic["敲入观察周期"] = $("#ObservationRate").attr('lang'); submitHandler.saveTrade(this.trade); }, //获取系统计算的初始预付金 getInitialMargin() { var self = this; this.changeStockEqvNotional(); //检查数据 if (!submitHandler.checkData(this.trade)) { return false; } main.post("/forwardtrade/AjaxGetInitialMargin_Forward", { trade: this.trade }) .done(function (resp) { if (pageVue.ClientUsedForCalc && pageVue.TwoSideMargin && !self.viewState.TwoSideMargin && resp.obj < 0) { self.trade.InitialMargin = 0; } else { self.trade.InitialMargin = consFormat.TradePrice(resp.obj); } }); }, //变更开仓费用 changeOpenCommission() { this.resetTradePrice(); }, //变更开仓总费用 //开仓费用 = (开仓总费用 -(补充远期价值))/ 手数 changeTradePrice() { let supplyPrice = this.trade.MetaDic["IsSupplyForwardValue"] == "1" ? this.trade.ForwardValue : this.trade.MetaDic["IsSupplyForwardValue"] == "-1" ? -this.trade.ForwardValue : 0; this.trade.OpenCommission = consFormat.TradePrice((parseFloat(this.trade.TradePrice) - parseFloat(supplyPrice)) / this.trade.Lots); }, //变更交易场所 changeTradingPlace() { this.trade.MetaDic["交易场所"] = this.viewState.Extend.TradingPlace; }, //变更清算机构 changeClearingAgency() { this.trade.MetaDic["清算机构"] = this.viewState.Extend.ClearingAgency; }, changeObservationRemark1(Comments) { if (Comments != "" || this.trade.MetaDic["ObservationRemark1"] != undefined) this.trade.MetaDic["ObservationRemark1"] = Comments; }, getObservationRemark1() { return this.trade.MetaDic["ObservationRemark1"]; }, changeMainProtocolCode() { this.getSupProtocolCode(); }, getMainProtocolCode() { $("#MainProtocolCode option").remove(); main.post("/Client/getMainProtocolCodes", { clientId: $("#ClientId").val() }, { async: false }).done(function (resp) { var obj = $("#MainProtocolCode"); _.forEach(resp, (v) => { obj.append(""); }) }); this.getSupProtocolCode() }, getSupProtocolCode() { $("#SupProtocolCode option").remove(); if ($("#MainProtocolCode").val()) { main.post("/Client/getSideProtocols", { mainProtocol: $("#MainProtocolCode").val() }, { async: false }).done(function (resp) { var obj = $("#SupProtocolCode"); _.forEach(resp, (v) => { obj.append(""); }) }); } }, //交易审批 submit(status) { var pop = ''; if (status === 'pass') { pop = "确认通过审批?"; } if (status === 'reject') { pop = "确认拒绝?"; } var confirmFunc = function (additionalProcessing) { var pData = { tradeId: pageVue.Trade.id, status: status, text: "" }; if (!main.isEmpty(additionalProcessing)) { pData.additionalProcessing = additionalProcessing; } main.post("/processtradelog/UpdateTradeProcessLog", pData).done( function (data) { if (data.obj && data.obj.proccessType == "AdditionalProcessing") { if (data.obj.type == "LackOfMoney") { var htmlContent = `
${data.obj.message}
`; var lackMoneyConfirmLayer = main.open2("提示", htmlContent, { area: ["430px", "175px"], btn: ['交易特批', '取消'], yes: function (index, layero) { var layerIndex = lackMoneyConfirmLayer; main.confirm("客户资金或授信不足,强制成交会导致本机构产生风险!要继续审批通过?", function () { layer.close(layerIndex); confirmFunc("LackOfMoney"); }); }, cancel: function (index, layero) { if (window.parent && window.parent.reloadtrade) { window.parent.reloadtrade(); } (parent || window).layer.closeAll(); } }); console.log("lackMoneyConfirmLayer:" + lackMoneyConfirmLayer); } return; } (parent || window).main.message(data.msg); if (page.generateAmendDoc) { if (data.obj && data.obj.generateChangeSuccess) { main.downloadFiles(data.obj.url); try { window.parent.reloadtrade(); } catch (e) { } } } if (page.needSendChangeEmail) { if (data.obj && data.obj.generateChangeSuccess) { main.confirm("确认发送变更确认书?", function () { main.post("/trade/SendChangeConfirmEmails", { tradeids: tradeId }).done( function (data) { if (data.success) { main.message("发送成功"); } else { main.message(data.msg); } try { window.parent.reloadtrade(); } catch (e) { } }); }); } else { try { window.parent.reloadtrade(); } catch (e) { } } } else { try { window.parent.reloadtrade(); } catch (e) { } } if (parent) { parent.layer.closeAll(); } }); } main.confirm(pop, confirmFunc); }, IsCodesExistsCommoditySpot(codes) { //判断标的是否为现货 var flag = tradeHelper.IsCodesExistsCommoditySpot(codes); if (flag) { this.isShowActualExerciseDate = true; } else { this.isShowActualExerciseDate = false; } } }, computed: { showMaturityDate() { return this.viewState.underlying.InstrumentType === 'CommodityFutures'; }, showRunHe() { return page.showRunHe; }, isShowActualExerciseDate() { return this.isShowActualExerciseDate && pageData.showZheQi; }, maxTradeDate() { let exerciseDate = this.trade.ExerciseDate; return exerciseDate;// && exerciseDate <= pageVue.SysDate ? exerciseDate : pageVue.SysDate; }, inputFormatTradeAmount() { let fmt = { precision: consFormat.notional.precision, append: '' }; let variety = this.viewState.variety; if (variety) { var QuoteUnit = variety.QuoteUnit; var unit = QuoteUnit.substring(QuoteUnit.lastIndexOf('/') + 1).trim(); fmt.append = unit === "500千克" ? "吨" : unit || ''; } return fmt; }, Compositespread() { return this.trade.TradeType === "合成价差期权"; } }, watch: { 'trade.UnderlyingCode': { handler(newVal, oldVal) { //if (this.codes.length > 0) { // this.codes.splice(this.codes.length - 1, 1); //} if (newVal !== null && newVal !== "") { this.codes[0] = newVal; } this.IsCodesExistsCommoditySpot(this.codes); }, immediate: false }, 'trade.BasisUnderlyingCode': { handler(newVal, oldVal) { //if (this.codes.length == 2) { // this.codes.splice(1, 1); //} if (newVal !== null && newVal !== "") { this.codes[1] = newVal; } else { delete this.codes[1]; this.codes.length = 1; } this.IsCodesExistsCommoditySpot(this.codes); }, immediate: false } }, components: { 'vue-datepicker': FastVue.vueDatePicker(), 'vue-number-input': FastVue.vueNumberInput() } }); //ESC $(document).keyup(function (event) { if (event.keyCode === 27) { window.parent.layer.closeAll(); } }); function setObservationDates(thisobj) { var endTime = $("[name = 'TradeEndDate']").val(); var meg = "到期日期"; if ($("#UnderlyingInstrumentType").val() == "CommoditySpot" && page.showZeQi) { endTime = $("[name = 'ActualExerciseDate']").val(); meg = "实际到期日期"; } if (main.isEmpty(endTime)) { main.message(`请输入${meg}`); return false; } var tradeDate = $("[name = 'TradeDate']").val(); var startTime = $(thisobj).data("observationstart"); if (main.isEmpty(startTime)) { startTime = endTime; } var observationDates = $(thisobj).data("observationdates"); var observationNum = $(thisobj).data("observationnum"); var observationUnit = $(thisobj).data("observationunit"); var observationHolidayType = $(thisobj).data("observationholidaytype"); var btnId = $(thisobj).attr('id'); sessionStorage.setItem(btnId + "_observationdates", observationDates); var Comments = vue.getObservationRemark1(); Comments = Comments == undefined ? "" : Comments; let ObservationRate = $("#ObservationRate").attr('lang'); if (ObservationRate != null && ObservationRate != undefined && ObservationRate != "") { num = ObservationRate.substring(0, ObservationRate.length - 1); unit = ObservationRate.substring(ObservationRate.length - 1, ObservationRate.length); observationNum = num; observationUnit = unit; } layer.open({ type: 2, title: "均价结算设置", shadeClose: false, shade: 0.4, area: ['500px', '560px'], content: "/trade/tradeAveragePriceDates?observationNum=" + observationNum + "&observationUnit=" + observationUnit + "&observationHolidayType=" + observationHolidayType + "&startTime=" + startTime + "&endTime=" + endTime + "&tradeDate=" + tradeDate + "&btnId=" + btnId + "&Comments=" + Comments }); } // 设置观察日窗口返回的函数 function getObservationDatesSetting(startTime, observationNum, observationUnit, observationHolidayType, observationDates, alignEnd, btnId, Comments) { $("#" + btnId).data("observationdates", observationDates); $("#" + btnId).data("observationnum", observationNum); $("#" + btnId).data("observationunit", observationUnit); $("#" + btnId).data("observationholidaytype", observationHolidayType); $("#" + btnId).data("alignend", alignEnd); $("#" + btnId).data("observationstart", startTime); var observationUnitStr = "天"; switch (observationUnit) { case "W": observationUnitStr = "周"; break; case "M": observationUnitStr = "月"; break; case "Y": observationUnitStr = "年"; break; } $("#ObservationRate").val("每" + observationNum + observationUnitStr).attr('lang', observationNum + observationUnit); vue.changeObservationRemark1(Comments); }