优化打印预览窗口的参数生成逻辑,支持根据合并字段顺序生成相应的 JSON 数据,增强打印模板的灵活性和可定制性。同时,修复了列级合并逻辑,确保在处理重复键时不会抛出异常。

This commit is contained in:
geht
2026-05-12 18:55:12 +08:00
parent bdb4eb5148
commit d2f49add82
2 changed files with 65 additions and 13 deletions

View File

@@ -109,6 +109,8 @@ public partial class PrintPreviewWindow : HandyControl.Controls.Window
/// <summary>
/// 根据模板绑定字段生成参数 JSON便于用户直接编辑并预览
/// 与 web 端 nativeMockData.ts 保持一致:识别 mergeColumnKeys 让同组相邻行字段值相同,
/// 以便在预览中触发 rowSpan 合并显示。
/// </summary>
private static string BuildMockParamJson(string templateJson)
{
@@ -121,6 +123,7 @@ public partial class PrintPreviewWindow : HandyControl.Controls.Window
var obj = new JsonObject();
var elements = root?["elements"]?.AsArray() ?? new JsonArray();
var fields = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var rng = new Random();
foreach (var el in elements.OfType<JsonObject>())
{
@@ -130,28 +133,73 @@ public partial class PrintPreviewWindow : HandyControl.Controls.Window
var source = (el["source"]?.ToString() ?? "mainTable").Trim();
if (!obj.ContainsKey(source))
{
var rows = new JsonArray();
var columns = el["columns"]?.AsArray() ?? new JsonArray();
for (var i = 1; i <= 8; i++)
var colList = columns.OfType<JsonObject>().ToList();
// 解析合并字段顺序:根据 mergeColumnKeys 按 column.key 映射到 bindField
var mergeKeys = (el["mergeColumnKeys"]?.AsArray() ?? new JsonArray())
.Select(n => n?.ToString() ?? string.Empty)
.Where(s => !string.IsNullOrEmpty(s))
.ToList();
var strictGrouping = !string.Equals(
el["strictGrouping"]?.ToString() ?? "true", "false",
StringComparison.OrdinalIgnoreCase);
var mergeFieldOrder = mergeKeys
.Select(k => colList.FirstOrDefault(c => string.Equals(c["key"]?.ToString() ?? string.Empty, k, StringComparison.Ordinal)))
.Where(c => c != null)
.Select(c => (c!["bindField"]?.ToString() ?? c!["field"]?.ToString() ?? string.Empty).Trim())
.Where(s => !string.IsNullOrEmpty(s))
.ToList();
var rows = new JsonArray();
JsonObject? prevRow = null;
for (var i = 0; i < 8; i++)
{
var row = new JsonObject();
foreach (var col in columns.OfType<JsonObject>())
foreach (var col in colList)
{
var field = (col["bindField"]?.ToString() ?? col["field"]?.ToString() ?? string.Empty).Trim();
if (string.IsNullOrWhiteSpace(field)) continue;
var contentType = (col["contentType"]?.ToString() ?? "text").Trim().ToLowerInvariant();
fields.Add(field);
var mergeIndex = mergeFieldOrder.IndexOf(field);
var enableMerge = mergeIndex >= 0;
if (enableMerge)
{
// 父级合并字段在 strictGrouping 下必须与前一行一致,才允许沿用前一行值
var canFollowPrev = !strictGrouping || mergeIndex == 0 || (prevRow != null &&
mergeFieldOrder.Take(mergeIndex).All(parent =>
(prevRow[parent]?.ToString() ?? string.Empty) == (row[parent]?.ToString() ?? string.Empty)));
if (i > 0 && prevRow != null && canFollowPrev && rng.NextDouble() < 0.5)
{
// 沿用前一行此字段值,从而触发合并
var prevVal = prevRow[field];
row[field] = prevVal != null ? JsonNode.Parse(prevVal.ToJsonString()) : (JsonNode?)$"{field}_合并组1";
}
else
{
// 新合并组:随机 0-3 表示组编号
row[field] = $"{field}_合并组{rng.Next(1, 5)}";
}
continue;
}
row[field] = contentType switch
{
"number" => i * 123.45,
"amount" => i * 24567.89,
"qrcode" => $"QR_{field}_{i}",
"barcode" => $"BAR_{field}_{i}",
"image" => $"https://picsum.photos/seed/{Uri.EscapeDataString(field + "_" + i)}/260/120",
_ => $"{field}_示例值_{i}"
"number" => (i + 1) * 123.45,
"amount" => (i + 1) * 24567.89,
"qrcode" => $"QR_{field}_{i + 1}",
"barcode" => $"BAR_{field}_{i + 1}",
"image" => $"https://picsum.photos/seed/{Uri.EscapeDataString(field + "_" + (i + 1))}/260/120",
_ => $"{field}_示例值_{i + 1}"
};
fields.Add(field);
}
rows.Add(row);
prevRow = row;
}
obj[source] = rows;
}