AssignMethod2.java
8.4 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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package com.neotel.webbox.capacity.method;
import com.neotel.webbox.capacity.bean.BoxData;
import com.neotel.webbox.capacity.bean.BoxResult;
import com.neotel.webbox.capacity.bean.ReelData;
import com.neotel.webbox.capacity.bean.RequestItem;
import com.neotel.webbox.capacity.box.Box;
import com.neotel.webbox.capacity.box.Column;
import com.neotel.webbox.capacity.box.SlotUnit;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
@Slf4j
public class AssignMethod2 extends BasicMethod{
public static BoxResult assignToBox(BoxData boxData, List<RequestItem> requestList){
//从厚到薄排充,先放厚的,再放薄的
requestList.sort(new Comparator<RequestItem>() {
@Override
public int compare(RequestItem o1, RequestItem o2) {
int reelHeightDiff = o2.getReelData().getReelHeight() - o1.getReelData().getReelHeight();
if(reelHeightDiff == 0){
return o2.getReelData().getReelSize() - o1.getReelData().getReelSize();
}
return reelHeightDiff;
}
});
for (RequestItem requestItem : requestList) {
ReelData rd = requestItem.getReelData();
//纯放此料盘料仓容量
int pureBoxCapacity = boxData.getBoxPureSizeCapacity(requestItem.getReelData());
int pureBoxCount = requestItem.getNum()/pureBoxCapacity;
int remainNum = requestItem.getNum() % pureBoxCapacity;
requestItem.setPureBoxCount(pureBoxCount);
requestItem.setRemainNum(remainNum);
log.info("料盘["+rd.getReelSizeStr()+"]总需求:"+requestItem.getNum()+"需要纯料仓"+ pureBoxCount+"个,每个料仓可放:"+pureBoxCapacity+"盘,剩余:"+ remainNum+"盘需要放到混合仓");
}
List<Box> mixBoxList = new ArrayList<>();
Box mixBox = null;
//填充料盘(需求数量最多的)
RequestItem fillRequestItem = null;
for (RequestItem requestItem : requestList) {
ReelData rd = requestItem.getReelData();
if(fillRequestItem == null || requestItem.getNum() > fillRequestItem.getNum()){
fillRequestItem = requestItem;
}
while (requestItem.getRemainNum() > 0){
if(!isBoxCanPutIn(mixBox,rd)){
log.info("开启一个混合仓,开始放"+ rd.getReelSizeStr()+"的料盘");
int pressHeight = rd.getPressHeight();
mixBox = Box.newBox(boxData,pressHeight);
int columnValidHeight = boxData.getColumnValidHeight(pressHeight);
//标准列
Column column = new Column(columnValidHeight);
mixBox.setColumn(column);
mixBox.setColumnCount(boxData.getColumnCount());
mixBoxList.add(mixBox);
}
requestItem = assignToMixBox(requestItem,mixBox);
}
}
int fillCount = 0;
for (Box box : mixBoxList) {
fillCount = fillToColumn(box.getColumn(),-1,fillRequestItem.getReelData());
if(fillCount > 0){
log.info("填充"+fillCount+"个"+ fillRequestItem.getReelSizeStr()+"料盘到标准列,标准列空闲高度为:" + box.getColumn().getRemainHeight());
}else{
log.info("标准列空闲高度为: " + box.getColumn().getRemainHeight()+" ");
}
fillCount = fillToColumn(box.getDoorUp(),-1,fillRequestItem.getReelData());
if(fillCount > 0){
log.info("填充"+fillCount+"个"+ fillRequestItem.getReelSizeStr()+"料盘到门口上方列,其空闲高度为:" + box.getDoorUp().getRemainHeight());
}else{
log.info("门口上方列空闲高度为:" + box.getDoorUp().getRemainHeight()+" ");
}
fillCount = fillToColumn(box.getDoorDown(),-1,fillRequestItem.getReelData());
if(fillCount > 0){
log.info("填充"+fillCount+"个"+ fillRequestItem.getReelSizeStr()+"料盘到门口下方列,其空闲高度为:" + box.getDoorDown().getRemainHeight());
}else{
log.info("门口下方列空闲高度为:" + box.getDoorDown().getRemainHeight()+" ");
}
}
return getBoxResult(requestList,boxData,mixBoxList);
}
private static boolean isBoxCanPutIn(Box mixBox, ReelData rd){
if(mixBox == null){
return false;
}
if(mixBox.getColumn().getRemainHeight() > rd.getReelSlotHeight()){
return true;
}
if(mixBox.getColumn().getRemainHeight() > rd.getReelSlotHeight()){
return true;
}
if(mixBox.getColumn().getRemainHeight() > rd.getReelSlotHeight()){
return true;
}
return false;
}
private static RequestItem assignToMixBox(RequestItem requestItem, Box mixBox){
int totalRemainNum = requestItem.getRemainNum();
int totalColumn = mixBox.getColumnCount();
int countPerColumn = totalRemainNum/totalColumn;
if(requestItem.getReelData().is7Reel()){
//7寸盘会填充,这里不需要填充
countPerColumn = countPerColumn /2 * 2;
}
int assignReelCount = 0;
SlotUnit slotUnit = getValidSlotUnit(countPerColumn, requestItem.getReelData(),mixBox.getColumn().getRemainHeight());
slotUnit = mixBox.getColumn().addSlotUnit(slotUnit);
//为null表示一个没填充进去, 不为null可能只填充了一部分
if(slotUnit != null){
assignReelCount = slotUnit.getReelCount() * totalColumn;
log.info("添加"+assignReelCount+"个"+ requestItem.getReelSizeStr()+"料盘到标准列,每列"+ slotUnit.getReelCount()+"个料盘");
}
//没有安排的料盘,安排到料口的上下两部分
int notArrangedNum = totalRemainNum - assignReelCount;
Column doorDown = mixBox.getDoorDown();
SlotUnit doorDownAddUnit = getValidSlotUnit(notArrangedNum, requestItem.getReelData(), doorDown.getRemainHeight());
doorDownAddUnit = doorDown.addSlotUnit(doorDownAddUnit);
if(doorDownAddUnit != null){
log.info("添加"+doorDownAddUnit.getReelCount()+"个"+ requestItem.getReelSizeStr()+"料盘到门口下方列");
notArrangedNum = notArrangedNum - doorDownAddUnit.getReelCount();
}
Column doorUp = mixBox.getDoorUp();
SlotUnit doorUpAddUnit = getValidSlotUnit(notArrangedNum, requestItem.getReelData(), doorUp.getRemainHeight());
doorUpAddUnit = doorUp.addSlotUnit(doorUpAddUnit);
if(doorUpAddUnit != null){
log.info("添加"+doorUpAddUnit.getReelCount()+"个"+ requestItem.getReelSizeStr()+"料盘到门口上方列");
notArrangedNum = notArrangedNum - doorUpAddUnit.getReelCount();
}
requestItem.setRemainNum(notArrangedNum);
if(notArrangedNum > 0){
//还有未安排的料盘,如果标准列有位置就添加进去,如果没有那就是放不下了
log.warn(""+notArrangedNum+"个"+ requestItem.getReelSizeStr()+"无处安放");
}
int remainNum = notArrangedNum;
int addCount = fillToColumn(mixBox.getColumn(),remainNum,requestItem.getReelData());
if(addCount > 0){
remainNum = remainNum - addCount;
requestItem.setRemainNum(remainNum);
log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到标准列,无处安放料盘数为:" + remainNum);
}
if(remainNum > 0){
addCount = fillToColumn(mixBox.getDoorUp(),remainNum,requestItem.getReelData());
if(addCount > 0){
remainNum = remainNum - addCount;
requestItem.setRemainNum(remainNum);
log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到门口上方列,无处安放料盘数为:" + remainNum);
}
addCount = fillToColumn(mixBox.getDoorDown(),remainNum,requestItem.getReelData());
if(addCount > 0){
remainNum = remainNum - addCount;
requestItem.setRemainNum(remainNum);
log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到门口下方列,无处安放料盘数为:" + remainNum);
}
}
requestItem.setRemainNum(remainNum);
return requestItem;
}
}