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 Entity.Dto.Resp;
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;
SwapOrderBatteryRepository _swapOrderBatteryRepository;
public ChargeOrderService(ChargeOrderRepository dal,SwapOrderBatteryRepository swapOrderBatteryRepository)
{
chargeOrderRepository = dal;
_swapOrderBatteryRepository = swapOrderBatteryRepository;
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();
cfg.CreateMap().ReverseMap();
});
IMapper mapper = config.CreateMapper();
List chargeOrderExportList = mapper.Map>(chargeOrders);
if (chargeOrderExportList.Count > 0)
{
List orderSnList = chargeOrderExportList.Select(resp => resp.SwapOrderSn).ToList();
List swapOrderBatteryList = await _swapOrderBatteryRepository
.Queryable()
.In(swapOrderBattery => swapOrderBattery.SwapOrderSn, orderSnList)
.ToListAsync();
var swapOrderBatteryMap = new Dictionary();
foreach (var swapOrderBattery in swapOrderBatteryList)
{
if (!string.IsNullOrEmpty(swapOrderBattery.SwapOrderSn)) swapOrderBatteryMap.Add(swapOrderBattery.SwapOrderSn, swapOrderBattery);
}
foreach (var order in chargeOrderExportList)
{
if (order.SwapOrderSn!=null&&swapOrderBatteryMap.TryGetValue(order.SwapOrderSn, out var swapOrderBattery))
{
try
{
int startSoc = order.StartSoc ?? 0;
int stopSoc = order.StopSoc ?? 0;
decimal downNominalEnergy = swapOrderBattery.DownNominalEnergy ?? 0;
order.StartBattery = downNominalEnergy > 0 ? (int?)(startSoc * downNominalEnergy) : 0;
order.StopBattery = downNominalEnergy > 0 ? (int?)(stopSoc * downNominalEnergy) : 0;
}
catch (Exception ex)
{
order.StartBattery = 0;
order.StopBattery = 0;
}
}
}
}
if (language == "en")
{
List list2 = mapper.Map>(chargeOrderExportList);
foreach (var chargeOrderDto in list2)
{
if (!string.IsNullOrEmpty(chargeOrderDto.ChargerNo))
{
try
{
string lastTwoDigits = chargeOrderDto.ChargerNo.Substring(chargeOrderDto.ChargerNo.Length - 2);
if (int.TryParse(lastTwoDigits, out int binNo))
{
chargeOrderDto.BinNO = binNo.ToString();
}
}
catch (Exception e)
{
chargeOrderDto.BinNO = "-1";
}
}
}
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>(chargeOrderExportList);
foreach (var chargeOrderDto in list)
{
if (!string.IsNullOrEmpty(chargeOrderDto.ChargerNo))
{
try
{
string lastTwoDigits = chargeOrderDto.ChargerNo.Substring(chargeOrderDto.ChargerNo.Length - 2);
if (int.TryParse(lastTwoDigits, out int binNo))
{
chargeOrderDto.BinNO = binNo.ToString();
}
}
catch (Exception e)
{
chargeOrderDto.BinNO = "-1";
}
}
}
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 ExportElectricityChargerNoConsumption(ChargeCountReq req,string language)
{
// 查询订单
List resp = await GetElectricityConsumptionExport(req, false);
if (resp.Count>0)
{
resp = resp.OrderBy(x => x.Time).ToList();
}
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap().ReverseMap();
});
IMapper mapper = config.CreateMapper();
if (language == "en")
{
List list2 = mapper.Map>(resp);
IExcelExporter excelExporter = new ExcelExporter();
var res = await excelExporter.ExportAsByteArray(list2);
return new FileStreamResult(new MemoryStream(res), "application/octet-stream")
{ FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "_chargeCount.xlsx" };
}
else
{
List list = mapper.Map>(resp);
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.StartTime >= chargeOrder.StartTime && u.StartTime <= 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;
}
public async Task> GetElectricityConsumptionExport(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, DateHour = order.EndTime.Value.ToString("yyyy-MM-dd HH") })
.Select(group => new ChargeCountResp
{
ChargerNo = group.Key.ChargerNo,
Time = group.Key.DateHour + ":00", // 保留年月日和小时
ChargeCount = group.Sum(order => order.ElecCount ?? 0)
})
.ToList();
}
else
{
// 仅按小时分组
result = chargeOrders
.Where(order => order.EndTime.HasValue)
.GroupBy(order => order.EndTime.Value.ToString("yyyy-MM-dd HH"))
.Select(group => new ChargeCountResp
{
Time = group.Key + ":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);
}
}
}