Files
zszq-trs/YLErpWeb/Controllers/eod_trade_risk_manualController.cs
2024-05-09 14:06:26 +08:00

672 lines
28 KiB
C#

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<int> 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<string, int> keyValuePairs = new Dictionary<string, int>();
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<eod_trade_risk_manualController>().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<string, int> keyValuePairs = new Dictionary<string, int>();
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<eod_trade_risk_manualController>().Error("UploadEodTradeRiskManualExcel", ex);
return JsonError(ex.Message);
}
return JsonSuccess("导入自定义交易风险成功");
}
}
}