|
|
|
|
using Autofac;
|
|
|
|
|
using Entity.Attr;
|
|
|
|
|
using Entity.Constant;
|
|
|
|
|
using HybirdFrameworkCore.Autofac;
|
|
|
|
|
using log4net;
|
|
|
|
|
using Repository.Station;
|
|
|
|
|
using Service.Execute.Api;
|
|
|
|
|
using Service.Execute.Model;
|
|
|
|
|
using Service.Execute.Model.Tbox;
|
|
|
|
|
using Service.Execute.StaticTools;
|
|
|
|
|
using Service.Execute.SwapException;
|
|
|
|
|
using Service.Execute.Utils;
|
|
|
|
|
using Service.Init;
|
|
|
|
|
using Service.Station;
|
|
|
|
|
|
|
|
|
|
namespace Service.Execute.Step;
|
|
|
|
|
|
|
|
|
|
public class SwapDoneState : IState
|
|
|
|
|
{
|
|
|
|
|
private readonly CommonMgr _CommonMgr = AppInfo.Container.Resolve<CommonMgr>();
|
|
|
|
|
private readonly ILog _log = LogManager.GetLogger(typeof(SwapDoneState));
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 修改换电订单
|
|
|
|
|
/// 查看是否有预约单 更新预约单的状态
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="machine"></param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public StateResult Handle(SwappingStateMachine machine)
|
|
|
|
|
{
|
|
|
|
|
//更新换电订单
|
|
|
|
|
machine.SwapOrder!.SwapResult = machine.SwapStatus;
|
|
|
|
|
machine.SwapOrder.SwapEndTime = DateTime.Now;
|
|
|
|
|
machine.SwapOrder.FailReason = machine.SwapFailReason;
|
|
|
|
|
_CommonMgr.UpdateSwapOrder(machine);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//修改预约单
|
|
|
|
|
if (machine.SwapOrderBatteryInfo!.swapAmtOrder != null)
|
|
|
|
|
{
|
|
|
|
|
machine.SwapOrderBatteryInfo.swapAmtOrder.Status =
|
|
|
|
|
machine.SwapStatus == (int)InfoEnum.SwapOrderResult.Success
|
|
|
|
|
? (int)InfoEnum.AmtOrderStatus.SwapFinish
|
|
|
|
|
: (int)InfoEnum.AmtOrderStatus.SwapFail;
|
|
|
|
|
_CommonMgr.UpdateAmtOrder(machine);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Task.Run(() =>
|
|
|
|
|
{
|
|
|
|
|
//新增换电成功上报云平台数据
|
|
|
|
|
_CommonMgr.InsertCloudReportForSwapSuccess(machine);
|
|
|
|
|
//换电成功关于bininfo表的更新
|
|
|
|
|
_CommonMgr.UpdateBinInfoForSwapSuccess(machine);
|
|
|
|
|
|
|
|
|
|
//可人工确认换电成功标识
|
|
|
|
|
machine.PlcSwapFlag = true;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (machine.SwapStatus == (int)InfoEnum.SwapOrderResult.Success)
|
|
|
|
|
{
|
|
|
|
|
//上传云平台换电状态
|
|
|
|
|
machine.BusinessSwappingForCloudState = InfoEnum.BusinessSwappingForCloudState.SwapDoneWithVel;
|
|
|
|
|
// CloudApi.SendStateLog(machine.SwapOrder, machine.BusinessSwappingForCloudState);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//云平台没有匹配的失败状态
|
|
|
|
|
//车辆上锁 ,提示请驶离
|
|
|
|
|
InvokeStatus lockCar = LockCar(machine);
|
|
|
|
|
|
|
|
|
|
if (lockCar != InvokeStatus.Done)
|
|
|
|
|
{
|
|
|
|
|
return SwappingStateMachine.ReturnWithInvokeErr(lockCar, ExceptionReason.None);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//TBOX收到车辆上电OK信号
|
|
|
|
|
InvokeStatus tBoxEnergyUp = TBoxEnergyUp(machine);
|
|
|
|
|
if (tBoxEnergyUp != InvokeStatus.Done)
|
|
|
|
|
{
|
|
|
|
|
return SwappingStateMachine.ReturnWithInvokeErr(tBoxEnergyUp, ExceptionReason.None);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TBOX收到货箱放下
|
|
|
|
|
InvokeStatus tBoxDown = TBoxDown(machine);
|
|
|
|
|
if (tBoxDown != InvokeStatus.Done)
|
|
|
|
|
{
|
|
|
|
|
return SwappingStateMachine.ReturnWithInvokeErr(tBoxDown, ExceptionReason.None);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//出口雷达监测
|
|
|
|
|
InvokeStatus existRadar = ExistRadar(machine);
|
|
|
|
|
if (existRadar != InvokeStatus.Done)
|
|
|
|
|
{
|
|
|
|
|
return SwappingStateMachine.ReturnWithInvokeErr(existRadar, ExceptionReason.None);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return new StateResult()
|
|
|
|
|
{
|
|
|
|
|
SwappingState = SwappingState.StationReady
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 车辆上锁
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public InvokeStatus LockCar(SwappingStateMachine machine)
|
|
|
|
|
{
|
|
|
|
|
return Invoker.Invoke("LockCar", 500, 10, machine.IsCanceled, machine.IsManualSwapSucc,
|
|
|
|
|
() => machine.VelLockFlag, () =>
|
|
|
|
|
{
|
|
|
|
|
Task<bool> result = TBoxApi.LockCarManyTimes(machine.RfidReadModel.VelVin);
|
|
|
|
|
|
|
|
|
|
bool unLock = result.Result;
|
|
|
|
|
if (unLock)
|
|
|
|
|
{
|
|
|
|
|
//查询车辆锁止状态
|
|
|
|
|
Task<TboxCarInfoModel> carInfo = TBoxApi.GetCarInfo(machine.RfidReadModel.VelVin);
|
|
|
|
|
if (carInfo.Result?.CarStatus?.LockStatus == 2 || machine.ManualConfirmCarLockFlag)
|
|
|
|
|
{
|
|
|
|
|
machine.ManualConfirmCarLockFlag = false;
|
|
|
|
|
machine.BoxCarInfoModel = carInfo.Result;
|
|
|
|
|
machine.VelLockFlag = true;
|
|
|
|
|
_CommonMgr.InsertStep(InfoEnum.BusinessSwappingStep.VelLockFlag,
|
|
|
|
|
machine);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, () =>
|
|
|
|
|
{
|
|
|
|
|
// machine.LedTool?.WriteProgramContent(InfoEnum.SwapInfo.ErrLockCar.GetLed());
|
|
|
|
|
SoundApi.PlayOneSound((int)InfoEnum.SwapInfo.ErrLockCar);
|
|
|
|
|
}, false, () => { machine.ExceptionReason = ExceptionReason.LockCarError; }
|
|
|
|
|
, 10, InvokeStatus.None);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public InvokeStatus ExistRadar(SwappingStateMachine machine)
|
|
|
|
|
{
|
|
|
|
|
return Invoker.Invoke("wait exist radar", 1000, 5, machine.IsCanceled, machine.IsManualSwapSucc,
|
|
|
|
|
() => machine.RadarOutFlag, () =>
|
|
|
|
|
{
|
|
|
|
|
if (PlcApi.ExitRadar())
|
|
|
|
|
{
|
|
|
|
|
_log.Info("exist radar false");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
machine.ExceptionReason = ExceptionReason.None;
|
|
|
|
|
_log.Info("exist radar true");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (PlcApi.WriteExistLamp(1020))
|
|
|
|
|
{
|
|
|
|
|
//出口写红灯
|
|
|
|
|
//更新车辆离场时间,上报云平台
|
|
|
|
|
machine.BusinessSwappingForCloudState =
|
|
|
|
|
InfoEnum.BusinessSwappingForCloudState.SwapDoneWithoutVel;
|
|
|
|
|
machine.SwapOrder!.VehicleLeaveTime = DateTime.Now;
|
|
|
|
|
_CommonMgr.UpdateSwapOrder(machine);
|
|
|
|
|
|
|
|
|
|
machine.RadarOutFlag = true;
|
|
|
|
|
|
|
|
|
|
_CommonMgr.InsertStep(
|
|
|
|
|
machine.SwapStatus == (int)InfoEnum.SwapOrderResult.Success
|
|
|
|
|
? InfoEnum.BusinessSwappingStep.RadarOutFlag
|
|
|
|
|
: InfoEnum.BusinessSwappingStep.RadarOutFailFlag,
|
|
|
|
|
machine);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, () =>
|
|
|
|
|
{
|
|
|
|
|
SoundApi.PlayOneSound(machine.SwapStatus == (int)InfoEnum.SwapOrderResult.Success
|
|
|
|
|
? (int)InfoEnum.SwapInfo.InfoCarLeave
|
|
|
|
|
: (int)InfoEnum.SwapInfo.ErrInfoCarLeave);
|
|
|
|
|
}, false, () => { }, 10, InvokeStatus.None);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
///收到货箱放下
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public InvokeStatus TBoxDown(SwappingStateMachine machine)
|
|
|
|
|
{
|
|
|
|
|
return Invoker.Invoke("TBoxDown", 500, 5, machine.IsCanceled,
|
|
|
|
|
() => machine.TboxDownFlag, () =>
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var carInfo = TBoxApi.GetCarInfo(machine.RfidReadModel.VelVin);
|
|
|
|
|
|
|
|
|
|
var tboxCarInfoModel = carInfo.Result;
|
|
|
|
|
|
|
|
|
|
//换电就绪
|
|
|
|
|
if (tboxCarInfoModel?.CarStatus?.CargoBoxStatus == 1 )
|
|
|
|
|
{
|
|
|
|
|
//设置出口的是绿灯
|
|
|
|
|
if (PlcApi.WriteExistLamp(1000))
|
|
|
|
|
{
|
|
|
|
|
machine.TboxDownFlag = true;
|
|
|
|
|
/*machine.LedTool?.WriteProgramContent(
|
|
|
|
|
machine.SwapStatus == (int)InfoEnum.SwapOrderResult.Success
|
|
|
|
|
? InfoEnum.SwapInfo.InfoCarLeave.GetLed()
|
|
|
|
|
: InfoEnum.SwapInfo.ErrInfoCarLeave.GetLed());*/
|
|
|
|
|
SoundApi.PlayOneSound(machine.SwapStatus == (int)InfoEnum.SwapOrderResult.Success
|
|
|
|
|
? (int)InfoEnum.SwapInfo.InfoCarLeave
|
|
|
|
|
: (int)InfoEnum.SwapInfo.ErrInfoCarLeave);
|
|
|
|
|
machine.BoxCarInfoModel = tboxCarInfoModel;
|
|
|
|
|
|
|
|
|
|
//断连Tbox
|
|
|
|
|
if (StaticStationInfo.TboxStateDisConnect)
|
|
|
|
|
{
|
|
|
|
|
TBoxApi.DisConnect(machine.BoxCarInfoModel.CarNo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}, () =>
|
|
|
|
|
{
|
|
|
|
|
// machine.LedTool?.WriteProgramContent(InfoEnum.SwapInfo.ErrUnLockCar.GetLed());
|
|
|
|
|
SoundApi.PlayOneSound((int)InfoEnum.SwapInfo.InfoTboxDown);
|
|
|
|
|
}, false, () => { }
|
|
|
|
|
, 10, InvokeStatus.None);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
///收到上电成功
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public InvokeStatus TBoxEnergyUp(SwappingStateMachine machine)
|
|
|
|
|
{
|
|
|
|
|
return Invoker.Invoke("TBoxEnergyUp", 500, 5, machine.IsCanceled,
|
|
|
|
|
() => machine.TboxEnergyUpFlag, () =>
|
|
|
|
|
{
|
|
|
|
|
var carInfo = TBoxApi.GetCarInfo(machine.RfidReadModel.VelVin);
|
|
|
|
|
|
|
|
|
|
var tboxCarInfoModel = carInfo.Result;
|
|
|
|
|
//高压上电
|
|
|
|
|
if (tboxCarInfoModel?.CarStatus?.PowerStatus == 1)
|
|
|
|
|
{
|
|
|
|
|
//查询车辆锁止状态
|
|
|
|
|
machine.TboxEnergyUpFlag = true;
|
|
|
|
|
// _CommonMgr.InsertStep(InfoEnum.BusinessSwappingStep.TBoxSwapReadyFlag,
|
|
|
|
|
// machine);
|
|
|
|
|
machine.BoxCarInfoModel = tboxCarInfoModel;
|
|
|
|
|
}
|
|
|
|
|
}, () =>
|
|
|
|
|
{
|
|
|
|
|
// machine.LedTool?.WriteProgramContent(InfoEnum.SwapInfo.ErrUnLockCar.GetLed());
|
|
|
|
|
SoundApi.PlayOneSound((int)InfoEnum.SwapInfo.InfoTboxEnergyUp);
|
|
|
|
|
}, false, () => { }
|
|
|
|
|
, 5, InvokeStatus.None);
|
|
|
|
|
}
|
|
|
|
|
}
|