using MesETL.App.Options; using Microsoft.Extensions.Logging; namespace MesETL.App.Services.ETL; /// /// 截取提供ZST文件中的第一行,然后复制成指定数量的数据 /// public class ZstMockReader : ZstReader { private long _currentCount; private readonly long _mockCount; private DataRecord? _template; private readonly bool _deepCopy; private readonly string[]? _autoIncrementColumn; static readonly IReadOnlyList Range = [500, 1500, 2500]; public ZstMockReader(TableMockConfig mockConfig, string filePath, string tableName, string[] headers, string delimiter = ",", char quoteChar = '\"', ILogger? logger = null) : base(filePath, tableName, headers, delimiter, quoteChar, logger) { _mockCount = mockConfig.MockCount; _deepCopy = mockConfig.UseDeepCopy; _autoIncrementColumn = mockConfig.AutoIncrementColumn; } public ZstMockReader(TableMockConfig mockConfig, Stream stream, string tableName, string[] headers, string delimiter = ",", char quoteChar = '\"', ILogger? logger = null) : base(stream, tableName, headers, delimiter, quoteChar, logger) { _mockCount = mockConfig.MockCount; _deepCopy = mockConfig.UseDeepCopy; _autoIncrementColumn = mockConfig.AutoIncrementColumn; } public override async ValueTask ReadAsync() { if (_template is null) { if (!await base.ReadAsync()) throw new InvalidOperationException("所提供的ZST源为空,无法生成模板数据"); _template = Current.Clone() as DataRecord; if (_template is null) throw new ApplicationException("记录拷贝失败"); _currentCount++; return true; } if (_deepCopy) { Current = _template.Clone() as DataRecord ?? throw new ApplicationException("记录拷贝失败"); if(_autoIncrementColumn is not null) { foreach (var column in _autoIncrementColumn) { Current[column] = (Convert.ToInt64(Current[column]) + 1).ToString(); _template = Current; } } Current["CompanyID"] = Range[Random.Shared.Next(0, Range.Count)].ToString();//随机CompanyID } else Current = _template; _currentCount++; return _currentCount < _mockCount; } }