Blame view

src/main/java/com/huaheng/pc/task/taskHeader/service/ReceiptTaskService.java 33.3 KB
1
2
3
4
package com.huaheng.pc.task.taskHeader.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
周鸿 authored
5
import com.huaheng.api.wcs.domain.TaskReceiptCompleteDomain;
6
import com.huaheng.api.wcs.service.warecellAllocation.WarecellAllocationService;
7
8
9
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
10
import com.huaheng.common.utils.Wrappers;
11
12
13
14
15
16
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
17
18
19
20
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.materialMultiple.domain.MaterialMultiple;
import com.huaheng.pc.config.materialMultiple.service.MaterialMultipleServiceImpl;
21
import com.huaheng.pc.config.materialWarnning.service.IMaterialWarningService;
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransaction;
import com.huaheng.pc.inventory.inventoryTransaction.service.InventoryTransactionService;
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
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;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
游杰 authored
39
import com.huaheng.pc.task.taskHeader.mapper.TaskHeaderMapper;
40
41
42
43
44
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
游杰 authored
45
46
import java.text.MessageFormat;
import java.util.*;
47
48
49

/**
 * 入库任务创建和完成
50
 *
51
 * @author mahua
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 * @date 2020/7/6
 */
@Service
public class ReceiptTaskService {

    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private InventoryHeaderService inventoryHeaderService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private InventoryTransactionService inventoryTransactionService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
游杰 authored
76
77
    private TaskHeaderMapper taskHeaderMapper;
    @Resource
78
79
80
    private ContainerService containerService;
    @Resource
    private LocationService locationService;
81
82
83
84
    @Resource
    private MaterialService materialService;
    @Resource
    private MaterialMultipleServiceImpl materialMultipleService;
85
86
    @Resource
    private IMaterialWarningService materialWarningService;
87
88
    @Resource
    private WarecellAllocationService warecellAllocationService;
xumiao authored
89
90
    @Resource
    private BackInvokeService backInvokeService;
91
92
93
94
95

    /**
     * 创建入库任务(整盘入库、补充入库)
     *
     * @param ids 入库组盘头表id
96
     * @return AjaxResult 创建结果
97
98
99
     */
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult createReceiptTask(List<Integer> ids) {
游杰 authored
100
        List<String> taskIds = new ArrayList<>();
101
102
        for (Integer id : ids) {
            ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getById(id);
103
            //检查组盘信息,托盘是否锁定,锁定容器,检查组盘明细
104
            checkReceiptTask(receiptContainerHeader, id);
105
            //查询入库组盘明细
周鸿 authored
106
            LambdaQueryWrapper<ReceiptContainerDetail> lam = Wrappers.lambdaQuery();
107
108
            lam.eq(ReceiptContainerDetail::getReceiptContainerId, id);
            lam.lt(ReceiptContainerDetail::getStatus, QuantityConstant.RECEIPT_CONTAINER_TASK);
周鸿 authored
109
110
            List<ReceiptContainerDetail> list = receiptContainerDetailService.list(lam);
//            List<ReceiptContainerDetail> list = receiptContainerDetailService.getReceiptContainerDetailByHeaderId(id);
111
112
113
            if (list.isEmpty()) {
                throw new ServiceException("id:" + id + "的入库组盘,没有组盘明细,请先组盘!");
            }
114
115
116
            String containerCode = receiptContainerHeader.getContainerCode();
            Container container = containerService.getContainerByCode(containerCode);
117
            if (StringUtils.isNotNull(container) && ("D".equals(container.getContainerType()) || "A".equals(container.getContainerType()))) {
118
119
120
121
122
123
124
125
126
127
                receiptContainerHeader.setToLocation(container.getLocationCode());
                receiptContainerHeader.setFromLocation(container.getLocationCode());
                receiptContainerHeader.setTaskType(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT);
                receiptContainerHeaderService.updateById(receiptContainerHeader);
                for (ReceiptContainerDetail receiptContainerDetail : list) {
                    receiptContainerDetail.setLocationCode(container.getLocationCode());
                    receiptContainerDetail.setTaskType(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT);
                }
                receiptContainerDetailService.updateBatchById(list);
            }
128
129
            //检查库位容器,修改状态
            checkLocationContainer(receiptContainerHeader);
周鸿 authored
130
            if (receiptContainerHeader.getStatus() <= QuantityConstant.RECEIPT_CONTAINER_TASK.intValue()) {
131
132
133
134
135
                if (receiptContainerHeader.getStatus() < QuantityConstant.RECEIPT_CONTAINER_TASK) {
                    receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK);
                    receiptContainerHeaderService.updateById(receiptContainerHeader);
                }
                //添加任务主表
136
                TaskHeader task = taskHeaderService.createTaskByReceipt(receiptContainerHeader);
137
138
                LambdaQueryWrapper<TaskHeader> lambdaQuery = Wrappers.lambdaQuery();
                lambdaQuery.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
139
140
                lambdaQuery.eq(TaskHeader::getContainerCode, containerCode);
                lambdaQuery.eq(TaskHeader::getInternalTaskType, 100);
141
142
                lambdaQuery.last("limit 1");
                lambdaQuery.orderByDesc(TaskHeader::getId);
143
144
145
                TaskHeader taskHeader = taskHeaderService.getOne(lambdaQuery);
                if (taskHeader != null) {
                    task = taskHeader;
146
                }
周鸿 authored
147
                task.setGoodsShelfNo(container.getGoodsShelfNo());
148
149
                if (task.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_CS) && containerCode.startsWith("S")) {
                    task.setPort("P1004");
150
                }
151
                if (taskHeaderService.saveOrUpdate(task)) {
152
153
                    //添加任务明细表
                    for (ReceiptContainerDetail item : list) {
154
                        // 保存任务详情
155
                        taskDetailService.createTaskDetailByReceipt(task, item);
156
157
158
159
160
161
162

                        //更新入库组盘明细状态
                        item.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK);
                        if (!receiptContainerDetailService.updateById(item)) {
                            throw new ServiceException("更新入库组盘明细状态出错");
                        }
163
                        /* 修改明细状态为上架*/
164
165
166
167
168
169
170
171
                        ReceiptDetail receiptDetail = receiptDetailService.getById(item.getReceiptDetailId());
                        receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_SHELF));
                        if (!receiptDetailService.updateById(receiptDetail)) {
                            throw new ServiceException("更新入库单详情失败");
                        }
                        //更新头表状态
                        receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
                    }
游杰 authored
172
173
                    String taskId = String.valueOf(task.getId());
                    taskIds.add(taskId);
周鸿 authored
174
                    //昆山pk库区和xn库区直接完成任务
175
176
                    if (task.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_KS)) {
                        if (task.getZoneCode().equals("PK") || task.getZoneCode().equals("XN")) {
xumiao authored
177
                            AjaxResult ajaxResult = taskHeaderService.completeTask(task);
178
179
                            if (!ajaxResult.hasErr()) {
                                try {
xumiao authored
180
                                    backInvokeService.invokeBack(Integer.valueOf(task.getId()));
181
                                } catch (Exception e) {
xumiao authored
182
183
184
185
                                    e.printStackTrace();
                                }

                            }
周鸿 authored
186
187
                        }
                    }
188
189
190
191
192
                } else {
                    throw new ServiceException("任务生成失败");
                }
            }
        }
游杰 authored
193
        return AjaxResult.success("生成上架任务成功").setData(taskIds);
194
    }
195
196
197
198
199

    /**
     * 检查组盘信息,托盘是否锁定,锁定容器,检查组盘明细
     */
    public void checkReceiptTask(ReceiptContainerHeader receiptContainerHeader, Integer id) {
200
201
202
203
204
205
206
        if (receiptContainerHeader == null) {
            throw new ServiceException("id:" + id + "的入库组盘不存在!");
        }
        if (!receiptContainerHeader.getWarehouseCode().equals(ShiroUtils.getWarehouseCode())) {
            throw new ServiceException("id:" + id + "的入库组盘不能在" + ShiroUtils.getWarehouseCode() + "仓库操作");
        }
        Container container = containerService.getContainerByCode(receiptContainerHeader.getContainerCode());
207
        if (container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) {
208
//            throw new ServiceException("托盘已经锁定,不能生成任务,托盘号:"+receiptContainerHeader.getContainerCode());
209
210
211
212
213
        }
        //锁定容器
        containerService.updateStatus(receiptContainerHeader.getContainerCode(),
                QuantityConstant.STATUS_CONTAINER_LOCK, container.getWarehouseCode());
    }
214
215
216
217
218
219

    /**
     * 检查库位容器,修改状态
     */
    public void checkLocationContainer(ReceiptContainerHeader receiptContainerHeader) {
        if (StringUtils.isNotEmpty(receiptContainerHeader.getFromLocation())) {
220
221
222
223
            locationService.updateStatus(receiptContainerHeader.getFromLocation(),
                    QuantityConstant.STATUS_LOCATION_LOCK);
        }
        String locationCode = receiptContainerHeader.getToLocation();
224
        if (StringUtils.isNotEmpty(locationCode)) {
225
226
227
            locationService.updateStatus(locationCode, QuantityConstant.STATUS_LOCATION_LOCK);
            Location desLocation = locationService.getLocationByCode(locationCode);
            String loginWarehouse = ShiroUtils.getWarehouseCode();
228
            if (!desLocation.getWarehouseCode().equals(loginWarehouse)) {
229
230
                throw new ServiceException("库位对应仓库不对");
            }
周鸿 authored
231
            /*if (taskHeaderService.getUncompleteTaskInNear(desLocation) > 0) {
232
                throw new ServiceException("目标库位:" + desLocation + "旁边存在任务,请完成任务以后再分配");
周鸿 authored
233
            }*/
234
235
        }
    }
游杰 authored
236
237
游杰 authored
238
239
    /**
     * 自动生成容器编码
240
     *
游杰 authored
241
242
243
     * @return 容器编码
     */
    @Transactional
244
    public String createContainer() {
游杰 authored
245
246
247
248
249
250
251
252
253
254
255
256
257
        String code = MessageFormat.format("{0}{1}",
                "LS",
                String.format("%d", Calendar.getInstance().getTimeInMillis()));
        Container container = new Container();
        container.setCode(code);
        container.setWarehouseCode(ShiroUtils.getWarehouseCode());
        container.setCompanyCode(ShiroUtils.getCompanyCodeList().get(0));
        container.setContainerType("LS");
        container.setCreatedBy(ShiroUtils.getLoginName());
        container.setLastUpdated(new Date());
        container.setLastUpdatedBy(ShiroUtils.getLoginName());
        container.setEnable(true);
        container.setStatus(QuantityConstant.STATUS_CONTAINER_EMPTY);
258
        if (!containerService.save(container)) {
游杰 authored
259
260
261
262
263
            throw new ServiceException("新增容器失败");
        }
        return code;
    }
264
265
    /**
     * 完成入库任务
266
     *
267
268
     * @param task 任务
     * @return AjaxResult 完成入库任务结果
269
270
271
     */
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult completeReceiptTask(TaskHeader task) {
272
273
274
275
        /* 判断任务状态*/
        if (task.getStatus().equals(QuantityConstant.TASK_STATUS_COMPLETED)) {
            return AjaxResult.error("任务已完成");
276
        }
277
278
279
        if (StringUtils.isEmpty(task.getToLocation())) {
            throw new ServiceException("任务" + task.getId() + "没有目的库位,执行中止");
        }
游杰 authored
280
        String warehouseCode = task.getWarehouseCode();
281
282
283
284
285
        BigDecimal totalQty = BigDecimal.ZERO;
        List<TaskDetail> taskDetailList = taskDetailService.findByTaskId(task.getId());
        if (taskDetailList.isEmpty()) {
            throw new ServiceException("任务明细为空");
        }
286
        InventoryHeader inventoryHeader = null;
周鸿 authored
287
        //补充入库把原来库存详情库位换成最新的库位
288
        inventoryHeader = checkSUPPLEMENTRECEIPT(task, inventoryHeader, warehouseCode);
289
        if (StringUtils.isNull(inventoryHeader)) {
290
            inventoryHeader = inventoryHeaderService.getByContainerLocation(task.getToLocation(), task.getContainerCode(), warehouseCode);
291
        }
292
293
        /* 如果库存 头明细不存在则新增库存头表记录*/
        if (StringUtils.isNull(inventoryHeader)) {
294
            inventoryHeader = this.saveInventeryByTask(task, warehouseCode);
周鸿 authored
295
296
297
        }
        if (StringUtils.isNull(inventoryHeader)) {
            throw new ServiceException("库存添加失败");
298
        }
299
        /* 遍历任务明细,修改关联的入库组盘、入库单状态、添加库存*/
300
        TaskReceiptCompleteDomain taskReceiptCompleteDomain = new TaskReceiptCompleteDomain();
周鸿 authored
301
302
        taskReceiptCompleteDomain.setTotalQty(inventoryHeader.getTotalQty());
        taskReceiptCompleteDomain.setInventoryHeader(inventoryHeader);
303
304
305
306
        List<ReceiptContainerDetail> receiptContainerDetails = new ArrayList<>();
        List<ReceiptDetail> receiptDetails = new ArrayList<>();
        List<TaskDetail> taskDetails = new ArrayList<>();
        Set<Integer> receiptHeaderIdSet = new HashSet<>();
307
308
        for (TaskDetail taskDetail : taskDetailList) {
            if (taskDetail.getStatus() < QuantityConstant.TASK_STATUS_COMPLETED) {
周鸿 authored
309
//                totalQty = totalQty.add(taskDetail.getQty());
310
311
312
                /*查询入库单明细*/
                ReceiptDetail receiptDetail = receiptDetailService.getById(taskDetail.getBillDetailId());
                if (StringUtils.isNotNull(receiptDetail)) {
313
                    taskReceiptCompleteDomain = this.addInventoryDetail(taskDetail, receiptDetail, inventoryHeader, taskReceiptCompleteDomain);
314
315
                    //修改组盘表状态为完成
                    ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
周鸿 authored
316
                    receiptContainerDetail.setId(taskDetail.getAllocationId());
317
                    receiptContainerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED);
游杰 authored
318
                    receiptContainerDetail.setLastUpdatedBy(receiptDetail.getCreatedBy());
周鸿 authored
319
                    receiptContainerDetails.add(receiptContainerDetail);
320
321
                } else {
                    throw new ServiceException("未找到id:" + taskDetail.getBillDetailId() + "入库单明细");
322
                }
323
                receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_POSTING));
324
                if (StringUtils.isNull(receiptDetail.getBackQty())) {
tongzhonghao authored
325
                    receiptDetail.setBackQty(BigDecimal.ZERO.add(taskDetail.getQty()));
326
                } else {
tongzhonghao authored
327
328
                    receiptDetail.setBackQty(receiptDetail.getBackQty().add(taskDetail.getQty()));
                }
周鸿 authored
329
330
331
332
                receiptDetails.add(receiptDetail);
//                receiptDetailService.updateById(receiptDetail);
                receiptHeaderIdSet.add(receiptDetail.getReceiptId());
//                receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
333
                materialWarningService.materialWarning(taskDetail.getMaterialCode(), taskDetail.getCompanyCode(), task.getWarehouseCode());
游杰 authored
334
                taskDetail.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
周鸿 authored
335
336
                taskDetails.add(taskDetail);
//                taskDetailService.updateById(taskDetail);
337
            }
338
        }
周鸿 authored
339
340
341
342
343
344
        taskReceiptCompleteDomain.setReceiptDetailList(receiptDetails);
        taskReceiptCompleteDomain.setTaskDetailList(taskDetails);
        taskReceiptCompleteDomain.setReceiptHeaderIdSet(receiptHeaderIdSet);
        taskReceiptCompleteDomain.setReceiptContainerDetailList(receiptContainerDetails);
        //save批量提交数据
        saveOrUpdateTaskCompleteTable(taskReceiptCompleteDomain);
345
        //修改库位状态和对应的容器
346
        locationService.updateContainerCodeAndStatus(task.getToLocation(), task.getContainerCode(), QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode);
游杰 authored
347
348
349
350


        //修改任务主表状态,因为立库任务表单头只对应一个货箱,表单详情的任务会同时完成
        task.setStatus(QuantityConstant.TASK_STATUS_COMPLETED);
周鸿 authored
351
        task.setCompleteStatus(1);
游杰 authored
352
353
        LambdaUpdateWrapper<TaskHeader> taskHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate();
        taskHeaderLambdaUpdateWrapper.eq(TaskHeader::getId, task.getId());
354
        if (!taskHeaderService.update(task, taskHeaderLambdaUpdateWrapper)) {
游杰 authored
355
356
357
            throw new ServiceException("更新任务主表失败");
        }
358
359
        //修改容器状态和对应的库位
        Container container = new Container();
肖超群 authored
360
        container.setLocationCode(task.getToLocation());
游杰 authored
361
        container.setStatus(QuantityConstant.STATUS_CONTAINER_SOME);
362
363
        LambdaUpdateWrapper<Container> containerLambdaUpdateWrapper = Wrappers.lambdaUpdate();
        containerLambdaUpdateWrapper.eq(Container::getCode, task.getContainerCode());
364
        containerLambdaUpdateWrapper.eq(Container::getWarehouseCode, task.getWarehouseCode());
365
366
367
368
369
370
371
        if (!containerService.update(container, containerLambdaUpdateWrapper)) {
            throw new ServiceException("更新容器失败");
        }

        //修改入库组盘头表状态
        ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
        receiptContainerHeader.setId(task.getAllocationHeadId());
游杰 authored
372
        receiptContainerHeader.setLastUpdatedBy(task.getCreatedBy());
373
        receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED);
374
375
376
        if (!receiptContainerHeaderService.updateById(receiptContainerHeader)) {
            throw new ServiceException("更新入库组盘头表状态失败");
        }
377
        return AjaxResult.success();
378
379
    }
380
381
    public InventoryHeader checkSUPPLEMENTRECEIPT(TaskHeader task, InventoryHeader inventoryHeader, String warehouseCode) {
        if (task.getTaskType().equals(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT)) {
382
383
384
385
386
            LambdaQueryWrapper<InventoryHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(InventoryHeader::getWarehouseCode, warehouseCode)
                    .eq(InventoryHeader::getLocationCode, task.getFromLocation())
                    .eq(InventoryHeader::getContainerCode, task.getContainerCode());
            lambdaQueryWrapper.last("limit 1");
387
388
            inventoryHeader = inventoryHeaderService.getOne(lambdaQueryWrapper);
            if (inventoryHeader != null) {
389
390
                String locationCode = inventoryHeader.getLocationCode();
                Location location = locationService.getLocationByCode(locationCode, warehouseCode);
391
392
393
//                location.setContainerCode("");
//                location.setStatus(QuantityConstant.STATUS_LOCATION_EMPTY);
//                locationService.updateById(location);
394
395
396
397
398
399
                inventoryHeader.setLocationCode(task.getToLocation());
                inventoryHeaderService.updateById(inventoryHeader);
                LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper2 = Wrappers.lambdaQuery();
                lambdaQueryWrapper2.eq(InventoryDetail::getWarehouseCode, warehouseCode)
                        .eq(InventoryDetail::getInventoryHeaderId, inventoryHeader.getId());
                List<InventoryDetail> inventoryDetails = inventoryDetailService.list(lambdaQueryWrapper2);
400
401
                if (inventoryDetails != null && inventoryDetails.size() > 0) {
                    for (InventoryDetail inventoryDetail : inventoryDetails) {
402
403
404
405
406
407
408
409
410
411
                        inventoryDetail.setLocationCode(task.getToLocation());
                        inventoryDetail.setZoneCode(location.getZoneCode());
                        inventoryDetailService.updateById(inventoryDetail);
                    }
                }
            }
        }
        return inventoryHeader;
    }
412
413
    /**
     * 添加库存明细与库存交易记录
414
415
416
     *
     * @param taskDetail      任务明细
     * @param receiptDetail   入库单明细
417
     * @param inventoryHeader 库存头表
418
     * @return 任务数量
419
     */
周鸿 authored
420
    private TaskReceiptCompleteDomain addInventoryDetail(TaskDetail taskDetail, ReceiptDetail receiptDetail,
421
                                                         InventoryHeader inventoryHeader, TaskReceiptCompleteDomain taskReceiptCompleteDomain) {
周鸿 authored
422
423
424
        List<InventoryDetail> inventoryDetailList = taskReceiptCompleteDomain.getInventoryDetailList();
        List<InventoryTransaction> inventoryTransactionList = taskReceiptCompleteDomain.getInventoryTransactionList();
周鸿 authored
425
游杰 authored
426
        String warehouseCode = inventoryHeader.getWarehouseCode();
427
        /*该入库明细是否已存在库存明细记录,已存在更新数量、不存在新增记录*/
428
        LambdaQueryWrapper<InventoryDetail> inventory = Wrappers.lambdaQuery();
周鸿 authored
429
430
        inventory.eq(InventoryDetail::getContainerCode, inventoryHeader.getContainerCode())
                .eq(InventoryDetail::getWarehouseCode, warehouseCode)
431
432
433
                .eq(InventoryDetail::getLocationCode, inventoryHeader.getLocationCode())
                .eq(InventoryDetail::getMaterialCode, taskDetail.getMaterialCode())
                .eq(InventoryDetail::getCompanyCode, taskDetail.getCompanyCode())
434
                .eq(InventoryDetail::getBatch, taskDetail.getBatch())
435
436
                .eq(InventoryDetail::getReceiptDetailId, taskDetail.getBillDetailId());
        InventoryDetail inventoryDetail = inventoryDetailService.getOne(inventory);
肖超群 authored
437
        Material material = materialService.getMaterialByCode(receiptDetail.getMaterialCode(), warehouseCode);
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
        /*单位换算*/
        BigDecimal receiptQty = taskDetail.getQty();
        if (StringUtils.isNotEmpty(receiptDetail.getMaterialUnit()) &&
                StringUtils.isNotEmpty(material.getUnit()) &&
                !receiptDetail.getMaterialUnit().equals(material.getUnit())) {
            LambdaQueryWrapper<MaterialMultiple> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.eq(MaterialMultiple::getMaterialCode, receiptDetail.getMaterialCode())
                    .eq(MaterialMultiple::getUnitId1, receiptDetail.getMaterialUnit())
                    .eq(MaterialMultiple::getUnitId2, material.getUnit());
            MaterialMultiple materialMultiple = materialMultipleService.getOne(queryWrapper);
            if (StringUtils.isNull(materialMultiple)) {
                throw new ServiceException("入库单单位与物料绑定主单位不一致且单位换算不存在");
            } else {
                receiptQty = receiptQty.multiply(materialMultiple.getMultiple());
            }
        }
454
455
        if (StringUtils.isNotNull(inventoryDetail)) {
            inventoryDetail.setQty(inventoryDetail.getQty().add(taskDetail.getQty()));
456
        } else {
周鸿 authored
457
//            ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
458
459
460
            inventoryDetail = new InventoryDetail();
            inventoryDetail.setInventoryHeaderId(inventoryHeader.getId());
            inventoryDetail.setWarehouseCode(taskDetail.getWarehouseCode());
周鸿 authored
461
462
            ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
周鸿 authored
463
464
465
            inventoryDetail.setUWarehouseCode(receiptHeader.getUWarehouseCode());

//            inventoryDetail.
466
            inventoryDetail.setZoneCode(inventoryHeader.getZoneCode());
467
468
469
470
471
472
            inventoryDetail.setCompanyCode(taskDetail.getCompanyCode());
            inventoryDetail.setLocationCode(taskDetail.getToLocation());
            inventoryDetail.setContainerCode(taskDetail.getContainerCode());
            inventoryDetail.setMaterialCode(taskDetail.getMaterialCode());
            inventoryDetail.setMaterialName(taskDetail.getMaterialName());
            inventoryDetail.setMaterialSpec(taskDetail.getMaterialSpec());
473
474
            inventoryDetail.setMaterialUnit(material.getUnit());
            inventoryDetail.setQty(receiptQty);
475
            inventoryDetail.setTaskQty(new BigDecimal(0));
tongzhonghao authored
476
            inventoryDetail.setInventorySts(QuantityConstant.GOOD);
477
            inventoryDetail.setSupplierCode(receiptDetail.getSupplierCode());
478
            inventoryDetail.setReferCode(receiptHeader.getReferCode());
479
480
481
            inventoryDetail.setReferDetailId(receiptDetail.getReferLineNum());
            inventoryDetail.setBatch(receiptDetail.getBatch());
            inventoryDetail.setLot(receiptDetail.getLot());
482
483
            inventoryDetail.setProjectNo(receiptDetail.getProjectNo());
            inventoryDetail.setMoCode(receiptDetail.getMoCode());
484
            inventoryDetail.setGoodsShelfNo(taskDetail.getGoodsShelfNo());
485
486
            if (taskDetail.getWarehouseCode().equals("KS0001")) {
                Container container = containerService.getContainerByCode(taskDetail.getContainerCode(), taskDetail.getWarehouseCode());
487
                inventoryDetail.setUWarehouseCode(container.getUWarehouseCode());
488
            } else {
489
490
                inventoryDetail.setUWarehouseCode(receiptDetail.getUWarehouseCode());
            }
491
492
493
494
495
496
            inventoryDetail.setManufactureDate(receiptDetail.getManufactureDate());
            inventoryDetail.setExpirationDate(receiptDetail.getExpirationDate());
            inventoryDetail.setAgingDate(receiptDetail.getAgingDate());
            inventoryDetail.setAttribute1(receiptDetail.getAttribute1());
            inventoryDetail.setAttribute2(receiptDetail.getAttribute2());
            inventoryDetail.setAttribute3(receiptDetail.getAttribute3());
周鸿 authored
497
            inventoryDetail.setReceiptCode(receiptDetail.getReceiptCode());
498
            inventoryDetail.setReceiptDetailId(receiptDetail.getId());
499
            inventoryHeader.setTotalLines(inventoryHeader.getTotalLines() + 1);
500
501
502
        }
        if (!inventoryDetailService.saveOrUpdate(inventoryDetail)) {
            throw new ServiceException("保存库存明细失败");
503
        }
周鸿 authored
504
505
//        inventoryHeader.setTotalQty(inventoryHeader.getTotalQty().add(taskDetail.getQty()));
//        inventoryHeaderService.updateById(inventoryHeader);
506
507
508
509
510
511
512
513
514
515
        //记录库存交易记录
        InventoryTransaction inventoryTransaction = new InventoryTransaction();
        inventoryTransaction.setTransactionType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT);
        inventoryTransaction.setWarehouseCode(taskDetail.getWarehouseCode());
        inventoryTransaction.setCompanyCode(taskDetail.getCompanyCode());
        inventoryTransaction.setLocationCode(inventoryHeader.getLocationCode());
        inventoryTransaction.setContainerCode(inventoryHeader.getContainerCode());
        inventoryTransaction.setMaterialCode(taskDetail.getMaterialCode());
        inventoryTransaction.setMaterialName(taskDetail.getMaterialName());
        inventoryTransaction.setMaterialSpec(taskDetail.getMaterialSpec());
516
        inventoryTransaction.setMaterialUnit(material.getUnit());
517
518
519
520
521
        inventoryTransaction.setBillCode(taskDetail.getBillCode());
        inventoryTransaction.setBillDetailId(taskDetail.getBillDetailId());
        inventoryTransaction.setBatch(receiptDetail.getBatch());
        inventoryTransaction.setLot(receiptDetail.getLot());
        inventoryTransaction.setInventorySts(receiptDetail.getInventorySts());
522
        inventoryTransaction.setTaskQty(receiptQty);
xumiao authored
523
        inventoryTransaction.setInventoryDetailId(inventoryDetail.getId());
524
525
526
527
        inventoryTransaction.setMoCode(inventoryDetail.getMoCode());
        inventoryTransaction.setUWarehouseCode(inventoryDetail.getUWarehouseCode());
        inventoryTransaction.setGoodsShelfNo(inventoryDetail.getGoodsShelfNo());
        inventoryTransaction.setZoneCode(inventoryDetail.getZoneCode());
528
        inventoryTransaction.setReferCode(taskDetail.getReferenceCode());
周鸿 authored
529
530
531
532
533
534

        inventoryDetailList.add(inventoryDetail);
        inventoryTransactionList.add(inventoryTransaction);
        taskReceiptCompleteDomain.setInventoryDetailList(inventoryDetailList);
        taskReceiptCompleteDomain.setInventoryTransactionList(inventoryTransactionList);
        taskReceiptCompleteDomain.setTotalQty(taskReceiptCompleteDomain.getTotalQty().add(taskDetail.getQty()));
535
周鸿 authored
536
537
538
        return taskReceiptCompleteDomain;
    }
539
540
    /**
     * 根据保存库存
541
     *
542
543
544
545
     * @param task
     * @param warehouseCode
     * @return
     */
546
    public InventoryHeader saveInventeryByTask(TaskHeader task, String warehouseCode) {
周鸿 authored
547
        InventoryHeader inventoryHeader = new InventoryHeader();
周鸿 authored
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
        inventoryHeader.setWarehouseCode(warehouseCode);
        inventoryHeader.setLocationCode(task.getToLocation());
        Location location = locationService.getLocationByCode(task.getToLocation(), warehouseCode);
        inventoryHeader.setZoneCode(location.getZoneCode());
        inventoryHeader.setTotalWeight(task.getWeight());
        inventoryHeader.setContainerCode(task.getContainerCode());
        inventoryHeader.setContainerStatus(QuantityConstant.STATUS_CONTAINER_SOME);
        inventoryHeader.setTotalQty(new BigDecimal(0));
        inventoryHeader.setTotalLines(0);
        inventoryHeader.setLocking(1);
        inventoryHeader.setEnable(1);
        inventoryHeader.setCompanyCode(task.getCompanyCode());
        inventoryHeader.setCreated(new Date());
        inventoryHeader.setCreatedBy("");
        inventoryHeader.setLastUpdated(new Date());
        inventoryHeader.setLastUpdatedBy("");
        if (!inventoryHeaderService.save(inventoryHeader)) {
            throw new ServiceException("添加库存单失败");
        }
周鸿 authored
567
        return inventoryHeader;
周鸿 authored
568
569
    }
570
571
572
573
574
575
576
577
578
    public void saveOrUpdateTaskCompleteTable(TaskReceiptCompleteDomain taskReceiptCompleteDomain) {
        List<InventoryTransaction> inventoryTransactionList = taskReceiptCompleteDomain.getInventoryTransactionList();
        List<InventoryDetail> inventoryDetailList = taskReceiptCompleteDomain.getInventoryDetailList();
        List<ReceiptDetail> receiptDetailList = taskReceiptCompleteDomain.getReceiptDetailList();
        List<TaskDetail> taskDetails = taskReceiptCompleteDomain.getTaskDetailList();
        List<ReceiptContainerDetail> receiptContainerDetailList = taskReceiptCompleteDomain.getReceiptContainerDetailList();
        InventoryHeader inventoryHeader = taskReceiptCompleteDomain.getInventoryHeader();
        Set<Integer> receiptHeaderIdSet = taskReceiptCompleteDomain.getReceiptHeaderIdSet();
        BigDecimal totalQty = taskReceiptCompleteDomain.getTotalQty();
周鸿 authored
579
580
        if (inventoryDetailList != null && inventoryDetailList.size() > 0) {
周鸿 authored
581
582
583
584
            inventoryDetailService.saveOrUpdateBatch(inventoryDetailList);
        }
        inventoryHeader.setTotalQty(totalQty);
        inventoryHeaderService.saveOrUpdate(inventoryHeader);
585
586

        if (inventoryTransactionList != null && inventoryTransactionList.size() > 0) {
周鸿 authored
587
588
            inventoryTransactionService.saveBatch(inventoryTransactionList);
        }
589
        if (receiptDetailList != null && receiptDetailList.size() > 0) {
周鸿 authored
590
591
            receiptDetailService.updateBatchById(receiptDetailList);
        }
592
        if (taskDetails != null && taskDetails.size() > 0) {
周鸿 authored
593
594
            taskDetailService.updateBatchById(taskDetails);
        }
595
        if (receiptContainerDetailList != null && receiptContainerDetailList.size() > 0) {
周鸿 authored
596
            receiptContainerDetailService.updateBatchById(receiptContainerDetailList);
597
        }
周鸿 authored
598
        receiptDetailService.updateReceiptHeaderLastStatusV2(receiptHeaderIdSet);
599
600
    }
}