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; } [SugarColumn(IsIgnore = true)] public string[] CsvData { get; set; } [SugarColumn(IsIgnore = true)] public DateTime TimeStart { get; set; } [SugarColumn(IsIgnore = true)] public DateTime TimeStop { 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 string _ProductName; /// /// 测量名称 /// public string ProductName { get { return _ProductName; } set { SetProperty(ref _ProductName, 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 string _PhotoName; /// /// 拍照结果(是否通过) /// public string PhotoName { get { return _PhotoName; } set { SetProperty(ref _PhotoName, value); } } private string _ResultData; /// /// 测量结果 /// public string ResultData { get { return _ResultData; } set { SetProperty(ref _ResultData, value); } } private string _ResultData1; /// /// 测量结果 /// public string ResultData1 { get { return _ResultData1; } set { SetProperty(ref _ResultData1, value); } } private string _UpLimit; /// /// 测量项的上限 /// public string UpLimit { get { return _UpLimit; } set { SetProperty(ref _UpLimit, value); } } private string _DownLimit; /// /// 测量项的下限 /// public string DownLimit { get { return _DownLimit; } set { SetProperty(ref _DownLimit, value); } } private string _MidLimit; /// /// 测量项平均值 /// public string MidLimit { get { return _MidLimit; } set { SetProperty(ref _MidLimit, 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; } private string _PhotoPassed; /// /// 拍照结果(是否通过) /// public string PhotoPassed { get { return _PhotoPassed; } set { SetProperty(ref _PhotoPassed, value); } } private string _PhotoCode; /// /// SN /// public string PhotoCode { get { return _PhotoCode; } set { SetProperty(ref _PhotoCode, value); } } 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(int number, string productNumber, bool PhotoPassed) { Number = number; ProductNumber = productNumber; Timestamp = DateTime.Now; LockPassed = PhotoPassed; } 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, WaveDatas = new List(this.WaveDatas) }; } /// /// 将当前的锁付结果结果及波形数据存储至.csv文件中 /// /// public void SaveToCsv(string filePath) { //using (var writer = new System.IO.StreamWriter(filePath)) //{ // // 写入锁付结果信息 // writer.WriteLine("Number,ProductNumber,Timestamp,LockTurns,LockTorque,LockDuration,LockPassed,ScrewdriverProgramNumber,Pressure,TargetTorque,TargetTurnsUpperLimit,TargetTurnsLowerLimit,TargetLockSpeed,StartPositionX,StartPositionY,StartPositionZ,EndPositionZ,LockDescentSpeed,FeederNumber,NozzleNumber"); // writer.WriteLine($"{Number},{ProductNumber},{Timestamp},{LockTurns},{LockTorque},{LockDuration},{LockPassed},{ScrewdriverProgramNumber},{Pressure},{TargetTorque},{TargetTurnsUpperLimit},{TargetTurnsLowerLimit},{TargetLockSpeed},{StartPositionX},{StartPositionY},{StartPositionZ},{EndPositionZ},{LockDescentSpeed},{FeederNumber},{NozzleNumber}"); // // 写入波形数据 // writer.WriteLine(); // writer.WriteLine("WaveDataIndex,LockAngle,Torque,Turns,Speed,Slopes"); // for (int i = 0; i < WaveDatas.Count; i++) // { // var waveData = WaveDatas[i]; // writer.WriteLine($"{i},{waveData.LockAngle},{waveData.Torque},{waveData.Turns},{waveData.Speed},{waveData.Slopes}"); // } //} 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}\""; } var dir = System.IO.Path.GetDirectoryName(filePath); if (!string.IsNullOrEmpty(dir) && !System.IO.Directory.Exists(dir)) { System.IO.Directory.CreateDirectory(dir); } bool fileExists = System.IO.File.Exists(filePath); using (var writer = new System.IO.StreamWriter(filePath, fileExists, System.Text.Encoding.UTF8)) { if (!fileExists) { // 写入锁付结果信息表头(已新增字段) writer.WriteLine("PPID,PROCESS_NAME,PROCESS_START_TIME,CTQ_NAME,CTQ_VALUE,CTQ_LSL,CTQ_USL,PROCESS_END_TIME,SUPPLIER_NAME,COMMODITY_TYPE,REVISION,WO#,MFG_LOT#," + "MFG_ASSY_LINE,PROCESS_OUTCOME,PROCESS_MACHINE_ID,CTQ_UNIT_OF_MEASURE,ERROR_MESSAGE,PD_ATTR_01,PD_ATTR_02,PD_ATTR_03,PD_ATTR_04,PD_ATTR_05"); } // 写入锁付结果数据行(所有字段均做 CSV 转义) writer.WriteLine(string.Join(",", EscapeCsv(PhotoCode), //PPID EscapeCsv("C KB 3D AOI "), //PROCESS_NAME EscapeCsv(TimeStart), //PROCESS_START_TIME EscapeCsv(CsvData[1]), //CTQ_NAME EscapeCsv(CsvData[2]), //CTQ_VALUE EscapeCsv(CsvData[4]), //CTQ_LSL EscapeCsv(CsvData[3]), //CTQ_USL EscapeCsv(TimeStop),//PROCESS_END_TIME EscapeCsv("Luxshare JS"),//SUPPLIER_NAME EscapeCsv("Mechanical Hardware_DOOR"),//COMMODITY_TYPE EscapeCsv("X00_DVT1.0"),//REVISION EscapeCsv("xxxx1"),//WO# EscapeCsv(""),//MFG_LOT# EscapeCsv("C Sub"),//MFG_ASSY_LINE EscapeCsv(PhotoPassed),//PROCESS_OUTCOME EscapeCsv("C SUB KB 3D AOI M08"),//PROCESS_MACHINE_ID EscapeCsv("MM"),//CTQ_UNIT_OF_MEASURE EscapeCsv(""),//ERROR_MESSAGE EscapeCsv("xxxxxxxx1"),//PD_ATTR_01 EscapeCsv(CsvData[5]),//PD_ATTR_02 EscapeCsv(""),//PD_ATTR_03 EscapeCsv(""),//PD_ATTR_04 EscapeCsv("") //PD_ATTR_05 )); //// 写入波形数据 //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) // )); //} } } /// /// 异步保存到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); } }); } } }