Files
zszq-trs/YLErpWeb/Controllers/client_margin_templateController.cs
T
张名锐 134e07c628 feat(margin): 添加预付金模板簿记账户范围控制功能
- 在 margin_template_v2 实体中新增 BookIds 字段存储适用簿记账户ID列表
- 实现簿记账户ID的规范化、解析和范围重叠判断逻辑
- 在客户端和默认模板编辑页面添加适用簿记账户选择控件
- 修改预付金模板解析逻辑以考虑簿记账户适用性
- 更新交易绑定模板验证以检查簿记账户范围匹配
- 优化模板冲突检测算法以支持簿记账户范围重叠验证
- 添加簿记账户ID存在性校验防止无效引用
- 实现前端动态筛选适用当前资产的模板选项
2026-08-27 19:38:10 +08:00

213 lines
8.8 KiB
C#

using YLErp.Enums;
using YLErp.Modules.ClientModule;
using YLErp.Modules.SystemModule;
namespace YLErp.Web.Controllers
{
public class client_margin_templateController : BaseController
{
//入口迁移(2026-08-27):页面降级为"数据管理-预付金模板V2"第四个tab,权限归并到宿主页
[MyAuthorize("基础参数管理-预付金模板V2")]
public ActionResult client_margin_templateList()
{
return View();
}
[MyAuthorize("基础参数管理-预付金模板V2")]
public ActionResult client_margin_templateEdit(int id)
{
var marginTemplates = yldb.margin_template_v2.Where(x => x.IsDefault && x.IsForClient && x.IsValid == true).ToList();
marginTemplates.ForEach(x => x.Details = yldb.margin_template_detail.Where(y => y.MarginTemplateId == x.id).ToList());
ViewBag.MarginTemplates = marginTemplates;
var template = yldb.client_margin_template.Find(id);
if(template == null)
{
template = new client_margin_template()
{
ValueDate = valuedateBLL.ValueDate
};
ViewBag.MarginTemplate = new margin_template_v2() { RuleType = -1 };
}
else
{
var marginTemplate = yldb.margin_template_v2.Find(template.MarginTemplateId);
ViewBag.MarginTemplate = marginTemplate;
}
return View(template);
}
public JsonResult saveClientMarginTemplate(client_margin_template clientMarginTemplate)
{
try
{
if (clientMarginTemplate.MarginTemplateId <= 0)
{
throw new Exception("请选择有效的预付金模板");
}
var marginTemplate = yldb.margin_template_v2.Find(clientMarginTemplate.MarginTemplateId);
if (marginTemplate == null)
{
throw new Exception("找不到有效的预付金模板");
}
var marginDetail = yldb.margin_template_detail.Where(x => x.MarginTemplateId == marginTemplate.id && x.ValueDate <= clientMarginTemplate.ValueDate).OrderByDescending(x => x.ValueDate).FirstOrDefault();
if (marginDetail == null && (marginTemplate.RuleType != (int)MarginRuleTypeEnum.无预付金 && marginTemplate.RuleType != (int)MarginRuleTypeEnum.自动赎回买入预付金规则 && marginTemplate.RuleType != (int)MarginRuleTypeEnum.含赔付预付金计算规则 && marginTemplate.RuleType != (int)MarginRuleTypeEnum.保底预付金规则))
{
throw new Exception(string.Format("[{0}]不在{1}有效期内", clientMarginTemplate.ValueDate.ToString("yyyy-MM-dd"), marginTemplate.Name));
}
//一套规则多套默认参数的互斥验证
var existClientMarginTemplateOther = yldb.client_margin_template.Where(x => ((x.ClientId != 0 && x.ClientId == clientMarginTemplate.ClientId) || (x.ClientLevel != "" && x.ClientLevel == clientMarginTemplate.ClientLevel)) && x.ValueDate == clientMarginTemplate.ValueDate && x.id != clientMarginTemplate.id);
var existingTemplateIds = existClientMarginTemplateOther
.Select(x => x.MarginTemplateId)
.ToArray();
var existingMarginTemplates = yldb.margin_template_v2
.Where(x => existingTemplateIds.Contains(x.id))
.ToList()
.Where(x => margin_template_v2.AreBookScopesOverlapping(x.BookIds, marginTemplate.BookIds))
.ToList();
var msg = "";
if(clientMarginTemplate.ClientLevel == "")
{
msg = "客户名称";
}
else if(clientMarginTemplate.ClientId == 0)
{
msg = "客户等级";
}
if (marginTemplate.DefaultParameterType != 0)
{
//验证不同规则是否已经存在该交易类型
var marginTemplateDefault = existingMarginTemplates
.Where(x => x.RuleType != marginTemplate.RuleType)
.ToList();
var tradeTypes = margin_template_v2.GetOverlappingTradeTypes(marginTemplateDefault, marginTemplate.BookIds).ToList();
//验证相同规则相同的默认参数类型,是否包含相同的适用结构
var sameRuleParameterRecords = existingMarginTemplates
.Where(x => x.RuleType == marginTemplate.RuleType && x.DefaultParameterType == marginTemplate.DefaultParameterType)
.ToList();
tradeTypes.AddRange(margin_template_v2.GetOverlappingTradeTypes(sameRuleParameterRecords, marginTemplate.BookIds));
tradeTypes.ForEach(x =>
{
if (marginTemplate.TradeTypes.Contains(x))
{
throw new Exception($"同一天同一{msg}默认规则不能有相同的适用结构:" + x);
}
});
}
else
{
var marginTemplateDefault = existingMarginTemplates;
var tradeTypes = margin_template_v2.GetOverlappingTradeTypes(marginTemplateDefault, marginTemplate.BookIds).ToList();
tradeTypes.ForEach(x =>
{
if (marginTemplate.TradeTypes.Contains(x))
{
throw new Exception($"同一天同一{msg}默认规则不能有相同的适用结构:" + x);
}
});
}
if (clientMarginTemplate.id > 0)
{
var template = yldb.client_margin_template.Find(clientMarginTemplate.id);
template.ClientId = clientMarginTemplate.ClientId;
template.MarginTemplateId = clientMarginTemplate.MarginTemplateId;
template.ValueDate = clientMarginTemplate.ValueDate;
template.OptDate = DateTime.Now;
template.OptId = CurUser.UserId;
template.OptName = CurUser.UserName;
template.ClientLevel = clientMarginTemplate.ClientLevel;
}
else
{
clientMarginTemplate.OptDate = DateTime.Now;
clientMarginTemplate.OptId = CurUser.UserId;
clientMarginTemplate.OptName = CurUser.UserName;
yldb.client_margin_template.Add(clientMarginTemplate);
}
yldb.SaveChanges();
return JsonSuccess("更新成功");
}
catch (Exception ex)
{
return JsonError(ex.Message);
}
}
public JsonResult deleteClientMarginTemplate(int id)
{
try
{
var template = yldb.client_margin_template.Find(id);
if(template != null)
{
yldb.client_margin_template.Remove(template);
yldb.SaveChanges();
}
return JsonSuccess("删除成功");
}
catch (Exception ex)
{
return JsonError(ex.Message);
}
}
/// <summary>
/// 获取交易预付金规则列表
/// </summary>
[HttpPost]
public JsonResult clientMarginTemplateQuery(ClientMarginTemplateReq req)
{
var sList = new ClientMarginTemplateService(CurUser).SearchClientMarginTemplateList(req);
return Json(sList);
}
/// <summary>
/// 获取客户等级列表
/// </summary>
/// <returns></returns>
public JsonResult GetAllClientLevels()
{
try
{
var clientLevels = ClientDataModelV1.GetAllclientlevel();
return JsonSuccessData(clientLevels);
}
catch (Exception ex)
{
return JsonError(ex.Message);
}
}
/// <summary>
/// 获取所有客户
/// </summary>
/// <returns></returns>
public JsonResult GetAllClients()
{
try
{
var clients = ClientDataModelV1.GetAllClient();
return JsonSuccessData(clients);
}
catch (Exception ex)
{
return JsonError(ex.Message);
}
}
}
}