|
1
2
|
package com.huaheng.pc.shipment.shipmentContainerHeader.service;
|
|
3
4
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
5
|
import com.huaheng.common.constant.QuantityConstant;
|
|
6
7
8
|
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
|
|
9
|
import com.huaheng.framework.web.domain.RetCode;
|
|
10
11
|
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
|
|
12
13
14
15
|
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
|
|
16
|
import com.huaheng.pc.config.shipmentPreference.service.ShipmentPreferenceService;
|
|
17
18
19
20
21
22
23
24
25
|
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.shipment.shipmentContainerDetail.domain.ShipmentContainerDetail;
import com.huaheng.pc.shipment.shipmentContainerDetail.service.ShipmentContainerDetailService;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentCombinationModel;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
|
|
26
27
|
import com.huaheng.pc.shipment.shippingCombination.domain.ShippingSearch;
import com.huaheng.pc.shipment.shippingCombination.service.ShippingCombinationService;
|
|
28
29
|
import com.huaheng.pc.shipment.wave.domain.Wave;
import com.huaheng.pc.shipment.wave.service.WaveService;
|
|
30
31
|
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
|
|
32
|
import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
|
|
33
|
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
|
|
34
|
import com.huaheng.pc.task.taskHeader.service.ShipmentTaskService;
|
|
35
|
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
|
|
36
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
37
38
|
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
|
|
39
|
import java.math.BigDecimal;
|
|
40
|
import java.util.ArrayList;
|
|
41
|
import java.util.List;
|
|
42
43
|
import java.util.Map;
|
|
44
45
46
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.mapper.ShipmentContainerHeaderMapper;
|
|
47
48
|
import org.springframework.transaction.annotation.Transactional;
|
|
49
50
51
|
@Service
public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentContainerHeaderMapper, ShipmentContainerHeader> implements ShipmentContainerHeaderService{
|
|
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
@Autowired
private ShipmentDetailService shipmentDetailService;
@Autowired
private InventoryDetailService inventoryDetailService;
@Autowired
private LocationService locationService;
@Autowired
private ShipmentHeaderService shipmentHeaderService;
@Resource
private ShipmentContainerHeaderMapper shipmentContainerHeaderMapper;
@Autowired
private ShipmentContainerDetailService shipmentContainerDetailService;
@Autowired
private MaterialService materialService;
|
|
66
67
|
@Autowired
private ShippingCombinationService shippingCombinationService;
|
|
68
69
|
@Autowired
private TaskHeaderService taskHeaderService;
|
|
70
71
|
@Autowired
private TaskDetailService taskDetailService;
|
|
72
73
|
@Autowired
private WaveService waveService;
|
|
74
75
|
@Autowired
private ShipmentPreferenceService shipmentPreferenceService;
|
|
76
77
|
@Autowired
private ContainerService containerService;
|
|
78
79
|
@Resource
private ShipmentTaskService shipmentTaskService;
|
|
80
81
82
83
84
85
86
87
88
89
|
@Override
public Map<String, Integer> getShipmentContainerMaxAndMinStatusByShipmentID(int shipmentId) {
return shipmentContainerHeaderMapper.getShipmentContainerMaxAndMinStatusByShipmentID(shipmentId);
}
/**
|
|
90
91
92
93
94
95
96
97
|
* 1.检查基本属性
* 2.更改库存明细
* 3.更新单据明细的已出库数量
* 4.自动判定出库任务状态,根据库存数量减去预定库存相等就是整盘出--预计任务状态
* 5.增加出库组盘头
* 6.增加出库组盘明细
* 7.更新单据状态
*
|
|
98
99
100
101
102
103
|
* 出库组盘单条保存
* @param shipmentCombinationModel
* @return
*/
@Transactional
@Override
|
|
104
|
public ShipmentContainerHeader combination(ShipmentCombinationModel shipmentCombinationModel) {
|
|
105
|
|
|
106
|
//1.检查基本属性
|
|
107
108
|
//校验
if(shipmentCombinationModel.getShipQty().compareTo(new BigDecimal("0")) <= 0){
|
|
109
|
throw new ServiceException("出库数量必须大于0");
|
|
110
111
112
|
}
ShipmentDetail shipmentDetail = shipmentDetailService.getById(shipmentCombinationModel.getShipmentDetailId());
if(shipmentDetail==null){
|
|
113
|
throw new ServiceException("出库明细未找到");
|
|
114
115
116
|
}
InventoryDetail inventoryDetail = inventoryDetailService.getById((shipmentCombinationModel.getInventoryDetailId()));
if(inventoryDetail==null){
|
|
117
|
throw new ServiceException("库存未找到");
|
|
118
119
120
|
}
//校验数量是否超出
if((shipmentDetail.getShipQty().subtract(shipmentDetail.getRequestQty())).compareTo(shipmentCombinationModel.getShipQty())<0){
|
|
121
|
throw new ServiceException("录入数量超出明细待出数量");
|
|
122
123
124
|
}
//校验库存可用数量
if(inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty()).subtract(inventoryDetail.getLockedQty()).compareTo(shipmentCombinationModel.getShipQty())<0){
|
|
125
|
throw new ServiceException("录入数量超出可出数量");
|
|
126
127
|
}
if(!shipmentDetail.getMaterialCode().equals(inventoryDetail.getMaterialCode())){
|
|
128
|
throw new ServiceException("配盘物料不一致");
|
|
129
130
131
132
133
134
|
}
//库位
LambdaQueryWrapper<Location> lambdaQueryWrapper= Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(Location::getWarehouseCode,inventoryDetail.getWarehouseCode())
.eq(Location::getCode,inventoryDetail.getLocationCode());
Location location = locationService.getOne(lambdaQueryWrapper);
|
|
135
136
137
|
if (location == null) {
throw new ServiceException("库位 " + inventoryDetail.getLocationCode() + " 不存在");
}
|
|
138
|
|
|
139
|
//2.更新库存分配数
|
|
140
141
142
|
inventoryDetail.setTaskQty(inventoryDetail.getTaskQty().add(shipmentCombinationModel.getShipQty()));
inventoryDetailService.saveOrUpdate(inventoryDetail);
//获取库位,然后锁定
|
|
143
|
if("empty".equals(location.getStatus())) {
|
|
144
145
146
|
location.setStatus("lock");
locationService.saveOrUpdate(location);
}
|
|
147
|
//3.更新单据明细的已出库数量
|
|
148
149
150
|
shipmentDetail.setRequestQty(shipmentDetail.getRequestQty().add(shipmentCombinationModel.getShipQty()));
int i = shipmentDetail.getShipQty().compareTo(shipmentDetail.getRequestQty());
if(i > 0){
|
|
151
|
shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_WAVE);
|
|
152
|
}else if(i == 0){
|
|
153
|
shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_GROUPDISK);
|
|
154
155
156
157
158
159
160
161
|
}else if(i < 0){
throw new ServiceException("出库数量不能大于单据数量!");
}
shipmentDetailService.saveOrUpdate(shipmentDetail);
//自动判定出库任务状态,根据库存数量减去预定库存相等就是整盘出--预计任务状态
BigDecimal inventoryQty = inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty());
if(inventoryQty.compareTo(new BigDecimal(0)) <= 0) {
|
|
162
|
shipmentCombinationModel.setTaskType(QuantityConstant.TASK_TYPE_WHOLESHIPMENT);
|
|
163
|
} else {
|
|
164
|
shipmentCombinationModel.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
|
|
165
166
|
}
|
|
167
168
169
|
//5.增加出库组盘头
ShipmentContainerHeader shipmentContainerHeader = ShipmentContainerHeaderAdd(location, shipmentDetail);
//6.增加出库组盘明细
|
|
170
|
ShipmentContainerDetail shipmentContainerDetail = ShipmentContainerDetailAdd(shipmentDetail, shipmentContainerHeader, shipmentCombinationModel);
|
|
171
|
//7.更新单据状态
|
|
172
173
|
shipmentHeaderService.updateShipmentStatus(shipmentDetail.getShipmentId());
|
|
174
|
return shipmentContainerHeader;
|
|
175
176
177
|
}
/**
|
|
178
179
180
181
|
* 组盘头
* 1.查看是否有状态小于等于20的组盘头,有就需新建组盘头,没有就新建
* 2.没有符合条件的组盘头,新建组盘头
*
|
|
182
|
* @param location
|
|
183
|
* @param shipmentDetail
|
|
184
185
186
|
* @return
*/
private ShipmentContainerHeader ShipmentContainerHeaderAdd(Location location,
|
|
187
188
189
|
ShipmentDetail shipmentDetail) {
//1.查看是否有状态小于等于20的组盘头,有就需新建组盘头,没有就新建
|
|
190
|
LambdaQueryWrapper<ShipmentContainerHeader> lambdaQueryWrapper=Wrappers.lambdaQuery();
|
|
191
192
|
lambdaQueryWrapper.eq(ShipmentContainerHeader::getLocationCode,location.getCode())
.eq(ShipmentContainerHeader::getContainerCode,location.getContainerCode())
|
|
193
|
.eq(ShipmentContainerHeader::getWarehouseCode,ShiroUtils.getWarehouseCode())
|
|
194
|
.le(ShipmentContainerHeader::getStatus,QuantityConstant.SHIPMENT_CONTAINER_FINISHED);
|
|
195
196
|
ShipmentContainerHeader shipmentContainerHeader = this.getOne(lambdaQueryWrapper);
if(shipmentContainerHeader != null) {
|
|
197
|
return shipmentContainerHeader;
|
|
198
199
|
}
else {
|
|
200
201
202
203
204
205
206
207
208
|
// 2.没有符合条件的组盘头,新建组盘头
//找到容器类型
LambdaQueryWrapper<Container> containerLam=Wrappers.lambdaQuery();
containerLam.eq(Container::getCode,location.getContainerCode())
.eq(Container::getWarehouseCode,ShiroUtils.getWarehouseCode());
Container container = containerService.getOne(containerLam);
if(container == null){
throw new ServiceException("系统没有此容器编码");
}
|
|
209
210
|
shipmentContainerHeader = new ShipmentContainerHeader();
shipmentContainerHeader.setContainerCode(location.getContainerCode());
|
|
211
|
shipmentContainerHeader.setLocationCode(location.getCode());
|
|
212
213
|
shipmentContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
shipmentContainerHeader.setCompanyCode(shipmentDetail.getCompanyCode());
|
|
214
|
shipmentContainerHeader.setStationCode(shipmentDetail.getStationCode());
|
|
215
|
shipmentContainerHeader.setContainerType(container.getContainerType());
|
|
216
|
shipmentContainerHeader.setStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
|
|
217
|
shipmentContainerHeader.setTaskCreated(0);
|
|
218
|
shipmentContainerHeader.setCreatedBy(ShiroUtils.getLoginName());
|
|
219
220
221
222
|
Boolean flag = this.save(shipmentContainerHeader);
if(flag == false){
throw new ServiceException("新建组盘头失败,sql错误");
}
|
|
223
|
return shipmentContainerHeader;
|
|
224
225
226
227
|
}
}
/**
|
|
228
229
230
231
232
233
|
* 组盘明细
* 1.查看是否有同一出库明细的物料需要出库
* 2.有时修改阻盘明细的出库数量就行
* 3.没有就新建明细
* 4。查看组盘头状态,如果状态在10到20,则生成任务明细或修改任务明细的数量
*
|
|
234
235
236
237
238
239
240
241
|
* @param shipmentDetail
* @param shipmentContainerHeader
* @param shipmentCombinationModel
* @return
*/
private ShipmentContainerDetail ShipmentContainerDetailAdd(ShipmentDetail shipmentDetail,
ShipmentContainerHeader shipmentContainerHeader,
ShipmentCombinationModel shipmentCombinationModel) {
|
|
242
243
244
|
Boolean flag =true;
//1.查看是否有同一出库明细的物料需要出库
|
|
245
|
LambdaQueryWrapper<ShipmentContainerDetail> lambdaQueryWrapper=Wrappers.lambdaQuery();
|
|
246
247
248
249
250
251
|
lambdaQueryWrapper.eq(ShipmentContainerDetail::getShippingContainerId, shipmentContainerHeader.getId())
.eq(ShipmentContainerDetail::getLocationCode, shipmentContainerHeader.getLocationCode())
.eq(ShipmentContainerDetail::getContainerCode, shipmentContainerHeader.getContainerCode())
.eq(ShipmentContainerDetail::getShipmentDetailId, shipmentCombinationModel.getShipmentDetailId())
.eq(ShipmentContainerDetail::getInventoryId, shipmentCombinationModel.getInventoryDetailId())
.eq(ShipmentContainerDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
|
|
252
|
ShipmentContainerDetail shipmentContainerDetail = shipmentContainerDetailService.getOne(lambdaQueryWrapper);
|
|
253
254
255
|
ShipmentContainerDetail shipmentContainerDetaill = new ShipmentContainerDetail();
//2.有时修改阻盘明细的出库数量就行
|
|
256
257
|
if(shipmentContainerDetail != null) {
shipmentContainerDetail.setQty(shipmentContainerDetail.getQty().add(shipmentCombinationModel.getShipQty()));
|
|
258
259
260
261
|
flag=shipmentContainerDetailService.saveOrUpdate(shipmentContainerDetail);
if(flag == false){
throw new ServiceException("修改组盘明细失败,sql错误");
}
|
|
262
|
}
|
|
263
|
else {
|
|
264
|
|
|
265
|
//3.没有就新建明细
|
|
266
267
268
269
|
LambdaQueryWrapper<Material> lam=Wrappers.lambdaQuery();
lam.eq(Material::getCode,shipmentDetail.getMaterialCode())
.eq(Material::getWarehouseCode,ShiroUtils.getWarehouseCode());
Material material = materialService.getOne(lam);
|
|
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
|
if (material == null) {
throw new ServiceException("出库单(" + shipmentDetail.getShipmentCode() + ")的物料(" + shipmentDetail.getMaterialCode() + ")不存在!");
}
shipmentContainerDetaill.setWarehouseCode(shipmentContainerHeader.getWarehouseCode());
shipmentContainerDetaill.setCompanyCode(shipmentContainerHeader.getCompanyCode());
shipmentContainerDetaill.setContainerCode(shipmentContainerHeader.getContainerCode());
shipmentContainerDetaill.setLocationCode(shipmentContainerHeader.getLocationCode());
shipmentContainerDetaill.setInventoryId(shipmentCombinationModel.getInventoryDetailId());
shipmentContainerDetaill.setInventorySts(shipmentDetail.getInventorySts());
shipmentContainerDetaill.setShippingContainerId(shipmentContainerHeader.getId());
shipmentContainerDetaill.setShipmentCode(shipmentDetail.getShipmentCode());
shipmentContainerDetaill.setShipmentId(shipmentDetail.getShipmentId());
shipmentContainerDetaill.setShipmentDetailId(shipmentDetail.getId());
shipmentContainerDetaill.setMaterialCode(shipmentDetail.getMaterialCode());
shipmentContainerDetaill.setMaterialName(shipmentDetail.getMaterialName());
shipmentContainerDetaill.setMaterialSpec(shipmentDetail.getMaterialSpec());
shipmentContainerDetaill.setMaterialUnit(shipmentDetail.getMaterialUnit());
shipmentContainerDetaill.setQty(shipmentCombinationModel.getShipQty());
shipmentContainerDetaill.setWaveId(shipmentDetail.getWaveId());
shipmentContainerDetaill.setTaskCreated(0);
|
|
290
|
shipmentContainerDetaill.setStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
|
|
291
292
293
294
|
shipmentContainerDetaill.setBatch(shipmentDetail.getBatch());
shipmentContainerDetaill.setLot(shipmentDetail.getLot());
shipmentContainerDetaill.setProjectNo(shipmentDetail.getProjectNo());
shipmentContainerDetaill.setCreatedBy(ShiroUtils.getLoginName());
|
|
295
|
flag = shipmentContainerDetailService.save(shipmentContainerDetaill);
|
|
296
297
298
|
if(flag == false){
throw new ServiceException("新建组盘明细失败,sql错误");
}
|
|
299
|
}
|
|
300
|
|
|
301
302
|
//4.查看组盘头状态,如果状态在10到20,则生成任务明细或修改任务明细的数量
//查看任务头
|
|
303
|
if(shipmentContainerHeader.getStatus()>=QuantityConstant.SHIPMENT_CONTAINER_TASK && shipmentContainerHeader.getStatus()<QuantityConstant.SHIPMENT_CONTAINER_REVIEWSUCCESS){
|
|
304
305
|
LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper=Wrappers.lambdaQuery();
taskHeaderLambdaQueryWrapper.eq(TaskHeader::getWarehouseCode,shipmentContainerHeader.getWarehouseCode())
|
|
306
|
.eq(TaskHeader::getInternalTaskType,QuantityConstant.TASK_INTENERTYPE_PICKING)
|
|
307
|
.eq(TaskHeader::getAllocationHeadId,shipmentContainerHeader.getId());
|
|
308
309
|
TaskHeader taskHeader=taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
if(taskHeader==null){
|
|
310
|
throw new ServiceException("有相同的组盘头,但找不到相应的任务头");
|
|
311
|
}
|
|
312
313
314
315
316
317
318
319
|
if(shipmentContainerDetaill == null) {
//shipmentContainerDetaill为空时,说明组盘明细不是新建,so修改任务明细
//查找任务明细
LambdaQueryWrapper<TaskDetail> taskDetailLam = Wrappers.lambdaQuery();
taskDetailLam.eq(TaskDetail::getWarehouseCode,shipmentContainerDetail.getWarehouseCode())
.eq(TaskDetail::getAllocationId,shipmentContainerDetail.getId())
.eq(TaskDetail::getTaskId,taskHeader.getId())
|
|
320
|
.eq(TaskDetail::getInternalTaskType,QuantityConstant.TASK_INTENERTYPE_PICKING);
|
|
321
322
323
324
325
326
327
328
329
|
TaskDetail taskDetail = taskDetailService.getOne(taskDetailLam);
if(taskDetail == null){
throw new ServiceException("找不到对应的任务明细");
}
taskDetail.setQty(taskDetail.getQty().add(shipmentCombinationModel.getShipQty()));
flag=taskDetailService.saveOrUpdate(taskDetail);
if(flag == false){
throw new ServiceException("修改任务明细失败,sql错误");
}
|
|
330
|
}else {
|
|
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
|
//shipmentContainerDetaill不为空时,说明组盘明细是新建,so新建任务明细
TaskDetail taskDetail = new TaskDetail();
taskDetail.setTaskId(taskHeader.getId());
taskDetail.setInternalTaskType(taskHeader.getInternalTaskType());
taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
taskDetail.setCompanyCode(taskHeader.getCompanyCode());
taskDetail.setTaskType(taskHeader.getTaskType());
taskDetail.setAllocationId(shipmentContainerDetaill.getId());
taskDetail.setBillCode(shipmentContainerDetaill.getShipmentCode());
taskDetail.setBillDetailId(shipmentContainerDetaill.getShipmentDetailId());
taskDetail.setMaterialCode(shipmentContainerDetaill.getMaterialCode());
taskDetail.setMaterialName(shipmentContainerDetaill.getMaterialName());
taskDetail.setMaterialSpec(shipmentContainerDetaill.getMaterialSpec());
taskDetail.setMaterialUnit(shipmentContainerDetaill.getMaterialUnit());
taskDetail.setFromInventoryId(shipmentContainerDetaill.getInventoryId());
taskDetail.setQty(shipmentContainerDetaill.getQty());
taskDetail.setContainerCode(taskHeader.getContainerCode());
taskDetail.setFromLocation(taskHeader.getFromLocation());
taskDetail.setToLocation(taskHeader.getToLocation());
taskDetail.setLot(shipmentContainerDetaill.getLot());
taskDetail.setWaveId(shipmentContainerDetaill.getWaveId());
taskDetail.setBatch(shipmentContainerDetaill.getBatch());
taskDetail.setProjectNo(shipmentContainerDetail.getProjectNo());
|
|
354
|
if (shipmentContainerHeader.getStatus().equals(QuantityConstant.SHIPMENT_CONTAINER_TASK)) {
|
|
355
|
taskDetail.setStatus(QuantityConstant.TASK_STATUS_BUILD);
|
|
356
|
} else {
|
|
357
|
taskDetail.setStatus(QuantityConstant.TASK_STATUS_RELEASE);
|
|
358
359
360
361
362
363
364
|
}
taskDetail.setCreatedBy(ShiroUtils.getLoginName());
taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
flag = taskDetailService.save(taskDetail);
if(flag == false){
throw new ServiceException("新建任务明细失败,sql错误");
}
|
|
365
366
|
}
}
|
|
367
368
369
|
return shipmentContainerDetail;
}
|
|
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
|
/**
* 取消组盘的一组明细
* @param detailIds
* @return
*/
@Override
public AjaxResult cancelCombinationDetail(List<Integer> detailIds) {
List<ShipmentContainerDetail> shipmentContainerDetails = new ArrayList<>();
for(int detailId:detailIds){
ShipmentContainerDetail shipmentContainerDetail = shipmentContainerDetailService.getById(detailId);
shipmentContainerDetails.add(shipmentContainerDetail);
}
return cancelCombinationDetailInner(shipmentContainerDetails);
}
/**
* 取消组盘的一组明细
* @param shipmentContainerDetails
* @return
*/
@Override
@Transactional
public AjaxResult cancelCombinationDetailInner(List<ShipmentContainerDetail> shipmentContainerDetails) {
for(ShipmentContainerDetail shipmentContainerDetail:shipmentContainerDetails){
//获取头
ShipmentContainerHeader shipmentContainerHeader = this.getById(shipmentContainerDetail.getShippingContainerId());
|
|
397
|
if(shipmentContainerHeader.getStatus()>= QuantityConstant.SHIPMENT_CONTAINER_TASK){
|
|
398
399
400
401
402
403
404
405
406
407
|
return AjaxResult.error("容器"+shipmentContainerHeader.getContainerCode()+"非新建状态,不允许取消明细");
}
//恢复占用库存
InventoryDetail inventoryDetail = inventoryDetailService.getById(shipmentContainerDetail.getInventoryId());
inventoryDetail.setTaskQty(inventoryDetail.getTaskQty().subtract(shipmentContainerDetail.getQty()));
inventoryDetailService.saveOrUpdate(inventoryDetail);
//恢复单据发货数量
ShipmentDetail shipmentDetail = shipmentDetailService.getById(shipmentContainerDetail.getShipmentDetailId());
shipmentDetail.setRequestQty(shipmentDetail.getRequestQty().subtract(shipmentContainerDetail.getQty()));
if(shipmentDetail.getRequestQty().compareTo(BigDecimal.ZERO) != 0 ){
|
|
408
|
shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_WAVE);//明细状态恢复,如果删除后还有以出数量就是波次
|
|
409
|
}else{
|
|
410
|
shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_POOL );//明细状态
|
|
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
|
}
shipmentDetailService.saveOrUpdate(shipmentDetail);
//删除这个配盘明细
shipmentContainerDetailService.removeById(shipmentContainerDetail.getId());
//查询头表下还有没有明细,如果没有,则删了这个头表
ShipmentContainerDetail condition = new ShipmentContainerDetail();
condition.setShippingContainerId(shipmentContainerDetail.getShippingContainerId());
List<Map<String, Object>> list= shipmentContainerDetailService.selectListMapByEqual("id", condition);
if(list==null||list.size() == 0){
this.removeById(shipmentContainerHeader.getId());
locationService.updateStatus(shipmentContainerHeader.getLocationCode(),"empty");
}
//更新单据状态
shipmentHeaderService.updateShipmentStatus(shipmentDetail.getShipmentId());
}
return AjaxResult.success("");
}
|
|
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
|
/**
* 取消组盘
* @param shipmentContainerIds
* @return
*/
@Override
public AjaxResult cancelCombination(List<Integer> shipmentContainerIds) {
AjaxResult result = checkForCancelCombination(shipmentContainerIds);
if(result.getCode()!= RetCode.SUCCESS.getValue()){
return result;
}
for(int id : shipmentContainerIds){
LambdaQueryWrapper<ShipmentContainerDetail> lambdaQueryWrapper=Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ShipmentContainerDetail::getShippingContainerId,id);
List<ShipmentContainerDetail> shipmentContainerDetails = shipmentContainerDetailService.list(lambdaQueryWrapper);
result = cancelCombinationDetailInner(shipmentContainerDetails);
if(result.hasErr()){
return result;
}
}
return AjaxResult.success("");
}
|
|
454
455
456
457
458
459
460
461
462
|
/**
* 出库自动组盘
* @param shipmentCode
* @return
*/
@Override
@Transactional
public AjaxResult autoCombination(String shipmentCode) {
|
|
463
464
465
466
467
468
469
|
LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLam = Wrappers.lambdaQuery();
shipmentHeaderLam.eq(ShipmentHeader::getWarehouseCode,ShiroUtils.getWarehouseCode())
.eq(ShipmentHeader::getCode,shipmentCode);
ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentHeaderLam);
if(shipmentHeader == null){
throw new ServiceException("系统没有此单据");
}
|
|
470
|
shipmentPreferenceService.checkShipmentProcess(shipmentHeader.getId().toString(),100,shipmentCode);
|
|
471
|
|
|
472
473
474
|
LambdaQueryWrapper<ShipmentDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ShipmentDetail::getShipmentCode, shipmentCode)
.eq(ShipmentDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
|
|
475
|
List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(lambdaQueryWrapper);
|
|
476
|
if (shipmentDetailList.isEmpty()) {
|
|
477
478
|
return AjaxResult.error("找不到子单链");
}
|
|
479
480
481
482
483
|
for(ShipmentDetail shipmentDetail: shipmentDetailList){
if(shipmentDetail.getWaveId() != 0){
return AjaxResult.error(shipmentCode+"单号已加入波次"+shipmentDetail.getWaveId()+",无法自动组盘");
}
}
|
|
484
485
486
487
488
|
return this.autoCombination(shipmentDetailList);
}
//出库自动组盘
|
|
489
|
@Override
|
|
490
491
492
|
public AjaxResult autoCombination(List<ShipmentDetail> shipmentDetailList){
int num = 0;
List<Integer> list=new ArrayList<>();
|
|
493
494
495
496
497
498
499
|
for (ShipmentDetail item : shipmentDetailList) {
//获取需要出库数量
BigDecimal shipmentQty = item.getShipQty().subtract(item.getRequestQty());
//判断是否还有需要出库的物料,如果没有就跳过该物料
if (shipmentQty.compareTo(BigDecimal.ZERO) <= 0) {
continue;
}
|
|
500
|
// 根据 仓库编码、货主编码、物料编码,物料状态,项目号来查找可以出库的物料
|
|
501
502
503
504
505
|
// ShippingSearch search = new ShippingSearch();
// search.setWarehouseCode(ShiroUtils.getWarehouseCode());
// search.setCompanyCode(item.getCompanyCode());
// search.setMaterialCode(item.getMaterialCode());
// search.setInventorySts(item.getInventorySts()); //物料状态
|
|
506
|
|
|
507
|
List<InventoryDetail> inventoryList = shippingCombinationService.getInventorys(item);
|
|
508
|
if(inventoryList.size() < 1 && item.getWaveId() != 0){
|
|
509
|
Wave wave = waveService.getById(item.getWaveId());
|
|
510
511
512
|
wave.setStatus(QuantityConstant.WAVE_STATUS_ERROR);
wave.setCurrentWaveStep(QuantityConstant.WAVE_STEP_ERROR);
wave.setLastWaveStep(QuantityConstant.WAVE_STEP_BUILD);
|
|
513
|
waveService.updateById(wave);
|
|
514
|
throw new ServiceException("主单为"+item.getShipmentCode()+"子单id为"+item.getId() + "的单据没有库存,波次失败");
|
|
515
|
}
|
|
516
517
518
519
520
521
522
523
524
525
526
527
528
|
if (inventoryList.size() < 1) {
num = num + 1;
} else {
for (InventoryDetail inventory : inventoryList) {
//判断是否组盘完毕,完毕就退出内循环
if (shipmentQty.compareTo(BigDecimal.ZERO) <= 0) {
break;
}
BigDecimal inventoryQty = inventory.getQty().subtract(inventory.getTaskQty());
ShipmentCombinationModel shipmentCombination = new ShipmentCombinationModel();
shipmentCombination.setInventoryDetailId(inventory.getId());
shipmentCombination.setShipmentDetailId(item.getId());
|
|
529
|
shipmentCombination.setType((short) QuantityConstant.TASK_TYPE_WHOLESHIPMENT.intValue());
|
|
530
|
|
|
531
532
533
534
|
//如果库存数 >= 待出库数,组盘数就是待出库数并且结束组盘,否则组盘数就是库存数
if (inventoryQty.compareTo(shipmentQty) > -1) {
shipmentCombination.setShipQty(shipmentQty);
ShipmentContainerHeader shipmentContainerHeader=this.combination(shipmentCombination);
|
|
535
|
list.add(shipmentContainerHeader.getId());
|
|
536
537
538
539
540
541
542
543
544
545
|
} else {
shipmentCombination.setShipQty(inventoryQty);
ShipmentContainerHeader shipmentContainerHeader=this.combination(shipmentCombination);
list.add(shipmentContainerHeader.getId());
}
shipmentQty = shipmentQty.subtract(shipmentCombination.getShipQty());
}
}
}
if(num==shipmentDetailList.size()){
|
|
546
|
throw new ServiceException("单据物料的库存分配规则在此库区没有库存,无法出库");
|
|
547
|
}
|
|
548
|
return AjaxResult.success("成功",list);
|
|
549
550
|
}
|
|
551
552
553
554
555
556
557
558
559
|
/**
* 检查是否可以进行取消配盘
* @param shipmentContainerIds
* @return
*/
@Override
public AjaxResult checkForCancelCombination(List<Integer> shipmentContainerIds) {
for(int id : shipmentContainerIds){
ShipmentContainerHeader shipmentContainerHeader = this.getById(id);
|
|
560
|
if(shipmentContainerHeader.getStatus()>=QuantityConstant.SHIPMENT_CONTAINER_TASK){
|
|
561
562
563
564
565
566
567
568
569
570
571
572
573
|
return AjaxResult.error("存在已生成任务的记录,请先取消任务再取消组盘");
}
}
return AjaxResult.success("");
}
/* 生成任务 */
@Override
@Transactional
public AjaxResult createTask(List<Integer> idList) {
ShipmentTaskCreateModel shipmentTask = new ShipmentTaskCreateModel();
for (Integer id : idList) {
shipmentTask.setShipmentContainerHeaderIds(id);
|
|
574
|
AjaxResult ajaxResult = shipmentTaskService.createTaskFromShipmentContainers(shipmentTask);
|
|
575
576
577
|
if(ajaxResult.hasErr()){
return ajaxResult;
}
|
|
578
579
580
581
|
}
return AjaxResult.success("全部生成完毕");
}
|
|
582
|
}
|