TakeBoxFromShelfTask.cs 4.7 KB
using CtuDeviceLib;
using Mushiny;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DeviceLibrary.CtuService
{
    /// <summary>
    /// 从货架取满箱任务-OK
    /// </summary>
    public class TakeBoxFromShelfTask : TakeBoxBase
    {
        public TakeBoxFromShelfTask(CTU ctu, RobotTask robotTask) : base(ctu, robotTask)
        {
            Name = "出库货架取箱";
        }
        private void FindNextTaskAfterTakeFullBoxFromShelf()
        {
            //先看背篓是否有空箱子入库
            var task = OutTaskHelper.GetPutEmptyBoxToCurShelf(ctu);
            if (task != null)
            {
                ctu.CtuTask = task;
                return;
            }
            //先找最近的取满箱任务或空箱上架
            task = OutTaskHelper.GetNearestTakeBoxFromShelfOrPutBoxToShelfTask(ctu, out string resultMsg);
            if (task != null)
            {
                ctu.CtuTask = task;
            }
            else
            {
                var basketToPutOnLine = ctu.GetFullBaskets()?.Find(s => Setting_Init.rawLine_in.Equals(s.DstName));
                if (basketToPutOnLine != null)
                {
                    ctu.CtuTask = new PutBoxToLineTask(ctu, Setting_Init.rawLine_in, basketToPutOnLine.BoxCode);
                    return;
                }
                //出库任务在死胡同中,回待机位放满箱
                var standByForOutTask = new StandbyTask(ctu);
                ctu.CtuTask = standByForOutTask;

            }
        }
        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:
                    FindNextTaskAfterTakeFullBoxFromShelf();
                    break;
            }
        }
    }
}