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(); 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(); 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 GetAllRuleType() { var ruleTypeList = new List(); 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(){ 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; } } }