using BaseOUDAL; using System.Data; using YLErp.Commons; using YLErp.Modules.TradeModule.OrderModule; namespace YLErp.Modules.MarginModule { public class MarginRateService : YLBaseService { public MarginRateService(OptUserInfo userInfo) : base(userInfo) { } /// /// 导入预付金率 /// public void ImportMarginRate(Stream streamIn, out int totalNum, out int successNum) { totalNum = 0; successNum = 0; var rowIndex = 0; try { var ds = Office.ExcelHelper.ReadExcelAsDataSet(streamIn, new[] { 0 }, 1); if (ds.Tables.Count < 1 || ds.Tables[0].Rows.Count < 1) { throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" }; } var table = ds.Tables[0]; var reader = new DataRowReader(table); rowIndex = 0; totalNum = table.Rows.Count - rowIndex; var structureTradeList = new List(); foreach (var row in table.Rows.Cast()) { rowIndex++; if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString()))) { totalNum--; continue; } reader.SetDataRow(row); using (var trans = BeginTransaction()) { //映射导入数据到交易对象 var maginRate = MapMarginRate(reader); saveMarginRate(maginRate, true); successNum++; trans.Commit(); } } //generateSettleDocument(trade_Cashes); //生成确认书 //new ConfirmationGenerateService(this).Generate(tradeIds, "PDF"); } catch (ServiceException se) { if (se.Tag != null) { throw; } throw new ServiceException($"已成功导入{successNum}条;\n第{rowIndex}行,{se.Message}"); } catch (Exception ex) { LogFactory.GetLogger("导入互换交易").Error(ex); throw new ServiceException($"已成功导入{successNum}条,\n第{rowIndex}行,发生错误:{ex.Message}", ex); } } private client_variety_marginrate MapMarginRate(DataRowReader reader) { var marginRate = new client_variety_marginrate() { ClientName = reader.GetString("客户名称", false), VarietyCode = reader.GetString("品种代码", true), ValueDate = reader.GetDate("起效日期", true) ?? DateTime.Now, HighMarginRate = reader.GetPercent("PFE系数", false) ?? 0, LowMarginRate = reader.GetPercent("VR系数", false) ?? 0 }; var client = new Client(); if (!string.IsNullOrWhiteSpace(marginRate.ClientName)) { client = DataCacheProvider.GetClientDataSource().AsQueryable().Where(o => o.Name == marginRate.ClientName).FirstOrDefault(); if (client == null) { throw new ServiceException("未找到客户:" + marginRate.ClientName); } marginRate.ClientId = client.id; } if (string.IsNullOrWhiteSpace(marginRate.VarietyCode)) { throw new ServiceException("品种代码必填"); } var variety = DbContext.variety.Where(o => o.VarietyCode == marginRate.VarietyCode || o.VarietyName == marginRate.VarietyCode).FirstOrDefault(); if (variety == null) { throw new ServiceException("未找到品种:" + marginRate.VarietyCode); } marginRate.VarietyId = variety.id; return marginRate; } public void saveMarginRate(client_variety_marginrate marginrate, bool canCover = false) { if (marginrate == null) { throw new ServiceException("无数据"); } if (marginrate.HighMarginRate < 0 || marginrate.LowMarginRate < 0) { throw new ServiceException("预付金率数据格式错"); } if (marginrate.VarietyId == 0) { throw new ServiceException("品种代码必填"); } var dbMarginRate = new client_variety_marginrate(); if (marginrate.id != 0) { dbMarginRate = DbContext.client_variety_marginrate.Find(marginrate.id); if (dbMarginRate == null) { throw new ServiceException("未找到该记录"); } dbMarginRate.ClientId = marginrate.ClientId; dbMarginRate.VarietyId = marginrate.VarietyId; dbMarginRate.HighMarginRate = marginrate.HighMarginRate; dbMarginRate.LowMarginRate = marginrate.LowMarginRate; dbMarginRate.ValueDate = marginrate.ValueDate; dbMarginRate.OptId = UserId; dbMarginRate.OptName = UserName; dbMarginRate.OptDate = DateTime.Now; if (DbContext.client_variety_marginrate.Any(o => o.VarietyId == dbMarginRate.VarietyId && o.ClientId == dbMarginRate.ClientId && o.ValueDate == dbMarginRate.ValueDate && o.id != marginrate.id)) { throw new ServiceException("同一客户同一品种不支持在同一天有多条记录"); } } else { dbMarginRate = DbContext.client_variety_marginrate.Where(o => o.VarietyId == marginrate.VarietyId && o.ClientId == marginrate.ClientId && o.ValueDate == marginrate.ValueDate).FirstOrDefault(); if (dbMarginRate == null) { marginrate.OptId = UserId; marginrate.OptName = UserName; marginrate.OptDate = DateTime.Now; DbContext.client_variety_marginrate.Add(marginrate); } else if (canCover) { dbMarginRate.HighMarginRate = marginrate.HighMarginRate; dbMarginRate.LowMarginRate = marginrate.LowMarginRate; dbMarginRate.OptId = UserId; dbMarginRate.OptName = UserName; dbMarginRate.OptDate = DateTime.Now; } else { throw new ServiceException("同一客户同一品种不支持在同一天有多条记录"); } } DbContext.SaveChanges(); } public SearchListResult SearchList(MarginRateReq req) { var query = from source in DbContext.client_variety_marginrate select source; if (req.ClientId > 0) { query = query.Where(o => o.ClientId == req.ClientId); } if (req.VarietyId > 0) { query = query.Where(o => o.VarietyId == req.VarietyId); } if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "id"; req.sord = "desc"; } return query.ToSearchList(req); } public double GetMarginRate(int clientId, int varietyId, DateTime searchDate, bool useThrowException = true) { var marginRates = DbContext.client_variety_marginrate.Where(o => o.VarietyId == varietyId && o.ValueDate < searchDate).OrderByDescending(o => o.ValueDate); var marginRate = marginRates.Any(o => o.ClientId == clientId) ? marginRates.FirstOrDefault(o => o.ClientId == clientId) : marginRates.FirstOrDefault(o => o.ClientId == 0); if (marginRate == null) { if (useThrowException) { throw new Exception($"ClientId:{clientId} - VarietyId:{varietyId} 未找到对应的预付金率"); } else { return 0; } } else { var credit = DbContext.credit.Where(o => o.ClientId == clientId && o.CreditStartDate <= searchDate).FirstOrDefault(); if (credit == null || credit.PFECredit == null || credit.PFECredit == 0) { return marginRate.HighMarginRate; } return marginRate.LowMarginRate; } } public class MarginRateReq : BaseSearchReq { public int ClientId { get; set; } public int VarietyId { get; set; } } } }