using iTextSharp.text; using iTextSharp.text.pdf; using Qdp.Pricing.Base.Enums; using RazorEngineCore; using System.Data; using System.Drawing; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Web.Mvc; using YLErp.BLL.Eod; using YLErp.BLL.MarginCalculation; using YLErp.Commons; using YLErp.Configuration; using YLErp.DBModels.Abstract; using YLErp.DBModels.Consts; using YLErp.DBModels.Converts; using YLErp.DBModels.Enums; using YLErp.DBModels.Helpers; using YLErp.Enums; using YLErp.Model.Enum; using YLErp.Models.Tag; using YLErp.Modules.ApprovalModule; using YLErp.Modules.CalculationModule; using YLErp.Modules.ClientModule; using YLErp.Modules.DataProviderModule; using YLErp.Modules.DictionaryModule; using YLErp.Modules.EodModule; using YLErp.Modules.FinancialModule; using YLErp.Modules.ReportModule; using YLErp.Modules.RiskModule; using YLErp.Modules.SalesModule; using YLErp.Modules.StructureModule; using YLErp.Modules.SystemModule; using YLErp.Modules.TagModule; using YLErp.Modules.TagModule.Dto; using YLErp.Modules.TradeDalModule; using YLErp.Modules.TradeModule; using YLErp.Modules.TradeModule.AccumulatorOptionModule; using YLErp.Modules.TradeModule.DealModule; using YLErp.Modules.TradeModule.DocGenerateModule; using YLErp.Modules.TradeModule.ExoticOptionModule; using YLErp.Modules.TradeModule.OrderModule; using YLErp.Modules.TradeModule.QueryModule; using YLErp.Modules.TradeModule.Structure_dz; using YLErp.Modules.TradeRiskCalcModule; using YLErp.Modules.UnderlyingModule; using YLErp.Modules.VolatilityModule; using YLErp.Office; using YLErp.Office.iTextModule; using YLErp.QdpModule; using ExcelHelper = YLErp.Commons.ExcelHelper; namespace YLErp.Web.Controllers { public partial class tradeController : OtcTradeControllerBase { private readonly YLContext db = new YLContext(); private readonly IYcLogger _logger; public tradeController() { _logger = LogFactory.GetLogger(); } public ActionResult tradeListInner(string ucode, string TradeType, int? BookId, string ExchangeOptionCode) { var trades = db.trade.Where(t => t.ValidState != "InValid" && t.UnderlyingCode == ucode && ConsTrade.TradeTypesForHedge.Contains(t.TradeType) && t.TradeType == TradeType).ToList(); if (BookId > 0) { trades = trades.Where(t => t.AssetId == BookId).ToList(); } if (!string.IsNullOrWhiteSpace(ExchangeOptionCode) && ExchangeOptionCode != "null") { trades = trades.Where(t => t.ExchangeOptionCode == ExchangeOptionCode).ToList(); } trades.ForEach(r => { r.LotsNewInfo = TradeLotsCalc.GetLots(r.UnderlyingCode, r.Notional); }); return View(trades); } public ActionResult PickSingletrade() { return View(); } //---------------------- tradeList-------------------- /// /// 交易搜索 /// /// /// 1:期权交易;2:标的交易 /// [MyAuthorize("交易管理-交易搜索")] public ActionResult tradeList(int? tabIndex, int sourceType = 1, string settleDate = null, string tradeType = null) { if (tabIndex <= 0 || tabIndex == null) { ViewBag.TabIndex = (int)TradeTabIndexEnum.场外成交记录; } else if (tabIndex == (int)TradeTabIndexEnum.场内成交记录) { ViewBag.sourceType = sourceType; return View("~/Views/ExchangeTrade/OptionTradeList.cshtml", sourceType); } else { ViewBag.TabIndex = tabIndex; } ViewBag.settleDate = settleDate; ViewBag.TradeType = tradeType; return View(); } [MyAuthorize("结算管理-行权日报告")] public ActionResult maturityDateTradeList() { return View(); } [MyAuthorize("结算管理-客户平仓到期报告")] public ActionResult dayUnwindReport() { ViewBag.valueDate = valuedateBLL.ValueDate.ToString("yyyy-MM-dd"); return View(); } public ActionResult clientMaturityDateTradeList() { return View(); } [MyAuthorize("风险控制-情景分析")] public ActionResult tradeScenario() { return Redirect("/ScenarioAnalysis/tradescenario"); } #region 财务汇总 [MyAuthorize("结算管理-财务汇总")] public ActionResult FinancialSummary() { if (PS.Config.Is广发商贸) { return Redirect("/trade/FinancialSummary_GF"); } var date = QdpCalendarHelper.GetNonHoliday(valuedateBLL.ValueDate.AddDays(-1)); var startDate = date.AddDays(1 - date.Day); startDate = QdpCalendarHelper.GetNonHoliday(startDate); ViewBag.CurrentPeriodStart = startDate.ToString("yyyy-MM-dd"); ViewBag.CurrentDate = date.ToString("yyyy-MM-dd"); var endDate = db.eodStatus.Where(O => O.Status == "已收盘").Select(O => O.ValueDate).OrderByDescending(O => O).FirstOrDefault(); if (endDate == default) { endDate = valuedateBLL.ValueDate; } ViewBag.MonthFirstDay = new DateTime(endDate.Year, endDate.Month, 1).ToString("yyyy-MM-dd"); ViewBag.LastValueDate = endDate.ToString("yyyy-MM-dd"); ViewBag.SummaryType = "场外期权"; return View(); } /// /// 广发定制财务汇总页面 /// /// [MyAuthorize("结算管理-财务汇总")] public ActionResult FinancialSummary_GF() { var date = QdpCalendarHelper.GetNonHoliday(valuedateBLL.ValueDate.AddDays(-1)); var startDate = date.AddDays(1 - date.Day); startDate = QdpCalendarHelper.GetNonHoliday(startDate); ViewBag.CurrentPeriodStart = startDate.ToString("yyyy-MM-dd"); ViewBag.CurrentDate = date.ToString("yyyy-MM-dd"); var endDate = db.eodStatus.Where(O => O.Status == "已收盘").Select(O => O.ValueDate).OrderByDescending(O => O).FirstOrDefault(); if (endDate == default) { endDate = valuedateBLL.ValueDate; } ViewBag.MonthFirstDay = new DateTime(endDate.Year, endDate.Month, 1).ToString("yyyy-MM-dd"); ViewBag.LastValueDate = endDate.ToString("yyyy-MM-dd"); ViewBag.SummaryType = "场外期权"; return View(); } public ActionResult FinancialCodeMaintenance() { if (!CurUser.HasRight("结算管理-财务编码维护")) { return JsonError("无权限"); } var NeedMaintenance = new List() { "用友客商编码", "财务凭证排除客户项", "财务凭证明细段", "用友科目编码" }; var list = (from o in new ErpBaseContext().Dictionaries.AsNoTracking() where NeedMaintenance.Contains(o.Name) select o).ToList().OrderBy(n => n.Id).ToList(); return View(list); } /// /// 导入用友客商 /// public ActionResult YonYouClientCodeUpload() { return View(); } /// /// 导入用友客商信息 /// public ActionResult UploadYonYouClientCodeMain(string importWay, string MasterType) { if (Request.Form.Files.Count == 0) { return JsonError("缺少上传文件"); } var file = Request.Form.Files[0]; var fileExt = Path.GetExtension(file.FileName)?.ToLowerInvariant(); var optService = new YYClientCodeMaintenanceService(CurUser); List items; var result = HandleResult.Success; var needDeleteAll = importWay == "Full"; try { if (fileExt == ".csv") { items = GetYonYouClientCode(file, MasterType, needDeleteAll); } else if (fileExt == ".xlsx") { items = GetYonYouClientCodeFromExcel(file, needDeleteAll); } else { return JsonError("请上传xlsx或csv格式文件"); } if (needDeleteAll) { result = optService.DeleteAllYonYouClientCode(); } if (result.IsSuccess) { result = optService.UploadYYClientCodeToDb(items); } if (result.IsSuccess) { return JsonSuccess("导入成功"); } else { return JsonError(result.Message); } } catch (Exception ex) { return JsonError(ex.Message); } } public List GetYonYouClientCode(IFormFile file, string MasterType, bool needDeleteAll) { var fileName = ""; //上传交易存储目录 var MainUploadPath = "/App_Upload/Salesman"; var filePathName = string.Empty; if (Request.Form.Files.Count == 0) { throw new ServiceException("保存失败"); } try { //上传同名文件会覆盖 fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + file.FileName; var directoryName = string.Format("{1}{0}/", MasterType, MainUploadPath); filePathName = directoryName + fileName; //自行处理保存 var pafile = Server.MapPath(directoryName); if (!Directory.Exists(pafile)) { Directory.CreateDirectory(pafile); } //Request.Form.Files[0].FileName var pa = Server.MapPath(filePathName); file.SaveAs(pa); //把文件上传到服务器的绝对路径上 var result = new YYClientCodeMaintenanceService(CurUser).GetYonYouClientCodeFormCsv(pa, needDeleteAll); return result; } catch (Exception ex) { LogFactory.GetLogger(nameof(ClientController)).Error("UploadYonYouClientCode", ex); throw new ServiceException(ex.Message); }; } public List GetYonYouClientCodeFromExcel(IFormFile file, bool needDeleteAll) { try { using var openStream = file.OpenReadStream(); var result = new YYClientCodeMaintenanceService(CurUser).GetYonYouClientCodeFromExcel(openStream, CurUser.UserId, CurUser.UserName, needDeleteAll); return result; } catch (Exception ex) { LogFactory.GetLogger(nameof(ClientController)).Error("UploadYonYouClientCodeExcel", ex); throw new ServiceException(ex.Message); } } public ActionResult ExportYonYouClientCode() { var fileContent = new YYClientCodeMaintenanceService(CurUser).ExportYYClientCode(); return File(fileContent, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"用友客商编码{DateTime.Today:yyyyMMdd}.xlsx"); } #endregion public ActionResult SaveConfirmDate(int tradeCashId, DateTime confirmDate) { var info = Return.Fail("未知错误"); try { using (var db = new YLContext()) { var tradecash = (from tcDb in db.trade_cash where tcDb.id == tradeCashId && !tcDb.IsDeleted select tcDb).FirstOrDefault(); if (tradecash == null) { info = Return.Fail("交易不存在"); } else { tradecash.ConfirmDate = confirmDate; db.SaveChanges(); info = Return.Success(tradecash); } } } catch (Exception) { } return Json(info); } [MyAuthorize("结算管理-财务汇总")] public SearchListResult FinancialSummary_Exchange(FinancialSummaryModelReq req) { return tradeBLL.SearchExchangeTrade(req); } public JsonResult FinancialSummaryQuery(FinancialSummaryModelReq req) { if (req.CurrentPeriodDateStart == default || req.CurrentPeriodDateEnd == default) { return Json("本期区间值不应为空"); } req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); object result; switch (req.SummaryType) { case "场内期权": result = FinancialSummary_Exchange(req); break; case "远期/掉期": case "场外期权": case "互换": default: result = new CJFinancialVoucherService(CurUser).FinancialSummary_Option(req); break; } return Json(result); } public JsonResult UnitSummaryQuery(FinancialSummaryModelReq req) { if (req.CurrentPeriodDateStart == default || req.CurrentPeriodDateEnd == default) { return Json("本期区间值不应为空"); } req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var financialSummaryOptions = new FinancialVoucherService(CurUser).GatherUnitData(req); // var exchangeOption = FinancialSummary_Exchange(req); //簿记品种维度处理 return Json(financialSummaryOptions); } /// /// 广发定制财务汇总数据查询 /// /// /// public JsonResult FinancialSummaryQuery_GF(FinancialSummaryModelReq req) { if (req.CurrentPeriodDateStart == default || req.CurrentPeriodDateEnd == default) { return Json("本期区间值不应为空"); } req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); object result; switch (req.SummaryType) { case "场内期权": result = FinancialSummary_Exchange(req); break; case "远期/掉期": case "场外期权": case "互换": default: result = new FinancialVoucherService(CurUser).GatherClientData(req); break; } return Json(result); } #region 导出财务凭证 public ActionResult DownloadFinancialVoucher(FinancialVoucherReq req) { try { byte[] buffer = null; var list = new List(); var outputName = ""; var financialVoucherSv = new YYFinancialVoucherService(CurUser); switch (req.VoucherType) { case FinancialVoucher_YongYouEnum.DepositWithdraw: list = financialVoucherSv.GetCashInOutData(req); outputName = $"用友-客户出金入金{DateTime.Now:yyyy-MM-dd-ssss}.xlsx"; break; case FinancialVoucher_YongYouEnum.OTCConfirmed: list = financialVoucherSv.GetOTCConfirmedData(req); outputName = $"用友-商品场外期权-成交{DateTime.Now:yyyy-MM-dd-ssss}.xlsx"; break; case FinancialVoucher_YongYouEnum.OTCTermination: list = financialVoucherSv.GetOTCMaturityData(req); outputName = $"用友-商品场外期权-提前终止、部分提前终止{DateTime.Now:yyyy-MM-dd-ssss}.xlsx"; break; case FinancialVoucher_YongYouEnum.OTCMaturity: list = financialVoucherSv.GetOTCTerminationData(req); outputName = $"用友-商品场外期权-到期、部分到期{DateTime.Now:yyyy-MM-dd-ssss}.xlsx"; break; default: break; } if (list == null || list.Count == 0) { return ShowError("没有可导出的数据!"); } var modelDict = new Dictionary { ["Sheet1"] = new { InfoList = list } }; var sourcePath = OtcAppContext.MapPath("~/App_Docs/导出模板"); var settleDocName = "用友凭证模板.xlsx"; var sourceFileName = Path.Combine(sourcePath, settleDocName); buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output(); if (buffer == null) { return ShowError("没有可导出的数据!"); } else { return File(buffer, "application/ms-excel", outputName); } } catch (Exception e) { return ShowError("发生异常!" + e.Message); } } /// /// 长江凭证导出 /// /// /// public ActionResult DownloadCJFinancialVoucher(FinancialVoucher_CJReq req) { try { LogFactory.GetLogger("财务凭证导出").Info("1"); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); byte[] buffer = null; var financialVoucherCJSv = new CJFinancialVoucherService(CurUser); var model = financialVoucherCJSv.GetTradeConfirmData(req); var cashinout = financialVoucherCJSv.GetCashInOutTotal(req); model.CashInOutInfoList = cashinout; var zipWebPath = $"~/App_Docs/导出文件/长江财务凭证"; var zipLocalFolder = Server.MapPath(zipWebPath + $"//{DateTime.Now:yyyyMMddHHmmssffff}"); Directory.CreateDirectory(zipLocalFolder); var outputName = $"{zipLocalFolder}/长江财务凭证导出{req.EndDate.Month}月份" + "-{0}.xlsx"; var outputZipName = $"长江财务凭证导出 {DateTime.Now:yyyy-MM-dd-HHmmss}.zip"; switch (req.SummaryType) { case "场外期权": //持仓成本 var title1 = "持仓成本"; var templateFilePath1 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title1}.xlsx"); var outputFilePath1 = string.Format(outputName, title1); using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath1). AddVariable(model)) { generator.Generate(); generator.SaveAs(outputFilePath1); } //持仓盈亏 var title2 = "持仓盈亏"; var templateFilePath2 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title2}.xlsx"); var outputFilePath2 = string.Format(outputName, title2); using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath2). AddVariable(model)) { generator.Generate(); generator.SaveAs(outputFilePath2); } //平仓盈亏 var title3 = "平仓盈亏"; var templateFilePath3 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title3}.xlsx"); var outputFilePath3 = string.Format(outputName, title3); using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath3). AddVariable(model)) { generator.Generate(); generator.SaveAs(outputFilePath3); } //出入金 var title4 = "出入金"; var templateFilePath4 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title4}.xlsx"); var outputFilePath4 = string.Format(outputName, title4); using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath4). AddVariable(model)) { generator.Generate(); generator.SaveAs(outputFilePath4); } outputZipName = $"长江财务凭证导出场外期权{DateTime.Now:yyyy-MM-dd-HHmmss}.zip"; break; case "远期/掉期": var title5 = "远期掉期"; var templateFilePath5 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title5}.xlsx"); var outputFilePath5 = string.Format(outputName, title5); using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath5). AddVariable(model)) { generator.Generate(); generator.SaveAs(outputFilePath5); } outputZipName = $"长江财务凭证导出远期掉期{DateTime.Now:yyyy-MM-dd-HHmmss}.zip"; break; case "互换": var title6 = "互换"; var templateFilePath6 = Server.MapPath($"~/App_Docs/导出模板/长江财务凭证模板_{title6}.xlsx"); var outputFilePath6 = string.Format(outputName, title6); using (var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath6). AddVariable(model)) { generator.Generate(); generator.SaveAs(outputFilePath6); } outputZipName = $"长江财务凭证导出互换{DateTime.Now:yyyy-MM-dd-HHmmss}.zip"; break; } //压缩汇总 var marketZipFile = Path.Combine(Server.MapPath(zipWebPath), outputZipName); ZipHelper.ZipFilesWithLevel(Directory.GetFiles(zipLocalFolder).ToList(), marketZipFile, 0); Directory.Delete(zipLocalFolder, true); using (var fs = new FileStream(marketZipFile, FileMode.Open, FileAccess.Read)) { buffer = new byte[fs.Length]; fs.Read(buffer, 0, (int)fs.Length); return File(buffer, "application/x-zip-compressed", $"长江财务凭证导出{req.EndDate.Month}月份.zip"); } } catch (TargetInvocationException ex) { if (ex.InnerException != null && ex.InnerException is KeyNotFoundException) { return ShowError("导出模板和财务编码中信息不匹配,请检查相应配置是否正确."); } else { LogFactory.GetLogger("财务凭证导出").Info("2"); LogFactory.GetLogger("财务凭证导出").Error(ex); return ShowError("发生异常!" + ex.Message); } } catch (Exception e) { LogFactory.GetLogger("财务凭证导出").Info("2"); LogFactory.GetLogger("财务凭证导出").Error(e); return ShowError("发生异常!" + e.Message); } } /// /// 中粮凭证导出 /// /// /// public ActionResult DownloadZLFinancialVoucher(ZLFinancialVoucherReq req) { try { byte[] buffer = null; var list = new List(); var outputName = ""; var settleDocName = ""; var financialVoucherSv = new YYFinancialVoucherService(CurUser); switch (req.ZLVoucherType) { case FinancialVoucher_YongYouEnum_ZhongLiang.BuyDeal: list = financialVoucherSv.GetBuyDealData(req); outputName = $"用友-客户买权成交{DateTime.Now:yyyy-MM-dd}.xlsx"; settleDocName = "用友-买权成交模板.xlsx"; break; case FinancialVoucher_YongYouEnum_ZhongLiang.BuyPositionLoss: list = financialVoucherSv.GetBuyPositionLossData(req); outputName = $"用友-客户买权持仓盈亏{DateTime.Now:yyyy-MM-dd}.xlsx"; settleDocName = "用友-买权持仓盈亏模板.xlsx"; break; case FinancialVoucher_YongYouEnum_ZhongLiang.BuyCloseLosses: list = financialVoucherSv.GetBuyCloseLossesData(req); outputName = $"用友-客户买权平仓盈亏{DateTime.Now:yyyy-MM-dd}.xlsx"; settleDocName = "用友-买权平仓盈亏模板.xlsx"; break; case FinancialVoucher_YongYouEnum_ZhongLiang.SellDeal: list = financialVoucherSv.GetSellDealData(req); outputName = $"用友-客户卖权成交{DateTime.Now:yyyy-MM-dd}.xlsx"; settleDocName = "用友-卖权成交模板.xlsx"; break; case FinancialVoucher_YongYouEnum_ZhongLiang.SellPositionLoss: list = financialVoucherSv.GetSellPositionLossData(req); outputName = $"用友-客户卖权持仓盈亏{DateTime.Now:yyyy-MM-dd}.xlsx"; settleDocName = "用友-卖权持仓盈亏模板.xlsx"; break; case FinancialVoucher_YongYouEnum_ZhongLiang.SellCloseLosses: list = financialVoucherSv.GetSellCloseLossesData(req); outputName = $"用友-客户卖权平仓盈亏{DateTime.Now:yyyy-MM-dd}.xlsx"; settleDocName = "用友-卖权平仓盈亏模板.xlsx"; break; case FinancialVoucher_YongYouEnum_ZhongLiang.DepositWithdraw: list = financialVoucherSv.GetDepositWithdrawData(req); outputName = $"用友-客户出入金{DateTime.Now:yyyy-MM-dd}.xlsx"; settleDocName = "用友-出入金的凭证模板.xlsx"; break; default: break; } if (list == null || list.Count == 0) { return ShowError("没有可导出的数据!"); } var modelDict = new Dictionary { ["Sheet1"] = new { InfoList = list } }; var sourcePath = OtcAppContext.MapPath("~/App_Docs/导出模板/中粮用友"); var sourceFileName = Path.Combine(sourcePath, settleDocName); buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output(); if (buffer == null) { return ShowError("没有可导出的数据!"); } else { return File(buffer, "application/ms-excel", outputName); } } catch (Exception e) { return ShowError("发生异常!" + e.Message); } } #endregion [HttpPost] public ActionResult SaveYongYouKeMuCode() { var save = WebExtensions.ToQueryString(Request.Form, false); new YLErp.Modules.AppModule.AppConfigService(CurUser).SaveConfig("ProjectConfig", "Erp.YongYouKeMuCode", save, "string", "用友科目编码"); PS.SetConfig(nameof(PS.Config.ErpElement.YongYouKeMuCode), save); return JsonSuccess(); } private ActionResult DownloadFinancialExangeSummary(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false) { buffer = null; if (!(FinancialSummaryQuery(req).Value is SearchListResult searchList)) { return Json(Return.Fail("数据不存在")); } var list = searchList.rows.ToList(); if (query)//如果只是查询数据是否存在,则只返回错误信息或数量; { if (list.Count > 0) { return Json(Return.Success(searchList.records.ToString())); } else { return Json(Return.Fail("数据不存在")); } } if (list.Count == 0) { return ShowError("数据不存在"); } var modelDict = new Dictionary { ["Sheet1"] = new { searchList.Sum, InfoList = list } }; var sourcePath = OtcAppContext.MapPath("~/App_Docs"); var settleDocName = "财务汇总-场内期权.xlsx"; var sourceFileName = Path.Combine(sourcePath, settleDocName); //var targetPath = Path.Combine(sourcePath, "temp"); //var targetFileName = $"财务汇总-场内期权{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"; buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output(); return File(buffer, xlsxMimeType); } private ActionResult DownloadFinancialOptionSummary(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false) { buffer = null; if (!(FinancialSummaryQuery(req).Value is SearchListResult searchList)) { return Json(Return.Fail("数据不存在")); } var list = searchList.rows.ToList(); if (query)//如果只是查询数据是否存在,则只返回错误信息或数量; { if (list.Count > 0) { return Json(Return.Success(searchList.records.ToString())); } else { return Json(Return.Fail("数据不存在")); } } if (list.Count == 0) { return ShowError("数据不存在"); } list.ForEach(a => { if (PS.Config.IsUseDisplayNotional) { a.OriginalAmount = a.OriginalAmount * a.CountRatio; a.PositionAmount = a.PositionAmount * a.CountRatio; } }); var dc = new List(); if (req.SummaryType == "场外期权") {//场外期权 switch (type) { case "开仓明细": #region 开仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType")); dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); })); #endregion break; case "持仓明细": #region 持仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType")); dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); })); #endregion break; case "平仓明细": #region 平仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType")); dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue("清算日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue("结算确认书", cv, obj); })); #endregion break; default: #region 默认导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType")); dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue("清算日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); //dc.Add(new ExcelHelper.DataColumnModel("权益商品", "UnderlyingInstrumentType")); dc.Add(new ExcelHelper.DataColumnModel("标的", "UnderlyingCode")); dc.Add(new ExcelHelper.DataColumnModel("期权类型", "ExerciseMode")); if (!PS.Config.Is光大光子) { dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional3", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); if (PS.Config.Is国海) { dc.Add(new ExcelHelper.DataColumnModel("存续名义本金", "SurvivingNominalPrincipal", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); } //dc.Add(new ExcelHelper.cDataColumn("名义本金(万元)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金(万元)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期货盈亏(结算价)", "FuturePnl", typeof(double), (cv, obj) => { return FormatValue("期货盈亏(结算价)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue("结算确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("交易确认日期", "TradeConfirmDate", (cv, obj) => { return FormatValue("交易确认日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("了结确认日期", "ClearConfirmDate", (cv, obj) => { return FormatValue("了结确认日期", cv, obj); })); #endregion break; } } else {//远期/掉期 互换 switch (type) { case "开仓明细": #region 开仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue("多空方向", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); })); #endregion break; case "持仓明细": #region 持仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue("多空方向", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); })); #endregion break; case "平仓明细": #region 平仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue("多空方向", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue("清算日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue("结算确认书", cv, obj); })); #endregion break; default: #region 默认导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "Status", (cv, obj) => { return FormatValue("状态", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue("多空方向", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(double), (cv, obj) => { return FormatValue("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(double), (cv, obj) => { return FormatValue("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(double), (cv, obj) => { return FormatValue("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue("清算日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("标的", "UnderlyingCode")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); if (PS.Config.Is国海) { dc.Add(new ExcelHelper.DataColumnModel("存续名义本金", "SurvivingNominalPrincipal", typeof(double), (cv, obj) => { return FormatValue("名义本金", cv, obj); })); } //dc.Add(new ExcelHelper.cDataColumn("名义本金(万元)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue("名义本金(万元)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "Pnl", typeof(double), (cv, obj) => { return FormatValue("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue("交易确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue("结算确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("交易确认日期", "TradeConfirmDate", (cv, obj) => { return FormatValue("交易确认日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("了结确认日期", "ClearConfirmDate", (cv, obj) => { return FormatValue("了结确认日期", cv, obj); })); } #endregion break; } } new ExcelHelper().ListToExcel(dc.ToArray(), list, "Sheet1", true, out buffer); return File(buffer, xlsxMimeType); } public ActionResult DownloadFinancialSummary(FinancialSummaryModelReq req, string type, bool query = false) { if (query) { req.rows = 1; } if (string.IsNullOrWhiteSpace(type)) { type = "财务汇总"; } try { byte[] buffer = null; ActionResult obj = null; switch (req.SummaryType) { case "场内期权": obj = DownloadFinancialExangeSummary(req, type, out buffer, query); break; case "远期/掉期": case "场外期权": default: obj = DownloadFinancialOptionSummary(req, type, out buffer, query); break; } if (buffer == null) { return obj; } else { return File(buffer, "application/ms-excel", $"{type}-{DateTime.Now:yyyy-MM-dd}.xlsx"); } } catch (Exception e) { return ShowError("下载失败" + e.Message); } } #region 广发财务汇总导出 public ActionResult DownloadFinancialSummary_GF(FinancialSummaryModelReq req, string type, bool query = false) { if (query) { req.rows = 1; } if (string.IsNullOrWhiteSpace(type)) { type = "财务汇总"; } try { byte[] buffer = null; ActionResult obj = null; switch (req.SummaryType) { case "场内期权": obj = DownloadFinancialExangeSummary_GF(req, type, out buffer, query); break; case "簿记维度": obj = DownloadFinancialUnitSummary_GF(req, type, out buffer, query); break; case "远期/掉期": case "场外期权": default: obj = DownloadFinancialOptionSummary_GF(req, type, out buffer, query); break; } if (buffer == null) { return obj; } else { return File(buffer, "application/ms-excel", $"{type}-{DateTime.Now:yyyy-MM-dd}.xlsx"); } } catch (Exception e) { return ShowError("下载失败" + e.Message); } } public ActionResult DownloadFinancialUnitSummary_GF(FinancialSummaryModelReq req, string type, bool query = false) { if (query) { req.rows = 1; } if (string.IsNullOrWhiteSpace(type)) { type = "财务汇总"; } try { byte[] buffer = null; ActionResult obj = DownloadFinancialUnitSummary_GF(req, type, out buffer, query); if (buffer == null) { return obj; } else { return File(buffer, "application/ms-excel", $"{type}-{DateTime.Now:yyyy-MM-dd}.xlsx"); } } catch (Exception e) { return ShowError("下载失败" + e.Message); } } private ActionResult DownloadFinancialUnitSummary_GF(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false) { buffer = null; if (!(new FinancialVoucherService(CurUser).GatherUnitData(req) is List searchList)) { return Json(Return.Fail("数据不存在")); } var list = searchList.ToList(); if (query)//如果只是查询数据是否存在,则只返回错误信息或数量; { if (list.Count > 0) { return Json(Return.Success(searchList.Count.ToString())); } else { return Json(Return.Fail("数据不存在")); } } if (list.Count == 0) { return ShowError("数据不存在"); } var xiaojiRowStyle = new ListToExcelRowStyle { FontBold = false, BackgroundColor = Color.FromArgb(217, 225, 242), }; //var hejiRowStyle = new ListToExcelRowStyle //{ // FontBold = true //}; var rowStyleDic = new Dictionary(); foreach (var item in list.Where(l => l.AssetBookName.Contains("小计"))) { var i = list.FindIndex(l => l == item); rowStyleDic[i] = xiaojiRowStyle; } var dc = new List(); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("品种代码", "VarietyCode")); dc.Add(new ExcelHelper.DataColumnModel("持仓手数", "PositionLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional3", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("当日期货盈亏", "DailyPnL", typeof(double), (cv, obj) => { return FormatValue_GF("当日期货盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("手续费", "ServiceFee", typeof(double), (cv, obj) => { return FormatValue_GF("手续费", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("累计总盈亏", "NewTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("累计总盈亏", cv, obj); })); var req1 = new ListToExcelRequest { Columns = dc, ColumnAutoSize = false, DataGroups = null, Datas = list, IsColumnWritten = true, GetRowStyle = dataIndex => rowStyleDic.TryGetValue(dataIndex, out var style) ? style : null, SheetName = "Sheet1" }; var result = new ExcelHelper().ListToExcel(req1); buffer = result.Buffer; //new ExcelHelper().ListToExcel(dc.ToArray(), list, "Sheet1", true, out buffer); return File(result.Buffer, xlsxMimeType); } private ActionResult DownloadFinancialExangeSummary_GF(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false) { buffer = null; if (!(FinancialSummaryQuery_GF(req).Value is SearchListResult searchList)) { return Json(Return.Fail("数据不存在")); } var list = searchList.rows.ToList(); if (query)//如果只是查询数据是否存在,则只返回错误信息或数量; { if (list.Count > 0) { return Json(Return.Success(searchList.records.ToString())); } else { return Json(Return.Fail("数据不存在")); } } if (list.Count == 0) { return ShowError("数据不存在"); } var modelDict = new Dictionary { ["Sheet1"] = new { searchList.Sum, InfoList = list } }; var sourcePath = OtcAppContext.MapPath("~/App_Docs"); var settleDocName = "财务汇总-场内期权.xlsx"; var sourceFileName = Path.Combine(sourcePath, settleDocName); //var targetPath = Path.Combine(sourcePath, "temp"); //var targetFileName = $"财务汇总-场内期权{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"; buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output(); return File(buffer, xlsxMimeType); } private ActionResult DownloadFinancialOptionSummary_GF(FinancialSummaryModelReq req, string type, out byte[] buffer, bool query = false) { buffer = null; if (!(new FinancialVoucherService(CurUser).GatherClientData(req) is List searchList)) { return Json(Return.Fail("数据不存在")); } var list = searchList.ToList(); if (query)//如果只是查询数据是否存在,则只返回错误信息或数量; { if (list.Count > 0) { return Json(Return.Success(searchList.Count.ToString())); } else { return Json(Return.Fail("数据不存在")); } } if (list.Count == 0) { return ShowError("数据不存在"); } var xiaojiRowStyle = new ListToExcelRowStyle { FontBold = false, BackgroundColor = Color.FromArgb(217, 225, 242), }; //var hejiRowStyle = new ListToExcelRowStyle //{ // FontBold = true //}; var rowStyleDic = new Dictionary(); foreach (var item in list.Where(l => l.ClientFullName.Contains("小计"))) { var i = list.FindIndex(l => l == item); rowStyleDic[i] = xiaojiRowStyle; } list.ForEach(a => { if (PS.Config.IsUseDisplayNotional) { a.OriginalAmount = a.OriginalAmount * a.CountRatio; a.PositionAmount = a.PositionAmount * a.CountRatio; } }); var dc = new List(); if (req.SummaryType == "场外期权") {//场外期权 switch (type) { //GF_Pnl case "开仓明细": #region 开仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType", (cv, obj) => { return FormatValue_GF("看涨看跌", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); })); #endregion break; case "持仓明细": #region 持仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType", (cv, obj) => { return FormatValue_GF("看涨看跌", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); })); #endregion break; case "平仓明细": #region 平仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType", (cv, obj) => { return FormatValue_GF("看涨看跌", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue_GF("清算日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue_GF("结算确认书", cv, obj); })); #endregion break; default: #region 默认导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("看涨看跌", "OptionType", (cv, obj) => { return FormatValue_GF("看涨看跌", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue_GF("清算日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); //dc.Add(new ExcelHelper.DataColumnModel("权益商品", "UnderlyingInstrumentType")); dc.Add(new ExcelHelper.DataColumnModel("标的", "UnderlyingCode")); dc.Add(new ExcelHelper.DataColumnModel("期权类型", "ExerciseMode")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional3", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(期初价格)", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("名义本金(执行价格)", "StockEqvNotional2", typeof(string), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期初权利金收支", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmTotlePnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期货盈亏(结算价)", "FuturePnl", typeof(double), (cv, obj) => { return FormatValue_GF("期货盈亏(结算价)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue_GF("结算确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("交易确认日期", "TradeConfirmDate", (cv, obj) => { return FormatValue_GF("交易确认日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("了结确认日期", "ClearConfirmDate", (cv, obj) => { return FormatValue_GF("了结确认日期", cv, obj); })); #endregion break; } } else {//远期/掉期 互换 switch (type) { case "开仓明细": #region 开仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue_GF("多空方向", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); })); #endregion break; case "持仓明细": #region 持仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue_GF("多空方向", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); })); #endregion break; case "平仓明细": #region 平仓导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue_GF("多空方向", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue_GF("清算日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue_GF("结算确认书", cv, obj); })); #endregion break; default: #region 默认导出列 dc.Add(new ExcelHelper.DataColumnModel("客户全称", "ClientFullName")); dc.Add(new ExcelHelper.DataColumnModel("簿记账户", "AssetBookName")); dc.Add(new ExcelHelper.DataColumnModel("订单", "TradeNumber")); dc.Add(new ExcelHelper.DataColumnModel("确认书编号", "ContractCode")); dc.Add(new ExcelHelper.DataColumnModel("结算书编号", "SettlementCode")); dc.Add(new ExcelHelper.DataColumnModel("状态", "StatusStr", (cv, obj) => { return FormatValue_GF("状态", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("多空方向", "OptionType", (cv, obj) => { return FormatValue_GF("多空方向", cv, obj); })); } dc.Add(new ExcelHelper.DataColumnModel("客户名", "ClientShortName")); dc.Add(new ExcelHelper.DataColumnModel("成交日", "TradeDate", (cv, obj) => { return FormatValue_GF("成交日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交手数", "OriginalLots", typeof(string), (cv, obj) => { return FormatValue_GF("成交手数", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("成交数量", "OriginalAmount", typeof(string), (cv, obj) => { return FormatValue_GF("成交数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("持仓数量", "PositionAmount", typeof(string), (cv, obj) => { return FormatValue_GF("持仓数量", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("到期日", "ExerciseDate", (cv, obj) => { return FormatValue_GF("到期日", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算日期", "ClearDate", (cv, obj) => { return FormatValue_GF("清算日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方买/卖", "TradeDirection")); dc.Add(new ExcelHelper.DataColumnModel("标的", "UnderlyingCode")); dc.Add(new ExcelHelper.DataColumnModel("名义本金", "StockEqvNotional", typeof(double), (cv, obj) => { return FormatValue_GF("名义本金", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("开仓费用", "TradePrice", typeof(double), (cv, obj) => { return FormatValue_GF("期初权利金收支", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("清算金额", "ClearPrice", typeof(double), (cv, obj) => { return FormatValue_GF("清算金额", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("我方期权清算盈亏", "ConfirmPnl", typeof(double), (cv, obj) => { return FormatValue_GF("我方期权清算盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末市值", "LastPv", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("上期期末累计浮动盈亏", "LastTotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("上期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末市值", "Pv", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末市值", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期期末累计浮动盈亏", "TotalPnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期期末累计浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("本期浮动盈亏", "GF_Pnl", typeof(double), (cv, obj) => { return FormatValue_GF("本期浮动盈亏", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("交易确认书", "TradeConfirmFileStatus", (cv, obj) => { return FormatValue_GF("交易确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("结算确认书", "ClearConfirmFileStatus", (cv, obj) => { return FormatValue_GF("结算确认书", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("财务入账", "FinancialEntry", typeof(double))); dc.Add(new ExcelHelper.DataColumnModel("可用资金(财务)", "AvailableCash", typeof(string), (cv, obj) => { return FormatValue_GF("可用资金(财务)", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("期末结存(财务)", "EndBalance", typeof(string), (cv, obj) => { return FormatValue_GF("期末结存(财务)", cv, obj); })); if (req.SummaryType == "远期/掉期") { dc.Add(new ExcelHelper.DataColumnModel("交易确认日期", "TradeConfirmDate", (cv, obj) => { return FormatValue_GF("交易确认日期", cv, obj); })); dc.Add(new ExcelHelper.DataColumnModel("了结确认日期", "ClearConfirmDate", (cv, obj) => { return FormatValue_GF("了结确认日期", cv, obj); })); } #endregion break; } } var req1 = new ListToExcelRequest { Columns = dc, ColumnAutoSize = false, DataGroups = null, Datas = list, IsColumnWritten = true, GetRowStyle = dataIndex => rowStyleDic.TryGetValue(dataIndex, out var style) ? style : null, SheetName = "Sheet1" }; var result = new ExcelHelper().ListToExcel(req1); buffer = result.Buffer; //new ExcelHelper().ListToExcel(dc.ToArray(), list, "Sheet1", true, out buffer); return File(result.Buffer, xlsxMimeType); } #endregion /// /// 中粮场外期权账单 /// /// /// public ActionResult DownloadFinancialSummary_ZL(FinancialSummaryModelReq req) { if (req.CurrentPeriodDateStart == default || req.CurrentPeriodDateEnd == default) { return ShowError("本期区间值不应为空"); } if (req.CurrentPeriodDateStart > req.CurrentPeriodDateEnd) { return ShowError("区间开始日期应小于区间结束日期"); } var model = new FinancialSummaryReportZLService(CurUser).GetReportData(req); var modelDict = new Dictionary(); modelDict.Add("Sheet1", model); var sourcePath = OtcAppContext.MapPath("~/App_Docs/导出模板"); var settleDocName = "中粮-场外期权账单.xlsx"; var sourceFileName = Path.Combine(sourcePath, settleDocName); var buffer = new ExcelTemplateGenerator().SetTemplateFile(sourceFileName).SetTemplateData(modelDict).Output(); return File(buffer, "application/ms-excel", $"场外期权账单-{req.CurrentPeriodDateEnd:yyyy-MM-dd}.xlsx"); } public dynamic FormatValue_GF(string columnName, dynamic currentValue, object obj) { string result = currentValue?.ToString(); switch (columnName) { case "多空方向": result = currentValue == "无状态" ? "" : (currentValue == "看涨" ? "多头" : "空头"); break; case "看涨看跌": result = currentValue == "无状态" ? "" : currentValue; break; case "状态": if (currentValue != null && currentValue is bool) { result = (currentValue ? "完结" : "未完结"); } if (currentValue != null && currentValue is string) { result = currentValue == "无状态" ? "" : currentValue; } break; case "名义本金(万元)": result = "0"; if (currentValue != null && currentValue is double) { result = ((double)currentValue / 10000).OtcFormat(OtcFormatFlag.StockEqvNotional); } break; case "名义本金": if (currentValue == 0) { result = null; } else { if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0 : (double)currentValue).OtcFormat(OtcFormatFlag.StockEqvNotional); } } break; case "交易确认书": case "结算确认书": result = currentValue == "草稿" ? "未用印" : currentValue; break; case "成交日": case "到期日": case "清算日期": case "交易确认日期": case "了结确认日期": if (currentValue != null && currentValue is DateTime) { result = currentValue == default(DateTime) ? null : currentValue.ToString("yyyy-MM-dd"); } break; case "成交手数": if (currentValue == 0) { result = null; } else { if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0d : (double)currentValue).OtcFormatNotional(); } } break; case "成交数量": case "持仓数量": if (currentValue == 0) { result = null; } else { if (currentValue != null && currentValue is double) { var amount = (double.IsNaN(currentValue) ? 0d : (double)currentValue); var trade = obj as FinancialSummaryOptionModel; result = (PS.Config.IsUseDisplayNotional ? amount * trade.CountRatio : amount).OtcFormatNotional(); } } break; case "期初权利金收支": case "清算金额(我方收入)": case "清算金额": case "期货盈亏(结算价)": case "手续费": case "清算金额(我方支出)": if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0 : (double)currentValue).OtcFormatMoney(grouping: false); } break; case "我方期权清算盈亏": case "上期期末市值": case "上期期末累计浮动盈亏": case "本期期末市值": case "本期期末累计浮动盈亏": case "本期浮动盈亏": case "费后总盈亏": if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0 : (double)currentValue).OtcFormatMoney(grouping: false); } break; case "可用资金(财务)": case "期末结存(财务)": if (currentValue == 0) { result = null; } else { if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0 : (double)currentValue).OtcFormatMoney(grouping: false); } } break; default: break; } return result; } public dynamic FormatValue(string columnName, dynamic currentValue, object obj) { string result = currentValue?.ToString(); switch (columnName) { case "多空方向": result = currentValue == "看涨" ? "多头" : "空头"; break; case "状态": if (currentValue is bool) { result = currentValue ? "完结" : "未完结"; } break; case "名义本金(万元)": result = "0"; if (currentValue != null && currentValue is double) { result = (currentValue / 10000).OtcFormat(OtcFormatFlag.StockEqvNotional); } break; case "名义本金": if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0 : currentValue).OtcFormat(OtcFormatFlag.StockEqvNotional); } break; case "交易确认书": case "结算确认书": result = currentValue == "草稿" ? "未用印" : currentValue; break; case "成交日": case "到期日": case "清算日期": case "交易确认日期": case "了结确认日期": if (currentValue != null && currentValue is DateTime) { result = currentValue == default(DateTime) ? null : currentValue.ToString("yyyy-MM-dd"); } break; case "成交手数": if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0d : currentValue).OtcFormatNotional(); } break; case "成交数量": case "持仓数量": if (currentValue != null && currentValue is double) { var amount = (double.IsNaN(currentValue) ? 0d : currentValue); var trade = obj as FinancialSummaryOptionModel; result = (PS.Config.IsUseDisplayNotional ? amount * trade.CountRatio : amount).OtcFormatNotional(); } break; case "期初权利金收支": case "清算金额(我方收入)": case "清算金额": case "期货盈亏(结算价)": case "手续费": case "清算金额(我方支出)": if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0 : currentValue).OtcFormatMoney(grouping: false); } break; case "我方期权清算盈亏": case "上期期末市值": case "上期期末累计浮动盈亏": case "本期期末市值": case "本期期末累计浮动盈亏": case "本期浮动盈亏": case "费后总盈亏": if (currentValue != null && currentValue is double) { result = (double.IsNaN(currentValue) ? 0 : currentValue).OtcFormatMoney(grouping: false); } break; default: break; } return result; } public object FinancialDetail(FinancialSummaryModelReq req, string type) { ViewBag.Req = req; ViewBag.Title = type; switch (type) { case "开仓明细": req.TradeConfirmDateStart = req.CurrentPeriodDateStart; req.TradeConfirmDateEnd = req.CurrentPeriodDateEnd; break; case "持仓明细": req.ClearConfirmDateStart = req.CurrentPeriodDateEnd.AddDays(1); break; case "平仓明细": req.ClearConfirmDateStart = req.CurrentPeriodDateStart; req.ClearConfirmDateEnd = req.CurrentPeriodDateEnd; break; default: return JsonError(); } return View(); } /// /// 广发定制 开仓明细、持仓明细、平仓明细 详情页面 /// /// /// /// public object FinancialDetail_GF(FinancialSummaryModelReq req, string type) { ViewBag.Req = req; ViewBag.Title = type; switch (type) { case "开仓明细": req.TradeConfirmDateStart = req.CurrentPeriodDateStart; req.TradeConfirmDateEnd = req.CurrentPeriodDateEnd; break; case "持仓明细": req.ClearConfirmDateStart = req.CurrentPeriodDateEnd.AddDays(1); break; case "平仓明细": req.ClearConfirmDateStart = req.CurrentPeriodDateStart; req.ClearConfirmDateEnd = req.CurrentPeriodDateEnd; break; default: return JsonError(); } return View(); } [HttpPost] public JsonResult tradeInnerListQuery(TradeReq req) { req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); var sList = new TradeQueryService(CurUser).SearchList(req); return Json(sList); } public ActionResult tradeInner() { return View(); } [MyAuthorize("结算管理-提前终止报告")] public ActionResult tradeDayConfirmList() { if (GlobalConfig.SelectConfirmationBookTemplate) { try { if (string.IsNullOrWhiteSpace(GlobalConfig.PluginFolder)) { throw new Exception("未找到插件路径"); } var dirPath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs", ContractTypeEnum.Clearing); if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } var paths = Directory.GetFiles(dirPath, "*.docx"); for (var i = 0; i < paths.Length; i++) { paths[i] = Path.GetFileName(paths[i]); } ViewBag.TemplateNames = paths; } catch (Exception ex) { LogFactory.GetLogger("SelectConfirmationBookTemplate").Error(ex); } } return View(); } public ActionResult tradeEndConfirmList() { if (GlobalConfig.SelectConfirmationBookTemplate) { try { if (string.IsNullOrWhiteSpace(GlobalConfig.PluginFolder)) { throw new Exception("未找到插件路径"); } var dirPath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs", ContractTypeEnum.Clearing); if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } var paths = Directory.GetFiles(dirPath, "*.docx"); for (var i = 0; i < paths.Length; i++) { paths[i] = Path.GetFileName(paths[i]); } ViewBag.TemplateNames = paths; } catch (Exception ex) { LogFactory.GetLogger("SelectConfirmationBookTemplate").Error(ex); } } return View(); } [MyAuthorize("交易管理-交易搜索")] public ActionResult tradeConfirmList(string volType = "交易", int tabIndex = (int)TradeTabIndexEnum.今日成交) { ViewBag.VolType = volType; ViewBag.TabIndex = tabIndex; return View(); } [MyAuthorize("交易管理-交易搜索")] public ActionResult tradePreEndList(string volType = "交易") { ViewBag.VolType = volType; return View(); } [MyAuthorize("交易管理-交易搜索")] public ActionResult tradeKnockedOutList() { return View(); } public ActionResult tradeFileManagement() { var contractBLL = new TradeContractBLL(CurUser); var tradeNumber = Request.Query["tradeNumber"].ToString(); var trade = db.trade.FirstOrDefault(x => x.TradeNumber == tradeNumber); //交易确认书 var confirmDoc = contractBLL.GetContractDoc(trade?.id ?? 0, ContractTypeEnum.Trade); if (confirmDoc != null) { if (System.IO.File.Exists(confirmDoc.AbsolutePath)) { ViewBag.ConfirmBook = confirmDoc.RelativePath; } } #region 提前终止确认书 var preconfirmDoc = contractBLL.GetContractDoc(trade?.id ?? 0, ContractTypeEnum.UnWind); if (preconfirmDoc != null) { if (System.IO.File.Exists(preconfirmDoc.AbsolutePath)) { ViewBag.PreAbortConfirmBook = preconfirmDoc.RelativePath; } } #endregion #region 结算确认书 var clearingDoc = contractBLL.GetContractDoc(trade?.id ?? 0, ContractTypeEnum.Clearing); if (clearingDoc != null) { if (System.IO.File.Exists(clearingDoc.AbsolutePath)) { ViewBag.ClearingDoc = clearingDoc.RelativePath; } } #endregion return View(); } public ActionResult tradeContractManagement() { return View(); } public ActionResult UploadContractFile(string encryptId, string fileDescription, string ContractCode, bool OurpartySeal = false, bool CounterpartySeal = false) { var uploadFileModel = Request.Form.Files.Count > 0 ? Request.Form.Files[0].ToUploadFileModel() : null; var (flag, msg, optDate, stampPath) = new ConfirmationGenerateService(CurUser).UploadContractFile(encryptId, fileDescription, ContractCode, OurpartySeal, CounterpartySeal, uploadFileModel); if (flag) { return JsonSuccess(msg); } return JsonError(msg); } public ActionResult UploadContractFileNew(string contractCode) { var uploadFileModel = Request.Form.Files.Count > 0 ? Request.Form.Files[0].ToUploadFileModel() : null; var (flag, msg, optDate, stampPath) = new ConfirmationGenerateService(CurUser).UploadContractFileNew(contractCode, uploadFileModel); if (flag) { return JsonSuccess(msg); } return JsonError(msg); } public ActionResult tradeContractManagementQuery(string tradeNumber) { if (string.IsNullOrWhiteSpace(tradeNumber)) { return JsonError("该交易TradeNumber无效"); } var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber); if (trade == null) { return JsonError("该交易TradeNumber无效"); } var contractBLL = new TradeContractBLL(CurUser); var contractDocs = contractBLL.GetAllContractDocs(trade.id); var resultList = new List(); if (contractDocs != null && contractDocs.Any()) { resultList.AddRange(contractDocs); } var tradeFileList = db.trade_file.Where(f => f.TradeId == trade.id).ToList(); if (tradeFileList != null && tradeFileList.Count > 0) { tradeFileList.ForEach(d => { resultList.Add(new TradeOtherDocument { id = d.id, EncryptId = d.EncryptId, FileName = d.FileName, Type = "其他", RelativePath = d.FileName, StampDocumentFileName = "", Status = "", Comments = d.Description }); }); } var result = new SearchListResult { page = 1, records = resultList.Count(), rows = resultList, total = 1 }; return Json(result); } public ActionResult tradeOperationHistory(string encryptId, bool IsExchange = false) { var tradeId = DataProtectHelper.DecryptInt(encryptId); var datas = db.TradeAuditLog.Where(n => n.TradeId == tradeId && (n.AuditFlag & TradeAuditFlag.operation) > 0) .Select(n => new TradeAuditLogDto { id = n.id, OptType = n.OptType, Changes = n.Changes, OptName = n.OptName, OptDate = n.OptDate }).ToArray(); datas = datas.GroupBy(O => new { O.OptDate, O.OptName, O.OptType }).Select(O => O.First()).OrderByDescending(n => n.id).ToArray(); foreach (var item in datas) { if (IsExchange) { item.Changes = item.OptType == "批量调整-标的交易" ? new DatatraceQueryService(CurUser).ReplaceDataChanges(new trade(), item.Changes) : ""; } else { item.Changes = item.OptType == "修改交易" ? new DatatraceQueryService(CurUser).ReplaceDataChanges(new trade(), item.Changes) : ""; } if (!string.IsNullOrEmpty(item.Changes)) { //因为一开始用英文存入的是自定义字段 所以无法转对应的名称,特加此段逻辑进行转换 item.Changes = item.Changes.Replace("ExchangeRate", "汇率"); } } return View(datas); } [MyAuthorize("结算管理-障碍期权报告")] public ActionResult BarrierReportList() { return View(); } public ActionResult GetTradeFiles(string tradeNumber) { //根据TradeNumber,到服务器指定TradeNumber下的文件夹遍历文件 //var path = Server.MapPath($"~/App_Docs/TradeFile/{tradeNumber}"); //if (!Directory.Exists(path)) //{ // return Json(new List()); //} //string[] filePath = Directory.GetFiles(path); //var list = new List(); //foreach (var namePath in filePath) //{ // list.Add(new { FileName = Path.GetFileName(namePath) }); //} //if (list.Count <= 0) //{ // return Json(new List()); //} if (string.IsNullOrWhiteSpace(tradeNumber)) { return JsonError("该交易TradeNumber无效"); } var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber); if (trade == null) { return JsonError("该交易TradeNumber无效"); } var tradeFileList = db.trade_file.Where(f => f.TradeId == trade.id).ToList(); return Json(tradeFileList); } public ActionResult UploadTradeFiles(string tradeNumber, string fileDescription) { try { if (string.IsNullOrWhiteSpace(tradeNumber)) { return JsonError("该交易TradeNumber无效"); } if (string.IsNullOrWhiteSpace(fileDescription)) { fileDescription = "人工添加"; } //if (string.IsNullOrWhiteSpace(fileDescription)) //{ // return JsonError("请填写文件描述"); //} var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber); if (trade == null) { return JsonError("该交易TradeNumber无效"); } var tradeFiles = db.trade_file.Where(f => f.TradeId == trade.id).ToList(); var dirPath = Server.MapPath($"~/App_Docs/TradeFile/{tradeNumber}"); if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } var newFileList = new List(); foreach (IFormFile file in Request.Form.Files) { if (PS.Config.ErpElement.SecuritiesEnvironment && (file.FileName.ToLower().EndsWith("合规意见书.pdf") || file.FileName.ToLower().EndsWith("履约保证书.pdf")) && file.Length > Modules.SuperviseReportModule.SAC.Model.ReportStatusModel.MaxAnnexLength) { return JsonError("上传文件出错,合规意见书/履约保证书文件大小不应超过30MB"); } var tempName = file.FileName; if (PS.Config.ErpElement.SecuritiesEnvironment) { tempName = $"{tradeNumber}-{file.FileName}"; } var filePath = Path.Combine(dirPath, tempName); if (System.IO.File.Exists(filePath)) { System.IO.File.Delete(filePath); var tempFile = tradeFiles.FirstOrDefault(f => f.Path == filePath); if (tempFile != null) { db.trade_file.Remove(tempFile); } } using var stream = file.OpenReadStream(); using var fstream = System.IO.File.OpenWrite(filePath); stream.CopyTo(fstream); newFileList.Add(new trade_file { TradeId = trade.id, Path = filePath, Description = fileDescription, OptId = CurUser.UserId, OptName = CurUser.UserName, OptDate = DateTime.Now }); } if (newFileList.Count > 0) { db.trade_file.AddRange(newFileList); } db.SaveChanges(); return JsonSuccess("上传成功"); } catch (Exception ex) { LogFactory.GetLogger("UploadTradeFiles").Error(ex); return JsonError("上传文件出错"); } } public ActionResult DownLoadTradeFiles(string tradeNumber, string[] fileName) { if (string.IsNullOrWhiteSpace(tradeNumber)) { return JsonError("该交易TradeNumber无效"); } var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber); if (trade == null) { return JsonError("该交易TradeNumber无效"); } var filePath = Server.MapPath($"~/App_Docs/TradeFile/{tradeNumber}"); if (!Directory.Exists(filePath)) { return JsonError("该交易TradeNumber无效"); } if (fileName.Length <= 0) { return JsonError("服务器不存在该文件"); } var list = new List(); foreach (var name in fileName) { list.Add($"/App_Docs/TradeFile/{tradeNumber}/{name}"); } if (list.Count < 0) { return JsonError("服务器不存在该文件"); } return Json(list); } public ActionResult DownTradeFiles(string tradeNumber) { var filePath = Server.MapPath($"~/App_Docs"); if (!Directory.Exists(filePath)) { return JsonError("该交易没有上传过交易确认书文件"); } var fileName = "*交易确认书*_" + tradeNumber + ".docx"; var files = Directory.GetFiles(filePath, fileName); var list = files.ToList(); if (list.Count < 0) { return JsonError("该交易没有上传过交易确认书文件"); } var listName = new List(); foreach (var name in list) { var urlPath = RelativePath(filePath, name); listName.Add($"/App_Docs/{urlPath}"); } return Json(listName); } /// /// 绝对路径转相对路径 /// /// /// /// public string RelativePath(string absolutePath, string relativeTo) { var absoluteDirectories = absolutePath.Split('\\'); var relativeDirectories = relativeTo.Split('\\'); //Get the shortest of the two paths var length = absoluteDirectories.Length < relativeDirectories.Length ? absoluteDirectories.Length : relativeDirectories.Length; //Use to determine where in the loop we exited var lastCommonRoot = -1; int index; //Find common root for (index = 0; index < length; index++) { if (absoluteDirectories[index] == relativeDirectories[index]) { lastCommonRoot = index; } else { break; } } //If we didn't find a common prefix then throw if (lastCommonRoot == -1) { throw new ArgumentException("Paths do not have a common base"); } //Build up the relative path var relativePath = new StringBuilder(); //Add on the .. for (index = lastCommonRoot + 1; index < absoluteDirectories.Length; index++) { if (absoluteDirectories[index].Length > 0) { relativePath.Append("..\\"); } } //Add on the folders for (index = lastCommonRoot + 1; index < relativeDirectories.Length - 1; index++) { relativePath.Append(relativeDirectories[index] + "\\"); } relativePath.Append(relativeDirectories[relativeDirectories.Length - 1]); return relativePath.ToString(); } public ActionResult DeleteTradeFiles(string tradeNumber, string[] fileName) { try { if (string.IsNullOrWhiteSpace(tradeNumber)) { return JsonError("该交易TradeNumber无效"); } var trade = db.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber); if (trade == null) { return JsonError("该交易TradeNumber无效"); } var filePath = Server.MapPath($"~/App_Docs/TradeFile/{tradeNumber}"); if (!Directory.Exists(filePath)) { return JsonError("该交易TradeNumber无效"); } if (fileName.Length <= 0) { return JsonError("服务器不存在该文件"); } foreach (var name in fileName) { var path = Path.Combine(filePath, name); if (System.IO.File.Exists(path)) { System.IO.File.Delete(path); } var tradeFiles = db.trade_file.Where(f => f.TradeId == trade.id).ToList(); var tempFile = tradeFiles.FirstOrDefault(f => f.Path == path); if (tempFile != null) { db.trade_file.Remove(tempFile); } } db.SaveChanges(); return JsonSuccess("删除成功"); } catch (Exception ex) { LogFactory.GetLogger("DeleteTradeFiles").Error("删除文件", ex); return JsonError("删除失败"); } } public JsonResult traderevoke(string tradeids, int actionType) { var tradeidArr = DataConvert.ConvertCommaValuesToInt32Array(tradeids); new TradeRevokeService(CurUser).TradeRevoke(tradeidArr, actionType); return JsonSuccess("交易撤销成功"); } public JsonResult tradewithdraw(string tradeids) { var tradeidArr = DataConvert.ConvertCommaValuesToInt32Array(tradeids); new TradeRevokeService(CurUser).TradeWithdraw(tradeidArr); return JsonSuccess("交易撤销成功"); } public JsonResult tradeConfirm(string tradeids, string additionalProcessing, bool isSkipCheck = false) { var tradeidArr = DataConvert.ConvertCommaValuesToInt32Array(tradeids); if (tradeids is null || !tradeids.Any(n => n > 0)) { return JsonError("请至少选择一项要生成确认书的交易,参数tradeids:" + tradeids); } var config = valuedateBLL.SystemDate; var ignoreMoneyCheck = tradeidArr.Count() == 1 && additionalProcessing == tradeBLL.LackOfMoney; var isSkipApproval = false; if (CurUser.交易管理_特批批量确认 && isSkipCheck) { ignoreMoneyCheck = true; isSkipApproval = true; } var result = new TradeConfirmService(CurUser).tradeConfirm(tradeidArr, ignoreMoneyCheck, isSkipApproval); //如果客户缺少资金而操作者有交易特批权限 if (!ignoreMoneyCheck && result.LackOfMoney) { return JsonSuccessData(new { proccessType = "AdditionalProcessing", type = PS.Config.ErpElement.Company == Configuration.CompanyEnum.天风 || config.SpecialOperateForTrade == 1 ? tradeBLL.LackOfMoney : "", TrialDataId = result.TrialDataId, message = result.errorMsg, typecode = result.type }); } //生成交易确认书 if (PS.Config.IsAutoGenerateContracts && result.confirmedTradeIds?.Count > 0) { new TradeContractGenerateService(CurUser).GenerateContractsAsync(result.confirmedTradeIds, "确认书"); } if (!string.IsNullOrEmpty(result.errorMsg)) { if (result.changeConfirmPaths?.Count > 0) { return JsonError(string.Format("确认成交失败,原因:{0}", result.errorMsg), new { generateChangeSuccess = true, url = result.changeConfirmPaths }); } return JsonError(string.Format("确认成交失败,原因:{0}", result.errorMsg)); } else { if (result.changeConfirmPaths?.Count > 0) { return JsonSuccess("操作完成", new { generateChangeSuccess = true, url = result.changeConfirmPaths }); } return JsonSuccess("操作完成"); } } public JsonResult SendChangeConfirmEmails(string tradeids) { if (string.IsNullOrWhiteSpace(tradeids)) { return JsonError("交易id不能为空"); } var int_tradeids = tradeids.Split(","[0]).Select(d => Convert.ToInt32(d)).ToList(); var tradeList = db.trade.Where(t => int_tradeids.Contains(t.id)).ToList(); var errorList = new List(); try { tradeList.ForEach(trade => { var changes = new TradeAuditLogService(CurUser).GetLastConfirmChangeMsg(trade.id); if (changes == null || !changes.Any()) { errorList.Add($"{trade.TradeNumber}发送变更确认书失败,因为没有变更信息"); return; } #region 生成邮件内容 var bodyhtml = string.Empty; var contentSB = new StringBuilder(); contentSB.Append("
"); contentSB.Append($"

交易信息变更确认书

"); contentSB.Append($"

经双方协商确定,编号为{trade.TradeNumber}的交易信息,"); foreach (var change in changes) { contentSB.Append(change.DisplayName).Append("由") .Append(change.OldValue).Append("变更为").Append(change.NewValue).Append(","); } contentSB[contentSB.Length - 1] = '。'; contentSB.Append($"

"); contentSB.Append($"

{PS.Config.CompanyName ?? ""}    {trade.ClientName}    {valuedateBLL.ValueDate:yyyy年M月d日}

"); contentSB.Append("
"); bodyhtml = contentSB.ToString(); #endregion // 要向该客户的所有订阅了邮件通知的人员发送邮件 var emails = ClientDataQueryService.GetClientEmails(trade.ClientId, false); emails = emails.Where(e => !string.IsNullOrWhiteSpace(e)).ToHashSet(); if (!emails.Any()) { errorList.Add($"{trade.TradeNumber}发送变更确认书失败,因为没有设置相关邮件接收人"); return; } var filePath = new TradeMetaService(CurUser).GetTradeMeta(trade.id, "交易确认书"); if (!string.IsNullOrWhiteSpace(filePath)) { filePath = Server.MapPath(filePath); } var sendMail = EmailHelper.SendMail(string.Join(";", emails), "交易变更确认书", bodyhtml, true, new[] { filePath }); if (!string.IsNullOrEmpty(sendMail)) { errorList.Add($"{trade.TradeNumber}发送变更确认书失败,因为{sendMail}"); return; } }); if (errorList.Count > 0) { return JsonError(string.Join("
", errorList)); } return JsonSuccess(); } catch (Exception ex) { LogFactory.GetLogger("SendChangeConfirmEmails").Error("SendChangeConfirmEmails有异常", ex); return JsonError("发送邮件异常"); } } /// /// 结算波动率设置-选择交易,直接显示(状态:确认成交 是否有效:有效)不包含结构父交易 /// [HttpPost] public JsonResult tradeQueryPick(TradeReq req) { req.LoginUserId = CurUser.UserId; req.TradeStatus = ConsTrade.确认成交; if (req.TradeTypes.IsNullOrWhiteSpace()) { req.TradeTypes = string.Join(",", ConsTrade.TradeTypesForOtcOptions); } req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); var sList = new TradeQueryService(CurUser).SearchList(req, new TradeQueryRequest { ShowAllTrades = ShowAllTrades, UserAssetUnits = GetUserAssetunitIds(), StructureQueryFlag = StructureTradeQueryFlag.QuerySubs }); foreach (var r in sList.rows) { if (r.TradeType == "合成价差期权") { r.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.UnderlyingCode); } } return Json(sList); } [HttpPost] public JsonResult tradeQuery(TradeReq req) { //不加这个限制前端导出就down掉了 if (req.rows < 1 || req.rows > 10000) { req.rows = 10000; } req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new TradeQueryService(CurUser).SearchListWithGroup(req, new TradeQueryRequest { ShowAllTrades = ShowAllTrades, UserAssetUnits = ShowAllTrades ? null : GetUserAssetunitIds() }); if (sList == null && sList.rows == null || !sList.rows.Any()) { return Json(sList); } var tradePairIds = sList.rows.Select(x => x.PairTrade).ToList(); var tradeList = db.trade.Where(x => tradePairIds.Contains(x.id.ToString())).ToList(); List childTradeList = null; var tradeids = sList.rows.Select(r => r.id).ToList(); childTradeList = db.trade.AsNoTracking().Where(x => tradeids.Contains(x.ParentTradeId) && x.ParentTradeId > 0).ToList(); if (childTradeList == null) { childTradeList = new List(); } var tcProvider = new TradeCashProvider(CurUser).Initialize(tradeids, childTradeList); var realtimerisk = realtime_trade_riskBLL.GetAllrealtime_trade_valueModel(); var tradeContractCodeList = (from tradeContractR in db.trade_contract_r where tradeids.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.IsValid select tradeContractR).ToList(); var unProvider = new UnderlyingDataProvider(); new TradeDalService(CurUser).SetStructureInfo(sList.rows, childTradeList); Dictionary> tradeTagList = null; if (sList != null && sList.rows != null && sList.rows.Any()) { using (var service = new TagService(CurUser)) { tradeTagList = service.GetTagByTradeIds(sList.rows.Select(p => p.id).Distinct().ToList()); } } if (tradeTagList == null) { tradeTagList = new Dictionary>(); } var unwindDetailList = tcProvider.BatchGetUnwindDetail(sList.rows, childTradeList); foreach (var r in sList.rows) { if (req.TabIndex == (int)TradeTabIndexEnum.场外成交记录) { //var detail = tcProvider.GetUnwindDetail(r); var detail = unwindDetailList.FirstOrDefault(p => p.TradeId == r.id); if (detail != null) { r.UnWindDate = detail.UnWindDate; r.UnWindTradePrice = detail.UnWindSinglePrice; r.UnWindUnderlyingPrice = detail.UnWindUnderlyingPrice; r.UnWindTotalAmount = detail.UnWindTotalAmount; r.UnWindFee = detail.UnWindTotalFee; r.UnWindTimes = detail.UnWindTimes; r.Amount = detail.UnWindAmount; r.FinalPrice = detail.UnWindUnderlyingPrice; r.RealizedPnl = detail.RealizedPnl; } } if (r.TradeType == "合成价差期权") { r.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.UnderlyingCode); } var tradePair = tradeList.FirstOrDefault(x => x.id.ToString() == r.PairTrade); r.PairTradeNumber = tradePair == null ? "" : tradePair.TradeNumber; r.LotsNewInfo = TradeLotsCalc.GetLots(r.UnderlyingCode, r.Notional); var pv = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair(t.VolType, t.Pv)).ToList(); var roundedPv = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair(t.VolType, t.RoundedPv)).ToList(); var positionPnl = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair(t.VolType, t.PositionPnl)).ToList(); var roundedPositionPnl = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair(t.VolType, t.RoundedPositionPnl)).ToList(); if (r.IsGroup == 1) { //var childTradeIds = db.trade.Where(x => x.ParentTradeId == r.id && ConsTrade.LiveTradeStatusList.Contains(x.TradeStatus)).Select(x => x.id).ToList(); var childTradeIds = childTradeList.Where(x => x.ParentTradeId == r.id && ConsTrade.LiveTradeStatusList.Contains(x.TradeStatus)).Select(x => x.id).ToList(); pv = realtimerisk.Where(t => childTradeIds.Contains(t.TradeId ?? 0)).GroupBy(x => x.VolType).Select(t => new KeyValuePair(t.Key, t.Sum(g => g.Pv))).ToList(); roundedPv = realtimerisk.Where(t => childTradeIds.Contains(t.TradeId ?? 0)).GroupBy(x => x.VolType).Select(t => new KeyValuePair(t.Key, t.Sum(g => g.RoundedPv))).ToList(); positionPnl = realtimerisk.Where(t => childTradeIds.Contains(t.TradeId ?? 0)).GroupBy(x => x.VolType).Select(t => new KeyValuePair(t.Key, t.Sum(g => g.PositionPnl))).ToList(); roundedPositionPnl = realtimerisk.Where(t => childTradeIds.Contains(t.TradeId ?? 0)).GroupBy(x => x.VolType).Select(t => new KeyValuePair(t.Key, t.Sum(g => g.RoundedPositionPnl))).ToList(); } if (PS.Config.IsPVRounded) { if (roundedPv != null && roundedPv.Count > 0) { r.PV = roundedPv.ToJson(); } if (roundedPositionPnl != null && roundedPositionPnl.Count > 0) { r.PositionPnl = roundedPositionPnl.ToJson(); } } else { if (pv != null && pv.Count > 0) { r.PV = pv.ToJson(); } if (positionPnl != null && positionPnl.Count > 0) { r.PositionPnl = positionPnl.ToJson(); } } if (r.TradeType == "场内期权" && !string.IsNullOrEmpty(r.ExchangeOptionCode)) { var exOption = DataCacheProvider.GetExchangeListOptionDataSource().GetData(r.ExchangeOptionCode); if (exOption != null) { r.UnderlyingPrice = exOption.Price; } } else { DataCacheProvider.GetUnderlyingDataSource().TryGetPrice(r.UnderlyingCode, out var price); r.UnderlyingPrice = price; } //TradeOriginalAmount 赋值逻辑 r.TradeOriginalAmount = r.OriginalNotional; if (!ConsTrade.TradeTypesForHedge.Contains(r.TradeType) && r.TradeType != "现金流交易") { var CountRatio = unProvider.GetCountRatio(r.UnderlyingCode); r.TradeOriginalAmount = r.OriginalNotional / CountRatio; } //合同编号 var tradeContractCode = tradeContractCodeList.FirstOrDefault(t => t.TradeId == r.id); r.ContractCode = tradeContractCode?.ContractCode; r.CountRatio = DataCacheProvider.GetUnderlyingDataSource().GetData(r.UnderlyingCode)?.CountRatio ?? 1; if (PS.Config.IsGuoJun) { r.UnderlyingVariety = YLErp.Modules.UnderlyingModule.UnderlyingHelper.GetUnderlyingVarietyCode(r.UnderlyingCode); } //拼装标签值 if (tradeTagList.ContainsKey(r.id)) { r.Tags = tradeTagList[r.id]; r.OutputTags = TagService.GetOutputTagsStr(r.Tags); } } //最新价格‘所取的值:已平仓的交易-平仓费;已行权的交易-行权收益,已到期的-行权收益(应该是0); 活着的持仓交易-QDP在刷新页面时算出来的价格 return Json(sList); } [HttpPost] public JsonResult SearchGroupChildrenList(int id) { var trades = new TradeQueryService(CurUser).SearchGroupChildrenList(id); var tradeids = trades.Select(r => r.id).ToList(); var tcProvider = new TradeCashProvider(CurUser).Initialize(tradeids); var realtimerisk = realtime_trade_riskBLL.GetAllrealtime_trade_valueModel(); var tradeContractCodeList = (from tradeContractR in db.trade_contract_r where tradeids.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.IsValid select tradeContractR).ToList(); Dictionary> tradeTagList = null; if (trades != null && trades.Any()) { using (var service = new TagService(CurUser)) { tradeTagList = service.GetTagByTradeIds(tradeids); } } if (tradeTagList == null) { tradeTagList = new Dictionary>(); } var unProvider = new UnderlyingDataProvider(); foreach (var r in trades) { if (r.TradeType == "障碍期权") { var option = db.trade_barrier_option.FirstOrDefault(x => x.TradeId == r.id); r.KnockInOutStatusObservation = option?.KnockInOutStatusCn; } else if (r.TradeType == "双鲨期权") { var option = db.trade_double_sharkfin_option.FirstOrDefault(x => x.TradeId == r.id); r.KnockInOutStatusObservation = option?.KnockInOutStatusCn; } else if (r.TradeType == "凤凰期权") { var option = db.trade_autocall.FirstOrDefault(x => x.TradeId == r.id); r.KnockInOutStatusObservation = option?.KnockInOutStatusCn; } else if (r.TradeType == "雪球期权") { var option = db.trade_snowball.FirstOrDefault(x => x.TradeId == r.id); r.KnockInOutStatusObservation = option?.KnockInOutStatusCn; } else if (r.TradeType == "气囊结构") { var option = db.trade_airbag.FirstOrDefault(x => x.TradeId == r.id); r.KnockInOutStatusObservation = option?.KnockInOutStatusCn; } else if (r.TradeType == "累计期权") { var option = db.trade_accumulator_option.FirstOrDefault(x => x.TradeId == r.id); r.KnockInOutStatusObservation = option?.KnockInOutStatusCn; } var detail = tcProvider.GetUnwindDetail(r); if (detail != null) { r.UnWindDate = detail.UnWindDate; r.UnWindTradePrice = detail.UnWindSinglePrice; r.UnWindUnderlyingPrice = detail.UnWindUnderlyingPrice; r.UnWindTotalAmount = detail.UnWindTotalAmount; r.UnWindFee = detail.UnWindTotalFee; r.UnWindTimes = detail.UnWindTimes; r.Amount = detail.UnWindAmount; r.FinalPrice = detail.UnWindUnderlyingPrice; r.RealizedPnl = detail.RealizedPnl; } if (r.TradeType == "合成价差期权") { r.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.UnderlyingCode); } r.LotsNewInfo = TradeLotsCalc.GetLots(r.UnderlyingCode, r.Notional); var pv = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair(t.VolType, t.Pv)).ToList(); var roundedPv = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair(t.VolType, t.RoundedPv)).ToList(); var positionPnl = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair(t.VolType, t.PositionPnl)).ToList(); var roundedPositionPnl = realtimerisk.Where(t => t.TradeId == r.id).Select(t => new KeyValuePair(t.VolType, t.RoundedPositionPnl)).ToList(); if (PS.Config.IsPVRounded) { if (roundedPv != null && roundedPv.Count > 0) { r.PV = roundedPv.ToJson(); } if (roundedPositionPnl != null && roundedPositionPnl.Count > 0) { r.PositionPnl = roundedPositionPnl.ToJson(); } } else { if (pv != null && pv.Count > 0) { r.PV = pv.ToJson(); } if (positionPnl != null && positionPnl.Count > 0) { r.PositionPnl = positionPnl.ToJson(); } } if (r.TradeType == "场内期权" && !string.IsNullOrEmpty(r.ExchangeOptionCode)) { var exOption = DataCacheProvider.GetExchangeListOptionDataSource().GetData(r.ExchangeOptionCode); if (exOption != null) { r.UnderlyingPrice = exOption.Price; } } else { DataCacheProvider.GetUnderlyingDataSource().TryGetPrice(r.UnderlyingCode, out var price); r.UnderlyingPrice = price; } //TradeOriginalAmount 赋值逻辑 r.TradeOriginalAmount = r.OriginalNotional; if (!ConsTrade.TradeTypesForHedge.Contains(r.TradeType) && r.TradeType != "现金流交易") { var CountRatio = unProvider.GetCountRatio(r.UnderlyingCode); r.TradeOriginalAmount = r.OriginalNotional / CountRatio; } //合同编号 var tradeContractCode = tradeContractCodeList.FirstOrDefault(t => t.TradeId == r.id); r.ContractCode = tradeContractCode?.ContractCode; r.SalesCommission = new Modules.SalesModule.SalesCommissionDataService(CurUser).GetTradeCommissionInfo(r.id); if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1" && r.SalesCommission?.Commission != null) { r.SalesCommission.Commission = r.SalesCommission.Commission * r.SalesCommission.SalesIds.Count(); } if (PS.Config.IsGuoJun) { r.UnderlyingVariety = YLErp.Modules.UnderlyingModule.UnderlyingHelper.GetUnderlyingVarietyCode(r.UnderlyingCode); } //拼装标签值 if (tradeTagList.ContainsKey(r.id)) { r.Tags = tradeTagList[r.id]; r.OutputTags = TagService.GetOutputTagsStr(r.Tags); } } return Json(trades); } /// /// /// /// /// 当日到期页面关于黑箱累计期权,展开时,只展示当日到期的子交易,非当日到期的子交易不展示 /// public JsonResult SearchGroupChildrenConfirmList(int id, bool isExerciseDate = false) { var trades = new TradeQueryService(CurUser).SearchGroupChildrenList(id).Where(x => (x.ExerciseDate == valuedateBLL.ValueDate || !isExerciseDate)); var tradeids = trades.Select(r => r.id).ToList(); var tcProvider = new TradeCashProvider(CurUser).Initialize(tradeids); var realtimerisk = realtime_trade_riskBLL.GetAllrealtime_trade_valueModel(); var tradeContractCodeList = (from tradeContractR in db.trade_contract_r where tradeids.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.IsValid select tradeContractR).ToList(); var unProvider = new UnderlyingDataProvider(); if (trades != null && trades.Any()) { var tradeIds = trades.Select(x => x.id).ToList(); var tradeCashQuery = from tc in db.trade_cash where tradeIds.Contains(tc.TradeId) && (tc.Action == ClientCashInCashOut.系统操作_行权费 || tc.Action == ClientCashInCashOut.系统操作_票息 || tc.Action == ClientCashInCashOut.系统操作_互换) && tc.ValidState != "InValid" && !tc.IsDeleted && tc.Status == TradeCashStatusEnum.已执行 && tc.BarrierPrice == null //不包含敲出数据 select tc; var tradeCashDatas = tradeCashQuery.ToArray(); var underlyingIds = trades.Select(x => x.UnderlyingId).ToList(); var underlyings = db.underlying_manager.Where(x => underlyingIds.Contains(x.id)).ToArray(); var underlyingTypeIds = underlyings.Select(x => x.UnderlyingTypeId).Distinct(); var varietys = db.variety.Where(x => underlyingTypeIds.Contains(x.id)).ToArray(); var result = TradeRiskCalcTaskRunner.GetCalcResult("对冲"); //new TradeDalModule.TradeDalService(this).SetStructureInfo(sList.rows); foreach (var tradeObj in trades) { if (tradeObj.TradeStatus == "已执行" || tradeObj.TradeStatus == "已到期" || tradeObj.TradeStatus == "已平仓") { tradeObj.TradeAmount = 0; } var tradeCash = tradeCashDatas.OrderByDescending(x => x.id).FirstOrDefault(d => d.TradeId == tradeObj.id); new TodayTradeQueryService(CurUser).ProcessTrade(tradeObj, tradeCash);//最后一笔到期结算流水 if (tradeObj.TradeType == "远期") { tradeObj.trade_forward = db.trade_forward.First(x => x.TradeId == tradeObj.id); } var cashTrades = db.trade_cash.Where(t => t.ValidState != ConsGlobal.InValid && t.TradeId == tradeObj.id && t.BarrierPrice == null && !t.IsDeleted).ToList(); var cashTradesExercise = cashTrades.Where(t => t.Action == ClientCashInCashOut.系统操作_行权费).ToList(); var cashTradesUnwind = cashTrades.Where(t => t.Action == ClientCashInCashOut.系统操作_平仓费).ToList(); if (tradeObj.TradeType == "收益互换") { var cashTradesSwap = cashTrades.Where(t => t.Action == ClientCashInCashOut.系统操作_互换).ToList(); var lastTradeCashSwap = cashTradesSwap.OrderByDescending(x => x.ValueDate).FirstOrDefault(); if (lastTradeCashSwap != null) { tradeObj.trade_cash.trade_cash_swap = db.trade_cash_swap.FirstOrDefault(x => x.TradeCashId == lastTradeCashSwap.id); } tradeObj.RealizedPnl = cashTradesSwap.Sum(x => x.Amount) - tradeObj.TradePrice * cashTradesSwap.Sum(x => x.UnwindPercentRate) * ((tradeObj.BuySell == "卖出") ? -1 : 1) + cashTradesUnwind.Sum(x => x.Amount) - tradeObj.TradePrice * cashTradesUnwind.Sum(x => x.UnwindPercentRate) * ((tradeObj.BuySell == "卖出") ? -1 : 1); } else { tradeObj.RealizedPnl = cashTradesExercise.Sum(x => x.Amount) - tradeObj.TradePrice * cashTradesExercise.Sum(x => x.UnwindPercentRate) * ((tradeObj.BuySell == "卖出") ? -1 : 1) + cashTradesUnwind.Sum(x => x.Amount) - tradeObj.TradePrice * cashTradesUnwind.Sum(x => x.UnwindPercentRate) * ((tradeObj.BuySell == "卖出") ? -1 : 1); } if (result != null && result.TradeRiskList != null) { var risk = result.TradeRiskList.FirstOrDefault(x => x.TradeId == tradeObj.id); tradeObj.DeltaInLots = risk != null ? risk.DeltaInLots : 0; } var realStrike = tradeObj.IsMoneynessOptionData ? (tradeObj.SpotPrice ?? 0) * (tradeObj.Strike ?? 0) : tradeObj.Strike ?? 0; tradeObj.ValueStatus = "-"; Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().TryGetPrice(tradeObj.UnderlyingCode, out var price); tradeObj.UnderlyingPrice = price; tradeObj.UnderlyingName = Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(tradeObj.UnderlyingCode)?.UnderlyingName; if (tradeObj.IsOption() && price > 0) { if (realStrike == price) { tradeObj.ValueStatus = "ATM 100%"; } else if ((realStrike < price && tradeObj.OptionType == "看涨") || (realStrike > price && tradeObj.OptionType == "看跌")) { tradeObj.ValueStatus = "ITM " + (realStrike / price * 100).ToString("0.00") + "%"; } else { tradeObj.ValueStatus = "OTM " + (realStrike / price * 100).ToString("0.00") + "%"; } } var pv = realtimerisk.Where(t => t.TradeId == tradeObj.id).Select(t => new KeyValuePair(t.VolType, t.Pv)).ToList(); var roundedPv = realtimerisk.Where(t => t.TradeId == tradeObj.id).Select(t => new KeyValuePair(t.VolType, t.RoundedPv)).ToList(); if (PS.Config.IsPVRounded) { if (roundedPv != null && roundedPv.Count > 0) { tradeObj.PV = roundedPv.ToJson(); } } else { if (pv != null && pv.Count > 0) { tradeObj.PV = pv.ToJson(); } } if (tradeObj.TradeType == "合成价差期权") { tradeObj.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(tradeObj.UnderlyingCode); } tradeObj.SalesCommission = new Modules.SalesModule.SalesCommissionDataService(CurUser).GetTradeCommissionInfo(tradeObj.id); if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1" && tradeObj.SalesCommission?.Commission != null) { tradeObj.SalesCommission.Commission = tradeObj.SalesCommission.Commission * tradeObj.SalesCommission.SalesIds.Count(); } } } return Json(trades); } public JsonResult SearchSwapGroupChildrenConfirmList(int id) { var trades = new TradeQueryService(CurUser).SearchGroupChildrenList(id); var tradeids = trades.Select(r => r.id).ToList(); var swapTrades = yldb.trade_swap.Where(t => tradeids.Contains(t.TradeId)).ToList(); foreach (var r in trades) { r.trade_swap = swapTrades.FirstOrDefault(x => x.TradeId == r.id); r.MetaDic.Add("GetUnderlyingName", r.trade_swap.GetUnderlyingCode == null ? "" : Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(r.trade_swap.GetUnderlyingCode).UnderlyingName); r.MetaDic.Add("PayUnderlyingName", r.trade_swap.PayUnderlyingCode == null ? "" : Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(r.trade_swap.PayUnderlyingCode).UnderlyingName); } return Json(trades); } [HttpPost] public JsonResult tradeQueryV2(TradeReq req) { req.LoginUserId = CurUser.UserId; req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); var userAsset = CurUser.GetAssetUnitIds(); var sList = new TradeBarrierReportService(CurUser).SearchTrades(req, userAsset, false, true); return Json(sList); } /// /// 客户行权日报告查询。 /// 查询某客户或全部客户在指定交易日可执行或可到期的交易列表(无论是否已经执行或到期) /// /// 查询条件 /// 是否为客户行权日报告查询,如果为true,则不分欧式美式期权,一律严格按期权到期日查询 [HttpPost] public JsonResult todayMaturityTradeQuery(TradeReq req, bool? IsClientExerciseDateReport) { var systemDate = valuedateBLL.ValueDate; req.ExerciseDate = req.ExerciseDate ?? systemDate; req.ExerciseDateStart = req.ExerciseDateStart ?? DateTime.MinValue; req.ExerciseDateEnd = req.ExerciseDateEnd ?? DateTime.MaxValue; req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); //req.TradeStatus = ConsTrade.确认成交; req.TradeStatusList = new List { ConsTrade.已到期, ConsTrade.已执行, ConsTrade.确认成交, ConsTrade.期初价格已确认, ConsTrade.行权待复核, ConsTrade.提前终止拒绝 }; if (req.TradeTypes == null) { //默认只查询期权类交易 req.TradeTypes = string.Join(",", ConsTrade.TradeTypesForOtcOptions); } req.LoginUserId = CurUser.UserId; req.sidx = "ExerciseDate,UnderlyingCode,ExerciseMode,BuySell,Strike"; req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new TradeQueryService(CurUser).SearchList(req, new TradeQueryRequest { ShowAllTrades = ShowAllTrades, UserAssetUnits = GetUserAssetunitIds(), IsExerciseDateReport = IsClientExerciseDateReport ?? false, StructureQueryFlag = StructureTradeQueryFlag.QuerySubs }); foreach (var x in sList.rows) { if (x.TradeType == "亚式期权") { tradeBLL.SetFieldsByTradeType(x); } if (x.TradeType == "合成价差期权") { x.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(x.UnderlyingCode); } } return Json(sList); } public string ChangeBuySellToClient(string BuySell) { return BuySell == "买入" ? "卖出" : "买入"; } /// /// 将单个交易标记为到期(并增加一条收益为零的trade_cash记录,直接到期的交易记录期末价格为0) /// public JsonResult tradeExpireConfirm(string enid, double spotPrice = 0) { var id = DataProtectHelper.DecryptInt(enid); var result = new TradeExpireConfirmService(CurUser).TradeExpireConfirm(id, spotPrice); if (result.Success) { return JsonSuccess(result.Message, result.Trade); } return JsonError(result.Message, result.Trade); } public JsonResult backTrade(string enid) { var id = DataProtectHelper.DecryptInt(enid); var td = new TradeBackService(CurUser).Execute(id, true, TradeBackActionEnum.backTrade); return JsonSuccess("回退成功", td); } public JsonResult backTradeStepped(string enid) { var id = DataProtectHelper.DecryptInt(enid); var trade = db.trade.Find(id); if (!((trade.TradeStatus == ConsTrade.确认成交 && (trade.Notional != trade.OriginalNotional || trade.StockEqvNotional != trade.OriginalStockEqvNotional || trade.Warning)) || trade.TradeStatus == ConsTrade.已平仓 || trade.TradeStatus == ConsTrade.已执行 || trade.TradeStatus == ConsTrade.已到期)) { return JsonError("该交易当前状态下不可回退"); } var td = new TradeBackService(CurUser).Execute(id, trade.Warning, TradeBackActionEnum.backTradeStepped); return JsonSuccess("回退成功", td); } public JsonResult backGroupTradeStepped(string enid) { var id = DataProtectHelper.DecryptInt(enid); var trade = db.trade.Find(id); if (!(db.trade_cash.Any(x => x.TradeId == trade.id && x.Action != "系统操作-期权费") || trade.Warning)) { return JsonError("该交易当前状态下不可回退"); } var childTrades = db.trade.Where(x => x.ParentTradeId == id); if (childTrades.Any(x => x.TradeType == "雪球期权" || x.TradeType == "凤凰期权")) { var td = new TradeBackService(CurUser).BackGroup(id, true, TradeBackActionEnum.backTradeStepped); return JsonSuccess("回退成功", td); } else { var td = new TradeBackService(CurUser).BackGroup(id, trade.Warning, TradeBackActionEnum.backTradeStepped); return JsonSuccess("回退成功", td); } } public ActionResult tradeBack(string enid) { var id = DataProtectHelper.DecryptInt(enid); var trade = db.trade.Find(id); var model = new TradeBackModel() { TradeId = id, ValueDate = valuedateBLL.ValueDate <= trade.ExerciseDate ? valuedateBLL.ValueDate : trade.ExerciseDate.Value, TradeDate = trade.TradeDate.Value }; return View(model); } public JsonResult backTradeByDate(TradeBackModel model) { var service = new TradeBackService(CurUser); var trade = db.trade.Find(model.TradeId); var td = service.Execute(model.TradeId, model.ValueDate); if (trade.IsGroup == 1) { var trades = db.trade.Where(x => x.ParentTradeId == model.TradeId && x.ValidState != "InValid").ToList(); trades.ForEach(x => { service.Execute(x.id, model.ValueDate, true); }); } return JsonSuccess("回退成功", td); } /// /// 将多个交易标记为到期 /// /// 以逗号隔开的未加密交易id public JsonResult MultipleTradeExpireConfirm(IEnumerable tradeIds) { new TradeExpireConfirmService(CurUser).MultipleTradeExpireConfirm(tradeIds, out var successMsg); return JsonSuccess(successMsg); } /// /// 根据主键获取 /// [HttpGet] public JsonResult tradeGetById(int id) { var data = db.trade.Find(id); return Json(data); } public ActionResult tradeEdit(string enid, bool isUseApproval = false) { var structureTypes = new StructureService(CurUser) .QueryStructureInfo(StructureRangeEnum.CUSTOM_TRADE) .Select(O => new SelectListItem() { Text = O.StructureName, Value = O.StructureName }) .ToList(); ViewBag.StructureTypes = structureTypes; ViewBag.isUseApproval = isUseApproval; using (var tagService = new TagService(CurUser)) { ViewBag.TagList = tagService.GetTagListByType(TagTypeEnum.Trade); } ViewBag.IsCheck = false; return TradeEditV2(enid); } public ActionResult EditRemarkInfo(string enid) { var intid = DecryptInt(enid); var td = new TradeDetailsQueryService(CurUser).GetOtcTradeFull(intid); return View(td); } public JsonResult SaveComments(string enid, string Comments) { var intid = DecryptInt(enid); var td = db.trade.Find(intid); var td_copy = td.Clone(); td.Comments = Comments; var changes = DataChangeHelper.GetDataChanges(td_copy, td); db.TradeAuditLog.Add(new TradeAuditLog { TradeId = td.id, Changes = changes.ToJson(), DataType = "00", OptType = "修改备注", OptId = UserId, OptName = UserName, OptDate = DateTime.Now, AuditFlag = TradeAuditFlag.operation }); db.SaveChanges(); return JsonSuccess("修改备注成功"); } /// /// 设置观察日或互换日 /// /// /// /// /// /// /// /// /// 观察日对应的第一个属性名(例如凤凰期权障碍价格;互换的互换利率) /// 观察日对应的第二个属性名(例如凤凰期权票息;互换没有互换日期对应的第二属性,默认stringEmpty) /// 观察日对应的第三个属性名(例如收益互换类型:是否结算) /// public ActionResult tradeObservationDates( string observationNum, string observationUnit, string observationHolidayType, string Isavg, string argDate, string tradeType, DateTime startTime, DateTime endTime, bool alignEnd, string btnId, string title1 = null, string title2 = null, string title3 = null, bool isTitle2TrueFalse = false, bool isTitle1Percent = false, bool isTitle2Percent = false, bool isTitle3Percent = false, decimal? defaultTitle1Value = null, decimal? defaultTitle2Value = null, decimal? defaultTitle3Value = null, bool hideTips = false, string dateTitle = null, bool showDate2 = false, string date2Title = null, bool showDate2OffsetControl = false, string date2OffsetControlTitle = null, int couponDayInterval = 0, string Comments = "", string calcMode = "01", bool showCloseCheck = false, string ObservationFrequency = null) { var model = new ObservationDatesModel { TradeType = tradeType, ObservationHolidayType = string.IsNullOrEmpty(observationHolidayType) ? "Following" : observationHolidayType, ObservationNum = string.IsNullOrEmpty(observationNum) ? "1" : observationNum, ObservationUnit = string.IsNullOrEmpty(observationUnit) ? "D" : observationUnit, ObservationFrequency = string.IsNullOrEmpty(ObservationFrequency) ? "" : ObservationFrequency, Isavg = Isavg, argDate = argDate, startTime = startTime, endTime = endTime, AlignEnd = alignEnd, BtnId = btnId, Title1 = title1, Title2 = title2, Title3 = title3, isTitle2TrueFalse = isTitle2TrueFalse, IsTitle1Percent = isTitle1Percent, IsTitle2Percent = isTitle2Percent, IsTitle3Percent = isTitle3Percent, DefaultTitle1Value = defaultTitle1Value, DefaultTitle2Value = defaultTitle2Value, DefaultTitle3Value = defaultTitle3Value, HideTips = hideTips, DateTitle = dateTitle, ShowDate2 = showDate2, Date2Title = date2Title, ShowDate2OffsetControl = showDate2OffsetControl, Date2OffsetControlTitle = date2OffsetControlTitle, CouponDayInterval = couponDayInterval, Comments = Comments, CalcMode = calcMode, ShowCloseCheck = showCloseCheck }; return View(model); } /// /// 设置 均价结算日 /// /// public ActionResult tradeAveragePriceDates( string observationNum, string observationUnit, string observationHolidayType, DateTime startTime, DateTime endTime, DateTime tradeDate, string btnId, string Comments = "") { var model = new ObservationDatesModel() { ObservationNum = string.IsNullOrEmpty(observationNum) ? "1" : observationNum, ObservationHolidayType = string.IsNullOrEmpty(observationHolidayType) ? "Following" : observationHolidayType, ObservationUnit = string.IsNullOrEmpty(observationUnit) ? "D" : observationUnit, startTime = startTime, endTime = endTime, BtnId = btnId, Comments = Comments, tradeDate = tradeDate, }; return View(model); } public ActionResult tradeObservationStatusList(int tabIndex = (int)ObservationStatusTradeEnum.Barrier) { ViewBag.TabIndex = tabIndex; return View(); } public ActionResult tradeObservationDateInfoList(string title1 = null, string title2 = null, bool isTitle1Percent = false, bool isTitle2Percent = false) { ViewBag.Title1 = title1; ViewBag.Title2 = title2; ViewBag.IsTitle1Percent = isTitle1Percent; ViewBag.IsTitle2Percent = isTitle2Percent; return View(); } [HttpPost] public JsonResult GetObservationDates(DateTime startTime, DateTime endTime, string termStr, string observationHolidayType, bool alignEnd) { var bdc = (BusinessDayConvention)Enum.Parse(typeof(BusinessDayConvention), observationHolidayType); return JsonSuccess("", QdpObservationHelper.GetObservationDateString(startTime, endTime, termStr, bdc, alignEnd)); } [HttpPost] public JsonResult GetObservationDateList(GetObservationDateRequest req) { var bdc = (BusinessDayConvention)Enum.Parse(typeof(BusinessDayConvention), req.holidayAdjustment); return JsonSuccess("", QdpObservationHelper.GetDatesWithFixedTerm(req.startDate, req.endDate, req.termStr, bdc, req.alignEnd, req.calcMode)); } public ActionResult StructureList(string structure, string CalcId, bool onlyshow = false) { var ret = new DZStructureService(CurUser).getStructureList(structure); ViewBag.CalcId = CalcId; ViewBag.onlyshow = onlyshow; return View(ret); } /// /// 根据一组日期序列和偏移量计算出另一组日期序列 /// /// 日期序列 /// 偏移量 /// 对齐类型 /// [HttpPost] public JsonResult GetObservationDateListOfDates(DateTime[] dates, int offset, BusinessDayConvention holidayAdjustment) { var list = new DateTime[dates.Length]; for (var i = 0; i < dates.Length; i++) { var d = dates[i].AddDays(offset); switch (holidayAdjustment) { case BusinessDayConvention.Following: list[i] = QdpCalendarHelper.GetNonHoliday(d); break; case BusinessDayConvention.Previous: list[i] = QdpCalendarHelper.GetNonHolidayDefore(d); break; default: list[i] = d; break; } } return JsonSuccess("", list); } public ActionResult tradeEditGroup(trade trade, int[] tradeIds) { if (trade.id > 0) { trade = db.trade.Find(trade.id); tradeIds = db.trade.Where(x => x.ParentTradeId == trade.id).Select(x => x.id).ToArray(); } var model = new TradeEditViewModel(CurUser, UserBLL.IsTradeOfCurrentLogin(CurUser.UserId)) { IsCheck = false }; trade.TradeType = trade.StructureType; var tradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(trade); if (trade.id == 0) { tradeFull.StructureType = "气囊结构"; tradeFull.OptionType = "看涨"; tradeFull.BarrierLow = 0.8; tradeFull.Strike = 1; tradeFull.NotKIParticipationRate = 1; tradeFull.KIParticipationRate = 1; if (tradeIds.Any()) { tradeFull.MetaDic = new TradeMetaService(CurUser).GetTradeMeta(tradeIds.FirstOrDefault()); } ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.BALCK_TRADE); } else { tradeFull.MetaDic.TryGetValue(ConsTradeMetaKey.tradeExtendInfo, out var structureType); ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.BALCK_TRADE, tradeFull, tradeFull.StructureType); } tradeFull.TradeType = "结构化交易"; tradeFull.StockEqvNotionalMax = tradeFull.StockEqvNotional; var un = underlying_managerBLL.GetByCode(tradeFull.UnderlyingCode); if (un == null) { throw new ServiceException("不支持没有标的的组合交易"); } var variety = DataCacheProvider.GetVarietyDataSource().GetData(un.UnderlyingTypeId); ViewBag.variety = variety; ViewBag.TradeIds = tradeIds; model.Trade = tradeFull; if (trade.id > 0) { using (var tagService = new TagService(CurUser)) { model.Tags = tagService.GetTagByTradeId(trade.id); } } using (var tagService = new TagService(CurUser)) { ViewBag.TagList = tagService.GetTagListByType(TagTypeEnum.Trade); } ViewBag.IsCheck = false; return View("TradeEditGroup", model); } public ActionResult tradeCheckGroup(int? enid, bool isUseApproval = false) { var model = new TradeEditViewModel(CurUser, UserBLL.IsTradeOfCurrentLogin(CurUser.UserId)) { IsCheck = true }; var trade = db.trade.Find(enid); trade.TradeType = trade.StructureType; if (isUseApproval) { model.IsCheck = false; } ViewBag.abledColumn = TradeCheckUtil.GetCheckFields(trade); ViewBag.isUseApproval = isUseApproval; var tradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(trade); tradeFull.TradeType = "结构化交易"; if (tradeFull.IsUsePremiumRate != true) { tradeFull.IsUsePremiumRate = false; } trade.MetaDic = new TradeMetaService(CurUser).GetTradeMeta(trade.id); if (!isUseApproval) { tradeFull.ClientId = 0; tradeFull.ExerciseDate = null; tradeFull.TradeAmount = 0; tradeFull.Notional = 0; tradeFull.TradeSinglePrice = 0; tradeFull.PremiumRate = 0; tradeFull.StockEqvNotional = 0; } switch (tradeFull.StructureType) { case "气囊结构": if (!isUseApproval) { tradeFull.Strike = 0; tradeFull.BarrierLow = 0; tradeFull.KIParticipationRate = 0; tradeFull.NotKIParticipationRate = 0; tradeFull.HighStrike = 0; tradeFull.NotKIParticipationRate = 0; } break; default: var propertys = tradeFull.Propertys ?? new List(); if (isUseApproval == false) { propertys.ForEach(x => x.value = ""); } tradeFull.ExtendInfo = JsonHelper.Serialize(propertys); break; } model.Trade = tradeFull; var un = underlying_managerBLL.GetByCode(tradeFull.UnderlyingCode); var variety = DataCacheProvider.GetVarietyDataSource().GetData(un.UnderlyingTypeId); ViewBag.variety = variety; var subTradeIds = db.trade.Where(x => x.ParentTradeId == trade.id).Select(x => x.id).ToArray(); ViewBag.TradeIds = subTradeIds; ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.BALCK_TRADE, tradeFull, tradeFull.StructureType); using (var tagService = new TagService(CurUser)) { model.Tags = tagService.GetTagByTradeId(trade.id); } using (var tagService = new TagService(CurUser)) { ViewBag.TagList = tagService.GetTagListByType(TagTypeEnum.Trade); } ViewBag.IsCheck = true; return View("TradeEditGroup", model); } public ActionResult tradeCheck(int? enid) { var model = new TradeEditViewModel(CurUser, UserBLL.IsTradeOfCurrentLogin(CurUser.UserId)) { IsCheck = true }; ViewBag.IsCheck = true; var trade = new trade(); if (enid > 0) { trade = db.trade.Find(enid); using (var tagService = new TagService(CurUser)) { model.Tags = tagService.GetTagByTradeId(trade.id); } ViewBag.abledColumn = TradeCheckUtil.GetCheckFields(trade); var tradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(trade); if (tradeFull.IsUsePremiumRate != true) { tradeFull.IsUsePremiumRate = false; } trade.MetaDic = new TradeMetaService(CurUser).GetTradeMeta(trade.id); tradeFull.SalesCommission = new SalesCommissionDataService(CurUser).GetTradeCommissionInfo(trade.id); if (PS.Config.ErpElement.SalesCommissionCalculation == "公式1") {//计提法只支持百分比; if (tradeFull.SalesCommission.Commission.Normalize() == 0) { tradeFull.SalesCommission.Commission = 1; tradeFull.SalesCommission.CommissionFixed = false; } else { tradeFull.SalesCommission.Commission = tradeFull.SalesCommission.Commission * tradeFull.SalesCommission.SalesIds.Count(); } } var propertys = tradeFull.Propertys ?? new List(); // if (!"自定义交易".Equals(trade.TradeType)) // { propertys.ForEach(x => x.value = ""); // } if (PS.Config.Is宏源 && trade.TradeType != "现金流交易") { var ttm = QdpCalendarHelper.GetNonHolidayDaysBetween(trade.TradeDate.Value, trade.ExerciseDate.Value) + 1; var userGroup = UserBLL.GetUserGroup(trade.TraderId); var vol = VolatilityHelper.GetVol(trade.TradeDate.Value, "交易", trade.UnderlyingCode, userGroup); //TODO:宏源审核开仓波动率 var volCurve = VolCaculator.Instance.GetHistoricalVolCurvePointsEx(trade.UnderlyingCode, trade.TradeDate, ttm, ttm, vol.ReviewDownLimit, vol.ReviewUpLimit); ViewBag.highVolLimit = volCurve.Points.Count == 0 ? 1 : volCurve.PercentileHigh; ViewBag.lowVolLimit = volCurve.Points.Count == 0 ? 0 : volCurve.PercentileLow; } var tradeCheck = db.trade_check.FirstOrDefault(t => t.TradeId == trade.id && t.ValidState != "InValid"); if (tradeCheck != null) { var reviewTrade = tradeCheck.TradeModel; var reviewTradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(reviewTrade, false); new TradeExtendService(CurUser).SetTradeExtend(reviewTradeFull, reviewTrade); reviewTradeFull.MetaDic = tradeFull.MetaDic; //销售员不用复核 reviewTradeFull.SalesCommission = tradeFull.SalesCommission; //预付金算法不复核 reviewTradeFull.MarginTemplateName = tradeFull.MarginTemplateName; reviewTradeFull.MarginType = tradeFull.MarginType; reviewTradeFull.MarginRate = tradeFull.MarginRate; reviewTradeFull.PositionMarginRate = tradeFull.PositionMarginRate; reviewTradeFull.InitialMargin = tradeFull.InitialMargin; ViewBag.diffList = TradeCheckUtil.GetDiffs(trade, reviewTrade); if (tradeFull.IsTradePricePayType == true) { //是否是名义本金方式成交,有一些相关属性,是通过换算得到,也赋上对应的值 if (tradeFull.IsUsePremiumRate == true) { reviewTradeFull.Notional = (reviewTradeFull.SpotPrice ?? 0) == 0 ? 0 : TradeHelper.GetStockEqvNotionalReal(reviewTradeFull.StockEqvNotional, reviewTradeFull.ParticipationRate, reviewTradeFull.AnnualizeFactor) / reviewTradeFull.SpotPrice.Value; reviewTradeFull.TradeAmount = tradeFull.Notional == 0 ? 0 : reviewTradeFull.Notional * tradeFull.TradeAmount / tradeFull.Notional; reviewTradeFull.TradeSinglePrice = TradeHelper.GetTradeSinglePriceByTradePrice(reviewTradeFull.TradePrice, reviewTradeFull.Notional, reviewTradeFull.PrincipalSum(), reviewTradeFull.BuySell, reviewTradeFull.TradeType, true); reviewTradeFull.PremiumRate = TradeHelper.GetPremiumRateByTradePrice(reviewTradeFull.TradePrice, reviewTradeFull.StockEqvNotional, reviewTradeFull.ParticipationRate, reviewTradeFull.PrincipalSum(), reviewTradeFull.AnnualizeFactor, reviewTradeFull.BuySell, reviewTradeFull.TradeType, true); } else { reviewTradeFull.StockEqvNotional = TradeHelper.GetStockEqvNotional(reviewTradeFull.Notional * reviewTradeFull.SpotPrice, reviewTrade.ParticipationRate, reviewTrade.AnnualizeFactor); reviewTradeFull.TradeSinglePrice = TradeHelper.GetTradeSinglePriceByTradePrice(reviewTradeFull.TradePrice, reviewTradeFull.Notional, reviewTradeFull.PrincipalSum(), reviewTradeFull.BuySell, reviewTradeFull.TradeType, true); } } else { //是否是名义本金方式成交,有一些相关属性,是通过换算得到,也赋上对应的值 if (tradeFull.IsUsePremiumRate == true) { reviewTradeFull.Notional = (reviewTradeFull.SpotPrice ?? 0) == 0 ? 0 : TradeHelper.GetStockEqvNotionalReal(reviewTradeFull.StockEqvNotional, reviewTradeFull.ParticipationRate, reviewTradeFull.AnnualizeFactor) / reviewTradeFull.SpotPrice.Value; reviewTradeFull.TradeAmount = tradeFull.Notional == 0 ? 0 : reviewTradeFull.Notional * tradeFull.TradeAmount / tradeFull.Notional; reviewTradeFull.TradeSinglePrice = TradeHelper.GetTradeSinglePriceByTradePrice(reviewTradeFull.TradePrice, reviewTradeFull.Notional, reviewTradeFull.PrincipalSum(), reviewTradeFull.BuySell, reviewTradeFull.TradeType, true); reviewTradeFull.TradePrice = TradeHelper.GetTradePriceByPremiumRate(reviewTradeFull.PremiumRate, reviewTradeFull.StockEqvNotional, reviewTradeFull.ParticipationRate, reviewTradeFull.PrincipalSum(), reviewTradeFull.AnnualizeFactor, reviewTradeFull.BuySell, reviewTradeFull.TradeType, true); } else { reviewTradeFull.StockEqvNotional = TradeHelper.GetStockEqvNotional(reviewTradeFull.Notional * reviewTradeFull.SpotPrice, reviewTradeFull.ParticipationRate, reviewTradeFull.AnnualizeFactor); reviewTradeFull.TradePrice = TradeHelper.GetTradePriceBySinglePrice(reviewTradeFull.TradeSinglePrice, reviewTradeFull.Notional, reviewTradeFull.PrincipalSum(), reviewTradeFull.BuySell, reviewTradeFull.TradeType, true); } } reviewTradeFull.IsUsePremiumRate = tradeFull.IsUsePremiumRate; if (reviewTrade.IsMoneynessOption == "是") { reviewTrade.Strike *= 100; } ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.CUSTOM_TRADE, tradeFull, tradeFull.StructureType); tradeFull.MetaDic.TryGetValue(ConsTradeMetaKey.tradeExtendInfo, out var structureType1); var map1 = GetStructureMap(StructureRangeEnum.EXTEND_INFO, tradeFull, structureType1); ViewBag.ExtendInfoMap = new Dictionary>(); if (tradeFull.TradeType != "自定义交易" && propertys.Count > 0) { ViewBag.ExtendInfoMap[""] = propertys.Select(O => new Structure_Details() { ColumnName = O.name, ColumnDefaultValue = O.value }).ToList(); } foreach (var item in map1) { ViewBag.ExtendInfoMap[item.Key] = item.Value; } reviewTradeFull.ExtendInfo = JsonHelper.Serialize(propertys); model.Trade = reviewTradeFull; return View("TradeEditV2", model); } ViewBag.TradeType = tradeFull.TradeType; tradeFull.ClientId = 0; tradeFull.ExerciseDate = null; tradeFull.SettlementDate = null; tradeFull.IsMoneynessOption = "否"; tradeFull.Strike = null; tradeFull.TradeAmount = 0; tradeFull.Notional = 0; tradeFull.TradeSinglePrice = null; tradeFull.PremiumRate = null; tradeFull.TradeDate = null; tradeFull.SpotPrice = null; tradeFull.StockEqvNotional = 0; tradeFull.StockEqvNotionalReal = 0; tradeFull.ParticipationRate = null; tradeFull.PrincipalRate = null; tradeFull.OriginalPrincipalSum = null; tradeFull.SinglePrincipalWrite = null; tradeFull.PrincipalRateWrite = null; tradeFull.TradePrice = null; tradeFull.BuySell = "卖出"; tradeFull.ExerciseMode = "European"; tradeFull.OptionType = "看涨"; tradeFull.SettlementType = 0; tradeFull.IsAnnualized = false; tradeFull.AnnualizeFactor = null; tradeFull.StockEqvNotional = 0; tradeFull.OriginalNotional = 0; tradeFull.OriginalStockEqvNotional = 0; tradeFull.EnhancedPrice = 0; var type = tradeFull.GetType(); var props = type.GetProperties().Where(p => p.CanRead && p.CanWrite && p.DeclaringType == type && p.Name != nameof(tradeFull.ClientNumber)).ToArray(); foreach (var p in props) { p.SetValue(tradeFull, p.PropertyType.IsValueType && Nullable.GetUnderlyingType(p.PropertyType) == null ? Activator.CreateInstance(p.PropertyType) : null); } tradeFull.MonitorType = "离散"; tradeFull.RebateType = "AtHit"; tradeFull.KORebateType = RebateTypeEnum.AtHit; tradeFull.KOPayoffType = KOPayoffTypeEnum.Rebate; tradeFull.KIPayoffType = KIPayoffTypeEnum.None; tradeFull.CouponPayType = CouponPayTypeEnum.AtCreated; tradeFull.IncludeCouponAfterKI = true; tradeFull.IsDiscreteMonitored = true; tradeFull.HasPayoffLimit = true; tradeFull.CouponPercent = true; tradeFull.CallMultiplier = tradeFull.PutMultiplier = 1; var setreviewTradeFull = new TradeDetailsQueryService(CurUser).FromDbTrade(trade); switch (tradeFull.TradeType) { case "现金流交易": tradeFull.OptionType = null; tradeFull.RateType = CashFlowRateTypeEnum.年化利率; tradeFull.DepositType = CashflowDepositTypeEnum.资金收益; tradeFull.CouponDayCount = ""; tradeFull.ExerciseMode = ""; break; case "合成价差期权": var synthetic = synthetic_underlyingBLL.GetByName(tradeFull.UnderlyingCode); if (synthetic != null) { tradeFull.MetaDic["组合标的"] = synthetic.GetSyntheticPriceModel().ToJson(); } break; case "凤凰期权": tradeFull.KOObservationDates = db.trade_autocall.FirstOrDefault(l => l.TradeId == tradeFull.id)?.KOObservationDates; break; case "雪球期权": tradeFull.CouponDayCount = setreviewTradeFull.CouponDayCount; tradeFull.CouponIncludeStartDate = setreviewTradeFull.CouponIncludeStartDate; tradeFull.CouponUsePaymentDate = setreviewTradeFull.CouponUsePaymentDate; tradeFull.KOObservationDates = setreviewTradeFull.KOObservationDates; tradeFull.KOObservationSettleDates = setreviewTradeFull.KOObservationSettleDates; break; case "亚式期权": tradeFull.StrikeGearingFactor = setreviewTradeFull.StrikeGearingFactor; break; case "累计期权": tradeFull.KOObservationDates = setreviewTradeFull.KOObservationDates; break; case "Risky期权": tradeFull.ParticipationRate1 = setreviewTradeFull.ParticipationRate1; tradeFull.ParticipationRate2 = setreviewTradeFull.ParticipationRate2; tradeFull.ParticipationRate3 = setreviewTradeFull.ParticipationRate3; break; } ViewBag.StructureTypeMap = GetStructureMap(StructureRangeEnum.CUSTOM_TRADE, tradeFull, tradeFull.StructureType); tradeFull.MetaDic.TryGetValue(ConsTradeMetaKey.tradeExtendInfo, out var structureType); var map = GetStructureMap(StructureRangeEnum.EXTEND_INFO, tradeFull, structureType); ViewBag.ExtendInfoMap = new Dictionary>(); //if (tradeFull.TradeType != "自定义交易" && propertys.Count > 0) //{ // ViewBag.ExtendInfoMap["---"] = propertys.Select(O => new Structure_Details() { ColumnName = O.name, ColumnDefaultValue = O.value }).ToList(); //} foreach (var item in map) { ViewBag.ExtendInfoMap[item.Key] = item.Value; } tradeFull.ExtendInfo = JsonHelper.Serialize(propertys); model.Trade = tradeFull; } return View("TradeEditV2", model); } private Dictionary> GetStructureMap(StructureRangeEnum structureRange, OtcOptionTradeFull trade = null, string StructureType = "") { //获取自定义结构信息 var structureTypes = new StructureService(CurUser) .QueryStructureMap(structureRange); var structureTypeMap = new Dictionary>(); if (structureRange == StructureRangeEnum.BALCK_TRADE) { structureTypeMap["气囊结构"] = new List(); } foreach (var item in structureTypes) { structureTypeMap[item.Key] = item.Value; } if (trade != null && !StructureType.IsNullOrWhiteSpace()) { #region 自定义结构 if (!structureTypeMap.ContainsKey(StructureType)) { structureTypeMap[StructureType] = new List(); } var structureDetails = new List(structureTypeMap[StructureType]); structureTypeMap[StructureType].Clear(); foreach (var item in trade.Propertys) { var template = structureDetails.FirstOrDefault(O => O.ColumnName == item.name) ?? new Structure_Details() { ColumnType = StructureColumnTypeEnum.TEXT }; template.ColumnName = item.name; template.ColumnDefaultValue = item.value; structureTypeMap[StructureType].Add(template); } #endregion } return structureTypeMap; } public JsonResult CheckTradeScale(int? eid, bool isContinue = false) { try { var passProcess = new TradeCheckService(CurUser).TradeScaleCheck(eid ?? 0, isContinue); if (passProcess) { if (isContinue) { return JsonSuccess("投资规模审批已提交至下一流程"); } return JsonSuccess("投资规模审批已通过"); } } catch (Exception) { return JsonSuccess("审批流程最后一步的审批角色对审批簿记的投资规模依然不足!", "无下一步"); } return JsonSuccess("目前簿记下投资规模已超过权限,是否提交至下一流程?", "下一步"); } [HttpPost] public JsonResult SaveGroupTrade(OtcOptionTradeFull trade, int[] tradeIds) { var groupTrade = new TradeSaveService(CurUser).SaveGroupTrade(trade, tradeIds); return JsonSuccess("保存组合交易成功", groupTrade); } [HttpPost] public JsonResult CheckTrade(OtcOptionTradeFull trade, string additionalProcessing) { if (trade == null) { return JsonError("数据不能为空"); } if (string.IsNullOrEmpty(trade.EncryptId)) { return JsonError("获取交易ID参数失败!"); } trade.id = DataProtectHelper.DecryptInt(trade.EncryptId); var result = new TradeCheckService(CurUser).TradeCheck(trade, additionalProcessing); result.message = result.message.TrimToNull(); if (result.success) { return JsonSuccess(result.specialOperateForTrade ? string.Empty : result.message ?? "复核审批成功!", result); } return JsonError(result.message ?? "交易复核失败!", result); } [HttpPost] public JsonResult CheckTradeGroup(OtcOptionTradeFull trade) { if (trade == null) { return JsonError("数据不能为空"); } if (string.IsNullOrEmpty(trade.EncryptId)) { return JsonError("获取交易ID参数失败!"); } trade.id = DataProtectHelper.DecryptInt(trade.EncryptId); var result = new TradeCheckService(CurUser).TradeGroupCheck(trade); result.message = result.message.TrimToNull(); if (result.success) { return JsonSuccess(result.specialOperateForTrade ? string.Empty : result.message ?? "复核审批成功!", result); } return JsonError(result.message ?? "交易复核失败!", result); } [HttpPost] public JsonResult TradeReject(OtcOptionTradeFull req) { if (req == null) { return JsonError("数据不能为空"); } if (req.EncryptId.IsNullOrWhiteSpace()) { return JsonError("拒绝失败!"); } var tdConv = TradeConverter.ConvertOptionTrade(req); var id = DataProtectHelper.DecryptInt(req.EncryptId); new TradeRejectService(CurUser).OtcOptionTradeReject(tdConv, id); return JsonSuccess("拒绝成功!"); } [HttpPost] public JsonResult tradeEditJson(trade req) { if (req == null) { return JsonError("数据不能为空"); } if (req.TradeType == "价差期权") { var errorMsg = SpreadOptionValidator.Validate(req); if (!string.IsNullOrEmpty(errorMsg)) { return JsonError(errorMsg); } } if (req.TradeType == "收益互换") { var errorMsg = SwapTradeValidator.Validate(req); if (!string.IsNullOrEmpty(errorMsg)) { return JsonError(errorMsg); } } var id = 0; if (!string.IsNullOrEmpty(req.EncryptId)) { id = DataProtectHelper.DecryptInt(req.EncryptId); } try { var r = new TradeSaveService(CurUser).SaveTrade(req, TradeSourceEnum.系统交易); if (r.TradeType == "合成价差期权") { r.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.UnderlyingCode); } var vaQuery = from um in db.underlying_manager join va in db.variety on um.UnderlyingTypeId equals va.id where um.id == r.UnderlyingId select new VarietyDto { QuoteUnit = va.QuoteUnit }; var variety = vaQuery.FirstOrDefault(); if (variety != null) { r.QuoteUnit = variety.QuoteUnit; r.QuoteUnitSingle = variety.QuoteUnitSingle; } using (var tagService = new TagService(CurUser)) { tagService.SetTradeTagForTradeEdit(new SetTradeTagForTradeEditRequest { TradeId = r.id, Tags = req.Tags }); } return JsonSuccess("更新成功", r); } catch (Exception e) { LogFactory.GetLogger("交易保存").Error(e); return JsonError("保存失败:" + e.GetBaseException().Message, e.ToJson()); } } [HttpPost] public JsonResult InValidTrade(string id) { var intid = DataProtectHelper.DecryptInt(id); new TradeInvalidService(CurUser).InvalidTrade(intid, false); return JsonSuccess("操作成功"); } [MyAuthorize("交易管理-交易导入")] public ActionResult tradeUpload() { return View(); } /// /// 导入场外期权交易 /// [MyAuthorize("交易管理-交易导入")] public ActionResult UploadOtcTrade() { var files = Request.Form.Files; if (files == null || files.Count == 0) { return JsonError("上传文件不存在"); } var file = files[0]; if (!Path.GetExtension(file.FileName).Equals(".xlsx", StringComparison.OrdinalIgnoreCase)) { return JsonError("请上传Excel(.xlsx)格式文件"); } using var stream = file.OpenReadStream(); new OtcTradeImportService(CurUser).ImportOptionTradesFromExcel(stream, out var TotalNum, out var SuccessNum); return Json(new { success = true, totalNum = TotalNum, successNum = SuccessNum, }); } [MyAuthorize("交易管理-交易导入")] public ActionResult UploadStructureTrade(IFormFile file) { if (Path.GetExtension(file.FileName)?.ToLowerInvariant() != ".csv") { return Json(new { success = false, jsonrpc = 2.0, error = new { message = "请上传csv格式文件" }, id = "id" }); } using var openStream = file.OpenReadStream(); var result = new StructureTradeImportService(CurUser).ImportFromCsv(openStream); if (result.IsSuccess) { return JsonSuccess(); } return JsonError(result.Message); } /// /// 当日成交查询。 /// 查询在当前交易日成交,或在当前交易日被修改过状态的交易 /// [HttpPost] public JsonResult tradeOnValueDateQuery(TdTradeQueryModel req) { var stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); // 开始监视代码运行时间 req.AssetIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIds).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); req.OtcTradeType = OtcTradeType.Options; stopwatch.Stop(); // 停止监视 TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间 double seconds = timespan.TotalSeconds; var sList = new TodayTradeQueryService(CurUser).GetConfirmList(req); return Json(sList); } /// /// 当日成交而几个tab的交易总数。 /// [HttpPost] public JsonResult tradeCountsOnValueDateQuery() { var userAssets = CurUser.GetAssetUnitIds(); var userClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); var sum = new TodayTradeQueryService(CurUser).GetTdTradesCountSum(userAssets, userClients, DBModels.Enums.OtcTradeType.Options); var countDic = new Dictionary { {(int)TradeTabIndexEnum.今日到期,sum.TdExerciseCount }, {(int)TradeTabIndexEnum.今日终止,sum.TdEarlyStoppedCount }, {(int)TradeTabIndexEnum.明日到期,sum.TmExerciseCount }, {(int)TradeTabIndexEnum.今日成交,sum.TdCreatedCount }, {(int)TradeTabIndexEnum.今日敲出,sum.TdKnockedOutCount }, }; return Json(countDic); } /// /// 当日敲出查询。 /// [HttpPost] public JsonResult tradeKnockedOutQuery(TdTradeQueryModel req) { req.AssetIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIds).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.LoginUserId = CurUser.UserId; req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new TodayTradeQueryService(CurUser).GetKnockedOutList(req); return Json(sList); } /// /// 提前终止报告列表 /// 根据tradeCash.ExerciseWay == TradeCashExerciseWayEnum.提前终止行权做验证 /// [HttpPost] public JsonResult endTradeOnValueDateQuery(TradeReq req) { req.LoginUserId = CurUser.UserId; req.OptDateStart = valuedateBLL.ValueDate; req.OptDateEnd = valuedateBLL.ValueDate; if (!string.IsNullOrWhiteSpace(req.TradeStatus)) { req.TradeStatusList = req.TradeStatus.Split(new[] { ',' }).ToList(); } req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new tradeBLL().SearchTerminationTradeWithCashList(req, out var gsum); foreach (var r in sList.rows) { if (r.trade.TradeType == "合成价差期权") { r.trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.trade.UnderlyingCode); } } return Json(sList); } /// /// 交易观察状态列表 /// 障碍期权,双鲨期权,凤凰期权,雪球期权,累计期权分tab展示 /// [HttpPost] public JsonResult tradeObservationStatusQuery(TdTradeQueryModel req) { req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.LoginUserId = CurUser.UserId; req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new TodayTradeQueryService(CurUser).GetObservationStatusTradeList(req); return Json(sList); } /// /// 用作需要发送交易确认书的交易列表查询,将对冲交易过滤掉 /// [HttpPost] public JsonResult tradeConfirmEmailQuery(TradeReq req) { req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new tradeBLL().SearchListForTradeConfirm(req); var rowList = sList.rows; //new TradeDalService(CurUser).SetStructureInfo(rowList); //增加交易确认书编号 if (rowList != null && rowList.Any()) { var tradeIds = rowList.Select(x => x.id).ToList(); var tradeContractCodeList = (from tradeContractR in db.trade_contract_r join tradeContractDoc in (from tradeContractDocTemp in db.trade_contract_document where ContractTypeEnum.Trade == tradeContractDocTemp.Type select tradeContractDocTemp) on tradeContractR.ContractCode equals tradeContractDoc.Code into tradeContractDoc1 from tradeContractDoc2 in tradeContractDoc1.DefaultIfEmpty() where tradeIds.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.Type == tradeContractDoc2.Type && tradeContractR.IsValid select new { tradeContractR.id, tradeContractR.TradeId, tradeContractR.ContractCode, tradeContractR.send_email_result, tradeContractDoc = tradeContractDoc2 }).ToList(); foreach (var trade in rowList) { if (trade.TradeType == "合成价差期权") { trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.UnderlyingCode); } var tradeContractinfo = tradeContractCodeList.FirstOrDefault(t => t.TradeId == trade.id); trade.MetaDic["send_email_result"] = ""; if (tradeContractinfo != null) { trade.ContractCode = tradeContractinfo.ContractCode; if (null != tradeContractinfo.tradeContractDoc) { trade.MetaDic["ContractEncryptId"] = tradeContractinfo.tradeContractDoc.EncryptId; trade.MetaDic["ContractRId"] = tradeContractinfo.id.ToString(); trade.MetaDic["ContractDocUrl"] = tradeContractinfo.tradeContractDoc.RelativePath; trade.MetaDic["ContractStatus"] = tradeContractinfo.tradeContractDoc.Status; trade.MetaDic["StampDocumentFileName"] = tradeContractinfo.tradeContractDoc.StampDocumentFileName; trade.MetaDic["HasGeneratedConfirmBook"] = trade.HasGeneratedConfirmBook() ? "'True'" : null; trade.MetaDic["ConfirmBookOptName"] = tradeContractinfo.tradeContractDoc.OptName; trade.MetaDic["ConfirmBookOptDate"] = tradeContractinfo.tradeContractDoc.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss"); if (tradeContractinfo.tradeContractDoc.SealResult != null) { trade.MetaDic["SealResult"] = Enum.GetName(typeof(SealResultEnum), tradeContractinfo.tradeContractDoc.SealResult); } else { trade.MetaDic["SealResult"] = ""; } trade.MetaDic["SealTime"] = tradeContractinfo.tradeContractDoc.SealResult == (int)SealResultEnum.成功 ? tradeContractinfo.tradeContractDoc.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""; //if (!PS.Config.Is海通 && !PS.Config.Is宏源) //{ // var pdfPath = Path.ChangeExtension(tradeContractinfo.tradeContractDoc.AbsolutePath, "pdf"); // if (System.IO.File.Exists(pdfPath)) // { // trade.MetaDic["ContractDocUrl"] = Path.ChangeExtension((trade.MetaDic["ContractDocUrl"] ?? ""), "pdf"); // } //} trade.MetaDic["send_email_result"] = string.IsNullOrEmpty(tradeContractinfo.send_email_result) ? "未发送" : tradeContractinfo.send_email_result; } } if (PS.Config.Is物产中大) { trade.ContractCode = db.trade_contract_r_number.Where(n => n.TradeConfirmNumberType == "C" && n.TradeId == trade.id).FirstOrDefault()?.TradeConfirmNumber; } } } return Json(sList); } /// /// 用作需要发送交易确认书的交易列表查询,将对冲交易过滤掉 /// [HttpPost] public JsonResult ExchangeTradeConfirmEmailQuery(TradeReq req) { req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new tradeBLL().SearchListForTradeConfirm(req); var rowList = sList.rows; //new TradeDalService(CurUser).SetStructureInfo(rowList); //增加交易确认书编号 if (rowList != null && rowList.Any()) { var tradeIds = rowList.Select(x => x.id).ToList(); var tradeContractCodeList = (from tradeContractR in db.trade_contract_r join tradeContractDoc in (from tradeContractDocTemp in db.trade_contract_document where ContractTypeEnum.Trade == tradeContractDocTemp.Type select tradeContractDocTemp) on tradeContractR.ContractCode equals tradeContractDoc.Code into tradeContractDoc1 from tradeContractDoc2 in tradeContractDoc1.DefaultIfEmpty() where tradeIds.Contains(tradeContractR.TradeId) && ContractTypeEnum.Trade == tradeContractR.Type && tradeContractR.Type == tradeContractDoc2.Type && tradeContractR.IsValid select new { tradeContractR.id, tradeContractR.TradeId, tradeContractR.ContractCode, tradeContractDoc = tradeContractDoc2 }).ToList(); foreach (var trade in rowList) { if (trade.TradeType == "合成价差期权") { trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.UnderlyingCode); } var tradeContractinfo = tradeContractCodeList.FirstOrDefault(t => t.TradeId == trade.id); if (tradeContractinfo != null) { trade.ContractCode = tradeContractinfo.ContractCode; if (null != tradeContractinfo.tradeContractDoc) { trade.MetaDic["ContractEncryptId"] = tradeContractinfo.tradeContractDoc.EncryptId; trade.MetaDic["ContractRId"] = tradeContractinfo.id.ToString(); trade.MetaDic["ContractDocUrl"] = tradeContractinfo.tradeContractDoc.RelativePath; trade.MetaDic["ContractStatus"] = tradeContractinfo.tradeContractDoc.Status; trade.MetaDic["StampDocumentFileName"] = tradeContractinfo.tradeContractDoc.StampDocumentFileName; trade.MetaDic["HasGeneratedConfirmBook"] = trade.HasGeneratedConfirmBook() ? "'True'" : null; if (!PS.Config.Is海通 && !PS.Config.Is宏源) { var pdfPath = Path.ChangeExtension(tradeContractinfo.tradeContractDoc.AbsolutePath, "pdf"); if (System.IO.File.Exists(pdfPath)) { trade.MetaDic["ContractDocUrl"] = Path.ChangeExtension((trade.MetaDic["ContractDocUrl"] ?? ""), "pdf"); } } } } } } return Json(sList); } /// /// 用作需要发送互换确认书的交易列表查询,将对冲交易过滤掉 /// [HttpPost] public JsonResult ExchangeConfirmQuery(TradeReq req) { req.sidx = "t.id"; req.sord = "desc"; var tradelist = new List(); string[] tradeTypes = null; switch (req.TabIndex) { case 2: tradeTypes = ConsTrade.AllTradeTypes.Except(ConsTrade.TradeTypesForHedge).Except(new[] { "收益互换" }).ToArray(); break; case 1: default: tradeTypes = new[] { "收益互换" }; break; } var idquery = from tc in db.trade_cash join t in db.trade on tc.TradeId equals t.id where t.TradeType == "累计期权" && t.ValidState != ConsGlobal.InValid && ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus) && tc.Action != "系统操作-期权费" && tc.ValidState != ConsGlobal.InValid && tc.IsDeleted != true group tc by tc.TradeId into g select new { Key = g.Key, list = g.ToList() }; var ids = idquery.ToList().Select(x => x.list.OrderByDescending(i => i.ValueDate).FirstOrDefault()).Where(t => t.ValueDate >= req.TradeDateStart && t.ValueDate <= req.TradeDateEnd).Select(x => x.id).ToList(); var tid2 = db.trade.Where(x => x.TradeType == "累计期权" && x.ValidState != ConsGlobal.InValid && x.TradeDate >= req.TradeDateStart && x.TradeDate <= req.TradeDateEnd).Select(x => x.id).ToList(); var tcid2 = db.trade_cash.Where(x => x.Action == "系统操作-期权费" && x.ValidState != ConsGlobal.InValid && x.IsDeleted != true && tid2.Contains(x.TradeId)).AsEnumerable().GroupBy(x => x.TradeId).Select(x => x.FirstOrDefault().id).ToList(); var tcid = ids.Union(tcid2); var query1 = (from tc in db.trade_cash join t in db.trade on tc.TradeId equals t.id join tr in db.trade_contract_r.Where(O => O.IsValid) on tc.id equals tr.TradeCashId into tempTr from tr in tempTr.DefaultIfEmpty() join td in db.trade_contract_document on tr.ContractCode equals td.Code into tempTd from td in tempTd.DefaultIfEmpty() where tradeTypes.Contains(t.TradeType) && tcid.Contains(tc.id) select new { t, tc, td, ContractCode = tr == null ? "" : tr.ContractCode, }); var query2 = (from tc in db.trade_cash join t in db.trade on tc.TradeId equals t.id join tr in db.trade_contract_r.Where(O => O.IsValid) on tc.id equals tr.TradeCashId into tempTr from tr in tempTr.DefaultIfEmpty() join td in db.trade_contract_document on tr.ContractCode equals td.Code into tempTd from td in tempTd.DefaultIfEmpty() where t.ValidState != ConsGlobal.InValid && tradeTypes.Contains(t.TradeType) && tc.ValidState != ConsGlobal.InValid && tc.IsDeleted != true && t.TradeType != "累计期权" && tc.ValueDate >= req.TradeDateStart && tc.ValueDate <= req.TradeDateEnd select new { t, tc, td, ContractCode = tr == null ? "" : tr.ContractCode, }); var query = query1.Union(query2); if (!string.IsNullOrWhiteSpace(req.ClientIds)) { query = query.Where(O => req.ClientIdsInt.Contains(O.t.ClientId)); } if (!string.IsNullOrWhiteSpace(req.TradeNumber)) { query = query.Where(O => O.t.TradeNumber == req.TradeNumber); } if (!string.IsNullOrWhiteSpace(req.ContractCode)) { query = query.Where(O => O.ContractCode == req.ContractCode); } if (req.SealResults != null) { if (req.SealResults.Contains(2)) { query = query.Where(t => req.SealResults.Contains((int)t.td.SealResult) || t.td.SealResult == null); } else { query = query.Where(t => req.SealResults.Contains((int)t.td.SealResult)); } } if (req.SealDateStart != null) { query = query.Where(t => t.td.SealResult == (int)SealResultEnum.成功 && t.td.OptDate != null && t.td.OptDate >= req.SealDateStart); } if (req.SealDateEnd != null) { var dateTemp = req.SealDateEnd.Value.AddDays(1); query = query.Where(t => t.td.SealResult == (int)SealResultEnum.成功 && t.td.OptDate != null && t.td.OptDate < dateTemp); } var sList = query.ToSearchList(req); tradelist = sList.rows.Select(O => { var sealResult = O.td?.SealResult; O.t.trade_cash = O.tc.Clone(); O.t.ContractCode = O.ContractCode; O.t.MetaDic = new Dictionary() { { "ContractDocUrl" ,O.td?.RelativePath }, { "ConfirmBookOptName",O.td?.OptName }, { "ConfirmBookOptDate",O.td?.OptDate.OtcFormatDate()}, { "SealResult",sealResult != null ? Enum.GetName(typeof(SealResultEnum), sealResult) : ""}, { "SealTime",O.td?.SealResult == (int)SealResultEnum.成功 ? O.td?.OptDate.Value.ToString() : ""} }; return O.t.Clone(); }).ToList(); //增加交易确认书编号 if (tradelist != null && tradelist.Any()) { tradeBLL.SetFieldsByTradeType(tradelist); foreach (var trade in tradelist) { if (trade != null) { //改成客户方向 只有中粮用 trade.TradePrice = trade.TradePrice * ((trade.BuySell == "卖出" || trade.TradeType == "远期") ? -1 : 1); trade.BuySell = trade.BuySell == "买入" ? "卖出" : "买入"; //var tcItem = trade.trade_cash ?? null; if (trade.trade_cash != null) { if (trade.TradeType == "收益互换") { var tip = trade.trade_cash.Action == "系统操作-期权费" ? (trade.trade_swap.IsPayFloatingProfit && trade.trade_swap.PayLongShort == "多头") ? "买入开仓" : "卖出开仓" : (trade.trade_swap.IsPayFloatingProfit && trade.trade_swap.PayLongShort == "多头") ? "卖出平仓" : "买入平仓"; trade.MetaDic["TradeTip"] = tip; } else if (trade.TradeType == "累计期权" && trade.trade_cash.Action != "系统操作-期权费") { trade.trade_cash.UnwindNotional = trade.OriginalNotional; trade.MetaDic["FinalPrice"] = Math.Abs(trade.trade_cash.FinalPrice ?? trade.trade_cash.UnwindPrice ?? 0).ToString(); var amount = db.trade_cash.Where(x => x.Action != "系统操作-期权费" && x.ValidState != ConsGlobal.InValid && x.IsDeleted != true && trade.id == x.TradeId).Sum(x => x.Amount); //客户方向 trade.MetaDic["Amount"] = (amount * (-1)).ToString(); } else { trade.MetaDic["FinalPrice"] = Math.Abs(trade.trade_cash.FinalPrice ?? trade.trade_cash.UnwindPrice ?? 0).ToString(); //客户方向 trade.MetaDic["Amount"] = (trade.trade_cash.Amount * (-1)).ToString(); } } } if (trade.TradeType == "合成价差期权") { trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.UnderlyingCode); } } } return Json(new SearchListResult(sList, tradelist)); } public JsonResult GetTradeMeta(int tradeId, string key) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); } var value = new TradeMetaService(CurUser).GetTradeMeta(tradeId, key); return Json(value ?? ""); } public JsonResult SetTradeMeta(int tradeId, string key, string value) { if (!db.trade.Any(O => O.id == tradeId) || string.IsNullOrWhiteSpace(key) || key.Length > 30 || value == null || value?.Length > 1000) { throw new Exception("参数不合法"); } var t = db.trade.Find(tradeId); var ids = db.trade.Where(m => m.id == t.id || (m.ParentTradeId > 0 && m.ParentTradeId == t.ParentTradeId) || m.id == t.ParentTradeId).Select(m => m.id).ToList(); foreach (var i in ids) { new TradeMetaService(CurUser).AddTradeMeta(i, key, value); } return Json("OK"); } public trade_cash setTradeUnwind(trade td, underlying_manager um) { if (td.TradeType == "现金流交易") { var r = new trade_cash { TradeId = td.id, FinalPrice = 0, ExceciseType = "现金", CallPut = td.CallPut, Strike = 0, Notional = 0, UnwindType = "全部平仓", UnwindNotional = 0, UnwindPercentRate = td.StockEqvNotional / td.OriginalStockEqvNotional, Amount = 0, ValueDate = valuedateBLL.ValueDate <= td.ExerciseDate.Value || td.SettlementFlag == 1 ? valuedateBLL.ValueDate : td.ExerciseDate.Value }; r.TradeAmount = 0; r.UnwindTradeAmount = 0; return r; } else { var r = new trade_cash { TradeId = td.id, FinalPrice = um.UnderlyingType == "组合标的" ? new SyntheticUnderlyingPriceService(CurUser).GetPrice(td.UnderlyingCode) : (um.Price ?? 0), ExceciseType = "现金", CallPut = td.CallPut, Strike = td.IsMoneynessOptionData ? (td.Strike * td.SpotPrice) : td.Strike, Notional = td.Notional, UnwindType = "全部平仓", UnwindNotional = td.Notional, UnwindPercentRate = td.StockEqvNotional / td.OriginalStockEqvNotional, UnwindStockEqvNotional = td.StockEqvNotional, Amount = 0, ValueDate = valuedateBLL.ValueDate <= td.ExerciseDate.Value || td.SettlementFlag == 1 ? valuedateBLL.ValueDate : td.ExerciseDate.Value }; //累计期权平仓日不可以跳过还未观察的观察日 if (td.TradeType == "累计期权") { var obervations = db.autocall_observation.Where(x => x.TradeId == td.id); if (obervations.Any()) { var lastObservationDate = obervations.Max(x => x.EndDate); if (string.IsNullOrEmpty(td.trade_accumulator_option.KOObservationDates)) { if (lastObservationDate < valuedateBLL.ValueDate) { r.ValueDate = lastObservationDate.AddDays(1); } else { r.ValueDate = lastObservationDate; } } else { var observationDates = QdpHelper.ParseObservationDate(td.trade_accumulator_option.KOObservationDates); var latestObservationDate = observationDates.Where(x => x.DateTime > lastObservationDate).Min(x => x); if (latestObservationDate.DateTime < valuedateBLL.ValueDate) { r.ValueDate = latestObservationDate.DateTime; } else { r.ValueDate = valuedateBLL.ValueDate; } } } else { r.ValueDate = td.TradeDate.Value; } } r.TradeAmount = r.Notional / um.CountRatio; r.UnwindTradeAmount = r.UnwindNotional / um.CountRatio; return r; } } public ActionResult tradeUnwind(string enid, bool isUseApproval = false) { var intid = DataProtectHelper.DecryptInt(enid); var td = db.trade.Find(intid); if (td == null) { return Content("找不到现金交割交易"); } tradeBLL.SetFieldsByTradeType(td); var r = new trade_cash(); var um = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode); var variety = um == null ? null : VarietyBLL.GetAllvarietyModel().FirstOrDefault(v => v.id == um.UnderlyingTypeId); var hasProcess = HasTradeProcess(); if (((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus == ConsTrade.平仓待复核) { r = db.trade_cash.FirstOrDefault(t => t.TradeId == intid && t.Action == ClientCashInCashOut.系统操作_平仓费 && t.ValidState == ConsGlobal.InValid && !t.IsDeleted); if (r == null) { return Content("该笔交易状态为平仓待复核,而trade_cash表没有相关记录,请检查该笔交易是否有效"); } if (td.Warning) { new TradeDalService(CurUser).RollbackToBeforeSettle(td, r.ValueDate); } } else { if (td.Warning) { var valueDate = valuedateBLL.ValueDate <= td.ExerciseDate.Value ? valuedateBLL.ValueDate : td.ExerciseDate.Value; new TradeDalService(CurUser).RollbackToBeforeSettle(td, valueDate); } r = setTradeUnwind(td, um); } //r.StockEqvNotional = TradeHelper.GetStockEqvNotionalReal(td.StockEqvNotional, td.ParticipationRate, td.AnnualizeFactor); r.StockEqvNotional = td.StockEqvNotional; r.OriginalStockEqvNotional = td.OriginalStockEqvNotional ?? 0; r.IsUsePremiumRate = td.IsUsePremiumRate; r.IsTradePricePayType = td.IsTradePricePayType; r.InitialSpotPrice = td.SpotPrice ?? 0; r.OriginalNotional = td.OriginalNotional; r.TradeOriginalAmount = td.OriginalNotional / um?.CountRatio; r.UnderlyingCode = td.UnderlyingCode; r.UnderlyingId = um?.id; r.UnderlyingInstrumentType = td.UnderlyingInstrumentType; r.TradeType = BuySellConvert.GetClientBuySell(td.BuySell); r.BondType = td.TradeType; r.ParticipationRate = td.ParticipationRate; r.PrincipalSum = td.PrincipalSum(); r.OriginalPrincipalSum = td.OriginalPrincipalSum; r.AnnualizeFactor = td.AnnualizeFactor; r.Trade_TradeType = td.TradeType; if (!isUseApproval) { r.UnwindStockEqvNotional = r.StockEqvNotional; r.IsUnwindStockEqvNotional = false; r.UnwindPercentRate *= 100; } else { bool ActualHasMinusValueOptions = valuedateBLL.SystemDate.UnwindSinglePriceAngle == 1 ? ConsTrade.HasMinusValueOptions.Contains(td.TradeType) : !ConsTrade.HasMinusValueOptions.Contains(td.TradeType); r.SinglePV = r.UnwindPrice * (!ConsTrade.HasMinusValueOptions.Contains(td.TradeType) ? 1 : EodOperationBase.GetSign(td.BuySell)); r.SinglePVPercentRate = r.UnwindPricePercentRate * (!ConsTrade.HasMinusValueOptions.Contains(td.TradeType) ? 1 : EodOperationBase.GetSign(td.BuySell)); r.UnwindPrice = ActualHasMinusValueOptions ? r.UnwindPrice : r.UnwindPrice * (td.BuySell == "买入" ? 1 : -1); r.UnwindPricePercentRate = ActualHasMinusValueOptions ? r.UnwindPricePercentRate : r.UnwindPricePercentRate * (td.BuySell == "买入" ? 1 : -1); r.Amount = r.Amount * (valuedateBLL.SystemDate.UnwindAmountAngle == 1 || td.TradeType == "收益互换" ? 1 : EodOperationBase.GetSign(td.BuySell)); r.QuoteAmount = r.QuoteAmount * (valuedateBLL.SystemDate.UnwindAmountAngle == 1 || td.TradeType == "收益互换" ? 1 : EodOperationBase.GetSign(td.BuySell)); r.UnwindPercentRate *= 100; r.UnwindPricePercentRate *= 100; r.SinglePVPercentRate *= 100; } if (r.UnwindVol == null) { if (YLErp.PS.Config.IsTradeVol) { r.UnwindVol = new VolatilityService(CurUser).GetTradeVol(td, r.ValueDate); } else { var singleVol = new SingleVolReq() { VolType = "交易", Strike = td.Strike ?? 0, SpotPrice = r.FinalPrice ?? 0, TradeDate = r.ValueDate, ExerciseDate = td.ExerciseDate ?? DateTime.Today, IsMoneynessOption = td.IsMoneynessOption, CallPut = r.CallPut == "看涨" ? "Call" : "Put", UnderlyingId = um == null ? 0 : um.id, UnderlyingCode = um == null ? "" : um.UnderlyingCode, UnderlyingName = um == null ? "" : um.UnderlyingName, UnderlyingTypeId = um == null ? 0 : um.UnderlyingTypeId, BaseVol = null, BidVar = null, AskVar = null, }; if (td.TradeType != "现金流交易") { r.UnwindVol = SingleVolService.GetSingleVol(singleVol, UserId); } } } var ExerciseDate = td.ExerciseDate ?? DateTime.Today; if (PS.Config.Is厦门象屿 && td.SettlementType == SettlementTypeEnum.ReferencePrice) { td.TTMDays = TradeCalcHelper.CalculateTTMDaysForXiangYu(r.ValueDate, ExerciseDate, variety?.id ?? 0 , PS.Config.ErpElement.PrecisionOfMinuteInQuote || ExerciseDate == valuedateBLL.ValueDate); } else { td.TTMDays = TradeCalcHelper.CalculateTTMDays(PS.Config.Is润和 ? DateTime.Today : r.ValueDate, ExerciseDate, variety?.id ?? 0 , PS.Config.ErpElement.PrecisionOfMinuteInQuote || ExerciseDate == valuedateBLL.ValueDate); } var tc = new TradeCashService(CurUser).GetLastSettleInfo(intid); if (tc != null) { td.UnWindDate = tc.ValueDate; } ViewBag.trade = td; if (!string.IsNullOrEmpty(td.PairTrade)) { var pid = Convert.ToInt32(td.PairTrade); ViewBag.PairTrade = db.trade.Find(pid); } ViewBag.underlying = um; ViewBag.variety = variety; //需要审批或者复核的交易都会显示行权审核提交按钮 ViewBag.IsShowReCheckClose = ((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus != ConsTrade.平仓待复核; ViewBag.isUseApproval = isUseApproval; return View(r); } public ActionResult tradeCustomizedUnwind(string enid, bool isUseApproval = false) { var intid = DataProtectHelper.DecryptInt(enid); var td = db.trade.Find(intid); if (td.Warning) { new TradeDalService(CurUser).RollbackToBeforeSettle(td, valuedateBLL.ValueDate); } var r = new trade_cash(); if (td == null) { return Content("找不到现金交割交易"); } var um = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode); var variety = VarietyBLL.GetAllvarietyModel().FirstOrDefault(v => v.id == um.UnderlyingTypeId); var hasProcess = HasTradeProcess(); if (((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus == ConsTrade.平仓待复核) { r = db.trade_cash.FirstOrDefault(t => t.TradeId == intid && t.Action == ClientCashInCashOut.系统操作_平仓费 && t.ValidState == ConsGlobal.InValid && !t.IsDeleted); if (r == null) { return Content("该笔交易状态为平仓待复核,而trade_cash表没有相关记录,请检查该笔交易是否有效"); } } else { r = setTradeUnwind(td, um); } r.StockEqvNotional = td.StockEqvNotional; r.OriginalStockEqvNotional = td.OriginalStockEqvNotional ?? 0; r.IsUsePremiumRate = td.IsUsePremiumRate; r.IsTradePricePayType = td.IsTradePricePayType; r.InitialSpotPrice = td.SpotPrice ?? 0; r.TradeOriginalAmount = td.OriginalNotional / um.CountRatio; r.OriginalNotional = td.OriginalNotional; r.UnderlyingCode = td.UnderlyingCode; r.UnderlyingId = um.id; r.UnderlyingInstrumentType = td.UnderlyingInstrumentType; r.TradeType = BuySellConvert.GetClientBuySell(td.BuySell); r.BondType = td.TradeType; r.ParticipationRate = td.ParticipationRate; r.PrincipalSum = td.PrincipalSum(); r.AnnualizeFactor = td.AnnualizeFactor; if (isUseApproval) { bool ActualHasMinusValueOptions = valuedateBLL.SystemDate.UnwindSinglePriceAngle == 1 ? ConsTrade.HasMinusValueOptions.Contains(td.TradeType) : !ConsTrade.HasMinusValueOptions.Contains(td.TradeType); r.SinglePV = r.UnwindPrice * (!ConsTrade.HasMinusValueOptions.Contains(td.TradeType) ? 1 : EodOperationBase.GetSign(td.BuySell)); r.SinglePVPercentRate = r.UnwindPricePercentRate * (!ConsTrade.HasMinusValueOptions.Contains(td.TradeType) ? 1 : EodOperationBase.GetSign(td.BuySell)); r.UnwindPrice = ActualHasMinusValueOptions ? r.UnwindPrice : r.UnwindPrice * (td.BuySell == "买入" ? 1 : -1); r.UnwindPricePercentRate = ActualHasMinusValueOptions ? r.UnwindPricePercentRate : r.UnwindPricePercentRate * (td.BuySell == "买入" ? 1 : -1); r.Amount = r.Amount * (valuedateBLL.SystemDate.UnwindAmountAngle == 1 ? 1 : EodOperationBase.GetSign(td.BuySell)); r.QuoteAmount = r.QuoteAmount * (valuedateBLL.SystemDate.UnwindAmountAngle == 1 ? 1 : EodOperationBase.GetSign(td.BuySell)); r.UnwindPercentRate *= 100; r.UnwindPricePercentRate *= 100; r.SinglePVPercentRate *= 100; } else { if (td.IsUsePremiumRate != null && td.IsUsePremiumRate.Value) { r.UnwindPercentRate *= 100; } else { r.UnwindPercentRate = 0; } } ViewBag.trade = td; if (!string.IsNullOrEmpty(td.PairTrade)) { var pid = Convert.ToInt32(td.PairTrade); ViewBag.PairTrade = db.trade.Find(pid); } ViewBag.underlying = um; ViewBag.variety = variety; //需要审批或者复核的交易都会显示行权审核提交按钮 ViewBag.IsShowReCheckClose = ((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus != ConsTrade.平仓待复核; ViewBag.isUseApproval = isUseApproval; return View(r); } public ActionResult tradeSwapUnwind(string enid, int isswap, bool isUseApproval = false) { ViewBag.IsSwap = isswap; var intid = DataProtectHelper.DecryptInt(enid); var td = db.trade.Find(intid); tradeBLL.SetFieldsByTradeType(td); var r = new trade_cash(); if (td == null) { return Content("找不到现金交割交易"); } var um = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode); var variety = VarietyBLL.GetAllvarietyModel().FirstOrDefault(v => v.id == um.UnderlyingTypeId); bool commodity = ConsGlobal.InstrumentType.CalcTypeIsFutures(um.UnderlyingInstrumentType); var hasProcess = HasTradeProcess(); if (hasProcess && (td.TradeStatus == ConsTrade.平仓待复核 || td.TradeStatus == ConsTrade.互换待复核)) { r = db.trade_cash.Where(t => t.TradeId == intid && (t.Action == ClientCashInCashOut.系统操作_平仓费 || t.Action == ClientCashInCashOut.系统操作_互换) && t.ValidState == ConsGlobal.InValid && !t.IsDeleted).OrderByDescending(x => x.OptDate)?.FirstOrDefault(); if (r == null) { return Content("该笔交易状态为平仓待复合,而trade_cash表没有相关记录,请检查该笔交易是否有效"); } if (isUseApproval) { var trade_cash_detail = db.trade_cash_detail.Where(x => x.TradeCashId == r.id).ToList(); var currencyRate = r.CurrencyRate == 0 ? 1 : (r.CurrencyRate ?? 0); r.Amount = (r.QuoteAmount ?? (r.Amount / currencyRate)); var trade_cash_swap = db.trade_cash_swap.Where(x => x.TradeCashId == r.id)?.FirstOrDefault(); r.trade_cash_swap.GetFinalPrice = trade_cash_swap.GetFinalPrice; r.trade_cash_swap.PayFinalPrice = trade_cash_swap.PayFinalPrice; r.trade_cash_swap.GetCostFee = ((trade_cash_detail.Where(x => x.IsForGet == true && x.TradeCashType == TradeCashTypeEnum.了结手续费.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.GetCostFee / currencyRate)); r.trade_cash_swap.PayCostFee = ((-trade_cash_detail.Where(x => x.IsForGet == false && x.TradeCashType == TradeCashTypeEnum.了结手续费.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.PayCostFee / currencyRate)); r.trade_cash_swap.GetExtraAmount = ((trade_cash_detail.Where(x => x.IsForGet == true && x.TradeCashType == TradeCashTypeEnum.利息.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.GetExtraAmount / currencyRate)); r.trade_cash_swap.PayExtraAmount = ((-trade_cash_detail.Where(x => x.IsForGet == false && x.TradeCashType == TradeCashTypeEnum.利息.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.PayExtraAmount / currencyRate)); r.trade_cash_swap.GetInitialAmount = ((trade_cash_detail.Where(x => x.IsForGet == true && x.TradeCashType == TradeCashTypeEnum.浮动收益.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.GetInitialAmount / currencyRate)); r.trade_cash_swap.PayInitialAmount = ((-trade_cash_detail.Where(x => x.IsForGet == false && x.TradeCashType == TradeCashTypeEnum.浮动收益.ToString())?.FirstOrDefault()?.QuoteAmount) ?? (trade_cash_swap.PayInitialAmount / currencyRate)); r.trade_cash_swap.GetAmount = trade_cash_detail.Where(x => x.IsForGet == true).Sum(x => x.QuoteAmount); r.trade_cash_swap.PayAmount = trade_cash_detail.Where(x => x.IsForGet == false).Sum(x => -x.QuoteAmount); } r.UnwindMethod = r.UnwindMethod ?? 0; } else { r = setTradeUnwind(td, um); r.UnwindMethod = commodity ? 1 : 0; } r.StockEqvNotional = td.StockEqvNotional; r.OriginalStockEqvNotional = td.OriginalStockEqvNotional ?? 0; r.IsUsePremiumRate = td.IsUsePremiumRate; r.IsTradePricePayType = td.IsTradePricePayType; if (!r.UnwindPercentRate.HasValue || r.UnwindPercentRate == 0) { r.UnwindPercentRate = (r.UnwindStockEqvNotional / td.OriginalStockEqvNotional).Normalize(); } r.UnwindPercentRate *= 100; r.TradeOriginalAmount = td.OriginalNotional / um.CountRatio; r.OriginalNotional = td.OriginalNotional; r.UnderlyingCode = td.UnderlyingCode; r.UnderlyingId = um.id; r.UnderlyingInstrumentType = td.UnderlyingInstrumentType; r.TradeType = BuySellConvert.GetClientBuySell(td.BuySell); r.BondType = td.TradeType; r.ClientName = td.ClientName; r.TraderName = td.TraderName; //1. 没有执行互换,则互换和平仓的起始日期都是开仓日期 //2. 执行过互换,则互换和平仓的起始日期都是上个互换日 var tradeCashSwap = db.trade_cash.Where(y => y.TradeId == td.id && y.Action == "系统操作-互换" && y.ValidState != "InValid" && !y.IsDeleted) .OrderByDescending(y => y.id).Select(n => new { n.ValueDate }).FirstOrDefault(); r.StartDate = tradeCashSwap?.ValueDate ?? td.StartDate.Value; r.ExtraAmount = td.OriginalStockEqvNotional > 0 ? (td.trade_swap.IsTradePriceWhenOpen ? ((td.trade_swap.GetTradePrice ?? 0) - (td.trade_swap.PayTradePrice ?? 0)) : ((td.trade_swap.GetTradePrice ?? 0) - (td.trade_swap.PayTradePrice ?? 0)) * 2) * td.StockEqvNotional / td.OriginalStockEqvNotional : 0; ViewBag.trade = td; ViewBag.TradeSwap = td.trade_swap; var tradeCash = db.trade_cash.Where(y => y.TradeId == td.id && (y.Action == "系统操作-互换" || y.Action == "系统操作-平仓费") && y.ValidState != "InValid" && !y.IsDeleted) .OrderByDescending(y => y.id).Select(n => new { n.ValueDate }).FirstOrDefault(); ViewBag.MinDate = tradeCash?.ValueDate ?? td.StartDate.Value; td.trade_swap.GetSpotPrice = td.trade_swap.GetFinalPrice ?? td.trade_swap.GetSpotPrice ?? 0; td.trade_swap.PaySpotPrice = td.trade_swap.PayFinalPrice ?? td.trade_swap.PaySpotPrice ?? 0; if (!string.IsNullOrEmpty(td.PairTrade)) { var pid = Convert.ToInt32(td.PairTrade); ViewBag.PairTrade = db.trade.Find(pid); } ViewBag.underlying = um; ViewBag.variety = variety; //需要审批或者复核的交易都会显示平仓审核提交按钮 ViewBag.IsShowReCheckClose = ((valuedateBLL.SystemDate.CloseReCheck == 1) || (valuedateBLL.SystemDate.CloseReApprove == 1 && hasProcess)) && td.TradeStatus != ConsTrade.平仓待复核; //有审批步骤的需要显是互换审核提交按钮 ViewBag.IsShowApplySwap = hasProcess && td.TradeStatus != ConsTrade.互换待复核 && !isUseApproval; ViewBag.isUseApproval = isUseApproval; return View(r); } public ActionResult SetObservationPrice(string enid) { var valueDate = valuedateBLL.ValueDate; var intid = DataProtectHelper.DecryptInt(enid); var td = db.trade.FirstOrDefault(n => n.id == intid); if (td == null) { return ShowError("交易信息不存在"); } if (valueDate > td.ExerciseDate) { valueDate = td.ExerciseDate.Value; } tradeBLL.SetFieldsByTradeType(td); var model = new SetObservationViewModel(td) { SetObservationDate = valueDate.ToString("yyyy-MM-dd") }; if (DataCacheProvider.GetUnderlyingDataSource().TryGetPrice(td.UnderlyingCode, out var price)) { model.SetObservationPrice = price; } return View(model); } public JsonResult SaveTradeSwapDetails(List details) { var id = details.FirstOrDefault()?.TradeId ?? 0; var isForGet = details.FirstOrDefault()?.IsForGet; var trade = db.trade.Find(id); var tradeSwap = db.trade_swap.FirstOrDefault(x => x.TradeId == id); var tradeSwapDetailsExist = db.trade_swap_detail.Where(x => x.TradeId == id && x.IsForGet == isForGet); db.trade_swap_detail.RemoveRange(tradeSwapDetailsExist); details.ForEach(x => { x.ExerciseDate = trade.ExerciseDate; x.OriginalNotional = x.Notional; x.OptDate = DateTime.Now; x.OptId = UserId; x.OptName = UserName; }); db.trade_swap_detail.AddRange(details); db.SaveChanges(); return JsonSuccess("调仓成功"); } public JsonResult GetSwapRateByValueDate(DateTime valueDate, int tradeId, int IsSwap) { var trade_swap = db.trade_swap.FirstOrDefault(x => x.TradeId == tradeId); var oldMaturityDate = new ExtensionTimeService(CurUser).QueryExtensionTimeList(tradeId).OrderByDescending(x => x.OldMaturityDate)?.FirstOrDefault()?.OldMaturityDate; var getSwapRate = GetSwapRateByDate(trade_swap.GetSwapTimeAndRate, valueDate, IsSwap, trade_swap.IsGetFloatingProfit, oldMaturityDate); var paySwapRate = GetSwapRateByDate(trade_swap.PaySwapTimeAndRate, valueDate, IsSwap, trade_swap.IsPayFloatingProfit, oldMaturityDate); var getTradeSwapDetails = db.trade_swap_detail.Where(x => x.TradeId == tradeId && x.IsForGet).ToList(); var payTradeSwapDetails = db.trade_swap_detail.Where(x => x.TradeId == tradeId && !x.IsForGet).ToList(); getTradeSwapDetails.ForEach(x => { x.SwapRate = GetSwapRateByDate(x.SwapTimeAndRate, valueDate, IsSwap, oldMaturityDate: oldMaturityDate); }); payTradeSwapDetails.ForEach(x => { x.SwapRate = GetSwapRateByDate(x.SwapTimeAndRate, valueDate, IsSwap, oldMaturityDate: oldMaturityDate); }); return JsonSuccess("", new { getSwapRate = getSwapRate.OtcFormatFlex(2, 8), paySwapRate = paySwapRate.OtcFormatFlex(2, 8), getTradeSwapDetails, payTradeSwapDetails }); } private double GetSwapRateByDate(string swapTimeAndRate, DateTime valueDate, int IsSwap, bool IsFloatingProfit = true, DateTime? oldMaturityDate = null) { double swapRate = 0; var customizedResults = QdpHelper.ParseAutocallCustomizedInfo(swapTimeAndRate); var dates = customizedResults.Item1; if (dates == null) { return swapRate; } var getSwapRates = customizedResults.Item2; var latestDate = dates.Where(x => x.DateTime >= valueDate).OrderBy(x => x.DateTime).FirstOrDefault(); //展期情况互换利率获取最后一个日期的互换利率 if (latestDate == null) { latestDate = dates.Max(); } if (latestDate != null) { if (getSwapRates != null && getSwapRates.Any()) { swapRate = getSwapRates[TradeObservationHelper.GetDateIndex(dates, latestDate)]; } } return swapRate; } public JsonResult batchSaveManuallyTradeObservationPrice(DateTime valueDate, List underlyingList, string tradeIds) { var tradeIdList = tradeIds.Split(','); var trades = db.trade.Where(x => tradeIdList.Contains(x.id.ToString()) || tradeIdList.Contains(x.ParentTradeId.ToString())).ToList(); foreach (var trade in trades) { var underlying = underlyingList.FirstOrDefault(x => x.UnderlyingCode == trade.UnderlyingCode); if (underlying != null) { var recordsRemove = db.manually_trade_observation_price.Where(x => x.TradeId == trade.id && x.ValueDate == valueDate); db.manually_trade_observation_price.RemoveRange(recordsRemove); db.manually_trade_observation_price.Add(new manually_trade_observation_price() { TradeId = trade.id, //TradeNumber = trade.TradeNumber, ValueDate = valueDate, Price = underlying.Price, OptDate = DateTime.Now, OptId = CurUser.UserId, OptName = CurUser.UserName }); } db.TradeAuditLog.Add(new TradeAuditLog { TradeId = trade.id, AuditFlag = TradeAuditFlag.operation, OptType = "批量设置观察价格", Changes = null, DataType = "00", OptId = UserId, OptName = UserName, OptDate = DateTime.Now }); } db.SaveChanges(); foreach (var td in trades) { var tradeStatus = td.TradeStatus; new TradeExtendService(CurUser, db).SetTradeExtend(new[] { td }, tracking: true); var underlying = underlyingList.FirstOrDefault(x => x.UnderlyingCode == td.UnderlyingCode); if (underlying == null) { return JsonError($"批量设置的标的价格未包含标的:{td.UnderlyingCode}"); } var baseService = new TradeServiceBase(CurUser, db); switch (td.TradeType) { case "障碍期权": if (!string.IsNullOrEmpty(td.trade_barrier_option.KnockInOutStatus)) { return JsonError("请确认该交易的敲入敲出状态"); } if (td.TradeStatus != ConsTrade.确认成交) { return JsonError("该交易非确认成交状态,无法设置"); } new BarrierOptionKnockioService(baseService).CheckBarrierKnockInOutStatus(td, td.trade_barrier_option, valueDate, underlying.Price, underlying.Price, underlying.Price); break; case "双鲨期权": if (!string.IsNullOrEmpty(td.trade_double_sharkfin_option.KnockInOutStatus)) { return JsonError("请确认该交易的敲入敲出状态"); } if (td.TradeStatus != ConsTrade.确认成交) { return JsonError("该交易非确认成交状态,无法设置"); } new DoubleSharkOptionKnockoutService(baseService).CheckDoubleSharkFinKnockOutStatus(td, td.trade_double_sharkfin_option, valueDate, underlying.Price, underlying.Price); break; case "区间累积期权": new TradeRangeAccrualService(baseService).CheckRangeAccrualBonus(td, td.trade_rangeaccrual, valueDate, underlying.Price ?? 0); break; case "凤凰期权": new TradeAutocallBLL(baseService).CheckAutocallKnockInOutStatus(td, td.trade_autocall, valueDate, underlying.Price ?? 0, null); break; case "雪球期权": new TradeSnowballBLL(baseService).CheckSnowballKnockInOutStatus(td, td.trade_snowball, valueDate, underlying.Price ?? 0, null); break; case "气囊结构": new TradeAirbagService(baseService).CheckAirbagKnockInStatus(td, td.trade_airbag, valueDate, underlying.Price ?? 0); break; case "累计期权": new TradeAccumulatorService(baseService).CheckAccumulatorKnockInStatus(td, td.trade_accumulator_option, valueDate, underlying.Price ?? 0); break; } if (tradeStatus != td.TradeStatus) { //删除E/Bod_Trade记录 baseService.RemoveEodTradeAndFutureInfo(false, td.id, valueDate); } db.SaveChanges(); } return JsonSuccess("批量设置观察日价格成功!"); } public ActionResult BatchSetObservationPrice(string tradeIds) { ViewBag.TradeIds = tradeIds; var tradeIdList = tradeIds.Split(','); var trades = db.trade.Where(x => tradeIdList.Contains(x.id.ToString())); var underlyingIds = trades.Select(x => x.UnderlyingId).Distinct(); var underlyingList = db.underlying_manager.Where(x => underlyingIds.Contains(x.id)).ToList(); return View(underlyingList); } public JsonResult checkBatchSetObservationPrice(List tradeids) { if (tradeids == null || !tradeids.Any()) { return JsonError("请选中交易"); } var tradesStatusInvalid = db.trade.Where(x => tradeids.Contains(x.id) && x.TradeStatus != ConsTrade.确认成交); if (tradesStatusInvalid.Any()) { return JsonError("请确保选择的交易状态为确认成交"); } var tradesTypeInvalid = db.trade.Where(x => tradeids.Contains(x.id) && x.TradeType != "二元期权" && x.TradeType != "障碍期权" && x.TradeType != "双鲨期权" && x.TradeType != "区间累积期权" && x.TradeType != "凤凰期权" && x.TradeType != "雪球期权" && x.TradeType != "累计期权" && x.TradeType != "结构化交易"); if (tradesTypeInvalid.Any()) { return JsonError("请确保选择的交易类型存在观察条款"); } return JsonSuccess(); } public JsonResult IsNumOfSmoothingDaysInRange(int numOfSmoothingDays, DateTime tradeDate, DateTime exerciseDate) { if (numOfSmoothingDays > QdpCalendarHelper.GetNonHolidayDaysBetween(tradeDate, exerciseDate) + 1) { return Json(false); } return Json(true); } public ActionResult structureoptionV2(string name) { //设置默认值 StructureOption_Code.StructureOptions.ForEach(s => { s.TradeDate = valuedateBLL.ValueDate.Date; }); var option = StructureOption_Code.StructureOptions.FirstOrDefault(o => o.Name == name); var config = new SysUserConfigService(CurUser).GetConfigData(Server.CacheProvider); ViewBag.SimpleMode = config?.Pricing_SimpleMode ?? true; return View(option); } /// /// 生成某客户在某日期已行权或已到期的交易的报告(行权日报告,pdf格式) /// /// 客户Id /// 到日期 /// public ActionResult clientMaturityDateTradePreview(int? ClientId, DateTime? ExerciseDate) { var systemDate = valuedateBLL.ValueDate; var client = DataCacheProvider.GetClientDataSource().GetData(ClientId ?? 0); var bll = new tradeBLL(); var req = new TradeReq { ExerciseDate = ExerciseDate ?? systemDate }; req.ExerciseDateStart = req.ExerciseDate; req.ExerciseDateEnd = req.ExerciseDate; req.ClientId = ClientId; //req.TradeStatus = ConsTrade.确认成交; req.TradeStatusList = new List { ConsTrade.已到期, ConsTrade.已执行, ConsTrade.确认成交, ConsTrade.期初价格已确认 }; req.LoginUserId = CurUser.UserId; req.sidx = "OptDate"; req.sord = "desc"; var userAsset = CurUser.GetAssetUnitIds(); var tradeList = bll.SearchTradeList(req, true, true); //string saveFileDir = Server.MapPath("~/App_Docs/MaturityDateTrade"); //string fileName = @"D:\pdf\tests.pdf"; //string filePath = Path.Combine(saveFileDir, client.Name+"_"+req.ExerciseDate.Value.Date); //设置文件名称 var saveFileDir = Server.MapPath("~/App_Docs/ManturityDateTrade"); if (!Directory.Exists(saveFileDir)) { Directory.CreateDirectory(saveFileDir); } var fileName = $"行权日报告-{req.ExerciseDate.Value:yyyy-MM-dd}-{client.Name}.pdf"; var filePath = Path.Combine(saveFileDir, fileName); var document = new Document(HeaderAndFooterEvent.rect); //此处使用的是http请求的流,你也可以使用文件流Stream var writer = PdfWriter.GetInstance(document, new FileStream(filePath, FileMode.Create)); try { document.Open(); writer.PageEvent = new HeaderAndFooterEvent(); HeaderAndFooterEvent.PAGE_NUMBER = true;//实现页眉跟页脚 HeaderAndFooterEvent.tpl = writer.DirectContent.CreateTemplate(1000, 1000); //定义模板 HeaderAndFooterEvent.HeaderLeft = ""; HeaderAndFooterEvent.HeaderRight = PS.Config.CompanyName ?? ""; //HeaderAndFooterEvent.FooterLeft = "TEL:010-87922095"; HeaderAndFooterEvent.FooterRight = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "(UTC)"; //每次在添加文本内容之前可以先设置字体,有效期持续到重新设置之前 HeaderAndFooterEvent.SetFont(BaseColor.DARK_GRAY, "宋体", 15,iTextSharp.text.Font.BOLD); document.Add(HeaderAndFooterEvent.AddParagraph("客户行权日报告", 1, 1.5f)); HeaderAndFooterEvent.SetFont(BaseColor.DARK_GRAY, "宋体", 12); document.Add(HeaderAndFooterEvent.AddParagraph("客户: " + client.Name, 0, 1.5f)); document.Add(HeaderAndFooterEvent.AddParagraph("日期: " + req.ExerciseDate.Value.ToString("yyyy-MM-dd"), 0, 1.5f)); //增加空行 document.Add(HeaderAndFooterEvent.AddParagraph(" ", 0, 1.5f)); //输出客户行权报告表格信息 var table = new PdfPTable(10); table.SetWidths(new float[] { 100, 120, 100, 150, 180, 130, 100, 100, 100, 100 }); //table.HorizontalAlignment = Element.ALIGN_RIGHT; //table.SpacingBefore = (5); //table.SpacingAfter = (5); var bftitle = BaseFont.CreateFont("C:\\Windows\\Fonts\\SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //用系统中的字体文件SimHei.ttf创建文件字体 var fonttitle = new iTextSharp.text.Font(bftitle, 8); var cellTexts = new[] { "交易方向", "期权类型", "看涨看跌", "行权方式", "到期日", "标的", "行权价", "期初价格", "名义本金", "交易数量" }; foreach (var text in cellTexts) { var cell = new PdfPCell(new Phrase(text, fonttitle)) { BackgroundColor = (BaseColor.GRAY) }; table.AddCell(cell); } if (tradeList != null && tradeList.Count > 0) { var underlyingCodes = tradeList.Select(t => t.UnderlyingId).Distinct().ToList(); var varietyDict = (from um in db.underlying_manager join var in db.variety on um.UnderlyingTypeId equals var.id where underlyingCodes.Contains(um.id) select new { underlyingId = um.id, variety = var }).ToDictionary(t => t.underlyingId, t => t.variety); foreach (var trade in tradeList) { table.AddCell(new Phrase(BuySellConvert.GetClientBuySell(trade.BuySell), fonttitle)); table.AddCell(new Phrase(trade.TradeType, fonttitle)); table.AddCell(new Phrase(trade.CallPut == "Call" ? "看涨" : "看跌", fonttitle)); if (!string.IsNullOrEmpty(trade.ExerciseMode)) { if (trade.ExerciseMode == "European") { table.AddCell(new Phrase("欧式", fonttitle)); } else if (trade.ExerciseMode == "American") { table.AddCell(new Phrase("美式", fonttitle)); } else { table.AddCell(new Phrase("", fonttitle)); } } else { table.AddCell(new Phrase("", fonttitle)); } table.AddCell(new Phrase(trade.ExerciseDate == null ? "" : trade.ExerciseDate.Value.ToString("yyyy-MM-dd"), fonttitle)); table.AddCell(new Phrase(trade.UnderlyingCode, fonttitle)); table.AddCell(new Phrase(trade.Strike == null ? "0.0" : trade.Strike.Value.ToString("###,##0.00"), fonttitle)); var initialSpotPrice = trade.SpotPrice; table.AddCell(new Phrase(initialSpotPrice == null ? "0.0" : initialSpotPrice.Value.ToString("###,##0.00"), fonttitle)); table.AddCell(new Phrase(trade.StockEqvNotional == 0 ? "0.0" : trade.StockEqvNotional.ToString("###,##0.00") + "", fonttitle)); if (trade.UnderlyingInstrumentType == "Stock") { table.AddCell(new Phrase("", fonttitle)); } else { var QuoteUnitSingle = ""; if (varietyDict != null && varietyDict.ContainsKey(trade.UnderlyingId)) { QuoteUnitSingle = varietyDict[trade.UnderlyingId].QuoteUnitSingle; } table.AddCell(new Phrase(trade.TradeAmount == 0 ? "0.0" : trade.TradeAmount.ToString("###,##0.00") + QuoteUnitSingle, fonttitle)); } } } else { var cell = new PdfPCell(new Phrase("无", fonttitle)) { BackgroundColor = (BaseColor.YELLOW), HorizontalAlignment = (Element.ALIGN_CENTER), Colspan = (10) }; table.AddCell(cell); } table.DefaultCell.BackgroundColor = (null); document.Add(table); } finally { writer.Flush(); writer.CloseStream = true; document.Dispose(); } return File(filePath, "application/pdf"); } public JsonResult SendEMailMaturityDateTrade(int? ClientId, DateTime? ExerciseDate) { var message = new MaturityDateTradeService(CurUser) .SendEMailMaturityDateTrade(ClientId, ExerciseDate); return JsonSuccess(message); } /// /// 检查标的是否有 已到期, 已执行, 已平仓 之外状态的交易存在 检查标的是否存在黑白名单中 /// public JsonResult CheckUnderlyingTrade(int[] uids) { var noFixedTrades = db.trade.Where(t => uids.Contains(t.UnderlyingId) && !ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus) && t.ValidState != ConsGlobal.InValid).ToList(); ///// 获取到标的信息 //var code = db.underlying_manager.FirstOrDefault(d => uids.Contains(d.id)); //if (code.UnderlyingInstrumentType == "Stock") //{ // if (db.Stock_BlackWhite.Any(c => c.BlackWhiteState == 0) && db.Stock_BlackWhite.Any(c => c.BlackWhiteState == 0 && c.UnderlyingCode == code.UnderlyingCode)) // { // return JsonError("此标的在黑名单中,禁止启用"); // } // if (db.Stock_BlackWhite.Any(c => c.BlackWhiteState == 1) && db.Stock_BlackWhite.Any(c => c.BlackWhiteState == 1 && c.UnderlyingCode != code.UnderlyingCode)) // { // return JsonError("此标的不在白名单中,禁止启用"); // } //} return JsonSuccess("", noFixedTrades); } /// /// 检查障碍期权是否可以平仓执行 /// public JsonResult checkBarrierUnwind(string enid) { var intid = DataProtectHelper.DecryptInt(enid); var td = db.trade.Find(intid); tradeBLL.SetFieldsByTradeType(td); if (td.trade_barrier_option != null) { switch (td.trade_barrier_option.BarrierType) { case "下降敲入": case "上升敲入": case "双障碍敲入": return JsonSuccess(); case "上升敲出": case "下降敲出": case "双障碍敲出": if (td.trade_barrier_option.KnockInOutStatus == ConsTrade.KnockState.KnockedOut) { return JsonError("障碍期权类型为:" + td.trade_barrier_option.BarrierType + " 已敲出无需平仓!"); } else { return JsonSuccess(); }; default: return JsonError("障碍期权类型:" + td.trade_barrier_option.BarrierType + " 无法识别!"); } } else { return JsonError("错误交易,障碍期权Option信息不存在!"); } } [MyAuthorize("交易管理-交易审批")] public ActionResult TradeApproval() { return View(); } public JsonResult tradeOpeningProcessQuery(TradeReq req) { req.LoginUserId = CurUser.UserId; req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); var sList = new tradeBLL().tradeOpeningProcessQuery(req, CurUser.UserId, out var gsum, false); if (sList.rows != null && sList.rows.Any()) { new TradeDalService(CurUser).SetStructureInfo(sList.rows); foreach (var item in sList.rows) { if (item.TradeType == "合成价差期权") { item.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(item.UnderlyingCode); } //审批流程中,当前需要审批的角色是否有复核权限 //item.HasCheckRight = RoleRight.GetRoleFunction(item.ProcessRoleId, "交易复核"); //RoleRight.GetRoleFunction(item.ProcessRoleId, "交易行权审核"):有审批流程,且当前需要审批的角色有复核权限 //item.ProcessRoleId == null: 没有审批流程 //(valuedateBLL.SystemDate.CloseReApprove != 1):参数配置行权/平仓不需要审批 //(valuedateBLL.SystemDate.CloseReCheck == 1):参数配置行权/平仓需要复核 //HasExerciseCheckRight/HasUnwindCheckRight: 是否需要复核 item.HasExerciseCheckRight = (RoleRight.GetRoleFunction(item.ProcessRoleId, "交易行权审核") || item.ProcessRoleId == null || (valuedateBLL.SystemDate.CloseReApprove != 1)) && (valuedateBLL.SystemDate.CloseReCheck == 1); item.HasUnwindCheckRight = (RoleRight.GetRoleFunction(item.ProcessRoleId, "交易平仓审核") || item.ProcessRoleId == null || (valuedateBLL.SystemDate.CloseReApprove != 1)) && (valuedateBLL.SystemDate.CloseReCheck == 1); } } return Json(sList); } public ActionResult finishedTradesUpload() { return View(); } /// /// 批量生成结算确认书 /// public JsonResult BatchGenerateSettleBill(TradeReq req) { req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); var message = new SettleBillService(CurUser).BatchGenerateSettleBill(req); return JsonSuccess(message); } public JsonResult GenerateSettleBillForSingle(TradeReq req) { var message = new SettleBillService(CurUser).GenerateSettleBillForSingle(req); return JsonSuccess(message); } /// /// 生成结算确认书 /// public JsonResult GJGenerateSettleBill(List tradeIds, string docType, int? userId, string userName) { var user = new OptUserInfo(userId ?? UserId, userName.TrimToNull() ?? UserName, OptUserFrom.WebUI); if (new TradeContractGenerateService(user).GJGenerateConfirmBook(tradeIds, docType, out var errors, out var files)) { return JsonSuccess("生成成功", files); } return JsonError(string.Join("\r\n", errors.AsEnumerable()), files); } /// /// 生成结算确认书 /// public JsonResult GJGenerateSettleBillByTradeCashIds(List tradeCashIds, string docType, int? userId, string userName, DateTime? startDate, DateTime? endDate) { if ("doc".Equals(docType, StringComparison.OrdinalIgnoreCase)) { docType = "DOCX"; } docType = docType.ToLower(); if (!userId.HasValue) { userId = CurUser.UserId; } if (userName.IsNullOrWhiteSpace()) { userName = CurUser.UserName; } var results = new List(); var files = new List(); var errors = new List(); var tradeIds = yldb.trade_cash.Where(l => tradeCashIds.Contains(l.id)).Select(l => l.TradeId).ToList(); if (PS.Config.Company == CompanyEnum.国信金阳) { var IsTradeContract = yldb.trade_contract_r.Where(l => l.IsValid && tradeIds.Contains(l.TradeId) && l.Type == "交易确认书").Select(l => l.TradeId).ToList(); var IsTradeIds = tradeIds.Where(l => !IsTradeContract.Contains(l)).ToList(); if (IsTradeIds.Count > 0) { throw new ServiceException(String.Join(",", yldb.trade.Where(l => IsTradeIds.Contains(l.id)).Select(l => l.TradeNumber).ToArray()) + "请生成该交易编号相应交易确认书"); } if (!new TradeContractGenerateService(CurUser).GXJY_CorrespondingConfirmationTemplate(tradeIds, out string Msg)) { throw new ServiceException(Msg); } } if (PS.Config.Company == CompanyEnum.海通) { var query = from t in yldb.trade join tc in yldb.trade_cash on t.id equals tc.TradeId where tradeCashIds.Contains(tc.id) && tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted && (((tc.Action == ClientCashInCashOut.系统操作_行权费 || tc.Action == ClientCashInCashOut.系统操作_平仓费) && (tc.ExerciseWay == TradeCashExerciseWayEnum.到期行权 || tc.ExerciseWay == TradeCashExerciseWayEnum.提前终止行权)) || tc.Action == ClientCashInCashOut.系统操作_票息) select new { tc.id, t.ClientId }; var clientTradeDict = query.AsEnumerable().GroupBy(O => O.ClientId) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); foreach (var tradeCashs in clientTradeDict) { results = new RDBatchEndBillGenerateService(CurUser) .Generate(tradeCashs.Value, null, "PDF", CurUser.UserId, CurUser.UserName).ToList(); errors.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray()); files.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList()); if (errors.Any()) { break; } } } else if (PS.Config.Is瑞达) { var tradeTypeArr = new List() { "远期", "亚式期权" }; var query = (from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted) join t in yldb.trade on tc.TradeId equals t.id select new { tc.id, tc.ValueDate, t.ClientId, tradeType = tradeTypeArr.Contains(t.TradeType) ? t.TradeType : "Normal", IsSW = t.StructureType == "掉期" ? "0" : "1" })//通过传入的tradeCashId查出对应的记录; .Union (from pid in (from interTc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted) join interT in yldb.trade on interTc.TradeId equals interT.id where interT.ParentTradeId != 0 select new { interT.ParentTradeId, interTc.ValueDate, interTc.Action }) join t in yldb.trade on pid.ParentTradeId equals t.ParentTradeId join tc in yldb.trade_cash on new { t.id, pid.ValueDate, pid.Action } equals new { id = tc.TradeId, tc.ValueDate, tc.Action } where !tc.IsDeleted select new { tc.id, tc.ValueDate, t.ClientId, tradeType = tradeTypeArr.Contains(t.TradeType) ? t.TradeType : "Normal", IsSW = t.StructureType == "掉期" ? "0" : "1" }//再通过传入的tradeCashId查出对应的兄弟交易的记录; ); var clientTradeDict = query.AsEnumerable().GroupBy(O => O.ClientId + " " + O.ValueDate + " " + O.tradeType + " " + O.IsSW) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); foreach (var trades in clientTradeDict) { var result = new RDBatchEndBillGenerateService(CurUser) .Generate(trades.Value, null, "PDF", CurUser.UserId, CurUser.UserName).ToList(); results.AddRange(result); errors.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray()); files.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList()); if (errors.Any()) { break; } } } else if (PS.Config.Is兴证) { var tradeTypeArr = new List() { "远期", "亚式期权" }; var query = (from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted) join t in yldb.trade on tc.TradeId equals t.id select new { tc.id, tc.ValueDate, t.ClientId, tradeType = tradeTypeArr.Contains(t.TradeType) ? t.TradeType : "Normal", IsSW = t.StructureType == "掉期" ? "0" : "1" }); //通过传入的tradeCashId查出对应的记录; var clientTradeDict = query.AsEnumerable().GroupBy(O => O.id) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); foreach (var trades in clientTradeDict) { var result = new RDBatchEndBillGenerateService(CurUser) .Generate(trades.Value, null, "PDF", CurUser.UserId, CurUser.UserName).ToList(); results.AddRange(result); errors.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray()); files.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList()); if (errors.Any()) { break; } } } else if (PS.Config.Company == CompanyEnum.中金) { if (tradeCashIds == null || tradeCashIds.Count() < 0) { if (startDate == endDate) { var tcs = yldb.trade_cash.Where(o => o.ValueDate == startDate); tradeCashIds = tcs.Select(o => o.id).ToList(); } else { throw new ServiceException("请保证已选择交易或实际终止日为一天"); } } var query = (from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted) join t in yldb.trade on tc.TradeId equals t.id select new { tc.id, tc.ValueDate, t.ClientId, tradeid = t.ParentTradeId == 0 ? t.id : t.ParentTradeId, t.UnderlyingCode })//通过传入的tradeCashId查出对应的记录; .Union (from pid in (from interTc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted) join interT in yldb.trade on interTc.TradeId equals interT.id where interT.ParentTradeId != 0 select new { interT.ParentTradeId, interTc.ValueDate, interTc.Action, interTc.Notional, interTc.UnwindNotional, interTc.ExerciseWay }) join t in yldb.trade on pid.ParentTradeId equals t.ParentTradeId join tc in yldb.trade_cash //后期需要更改 on new { t.id, pid.ValueDate, pid.Action, pid.Notional, pid.UnwindNotional, pid.ExerciseWay } equals new { id = tc.TradeId, tc.ValueDate, tc.Action, tc.Notional, tc.UnwindNotional, tc.ExerciseWay } where !tc.IsDeleted select new { tc.id, tc.ValueDate, t.ClientId, tradeid = t.ParentTradeId == 0 ? t.id : t.ParentTradeId, t.UnderlyingCode }//再通过传入的tradeCashId查出对应的兄弟交易的记录; ); var clientTradeDict = new Dictionary>(); var clientIds = query.AsEnumerable().Select(o => o.ClientId).Distinct().ToList(); var clients = DbContextFactory.GetClientDbContext(CurUser).client.Where(o => clientIds.Contains(o.id)); foreach (var c in clients) { var tcs = query.Where(o => o.ClientId == c.id); if (c.BoundSide == BoundSideEnum.北向) { foreach (var tc in tcs) { clientTradeDict.Add(tc.id.ToString(), new List { tc.id }); } } else { var Dict = tcs.AsEnumerable().GroupBy(O => O.ClientId + " " + O.ValueDate) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); foreach (var row in Dict) { clientTradeDict.Add(row.Key, row.Value); } } } foreach (var trades in clientTradeDict) { var result = new RDBatchEndBillGenerateService(CurUser) .Generate(trades.Value, null, docType, CurUser.UserId, CurUser.UserName).ToList(); results.AddRange(result); } errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToList(); files = results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList(); } else if (PS.Config.Company == CompanyEnum.广发商贸) { var forwardTrades = yldb.trade.Where(x => tradeIds.Contains(x.id) && x.TradeType == "远期").Select(s => s.id).ToList(); var forwardTradeCashIds = yldb.trade_cash.Where(l => tradeCashIds.Contains(l.id) && forwardTrades.Contains(l.TradeId)).Select(s => s.id).ToList(); if (forwardTradeCashIds.Count > 0) { var _results = new ForwardSettlementBillGenerateService(CurUser).Generate(forwardTradeCashIds, null, docType).ToList(); results.AddRange(_results); } tradeCashIds = tradeCashIds.Except(forwardTradeCashIds).ToList(); if (tradeCashIds.Count > 0) { var results1 = new SettlementBillGenerateService(CurUser).Generate(tradeCashIds, null, docType, userId ?? CurUser.UserId, userName).ToList(); results.AddRange(results1); } errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToList(); files = DocFileHelper.CheckResultDocFilePath(results.Select(n => n.OutputFilePath)); } else if (PS.Config.Is物产中大) { var IsTradeContract = yldb.trade_contract_r.Where(l => l.IsValid && tradeIds.Contains(l.TradeId) && l.Type == "交易确认书").Select(l => l.TradeId).ToList(); var IsTradeIds = tradeIds.Where(l => !IsTradeContract.Contains(l)).ToList(); if (IsTradeIds.Count > 0) { throw new ServiceException(String.Join(",", yldb.trade.Where(l => IsTradeIds.Contains(l.id)).Select(l => l.TradeNumber).ToArray()) + "请生成该交易编号相应交易确认书"); } var query = (from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted) join t in yldb.trade on tc.TradeId equals t.id select new { tc.id, tc.ValueDate, t.ClientId, t.TradeType, }); //通过传入的tradeCashId查出对应的记录; var clientTradeDict = query.AsEnumerable().GroupBy(O => new { O.ClientId,O.ValueDate,O.TradeType,}) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); foreach (var trades in clientTradeDict) { if (trades.Value.Count>10) { throw new ServiceException("同客户同日期同类型交易生成超过限制!"); } var result = new RDBatchEndBillGenerateService(CurUser) .Generate(trades.Value, null, docType, CurUser.UserId, CurUser.UserName).ToList(); results.AddRange(result); } errors.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToArray()); files.AddRange(results.Where(n => !string.IsNullOrWhiteSpace(n.OutputFilePath)).Select(n => n.OutputFilePath).ToList()); } else { if (PS.Config.Is国泰君安) { var getUnderlyingInstrumentType = new Func((underlyingId) => { return DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingId).UnderlyingInstrumentType; }); var error = new List(); var file = new List(); var query = from t in yldb.trade join tc in yldb.trade_cash on t.id equals tc.TradeId where tradeCashIds.Contains(tc.id) && tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted && tc.Action != ClientCashInCashOut.系统操作_期权费 select new { t.id, t.ClientId, t.UnderlyingInstrumentType, t.UnderlyingId, t.TradeType, TradeCashId = tc.id, ValueDate = tc.HappenedDate ?? tc.ValueDate }; var instrumentTypeArr = new List() { ConsGlobal.InstrumentType.Stock, ConsGlobal.InstrumentType.StockIF, ConsGlobal.InstrumentType.StockIndex }; var arr = query.ToList(); if (arr.Any(O => instrumentTypeArr.Contains(getUnderlyingInstrumentType(O.UnderlyingId)) || O.TradeType == "雪球期权")) { //暂时将所有子交易都作为判断依据,等拿到模板后再根据模板做调整更改; //目前是否为权益类的判断条件只是是否是股票,没有考虑IC IF等品种; var count = arr.GroupBy(O => new { UnderlyingInstrumentType = (instrumentTypeArr.Contains(getUnderlyingInstrumentType(O.UnderlyingId)) || O.TradeType == "雪球期权") ? 1 : 0 }).Count(); if (count > 1) { throw new ServiceException("不应勾选多个非股票(含股指期货)标的的交易"); } var group = query.AsEnumerable().GroupBy(O => new { O.ClientId }).ToDictionary(K => K.Key, V => V.Select(O => O.TradeCashId).ToList()); foreach (var item in group) { var trade_contract_r = yldb.trade_contract_r.Where(c => item.Value.Contains(c.TradeCashId.Value) && c.IsValid).ToList(); //yldb.trade_contract_r.RemoveRange(trade_contract_r); trade_contract_r.ForEach(O => O.IsValid = false); yldb.SaveChanges(); var trades = query.Where(c => item.Value.Contains(c.TradeCashId)).ToList(); var supProtocolDate = DataCacheProvider.GetClientDataSource().GetData(trades.FirstOrDefault().ClientId).SupProtocolDate; var groupDateDouble = trades.Where(x => supProtocolDate == null || x.ValueDate < supProtocolDate).Select(x => x.TradeCashId).ToList(); var groupDateSingle = trades.Where(x => supProtocolDate != null && x.ValueDate >= supProtocolDate).Select(x => x.TradeCashId).ToList(); // 单章确认书和双章确认书同时生成要生成两个文件 if (groupDateDouble.Any() && groupDateSingle.Any()) { var result1 = new RDBatchEndBillGenerateService(CurUser).Generate(groupDateDouble, null, docType, userId ?? CurUser.UserId, userName, startDate, supProtocolDate.Value.AddDays(-1)); results.AddRange(result1); var result2 = new RDBatchEndBillGenerateService(CurUser).Generate(groupDateSingle, null, docType, userId ?? CurUser.UserId, userName, supProtocolDate, endDate); results.AddRange(result2); } else if (groupDateDouble.Any()) { var result = new RDBatchEndBillGenerateService(CurUser).Generate(groupDateDouble, null, docType, userId ?? CurUser.UserId, userName, startDate, endDate); results.AddRange(result); } else if (groupDateSingle.Any()) { var result = new RDBatchEndBillGenerateService(CurUser).Generate(groupDateSingle, null, docType, userId ?? CurUser.UserId, userName, startDate, endDate); results.AddRange(result); } } } } if (results.Count() == 0) { if (PS.Config.ErpElement.SettlementPageV2) { var query = (from tc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted) join t in yldb.trade on tc.TradeId equals t.id select new { tc.id, tc.ValueDate, t.ClientId, tradeid = t.ParentTradeId == 0 ? t.id : t.ParentTradeId, t.UnderlyingCode, t.TradeType })//通过传入的tradeCashId查出对应的记录; .Union (from pid in (from interTc in yldb.trade_cash.Where(O => tradeCashIds.Contains(O.id) && !O.IsDeleted) join interT in yldb.trade on interTc.TradeId equals interT.id where interT.ParentTradeId != 0 select new { interT.ParentTradeId, interTc.ValueDate, interTc.Action, interTc.Notional, interTc.UnwindNotional, interTc.ExerciseWay }) join t in yldb.trade on pid.ParentTradeId equals t.ParentTradeId join tc in yldb.trade_cash //后期需要更改 on new { t.id, pid.ValueDate, pid.Action, pid.Notional, pid.UnwindNotional, pid.ExerciseWay } equals new { id = tc.TradeId, tc.ValueDate, tc.Action, tc.Notional, tc.UnwindNotional, tc.ExerciseWay } where !tc.IsDeleted select new { tc.id, tc.ValueDate, t.ClientId, tradeid = t.ParentTradeId == 0 ? t.id : t.ParentTradeId, t.UnderlyingCode, t.TradeType }//再通过传入的tradeCashId查出对应的兄弟交易的记录; ); var clientTradeDict = new Dictionary>(); //query.GroupBy(O => O.ClientId + " " + O.ValueDate + " " + O.tradeid) //.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); var list = query.AsEnumerable(); if (PS.Config.Company == CompanyEnum.润和) { var notAsignOptionList = list.Where(p => !"亚式期权".Equals(p.TradeType)).ToList(); if (notAsignOptionList != null && notAsignOptionList.Count > 0) { clientTradeDict = notAsignOptionList.GroupBy(O => O.ClientId + " " + O.ValueDate) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); } var asignOptionList = list.Where(p => "亚式期权".Equals(p.TradeType)).ToList(); if (asignOptionList != null && asignOptionList.Count > 0) { var asignOptionDic = asignOptionList.GroupBy(O => O.ClientId + " " + O.ValueDate + " " + O.tradeid) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); foreach (var asignDic in asignOptionDic) { clientTradeDict.Add(asignDic.Key, asignDic.Value); } } //clientTradeDict = //list.GroupBy(O => O.ClientId + " " + O.ValueDate) //.ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); } else { clientTradeDict = list.GroupBy(O => O.ClientId + " " + O.ValueDate + " " + O.tradeid) .ToDictionary(K => K.Key, V => V.Select(O => O.id).ToList()); } foreach (var trades in clientTradeDict) { var result = new RDBatchEndBillGenerateService(CurUser) .Generate(trades.Value, null, docType, CurUser.UserId, CurUser.UserName).ToList(); results.AddRange(result); } } else { results = new SettlementBillGenerateService(CurUser).Generate(tradeCashIds, null, docType, userId ?? CurUser.UserId, userName).ToList(); } } errors = results.Where(n => !string.IsNullOrWhiteSpace(n.ErrorMessage)).Select(n => n.ErrorMessage).ToList(); files = DocFileHelper.CheckResultDocFilePath(results.Select(n => n.OutputFilePath)); } if (errors.Any()) { return JsonError(string.Join("\r\n", errors.AsEnumerable()), files); } return JsonSuccess(PS.GetErpConfig().IsAutoSealAndUploadFiles && PS.GetErpConfig().IsAutoSealAfterGeneratedBook ? "生成成功,用印等待中..." : "生成成功", files); } /// /// 生成结算确认书 /// public JsonResult GJGenerateUnwindReport(List trades, string docType, int? userId, string userName) { docType = docType.ToLowerInvariant(); if ("doc" == docType) { docType = "docx"; } var user = new OptUserInfo(userId ?? UserId, userName.TrimToNull() ?? UserName, OptUserFrom.WebUI); if (new TradeContractGenerateService(user).GJGenerateUnwindReport(trades, docType, out var errors, out var files)) { files = DocFileHelper.CheckResultDocFilePath(files); return JsonSuccess(PS.GetErpConfig().IsAutoSealAndUploadFiles ? "生成成功,用印等待中..." : "生成成功", files); } return JsonError(string.Join("\r\n", errors.AsEnumerable()), files); } /// /// 批量发送清算确认书 /// public JsonResult SendEmailSettleBill(TradeReq req) { var message = new SettleBillService(CurUser).SendEmailSettleBill(req); return JsonSuccess(message); } /// /// 国君批量发送清算确认书 /// public JsonResult SendEmailSettleBill_Guojun(TradeReq req) { var message = new SettleBillService(CurUser).SendEmailSettleBill_Guojun(req); return JsonSuccess(message); } /// /// 批量发送提前终止确认书 /// public JsonResult SendEmailUnwindReport(TradeReq req) { var message = new UnwindReportService(CurUser).SendEmailUnwindReport(req); return JsonSuccess(message); } /// /// 国君发送提前终止确认书 /// /// /// public JsonResult SendEmailUnwindReportGuojun(TradeReq req) { var message = new UnwindReportService(CurUser).GuojunSendEmailUnwindReport(req); return JsonSuccess(message); } /// /// 批量发送清算确认书和提前终止确认书 /// public JsonResult SendEmailEitherReport(TradeReq req) { var message = new UnwindReportService(CurUser).SendEmailEitherReport(req); return JsonSuccess(message); } [MyAuthorize("结算管理-到期结算报告")] public ActionResult maturityDateReport() { if (GlobalConfig.SelectConfirmationBookTemplate) { try { if (string.IsNullOrWhiteSpace(GlobalConfig.PluginFolder)) { throw new Exception("未找到插件路径"); } var dirPath = Path.Combine(GlobalConfig.PluginFolder, "App_Docs", ContractTypeEnum.Clearing); if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } var paths = Directory.GetFiles(dirPath, "*.docx"); for (var i = 0; i < paths.Length; i++) { paths[i] = Path.GetFileName(paths[i]); } ViewBag.TemplateNames = paths; } catch (Exception ex) { LogFactory.GetLogger("SelectConfirmationBookTemplate").Error(ex); } } return View(); } public JsonResult todayMaturityTradeReportQuery(TradeReq req) { var systemDate = valuedateBLL.ValueDate; var bll = new tradeBLL(); req.ExerciseDate = req.ExerciseDate ?? systemDate; req.ExerciseDateStart = req.ExerciseDateStart ?? DateTime.MinValue; req.ExerciseDateEnd = req.ExerciseDateEnd ?? DateTime.MaxValue; //req.TradeStatus = ConsTrade.确认成交; //req.TradeStatusList = new List { ConsTrade.已到期, ConsTrade.已执行, ConsTrade.已平仓 }; req.TradeStatusList = new List { ConsTrade.已到期, ConsTrade.已执行 }; if (PS.Config.ComponentVersion != ComponentVersion.MarketMaker) {//非国君都设置为到期结算报告包括平仓交易 req.TradeStatusList.Add(ConsTrade.已平仓); req.TradeStatusList.Add(ConsTrade.确认成交); } if (req.TradeTypes == null) { List types = new List(ConsTrade.OptionTradeTypes); if (PS.Config.Is渤海 || PS.Config.Company == CompanyEnum.广发商贸) { types.Add("远期"); } //默认只查询期权类交易 req.TradeTypes = string.Join(",", types); } req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = bll.SearchTradeWithCashList(req, out var gsum, false); var rowList = sList.rows; new TradeDalService(CurUser).SetStructureInfo(rowList.Select(x => x.trade).ToList()); //增加交易确认书编号 if (rowList != null && rowList.Any()) { db.SetDebugLog(); var tradeCashIds = rowList.Select(x => x.trade_cash.id).ToList(); var tradeContractCodeList = (from tradeContractR in db.trade_contract_r join tradeContractDoc in (from tradeContractDocTemp in db.trade_contract_document where tradeContractDocTemp.Type == ContractTypeEnum.Clearing || tradeContractDocTemp.Type == ContractTypeEnum.UnWind select tradeContractDocTemp) on tradeContractR.ContractCode equals tradeContractDoc.Code into tradeContractDoc1 from tradeContractDoc2 in tradeContractDoc1.DefaultIfEmpty() where tradeCashIds.Contains(tradeContractR.TradeCashId ?? 0) && (tradeContractR.Type == ContractTypeEnum.Clearing || tradeContractR.Type == ContractTypeEnum.UnWind) && tradeContractR.IsValid select new { tradeContractR.TradeCashId, tradeContractR.ContractCode, tradeContractDoc = tradeContractDoc2 }).ToList(); foreach (var trade in rowList) { if (trade.trade.TradeType == "合成价差期权") { trade.trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.trade.UnderlyingCode); } var tradeContractinfo = tradeContractCodeList.FirstOrDefault(t => t.TradeCashId == trade.trade_cash.id); if (tradeContractinfo != null) { trade.ContractCode = tradeContractinfo.ContractCode; if (null != tradeContractinfo.tradeContractDoc) { var sealResult = tradeContractinfo.tradeContractDoc.SealResult; trade.ContractDocUrl = tradeContractinfo.tradeContractDoc.RelativePath; trade.trade_contract_document = tradeContractinfo.tradeContractDoc; trade.SealResult = sealResult != null ? Enum.GetName(typeof(SealResultEnum), sealResult) : ""; trade.SealTime = tradeContractinfo.tradeContractDoc.SealResult == (int)SealResultEnum.成功 ? tradeContractinfo.tradeContractDoc.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""; } } trade.CountRatio = Modules.DataCacheModule.DataCacheManager.GetUnderlyingDataSource().GetData(trade.trade.UnderlyingCode).CountRatio; } } return Json(sList); } /// /// 包括提前确认书和到期结算书 /// public JsonResult EitherEndTradeReportQuery(TradeReq req) { req.OptDateStart = valuedateBLL.ValueDate; req.OptDateEnd = valuedateBLL.ValueDate; if (!string.IsNullOrWhiteSpace(req.TradeStatus)) { req.TradeStatusList = req.TradeStatus.Split(new[] { ',' }).ToList(); } req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new tradeBLL().SearchEitherTradeWithCashList(req, out var gsum); foreach (var r in sList.rows) { if (r.trade.TradeType == "合成价差期权") { r.trade.SyntheticUnderlyingTipsInfo = synthetic_underlyingBLL.GetUnderlyingTipsInfo(r.trade.UnderlyingCode); } } return Json(sList); } /// /// 批量下载结算确认书 /// public async Task BatchDownLoadDoc(DownloadDocReq req) { if (req.docpdf == null) { return ShowError("请选择文档类型!"); } if (string.IsNullOrWhiteSpace(req.docpdf[0])) { return ShowError("请选择文档类型!"); } if (req.TradeDateStart == null) { req.TradeDateStart = DateTime.MinValue; } if (req.TradeDateEnd == null) { req.TradeDateEnd = DateTime.MaxValue; } var db_trade_contract_r = yldb.trade_contract_r.AsQueryable(); var query = from doc in yldb.trade_contract_document join r in db_trade_contract_r on doc.Code equals r.ContractCode where doc.Type == ContractTypeEnum.Trade && doc.ValueDate >= req.TradeDateStart && doc.ValueDate <= req.TradeDateEnd && r.IsValid select new { doc.ClientId, doc.Paths, TradeCashId = r.TradeCashId ?? 0, r.Type, r.TradeId, r.TradeNumber, r.ContractCode, doc.SealResult, doc.StampDocumentFileName, doc.EncryptId, doc.Comments, doc.FileName }; var isSelect = false; if (req.TradeIds != null && req.TradeIds.Any(O => O != 0)) { isSelect = true; query = query.Where(O => req.TradeIds.Contains(O.TradeId)); } if (req.TradeCashIds != null && req.TradeCashIds.Any(O => O != 0)) { isSelect = true; query = query.Where(O => req.TradeCashIds.Contains(O.TradeCashId)); } if (req.ContractCodes != null && req.ContractCodes.Any(O => !string.IsNullOrWhiteSpace(O))) { isSelect = true; query = query.Where(O => req.ContractCodes.Contains(O.ContractCode)); } if (req.DocType != null) { query = query.Where(O => O.Type == req.DocType); } if (!isSelect && !req.TradeNumber.IsNullOrWhiteSpace()) { query = query.Where(O => O.TradeNumber == req.TradeNumber); } if (!isSelect && !req.ContractCode.IsNullOrWhiteSpace()) { query = query.Where(O => O.ContractCode == req.ContractCode); } if (!isSelect && req.ClientIds != null && req.ClientIds.Any(O => O != 0)) { query = query.Where(O => req.ClientIds.Contains(O.ClientId ?? 0)); } if (req.SealResults != null && req.SealResults.Count > 0) { if (req.SealResults.Contains(2)) { query = query.Where(t => req.SealResults.Contains((int)t.SealResult) || t.SealResult == null); } else { query = query.Where(t => req.SealResults.Contains((int)t.SealResult)); } } var datas = query.ToList(); if (datas.Count == 0) { return ShowError("未找到确认书文件,请确认筛选条件是否有效!"); } datas = datas.DistinctBy(O => O.ContractCode).ToList(); var filePathList = new List(datas.Count * req.docpdf.Count()); var contractBLL = new TradeContractBLL(CurUser); var comfirmService = new ConfirmationGenerateService(OptUserInfo.SystemUser); foreach (var item in datas) { var path = item.Paths; foreach (var type in req.docpdf) { var doc = contractBLL.GetContractDoc(item.TradeId, item.Type, item.TradeCashId); if (type == "PDF" && req.IsSeal) { if (string.IsNullOrWhiteSpace(item.StampDocumentFileName)) { if (PS.GetErpConfig().IsAutoSealAndUploadFiles && PS.GetErpConfig().IsAutoSealAfterGeneratedBook) { var (flag, result, fileBytesStr) = await GlobalConfig.SealHandler.UploadApiAsync(doc, PS.GetErpConfig().SealKeyWord); if (!flag) { _logger.Error($"交易编号:{item.TradeId}用印失败:{result}"); GlobalConfig.SealHandler.SaveTradeAuditLog(item.TradeId, result, "用印失败", DateTime.Now); //SaveTradeAuditLog("", DateTime.Now.ToString("yyyy-MM-dd hh:MM:ss"), "失败", excelFileName, msg); GlobalConfig.SealHandler.UpdateTradeContractDocument(doc, (int)SealResultEnum.失败, result); return ShowError($"交易编号:{item.TradeNumber}用印失败,请重新操作!"); } else { //上传 var ms = new MemoryStream(); if (!string.IsNullOrWhiteSpace(fileBytesStr)) { var fileBytes = Convert.FromBase64String(fileBytesStr); ms.Write(fileBytes, 0, fileBytes.Length); } var (flag2, msg, optDate, stampPath) = comfirmService.UploadContractFile(item.EncryptId, item.Comments, item.ContractCode, true, false, new UploadFileModel { Length = ms.Length, ContentType = "application/pdf", FileName = item.FileName, OpenReadStream = () => ms }); if (flag2) { _logger.Info($"交易编号:{item.TradeId}用印文件上传成功"); GlobalConfig.SealHandler.SaveTradeAuditLog(item.TradeId, result, "用印成功", optDate); GlobalConfig.SealHandler.UpdateTradeContractDocument(doc, (int)SealResultEnum.成功, result); path = stampPath; } else { _logger.Error($"交易编号:{item.TradeId}用印文件上传失败:{msg}"); GlobalConfig.SealHandler.SaveTradeAuditLog(item.TradeId, result, "用印失败", optDate); GlobalConfig.SealHandler.UpdateTradeContractDocument(doc, (int)SealResultEnum.失败, msg); return ShowError($"交易编号:{item.TradeNumber}用印失败,请重新操作![错误信息:{msg}]"); } } } else { return ShowError("存在未用印的文件,用印后再下载文件!"); } } else { path = item.StampDocumentFileName; } } var fName = GetFileName(type == "PDF" ? path : item.Paths, type.ToLower()); if (string.IsNullOrEmpty(fName)) { fName = GetFileName(type == "PDF" ? path : item.Paths, ".xls"); } if (!string.IsNullOrEmpty(fName)) { filePathList.Add(fName); } } } if (filePathList.Count == 0) { return ShowError("未找到确认书文件,请确认确认书已成功生成!"); } var fileName = $"确认书文件{DateTime.Now:yyyyMMddHHmmss}.zip"; ZipHelper.zipFiles(filePathList.Distinct().ToArray(), filePathList[0], out var buffer); return File(buffer, "application/zip", fileName); } private string GetFileName(string baseName, string sufferFix) { var fName = Path.ChangeExtension(baseName, sufferFix); if (!string.IsNullOrWhiteSpace(fName) && (fName[0] != '/' || fName[0] != '\\')) { fName = fName.Insert(0, "/"); } fName = OtcAppContext.MapPath(fName); if (!System.IO.File.Exists(fName)) { fName += "x"; }//解决数据库中存的后缀名是doc但实际文件是docx的问题; if (System.IO.File.Exists(fName)) { return fName; } else { return null; } } [MyAuthorize("交易管理-到期修改")] public ActionResult EditMaturityDate(string enid) { if (enid.IsNullOrWhiteSpace()) { return JsonError("请输入参数enid"); } var intid = DataProtectHelper.DecryptInt(enid); var td = db.trade.Find(intid); if (td == null || td.ValidState == ConsGlobal.InValid) { return JsonError("系统中没有相关的交易"); } if (!td.CanEditMaturityDate()) { return JsonError("该交易不能执行到期修改操作"); } if (td.TradeStatus != ConsTrade.已到期 && td.TradeStatus != ConsTrade.已执行) { return JsonError("只有状态为已到期或已执行的交易可以完成此操作"); } new TradeBackService(CurUser).Execute(intid, true, TradeBackActionEnum.EditMaturityDate); return JsonSuccess("到期修改成功"); } [MyAuthorize("交易管理-交易平仓")] public ActionResult TerminationBackToConfirmed(string enid) { if (enid.IsNullOrWhiteSpace()) { return JsonError("请输入参数enid"); } var tradeId = DataProtectHelper.DecryptInt(enid); new TradeConfirmService(CurUser).TerminationBackToConfirmed(tradeId); return JsonSuccess("提前终止放弃成功"); } [MyAuthorize("结算管理-交易明细")] public ActionResult TradeDetails(TradeDetailsViewModel model) { var valueDate = valuedateBLL.ValueDate; if (model == null) { model = new TradeDetailsViewModel(); } model.ValueDate = valueDate.ToString("yyyy-MM-dd"); if (string.IsNullOrWhiteSpace(model.EndDate)) { model.EndDate = model.ValueDate; } if (string.IsNullOrWhiteSpace(model.DetailStatus)) { model.DetailStatus = "成交"; } if (model.TradeTypes == null) { model.TradeTypes = Array.Empty(); } model.CCEmail = DBCacheManager.Single.GetStr(CacheTable.CCEmail) ?? string.Empty; return View(model); } [MyAuthorize("结算管理-交易明细")] public ActionResult QueryTradeDetails(TradeDetailsReq req) { if (ConsUserGroup.HasGroup && !ShowAllTrades) { req.UserAssetUnits = GetUserAssetunitIds(); } var resultList = new TradeDetailsQueryService(CurUser).SearchTradeDetails(req); return Json(resultList); } [MyAuthorize("结算管理-交易明细")] public ActionResult QueryGroupTradeDetails(TradeDetailsReq req) { req.rows = 100000; req.page = 1; var resultList = new TradeDetailsQueryService(CurUser).SearchTradeDetails(req, req.GroupTradeId).rows; return Json(resultList); } [MyAuthorize("结算管理-互换明细")] public ActionResult TradeDetailsSwap(TradeDetailsViewModel model) { var valueDate = valuedateBLL.ValueDate; if (model == null) { model = new TradeDetailsViewModel(); } model.ValueDate = valueDate.ToString("yyyy-MM-dd"); if (string.IsNullOrWhiteSpace(model.EndDate)) { model.EndDate = model.ValueDate; } if (string.IsNullOrWhiteSpace(model.DetailStatus)) { model.DetailStatus = "成交"; } if (model.TradeTypes == null) { model.TradeTypes = Array.Empty(); } model.CCEmail = DBCacheManager.Single.GetStr(CacheTable.SwapCCEmail) ?? string.Empty; return View(model); } [MyAuthorize("结算管理-互换明细")] public ActionResult QueryTradeDetailsSwap(TradeDetailsReq req) { if (ConsUserGroup.HasGroup && !ShowAllTrades) { req.UserAssetUnits = GetUserAssetunitIds(); } var resultList = new TradeSwapDetailsQueryService(CurUser).SearchFlowMoreDetails(req); return Json(resultList); } #region 读删获取交易明细报告模板 public static List GetAllTradeDetailTemplate() { var names = DBCacheManager.Single.GetTemplateNames("交易明细"); return names.Select(o => new SelectListItem { Text = o, Value = o }).ToList(); } public JsonResult GetTradeDetailTemplate(string template = "默认") { var data = new { CCEmail = DBCacheManager.Single.GetStr(CacheTable.CCEmail, template), TradeDetailsBiaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoTou, template), TradeDetailsBiaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoWei, template), TradeDetailsLuoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsLuoKuan, template), TradeDetailsSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsSendUser, template), TradeDetailsNeedAppendix = DBCacheManager.Single.GetStr(CacheTable.TradeDerailsNeedAppendix, template) }; return Json(data); } public JsonResult removeTemplate(string template) { DBCacheManager.Single.RemoveTemplate("交易明细", template); return JsonSuccess("删除成功"); } public ActionResult ChooseReportTemplate(int clientId = 0, bool isMail = true, bool isSwap = false) { ViewBag.isSwap = isSwap; if (!isMail) { return View(); } var ret = getClientDutys(new List() { clientId }); return View(ret); } public JsonResult GetContractTypes(List clientIds) { var ret = getClientDutys(clientIds); return Json(ret); } public List getClientDutys(List clientIds) { var clientContacts = clientDB.clientduty.Where(x => x.ApprovalOrder < 1 && x.IsReceiveEmail.HasValue && x.IsReceiveEmail == 1).ToList(); if (clientIds != null && clientIds.Count() > 0) { clientContacts = clientContacts.Where(o => clientIds.Contains(o.ClientId ?? 0)).ToList(); } var dutyIds = new List(); var duty = new Dictionary(); var contantType = clientDB.contactype.ToList(); foreach (var item in clientContacts) { if (!string.IsNullOrWhiteSpace(item.ContactTypeId)) { var ids = item.ContactTypeId.Split(',').Select(o => int.Parse(o)); dutyIds.AddRange(ids); } } dutyIds = dutyIds.Distinct().ToList(); foreach (var id in dutyIds) { var type = contantType.FirstOrDefault(s => s.id == id).ContactType; duty.Add(id, type); } var ret = duty.Select(o => new SelectListItem { Text = o.Value, Value = o.Key.ToString() }).ToList(); return ret; } #endregion #region 读删获取互换明细报告模板 public static List GetAllTradeSwapDetailTemplate() { var names = DBCacheManager.Single.GetTemplateNames("互换明细"); return names.Select(o => new SelectListItem { Text = o, Value = o }).ToList(); } public JsonResult GetTradeSwapDetailTemplate(string template = "默认") { var data = new { CCEmail = DBCacheManager.Single.GetStr(CacheTable.SwapCCEmail, template), TradeDetailsBiaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoTou, template), TradeDetailsBiaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoWei, template), TradeDetailsLuoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsLuoKuan, template), TradeDetailsSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsSendUser, template), TradeDetailsNeedAppendix = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDerailsNeedAppendix, template) }; return Json(data); } public JsonResult removeSwapTemplate(string template) { DBCacheManager.Single.RemoveTemplate("互换明细", template); return JsonSuccess("删除成功"); } #endregion //[ValidateInput(false)] [MyAuthorize("结算管理-交易明细")] public JsonResult SaveTradeDetailDesc(string biaoTou, string biaoWei, string luoKuan, string ccemail, string sendUser, string appendixType, string template = "默认") { SaveDescCache(CacheTable.TradeDetailsBiaoTou, biaoTou, template); SaveDescCache(CacheTable.TradeDetailsBiaoWei, biaoWei, template); SaveDescCache(CacheTable.TradeDetailsLuoKuan, luoKuan, template); SaveDescCache(CacheTable.TradeDetailsSendUser, sendUser, template); SaveDescCache(CacheTable.TradeDerailsNeedAppendix, appendixType, template); if (!string.IsNullOrWhiteSpace(ccemail) && !Regex.IsMatch(ccemail, "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$")) { return JsonError("邮件CC地址 保存失败! 邮件地址必须符合正确格式!"); } else { SaveDescCache(CacheTable.CCEmail, ccemail, template); return JsonSuccess("保存交易详细说明成功"); } } //[ValidateInput(false)] [MyAuthorize("结算管理-互换明细")] public JsonResult SaveTradeSwapDetailDesc(string biaoTou, string biaoWei, string luoKuan, string ccemail, string sendUser, string appendixType, string template = "默认") { SaveDescCache(CacheTable.TradeSwapDetailsBiaoTou, biaoTou, template); SaveDescCache(CacheTable.TradeSwapDetailsBiaoWei, biaoWei, template); SaveDescCache(CacheTable.TradeSwapDetailsLuoKuan, luoKuan, template); SaveDescCache(CacheTable.TradeSwapDetailsSendUser, sendUser, template); SaveDescCache(CacheTable.TradeSwapDerailsNeedAppendix, appendixType, template); if (!string.IsNullOrWhiteSpace(ccemail) && !Regex.IsMatch(ccemail, "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$")) { return JsonError("邮件CC地址 保存失败! 邮件地址必须符合正确格式!"); } else { SaveDescCache(CacheTable.SwapCCEmail, ccemail, template); return JsonSuccess("保存交易详细说明成功"); } } private void SaveDescCache(string key, string content, string template = "默认") { if (!DBCacheManager.Single.IsSet(key)) { DBCacheManager.Single.Set(key, content, 1000000000); return; } DBCacheManager.Single.UpdateObj(key, content, template); } [MyAuthorize("结算管理-交易明细")] public ViewResult TradeDetailsDescSet() { ViewBag.BiaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoTou); ViewBag.BiaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoWei); ViewBag.LuoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsLuoKuan); ViewBag.CCEmail = DBCacheManager.Single.GetStr(CacheTable.CCEmail); ViewBag.TradeDetailsSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsSendUser); return View(); } [MyAuthorize("结算管理-互换明细")] public ViewResult TradeSwapDetailsDescSet() { ViewBag.BiaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoTou); ViewBag.BiaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoWei); ViewBag.LuoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsLuoKuan); ViewBag.CCEmail = DBCacheManager.Single.GetStr(CacheTable.SwapCCEmail); ViewBag.TradeDetailsSendUser = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsSendUser); return View(); } [MyAuthorize("风险控制-实时持仓风险")] public ViewResult realtimePositionRisks() { return View(); } [MyAuthorize("风险控制-实时持仓风险")] public JsonResult realtimePositionRisksQuery(RealTimePositionRisksReq req) { req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var result = new RealtimePositionRisksQueryService(CurUser).SearchList(req); return Json(result); } /// /// 实时持仓风险导出 /// [MyAuthorize("风险控制-实时持仓风险")] public ActionResult DownloadRealTimePositionRisks(RealTimePositionRisksReq req) { try { req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); var bytes = new RealtimePositionRisksQueryService(CurUser).ExportRealtimePositionRisksToExcel(req); return File(bytes, xlsxMimeType, $"实时-{valuedateBLL.ValueDate:yyyy-MM-dd}.xlsx"); } catch (Exception e) { return ShowError("导出失败" + e.Message); } } [MyAuthorize("风险控制-日终持仓风险")] public ViewResult EodPositionRisks() { ViewBag.lastDate_eod = EodOperationBase.GetLastSettlementDate(valuedateBLL.ValueDate); ViewBag.lastDate_settle = EodOperationBase.GetLastSettlementDate_Settle(); return View(); } [MyAuthorize("风险控制-日终持仓风险")] public JsonResult EodPositionRisksQuery(EodPositionRisksReq req) { req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); if (CurUser.交易管理_查看所有交易) { req.UserClients.Clear(); } var result = new EodPositionRisksQueryService(CurUser).SearchList(req); return Json(result); } public object ExportEodRiskReport(DateTime exportDate, double todayHedgeCashInOut = 0) { try { var req = new EodPositionRisksReq { page = 0, rows = 10000, ValueDate = exportDate, IsOnlyExport = true, VolType = "持仓", EodSettlePriceMode = "收盘价", needSettleData = true }; req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList(); var bytes = new EodPositionRisksQueryService(CurUser).ExportEodRiskReport(req, todayHedgeCashInOut); return File(bytes, xlsxMimeType, $"场外风控结算单-{req.ValueDate:yyyy-MM-dd}.xlsx"); } catch (Exception e) { return ShowError("导出失败" + e.Message); } } /// /// 场外成交记录-导出奇异要素 /// public object DownloadTradeQueryMultiFactors(TradeReq req, string VolType) { req.AssetIdList = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.AssetIdList).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var bytes = new OtcTradeListExportService(CurUser).ExportOptionTradeListToExcel(req, new TradeQueryRequest { ShowAllTrades = ShowAllTrades, UserAssetUnits = ShowAllTrades ? null : GetUserAssetunitIds(), VolType = VolType }, CurUser.HasRight("交易管理-交易标签查看权限")); var fileName = $"场外期权成交记录-{DateTime.Now:yyyy-MM-dd}.xlsx"; if (PS.Config.Company == Configuration.CompanyEnum.海通) { //成交 if ((req.TradeDateStart != DateTime.MinValue || req.TradeDateEnd != DateTime.MinValue) && req.ExerciseDateStart == null && req.ExerciseDateEnd == null && req.UnWindDateStart == null && req.UnWindDateEnd == null) { fileName = $"成交_{(req.TradeDateStart != DateTime.MinValue ? req.TradeDateStart.ToString("yyyy-MM-dd") : "")}_{(req.TradeDateEnd != DateTime.MinValue ? req.TradeDateEnd.ToString("yyyy-MM-dd") : "")}.xlsx"; } //到期 else if (req.TradeDateStart == DateTime.MinValue && req.TradeDateEnd == DateTime.MinValue && (req.ExerciseDateStart != null || req.ExerciseDateEnd != null) && req.UnWindDateStart == null && req.UnWindDateEnd == null) { fileName = $"到期_{(req.ExerciseDateStart != null ? req.ExerciseDateStart.Value.ToString("yyyy-MM-dd") : "")}_{(req.ExerciseDateEnd != null ? req.ExerciseDateEnd.Value.ToString("yyyy-MM-dd") : "")}.xlsx"; } //了结 else if (req.TradeDateStart == DateTime.MinValue && req.TradeDateEnd == DateTime.MinValue && req.ExerciseDateStart == null && req.ExerciseDateEnd == null && (req.UnWindDateStart != null || req.UnWindDateEnd != null)) { fileName = $"了结_{(req.UnWindDateStart != null ? req.UnWindDateStart.Value.ToString("yyyy-MM-dd") : "")}_{(req.UnWindDateEnd != null ? req.UnWindDateEnd.Value.ToString("yyyy-MM-dd") : "")}.xlsx"; } } return File(bytes, xlsxMimeType, fileName); } /// /// 日终持仓风险导出 /// public ActionResult DownloadEodPositionRisks(EodPositionRisksReq req) { try { req.BookIds = AssetUnitModel.IntersectAssetUnits(req.AssetIdGroupList, req.BookIds).ToList(); req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); if (CurUser.交易管理_查看所有交易) { req.UserClients.Clear(); } var bytes = new EodPositionRisksQueryService(CurUser).ExportEodPositionRisksToExcel(req); return File(bytes, xlsxMimeType, $"日终-{req.ValueDate:yyyy-MM-dd}.xlsx"); } catch (Exception e) { return ShowError("导出失败" + e.Message); } } public JsonResult BatchDownloadEodPositionRisks(EodPositionRisksReq req) { if (!new EodPositionRisksQueryService(CurUser).BatchDownloadEodPositionRisks(req)) { return JsonError("线程正在被占用"); } return JsonSuccess("开始生成文件"); } public ActionResult EodPositionRiskExport(EodPositionRisksReq req, string processName) { switch (processName) { case "ExportEodPositionRisks": ViewBag.Title = "日终持仓风险"; ViewBag.Url = "/trade/BatchDownloadEodPositionRisks"; break; case "ExportEodPositionRisksSwap": ViewBag.Title = "日终持仓风险_互换"; ViewBag.Url = "/swaptrade/BatchDownloadEodPositionRisks"; break; default: return ShowError("未查找到需要的页面"); } ViewBag.ProcessName = processName; return View(req); } [MyAuthorize("结算管理-交易明细")] public JsonResult ExportTradeDetails(TradeDetailsReq req, string template = "默认") { var biaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoTou, template); var biaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoWei, template); var reportFilePath = new TradeDetailsQueryService(CurUser).ExportReport(req, biaoTou, biaoWei); var appDocsPath = OtcAppContext.AppDocsPath; List docUrl = new List(); foreach (var item in reportFilePath) { docUrl.Add($"/App_Docs{item.Replace(appDocsPath, "").Replace(appDocsPath, "").Replace("\\", "/")}"); } return JsonSuccess("导出交易明细成功", docUrl); } [MyAuthorize("结算管理-交易明细")] public async Task SendTradeDetailsReport(TradeDetailsReq req, string template = "默认", List receiver = null, List attachFiles = null, bool skip = false) { var client = DataCacheProvider.GetClientDataSource().GetData(req.ClientId != 0 ? req.ClientId : req.ClientIdsInt[0]); if (client == null) { throw new ServiceException("系统中没有此客户,clientId:" + req.ClientId); } var path = Server.MapPath("~/Statics/views/TradeDetailsListMail.cshtml"); if (req.StartDate == null) { req.StartDate = DateTime.MinValue; } if (req.EndDate == null) { req.EndDate = DateTime.Now; } if (req.ClientIdsInt.Count > 1) { return JsonError("发送邮件不支持客户多选!"); } else if (req.ClientIdsInt.Count == 1) { req.ClientId = req.ClientIdsInt.FirstOrDefault(); } var UseSingerBook = (client.SupProtocolDate != null && client.SupProtocolDate <= req.StartDate); if (UseSingerBook) { path = Server.MapPath("~/Statics/views/TradeDetailsListMailV2.cshtml"); } return await SendReportMails(req, CurUser, template, path, receiver, attachFiles, skip); } [MyAuthorize("结算管理-互换明细")] public JsonResult ExportTradeSwapDetails(TradeDetailsReq req, string template = "默认") { var biaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoTou, template); var biaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoWei, template); var reportFilePath = new TradeSwapDetailsQueryService(CurUser).ExportReport(req, biaoTou, biaoWei); var appDocsPath = OtcAppContext.AppDocsPath; var docUrl = $"/App_Docs{reportFilePath.Replace(appDocsPath, "").Replace(appDocsPath, "").Replace("\\", "/")}"; return JsonSuccess("导出交易明细成功", docUrl); } [MyAuthorize("结算管理-互换明细")] public JsonResult SendTradeSwapDetailsReport(TradeDetailsReq req, string template = "默认", List receiver = null, bool skip = false) { var client = DataCacheProvider.GetClientDataSource().GetData(req.ClientId != 0 ? req.ClientId : req.ClientIdsInt[0]); if (client == null) { throw new ServiceException("系统中没有此客户,clientId:" + req.ClientId); } var path = Server.MapPath("~/Statics/views/TradeSwapDetailsListMail.cshtml"); if (req.StartDate == null) { req.StartDate = DateTime.MinValue; } if (req.EndDate == null) { req.EndDate = DateTime.Now; } if (req.ClientIdsInt.Count > 1) { return JsonError("发送邮件不支持客户多选!"); } else if (req.ClientIdsInt.Count == 1) { req.ClientId = req.ClientIdsInt.FirstOrDefault(); } return SendSwapReportMails(req, template, path, receiver, skip); } public async Task SendReportMails(TradeDetailsReq req, OptUserInfo user, string mailTemplateName, string tradeListHtmlViewPath, List receiver = null, List attachFiles = null, bool skip = false) { var biaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoTou, mailTemplateName); var biaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsBiaoWei, mailTemplateName); var luoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeDetailsLuoKuan, mailTemplateName); var tradeDetailsService = new TradeDetailsQueryService(user); var reportFilePath = tradeDetailsService.ExportReport(req, biaoTou, biaoWei); var report = tradeDetailsService.TradeDetailsReport; string html; var cacheResult = Server.RazorEngine.Handler.Cache.RetrieveTemplate("交易明细"); if (cacheResult.Success) { var templatePage = cacheResult.Template.TemplatePageFactory(); html = await Server.RazorEngine.RenderTemplateAsync(templatePage, report); } else { using (var reader = new StreamReader(tradeListHtmlViewPath)) { var templateContent = reader.ReadToEnd(); html = await Server.RazorEngine.CompileRenderStringAsync("交易明细", templateContent, report); } } var clientName = $"{report.ClientName} :

"; //当是招证时,发送交易明细发送邮件时,正文添加“请确认”3字 if (PS.Config.Is招证) { clientName += "

请确认



"; } luoKuan = clientName + biaoTou + html + biaoWei + luoKuan; try { var result = tradeDetailsService.SendTradeDetailReport(req, report, luoKuan, reportFilePath, mailTemplateName, receiver, attachFiles, skip); switch (result.ResultType) { case EmailTradeConfirmResultType.Succeed: return JsonSuccess("发送交易明细报告成功"); case EmailTradeConfirmResultType.NoEmailSetting: return JsonError("未设置邮箱,无法发送"); case EmailTradeConfirmResultType.EmailSentFailed: return JsonError("发送邮件失败:" + result.ErrorMsg); case EmailTradeConfirmResultType.Other: default: return JsonError("发送邮件未知错误"); } } catch (Exception e) { if (e.Message.Contains("确认书")) { return JsonSuccess(e.Message, true); } throw; } } public JsonResult SendSwapReportMails(TradeDetailsReq req, string mailTemplateName, string tradeListHtmlViewPath, List receiver = null, bool skip = false) { var biaoTou = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoTou, mailTemplateName); var biaoWei = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsBiaoWei, mailTemplateName); var luoKuan = DBCacheManager.Single.GetStr(CacheTable.TradeSwapDetailsLuoKuan, mailTemplateName); var tradeDetailsService = new TradeSwapDetailsQueryService(CurUser); var reportFilePath = tradeDetailsService.ExportReport(req, biaoTou, biaoWei); var report = tradeDetailsService.TradeSwapDetailsReport; using var reader = new StreamReader(tradeListHtmlViewPath); var templateContent = reader.ReadToEnd(); IRazorEngine razorEngine = new RazorEngine(); IRazorEngineCompiledTemplate template = razorEngine.Compile(templateContent); var html = template.Run(report); //if (!Engine.Razor.IsTemplateCached("互换明细", typeof(TradeSwapDetailsReport))) //{ // using (var reader = new StreamReader(tradeListHtmlViewPath)) // { // var templateContent = reader.ReadToEnd(); // Engine.Razor.Compile(templateContent, "互换明细", typeof(TradeSwapDetailsReport)); // } //} //var html = Engine.Razor.Run("互换明细", typeof(TradeSwapDetailsReport), report); var clientName = $"{report.ClientName} :

"; luoKuan = clientName + biaoTou + html + biaoWei + luoKuan; try { var result = tradeDetailsService.SendTradeDetailReport(req, report, luoKuan, reportFilePath, mailTemplateName, receiver, skip); switch (result.ResultType) { case EmailTradeConfirmResultType.Succeed: return JsonSuccess("发送交易明细报告成功"); case EmailTradeConfirmResultType.NoEmailSetting: return JsonError("未设置邮箱,无法发送"); case EmailTradeConfirmResultType.EmailSentFailed: return JsonError("发送邮件失败:" + result.ErrorMsg); case EmailTradeConfirmResultType.Other: default: return JsonError("发送邮件未知错误"); } } catch (Exception e) { if (e.Message.Contains("确认书")) { return JsonSuccess(e.Message, true); } throw; } } [MyAuthorize("风险控制-自定义限额规则")] public ActionResult tradeConfirmRuleList() { return View(); } [MyAuthorize("风险控制-自定义限额规则")] public ActionResult tradeConfirmRuleEdit(string enid) { if (string.IsNullOrEmpty(enid)) { return View(new trade_confirm_rule()); } var intid = DataProtectHelper.DecryptInt(enid); var record = db.trade_confirm_rule.Find(intid); return View(record); } /// /// 保存交易确认规则 /// [HttpPost] public JsonResult tradeConfirmRuleEditJson(trade_confirm_rule req) { var record = new TradeConfirmRuleService(CurUser).saveTradeConfirmRule(req, CurUser.UserId, CurUser.UserName); if (record == null) { return JsonError("交易确认规则名称重复,保存失败"); } return Json(record); } public JsonResult deleteTradeConfirmRule(string enid) { if (string.IsNullOrEmpty(enid)) { return JsonError("请选择要删除的交易确认规则"); } var intid = DataProtectHelper.DecryptInt(enid); var record = db.trade_confirm_rule.Find(intid); db.trade_confirm_rule.Remove(record); db.SaveChanges(); return JsonSuccess("删除成功"); } /// /// 获取交易确认规则列表页 /// [HttpPost] public JsonResult tradeTradeConfirmRuleQuery(trade_confirm_ruleReq req) { var sList = new TradeConfirmRuleService(CurUser).SearchTradeConfirmRuleList(req); return Json(sList); } /// /// 终止简讯生成 /// public JsonResult TradeterminationAbstract(trade_cash tc, trade td, bool isUnwind) { if (td == null) { return JsonError("信息不存在, 无法生成交易摘要"); } new TradeExtendService(CurUser).SetTradeExtend(new[] { td }); var list = TradeTerminationAbstractService.GetAbstractInfoText(tc, td, isUnwind); return Json(list); } public JsonResult GetTradeOfDate(int TradeId, DateTime ValueDate) { var trade = new TradeDalService(CurUser).GetTradeOrEodTrade(new[] { TradeId }, ValueDate).FirstOrDefault(); if (trade.TradeOriginalAmount == null) { var um = underlying_managerBLL.GetByCode(trade.UnderlyingCode); trade.TradeOriginalAmount = trade.OriginalNotional / um.CountRatio; } return JsonSuccess("", trade); } [MyAuthorize("交易管理-批量波动率导入")] public ActionResult tradeVolUpload() { return View(); } [MyAuthorize("交易管理-批量对冲波动率导入")] public ActionResult tradeHedgeVolUpload() { return View(); } [MyAuthorize("交易管理-批量波动率导入")] public ActionResult UploadTradeVolExcel(IFormFile file) { try { using var stream = file.OpenReadStream(); var ds = Office.ExcelHelper.ReadExcelAsDataSet(stream, new[] { 0 }, 0); if (ds.Tables.Count < 1 || ds.Tables[0].Rows.Count < 2) { throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" }; } var table = ds.Tables[0]; var reader = new DataRowReader(table, 0); var message = string.Empty; foreach (var row in table.Rows.Cast().Skip(1)) { if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString()))) { continue; } reader.SetDataRow(row); var tradeNumber = reader.GetString("交易编号", true); var trade = db.trade.FirstOrDefault(x => x.TradeNumber == tradeNumber); if (trade == null) { return JsonError("交易编号" + tradeNumber + "不存在,导入失败"); } var valueDate = reader.GetDate("持仓日期", true).Value; var smoothingDays = reader.GetInt("平滑过渡天数", false) ?? 1; var remianDays = QdpCalendarHelper.GetNonHolidayDaysBetween(valueDate, trade.ExerciseDate.Value) + 1; if (smoothingDays > remianDays) { message += $"交易[{tradeNumber}]平滑过渡天数{smoothingDays}不能大于存续天数{remianDays}天;"; } var model = new TradeVolatility { TradeId = trade.id, ValueDate = valueDate, TradePositionVolatility = reader.GetPercent("持仓波动率", true).Value, TradeCloseVolatility = reader.GetPercent("目标波动率", false) ?? reader.GetPercent("持仓波动率", true).Value, NumOfSmoothingDays = smoothingDays, OptId = UserId, OptDate = DateTime.Now, OptName = UserName, IsFromTradeAdd = false }; var dbModel = db.TradeVolatility.FirstOrDefault(x => x.ValueDate == model.ValueDate && x.TradeId == model.TradeId); if (dbModel == null) { db.TradeVolatility.Add(model); } else { dbModel.TradePositionVolatility = model.TradePositionVolatility; dbModel.TradeCloseVolatility = model.TradeCloseVolatility; dbModel.NumOfSmoothingDays = model.NumOfSmoothingDays; dbModel.OptId = model.OptId; dbModel.OptName = model.OptName; dbModel.OptDate = model.OptDate; dbModel.IsFromTradeAdd = model.IsFromTradeAdd; } } if (!string.IsNullOrEmpty(message)) { throw new ServiceException(message); } db.SaveChanges(); } catch (Exception ex) { LogFactory.GetLogger().Error("UploadTradeVolExcel", ex); return JsonError(ex.Message); } return JsonSuccess("导入波动率成功"); } [MyAuthorize("交易管理-批量对冲波动率导入")] public ActionResult UploadTradeHedgeVolExcel(IFormFile file) { try { using var stream = file.OpenReadStream(); var ds = Office.ExcelHelper.ReadExcelAsDataSet(stream, new[] { 0 }, 1); if (ds.Tables.Count < 1) { throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" }; } var table = ds.Tables[0]; var reader = new DataRowReader(table, 0); var message = string.Empty; table.DefaultView.Sort = "持仓日期 ASC"; table = table.DefaultView.ToTable(); foreach (DataRow row in table.Rows) { var tradeNumber = row["交易编号"]?.ToString()?.Trim(); if (string.IsNullOrEmpty(tradeNumber)) { throw new ServiceException($"交易编号 必须填写"); } var trade = db.trade.FirstOrDefault(x => x.TradeNumber == tradeNumber); if (trade == null) { return JsonError("交易编号【" + tradeNumber + "】不存在,导入失败"); } if (trade.TradeType == "远期") { return JsonError("交易【" + tradeNumber + "】是远期交易,无对冲波动率"); } if (trade.TradeType == "收益互换") { return JsonError("交易【" + tradeNumber + "】是收益互换,无对冲波动率"); } if (trade.IsGroup == 1) { //黑箱 return JsonError("交易【" + tradeNumber + "】是黑箱交易父交易编号,请填写相关子交易的交易编号导入对冲波动率"); } var valueTime = row["持仓日期"]?.ToString()?.Trim(); if (string.IsNullOrEmpty(valueTime)) { throw new ServiceException($"持仓日期 必须填写"); } if (!DateTime.TryParse(valueTime, out var valueDate)) { throw new ServiceException($"持仓日期 填写错误"); } if (valueDate < trade.StartDate) { return JsonError($"交易【{tradeNumber}】,持仓日期:{valueDate.ToString("yyyy-MM-dd")}必须大于等于交易成交日期:{trade.StartDate?.ToString("yyyy-MM-dd")}"); } if (valueDate > trade.ExerciseDate) { return JsonError($"交易【{tradeNumber}】,持仓日期:{valueDate.ToString("yyyy-MM-dd")}必须小于等于交易到期日期:{trade.ExerciseDate?.ToString("yyyy-MM-dd")}"); } var tSavedVol = row["对冲波动率"]?.ToString()?.Trim(); if (!double.TryParse(tSavedVol, out var tSavedVolNum)) { throw new ServiceException($"对冲波动率 填写错误"); } var tradeHedgeVodList = db.trade_hedge_vol.Where(o => o.TradeId == trade.id).ToList(); var tradeHedgeVod = tradeHedgeVodList.FirstOrDefault(o => o.ValueDate == valueDate); if (tradeHedgeVod != null) { if (tSavedVol != null) { tradeHedgeVod.TradeSavedVol = tSavedVolNum; tradeHedgeVod.OptName = UserName; tradeHedgeVod.OptId = UserId; tradeHedgeVod.OptDate = DateTime.Now; } } else { if (tSavedVol != null) { tradeHedgeVod = new trade_hedge_vol { TradeId = trade.id, ValueDate = valueDate, TradeSavedVol = tSavedVolNum, OptName = UserName, OptId = UserId, OptDate = DateTime.Now }; db.trade_hedge_vol.Add(tradeHedgeVod); } } if (tradeHedgeVodList.Count(n => n.ValueDate > valueDate) == 0) { trade.TradeSavedVol = tSavedVolNum; } } if (!string.IsNullOrEmpty(message)) { throw new ServiceException(message); } db.SaveChanges(); } catch (Exception ex) { LogFactory.GetLogger().Error("UploadTradeHedgeVolExcel", ex); return JsonError(ex.Message); } return JsonSuccess("导入对冲波动率成功"); } public ActionResult tradeDividendRateAndNoRiskRate() { return View(); } /// /// 导入无风险利率和分红率 /// /// /// public ActionResult UploadDividendRateAndNoRiskRateExcel(IFormFile file) { try { using var stream = file.OpenReadStream(); var ds = Office.ExcelHelper.ReadExcelAsDataSet(stream, new[] { 0 }, 0); if (ds.Tables.Count < 1 || ds.Tables[0].Rows.Count < 2) { throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" }; } var table = ds.Tables[0]; var reader = new DataRowReader(table, 0); var message = string.Empty; foreach (var row in table.Rows.Cast().Skip(1)) { if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString()))) { continue; } reader.SetDataRow(row); var tradeNumber = reader.GetString("交易编号", true); var trade = db.trade.FirstOrDefault(x => x.TradeNumber == tradeNumber); if (trade == null) { message += $"交易编号" + tradeNumber + "不存在,导入失败"; continue; } var valueDate = reader.GetDate("日期", true).Value; var valueType = reader.GetString("类型", true); var valueTypeStr = ""; var value = reader.GetPercent("值", true).Value; switch (valueType) { case "无风险利率": valueTypeStr = "NoRiskRate"; trade.NoRiskRate = value; break; case "分红率": valueTypeStr = "DividendRate"; trade.DividendRate = value; break; default: throw new ServiceException("不支持" + valueType + "类型"); } var dbModel = db.TradeHisData.FirstOrDefault(v => v.TradeId == trade.id && v.ValueDate == valueDate && v.ValueType == valueTypeStr); if (dbModel == null) { dbModel = new TradeHisData { TradeId = trade.id, ValueDate = valueDate, ValueType = valueTypeStr }; db.TradeHisData.Add(dbModel); } dbModel.OptId = UserId; dbModel.OptName = UserName; dbModel.OptDate = DateTime.Now; dbModel.Value = value; } if (!string.IsNullOrEmpty(message)) { throw new ServiceException(message); } db.SaveChanges(); } catch (Exception ex) { LogFactory.GetLogger().Error("UploadDividendRateAndNoRiskRateExcel", ex); return JsonError(ex.Message); } return JsonSuccess("导入成功"); } public ActionResult entryexitListV2(int tradeid, bool IsOnlyCloseButton = false) { var r = from c in yldb.ClientCashInCashOut.Where(c => c.TradeId == tradeid && c.ValidState != ConsGlobal.InValid) join up in yldb.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != "InValid") on c.id equals up.ClientcashincashoutId into up from u in up.DefaultIfEmpty() select new { c, u }; var list = r.ToList(); foreach (var item in list) { if (item.u != null) { item.c.Money = item.u.NewMoney; item.c.Direction = item.u.NewDirection; item.c.HappenDate = item.u.NewHappenDate; item.c.State = item.u.State; } } var retlist = list.Select(x => x.c).ToList(); ViewBag.IsOnlyCloseButton = IsOnlyCloseButton; return View(retlist); } /// /// 查看界面资金记录 /// /// /// public ActionResult entryexitEdit(int? enid, int tradeid) { var r = new ClientCashInCashOut(); var trade = yldb.trade.Find(tradeid); var client = DataCacheProvider.GetClientDataSource().GetData(trade.ClientId); r.TradeId = trade.id; r.TradeNumber = trade.TradeNumber; r.ClientId = trade.ClientId; r.ClientNumber = client.Number; var isAdd = enid == null || enid == 0; if (isAdd) { return View(r); } r = yldb.ClientCashInCashOut.Find(enid); var up = yldb.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != ConsGlobal.InValid && x.ClientcashincashoutId == enid); if (up.Any()) { r.Money = up.FirstOrDefault().NewMoney; r.Direction = up.FirstOrDefault().NewDirection; } r.Direction = r.TradeDirectionType; r.Money = Math.Abs(r.Money ?? 0); return View(r); } public JsonResult entryexitEditJson(EntryExitReq req) { var id = 0; if (!string.IsNullOrEmpty(req.EncryptId)) { id = DataProtectHelper.DecryptInt(req.EncryptId); } req.Direction = req.Direction == null ? null : req.Direction == "其他收入" ? "其他支出" : "其他收入"; var r = new ClientCashInCashOutService(CurUser).SaveEntryexit(id, req); return JsonSuccess("更新成功", r); } public JsonResult entryexitIsconfirm(IEnumerable ids) { bool HappenDateGreaterThanNow = false; bool IsDeleteContract = false; var r = from c in yldb.ClientCashInCashOut.Where(c => ids.Contains(c.id)) join up in yldb.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != ConsGlobal.InValid) on c.id equals up.ClientcashincashoutId into up from u in up.DefaultIfEmpty() select new { c, u }; var list = r.ToList(); var tradeIds = r.Select(t => t.c.TradeId).Distinct().FirstOrDefault(); var trade = yldb.trade.Where(c => c.id == tradeIds).FirstOrDefault(); List all_tradeids = new List(); all_tradeids.Add(trade.id); if (trade.IsGroup == 2) { all_tradeids.Add(trade.ParentTradeId); } if (r.Where(e => e.c.Action == ClientCashInCashOut.系统操作_期权费).Any()) { var codeList = yldb.trade_contract_r.Where(O => all_tradeids.Contains(O.TradeId) && O.IsValid); if (codeList.Any()) { IsDeleteContract = true; } } else if (r.Where(e => e.c.Action == ClientCashInCashOut.系统操作_平仓费 || e.c.Action == ClientCashInCashOut.系统操作_行权费).Any()) { var mindate = r.Where(e => e.c.Action == ClientCashInCashOut.系统操作_平仓费 || e.c.Action == ClientCashInCashOut.系统操作_行权费).OrderBy(x => x.c.HappenDate ?? DateTime.MaxValue).FirstOrDefault().c.HappenDate.Value.AddDays(-1); ; var trade_cashs = yldb.trade_cash.Where(x => all_tradeids.Contains(x.TradeId) && (x.Action == ClientCashInCashOut.系统操作_平仓费 || x.Action == ClientCashInCashOut.系统操作_行权费) && x.ValidState != ConsGlobal.InValid && !x.IsDeleted && (x.ValueDate > mindate && x.HappenedDate == null || x.HappenedDate > mindate)); var tradecashid = trade_cashs.Select(x => x.id).ToHashSet(); var codeList = yldb.trade_contract_r.Where(O => all_tradeids.Contains(O.TradeId) && tradecashid.Contains(O.TradeCashId ?? 0) && O.Type != ContractTypeEnum.Trade && O.IsValid); if (codeList.Any()) { IsDeleteContract = true; } } foreach (var item in list) { if (item.c.HappenDate > DateTime.Now) { HappenDateGreaterThanNow = true; } if ((item.c.State == "已确认" || item.c.State == "拒绝" || item.c.State == "已结算") && item.u == null) { return JsonError("已确认、拒绝、已结算的记录不能再次确认!"); } } var showconfirm = ""; if (IsDeleteContract && HappenDateGreaterThanNow) { showconfirm = "1.检测到当前交易已经生成过确认书,如果修改交易资金将删除已生成的确认书,是否继续修改?\r\n2.出入金交易日期晚于当前时间,确定确认该记录?"; } else if (IsDeleteContract) { showconfirm = "检测到当前交易已经生成过确认书,如果修改交易资金将删除已生成的确认书,是否继续修改?"; } else if (HappenDateGreaterThanNow) { showconfirm = "出入金交易日期晚于当前时间,确定确认该记录?"; } return JsonSuccess("", showconfirm); } public JsonResult entryexitsetReject(IEnumerable ids) { var r = from c in yldb.ClientCashInCashOut.Where(c => ids.Contains(c.id)) join up in yldb.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != ConsGlobal.InValid) on c.id equals up.ClientcashincashoutId into up from u in up.DefaultIfEmpty() select new { c, u }; var list = r.ToList(); foreach (var item in list) { if ((item.c.State == "已确认" || item.c.State == "拒绝" || item.c.State == "已结算") && item.u == null) { return JsonError("已确认、拒绝、已结算的记录不能再次拒绝!"); } } return JsonSuccess(""); } public JsonResult excute(IEnumerable ids) { new ClientCashInCashOutService(CurUser).ExcuteEntryExit(ids); return JsonSuccess("执行成功"); } public JsonResult reject(IEnumerable ids) { var sbmsg = new ClientCashInCashOutService(CurUser).ClientCashInCashOutReject(ids); return JsonSuccess(sbmsg.ToString()); } public JsonResult delete(int id) { new ClientCashInCashOutService(CurUser).ExcuteEntryDele(id); return JsonSuccess("执行成功"); } [MyAuthorize("基础参数管理-除权除息交易")] public ActionResult DividendTradeList(string settleDate = null) { ViewBag.valueDate = valuedateBLL.ValueDate.ToString("yyyy-MM-dd"); if (settleDate != null) { ViewBag.valueDate = settleDate; } return View(); } public JsonResult QueryDividendTradeList(DividendTradeReq req) { req.AssetUnitIds = AssetUnitModel.IntersectAssetUnits(req.GroupId, req.AssetUnitIds).ToList(); var list = new DividendService(CurUser).QueryDividendTrade(req); var res = new SearchListResult { rows = list, page = 1, total = 1, records = list.Count }; return Json(res); } public object ExportDividendTradeList(DividendTradeReq req) { req.AssetUnitIds = AssetUnitModel.IntersectAssetUnits(req.GroupId, req.AssetUnitIds).ToList(); var bytes = new DividendService(CurUser).ExportDividendTrade(req); return File(bytes, xlsxMimeType, $"除权除息交易信息-{DateTime.Now:yyyy-MM-dd}.xlsx"); } public JsonResult DevidendRatio(int[] ids, DateTime optDate, double ratio) { try { var changeService = new DbRecordChangesService(CurUser); if (ratio <= 0) { changeService.Delete(ConsInfoChangeType.UserChange, ids, nameof(trade.DividendRatio), optDate); } else { var list = new List(); var infos = changeService.GetValue( ConsInfoChangeType.UserChange, ids, nameof(trade.DividendRatio), DateTime.MinValue, optDate).GroupBy(O => O.RecordId) .ToDictionary( K => K.Key, V => V.ToDictionary(K1 => K1.OptDate, V1 => double.TryParse(V1.NewValue, out var temp) ? (double?)temp : null)); foreach (var id in ids) { var dateGroup = infos.ContainsKey(id) ? infos[id] : null; var fieldValue = (dateGroup?.Where(O => O.Key < optDate).OrderBy(O => O.Key).FirstOrDefault().Value.ToString()) ?? ""; var tc = new TradeChanges() { ChangeType = ConsInfoChangeType.UserChange, RecordId = id, FieldName = nameof(trade.DividendRatio), FieldValue = fieldValue, NewValue = ratio.ToString(), OptDate = optDate, Update = DateTime.Now }; list.Add(tc); } changeService.Save(list); } return Json(Return.Success()); } catch (Exception ex) { LogFactory.GetLogger("DevidendRatio").Error(ex); return Json(Return.Fail()); } } [MyAuthorize("交易管理-交易预付金配置")] public ActionResult tradeMarginTemplateList() { return View(); } [MyAuthorize("交易管理-交易预付金配置")] public ActionResult tradeMarginTemplateEdit(int tradeId) { var trade = yldb.trade.Find(tradeId); var marginTemplates = yldb.margin_template_v2.Where(x => x.TradeTypes.Contains(trade.TradeType) && !x.IsDefault).ToList(); marginTemplates.ForEach(x => x.Details = yldb.margin_template_detail.Where(y => y.MarginTemplateId == x.id).ToList()); var latestTradeMarginTemplate = yldb.trade_margin_template.Where(x => x.TradeId == tradeId).OrderByDescending(x => x.ValueDate).FirstOrDefault(); ViewBag.LatestValueDate = latestTradeMarginTemplate == null ? DateTime.MinValue : latestTradeMarginTemplate.ValueDate; ViewBag.TradeId = tradeId; return View(marginTemplates); } /// /// 获取交易预付金模板列表 /// /// public static List GetTradeMarginTemplateList() { using (var db = new YLContext()) { var marginTemplates = db.margin_template_v2.ToList(); if (marginTemplates != null && marginTemplates.Any()) { return marginTemplates.Select(p => new SelectListItem { Text = p.Name, Value = p.id.ToString() }).ToList(); } } return new List(); } public JsonResult saveTradeMarginTemplate(trade_margin_template tradeMarginTemplate) { try { if (tradeMarginTemplate.MarginTemplateId <= 0) { throw new Exception("请选择有效的预付金模板"); } var deletedRecords = yldb.trade_margin_template.Where(x => x.TradeId == tradeMarginTemplate.TradeId && x.ValueDate >= tradeMarginTemplate.ValueDate).ToArray(); yldb.trade_margin_template.RemoveRange(deletedRecords); var updatedRecords = yldb.trade_margin_template.Where(x => x.TradeId == tradeMarginTemplate.TradeId && x.ValueDate < tradeMarginTemplate.ValueDate).ToList(); updatedRecords.ForEach(x => x.IsLatest = false); tradeMarginTemplate.OptDate = DateTime.Now; tradeMarginTemplate.OptId = CurUser.UserId; tradeMarginTemplate.OptName = CurUser.UserName; tradeMarginTemplate.IsLatest = true; yldb.trade_margin_template.Add(tradeMarginTemplate); yldb.SaveChanges(); #region 重置初始预付金 var trade = yldb.trade.Find(tradeMarginTemplate.TradeId); trade.InitialMargin = MarginDefault.GetInitialMarginWithPreHandle(trade); yldb.SaveChanges(); if (trade.IsGroup == 2) { var parentTrade = yldb.trade.Find(trade.ParentTradeId); parentTrade.InitialMargin = yldb.trade.Where(x => x.ValidState != "InValid" && x.ParentTradeId == trade.ParentTradeId).Sum(y => y.InitialMargin); yldb.SaveChanges(); } #endregion return JsonSuccess("更新成功", trade.InitialMargin); } catch (Exception ex) { return JsonError(ex.Message); } } [HttpPost] public JsonResult batchSetInitialMargin(TradeMarginTemplateReq req) { ////更新子交易初始预付金 //var tradesWithOutGroup = yldb.trade.Where(x => x.ValidState != "InValid" && x.InitialMargin == null && x.ClientId > 0 && x.IsGroup != 1 && x.TradeType != "结构化交易").ToList(); //if (clientId > 0) //{ // tradesWithOutGroup = tradesWithOutGroup.Where(x => x.ClientId == clientId).ToList(); //} //tradesWithOutGroup.ForEach(x => //{ // x.InitialMargin = MarginDefault.GetInitialMarginWithPreHandle(x); //}); //yldb.SaveChanges(); ////更新组合交易主预付金初始预付金 //var tradesGroup = yldb.trade.Where(x => x.ValidState != "InValid" && x.IsGroup == 1 && x.ClientId > 0).ToList(); //if (clientId > 0) //{ // tradesGroup = tradesGroup.Where(x => x.ClientId == clientId).ToList(); //} //tradesGroup.ForEach(x => //{ // x.InitialMargin = yldb.trade.Where(y => y.ValidState != "InValid" && y.ParentTradeId == x.id).Sum(y => y.InitialMargin); //}); //yldb.SaveChanges(); using (var service = new TradeQueryService(CurUser)) { service.BatchSetInitialMargin(req); } return JsonSuccess("更新成功"); } /// /// 获取交易预付金规则列表 /// [HttpPost] public JsonResult tradeMarginTemplateQuery(TradeMarginTemplateReq req) { req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.LoginUserId = CurUser.UserId; req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new TradeQueryService(CurUser).SearchTradeMarginTemplateList(req); return Json(sList); } public bool CheckSelectedTrades(CheckSelectedGroupTradesForActionReq req) { if (yldb.trade.Any(x => req.tradeIds.Contains(x.id) && (x.IsGroup > 0 || x.ParentTradeId > 0))) { throw new ServiceException("分组操作只能选择非组合交易,且非结构化交易"); } if (yldb.trade.Where(x => req.tradeIds.Contains(x.id)).Select(x => x.ClientId).Distinct().Count() > 1) { throw new ServiceException("分组操作只能选择同一客户交易"); } if (yldb.trade.Any(x => req.tradeIds.Contains(x.id) && (!ConsTrade.TradeStatusBeforConfirmedAndConfirmed.Contains(x.TradeStatus) || x.Notional != x.OriginalNotional))) { throw new ServiceException("分组操作只能选择不存在了结记录的交易"); } var trades = yldb.trade.Where(x => req.tradeIds.Contains(x.id)).ToList(); var tradeCashFlowList = trades.Where(l => l.TradeType != "现金流交易"); if (tradeCashFlowList.Any() && tradeCashFlowList.GroupBy(l => l.UnderlyingCode).ToList().Count > 1) { throw new ServiceException("分组交易必须要保持相同的标的"); } if (tradeCashFlowList.Any() && tradeCashFlowList.GroupBy(l => l.SpotPrice).ToList().Count > 1) { throw new ServiceException("分组交易必须要保持相同的期初价格"); } if (tradeCashFlowList.Any() && tradeCashFlowList.GroupBy(l => l.TradeDate).ToList().Count > 1) { throw new ServiceException("分组交易必须要保持相同的交易日期"); } return true; } public ActionResult CheckSelectedTradesForAddGroup(CheckSelectedGroupTradesForActionReq req) { var result = new CheckSelectedGroupTradesForActionResponse() { IsSuccess = true }; var trades = yldb.trade.Where(x => req.tradeIds.Contains(x.id)).ToList(); var underlyingId = 0; var underlyingCode = string.Empty; double? spotPrice = 0; DateTime? tradeDate = null; DateTime? exerciseDate = null; var buySell = string.Empty; double? tradePrice = 0; trades.ForEach(x => { if (x.TradeType != "现金流交易") { underlyingId = x.UnderlyingId; underlyingCode = x.UnderlyingCode; spotPrice = x.SpotPrice; buySell = x.BuySell; } tradePrice += x.TradePrice * (x.BuySell == "卖出" ? 1 : -1); if (tradeDate == null || tradeDate > x.TradeDate) { tradeDate = x.TradeDate; } if (exerciseDate == null || exerciseDate < x.ExerciseDate) { exerciseDate = x.ExerciseDate; } }); result.trade = new trade(); var firstDefaultTrade = trades.FirstOrDefault(); result.trade.AssetId = firstDefaultTrade.AssetId; result.trade.AssetBookName = firstDefaultTrade.AssetBookName; result.trade.TraderId = firstDefaultTrade.TraderId; result.trade.TraderName = firstDefaultTrade.TraderName; result.trade.ClientId = firstDefaultTrade.ClientId; result.trade.ClientName = firstDefaultTrade.ClientName; result.trade.UnderlyingId = underlyingId; result.trade.UnderlyingCode = underlyingCode; result.trade.TradeDate = tradeDate; result.trade.ExerciseDate = exerciseDate; result.trade.BuySell = buySell; result.trade.IsUsePremiumRate = true; result.trade.IsMoneynessOption = "是"; result.trade.TradePrice = tradePrice * (buySell == "卖出" ? 1 : -1); result.trade.SpotPrice = spotPrice; result.trade.StockEqvNotional = trades.Max(a => a.StockEqvNotional); result.trade.StockEqvNotionalMax = result.trade.StockEqvNotional; var actionResult = tradeEditGroup(result.trade, req.tradeIds.ToArray()); return actionResult; } public JsonResult DismissSelectedGroupTrades(int[] tradeIds) { var groupTrades = db.trade.Where(x => tradeIds.Contains(x.id) && x.IsGroup == 1 && ConsTrade.TradeStatusBeforConfirmed.Contains(x.TradeStatus)).ToList(); if (groupTrades.Count() < tradeIds.Count()) { return JsonError("该操作仅支持选择未确认的组合主交易"); } groupTrades.ForEach(x => { if (x.TradeNumber.StartsWith("CW")) { x.TradeNumber = x.TradeNumber.Replace("CW", "XX"); } else { x.TradeNumber = x.TradeNumber.Insert(0, "XX"); } x.ValidState = "InValid"; var subTrades = db.trade.Where(y => y.ParentTradeId == x.id).ToList(); subTrades.ForEach(y => { y.ParentTradeId = 0; y.IsGroup = 0; y.StructureType = null; }); var childTradeIds = subTrades.Select(y => y.id).ToArray(); var subCashs = db.ClientCashInCashOut.Where(y => y.TradeId != null && childTradeIds.Contains(y.TradeId.Value)).ToList(); subCashs.ForEach(y => { y.IsGroup = 0; y.ParentTradeNumber = x.TradeNumber; }); }); db.SaveChanges(); return JsonSuccess("组合分解成功"); } public JsonResult CheckSelectedGroupTradesForAction(CheckSelectedGroupTradesForActionReq req) { var result = new CheckSelectedGroupTradesForActionResponse() { IsSuccess = true, GotoTradeGroupActionList = false }; if (yldb.trade.Any(x => req.tradeIds.Contains(x.id) && x.IsGroup == 0)) { result.IsSuccess = false; result.ErrorMsg = "分组了结只能选择分组交易"; return Json(result); } var trades = yldb.trade.Where(x => req.tradeIds.Contains(x.id)).ToList(); var parentTradeIds = trades.Where(x => x.ParentTradeId > 0).Select(x => x.ParentTradeId).Distinct().Union(trades.Where(x => x.ParentTradeId == 0).Select(x => x.id).Distinct()); if (parentTradeIds.Count() > 1) { result.IsSuccess = false; result.ErrorMsg = "分组了结只能选择同一组内交易"; return Json(result); } else if (parentTradeIds.Count() == 0) { result.IsSuccess = false; result.ErrorMsg = "请选择有效的分组了结子交易"; return Json(result); } else { var parentTradeId = parentTradeIds.First(); var trade = yldb.trade.Find(parentTradeId); if (!trades.Any(d => d.id == parentTradeId)) { trades.Add(trade); } if (trades.Count > 1) { result.GotoTradeGroupActionList = true; } trade.OriginalNotional = Math.Abs(trade.OriginalNotional ?? 0); trade.Notional = Math.Abs(trade.Notional); trade.TradeAmount = Math.Abs(trade.TradeAmount); var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode); trade.TradeOriginalAmount = trade.OriginalNotional / underlying.CountRatio; trade.CountRatio = underlying.CountRatio; var tc = new TradeCashService(CurUser).GetLastSettleInfo(trade.id); if (tc != null) { trade.UnWindDate = tc.ValueDate; } result.trade = trade; result.trade.UnderlyingPrice = underlying.Price; var parentTrade = trades.Where(x => x.IsGroup == 1 && x.TradeStatus == ConsTrade.确认成交).Select(l => l); if (!parentTrade.Any()) { result.IsSuccess = false; result.ErrorMsg = "该交易非确认成交状态,不能分组了结"; return Json(result); } //区分是否勾选 子交易 ,沟子交易 走旧界面逻辑 ,没勾子交易走新界面逻辑 if (req.tradeIds.Count == 1 && req.tradeIds.Contains(parentTradeId)) { var childTrades = yldb.trade.Where(x => parentTradeId == x.ParentTradeId && x.TradeStatus == ConsTrade.确认成交).Select(l => l).ToList(); if (childTrades.Count <= 0) { result.IsSuccess = false; result.ErrorMsg = "子交易非确认成交状态,不能分组了结"; return Json(result); } result.ChildTradeCashs = childTrades.Select(x => new trade_cash() { TradeId = x.id, TradeNumber = x.TradeNumber, TradeType = x.TradeType, TradeAmount = x.TradeAmount, TradeOriginalAmount = x.OriginalNotional / underlying.CountRatio, StockEqvNotional = x.StockEqvNotional, OriginalStockEqvNotional = x.OriginalStockEqvNotional ?? 0, UnwindTradeAmount = x.TradeAmount, UnwindStockEqvNotional = x.StockEqvNotional, id = x.id, BuySell = x.BuySell }).ToList(); } else { result.ChildTradeCashs = null; } } return Json(result); } /// /// 获取分组了结信息 /// /// /// /// public JsonResult GetGroupTradesForAction(int tradeId) { var result = new CheckSelectedGroupTradesForActionResponse() { IsSuccess = true }; var trade = yldb.trade.Find(tradeId); var childrenTrades = yldb.trade.Where(x => x.ParentTradeId == tradeId); var tradeCashGroupActions = yldb.trade_cash_group_action.Where(x => x.ParentTradeId == tradeId && x.Status == "待完成"); if (!tradeCashGroupActions.Any()) { throw new ServiceException("未查询到该主交易的分组了结信息"); } var parentTradeCashId = tradeCashGroupActions.FirstOrDefault().ParentTradeCashId; var parentTradeCash = yldb.trade_cash.Find(parentTradeCashId); var childrenTradeIds = tradeCashGroupActions.Select(s => s.TradeId); trade.trade_cash = parentTradeCash; trade.OriginalNotional = Math.Abs(trade.OriginalNotional ?? 0); trade.Notional = Math.Abs(trade.Notional); trade.TradeAmount = Math.Abs(trade.TradeAmount); var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode); trade.TradeOriginalAmount = trade.OriginalNotional / underlying.CountRatio; trade.CountRatio = underlying.CountRatio; if (parentTradeCash.UnwindMethod == 0) { trade.IsUsePremiumRate = true; } else { trade.IsUsePremiumRate = false; } result.trade = trade; result.trade.UnderlyingPrice = underlying.Price; result.ChildTradeCashs = yldb.trade_cash.Where(x => x.ParentTradeCashId == parentTradeCashId).ToList(); result.ChildTradeCashs.ForEach(x => { var td = childrenTrades.FirstOrDefault(n => n.id == x.TradeId); if (td != null) { x.TradeId = td.id; x.id = td.id; x.TradeNumber = td.TradeNumber; x.TradeType = td.TradeType; x.TradeOriginalAmount = td.OriginalNotional / underlying.CountRatio; x.StockEqvNotional = td.StockEqvNotional; x.OriginalStockEqvNotional = td.OriginalStockEqvNotional ?? 0; x.BuySell = td.BuySell; } }); return Json(result); } //public JsonResult GetObserveTradeChildInfo(int tradeId) //{ // var tradeChilds = yldb.trade.Where(x => x.ParentTradeId == tradeId && x.ValidState == "Valid" && (x.TradeType == "凤凰期权" || x.TradeType == "雪球期权" || x.TradeType == "障碍期权" || x.TradeType == "气囊结构" || x.TradeType == "双鲨期权" || x.TradeType == "二元期权" || x.TradeType == "区间累积期权" || x.TradeType == "累计期权") && !ConsTrade.TradeCompleteStatus.Contains(x.TradeStatus)).OrderByDescending(l => l.id).Select(x => x).ToList(); // if (tradeChilds == null || tradeChilds.Count == 0) // { // throw new ServiceException("没有对应的子交易!"); // } // return Json(tradeChilds); //} [MyAuthorize("交易管理-分组设置")] public ActionResult tradeGroupActionList(string tradeNumber = "") { ViewBag.TradeNumber = tradeNumber; return View(); } public JsonResult TradeGroupActionQuery(TradeReq req) { req.UserAssets = CurUser.GetAssetUnitIds(); req.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); req.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var sList = new TradeQueryService(CurUser).SearchGroupActionList(req); return Json(sList); } [HttpPost] public JsonResult SearchGroupActionChildrenList(SearchGroupActionChildrenListReq req) { var trades = new TradeQueryService(CurUser).SearchGroupActionChildrenList(req); return Json(trades); } public JsonResult SaveKnockInOutStatus(trade_airbag trade_airbag) { var airbag = new TradeAirbagService(CurUser).SaveKnockInOutStatus( tradeId: trade_airbag.TradeId, KnockInOutDate: trade_airbag.KnockInOutDate, KnockInOutStatus: trade_airbag.KnockInOutStatus); return Json(airbag); } /// /// 交易试算历史 /// /// public ActionResult quotaTrialHistory(int tradeId) { if (tradeId == 0) { return ShowError("参数错误"); } ViewBag.TradeId = tradeId; return View(); } public JsonResult QueryQuotaTrialHistory(QuotaTrialReq req) { if (string.IsNullOrWhiteSpace(req.sidx)) { req.sidx = "OptDate"; req.sord = "desc"; } var result = new QuotaMonitorService(CurUser).QueryQuotaTrial(req); return Json(result); } /// /// 交易试算 /// /// 交易Id,结构化交易请传主交易Id /// 试算来源,0:手动点击试算按钮;1:确认成交时自动调用; /// public ActionResult quotaTrial(int id, int trialSource = 0) { var quotaTrial = new QuotaMonitorService(CurUser).QuotaCheck(id, trialSource); return View(quotaTrial); } /// /// 交易试算 /// /// 交易Id,结构化交易请传主交易Id /// 试算来源,0:手动点击试算按钮;1:确认成交时自动调用; /// public ActionResult showQuotaTrial(int id) { var service = new QuotaMonitorService(CurUser); var quotaTrial = new QuotaTrialEx(service.QueryQuotaTrial(id)); var lastQuotaTrial = service.QueryLastQuotaTrial(quotaTrial.TradeId, true); if (lastQuotaTrial != null) { quotaTrial.LastTrialStatus = lastQuotaTrial.TrialStatus; ViewBag.LastStatus = quotaTrial.LastTrialStatus; ViewBag.LastStatusStr = EnumHelper.GetDescriptionByName(quotaTrial.LastTrialStatus); } return View("quotaTrial", quotaTrial); } public JsonResult SaveQuotaTrial(QuotaTrial obj) { try { new QuotaMonitorService(CurUser).SaveQuotaTrial(obj); new TradeRiskCheckLogService(CurUser).AddLog(obj); } catch (Exception ex) { LogFactory.GetLogger("SaveQuotaTrial").Error(ex); return JsonError("保存试算说明失败!"); } return JsonSuccess(); } [MyAuthorize("风险控制-接口审批列表")] public ActionResult InterfaceApproval() { return View(); } public JsonResult QueryInterfaceApproval(ApprovalReq req) { if (string.IsNullOrWhiteSpace(req.sidx)) { req.sidx = "OptDate"; req.sord = "desc"; } var result = new ApprovalService(CurUser).QueryInterfaceApproval(req); return Json(result); } public ActionResult InterfaceApprovalRecord(int type, string code) { ViewBag.code = code; ViewBag.type = type; return View(); } public JsonResult LinkApprovalResult(int interfaceId, string code, string additionalProcessing = "") { var service = new ApprovalService(CurUser); var result = service.ApprovalResult(interfaceId, code, additionalProcessing); return Json(result); } /// /// 交易变更记录 /// /// [MyAuthorize("交易管理-变更记录")] public ActionResult TradeChange() { return View(); } /// /// 自定义导出弹出页面 /// /// public ActionResult Customexport() { return View(); } /// /// 自定义导出弹出页面 /// /// public ActionResult ExportClientEodPosition() { return View(); } /// /// 导出客户列表 /// [ResponseCache(NoStore = true)] public ActionResult CustomtradeExport(CustomtradeExportreq req) { var marketZipFile = new OtcTradeListExportService(CurUser).ExportCustomTradeToExcel(req.startDate, req.endDate, req.tradeStatus, req.tradeTypes); return JsonSuccess("下载成功", new { marketZipFile = marketZipFile }); } /// /// 展期记录 /// /// /// /// public ActionResult ExtensionTime(string enid, string tradeNumber) { ViewBag.TradeId = DataProtectHelper.DecryptInt(enid); ViewBag.TradeNumber = tradeNumber; return View(); } /// /// 查询展期记录 /// /// /// public JsonResult QueryExtensionTimeList(int tradeId) { var exerciseDate = DbContextFactory.GetYLDbContext().trade.Where(O => O.id == tradeId).Select(O => O.ExerciseDate).FirstOrDefault(); var result = new SearchListResult(); result.Sum = exerciseDate; result.rows = new ExtensionTimeService(CurUser).QueryExtensionTimeList(tradeId); result.page = 1; result.records = result.rows.Count(); result.total = 1; return Json(result); } /// /// 新增或修改展期信息 /// /// /// [HttpPost] public JsonResult SaveExtensionTime(ExtensionTime info) { new ExtensionTimeService(CurUser).SaveExtensionTime(info); return JsonSuccess("操作成功"); } /// /// 删除展期记录 /// /// /// /// [HttpPost] public JsonResult deleteExtensionTime(int tradeId, int id) { new ExtensionTimeService(CurUser).DelExtensionTime(tradeId, id); return JsonSuccess("删除成功"); } public JsonResult QueryExtensionTimeHistory(int tradeId) { var datas = db.TradeAuditLog.Where(n => n.TradeId == tradeId && n.OptType.StartsWith("交易展期")) .Select(n => new TradeAuditLogDto { id = n.id, OptType = n.OptType, Changes = n.Changes, OptName = n.OptName, OptDate = n.OptDate }).ToList(); datas = datas.OrderByDescending(n => n.id).ToList(); if (datas.Any()) { if (datas.FirstOrDefault().OptType.Contains("撤销")) { datas.Clear(); } else { if (datas.FirstOrDefault().Changes.Contains("],")) { var arr = JsonHelper.Deserialize>(datas.FirstOrDefault().Changes); var tag = arr == null || arr[0].Length <= 5 ? "" : arr[0][5]; if (tag.Length > 0) { datas = datas.Where(O => O.Changes.Contains(tag)).ToList(); datas.ForEach(x => { x.Changes = JsonHelper.Serialize(JsonHelper.Deserialize>(x.Changes)[0]); }); } } else { var arr = JsonHelper.Deserialize(datas.FirstOrDefault().Changes); var tag = arr == null || arr.Length <= 5 ? "" : arr[5]; if (tag.Length > 0) { datas = datas.Where(O => O.Changes.Contains(tag)).ToList(); } } } } var result = new SearchListResult(); result.rows = datas; result.page = 1; result.records = datas.Count(); result.total = 1; return Json(result); } #region----多次了结---- public JsonResult AjaxGetMultiCloseList(TradeMultiCloseQueryModel queryModel) { //if (queryModel.PageSize == 0) //{ // queryModel.PageIndex = 1; // queryModel.PageSize = 10000; //} queryModel.PageIndex = queryModel.page; queryModel.PageSize = queryModel.rows; if (!string.IsNullOrEmpty(queryModel.sidx)) { queryModel.SortExpression = queryModel.sidx + " " + (string.IsNullOrEmpty(queryModel.sord) ? "asc" : queryModel.sord); } queryModel.UserAssets = CurUser.GetAssetUnitIds(); queryModel.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); queryModel.LoginUserId = CurUser.UserId; queryModel.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var datas = new OtcOptionMultiCloseService(CurUser).GetPagedDatas(queryModel); return JsonForJqGrid(datas); } [HttpPost] public JsonResult AjaxGetMultiCloseGroupChildren(int TcId) { var datas = new OtcOptionMultiCloseService(CurUser).GetGroupChildrenDatas(TcId); return Json(datas); } /// /// 场外成交记录-导出奇异要素 /// public ActionResult UnwindMultiFactorsExport(TradeMultiCloseQueryModel queryModel) { queryModel.UserAssets = CurUser.GetAssetUnitIds(); queryModel.UserClients = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易); queryModel.LoginUserId = CurUser.UserId; queryModel.CurUserTradeIds = CurUser.GetTradeIdsByCurUser(); var bytes = new OtcOptionMultiCloseService(CurUser).ExportAllFieldsToExcel(queryModel); return File(bytes, xlsxMimeType, $"多次了结全部要素_{DateTime.Now:yyyyMMddHHmmssffff}.xlsx"); } #endregion #region----非Action方法---- public static List GetLimitTargetTypes() { var AllLimitTarget = new List(){ new SelectListItem() { Text = LimitTargetTypeEnum.Delta.ToString(), Value = LimitTargetTypeEnum.Delta.ToString() }, new SelectListItem() { Text = LimitTargetTypeEnum.DeltaCash.ToString(), Value = LimitTargetTypeEnum.DeltaCash.ToString() }, new SelectListItem() { Text = LimitTargetTypeEnum.Gamma.ToString(), Value = LimitTargetTypeEnum.Gamma.ToString() }, new SelectListItem() { Text = LimitTargetTypeEnum.名义本金.ToString(), Value = LimitTargetTypeEnum.名义本金.ToString() } }; return AllLimitTarget; } public static List GetLimitScopeTypes() { var AllLimitScope = new List(){ new SelectListItem() { Text = LimitScopeTypeEnum.单笔交易.ToString(), Value = LimitScopeTypeEnum.单笔交易.ToString() }, //new SelectListItem() //{ // Text = LimitScopeTypeEnum.标的资产.ToString(), // Value = LimitScopeTypeEnum.标的资产.ToString() //}, //new SelectListItem() //{ // Text = LimitScopeTypeEnum.品种.ToString(), // Value = LimitScopeTypeEnum.品种.ToString() //}, new SelectListItem() { Text = LimitScopeTypeEnum.交易员.ToString(), Value = LimitScopeTypeEnum.交易员.ToString() }, new SelectListItem() { Text = LimitScopeTypeEnum.客户.ToString(), Value = LimitScopeTypeEnum.客户.ToString() } }; return AllLimitScope; } public static List GetLimitTimeTypes() { var AllLimitTimeTypes = new List(){ new SelectListItem() { Text = LimitTimeTypeEnum.每交易日.ToString(), Value = LimitTimeTypeEnum.每交易日.ToString() }, new SelectListItem() { Text = LimitTimeTypeEnum.存续累积.ToString(), Value = LimitTimeTypeEnum.存续累积.ToString() } }; return AllLimitTimeTypes; } public List GetMarginTemplates() { return db.margin_template.ToList(); } public List> GetForwardDateNameDic() { DictionarySerivice dictionarySerivice = new DictionarySerivice(); return dictionarySerivice.GetForwardDateNameDic().ToList(); } public List GetMarginTemplateItems() { var marginTemplateItems = new List(); var marginTemplates = db.margin_template.ToList(); marginTemplateItems.Add(new SelectListItem() { Text = "系统默认", Value = "系统默认" }); marginTemplateItems.Add(new SelectListItem() { Text = "无预付金", Value = "无预付金" }); marginTemplates.ForEach(x => { marginTemplateItems.Add(new SelectListItem() { Text = x.Name, Value = x.Name }); }); return marginTemplateItems; } #endregion [MyAuthorize("结算管理-结算确认书")] public ActionResult tradeExchangeBook() { ViewBag.ValueDate = valuedateBLL.ValueDate.ToString("yyyy-MM-dd"); return View(); } #region 华安资本 信用风险表 [MyAuthorize("监管报告-华安信用风险表")] public ViewResult TradeCreditRisk(TradeCreditRiskViewModel model) { var valueDate = BLL.Eod.EodOperationBase.GetLastSettlementDate(valuedateBLL.ValueDate); if (model == null) { model = new TradeCreditRiskViewModel(); } model.ValueDate = valueDate.ToString("yyyy-MM-dd"); if (string.IsNullOrWhiteSpace(model.EndDate)) { model.EndDate = model.ValueDate; } if (string.IsNullOrWhiteSpace(model.CreditRiskType)) { model.CreditRiskType = "期权"; } return View(model); } [MyAuthorize("监管报告-华安信用风险表")] public ActionResult QueryTradeCreditRisk(TradeCreditRiskReq req) { var resultList = new TradeCreditRiskQueryService(CurUser).SearchTradeCreditRisk(req); return Json(resultList); } [MyAuthorize("监管报告-华安信用风险表")] public JsonResult ExportTradeCreditRisk(TradeCreditRiskReq req) { req.page = 1; req.rows = 100000; var sList = new TradeCreditRiskQueryService(CurUser).SearchTradeCreditRisk(req); var datas = sList.rows.ToList(); var sourcePath = Server.MapPath("~/App_Docs"); string sourcefilename = req.CreditRiskType == "期权" ? "华安资本信用风险场外期权.xlsx" : req.CreditRiskType == "远期" ? "华安资本信用风险远期.xlsx" : "华安资本信用风险场外互换.xlsx"; var sourceFileName = Path.Combine(sourcePath, "导出模板", sourcefilename); var targetPath = Path.Combine(sourcePath, "Temp", DateTime.Now.ToString("yyyyMMdd")); if (!Directory.Exists(targetPath)) { Directory.CreateDirectory(targetPath); } string FileNamekey = req.CreditRiskType == "期权" ? "场外期权" : req.CreditRiskType == "远期" ? "远期" : "场外互换"; var targetFileName = Path.Combine(targetPath, $"{FileNamekey}{DateTime.Now.ToString("yyyyMMdd")}.xlsx"); var modelDict = new Dictionary { {"场外期权(华安资本)", datas} }; if (req.CreditRiskType == "远期") { modelDict = new Dictionary { {"商品远期、商品现货、收益互换、场外期权(华安资本)", datas} }; } else if (req.CreditRiskType == "互换") { modelDict = new Dictionary { {"场外互换(华安资本)", datas} }; } var path = ExcelTemplate.GeneratePDFFromExeclTemplate(sourcePath, sourceFileName, modelDict, targetPath, targetFileName, null, null, null, false, callback: (sheet) => { if (!datas.Any()) { sheet.First().InsertRow(2, 1, 1);//此模板无数据则插入空行,注意样式 } }); //补丁,返回一个相对地址 var relativePath = path.Substring(path.IndexOf("App_Docs") - 1); return JsonSuccess("生成成功", relativePath); } #endregion /// /// /// /// /// 0:保存,1:平仓复核,2:行权复核,3:审批 /// public ActionResult tradeSettle(string ids, int reCheck = 0) { ViewBag.Ids = ids; ViewBag.reCheck = reCheck; return View(); } #region 报送相关字段填写 public ActionResult tradeSubmissionFields(string enid) { var id = DataProtectHelper.DecryptInt(enid); var trade = yldb.trade.Find(id); trade.MetaDic = new TradeMetaService(CurUser).GetTradeMeta(trade.id); var trade_Report = yldb.trade_Report.Where(x => x.TradeId == id).FirstOrDefault(); if (trade_Report == null) { var marinRate = YLErp.Modules.UnderlyingModule.UnderlyingHelper.GetApplicableMarginRate(trade.ClientId, trade.UnderlyingCode, trade.TradeDate.Value); if (marinRate == null) { marinRate = new client_margin_detail() { init_rate = 1, maintain_rate = 1 }; } trade_Report = new trade_report(); trade_Report.TradeId = id; #region 初始化默认值 TRS-ZS-142 trade_Report.PerformanceGuarantee = "部分担保"; trade_Report.IsUsePerformanceColl = "否"; trade_Report.PerformanceExplain = "详见交易确认书。"; trade_Report.IsPerformanceCollInterest = "否"; trade_Report.InitialPerformanceColl = (decimal)marinRate.init_rate * 100; trade_Report.RecoveryPerformanceColl = (decimal)marinRate.maintain_rate * 100; trade_Report.UnwindPerformanceColl = trade_Report.RecoveryPerformanceColl; trade_Report.EodPerformanceColl = trade_Report.RecoveryPerformanceColl; trade_Report.PerformanceCollType = "0"; trade_Report.PerformanceCollRange = "0"; trade_Report.PerformanceRemark = "详见交易确认书及定义性文件"; #endregion } if (trade.MetaDic.TryGetValue("主协议编号", out string value1)) { trade_Report.MainProtocolCode = value1; } if (trade.MetaDic.TryGetValue("补充协议编号", out string value2)) { trade_Report.SupProtocolCode = value2; } if (trade.MetaDic.TryGetValue("清算机构", out string value3)) { trade_Report.ClearingAgency = value3; } if (trade.MetaDic.TryGetValue("交易场所", out string value4)) { trade_Report.TradingPlace = value4; } if (trade.MetaDic.TryGetValue("其他交易场所", out string value5)) { trade_Report.OtherTradingPlace = value5; } trade_Report.TradeType = trade.TradeType; trade_Report.TradeStatus = trade.TradeStatus; trade_Report.clientId = trade.ClientId; trade_Report.FillingPartyRole = trade.OpponentRole == "乙方" ? "甲方" : "乙方"; bool isreport = false; var contractCodeList = yldb.trade_contract_r.Where(O => O.TradeId == id && O.Type == "交易确认书").Select(O => O.ContractCode).ToList(); foreach (var code in contractCodeList) { //如果查不到,说明是新交易,不用修改报送状态; if (string.IsNullOrWhiteSpace(code)) { continue; } var infoTag = $"_{code.Replace("_", "-")}_成交_"; isreport = yldb.sac_report_notes.Where(O => O.InfoTag.Contains(infoTag)).Any(); if (isreport == true) break; } ViewBag.isreport = isreport; return View(trade_Report); } public JsonResult tradeSubmissionJson(trade_report req) { var ret = new TradeReportService(CurUser).SaveTradeReport(req); return JsonSuccess("保存成功", ret); } public ActionResult submissionFieldsHistory(string encryptId) { var tradeId = DataProtectHelper.DecryptInt(encryptId); var datas = db.TradeAuditLog.Where(n => n.TradeId == tradeId && n.OptType == "修改报送相关字段") .Select(n => new TradeAuditLogDto { id = n.id, OptType = n.OptType, Changes = n.Changes, OptName = n.OptName, OptDate = n.OptDate }).ToArray(); datas = datas.GroupBy(O => new { O.OptDate, O.OptName, O.OptType }).Select(O => O.First()).OrderByDescending(n => n.id).ToArray(); foreach (var item in datas) { item.Changes = new DatatraceQueryService(CurUser).ReplaceDataChanges(new trade(), item.Changes); } if (datas.Count()>=1) { datas.Last().OptType = "新增报送相关字段"; } return View(datas); } #endregion } }