跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

浏览文件

ChartPageVM.cs

966 行 · 33.7 KB历史下载
1using Core.Librarys;
2using Core.Models;
3using Core.Models.Db;
4using Core.Servicers.Interfaces;
5using System;
6using System.Collections.Generic;
7using System.Diagnostics;
8using System.Linq;
9using System.Text;
10using System.Text.RegularExpressions;
11using System.Threading.Tasks;
12using System.Windows.Documents;
13using UI.Controls;
14using UI.Controls.Charts.Model;
15using UI.Controls.Select;
16using UI.Models;
17using UI.Servicers;
18using UI.Views;
19
20namespace UI.ViewModels
21{
22 public class ChartPageVM : ChartPageModel
23 {
24 private readonly ICategorys categorys;
25 private readonly IData data;
26 private readonly MainViewModel mainVM;
27 private readonly IAppContextMenuServicer appContextMenuServicer;
28 private readonly IInputServicer inputServicer;
29 private readonly IWebData _webData;
30 private readonly IWebSiteContextMenuServicer _webSiteContextMenu;
31
32 private double totalTime_ = 0;
33 private int appCount_ = 0;
34 public Command ToDetailCommand { get; set; }
35 public Command RefreshCommand { get; set; }
36 public List<SelectItemModel> ChartDataModeOptions { get; set; }
37
38 public ChartPageVM(IData data, ICategorys categorys, MainViewModel mainVM, IAppContextMenuServicer appContextMenuServicer, IInputServicer inputServicer, IWebData webData_, IWebSiteContextMenuServicer webSiteContextMenu_)
39 {
40 this.data = data;
41 this.categorys = categorys;
42 this.mainVM = mainVM;
43 this.appContextMenuServicer = appContextMenuServicer;
44 this.inputServicer = inputServicer;
45 _webData = webData_;
46 _webSiteContextMenu = webSiteContextMenu_;
47
48 ToDetailCommand = new Command(new Action<object>(OnTodetailCommand));
49 RefreshCommand = new Command(new Action<object>(OnRefreshCommand));
50
51 TabbarData = new System.Collections.ObjectModel.ObservableCollection<string>()
52 {
53 "按天","按周","按月","按年"
54 };
55
56 var weekOptions = new List<SelectItemModel>();
57 weekOptions.Add(new SelectItemModel()
58 {
59 Name = "本周"
60 });
61 weekOptions.Add(new SelectItemModel()
62 {
63 Name = "上周"
64 });
65
66 var chartDataModeOptions = new List<SelectItemModel>
67 {
68 new SelectItemModel()
69 {
70 Id = 1,
71 Name = "默认视图",
72 },
73 new SelectItemModel()
74 {
75 Id = 2,
76 Name = "汇总视图"
77 },
78 new SelectItemModel()
79 {
80 Id = 3,
81 Name = "分类视图"
82 }
83 };
84
85 ChartDataModeOptions = chartDataModeOptions;
86 ChartDataMode = chartDataModeOptions[0];
87 //ShowType = ShowTypeOptions[0];
88 WeekOptions = weekOptions;
89 SelectedWeek = weekOptions[0];
90 MonthDate = DateTime.Now;
91 TabbarSelectedIndex = 0;
92 Date = DateTime.Now;
93 YearDate = DateTime.Now;
94
95 LoadDayData();
96
97 PropertyChanged += ChartPageVM_PropertyChanged;
98 inputServicer.OnKeyUpInput += InputServicer_OnKeyUpInput;
99 AppContextMenu = appContextMenuServicer.GetContextMenu();
100 WebSiteContextMenu = _webSiteContextMenu.GetContextMenu();
101 }
102
103
104 public override void Dispose()
105 {
106 base.Dispose();
107 PropertyChanged -= ChartPageVM_PropertyChanged;
108 Data = null;
109 TopData = null;
110 }
111 private void OnTodetailCommand(object obj)
112 {
113 var data = obj as ChartsDataModel;
114
115 if (data != null)
116 {
117 if (data.Data is WebSiteModel)
118 {
119 mainVM.Data = data.Data;
120 mainVM.Uri = nameof(WebSiteDetailPage);
121 }
122 else
123 {
124 var model = data.Data as DailyLogModel;
125 var app = model != null ? model.AppModel : null;
126
127 if (model == null)
128 {
129 app = (data.Data as HoursLogModel).AppModel;
130 }
131
132 if (app != null)
133 {
134 mainVM.Data = app;
135 mainVM.Uri = nameof(DetailPage);
136 }
137 }
138 }
139 }
140 private void OnRefreshCommand(object obj)
141 {
142 LoadData();
143 }
144
145 private void InputServicer_OnKeyUpInput(object sender, System.Windows.Forms.Keys key)
146 {
147 if (key == System.Windows.Forms.Keys.F5)
148 {
149 LoadData();
150 }
151 }
152
153
154 private void ChartPageVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
155 {
156 if (e.PropertyName == nameof(Date))
157 {
158 LoadDayData();
159 }
160 if (e.PropertyName == nameof(TabbarSelectedIndex))
161 {
162 IsCanColumnSelect = true;
163 LoadData();
164 }
165 if (e.PropertyName == nameof(SelectedWeek))
166 {
167 LoadWeekData();
168 }
169 if (e.PropertyName == nameof(MonthDate))
170 {
171 LoadMonthlyData();
172 }
173 if (e.PropertyName == nameof(YearDate))
174 {
175 LoadYearData();
176 }
177 if (e.PropertyName == nameof(ColumnSelectedIndex))
178 {
179 LoadSelectedColData();
180 }
181 if (e.PropertyName == nameof(ChartDataMode))
182 {
183 if (ChartDataMode.Id == 1)
184 {
185 IsChartStack = true;
186 }
187 else
188 {
189 IsChartStack = false;
190 }
191 LoadData();
192 }
193 if (e.PropertyName == nameof(WebColSelectedIndex))
194 {
195 LoadWebSitesColSelectedData();
196 }
197 }
198
199
200 private void LoadData()
201 {
202 if (TabbarSelectedIndex == 0)
203 {
204 NameIndexStart = 0;
205
206 LoadDayData();
207 }
208 else if (TabbarSelectedIndex == 1)
209 {
210 LoadWeekData();
211 }
212 else if (TabbarSelectedIndex == 2)
213 {
214 NameIndexStart = 1;
215
216 LoadMonthlyData();
217 }
218 else if (TabbarSelectedIndex == 3)
219 {
220 LoadYearData();
221 }
222
223 LoadSelectedColData();
224 }
225
226 /// <summary>
227 /// 加载天数据
228 /// </summary>
229 private void LoadDayData()
230 {
231 ColumnSelectedIndex = -1;
232 WebColSelectedIndex = -1;
233
234 DataMaximum = 3600;
235 Task.Run(() =>
236 {
237 // 应用数据
238 var chartData = new List<ChartsDataModel>();
239 var sumData = new List<ChartsDataModel>();
240
241 var list = data.GetCategoryHoursData(Date);
242 var nullCategory = new CategoryModel()
243 {
244 ID = 0,
245 Name = "未分类",
246 IconFile = "pack://application:,,,/Tai;component/Resources/Icons/tai32.ico"
247 };
248 foreach (var item in list)
249 {
250 var category = categorys.GetCategory(item.CategoryID);
251 if (item.CategoryID == 0)
252 {
253 category = nullCategory;
254 }
255 if (category != null)
256 {
257 var dataItem = new ChartsDataModel()
258 {
259
260 Name = category.Name,
261 Icon = category.IconFile,
262 Values = item.Values,
263 Color = category.Color
264 };
265 if (category.ID == 0)
266 {
267 dataItem.Color = "#E5F7F6F2";
268 }
269 chartData.Add(dataItem);
270 }
271 }
272 if (ChartDataMode.Id == 1 || ChartDataMode.Id == 3)
273 {
274 Data = chartData;
275 }
276 else
277 {
278 // 汇总
279 var values = data.GetRangeTotalData(Date, Date);
280
281
282 var dataItem = new ChartsDataModel()
283 {
284 Values = values,
285 };
286
287 sumData.Add(dataItem);
288 Data = sumData;
289 }
290
291 RadarData = chartData;
292
293 double totalUse = Data.Sum(m => m.Values.Sum());
294 totalTime_ = totalUse;
295 TotalHours = Time.ToHoursString(totalUse);
296 LoadTopData();
297
298 // 网页数据
299 LoadWebData(Date, Date);
300 });
301 }
302
303 /// <summary>
304 /// 加载周数据
305 /// </summary>
306 private void LoadWeekData()
307 {
308 ColumnSelectedIndex = -1;
309 WebColSelectedIndex = -1;
310
311 DataMaximum = 0;
312 Task.Run(() =>
313 {
314 var weekDateArr = SelectedWeek.Name == "本周" ? Time.GetThisWeekDate() : Time.GetLastWeekDate();
315 WeekDateStr = weekDateArr[0].ToString("yyyy年MM月dd日") + " 到 " + weekDateArr[1].ToString("yyyy年MM月dd日");
316 string[] weekNames = { "周一", "周二", "周三", "周四", "周五", "周六", "周日", };
317 var chartData = new List<ChartsDataModel>();
318 var sumData = new List<ChartsDataModel>();
319
320 var list = data.GetCategoryRangeData(weekDateArr[0], weekDateArr[1]);
321 var nullCategory = new CategoryModel()
322 {
323 ID = 0,
324 Name = "未分类",
325 IconFile = "pack://application:,,,/Tai;component/Resources/Icons/tai32.ico"
326
327 };
328
329 foreach (var item in list)
330 {
331 var category = categorys.GetCategory(item.CategoryID);
332 if (item.CategoryID == 0)
333 {
334 category = nullCategory;
335 }
336 if (category != null)
337 {
338 var dataItem = new ChartsDataModel()
339 {
340
341 Name = category.Name,
342 Icon = category.IconFile,
343 Values = item.Values,
344 ColumnNames = weekNames,
345 Color = category.Color,
346 };
347 if (category.ID == 0)
348 {
349 dataItem.Color = "#E5F7F6F2";
350 }
351 chartData.Add(dataItem);
352 }
353 }
354
355 if (ChartDataMode.Id == 1 || ChartDataMode.Id == 3)
356 {
357 Data = chartData;
358 }
359 else
360 {
361 // 汇总
362 var values = data.GetRangeTotalData(weekDateArr[0], weekDateArr[1]);
363
364
365 var dataItem = new ChartsDataModel()
366 {
367 Values = values,
368 ColumnNames = weekNames,
369 };
370
371 sumData.Add(dataItem);
372 Data = sumData;
373 }
374
375 RadarData = chartData;
376 double totalUse = Data.Sum(m => m.Values.Sum());
377 totalTime_ = totalUse;
378 TotalHours = Time.ToHoursString(totalUse);
379
380 // 网页数据
381 LoadWebData(weekDateArr[0], weekDateArr[1]);
382 });
383
384
385 LoadTopData();
386
387 }
388
389 /// <summary>
390 /// 加载月数据
391 /// </summary>
392 private void LoadMonthlyData()
393 {
394 ColumnSelectedIndex = -1;
395 WebColSelectedIndex = -1;
396 DataMaximum = 0;
397 Task.Run(() =>
398 {
399 var chartData = new List<ChartsDataModel>();
400 var sumData = new List<ChartsDataModel>();
401 var dateArr = Time.GetMonthDate(MonthDate);
402
403 var list = data.GetCategoryRangeData(dateArr[0], dateArr[1]);
404
405 var nullCategory = new CategoryModel()
406 {
407 ID = 0,
408 Name = "未分类",
409 IconFile = "pack://application:,,,/Tai;component/Resources/Icons/tai32.ico"
410 };
411
412 foreach (var item in list)
413 {
414 var category = categorys.GetCategory(item.CategoryID);
415 if (item.CategoryID == 0)
416 {
417 category = nullCategory;
418 }
419 if (category != null)
420 {
421 var dataItem = new ChartsDataModel()
422 {
423
424 Name = category.Name,
425 Icon = category.IconFile,
426 Values = item.Values,
427 Color = category.Color
428 };
429 if (category.ID == 0)
430 {
431 dataItem.Color = "#E5F7F6F2";
432 }
433 chartData.Add(dataItem);
434 }
435 }
436 if (ChartDataMode.Id == 1 || ChartDataMode.Id == 3)
437 {
438 Data = chartData;
439 }
440 else
441 {
442 // 汇总
443 var values = data.GetRangeTotalData(dateArr[0], dateArr[1]);
444
445 var dataItem = new ChartsDataModel()
446 {
447 Values = values,
448 };
449 sumData.Add(dataItem);
450 Data = sumData;
451 }
452
453 RadarData = chartData;
454 double totalUse = Data.Sum(m => m.Values.Sum());
455 totalTime_ = totalUse;
456 TotalHours = Time.ToHoursString(totalUse);
457 LoadTopData();
458
459 // 网页数据
460 LoadWebData(dateArr[0], dateArr[1]);
461 });
462
463 }
464
465 /// <summary>
466 /// 加载年份数据
467 /// </summary>
468 private void LoadYearData()
469 {
470 ColumnSelectedIndex = -1;
471 WebColSelectedIndex = -1;
472
473 DataMaximum = 0;
474 Task.Run(() =>
475 {
476 var chartData = new List<ChartsDataModel>();
477 var sumData = new List<ChartsDataModel>();
478 string[] names = new string[12];
479 for (int i = 0; i < 12; i++)
480 {
481 names[i] = (i + 1) + "月";
482 }
483
484 var list = data.GetCategoryYearData(YearDate);
485 var nullCategory = new CategoryModel()
486 {
487 ID = 0,
488 Name = "未分类",
489 IconFile = "pack://application:,,,/Tai;component/Resources/Icons/tai32.ico"
490 };
491
492 foreach (var item in list)
493 {
494 var category = categorys.GetCategory(item.CategoryID);
495 if (item.CategoryID == 0)
496 {
497 category = nullCategory;
498 }
499 if (category != null)
500 {
501 var dataItem = new ChartsDataModel()
502 {
503
504 Name = category.Name,
505 Icon = category.IconFile,
506 Values = item.Values,
507 ColumnNames = names,
508 Color = category.Color
509 };
510 if (category.ID == 0)
511 {
512 dataItem.Color = "#E5F7F6F2";
513 }
514 chartData.Add(dataItem);
515 }
516 }
517
518
519
520
521 if (ChartDataMode.Id == 1 || ChartDataMode.Id == 3)
522 {
523 Data = chartData;
524 }
525 else
526 {
527 // 汇总
528 var values = data.GetMonthTotalData(YearDate);
529 var dataItem = new ChartsDataModel()
530 {
531 Values = values,
532 ColumnNames = names,
533 };
534 sumData.Add(dataItem);
535
536 Data = sumData;
537 }
538
539 RadarData = chartData;
540
541 double totalUse = Data.Sum(m => m.Values.Sum());
542 totalTime_ = totalUse;
543 TotalHours = Time.ToHoursString(totalUse);
544 LoadTopData();
545
546 // 网页数据
547 var dateArr = Time.GetYearDate(YearDate);
548 LoadWebData(dateArr[0], dateArr[1]);
549 });
550 }
551
552 private void LoadTopData()
553 {
554 Task.Run(() =>
555 {
556 var dateStart = Date.Date;
557 var dateEnd = Date.Date;
558 if (TabbarSelectedIndex == 1)
559 {
560 // 周
561 var weekDateArr = SelectedWeek.Name == "本周" ? Time.GetThisWeekDate() : Time.GetLastWeekDate();
562
563 dateStart = weekDateArr[0];
564 dateEnd = weekDateArr[1];
565
566 }
567 else if (TabbarSelectedIndex == 2)
568 {
569 // 月
570 var dateArr = Time.GetMonthDate(MonthDate);
571 dateStart = dateArr[0];
572 dateEnd = dateArr[1];
573 }
574 else if (TabbarSelectedIndex == 3)
575 {
576 // 年
577 var dateArr = Time.GetYearDate(YearDate);
578 dateStart = dateArr[0];
579 dateEnd = dateArr[1];
580 }
581 var list = data.GetDateRangelogList(dateStart, dateEnd, 5);
582
583 TopData = MapToChartsData(list);
584
585 TopHours = TopData.Count > 0 ? Time.ToHoursString(TopData[0].Value) : "0";
586
587 appCount_ = data.GetDateRangeAppCount(dateStart, dateEnd);
588 AppCount = appCount_.ToString();
589
590 Top1App = null;
591
592 if (TopData.Count > 0)
593 {
594 var model = TopData[0].Data as DailyLogModel;
595 Top1App = model != null ? model.AppModel : null;
596 }
597
598 LoadDiffData();
599 });
600 }
601
602 private void LoadDiffData()
603 {
604 var dateStart = Date.Date.AddDays(-1);
605 var dateEnd = Date.Date.AddDays(-1);
606 if (TabbarSelectedIndex == 1)
607 {
608 // 周
609 var weekDateArr = Time.GetLastWeekDate();
610 dateStart = weekDateArr[0];
611 dateEnd = weekDateArr[1];
612 }
613 else if (TabbarSelectedIndex == 2)
614 {
615 // 月
616 var dateArr = Time.GetMonthDate(MonthDate.AddMonths(-1));
617 dateStart = dateArr[0];
618 dateEnd = dateArr[1];
619 }
620 else if (TabbarSelectedIndex == 3)
621 {
622 // 年
623 var dateArr = Time.GetYearDate(YearDate.AddYears(-1));
624 dateStart = dateArr[0];
625 dateEnd = dateArr[1];
626 }
627
628 // 应用量
629 int lastAppCount = data.GetDateRangeAppCount(dateStart, dateEnd);
630 // 使用总时长
631 var lastTotalTime = data.GetRangeTotalData(dateStart, dateEnd).Sum();
632
633 double diffTotalTime = ((totalTime_ - lastTotalTime) / lastTotalTime) * 100;
634 if (totalTime_ > 0 && lastTotalTime == 0)
635 {
636 diffTotalTime = 100;
637 }
638 else if (totalTime_ == 0 && lastTotalTime == 0)
639 {
640 diffTotalTime = 0;
641 }
642 if (diffTotalTime > 0)
643 {
644 DiffTotalTimeType = "1";
645 }
646 else if (diffTotalTime < 0)
647 {
648 DiffTotalTimeType = "-1";
649 }
650 else
651 {
652 DiffTotalTimeType = "0";
653 }
654 DiffTotalTimeValue = DiffTotalTimeType == "0" ? string.Empty : diffTotalTime == 100 ? "100%" : Math.Abs(diffTotalTime).ToString("f2") + "%";
655
656 int diffAppCount = appCount_ - lastAppCount;
657 if (diffAppCount > 0)
658 {
659 DiffAppCountType = "1";
660 }
661 else if (diffAppCount < 0)
662 {
663 DiffAppCountType = "-1";
664 }
665 else
666 {
667 DiffAppCountType = "0";
668 }
669 DiffAppCountValue = DiffAppCountType == "0" ? string.Empty : Math.Abs(diffAppCount).ToString();
670
671 LastWebTotalTime = _webData.GetBrowseDurationTotal(dateStart, dateEnd);
672 LastWebSiteCount = _webData.GetBrowseSitesTotal(dateStart, dateEnd);
673 LastWebPageCount = _webData.GetBrowsePagesTotal(dateStart, dateEnd);
674 }
675
676 private List<ChartsDataModel> MapToChartsData(IEnumerable<Core.Models.DailyLogModel> list)
677 {
678 var resData = new List<ChartsDataModel>();
679
680 foreach (var item in list)
681 {
682
683 var bindModel = new ChartsDataModel();
684 bindModel.Data = item;
685 bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
686 bindModel.Value = item.Time;
687 bindModel.Tag = Time.ToString(item.Time);
688 bindModel.PopupText = item.AppModel?.File;
689 bindModel.Icon = item.AppModel?.IconFile;
690 resData.Add(bindModel);
691 }
692
693 return resData;
694 }
695
696 private void LoadSelectedColData()
697 {
698 if (ColumnSelectedIndex < 0)
699 {
700 DayHoursSelectedTime = String.Empty;
701 return;
702 }
703 Task.Run(() =>
704 {
705 IEnumerable<HoursLogModel> hoursModelList = new List<HoursLogModel>();
706 IEnumerable<DailyLogModel> daysModelList = new List<DailyLogModel>();
707
708 var chartsDatas = new List<ChartsDataModel>();
709
710 if (TabbarSelectedIndex == 0)
711 {
712 // 天
713 var time = new DateTime(Date.Year, Date.Month, Date.Day, ColumnSelectedIndex, 0, 0);
714 DayHoursSelectedTime = time.ToString("yyyy年MM月dd日 HH点");
715 hoursModelList = data.GetTimeRangelogList(time);
716 }
717 else if (TabbarSelectedIndex == 1)
718 {
719 // 周
720 var weekDateArr = SelectedWeek.Name == "本周" ? Time.GetThisWeekDate() : Time.GetLastWeekDate();
721 var time = weekDateArr[0].AddDays(ColumnSelectedIndex);
722 DayHoursSelectedTime = time.ToString("yyyy年MM月dd日");
723 daysModelList = data.GetDateRangelogList(time, time);
724 }
725 else if (TabbarSelectedIndex == 2)
726 {
727 // 月
728 var dateArr = Time.GetMonthDate(MonthDate);
729 var time = dateArr[0].AddDays(ColumnSelectedIndex);
730 DayHoursSelectedTime = time.ToString("yyyy年MM月dd日");
731 daysModelList = data.GetDateRangelogList(time, time);
732 }
733 else if (TabbarSelectedIndex == 3)
734 {
735 // 年
736 var dateStart = new DateTime(YearDate.Year, ColumnSelectedIndex + 1, 1);
737 var dateEnd = new DateTime(dateStart.Year, dateStart.Month, DateTime.DaysInMonth(dateStart.Year, dateStart.Month), 23, 59, 59);
738
739 DayHoursSelectedTime = dateStart.ToString("yyyy年MM月");
740 daysModelList = data.GetDateRangelogList(dateStart, dateEnd);
741 }
742
743 if (TabbarSelectedIndex == 0)
744 {
745 foreach (var item in hoursModelList)
746 {
747 var bindModel = new ChartsDataModel();
748 bindModel.Data = item;
749 bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
750 bindModel.Value = item.Time;
751 bindModel.Tag = Time.ToString(item.Time);
752 bindModel.PopupText = item.AppModel?.File;
753 bindModel.Icon = item.AppModel?.IconFile;
754 chartsDatas.Add(bindModel);
755 }
756 }
757 else
758 {
759 foreach (var item in daysModelList)
760 {
761 var bindModel = new ChartsDataModel();
762 bindModel.Data = item;
763 bindModel.Name = !string.IsNullOrEmpty(item.AppModel?.Alias) ? item.AppModel.Alias : string.IsNullOrEmpty(item.AppModel?.Description) ? item.AppModel.Name : item.AppModel.Description;
764 bindModel.Value = item.Time;
765 bindModel.Tag = Time.ToString(item.Time);
766 bindModel.PopupText = item.AppModel?.File;
767 bindModel.Icon = item.AppModel?.IconFile;
768 chartsDatas.Add(bindModel);
769 }
770 }
771
772 DayHoursData = chartsDatas;
773 });
774 }
775
776
777 #region 网页数据
778 private void LoadWebData(DateTime start_, DateTime end_)
779 {
780 LoadCategoriesStatistics(start_, end_);
781 LoadWebBrowseDataStatistics(start_, end_);
782 LoadWebSitesTopData(start_, end_);
783 WebTotalTime = _webData.GetBrowseDurationTotal(start_, end_);
784 WebSiteCount = _webData.GetBrowseSitesTotal(start_, end_);
785 WebPageCount = _webData.GetBrowsePagesTotal(start_, end_);
786 WebTotalTimeText = Time.ToHoursString(WebTotalTime);
787 }
788
789 /// <summary>
790 /// 分类饼图
791 /// </summary>
792 /// <param name="start_"></param>
793 /// <param name="end_"></param>
794 private void LoadCategoriesStatistics(DateTime start_, DateTime end_)
795 {
796 Task.Run(() =>
797 {
798 var chartsDatas = new List<ChartsDataModel>();
799 var data = _webData.GetCategoriesStatistics(start_, end_);
800 foreach (var item in data)
801 {
802 var category = _webData.GetWebSiteCategory(item.ID);
803 var bindModel = new ChartsDataModel();
804 bindModel.Name = item.ID == 0 ? "未分类" : item.Name;
805 bindModel.Value = item.Value;
806 bindModel.Data = item;
807 bindModel.Color = item.ID == 0 ? "#ccc" : category.Color;
808 bindModel.PopupText = bindModel.Name + " " + Time.ToString((int)item.Value);
809 bindModel.Icon = item.ID == 0 ? "" : category.IconFile;
810 chartsDatas.Add(bindModel);
811 }
812 WebCategoriesPieData = chartsDatas.OrderByDescending(m => m.Value).ToList();
813
814 });
815 }
816
817 private void LoadWebBrowseDataStatistics(DateTime start_, DateTime end_)
818 {
819 Task.Run(() =>
820 {
821 var chartData = new List<ChartsDataModel>();
822 var data = _webData.GetBrowseDataByCategoryStatistics(start_, end_);
823 // 转换为图表格式数据
824 var emptyCategory = new WebSiteCategoryModel()
825 {
826 ID = 0,
827 Name = "未分类",
828 IconFile = "pack://application:,,,/Tai;component/Resources/Icons/tai32.ico"
829 };
830
831 string[] colNames = { };
832
833 if (TabbarSelectedIndex == 1)
834 {
835 colNames = new string[] { "周一", "周二", "周三", "周四", "周五", "周六", "周日", };
836 }
837 else if (TabbarSelectedIndex == 3)
838 {
839 colNames = new string[12];
840 for (int i = 0; i < 12; i++)
841 {
842 colNames[i] = (i + 1) + "月";
843 }
844 }
845
846 foreach (var item in data)
847 {
848 var category = _webData.GetWebSiteCategory(item.CategoryID);
849 if (item.CategoryID == 0)
850 {
851 category = emptyCategory;
852 }
853 if (category != null)
854 {
855 var dataItem = new ChartsDataModel()
856 {
857
858 Name = category.Name,
859 Icon = category.IconFile,
860 Values = item.Values,
861 Color = category.Color,
862 ColumnNames = colNames
863 };
864 if (category.ID == 0)
865 {
866 dataItem.Color = "#E5F7F6F2";
867 }
868 chartData.Add(dataItem);
869 }
870 }
871
872 //var chartsDatas = new List<ChartsDataModel>();
873 //var bindModel = new ChartsDataModel();
874 //bindModel.Values = data.Select(m => m.Value).ToArray();
875 //bindModel.Color = StateData.ThemeColor;
876 //chartsDatas.Add(bindModel);
877 WebBrowseStatisticsData = chartData;
878 });
879 }
880
881 private void LoadWebSitesTopData(DateTime start_, DateTime end_)
882 {
883 Task.Run(() =>
884 {
885 var data = _webData.GetDateRangeWebSiteList(start_, end_, 10);
886 WebSitesTopData = MapToChartData(data);
887 });
888 }
889 private void LoadWebSitesColSelectedData()
890 {
891 if (WebColSelectedIndex < 0)
892 {
893 WebSitesColSelectedTimeText = String.Empty;
894 WebSitesColSelectedData = new List<ChartsDataModel>();
895 return;
896 }
897 Task.Run(() =>
898 {
899
900 var chartData = new List<ChartsDataModel>();
901 bool isTime = false;
902 DateTime startTime = DateTime.Now, endTime = DateTime.Now;
903 if (TabbarSelectedIndex == 0)
904 {
905 // 天
906 var time = new DateTime(Date.Year, Date.Month, Date.Day, WebColSelectedIndex, 0, 0);
907 WebSitesColSelectedTimeText = time.ToString("yyyy年MM月dd日 HH点");
908 isTime = true;
909 startTime = endTime = time;
910 }
911 else if (TabbarSelectedIndex == 1)
912 {
913 // 周
914 var weekDateArr = SelectedWeek.Name == "本周" ? Time.GetThisWeekDate() : Time.GetLastWeekDate();
915 var time = weekDateArr[0].AddDays(WebColSelectedIndex);
916 WebSitesColSelectedTimeText = time.ToString("yyyy年MM月dd日");
917 startTime = endTime = time;
918 }
919 else if (TabbarSelectedIndex == 2)
920 {
921 // 月
922 var dateArr = Time.GetMonthDate(MonthDate);
923 var time = dateArr[0].AddDays(WebColSelectedIndex);
924 WebSitesColSelectedTimeText = time.ToString("yyyy年MM月dd日");
925 startTime = endTime = time;
926 }
927 else if (TabbarSelectedIndex == 3)
928 {
929 // 年
930 var dateStart = new DateTime(YearDate.Year, WebColSelectedIndex + 1, 1);
931 var dateEnd = new DateTime(dateStart.Year, dateStart.Month, DateTime.DaysInMonth(dateStart.Year, dateStart.Month), 23, 59, 59);
932
933 WebSitesColSelectedTimeText = dateStart.ToString("yyyy年MM月");
934
935 startTime = dateStart;
936 endTime = dateEnd;
937
938 }
939
940
941 chartData = MapToChartData(_webData.GetDateRangeWebSiteList(startTime, endTime, 0, -1, isTime));
942
943 WebSitesColSelectedData = chartData;
944 });
945 }
946 private List<ChartsDataModel> MapToChartData(IEnumerable<Core.Models.Db.WebSiteModel> list)
947 {
948 var resData = new List<ChartsDataModel>();
949
950 foreach (var item in list)
951 {
952 var bindModel = new ChartsDataModel();
953 bindModel.Data = item;
954 bindModel.Name = !string.IsNullOrEmpty(item.Alias) ? item.Alias : item.Title;
955 bindModel.Value = item.Duration;
956 bindModel.Tag = Time.ToString(item.Duration);
957 bindModel.PopupText = item.Domain;
958 bindModel.Icon = item.IconFile;
959 resData.Add(bindModel);
960 }
961
962 return resData;
963 }
964 #endregion
965 }
966}