using System.Data; using YLErp.Commons; namespace YLErp.Modules.UnderlyingModule { public class UnderlyingImportService : YLBaseService { public UnderlyingImportService(OptUserInfo userInfo) : base(userInfo) { } public void ImportExcel(Stream streamIn, out int totalNum, out int successNum) { totalNum = 0; successNum = 0; int 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); totalNum = table.Rows.Count - rowIndex; foreach (var row in table.Rows.Cast()) { if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString()))) { totalNum--; continue; } reader.SetDataRow(row); using (var trans = BeginTransaction()) { //映射导入数据 var um = MapUnderlying(reader); //保存数据 new UnderlyingDalService(OptUser).SaveUnderlyingData(um); successNum++; trans.Commit(); } rowIndex++; } } catch (ServiceException se) { if (se.Tag != null) throw; throw new ServiceException($"第{rowIndex + 2}行,发生错误:{se.Message}"); } } private underlying_manager MapUnderlying(DataRowReader reader) { var umVariety = reader.GetString("标的品种", true); var variety = DataCacheProvider.GetVarietyDataSource().AsQueryable().Where(o => o.VarietyName == umVariety || o.VarietyCode == umVariety).FirstOrDefault(); if (variety == null) { throw new Exception("未找到品种:" + umVariety); } var instrumentTypeCn = reader.GetString("标的小类(资产类型)", true); //var markShortName = reader.GetString("交易所", true); //var market = DataCacheProvider.GetMarketDataSource().AsQueryable().Where(o => o.MarketShortName == markShortName || o.MarketName== markShortName || o.ExchangeNo == markShortName).FirstOrDefault(); //if (market == null) //{ // throw new Exception("未找到交易所:" + markShortName); //} var um = new underlying_manager() { //MarketCode = market.ExchangeNo, UnderlyingCode = reader.GetString("标的代码", true), UnderlyingName = reader.GetString("标的名称", true), UnderlyingEnName = reader.GetString("标的英文名", false), UnderlyingTypeId = variety.id, UnderlyingInstrumentType = ConsGlobal.InstrumentType.GetFromDesc(instrumentTypeCn), BBGTicker = reader.GetString("BBGTicker", false), ContractSize = reader.GetDouble("合约乘数", false) ?? 0, MaturityDate = reader.GetDate("标的到期日", false), CloseDate = reader.GetDate("标的交割日", false), UnderlyingDesc = reader.GetString("描述", false), LaunchState = "1", UnderlyingStatus = "正常运行", OptId = UserId, OptName = UserName, OptDate = DateTime.Now }; return um; } } }