LockResult.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. using Prism.Mvvm;
  2. using System;
  3. using System.Collections.Generic;
  4. using static TeamAAS_VP.Core.ScrewDriver.XYD_ScrewDriver;
  5. using SqlSugar;
  6. namespace TeamAAS_VP.Models
  7. {
  8. public class LockResult : BindableBase
  9. {
  10. [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
  11. public int Id { get; set; }
  12. private int __Number;
  13. /// <summary>
  14. /// 螺丝编号
  15. /// </summary>
  16. public int Number
  17. {
  18. get { return __Number; }
  19. set { SetProperty(ref __Number, value); }
  20. }
  21. private string __ProductNumber;
  22. /// <summary>
  23. /// 产品编号
  24. /// </summary>
  25. [SugarColumn(IsNullable = true)]
  26. public string ProductNumber
  27. {
  28. get { return __ProductNumber; }
  29. set { SetProperty(ref __ProductNumber, value); }
  30. }
  31. private DateTime __Timestamp;
  32. /// <summary>
  33. /// 时间戳
  34. /// </summary>
  35. public DateTime Timestamp
  36. {
  37. get { return __Timestamp; }
  38. set { SetProperty(ref __Timestamp, value); }
  39. }
  40. private float __LockTurns;
  41. /// <summary>
  42. /// 锁付圈数
  43. /// </summary>
  44. public float LockTurns
  45. {
  46. get { return __LockTurns; }
  47. set { SetProperty(ref __LockTurns, value); }
  48. }
  49. private float __LockTorque;
  50. /// <summary>
  51. /// 锁付扭矩
  52. /// </summary>
  53. public float LockTorque
  54. {
  55. get { return __LockTorque; }
  56. set { SetProperty(ref __LockTorque, value); }
  57. }
  58. private float __LockDuration;
  59. /// <summary>
  60. /// 锁付用时
  61. /// </summary>
  62. public float LockDuration
  63. {
  64. get { return __LockDuration; }
  65. set { SetProperty(ref __LockDuration, value); }
  66. }
  67. private bool __LockPassed;
  68. /// <summary>
  69. /// 锁付结果(是否通过)
  70. /// </summary>
  71. public bool LockPassed
  72. {
  73. get { return __LockPassed; }
  74. set { SetProperty(ref __LockPassed, value); }
  75. }
  76. //
  77. private string _ResultDetails;
  78. /// <summary>
  79. /// 结果详情
  80. /// </summary>
  81. [SugarColumn(IsNullable = true)]
  82. public string ResultDetails
  83. {
  84. get { return _ResultDetails; }
  85. set { SetProperty(ref _ResultDetails, value); }
  86. }
  87. private int __ScrewdriverProgramNumber;
  88. /// <summary>
  89. /// 电批程序号
  90. /// </summary>
  91. public int ScrewdriverProgramNumber
  92. {
  93. get { return __ScrewdriverProgramNumber; }
  94. set { SetProperty(ref __ScrewdriverProgramNumber, value); }
  95. }
  96. private float __Pressure;
  97. /// <summary>
  98. /// 压力值
  99. /// </summary>
  100. public float Pressure
  101. {
  102. get { return __Pressure; }
  103. set { SetProperty(ref __Pressure, value); }
  104. }
  105. private float __TargetTorque;
  106. /// <summary>
  107. /// 目标扭矩
  108. /// </summary>
  109. public float TargetTorque
  110. {
  111. get { return __TargetTorque; }
  112. set { SetProperty(ref __TargetTorque, value); }
  113. }
  114. private float __TargetTurnsUpperLimit;
  115. /// <summary>
  116. /// 目标圈数上限
  117. /// </summary>
  118. public float TargetTurnsUpperLimit
  119. {
  120. get { return __TargetTurnsUpperLimit; }
  121. set { SetProperty(ref __TargetTurnsUpperLimit, value); }
  122. }
  123. private float __TargetTurnsLowerLimit;
  124. /// <summary>
  125. /// 目标圈数下限
  126. /// </summary>
  127. public float TargetTurnsLowerLimit
  128. {
  129. get { return __TargetTurnsLowerLimit; }
  130. set { SetProperty(ref __TargetTurnsLowerLimit, value); }
  131. }
  132. private float __TargetLockSpeed;
  133. /// <summary>
  134. /// 目标锁付速度
  135. /// </summary>
  136. public float TargetLockSpeed
  137. {
  138. get { return __TargetLockSpeed; }
  139. set { SetProperty(ref __TargetLockSpeed, value); }
  140. }
  141. private bool _ScrewdriverGetDataSucceed;
  142. /// <summary>
  143. /// 电批数据是否获取成功
  144. /// </summary>
  145. public bool ScrewdriverGetDataSucceed
  146. {
  147. get { return _ScrewdriverGetDataSucceed; }
  148. set { SetProperty(ref _ScrewdriverGetDataSucceed, value); }
  149. }
  150. private float __StartPositionX;
  151. /// <summary>
  152. /// 锁付位置坐标 X 起始值
  153. /// </summary>
  154. public float StartPositionX
  155. {
  156. get { return __StartPositionX; }
  157. set { SetProperty(ref __StartPositionX, value); }
  158. }
  159. private float __StartPositionY;
  160. /// <summary>
  161. /// 锁付位置坐标 Y 起始值
  162. /// </summary>
  163. public float StartPositionY
  164. {
  165. get { return __StartPositionY; }
  166. set { SetProperty(ref __StartPositionY, value); }
  167. }
  168. private float __StartPositionZ;
  169. /// <summary>
  170. /// 锁付位置坐标 Z 起始值
  171. /// </summary>
  172. public float StartPositionZ
  173. {
  174. get { return __StartPositionZ; }
  175. set { SetProperty(ref __StartPositionZ, value); }
  176. }
  177. private float __EndPositionZ;
  178. /// <summary>
  179. /// Z 终点值
  180. /// </summary>
  181. public float EndPositionZ
  182. {
  183. get { return __EndPositionZ; }
  184. set { SetProperty(ref __EndPositionZ, value); }
  185. }
  186. private float __LockDescentSpeed;
  187. /// <summary>
  188. /// 锁付下降速度
  189. /// </summary>
  190. public float LockDescentSpeed
  191. {
  192. get { return __LockDescentSpeed; }
  193. set { SetProperty(ref __LockDescentSpeed, value); }
  194. }
  195. private int __FeederNumber;
  196. /// <summary>
  197. /// 供料器编号
  198. /// </summary>
  199. public int FeederNumber
  200. {
  201. get { return __FeederNumber; }
  202. set { SetProperty(ref __FeederNumber, value); }
  203. }
  204. private float _FeederBatchNumber;
  205. /// <summary>
  206. /// 螺丝批次编号
  207. /// </summary>
  208. public float FeederBatchNumber
  209. {
  210. get { return _FeederBatchNumber; }
  211. set { SetProperty(ref _FeederBatchNumber, value); }
  212. }
  213. private string __NozzleNumber;
  214. /// <summary>
  215. /// 披头编号
  216. /// </summary>
  217. [SugarColumn(IsNullable = true)]
  218. public string NozzleNumber
  219. {
  220. get { return __NozzleNumber; }
  221. set { SetProperty(ref __NozzleNumber, value); }
  222. }
  223. //当前的操作员名称
  224. private string _OperatorName;
  225. [SugarColumn(IsNullable = true)]
  226. public string OperatorName
  227. {
  228. get { return _OperatorName; }
  229. set { SetProperty(ref _OperatorName, value); }
  230. }
  231. private string _ProductImagePath;
  232. /// <summary>
  233. /// 产品图片路径
  234. /// </summary>
  235. [SugarColumn(IsNullable = true)]
  236. public string ProductImagePath
  237. {
  238. get { return _ProductImagePath; }
  239. set { SetProperty(ref _ProductImagePath, value); }
  240. }
  241. /// <summary>
  242. /// 锁付曲线数据列表
  243. /// </summary>
  244. [SugarColumn(IsIgnore = true)]
  245. public List<WaveData> WaveDatas { get; set; } = new List<WaveData>();
  246. public LockResult()
  247. {
  248. // 默认构造函数
  249. Timestamp = DateTime.Now;
  250. }
  251. public LockResult(int number, string productNumber, float lockTurns, float lockTorque, bool lockPassed)
  252. {
  253. Number = number;
  254. ProductNumber = productNumber;
  255. Timestamp = DateTime.Now;
  256. LockTurns = lockTurns;
  257. LockTorque = lockTorque;
  258. LockPassed = lockPassed;
  259. }
  260. public LockResult Clone()
  261. {
  262. return new LockResult
  263. {
  264. Number = this.Number,
  265. ProductNumber = this.ProductNumber,
  266. Timestamp = this.Timestamp,
  267. LockTurns = this.LockTurns,
  268. LockTorque = this.LockTorque,
  269. LockDuration = this.LockDuration,
  270. LockPassed = this.LockPassed,
  271. ScrewdriverProgramNumber = this.ScrewdriverProgramNumber,
  272. Pressure = this.Pressure,
  273. TargetTorque = this.TargetTorque,
  274. TargetTurnsUpperLimit = this.TargetTurnsUpperLimit,
  275. TargetTurnsLowerLimit = this.TargetTurnsLowerLimit,
  276. TargetLockSpeed = this.TargetLockSpeed,
  277. StartPositionX = this.StartPositionX,
  278. StartPositionY = this.StartPositionY,
  279. StartPositionZ = this.StartPositionZ,
  280. EndPositionZ = this.EndPositionZ,
  281. LockDescentSpeed = this.LockDescentSpeed,
  282. FeederNumber = this.FeederNumber,
  283. NozzleNumber = this.NozzleNumber,
  284. OperatorName = this.OperatorName,
  285. ProductImagePath = this.ProductImagePath,
  286. ScrewdriverGetDataSucceed = this.ScrewdriverGetDataSucceed,
  287. WaveDatas = new List<WaveData>(this.WaveDatas)
  288. };
  289. }
  290. /// <summary>
  291. /// 将当前的锁付结果结果及波形数据存储至.csv文件中
  292. /// </summary>
  293. /// <param name="filePath"></param>
  294. public void SaveToCsv(string filePath)
  295. {
  296. string EscapeCsv(object value)
  297. {
  298. if (value == null) return "\"\"";
  299. string s;
  300. if (value is DateTime dt)
  301. {
  302. s = dt.ToString("o"); // ISO 8601
  303. }
  304. else
  305. {
  306. s = Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture);
  307. }
  308. s = s.Replace("\"", "\"\""); // escape quotes
  309. return $"\"{s}\"";
  310. }
  311. using (var writer = new System.IO.StreamWriter(filePath, false, System.Text.Encoding.UTF8))
  312. {
  313. // 写入锁付结果信息表头(已新增字段)
  314. writer.WriteLine("Number,ProductNumber,Timestamp,LockTurns,LockTorque,LockDuration,LockPassed,ScrewdriverProgramNumber,Pressure,TargetTorque,TargetTurnsUpperLimit,TargetTurnsLowerLimit,TargetLockSpeed,StartPositionX,StartPositionY,StartPositionZ,EndPositionZ,LockDescentSpeed,FeederNumber,FeederBatchNumber,NozzleNumber,ResultDetails,ScrewdriverGetDataSucceed,OperatorName,ProductImagePath");
  315. // 写入锁付结果数据行(所有字段均做 CSV 转义)
  316. writer.WriteLine(string.Join(",",
  317. EscapeCsv(Number),
  318. EscapeCsv(ProductNumber),
  319. EscapeCsv(Timestamp),
  320. EscapeCsv(LockTurns),
  321. EscapeCsv(LockTorque),
  322. EscapeCsv(LockDuration),
  323. EscapeCsv(LockPassed),
  324. EscapeCsv(ScrewdriverProgramNumber),
  325. EscapeCsv(Pressure),
  326. EscapeCsv(TargetTorque),
  327. EscapeCsv(TargetTurnsUpperLimit),
  328. EscapeCsv(TargetTurnsLowerLimit),
  329. EscapeCsv(TargetLockSpeed),
  330. EscapeCsv(StartPositionX),
  331. EscapeCsv(StartPositionY),
  332. EscapeCsv(StartPositionZ),
  333. EscapeCsv(EndPositionZ),
  334. EscapeCsv(LockDescentSpeed),
  335. EscapeCsv(FeederNumber),
  336. EscapeCsv(FeederBatchNumber),
  337. EscapeCsv(NozzleNumber),
  338. EscapeCsv(ResultDetails),
  339. EscapeCsv(ScrewdriverGetDataSucceed),
  340. EscapeCsv(OperatorName),
  341. EscapeCsv(ProductImagePath)
  342. ));
  343. // 写入波形数据
  344. writer.WriteLine();
  345. writer.WriteLine("WaveDataIndex,LockAngle,Torque,Turns,Speed,Slopes");
  346. for (int i = 0; i < WaveDatas.Count; i++)
  347. {
  348. var waveData = WaveDatas[i];
  349. writer.WriteLine(string.Join(",",
  350. EscapeCsv(i),
  351. EscapeCsv(waveData.LockAngle),
  352. EscapeCsv(waveData.Torque),
  353. EscapeCsv(waveData.Turns),
  354. EscapeCsv(waveData.Speed),
  355. EscapeCsv(waveData.Slopes)
  356. ));
  357. }
  358. }
  359. }
  360. }
  361. }