TakeBoxFromShelfTask.cs 3.3 KB
using CtuDeviceLib;
using Mushiny;

namespace DeviceLibrary.CtuService.CtuTask.Common
{
    public class TakeBoxFromShelfTask : TakeBoxBase
    {
        public TakeBoxFromShelfTask(CTU ctu, RobotTask robotTask) : base(ctu, robotTask)
        {
            Name = "去货架取料箱";
        }

        public override void Excute()
        {
            //当前位置不是目的地,就重新规划路线
            if (MoveInfo.MoveStep != RunStep.Wait && MoveInfo.MoveStep != RunStep.Outstore_TakeBoxFromShelf_01_MoveToDst)
            {
                if (ctu.CurLandMark != destination)
                {
                    MoveInfo.NextMoveStep(RunStep.Wait);
                    MoveInfo.Info($"当前不在目标点【{DstName}】【{destination}】,重新进入出库流程");
                }
            }
            switch (MoveInfo.MoveStep)
            {
                case RunStep.Wait:
                    if (!CalcDst())
                    {
                        Msg.add($"规划去【{DstName}】失败,请检查", MsgLevel.warning);
                        return;
                    }
                    UpdateLocInfo(TaskStatus.EXECUTING, SmfTaskType.OutStore);
                    MoveInfo.NextMoveStep(RunStep.Outstore_TakeBoxFromShelf_01_MoveToDst);
                    MoveInfo.Info($"去【{DstName}】【{destination}】");
                    break;
                case RunStep.Outstore_TakeBoxFromShelf_01_MoveToDst:
                    if (IsFinished)
                    {
                        MoveInfo.NextMoveStep(RunStep.Outstore_TakeBoxFromShelf_02_AtDst);
                        MoveInfo.Info($"到达【{DstName}】【{destination}】");
                    }
                    else
                    {
                        Move();
                    }
                    break;
                case RunStep.Outstore_TakeBoxFromShelf_02_AtDst:
                    MoveInfo.NextMoveStep(RunStep.Outstore_TakeBoxFromShelf_03_TakeBox);
                    ShelfOrEquipToBasket();
                    MoveInfo.Info($"取料箱【{boxCode}】");
                    break;
                case RunStep.Outstore_TakeBoxFromShelf_03_TakeBox:
                    if (IsFinished)
                    {
                        var rtn = SMFManager.boxOutFromShelf(boxCode);
                        if (!rtn)
                        {
                            MoveInfo.Error($"上报从货架【{DstName}】取料箱【{boxCode}】失败");
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                            return;
                        }
                        MoveInfo.NextMoveStep(RunStep.Outstore_TakeBoxFromShelf_04_UpdateBoxLoc);
                        MoveInfo.Info($"料箱【{boxCode}】放入背篓完成");
                        UpdateLocInfo(TaskStatus.OUT_ON_AGV, SmfTaskType.OutStore);
                        UpdateBoxLoc(GenCtuLoc());
                        MoveInfo.Info($"上报已从【{DstName}】取料箱【{boxCode}】完成");
                    }
                    break;
                case RunStep.Outstore_TakeBoxFromShelf_04_UpdateBoxLoc:
                    MoveInfo.NextMoveStep(RunStep.CtuTask_ProcessFinished);

                    break;
                case RunStep.CtuTask_ProcessFinished:
                    break;
            }
        }
    }
}