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;
}
}
}