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; }
}
}