LockResult.cs 15 KB

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