Blame view

src/main/java/com/huaheng/api/ACS/service/AcsService.java 19.9 KB
游杰 authored
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;
pengcheng authored
6
import com.huaheng.common.exception.service.ServiceException;
游杰 authored
7
import com.huaheng.common.utils.http.HttpUtils;
pengcheng authored
8
import com.huaheng.common.utils.security.ShiroUtils;
游杰 authored
9
import com.huaheng.framework.web.domain.AjaxResult;
pengcheng authored
10
11
import com.huaheng.pc.inventory.inventory.domain.Inventory;
import com.huaheng.pc.inventory.inventory.service.IInventoryService;
pengcheng authored
12
13
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService;
pengcheng authored
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;
pengcheng authored
18
19
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.IShipmentContainerHeaderService;
pengcheng authored
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;
xqs authored
25
26
import com.huaheng.pc.task.agvTask.mapper.AgvStateInfoMapper;
import com.huaheng.pc.task.agvTask.mapper.AgvTaskMapper;
游杰 authored
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;
游杰 authored
32
33
34
import org.springframework.web.bind.annotation.RequestBody;

import javax.annotation.Resource;
pengcheng authored
35
import java.util.ArrayList;
游杰 authored
36
import java.util.HashMap;
pengcheng authored
37
import java.util.List;
游杰 authored
38
import java.util.Map;
39
import java.util.stream.Collectors;
游杰 authored
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;
pengcheng authored
52
53
54
55
56
57
58
59
    @Autowired
    private IReceiptHeaderService receiptHeaderService;
    @Autowired
    private IShipmentHeaderService shipmentHeaderService;
    @Autowired
    private IReceiptDetailService receiptDetailService;
    @Autowired
    private IShipmentDetailService shipmentDetailService;
pengcheng authored
60
61
    @Autowired
    private IInventoryService iInventoryService;
pengcheng authored
62
63
64
65
    @Autowired
    private IReceiptContainerHeaderService receiptContainerHeaderService;
    @Autowired
    private IShipmentContainerHeaderService shipmentContainerHeaderService;
pengcheng authored
66
游杰 authored
67
68
游杰 authored
69
70
    final String interactionId = "6EAB7794-CFD7-449A-A754-FFDB98CE44C7";
71
72
73
    //pick任务下发
    @Transactional
     public AjaxResult Task(String code,String station){
pengcheng authored
74
         //查找下发任务
75
76
77
        AgvTask agvTask=new AgvTask();
        agvTask.setTaskType("pick");
        agvTask.setStation(station);
pengcheng authored
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() + "没有库存,无法出库");
                         }
pengcheng authored
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);
pengcheng authored
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) {
pengcheng authored
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
                }
pengcheng authored
138
139
            }
         }
140
        return AjaxResult.success("成功");
pengcheng authored
141
142
     }
pengcheng authored
143
144
游杰 authored
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
            }
pengcheng authored
187
188
        }else{
            return AjaxResult.success("该货架已出库");
189
190
191
192
        }
       return  ajaxResult;
    }
pengcheng authored
193
194
195
196
    //手动叫车
    @Transactional
    public AjaxResult ManualCalling(String station,String shelfNo,String code){
        AgvTask model = new AgvTask();
pengcheng authored
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());
        }
pengcheng authored
229
230
231
        model.setTaskType("pick");
        model.setShelfNo(shelfNo);
        model.setStation(station);
pengcheng authored
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);
pengcheng authored
244
            }
pengcheng authored
245
246
        }else {
            throw new ServiceException("该货架已出库");
pengcheng authored
247
248
249
250
        }
        return ajaxResult;
    }
251
    /**
游杰 authored
252
253
254
     * AGV 任务下发
     */
255
    public AjaxResult TaskAssign(AgvTask model)
pengcheng authored
256
    {
257
            model.setInteractionId(interactionId);
游杰 authored
258
            model.setPlatform("wms");
pengcheng authored
259
            String url = "http://17.16.30.48:8081/api/TaskAssign";
游杰 authored
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;
    }
pengcheng authored
265
游杰 authored
266
267

    /**
pengcheng authored
268
269
270
     * agv  putway任务下发
     *
     */
271
    @Transactional
pengcheng authored
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();
pengcheng authored
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);
pengcheng authored
288
            shipmentDetail.setZoneCode("AGV");
pengcheng authored
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());
pengcheng authored
298
299
300
        }else {
            receiptDetail.setReceiptCode(code);
            receiptDetail.setMaterialCode(materialCode);
pengcheng authored
301
            receiptDetail.setZoneCode("AGV");
pengcheng authored
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());
pengcheng authored
310
        }
pengcheng authored
311
        agvTask.setTaskType("putway");
312
        AjaxResult ajaxResult = new AjaxResult();
pengcheng authored
313
314
315
        //查找对应的货架
        String containCode=containerCode.substring(0,4);
        Points points=new Points();
pengcheng authored
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);
pengcheng authored
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());
pengcheng authored
346
                    try {
347
                        shipmentContainerHeaderService.createTask(ids);
pengcheng authored
348
349
350
351
352
                    } catch (Exception e) {
                        return AjaxResult.error("生成任务失败");
                    }
                }
353
354
355
                points.setIsLocked(2);
                pointsService.updatePoints(points);
                model.setCompanyId(agvTask.getCompanyId());
pengcheng authored
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任务下发失败");
pengcheng authored
361
                }
362
            }
pengcheng authored
363
364
        }else {
            throw new ServiceException("该货架不在站台,无法下发回库任务");
365
        }
366
      return ajaxResult;
pengcheng authored
367
    }
368
369
pengcheng authored
370
    /**
游杰 authored
371
372
     * AGV 任务取消
     */
pengcheng authored
373
    public AjaxResult TaskCancel(String message)
游杰 authored
374
375
376
    {
        Map<String, Object> map = new HashMap<>();
        map.put("interactionId", interactionId);
pengcheng authored
377
        map.put("reason", message);
游杰 authored
378
        String JsonParam = JSON.toJSONString(map);
pengcheng authored
379
        String url= "http://17.16.30.48:8081/api/TaskCancel";
游杰 authored
380
381
382
383
384
385
386
387
        String result = HttpUtils.sendPost(url, JsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        return ajaxResult;
    }

    /**
     * AGV 信息查询
     */
pengcheng authored
388
389

    public AjaxResult StateInfoGET(String carNo)
游杰 authored
390
391
    {
        Map<String, String> map = new HashMap<>();
pengcheng authored
392
        map.put("carNo", carNo);
游杰 authored
393
394
        map.put("interactionId", interactionId);
        String JsonParam = JSON.toJSONString(map);
pengcheng authored
395
        String url= "http://17.16.30.48:8081/api/StateInfoGET";
游杰 authored
396
397
398
399
400
401
402
403
        String result = HttpUtils.sendPost(url, JsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        return ajaxResult;
    }

    /**
     * AGV 旋转方向
     */
pengcheng authored
404
    public AjaxResult TurnOriention(String carNo,String orientation)
游杰 authored
405
406
    {
        Map<String, String> map = new HashMap<>();
pengcheng authored
407
408
        map.put("carNo", carNo);
        map.put("orientation", orientation);
游杰 authored
409
        String JsonParam = JSON.toJSONString(map);
pengcheng authored
410
        String url= "http://17.16.30.48:8081/api/TurnOriention";
游杰 authored
411
412
413
414
415
416
417
418
        String result = HttpUtils.sendPost(url, JsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        return ajaxResult;
    }

    /**
     * AGV 任务回传
     */
pengcheng authored
419
    @Transactional
420
    public AjaxResult TaskConfirm(AgvTask model)
游杰 authored
421
    {
pengcheng authored
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);
pengcheng authored
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("完成任务失败");
                }
pengcheng authored
440
            }
游杰 authored
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("收到");
    }
}