LockResult.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  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 __TargetTorque;
  115. /// <summary>
  116. /// 目标扭矩
  117. /// </summary>
  118. public float TargetTorque
  119. {
  120. get { return __TargetTorque; }
  121. set { SetProperty(ref __TargetTorque, value); }
  122. }
  123. private float __TargetTurnsUpperLimit;
  124. /// <summary>
  125. /// 目标圈数上限
  126. /// </summary>
  127. public float TargetTurnsUpperLimit
  128. {
  129. get { return __TargetTurnsUpperLimit; }
  130. set { SetProperty(ref __TargetTurnsUpperLimit, value); }
  131. }
  132. private float __TargetTurnsLowerLimit;
  133. /// <summary>
  134. /// 目标圈数下限
  135. /// </summary>
  136. public float TargetTurnsLowerLimit
  137. {
  138. get { return __TargetTurnsLowerLimit; }
  139. set { SetProperty(ref __TargetTurnsLowerLimit, value); }
  140. }
  141. private float __TargetLockSpeed;
  142. /// <summary>
  143. /// 目标锁付速度
  144. /// </summary>
  145. public float TargetLockSpeed
  146. {
  147. get { return __TargetLockSpeed; }
  148. set { SetProperty(ref __TargetLockSpeed, value); }
  149. }
  150. private bool _ScrewdriverGetDataSucceed;
  151. /// <summary>
  152. /// 电批数据是否获取成功
  153. /// </summary>
  154. public bool ScrewdriverGetDataSucceed
  155. {
  156. get { return _ScrewdriverGetDataSucceed; }
  157. set { SetProperty(ref _ScrewdriverGetDataSucceed, value); }
  158. }
  159. private float __StartPositionX;
  160. /// <summary>
  161. /// 锁付位置坐标 X 起始值
  162. /// </summary>
  163. public float StartPositionX
  164. {
  165. get { return __StartPositionX; }
  166. set { SetProperty(ref __StartPositionX, value); }
  167. }
  168. private float __StartPositionY;
  169. /// <summary>
  170. /// 锁付位置坐标 Y 起始值
  171. /// </summary>
  172. public float StartPositionY
  173. {
  174. get { return __StartPositionY; }
  175. set { SetProperty(ref __StartPositionY, value); }
  176. }
  177. private float __StartPositionZ;
  178. /// <summary>
  179. /// 锁付位置坐标 Z 起始值
  180. /// </summary>
  181. public float StartPositionZ
  182. {
  183. get { return __StartPositionZ; }
  184. set { SetProperty(ref __StartPositionZ, value); }
  185. }
  186. private float __EndPositionZ;
  187. /// <summary>
  188. /// Z 终点值
  189. /// </summary>
  190. public float EndPositionZ
  191. {
  192. get { return __EndPositionZ; }
  193. set { SetProperty(ref __EndPositionZ, value); }
  194. }
  195. private float __LockDescentSpeed;
  196. /// <summary>
  197. /// 锁付下降速度
  198. /// </summary>
  199. public float LockDescentSpeed
  200. {
  201. get { return __LockDescentSpeed; }
  202. set { SetProperty(ref __LockDescentSpeed, value); }
  203. }
  204. private int __FeederNumber;
  205. /// <summary>
  206. /// 供料器编号
  207. /// </summary>
  208. public int FeederNumber
  209. {
  210. get { return __FeederNumber; }
  211. set { SetProperty(ref __FeederNumber, value); }
  212. }
  213. private float _FeederBatchNumber;
  214. /// <summary>
  215. /// 螺丝批次编号
  216. /// </summary>
  217. public float FeederBatchNumber
  218. {
  219. get { return _FeederBatchNumber; }
  220. set { SetProperty(ref _FeederBatchNumber, value); }
  221. }
  222. private string __NozzleNumber;
  223. /// <summary>
  224. /// 披头编号
  225. /// </summary>
  226. [SugarColumn(IsNullable = true)]
  227. public string NozzleNumber
  228. {
  229. get { return __NozzleNumber; }
  230. set { SetProperty(ref __NozzleNumber, value); }
  231. }
  232. //当前的操作员名称
  233. private string _OperatorName;
  234. [SugarColumn(IsNullable = true)]
  235. public string OperatorName
  236. {
  237. get { return _OperatorName; }
  238. set { SetProperty(ref _OperatorName, value); }
  239. }
  240. private string _ProductImagePath;
  241. /// <summary>
  242. /// 产品图片路径
  243. /// </summary>
  244. [SugarColumn(IsNullable = true)]
  245. public string ProductImagePath
  246. {
  247. get { return _ProductImagePath; }
  248. set { SetProperty(ref _ProductImagePath, value); }
  249. }
  250. /// <summary>
  251. /// 锁付曲线数据列表
  252. /// </summary>
  253. [SugarColumn(IsIgnore = true)]
  254. public List<WaveData> WaveDatas { get; set; } = new List<WaveData>();
  255. public LockResult()
  256. {
  257. // 默认构造函数
  258. Timestamp = DateTime.Now;
  259. }
  260. public LockResult(int number, string productNumber, float lockTurns, float lockTorque, bool lockPassed)
  261. {
  262. Number = number;
  263. ProductNumber = productNumber;
  264. Timestamp = DateTime.Now;
  265. LockTurns = lockTurns;
  266. LockTorque = lockTorque;
  267. LockPassed = lockPassed;
  268. }
  269. public LockResult Clone()
  270. {
  271. return new LockResult
  272. {
  273. Number = this.Number,
  274. ProductNumber = this.ProductNumber,
  275. Timestamp = this.Timestamp,
  276. LockTurns = this.LockTurns,
  277. LockTorque = this.LockTorque,
  278. LockDuration = this.LockDuration,
  279. LockPassed = this.LockPassed,
  280. ScrewdriverProgramNumber = this.ScrewdriverProgramNumber,
  281. Pressure = this.Pressure,
  282. TargetTorque = this.TargetTorque,
  283. TargetTurnsUpperLimit = this.TargetTurnsUpperLimit,
  284. TargetTurnsLowerLimit = this.TargetTurnsLowerLimit,
  285. TargetLockSpeed = this.TargetLockSpeed,
  286. StartPositionX = this.StartPositionX,
  287. StartPositionY = this.StartPositionY,
  288. StartPositionZ = this.StartPositionZ,
  289. EndPositionZ = this.EndPositionZ,
  290. LockDescentSpeed = this.LockDescentSpeed,
  291. FeederNumber = this.FeederNumber,
  292. NozzleNumber = this.NozzleNumber,
  293. OperatorName = this.OperatorName,
  294. ProductImagePath = this.ProductImagePath,
  295. ScrewdriverGetDataSucceed = this.ScrewdriverGetDataSucceed,
  296. WaveDatas = new List<WaveData>(this.WaveDatas)
  297. };
  298. }
  299. /// <summary>
  300. /// 将当前的锁付结果结果及波形数据存储至.csv文件中
  301. /// </summary>
  302. /// <param name="filePath"></param>
  303. public void SaveToCsv(string filePath)
  304. {
  305. string EscapeCsv(object value)
  306. {
  307. if (value == null) return "\"\"";
  308. string s;
  309. if (value is DateTime dt)
  310. {
  311. s = dt.ToString("o"); // ISO 8601
  312. }
  313. else
  314. {
  315. s = Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture);
  316. }
  317. s = s.Replace("\"", "\"\""); // escape quotes
  318. return $"\"{s}\"";
  319. }
  320. using (var writer = new System.IO.StreamWriter(filePath, false, System.Text.Encoding.UTF8))
  321. {
  322. // 写入锁付结果信息表头(已新增字段)
  323. 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");
  324. // 写入锁付结果数据行(所有字段均做 CSV 转义)
  325. writer.WriteLine(string.Join(",",
  326. EscapeCsv(Number),
  327. EscapeCsv(ProductNumber),
  328. EscapeCsv(Timestamp),
  329. EscapeCsv(LockTurns),
  330. EscapeCsv(LockTorque),
  331. EscapeCsv(LockDuration),
  332. EscapeCsv(LockPassed),
  333. EscapeCsv(ScrewdriverProgramNumber),
  334. EscapeCsv(Pressure),
  335. EscapeCsv(TargetTorque),
  336. EscapeCsv(TargetTurnsUpperLimit),
  337. EscapeCsv(TargetTurnsLowerLimit),
  338. EscapeCsv(TargetLockSpeed),
  339. EscapeCsv(StartPositionX),
  340. EscapeCsv(StartPositionY),
  341. EscapeCsv(StartPositionZ),
  342. EscapeCsv(EndPositionZ),
  343. EscapeCsv(LockDescentSpeed),
  344. EscapeCsv(FeederNumber),
  345. EscapeCsv(FeederBatchNumber),
  346. EscapeCsv(NozzleNumber),
  347. EscapeCsv(ResultDetails),
  348. EscapeCsv(ScrewdriverGetDataSucceed),
  349. EscapeCsv(OperatorName),
  350. EscapeCsv(ProductImagePath)
  351. ));
  352. // 写入波形数据
  353. writer.WriteLine();
  354. writer.WriteLine("WaveDataIndex,LockAngle,Torque,Turns,Speed,Slopes");
  355. for (int i = 0; i < WaveDatas.Count; i++)
  356. {
  357. var waveData = WaveDatas[i];
  358. writer.WriteLine(string.Join(",",
  359. EscapeCsv(i),
  360. EscapeCsv(waveData.LockAngle),
  361. EscapeCsv(waveData.Torque),
  362. EscapeCsv(waveData.Turns),
  363. EscapeCsv(waveData.Speed),
  364. EscapeCsv(waveData.Slopes)
  365. ));
  366. }
  367. }
  368. }
  369. }
  370. }