Warning_day.razor 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. @page "/warning_day"
  2. @using EasyTemplate.Tool.Entity.App
  3. @using EasyTemplate.Service
  4. @inject WarningService WarningService
  5. @inject NavigationManager Navigation
  6. <PageTitle>预警告统计</PageTitle>
  7. <div class="container-fluid">
  8. <div class="card">
  9. <div class="card-header">
  10. <h5 class="mb-0"><i class="fas fa-chart-line"></i> 预警告统计(35 天累计)</h5>
  11. </div>
  12. <div class="card-body">
  13. @* 筛选条件 *@
  14. <div class="row mb-3">
  15. <div class="col-md-3">
  16. <label class="form-label">油枪 ID</label>
  17. <AntDesign.InputNumber Placeholder="请输入油枪 ID" @bind-Value="@selectedNozzleId" Style="width: 100%" />
  18. </div>
  19. <div class="col-md-3">
  20. <label class="form-label">开始日期</label>
  21. <DatePicker @bind-Value="@startDate" Format="yyyy-MM-dd" Style="width: 100%" />
  22. </div>
  23. <div class="col-md-3">
  24. <label class="form-label">结束日期</label>
  25. <DatePicker @bind-Value="@endDate" Format="yyyy-MM-dd" Style="width: 100%" />
  26. </div>
  27. <div class="col-md-3 d-flex align-items-end">
  28. <button class="btn btn-primary me-2" @onclick="LoadDataAsync">
  29. <i class="fas fa-search"></i> 查询
  30. </button>
  31. <button class="btn btn-secondary" @onclick="ResetFilter">
  32. <i class="fas fa-redo"></i> 重置
  33. </button>
  34. </div>
  35. </div>
  36. @* 统计信息 *@
  37. @if (statisticsList.Count > 0)
  38. {
  39. <div class="alert alert-info">
  40. <i class="fas fa-info-circle"></i>
  41. 共查询到 @statisticsList.Count 条记录,统计范围:@startDate?.ToString("yyyy-MM-dd") 至 @endDate?.ToString("yyyy-MM-dd")
  42. </div>
  43. }
  44. @* 数据表格 *@
  45. <Spin Spinning="@loading">
  46. <Table TItem="WarningStatistics" DataSource="@statisticsList" ScrollY="600px" Bordered="true" Size="TableSize.Small">
  47. <ColumnDefinitions Context="row">
  48. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.nozzle" Title="油枪 ID" Width="80" />
  49. <PropertyColumn TItem="WarningStatistics" TProp="DateOnly" Align="ColumnAlign.Center" Property="c=>c.statistics_date" Title="统计日期" Width="100">
  50. @{ var statDate = row.statistics_date.ToString("yyyy-MM-dd"); }
  51. @statDate
  52. </PropertyColumn>
  53. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.daily_total" Title="当天笔数" Width="80" />
  54. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.daily_overproof" Title="当天超标" Width="80" />
  55. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Title="当天超标率" Width="90">
  56. @{ var dailyRate = row.daily_overproofrate; }
  57. @dailyRate%
  58. </PropertyColumn>
  59. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.daily_overproof_alert" Title="当天严重超标" Width="90" />
  60. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Title="当天严重超标率" Width="100">
  61. @{ var dailyAlertRate = row.daily_overproofrate_alert; }
  62. @dailyAlertRate%
  63. </PropertyColumn>
  64. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.daily_overproof_2" Title="当天二级超标" Width="90" />
  65. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Title="当天二级超标率" Width="100">
  66. @{ var dailyRate2 = row.daily_overproofrate_2; }
  67. @dailyRate2%
  68. </PropertyColumn>
  69. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.total_count" Title="累计笔数 (35 天)" Width="120">
  70. @{
  71. var isAccumulated = row.is_accumulated;
  72. var totalCount = row.total_count;
  73. }
  74. <span class="@(isAccumulated ? "text-success fw-bold" : "text-warning")">
  75. @totalCount
  76. @if (!isAccumulated)
  77. {
  78. <small class="text-muted">(未满 5 笔)</small>
  79. }
  80. </span>
  81. </PropertyColumn>
  82. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.accumulated_days" Title="累计天数" Width="80">
  83. @{ var accDays = row.accumulated_days; }
  84. @accDays 天
  85. </PropertyColumn>
  86. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.total_overproof" Title="累计超标数" Width="80" />
  87. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Title="累计超标率" Width="90">
  88. @{ var totalRate = row.total_overproofrate; }
  89. <span class="fw-bold">@totalRate%</span>
  90. </PropertyColumn>
  91. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.total_overproof_alert" Title="累计严重超标" Width="90" />
  92. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Title="累计严重超标率" Width="100">
  93. @{ var totalAlertRate = row.total_overproofrate_alert; }
  94. @totalAlertRate%
  95. </PropertyColumn>
  96. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Property="c=>c.total_overproof_2" Title="累计二级超标" Width="90" />
  97. <PropertyColumn TItem="WarningStatistics" TProp="int" Align="ColumnAlign.Center" Title="累计二级超标率" Width="100">
  98. @{ var totalRate2 = row.total_overproofrate_2; }
  99. @totalRate2%
  100. </PropertyColumn>
  101. </ColumnDefinitions>
  102. </Table>
  103. </Spin>
  104. </div>
  105. </div>
  106. </div>
  107. @code {
  108. private List<WarningStatistics> statisticsList = new();
  109. private bool loading = false;
  110. private int? selectedNozzleId;
  111. private DateOnly? startDate;
  112. private DateOnly? endDate;
  113. protected override async Task OnInitializedAsync()
  114. {
  115. // 初始化默认日期范围为最近 35 天
  116. endDate = DateOnly.FromDateTime(DateTime.Today);
  117. startDate = endDate?.AddDays(-34);
  118. await LoadDataAsync();
  119. }
  120. private void ResetFilter()
  121. {
  122. selectedNozzleId = null;
  123. endDate = DateOnly.FromDateTime(DateTime.Today);
  124. startDate = endDate?.AddDays(-34);
  125. }
  126. private async Task LoadDataAsync()
  127. {
  128. if (startDate == null || endDate == null)
  129. {
  130. return;
  131. }
  132. loading = true;
  133. StateHasChanged();
  134. try
  135. {
  136. var query = new WarningStatisticsQuery
  137. {
  138. NozzleId = selectedNozzleId,
  139. StartDate = startDate,
  140. EndDate = endDate,
  141. PageIndex = 1,
  142. PageSize = 1000
  143. };
  144. statisticsList = await WarningService.GetStatisticsByFilterAsync(query);
  145. // 按日期和油枪排序
  146. statisticsList = statisticsList
  147. .OrderBy(s => s.nozzle)
  148. .ThenByDescending(s => s.statistics_date)
  149. .ToList();
  150. }
  151. catch (Exception ex)
  152. {
  153. Console.WriteLine($"加载统计数据失败:{ex.Message}");
  154. }
  155. finally
  156. {
  157. loading = false;
  158. StateHasChanged();
  159. }
  160. }
  161. }