531 lines
23 KiB
C#
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;
|
|
}
|
|
|
|
|
|
}
|
|
} |