using Prism.Mvvm; using System; using System.Collections.Generic; using static TeamAAS_VP.Core.ScrewDriver.XYD_ScrewDriver; using SqlSugar; namespace TeamAAS_VP.Models { public class LockResult : BindableBase { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } private int __Number; /// /// 螺丝编号 /// public int Number { get { return __Number; } set { SetProperty(ref __Number, value); } } private string __ProductNumber; /// /// 产品编号 /// [SugarColumn(IsNullable = true)] public string ProductNumber { get { return __ProductNumber; } set { SetProperty(ref __ProductNumber, 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 string _ResultDetails; /// /// 结果详情 /// [SugarColumn(IsNullable = true)] public string ResultDetails { get { return _ResultDetails; } set { SetProperty(ref _ResultDetails, value); } } private int __ScrewdriverProgramNumber; /// /// 电批程序号 /// public int ScrewdriverProgramNumber { get { return __ScrewdriverProgramNumber; } set { SetProperty(ref __ScrewdriverProgramNumber, value); } } private float __Pressure; /// /// 压力值 /// public float Pressure { get { return __Pressure; } set { SetProperty(ref __Pressure, value); } } private float __TargetTorque; /// /// 目标扭矩 /// public float TargetTorque { get { return __TargetTorque; } set { SetProperty(ref __TargetTorque, value); } } private float __TargetTurnsUpperLimit; /// /// 目标圈数上限 /// public float TargetTurnsUpperLimit { get { return __TargetTurnsUpperLimit; } set { SetProperty(ref __TargetTurnsUpperLimit, value); } } private float __TargetTurnsLowerLimit; /// /// 目标圈数下限 /// public float TargetTurnsLowerLimit { get { return __TargetTurnsLowerLimit; } set { SetProperty(ref __TargetTurnsLowerLimit, value); } } private float __TargetLockSpeed; /// /// 目标锁付速度 /// public float TargetLockSpeed { get { return __TargetLockSpeed; } set { SetProperty(ref __TargetLockSpeed, value); } } private bool _ScrewdriverGetDataSucceed; /// /// 电批数据是否获取成功 /// public bool ScrewdriverGetDataSucceed { get { return _ScrewdriverGetDataSucceed; } set { SetProperty(ref _ScrewdriverGetDataSucceed, value); } } private float __StartPositionX; /// /// 锁付位置坐标 X 起始值 /// public float StartPositionX { get { return __StartPositionX; } set { SetProperty(ref __StartPositionX, value); } } private float __StartPositionY; /// /// 锁付位置坐标 Y 起始值 /// public float StartPositionY { get { return __StartPositionY; } set { SetProperty(ref __StartPositionY, value); } } private float __StartPositionZ; /// /// 锁付位置坐标 Z 起始值 /// public float StartPositionZ { get { return __StartPositionZ; } set { SetProperty(ref __StartPositionZ, value); } } private float __EndPositionZ; /// /// Z 终点值 /// public float EndPositionZ { get { return __EndPositionZ; } set { SetProperty(ref __EndPositionZ, value); } } private float __LockDescentSpeed; /// /// 锁付下降速度 /// public float LockDescentSpeed { get { return __LockDescentSpeed; } set { SetProperty(ref __LockDescentSpeed, value); } } private int __FeederNumber; /// /// 供料器编号 /// public int FeederNumber { get { return __FeederNumber; } set { SetProperty(ref __FeederNumber, value); } } private float _FeederBatchNumber; /// /// 螺丝批次编号 /// public float FeederBatchNumber { get { return _FeederBatchNumber; } set { SetProperty(ref _FeederBatchNumber, value); } } private string __NozzleNumber; /// /// 披头编号 /// [SugarColumn(IsNullable = true)] public string NozzleNumber { get { return __NozzleNumber; } set { SetProperty(ref __NozzleNumber, value); } } //当前的操作员名称 private string _OperatorName; [SugarColumn(IsNullable = true)] public string OperatorName { get { return _OperatorName; } set { SetProperty(ref _OperatorName, value); } } private string _ProductImagePath; /// /// 产品图片路径 /// [SugarColumn(IsNullable = true)] public string ProductImagePath { get { return _ProductImagePath; } set { SetProperty(ref _ProductImagePath, value); } } /// /// 锁付曲线数据列表 /// [SugarColumn(IsIgnore = true)] public List WaveDatas { get; set; } = new List(); public LockResult() { // 默认构造函数 Timestamp = DateTime.Now; } public LockResult(int number, string productNumber, float lockTurns, float lockTorque, bool lockPassed) { Number = number; ProductNumber = productNumber; Timestamp = DateTime.Now; LockTurns = lockTurns; LockTorque = lockTorque; LockPassed = lockPassed; } public LockResult Clone() { return new LockResult { Number = this.Number, ProductNumber = this.ProductNumber, Timestamp = this.Timestamp, LockTurns = this.LockTurns, LockTorque = this.LockTorque, LockDuration = this.LockDuration, LockPassed = this.LockPassed, ScrewdriverProgramNumber = this.ScrewdriverProgramNumber, Pressure = this.Pressure, TargetTorque = this.TargetTorque, TargetTurnsUpperLimit = this.TargetTurnsUpperLimit, TargetTurnsLowerLimit = this.TargetTurnsLowerLimit, TargetLockSpeed = this.TargetLockSpeed, StartPositionX = this.StartPositionX, StartPositionY = this.StartPositionY, StartPositionZ = this.StartPositionZ, EndPositionZ = this.EndPositionZ, LockDescentSpeed = this.LockDescentSpeed, FeederNumber = this.FeederNumber, NozzleNumber = this.NozzleNumber, OperatorName = this.OperatorName, ProductImagePath = this.ProductImagePath, ScrewdriverGetDataSucceed = this.ScrewdriverGetDataSucceed, 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,ProductNumber,Timestamp,LockTurns,LockTorque,LockDuration,LockPassed,ScrewdriverProgramNumber,Pressure,TargetTorque,TargetTurnsUpperLimit,TargetTurnsLowerLimit,TargetLockSpeed,StartPositionX,StartPositionY,StartPositionZ,EndPositionZ,LockDescentSpeed,FeederNumber,FeederBatchNumber,NozzleNumber,ResultDetails,ScrewdriverGetDataSucceed,OperatorName,ProductImagePath"); // 写入锁付结果数据行(所有字段均做 CSV 转义) writer.WriteLine(string.Join(",", EscapeCsv(Number), EscapeCsv(ProductNumber), EscapeCsv(Timestamp), EscapeCsv(LockTurns), EscapeCsv(LockTorque), EscapeCsv(LockDuration), EscapeCsv(LockPassed), EscapeCsv(ScrewdriverProgramNumber), EscapeCsv(Pressure), EscapeCsv(TargetTorque), EscapeCsv(TargetTurnsUpperLimit), EscapeCsv(TargetTurnsLowerLimit), EscapeCsv(TargetLockSpeed), EscapeCsv(StartPositionX), EscapeCsv(StartPositionY), EscapeCsv(StartPositionZ), EscapeCsv(EndPositionZ), EscapeCsv(LockDescentSpeed), EscapeCsv(FeederNumber), EscapeCsv(FeederBatchNumber), EscapeCsv(NozzleNumber), EscapeCsv(ResultDetails), EscapeCsv(ScrewdriverGetDataSucceed), EscapeCsv(OperatorName), EscapeCsv(ProductImagePath) )); // 写入波形数据 writer.WriteLine(); writer.WriteLine("WaveDataIndex,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.LockAngle), EscapeCsv(waveData.Torque), EscapeCsv(waveData.Turns), EscapeCsv(waveData.Speed), EscapeCsv(waveData.Slopes) )); } } } } }