using Autofac; using AutoMapper; using Common.Util; using Entity.Constant; using Entity.DbModel.Station; using Entity.Dto; using HybirdFrameworkCore.Autofac; using HybirdFrameworkCore.Autofac.Attribute; using log4net; using NewLife.Serialization; using Newtonsoft.Json; using Repository.Station; using Service.Execute.Api; using Service.Execute.Model; using Service.Init; using Service.Station; using SqlSugar; namespace Service.Execute.Utils; [Scope("SingleInstance")] public class CommonMgr { private static readonly ILog _log = LogManager.GetLogger(typeof(CommonMgr)); public SwapOrderStepService _swapOrderStepService { get; set; } public SwapOrderRepository _swapOrderRepository { get; set; } public BinInfoRepository _binInfoRepository { get; set; } public SwapAmtOrderRepository _amtOrderRepository { get; set; } public SwapOrderBatteryRepository _swapOrderBatteryRepository { get; set; } public SwapOrderReportCloudRepository _swapOrderReportCloudRepository { get; set; } public MoveBinRecordRepository MoveBinRecordRepository { get; set; } public SwapOrderStepRepository SwapOrderStepRepository { get; set; } /// /// 新增小步状态 /// public void InsertStep(InfoEnum.BusinessSwappingStep step, SwappingStateMachine machine, string desc = "", string param = null, int type = (int)SwapConstant.StepType.AUTO) { var stepModel = new StepModel { StepName = BaseEnumExtensions.GetDescription(step), StepNo = (int)step, StartTime = DateTime.Now, Status = 1 }; machine.StepModel[stepModel.StepNo.ToString()] = stepModel; if (machine.SwapOrder != null) { if (!string.IsNullOrEmpty(machine.SwapOrder.Sn)) _swapOrderStepService.InsertSwapStepForSwapMain(step, machine.StepSort++, machine.SwapOrder.Sn, desc, param, type); } } /// /// 新增换电订单 /// /// /// public SwapOrder SaveOrder(SwapOrder swapOrder) { swapOrder.SwapWay = (int)StationConstant.StationWay.Auto; swapOrder.CloudReportStatus = 0; swapOrder.SwapWay = 0; swapOrder.CreatedTime = DateTime.Now; _swapOrderRepository.Insert(swapOrder); return swapOrder; } public void SaveSwapBattery(SwappingStateMachine machine) { BinInfo upBin = machine.SwapOrderBatteryInfo.UpBinInfo; BinInfo inBin = machine.SwapOrderBatteryInfo.InBinInfo; SwapOrderBattery swapOrderBattery = new SwapOrderBattery() { SwapOrderSn = machine.SwapOrder.Sn, UpBatterySoc = upBin.Soc, UpBatteryNo = upBin.BatteryNo, UpBatterySoe = upBin.Soe, //TODO::添加 换上电池的容量 UpBatteryBinNo = int.Parse(upBin.No), UpNominalEnergy = upBin.NominalEnergy, DownBatteryBinNo = int.Parse(inBin.No), DownBatteryNo = inBin.BatteryNo, DownBatterySoc = inBin.Soc, DownBatterySoe = inBin.Soe, CreatedTime = DateTime.Now }; _swapOrderBatteryRepository.Insert(swapOrderBattery); } //查询是否有手动操作 public bool QueryHasManual(String swapOrderSn) { return SwapOrderStepRepository.GetCount(i => i.SwapOrderSn == swapOrderSn && i.StepType == (int)SwapConstant.StepType.MANUAL) > 0; } /// /// 1.锁仓 /// 2.更改预约单 /// public void LockBinAndUpdateAmt(SwapOrderBatteryInfo orderBatteryInfo) { var configBinInfo = new MapperConfiguration(cfg => cfg.CreateMap().ReverseMap()); IMapper mapperBinInfo = configBinInfo.CreateMapper(); BinInfo dbBinInfo = mapperBinInfo.Map(orderBatteryInfo.UpBinInfo); dbBinInfo.AmtLock = (int)InfoEnum.AmtBatLockStatus.Lock; _binInfoRepository.Update(dbBinInfo); if (!orderBatteryInfo.isAmt) { return; } var configAmt = new MapperConfiguration(cfg => cfg.CreateMap().ReverseMap()); IMapper mapperAmt = configAmt.CreateMapper(); SwapAmtOrder swapAmtOrder = mapperAmt.Map(orderBatteryInfo.swapAmtOrder); swapAmtOrder.Status = (int)InfoEnum.AmtOrderStatus.Swapping; _amtOrderRepository.Update(swapAmtOrder); } /// /// 1.解锁 /// 2.更改预约单 /// public void LockBinAndUpdateAmts(SwapOrderBatteryInfo orderBatteryInfo) { var configBinInfo = new MapperConfiguration(cfg => cfg.CreateMap().ReverseMap()); IMapper mapperBinInfo = configBinInfo.CreateMapper(); BinInfo dbBinInfo = mapperBinInfo.Map(orderBatteryInfo.UpBinInfo); dbBinInfo.AmtLock = (int)InfoEnum.AmtBatLockStatus.UnLock; _binInfoRepository.Update(dbBinInfo); if (!orderBatteryInfo.isAmt) { return; } var configAmt = new MapperConfiguration(cfg => cfg.CreateMap().ReverseMap()); IMapper mapperAmt = configAmt.CreateMapper(); SwapAmtOrder swapAmtOrder = mapperAmt.Map(orderBatteryInfo.swapAmtOrder); swapAmtOrder.Status = (int)InfoEnum.AmtOrderStatus.SwapFinish; _amtOrderRepository.Update(swapAmtOrder); } /// 1.仓位状态:启动 /// 2.电池在位 /// 3.充电状态:不在充电中 /// 4.未锁定 /// 5.最后一次结束充电时间> () /// 6.soc >() /** * && i.ChargeStatus == 2 && i.AmtLock == "0" && new TimeSpan(DateTime.Now.Ticks - i.LastChargeFinishTime.ToDateTime().Ticks) .TotalMinutes > StaticStationInfo.SwapFinishChargeTime && i.Soc > StaticStationInfo.Soc */ public SwapOrderBatteryInfo SelectPackNotArm(SwappingStateMachine machine) { SwapOrderBatteryInfo orderBatteryInfo = new SwapOrderBatteryInfo(); UpBin(machine, orderBatteryInfo); _log.Info($"UpBin orderBatteryInfo={JsonConvert.SerializeObject(orderBatteryInfo)}"); if (orderBatteryInfo.CanSwap != InfoEnum.SelectBinStatusInfo.Success) { return orderBatteryInfo; } InBin(orderBatteryInfo, machine); _log.Info($"InBin orderBatteryInfo={JsonConvert.SerializeObject(orderBatteryInfo)}"); if (orderBatteryInfo.CanSwap != InfoEnum.SelectBinStatusInfo.Success) { return orderBatteryInfo; } //手动选包 ManualSelectPack(machine, orderBatteryInfo); if (orderBatteryInfo.CanSwap == InfoEnum.SelectBinStatusInfo.Success) { orderBatteryInfo.InBinInfo.BatteryNo = "-1"; orderBatteryInfo.InBinInfo.Soc = -1; orderBatteryInfo.InBinInfo.Soe = -1; orderBatteryInfo.InBinInfo.Soh = -1; var carInfoBatteryInfos = machine.BoxCarInfoModel?.CarInfo?.BatteryInfos; if (carInfoBatteryInfos != null && carInfoBatteryInfos.Count > 0) { orderBatteryInfo.InBinInfo.BatteryNo = carInfoBatteryInfos[0].BatteryNo; // orderBatteryInfo.InBinInfo.Soc = carInfoBatteryInfos[0].Soc; orderBatteryInfo.InBinInfo.Soe = carInfoBatteryInfos[0].Soe; orderBatteryInfo.InBinInfo.Soh = carInfoBatteryInfos[0].Soh; } } return orderBatteryInfo; } public SwapOrderBatteryInfo SelectPackArm(SwapAmtOrder swapAmtOrder, SwappingStateMachine machine) { SwapOrderBatteryInfo orderBatteryInfo = new SwapOrderBatteryInfo(); orderBatteryInfo.swapAmtOrder = swapAmtOrder; orderBatteryInfo.isAmt = true; BinInfo UpBin = _binInfoRepository.QueryByClause(i => i.No.Equals(swapAmtOrder.AmtBinNoList)); bool CanSwap = UpBin.Exists == 1 && UpBin.Status == 1 && UpBin.ChargeStatus == 2 && UpBin.AmtLock == (int)InfoEnum.AmtBatLockStatus.Lock && new TimeSpan(DateTime.Now.Ticks - UpBin.LastChargeFinishTime.ToDateTime() .Ticks) .TotalMinutes > StaticStationInfo.SwapFinishChargeTime && UpBin.Soc > StaticStationInfo.SwapSoc; if (!CanSwap) { orderBatteryInfo.CanSwap = InfoEnum.SelectBinStatusInfo.AmtError; return orderBatteryInfo; } orderBatteryInfo.UpBinInfo = UpBin; InBin(orderBatteryInfo, machine); return orderBatteryInfo; } /// /// 取电池判断 /// 不能选正在执行移仓的电池 /// /// public void UpBin(SwappingStateMachine machine, SwapOrderBatteryInfo orderBatteryInfo) { SelectPackDto selectPack = _binInfoRepository.SelectPack(StaticStationInfo.SwapSoc, StaticStationInfo.SwapFinishChargeTime, QueryMoveBinNo()[0]); orderBatteryInfo.CanUpBin = selectPack.CanSwapBinInfo; orderBatteryInfo.UpBinInfo = selectPack.BinInfo; orderBatteryInfo.CanSwap = selectPack.Info; } private List QueryMoveBinNo() { string moveUp = ""; string moveIn = ""; /*//当前有移仓任务 if (PlcMgr.PlcClient?.ReadTaskNo() == 2) { MoveBinRecord queryByClause = MoveBinRecordRepository.QueryByClause(i => i.Status == 0 || i.Status == 1, i => i.CreatedTime, OrderByType.Desc); if (queryByClause != null) { moveUp = queryByClause?.UpBinNo; moveIn = queryByClause?.InBinNo; } }*/ return new List() { moveUp, moveIn }; } public void ceshi() { } /// /// 放电池判断:取出来的电池仓位能不能放 /// /// public void InBin(SwapOrderBatteryInfo orderBatteryInfo, SwappingStateMachine machine) { orderBatteryInfo.CanSwap = InfoEnum.SelectBinStatusInfo.WaitSelectDownBin; SelectPackDto selectPackDto= _binInfoRepository.SelectPackInBin(); orderBatteryInfo.CanDownBin = selectPackDto.CanSwapBinInfo; orderBatteryInfo.InBinInfo = selectPackDto.BinInfo; orderBatteryInfo.CanSwap = selectPackDto.Info; } //手动选包 public void ManualSelectPack(SwappingStateMachine machine, SwapOrderBatteryInfo orderBatteryInfo) { if ((int)SwapConstant.AutoOrManual.Auto == StaticStationInfo.SelectPackManually) { return; } //手动等待选包 orderBatteryInfo.CanSwap = InfoEnum.SelectBinStatusInfo.WaitManually; orderBatteryInfo.UpBinInfo = null; orderBatteryInfo.InBinInfo = null; if (machine.SwapOrderBatteryInfo?.UpBinInfo == null || machine.SwapOrderBatteryInfo?.InBinInfo == null) { _log.Info("等待手动选包.........."); //TODO:: 增加播报 return; } if (orderBatteryInfo.CanUpBin.Count > 0) { BinInfo? binInfo = orderBatteryInfo.CanUpBin.First(i => i.Id == machine.SwapOrderBatteryInfo?.UpBinInfo.Id); if (binInfo != null) { orderBatteryInfo.CanSwap =InfoEnum.SelectBinStatusInfo.WaitSelectDownBin; orderBatteryInfo.UpBinInfo = binInfo; } } if (orderBatteryInfo.CanDownBin.Count > 0) { BinInfo? binInfo = orderBatteryInfo.CanDownBin.First(i => i.Id == machine.SwapOrderBatteryInfo?.InBinInfo.Id); if (binInfo != null) { orderBatteryInfo.CanSwap =InfoEnum.SelectBinStatusInfo.Success; orderBatteryInfo.InBinInfo = binInfo; } } } /// /// 查询预约单 /// /// /// public SwapAmtOrder? QueryAmtOrder(SwappingStateMachine machine) { return _amtOrderRepository.QueryByClause(i => i.Status == (int)InfoEnum.AmtOrderStatus.Success && i.CarNo.Equals(machine.BoxCarInfoModel.CarNo)); } /// /// 更新订单 /// /// public void UpdateSwapOrder(SwappingStateMachine machine) { SwapOrder swapOrder = _swapOrderRepository.QueryById(machine.SwapOrder.Id); machine.SwapOrder.CloudReportStatus = swapOrder.CloudReportStatus; _swapOrderRepository.Update(machine.SwapOrder); } /// /// 更新预约订单 /// /// public void UpdateAmtOrder(SwappingStateMachine machine) { _amtOrderRepository.Update(machine.SwapOrderBatteryInfo.swapAmtOrder); } /// /// 换电成功关于binInfo表的处理 /// public void UpdateBinInfoForSwapSuccess(SwappingStateMachine machine) { SwapOrderBatteryInfo? machineSwapOrderBatteryInfo = machine.SwapOrderBatteryInfo; if (machineSwapOrderBatteryInfo != null) { var inBinInfo = machineSwapOrderBatteryInfo.InBinInfo; //修改入仓顺序 BinInfo binInfo = _binInfoRepository .QueryListByClause(i => i.BatteryEnterSeq != null, "battery_enter_seq desc").First(); inBinInfo.BatteryEnterSeq = binInfo.BatteryEnterSeq + 1; inBinInfo.InTime = DateTime.Now; _binInfoRepository.Update(inBinInfo); var upBinInfo = machineSwapOrderBatteryInfo.UpBinInfo; upBinInfo.Soc = -1; upBinInfo.Soe = -1; upBinInfo.BatteryNo = "-1"; _binInfoRepository.Update(upBinInfo); } } /// /// 换电完成新增上报云平台记录 /// /// public void InsertCloudReportForSwapSuccess(SwappingStateMachine machine) { SwapOrder? machineSwapOrder = machine.SwapOrder; _swapOrderReportCloudRepository.Insert(new SwapOrderReportCloud() { SwapOrderSn = machineSwapOrder.Sn, SwapOrderId = machineSwapOrder.Id, CloudReportStatus = 0, Vin = machineSwapOrder.VehicleVin, Vtm = Convert.ToSingle(machine.BoxCarInfoModel?.ElecMsg?.TotalMile), }); } }