From f9bc422181a75d6572a585529b2e5662b7cace5e Mon Sep 17 00:00:00 2001
From: tq <1916474859@qq,com>
Date: Fri, 20 Sep 2024 18:39:39 +0800
Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E7=BB=9F=E8=AE=A1=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Entity/Api/Req/ChargeCountReq.cs | 33 ++++
Entity/Api/Resp/ChargeCountResp.cs | 20 +++
Entity/Api/Resp/SwapOrderCountMonthResp.cs | 38 +++++
Entity/Api/Resp/SwapOrderCountResp.cs | 20 +++
Entity/Api/Resp/SwapVehicleResp.cs | 14 ++
Service/Station/ChargeOrderService.cs | 180 +++++++++++++++++++++
Service/Station/MonitorService.cs | 10 ++
Service/Station/SwapOrderService.cs | 139 ++++++++++++++++
WebStarter/Controllers/HomeController.cs | 73 +++++++++
9 files changed, 527 insertions(+)
create mode 100644 Entity/Api/Req/ChargeCountReq.cs
create mode 100644 Entity/Api/Resp/ChargeCountResp.cs
create mode 100644 Entity/Api/Resp/SwapOrderCountMonthResp.cs
create mode 100644 Entity/Api/Resp/SwapOrderCountResp.cs
create mode 100644 WebStarter/Controllers/HomeController.cs
diff --git a/Entity/Api/Req/ChargeCountReq.cs b/Entity/Api/Req/ChargeCountReq.cs
new file mode 100644
index 0000000..eddf3ad
--- /dev/null
+++ b/Entity/Api/Req/ChargeCountReq.cs
@@ -0,0 +1,33 @@
+namespace Entity.Api.Req;
+
+///
+/// 用电量统计
+///
+public class ChargeCountReq
+{
+ ///
+ /// 时间类型 1:天 2:月 3:年
+ ///
+ public int TimeType { get; set; }
+
+ ///
+ /// 充电机编号
+ ///
+ public string? ChargerNo { get; set; }
+
+ ///
+ /// 开始时间
+ ///
+ public DateTime? StartTime { get; set; }
+
+ ///
+ /// 结束时间
+ ///
+ public DateTime? EndTime { get; set; }
+
+ /// 页码
+ public int PageNum { get; set; } = 1;
+
+ /// 页数
+ public int PageSize { get; set; } = 10;
+}
\ No newline at end of file
diff --git a/Entity/Api/Resp/ChargeCountResp.cs b/Entity/Api/Resp/ChargeCountResp.cs
new file mode 100644
index 0000000..38f4c0b
--- /dev/null
+++ b/Entity/Api/Resp/ChargeCountResp.cs
@@ -0,0 +1,20 @@
+namespace Entity.Api.Resp;
+///
+/// 用电量统计结果返回
+///
+public class ChargeCountResp
+{
+ ///
+ /// 时间
+ ///
+ public string? Time { get; set; }
+ ///
+ /// 充电度数
+ ///
+ public decimal? ChargeCount { get; set; }
+ ///
+ /// 充电机编号
+ ///
+ public string? ChargerNo { get; set; }
+
+}
\ No newline at end of file
diff --git a/Entity/Api/Resp/SwapOrderCountMonthResp.cs b/Entity/Api/Resp/SwapOrderCountMonthResp.cs
new file mode 100644
index 0000000..989326c
--- /dev/null
+++ b/Entity/Api/Resp/SwapOrderCountMonthResp.cs
@@ -0,0 +1,38 @@
+namespace Entity.Api.Resp;
+
+///
+/// 首页换电次数统计
+///
+public class SwapOrderCountMonthResp
+{
+ ///
+ /// 月换电总量
+ ///
+ public int SwapCount { get; set; }
+
+ ///
+ /// 月服务车辆
+ ///
+ public int VehicleCount { get; set; }
+
+ ///
+ /// 月充电次数
+ ///
+ public int ChargeFrequency { get; set; }
+
+ ///
+ /// 月充电量
+ ///
+ public decimal? ChargeCount { get; set; }
+
+ ///
+ /// 今日换电次数
+ ///
+ public int DaySwapCount { get; set; }
+
+
+ ///
+ /// 今日充电量
+ ///
+ public decimal? DayChargeCount { get; set; }
+}
\ No newline at end of file
diff --git a/Entity/Api/Resp/SwapOrderCountResp.cs b/Entity/Api/Resp/SwapOrderCountResp.cs
new file mode 100644
index 0000000..e15659b
--- /dev/null
+++ b/Entity/Api/Resp/SwapOrderCountResp.cs
@@ -0,0 +1,20 @@
+namespace Entity.Api.Resp;
+
+///
+/// 每日换电订单统计
+///
+public class SwapOrderCountResp
+{
+ ///
+ /// 天
+ ///
+ public int Day { get; set; }
+ ///
+ /// 换电数量
+ ///
+ public int Count { get; set; }
+ ///
+ /// 充电度数
+ ///
+ public decimal? ChargeCount { get; set; }
+}
\ No newline at end of file
diff --git a/Entity/Api/Resp/SwapVehicleResp.cs b/Entity/Api/Resp/SwapVehicleResp.cs
index cb6bd07..c965f2b 100644
--- a/Entity/Api/Resp/SwapVehicleResp.cs
+++ b/Entity/Api/Resp/SwapVehicleResp.cs
@@ -51,4 +51,18 @@ public class SwapVehicleResp
/// 刹车状态 "0:未拉手刹1:已拉手刹 其它值无效"
///
public byte? Break { get; set; }
+
+ ///
+ /// Desc:放电池仓位号 亏电包仓号
+ /// Default:
+ /// Nullable:True
+ ///
+ public int? DownBatteryBinNo { get; set; }
+
+ ///
+ /// Desc:取电池仓位号 满电包仓号
+ /// Default:
+ /// Nullable:True
+ ///
+ public int? UpBatteryBinNo { get; set; }
}
\ No newline at end of file
diff --git a/Service/Station/ChargeOrderService.cs b/Service/Station/ChargeOrderService.cs
index f12e39f..c1963b9 100644
--- a/Service/Station/ChargeOrderService.cs
+++ b/Service/Station/ChargeOrderService.cs
@@ -192,4 +192,184 @@ public class ChargeOrderService : BaseServices
return QueryListByClause(predicate);
}
+
+ public async Task> GetElectricityConsumptionByTime(ChargeCountReq req)
+ {
+ List list = await GetElectricityConsumption(req, false);
+
+ list = list.OrderBy(x => x.Time).ToList();
+
+ return list;
+ }
+
+ public async Task> GetElectricityConsumptionByChargerNo(ChargeCountReq req)
+ {
+ List resp = await GetElectricityConsumption(req, true);
+ resp = resp.OrderBy(x => x.Time).ToList();
+
+ int skip = (req.PageNum - 1) * req.PageSize;
+ int take = req.PageSize;
+
+ List respList = resp.Skip(skip).Take(take).ToList();
+ PageResult result = new PageResult();
+ result.PageNum = req.PageNum;
+ result.PageSize = req.PageSize;
+ result.Rows = respList;
+ result.ToTal = resp.Count;
+ return result;
+ }
+
+
+ public async Task> GetElectricityConsumption(ChargeCountReq req,
+ bool groupByChargerNo = false)
+ {
+ // 设置时间范围
+ SetTime(req);
+
+ Expression> predicate = x => x.EndTime >= req.StartTime && x.EndTime <= req.EndTime;
+
+ if (!string.IsNullOrEmpty(req.ChargerNo))
+ {
+ Expression> condition2Expr = u => u.ChargerNo == req.ChargerNo;
+ predicate = Expression.Lambda>(
+ Expression.AndAlso(predicate.Body, condition2Expr.Body),
+ predicate.Parameters[0]);
+ }
+
+ List chargeOrders = await QueryListByClauseAsync(predicate);
+
+ List result = new List();
+
+ if (req.TimeType == 1)
+ {
+ // 按小时分组统计
+ if (groupByChargerNo)
+ {
+ // 按 ChargerNo 和小时分组
+ result = chargeOrders
+ .Where(order => order.EndTime.HasValue && !string.IsNullOrEmpty(order.ChargerNo))
+ .GroupBy(order => new { order.ChargerNo, Hour = order.EndTime.Value.Hour })
+ .Select(group => new ChargeCountResp
+ {
+ ChargerNo = group.Key.ChargerNo,
+ Time = group.Key.Hour.ToString("00") + ":00",
+ ChargeCount = group.Sum(order => order.ElecCount ?? 0)
+ })
+ .ToList();
+ }
+ else
+ {
+ // 仅按小时分组
+ result = chargeOrders
+ .Where(order => order.EndTime.HasValue)
+ .GroupBy(order => order.EndTime.Value.Hour)
+ .Select(group => new ChargeCountResp
+ {
+ Time = group.Key.ToString("00") + ":00",
+ ChargeCount = group.Sum(order => order.ElecCount ?? 0)
+ })
+ .ToList();
+ }
+ }
+ else if (req.TimeType == 2)
+ {
+ // 按天分组统计
+ if (groupByChargerNo)
+ {
+ // 按 ChargerNo 和日期分组
+ result = chargeOrders
+ .Where(order => order.EndTime.HasValue && !string.IsNullOrEmpty(order.ChargerNo))
+ .GroupBy(order => new { order.ChargerNo, Date = order.EndTime.Value.Date })
+ .Select(group => new ChargeCountResp
+ {
+ ChargerNo = group.Key.ChargerNo,
+ Time = group.Key.Date.ToString("yyyy-MM-dd"),
+ ChargeCount = group.Sum(order => order.ElecCount ?? 0)
+ })
+ .ToList();
+ }
+ else
+ {
+ // 仅按日期分组
+ result = chargeOrders
+ .Where(order => order.EndTime.HasValue)
+ .GroupBy(order => order.EndTime.Value.Date)
+ .Select(group => new ChargeCountResp
+ {
+ Time = group.Key.ToString("yyyy-MM-dd"),
+ ChargeCount = group.Sum(order => order.ElecCount ?? 0)
+ })
+ .ToList();
+ }
+ }
+ else if (req.TimeType == 3)
+ {
+ // 按月分组统计
+ if (groupByChargerNo)
+ {
+ // 按 ChargerNo、年和月分组
+ result = chargeOrders
+ .Where(order => order.EndTime.HasValue && !string.IsNullOrEmpty(order.ChargerNo))
+ .GroupBy(order => new { order.ChargerNo, order.EndTime.Value.Year, order.EndTime.Value.Month })
+ .Select(group => new ChargeCountResp
+ {
+ ChargerNo = group.Key.ChargerNo,
+ Time = group.Key.Year + "-" + group.Key.Month.ToString("00"),
+ ChargeCount = group.Sum(order => order.ElecCount ?? 0)
+ })
+ .ToList();
+ }
+ else
+ {
+ // 仅按年和月分组
+ result = chargeOrders
+ .Where(order => order.EndTime.HasValue)
+ .GroupBy(order => new { order.EndTime.Value.Year, order.EndTime.Value.Month })
+ .Select(group => new ChargeCountResp
+ {
+ Time = group.Key.Year + "-" + group.Key.Month.ToString("00"),
+ ChargeCount = group.Sum(order => order.ElecCount ?? 0)
+ })
+ .ToList();
+ }
+ }
+
+ return result;
+ }
+
+
+ private static void SetTime(ChargeCountReq req)
+ {
+ if (req.StartTime.HasValue && req.EndTime.HasValue)
+ {
+ return ;
+ }
+
+ if (req.TimeType < 1 || req.TimeType > 3)
+ {
+ // 时间类型传值错误
+ throw new ArgumentException("时间类型传值错误");
+ }
+ if (req.TimeType == 1)
+ {
+ // 今天的开始时间
+ req.StartTime = DateTime.Today;
+ // 今天的结束时间
+ req.EndTime = DateTime.Today.AddDays(1).AddSeconds(-1);
+ }
+ else if (req.TimeType == 2)
+ {
+ // 本月的开始时间
+ req.StartTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
+ // 本月的结束时间 下个月减1秒
+ req.EndTime = req.StartTime.Value.AddMonths(1).AddSeconds(-1);
+ }
+ else if (req.TimeType == 3)
+ {
+ // 今年的开始时间
+ req.StartTime = new DateTime(DateTime.Now.Year, 1, 1);
+ // 今年的结束时间 明年减1秒
+ req.EndTime = req.StartTime.Value.AddYears(1).AddSeconds(-1);
+ }
+ }
}
diff --git a/Service/Station/MonitorService.cs b/Service/Station/MonitorService.cs
index 9690958..b85280f 100644
--- a/Service/Station/MonitorService.cs
+++ b/Service/Station/MonitorService.cs
@@ -39,6 +39,9 @@ public class MonitorService
public MoveBinRecordRepository MoveBinRecordRepository { get; set; }
+ public SwapOrderBatteryRepository _SwapOrderBatteryRepository { get; set; }
+
+
[DisplayName("获取移仓分页")]
public async Task> Page(PageMoveBinRecordReq input)
{
@@ -135,6 +138,13 @@ public class MonitorService
i.LastChargeFinishTime.ToDateTime().Ticks)
.TotalMinutes >
StaticStationInfo.SwapFinishChargeTime).Count();
+
+ if (monitorScreenResp.VehicleInfo.OrderNo!=null)
+ {
+ SwapOrderBattery queryByClauseAsync = _SwapOrderBatteryRepository.QueryByClause(u => u.SwapOrderSn == monitorScreenResp.VehicleInfo.OrderNo);
+ monitorScreenResp.VehicleInfo.DownBatteryBinNo = queryByClauseAsync.DownBatteryBinNo;
+ monitorScreenResp.VehicleInfo.UpBatteryBinNo = queryByClauseAsync.UpBatteryBinNo;
+ }
//SwapMonitorScreenResp monitorScreenResp = new()
//{
diff --git a/Service/Station/SwapOrderService.cs b/Service/Station/SwapOrderService.cs
index 3181fd3..971d887 100644
--- a/Service/Station/SwapOrderService.cs
+++ b/Service/Station/SwapOrderService.cs
@@ -25,6 +25,8 @@ public class SwapOrderService : BaseServices
public SwapOrderReportCloudRepository SwapOrderReportCloudRepository { get; set; }
public SwapOrderMgr SwapOrderMgr { get; set; }
+
+ public ChargeOrderRepository ChargeOrderRepository { get; set; }
public AppCustomerVehicleRepository _appCustomerVehicleRepository{ get; set; }
public SwapOrderService(SwapOrderRepository dal)
{
@@ -234,4 +236,141 @@ public class SwapOrderService : BaseServices
return QueryListByClause(predicate);
}
+
+
+ ///
+ /// 获取当前月份每一天的换电订单数量统计
+ ///
+ /// 返回包含日期和对应订单数量的列表
+ public async Task> GetDaySwapOrderCount()
+ {
+ DateTime now = DateTime.Now;
+ int year = now.Year;
+ int month = now.Month;
+ // 这个月的开始时间
+ DateTime firstDayOfMonth = new DateTime(year, month, 1);
+ // 这个月的最后一秒
+ DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddSeconds(-1);
+
+ // 查询换电订单
+ List swapOrders = await BaseDal.Queryable()
+ .Where(order => order.SwapEndTime >= firstDayOfMonth && order.SwapEndTime <= lastDayOfMonth)
+ .ToListAsync();
+
+ // 查询充电订单
+ List chargeOrders = await ChargeOrderRepository.Queryable()
+ .Where(order => order.EndTime >= firstDayOfMonth && order.EndTime <= lastDayOfMonth)
+ .ToListAsync();
+
+ // 获取这个月的天数
+ int daysInMonth = DateTime.DaysInMonth(year, month);
+
+ // 生成天数的列表
+ List dayList = Enumerable.Range(1, daysInMonth).ToList();
+
+ // 根据天分组、统计分组数量
+ var swapOrderCounts = swapOrders
+ .Where(order => order.SwapEndTime.HasValue)
+ .GroupBy(order => order.SwapEndTime.Value.Day)
+ .Select(group => new
+ {
+ Day = group.Key,
+ Count = group.Count()
+ })
+ .ToList();
+
+ // 根据天分组、统计充电量
+ var chargeOrderCounts = chargeOrders
+ .Where(order => order.EndTime.HasValue)
+ .GroupBy(order => order.EndTime.Value.Day)
+ .Select(group => new
+ {
+ Day = group.Key,
+ ChargeCount = group.Sum(order => order.ElecCount ?? 0)
+ })
+ .ToList();
+
+ List dailyOrderCounts = dayList.Select(day => new SwapOrderCountResp
+ {
+ Day = day,
+ Count = swapOrderCounts.FirstOrDefault(oc => oc.Day == day)?.Count ?? 0,
+ ChargeCount = chargeOrderCounts.FirstOrDefault(cc => cc.Day == day)?.ChargeCount ?? 0
+ }).ToList();
+
+ return dailyOrderCounts;
+ }
+
+ ///
+ /// 查询月换电次数、换电车辆、充电统计
+ ///
+ ///
+ public async Task GetMonthSwapOrderCount()
+ {
+ DateTime now = DateTime.Now;
+ int year = now.Year;
+ int month = now.Month;
+
+ // 本月的开始时间 (00:00:00) 和最后一秒 (23:59:59)
+ DateTime firstDayOfMonth = new DateTime(year, month, 1);
+ DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddSeconds(-1);
+
+ // 查询本月换电订单
+ List swapOrders = await GetSwapOrdersInRange(firstDayOfMonth, lastDayOfMonth);
+
+ // 查询本月充电订单
+ List chargeOrders = await GetChargeOrdersInRange(firstDayOfMonth, lastDayOfMonth);
+
+ SwapOrderCountMonthResp resp = new SwapOrderCountMonthResp
+ {
+ // 本月换电订单总数
+ SwapCount = swapOrders.Count,
+
+ VehicleCount = swapOrders
+ .Where(order => !string.IsNullOrEmpty(order.VehicleNo))
+ .Select(order => order.VehicleNo)
+ .Distinct()
+ .Count(),
+ // 本月充电订单总数
+ ChargeFrequency = chargeOrders.Count,
+
+ // 本月充电电量总和
+ ChargeCount = chargeOrders
+ .Where(order => order.ElecCount.HasValue)
+ .Sum(order => order.ElecCount ?? 0)
+ };
+
+ // 获取今天的开始时间和最后一秒
+ DateTime todayStart = DateTime.Today;
+ DateTime todayEnd = todayStart.AddDays(1).AddSeconds(-1);
+
+ // 查询当天换电订单
+ List daySwapOrder = await GetSwapOrdersInRange(todayStart, todayEnd);
+
+ // 查询当天充电订单
+ List dayChargeOrder = await GetChargeOrdersInRange(todayStart, todayEnd);
+
+ resp.DaySwapCount = daySwapOrder.Count;
+ resp.DayChargeCount = dayChargeOrder
+ .Where(order => order.ElecCount.HasValue)
+ .Sum(order => order.ElecCount ?? 0);
+
+ return resp;
+ }
+
+ private async Task> GetSwapOrdersInRange(DateTime startTime, DateTime endTime)
+ {
+ return await BaseDal.Queryable()
+ .Where(order => order.SwapEndTime >= startTime && order.SwapEndTime <= endTime)
+ .ToListAsync();
+ }
+
+ private async Task> GetChargeOrdersInRange(DateTime startTime, DateTime endTime)
+ {
+ return await ChargeOrderRepository.Queryable()
+ .Where(order => order.EndTime >= startTime && order.EndTime <= endTime)
+ .ToListAsync();
+ }
+
+
+
}
\ No newline at end of file
diff --git a/WebStarter/Controllers/HomeController.cs b/WebStarter/Controllers/HomeController.cs
new file mode 100644
index 0000000..2e0c575
--- /dev/null
+++ b/WebStarter/Controllers/HomeController.cs
@@ -0,0 +1,73 @@
+using Entity.Api.Req;
+using Entity.Api.Resp;
+using HybirdFrameworkCore.Entity;
+using Microsoft.AspNetCore.Mvc;
+using Service.Station;
+
+namespace WebStarter.Controllers;
+
+///
+/// 首页统计
+///
+[ApiController]
+[Route("api/[controller]")]
+public class HomeController : ControllerBase
+{
+ private readonly SwapOrderService _swapOrderService;
+ private readonly ChargeOrderService _chargeOrderService;
+
+ ///
+ /// 注入
+ ///
+ ///
+ ///
+ public HomeController(SwapOrderService swapOrderService
+ ,ChargeOrderService chargeOrderService
+ )
+ {
+ _swapOrderService = swapOrderService;
+ _chargeOrderService = chargeOrderService;
+ }
+
+ ///
+ /// 统计当月的每一天换电数量、充电量
+ ///
+ ///
+ [HttpGet("GetDaySwapOrderCount")]
+ public async Task>> GetDaySwapOrderCount()
+ {
+ return Result>.Success(await _swapOrderService.GetDaySwapOrderCount(), "成功");
+ }
+
+ ///
+ /// 查询月换电次数、换电车辆、充电统计
+ ///
+ ///
+ [HttpGet("GetMonthSwapOrderCount")]
+ public async Task> GetMonthSwapOrderCount()
+ {
+ return Result.Success(await _swapOrderService.GetMonthSwapOrderCount(), "成功");
+ }
+
+ ///
+ /// 用电量查询
+ ///
+ ///
+ ///
+ [HttpPost("GetElectricityConsumption")]
+ public async Task>> GetElectricityConsumption([FromBody] ChargeCountReq req)
+ {
+ return Result>.Success(await _chargeOrderService.GetElectricityConsumptionByTime(req), "成功");
+ }
+
+ ///
+ /// 用电量查询、根据充电机分组
+ ///
+ ///
+ ///
+ [HttpPost("GetElectricityChargerNoConsumption")]
+ public async Task>> GetElectricityChargerNoConsumption([FromBody] ChargeCountReq req)
+ {
+ return Result>.Success(await _chargeOrderService.GetElectricityConsumptionByChargerNo(req), "成功");
+ }
+}
\ No newline at end of file