feat(margin): 添加预付金模板簿记账户范围控制功能

- 在 margin_template_v2 实体中新增 BookIds 字段存储适用簿记账户ID列表
- 实现簿记账户ID的规范化、解析和范围重叠判断逻辑
- 在客户端和默认模板编辑页面添加适用簿记账户选择控件
- 修改预付金模板解析逻辑以考虑簿记账户适用性
- 更新交易绑定模板验证以检查簿记账户范围匹配
- 优化模板冲突检测算法以支持簿记账户范围重叠验证
- 添加簿记账户ID存在性校验防止无效引用
- 实现前端动态筛选适用当前资产的模板选项
This commit is contained in:
张名锐
2026-08-27 19:38:10 +08:00
parent c843012cdc
commit 134e07c628
13 changed files with 415 additions and 100 deletions
@@ -247,6 +247,9 @@ namespace YLErp.Web.Controllers
{
try
{
marginTemplate.BookIds = margin_template_v2.NormalizeBookIds(marginTemplate.BookIds);
ValidateBookIds(marginTemplate.BookIds);
if (string.IsNullOrEmpty(marginTemplate.TradeTypes))
{
throw new Exception("默认规则的适用结构不能为空");
@@ -263,17 +266,18 @@ namespace YLErp.Web.Controllers
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 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)
.ToList()
.Where(x => margin_template_v2.AreBookScopesOverlapping(x.BookIds, marginTemplate.BookIds));
var tradeTypes = margin_template_v2.GetOverlappingTradeTypes(marginTemplateDefault, marginTemplate.BookIds).ToList();
//验证相同规则相同的默认参数类型,是否包含相同的适用结构
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(','));
}
var sameRuleParameterRecords = yldb.margin_template_v2
.Where(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)
.ToList()
.Where(x => margin_template_v2.AreBookScopesOverlapping(x.BookIds, marginTemplate.BookIds));
tradeTypes.AddRange(margin_template_v2.GetOverlappingTradeTypes(sameRuleParameterRecords, marginTemplate.BookIds));
tradeTypes.ForEach(x =>
{
@@ -285,10 +289,11 @@ namespace YLErp.Web.Controllers
}
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(',')));
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)
.ToList()
.Where(x => margin_template_v2.AreBookScopesOverlapping(x.BookIds, marginTemplate.BookIds));
var tradeTypes = margin_template_v2.GetOverlappingTradeTypes(marginTemplateDefault, marginTemplate.BookIds).ToList();
tradeTypes.ForEach(x =>
{
if (marginTemplate.TradeTypes.Contains(x))
@@ -481,6 +486,7 @@ namespace YLErp.Web.Controllers
r.Name = marginTemplate.Name;
r.IsDefault = marginTemplate.IsDefault;
r.IsForClient = marginTemplate.IsForClient;
r.BookIds = marginTemplate.BookIds;
r.Comments = marginTemplate.Comments;
r.RuleType = marginTemplate.RuleType;
r.TradeTypes = marginTemplate.TradeTypes;
@@ -605,6 +611,27 @@ namespace YLErp.Web.Controllers
}
}
private void ValidateBookIds(string bookIds)
{
if (string.IsNullOrWhiteSpace(bookIds))
{
return;
}
var ids = margin_template_v2.ParseBookIds(bookIds)
.Select(x => int.Parse(x))
.ToList();
var existingIds = yldb.assetunit
.Where(x => ids.Contains(x.id))
.Select(x => x.id)
.ToList();
var missingIds = ids.Except(existingIds).ToList();
if (missingIds.Any())
{
throw new Exception("适用簿记账户组包含不存在的簿记账户ID:" + string.Join(",", missingIds));
}
}
[HttpPost]
public JsonResult deleteEditmargin_template_v2(string enid)
{
@@ -742,4 +769,4 @@ namespace YLErp.Web.Controllers
}
}
}