Blame view

src/main/java/com/huaheng/pc/task/taskHeader/service/TaskHeaderServiceImpl.java 79.7 KB
mahuandong authored
1
2
package com.huaheng.pc.task.taskHeader.service;
pengcheng authored
3
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
wangyanxiong authored
4
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
5
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
pengcheng authored
6
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
pengcheng authored
7
import com.huaheng.api.wcs.service.taskAssignService.TaskAssignService;
pengcheng authored
8
import com.huaheng.common.constant.QuantityConstant;
wangyanxiong authored
9
import com.huaheng.common.exception.service.ServiceException;
wangyanxiong authored
10
import com.huaheng.common.utils.DataUtils;
wangyanxiong authored
11
import com.huaheng.common.utils.StringUtils;
pengcheng authored
12
13
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
14
15
import com.huaheng.pc.config.configWarning.domain.ConfigWarning;
import com.huaheng.pc.config.configWarning.service.ConfigWarningService;
xqs authored
16
import com.huaheng.pc.config.container.domain.Container;
wangyanxiong authored
17
import com.huaheng.pc.config.container.service.ContainerService;
18
19
import com.huaheng.pc.config.containerCapacity.domain.ContainerCapacity;
import com.huaheng.pc.config.containerCapacity.service.ContainerCapacityService;
pengcheng authored
20
21
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
22
23
24
import com.huaheng.pc.config.sendMail.domain.SendMail;
import com.huaheng.pc.config.sendMail.service.MailService;
import com.huaheng.pc.config.sendMail.service.SendMailService;
xqs authored
25
26
import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetail;
import com.huaheng.pc.inventory.cycleCountDetail.service.CycleCountDetailService;
27
import com.huaheng.pc.inventory.cycleCountHeader.domain.CycleCountHeader;
28
import com.huaheng.pc.inventory.cycleCountHeader.service.CycleCountHeaderService;
pengcheng authored
29
30
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
31
32
import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
wangyanxiong authored
33
import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransaction;
34
import com.huaheng.pc.inventory.inventoryTransaction.service.InventoryTransactionService;
xqs authored
35
36
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
mahuandong authored
37
38
39
40
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
xqs authored
41
42
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
pengcheng authored
43
44
45
46
import com.huaheng.pc.shipment.shipmentContainerDetail.domain.ShipmentContainerDetail;
import com.huaheng.pc.shipment.shipmentContainerDetail.service.ShipmentContainerDetailService;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
wangyanxiong authored
47
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
48
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
49
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
50
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
pengcheng authored
51
52
53
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
xqs authored
54
import org.apache.poi.ss.formula.functions.T;
55
import org.jsoup.helper.DataUtil;
pengcheng authored
56
import org.springframework.beans.factory.annotation.Autowired;
mahuandong authored
57
import org.springframework.stereotype.Service;
pengcheng authored
58
import java.math.BigDecimal;
wangyanxiong authored
59
import java.text.SimpleDateFormat;
60
import java.time.temporal.TemporalAdjuster;
wangyanxiong authored
61
import java.util.ArrayList;
pengcheng authored
62
import java.util.Date;
mahuandong authored
63
import java.util.List;
wangyanxiong authored
64
import java.util.Map;
65
import java.util.*;
xqs authored
66
67
import java.util.concurrent.CopyOnWriteArrayList;
mahuandong authored
68
69
70
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.mapper.TaskHeaderMapper;
pengcheng authored
71
72
import org.springframework.transaction.annotation.Transactional;
wangyanxiong authored
73
74
import javax.annotation.Resource;
mahuandong authored
75
@Service
wangyanxiong authored
76
public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHeader> implements TaskHeaderService {
mahuandong authored
77
78
    @Resource
pengcheng authored
79
    private ShipmentContainerHeaderService shipmentContainerHeaderService;
80
    @Resource
pengcheng authored
81
    private ShipmentContainerDetailService shipmentContainerDetailService;
82
    @Resource
pengcheng authored
83
    private LocationService locationService;
84
    @Resource
xqs authored
85
86
    private ContainerService containerService;
    @Resource
pengcheng authored
87
    private TaskDetailService taskDetailService;
88
    @Resource
wangyanxiong authored
89
    private TaskHeaderService taskHeaderService;
90
    @Resource
91
    private InventoryHeaderService inventoryHeaderService;
92
93
94
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
xqs authored
95
    private InventoryTransactionService inventoryTransactionService;
96
    @Resource
xqs authored
97
    private ReceiptHeaderService receiptHeaderService;
mahuandong authored
98
99
    @Resource
    private ReceiptDetailService receiptDetailService;
xqs authored
100
    @Resource
xqs authored
101
    private ReceiptContainerDetailService receiptContainerDetailService;
102
103
104
105
    @Resource
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
    private ShipmentDetailService shipmentDetailService;
xqs authored
106
107
    @Resource
    private CycleCountDetailService cycleCountDetailService;
mahuandong authored
108
    @Resource
109
110
    private CycleCountHeaderService cycleCountHeaderService;
    @Resource
mahuandong authored
111
    private ReceiptContainerHeaderService receiptContainerHeaderService;
xqs authored
112
    @Resource
113
    private TaskHeaderMapper taskHeaderMapper;
pengcheng authored
114
115
    @Autowired
    private TaskAssignService taskAssignService;
116
117
    @Resource
    private ContainerCapacityService containerCapacityService;
118
119
120
121
122
123
    @Resource
    private ConfigWarningService configWarningService;
    @Resource
    private MailService mailService;
    @Resource
    private SendMailService sendMailService;
124
125
126
    /**
     * 盘点任务首选项
127
     *
128
129
130
131
132
133
     * @param taskHeaderList
     * @return
     */
    @Transactional
    @Override
    public List<TaskHeader> preferenceRealize(List<TaskHeader> taskHeaderList) {
134
        //盘点任务头,默认不显示库位,容器。
135
        List<TaskHeader> taskHeaders = new ArrayList<>();
136
        for (TaskHeader item : taskHeaderList) {
137
138
139
140
141
142
143
            item.setFromLocation("");
            item.setToLocation("");
            item.setContainerCode("");
            taskHeaders.add(item);
        }
        return taskHeaders;
    }
xqs authored
144
pengcheng authored
145
    /**
xqs authored
146
     * 查询容器有无任务
xqs authored
147
     */
xqs authored
148
149
150
151
    @Override
    public Integer UncompleteCount(String ContainerCode) {
        return taskHeaderMapper.UncompleteCount(ContainerCode, ShiroUtils.getWarehouseCode());
    }
wangyanxiong authored
152
153
154
    /**
     * 取消任务
155
     */
156
    @Override
xqs authored
157
    @Transactional
158
    public AjaxResult cancelTask(Integer[] taskIds) {
159
        for (int taskId : taskIds) {
160
            TaskHeader taskHeader = taskHeaderService.getById(taskId);
161
162
            if (taskHeader == null) {
                return AjaxResult.error("任务" + taskId + "未找到,操作中止");
163
            }
164
165
            if (taskHeader.getStatus() >= QuantityConstant.TASK_STATUS_RELEASE) {
                return AjaxResult.error("存在任务" + taskHeader.getId() + "已下发或执行,操作中止");
166
            }
xqs authored
167
168
169
170
171
172
173
174
            //查出任务明细
            TaskDetail taskDetail1 = new TaskDetail();
            taskDetail1.setTaskId(taskHeader.getId());
            taskDetail1.setWarehouseCode(taskHeader.getWarehouseCode());
            taskDetail1.setCompanyCode(taskHeader.getCompanyCode());
            LambdaQueryWrapper<TaskDetail> td = Wrappers.lambdaQuery(taskDetail1);
            List<TaskDetail> taskDetailList = taskDetailService.list(td);
            TaskDetail taskDetail = taskDetailList.get(0);
175
            if (taskDetail == null) {
xqs authored
176
177
                throw new ServiceException("任务明细条目错误");
            }
178
179
            //删除子任务
            LambdaQueryWrapper<TaskDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
180
            lambdaQueryWrapper.eq(TaskDetail::getTaskId, taskHeader.getId());
181
182
183
184
            taskDetailService.remove(lambdaQueryWrapper);
            //删除主任务
            taskHeaderService.removeById(taskHeader.getId());
            // 更改库位状态(整盘入库任务除外)
185
186
187
            if (taskHeader.getInternalTaskType() == QuantityConstant.TASK_INTENERTYPE_SHELF) {
                ReceiptContainerHeader record = new ReceiptContainerHeader();
                record.setStatus((short) QuantityConstant.RECEIPT_CONTAINER_BUILD.intValue());
188
                record.setId(taskHeader.getAllocationHeadId());
189
190
191
                if (!receiptContainerHeaderService.updateById(record)) {
                    throw new ServiceException("回滚组盘明细失败");
                }
192
193
194
            }
            //根据任务类型来更新货箱状态
            //修改关联的货箱状态
195
            if (taskHeader.getInternalTaskType() == QuantityConstant.TASK_INTENERTYPE_PICKING) {
196
197
                ShipmentContainerHeader shipmentContainerHeader = new ShipmentContainerHeader();
                shipmentContainerHeader.setId(taskHeader.getAllocationHeadId());
pengcheng authored
198
                shipmentContainerHeader.setStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
199
200
                shipmentContainerHeaderService.updateById(shipmentContainerHeader);
            }
xqs authored
201
            //盘点取消任务,恢复明细状态为1
202
            if (taskHeader.getInternalTaskType() == QuantityConstant.TASK_INTENERTYPE_CYCLECOUNT) {
xqs authored
203
204
205
206
207
208
209
210
211
212

                CycleCountDetail cycleCountDetail = new CycleCountDetail();
                cycleCountDetail.setCompanyCode(taskDetail.getCompanyCode());
                cycleCountDetail.setWarehouseCode(taskDetail.getWarehouseCode());
                cycleCountDetail.setLocationCode(taskDetail.getFromLocation());
                cycleCountDetail.setContainerCode(taskDetail.getContainerCode());
                cycleCountDetail.setCycleCountHeadCode(taskDetail.getBillCode());//盘点单Code
                cycleCountDetail.setId(taskDetail.getBillDetailId());//盘点细单ID
                LambdaQueryWrapper<CycleCountDetail> lam = Wrappers.lambdaQuery(cycleCountDetail);
                List<CycleCountDetail> cycleCountDetailList = cycleCountDetailService.list(lam);//
213
                for (CycleCountDetail item : cycleCountDetailList) {
xqs authored
214
215
216
217
218
219
220
221
222
                    item.setTaskHeaderId(null);
                    item.setTaskHeaderId(null);
                    item.setLastUpdated(new Date());
                    item.setLastUpdatedBy(ShiroUtils.getLoginName());
                    item.setEnableStatus(1);
                    cycleCountDetailService.saveOrUpdate(item);
                }

            }
223
224
            if (taskHeader.getInternalTaskType() == QuantityConstant.TASK_INTENERTYPE_SHELF || taskHeader.getInternalTaskType() == QuantityConstant.TASK_INTENERTYPE_PICKING) {
                if (taskHeader.getToLocation() != null) {
225
226
227
228
229
230
231
232
233
234
235
236
                    //更新托盘、库位状态
                    locationService.updateStatus(taskHeader.getToLocation(), "empty");
                }
            }
//            if(task.getType()==900){
//                //出库查看任务没有关联的货箱,不做处理
//            }
        }

        return AjaxResult.success("取消任务成功!");
    }
pengcheng authored
237
238
    /**
     * 生成出库任务
wangyanxiong authored
239
     *
pengcheng authored
240
241
242
243
244
     * @param shipmentTaskCreateModel
     * @return
     */
    @Override
    @Transactional
wangyanxiong authored
245
    public AjaxResult createTaskFromShipmentContainers(ShipmentTaskCreateModel shipmentTaskCreateModel) {
246
        Boolean flag = true;
pengcheng authored
247
248
249
        Integer shipmentContainerHeaderId = shipmentTaskCreateModel.getShipmentContainerHeaderIds();
        //获取表头
        ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.getById(shipmentContainerHeaderId);
wangyanxiong authored
250
        if (shipmentContainerHeader == null) {
pengcheng authored
251
252
            return AjaxResult.error("出库货箱" + shipmentContainerHeaderId + "未找到,操作中止");
        }
pengcheng authored
253
        if (shipmentContainerHeader.getStatus() >= QuantityConstant.SHIPMENT_CONTAINER_TASK) {
pengcheng authored
254
255
256
            return AjaxResult.error("出库货箱" + shipmentContainerHeader.getContainerCode() + "已经生成任务,请不要重复生成,操作中止");
        }
        //获取所有子货箱
wangyanxiong authored
257
258
        LambdaQueryWrapper<ShipmentContainerDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ShipmentContainerDetail::getShippingContainerId, shipmentContainerHeader.getId());
pengcheng authored
259
        List<ShipmentContainerDetail> shipmentContainerDetails = shipmentContainerDetailService.list(lambdaQueryWrapper);
wangyanxiong authored
260
        if (shipmentContainerDetails == null || shipmentContainerDetails.size() == 0) {
pengcheng authored
261
262
263
            return AjaxResult.error("货箱" + shipmentContainerHeader.getContainerCode() + "没有子任务,操作中止");
        }
        //检测库位
wangyanxiong authored
264
265
266
267
        LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
        locationLambdaQueryWrapper.eq(Location::getCode, shipmentContainerHeader.getLocationCode())
                .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .eq(Location::getDeleted, false);
pengcheng authored
268
        Location location = locationService.getOne(locationLambdaQueryWrapper);
wangyanxiong authored
269
        if (location == null) {
pengcheng authored
270
271
272
273
274
            return AjaxResult.error("库位禁用或不存在!");
        }
        //创建任务头
        TaskHeader task = new TaskHeader();
        //分拣出库
pengcheng authored
275
        task.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
276
        task.setFromLocation(shipmentContainerHeader.getLocationCode());
mahuandong authored
277
        task.setToLocation(shipmentContainerHeader.getLocationCode());
pengcheng authored
278
        //判断是否整出任务,钱柜和AGV不能整出
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
        //表示整出优先
        //判断当前子货箱所有数量是否等于该托盘对应的所有库存的数量,
        //这里必须与库存的在库数量对比,后期可能存在一个配盘在执行任务,后一个配盘又在配这个的情况(这个时候不能整出)
        // 如果相等,则说明这个货箱包含了所有的数量,则可以整出,否则,创建拣选任务;
        //查询所有库存
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getLocationCode, shipmentContainerHeader.getLocationCode())
                .eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
        List<InventoryDetail> inventories = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
        BigDecimal inventoryTotal = new BigDecimal("0");
        for (InventoryDetail item : inventories) {
            inventoryTotal = inventoryTotal.add(item.getQty());
        }
        BigDecimal containerTotal = new BigDecimal("0");
        for (ShipmentContainerDetail item : shipmentContainerDetails) {
            containerTotal = containerTotal.add(item.getQty());
        }
        if (inventoryTotal.compareTo(containerTotal) == 0) {
            task.setTaskType(QuantityConstant.TASK_TYPE_WHOLESHIPMENT);//整盘出库
            task.setToLocation("");
        }
301
pengcheng authored
302
        task.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_PICKING);
303
        task.setAllocationHeadId(shipmentContainerHeader.getId());
pengcheng authored
304
305
306
307
        task.setWarehouseCode(shipmentContainerHeader.getWarehouseCode());
        task.setCompanyCode(shipmentContainerHeader.getCompanyCode());
        task.setAssignedUser(ShiroUtils.getLoginName());
        task.setConfirmedBy(ShiroUtils.getLoginName());
pengcheng authored
308
        task.setStatus(QuantityConstant.TASK_STATUS_BUILD);
pengcheng authored
309
310
311
312
313
314
315
        task.setContainerCode(shipmentContainerHeader.getContainerCode());
        task.setCreatedBy(ShiroUtils.getLoginName());
        task.setCreated(new Date());
        task.setLastUpdatedBy(ShiroUtils.getLoginName());
        task.setLastUpdated(null);
        this.save(task);
        //遍历子货箱创建子任务
wangyanxiong authored
316
        for (ShipmentContainerDetail shipmentContainerDetail : shipmentContainerDetails) {
pengcheng authored
317
318
            TaskDetail taskDetail = new TaskDetail();
            taskDetail.setTaskId(task.getId());
319
            taskDetail.setInternalTaskType(task.getInternalTaskType());
pengcheng authored
320
321
            taskDetail.setWarehouseCode(task.getWarehouseCode());
            taskDetail.setCompanyCode(task.getCompanyCode());
322
            taskDetail.setTaskType(task.getTaskType());
pengcheng authored
323
            taskDetail.setToInventoryId(shipmentContainerDetail.getInventoryId());
324
            taskDetail.setAllocationId(shipmentContainerDetail.getId());
pengcheng authored
325
326
327
328
            taskDetail.setBillCode(shipmentContainerDetail.getShipmentCode());
            taskDetail.setBillDetailId(shipmentContainerDetail.getShipmentDetailId());
            taskDetail.setMaterialCode(shipmentContainerDetail.getMaterialCode());
            taskDetail.setMaterialName(shipmentContainerDetail.getMaterialName());
pengcheng authored
329
330
            taskDetail.setMaterialSpec(shipmentContainerDetail.getMaterialSpec());
            taskDetail.setMaterialUnit(shipmentContainerDetail.getMaterialUnit());
pengcheng authored
331
332
333
            taskDetail.setFromInventoryId(shipmentContainerDetail.getInventoryId());
            taskDetail.setQty(shipmentContainerDetail.getQty());
            taskDetail.setContainerCode(task.getContainerCode());
mahuandong authored
334
335
            taskDetail.setFromLocation(task.getFromLocation());
            taskDetail.setToLocation(task.getToLocation());
336
337
338
            taskDetail.setLot(shipmentContainerDetail.getLot());
            taskDetail.setBatch(shipmentContainerDetail.getBatch());
            taskDetail.setProjectNo(shipmentContainerDetail.getProjectNo());
pengcheng authored
339
            taskDetail.setStatus(QuantityConstant.TASK_STATUS_BUILD);
pengcheng authored
340
            taskDetail.setWaveId(shipmentContainerDetail.getWaveId());
pengcheng authored
341
            taskDetail.setInventorySts(shipmentContainerDetail.getInventorySts());
342
            taskDetail.setCreatedBy(ShiroUtils.getLoginName());
pengcheng authored
343
            taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
344
345
            flag = taskDetailService.save(taskDetail);
            if (flag == false) {
346
347
348
                throw new ServiceException("新建任务明细失败,sql报错");
            }
pengcheng authored
349
            shipmentContainerDetail.setStatus(QuantityConstant.SHIPMENT_CONTAINER_TASK);
pengcheng authored
350
351
        }
        //更新货位状态
pengcheng authored
352
        shipmentContainerHeader.setStatus(QuantityConstant.SHIPMENT_CONTAINER_TASK);
353
        flag = shipmentContainerHeaderService.updateById(shipmentContainerHeader);
354
        if (flag == false) {
355
356
357
358
            throw new ServiceException("修改组盘头状态失败,sql报错");
        }

        flag = shipmentContainerDetailService.updateBatchById(shipmentContainerDetails);
359
        if (flag == false) {
360
361
            throw new ServiceException("修改组盘明细状态明细失败,sql报错");
        }
pengcheng authored
362
363
364
        return AjaxResult.success(task.getId());

    }
wangyanxiong authored
365
wangyanxiong authored
366
    /**
367
     * 下发WCS执行任务
wangyanxiong authored
368
     * 执行任务
369
     */
wangyanxiong authored
370
    @Override
371
    @Transactional
wangyanxiong authored
372
    public AjaxResult<TaskHeader> sendTaskToWcs(Integer[] taskIds) {
wangyanxiong authored
373
374
        TaskHeader task = null;
        for (Integer taskId : taskIds) {
wangyanxiong authored
375
            task = taskHeaderService.getById(taskId);
376
pengcheng authored
377
            if (task.getStatus() >= QuantityConstant.TASK_STATUS_RELEASE) {
wangyanxiong authored
378
379
                return AjaxResult.error("任务" + taskId + "已经下发,请不要重复下发,操作中止");
            }
pengcheng authored
380
381
382
            // 给wcs传递任务
            taskAssignService.wcsTaskAssign(task);
wangyanxiong authored
383
            //修改任务头表
384
            task.setId(taskId);
pengcheng authored
385
            task.setStatus(QuantityConstant.TASK_STATUS_RELEASE);
wangyanxiong authored
386
387
388
            task.setStartPickDateTime(new Date());   //生成时间
            task.setLastUpdated(new Date());
            task.setLastUpdatedBy(ShiroUtils.getLoginName());
389
            taskHeaderService.saveOrUpdate(task);
wangyanxiong authored
390
            //修改任务明细状态
391
392
393
394
            LambdaQueryWrapper<TaskDetail> lambdaWrapper = Wrappers.lambdaQuery();
            lambdaWrapper.eq(TaskDetail::getTaskId, task.getId());
            List<TaskDetail> taskDetailList = taskDetailService.list(lambdaWrapper);
            List<TaskDetail> taskDetails = new ArrayList<>();
395
            for (TaskDetail item : taskDetailList) {
pengcheng authored
396
                item.setStatus(QuantityConstant.TASK_STATUS_RELEASE);
397
398
399
400
401
                item.setLastUpdated(new Date());
                item.setLastUpdatedBy(ShiroUtils.getLoginName());
                item.setProcessStamp("100");
                taskDetails.add(item);
                //盘点执行修改盘点单据状态为10
402
403
                if (task.getTaskType() == QuantityConstant.TASK_TYPE_CYCLECOUNT) {
                    cycleCountDetailService.updataDetailStatus(item.getBillDetailId(), QuantityConstant.CYCLECOUNT_STATUS_EXECUTING);
404
                }
405
            }
406
            if (!taskDetailService.saveOrUpdateBatch(taskDetails)) {
407
408
                throw new ServiceException("更新任务明细失败");
            }
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
//            //修改入库明细
//            if (task.getInternalTaskType()==100){
//                ReceiptDetail receiptDetail = receiptDetailService.queryflow(receiptDetailService.getById(record.getId()));
//                if (!receiptDetailService.updateById(receiptDetail)){
//                    throw new ServiceException("更新状态失败");
//                }
//                receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
//
//                //修改组盘表状态为20
//                ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
//                receiptContainerDetail.setStatus(20);
//                receiptContainerDetail.setLastUpdated(new Date());
//                receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
//                LambdaUpdateWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
//                receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getReceiptId,receiptDetail.getReceiptId());
//                if (! receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper))
//                    throw new ServiceException("更新组盘状态失败");
//            }
//
//            //修改出库单状态
//            if (task.getInternalTaskType()==200){
//                LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
//                taskDetailLambdaQueryWrapper.eq(TaskDetail::getTaskId,task.getId());
//               List<TaskDetail> taskDetailList = taskDetailService.list(taskDetailLambdaQueryWrapper);
//
//                for (TaskDetail taskDeatails: taskDetailList) {
//                    LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
//                    shipmentDetailLambdaQueryWrapper.eq(ShipmentDetail::getId,taskDeatails.getBillDetailId());
//
//                    ShipmentHeader shipmentHeader =new ShipmentHeader();
//                    shipmentHeader.setId(shipmentDetailService.getOne(shipmentDetailLambdaQueryWrapper).getShipmentId());
//                    shipmentHeader.setFirstStatus(100);
//                    shipmentHeader.setLastStatus(100);
//                    shipmentHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
//                    shipmentHeader.setLastUpdated(new Date());
//                    shipmentHeaderService.updateById(shipmentHeader);
//                }
//            }
wangyanxiong authored
449
        }
xqs authored
450
        return AjaxResult.success("执行下发任务成功", task);
wangyanxiong authored
451
452
453
    }

    @Override
xqs authored
454
    @Transactional
455
    public AjaxResult completeTaskByWMS(Integer[] taskIds) {
wangyanxiong authored
456
457
458
459
460
461
        for (int taskId : taskIds) {
            TaskHeader task = taskHeaderService.getById(taskId);
            if (task == null) {
                throw new ServiceException("任务" + taskId + "未找到,执行中止");
            }
            //如果已完成则不管
pengcheng authored
462
            if (task.getStatus() == QuantityConstant.TASK_STATUS_COMPLETED) {
wangyanxiong authored
463
464
465
                throw new ServiceException("任务(" + taskId + ")任务已经是完成的!");
            }
            //如果没有库位不能完成
466
467
468
//            if (StringUtils.isEmpty(task.getFromLocation())) {
//                throw new ServiceException("任务" + taskId + "没有库位,执行中止");
//            }
wangyanxiong authored
469
            this.completeTask(task);
470
wangyanxiong authored
471
472
473
474
475
476
477
478
479
480
        }

        return AjaxResult.success("完成任务成功!");
    }

    /**
     * 完成任务
     *
     * @param task
     */
xqs authored
481
482
    @Transactional
    public void completeTask(TaskHeader task) {
wangyanxiong authored
483
        //区分任务类型
pengcheng authored
484
        if (task.getInternalTaskType() == QuantityConstant.TASK_INTENERTYPE_SHELF) {
wangyanxiong authored
485
486
487
            //入库任务
            completeReceiptTask(task);
        }
pengcheng authored
488
        if (task.getInternalTaskType() == QuantityConstant.TASK_INTENERTYPE_PICKING) {
489
490
//            出库任务
            completeShipmentTask(task);
wangyanxiong authored
491
        }
492
        // 900 出库查看,空托出库查看
493
        if (task.getTaskType() == QuantityConstant.TASK_TYPE_VIEW) {
494
            completeSeeOutTask(task);
wangyanxiong authored
495
        }
496
        // 700 盘点
497
        if (task.getTaskType() == QuantityConstant.TASK_TYPE_CYCLECOUNT) {
498
499
            completeCycleCountTask(task);
        }
pengcheng authored
500
        if (task.getTaskType() == QuantityConstant.TASK_TYPE_TRANSFER) {
xqs authored
501
//          //移库
502
            completeTransferTask(task);
wangyanxiong authored
503
        }
pengcheng authored
504
        if (task.getTaskType() == QuantityConstant.TASK_TYPE_EMPTYRECEIPT) {
xqs authored
505
            //空托盘入库
506
            completeEmptyIn(task);
wangyanxiong authored
507
        }
pengcheng authored
508
        if (task.getTaskType() == QuantityConstant.TASK_TYPE_EMPTYSHIPMENT) {
509
            //空托盘出库
xqs authored
510
            completeEmptyOut(task);
wangyanxiong authored
511
512
513
        }
    }
514
515

    /**
516
     * 完成入库任务
xqs authored
517
     */
wangyanxiong authored
518
    @Override
519
    @Transactional
520
    public AjaxResult completeReceiptTask(TaskHeader task) {
xqs authored
521
522
        List<Map<String, Object>> taskReceiptContainerDetail = taskHeaderMapper.getReceiptTask(task.getId());
        if (taskReceiptContainerDetail.size() < 1) {
523
524
            return AjaxResult.success("未找到对应任务的入库单号!!!");
        }
wangyanxiong authored
525
526
        for (Map<String, Object> map : taskReceiptContainerDetail) {
            //将未完成的任务数量更新到库存表
pengcheng authored
527
            if (DataUtils.getInteger(map.get("status")) < QuantityConstant.TASK_STATUS_COMPLETED) {
xqs authored
528
529
530
531
532
533
534
                LambdaQueryWrapper<InventoryDetail> inventory = Wrappers.lambdaQuery();
                inventory.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
                        .eq(InventoryDetail::getLocationCode, task.getFromLocation())
                        .eq(InventoryDetail::getReceiptDetailId, DataUtils.getString(map.get("receiptDetailId")))
                        .eq(InventoryDetail::getContainerCode, DataUtils.getString(map.get("containerCode")));
                InventoryDetail detail = inventoryDetailService.getOne(inventory);
                if (detail == null) {
535
536
537
538
539
                    //添加库存单
                    InventoryHeader header = new InventoryHeader();
                    header.setWarehouseCode(DataUtils.getString(map.get("warehouseCode")));//仓库
                    header.setCompanyCode(task.getCompanyCode());//货主
                    header.setContainerCode(DataUtils.getString(map.get("containerCode")));//容器号
540
                    header.setLocationCode(task.getToLocation());
541
542
543
544
545
546
                    header.setTotalQty(DataUtils.getInteger(map.get("totalQty")));//总数量
                    header.setLocking(1);
                    header.setEnable(1);
                    header.setCreatedBy(ShiroUtils.getLoginName());
                    header.setCreated(new Date());
                    header.setLastUpdated(new Date());
wangyanxiong authored
547
548
549
                    if (!inventoryHeaderService.save(header))
                        throw new ServiceException("添加库存单失败");
550
551
552
553
554
                    //库存明细添加
                    detail = new InventoryDetail();
                    detail.setInventoryHeaderId(header.getId());//库存头ID
                    detail.setWarehouseCode(DataUtils.getString(map.get("warehouseCode")));//仓库
                    detail.setCompanyCode(task.getCompanyCode());//货主
mahuandong authored
555
                    detail.setLocationCode(task.getToLocation());//库位号
556
557
558
559
                    detail.setContainerCode(DataUtils.getString(map.get("containerCode")));//容器号
                    detail.setMaterialCode(DataUtils.getString(map.get("materialCode")));//物料号
                    detail.setMaterialName(DataUtils.getString(map.get("materialName")));//物料名称
                    detail.setMaterialSpec(DataUtils.getString(map.get("materialSpec")));//物料规格
560
                    detail.setMaterialUnit(DataUtils.getString(map.get("materialUnit")));//物料单位
561
                    detail.setReceiptCode(DataUtils.getString(map.get("receiptCode")));//入库单编码
xqs authored
562
                    detail.setReceiptDetailId(DataUtils.getInteger(map.get("receiptDetailId")));//入库单明细ID
563
564
565
                    detail.setBatch(DataUtils.getString(map.get("batch")));//批次
                    detail.setLot(DataUtils.getString(map.get("lot")));//批号
                    detail.setInventorySts(DataUtils.getString(map.get("inventorySts")));//库存状态
xqs authored
566
//                    detail.setManufactureDate(new SimpleDateFormat("yyyy-MM-dd").parse(map.get("manufactureDate").toString()));//生产日期
567
//                    detail.setExpirationDate(new SimpleDateFormat("yyyy-MM-dd").parse(map.get("expirationDate").toString()));//失效日期
568
                    detail.setQty(DataUtils.getBigDecimal(map.get("qty")));//数量
569
                    detail.setTaskQty(DataUtils.getBigDecimal(0));
570
571
                    detail.setCreatedBy(ShiroUtils.getLoginName());//创建人
                    detail.setLastUpdatedBy(ShiroUtils.getLoginName());//创建时间
wangyanxiong authored
572
573
                    if (!inventoryDetailService.save(detail))
                        throw new ServiceException("添加库存明细失败");
574
                } else {
575
576
577
                    detail.setQty(detail.getQty().add(DataUtils.getBigDecimal(map.get("qty"))));
                    detail.setLastUpdatedBy(ShiroUtils.getLoginName());
                    LambdaUpdateWrapper<InventoryDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
578
                    lambdaUpdateWrapper.eq(InventoryDetail::getId, DataUtils.getInteger(map.get("receiptDetailId")));
579
                    if (!inventoryDetailService.update(detail, lambdaUpdateWrapper))
wangyanxiong authored
580
                        throw new ServiceException("更新入库单明细失败");
581
582
583
584
                }
                //记录库存交易记录
                InventoryTransaction inventoryTransaction = new InventoryTransaction();
pengcheng authored
585
                inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT);
586
587
                inventoryTransaction.setWarehouseCode(DataUtils.getString(map.get("warehouseCode")));
                inventoryTransaction.setCompanyCode(task.getCompanyCode());
mahuandong authored
588
                inventoryTransaction.setLocationCode(task.getToLocation());
589
590
591
                inventoryTransaction.setContainerCode(DataUtils.getString(map.get("containerCode")));
                inventoryTransaction.setMaterialCode(DataUtils.getString(map.get("materialCode")));
                inventoryTransaction.setMaterialName(DataUtils.getString(map.get("materialName")));
592
593
                inventoryTransaction.setMaterialSpec(DataUtils.getString(map.get("materialSpec")));//物料规格
                inventoryTransaction.setMaterialUnit(DataUtils.getString(map.get("materialUnit")));//物料单位
594
                inventoryTransaction.setBillCode(DataUtils.getString(map.get("receiptCode")));
xqs authored
595
                inventoryTransaction.setBillDetailId(DataUtils.getInteger(map.get("receiptDetailId")));
596
597
598
                inventoryTransaction.setBatch(DataUtils.getString(map.get("batch")));
                inventoryTransaction.setLot(DataUtils.getString(map.get("lot")));
                inventoryTransaction.setInventorySts(DataUtils.getString((map.get("inventorySts"))));
xqs authored
599
                inventoryTransaction.setTaskQty(DataUtils.getBigDecimal(map.get("qty")));
600
601
                inventoryTransaction.setCreated(new Date());
                inventoryTransaction.setCreatedBy(ShiroUtils.getLoginName());
602
603
                if (!inventoryTransactionService.save(inventoryTransaction))
                    throw new ServiceException("新增库存记录失败");
xqs authored
604
605
                //修改任务明细的状态为完成
                TaskDetail taskDetail = new TaskDetail();
pengcheng authored
606
                taskDetail.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
xqs authored
607
608
609
                taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
                taskDetail.setAgingDate(new Date());   //入库时间
                LambdaUpdateWrapper<TaskDetail> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
610
                lambdaUpdateWrapper.eq(TaskDetail::getTaskId, task.getId());
xqs authored
611
                taskDetailService.update(taskDetail, lambdaUpdateWrapper);
612
                if (!taskDetailService.update(taskDetail, lambdaUpdateWrapper)) {
613
614
                    throw new ServiceException("修改入库单明细失败");
                }
xqs authored
615
xqs authored
616
                //修改任务主表状态,因为立库任务表单头只对应一个货箱,表单详情的任务会同时完成
pengcheng authored
617
                task.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
xqs authored
618
619
620
621
                task.setLastUpdatedBy(ShiroUtils.getLoginName());
                task.setLastUpdated(new Date());
                LambdaUpdateWrapper<TaskHeader> taskHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
                taskHeaderLambdaUpdateWrapper.eq(TaskHeader::getId, task.getId());
wangyanxiong authored
622
623
                if (!taskHeaderService.update(task, taskHeaderLambdaUpdateWrapper))
                    throw new ServiceException("更新任务主表失败");
624
625
626

                //修改库位状态和对应的容器
                Location location = new Location();
xqs authored
627
628
                location.setContainerCode(task.getContainerCode());
                location.setStatus("empty");
629
                LambdaUpdateWrapper<Location> locationLambdaUpdateWrapper = Wrappers.lambdaUpdate();
mahuandong authored
630
                locationLambdaUpdateWrapper.eq(Location::getCode, task.getToLocation());
631
                if (!locationService.update(location, locationLambdaUpdateWrapper))
wangyanxiong authored
632
                    throw new ServiceException("更新库位失败");
633
634
635

                //修改容器状态和对应的库位
                Container container = new Container();
mahuandong authored
636
                container.setLocationCode(task.getToLocation());
xqs authored
637
                container.setStatus("some");
638
                LambdaUpdateWrapper<Container> containerLambdaUpdateWrapper = Wrappers.lambdaUpdate();
wangyanxiong authored
639
                containerLambdaUpdateWrapper.eq(Container::getCode, task.getContainerCode());
640
                if (!containerService.update(container, containerLambdaUpdateWrapper)) {
wangyanxiong authored
641
                    throw new ServiceException("更新容器失败");
642
                }
643
                //修改组盘表状态为20
mahuandong authored
644
                ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
pengcheng authored
645
                receiptContainerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_REVIEWSUCCESS);
646
647
648
                receiptContainerDetail.setProcessStamp("0");
                receiptContainerDetail.setLastUpdated(new Date());
                receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
mahuandong authored
649
                LambdaUpdateWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
xqs authored
650
                receiptContainerDetailLambdaUpdateWrapper.eq(ReceiptContainerDetail::getReceiptId, DataUtils.getInteger(map.get("receiptId")));
651
                if (!receiptContainerDetailService.update(receiptContainerDetail, receiptContainerDetailLambdaUpdateWrapper))
wangyanxiong authored
652
                    throw new ServiceException("更新组盘状态失败");
653
654
655
656
657
658
659
660

                //修改入库组盘头表状态

                ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
                receiptContainerHeader.setId(task.getAllocationHeadId());
                receiptContainerHeader.setLastUpdated(new Date());
                receiptContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
pengcheng authored
661
                receiptContainerHeader.setStatus((short) QuantityConstant.RECEIPT_CONTAINER_FINISHED.intValue());
662
                if (!receiptContainerHeaderService.updateById(receiptContainerHeader)) {
663
664
665
                    throw new ServiceException("更新入库组盘头表状态失败");
                }
666
667
                //修改入库单状态
                ReceiptHeader receiptHeader = new ReceiptHeader();
pengcheng authored
668
669
                receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
                receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
670
671
672
                receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
                receiptHeader.setLastUpdated(new Date());
                LambdaUpdateWrapper<ReceiptHeader> receiptHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
673
674
                receiptHeaderLambdaUpdateWrapper.eq(ReceiptHeader::getId, DataUtils.getInteger(map.get("receiptId")));
                if (!receiptHeaderService.update(receiptHeader, receiptHeaderLambdaUpdateWrapper)) {
675
                    throw new ServiceException("更新入库头表状态失败");
676
                }
677
678
679
680
681
                /* 物料预警*/
                configWarningService.materialWarning(String.valueOf(map.get("materialCode")), String.valueOf(map.get("materialName")));
                /* 空库位剩余数量预警*/
                configWarningService.emptyLocationWarning();
682
683
            }
wangyanxiong authored
684
        }
mahuandong authored
685
        return AjaxResult.success("完成入库任务");
wangyanxiong authored
686
    }
wangyanxiong authored
687
688
689
690
691
692

//    @Override
//    public List<Map<String, Object>> getReceiptTask(Integer taskId) {
//        return taskHeaderMapper.getReceiptTask(taskId) ;
//    }
xqs authored
693
    /**
694
     * 生成
xqs authored
695
     * 立库移库
xqs authored
696
     */
xqs authored
697
    @Transactional
698
    public AjaxResult createTransferTask(String sourceLocation, String destinationLocation) {
xqs authored
699
700
701
        //源库位校验
        Location temp1 = new Location();
xqs authored
702
        temp1.setCode(sourceLocation);
703
704
705
        temp1.setWarehouseCode(ShiroUtils.getWarehouseCode());
        LambdaQueryWrapper<Location> lambda1 = Wrappers.lambdaQuery();
        Location loc1 = locationService.getOne(lambda1);
xqs authored
706
707
        if (loc1 == null) {
            return AjaxResult.error("源库位:" + sourceLocation + "未找到");
xqs authored
708
        }
xqs authored
709
710
        if (!loc1.getStatus().equals("empty")) {
            return AjaxResult.error("源库位:" + sourceLocation + "状态非空闲");
xqs authored
711
        }
xqs authored
712
713
        if (StringUtils.isEmpty(loc1.getContainerCode())) {
            return AjaxResult.error("源库位:" + sourceLocation + "不存在托盘");
xqs authored
714
715
716
        }
        //这里增加组盘校验,如果此托盘存在未完成的组盘数据,则不能移库
        //校验入库组盘
xqs authored
717
718
719
        int count1 = inventoryHeaderService.getUncompleteReceiptContainer(sourceLocation, ShiroUtils.getWarehouseCode());
        if (count1 > 0) {
            return AjaxResult.error("源库位:" + sourceLocation + "存在入库组盘,不能移库");
xqs authored
720
        }
xqs authored
721
722
723
        int count2 = inventoryHeaderService.getUncompleteShipmentContainer(sourceLocation, ShiroUtils.getWarehouseCode());
        if (count2 > 0) {
            return AjaxResult.error("源库位:" + sourceLocation + "存在出库组盘,不能移库");
xqs authored
724
        }
725
        //目的库位校验
xqs authored
726
        Location temp2 = new Location();
727
        temp2.setWarehouseCode(ShiroUtils.getWarehouseCode());
xqs authored
728
        temp2.setCode(destinationLocation);
729
730
        LambdaQueryWrapper<Location> lambdaQueryWrapper2 = Wrappers.lambdaQuery(temp2);
        Location loc2 = locationService.getOne(lambdaQueryWrapper2);
xqs authored
731
732
        if (loc2 == null) {
            return AjaxResult.error("目标库位:" + destinationLocation + "未找到");
xqs authored
733
        }
xqs authored
734
735
        if (!loc2.getStatus().equals("empty")) {
            return AjaxResult.error("目标库位:" + destinationLocation + "状态非空闲");
xqs authored
736
        }
xqs authored
737
738
        if (StringUtils.isNotEmpty(loc2.getContainerCode())) {
            return AjaxResult.error("目标库位:" + destinationLocation + "已存在托盘");
xqs authored
739
        }
xqs authored
740
741
742
        int count3 = inventoryHeaderService.getUncompleteReceiptContainer(destinationLocation, ShiroUtils.getWarehouseCode());
        if (count3 > 0) {
            return AjaxResult.error("目标库位:" + sourceLocation + "存在入库组盘,不能移库");
xqs authored
743
        }
744
745
746
747
        //写入任务主表和明细表
        TaskHeader taskHeader = new TaskHeader();
        taskHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
        taskHeader.setCompanyCode(ShiroUtils.getCompanyCodeList().get(0));//获取第一个货主
pengcheng authored
748
749
        taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_CHECK);
        taskHeader.setTaskType(QuantityConstant.TASK_TYPE_TRANSFER);
750
        taskHeader.setContainerCode(loc1.getContainerCode());
pengcheng authored
751
        taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
        taskHeader.setFromLocation(sourceLocation);
        taskHeader.setToLocation(destinationLocation);
        taskHeader.setCreated(new Date());
        taskHeader.setCreatedBy(ShiroUtils.getLoginName());
        taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
        taskHeader.setLastUpdated(new Date());
        taskHeaderMapper.insert(taskHeader);

        //写入明细表
        TaskDetail taskDetail = new TaskDetail();
        taskDetail.setTaskId(taskHeader.getId());//主单ID
        taskDetail.setTaskType(taskHeader.getTaskType());
        taskDetail.setInternalTaskType(taskHeader.getTaskType());
        taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
        taskDetail.setCompanyCode(taskDetail.getCompanyCode());
        taskDetail.setFromLocation(sourceLocation);
        taskDetail.setToLocation(destinationLocation);
        taskDetail.setContainerCode(taskHeader.getContainerCode());
        taskDetail.setCreated(new Date());
        taskDetail.setCreatedBy(ShiroUtils.getLoginName());
        taskDetail.setLastUpdated(new Date());
        taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
        taskDetailService.save(taskDetail);
xqs authored
776
777
778
        //更新货位状态为预定
        loc1.setStatus("lock");
        loc2.setStatus("lock");
779
780
781
782
783
784
785
786
        locationService.saveOrUpdate(loc1);
        locationService.saveOrUpdate(loc2);
        return AjaxResult.success(taskHeader.getId());

    }

    /**
     * 完成移库任务
xqs authored
787
     *
788
789
     * @param task
     */
xqs authored
790
    @Transactional
xqs authored
791
    public void completeTransferTask(TaskHeader task) {
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
        //找到任务明细
        TaskDetail taskDetail = new TaskDetail();
        taskDetail.setTaskId(task.getId());
        taskDetail.setWarehouseCode(task.getWarehouseCode());
        taskDetail.setCompanyCode(task.getCompanyCode());
        taskDetail.setContainerCode(task.getContainerCode());
        LambdaQueryWrapper<TaskDetail> taskDetailLW = Wrappers.lambdaQuery(taskDetail);
        taskDetail = taskDetailService.getOne(taskDetailLW);
        //更新库存主表和明细的库位,更改更新用户和时间
        InventoryHeader inventoryHeader = new InventoryHeader();
        //主表
        inventoryHeader.setWarehouseCode(taskDetail.getWarehouseCode());
        inventoryHeader.setCompanyCode(taskDetail.getCompanyCode());
        inventoryHeader.setContainerCode(taskDetail.getContainerCode());
        inventoryHeader.setLocationCode(taskDetail.getFromLocation());//通过源库位查找库存
        LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(inventoryHeader);
        inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaQueryWrapper);
        inventoryHeader.setLocationCode(taskDetail.getToLocation());//把目的库位写入库存
        inventoryHeader.setLastUpdated(new Date());
        inventoryHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
        inventoryHeaderService.saveOrUpdate(inventoryHeader);//修改主表库位

        //明细表
        List<InventoryDetail> inventoryDetails = new ArrayList<>();
        InventoryDetail inventoryDetail = new InventoryDetail();
        inventoryDetail.setWarehouseCode(inventoryHeader.getWarehouseCode());
        inventoryDetail.setCompanyCode(inventoryHeader.getCompanyCode());
        inventoryDetail.setInventoryHeaderId(inventoryHeader.getId());
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(inventoryDetail);
xqs authored
821
        List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
822
823
        /*同时写入库存交易表*/
        List<InventoryTransaction> inventoryTransactionList = new ArrayList<>();
xqs authored
824
        for (InventoryDetail item : inventoryDetailList) {
825
826
827
828
            item.setLocationCode(inventoryHeader.getLocationCode());//修改明细表库位
            item.setLastUpdated(new Date());
            item.setLastUpdatedBy(ShiroUtils.getLoginName());
            inventoryDetails.add(item);
xqs authored
829
            /*----------*/
830
831
832
833
            InventoryTransaction inventoryTransaction = new InventoryTransaction();
            inventoryTransaction.setWarehouseCode(task.getWarehouseCode());
            inventoryTransaction.setLocationCode(taskDetail.getToLocation());
            inventoryTransaction.setContainerCode(taskDetail.getContainerCode());
pengcheng authored
834
            inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_ADJUSTPROPERTIES);
835
836
837
838
839
            inventoryTransaction.setMaterialCode(item.getMaterialCode());
            inventoryTransaction.setManufactureDate(item.getManufactureDate());
            inventoryTransaction.setMaterialName(item.getMaterialName());
            inventoryTransaction.setMaterialSpec(item.getMaterialSpec());
            inventoryTransaction.setMaterialUnit(item.getMaterialUnit());
xqs authored
840
            inventoryTransaction.setTaskQty(BigDecimal.ZERO);
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
            inventoryTransaction.setInventorySts(item.getInventorySts());
            //inventoryTransaction.setReferCode();
            //inventoryTransaction.setQcCheck();
            inventoryTransaction.setReferDetailId(item.getId().toString());
            inventoryTransaction.setBatch(item.getBatch());
            inventoryTransaction.setLot(item.getLot());
            inventoryTransaction.setProjectNo(item.getProjectNo());
            inventoryTransaction.setWeight(item.getWeight());
            inventoryTransaction.setManufactureDate(item.getManufactureDate());
            inventoryTransaction.setExpirationDate(item.getExpirationDate());
            inventoryTransaction.setAgingDate(item.getCreated());
            inventoryTransaction.setAttributeId(item.getAttributeId());
            inventoryTransaction.setAttribute1(item.getAttribute1());
            inventoryTransaction.setAttribute2(item.getAttribute2());
            inventoryTransaction.setAttribute3(item.getAttribute3());
            inventoryTransaction.setCreated(new Date());
            inventoryTransaction.setCreatedBy(ShiroUtils.getLoginName());
            //inventoryTransaction.setLockCode();
            inventoryTransaction.setBillCode(item.getInventoryHeaderId().toString());
            inventoryTransaction.setBillDetailId(item.getId());
            inventoryTransaction.setSupplierCode(item.getSupplierCode());
            inventoryDetailList.add(inventoryDetail);
        }
xqs authored
864
        if (inventoryDetailService.saveOrUpdateBatch(inventoryDetails)) {
865
866
            //更新库存明细成功后,写入库存交易
            inventoryTransactionService.saveBatch(inventoryTransactionList);
xqs authored
867
        } else {
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
            throw new ServiceException("库存明细更新错误!");
        }

        //更新托盘、库位状态
        Location temp1 = new Location(); //源库位
        temp1.setCode(taskDetail.getFromLocation());
        temp1.setWarehouseCode(ShiroUtils.getWarehouseCode());
        LambdaQueryWrapper<Location> lambdaQueryWrapper1 = Wrappers.lambdaQuery(temp1);
        Location loc1 = locationService.getOne(lambdaQueryWrapper1);

        Location temp2 = new Location();//目的库位
        temp2.setCode(taskDetail.getToLocation());
        temp2.setWarehouseCode(ShiroUtils.getWarehouseCode());
        LambdaQueryWrapper<Location> lambdaQueryWrapper2 = Wrappers.lambdaQuery(temp2);
        Location loc2 = locationService.getOne(lambdaQueryWrapper2);
        loc2.setContainerCode(loc1.getContainerCode());
        loc2.setStatus("empty");
        loc1.setContainerCode("");
        loc1.setStatus("empty");
        locationService.saveOrUpdate(loc1);
        locationService.saveOrUpdate(loc2);
        //更新taskHeader状态
pengcheng authored
890
        task.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
891
892
893
894
        task.setLastUpdatedBy(ShiroUtils.getLoginName());
        task.setLastUpdated(new Date());
        taskHeaderService.saveOrUpdate(task);
        //更新taskDetail状态
pengcheng authored
895
        taskDetail.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
896
897
898
        taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
        taskDetail.setLastUpdated(new Date());
        taskDetailService.saveOrUpdate(taskDetail);
xqs authored
899
900
    }
901
    /**
xqs authored
902
903
     * 生成
     * 出库查看
904
     * 任务
xqs authored
905
     */
906
907
908
909
    @Override
    @Transactional
    public AjaxResult createCheckOutTask(String[] ids) {
xqs authored
910
911
        for (String id : ids) {
            InventoryHeader inventoryHeader = inventoryHeaderService.getById(Integer.parseInt(id));
912
            //校验库位是否锁定
913
914
915
916
917
918
            //检查库位容器
            Location temp = new Location();
            temp.setCode(inventoryHeader.getLocationCode());
            temp.setWarehouseCode(inventoryHeader.getWarehouseCode());
            LambdaQueryWrapper<Location> lambdaQueryWrapper = Wrappers.lambdaQuery(temp);
            Location loc = locationService.getOne(lambdaQueryWrapper);
xqs authored
919
            if (loc == null) {
920
921
                throw new ServiceException("库存没有库位!");
            }
xqs authored
922
923
            if (!loc.getStatus().equals("empty")) {
                throw new ServiceException(inventoryHeader.getLocationCode() + "状态非空闲,操作失败");
924
            }
xqs authored
925
926
            if (StringUtils.isEmpty(loc.getContainerCode())) {
                throw new ServiceException(inventoryHeader.getLocationCode() + "没有容器,操作失败");
927
928
929
930
931
932
933
            }
            //通过库存头,找到库存明细
            InventoryDetail inventoryDetail = new InventoryDetail();
            inventoryDetail.setWarehouseCode(inventoryHeader.getWarehouseCode());
            inventoryDetail.setCompanyCode(inventoryHeader.getCompanyCode());
            inventoryDetail.setInventoryHeaderId(inventoryHeader.getId());
            LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(inventoryDetail);
xqs authored
934
            List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
935
936
937
938
939

            //写入任务主表
            TaskHeader taskHeader = new TaskHeader();
            taskHeader.setWarehouseCode(inventoryHeader.getWarehouseCode());
            taskHeader.setCompanyCode(inventoryHeader.getCompanyCode());//货主
pengcheng authored
940
941
            taskHeader.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_WORK);
            taskHeader.setTaskType(QuantityConstant.TASK_TYPE_VIEW);
942
            taskHeader.setContainerCode(inventoryHeader.getContainerCode());
pengcheng authored
943
            taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD);
944
945
946
947
948
949
950
951
952
            taskHeader.setFromLocation(inventoryHeader.getLocationCode());
            taskHeader.setToLocation(inventoryHeader.getLocationCode());
            taskHeader.setCreated(new Date());
            taskHeader.setCreatedBy(ShiroUtils.getLoginName());
            taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
            taskHeader.setLastUpdated(new Date());
            taskHeaderMapper.insert(taskHeader);
            //分拆库存明细,并写入任务细表
            List<TaskDetail> taskDetails = new ArrayList<>();
xqs authored
953
            for (InventoryDetail item : inventoryDetailList) {
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
                TaskDetail taskDetail = new TaskDetail();
                taskDetail.setTaskId(taskHeader.getId());//主单ID
                taskDetail.setTaskType(taskHeader.getTaskType());
                taskDetail.setInternalTaskType(taskHeader.getTaskType());
                taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
                taskDetail.setCompanyCode(item.getCompanyCode());
                taskDetail.setFromLocation(taskHeader.getFromLocation());
                taskDetail.setToLocation(taskHeader.getToLocation());
                taskDetail.setContainerCode(taskHeader.getContainerCode());
                taskDetail.setCreated(new Date());
                taskDetail.setCreatedBy(ShiroUtils.getLoginName());
                taskDetail.setLastUpdated(new Date());
                taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
                taskDetails.add(taskDetail);
xqs authored
969
970
971
            }
            if (taskDetailService.saveBatch(taskDetails)) {
                //锁定库位状态
972
                locationService.updateStatus(inventoryHeader.getLocationCode(), "lock");
xqs authored
973
974
975
            } else {
                throw new ServiceException("出库查看任务明细生成失败!");
            }
976
977
978
979
        }
        return AjaxResult.success("出库查看任务生成成功!");
    }
980
981
    /**
xqs authored
982
     * 完成
983
     * 出库查看
984
     * 更新状态即可
xqs authored
985
     */
986
987
    @Transactional
    @Override
988
    public AjaxResult completeSeeOutTask(TaskHeader taskHeader) {
pengcheng authored
989
        taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
990
991
992
993
994
995
996
997
998
        taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName()); //更新用户
        taskHeader.setLastUpdated(new Date());   //更新时间
        //task更新明细单总的状态
        TaskDetail taskDetail = new TaskDetail();
        taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
        taskDetail.setTaskType(taskHeader.getTaskType());
        taskDetail.setTaskId(taskHeader.getId());
        LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(taskDetail);
        List<TaskDetail> taskDetailList = taskDetailService.list(lambdaQueryWrapper);//查询子单
999
        List<TaskDetail> list = new CopyOnWriteArrayList<>();
1000
        for (TaskDetail item : taskDetailList) {
pengcheng authored
1001
            item.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
1002
1003
            item.setLastUpdatedBy(ShiroUtils.getLoginName()); //更新用户
            item.setLastUpdated(new Date());   //更新时间
1004
            list.add(item);
1005
        }
1006
1007
        if (taskDetailService.saveOrUpdateBatch(list) == false ||
                taskHeaderService.saveOrUpdate(taskHeader) == false) {
1008
1009
            throw new ServiceException("任务单据状态更新失败!");
        }
1010
        //释放库位状态
1011
        locationService.updateStatus(taskHeader.getFromLocation(), "empty");
xqs authored
1012
1013
1014
1015
        return AjaxResult.success("完成出库查看任务");
    }

    /**
1016
     * 盘点完成
1017
     *
1018
1019
1020
1021
1022
     * @param taskHeader
     * @return
     */
    @Transactional
    @Override
1023
    public AjaxResult completeCycleCountTask(TaskHeader taskHeader) {
1024
1025
1026
        /*盘点完成,传入任务主单,查出任务明细,通过任务明细查找盘点的明细单,
        完成任务同时,修改盘点细单和主单的状态,完成后库存锁复位*/
        //修改任务主单状态
pengcheng authored
1027
        taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
        taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName()); //更新用户
        taskHeader.setLastUpdated(new Date());   //更新时间
        //task更新明细单状态
        TaskDetail taskDetail = new TaskDetail();
        taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
        taskDetail.setTaskType(taskHeader.getTaskType());
        taskDetail.setTaskId(taskHeader.getId());
        LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(taskDetail);
        List<TaskDetail> taskDetailList = taskDetailService.list(lambdaQueryWrapper);//查询子单
        List<TaskDetail> list = new CopyOnWriteArrayList<>();
        //修改任务明细状态的同时查找到盘点明细的条目并修改状态,最后修改主单状态
        List<CycleCountDetail> cycleCountDetailList = new CopyOnWriteArrayList<>();
1040
        for (TaskDetail item : taskDetailList) {
pengcheng authored
1041
            item.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
1042
1043
1044
            item.setLastUpdatedBy(ShiroUtils.getLoginName()); //更新用户
            item.setLastUpdated(new Date());   //更新时间
            list.add(item);
1045
1046
            CycleCountDetail cycleCountDetail = cycleCountDetailService.getById(item.getBillDetailId());//盘点明细
pengcheng authored
1047
            cycleCountDetail.setEnableStatus(QuantityConstant.CYCLECOUNT_STATUS_COMPLETED);
1048
1049
1050
1051
1052
1053
1054
1055
            cycleCountDetail.setCompletedBy(ShiroUtils.getLoginName());
            cycleCountDetail.setCompletedAt(new Date());
            cycleCountDetailList.add(cycleCountDetail);
            //取消库存盘点锁
            InventoryDetail inventoryDetail = inventoryDetailService.getById(cycleCountDetail.getInventoryDetailId());
            inventoryDetail.setLockCode("");
            inventoryDetailService.saveOrUpdate(inventoryDetail);
        }
1056
        if (taskHeaderService.saveOrUpdate(taskHeader) == false ||
1057
1058
1059
1060
1061
1062
1063
1064
1065
                taskDetailService.saveOrUpdateBatch(list) == false ||
                cycleCountDetailService.saveOrUpdateBatch(cycleCountDetailList) == false) {
            throw new ServiceException("盘点任务单据状态更新失败!");
        }
        //更新主单状态
        cycleCountHeaderService.updataHeaderStatus(cycleCountDetailList.get(0).getCycleCountHeadCode());
        //释放库位
        locationService.updateStatus(cycleCountDetailList.get(0).getLocationCode(), "empty");
        return AjaxResult.success("完成盘点任务");
1066
1067
1068
1069

    }

    /**
xqs authored
1070
     * 完成空托盘入库任务
1071
     *
xqs authored
1072
1073
1074
1075
1076
1077
     * @param taskHeader
     */
    @Transactional
    public void completeEmptyIn(TaskHeader taskHeader) {

        //完成任务,修改主单和明细状态
pengcheng authored
1078
        taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
xqs authored
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
        taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
        taskHeader.setLastUpdated(new Date());
        //taskHeaderService.saveOrUpdate(taskHeader);
        //taskDetail更新明细单总的状态
        TaskDetail taskDetail = new TaskDetail();
        taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
        taskDetail.setTaskType(taskHeader.getTaskType());
        taskDetail.setTaskId(taskHeader.getId());
        LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(taskDetail);
        List<TaskDetail> taskDetailList = taskDetailService.list(lambdaQueryWrapper);//查询子单
        for (TaskDetail item : taskDetailList) {
pengcheng authored
1090
            item.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
xqs authored
1091
1092
1093
1094
            item.setLastUpdatedBy(ShiroUtils.getLoginName()); //更新用户
            item.setLastUpdated(new Date());   //更新时间
            taskDetailList.add(item);
        }
1095
1096
        if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false ||
                taskHeaderService.saveOrUpdate(taskHeader) == false) {
xqs authored
1097
1098
            throw new ServiceException("任务单据状态更新失败!");
        }
1099
        //解锁容器,更新库位
1100
        containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(), taskHeader.getToLocation(), "empty");
1101
        //解锁库位,更新容器
1102
        locationService.updateContainerCodeAndStatus(taskHeader.getToLocation(), taskHeader.getContainerCode(), "empty");
xqs authored
1103
1104
1105
1106
1107

    }

    /**
     * 完成空托盘出库任务
1108
     *
xqs authored
1109
1110
1111
1112
1113
     * @param taskHeader
     */
    @Transactional
    public void completeEmptyOut(TaskHeader taskHeader) {
pengcheng authored
1114
        taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
xqs authored
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
        taskHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
        taskHeader.setLastUpdated(new Date());
        //taskHeaderService.saveOrUpdate(taskHeader);
        //taskDetail更新明细单总的状态
        TaskDetail taskDetail = new TaskDetail();
        taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
        taskDetail.setTaskType(taskHeader.getTaskType());
        taskDetail.setTaskId(taskHeader.getId());
        LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(taskDetail);
        List<TaskDetail> taskDetailList = taskDetailService.list(lambdaQueryWrapper);//查询子单
        for (TaskDetail item : taskDetailList) {
pengcheng authored
1126
            item.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
xqs authored
1127
1128
1129
1130
1131
1132
1133
            item.setLastUpdatedBy(ShiroUtils.getLoginName()); //更新用户
            item.setLastUpdated(new Date());   //更新时间
            taskDetailList.add(item);
        }
        if (taskDetailService.saveOrUpdateBatch(taskDetailList) == false || taskHeaderService.saveOrUpdate(taskHeader) == false) {
            throw new ServiceException("任务单据状态更新失败!");
        }
1134
1135
1136
1137
1138
        //更新货位
        locationService.updateContainerCodeAndStatus(taskHeader.getFromLocation(), "", "empty");
        //更新容器信息
        containerService.updateLocationCodeAndStatus(taskHeader.getContainerCode(), "", "empty");
xqs authored
1139
1140
    }
mahuandong authored
1141
1142
    /**
     * 创建上架任务
1143
     *
mahuandong authored
1144
1145
1146
1147
     * @param ids
     * @return
     */
    @Override
1148
    @Transactional
mahuandong authored
1149
    public AjaxResult createReceiptTask(List<Integer> ids) {
xqs authored
1150
        for (Integer id : ids) {
mahuandong authored
1151
1152
1153
            ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getById(id);
            if (receiptContainerHeader == null)
                throw new ServiceException("任务不存在!");
1154
            if (!receiptContainerHeader.getWarehouseCode().equals(ShiroUtils.getWarehouseCode()))
mahuandong authored
1155
                throw new ServiceException("任务不在当前仓库!");
1156
1157
1158
1159
1160
1161
1162
1163
1164

            //锁定容器
            Container container = new Container();
            container.setStatus("lock");
            LambdaUpdateWrapper<Container> containerUpdateWrapper = Wrappers.lambdaUpdate();
            containerUpdateWrapper.eq(Container::getCode, receiptContainerHeader.getContainerCode());
            containerService.update(container, containerUpdateWrapper);

            //查询入库组盘明细
mahuandong authored
1165
            LambdaQueryWrapper<ReceiptContainerDetail> containerDetailLambda = Wrappers.lambdaQuery();
xqs authored
1166
            containerDetailLambda.eq(ReceiptContainerDetail::getReceiptContainerId, id);
mahuandong authored
1167
            List<ReceiptContainerDetail> list = receiptContainerDetailService.list(containerDetailLambda);
1168
mahuandong authored
1169
1170
            if (list.size() < 1)
                throw new ServiceException("没有组盘明细,请先组盘!");
pengcheng authored
1171
1172
1173
            if (receiptContainerHeader.getStatus() == QuantityConstant.RECEIPT_CONTAINER_BUILD.intValue()) {
                if (receiptContainerHeader.getStatus().intValue() < QuantityConstant.RECEIPT_CONTAINER_TASK) {
                    receiptContainerHeader.setStatus((short) QuantityConstant.RECEIPT_CONTAINER_TASK.intValue());
mahuandong authored
1174
1175
1176
1177
                    receiptContainerHeaderService.updateById(receiptContainerHeader);
                }
                //添加任务主表
                TaskHeader task = new TaskHeader();
1178
                task.setAllocationHeadId(receiptContainerHeader.getId());
pengcheng authored
1179
                task.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_SHELF);
mahuandong authored
1180
1181
1182
1183
1184
1185
1186
                task.setWarehouseCode(receiptContainerHeader.getWarehouseCode());
                task.setCompanyCode(receiptContainerHeader.getCompanyCode());
                task.setFromLocation(receiptContainerHeader.getFromLocation());
                task.setTaskType(Integer.valueOf(receiptContainerHeader.getTaskType()));
                task.setFromLocation(receiptContainerHeader.getFromLocation());
                task.setToLocation(receiptContainerHeader.getToLocation());
                task.setContainerCode(receiptContainerHeader.getContainerCode());
1187
                task.setRecvDock(receiptContainerHeader.getRecvDock());
mahuandong authored
1188
1189
                task.setCreated(new Date());
                task.setCreatedBy(ShiroUtils.getLoginName());
1190
                if (this.save(task)) {
1191
                    //添加任务明细表
1192
                    int conatinQty = 0;
1193
                    for (ReceiptContainerDetail item : list) {
1194
1195
1196
1197
1198
1199
                        LambdaQueryWrapper<ContainerCapacity> lambdaQueryWrapper = Wrappers.lambdaQuery();
                        String[] containCodeSplit = task.getContainerCode().split("\\D");
                        String containType = containCodeSplit[0];
                        lambdaQueryWrapper.eq(ContainerCapacity::getContainerType, task.getContainerCode())
                                .eq(ContainerCapacity::getMaterialCode, item.getMaterialCode())
                                .eq(ContainerCapacity::getWarehouseCode, ShiroUtils.getWarehouseCode())
1200
                                .eq(ContainerCapacity::getEnable, 0);
1201
1202
                        ContainerCapacity containerCapacity = containerCapacityService.getOne(lambdaQueryWrapper);
1203
1204
                        TaskDetail taskDetail = new TaskDetail();
                        taskDetail.setTaskId(task.getId());
xqs authored
1205
                        taskDetail.setTaskType(Integer.valueOf(receiptContainerHeaderService.getById(item.getReceiptContainerId()).getTaskType()));
pengcheng authored
1206
                        taskDetail.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_SHELF);
1207
                        taskDetail.setWarehouseCode(task.getWarehouseCode());
mahuandong authored
1208
                        taskDetail.setAllocationId(item.getReceiptId());
1209
1210
1211
1212
                        taskDetail.setCompanyCode(task.getCompanyCode());
                        taskDetail.setCompanyCode(task.getCompanyCode());
                        taskDetail.setMaterialCode(item.getMaterialCode());
                        taskDetail.setMaterialName(item.getMaterialName());
1213
1214
                        taskDetail.setMaterialSpec(item.getMaterialSpec());
                        taskDetail.setMaterialUnit(item.getMaterialUnit());
1215
1216
1217
                        taskDetail.setBillCode(item.getReceiptCode());
                        taskDetail.setBillDetailId(item.getReceiptDetailId());
                        taskDetail.setBillCode(item.getReceiptCode());
1218
                        taskDetail.setQty(item.getQty());
1219
1220
1221
1222
                        taskDetail.setContainerCode(task.getContainerCode());
                        taskDetail.setFromLocation(task.getFromLocation());
                        taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
                        taskDetail.setBatch(item.getBatch());
1223
                        if (containerCapacity != null) {
1224
1225
1226
                            conatinQty += (int) Math.floor(item.getQty().intValue() / containerCapacity.getQty().intValue());
                            taskDetail.setContainQty((int) Math.floor(item.getQty().intValue() / containerCapacity.getQty().intValue()));
                        }
1227
                        if (!taskDetailService.save(taskDetail)) {
1228
1229
1230
                            throw new ServiceException("生成任务明细失败");
                        }
mahuandong authored
1231
                        //更新入库组盘明细状态
pengcheng authored
1232
                        item.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK);
1233
                        if (!receiptContainerDetailService.updateById(item)) {
1234
1235
                            throw new ServiceException("更新入库组盘明细状态出错");
                        }
mahuandong authored
1236
1237
                        ReceiptDetail receiptDetail = receiptDetailService.getById(item.getReceiptDetailId());
mahuandong authored
1238
1239

                        ReceiptDetail detail = receiptDetailService.queryflow(receiptDetail);
1240
                        if (!receiptDetailService.updateById(detail)) {
mahuandong authored
1241
                            throw new ServiceException("更新入库单详情失败");
mahuandong authored
1242
                        }
mahuandong authored
1243
1244
1245
                        //更新头表状态
                        receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
mahuandong authored
1246
                    }
1247
1248

                    task.setContainQty(conatinQty);
1249
                    if (!taskHeaderService.updateById(task)) {
1250
1251
                        throw new ServiceException("更新任务头表容器数量失败");
                    }
1252
1253
                } else {
                    throw new ServiceException("生成任务头表失败");
mahuandong authored
1254
1255
1256
                }
            }
        }
1257
        return AjaxResult.success("生成上架任务成功!");
mahuandong authored
1258
    }
xqs authored
1259
wangyanxiong authored
1260
1261
    /**
     * 完成出库任务
1262
     */
wangyanxiong authored
1263
    @Override
1264
    @Transactional
wangyanxiong authored
1265
1266
1267
1268
1269
1270
1271
    public void completeShipmentTask(TaskHeader task) {
        //获取所有子任务
        TaskDetail condition = new TaskDetail();
        condition.setTaskId(task.getId());
        LambdaQueryWrapper<TaskDetail> lambdaQueryWrapper = Wrappers.lambdaQuery(condition);
        List<TaskDetail> taskDetails = taskDetailService.list(lambdaQueryWrapper);
        List<Integer> shipmentHeadIds = new ArrayList<>();
1272
1273
        for (TaskDetail taskDetail : taskDetails) {
            if (taskDetail.getStatus() < QuantityConstant.TASK_STATUS_RUNNING) {
1274
1275
1276
1277
1278
1279
1280
1281
                //获取出库子货箱
                ShipmentContainerDetail shipmentContainerDetail = shipmentContainerDetailService.getById(taskDetail.getAllocationId());
                //取出子单据
                ShipmentDetail shipmentDetail = shipmentDetailService.getById(taskDetail.getBillDetailId());
                //暂存id,为更新单据状态准备
                shipmentHeadIds.add(shipmentDetail.getShipmentId());
                //获取对应库存记录
                InventoryDetail inventoryDetail = inventoryDetailService.getById(taskDetail.getToInventoryId());
1282
                if (inventoryDetail == null) {
1283
1284
1285
                    throw new ServiceException("任务明细对应的库存ID【" + taskDetail.getToInventoryId().toString() + "】不存在!");
                }
                BigDecimal orignalQty = inventoryDetail.getQty();
wangyanxiong authored
1286
1287
1288
1289
                //减扣库存单
                InventoryHeader inventoryHeader = inventoryHeaderService.getById(inventoryDetail.getInventoryHeaderId());
                inventoryHeader.setTotalQty(inventoryDetail.getQty().subtract(taskDetail.getQty()).intValue());
                //扣减库存明细
1290
1291
                inventoryDetail.setTaskQty(inventoryDetail.getTaskQty().subtract(taskDetail.getQty()));
                inventoryDetail.setQty(inventoryDetail.getQty().subtract(taskDetail.getQty()));
1292
                if (inventoryDetail.getQty().compareTo(new BigDecimal("0")) == 0 && inventoryDetail.getTaskQty().compareTo(new BigDecimal("0")) == 0) {
1293
1294
                    //如果库存没有了,就删除这个库存
                    inventoryDetailService.removeById(inventoryDetail.getId());
wangyanxiong authored
1295
                    inventoryHeaderService.removeById(inventoryHeader.getId());
1296
                } else {
1297
1298
                    //否则更新这个库存
                    inventoryDetailService.updateById(inventoryDetail);
wangyanxiong authored
1299
                    inventoryHeaderService.updateById(inventoryHeader);
1300
1301
                }
                //设置子任务状态为已执行
pengcheng authored
1302
                taskDetail.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
1303
                taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
1304
                taskDetail.setLastUpdated(new Date());//完成时间
1305
1306
1307
1308
1309
1310
1311
                taskDetailService.updateById(taskDetail);
                //记录库存交易记录
                InventoryTransaction inventoryTransaction = new InventoryTransaction();
                inventoryTransaction.setWarehouseCode(task.getWarehouseCode());
                inventoryTransaction.setCompanyCode(shipmentDetail.getCompanyCode());
                inventoryTransaction.setLocationCode(inventoryDetail.getLocationCode());
                inventoryTransaction.setContainerCode(inventoryDetail.getContainerCode());
pengcheng authored
1312
                inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_SHIPMENT);
1313
                inventoryTransaction.setMaterialCode(shipmentDetail.getMaterialCode());
1314
1315
1316
                inventoryTransaction.setMaterialName(shipmentDetail.getMaterialName());
                inventoryTransaction.setMaterialSpec(shipmentDetail.getMaterialSpec());
                inventoryTransaction.setMaterialUnit(shipmentDetail.getMaterialUnit());
1317
1318
1319
1320
                inventoryTransaction.setBillCode(taskDetail.getBillCode());
                inventoryTransaction.setBillDetailId(shipmentDetail.getId());
                inventoryTransaction.setBatch(shipmentDetail.getBatch());
                inventoryTransaction.setLot(shipmentDetail.getLot());
1321
1322
1323
                inventoryTransaction.setProjectNo(shipmentDetail.getProjectNo());
                inventoryTransaction.setQcCheck(inventoryDetail.getQcCheck());
                inventoryTransaction.setSupplierCode(inventoryDetail.getSupplierCode());
1324
1325
1326
1327
                inventoryTransaction.setManufactureDate(shipmentDetail.getManufactureDate());
                inventoryTransaction.setExpirationDate(shipmentDetail.getExpirationDate());
                inventoryTransaction.setInventorySts(inventoryDetail.getInventorySts());
                //这里取反,更符合出库的语义,同时方便对记录进行统计
xqs authored
1328
                inventoryTransaction.setTaskQty(taskDetail.getQty());
1329
1330
1331
1332
1333
1334
1335
//                inventoryTransaction.setCostPrice(shipmentDetail.);
                inventoryTransaction.setCreated(null);
                inventoryTransaction.setCreatedBy(ShiroUtils.getLoginName());
                inventoryTransactionService.save(inventoryTransaction);
//                //更新单据状态
//                shipmentHeaderService.updateShipmentStatus(shipmentHeader.getId());
            }
1336
1337
1338
1339
            /* 物料预警*/
            configWarningService.materialWarning(taskDetail.getMaterialCode(), taskDetail.getMaterialName());
            /* 空库位剩余数量预警*/
            configWarningService.emptyLocationWarning();
1340
1341
        }
        //设置主任务为已执行
pengcheng authored
1342
        task.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
1343
1344
1345
        task.setLastUpdatedBy(ShiroUtils.getLoginName());
        task.setLastUpdated(new Date());
        taskHeaderService.updateById(task);
1346
1347
1348
        //将库位状态改为空闲,如果是整出的对应的容器也清空
1349
1350
1351
        LambdaQueryWrapper<Location> lam = Wrappers.lambdaQuery();
        lam.eq(Location::getCode, task.getFromLocation());
1352
        Location locationRecord = locationService.getOne(lam);
1353
1354
        if (lam == null) {
            throw new ServiceException("系统没有" + task.getToLocation() + "库位");
1355
        }
1356
        locationRecord.setStatus("empty");
1357
        if (task.getTaskType() == QuantityConstant.TASK_TYPE_WHOLESHIPMENT) {
1358
1359
            locationRecord.setContainerCode("");
        }
1360
        locationService.updateById(locationRecord);
1361
        //如果是整出,删掉这个库位上的这个托盘,否则更改托盘状态
1362
        LambdaQueryWrapper<Container> containerLam = Wrappers.lambdaQuery();
1363
        containerLam.eq(Container::getCode, task.getContainerCode());
1364
        Container ctn = containerService.getOne(containerLam);
1365
        if (ctn == null) {
1366
1367
            throw new ServiceException("系统无此容器");
        }
1368
1369
        if (task.getTaskType() == QuantityConstant.TASK_TYPE_WHOLESHIPMENT) {
            if (ctn.getContainerType().equals("LS")) {
1370
                Boolean flag = containerService.removeById(ctn.getId());
1371
                if (flag == false) {
1372
1373
                    throw new ServiceException("删除临时容器失败");
                }
1374
            } else {
1375
1376
                containerService.updateLocationCodeAndStatus(task.getContainerCode(), "", "empty");
            }
1377
        } else {
wangyanxiong authored
1378
1379
1380
1381
            //查询是否存在关联的库存,入如果没有就修改容器状态为empty
            InventoryDetail inventoryCondition = new InventoryDetail();
            inventoryCondition.setLocationCode(task.getToLocation());
            LambdaQueryWrapper<InventoryDetail> inventoryDetaillambdaQueryWrapper = Wrappers.lambdaQuery();
1382
1383
            inventoryDetaillambdaQueryWrapper.eq(InventoryDetail::getLocationCode, task.getToLocation());
            List<InventoryDetail> detailList = inventoryDetailService.list();
wangyanxiong authored
1384
            //库存查询不到该容器就把容器状态改为可用
1385
1386
            if (detailList.size() < 1) {
                Container container = new Container();
wangyanxiong authored
1387
1388
                container.setCode(task.getToLocation());
                condition.setToLocation("");
1389
1390
1391
                LambdaUpdateWrapper<Container> containerLambdaUpdateWrapper = Wrappers.lambdaUpdate();
                containerLambdaUpdateWrapper.eq(Container::getCode, task.getToLocation());
                containerService.update(containerLambdaUpdateWrapper);
wangyanxiong authored
1392
1393
            }
        }
wangyanxiong authored
1394
        //设置出库货箱状态为拣货任务完成
1395
        for (TaskDetail taskDetail : taskDetails) {
1396
            ShipmentContainerDetail shipmentContainerDetail = new ShipmentContainerDetail();
pengcheng authored
1397
            shipmentContainerDetail.setStatus(QuantityConstant.SHIPMENT_CONTAINER_REVIEWSUCCESS);
1398
1399
1400
1401
1402
1403
1404
            shipmentContainerDetail.setLastUpdated(new Date());
            shipmentContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            LambdaUpdateWrapper<ShipmentContainerDetail> shipmentContainerDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate();
            shipmentContainerDetailLambdaUpdateWrapper.eq(ShipmentContainerDetail::getId, taskDetail.getAllocationId());
            if (!shipmentContainerDetailService.update(shipmentContainerDetail, shipmentContainerDetailLambdaUpdateWrapper)) {
                throw new ServiceException("更新组盘明细状态失败");
            }
wangyanxiong authored
1405
        }
1406
        //设置出库货箱表头状态为拣货任务完成
1407
        ShipmentContainerHeader shipmentContainerHeader = new ShipmentContainerHeader();
pengcheng authored
1408
        shipmentContainerHeader.setStatus(QuantityConstant.SHIPMENT_CONTAINER_REVIEWSUCCESS);
1409
1410
1411
        shipmentContainerHeader.setLastUpdated(new Date());
        shipmentContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
        LambdaUpdateWrapper<ShipmentContainerHeader> shipmentContainerHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
1412
1413
        shipmentContainerHeaderLambdaUpdateWrapper.eq(ShipmentContainerHeader::getId, task.getAllocationHeadId());
        if (!shipmentContainerHeaderService.update(shipmentContainerHeader, shipmentContainerHeaderLambdaUpdateWrapper)) {
wangyanxiong authored
1414
            throw new ServiceException("更新组盘头状态失败");
pengcheng authored
1415
1416
        }
        //修改出库单状态
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
        LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskDetailLambdaQueryWrapper.eq(TaskDetail::getTaskId, task.getId());
        List<TaskDetail> taskDetailList = taskDetailService.list(taskDetailLambdaQueryWrapper);

        HashSet<Integer> ids = new HashSet<>();
        for (TaskDetail taskDeatails : taskDetailList) {
            LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
            shipmentDetailLambdaQueryWrapper.eq(ShipmentDetail::getId, taskDeatails.getBillDetailId());
            ShipmentDetail shipmentDetail = shipmentDetailService.getOne(shipmentDetailLambdaQueryWrapper);
            if (shipmentDetail == null) {
                throw new ServiceException("查找出库单明细失败");
            }
            if (shipmentDetail.getShipQty().compareTo(shipmentDetail.getRequestQty()) == 0) {
                shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_COMPLETED);
                shipmentDetailService.updateById(shipmentDetail);
            }
            ids.add(shipmentDetail.getShipmentId());
        }
pengcheng authored
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
        for (Integer id : ids) {
            ShipmentHeader shipmentHeader = shipmentHeaderService.getById(id);
            if (shipmentHeader != null) {
                Map<String, Integer> status = shipmentDetailService.selectStatus(shipmentHeader.getId());
                Integer maxStatus = status.get("maxStatus");
                Integer minStatus = status.get("minStatus");
                if (maxStatus == QuantityConstant.SHIPMENT_HEADER_COMPLETED) {
                    shipmentHeader.setFirstStatus(QuantityConstant.SHIPMENT_HEADER_COMPLETED);
                }
                if (minStatus == QuantityConstant.SHIPMENT_HEADER_COMPLETED) {
                    shipmentHeader.setLastStatus(QuantityConstant.SHIPMENT_HEADER_COMPLETED);
                }
                shipmentHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
                shipmentHeader.setLastUpdated(new Date());
                shipmentHeaderService.updateById(shipmentHeader);
            }
        }
1453
wangyanxiong authored
1454
    }
1455
}