using System.Text; using YLErp.DBModels.Enums; using YLErp.Modules.EodModule; namespace YLErp.Web.Controllers { public class eod_trade_risk_manualController : BaseController { public ActionResult eod_trade_risk_manualList(string enid) { var id = DecryptInt(enid); ViewBag.TradeId = id; ViewBag.EncryptId = enid; return View(); } public ActionResult eod_trade_risk_manualListByType(string enid) { var id = DecryptInt(enid); ViewBag.TradeId = id; ViewBag.EncryptId = enid; return View(); } public ActionResult eod_trade_risk_manualEdit(string enid, string tradeenid) { var tradeId = DecryptInt(tradeenid); var isAdd = string.IsNullOrEmpty(enid) || enid == "0"; if (isAdd) { return View(new eod_trade_risk_manual() { ValueDate = valuedateBLL.ValueDate, TradeId = tradeId }); } else { var intid = DecryptInt(enid); var r = yldb.eod_trade_risk_manual.Find(intid); return View(r); } } public ActionResult eod_trade_risk_manualEditByType(string enid, string tradeenid) { var tradeId = DecryptInt(tradeenid); var isAdd = string.IsNullOrEmpty(enid) || enid == "0"; if (isAdd) { return View(new eod_trade_risk_manual() { ValueDate = valuedateBLL.ValueDate, TradeId = tradeId, VolType = "持仓", SettlementType = SettlementTypeEnum.ClosePrice }); } else { var intid = DecryptInt(enid); var r = yldb.eod_trade_risk_manual.Find(intid); return View(r); } } public ActionResult eod_trade_risk_manualEdit2(int TradeId, DateTime ValueDate, double Margin) { ViewBag.TradeId = TradeId; ViewBag.ValueDate = ValueDate; ViewBag.Margin = Margin.ToString("#0.0000"); return View(); } [HttpPost] public JsonResult eod_trade_risk_manual_margin(eod_trade_risk_manualDto req) { new EodTradeRiskManualService(CurUser).SaveEodTradePositionMargin(req); return JsonSuccess(); } [HttpPost] public JsonResult eod_trade_risk_manualQuery(eod_trade_risk_manualReq req) { var sList = new EodTradeRiskManualService(CurUser).SearchEodTradeRiskManualList(req); return Json(sList); } [HttpPost] public JsonResult eod_trade_risk_manualEditJson(eod_trade_risk_manualDto req) { var r = new EodTradeRiskManualService(CurUser).SaveEodTradeRiskManual(req); if (r == null) { return JsonError("估值日期不能重复"); } return JsonSuccess("更新成功", r); } [HttpPost] public JsonResult eod_trade_risk_manualEditJsonByType(eod_trade_risk_manualDto req) { var r = new EodTradeRiskManualService(CurUser).SaveEodTradeRiskManualByType(req); if (r == null) { return JsonError("估值日期不能重复"); } return JsonSuccess("更新成功", r); } public JsonResult eod_trade_risk_manualDelete(List ids) { var riskManuals = yldb.eod_trade_risk_manual.Where(x => ids.Contains(x.id)); yldb.eod_trade_risk_manual.RemoveRange(riskManuals); yldb.SaveChanges(); return JsonSuccess("删除成功"); } [MyAuthorize("交易管理-批量风险维护")] public ActionResult eod_trade_risk_manualUpload(bool isByType) { ViewBag.IsByType = isByType; return View(); } [MyAuthorize("交易管理-批量风险维护")] public ActionResult UploadEodTradeRiskManualExcel(IFormFile file) { try { var excelHelper = new YLErp.Commons.ExcelHelper(); using var stream = file.OpenReadStream(); var eodTradeRiskManuals = excelHelper.ExcelToDataTable(stream, null, true); Dictionary keyValuePairs = new Dictionary(); for (var i = 0; i < eodTradeRiskManuals.Rows.Count; i++) { var tradeNum = string.Empty; var valueDateStr = string.Empty; DateTime valueDate; for (var j = 0; j < eodTradeRiskManuals.Columns.Count; j++) { switch (eodTradeRiskManuals.Columns[j].ColumnName) { case "交易编号": tradeNum = eodTradeRiskManuals.Rows[i][j].ToString(); break; case "估值日期": if (DateTime.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out valueDate)) { valueDateStr = valueDate.ToString("yyyy-MM-dd"); } break; default: break; } } var key = string.Format("{0}_{1}", tradeNum, valueDateStr); if (keyValuePairs.ContainsKey(key)) { keyValuePairs[key]++; } else { keyValuePairs.Add(key, 1); } } var errorKeyP = keyValuePairs.Where(p => p.Value > 1).ToDictionary(p => p.Key, v => v.Value); if (errorKeyP.Keys.Any()) { var errorMsg = new StringBuilder("存在交易编号和日期相同的重复记录,请先删除重复记录后在继续导入,提示信息格式(交易编号_日期),提示信息:"); errorMsg.Append(string.Join(",", errorKeyP.Keys)); return JsonError(errorMsg.ToString()); } var TradeNumber = string.Empty; int TradeId; var ValueDate = DateTime.MinValue; double? Pv = null; double? Margin = null; double? Delta = null; double? Gamma = null; double? Vega = null; double? Theta = null; double? Rho = null; double? Spv1 = null; double? Spv2 = null; double? Spv3 = null; var rowNum = 0; for (var i = 0; i < eodTradeRiskManuals.Rows.Count; i++) { rowNum = i + 2; for (var j = 0; j < eodTradeRiskManuals.Columns.Count; j++) { switch (eodTradeRiskManuals.Columns[j].ColumnName) { case "交易编号": TradeNumber = eodTradeRiskManuals.Rows[i][j].ToString(); break; case "估值日期": DateTime.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out ValueDate); break; case "持仓市值": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var pv)) { Pv = pv; } else { Pv = null; } break; case "预付金": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var margin)) { Margin = margin; } else { Margin = null; } break; case "Delta": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var delta)) { Delta = delta; } else { Delta = null; } break; case "Gamma": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var gamma)) { Gamma = gamma; } else { Gamma = null; } break; case "Vega": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var vega)) { Vega = vega; } else { Vega = null; } break; case "Theta": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var theta)) { Theta = theta; } else { Theta = null; } break; case "Rho": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var rho)) { Rho = rho; } else { Rho = null; } break; case "市值1": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var spv1)) { Spv1 = spv1; } else { Spv1 = null; } break; case "市值2": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var spv2)) { Spv2 = spv2; } else { Spv2 = null; } break; case "市值3": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var spv3)) { Spv3 = spv3; } else { Spv3 = null; } break; default: break; } } //必填项验证 var nullColumnName = ""; if (string.IsNullOrWhiteSpace(TradeNumber)) { nullColumnName += "交易编号,"; } if (ValueDate == DateTime.MinValue) { nullColumnName += "估值日期,"; } if (!string.IsNullOrWhiteSpace(nullColumnName)) { return JsonError("第" + rowNum + "行数据" + nullColumnName.Substring(0, nullColumnName.Length - 1) + "为必填项,导入失败"); } var trade = yldb.trade.FirstOrDefault(x => x.TradeNumber == TradeNumber); if (trade == null) { return JsonError("第" + rowNum + "行交易不存在,导入失败"); } else { TradeId = trade.id; } if (ValueDate < trade.TradeDate) { throw new ServiceException($"估值日期'{ValueDate:yyyy-MM-dd}'必须大于等于交易开始日'{trade.TradeDate:yyyy-MM-dd}'"); } if (trade.ExerciseDate.HasValue && ValueDate > trade.ExerciseDate.Value) { throw new ServiceException($"估值日期'{ValueDate:yyyy-MM-dd}'必须小于等于交易到期日'{trade.ExerciseDate.Value:yyyy-MM-dd}'"); } var existEodTradeRiskManual = yldb.eod_trade_risk_manual.FirstOrDefault(x => x.TradeId == TradeId && x.ValueDate == ValueDate && string.IsNullOrEmpty(x.VolType)); if (existEodTradeRiskManual == null) { var eodTradeRiskManual = new eod_trade_risk_manual() { TradeId = TradeId, ValueDate = ValueDate, Margin = Margin, OptDate = DateTime.Now, OptId = CurUser.UserId, OptName = CurUser.UserName, Spv1 = Spv1, Spv2 = Spv2, Spv3 = Spv3, Pv = Pv, Delta = Delta, Gamma = Gamma, Vega = Vega, Theta = Theta, Rho = Rho, }; yldb.eod_trade_risk_manual.Add(eodTradeRiskManual); } else { existEodTradeRiskManual.Pv = Pv; existEodTradeRiskManual.Delta = Delta; existEodTradeRiskManual.Gamma = Gamma; existEodTradeRiskManual.Vega = Vega; existEodTradeRiskManual.Theta = Theta; existEodTradeRiskManual.Rho = Rho; if (Margin != null) { existEodTradeRiskManual.Margin = Margin; } existEodTradeRiskManual.OptDate = DateTime.Now; existEodTradeRiskManual.OptId = CurUser.UserId; existEodTradeRiskManual.OptName = CurUser.UserName; existEodTradeRiskManual.Spv1 = Spv1; existEodTradeRiskManual.Spv2 = Spv2; existEodTradeRiskManual.Spv3 = Spv3; } } yldb.SaveChanges(); } catch (Exception ex) { LogFactory.GetLogger().Error("UploadEodTradeRiskManualExcel", ex); return JsonError(ex.Message); } return JsonSuccess("导入自定义交易风险成功"); } [MyAuthorize("交易管理-批量风险维护")] public ActionResult UploadEodTradeRiskManualExcelByType(IFormFile file) { try { var excelHelper = new YLErp.Commons.ExcelHelper(); using var stream = file.OpenReadStream(); var eodTradeRiskManuals = excelHelper.ExcelToDataTable(stream, null, true); Dictionary keyValuePairs = new Dictionary(); for (var i = 0; i < eodTradeRiskManuals.Rows.Count; i++) { var tradeNum = string.Empty; var valueDateStr = string.Empty; var volType = string.Empty; var settlementType = string.Empty; DateTime valueDate; for (var j = 0; j < eodTradeRiskManuals.Columns.Count; j++) { switch (eodTradeRiskManuals.Columns[j].ColumnName) { case "交易编号": tradeNum = eodTradeRiskManuals.Rows[i][j].ToString(); break; case "估值日期": if (DateTime.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out valueDate)) { valueDateStr = valueDate.ToString("yyyy-MM-dd"); } break; case "波动率类型": volType = eodTradeRiskManuals.Rows[i][j].ToString(); if (string.IsNullOrEmpty(volType)) { return JsonError("波动率类型不能为空"); } break; case "价格类型": settlementType = eodTradeRiskManuals.Rows[i][j].ToString(); if (string.IsNullOrEmpty(settlementType)) { return JsonError("价格类型不能为空"); } break; default: break; } } var key = string.Format("{0}_{1}_{2}_{3}", tradeNum, valueDateStr, volType, settlementType); if (keyValuePairs.ContainsKey(key)) { keyValuePairs[key]++; } else { keyValuePairs.Add(key, 1); } } var errorKeyP = keyValuePairs.Where(p => p.Value > 1).ToDictionary(p => p.Key, v => v.Value); if (errorKeyP.Keys.Any()) { var errorMsg = new StringBuilder("存在交易编号,日期,波动率类型和结算类型都相同的重复记录,请先删除重复记录后在继续导入,提示信息格式(交易编号_日期_波动率类型_结算类型),提示信息:"); errorMsg.Append(string.Join(",", errorKeyP.Keys)); return JsonError(errorMsg.ToString()); } var TradeNumber = string.Empty; int TradeId; var ValueDate = DateTime.MinValue; string VolType = null; var SettlementType = SettlementTypeEnum.ClosePrice; double? Pv = null; double? Margin = null; double? Delta = null; double? Gamma = null; double? Vega = null; double? Theta = null; double? Rho = null; var rowNum = 0; for (var i = 0; i < eodTradeRiskManuals.Rows.Count; i++) { rowNum = i + 2; for (var j = 0; j < eodTradeRiskManuals.Columns.Count; j++) { switch (eodTradeRiskManuals.Columns[j].ColumnName) { case "交易编号": TradeNumber = eodTradeRiskManuals.Rows[i][j].ToString(); break; case "估值日期": DateTime.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out ValueDate); break; case "波动率类型": VolType = eodTradeRiskManuals.Rows[i][j].ToString(); break; case "价格类型": var st = eodTradeRiskManuals.Rows[i][j].ToString(); SettlementType = ConsGlobal.SettlePriceMode.GetSettlementType(st); break; case "持仓市值": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var pv)) { Pv = pv; } else { Pv = null; } break; case "预付金": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var margin)) { Margin = margin; } else { Margin = null; } break; case "Delta": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var delta)) { Delta = delta; } else { Delta = null; } break; case "Gamma": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var gamma)) { Gamma = gamma; } else { Gamma = null; } break; case "Vega": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var vega)) { Vega = vega; } else { Vega = null; } break; case "Theta": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var theta)) { Theta = theta; } else { Theta = null; } break; case "Rho": if (double.TryParse(eodTradeRiskManuals.Rows[i][j].ToString(), out var rho)) { Rho = rho; } else { Rho = null; } break; default: break; } } //必填项验证 var nullColumnName = ""; if (string.IsNullOrWhiteSpace(TradeNumber)) { nullColumnName += "交易编号,"; } if (ValueDate == DateTime.MinValue) { nullColumnName += "估值日期,"; } if (!string.IsNullOrWhiteSpace(nullColumnName)) { return JsonError("第" + rowNum + "行数据" + nullColumnName.Substring(0, nullColumnName.Length - 1) + "为必填项,导入失败"); } var trade = yldb.trade.FirstOrDefault(x => x.TradeNumber == TradeNumber); if (trade == null) { return JsonError("第" + rowNum + "行交易不存在,导入失败"); } else { TradeId = trade.id; } if (ValueDate < trade.TradeDate) { throw new ServiceException($"估值日期'{ValueDate:yyyy-MM-dd}'必须大于等于交易开始日'{trade.TradeDate:yyyy-MM-dd}'"); } if (trade.ExerciseDate.HasValue && ValueDate > trade.ExerciseDate.Value) { throw new ServiceException($"估值日期'{ValueDate:yyyy-MM-dd}'必须小于等于交易到期日'{trade.ExerciseDate.Value:yyyy-MM-dd}'"); } var existEodTradeRiskManual = yldb.eod_trade_risk_manual.FirstOrDefault(x => x.TradeId == TradeId && x.ValueDate == ValueDate && x.VolType == VolType && x.SettlementType == SettlementType); if (existEodTradeRiskManual == null) { var eodTradeRiskManual = new eod_trade_risk_manual() { TradeId = TradeId, ValueDate = ValueDate, VolType = VolType, SettlementType = SettlementType, Margin = Margin, OptDate = DateTime.Now, OptId = CurUser.UserId, OptName = CurUser.UserName, Pv = Pv, Delta = Delta, Gamma = Gamma, Vega = Vega, Theta = Theta, Rho = Rho, }; yldb.eod_trade_risk_manual.Add(eodTradeRiskManual); } else { existEodTradeRiskManual.Pv = Pv; existEodTradeRiskManual.Delta = Delta; existEodTradeRiskManual.Gamma = Gamma; existEodTradeRiskManual.Vega = Vega; existEodTradeRiskManual.Theta = Theta; existEodTradeRiskManual.Rho = Rho; if (Margin != null) { existEodTradeRiskManual.Margin = Margin; } existEodTradeRiskManual.OptDate = DateTime.Now; existEodTradeRiskManual.OptId = CurUser.UserId; existEodTradeRiskManual.OptName = CurUser.UserName; } } yldb.SaveChanges(); } catch (Exception ex) { LogFactory.GetLogger().Error("UploadEodTradeRiskManualExcel", ex); return JsonError(ex.Message); } return JsonSuccess("导入自定义交易风险成功"); } } }