diff --git a/Framework/YLErp.Core/DBModels/margin_template_v2.cs b/Framework/YLErp.Core/DBModels/margin_template_v2.cs index d6639004..bf4a5718 100644 --- a/Framework/YLErp.Core/DBModels/margin_template_v2.cs +++ b/Framework/YLErp.Core/DBModels/margin_template_v2.cs @@ -164,6 +164,10 @@ namespace YLErp.DBModels { return MarginRuleTypeEnum.卖出自动赎回规则1.ToString(); } + else if (RuleType == (int)MarginRuleTypeEnum.区间追保结构) + { + return MarginRuleTypeEnum.区间追保结构.ToString(); + } return ""; } diff --git a/Framework/YLErp.Core/Enums/MarginRuleTypeEnum.cs b/Framework/YLErp.Core/Enums/MarginRuleTypeEnum.cs index 2909cc28..3d365ef8 100644 --- a/Framework/YLErp.Core/Enums/MarginRuleTypeEnum.cs +++ b/Framework/YLErp.Core/Enums/MarginRuleTypeEnum.cs @@ -16,6 +16,8 @@ 标准SPAN = 11, 买入自动赎回规则1 = 12, 卖出自动赎回规则1 = 13, + //otcdms 的 14 为 Delta计算规则,本系统不使用,区间追保结构从 15 开始避免与 otcdms 编号冲突 + 区间追保结构 = 15, 单独计算规则 = 98, 默认预付金规则 = 99 } diff --git a/Framework/YLErp.Core/Enums/UnderlyingSeperateTypeEnum.cs b/Framework/YLErp.Core/Enums/UnderlyingSeperateTypeEnum.cs index 0a6a093d..757a8838 100644 --- a/Framework/YLErp.Core/Enums/UnderlyingSeperateTypeEnum.cs +++ b/Framework/YLErp.Core/Enums/UnderlyingSeperateTypeEnum.cs @@ -15,6 +15,10 @@ namespace YLErp.Enums /// /// 按自定义权益分类 /// - CustomStock = 1 + CustomStock = 1, + /// + /// 按资产类型分类(区间追保结构使用,分类取值见 UnderlyingTypeEnum 中 ConsGlobal.InstrumentType 对应的标志位) + /// + CustomInstrumentType = 2 } } diff --git a/Framework/YLErp.Core/Enums/UnderlyingTypeEnum.cs b/Framework/YLErp.Core/Enums/UnderlyingTypeEnum.cs index c397619d..14ea43e2 100644 --- a/Framework/YLErp.Core/Enums/UnderlyingTypeEnum.cs +++ b/Framework/YLErp.Core/Enums/UnderlyingTypeEnum.cs @@ -31,6 +31,137 @@ namespace YLErp.Enums /// Other = 1 << 3, + /// + /// 利率债(按标的资产类型分类,对应 ConsGlobal.InstrumentType.TBonds) + /// + TBonds = 1 << 4, + + /// + /// 信用债(对应 ConsGlobal.InstrumentType.CreditBonds) + /// + CreditBonds = 1 << 5, + + /// + /// 其它债券(对应 ConsGlobal.InstrumentType.OtherBonds) + /// + OtherBonds = 1 << 6, + + //以下为"按资产类型分类"的其余资产类型,取值与 ConsGlobal.InstrumentType 一一对应 + /// + /// 股票 + /// + Stock = 1 << 7, + + /// + /// 股指 + /// + StockIndex = 1 << 8, + + /// + /// 股指期货 + /// + StockIF = 1 << 9, + + /// + /// 商品期货 + /// + CommodityFutures = 1 << 10, + + /// + /// 商品现货 + /// + CommoditySpot = 1 << 11, + + /// + /// 新三板挂牌股票 + /// + NewOtcStock = 1 << 12, + + /// + /// 香港股票 + /// + HKStock = 1 << 13, + + /// + /// 香港股指 + /// + HKStockIndex = 1 << 14, + + /// + /// 基金及基金专户 + /// + Fund = 1 << 15, + + /// + /// 黄金期货 + /// + GoldFutures = 1 << 16, + + /// + /// 国债期货 + /// + TBFutures = 1 << 17, + + /// + /// 其他期货 + /// + OtherFutures = 1 << 18, + + /// + /// 黄金现货 + /// + GoldSpot = 1 << 19, + + /// + /// 其他现货 + /// + OtherSpot = 1 << 20, + + /// + /// 境外期货 + /// + AbroadFutures = 1 << 21, + + /// + /// 境外现货 + /// + AbroadSpot = 1 << 22, + + /// + /// 境外股票 + /// + AbroadStock = 1 << 23, + + /// + /// 境外股指 + /// + AbroadStockIndex = 1 << 24, + + /// + /// 汇率 + /// + ExRate = 1 << 25, + + /// + /// Shibor + /// + Shibor = 1 << 26, + + /// + /// 银行间回购定盘 + /// + FixingRepoRate = 1 << 27, + + /// + /// 利率收益率 + /// + RateYield = 1 << 28, + + /// + /// 债券指数 + /// + BondIndex = 1 << 29, + /// /// 全部 /// @@ -59,14 +190,66 @@ namespace YLErp.Enums return "个股/ETF-非核准制发行"; case UnderlyingTypeEnum.Other: return "其他"; + case UnderlyingTypeEnum.TBonds: + return "利率债"; + case UnderlyingTypeEnum.CreditBonds: + return "信用债"; + case UnderlyingTypeEnum.OtherBonds: + return "其它债券"; + case UnderlyingTypeEnum.Stock: + return "股票"; + case UnderlyingTypeEnum.StockIndex: + return "股指"; + case UnderlyingTypeEnum.StockIF: + return "股指期货"; + case UnderlyingTypeEnum.CommodityFutures: + return "商品期货"; + case UnderlyingTypeEnum.CommoditySpot: + return "商品现货"; + case UnderlyingTypeEnum.NewOtcStock: + return "新三板挂牌股票"; + case UnderlyingTypeEnum.HKStock: + return "香港股票"; + case UnderlyingTypeEnum.HKStockIndex: + return "香港股指"; + case UnderlyingTypeEnum.Fund: + return "基金及基金专户"; + case UnderlyingTypeEnum.GoldFutures: + return "黄金期货"; + case UnderlyingTypeEnum.TBFutures: + return "国债期货"; + case UnderlyingTypeEnum.OtherFutures: + return "其他期货"; + case UnderlyingTypeEnum.GoldSpot: + return "黄金现货"; + case UnderlyingTypeEnum.OtherSpot: + return "其他现货"; + case UnderlyingTypeEnum.AbroadFutures: + return "境外期货"; + case UnderlyingTypeEnum.AbroadSpot: + return "境外现货"; + case UnderlyingTypeEnum.AbroadStock: + return "境外股票"; + case UnderlyingTypeEnum.AbroadStockIndex: + return "境外股指"; + case UnderlyingTypeEnum.ExRate: + return "汇率"; + case UnderlyingTypeEnum.Shibor: + return "Shibor"; + case UnderlyingTypeEnum.FixingRepoRate: + return "银行间回购定盘"; + case UnderlyingTypeEnum.RateYield: + return "利率收益率"; + case UnderlyingTypeEnum.BondIndex: + return "债券指数"; default: break; } var nt = (int)type; - var list = new List(4); + var list = new List(8); - for (var i = 0; i <= 3; i++) + for (var i = 0; i <= 29; i++) { if ((nt & (1 << i)) > 0) { diff --git a/YLErpDAL/Model/ClientMarginTemplate.cs b/YLErpDAL/Model/ClientMarginTemplate.cs index ceb4fe89..3658616d 100644 --- a/YLErpDAL/Model/ClientMarginTemplate.cs +++ b/YLErpDAL/Model/ClientMarginTemplate.cs @@ -78,6 +78,10 @@ namespace YLErp.Model { return MarginRuleTypeEnum.卖出自动赎回规则1.ToString(); } + else if (MarginRuleType == (int)MarginRuleTypeEnum.区间追保结构) + { + return MarginRuleTypeEnum.区间追保结构.ToString(); + } return ""; } diff --git a/YLErpDAL/Model/TradeMarginTemplate.cs b/YLErpDAL/Model/TradeMarginTemplate.cs index b3f8a129..5579fe4e 100644 --- a/YLErpDAL/Model/TradeMarginTemplate.cs +++ b/YLErpDAL/Model/TradeMarginTemplate.cs @@ -84,6 +84,10 @@ namespace YLErp.Model { return MarginRuleTypeEnum.单独计算规则.ToString(); } + else if (MarginRuleType == (int)MarginRuleTypeEnum.区间追保结构) + { + return MarginRuleTypeEnum.区间追保结构.ToString(); + } return ""; } diff --git a/YLErpDAL/Modules/SwapModule/SwapMarginTemplateConfigService.cs b/YLErpDAL/Modules/SwapModule/SwapMarginTemplateConfigService.cs index 667670dd..27c10b4a 100644 --- a/YLErpDAL/Modules/SwapModule/SwapMarginTemplateConfigService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapMarginTemplateConfigService.cs @@ -11,21 +11,19 @@ namespace YLErp.Modules.SwapModule public static SwapMarginTemplateConfig GetConfig() { - using var db = new ErpBaseContext(); - var dictionaryId = db.Dictionaries - .Where(item => item.Name == DictionaryName) - .Select(item => item.Id) - .FirstOrDefault(); - var items = db.DictionaryItems - .Where(item => item.DictId == dictionaryId && !string.IsNullOrWhiteSpace(item.Name)) - .OrderBy(item => item.IndexNum) + //保证金模板V2迁移:交易页"保证金模板"下拉的选项改为"预付金模板V2"页面维护的模板(自定义+全局默认,存模板名称),不再使用数据字典 + using var db = new YLErp.BLL.YLContext(); + var items = db.margin_template_v2 + .Where(item => !item.IsForClient && item.IsValid) + .OrderBy(item => item.IsDefault).ThenBy(item => item.id) .Select(item => new SelectItem { Text = item.Name, Value = item.Name }) .ToArray(); return new SwapMarginTemplateConfig { options = items, - defaultValue = items.FirstOrDefault()?.Value + //不再默认选中任何模板,由用户在交易上显式选择;未选择则不绑定模板 + defaultValue = null }; } } diff --git a/YLErpDAL/Modules/SwapModule/SwapTradeService.cs b/YLErpDAL/Modules/SwapModule/SwapTradeService.cs index 26a57cee..2fc1fc87 100644 --- a/YLErpDAL/Modules/SwapModule/SwapTradeService.cs +++ b/YLErpDAL/Modules/SwapModule/SwapTradeService.cs @@ -113,6 +113,8 @@ namespace YLErp.Modules.SwapModule new SalesCommissionDetailDataService(this).RemoveTradeCommissionDetail(dbTrade.id); } } + //保证金模板V2迁移:按交易页选择的保证金模板(MarginTemplateName 存模板V2名称)维护交易模板绑定 + SyncTradeMarginTemplate(dbTrade); trans.Commit(); } finally @@ -123,6 +125,37 @@ namespace YLErp.Modules.SwapModule return dbTrade; } /// + /// 保证金模板V2迁移:按交易上选择的保证金模板(MarginTemplateName 存预付金模板V2的名称)维护 trade_margin_template 绑定。 + /// 未选择或名称匹配不到有效自定义模板时仅清除旧绑定,不新增(保持无预付金占用的现状)。 + /// + private void SyncTradeMarginTemplate(trade dbTrade) + { + var olds = DbContext.trade_margin_template.Where(x => x.TradeId == dbTrade.id).ToList(); + DbContext.trade_margin_template.RemoveRange(olds); + if (!string.IsNullOrWhiteSpace(dbTrade.MarginTemplateName)) + { + //匹配自定义+全局默认模板(重名时优先自定义) + var template = DbContext.margin_template_v2 + .Where(x => x.Name == dbTrade.MarginTemplateName && !x.IsForClient && x.IsValid) + .OrderBy(x => x.IsDefault) + .FirstOrDefault(); + if (template != null) + { + DbContext.trade_margin_template.Add(new trade_margin_template() + { + TradeId = dbTrade.id, + ValueDate = new DateTime(2000, 1, 1), + MarginTemplateId = template.id, + IsLatest = true, + OptId = UserId, + OptName = UserName, + OptDate = DateTime.Now + }); + } + } + DbContext.SaveChanges(); + } + /// /// 单标的生成开仓事件 /// /// diff --git a/YLErpWeb/App_Data/FunctionRight.xml b/YLErpWeb/App_Data/FunctionRight.xml index eccba1c4..9cfc6b58 100644 --- a/YLErpWeb/App_Data/FunctionRight.xml +++ b/YLErpWeb/App_Data/FunctionRight.xml @@ -42,6 +42,7 @@ + @@ -149,6 +150,7 @@ + @@ -186,6 +188,7 @@ + diff --git a/YLErpWeb/App_Data/Menus.txt b/YLErpWeb/App_Data/Menus.txt index 506f2a79..d64816df 100644 --- a/YLErpWeb/App_Data/Menus.txt +++ b/YLErpWeb/App_Data/Menus.txt @@ -66,12 +66,15 @@ {Name:"授信管理",Rights:["客户管理-授信管理"],Url:"credit/creditList"}, {Name:"资信评级",Rights:["客户管理-资信评级"],Url:"client_rating/List"}, {Name:"机构账号设置",Rights:["客户管理-机构账号设置"],Url:"v3/client/account"} + //保证金模板在交易页直接选择,客户预付金配置入口不展示(页面代码保留) + //{Name:"客户预付金配置",Rights:["客户管理-客户预付金配置"],Url:"client_margin_template/client_margin_templateList"}, ] }, {Name:"互换簿记预设",Rights:["互换簿记预设"],Icon:"menu-icon iconfour" ,SubItems:[ {Name:"TRS用簿记账户设置",Rights:["互换簿记预设-TRS用簿记账户设置"],Url:"EtradingRule/Index"}, - {Name:"互换预付金率维护",Rights:["互换簿记预设-互换预付金率维护"],Url:"ClientMarginConfig/ClientMarginConfigList"}, + //保证金模板V2迁移:互换预付金率维护入口下线,功能由"数据管理-预付金模板V2"替代,代码保留不删除 + //{Name:"互换预付金率维护",Rights:["互换簿记预设-互换预付金率维护"],Url:"ClientMarginConfig/ClientMarginConfigList"}, {Name:"阶梯费率",Rights:["互换簿记预设-阶梯费率"],Url:"SwapRate"}, {Name:"浮动利率",Rights:["互换簿记预设-浮动利率"],Url:"SwapFloatRate"}, {Name:"簿记账户与衡泰关系",Rights:["互换簿记预设-簿记账户与衡泰关系"],Url:"EtradeAccount/Index"}, @@ -87,6 +90,7 @@ {Name:"交易市场",Rights:["基础参数管理-交易市场"],Url:"market/marketList"}, {Name:"变更记录",Rights:["基础参数管理-变更记录"],Url:"Datatrace/ClientInfoChange"}, {Name:"设置货币",Rights:["基础参数管理-设置货币"],Url:"Currency/setCurrency"}, + {Name:"预付金模板V2",Rights:["基础参数管理-预付金模板V2"],Url:"margin_template_v2/margin_template_v2List"}, ] }, {Name:"系统管理",Rights:["系统管理"],Icon:"menu-icon iconten" diff --git a/YLErpWeb/Controllers/SwapTrade2Controller.cs b/YLErpWeb/Controllers/SwapTrade2Controller.cs index 78d7b2e2..4c8b06e0 100644 --- a/YLErpWeb/Controllers/SwapTrade2Controller.cs +++ b/YLErpWeb/Controllers/SwapTrade2Controller.cs @@ -256,12 +256,13 @@ namespace YLErp.Web.Controllers { return ShowError("没有找到交易数据"); } - var marginTemplateConfig = SwapMarginTemplateConfigService.GetConfig(); - if (string.IsNullOrWhiteSpace(tradeObj.MarginTemplateName) - || !marginTemplateConfig.options.Any(item => item.Value == tradeObj.MarginTemplateName)) - { - tradeObj.MarginTemplateName = marginTemplateConfig.defaultValue; - } + //保证金模板V2迁移:不再把非模板的历史值回退为默认值,MarginTemplateName 原样展示 + //var marginTemplateConfig = SwapMarginTemplateConfigService.GetConfig(); + //if (string.IsNullOrWhiteSpace(tradeObj.MarginTemplateName) + // || !marginTemplateConfig.options.Any(item => item.Value == tradeObj.MarginTemplateName)) + //{ + // tradeObj.MarginTemplateName = marginTemplateConfig.defaultValue; + //} TradeViewModel model; model = new TradeViewModel(tradeObj) diff --git a/YLErpWeb/Controllers/margin_template_v2Controller.cs b/YLErpWeb/Controllers/margin_template_v2Controller.cs index 31b0335f..60edfece 100644 --- a/YLErpWeb/Controllers/margin_template_v2Controller.cs +++ b/YLErpWeb/Controllers/margin_template_v2Controller.cs @@ -119,7 +119,10 @@ namespace YLErp.Web.Controllers { 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 }); + //预付金模板V2迁移:本部署(TRS)可选规则只有 无预付金/区间追保结构,新模板默认无预付金。 + //原始代码如下(如需恢复,用注释行整行替换下面的 return): + //return View(new margin_template_v2() { ValueDate = new DateTime(2020, 1, 1), RuleType = (int)MarginRuleTypeEnum.触发条件预付金规则1, Comments = "预付金占用为成交名义本金的固定比例,加标的跌幅的市值(跌幅达到一定条件触发)", IsValid = true }); + return View(new margin_template_v2() { ValueDate = new DateTime(2020, 1, 1), RuleType = (int)MarginRuleTypeEnum.无预付金, Comments = "预付金占用为零。", IsValid = true }); } @@ -447,6 +450,19 @@ namespace YLErp.Web.Controllers } else { + //预付金模板V2迁移:本部署(TRS)预付金规则只开放 无预付金 和 区间追保结构 两种(2026-08 按业务要求)。 + //原"其他公司显示完整规则列表"的代码以块注释形式保留在下方,如需恢复取消注释即可。 + ruleTypeList.Add(new SelectListItem() + { + Text = MarginRuleTypeEnum.无预付金.ToString(), + Value = ((int)MarginRuleTypeEnum.无预付金).ToString() + }); + ruleTypeList.Add(new SelectListItem() + { + Text = MarginRuleTypeEnum.区间追保结构.ToString(), + Value = ((int)MarginRuleTypeEnum.区间追保结构).ToString() + }); + /* 原完整规则列表(保留备查): ruleTypeList.AddRange(new List(){ new SelectListItem() { @@ -513,7 +529,8 @@ namespace YLErp.Web.Controllers Text = MarginRuleTypeEnum.卖出自动赎回规则1.ToString(), Value = ((int)MarginRuleTypeEnum.卖出自动赎回规则1).ToString() } - }); + }); + */ } if (PS.Config.Company == CompanyEnum.宏源) { diff --git a/YLErpWeb/Views/SwapTrade2/TradeEdit.cshtml b/YLErpWeb/Views/SwapTrade2/TradeEdit.cshtml index 6561cbfe..ebd545df 100644 --- a/YLErpWeb/Views/SwapTrade2/TradeEdit.cshtml +++ b/YLErpWeb/Views/SwapTrade2/TradeEdit.cshtml @@ -15,7 +15,12 @@ var jsClient = canChangeClient && Model.ClientId > 0 ? jsClients.FirstOrDefault(n => n.id == Model.ClientId) : null; var jsAssetUnits = JsDataModel.GetAssetUnits(CurUser); var tradeMarginTemplates = new tradeController().GetMarginTemplates(); - var swapMarginTemplateItems = SwapMarginTemplateConfigService.GetConfig().options; + var swapMarginTemplateItems = SwapMarginTemplateConfigService.GetConfig().options.ToList(); + //保证金模板V2迁移:存量交易的保证金模板可能是历史文本值(如字典配置的"现金保证金"),不在模板V2选项中时追加显示,避免编辑保存时被静默清空 + if (!string.IsNullOrWhiteSpace(Model.MarginTemplateName) && !swapMarginTemplateItems.Any(n => n.Value == Model.MarginTemplateName)) + { + swapMarginTemplateItems.Add(new YLErp.Models.SelectItem { Text = Model.MarginTemplateName + "(历史值)", Value = Model.MarginTemplateName }); + } var tradeMarginTemplateItems = new tradeController().GetMarginTemplateItems(); var jsAssetUnit = Model.AssetId > 0 ? jsAssetUnits.FirstOrDefault(n => n.id == Model.AssetId) : null; var assetunits = JsDataModel.GetAssetUnits(CurUser); @@ -277,6 +282,7 @@
- @if(PS.Config.Company == CompanyEnum.广发商贸){ - - } - else{ - @* - - - *@ - - @**@ - - @**@ - } - + } + else + { + @*预付金模板V2迁移:本部署(TRS)只开放 无预付金 和 区间追保结构 两种规则(2026-08 按业务要求)。 + 原该分支显示 触发条件预付金规则1/触发条件预付金规则3 两个选项,以注释形式保留备查。*@ + + + }
@@ -132,9 +136,10 @@ {
- +
@@ -197,6 +202,48 @@
+
- +
- +
@@ -419,6 +466,16 @@
+ +
- +
- +
@@ -395,6 +450,16 @@
+ + +