From 6af451b3d95627b745da9a9e334419b1b5d4ee4f Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期一, 30 三月 2026 11:53:07 +0800
Subject: [PATCH] fix(Dashboard): 添加错误处理,统一DateTime使用
---
Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs | 287 ++++++++++++++++++++++++++++++++++----------------------
1 files changed, 173 insertions(+), 114 deletions(-)
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs
index 78a21e9..0d6498d 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Dashboard/DashboardController.cs
@@ -25,99 +25,129 @@
[HttpGet("Overview")]
public async Task<WebResponseContent> Overview()
{
- var today = DateTime.Today;
- var firstDayOfMonth = new DateTime(today.Year, today.Month, 1);
-
- // 浠婃棩鍏ュ簱鏁�
- var todayInbound = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= today && t.TaskType >= 500 && t.TaskType < 600)
- .CountAsync();
-
- // 浠婃棩鍑哄簱鏁�
- var todayOutbound = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= today && t.TaskType >= 100 && t.TaskType < 200)
- .CountAsync();
-
- // 鏈湀鍏ュ簱鏁�
- var monthInbound = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= firstDayOfMonth && t.TaskType >= 500 && t.TaskType < 600)
- .CountAsync();
-
- // 鏈湀鍑哄簱鏁�
- var monthOutbound = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= firstDayOfMonth && t.TaskType >= 100 && t.TaskType < 200)
- .CountAsync();
-
- // 褰撳墠鎬诲簱瀛�
- var totalStock = await _db.Queryable<Dt_StockInfo>().CountAsync();
-
- return WebResponseContent.Instance.OK(null, new
+ try
{
- TodayInbound = todayInbound,
- TodayOutbound = todayOutbound,
- MonthInbound = monthInbound,
- MonthOutbound = monthOutbound,
- TotalStock = totalStock
- });
+ var today = DateTime.Today;
+ var firstDayOfMonth = new DateTime(today.Year, today.Month, 1);
+
+ // 浠婃棩鍏ュ簱鏁�
+ var todayInbound = await _db.Queryable<Dt_Task_Hty>()
+ .Where(t => t.InsertTime >= today && t.TaskType >= 500 && t.TaskType < 600)
+ .CountAsync();
+
+ // 浠婃棩鍑哄簱鏁�
+ var todayOutbound = await _db.Queryable<Dt_Task_Hty>()
+ .Where(t => t.InsertTime >= today && t.TaskType >= 100 && t.TaskType < 200)
+ .CountAsync();
+
+ // 鏈湀鍏ュ簱鏁�
+ var monthInbound = await _db.Queryable<Dt_Task_Hty>()
+ .Where(t => t.InsertTime >= firstDayOfMonth && t.TaskType >= 500 && t.TaskType < 600)
+ .CountAsync();
+
+ // 鏈湀鍑哄簱鏁�
+ var monthOutbound = await _db.Queryable<Dt_Task_Hty>()
+ .Where(t => t.InsertTime >= firstDayOfMonth && t.TaskType >= 100 && t.TaskType < 200)
+ .CountAsync();
+
+ // 褰撳墠鎬诲簱瀛�
+ var totalStock = await _db.Queryable<Dt_StockInfo>().CountAsync();
+
+ return WebResponseContent.Instance.OK(null, new
+ {
+ TodayInbound = todayInbound,
+ TodayOutbound = todayOutbound,
+ MonthInbound = monthInbound,
+ MonthOutbound = monthOutbound,
+ TotalStock = totalStock
+ });
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"鎬昏鏁版嵁鑾峰彇澶辫触: {ex.Message}");
+ }
}
/// <summary>
/// 姣忔棩缁熻
/// </summary>
+ /// <remarks>
+ /// 娉ㄦ剰锛氭暟鎹湪 SQL 灞傝繃婊ゅ悗锛屽湪搴旂敤灞傛寜鏃ユ湡鍒嗙粍銆�
+ /// SqlSugar 鐨� GroupBy 涓嶆敮鎸佸 .Date 杩欐牱鐨勮绠楀垪鐩存帴鐢熸垚 SQL GROUP BY锛�
+ /// 鍥犳閲囩敤姝ゆ柟寮忎互纭繚璺ㄦ暟鎹簱鍏煎鎬с��
+ /// </remarks>
[HttpGet("DailyStats")]
public async Task<WebResponseContent> DailyStats([FromQuery] int days = 30)
{
- if (days <= 0) days = 30;
- if (days > 365) days = 365;
+ try
+ {
+ if (days <= 0) days = 30;
+ if (days > 365) days = 365;
- var startDate = DateTime.Today.AddDays(-days + 1);
+ var startDate = DateTime.Today.AddDays(-days + 1);
- var query = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= startDate)
- .Select(t => new { t.InsertTime, t.TaskType })
- .ToListAsync();
+ var query = await _db.Queryable<Dt_Task_Hty>()
+ .Where(t => t.InsertTime >= startDate)
+ .Select(t => new { t.InsertTime, t.TaskType })
+ .ToListAsync();
- var result = query
- .GroupBy(t => t.InsertTime.Date)
- .Select(g => new
- {
- Date = g.Key.ToString("yyyy-MM-dd"),
- Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
- Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
- })
- .OrderBy(x => x.Date)
- .ToList();
+ var result = query
+ .GroupBy(t => t.InsertTime.Date)
+ .Select(g => new
+ {
+ Date = g.Key.ToString("yyyy-MM-dd"),
+ Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
+ Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
+ })
+ .OrderBy(x => x.Date)
+ .ToList();
- return WebResponseContent.Instance.OK(null, result);
+ return WebResponseContent.Instance.OK(null, result);
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"姣忔棩缁熻鑾峰彇澶辫触: {ex.Message}");
+ }
}
/// <summary>
/// 姣忓懆缁熻
/// </summary>
+ /// <remarks>
+ /// 娉ㄦ剰锛氭暟鎹湪 SQL 灞傝繃婊ゅ悗锛屽湪搴旂敤灞傛寜 ISO 8601 鍛ㄩ敭鍒嗙粍銆�
+ /// 鍛ㄩ敭涓� "YYYY-Www" 鏍煎紡锛屾棤娉曠洿鎺ュ湪 SQL 灞傜敤 GROUP BY 瀹炵幇銆�
+ /// </remarks>
[HttpGet("WeeklyStats")]
public async Task<WebResponseContent> WeeklyStats([FromQuery] int weeks = 12)
{
- if (weeks <= 0) weeks = 12;
+ try
+ {
+ if (weeks <= 0) weeks = 12;
- var startDate = DateTime.Today.AddDays(-weeks * 7);
+ var startDate = DateTime.Today.AddDays(-weeks * 7);
- var query = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= startDate)
- .Select(t => new { t.InsertTime, t.TaskType })
- .ToListAsync();
+ var query = await _db.Queryable<Dt_Task_Hty>()
+ .Where(t => t.InsertTime >= startDate)
+ .Select(t => new { t.InsertTime, t.TaskType })
+ .ToListAsync();
- var result = query
- .GroupBy(t => GetWeekKey(t.InsertTime))
- .Select(g => new
- {
- Week = g.Key,
- Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
- Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
- })
- .OrderBy(x => x.Week)
- .ToList();
+ var result = query
+ .GroupBy(t => GetWeekKey(t.InsertTime))
+ .Select(g => new
+ {
+ Week = g.Key,
+ Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
+ Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
+ })
+ .OrderBy(x => x.Week)
+ .ToList();
- return WebResponseContent.Instance.OK(null, result);
+ return WebResponseContent.Instance.OK(null, result);
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"姣忓懆缁熻鑾峰彇澶辫触: {ex.Message}");
+ }
}
private string GetWeekKey(DateTime date)
@@ -133,31 +163,43 @@
/// <summary>
/// 姣忔湀缁熻
/// </summary>
+ /// <remarks>
+ /// 娉ㄦ剰锛氭暟鎹湪 SQL 灞傝繃婊ゅ悗锛屽湪搴旂敤灞傛寜骞存湀鍒嗙粍銆�
+ /// SqlSugar 鐨� GroupBy 涓嶆敮鎸佸尶鍚嶅璞� (Year, Month) 鐩存帴鏄犲皠鍒� SQL GROUP BY锛�
+ /// 鍥犳閲囩敤姝ゆ柟寮忎互纭繚璺ㄦ暟鎹簱鍏煎鎬с��
+ /// </remarks>
[HttpGet("MonthlyStats")]
public async Task<WebResponseContent> MonthlyStats([FromQuery] int months = 12)
{
- if (months <= 0) months = 12;
+ try
+ {
+ if (months <= 0) months = 12;
- var startDate = DateTime.Today.AddMonths(-months + 1);
- startDate = new DateTime(startDate.Year, startDate.Month, 1);
+ var startDate = DateTime.Today.AddMonths(-months + 1);
+ startDate = new DateTime(startDate.Year, startDate.Month, 1);
- var query = await _db.Queryable<Dt_Task_Hty>()
- .Where(t => t.InsertTime >= startDate)
- .Select(t => new { t.InsertTime, t.TaskType })
- .ToListAsync();
+ var query = await _db.Queryable<Dt_Task_Hty>()
+ .Where(t => t.InsertTime >= startDate)
+ .Select(t => new { t.InsertTime, t.TaskType })
+ .ToListAsync();
- var result = query
- .GroupBy(t => new { t.InsertTime.Year, t.InsertTime.Month })
- .Select(g => new
- {
- Month = $"{g.Key.Year}-{g.Key.Month:D2}",
- Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
- Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
- })
- .OrderBy(x => x.Month)
- .ToList();
+ var result = query
+ .GroupBy(t => new { t.InsertTime.Year, t.InsertTime.Month })
+ .Select(g => new
+ {
+ Month = $"{g.Key.Year}-{g.Key.Month:D2}",
+ Inbound = g.Count(t => t.TaskType >= 500 && t.TaskType < 600),
+ Outbound = g.Count(t => t.TaskType >= 100 && t.TaskType < 200)
+ })
+ .OrderBy(x => x.Month)
+ .ToList();
- return WebResponseContent.Instance.OK(null, result);
+ return WebResponseContent.Instance.OK(null, result);
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"姣忔湀缁熻鑾峰彇澶辫触: {ex.Message}");
+ }
}
/// <summary>
@@ -166,47 +208,64 @@
[HttpGet("StockAgeDistribution")]
public async Task<WebResponseContent> StockAgeDistribution()
{
- var now = DateTime.Now;
-
- // 浣跨敤 SQL 鐩存帴鍒嗙粍缁熻锛岄伩鍏嶅姞杞芥墍鏈夋暟鎹埌鍐呭瓨
- var result = new[]
+ try
{
- new { Range = "7澶╁唴", Count = await _db.Queryable<Dt_StockInfo>().Where(s => SqlFunc.DateDiff(DateType.Day, s.CreateDate, now) <= 7).CountAsync() },
- new { Range = "7-30澶�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => SqlFunc.DateDiff(DateType.Day, s.CreateDate, now) > 7 && SqlFunc.DateDiff(DateType.Day, s.CreateDate, now) <= 30).CountAsync() },
- new { Range = "30-90澶�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => SqlFunc.DateDiff(DateType.Day, s.CreateDate, now) > 30 && SqlFunc.DateDiff(DateType.Day, s.CreateDate, now) <= 90).CountAsync() },
- new { Range = "90澶╀互涓�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => SqlFunc.DateDiff(DateType.Day, s.CreateDate, now) > 90).CountAsync() }
- };
+ var today = DateTime.Today;
- return WebResponseContent.Instance.OK(null, result);
+ // 浣跨敤 SQL 鐩存帴鍒嗙粍缁熻锛岄伩鍏嶅姞杞芥墍鏈夋暟鎹埌鍐呭瓨
+ var result = new[]
+ {
+ new { Range = "7澶╁唴", Count = await _db.Queryable<Dt_StockInfo>().Where(s => SqlFunc.DateDiff(DateType.Day, s.CreateDate, today) <= 7).CountAsync() },
+ new { Range = "7-30澶�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => SqlFunc.DateDiff(DateType.Day, s.CreateDate, today) > 7 && SqlFunc.DateDiff(DateType.Day, s.CreateDate, today) <= 30).CountAsync() },
+ new { Range = "30-90澶�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => SqlFunc.DateDiff(DateType.Day, s.CreateDate, today) > 30 && SqlFunc.DateDiff(DateType.Day, s.CreateDate, today) <= 90).CountAsync() },
+ new { Range = "90澶╀互涓�", Count = await _db.Queryable<Dt_StockInfo>().Where(s => SqlFunc.DateDiff(DateType.Day, s.CreateDate, today) > 90).CountAsync() }
+ };
+
+ return WebResponseContent.Instance.OK(null, result);
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"搴撳瓨搴撻緞鍒嗗竷鑾峰彇澶辫触: {ex.Message}");
+ }
}
/// <summary>
/// 鍚勪粨搴撳簱瀛樺垎甯�
/// </summary>
+ /// <remarks>
+ /// 浣跨敤 SQL GROUP BY 鍦ㄦ暟鎹簱灞傞潰鑱氬悎锛岄伩鍏嶅姞杞藉叏閮ㄥ簱瀛樿褰曞埌鍐呭瓨銆�
+ /// </remarks>
[HttpGet("StockByWarehouse")]
public async Task<WebResponseContent> StockByWarehouse()
{
- // 鍏堟煡璇粨搴撳悕绉�
- var warehouses = await _db.Queryable<Dt_Warehouse>()
- .Select(w => new { w.WarehouseId, w.WarehouseName })
- .ToListAsync();
- var warehouseDict = warehouses.ToDictionary(w => w.WarehouseId, w => w.WarehouseName);
+ try
+ {
+ // 鏌ヨ浠撳簱鍚嶇О
+ var warehouses = await _db.Queryable<Dt_Warehouse>()
+ .Select(w => new { w.WarehouseId, w.WarehouseName })
+ .ToListAsync();
+ var warehouseDict = warehouses.ToDictionary(w => w.WarehouseId, w => w.WarehouseName);
- // 鏌ヨ搴撳瓨鏁版嵁骞跺湪鍐呭瓨涓垎缁�
- var stocks = await _db.Queryable<Dt_StockInfo>()
- .Select(s => new { s.WarehouseId })
- .ToListAsync();
+ // 浣跨敤 SQL GROUP BY 鍦ㄦ暟鎹簱灞傞潰鑱氬悎锛屼粎杩斿洖鑱氬悎缁撴灉
+ var stockGroups = await _db.Queryable<Dt_StockInfo>()
+ .GroupBy(s => s.WarehouseId)
+ .Select(s => new { s.WarehouseId, Count = SqlFunc.AggregateCount(s.Id) })
+ .ToListAsync();
- var result = stocks
- .GroupBy(s => s.WarehouseId)
- .Select(g => new
- {
- Warehouse = warehouseDict.TryGetValue(g.Key, out var name) ? name : $"浠撳簱{g.Key}",
- Count = g.Count()
- })
- .ToList();
+ var result = stockGroups
+ .Select(g => new
+ {
+ Warehouse = warehouseDict.TryGetValue(g.WarehouseId, out var name) ? name : $"浠撳簱{g.WarehouseId}",
+ Count = g.Count
+ })
+ .ToList();
- return WebResponseContent.Instance.OK(null, result);
+ return WebResponseContent.Instance.OK(null, result);
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error($"鍚勪粨搴撳簱瀛樺垎甯冭幏鍙栧け璐�: {ex.Message}");
+ }
}
}
}
--
Gitblit v1.9.3