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 { dto.DownBatteryElectricQuantity = ((double)dto.DownBatterySoc * 3.75).ToString(); dto.UpBatteryElectricQuantity = ((double)dto.UpBatterySoc * 3.75).ToString(); 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 { dto.DownBatteryElectricQuantity = ((double)dto.DownBatterySoc * 3.75).ToString(); dto.UpBatteryElectricQuantity = ((double)dto.UpBatterySoc * 3.75).ToString(); 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") }; } }