using MiniExcelLibs; using Admin.NET.Plugin.AiDOP.Entity.DataPlatform; namespace Admin.NET.Plugin.AiDOP.DataPlatform.FileImport; public sealed class MdpExcelTemplateService : ITransient { public async Task BuildAsync(MdpEntity entity, IReadOnlyList mappings) { var cols = mappings .Where(m => !m.TargetField.Equals("tenant_id", StringComparison.OrdinalIgnoreCase) && !m.SourceField.StartsWith("CONST:", StringComparison.OrdinalIgnoreCase) && !m.SourceField.StartsWith("TO_JSON", StringComparison.OrdinalIgnoreCase) && !m.SourceField.StartsWith("COALESCE", StringComparison.OrdinalIgnoreCase)) .OrderBy(m => m.SortOrder) .ToList(); if (cols.Count == 0 && !string.IsNullOrWhiteSpace(entity.BizKeyExpr)) { var i = 0; cols = entity.BizKeyExpr.Split(',', StringSplitOptions.TrimEntries) .Select(name => new MdpFieldMapping { SourceField = name, TargetField = name, IsRequired = 1, SortOrder = ++i * 10 }) .ToList(); } var headers = new Dictionary(); foreach (var c in cols) { var title = c.IsRequired == 1 ? $"{c.SourceField} ★" : c.SourceField; headers[title] = null; } var memory = new MemoryStream(); await memory.SaveAsAsync(new[] { headers }, sheetName: ReadSheet(entity)); memory.Seek(0, SeekOrigin.Begin); return new FileStreamResult(memory, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = $"{entity.EntityCode}-template.xlsx" }; } public static string ReadSheet(MdpEntity entity) { if (string.IsNullOrWhiteSpace(entity.FileConfigJson)) return "数据"; try { using var doc = System.Text.Json.JsonDocument.Parse(entity.FileConfigJson); if (doc.RootElement.TryGetProperty("sheetName", out var s)) return s.GetString() ?? "数据"; } catch { /* ignore */ } return "数据"; } }