|
1
2
3
4
5
|
package com.huaheng.api.ACS.service;
import com.alibaba.fastjson.JSON;
import com.huaheng.api.ACS.domain.Points;
import com.huaheng.api.ACS.domain.StateInfoUploadModel;
|
|
6
|
import com.huaheng.common.exception.service.ServiceException;
|
|
7
|
import com.huaheng.common.utils.http.HttpUtils;
|
|
8
|
import com.huaheng.common.utils.security.ShiroUtils;
|
|
9
|
import com.huaheng.framework.web.domain.AjaxResult;
|
|
10
11
|
import com.huaheng.pc.inventory.inventory.domain.Inventory;
import com.huaheng.pc.inventory.inventory.service.IInventoryService;
|
|
12
13
|
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService;
|
|
14
15
16
17
|
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.IReceiptDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.IReceiptHeaderService;
|
|
18
19
|
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.IShipmentContainerHeaderService;
|
|
20
21
22
23
|
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.IShipmentDetailService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.IShipmentHeaderService;
|
|
24
|
import com.huaheng.pc.task.agvTask.domain.AgvTask;
|
|
25
26
|
import com.huaheng.pc.task.agvTask.mapper.AgvStateInfoMapper;
import com.huaheng.pc.task.agvTask.mapper.AgvTaskMapper;
|
|
27
28
29
30
|
import com.huaheng.pc.task.task.domain.Task;
import com.huaheng.pc.task.task.service.ITaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
|
|
31
|
import org.springframework.transaction.annotation.Transactional;
|
|
32
33
34
|
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource;
|
|
35
|
import java.util.ArrayList;
|
|
36
|
import java.util.HashMap;
|
|
37
|
import java.util.List;
|
|
38
|
import java.util.Map;
|
|
39
|
import java.util.stream.Collectors;
|
|
40
41
42
43
44
45
46
47
48
49
50
51
|
@Service
public class AcsService {
@Autowired
private ITaskService taskService;
@Resource
private AgvTaskMapper agvTaskMapper;
@Resource
private AgvStateInfoMapper agvStateInfoMapper;
@Resource
private PointsService pointsService;
|
|
52
53
54
55
56
57
58
59
|
@Autowired
private IReceiptHeaderService receiptHeaderService;
@Autowired
private IShipmentHeaderService shipmentHeaderService;
@Autowired
private IReceiptDetailService receiptDetailService;
@Autowired
private IShipmentDetailService shipmentDetailService;
|
|
60
61
|
@Autowired
private IInventoryService iInventoryService;
|
|
62
63
64
65
|
@Autowired
private IReceiptContainerHeaderService receiptContainerHeaderService;
@Autowired
private IShipmentContainerHeaderService shipmentContainerHeaderService;
|
|
66
|
|
|
67
|
|
|
68
|
|
|
69
70
|
final String interactionId = "6EAB7794-CFD7-449A-A754-FFDB98CE44C7";
|
|
71
72
73
|
//pick任务下发
@Transactional
public AjaxResult Task(String code,String station){
|
|
74
|
//查找下发任务
|
|
75
76
77
|
AgvTask agvTask=new AgvTask();
agvTask.setTaskType("pick");
agvTask.setStation(station);
|
|
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
ReceiptHeader receiptHeader=new ReceiptHeader();
ReceiptDetail receiptDetail=new ReceiptDetail();
ShipmentHeader shipmentHeader=new ShipmentHeader();
ShipmentDetail shipmentDetail=new ShipmentDetail();
Inventory inventory=new Inventory();
receiptHeader.setCode(code);
receiptHeader=receiptHeaderService.selectFirstEntity(receiptHeader);
//判断code是否属于入库单,不属于则查找出库单
if(receiptHeader==null){
shipmentHeader.setCode(code);
shipmentHeader=shipmentHeaderService.selectFirstEntity(shipmentHeader);
shipmentDetail.setShipmentCode(code);
shipmentDetail.setWarehouseId(ShiroUtils.getWarehouseId());
//查找AGV的子单
List<ShipmentDetail> shipmentDetails=shipmentDetailService.selectListAgvDetail(shipmentDetail);
for(ShipmentDetail item:shipmentDetails){
|
|
94
95
96
97
|
if(item.getQty().compareTo(item.getQtyCompleted())!=0) {
inventory.setMaterialCode(item.getMaterialCode());
inventory.setWarehouseCode(ShiroUtils.getWarehouseCode());
//查找物料对应的满盘的库存,没有则查找不满盘的库存
|
|
98
|
inventory.setContainerStatus("half");
|
|
99
100
101
102
103
104
105
|
Inventory inventorie = iInventoryService.selectFirstEntity(inventory);
if (inventorie == null) {
inventory.setContainerStatus("some");
inventorie = iInventoryService.selectFirstEntity(inventory);
if (inventorie == null) {
throw new ServiceException(item.getMaterialCode() + "没有库存,无法出库");
}
|
|
106
|
}
|
|
107
108
109
110
111
112
113
|
agvTask.setTaskHeaderId(shipmentHeader.getId());
agvTask.setTaskDetailId(item.getId());
agvTask.setWarehouseId(item.getWarehouseId());
agvTask.setWarehouseCode(item.getWarehouseCode());
agvTask.setCompanyId(item.getCompanyId());
agvTask.setCompanyCode(item.getCompanyCode());
this.TaskModel(inventorie.getContainerCode(),agvTask);
|
|
114
115
116
117
118
119
120
|
}
}
}else {
receiptDetail.setReceiptCode(code);
receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
List<ReceiptDetail> receiptDetails=receiptDetailService.selectListAgvEntity(receiptDetail);
for(ReceiptDetail item: receiptDetails){
|
|
121
122
123
124
125
126
127
|
if(item.getQty().compareTo(item.getQtyCompleted())!=0) {
inventory.setMaterialCode(item.getMaterialCode());
inventory.setWarehouseCode(ShiroUtils.getWarehouseCode());
//查找物料对应的不满盘的库存
inventory.setContainerStatus("some");
Inventory inventorie = iInventoryService.selectFirstEntity(inventory);
if (inventorie == null) {
|
|
128
|
throw new ServiceException("请手动叫车");
|
|
129
|
}
|
|
130
131
132
133
134
135
136
|
agvTask.setTaskHeaderId(receiptHeader.getId());
agvTask.setTaskDetailId(item.getId());
agvTask.setWarehouseId(item.getWarehouseId());
agvTask.setWarehouseCode(item.getWarehouseCode());
agvTask.setCompanyId(item.getCompanyId());
agvTask.setCompanyCode(item.getCompanyCode());
this.TaskModel(inventorie.getContainerCode(),agvTask);
|
|
137
|
}
|
|
138
139
|
}
}
|
|
140
|
return AjaxResult.success("成功");
|
|
141
142
|
}
|
|
143
144
|
|
|
145
|
/**
|
|
146
147
148
149
|
* 设置agv下发任务的实体
*
*/
@Transactional
|
|
150
|
public AjaxResult TaskModel(String containerCode,AgvTask agvTask){
|
|
151
|
AjaxResult ajaxResult=new AjaxResult();
|
|
152
|
AgvTask model=new AgvTask();
|
|
153
154
155
156
157
|
String code=containerCode.substring(0,4);
Points points=new Points();
points=pointsService.selectEntity(code);
//任务下发实体
|
|
158
159
160
161
|
model.setTaskHeaderId(agvTask.getTaskHeaderId());
model.setTaskDetailId(agvTask.getTaskDetailId());
model.setTaskType(agvTask.getTaskType());
model.setStation(agvTask.getStation());
|
|
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
if(containerCode.substring(5,7).equals("1")) {
model.setOrientation("A");
}else {
model.setOrientation("C");
}
//判断货架是否处于1阶段,1阶段为pick阶段。
if (points == null) {
throw new ServiceException("货架不存在!");
}
if(points.getIsLocked()!=1){
model.setShelfNo(points.getGoodsShelfNo());
model.setFromLocationNo(points.getXpos().toString());
model.setToLocationNo(points.getYpos().toString());
ajaxResult=this.TaskAssign(model);
if(!ajaxResult.hasErr()){
points.setIsLocked(1);
pointsService.updatePoints(points);
|
|
179
180
181
182
183
184
185
|
model.setCompanyId(agvTask.getCompanyId());
model.setCompanyCode(agvTask.getCompanyCode());
model.setWarehouseId(agvTask.getWarehouseId());
model.setCompanyCode(agvTask.getCompanyCode());
if(agvTaskMapper.insertModel(model)<1){
throw new ServiceException("agv任务下发失败");
}
|
|
186
|
}
|
|
187
188
|
}else{
return AjaxResult.success("该货架已出库");
|
|
189
190
191
192
|
}
return ajaxResult;
}
|
|
193
194
195
196
|
//手动叫车
@Transactional
public AjaxResult ManualCalling(String station,String shelfNo,String code){
AgvTask model = new AgvTask();
|
|
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
|
ReceiptHeader receiptHeader=new ReceiptHeader();
ReceiptDetail receiptDetail=new ReceiptDetail();
ShipmentHeader shipmentHeader=new ShipmentHeader();
ShipmentDetail shipmentDetail=new ShipmentDetail();
receiptHeader.setCode(code);
receiptHeader=receiptHeaderService.selectFirstEntity(receiptHeader);
//判断code是否属于入库单,不属于则查找出库单
if(receiptHeader==null){
shipmentHeader.setCode(code);
shipmentHeader=shipmentHeaderService.selectFirstEntity(shipmentHeader);
shipmentDetail.setShipmentCode(code);
shipmentDetail.setZoneCode("AGV");
shipmentDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
shipmentDetail=shipmentDetailService.selectFirstEntity(shipmentDetail);
model.setTaskHeaderId(shipmentHeader.getId());
model.setTaskDetailId(shipmentDetail.getId());
model.setWarehouseId(shipmentDetail.getWarehouseId());
model.setWarehouseCode(shipmentDetail.getWarehouseCode());
model.setCompanyId(shipmentDetail.getCompanyId());
model.setCompanyCode(shipmentDetail.getCompanyCode());
}else {
receiptDetail.setReceiptCode(code);
receiptDetail.setZoneCode("AGV");
receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
receiptDetail=receiptDetailService.selectFirstEntity(receiptDetail);
model.setTaskHeaderId(receiptHeader.getId());
model.setTaskDetailId(receiptDetail.getId());
model.setWarehouseId(receiptDetail.getWarehouseId());
model.setWarehouseCode(receiptDetail.getWarehouseCode());
model.setCompanyId(receiptDetail.getCompanyId());
model.setCompanyCode(receiptDetail.getCompanyCode());
}
|
|
229
230
231
|
model.setTaskType("pick");
model.setShelfNo(shelfNo);
model.setStation(station);
|
|
232
233
234
235
236
237
238
239
240
241
242
243
|
Points points=new Points();
points.setGoodsShelfNo(shelfNo);
AjaxResult ajaxResult=new AjaxResult();
points=pointsService.selectFirstEntity(points);
if(points.getIsLocked()!=1) {
model.setFromLocationNo(points.getXpos().toString());
model.setToLocationNo(points.getYpos().toString());
model.setOrientation("A");
ajaxResult = this.TaskAssign(model);
if (!ajaxResult.hasErr()) {
points.setIsLocked(1);
pointsService.updatePoints(points);
|
|
244
|
}
|
|
245
246
|
}else {
throw new ServiceException("该货架已出库");
|
|
247
248
249
250
|
}
return ajaxResult;
}
|
|
251
|
/**
|
|
252
253
254
|
* AGV 任务下发
*/
|
|
255
|
public AjaxResult TaskAssign(AgvTask model)
|
|
256
|
{
|
|
257
|
model.setInteractionId(interactionId);
|
|
258
|
model.setPlatform("wms");
|
|
259
|
String url = "http://17.16.30.48:8081/api/TaskAssign";
|
|
260
261
262
263
264
|
String JsonParam = JSON.toJSONString(model);
String result = HttpUtils.sendPost(url, JsonParam);
AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
return ajaxResult;
}
|
|
265
|
|
|
266
267
|
/**
|
|
268
269
270
|
* agv putway任务下发
*
*/
|
|
271
|
@Transactional
|
|
272
273
274
275
276
277
278
|
public AjaxResult TaskAssigns(String code,String containerCode,String materialCode,String station)
{
//查找下发任务
ReceiptHeader receiptHeader=new ReceiptHeader();
ReceiptDetail receiptDetail=new ReceiptDetail();
ShipmentHeader shipmentHeader=new ShipmentHeader();
ShipmentDetail shipmentDetail=new ShipmentDetail();
|
|
279
|
AgvTask agvTask=new AgvTask();
|
|
280
281
282
283
284
285
286
287
|
receiptHeader.setCode(code);
receiptHeader=receiptHeaderService.selectFirstEntity(receiptHeader);
//判断code是否属于入库单,不属于则查找出库单
if(receiptHeader==null){
shipmentHeader.setCode(code);
shipmentHeader=shipmentHeaderService.selectFirstEntity(shipmentHeader);
shipmentDetail.setShipmentCode(code);
|
|
288
|
shipmentDetail.setZoneCode("AGV");
|
|
289
290
291
|
shipmentDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
shipmentDetail.setMaterialCode(materialCode);
shipmentDetail=shipmentDetailService.selectFirstEntity(shipmentDetail);
|
|
292
293
294
295
296
297
|
agvTask.setTaskHeaderId(shipmentHeader.getId());
agvTask.setTaskDetailId(shipmentDetail.getId());
agvTask.setWarehouseId(shipmentDetail.getWarehouseId());
agvTask.setWarehouseCode(shipmentDetail.getWarehouseCode());
agvTask.setCompanyId(shipmentDetail.getCompanyId());
agvTask.setCompanyCode(shipmentDetail.getCompanyCode());
|
|
298
299
300
|
}else {
receiptDetail.setReceiptCode(code);
receiptDetail.setMaterialCode(materialCode);
|
|
301
|
receiptDetail.setZoneCode("AGV");
|
|
302
303
|
receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
receiptDetail=receiptDetailService.selectFirstEntity(receiptDetail);
|
|
304
305
306
307
308
309
|
agvTask.setTaskHeaderId(receiptHeader.getId());
agvTask.setTaskDetailId(receiptDetail.getId());
agvTask.setWarehouseId(receiptDetail.getWarehouseId());
agvTask.setWarehouseCode(receiptDetail.getWarehouseCode());
agvTask.setCompanyId(receiptDetail.getCompanyId());
agvTask.setCompanyCode(receiptDetail.getCompanyCode());
|
|
310
|
}
|
|
311
|
agvTask.setTaskType("putway");
|
|
312
|
AjaxResult ajaxResult = new AjaxResult();
|
|
313
314
315
|
//查找对应的货架
String containCode=containerCode.substring(0,4);
Points points=new Points();
|
|
316
|
points=pointsService.selectEntity(containCode);
|
|
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
|
if(points.getIsLocked()==1) {
AgvTask model = new AgvTask();
model.setTaskHeaderId(agvTask.getTaskHeaderId());
model.setTaskDetailId(agvTask.getTaskDetailId());
model.setTaskType("putway");
model.setShelfNo(points.getGoodsShelfNo());
model.setStation(station);
model.setFromLocationNo(points.getXpos().toString());
model.setToLocationNo(points.getYpos().toString());
if (containerCode.substring(5, 7).equals("1")) {
model.setOrientation("A");
} else {
model.setOrientation("C");
}
ajaxResult = this.TaskAssign(model);
|
|
332
333
334
335
336
337
338
339
340
341
342
343
344
|
String shelfNo=points.getGoodsShelfNo().substring(1, 5);
if (!ajaxResult.hasErr()) {
List<ReceiptContainerHeader> list = receiptContainerHeaderService.selectAgvListByLike(shelfNo, agvTask.getWarehouseCode());
if (list != null) {
Integer[] ids = list.stream().map(x -> x.getId()).toArray(Integer[]::new);
try {
taskService.createReceiptTask(ids);
} catch (Exception e) {
return AjaxResult.error("生成任务失败");
}
}
List<ShipmentContainerHeader> listt = shipmentContainerHeaderService.selectAgvListByLike(shelfNo, agvTask.getWarehouseCode());
if (listt != null) {
|
|
345
|
List<Integer> ids = listt.stream().map(x -> x.getId()).collect(Collectors.toList());
|
|
346
|
try {
|
|
347
|
shipmentContainerHeaderService.createTask(ids);
|
|
348
349
350
351
352
|
} catch (Exception e) {
return AjaxResult.error("生成任务失败");
}
}
|
|
353
354
355
|
points.setIsLocked(2);
pointsService.updatePoints(points);
model.setCompanyId(agvTask.getCompanyId());
|
|
356
357
358
|
model.setCompanyCode(agvTask.getCompanyCode());
model.setWarehouseId(agvTask.getWarehouseId());
model.setCompanyCode(agvTask.getCompanyCode());
|
|
359
360
|
if (agvTaskMapper.insertModel(model) < 1) {
throw new ServiceException("agv任务下发失败");
|
|
361
|
}
|
|
362
|
}
|
|
363
364
|
}else {
throw new ServiceException("该货架不在站台,无法下发回库任务");
|
|
365
|
}
|
|
366
|
return ajaxResult;
|
|
367
|
}
|
|
368
369
|
|
|
370
|
/**
|
|
371
372
|
* AGV 任务取消
*/
|
|
373
|
public AjaxResult TaskCancel(String message)
|
|
374
375
376
|
{
Map<String, Object> map = new HashMap<>();
map.put("interactionId", interactionId);
|
|
377
|
map.put("reason", message);
|
|
378
|
String JsonParam = JSON.toJSONString(map);
|
|
379
|
String url= "http://17.16.30.48:8081/api/TaskCancel";
|
|
380
381
382
383
384
385
386
387
|
String result = HttpUtils.sendPost(url, JsonParam);
AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
return ajaxResult;
}
/**
* AGV 信息查询
*/
|
|
388
389
|
public AjaxResult StateInfoGET(String carNo)
|
|
390
391
|
{
Map<String, String> map = new HashMap<>();
|
|
392
|
map.put("carNo", carNo);
|
|
393
394
|
map.put("interactionId", interactionId);
String JsonParam = JSON.toJSONString(map);
|
|
395
|
String url= "http://17.16.30.48:8081/api/StateInfoGET";
|
|
396
397
398
399
400
401
402
403
|
String result = HttpUtils.sendPost(url, JsonParam);
AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
return ajaxResult;
}
/**
* AGV 旋转方向
*/
|
|
404
|
public AjaxResult TurnOriention(String carNo,String orientation)
|
|
405
406
|
{
Map<String, String> map = new HashMap<>();
|
|
407
408
|
map.put("carNo", carNo);
map.put("orientation", orientation);
|
|
409
|
String JsonParam = JSON.toJSONString(map);
|
|
410
|
String url= "http://17.16.30.48:8081/api/TurnOriention";
|
|
411
412
413
414
415
416
417
418
|
String result = HttpUtils.sendPost(url, JsonParam);
AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
return ajaxResult;
}
/**
* AGV 任务回传
*/
|
|
419
|
@Transactional
|
|
420
|
public AjaxResult TaskConfirm(AgvTask model)
|
|
421
|
{
|
|
422
423
424
425
426
427
428
429
430
431
432
|
model.setWarehouseId(ShiroUtils.getWarehouseId());
model.setCompanyCode(ShiroUtils.getWarehouseCode());
int result=agvTaskMapper.insertModel(model);
if(result<1){
throw new ServiceException("数据插入失败");
}
//回传任务为putway时,查找到改货架中物料为agv的任务,并完成任务。
if (model.getTaskType().equals("putway")) {
String shelfNo = model.getShelfNo().substring(1, 5);
String warehouseCode = ShiroUtils.getWarehouseCode();
List<Task> list = taskService.selectAgvListByLike(shelfNo, warehouseCode);
|
|
433
434
435
436
437
438
439
|
if(list!=null) {
Integer[] ids = list.stream().map(x -> x.getId()).toArray(Integer[]::new);
try {
taskService.completeTaskByWMS(ids);
} catch (Exception e) {
return AjaxResult.error("完成任务失败");
}
|
|
440
|
}
|
|
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
|
}
return AjaxResult.success(model);
}
/**
* AGV 信息上传
*/
public AjaxResult StateInfoUpload(@RequestBody StateInfoUploadModel model)
{
try {
agvStateInfoMapper.insertModel(model);
}catch (Exception e){
return AjaxResult.error("没有数据");
}
return AjaxResult.success("收到");
}
}
|