PutBoxToLineTask.cs 7.7 KB
using Mushiny;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OnlineStore.Common;
using AGVLib;
using CtuDeviceLib;
using TaskStatus = CtuDeviceLib.TaskStatus;
namespace DeviceLibrary.CtuService
{
    /// <summary>
    /// 手动线放满箱-v1
    /// </summary>
    public class PutBoxToLineTask : PutBoxBase
    {
        public PutBoxToLineTask(CTU ctu, string dst, string boxCode) : base(ctu, dst, boxCode)
        {
            Name = "出库线体放箱";
        }

        public override void Excute()
        {
            //当前位置不是目的地,就重新规划路线
            if (MoveInfo.MoveStep != RunStep.Wait && MoveInfo.MoveStep != RunStep.Outstore_PutBoxToLine_01_MoveToDst)
            {
                if (ctu.CurLandMark != destination)
                {
                    MoveInfo.NextMoveStep(RunStep.Wait);
                    MoveInfo.Info($"当前点位不在目标点【{DstName}】【{destination}】,重新进入出库线体放箱流程");
                }
            }
            switch (MoveInfo.MoveStep)
            {
                case RunStep.Wait:
                    if (targetIsCurPos)
                    {
                        MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_02_AtDst);
                        MoveInfo.Info($"已在【{DstName}】【{destination}】");
                        return;
                    }
                    if (!CalcDst())
                    {
                        Msg.add($"规划去【{DstName}】失败,请检查", MsgLevel.warning);
                        return;
                    }

                    MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_01_MoveToDst);
                    MoveInfo.Info($"去【{DstName}】【{destination}】");

                    break;
                case RunStep.Outstore_PutBoxToLine_01_MoveToDst:
                    if (IsFinished)
                    {
                        MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_02_AtDst);
                        MoveInfo.Info($"到达【{DstName}】【{destination}】");
                    }
                    else
                    {
                        Move();
                    }
                    break;
                case RunStep.Outstore_PutBoxToLine_02_AtDst:
                    MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_03_RequestEnter);
                    RequestEnter();
                    MoveInfo.Info($"向【{DstName}】请求放料箱【{boxCode}】");
                    break;
                case RunStep.Outstore_PutBoxToLine_03_RequestEnter:
                    if (MayEnter())
                    {
                        MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_04_PutContainer);
                        BasketToShelfOrEquip();
                        MoveInfo.Info($"放料箱【{boxCode}】");
                    }
                    else if (MoveInfo.IsTimeOut(RequestTimeOut))
                    {
                        MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_03_RequestEnter);
                        RequestEnter();
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
                        MoveInfo.Info($"向【{DstName}】请求放料箱【{boxCode}】");
                    }

                    break;

                case RunStep.Outstore_PutBoxToLine_04_PutContainer:
                    if (IsFinished)
                    {
                        MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_05_CheckFinishEnter);
                        MoveInfo.Info($"料箱【{boxCode}】放入【{DstName}】完成");
                    }
                    break;

                case RunStep.Outstore_PutBoxToLine_05_CheckFinishEnter:
                    var rtn = UpdateLocInfo(TaskStatus.FINISHED, SmfTaskType.OutStore);
                    if (!rtn)
                    {
                        MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_06_FinishEnterRtnComplete);
                        MoveInfo.LastSetpTime = DateTime.Now;
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                        string errmsg = $"上报【{boxCode}】状态为【{TaskStatus.FINISHED}】失败";
                        MoveInfo.Error(errmsg);
                        Msg.add(errmsg, MsgLevel.warning);
                        return;
                    }
                    MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_06_FinishEnterRtnComplete);
                    MoveInfo.Info($"上报【{boxCode}】放入【{DstName}】状态为【{TaskStatus.FINISHED}】");
                    break;

                case RunStep.Outstore_PutBoxToLine_06_FinishEnterRtnComplete:
                    if (!Complete())
                    {
                        MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_06_FinishEnterRtnComplete);
                        MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
                        MoveInfo.LastSetpTime = DateTime.Now;
                        string errmsg = $"上报【{boxCode}】放入【{DstName}】完成失败";
                        MoveInfo.Error(errmsg);
                        Msg.add(errmsg, MsgLevel.warning);
                        return;
                    }
                    MoveInfo.NextMoveStep(RunStep.Outstore_PutBoxToLine_07_UpdateContainerLoc);
                    UpdateBoxLoc(DstName);
                    MoveInfo.Info($"上报【{boxCode}】放入【{DstName}】完成");
                    break;

                case RunStep.Outstore_PutBoxToLine_07_UpdateContainerLoc:
                    MoveInfo.NextMoveStep(RunStep.CtuTask_ProcessFinished);
                    break;

                case RunStep.CtuTask_ProcessFinished:
                    var curbasket = ctu.GetFullBaskets()?.Find(s => Setting_Init.rawLine_in.Equals(s.DstName));
                    if (curbasket == null)
                    {
                        var otherCtuHasTakeLineTask = CTUManager.GetOhterEnabledCTUs(ctu)?.Find(s => s.CtuTask != null && (s.CtuTask is TakeBoxFromLineTask));
                        if (otherCtuHasTakeLineTask != null)
                        {
                            MoveInfo.Info($"无剩余可放料箱,有车去取料箱,回待机点");
                            ctu.CtuTask = new StandbyTask(ctu);
                        }
                        else //无车去取料箱
                        {
                            if (TaskManager.HasInstoreBoxReady(out RobotTask task))
                            {
                                ctu.CtuTask = new TakeBoxFromLineTask(ctu);
                                ctu.CtuTask.CurTask = task;
                                MoveInfo.Info($"无剩余可放料箱,去线体取料箱:{JsonHelper.SerializeObject(task)}");
                            }
                            else if(TaskManager.HasInstoreTask(out task))
                            {
                                ctu.CtuTask = new TakeBoxFromLineTask(ctu);
                                MoveInfo.Info($"无剩余可放料箱,有入库任务");
                            }
                            else
                            {
                                MoveInfo.Info($"无剩余可放料箱,有车去取料箱,回待机点");
                                ctu.CtuTask = new StandbyTask(ctu);
                            }
                        }

                        return;
                    }
                    ctu.CtuTask = new PutBoxToLineTask(ctu, Setting_Init.rawLine_in, curbasket.BoxCode);
                    MoveInfo.Info($"背篓【{curbasket.Row}】还有可放料箱【{curbasket.BoxCode}】,继续放料箱");
                    break;
            }

        }
    }
}