BatchReport.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using Model;
  2. using StandardLibrary;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
  9. namespace YangjieTester
  10. {
  11. public class BatchReport
  12. {
  13. public static string GenerateBatchReport(Batch batch)
  14. {
  15. StringBuilder sb = new StringBuilder();
  16. sb.AppendLine($"批次开始时间:{batch.StartTime}");
  17. if (!batch.Finished)
  18. sb.AppendLine($"批次当前时间:{DateTime.Now}");
  19. else
  20. sb.AppendLine($"批次结束时间:{batch.EndTime - batch.StartTime}");
  21. if (!batch.Finished)
  22. sb.AppendLine($"开批次时间:{DateTime.Now - batch.StartTime}");
  23. else
  24. sb.AppendLine($"开批次时间:{batch.EndTime - batch.StartTime}");
  25. sb.AppendLine($"\t配方:{batch.RecipeName}");
  26. sb.AppendLine($"\t批次:{batch.BatchID}");
  27. sb.AppendLine($"\tMTBA:{PlcDataConvert.FormatDWordSpanToDHMS(batch.MTBA)}");
  28. sb.AppendLine($"\tMTBF:{PlcDataConvert.FormatDWordSpanToDHMS(batch.MTBF)}");
  29. sb.AppendLine($"\tMTTR:{PlcDataConvert.FormatDWordSpanToDHMS(batch.MTTR)}");
  30. sb.AppendLine($"\t正常生产时间:{PlcDataConvert.FormatDWordSpanToDHMS(batch.NormalWorkingTimeSpan)}");
  31. sb.AppendLine($"\tMUBA:{batch.MUBA}");
  32. sb.AppendLine($"\tUPH:{batch.UPH:f2}");
  33. sb.AppendLine($"\t报警次数:{batch.AlarmCount}");
  34. sb.AppendLine($"\t故障时间:{batch.ErrorTimeSpan}");
  35. sb.AppendLine($"\t设备使用率:{batch.WorkingTimeRate:f1}%");
  36. sb.AppendLine($"批次总数量:{batch.TotalNumOfBatch}");
  37. sb.AppendLine($"编带总数量:{batch.TapedNumOfBatch}");
  38. sb.AppendLine("-------------------------------------------------");
  39. /******************************测试结果信息**********************************************/
  40. var testResults = PropertyFinder.FindPropertiesOfType<TestResult>(batch);
  41. List<string[]> rows = new List<string[]>();
  42. string[] row = new string[] { "项目", "状态", "良率", "时间", "良品", "不良品", "总数量" };
  43. rows.Add(row);
  44. foreach (var tr in testResults)
  45. {
  46. row = new string[] { tr.Name, tr.TestEnable ? "开" : "关", tr.OkRate.ToString("f2") + "%", tr.Time.ToString(), tr.OkNum.ToString(), tr.NgNum.ToString(), tr.TotalNum.ToString() };
  47. rows.Add(row);
  48. }
  49. sb.AppendLine(FormatTableForMonospace(rows, 12));
  50. sb.AppendLine("-------------------------------------------------");
  51. /******************************Bin盒信息**********************************************/
  52. rows = new List<string[]>();
  53. row = new string[] { "项目", "数量", "上限", "总数量" };
  54. rows.Add(row);
  55. var binBoxNum = PropertyFinder.FindPropertiesOfType<BinBoxNum>(batch);
  56. foreach (var bbn in binBoxNum)
  57. {
  58. row = new string[] { bbn.Name, bbn.Count.ToString(), bbn.UpLimit.ToString(), bbn.TotalCount.ToString() };
  59. rows.Add(row);
  60. }
  61. sb.AppendLine(FormatTableForMonospace(rows, 12));
  62. sb.AppendLine("------------------报警信息---------------------------");
  63. DateTime endTime;
  64. if (!batch.Finished)
  65. endTime = DateTime.Now;
  66. else
  67. endTime = batch.EndTime;
  68. var alarmList = AlarmService.GetAlarmsByTimeRange(batch.StartTime, endTime)
  69. .Select((item, index) => { item.RowNumber = index + 1; return item; })
  70. .ToList();
  71. //alarmList.Add( new AlarmDisplay(){ Timestamp = DateTime.Now.AddDays(0), AlarmType = "Error", Username = "op1", AlarmMessage = "Alarm01" });
  72. //alarmList.Add(new AlarmDisplay() { Timestamp = DateTime.Now.AddDays(2), AlarmType = "Error", Username = "op1", AlarmMessage = "Alarm02" });
  73. //alarmList.Add(new AlarmDisplay() { Timestamp = DateTime.Now.AddDays(2.1), AlarmType = "Error", Username = "op1", AlarmMessage = "Alarm03" });
  74. //alarmList.Add(new AlarmDisplay() { Timestamp = DateTime.Now.AddDays(1), AlarmType = "Cleared", Username = "op1", AlarmMessage = "Alarm01" });
  75. //alarmList.Add(new AlarmDisplay() { Timestamp = DateTime.Now.AddDays(3), AlarmType = "Cleared", Username = "op1", AlarmMessage = "Alarm02" });
  76. var palms = PairedAlarm.PairAlarms(alarmList);
  77. sb.AppendLine($"报警总数:{palms.Count}");
  78. sb.AppendLine("发生时间,结束时间,经过时间,停机类别,报警内容");
  79. foreach (var item in palms)
  80. {
  81. sb.AppendLine($"{item.StartTime},{item.EndTime},{item.EndTime - item.StartTime},{item.Type},{item.AlarmMessage}");
  82. }
  83. return sb.ToString();
  84. }
  85. static int GetDisplayWidth(string s)
  86. {
  87. if (string.IsNullOrEmpty(s)) return 0;
  88. int width = 0;
  89. foreach (char c in s)
  90. {
  91. // 常见中文字符范围(包括中文标点)
  92. if (char.IsLetterOrDigit(c) || char.IsPunctuation(c) || char.IsSymbol(c))
  93. {
  94. // 判断是否为全角字符(通常汉字、中文标点是全角)
  95. if (c >= 0x4E00 && c <= 0x9FFF || // CJK Unified Ideographs
  96. c >= 0x3000 && c <= 0x303F || // CJK Symbols and Punctuation
  97. c >= 0xFF00 && c <= 0xFFEF) // Fullwidth forms
  98. {
  99. width += 2;
  100. }
  101. else
  102. {
  103. width += 1;
  104. }
  105. }
  106. else
  107. {
  108. width += 1; // 默认按半角处理
  109. }
  110. }
  111. return width;
  112. }
  113. static string FormatTableForMonospace(List<string[]> rows, int columnWidth = 0)
  114. {
  115. if (rows == null || rows.Count == 0) return "";
  116. int colCount = rows[0].Length;
  117. // 计算每列的最大显示宽度(以英文字符位为单位)
  118. var maxWidths = new int[colCount];
  119. for (int i = 0; i < colCount; i++)
  120. {
  121. if (columnWidth > 0)
  122. {
  123. maxWidths[i] = columnWidth;
  124. }
  125. else
  126. maxWidths[i] = rows.Max(row => GetDisplayWidth(row[i] ?? ""));
  127. }
  128. var result = new List<string>();
  129. foreach (var row in rows)
  130. {
  131. var cells = new string[colCount];
  132. for (int i = 0; i < colCount; i++)
  133. {
  134. string cell = row[i] ?? "";
  135. int padding = maxWidths[i] - GetDisplayWidth(cell);
  136. cells[i] = cell + new string(' ', Math.Max(0, padding)); // 左对齐
  137. }
  138. result.Add(string.Join(" ", cells));
  139. }
  140. return string.Join(Environment.NewLine, result);
  141. }
  142. }
  143. }