using System.Transactions;
using AutoMapper;
using Entity.Api.Req;
using Entity.Api.Resp;
using Entity.DbModel.Station;
using Entity.Dto;
using HybirdFrameworkCore.Entity;
using log4net;
using Magicodes.ExporterAndImporter.Excel;
using Microsoft.AspNetCore.Mvc;
using Repository.Station;
using Service.Init;
using Service.Station;
using Swapping.Business.Common;
namespace WebStarter.Controllers;
///
/// 换电订单
///
[ApiController]
[Route("api/[controller]")]
public class SwapOrderController : ControllerBase
{
private static readonly ILog Log = LogManager.GetLogger(typeof(SwapOrderController));
private readonly SwapOrderService swapOrderService;
private readonly SwapOrderBatteryService swapOrderBatteryService;
private readonly SwapOrderStepService swapOrderStepService;
private readonly SwapOrderReportCloudRepository swapOrderReportCloudRepository;
public SwapOrderController(SwapOrderService swapOrderService, SwapOrderBatteryService swapOrderBatteryService,
SwapOrderStepService swapOrderStepService,SwapOrderReportCloudRepository swapOrderReportCloudRepository)
{
this.swapOrderService = swapOrderService;
this.swapOrderBatteryService = swapOrderBatteryService;
this.swapOrderStepService = swapOrderStepService;
this.swapOrderReportCloudRepository = swapOrderReportCloudRepository;
}
///
/// 查询分页数据
///
///
[HttpPost("QueryPage")]
public async Task>> QueryPage([FromBody] QuerySwapOrderPageReq req)
{
Log.Info($"SwapOrderController QueryPage req={req}");
if (!string.IsNullOrEmpty(req.DownBatteryNo)||!string.IsNullOrEmpty(req.UpBatteryNo))
{
var result = BatteryCodeList(req);
return Result>.Success(result);
}
Log.Info($"查询换电订单 SwapOrderController start QueryPage swapOrderService.QuerySwapOrder req={req}");
var swapOrderResp = swapOrderService.QuerySwapOrder(req);
Log.Info($"查询换电订单 SwapOrderController end QueryPage swapOrderService.QuerySwapOrder req={req}");
PackageSwapOrder(swapOrderResp);
return Result>.Success(swapOrderResp);
}
///
/// app查询换电订单
///
///
///
[HttpPost("AppSwapOrder")]
public async Task>> AppSwapOrder([FromBody] QuerySwapOrderPageReq req)
{
Log.Info($"SwapOrderController QueryPage req={req}");
Log.Info($"查询换电订单 SwapOrderController start QueryPage swapOrderService.QuerySwapOrder req={req}");
var swapOrderResp = swapOrderService.AppQuerySwapOrder(req);
Log.Info($"查询换电订单 SwapOrderController end QueryPage swapOrderService.QuerySwapOrder req={req}");
PackageSwapOrder(swapOrderResp);
return Result>.Success(swapOrderResp);
}
private void PackageSwapOrder(PageResult swapOrderResp)
{
//获取所有订单号
var orderSns = swapOrderResp.Rows.Select(row => row.Sn).ToList();
Log.Info($"查询上报云平台次数 SwapOrderController start QueryPage swapOrderService.QueryReportCloudNumBySn req={orderSns}");
//查询上报云平台次数
//Dictionary queryReportCloudNumBySn = swapOrderService.QueryReportCloudNumBySn(orderSns);
Log.Info($"查询上报云平台次数 SwapOrderController end QueryPage swapOrderService.QueryReportCloudNumBySn req={orderSns}");
Log.Info($"查询订单电池数据 SwapOrderController start QueryPage swapOrderBatteryService.QueryListByClause req={orderSns}");
////查询订单电池数据
List batteryList =
swapOrderBatteryService.QueryListByClause(u => orderSns.Contains(u.SwapOrderSn));
Log.Info($"查询订单电池数据 SwapOrderController end QueryPage swapOrderBatteryService.QueryListByClause req={orderSns}");
//映射
var config =
new MapperConfiguration(cfg => cfg.CreateMap().ReverseMap());
IMapper mapper = config.CreateMapper();
List swapOrderBattery = mapper.Map>(batteryList);
Log.Info($"查询公里数 SwapOrderController start QueryPage swapOrderReportCloudRepository.QueryListByClause req={orderSns}");
List swapOrderReportClouds = swapOrderReportCloudRepository.QueryListByClause(u => orderSns.Contains(u.SwapOrderSn));
Log.Info($"查询公里数 SwapOrderController end QueryPage swapOrderReportCloudRepository.QueryListByClause req={orderSns}");
//将电池数据添加到换电订单数据中
foreach (var row in swapOrderResp.Rows)
{
row.BatteryList = swapOrderBattery.Where(battery => battery.SwapOrderSn == row.Sn).ToList();
var matchingReport = swapOrderReportClouds.FirstOrDefault(r => r.SwapOrderSn == row.Sn);
if (matchingReport != null)
{
foreach (var battery in row.BatteryList)
{
battery.Vtm = matchingReport.Vtm;
}
}
}
Log.Info($"查询订单步序数据 SwapOrderController start QueryPage swapOrderStepService.QueryListByClause req={orderSns}");
//查询订单步序数据
var stepList = swapOrderStepService.QueryListByClause(u => orderSns.Contains(u.SwapOrderSn));
Log.Info($"查询订单步序数据 SwapOrderController end QueryPage swapOrderStepService.QueryListByClause req={orderSns}");
stepList = stepList.OrderBy(s => s.Sort).ToList();
//映射
var config2 = new MapperConfiguration(cfg => cfg.CreateMap().ReverseMap());
IMapper mapper2 = config2.CreateMapper();
List swapOrderStep = mapper2.Map>(stepList);
//将步序数据添加到换电订单数据中
for (int i = 0; i < swapOrderResp.Rows.Count; i++)
{
swapOrderResp.Rows[i].StepList = new List();
swapOrderResp.Rows[i].StepList
.AddRange(swapOrderStep.Where(step => step.SwapOrderSn == swapOrderResp.Rows[i].Sn).ToList());
}
}
private PageResult BatteryCodeList(QuerySwapOrderPageReq req)
{
PageResult batteryCodeList = swapOrderBatteryService.QuerySwapOrderBatteryList(req);
var batteryOrderSn = batteryCodeList.Rows.Select(row => row.SwapOrderSn).ToList();
List swapOrderRespList = swapOrderService.QueryListByClause(u => batteryOrderSn.Contains(u.Sn));
//获取所有订单号
var orderSns = swapOrderRespList.Select(row => row.Sn).ToList();
////查询订单电池数据
List batteryList =
swapOrderBatteryService.QueryListByClause(u => orderSns.Contains(u.SwapOrderSn));
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap().ReverseMap();
cfg.CreateMap().ReverseMap();
});
//映射
IMapper mapper = config.CreateMapper();
List swapOrderBattery = mapper.Map>(batteryList);
List swapOrderResp = mapper.Map>(swapOrderRespList);
List swapOrderReportClouds = swapOrderReportCloudRepository.QueryListByClause(u => orderSns.Contains(u.SwapOrderSn));
//将电池数据添加到换电订单数据中
foreach (var row in swapOrderResp)
{
row.BatteryList = swapOrderBattery.Where(battery => battery.SwapOrderSn == row.Sn).ToList();
var matchingReport = swapOrderReportClouds.FirstOrDefault(r => r.SwapOrderSn == row.Sn);
if (matchingReport != null)
{
foreach (var battery in row.BatteryList)
{
battery.Vtm = matchingReport.Vtm;
}
}
}
//查询订单步序数据
var stepList = swapOrderStepService.QueryListByClause(u => orderSns.Contains(u.SwapOrderSn));
stepList = stepList.OrderBy(s => s.Sort).ToList();
//映射
var config2 = new MapperConfiguration(cfg => cfg.CreateMap().ReverseMap());
IMapper mapper2 = config2.CreateMapper();
List swapOrderStep = mapper2.Map>(stepList);
//将步序数据添加到换电订单数据中
for (int i = 0; i < swapOrderResp.Count; i++)
{
swapOrderResp[i].StepList = new List();
swapOrderResp[i].StepList
.AddRange(swapOrderStep.Where(step => step.SwapOrderSn == swapOrderResp[i].Sn).ToList());
}
PageResult result = new PageResult()
{
PageNum = req.PageNum,
PageSize = req.PageSize,
ToTal = batteryCodeList.ToTal,
Rows = swapOrderResp
};
return result;
}
///
/// 新增
///
///
[HttpPost("Add")]
public async Task> Add([FromBody] AddSwapOrderReq req)
{
using (var transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
// 映射数据
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap().ReverseMap();
cfg.CreateMap().ReverseMap();
});
IMapper mapper = config.CreateMapper();
// 转换换电订单
SwapOrder swapOrder = mapper.Map(req);
swapOrder.Sn = SwapOrderNoGenerator.GenerateOrderNo(StaticStationInfo.StationNo);
swapOrder.CloudReportStatus = 0;
SwapOrder order = await swapOrderService.InsertAsync(swapOrder);
bool batteriesInserted = true;
if (req.batteryList.Any())
{
// 绑定订单
List swapOrderBatteries = mapper.Map>(req.batteryList);
foreach (var swapOrderBattery in swapOrderBatteries)
{
swapOrderBattery.SwapOrderSn = swapOrder.Sn;
}
batteriesInserted = await swapOrderBatteryService.InsertAsync(swapOrderBatteries);
}
if (order != null && batteriesInserted)
{
// 提交
transactionScope.Complete();
return Result.Success(true, "新增成功");
}
return Result.Fail(false, "新增失败");
}
}
///
/// 修改换电订单
///
///
///
[HttpPost("Modify")]
public async Task> Modify([FromBody] ModifySwapOrderReq req)
{
using (var transactionScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
var existingOrder = await swapOrderService.QueryByClauseAsync(u => u.Sn == req.Sn && u.Id != req.Id);
if (existingOrder != null)
{
return Result.Fail("订单号已存在");
}
// 映射数据
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap().ReverseMap();
cfg.CreateMap().ReverseMap();
});
IMapper mapper = config.CreateMapper();
SwapOrder swapOrder = mapper.Map(req);
bool orderUpdated = swapOrderService.Update(swapOrder);
bool batteriesUpdated = true;
if (req.batteryList.Any())
{
// 绑定订单
List swapOrderBatteries = mapper.Map>(req.batteryList);
foreach (var swapOrderBattery in swapOrderBatteries)
{
swapOrderBattery.SwapOrderSn = swapOrder.Sn;
}
// 更新电池订单
batteriesUpdated = await swapOrderBatteryService.UpdateAsync(swapOrderBatteries);
}
if (orderUpdated && batteriesUpdated)
{
// 提交
transactionScope.Complete();
return Result.Success(true, "更改成功");
}
return Result.Fail("更改失败");
}
}
///
/// 删除
///
/// ids id列表
///
[HttpPost("DeleteByIds")]
public async Task> DeleteByIds([FromBody] List ids)
{
if (swapOrderService.DeleteByIds(ids))
{
return Result.Success(true, "删除成功");
}
else
{
return Result.Fail("删除失败");
}
}
///
/// 换电订单导出
///
///
///
[HttpPost]
[Route("export")]
public async Task ExportSwapOrder([FromBody] QuerySwapOrderPageReq req)
{
// 获取请求头中的语言信息
var language = Request.Headers["Accept-Language"].ToString().ToLower();
List orderList = await swapOrderService.QuerySwapOrderListAsync(req);
// 获取所有订单号
var orderSns = orderList.Select(row => row.Sn).ToList();
// 查询订单电池数据
List batteryList =
swapOrderBatteryService.QueryListByClause(u => orderSns.Contains(u.SwapOrderSn));
// 根据语言设置不同的映射配置
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap().ReverseMap();
cfg.CreateMap().ReverseMap();
cfg.CreateMap().ReverseMap();
});
IMapper mapper = config.CreateMapper();
List swapOrderBattery = mapper.Map>(batteryList);
List list = mapper.Map>(orderList);
List list2 = mapper.Map>(orderList);
// 将电池数据添加到换电订单数据中
for (int i = 0; i < list.Count; i++)
{
if (language == "en")
{
SwapOrderDto2 dto = list2[i];
SwapOrderBatteryResp? swapOrderBatteryResp =
swapOrderBattery.FirstOrDefault(battery => battery.SwapOrderSn == dto.Sn);
if (swapOrderBatteryResp != null)
{
dto.DownBatterySoc = swapOrderBatteryResp.DownBatterySoc;
dto.DownBatteryRealSoc = swapOrderBatteryResp.DownBatteryRealSoc;
dto.DownBatteryLastSoc = swapOrderBatteryResp.DownBatteryLastSoc;
dto.DownBatteryNo = swapOrderBatteryResp.DownBatteryNo;
dto.UpBatteryNo = swapOrderBatteryResp.UpBatteryNo;
dto.UpBatterySoc = swapOrderBatteryResp.UpBatterySoc;
dto.UpBatteryRealSoc = swapOrderBatteryResp.UpBatteryRealSoc;
dto.DownBatteryBinNo = swapOrderBatteryResp.DownBatteryBinNo;
dto.UpBatteryBinNo = swapOrderBatteryResp.UpBatteryBinNo;
dto.StationNumber = StaticStationInfo.StationNumber;
try
{
double ElectricQuantity = ((float)(dto.UpBatterySoc - dto.DownBatterySoc)) * 3.75;
dto.ElectricQuantity = ElectricQuantity.ToString();
}
catch (Exception e)
{
}
}
}
else
{
SwapOrderDto dto = list[i];
SwapOrderBatteryResp? swapOrderBatteryResp =
swapOrderBattery.FirstOrDefault(battery => battery.SwapOrderSn == dto.Sn);
if (swapOrderBatteryResp != null)
{
dto.DownBatterySoc = swapOrderBatteryResp.DownBatterySoc;
dto.DownBatteryRealSoc = swapOrderBatteryResp.DownBatteryRealSoc;
dto.DownBatteryLastSoc = swapOrderBatteryResp.DownBatteryLastSoc;
dto.DownBatteryNo = swapOrderBatteryResp.DownBatteryNo;
dto.UpBatteryNo = swapOrderBatteryResp.UpBatteryNo;
dto.UpBatterySoc = swapOrderBatteryResp.UpBatterySoc;
dto.UpBatteryRealSoc = swapOrderBatteryResp.UpBatteryRealSoc;
dto.DownBatteryBinNo = swapOrderBatteryResp.DownBatteryBinNo;
dto.UpBatteryBinNo = swapOrderBatteryResp.UpBatteryBinNo;
dto.StationNumber = StaticStationInfo.StationNumber;
try
{
double ElectricQuantity = ((float)(dto.UpBatterySoc - dto.DownBatterySoc)) * 3.75;
dto.ElectricQuantity = ElectricQuantity.ToString();
}
catch (Exception e)
{
}
}
}
}
IExcelExporter excelExporter = new ExcelExporter();
var res = language == "en"
? await excelExporter.ExportAsByteArray(list2)
: await excelExporter.ExportAsByteArray(list);
return new FileStreamResult(new MemoryStream(res), "application/octet-stream")
{
FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") +
(language == "en" ? "_Swap_Orders.xlsx" : "换电订单.xlsx")
};
}
}