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

531 lines
23 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using YLErp.BLL;
using YLErp.Configuration;
using YLErp.DBModels;
using YLErp.Enums;
using YLErp.Modules.MarginModule;
namespace YLErp.Web.Controllers
{
public class margin_template_v2Controller : BaseController
{
[MyAuthorize("基础参数管理-预付金模板V2")]
public ActionResult margin_template_v2List()
{
if (PS.Config.Company != CompanyEnum.广发商贸)
{
return View();
}
return Redirect("margin_template_v2ClientList");
}
[MyAuthorize("基础参数管理-预付金模板V2")]
public ActionResult margin_template_v2DefaultList()
{
return View();
}
[MyAuthorize("基础参数管理-预付金模板V2")]
public ActionResult margin_template_v2ClientList()
{
return View();
}
[HttpPost]
public JsonResult margin_template_v2GroupQuery(margin_template_v2Req req)
{
req.IsDefault = false;
req.IsForClient = false;
var sList = new MarginTemplateService(CurUser).SearchMarginTemplateV2List(req);
return Json(sList);
}
[HttpPost]
public JsonResult margin_template_v2GroupDefaultQuery(margin_template_v2Req req)
{
req.IsDefault = true;
req.IsForClient = false;
var sList = new MarginTemplateService(CurUser).SearchMarginTemplateV2List(req);
return Json(sList);
}
[HttpPost]
public JsonResult margin_template_v2GroupClientQuery(margin_template_v2Req req)
{
req.IsDefault = true;
req.IsForClient = true;
var sList = new MarginTemplateService(CurUser).SearchMarginTemplateV2List(req);
return Json(sList);
}
public ActionResult margin_template_v2DefaultEdit(string enid)
{
if (string.IsNullOrEmpty(enid) || enid == "0")
{
return View(new margin_template_v2() { ValueDate = valuedateBLL.ValueDate, RuleType = (int)MarginRuleTypeEnum.无预付金, Comments = "预付金占用为零。", IsValid = true });
}
var intid = DecryptInt(enid);
var r = yldb.margin_template_v2.AsNoTracking().FirstOrDefault(n => n.id == intid);
if (r == null)
{
return ShowError("数据不存在");
}
r.Details = yldb.margin_template_detail.Where(x => x.MarginTemplateId == r.id).OrderBy(x => x.ValueDate).ToList();
if (!r.Details.Any())
{
r.Details.Add(new margin_template_detail() { ValueDate = new DateTime(2020, 1, 1) });
}
r.LatestValueDate = r.Details.LastOrDefault()?.ValueDate;
return View(r);
}
public ActionResult margin_template_v2DefaultCopy(string enid)
{
var intid = DecryptInt(enid);
var r = yldb.margin_template_v2.AsNoTracking().FirstOrDefault(n => n.id == intid);
if (r == null)
{
return ShowError("数据不存在");
}
r.Details = yldb.margin_template_detail.Where(x => x.MarginTemplateId == r.id).OrderBy(x => x.ValueDate).ToList();
r.id = 0;
if (!r.Details.Any())
{
r.Details.Add(new margin_template_detail() { ValueDate = new DateTime(2020, 1, 1) });
}
else
{
r.Details.ForEach(x =>
{
x.MarginTemplateId = 0;
x.id = 0;
});
}
r.LatestValueDate = r.Details.LastOrDefault()?.ValueDate;
return View("margin_template_v2DefaultEdit", r);
}
public ActionResult margin_template_v2ClientEdit(string enid)
{
if (string.IsNullOrEmpty(enid) || enid == "0")
{
if (PS.Config.Company == CompanyEnum.广发商贸)
{
return View(new margin_template_v2() { ValueDate = new DateTime(2020, 1, 1), RuleType = (int)MarginRuleTypeEnum.默认预付金规则, Comments = "考虑了14种场景下的Span算法与Delta算法比较的通用预付金规则,该规则可以调整Span涨跌幅度", IsValid = true });
}
return View(new margin_template_v2() { ValueDate = new DateTime(2020, 1, 1), RuleType = (int)MarginRuleTypeEnum.触发条件预付金规则1, Comments = "预付金占用为成交名义本金的固定比例,加标的跌幅的市值(跌幅达到一定条件触发)", IsValid = true });
}
var intid = DecryptInt(enid);
var r = yldb.margin_template_v2.AsNoTracking().FirstOrDefault(n => n.id == intid);
if (r == null)
{
return ShowError("数据不存在");
}
r.Details = yldb.margin_template_detail.Where(x => x.MarginTemplateId == r.id).OrderBy(x => x.ValueDate).ToList();
if (!r.Details.Any())
{
r.Details.Add(new margin_template_detail() { ValueDate = new DateTime(2020, 1, 1) });
}
r.LatestValueDate = r.Details.LastOrDefault()?.ValueDate;
return View(r);
}
public ActionResult margin_template_v2ClientCopy(string enid)
{
var intid = DecryptInt(enid);
var r = yldb.margin_template_v2.AsNoTracking().FirstOrDefault(n => n.id == intid);
if (r == null)
{
return ShowError("数据不存在");
}
r.Details = yldb.margin_template_detail.Where(x => x.MarginTemplateId == r.id).OrderBy(x => x.ValueDate).ToList();
r.id = 0;
if (!r.Details.Any())
{
r.Details.Add(new margin_template_detail() { ValueDate = new DateTime(2020, 1, 1) });
}
else
{
r.Details.ForEach(x =>
{
x.MarginTemplateId = 0;
x.id = 0;
});
}
r.LatestValueDate = r.Details.LastOrDefault()?.ValueDate;
return View("margin_template_v2ClientEdit", r);
}
public ActionResult margin_template_v2Edit(string enid)
{
if (string.IsNullOrEmpty(enid) || enid == "0")
{
return View(new margin_template_v2() { ValueDate = new DateTime(2020, 1, 1), RuleType = (int)MarginRuleTypeEnum.无预付金, Comments = "预付金占用为零。", IsValid = true });
}
var intid = DecryptInt(enid);
var r = yldb.margin_template_v2.AsNoTracking().FirstOrDefault(n => n.id == intid);
if (r == null)
{
return ShowError("数据不存在");
}
r.Details = yldb.margin_template_detail.Where(x => x.MarginTemplateId == r.id).OrderBy(x => x.ValueDate).ToList();
if (!r.Details.Any())
{
r.Details.Add(new margin_template_detail() { ValueDate = new DateTime(2020, 1, 1) });
}
r.LatestValueDate = r.Details.LastOrDefault()?.ValueDate;
return View(r);
}
public ActionResult margin_template_v2Copy(string enid)
{
var intid = DecryptInt(enid);
var r = yldb.margin_template_v2.AsNoTracking().FirstOrDefault(n => n.id == intid);
if (r == null)
{
return ShowError("数据不存在");
}
r.Details = yldb.margin_template_detail.Where(x => x.MarginTemplateId == r.id).OrderBy(x => x.ValueDate).ToList();
r.id = 0;
if (!r.Details.Any())
{
r.Details.Add(new margin_template_detail() { ValueDate = new DateTime(2020, 1, 1) });
}
else
{
r.Details.ForEach(x =>
{
x.MarginTemplateId = 0;
x.id = 0;
});
}
r.LatestValueDate = r.Details.LastOrDefault()?.ValueDate;
return View("margin_template_v2Edit", r);
}
public JsonResult margin_template_v2Delete(string enid)
{
var intid = DecryptInt(enid);
var tradeMarginTemplates = yldb.trade_margin_template.Where(x => x.MarginTemplateId == intid);
if (tradeMarginTemplates.Any())
{
throw new Exception("该自定义预付金规则已经有交易使用了,不可被删除");
}
else
{
var marginTemplate = yldb.margin_template_v2.Find(intid);
if (marginTemplate != null)
{
yldb.margin_template_v2.Remove(marginTemplate);
yldb.SaveChanges();
}
}
return JsonSuccess("删除成功");
}
[HttpPost]
public JsonResult saveMarginTemplateV2(margin_template_v2 marginTemplate)
{
try
{
if (string.IsNullOrEmpty(marginTemplate.TradeTypes))
{
throw new Exception("默认规则的适用结构不能为空");
}
if (yldb.margin_template_v2.Any(x => x.id != marginTemplate.id && x.Name == marginTemplate.Name && x.IsDefault == marginTemplate.IsDefault && x.IsForClient == marginTemplate.IsForClient))
{
throw new Exception("不能取重复的预付金名称");
}
if (marginTemplate.IsDefault && !marginTemplate.IsForClient && marginTemplate.IsValid)
{
//一套规则多套默认参数的互斥验证
if (marginTemplate.DefaultParameterType != 0)
{
//验证不同规则是否已经存在该交易类型
var marginTemplateDefault = yldb.margin_template_v2.Where(x => x.id != marginTemplate.id && x.IsDefault && x.IsValid && !x.IsForClient && x.RuleType != marginTemplate.RuleType && x.ValueDate == marginTemplate.ValueDate);
var existTradeTypes = marginTemplateDefault.Select(x => x.TradeTypes).ToList();
var tradeTypes = new List<string>();
existTradeTypes.ForEach(x => tradeTypes.AddRange(x.Split(',')));
//验证相同规则相同的默认参数类型,是否包含相同的适用结构
var sameRuleParameterRecord = yldb.margin_template_v2.FirstOrDefault(x => x.id != marginTemplate.id && x.IsDefault && x.IsValid && !x.IsForClient && x.RuleType == marginTemplate.RuleType && x.DefaultParameterType == marginTemplate.DefaultParameterType && (x.BuySellType & marginTemplate.BuySellType) > 0 && (x.MarginScenarios & marginTemplate.MarginScenarios) > 0 && x.ValueDate == marginTemplate.ValueDate);
if (sameRuleParameterRecord != null)
{
tradeTypes.AddRange(sameRuleParameterRecord.TradeTypes.Split(','));
}
tradeTypes.ForEach(x =>
{
if (marginTemplate.TradeTypes.Contains(x))
{
throw new Exception("默认规则同一天不能有重复的适用结构:" + x);
}
});
}
else
{
var marginTemplateDefault = yldb.margin_template_v2.Where(x => x.id != marginTemplate.id && x.IsDefault && x.IsValid && !x.IsForClient && (x.BuySellType & marginTemplate.BuySellType) > 0 && (x.MarginScenarios & marginTemplate.MarginScenarios) > 0 && x.ValueDate == marginTemplate.ValueDate);
var existTradeTypes = marginTemplateDefault.Select(x => x.TradeTypes).ToList();
var tradeTypes = new List<string>();
existTradeTypes.ForEach(x => tradeTypes.AddRange(x.Split(',')));
tradeTypes.ForEach(x =>
{
if (marginTemplate.TradeTypes.Contains(x))
{
throw new Exception("默认规则不能有相同的适用结构:" + x);
}
});
}
}
if (marginTemplate.Details.Count() > 1)
{
var underlyingType = UnderlyingTypeEnum.None;
foreach (var detail in marginTemplate.Details)
{
if (detail.UnderlyingType == UnderlyingTypeEnum.None)
{
throw new Exception("标的类型不能为空");
}
if ((detail.UnderlyingType & underlyingType) > 0)
{
throw new Exception("存在重复的标的类型:" + UnderlyingTypeUtil.GetDesc(detail.UnderlyingType & underlyingType));
}
underlyingType |= detail.UnderlyingType;
}
}
if (PS.Config.Company == CompanyEnum.广发商贸)
{
if (marginTemplate.Details.Count() > 0)
{
if (marginTemplate.Details[0].SpanConfig.InitialMarginFactor < 0 || marginTemplate.Details[0].SpanConfig.CoefficientFactor < 0)
{
throw new Exception("只能填入大于等于0的数字");
}
}
}
var isAddNew = marginTemplate.id == 0;
if (isAddNew)
{
marginTemplate.OptDate = DateTime.Now;
marginTemplate.OptId = CurUser.UserId;
marginTemplate.OptName = CurUser.UserName;
yldb.margin_template_v2.Add(marginTemplate);
}
else
{
var r = yldb.margin_template_v2.Find(marginTemplate.id);
r.BuySellType = marginTemplate.BuySellType;
r.MarginScenarios = marginTemplate.MarginScenarios;
r.UnderlyingSeperateType = marginTemplate.UnderlyingSeperateType;
r.UnderlyingSeperateComments = marginTemplate.UnderlyingSeperateComments;
r.IsValid = marginTemplate.IsValid;
r.ValueDate = marginTemplate.ValueDate;
r.MarginType = marginTemplate.MarginType;
r.Name = marginTemplate.Name;
r.IsDefault = marginTemplate.IsDefault;
r.IsForClient = marginTemplate.IsForClient;
r.Comments = marginTemplate.Comments;
r.RuleType = marginTemplate.RuleType;
r.TradeTypes = marginTemplate.TradeTypes;
r.OptDate = DateTime.Now;
r.OptId = CurUser.UserId;
r.OptName = CurUser.UserName;
}
var detailIds = marginTemplate.Details.Select(x => x.id).ToArray();
var details = yldb.margin_template_detail.Where(x => !detailIds.Contains(x.id) && x.MarginTemplateId == marginTemplate.id);
yldb.margin_template_detail.RemoveRange(details);
yldb.SaveChanges();
marginTemplate.Details.ForEach(x =>
{
var detail = yldb.margin_template_detail.Find(x.id);
if (detail == null)
{
detail = new margin_template_detail();
yldb.margin_template_detail.Add(detail);
}
detail.MarginTemplateId = marginTemplate.id;
detail.GroupRatio = x.GroupRatio;
detail.MarginRatio1 = x.MarginRatio1;
detail.MarginRatio2 = x.MarginRatio2;
detail.MarginRatio3 = x.MarginRatio3;
detail.MarginRatio4 = x.MarginRatio4;
detail.IsIntrinsicValue = x.IsIntrinsicValue;
detail.PriceLimitType = x.PriceLimitType;
detail.UsePositionStockEqvNotional = x.UsePositionStockEqvNotional;
detail.PositionUnderlyingAmount = x.PositionUnderlyingAmount;
detail.RedeemPriceLimit = x.RedeemPriceLimit;
detail.RedeemPriceMax = x.RedeemPriceMax;
detail.IsUseStrike = x.IsUseStrike;
detail.IsNeedCompare = x.IsNeedCompare;
detail.IsUsePriceLimit = x.IsUsePriceLimit;
detail.SingleStockEqvNotional = x.SingleStockEqvNotional;
detail.StockEqvNotional = x.StockEqvNotional;
detail.UnderlyingType = x.UnderlyingType;
detail.ComparedInitialMarginRate = x.ComparedInitialMarginRate;
detail.OptDate = DateTime.Now;
detail.OptId = CurUser.UserId;
detail.OptName = CurUser.UserName;
detail.SpanConfigJson = JsonHelper.Serialize(x.SpanConfig);
yldb.SaveChanges();
});
return JsonSuccess("更新成功");
}
catch (Exception ex)
{
return JsonError(ex.Message);
}
}
[HttpPost]
public JsonResult deleteEditmargin_template_v2(string enid)
{
var id = DataProtectHelper.DecryptInt(enid);
var r = yldb.margin_template_v2.Find(id);
if (r == null)
{
return JsonError("删除失败,找不到该预付金规则");
}
yldb.margin_template_v2.Remove(r);
var details = yldb.margin_template_detail.Where(x => x.MarginTemplateId == r.id);
if (details.Any())
{
yldb.margin_template_detail.RemoveRange(details);
}
yldb.SaveChanges();
return JsonSuccess("删除成功");
}
public static List<SelectListItem> GetAllRuleType()
{
var ruleTypeList = new List<SelectListItem>();
if (PS.Config.Is厦门象屿)
{
ruleTypeList.Add(new SelectListItem()
{
Text = MarginRuleTypeEnum.无预付金.ToString(),
Value = ((int)MarginRuleTypeEnum.无预付金).ToString()
});
ruleTypeList.Add(new SelectListItem()
{
Text = MarginRuleTypeEnum.交易所基本规则.ToString(),
Value = ((int)MarginRuleTypeEnum.交易所基本规则).ToString()
});
}
else
{
ruleTypeList.AddRange(new List<SelectListItem>(){
new SelectListItem()
{
Text = MarginRuleTypeEnum.无预付金.ToString(),
Value = ((int)MarginRuleTypeEnum.无预付金).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.按固定利率.ToString(),
Value = ((int)MarginRuleTypeEnum.按固定利率).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.按浮动盈亏.ToString(),
Value = ((int)MarginRuleTypeEnum.按浮动盈亏).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.类香草预付金规则.ToString(),
Value = ((int)MarginRuleTypeEnum.类香草预付金规则).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.自动赎回买入预付金规则.ToString(),
Value = ((int)MarginRuleTypeEnum.自动赎回买入预付金规则).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.触发条件预付金规则1.ToString(),
Value = ((int)MarginRuleTypeEnum.触发条件预付金规则1).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.触发条件预付金规则2.ToString(),
Value = ((int)MarginRuleTypeEnum.触发条件预付金规则2).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.保底预付金规则.ToString(),
Value = ((int)MarginRuleTypeEnum.保底预付金规则).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.含赔付预付金计算规则.ToString(),
Value = ((int)MarginRuleTypeEnum.含赔付预付金计算规则).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.触发条件预付金规则3.ToString(),
Value = ((int)MarginRuleTypeEnum.触发条件预付金规则3).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.标准SPAN.ToString(),
Value = ((int)MarginRuleTypeEnum.标准SPAN).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.买入自动赎回规则1.ToString(),
Value = ((int)MarginRuleTypeEnum.买入自动赎回规则1).ToString()
},
new SelectListItem()
{
Text = MarginRuleTypeEnum.卖出自动赎回规则1.ToString(),
Value = ((int)MarginRuleTypeEnum.卖出自动赎回规则1).ToString()
}
});
}
if (PS.Config.Company == CompanyEnum.宏源)
{
ruleTypeList.Add(new SelectListItem()
{
Text = MarginRuleTypeEnum.单独计算规则.ToString(),
Value = ((int)MarginRuleTypeEnum.单独计算规则).ToString()
});
}
return ruleTypeList;
}
}
}