using Assets.Scripts.Apis; using Assets.Scripts.Apis.Models; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; namespace Assets.Scenes.Ride.Scripts.Model { public class RecorderDataModel { //private readonly MapWorkoutService service = new MapWorkoutService(); public UserResultModel CurrentUser { get; set; } /// /// 所属人ID /// public int BelongUserId { get { return CurrentUser.Id; } } /// /// 记录是否完毕 /// public bool IsCompleted { get; set; } /// /// 是否需要计算排名 /// public bool IsNeedRanking { get; set; } /// /// 骑行记录索引(用于中断骑行,继续骑行) /// public int ContinueIndex { get; set; } /// /// 骑行状态 /// public CyclingStateEnum CyclingState { get; set; } /// /// 赛事Id /// public int Competitionid { get; set; } /// /// 当前已经骑行的距离(表示用户现在在的距离,并不是实际骑的距离) /// public double EndDistance { get; set; } /// /// 上次骑行的距离 /// public double PreDistance { get; set; } /// /// 继续骑行记录标志 /// public string ContinueMark { get; set; } /// /// 厂商Id /// public int ManufacturerId { get; set; } public int? AntModelId { get; set; } /// /// 骑行数据 /// public List RiderDatas = new List(); /// /// 当前路线 /// public Route CurrentRoute { get; set; } /// /// 骑行记录Id /// //public string RecordId { get; private set; } /// /// 设备号 /// public string DeviceNumber { get; set; } /// /// 当前给骑行台发送数据的模式 /// public SendDataMode SendDataMode { get; set; } /// /// 临时使用的坡度 /// public double SlopeGrade { get; set; } /// /// 临时使用的海拔 /// public double Elevation { get; set; } /// /// 当前路书开始的距离 /// public double CurrentRouteStartDistance { get; set; } public DateTime StartTime { get; set; } /// /// 是否已经保存成功 /// public bool Saved { get; set; } public int GlobalCyclingId { get; set; } public void SaveLocal(CyclingModel cyclingModel, RouteResultParam selectParam, string imageName,string recordId) { Dictionary> recordData = new Dictionary>(); if (RiderDatas.Count <= 0) { return ; } string newFileName = Guid.NewGuid().ToString(); int FTP = Helper.GetFtp(); double NP = Helper.GetNP(RiderDatas); //强度 double IF = NP / FTP; //训练量 double TSS = (RiderDatas.Count * NP * IF) / (FTP * 3600) * 100; var averagePower = Helper.AveragePower(RiderDatas); // AntManufacturer manufacturer = service.GetAntManufacturer(ManufacturerId).data; //var recordId = Guid.NewGuid().ToString(); var ticks = RiderDatas.Last().Ticks; var interruptRecord = new MapInterruptRecord { Id = recordId, RouteId = CurrentRoute.RouteInstance.Id, RouteName = CurrentRoute.RouteInstance.Name, TotalDistance = CurrentRoute.RouteInstance.Distance, UserId = BelongUserId, RecordFileName = newFileName + ".txt", Ftp = FTP,//FTP设置 IF = Math.Round(IF, 2), Kj = RiderDatas.Sum(a => a._Power) / 1000,//消耗 Tss = Math.Round(TSS, 2), EndDistance = EndDistance, IsCompleted = IsCompleted, //TrainingTime = TimeHelper.FormatSeconds(RiderDatas.Last().Ticks),//训练时间 NormalizedPower = Math.Floor(NP),//标准化功率 AveragePower = averagePower,//平均功率 MaxPower = RiderDatas.Max(a => a._Power),//最大功率 WeightKg = Math.Round(averagePower / App.CurrentUser.Weight, 2), Weight = App.CurrentUser.Weight, BicycleWeight = App.CurrentUser.BicycleWeight, ContinueMark = ContinueMark, ContinueIndex = ContinueIndex, IsDelete = false, MapCompetitionId = Competitionid, ManufacturerName = "",//manufacturer == null ? "" : manufacturer.Name, DeviceNumber = DeviceNumber, IsRanking = IsNeedRanking, CurrentRouteStartDistance = CurrentRouteStartDistance, ManufacturerId = ManufacturerId, AntModelId = AntModelId, StartTime = StartTime, CreateTime = StartTime.AddSeconds(ticks), Ticks = ticks, Mode = cyclingModel.ToString(), Param = Newtonsoft.Json.JsonConvert.SerializeObject(selectParam), GlobalCyclingId = 0, Source = "", }; //var range = new MapSpeedRange().GetSpeedRange(RiderDatas, CurrentRoute.RouteInstance.Distance); interruptRecord.SpeedRange = null; //JsonConvert.SerializeObject(range); double process = Math.Round((EndDistance - interruptRecord.CurrentRouteStartDistance) / CurrentRoute.RouteInstance.Distance, 2); interruptRecord.Progress = process > 1 ? 1 : process; var cadences = RiderDatas.Where(a => a._Cadence.HasValue && a._Cadence.Value > 0); if (cadences.Any()) { interruptRecord.AverageCadence = Math.Round(cadences.Average(a => a._Cadence.GetValueOrDefault(0))); } interruptRecord.MaxCadence = Math.Round(RiderDatas.Max(a => a._Cadence.GetValueOrDefault(0))); interruptRecord.AverageHeartRate = Math.Round(RiderDatas.Average(a => a._HeartRate.GetValueOrDefault(0))); interruptRecord.MaxHeartRate = RiderDatas.Max(a => a._HeartRate.GetValueOrDefault(0)); //service.CreateRecordCyclingData(interruptRecord); //保存骑行记录txt var path = Helper.GetDataDir("MapWorkoutRecords" + "/" + interruptRecord.Id); var fname = path + "/" + newFileName + ".txt"; var files = new List(); using (var fs = new FileInfo(fname).OpenWrite()) { var stream = new StreamWriter(fs); stream.BaseStream.Seek(0, SeekOrigin.End); foreach (var item in RiderDatas) { stream.Write(item.Write() + "\r\n"); } stream.Flush(); stream.Close(); files.Add(fname); } //图片 if (!string.IsNullOrEmpty(imageName)) { files.Add(imageName); } //持久化序列化对象 var recordString = JsonConvert.SerializeObject(interruptRecord); var recordFilePath = path + "/" + "record" + ".txt"; System.IO.File.WriteAllText(recordFilePath, recordString); recordData.Add(interruptRecord, files); SaveDataAysnc(recordData); } /// /// 保存数据 /// /// /// public void SaveDataAysnc(Dictionary> data) { if (data != null && data.Count > 0) { var path = Helper.GetDataDir("MapWorkoutRecords"); Task.Run(() => { var record = data.FirstOrDefault(); MapInterruptRecordApi service = new MapInterruptRecordApi(); var result = service.Add(record.Key, record.Value); //删除文件 try { path = path + "/" + record.Key.Id; if (result.result && Directory.Exists(path)) { Helper.DelectDir(path); } } catch (Exception e) { Debug.Log(e.Message); } }); } } } }