AssignMethod1.java
10.5 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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
package com.neotel.webbox.capacity.method;
import com.neotel.webbox.capacity.bean.*;
import com.neotel.webbox.capacity.box.Box;
import com.neotel.webbox.capacity.box.Column;
import com.neotel.webbox.capacity.box.SlotUnit;
import com.neotel.webbox.capacity.method.BasicMethod;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* 平均分配到每台料仓
*/
@Slf4j
public class AssignMethod1 extends BasicMethod {
public static BoxResult averageAssignToBox(BoxData boxData, List<RequestItem> requestList){
//最大的压紧张开高度
int maxPressHeight = 0;
int totalRemainNeedHeight = 0;
//是否只有一种料需求
boolean onlyOneRequest = requestList.size() == 1;
for (RequestItem requestItem : requestList) {
ReelData rd = requestItem.getReelData();
//纯放此料盘料仓容量
int pureBoxCapacity = boxData.getBoxPureSizeCapacity(requestItem.getReelData());
int pureBoxCount = requestItem.getNum()/pureBoxCapacity;
int remainNum = requestItem.getNum() % pureBoxCapacity;
if(onlyOneRequest){
log.info("只有一种规格物料,使用纯料仓");
if(remainNum > 0){
remainNum = 0;
pureBoxCount = pureBoxCount + 1;
}
}else{
Float rate = 1.0f * requestItem.getNum()/pureBoxCapacity;
int boxCount = rate.intValue();
if(rate - boxCount > 0.5){
boxCount = boxCount + 1;
}
pureBoxCount = boxCount;
remainNum = requestItem.getNum() - pureBoxCount * pureBoxCapacity;
}
requestItem.setPureBoxCount(pureBoxCount);
requestItem.setRemainNum(remainNum);
log.info("料盘["+rd.getReelSizeStr()+"]总需求:"+requestItem.getNum()+"需要纯料仓"+ pureBoxCount+"个,每个料仓可放:"+pureBoxCapacity+"盘,剩余:"+ remainNum+"盘需要放到混合仓");
totalRemainNeedHeight = totalRemainNeedHeight + requestItem.getRemainNeedHeight();
if(rd.getPressHeight() > maxPressHeight){
maxPressHeight = rd.getPressHeight();
}
}
List<Box> mixBoxList = new ArrayList<>();
if(!onlyOneRequest){
/*int mixBoxTotalValidHeight = boxData.getTotalValidHeight(maxPressHeight);
//估算混合仓数量
Float estimateMixBoxCount = 1.0f * totalRemainNeedHeight / mixBoxTotalValidHeight;
int mixBoxCount = estimateMixBoxCount.intValue();
if(estimateMixBoxCount - mixBoxCount > 0){
mixBoxCount = mixBoxCount + 1;
}
log.info("剩余物料需要 " + mixBoxCount +" 个混合仓");
for(int i = 1; i<= mixBoxCount; i++){
mixBoxList.add(Box.newBox(boxData,maxPressHeight));
}*/
//从需求大到小排序,优先满足大需求
requestList.sort(new Comparator<RequestItem>() {
@Override
public int compare(RequestItem o1, RequestItem o2) {
return o1.getNum() - o2.getNum();
}
});
Box mixBox = Box.newBox(boxData, maxPressHeight);
//先每列均分,如果有剩余,安排到料仓口的上下位置
for (RequestItem requestItem : requestList) {
while (true) {
requestItem = fillMixBox(requestItem, mixBox);
if (requestItem.getRemainNum() > 0) {
//还有未安排的料盘,如果标准列有位置就添加进去,如果没有那就是放不下了
log.warn("" + requestItem.getRemainNum() + "个" + requestItem.getReelSizeStr() + "无处安放,新增一个混合仓");
mixBoxList.add(mixBox);
mixBox = Box.newBox(boxData, maxPressHeight);
//requestItem = fillMixBox(requestItem, column, mixBox);
} else {
break;
}
}
}
mixBoxList.add(mixBox);
log.info("需要混合仓的数量为:"+mixBoxList.size());
for (Box box : mixBoxList) {
// //填充料盘(需求数量最多的)
// RequestItem fillRequestItem = null;
// //用剩余的空间去放还未满足的料盘
// for (RequestItem requestItem : requestList) {
// if(fillRequestItem == null || requestItem.getNum() > fillRequestItem.getNum()){
// fillRequestItem = requestItem;
// }
// int remainNum = requestItem.getRemainNum();
// int addCount = fillToColumn(column,remainNum,requestItem.getReelData());
// if(addCount > 0){
// remainNum = remainNum - addCount;
// requestItem.setRemainNum(remainNum);
// log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到标准列,无处安放料盘数为:" + remainNum);
// }
// if(remainNum > 0){
// for (Box box : mixBoxList) {
// addCount = fillToColumn(box.getDoorUp(),remainNum,requestItem.getReelData());
// if(addCount > 0){
// remainNum = remainNum - addCount;
// requestItem.setRemainNum(remainNum);
// log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到门口上方列,无处安放料盘数为:" + remainNum);
// }
// addCount = fillToColumn(box.getDoorDown(),remainNum,requestItem.getReelData());
// if(addCount > 0){
// remainNum = remainNum - addCount;
// requestItem.setRemainNum(remainNum);
// log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到门口下方列,无处安放料盘数为:" + remainNum);
// }
// }
//
// }
// }
//进行填充
// int fillCount = fillToColumn(column,-1,fillRequestItem.getReelData());
// if(fillCount > 0){
// log.info("填充"+fillCount+"个"+ fillRequestItem.getReelSizeStr()+"料盘到标准列,标准列空闲高度为:" + column.getRemainHeight());
// }else{
// log.info("标准列空闲高度为: " + column.getRemainHeight()+" ");
// }
// for (Box box : mixBoxList) {
// 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()+" ");
// }
// }
// for (Box box : mixBoxList) {
// box.setColumn(column);
// box.setColumnCount(boxData.getColumnCount());
// }
}
}
return getBoxResult(requestList,boxData,mixBoxList);
}
private static RequestItem fillMixBox(RequestItem requestItem, Box mixBox){
int totalRemainNum = requestItem.getRemainNum();
int totalColumn = mixBox.getColumnCount();
//int countPerColumn = totalRemainNum/totalColumn;
int assignReelCount = 0;
/*if(requestItem.getReelData().is7Reel()){
//7寸盘会填充,这里不需要填充
countPerColumn = countPerColumn /2 * 2;
}*/
//没有安排的料盘,安排到料口的上下两部分
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();
}
if (notArrangedNum > 0) {
int countPerColumn = notArrangedNum / totalColumn;
if (notArrangedNum % totalColumn != 0){
countPerColumn = countPerColumn + 1;
}
if (requestItem.getReelData().is7Reel()) {
//7寸盘会填充,这里不需要填充
countPerColumn = countPerColumn / 2 * 2;
}
Column column = mixBox.getColumn();
SlotUnit slotUnit = getFixValidSlotUnit(countPerColumn, requestItem.getReelData(), column.getRemainHeight());
slotUnit = column.addSlotUnit(slotUnit);
//为null表示一个没填充进去, 不为null可能只填充了一部分
if (slotUnit != null) {
assignReelCount = slotUnit.getReelCount() * totalColumn;
notArrangedNum = notArrangedNum - assignReelCount;
log.info("添加" + assignReelCount + "个" + requestItem.getReelSizeStr() + "料盘到标准列,每列" + slotUnit.getReelCount() + "个料盘");
}
}
requestItem.setRemainNum(notArrangedNum);
return requestItem;
}
}