using Microsoft.AspNetCore.Authorization; using YLErp.Cache; using YLErp.DBModels; using YLErp.Modules.MarginModule; namespace YLErp.Web.Controllers { public class ClientMarginConfigController : BaseController { private IYLCache _cache; public ClientMarginConfigController(IYLCache cache) { _cache = cache; } [MyAuthorize("互换簿记预设-互换预付金率维护")] public ActionResult ClientMarginConfigList() { return View(); } [MyAuthorize("互换簿记预设-互换预付金率修改")] public ActionResult ClientMarginConfigEdit(string enid) { var id = DecryptInt(enid); var fixedTerms = ConsMarginTerm.AllowedTerms.ToArray(); if (id == 0) { // 新增时,创建空的DTO记录 var emptyDetails = new List(); for (int i = 0; i < fixedTerms.Length; i++) { emptyDetails.Add(new ClientMarginDetailDto { bond_term = fixedTerms[i], init_rate = null, maintain_rate = null, swap_days = null }); } ViewBag.Details = emptyDetails; return View(new client_margin_config() { value_date = DateTime.Now }); } var marginConfig = yldb.clientMarginConfig.Find(id); // 获取详情数据并转换为DTO var details = yldb.clientMarginDetail.Where(d => d.config_id == id).ToList(); var detailDtos = new List(); // 确保返回5条数据,按固定顺序 for (int i = 0; i < fixedTerms.Count(); i++) { var term = fixedTerms[i]; var existingDetail = details.FirstOrDefault(d => d.bond_term == term); if (existingDetail != null) { detailDtos.Add(new ClientMarginDetailDto { bond_term = existingDetail.bond_term, init_rate = existingDetail.init_rate * 100, // 转换为百分比显示 maintain_rate = existingDetail.maintain_rate * 100, // 转换为百分比显示 swap_days = existingDetail.swap_days }); } else { detailDtos.Add(new ClientMarginDetailDto { bond_term = term, init_rate = null, maintain_rate = null, swap_days = null }); } } ViewBag.Details = detailDtos; return View(marginConfig); } [MyAuthorize("互换簿记预设-互换预付金率修改")] public JsonResult ClientMarginConfigDelete(string enid) { var id = DecryptInt(enid); var marginConfig = yldb.clientMarginConfig.Find(id); if (marginConfig == null) { throw new ServiceException("数据库中未找到"); } // 删除详情记录 var details = yldb.clientMarginDetail.Where(d => d.config_id == id).ToList(); yldb.clientMarginDetail.RemoveRange(details); // 删除主记录 yldb.clientMarginConfig.Remove(marginConfig); yldb.SaveChanges(); if (_cache != null) { var cachePattern = marginConfig.client_id == 0 ? "ClientMarginRate:*" : $"ClientMarginRate:{marginConfig.client_id}:*"; _cache.BatchDelete(cachePattern); } return JsonSuccess("已删除"); } [MyAuthorize("互换簿记预设-互换预付金率修改")] public JsonResult ClientMarginConfigEditJson(client_margin_config marginConfig, List details) { // 将DTO转换为数据库实体,处理必填和可选逻辑 var detailEntities = new List(); var hasUnderFiveYear = false; if (details != null) { foreach (var dto in details) { // <5y期限必填 if (dto.bond_term == ConsMarginTerm.UnderFiveYear) { if (!dto.init_rate.HasValue || !dto.maintain_rate.HasValue) { return JsonError("<5y期限的初始保证金率和维持保证金率必须填写"); } hasUnderFiveYear = true; detailEntities.Add(new client_margin_detail { bond_term = ConsMarginTerm.UnderFiveYear, init_rate = dto.init_rate.Value / 100, maintain_rate = dto.maintain_rate.Value / 100, swap_days = dto.swap_days ?? 0 }); } else { // 其他期限非必填,但如果填写了任何字段就需要验证 if (dto.init_rate.HasValue || dto.maintain_rate.HasValue || dto.swap_days.HasValue) { if (dto.swap_days.HasValue && (!dto.init_rate.HasValue || !dto.maintain_rate.HasValue)) { return JsonError($"期限\"{dto.bond_term}\":当互换默认天数有值时,初始保证金率和维持保证金率必须填写"); } detailEntities.Add(new client_margin_detail { bond_term = dto.bond_term, init_rate = (dto.init_rate ?? 0) / 100, maintain_rate = (dto.maintain_rate ?? 0) / 100, swap_days = dto.swap_days ?? 0 }); } } } } if (!hasUnderFiveYear) { return JsonError("<5y期限的保证金配置信息必须填写"); } new ClientMarginConfigService(CurUser).SaveMarginConfigWithDetails(marginConfig, detailEntities); return JsonSuccess("已修改"); } [HttpPost] public JsonResult ClientMarginConfigQuery(ClientMarginConfigReq req) { var sList = new ClientMarginConfigService(CurUser).SearchList(req); GetExtendInfo(sList); return JsonSuccess("",sList); } [HttpPost] public JsonResult GetMarginConfigDetails(int configId) { var details = yldb.clientMarginDetail.Where(d => d.config_id == configId).ToList(); // 转换为百分比显示 foreach (var detail in details) { detail.init_rate *= 100; detail.maintain_rate *= 100; } return Json(details); } /// /// 获取适用金率 /// /// /// [AllowAnonymous] [HttpPost] public JsonResult GetApplicableMarginRate([FromBody]GetClientMarginDetailReq req) { var detail = YLErp.Modules.UnderlyingModule.UnderlyingHelper.GetApplicableMarginRate(req.clientId, req.underlyingCode, req.valueDate); return JsonSuccess("", detail); } private void GetExtendInfo(IEnumerable marginConfigs) { foreach (var item in marginConfigs) { if (item.client_id != 0) { var client = DataCacheProvider.GetClientDataSource().GetData(item.client_id); if (client != null) { item.client_name = client.Name; } } // 百分比转换已在服务层处理,此处不需要重复转换 } } } }