using System.Linq.Expressions; using AutoMapper; using Entity.Api.Req; using Entity.Api.Resp; using Entity.DbModel.Station; using Entity.Dto; using Entity.Dto.Req; using HybirdFrameworkCore.Autofac.Attribute; using HybirdFrameworkCore.Entity; using HybirdFrameworkCore.Utils; using Magicodes.ExporterAndImporter.Excel; using Microsoft.AspNetCore.Mvc; using Repository.Station; namespace Service.Station; /// /// 充电订单 /// [Scope("SingleInstance")] public class ChargeOrderService : BaseServices { ChargeOrderRepository chargeOrderRepository; public ChargeOrderService(ChargeOrderRepository dal) { chargeOrderRepository = dal; BaseDal = dal; } /// /// 根据条件查询分页数据 /// /// /// public PageResult QueryChargeOrder(QueryChargeOrderReq chargeOrder) { //创建一个空的表达式树 Expression> where = null; //// 定义参数表达式 ParameterExpression parameter = Expression.Parameter(typeof(ChargeOrder), "u"); #region 构建动态查询树 where = queryTree(chargeOrder, where, parameter); #endregion //查询 return PageResult.ConvertPage(chargeOrderRepository.QueryIPage(chargeOrder, where)); } /// /// 导出充电订单 /// /// /// /// public async Task ExportChargeOrder(QueryChargeOrderReq chargeOrder,string language) { // 查询订单 List chargeOrders = await QueryChargeOrderListAsync(chargeOrder); var config = new MapperConfiguration(cfg => { cfg.CreateMap().ReverseMap(); cfg.CreateMap().ReverseMap(); }); IMapper mapper = config.CreateMapper(); if (language == "en") { List list2 = mapper.Map>(chargeOrders); IExcelExporter excelExporter = new ExcelExporter(); var res = await excelExporter.ExportAsByteArray(list2); return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "_ChargeOrders.xlsx" }; } else { List list = mapper.Map>(chargeOrders); IExcelExporter excelExporter = new ExcelExporter(); var res = await excelExporter.ExportAsByteArray(list); return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "充电订单.xlsx" }; } } /// /// 查询需要导出订单 /// /// /// public async Task> QueryChargeOrderListAsync(QueryChargeOrderReq chargeOrder) { Expression> where = null; ParameterExpression parameter = Expression.Parameter(typeof(ChargeOrder), "u"); #region 构建动态查询树 where = queryTree(chargeOrder, where, parameter); #endregion // 查询需要导出充电订单 不分页 return await chargeOrderRepository.QueryChargeOrderList(where); } private static Expression>? queryTree(QueryChargeOrderReq chargeOrder, Expression>? where, ParameterExpression parameter) { if (chargeOrder.Id != 0) { Expression> condition1Expr = u => u.Id == chargeOrder.Id; where = condition1Expr; } if (!string.IsNullOrEmpty(chargeOrder.Sn)) { Expression> condition2Expr = u => u.Sn == chargeOrder.Sn; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); } if (!string.IsNullOrEmpty(chargeOrder.BatteryNo)) { Expression> condition2Expr = u => u.BatteryNo == chargeOrder.BatteryNo; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); } if (!string.IsNullOrEmpty(chargeOrder.ChargerNo)) { Expression> condition2Expr = u => u.ChargerNo == chargeOrder.ChargerNo; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); } // 构建时间范围条件 if (chargeOrder.StartTime != null && chargeOrder.StartTime != DateTime.MinValue && chargeOrder.EndTime != null && chargeOrder.EndTime != DateTime.MinValue) { Expression> conditionExpr = u => u.CreatedTime >= chargeOrder.StartTime && u.CreatedTime <= chargeOrder.EndTime; where = conditionExpr; } if (chargeOrder.ChargeTimeCount!=null) { Expression> condition2Expr = u => u.ChargeTimeCount == chargeOrder.ChargeTimeCount; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); } if (chargeOrder.StopReason != null) { Expression> condition2Expr = u => u.StopReason == chargeOrder.StopReason; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); } /*if (!string.IsNullOrEmpty(chargeOrder.ElecPriceModelVersion)) { Expression> condition2Expr = u => u.ElecPriceModelVersion == chargeOrder.ElecPriceModelVersion; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); }*/ if (!string.IsNullOrEmpty(chargeOrder.SwapOrderSn)) { Expression> condition2Expr = u => u.SwapOrderSn == chargeOrder.SwapOrderSn; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); } if (chargeOrder.CloudReportStatus != null) { Expression> condition2Expr = u => u.CloudReportStatus == chargeOrder.CloudReportStatus; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); } if (!string.IsNullOrEmpty(chargeOrder.CloudChargeOrder)) { Expression> condition2Expr = u => u.CloudChargeOrder == chargeOrder.CloudChargeOrder; where = where == null ? condition2Expr : Expression.Lambda>(Expression.AndAlso(where.Body, condition2Expr.Body), parameter); } return where; } /// /// 获取每日充电订单 /// /// public List DayChargeOrder() { // 获取今天的日期 DateTime today = DateTime.Today; // 昨天 00:00 DateTime startOfYesterday = today.AddDays(-1); // 昨天 23:59:59 DateTime endOfYesterday = startOfYesterday.AddDays(1).AddTicks(-1); Expression> predicate = x => x.StartTime >= startOfYesterday && x.StartTime <= endOfYesterday; 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); } } }