using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Prism.Mvvm; using SqlSugar; using TouchSocket.Core; namespace TeamAAS_VP.Models { public class LockResult : BindableBase { private int __Number; /// /// 序号(界面显示用) /// public int Number { get { return __Number; } set { SetProperty(ref __Number, value); } } private DateTime __Timestamp; /// /// 时间戳 /// public DateTime Timestamp { get { return __Timestamp; } set { SetProperty(ref __Timestamp, value); } } private float __LockTurns; /// /// 锁付圈数 /// public float LockTurns { get { return __LockTurns; } set { SetProperty(ref __LockTurns, value); } } private float __LockTorque; /// /// 锁付扭矩 /// public float LockTorque { get { return __LockTorque; } set { SetProperty(ref __LockTorque, value); } } private float __LockDuration; /// /// 锁付用时 /// public float LockDuration { get { return __LockDuration; } set { SetProperty(ref __LockDuration, value); } } private bool __LockPassed; /// /// 锁付结果(是否通过) /// public bool LockPassed { get { return __LockPassed; } set { SetProperty(ref __LockPassed, value); } } private int __ScrewdriverProgramNumber; /// /// 电批程序号 /// public int ScrewdriverProgramNumber { get { return __ScrewdriverProgramNumber; } set { SetProperty(ref __ScrewdriverProgramNumber, value); } } /// /// 锁付曲线图片保存路径(为空则不导出) /// [SugarColumn(IsIgnore = true)] public string LockCurveImagePath { get; set; } /// /// 锁付曲线 CSV 保存路径(数据库关联字段) /// [SugarColumn(IsIgnore = true)] public string CurveCsvPath { get; set; } /// /// 是否为界面展示用演示数据(不入库、不导出) /// [SugarColumn(IsIgnore = true)] public bool IsDemoData { get; set; } /// /// 锁付曲线数据列表 /// [SugarColumn(IsIgnore = true)] public List WaveDatas { get; set; } = new List(); public LockResult() { // 默认构造函数 Timestamp = DateTime.Now; } public LockResult(float lockTurns, float lockTorque, bool lockPassed) { Timestamp = DateTime.Now; LockTurns = lockTurns; LockTorque = lockTorque; LockPassed = lockPassed; } public LockResult Clone() { return new LockResult { Number = this.Number, Timestamp = this.Timestamp, LockTurns = this.LockTurns, LockTorque = this.LockTorque, LockDuration = this.LockDuration, LockPassed = this.LockPassed, ScrewdriverProgramNumber = this.ScrewdriverProgramNumber, LockCurveImagePath = this.LockCurveImagePath, CurveCsvPath = this.CurveCsvPath, IsDemoData = this.IsDemoData, WaveDatas = new List(this.WaveDatas), }; } /// /// 将当前的锁付结果结果及波形数据存储至.csv文件中 /// /// public void SaveToCsv(string filePath) { string EscapeCsv(object value) { if ( value == null ) return "\"\""; string s; if ( value is DateTime dt ) { s = dt.ToString("o"); // ISO 8601 } else { s = Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture); } s = s.Replace("\"", "\"\""); // escape quotes return $"\"{s}\""; } using ( var writer = new System.IO.StreamWriter(filePath, false, System.Text.Encoding.UTF8) ) { // 写入锁付结果信息表头(已新增字段) writer.WriteLine("Number,Timestamp,LockTurns,LockTorque,LockDuration,LockPassed,ScrewdriverProgramNumber"); writer.WriteLine(string.Join(",", EscapeCsv(Number), EscapeCsv(Timestamp), EscapeCsv(LockTurns), EscapeCsv(LockTorque), EscapeCsv(LockDuration), EscapeCsv(LockPassed), EscapeCsv(ScrewdriverProgramNumber) )); // 写入波形数据 writer.WriteLine(); writer.WriteLine("WaveDataIndex,Time,LockAngle,Torque,Turns,Speed,Slopes"); for ( int i = 0; i < WaveDatas.Count; i++ ) { var waveData = WaveDatas[i]; writer.WriteLine(string.Join(",", EscapeCsv(i), EscapeCsv(waveData.Time), EscapeCsv(waveData.LockAngle), EscapeCsv(waveData.Torque), EscapeCsv(waveData.Turns), EscapeCsv(waveData.Speed), EscapeCsv(waveData.Slopes) )); } } } /// /// 异步保存到csv /// /// /// public async System.Threading.Tasks.Task SaveToCsvAsync(string filePath) { await System.Threading.Tasks.Task.Run(() => { try { SaveToCsv(filePath); } catch ( Exception ex ) { LogHelper.WriteLogError("保存锁付数据至CSV时出错!", ex); } }); } } /// /// 曲线数据结构,包含速度、扭矩、角度、圈数、斜率与时间。 /// public struct WaveData { /// /// 速度 /// public double Speed { get; set; } /// /// 扭矩 /// public double Torque { get; set; } /// /// 角度 /// public double LockAngle { get; set; } /// /// 圈数 /// public double Turns { get; set; } /// /// 斜率 /// public double Slopes { get; set; } /// /// 时间(秒) /// public double Time { get; set; } } }