From bf8d988c755cb96fdf24581de526d1724f479fca Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Sat, 26 Jul 2025 14:58:10 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= =?UTF-8?q?=E5=88=86=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Ink Canvas/Helpers/DeviceIdentifier.cs | 383 ++++++++++++++++++++----- 1 file changed, 316 insertions(+), 67 deletions(-) diff --git a/Ink Canvas/Helpers/DeviceIdentifier.cs b/Ink Canvas/Helpers/DeviceIdentifier.cs index f9ad2d69..0bc68a6f 100644 --- a/Ink Canvas/Helpers/DeviceIdentifier.cs +++ b/Ink Canvas/Helpers/DeviceIdentifier.cs @@ -481,12 +481,80 @@ namespace Ink_Canvas.Helpers [JsonProperty("lastModified")] public DateTime LastModified { get; set; } + // 每周统计数据 + [JsonProperty("weeklyLaunchCount")] + public int WeeklyLaunchCount { get; set; } + + [JsonProperty("weeklyUsageMinutes")] + public long WeeklyUsageMinutes { get; set; } + + [JsonProperty("weekStartDate")] + public DateTime WeekStartDate { get; set; } + + [JsonProperty("lastWeekLaunchCount")] + public int LastWeekLaunchCount { get; set; } + + [JsonProperty("lastWeekUsageMinutes")] + public long LastWeekUsageMinutes { get; set; } + + /// + /// 检查并重置每周统计数据 + /// + public void CheckAndResetWeeklyStats() + { + var now = DateTime.Now; + var currentWeekStart = GetWeekStartDate(now); + + // 如果是新的一周,重置统计 + if (WeekStartDate == DateTime.MinValue || currentWeekStart > WeekStartDate) + { + // 保存上周数据 + LastWeekLaunchCount = WeeklyLaunchCount; + LastWeekUsageMinutes = WeeklyUsageMinutes; + + // 重置本周数据 + WeeklyLaunchCount = 0; + WeeklyUsageMinutes = 0; + WeekStartDate = currentWeekStart; + + LogHelper.WriteLogToFile($"DeviceIdentifier | 每周统计重置 - 上周启动: {LastWeekLaunchCount}次, 上周使用: {LastWeekUsageMinutes}分钟"); + } + } + + /// + /// 获取指定日期所在周的开始日期(周一) + /// + public DateTime GetWeekStartDate(DateTime date) + { + var dayOfWeek = (int)date.DayOfWeek; + var daysToSubtract = dayOfWeek == 0 ? 6 : dayOfWeek - 1; // 周日=0,需要减6天到周一 + return date.Date.AddDays(-daysToSubtract); + } + + /// + /// 记录本周的启动 + /// + public void RecordWeeklyLaunch() + { + CheckAndResetWeeklyStats(); + WeeklyLaunchCount++; + } + + /// + /// 记录本周的使用时长 + /// + public void RecordWeeklyUsage(long minutes) + { + CheckAndResetWeeklyStats(); + WeeklyUsageMinutes += minutes; + } + /// /// 计算数据哈希值用于完整性验证 /// public void UpdateDataHash() { - var dataString = $"{DeviceId}|{LaunchCount}|{TotalUsageMinutes}|{LastLaunchTime:yyyyMMddHHmmss}|{DataIntegrityKey}"; + var dataString = $"{DeviceId}|{LaunchCount}|{TotalUsageMinutes}|{LastLaunchTime:yyyyMMddHHmmss}|{WeeklyLaunchCount}|{WeeklyUsageMinutes}|{DataIntegrityKey}"; using (var sha256 = SHA256.Create()) { var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(dataString)); @@ -502,7 +570,7 @@ namespace Ink_Canvas.Helpers { try { - var dataString = $"{DeviceId}|{LaunchCount}|{TotalUsageMinutes}|{LastLaunchTime:yyyyMMddHHmmss}|{DataIntegrityKey}"; + var dataString = $"{DeviceId}|{LaunchCount}|{TotalUsageMinutes}|{LastLaunchTime:yyyyMMddHHmmss}|{WeeklyLaunchCount}|{WeeklyUsageMinutes}|{DataIntegrityKey}"; using (var sha256 = SHA256.Create()) { var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(dataString)); @@ -518,23 +586,23 @@ namespace Ink_Canvas.Helpers } /// - /// 更新优先级枚举 + /// 更新推送优先级枚举 /// public enum UpdatePriority { - High = 1, // 高频用户,优先推送 - Medium = 2, // 中频用户,正常推送 - Low = 3 // 低频用户,延迟推送 + High = 1, // 高优先级:立即推送更新 + Medium = 2, // 中优先级:延迟1-3天推送 + Low = 3 // 低优先级:延迟3-14天推送 } /// - /// 使用频率枚举 + /// 用户使用频率分类枚举 /// public enum UsageFrequency { - High = 1, // 高频用户:每周使用超过5次或总时长超过10小时 - Medium = 2, // 中频用户:每周使用2-5次或总时长2-10小时 - Low = 3 // 低频用户:每周使用少于2次或总时长少于2小时 + High = 1, // 高频用户:综合评分≥80分(活跃度高、使用时长长、启动频繁) + Medium = 2, // 中频用户:综合评分40-79分(中等活跃度和使用强度) + Low = 3 // 低频用户:综合评分<40分(活跃度低、使用时长短、启动较少) } /// @@ -551,6 +619,9 @@ namespace Ink_Canvas.Helpers stats.LaunchCount++; stats.DeviceId = DeviceId; + // 记录每周启动次数 + stats.RecordWeeklyLaunch(); + // 计算使用频率 CalculateUsageFrequency(stats); @@ -559,7 +630,7 @@ namespace Ink_Canvas.Helpers SaveUsageStats(stats); - LogHelper.WriteLogToFile($"DeviceIdentifier | 记录应用启动 - 设备ID: {DeviceId}, 启动次数: {stats.LaunchCount}"); + LogHelper.WriteLogToFile($"DeviceIdentifier | 记录应用启动 - 设备ID: {DeviceId}, 总启动: {stats.LaunchCount}次, 本周启动: {stats.WeeklyLaunchCount}次"); } } catch (Exception ex) @@ -580,10 +651,15 @@ namespace Ink_Canvas.Helpers var stats = LoadUsageStats(); // 计算本次会话时长 + long sessionMinutes = 0; if (stats.LastLaunchTime != DateTime.MinValue) { var sessionDuration = DateTime.Now - stats.LastLaunchTime; - stats.TotalUsageMinutes += (long)sessionDuration.TotalMinutes; + sessionMinutes = (long)sessionDuration.TotalMinutes; + stats.TotalUsageMinutes += sessionMinutes; + + // 记录每周使用时长 + stats.RecordWeeklyUsage(sessionMinutes); // 更新平均会话时长 if (stats.LaunchCount > 0) @@ -600,7 +676,7 @@ namespace Ink_Canvas.Helpers SaveUsageStats(stats); - LogHelper.WriteLogToFile($"DeviceIdentifier | 记录应用退出 - 总使用时长: {stats.TotalUsageMinutes}分钟, 平均会话: {stats.AverageSessionMinutes:F1}分钟"); + LogHelper.WriteLogToFile($"DeviceIdentifier | 记录应用退出 - 本次会话: {sessionMinutes}分钟, 总时长: {stats.TotalUsageMinutes}分钟, 本周时长: {stats.WeeklyUsageMinutes}分钟"); } } catch (Exception ex) @@ -610,101 +686,102 @@ namespace Ink_Canvas.Helpers } /// - /// 计算使用频率和更新优先级(综合考虑时间和使用模式) + /// 计算使用频率和更新优先级(基于真实的每周统计数据) + /// 通过多维度评分系统确定用户类型:高频(≥80分)、中频(40-79分)、低频(<40分) /// private static void CalculateUsageFrequency(UsageStats stats) { try { + // 确保每周统计数据是最新的 + stats.CheckAndResetWeeklyStats(); + // 计算最近活跃度 var daysSinceLastUse = (DateTime.Now - stats.LastLaunchTime).TotalDays; - // 计算平均使用强度 - var avgMinutesPerLaunch = stats.LaunchCount > 0 ? (double)stats.TotalUsageMinutes / stats.LaunchCount : 0; + // 使用真实的每周数据 + var currentWeekLaunches = stats.WeeklyLaunchCount; + var currentWeekMinutes = stats.WeeklyUsageMinutes; - // 估算最近使用情况(基于历史模式) - var estimatedRecentLaunches = EstimateRecentActivity(stats, daysSinceLastUse); - var estimatedRecentMinutes = estimatedRecentLaunches * avgMinutesPerLaunch; + // 如果本周数据不足,参考上周数据 + var weeklyLaunches = currentWeekLaunches > 0 ? currentWeekLaunches : stats.LastWeekLaunchCount; + var weeklyMinutes = currentWeekMinutes > 0 ? currentWeekMinutes : stats.LastWeekUsageMinutes; - // 综合评分系统 - var frequencyScore = CalculateFrequencyScore(stats, daysSinceLastUse, estimatedRecentLaunches, estimatedRecentMinutes); + // 综合评分系统(0-100分) + var frequencyScore = CalculateFrequencyScoreWithWeeklyData(stats, daysSinceLastUse, weeklyLaunches, weeklyMinutes); - // 根据综合评分确定频率和优先级 + // 根据综合评分确定频率分类和更新优先级 if (frequencyScore >= 80) { - stats.UsageFrequency = UsageFrequency.High; + stats.UsageFrequency = UsageFrequency.High; // 高频用户:立即推送更新 stats.UpdatePriority = UpdatePriority.High; } else if (frequencyScore >= 40) { - stats.UsageFrequency = UsageFrequency.Medium; + stats.UsageFrequency = UsageFrequency.Medium; // 中频用户:延迟1-3天推送 stats.UpdatePriority = UpdatePriority.Medium; } else { - stats.UsageFrequency = UsageFrequency.Low; + stats.UsageFrequency = UsageFrequency.Low; // 低频用户:延迟3-14天推送 stats.UpdatePriority = UpdatePriority.Low; } LogHelper.WriteLogToFile($"DeviceIdentifier | 使用频率计算 - 评分: {frequencyScore}, 频率: {stats.UsageFrequency}, " + - $"优先级: {stats.UpdatePriority}, 最后使用: {daysSinceLastUse:F1}天前"); + $"优先级: {stats.UpdatePriority}, 本周启动: {currentWeekLaunches}次, 本周时长: {currentWeekMinutes}分钟"); } catch (Exception ex) { LogHelper.WriteLogToFile($"DeviceIdentifier | 计算使用频率失败: {ex.Message}", LogHelper.LogType.Error); - // 默认设置为中等优先级 + // 默认设置为中等频率和优先级 stats.UsageFrequency = UsageFrequency.Medium; stats.UpdatePriority = UpdatePriority.Medium; } } /// - /// 估算最近活跃度 + /// 基于每周真实数据计算综合频率评分(0-100分) + /// 评分标准:≥80分=高频用户,40-79分=中频用户,<40分=低频用户 /// - private static int EstimateRecentActivity(UsageStats stats, double daysSinceLastUse) - { - if (daysSinceLastUse > 30) return 0; // 超过30天未使用 - if (daysSinceLastUse > 14) return Math.Min(1, stats.LaunchCount / 50); // 14-30天,很少活动 - if (daysSinceLastUse > 7) return Math.Min(3, stats.LaunchCount / 20); // 7-14天,少量活动 - if (daysSinceLastUse > 3) return Math.Min(7, stats.LaunchCount / 10); // 3-7天,中等活动 - return Math.Min(15, stats.LaunchCount / 5); // 3天内,高活动 - } - - /// - /// 计算综合频率评分(0-100分) - /// - private static int CalculateFrequencyScore(UsageStats stats, double daysSinceLastUse, - int estimatedRecentLaunches, double estimatedRecentMinutes) + /// 使用统计数据 + /// 距离最后使用的天数 + /// 每周启动次数 + /// 每周使用时长 + /// 综合评分(0-100分) + private static int CalculateFrequencyScoreWithWeeklyData(UsageStats stats, double daysSinceLastUse, + long weeklyLaunches, long weeklyMinutes) { var score = 0; - // 最近活跃度评分(40分) - if (daysSinceLastUse <= 1) score += 40; - else if (daysSinceLastUse <= 3) score += 35; - else if (daysSinceLastUse <= 7) score += 25; - else if (daysSinceLastUse <= 14) score += 15; - else if (daysSinceLastUse <= 30) score += 5; + // 最近活跃度评分(40分)- 反映用户当前的活跃程度 + if (daysSinceLastUse <= 1) score += 40; // 1天内使用:非常活跃 + else if (daysSinceLastUse <= 3) score += 35; // 3天内使用:很活跃 + else if (daysSinceLastUse <= 7) score += 25; // 1周内使用:较活跃 + else if (daysSinceLastUse <= 14) score += 15; // 2周内使用:一般活跃 + else if (daysSinceLastUse <= 30) score += 5; // 1月内使用:不太活跃 - // 使用频率评分(30分) - if (estimatedRecentLaunches >= 10) score += 30; - else if (estimatedRecentLaunches >= 5) score += 20; - else if (estimatedRecentLaunches >= 2) score += 10; - else if (estimatedRecentLaunches >= 1) score += 5; + // 每周使用频率评分(30分)- 基于真实的每周启动次数 + if (weeklyLaunches >= 10) score += 30; // 10次以上:高频使用 + else if (weeklyLaunches >= 5) score += 20; // 5-9次:中高频使用 + else if (weeklyLaunches >= 3) score += 15; // 3-4次:中频使用 + else if (weeklyLaunches >= 1) score += 10; // 1-2次:低频使用 - // 使用时长评分(20分) - if (estimatedRecentMinutes >= 600) score += 20; // 10小时以上 - else if (estimatedRecentMinutes >= 300) score += 15; // 5小时以上 - else if (estimatedRecentMinutes >= 120) score += 10; // 2小时以上 - else if (estimatedRecentMinutes >= 60) score += 5; // 1小时以上 + // 每周使用时长评分(20分)- 基于真实的每周使用时长 + if (weeklyMinutes >= 600) score += 20; // 10小时以上:重度使用 + else if (weeklyMinutes >= 300) score += 15; // 5-10小时:中重度使用 + else if (weeklyMinutes >= 120) score += 10; // 2-5小时:中度使用 + else if (weeklyMinutes >= 60) score += 5; // 1-2小时:轻度使用 - // 历史使用深度评分(10分) - if (stats.TotalUsageMinutes >= 3000) score += 10; // 重度用户 - else if (stats.TotalUsageMinutes >= 1200) score += 7; // 中度用户 - else if (stats.TotalUsageMinutes >= 300) score += 4; // 轻度用户 + // 历史使用深度评分(10分)- 反映用户的长期使用习惯 + if (stats.TotalUsageMinutes >= 3000) score += 10; // 50小时以上:资深用户 + else if (stats.TotalUsageMinutes >= 1200) score += 7; // 20-50小时:中等用户 + else if (stats.TotalUsageMinutes >= 300) score += 4; // 5-20小时:新手用户 return Math.Min(100, score); } + + /// /// 获取当前更新优先级 /// @@ -1108,6 +1185,13 @@ namespace Ink_Canvas.Helpers var dataHash = key.GetValue("DataHash") as string; var lastUpdate = key.GetValue("LastUpdate") as string; + // 每周统计数据 + var weeklyLaunchCount = key.GetValue("WeeklyLaunchCount"); + var weeklyUsageMinutes = key.GetValue("WeeklyUsageMinutes"); + var weekStartDate = key.GetValue("WeekStartDate") as string; + var lastWeekLaunchCount = key.GetValue("LastWeekLaunchCount"); + var lastWeekUsageMinutes = key.GetValue("LastWeekUsageMinutes"); + if (!string.IsNullOrEmpty(deviceId) && launchCount != null) { var stats = new UsageStats @@ -1120,7 +1204,14 @@ namespace Ink_Canvas.Helpers UsageFrequency = frequency != null ? (UsageFrequency)Convert.ToInt32(frequency) : UsageFrequency.Medium, DataHash = dataHash, AverageSessionMinutes = 0, - LastUpdateCheck = DateTime.MinValue + LastUpdateCheck = DateTime.MinValue, + + // 每周统计数据 + WeeklyLaunchCount = weeklyLaunchCount != null ? Convert.ToInt32(weeklyLaunchCount) : 0, + WeeklyUsageMinutes = weeklyUsageMinutes != null ? Convert.ToInt64(weeklyUsageMinutes) : 0, + WeekStartDate = DateTime.TryParse(weekStartDate, out var wsd) ? wsd : DateTime.MinValue, + LastWeekLaunchCount = lastWeekLaunchCount != null ? Convert.ToInt32(lastWeekLaunchCount) : 0, + LastWeekUsageMinutes = lastWeekUsageMinutes != null ? Convert.ToInt64(lastWeekUsageMinutes) : 0 }; // 重新计算平均会话时长 @@ -1176,6 +1267,13 @@ namespace Ink_Canvas.Helpers var dataHash = key.GetValue("DH") as string; var lastUpdateBinary = key.GetValue("LU"); + // 每周统计数据 + var weeklyLaunchCount = key.GetValue("WLC"); + var weeklyUsageMinutes = key.GetValue("WUM"); + var weekStartDateBinary = key.GetValue("WSD"); + var lastWeekLaunchCount = key.GetValue("LWLC"); + var lastWeekUsageMinutes = key.GetValue("LWUM"); + if (launchCount != null && totalMinutes != null) { var stats = new UsageStats @@ -1188,7 +1286,14 @@ namespace Ink_Canvas.Helpers UsageFrequency = frequency != null ? (UsageFrequency)Convert.ToInt32(frequency) : UsageFrequency.Medium, DataHash = dataHash, AverageSessionMinutes = 0, - LastUpdateCheck = DateTime.MinValue + LastUpdateCheck = DateTime.MinValue, + + // 每周统计数据 + WeeklyLaunchCount = weeklyLaunchCount != null ? Convert.ToInt32(weeklyLaunchCount) : 0, + WeeklyUsageMinutes = weeklyUsageMinutes != null ? Convert.ToInt64(weeklyUsageMinutes) : 0, + WeekStartDate = weekStartDateBinary != null ? DateTime.FromBinary(Convert.ToInt64(weekStartDateBinary)) : DateTime.MinValue, + LastWeekLaunchCount = lastWeekLaunchCount != null ? Convert.ToInt32(lastWeekLaunchCount) : 0, + LastWeekUsageMinutes = lastWeekUsageMinutes != null ? Convert.ToInt64(lastWeekUsageMinutes) : 0 }; // 重新计算平均会话时长 @@ -1399,7 +1504,14 @@ namespace Ink_Canvas.Helpers key.SetValue("DataHash", stats.DataHash ?? ""); key.SetValue("LastUpdate", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); - LogHelper.WriteLogToFile($"DeviceIdentifier | 使用统计已保存到主注册表 - 启动次数: {stats.LaunchCount}, 使用时长: {stats.TotalUsageMinutes}分钟"); + // 每周统计数据 + key.SetValue("WeeklyLaunchCount", stats.WeeklyLaunchCount); + key.SetValue("WeeklyUsageMinutes", stats.WeeklyUsageMinutes); + key.SetValue("WeekStartDate", stats.WeekStartDate.ToString("yyyy-MM-dd")); + key.SetValue("LastWeekLaunchCount", stats.LastWeekLaunchCount); + key.SetValue("LastWeekUsageMinutes", stats.LastWeekUsageMinutes); + + LogHelper.WriteLogToFile($"DeviceIdentifier | 使用统计已保存到主注册表 - 总启动: {stats.LaunchCount}次, 本周启动: {stats.WeeklyLaunchCount}次, 总时长: {stats.TotalUsageMinutes}分钟, 本周时长: {stats.WeeklyUsageMinutes}分钟"); } else { @@ -1445,6 +1557,13 @@ namespace Ink_Canvas.Helpers key.SetValue("DH", stats.DataHash ?? ""); // DataHash key.SetValue("LU", DateTime.Now.ToBinary()); // LastUpdate + // 每周统计数据 + key.SetValue("WLC", stats.WeeklyLaunchCount); // WeeklyLaunchCount + key.SetValue("WUM", stats.WeeklyUsageMinutes); // WeeklyUsageMinutes + key.SetValue("WSD", stats.WeekStartDate.ToBinary()); // WeekStartDate + key.SetValue("LWLC", stats.LastWeekLaunchCount); // LastWeekLaunchCount + key.SetValue("LWUM", stats.LastWeekUsageMinutes); // LastWeekUsageMinutes + successCount++; LogHelper.WriteLogToFile($"DeviceIdentifier | 成功保存到备用注册表位置: {path}"); } @@ -2078,8 +2197,13 @@ namespace Ink_Canvas.Helpers if (stats != null) { summary.AppendLine($"数据完整性: {(stats.VerifyDataIntegrity() ? "✓" : "✗")}"); - summary.AppendLine($"启动次数: {stats.LaunchCount}"); - summary.AppendLine($"总使用时长: {stats.TotalUsageMinutes}分钟"); + summary.AppendLine($"总启动次数: {stats.LaunchCount}"); + summary.AppendLine($"总使用时长: {stats.TotalUsageMinutes}分钟 ({stats.TotalUsageMinutes / 60.0:F1}小时)"); + summary.AppendLine($"本周启动次数: {stats.WeeklyLaunchCount}"); + summary.AppendLine($"本周使用时长: {stats.WeeklyUsageMinutes}分钟 ({stats.WeeklyUsageMinutes / 60.0:F1}小时)"); + summary.AppendLine($"上周启动次数: {stats.LastWeekLaunchCount}"); + summary.AppendLine($"上周使用时长: {stats.LastWeekUsageMinutes}分钟 ({stats.LastWeekUsageMinutes / 60.0:F1}小时)"); + summary.AppendLine($"本周开始日期: {(stats.WeekStartDate != DateTime.MinValue ? stats.WeekStartDate.ToString("yyyy-MM-dd") : "未设置")}"); summary.AppendLine($"使用频率: {stats.UsageFrequency}"); summary.AppendLine($"更新优先级: {stats.UpdatePriority}"); summary.AppendLine($"最后修改: {stats.LastModified:yyyy-MM-dd HH:mm:ss}"); @@ -2202,6 +2326,131 @@ namespace Ink_Canvas.Helpers return GetUsageDataProtectionSummary(); } + /// + /// 测试每周重置功能 + /// + public static string TestWeeklyReset() + { + var results = new StringBuilder(); + results.AppendLine("每周重置功能测试:"); + + try + { + lock (fileLock) + { + var stats = LoadUsageStats(); + if (stats == null) + { + results.AppendLine("无法加载使用统计数据"); + return results.ToString(); + } + + results.AppendLine($"\n当前状态:"); + results.AppendLine($" 本周开始日期: {(stats.WeekStartDate != DateTime.MinValue ? stats.WeekStartDate.ToString("yyyy-MM-dd") : "未设置")}"); + results.AppendLine($" 本周启动次数: {stats.WeeklyLaunchCount}"); + results.AppendLine($" 本周使用时长: {stats.WeeklyUsageMinutes}分钟"); + results.AppendLine($" 上周启动次数: {stats.LastWeekLaunchCount}"); + results.AppendLine($" 上周使用时长: {stats.LastWeekUsageMinutes}分钟"); + + // 模拟跨周情况 + results.AppendLine($"\n模拟跨周测试:"); + var originalWeekStart = stats.WeekStartDate; + var originalWeeklyLaunches = stats.WeeklyLaunchCount; + var originalWeeklyMinutes = stats.WeeklyUsageMinutes; + + // 手动设置为上周 + stats.WeekStartDate = DateTime.Now.AddDays(-7).Date; + stats.WeeklyLaunchCount = 5; + stats.WeeklyUsageMinutes = 120; + + results.AppendLine($" 设置为上周数据 - 启动: {stats.WeeklyLaunchCount}次, 时长: {stats.WeeklyUsageMinutes}分钟"); + + // 触发重置检查 + stats.CheckAndResetWeeklyStats(); + + results.AppendLine($"\n重置后状态:"); + results.AppendLine($" 本周开始日期: {stats.WeekStartDate:yyyy-MM-dd}"); + results.AppendLine($" 本周启动次数: {stats.WeeklyLaunchCount}"); + results.AppendLine($" 本周使用时长: {stats.WeeklyUsageMinutes}分钟"); + results.AppendLine($" 上周启动次数: {stats.LastWeekLaunchCount}"); + results.AppendLine($" 上周使用时长: {stats.LastWeekUsageMinutes}分钟"); + + // 验证重置是否正确 + var currentWeekStart = stats.GetWeekStartDate(DateTime.Now); + if (stats.WeekStartDate == currentWeekStart && + stats.WeeklyLaunchCount == 0 && + stats.WeeklyUsageMinutes == 0 && + stats.LastWeekLaunchCount == 5 && + stats.LastWeekUsageMinutes == 120) + { + results.AppendLine($"\n✓ 每周重置功能工作正常"); + } + else + { + results.AppendLine($"\n✗ 每周重置功能异常"); + } + + // 恢复原始数据 + stats.WeekStartDate = originalWeekStart; + stats.WeeklyLaunchCount = originalWeeklyLaunches; + stats.WeeklyUsageMinutes = originalWeeklyMinutes; + stats.UpdateDataHash(); + SaveUsageStats(stats); + + results.AppendLine($"\n已恢复原始数据"); + + return results.ToString(); + } + } + catch (Exception ex) + { + results.AppendLine($"\n测试失败: {ex.Message}"); + LogHelper.WriteLogToFile($"DeviceIdentifier | 每周重置测试失败: {ex.Message}", LogHelper.LogType.Error); + return results.ToString(); + } + } + + /// + /// 手动触发每周重置(用于测试) + /// + public static string ManualWeeklyReset() + { + try + { + lock (fileLock) + { + var stats = LoadUsageStats(); + if (stats == null) + { + return "无法加载使用统计数据"; + } + + var beforeReset = $"重置前 - 本周启动: {stats.WeeklyLaunchCount}次, 本周时长: {stats.WeeklyUsageMinutes}分钟"; + + // 强制重置 + stats.LastWeekLaunchCount = stats.WeeklyLaunchCount; + stats.LastWeekUsageMinutes = stats.WeeklyUsageMinutes; + stats.WeeklyLaunchCount = 0; + stats.WeeklyUsageMinutes = 0; + stats.WeekStartDate = stats.GetWeekStartDate(DateTime.Now); + + stats.UpdateDataHash(); + SaveUsageStats(stats); + + var afterReset = $"重置后 - 本周启动: {stats.WeeklyLaunchCount}次, 本周时长: {stats.WeeklyUsageMinutes}分钟, 上周启动: {stats.LastWeekLaunchCount}次, 上周时长: {stats.LastWeekUsageMinutes}分钟"; + + LogHelper.WriteLogToFile($"DeviceIdentifier | 手动每周重置完成"); + return $"每周重置完成:\n{beforeReset}\n{afterReset}"; + } + } + catch (Exception ex) + { + var errorMsg = $"手动每周重置失败: {ex.Message}"; + LogHelper.WriteLogToFile($"DeviceIdentifier | {errorMsg}", LogHelper.LogType.Error); + return errorMsg; + } + } + /// /// 测试注册表写入操作 ///