using Microsoft.Extensions.DependencyInjection; using System.Data; using YieldChain.Commons; using YLErp.Cache; using YLErp.Model; namespace YLErp.Modules.MarginModule { public class ClientMarginConfigService : YLBaseService { public ClientMarginConfigService(OptUserInfo userInfo) : base(userInfo) { } public void SaveMarginConfig(client_margin_config marginConfig) { if (marginConfig == null) { throw new ServiceException("无数据"); } var dbMarginConfig = new client_margin_config(); dbMarginConfig.SetOpt(UserInfo); if (marginConfig.id != 0) { dbMarginConfig = DbContext.clientMarginConfig.Find(marginConfig.id); if (dbMarginConfig == null) { throw new ServiceException("未找到该记录"); } dbMarginConfig.client_id = marginConfig.client_id; dbMarginConfig.value_date = marginConfig.value_date; if (DbContext.clientMarginConfig.Any(o => o.client_id == marginConfig.client_id && o.value_date == marginConfig.value_date && o.id != marginConfig.id)) { throw new ServiceException("同一客户不支持在同一生效日有多条记录!"); } } else { dbMarginConfig = DbContext.clientMarginConfig.Where(o => o.client_id == marginConfig.client_id && o.value_date == marginConfig.value_date).FirstOrDefault(); if (dbMarginConfig == null) { marginConfig.SetOpt(UserInfo); DbContext.clientMarginConfig.Add(marginConfig); } else { throw new ServiceException("同一客户不支持在同一生效日有多条记录"); } } DbContext.SaveChanges(); } public List SearchList(ClientMarginConfigReq req) { var query = from config in DbContext.clientMarginConfig select new ClientMarginConfigDto { EncryptId = config.EncryptId, id = config.id, client_id = config.client_id, client_name = config.client_name, value_date = config.value_date, OptId = config.OptId, OptName = config.OptName, OptDate = config.OptDate }; if (req.ClientId > 0) { query = query.Where(o => o.client_id == req.ClientId); } if (req.ValueDate.HasValue) { query = query.Where(o => o.value_date == req.ValueDate.Value); } var configs = query.OrderByDescending(o => o.id).ToList(); // 为每个配置加载5条固定期限的详情数据 var fixedTerms = ConsMarginTerm.AllowedTerms.ToArray(); foreach (var config in configs) { var existingDetails = DbContext.clientMarginDetail.Where(d => d.config_id == config.id).ToList(); var detailDtos = new List(); for (int i = 0; i < fixedTerms.Length; i++) { var term = fixedTerms[i]; var existingDetail = existingDetails.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 }); } } // 直接使用DTO格式返回给前端 config.details = detailDtos; } return configs; } public void SaveMarginConfigWithDetails(client_margin_config config, List details) { using (var trans = BeginTransaction()) { try { // 保存主表 SaveMarginConfig(config); // 删除原有详情记录 var existingDetails = DbContext.clientMarginDetail.Where(d => d.config_id == config.id).ToList(); DbContext.clientMarginDetail.RemoveRange(existingDetails); // 保存新的详情记录 foreach (var detail in details) { detail.config_id = config.id; DbContext.clientMarginDetail.Add(detail); } DbContext.SaveChanges(); trans.Commit(); // 更新保证金率缓存:通用配置变动清除全部,客户配置变动只清除该客户的 var ylCache = YLServiceLocator.ServiceProvider?.GetService(); if (ylCache != null) { var cachePattern = config.client_id == 0 ? "ClientMarginRate:*" : $"ClientMarginRate:{config.client_id}:*"; ylCache.BatchDelete(cachePattern); } } catch { trans.Rollback(); throw; } } } } }