using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Text; using JmNcReceiver.Models; using Newtonsoft.Json; namespace JmNcReceiver { /// 最近一次成功还原的 NC 提交批次。 internal static class NcSubmitStore { private static readonly object _lock = new object(); private static IList _latest; public static IList Latest { get { lock (_lock) { return _latest; } } } public static void SetLatest(IList items) { lock (_lock) { _latest = items; } } } internal static class NcOps { public static IList Deserialize(string json) { return JsonConvert.DeserializeObject>(json); } public static string ToPrettyJson(IList items) { return JsonConvert.SerializeObject(items, Formatting.Indented); } public static string ToPlainText(IList items) { var sb = new StringBuilder(); sb.AppendLine("===== 机明 NC 提交批次 ====="); sb.AppendLine("条数 / Count: " + (items == null ? 0 : items.Count)); sb.AppendLine(); if (items == null) return sb.ToString(); int i = 0; foreach (NcSubmitItem it in items) { i++; sb.AppendLine("--- #" + i + " ---"); sb.AppendLine(" fileName : " + (it.fileName ?? "")); sb.AppendLine(" filePath : " + (it.filePath ?? "")); sb.AppendLine(" equipmentBrand : " + (it.equipmentBrand ?? "")); sb.AppendLine(" uploadUser : " + (it.uploadUser ?? "")); sb.AppendLine(" source : " + (it.source ?? "")); sb.AppendLine(" projectName : " + (it.projectName ?? "")); bool hasStream = !string.IsNullOrEmpty(it.fileStream); sb.AppendLine(" fileStream : " + (hasStream ? ("Base64 长度 " + it.fileStream.Length) : "(无)")); sb.AppendLine(" fileStream-encoding: " + (it.fileStreamEncoding ?? "(无)")); sb.AppendLine(); } return sb.ToString(); } public static void PrintHelp() { Console.WriteLine("命令:"); Console.WriteLine(" summary 打印本批摘要"); Console.WriteLine(" text 再打印明文,并另存 latest-plain.txt"); Console.WriteLine(" dump 将对象写回 Received\\latest-object.json"); Console.WriteLine(" extract 若有 fileStream,解码到 Received\\extracted\\"); Console.WriteLine(" load [路径] 从已落盘 JSON 再次还原"); Console.WriteLine(" help / ? 本帮助"); Console.WriteLine(" quit / exit 退出"); Console.WriteLine(); } public static void PrintSummary(IList items) { if (items == null || items.Count == 0) { Console.WriteLine("(尚无批次)"); return; } Console.WriteLine("条数: {0}", items.Count); foreach (NcSubmitItem it in items) { Console.WriteLine(" [{0}] {1} path={2} content={3}", it.source ?? "?", it.fileName ?? "(无名)", it.filePath ?? "", string.IsNullOrEmpty(it.fileStream) ? "否" : "是"); } } /// 将带 fileStream 的项解码写出;返回写出文件数。 public static int ExtractStreams(IList items, string outDir) { if (items == null) return 0; Directory.CreateDirectory(outDir); int n = 0; foreach (NcSubmitItem it in items) { if (string.IsNullOrEmpty(it.fileStream)) continue; string name = string.IsNullOrEmpty(it.fileName) ? ("nc_" + n + ".bin") : Path.GetFileName(it.fileName); byte[] raw = Convert.FromBase64String(it.fileStream); if (string.Equals(it.fileStreamEncoding, "gzip+base64", StringComparison.OrdinalIgnoreCase)) { using (var ms = new MemoryStream(raw)) using (var gz = new GZipStream(ms, CompressionMode.Decompress)) using (var outMs = new MemoryStream()) { gz.CopyTo(outMs); raw = outMs.ToArray(); } } string path = Path.Combine(outDir, name); File.WriteAllBytes(path, raw); Console.WriteLine("已写出: {0} ({1} 字节)", path, raw.Length); n++; } return n; } } }