PutBoxToShelfTask.cs
5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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;
}
}
}
}