PutBoxToShelfTask.cs 5.1 KB
using CtuDeviceLib;
using Mushiny;

namespace DeviceLibrary.CtuService
{
    /// <summary>
    /// 空箱入库-v1
    /// </summary>
    public class PutBoxToShelfTask : PutBoxBase
    {
        public PutBoxToShelfTask(CTU ctu, string dstName, string boxCode) : base(ctu, dstName, boxCode)
        {
            Name = "入库货架放箱";
        }
        private void FindNextTaskAfterPutBoxToShelf()
        {
            //先找最近的空箱上架或取满箱任务
            var task = OutTaskHelper.GetNearestTakeBoxFromShelfOrPutBoxToShelfTask(ctu, out string resultMsg);
            if (task != null)
            {
                ctu.CtuTask = task;
                return;
            }
            else
            {
                if (ctu.AllBasketIsEmpty())
                {
                    //背篓全部空了,看看有没有入库可取
                    task = OutTaskHelper.GetTakeBoxFromLineTask(ctu);
                    if (task != null)
                    {
                        ctu.CtuTask = task;
                        return;
                    }

                    ctu.CtuTask = new StandbyTask(ctu);
                }
            }
        }

        public override void Excute()
        {
            //当前位置不是目的地,就重新规划路线
            if (MoveInfo.MoveStep != RunStep.Wait && MoveInfo.MoveStep != RunStep.Instore_PutBoxToShelf_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;
                    }
                    MoveInfo.NextMoveStep(RunStep.Instore_PutBoxToShelf_01_MoveToDst);
                    MoveInfo.Info($"去【{DstName}】【{destination}】");
                    break;
                case RunStep.Instore_PutBoxToShelf_01_MoveToDst:
                    if (IsFinished)
                    {
                        MoveInfo.NextMoveStep(RunStep.Instore_PutBoxToShelf_02_AtDst);
                        MoveInfo.Info($"到达【{DstName}】【{destination}】");
                    }
                    else
                    {
                        Move();
                    }
                    break;
                case RunStep.Instore_PutBoxToShelf_02_AtDst:
                    MoveInfo.NextMoveStep(RunStep.Instore_PutBoxToShelf_03_PutBox);
                    BasketToShelfOrEquip();
                    MoveInfo.Info($"放料箱【{boxCode}】");
                    break;

                case RunStep.Instore_PutBoxToShelf_03_PutBox:
                    if (IsFinished)
                    {
                        var rtn1 = SMFManager.boxIntoShelf(boxCode, DstName, out string errmsg);
                        if (!rtn1)
                        {
                            MoveInfo.Error($"上报将料箱【{boxCode}】放入货架【{DstName}】失败:{errmsg}");
                            MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                            return;
                        }

                        MoveInfo.NextMoveStep(RunStep.Instore_PutBoxToShelf_03_1_PutBox);
                    }
                    break;

                case RunStep.Instore_PutBoxToShelf_03_1_PutBox:
                    RobotManager.unloadContainerFinish(new ESS.EssModel()
                    {
                        containerAttribute = System.DateTime.Now,
                        containerCode = boxCode,
                        slotCode = DstName
                    });
                    bool rtn = UpdateLocInfo(TaskStatus.FINISHED, SmfTaskType.Instore, true);
                    if (!rtn)
                    {
                        MoveInfo.NextMoveStep(RunStep.Instore_PutBoxToShelf_03_PutBox);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                        string errmsg1 = $"上报【{boxCode}】状态为【{TaskStatus.FINISHED}】失败";
                        MoveInfo.Error(errmsg1);
                        Msg.add(errmsg1, MsgLevel.warning);
                        return;
                    }
                    MoveInfo.NextMoveStep(RunStep.Instore_PutBoxToShelf_04_UpdateContainerLoc);
                    MoveInfo.Info($"上报【{boxCode}】放入【{DstName}】状态为【{TaskStatus.FINISHED}】");
                    break;
                case RunStep.Instore_PutBoxToShelf_04_UpdateContainerLoc:
                    MoveInfo.NextMoveStep(RunStep.CtuTask_ProcessFinished);
                    MoveInfo.Info($"空料箱已完成,在【{DstName}】寻找其他任务");

                    break;
                case RunStep.CtuTask_ProcessFinished:
                    FindNextTaskAfterPutBoxToShelf();
                    break;
            }
        }
    }
}