Blame view

src/main/java/com/huaheng/api/erp/service/CodingServiceImpl.java 86.2 KB
1
2
package com.huaheng.api.erp.service;
李泰瑜 authored
3
import com.alibaba.fastjson.JSON;
tan authored
4
import com.alibaba.fastjson.JSONArray;
5
6
7
8
9
10
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.erp.domain.BoxInfo;
import com.huaheng.api.erp.domain.ChipInfos;
import com.huaheng.api.erp.domain.ShipmentRecord;
肖超群 authored
11
import com.huaheng.api.wcs.service.WcsService;
李泰瑜 authored
12
import com.huaheng.common.constant.HttpConstant;
13
14
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
肖超群 authored
15
import com.huaheng.common.utils.DateUtils;
李泰瑜 authored
16
import com.huaheng.common.utils.http.OkHttpUtils;
17
import com.huaheng.framework.web.domain.AjaxResult;
18
import com.huaheng.framework.web.service.ConfigService;
李泰瑜 authored
19
import com.huaheng.pc.config.address.service.AddressService;
肖超群 authored
20
21
import com.huaheng.pc.config.bosAssistantDetail.domain.BosAssistantDetail;
import com.huaheng.pc.config.bosAssistantDetail.service.IBosAssistantDetailService;
22
23
24
25
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.containerType.domain.ContainerType;
import com.huaheng.pc.config.containerType.service.ContainerTypeService;
yangxiaoping authored
26
27
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
28
29
30
31
32
33
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.proPackaging.domain.ProPackaging;
import com.huaheng.pc.config.proPackaging.service.IProPackagingService;
import com.huaheng.pc.inventory.InventoryHistoryDetail.domain.InventoryHistoryDetail;
import com.huaheng.pc.inventory.InventoryHistoryDetail.service.IInventoryHistoryDetailService;
lty authored
34
35
36
37
import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetail;
import com.huaheng.pc.inventory.cycleCountDetail.domain.CycleCountDetailChild;
import com.huaheng.pc.inventory.cycleCountDetail.service.CycleCountDetailChildService;
import com.huaheng.pc.inventory.cycleCountDetail.service.CycleCountDetailService;
lty authored
38
39
40
41
import com.huaheng.pc.inventory.inventoryCacheDetail.domain.InventoryCacheDetail;
import com.huaheng.pc.inventory.inventoryCacheDetail.service.InventoryCacheDetailService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
肖超群 authored
42
43
import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
44
45
46
47
48
49
50
51
52
53
import com.huaheng.pc.inventory.inventoryHistoryHeader.domain.InventoryHistoryHeader;
import com.huaheng.pc.inventory.inventoryHistoryHeader.service.IInventoryHistoryHeaderService;
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;
54
55
56
57
58
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.ShipmentDetailService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.ShipmentHeaderService;
59
60
import com.huaheng.pc.task.agvTask.domain.AgvTask;
import com.huaheng.pc.task.agvTask.service.AgvTaskService;
lty authored
61
62
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
63
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
64
import com.huaheng.pc.task.taskHeader.service.ReceiptTaskService;
65
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
66
67
68
69
70
71
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
72
73
import java.text.MessageFormat;
import java.util.*;
74
import java.util.stream.Collectors;
75
肖超群 authored
76
77
78
/**
 * @author 游杰
 */
79
80
81
82
83
84
85
86
@Service
public class CodingServiceImpl implements CodingService {

    @Resource
    private IInventoryHistoryDetailService inventoryHistoryDetailService;
    @Resource
    private IInventoryHistoryHeaderService inventoryHistoryHeaderService;
    @Resource
lty authored
87
    private CycleCountDetailChildService cycleCountDetailChildService;
88
89
90
    @Resource
    private ShipmentDetailService shipmentDetailService;
    @Resource
91
92
93
94
95
96
97
98
    private ContainerService containerService;
    @Resource
    private ContainerTypeService containerTypeService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
99
100
    private PDAServiceImpl pdaService;
    @Resource
101
102
    private MaterialService materialService;
    @Resource
103
104
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
李泰瑜 authored
105
106
    private AddressService addressService;
    @Resource
107
108
109
110
111
112
113
114
115
    private IProPackagingService proPackagingService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private ReceiptTaskService receiptTaskService;
    @Resource
    private AgvTaskService agvTaskService;
肖超群 authored
116
117
    @Resource
    private LocationService locationService;
肖超群 authored
118
119
    @Resource
    private WcsService wcsService;
肖超群 authored
120
    @Resource
121
    private ShipmentContainerHeaderService shipmentContainerHeaderService;
122
    @Resource
肖超群 authored
123
    private IBosAssistantDetailService bosAssistantDetailService;
lty authored
124
125
126
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
lty authored
127
128
    private IProPackagingService proPackingService;
    @Resource
lty authored
129
130
    private CycleCountDetailService cycleCountDetailService;
    @Resource
lty authored
131
    private InventoryCacheDetailService inventoryCacheDetailService;
132
133
    @Resource
    private TaskHeaderService taskHeaderService;
肖超群 authored
134
    @Resource
lty authored
135
136
    private TaskDetailService taskDetailService;
    @Resource
肖超群 authored
137
    private InventoryHeaderService inventoryHeaderService;
138
139
    @Resource
    private ConfigService configService;
140
141
142

    @Override
    @Transactional(rollbackFor = Exception.class)
143
144
145
    public AjaxResult innerReceipt(String containerCode, String position, String proSchedule, String orderCode, String orderName, List<BoxInfo> boxInfoList,
        int stack, int qc, int orderFinish, BigDecimal weight, int type, String k3Code, String inType, String operatorName, String quantityorName,
        Integer toalCases) {
146
147
        String warehouseCode = "CS0001";
        boolean result = false;
148
        orderFinish = 1;
149
        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
150
        if (container == null) {
151
152
153
            return AjaxResult.error("根据托盘号:" + containerCode + "没有找到匹配的容器");
        }
        String locationCode = container.getLocationCode();
154
        if (StringUtils.isNotEmpty(locationCode)) {
155
156
            return AjaxResult.error("这个容器在库位上,不能用来入库, 托盘号:" + containerCode);
        }
157
158
159
160
        String containerStatus = container.getStatus();
        if (containerStatus.equals(QuantityConstant.STATUS_CONTAINER_LOCK)) {
            return AjaxResult.error("这个容器已经锁定,不能用来入库, 容器号:" + containerCode);
        }
161
        String containerTypeCode = container.getContainerType();
162
        if (containerTypeCode == null) {
163
164
            return AjaxResult.error("容器类型编码为空");
        }
165
        ContainerType containerType = containerTypeService.getContainerTypeByCode(containerTypeCode, warehouseCode);
166
        if (containerType == null) {
167
168
            return AjaxResult.error("容器类型为空");
        }
169
        if (boxInfoList == null || boxInfoList.size() == 0) {
170
171
172
173
            return AjaxResult.error("箱信息为空");
        }

        List<ReceiptContainerDetail> receiptContainerDetailList = new ArrayList<>();
174
175
176
177
        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptContainerHeaderLambdaQueryWrapper.eq(ReceiptContainerHeader::getContainerCode, containerCode).lt(ReceiptContainerHeader::getStatus,
            QuantityConstant.RECEIPT_CONTAINER_FINISHED);
        ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getOne(receiptContainerHeaderLambdaQueryWrapper);
178
        if (receiptContainerHeader != null) {
179
180
            return AjaxResult.error("容器已经有组盘信息,容器号:" + containerCode);
        }
181
        ReceiptHeader receiptHeader = null;
182
        if (type == 0) { // 生产入库
183
184
            String receiptCode = receiptHeaderService.createCode(QuantityConstant.RECEIPT_TYPE_PRODUCTON);
            LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
185
186
            receiptHeaderLambdaQueryWrapper.eq(ReceiptHeader::getOrderCode, orderCode).le(ReceiptHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_POSTING)
                .eq(ReceiptHeader::getReceiptType, QuantityConstant.RECEIPT_TYPE_PRODUCTON);
187
188
189
190
191
192
            receiptHeader = receiptHeaderService.getOne(receiptHeaderLambdaQueryWrapper);
            if (receiptHeader == null) {
                receiptHeader = new ReceiptHeader();
                receiptHeader.setCode(receiptCode);
                receiptHeader.setOrderCode(orderCode);
                receiptHeader.setReceiptType(QuantityConstant.RECEIPT_TYPE_PRODUCTON);
193
                receiptHeader.setInType(inType);
194
195
196
197
198
199
200
                receiptHeader.setWarehouseCode(warehouseCode);
                receiptHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
                receiptHeader.setReferType(QuantityConstant.BILL_TYPE_RECEIPT_SINGLE);
                receiptHeader.setTotalLines(0);
                receiptHeader.setTotalQty(BigDecimal.ZERO);
                receiptHeader.setFirstStatus(200);
                receiptHeader.setLastStatus(200);
201
                receiptHeader.setToalCases(toalCases);
202
203
204
205
206
207
208
209
                receiptHeader.setOrderFinish(false);
                receiptHeader.setCreatedBy(QuantityConstant.PLATFORM_CODING);
                receiptHeader.setLastUpdatedBy(QuantityConstant.PLATFORM_CODING);
                result = receiptHeaderService.save(receiptHeader);
                if (!result) {
                    throw new ServiceException("保存入库单失败");
                }
            }
210
        } else if (type == 1) { // 退货入库
211
            LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
212
213
            receiptHeaderLambdaQueryWrapper.eq(ReceiptHeader::getReferCode, k3Code).le(ReceiptHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_POSTING)
                .eq(ReceiptHeader::getReceiptType, QuantityConstant.RECEIPT_BILL_TYPE_SR);
214
            receiptHeader = receiptHeaderService.getOne(receiptHeaderLambdaQueryWrapper);
215
            if (receiptHeader == null) {
216
                throw new ServiceException("没有找到销售退货单");
217
            }
218
        } else if (type == 2) {
219
            String receiptCode = receiptHeaderService.createCode(QuantityConstant.RECEIPT_BILL_TYPE_OR);
220
            LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
221
222
            receiptHeaderLambdaQueryWrapper.eq(ReceiptHeader::getOrderCode, orderCode).le(ReceiptHeader::getLastStatus, QuantityConstant.RECEIPT_HEADER_POSTING)
                .eq(ReceiptHeader::getReceiptType, QuantityConstant.RECEIPT_BILL_TYPE_OR);
223
224
225
226
227
            receiptHeader = receiptHeaderService.getOne(receiptHeaderLambdaQueryWrapper);
            if (receiptHeader == null) {
                receiptHeader = new ReceiptHeader();
                receiptHeader.setCode(receiptCode);
                receiptHeader.setOrderCode(orderCode);
228
229
230
                receiptHeader.setReceiptType(QuantityConstant.RECEIPT_BILL_TYPE_OR);
                String defDeptCode = configService.getKey(QuantityConstant.QT_DEF_DEPT);
                receiptHeader.setUserDef1(defDeptCode);
231
232
233
                receiptHeader.setInType(inType);
                receiptHeader.setWarehouseCode(warehouseCode);
                receiptHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
234
                // 其他入库单 类型
tongzhonghao authored
235
                receiptHeader.setReferType(QuantityConstant.BILL_TYPE_RECEIPT_OTHER);
236
237
238
239
240
241
242
243
244
245
246
247
248
                receiptHeader.setTotalLines(0);
                receiptHeader.setTotalQty(BigDecimal.ZERO);
                receiptHeader.setFirstStatus(200);
                receiptHeader.setLastStatus(200);
                receiptHeader.setToalCases(toalCases);
                receiptHeader.setOrderFinish(false);
                receiptHeader.setCreatedBy(QuantityConstant.PLATFORM_CODING);
                receiptHeader.setLastUpdatedBy(QuantityConstant.PLATFORM_CODING);
                result = receiptHeaderService.save(receiptHeader);
                if (!result) {
                    throw new ServiceException("保存入库单失败");
                }
            }
249
        } else {
250
            throw new ServiceException("type类型不匹配");
251
        }
肖超群 authored
252
        BigDecimal totalQty = BigDecimal.ZERO;
253
254
255
        String materialCode1 = null, batch1 = null, level1 = null, color1 = null, proPackage1 = null, productSize = null;
        Integer boxQty = 0;// 每箱数量
        Integer box = 0;// 箱数
256
        BoxInfo boxInfo1 = boxInfoList.get(0);
257
        for (BoxInfo boxInfo : boxInfoList) {
258
            materialCode1 = boxInfo.getMaterialCode();
259
            proPackage1 = boxInfo.getProPackaging();
260
261
            level1 = boxInfo.getLevel();
            color1 = boxInfo.getColor();
262
            productSize = boxInfo.getSize();
263
264
265
            BigDecimal qty = boxInfo.getQty();
            batch1 = boxInfo.getBatch();
            totalQty = totalQty.add(qty);
266
            if (!boxInfo1.getMaterialCode().equals(materialCode1)) {
267
268
                throw new ServiceException("赋码系统给的物料编码不一致:" + boxInfo1.getMaterialCode() + "," + materialCode1);
            }
269
            if (!boxInfo1.getProPackaging().equals(proPackage1)) {
270
271
                throw new ServiceException("赋码系统给的产品包装不一致:" + boxInfo1.getProPackaging() + "," + proPackage1);
            }
272
            if (!boxInfo1.getLevel().equals(level1)) {
273
274
                throw new ServiceException("赋码系统给的等级不一致:" + boxInfo1.getLevel() + "," + level1);
            }
275
            if (!boxInfo1.getColor().equals(color1)) {
276
277
                throw new ServiceException("赋码系统给的色号不一致:" + boxInfo1.getColor() + "," + color1);
            }
278
            if (!boxInfo1.getBatch().equals(batch1)) {
279
280
                throw new ServiceException("赋码系统给的批次不一致:" + boxInfo1.getBatch() + "," + batch1);
            }
281
        }
282
        Material material = materialService.getMaterialByCode(materialCode1);
肖超群 authored
283
284
        getBosAssistantNumber(color1, "colour");
        getBosAssistantNumber(level1, "level");
285
286
287
288
289
290
291
292
293
294
295
296
297
298

        LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper1 = Wrappers.lambdaQuery();
        receiptDetailLambdaQueryWrapper1.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
        List<ReceiptDetail> details = receiptDetailService.list(receiptDetailLambdaQueryWrapper1);

        BigDecimal sum = new BigDecimal(0);
        ReceiptDetail detail = null;
        for (ReceiptDetail det : details) {
            sum = sum.add(det.getTaskQty());
            if (det.getMaterialCode().equals(materialCode1)) {
                detail = det;
            }
        }
299
        if (type == 1 && sum.add(totalQty).compareTo(receiptHeader.getTotalQty()) == 1) {
300
301
302
            throw new ServiceException("单据数量超出了:");
        }
303
        if (detail == null && details.size() != 0) {
304
305
306
            throw new ServiceException("不可出现一种新的物料:");
        }
307
308
        ReceiptDetail receiptDetail = new ReceiptDetail();
        receiptDetail.setWarehouseCode(warehouseCode);
肖超群 authored
309
        receiptDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
310
311
        receiptDetail.setMaterialCode(materialCode1);
        receiptDetail.setMaterialUnit("1001");
312
        receiptDetail.setMaterialSpec(material.getSpec());
313
        if (details.size() > 1) {
李泰瑜 authored
314
315
            receiptDetail.setFHTZDetail(detail.getFHTZDetail());
        }
316
        LambdaQueryWrapper<Material> queryWrapper = Wrappers.lambdaQuery();
317
        queryWrapper.eq(Material::getCode, materialCode1).eq(Material::getWarehouseCode, QuantityConstant.DEFAULT_WAREHOUSE);
318
        Material material1 = materialService.getOne(queryWrapper);
319
        if (material1 == null) {
肖超群 authored
320
321
            return AjaxResult.error("没有找到物料信息:" + materialCode1);
        }
322
323
324
        receiptDetail.setMaterialName(material1.getName());
        receiptDetail.setColor(color1);
        receiptDetail.setLevel(level1);
325
        receiptDetail.setProPackaging(proPackage1);
326
327
328
        receiptDetail.setProductSchedule(proSchedule);
        receiptDetail.setProductSize(productSize);
        receiptDetail.setQty(totalQty);
329
        receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
330
331

        LambdaQueryWrapper<ProPackaging> queryWrapper2 = Wrappers.lambdaQuery();
332
        queryWrapper2.eq(ProPackaging::getNumber, proPackage1);
333
        ProPackaging proPackaging = proPackagingService.getOne(queryWrapper2);
334
        if (proPackaging == null) {
335
336
            return AjaxResult.error("没有该产品包装");
        }
337
        // 每箱数量
338
        int pieceBox = proPackaging.getPieceBox();
tan authored
339
        String toPort = null;
340
        String toLocationCode = null;
341
        // 先获取起始库位,获取不到就放到缓存区
342
343
344
345
        if (qc == 0) {
            AjaxResult ajaxResult = wcsService.getFromPort();
            if (ajaxResult.hasErr()) {
                throw new ServiceException("获取站台点失败");
346
            }
347
            JSONArray array = (JSONArray)ajaxResult.getData();
348
349
            for (int i = 0; i < array.size(); i++) {
350
                toPort = (String)array.get(i);
351
352
353
354
                String port = null;
                if (toPort.equals(QuantityConstant.PORT_P1005)) {
                    port = QuantityConstant.PORT_P1004;
                }
355
356
357
358
                if (toPort.equals(QuantityConstant.PORT_P1001)) {
                    port = QuantityConstant.PORT_P1000;
                }
359
360
                LambdaQueryWrapper<AgvTask> agvTaskLambdaQueryWrapper = Wrappers.lambdaQuery();
361
                agvTaskLambdaQueryWrapper.eq(AgvTask::getToPort, port).ne(AgvTask::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
362
363
364
365
366
367
368
369
                List<AgvTask> list = agvTaskService.list(agvTaskLambdaQueryWrapper);

                toLocationCode = toPort;
                if (list.size() > 0) {
                    toLocationCode = getCacheLocation();
                } else {
                    break;
                }
370
371
            }
372
373
374
            if (array.size() == 0) {
                toLocationCode = getCacheLocation();
            }
375
376
377
378
            if (StringUtils.isEmpty(toLocationCode)) {
                throw new ServiceException("没有找到入库缓存区空闲库位");
            }
379
        }
380
381
        // 箱数
382
383
        box = totalQty.divide(BigDecimal.valueOf(pieceBox), RoundingMode.DOWN).intValue();
        receiptDetail.setBox(box);
384
        if (receiptHeader.getReceiptType().equals(QuantityConstant.RECEIPT_BILL_TYPE_SR)) {
385
386
            receiptDetail.setTaskQty(totalQty);
        }
387
388
389
390
391
//        if (details.size()>1&&sum.add(totalQty).compareTo(detail.getQty())==1)
//        {
//            throw new ServiceException("已收数量不能大于单据总数量");
//        }
392
393
394
        receiptDetail.setBatch(batch1);
        receiptDetail.setProjectNo(orderCode);
肖超群 authored
395
        receiptDetail.setReceiptCode(receiptHeader.getCode());
396
        receiptDetail.setQcCheck(qc + "");// 是否质检
肖超群 authored
397
398
        receiptDetail.setCreatedBy(QuantityConstant.PLATFORM_CODING);
        receiptDetail.setLastUpdatedBy(QuantityConstant.PLATFORM_CODING);
399
        receiptDetail.setReceiptId(receiptHeader.getId());
400
肖超群 authored
401
        LambdaQueryWrapper<ReceiptDetail> receiptDetailQueryWrapper = new LambdaQueryWrapper<>();
402
403
        receiptDetailQueryWrapper.eq(ReceiptDetail::getReceiptId, receiptHeader.getId()).eq(ReceiptDetail::getMaterialCode, materialCode1)
            .eq(ReceiptDetail::getBatch, batch1).eq(ReceiptDetail::getColor, color1).eq(ReceiptDetail::getLevel, level1);
肖超群 authored
404
        ReceiptDetail receiptDetail1 = receiptDetailService.getOne(receiptDetailQueryWrapper);
405
        if (receiptDetail1 != null) {
肖超群 authored
406
407
            receiptDetail = receiptDetail1;
            BigDecimal qty = receiptDetail.getQty();
408
            BigDecimal taskQty = receiptDetail.getTaskQty();
肖超群 authored
409
            qty = qty.add(totalQty);
410
            taskQty = taskQty.add(totalQty);
411
            if (receiptHeader.getReceiptType().equals(QuantityConstant.RECEIPT_BILL_TYPE_SR)) {
412
                receiptDetail.setTaskQty(taskQty);
413
            } else {
414
415
                receiptDetail.setQty(qty);
            }
肖超群 authored
416
417
418
419
            result = receiptDetailService.updateById(receiptDetail);
        } else {
            result = receiptDetailService.save(receiptDetail);
        }
420
        if (!result) {
421
422
            throw new ServiceException("保存入库单详情失败");
        }
423
        receiptHeader.setTotalLines(receiptHeader.getTotalLines() + 1);
424
        receiptHeader.setTotalQty(receiptHeader.getTotalQty().add(totalQty));
425
        // 判断是否完成的标志
426
        boolean result1 = orderFinish == 1;
427
        receiptHeader.setOrderFinish(result1);// 设值
428
        if (receiptHeader.getReceiptType().equals(QuantityConstant.RECEIPT_BILL_TYPE_SR)) {
429
430
431
432
            LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
            receiptDetailLambdaQueryWrapper.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
            List<ReceiptDetail> receiptDetailList = receiptDetailService.list(receiptDetailLambdaQueryWrapper);
            int complete = 1;
433
434
            for (ReceiptDetail receiptDetail2 : receiptDetailList) {
                if (receiptDetail2.getQty().compareTo(receiptDetail2.getTaskQty()) > 0) {
435
436
437
                    complete = 0;
                }
            }
438
            if (complete == 1) {
439
                if (receiptHeader.getLastStatus().intValue() < QuantityConstant.RECEIPT_HEADER_POSTING) {
440
441
442
                    receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
                    receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
                }
443
444
            }
        }
445
        result = receiptHeaderService.updateById(receiptHeader);
446
        if (!result) {
447
448
            throw new ServiceException("更新入库单失败");
        }
肖超群 authored
449
        receiptDetailService.updateReceiptHeader(receiptHeader);
450
451
        ReceiptContainerHeader receiptContainerHeader1 = new ReceiptContainerHeader();
        receiptContainerHeader1.setWarehouseCode(warehouseCode);
肖超群 authored
452
        receiptContainerHeader1.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
453
454
        receiptContainerHeader1.setContainerCode(containerCode);
        receiptContainerHeader1.setPosition(position);
455
        receiptContainerHeader1.setPort(toLocationCode);
456
457
        receiptContainerHeader1.setOperatorName(operatorName);
        receiptContainerHeader1.setQualityorName(quantityorName);
肖超群 authored
458
459
460
        receiptContainerHeader1.setBatch(batch1);
        receiptContainerHeader1.setLevel(level1);
        receiptContainerHeader1.setColor(color1);
461
        receiptContainerHeader1.setProductSize(productSize);
462
        receiptContainerHeader1.setProPackaging(proPackage1);
lty authored
463
        receiptContainerHeader1.setProductSchedule(proSchedule);
464
//        receiptContainerHeader1.setStockId(stockId);//生产车间
465
466
467
        receiptContainerHeader1.setOrderCode(orderCode);// 订单编号
        receiptContainerHeader1.setOrderName(orderName);// 订单名称
        receiptContainerHeader1.setMaterialCode(materialCode1);// 物料编码
468
        receiptContainerHeader1.setContainerType(containerTypeCode);
469
        receiptContainerHeader1.setWeight(String.valueOf(weight));
470
471
        receiptContainerHeader1.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
        receiptContainerHeader1.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
472
        receiptContainerHeader1.setStack(stack);// 设置垛型
473
474
        receiptContainerHeader1.setCreatedBy(QuantityConstant.PLATFORM_CODING);
        receiptContainerHeader1.setLastUpdatedBy(QuantityConstant.PLATFORM_CODING);
475
        result = receiptContainerHeaderService.save(receiptContainerHeader1);
476
        if (!result) {
477
478
            throw new ServiceException("保存入库组盘头失败");
        }
479
        for (BoxInfo boxInfo : boxInfoList) {
480
            String boxCode = boxInfo.getBoxCode();
481
            int boxPosition = boxInfo.getBoxPosition();
482
            List<ChipInfos> chipInfoList = boxInfo.getChipInfos();
肖超群 authored
483
484
//            String materialCode = boxInfo.getMaterialCode();
//            Material material = materialService.getMaterialByCode(materialCode, warehouseCode);
485
            String level = boxInfo.getLevel();
486
            String proPackagingStr = boxInfo.getProPackaging();
487
            String productSize1 = boxInfo.getSize();
488
489
            String color = boxInfo.getColor();
            String batch = boxInfo.getBatch();
490
            for (ChipInfos chipInfos : chipInfoList) {
491
                ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
肖超群 authored
492
493
                String chipCode1 = chipInfos.getChipBarcode1();
                String chipCode2 = chipInfos.getChipBarcode2();
494
495
496
                receiptContainerDetail.setWarehouseCode(warehouseCode);
                receiptContainerDetail.setContainerCode(containerCode);
                receiptContainerDetail.setContainerType(containerTypeCode);
497
                receiptContainerDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
498
                receiptContainerDetail.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
肖超群 authored
499
500
                receiptContainerDetail.setChipCode1(chipCode1);
                receiptContainerDetail.setChipCode2(chipCode2);
501
502
503
504
                receiptContainerDetail.setMaterialCode(receiptDetail.getMaterialCode());
                receiptContainerDetail.setMaterialName(receiptDetail.getMaterialName());
                receiptContainerDetail.setMaterialSpec(receiptDetail.getMaterialSpec());
                receiptContainerDetail.setMaterialUnit(receiptDetail.getMaterialUnit());
505
506
507
508
509
                receiptContainerDetail.setProPackaging(proPackagingStr);// 包装
                receiptContainerDetail.setProductSchedule(proSchedule);// 排产订单
                receiptContainerDetail.setProductSize(productSize1);// 等级
                receiptContainerDetail.setLevel(level);// 等级
                receiptContainerDetail.setColor(color);// 色号
510
511
512
513
514
                receiptContainerDetail.setQty(BigDecimal.ONE);
                receiptContainerDetail.setBatch(batch);
                receiptContainerDetail.setReceiptCode(orderCode);
                receiptContainerDetail.setBoxCode(boxCode);
                receiptContainerDetail.setReceiptType("SC");
肖超群 authored
515
516
517
                receiptContainerDetail.setInventorySts(QuantityConstant.QUALITY_GOOD);
                receiptContainerDetail.setCreatedBy(QuantityConstant.PLATFORM_CODING);
                receiptContainerDetail.setLastUpdatedBy(QuantityConstant.PLATFORM_CODING);
518
519
520
521
522
523
524
525
                receiptContainerDetail.setBoxPosition(boxPosition);
                receiptContainerDetail.setReceiptId(receiptHeader.getId());
                receiptContainerDetail.setReceiptDetailId(receiptDetail.getId());
                receiptContainerDetail.setReceiptContainerId(receiptContainerHeader1.getId());
                receiptContainerDetailList.add(receiptContainerDetail);
            }
        }
        result = receiptContainerDetailService.saveBatch(receiptContainerDetailList);
526
        if (!result) {
527
528
529
            throw new ServiceException("保存入库组盘详情失败");
        }
        Integer id = receiptContainerHeader1.getId();
530
531
        if (qc == 1) {
532
533
            receiptContainerHeader1.setExceptionCode("需要质检");
            receiptContainerHeaderService.updateById(receiptContainerHeader1);
534
            toLocationCode = getCacheLocation();
535
        } else {
536
            if (toLocationCode.equals(QuantityConstant.PORT_P1001) || toLocationCode.equals(QuantityConstant.PORT_P1005)) {
537
                AjaxResult ajaxResult = receiptTaskService.createReceiptTask(id, warehouseCode);
lty authored
538
                if (ajaxResult.hasErr()) {
539
                    throw new ServiceException("生成任务失败" + ajaxResult.getMsg());
540
                }
541
                int taskId = (int)ajaxResult.getData();
542
543
544
545
                TaskHeader taskHeader = taskHeaderService.getById(taskId);
                taskHeader.setUserDef1(operatorName);
                taskHeader.setUserDef2(quantityorName);
                taskHeaderService.updateById(taskHeader);
546
            }
547
        }
548
549
550
        if (StringUtils.isEmpty(toLocationCode)) {
            throw new ServiceException("没有找到入库缓存区空闲库位");
        }
551
552
        AjaxResult taskFromTo = agvTaskService.sendTaskFromTo(warehouseCode, QuantityConstant.ZONE_LK, containerCode, position, toLocationCode,
            QuantityConstant.PLATFORM_CODING, totalQty.intValue());
553
        if (taskFromTo.hasErr()) {
554
            throw new ServiceException("生成agv任务失败" + taskFromTo.getMsg());
555
        }
556
557
558
559
560
561
        return AjaxResult.success("保存入库组盘信息成功");
    }

    @Override
    public AjaxResult findShipmentRecord(String boxCode) {
562
        // 查询符合条件的历史库存明细
563
564
        LambdaQueryWrapper<InventoryHistoryDetail> inventoryHistoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryHistoryDetailLambdaQueryWrapper.eq(InventoryHistoryDetail::getBoxCode, boxCode);
565
566
        List<InventoryHistoryDetail> inventoryHistorysDetailList = inventoryHistoryDetailService.list(inventoryHistoryDetailLambdaQueryWrapper);
567
568
        LambdaQueryWrapper<InventoryHistoryHeader> inventoryHistoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryHistoryHeaderLambdaQueryWrapper.eq(InventoryHistoryHeader::getId, inventoryHistorysDetailList.get(0).getInventoryHistoryHeaderId());
569
570
        InventoryHistoryHeader inventoryHistoryHeader = inventoryHistoryHeaderService.getOne(inventoryHistoryHeaderLambdaQueryWrapper);
571
        List<ShipmentRecord> list = new ArrayList<>();
572
        for (InventoryHistoryDetail inventoryHistoryDetail : inventoryHistorysDetailList) {
573
            // 设置shipmentRecord属性,
574
            ShipmentRecord shipmentRecord = new ShipmentRecord();
575
576
577
578
579
580
581
            shipmentRecord.setMaterialCode(inventoryHistoryDetail.getMaterialCode());
            shipmentRecord.setMaterialName(inventoryHistoryDetail.getMaterialName());
            shipmentRecord.setColor(inventoryHistoryDetail.getColor());
            shipmentRecord.setBoxCode(boxCode);
            shipmentRecord.setLevel(inventoryHistoryDetail.getLevel());
            shipmentRecord.setBatch(inventoryHistoryDetail.getBatch());
            shipmentRecord.setTime(inventoryHistoryDetail.getCreated());
肖超群 authored
582
            shipmentRecord.setChipCode1(inventoryHistoryDetail.getChipCode1());
583
584
585
586
587
588
589
590
            shipmentRecord.setOrderCode(inventoryHistoryHeader.getOrderCode());
            shipmentRecord.setOrderName(inventoryHistoryHeader.getOrderName());
            list.add(shipmentRecord);
        }
        return AjaxResult.success().setData(list);

    }
tan authored
591
    @Override
592
    @Transactional(rollbackFor = Exception.class)
tan authored
593
    public AjaxResult findShipmentRecord(String boxCode, String chipCode) {
594
        // 查询符合条件的历史库存明细
595
596
597
        LambdaQueryWrapper<InventoryHistoryDetail> inventoryHistoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        if (StringUtils.isNotEmpty(boxCode)) {
            inventoryHistoryDetailLambdaQueryWrapper.eq(InventoryHistoryDetail::getBoxCode, boxCode);
lty authored
598
599
600
        }

        if (StringUtils.isNotEmpty(chipCode)) {
601
            inventoryHistoryDetailLambdaQueryWrapper.eq(InventoryHistoryDetail::getChipCode1, chipCode);
tan authored
602
        }
lty authored
603
tan authored
604
605
        List<InventoryHistoryDetail> inventoryHistorysDetailList = inventoryHistoryDetailService.list(inventoryHistoryDetailLambdaQueryWrapper);
606
        Collections.reverse(inventoryHistorysDetailList);
tan authored
607
608

        List<ShipmentRecord> list = new ArrayList<>();
609
        for (InventoryHistoryDetail inventoryHistoryDetail : inventoryHistorysDetailList) {
610
611
612
            LambdaQueryWrapper<InventoryHistoryHeader> inventoryHistoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
            inventoryHistoryHeaderLambdaQueryWrapper.eq(InventoryHistoryHeader::getId, inventoryHistoryDetail.getInventoryHistoryHeaderId());
            InventoryHistoryHeader inventoryHistoryHeader = inventoryHistoryHeaderService.getOne(inventoryHistoryHeaderLambdaQueryWrapper);
613
            // 设置shipmentRecord属性,
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
            ShipmentRecord shipmentRecord = new ShipmentRecord();
            shipmentRecord.setMaterialCode(inventoryHistoryDetail.getMaterialCode());
            shipmentRecord.setMaterialName(inventoryHistoryDetail.getMaterialName());
            shipmentRecord.setLocationCode(inventoryHistoryDetail.getLocationCode());
            shipmentRecord.setProductSchedule(inventoryHistoryDetail.getProductSchedule());
            shipmentRecord.setColor(inventoryHistoryDetail.getColor());
            if (StringUtils.isNotEmpty(boxCode)) {
                shipmentRecord.setBoxCode(boxCode);
            } else if (StringUtils.isNotEmpty(chipCode)) {
                shipmentRecord.setBoxCode(inventoryHistorysDetailList.get(0).getBoxCode());
            }
            shipmentRecord.setLevel(inventoryHistoryDetail.getLevel());
            shipmentRecord.setBatch(inventoryHistoryDetail.getBatch());
            shipmentRecord.setTime(inventoryHistoryDetail.getCreated());
            shipmentRecord.setChipCode1(inventoryHistoryDetail.getChipCode1());
            if (inventoryHistoryHeader != null) {
                shipmentRecord.setOrderCode(inventoryHistoryHeader.getOrderCode());
                shipmentRecord.setOrderName(inventoryHistoryHeader.getOrderName());
                shipmentRecord.setShipmentCode(inventoryHistoryHeader.getShipmentCode());
                shipmentRecord.setReceiptCode(inventoryHistoryHeader.getReceiptCode());
            }
            list.add(shipmentRecord);
tan authored
636
637
638
639
        }
        return AjaxResult.success().setData(list);
    }
640
641
    private Boolean agvTaskAndReceiptQcStream(String position, ReceiptHeader receiptHeader, String warehouseCode, int totalQty) {
        // 生成AGV取放货任务
642
        AgvTask agvTask = new AgvTask();
肖超群 authored
643
        agvTask.setTaskType(QuantityConstant.AGV_TYPE_TAKE_AND_RELEASE);
644
645
646
647
648
        agvTask.setStatus(QuantityConstant.AGV_TASK_STATUS_BUILD);
        agvTask.setWarehouseCode(warehouseCode);
        agvTask.setPriority(10);
        agvTask.setFromPort(position);
        agvTask.setToPort("质检点位");
649
        agvTask.setQty(totalQty);
650
651
        agvTask.setCreatedBy("质检点位");
        Boolean result = agvTaskService.save(agvTask);
652
        if (!result) {
653
654
            throw new ServiceException("生成AGV任务失败");
        }
655
        // 生成入库质检单
656
657
658
        receiptHeaderService.check(receiptHeader.getId());
        return Boolean.TRUE;
    }
yangxiaoping authored
659
肖超群 authored
660
661
    private String getBosAssistantNumber(String number1, String id) {
        LambdaQueryWrapper<BosAssistantDetail> bosAssistantDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
662
663
        bosAssistantDetailLambdaQueryWrapper.eq(BosAssistantDetail::getId, id).eq(BosAssistantDetail::getNumber, number1);
        BosAssistantDetail bosAssistantDetail = bosAssistantDetailService.getOne(bosAssistantDetailLambdaQueryWrapper);
664
        if (bosAssistantDetail == null) {
肖超群 authored
665
666
667
668
669
            throw new ServiceException("没有找到对应详情:" + number1);
        }
        String number = bosAssistantDetail.getNumber();
        return number;
    }
yangxiaoping authored
670
肖超群 authored
671
    /*
672
673
     * A
     */
yangxiaoping authored
674
    @Override
675
    @Transactional(rollbackFor = Exception.class)
yangxiaoping authored
676
    public AjaxResult requestEmptyContainer(String requestInCode) {
677
678
679
680
        List<Integer> rows = new ArrayList<>();
        rows.add(1);
        rows.add(2);
        rows.add(3);
肖超群 authored
681
        LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
682
683
        locationLambdaQueryWrapper.eq(Location::getZoneCode, QuantityConstant.ZONE_RECEIPT_MANY_CONTAINER).eq(Location::getStatus,
            QuantityConstant.STATUS_LOCATION_LOCK);
684
        List<Location> locationList = locationService.list(locationLambdaQueryWrapper);
685
        if (locationList.size() > 0) {
686
687
            List<Integer> rowList = locationList.stream().map(Location::getIRow).collect(Collectors.toList());
            for (Integer row : rowList) {
688
                rows.remove(row);
lty authored
689
690
            }
        }
691
        if (rows.size() == 0) {
692
693
694
695
            return AjaxResult.error("每一行都有AGV任务,暂时没有可用库位, 清过段时间重试");
        }
        locationLambdaQueryWrapper = Wrappers.lambdaQuery();
        locationLambdaQueryWrapper.eq(Location::getZoneCode, QuantityConstant.ZONE_RECEIPT_MANY_CONTAINER)
696
697
            .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY).in(Location::getIRow, rows).ne(Location::getContainerCode, "")
            .orderByAsc(Location::getIColumn).orderByDesc(Location::getILayer).last(" limit 1");
698
        Location location = locationService.getOne(locationLambdaQueryWrapper);
lty authored
699
700
        if (location == null) {
701
            return AjaxResult.error("没有找到可出库位");
lty authored
702
703
        }
肖超群 authored
704
        LambdaQueryWrapper<AgvTask> agvTaskLambdaQueryWrapper = Wrappers.lambdaQuery();
705
        agvTaskLambdaQueryWrapper.eq(AgvTask::getToPort, requestInCode).lt(AgvTask::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
肖超群 authored
706
        List<AgvTask> agvTaskList = agvTaskService.list(agvTaskLambdaQueryWrapper);
707
        if (agvTaskList.size() > 0) {
肖超群 authored
708
709
            return AjaxResult.error(requestInCode + "位置已经有AGV搬运任务");
        }
710
711
712
713
714
715

        String containerCode = location.getContainerCode();
        String warehouseCode = location.getWarehouseCode();
        String locationCode = location.getCode();
        String zoneCode = location.getZoneCode();
        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
716
        if (container != null) {
717
            String status = container.getStatus();
718
            if (status.equals(QuantityConstant.STATUS_CONTAINER_MANY)) {
719
720
                AjaxResult ajaxResult =
                    agvTaskService.sendTaskFromTo(warehouseCode, zoneCode, containerCode, locationCode, requestInCode, QuantityConstant.PLATFORM_CODING, 0);
721
                return ajaxResult;
肖超群 authored
722
723
            }
        }
724
肖超群 authored
725
        return AjaxResult.error("没有可用于出库的库位");
yangxiaoping authored
726
    }
肖超群 authored
727
728
    // 获取空闲的入库缓存库位
lty authored
729
    @Override
730
    @Transactional(rollbackFor = Exception.class)
lty authored
731
    public String getCacheLocation() {
732
733
734
735
        List<Integer> rows = new ArrayList<>();
        rows.add(1);
        rows.add(2);
        rows.add(3);
肖超群 authored
736
        LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
737
        locationLambdaQueryWrapper.eq(Location::getZoneCode, QuantityConstant.ZONE_RECEIPT_CACHE).eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_LOCK);
738
        List<Location> locationList = locationService.list(locationLambdaQueryWrapper);
739
740
741
742
743
744
745
        // 原代码是如果第一行有任务 就暂时不分配了,现在客户要求同时只能有一个agv任务(默认锁定就是有任务)
//        if (locationList.size() > 0) {
//            List<Integer> rowList = locationList.stream().map(Location::getIRow).collect(Collectors.toList());
//            for (Integer row : rowList) {
//                rows.remove(row);
//            }
//        }
746
        if (locationList.size() > 0) {
747
            throw new ServiceException("齐工要求 同时只能有一个agv任务 当前入库缓存区库位有锁定情况 无法生成新的任务");
748
        }
749
        if (rows.size() == 0) {
750
751
752
753
754
            rows = new ArrayList<>();
            rows.add(1);
            rows.add(2);
            rows.add(3);
        }
755
756
        // 之前代码按顺序查询的 默认取第一个 会造成后面的释放了分配到后面去,逻辑存在问题 先注释
757
758
759
760
761
762
763
764
765
//        locationLambdaQueryWrapper = Wrappers.lambdaQuery();
//        locationLambdaQueryWrapper.eq(Location::getZoneCode, QuantityConstant.ZONE_RECEIPT_CACHE)
//                .eq(Location::getStatus, QuantityConstant.STATUS_LOCATION_EMPTY)
//                .eq(Location::getContainerCode, "")
//                .in(Location::getIRow, rows)
//                .orderByDesc(Location::getIColumn)
//                .orderByAsc(Location::getILayer)
//                .last(" limit 1");
766
        // 改写先全取 在本地处理数据 一共18*3个库位 本地处理多个循环也不至于很卡
767
        locationLambdaQueryWrapper = Wrappers.lambdaQuery();
768
769
        locationLambdaQueryWrapper.eq(Location::getZoneCode, QuantityConstant.ZONE_RECEIPT_CACHE).in(Location::getIRow, rows).orderByAsc(Location::getIRow)
            .orderByAsc(Location::getIColumn);
770
771
772
        List<Location> locations = locationService.list(locationLambdaQueryWrapper);
773
        // 按 IRow 分组
774
        Map<Integer, List<Location>> locationMap = locations.stream().collect(Collectors.groupingBy(Location::getIRow));
775
776
777

        // 按空闲数量从多到少排序
        Comparator<List<Location>> byIdleCount = Comparator.comparingInt(list -> {
778
779
780
            long idleCount = list.stream()
                .filter(location -> QuantityConstant.STATUS_CONTAINER_EMPTY.equals(location.getStatus()) && !StringUtils.isNotEmpty(location.getContainerCode()))
                .count();
781
782
783
            return -(int)idleCount; // 按空闲数量从多到少排序
        });
784
        // 每一行都分成一个list内,方便进行循环遍历
785
        List<List<Location>> locationIRowList = new ArrayList<>(locationMap.values());
786
787
        locationIRowList.sort(byIdleCount);
788
789
790
791
792
793
794
795
796
797
798
        String LocationCode = null;

        // 第一层遍历是行
        for (List<Location> location : locationIRowList) {
            // 第二次遍历是每一行的值 这里用int i可以更好的利用位置取值
            for (int i = 0; i < location.size(); i++) {
                // 查出非空闲或者有容器 如果当前列查了有就在这i的前一个给出去
                if (!location.get(i).getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY) || StringUtils.isNotEmpty(location.get(i).getContainerCode())) {
                    // 如果是第一个就放弃这一行 比如B010101库位前是空的不存在了 这里用行跟来判断
                    if (location.get(i).getIColumn() == 1) {
                        // 当前行的遍历关闭 会到第一层遍历去重新到第二行
799
800
801
                        break;
                    }
802
803
                    // 如果不是当前行的第一个库位,就往前取一个,就是i-1,给变量赋值出去 直接退出当前遍历到第一层遍历
                    LocationCode = location.get(i - 1).getCode();
804
                    break;
805
806
807
808
                } else {
                    // 如果这一行全不是有货或者锁定的 直接把最后一个当库位返回
                    if (i == location.size() - 1) {
                        LocationCode = location.get(i).getCode();
809
810
811
812
                        break;
                    }
                }
            }
813
814
            // 如果在第二层里面给了库位了 就不需要再继续执行直接关闭当第一层遍历
            if (LocationCode != null) {
815
816
                break;
            }
肖超群 authored
817
        }
818
819
        // TODO 如果三个都满了 默认返回是null 这里先保留 看看到时候要不要直接抛异常回滚报错为无库位
820
        return LocationCode;
肖超群 authored
821
    }
lty authored
822
肖超群 authored
823
824
825
    // 1.首先清掉库存、库存缓存、组盘信息
    // 2.如果尾盘还没有推送托盘信息,并且尾盘数量有多,那么尾盘多取一个
    // 3.如果尾盘数量不够,生成内部出库单出库。
lty authored
826
    @Override
肖超群 authored
827
    @Transactional(rollbackFor = Exception.class)
lty authored
828
    public AjaxResult brickFalling(String boxCode, String containerCode) {
829
830
831
832
833
834
835
836
        String materialCode = null;
        String materialName = null;
        String materialSpec = null;
        String level = null;
        String color = null;
        String proPackaging = null;
        String productSchedule = null;
        String batch = null;
837
        int size = 0;
838
        // 查询库存里面还有没有这个值
lty authored
839
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
840
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode).eq(InventoryDetail::getBoxCode, boxCode);
lty authored
841
        List<InventoryDetail> inventoryDetails = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
842
843
844
845
846
847
848
849
850
        if (inventoryDetails.size() > 0) {
            materialCode = inventoryDetails.get(0).getMaterialCode();
            level = inventoryDetails.get(0).getLevel();
            color = inventoryDetails.get(0).getColor();
            proPackaging = inventoryDetails.get(0).getProPackaging();
            productSchedule = inventoryDetails.get(0).getProductSchedule();
            batch = inventoryDetails.get(0).getBatch();
            materialName = inventoryDetails.get(0).getMaterialName();
            materialSpec = inventoryDetails.get(0).getMaterialSpec();
肖超群 authored
851
            List<Integer> inventoryIds = inventoryDetails.stream().map(InventoryDetail::getId).collect(Collectors.toList());
852
            if (inventoryIds.size() > 0) {
肖超群 authored
853
                boolean result = inventoryDetailService.removeByIds(inventoryIds);
854
                if (!result) {
肖超群 authored
855
856
857
                    throw new ServiceException("删除库存详情");
                }
            }
lty authored
858
        }
lty authored
859
860
        // 查询库存扣减表有没有这个值
lty authored
861
        LambdaQueryWrapper<InventoryCacheDetail> inventoryCacheDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
862
        inventoryCacheDetailLambdaQueryWrapper.eq(InventoryCacheDetail::getBoxCode, boxCode).eq(InventoryCacheDetail::getContainerCode, containerCode);
lty authored
863
        List<InventoryCacheDetail> inventoryCacheDetails = inventoryCacheDetailService.list(inventoryCacheDetailLambdaQueryWrapper);
864
        // 如果有就删除
865
866
867
868
869
870
871
872
873
        if (inventoryCacheDetails.size() > 0) {
            materialCode = inventoryCacheDetails.get(0).getMaterialCode();
            level = inventoryCacheDetails.get(0).getLevel();
            color = inventoryCacheDetails.get(0).getColor();
            proPackaging = inventoryCacheDetails.get(0).getProPackaging();
            productSchedule = inventoryCacheDetails.get(0).getProductSchedule();
            batch = inventoryCacheDetails.get(0).getBatch();
            materialName = inventoryCacheDetails.get(0).getMaterialName();
            materialSpec = inventoryCacheDetails.get(0).getMaterialSpec();
874
            List<Integer> inventoryCacheIds = inventoryCacheDetails.stream().map(InventoryCacheDetail::getId).collect(Collectors.toList());
875
876
            if (inventoryCacheIds.size() > 0) {
                size = inventoryCacheIds.size();
肖超群 authored
877
                boolean result = inventoryCacheDetailService.removeByIds(inventoryCacheIds);
878
                if (!result) {
肖超群 authored
879
880
881
                    throw new ServiceException("删除缓存库存详情");
                }
            }
882
lty authored
883
        }
lty authored
884
885
        // 查询有没有组托
lty authored
886
        LambdaQueryWrapper<ReceiptContainerDetail> receiptContainerDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
887
888
        receiptContainerDetailLambdaQueryWrapper.eq(ReceiptContainerDetail::getBoxCode, boxCode).ne(ReceiptContainerDetail::getStatus,
            QuantityConstant.INVENTORY_TRANSACTION_SHIPMENT);
lty authored
889
        List<ReceiptContainerDetail> receiptContainerDetails = receiptContainerDetailService.list(receiptContainerDetailLambdaQueryWrapper);
890
891

        boolean isZt = false;
892
        // 如果有就删除
893
        if (receiptContainerDetails.size() > 0) {
lty authored
894
895

            LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
896
            taskHeaderLambdaQueryWrapper.eq(TaskHeader::getContainerCode, receiptContainerDetails.get(0).getContainerCode())
897
                .ne(TaskHeader::getPortGroup, QuantityConstant.PORTGROUP_P30).eq(TaskHeader::getTaskType, QuantityConstant.TASK_TYPE_OVER_STATION);
lty authored
898
            TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
899
            if (taskHeader == null) {
lty authored
900
901
                throw new ServiceException("入库组盘明细对应换站任务不存在");
            }
902
            taskHeader.setBadQty(taskHeader.getBadQty() + receiptContainerDetails.size());
lty authored
903
            taskHeaderService.updateById(taskHeader);
904
905
906
907
908
909
910
911
            materialCode = receiptContainerDetails.get(0).getMaterialCode();
            level = receiptContainerDetails.get(0).getLevel();
            color = receiptContainerDetails.get(0).getColor();
            proPackaging = receiptContainerDetails.get(0).getProPackaging();
            productSchedule = receiptContainerDetails.get(0).getProductSchedule();
            batch = receiptContainerDetails.get(0).getBatch();
            materialName = receiptContainerDetails.get(0).getMaterialName();
            materialSpec = receiptContainerDetails.get(0).getMaterialSpec();
912
            List<Integer> receiptContainerDetailIds = receiptContainerDetails.stream().map(ReceiptContainerDetail::getId).collect(Collectors.toList());
913
            if (receiptContainerDetailIds.size() > 0) {
肖超群 authored
914
                boolean result = receiptContainerDetailService.removeByIds(receiptContainerDetailIds);
915
                if (!result) {
肖超群 authored
916
917
918
                    throw new ServiceException("删除入库组盘详情详情");
                }
            }
919
            isZt = true;
920
921
        }
肖超群 authored
922
923
        boolean isPushCoding = false;
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
924
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode).eq(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_ARRIVED_STATION);
肖超群 authored
925
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
926
        if (taskHeader == null) {
李泰瑜 authored
927
928
            throw new ServiceException("任务不存在");
        }
929
930
        taskHeader.setBack(0);
        taskHeaderService.updateById(taskHeader);
931
        if (taskHeader != null) {
肖超群 authored
932
933
934
            long shipmentOrder = taskHeader.getShipmentOrder();
            int sequenceNumber = taskHeader.getSequenceNumber();
            LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper1 = Wrappers.lambdaQuery();
935
936
            taskHeaderLambdaQueryWrapper1.eq(TaskHeader::getShipmentOrder, shipmentOrder).eq(TaskHeader::getSequence, sequenceNumber).eq(TaskHeader::getMaterialCode,
                materialCode);
肖超群 authored
937
            TaskHeader taskHeader1 = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper1);
938
939
            // 查出明细表包含主表id的所有
940
            LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper1 = Wrappers.lambdaQuery();
941
942
            inventoryDetailLambdaQueryWrapper1.eq(InventoryDetail::getContainerCode, taskHeader1.getContainerCode()).eq(InventoryDetail::getMaterialCode,
                taskHeader1.getMaterialCode());
943
944
            List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper1);
945
946
947
948
949
            String finalLevel = level;
            String finalMaterialCode = materialCode;
            String finalColor = color;
            String finalBatch = batch;
            String finalProPackaging = proPackaging;
950
951
952
953
954
            List<InventoryDetail> details = inventoryDetailList.stream().filter(i -> i.getLevel().equals(finalLevel) && i.getMaterialCode().equals(finalMaterialCode)
                && i.getColor().equals(finalColor) && i.getBatch().equals(finalBatch) && i.getProPackaging().equals(finalProPackaging)).collect(Collectors.toList());

            if (details.size() < 1) {
                taskHeader1 = null;
955
956
            }
957
            if (taskHeader1 != null) {
肖超群 authored
958
                int pushCoding = taskHeader1.getPushCoding();
959
                LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
肖超群 authored
960
961
                inventoryHeaderLambdaQueryWrapper.eq(InventoryHeader::getContainerCode, taskHeader1.getContainerCode());
                InventoryHeader inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaQueryWrapper);
962
                int inventoryQty = 0;
963
                if (inventoryHeader != null) {
964
965
                    inventoryQty = inventoryHeader.getBoxQty().intValue();
                }
肖超群 authored
966
                int qty = taskHeader1.getQty();
967
968
969
970
971
972
973
974
975
976
977
978
979
                if (isZt != true) {
                    if (pushCoding == 0) {
                        qty = qty + 1;
                        if (qty <= inventoryQty) {
                            isPushCoding = true;
                            taskHeader1.setQty(qty);
                            taskHeaderService.updateById(taskHeader1);
                        }
                    } else {
                        qty = qty + 1;
                        if (qty > inventoryQty) {
                            isPushCoding = false;
                        }
肖超群 authored
980
981
                    }
                } else {
982
983
                    isPushCoding = false;
                }
肖超群 authored
984
985
986
987
988
989
990
            }
        }

        LambdaQueryWrapper<ProPackaging> proPackagingLambdaQueryWrapper = Wrappers.lambdaQuery();
        proPackagingLambdaQueryWrapper.eq(ProPackaging::getNumber, proPackaging);
        ProPackaging proPackaging1 = proPackagingService.getOne(proPackagingLambdaQueryWrapper);
        int pieceBox = proPackaging1.getPieceBox();
991
        if (!isPushCoding) {
肖超群 authored
992
993
            String shipmentCode = taskHeader.getShipmentCode();
            LambdaQueryWrapper<ShipmentHeader> shipmentLambdaQueryWrapper = Wrappers.lambdaQuery();
994
995
            shipmentLambdaQueryWrapper.eq(ShipmentHeader::getUserDef3, shipmentCode).eq(ShipmentHeader::getShipmentType, QuantityConstant.SHIPMENT_TYPE_BH)
                .eq(ShipmentHeader::getLastStatus, QuantityConstant.SHIPMENT_HEADER_BUILD);
肖超群 authored
996
            ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentLambdaQueryWrapper);
997
            if (shipmentHeader == null) {
肖超群 authored
998
                String code = shipmentHeaderService.createCode(QuantityConstant.SHIPMENT_TYPE_BH);
肖超群 authored
999
                shipmentHeader = new ShipmentHeader();
肖超群 authored
1000
                shipmentHeader.setCode(code);
肖超群 authored
1001
1002
1003
                shipmentHeader.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
                shipmentHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
                shipmentHeader.setShipmentType(QuantityConstant.SHIPMENT_TYPE_BH);
lty authored
1004
                shipmentHeader.setTotalQty(new BigDecimal(pieceBox));
肖超群 authored
1005
                shipmentHeader.setTotalWeight(BigDecimal.ZERO);
lty authored
1006
                shipmentHeader.setTotalLines(1);
肖超群 authored
1007
1008
1009
1010
1011
1012
                shipmentHeader.setPriority(100);
                shipmentHeader.setFirstStatus(0);
                shipmentHeader.setLastStatus(0);
                shipmentHeader.setCreatedBy("WMS");
                shipmentHeader.setCreated(new Date());
                shipmentHeader.setLastUpdated(new Date());
1013
1014
                boolean result = shipmentHeaderService.save(shipmentHeader);
                if (!result) {
肖超群 authored
1015
1016
                    throw new ServiceException("补货通知单生成失败");
                }
肖超群 authored
1017
            }
1018
            if (shipmentHeader != null) {
肖超群 authored
1019
                LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1020
1021
1022
                shipmentDetailLambdaQueryWrapper.eq(ShipmentDetail::getShipmentCode, shipmentHeader.getCode()).eq(ShipmentDetail::getMaterialCode, materialCode)
                    .eq(ShipmentDetail::getProPackaging, proPackaging).eq(ShipmentDetail::getLevel, level).eq(ShipmentDetail::getColor, color)
                    .eq(ShipmentDetail::getProductSchedule, productSchedule);
肖超群 authored
1023
                ShipmentDetail shipmentDetail = shipmentDetailService.getOne(shipmentDetailLambdaQueryWrapper);
1024
                if (shipmentDetail != null) {
肖超群 authored
1025
1026
1027
                    BigDecimal qty = shipmentDetail.getQty();
                    qty = qty.add(new BigDecimal(pieceBox));
                    shipmentDetail.setQty(qty);
肖超群 authored
1028
                    shipmentDetailService.updateById(shipmentDetail);
肖超群 authored
1029
1030
1031
                } else {
                    shipmentDetail = new ShipmentDetail();
                    shipmentDetail.setShipmentId(shipmentHeader.getId());
肖超群 authored
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
                    shipmentDetail.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
                    shipmentDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
                    shipmentDetail.setShipmentCode(shipmentHeader.getCode());
                    shipmentDetail.setMaterialCode(materialCode);
                    shipmentDetail.setMaterialName(materialName);
                    shipmentDetail.setMaterialSpec(materialSpec);
                    shipmentDetail.setMaterialUnit("1001");
                    shipmentDetail.setQty(new BigDecimal(pieceBox));
                    shipmentDetail.setBatch(batch);
                    shipmentDetail.setInventorySts("good");
lty authored
1042
                    shipmentDetail.setProductSchedule(productSchedule);
肖超群 authored
1043
1044
1045
1046
1047
1048
1049
                    shipmentDetail.setStatus(0);
                    shipmentDetail.setCreated(DateUtils.getNowDate());
                    shipmentDetail.setProcessStamp(0 + "");
                    shipmentDetail.setProPackaging(proPackaging);
                    shipmentDetail.setColor(color);
                    shipmentDetail.setLevel(level);
                    boolean result = shipmentDetailService.save(shipmentDetail);
1050
                    if (!result) {
肖超群 authored
1051
1052
                        throw new ServiceException("补货通知单详情生成失败");
                    }
肖超群 authored
1053
1054
1055
                }
            }
1056
        } else {
1057
            LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1058
1059
1060
            shipmentDetailLambdaQueryWrapper.eq(ShipmentDetail::getShipmentCode, taskHeader.getShipmentCode()).eq(ShipmentDetail::getMaterialCode, materialCode)
                .eq(ShipmentDetail::getLevel, level).eq(ShipmentDetail::getColor, color).eq(ShipmentDetail::getBatch, batch)
                .eq(ShipmentDetail::getProductSchedule, productSchedule).eq(ShipmentDetail::getProPackaging, proPackaging);
1061
1062
1063
1064
            ShipmentDetail shipmentDetail = shipmentDetailService.getOne(shipmentDetailLambdaQueryWrapper);
            shipmentDetail.setTaskQty(shipmentDetail.getTaskQty().subtract(BigDecimal.valueOf(size)));
            shipmentDetailService.updateById(shipmentDetail);
        }
肖超群 authored
1065
1066
        return AjaxResult.success("成功");
lty authored
1067
    }
1068
1069
1070
1071
    @Override
    public AjaxResult codeSubstitution(String boxCode, String toBoxCode, String containerCode) {
1072
        // 1.备货区替换 找查备货区库存有没有对应箱码 没有就报错
1073
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1074
1075
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getZoneCode, QuantityConstant.ZONE_STOCK_UP).eq(InventoryDetail::getContainerCode, containerCode)
            .eq(InventoryDetail::getBoxCode, boxCode);
1076
        List<InventoryDetail> inventoryDetails = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
1077
        if (inventoryDetails.size() < 1) {
1078
1079
            return AjaxResult.error("条码不存在于备货区 请到wms库存内确定下");
        }
1080
        for (InventoryDetail inventoryDetail : inventoryDetails) {
1081
1082
1083
1084
1085
1086
            inventoryDetail.setBoxCode(toBoxCode);
            inventoryDetailService.updateById(inventoryDetail);
        }

        return AjaxResult.success("替换成功");
    }
1087
lty authored
1088
    @Override
1089
    public AjaxResult inventory(String boxCode, String containerCode, String chipCode) {
lty authored
1090
1091
        // 先判断有没有这个对应的出库任务主表
lty authored
1092
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
1093
1094
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode).eq(TaskHeader::getTaskType, QuantityConstant.TASK_TYPE_CYCLECOUNT)
            .ne(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
lty authored
1095
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
1096
        if (taskHeader == null) {
lty authored
1097
            return AjaxResult.error("任务不存在");
lty authored
1098
1099
        }
1100
        // 如果没有就是新增的 库存添加
李泰瑜 authored
1101
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1102
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getContainerCode, taskHeader.getContainerCode());
李泰瑜 authored
1103
1104
        List<InventoryDetail> inventoryDetails = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
1105
1106
1107
1108
        int 标识 = 0;
        for (InventoryDetail inventoryDetail : inventoryDetails) {
            if (inventoryDetail.getBoxCode().equals(boxCode)) {
                标识 = 1;
李泰瑜 authored
1109
1110
1111
1112
1113
1114
1115
1116
1117
            }
        }

        InventoryDetail inventoryDetail = inventoryDetails.get(0);

        LambdaQueryWrapper<ProPackaging> proPackagingLambdaQueryWrapper = Wrappers.lambdaQuery();
        proPackagingLambdaQueryWrapper.eq(ProPackaging::getNumber, inventoryDetail.getProPackaging());
        ProPackaging proPackaging = proPackagingService.getOne(proPackagingLambdaQueryWrapper);
1118
        // 1.判断明细有没有对应的
lty authored
1119
        LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1120
        taskDetailLambdaQueryWrapper.eq(TaskDetail::getTaskId, taskHeader.getId()).eq(TaskDetail::getBoxCode, boxCode);
lty authored
1121
1122
        List<TaskDetail> taskDetails = taskDetailService.list(taskDetailLambdaQueryWrapper);
1123
1124
        if (taskDetails.size() < 1) {
            if (标识 == 1) {
李泰瑜 authored
1125
1126
                throw new ServiceException("请勿重复扫");
            }
1127
            if (chipCode.isEmpty()) {
1128
1129
                throw new ServiceException("盘盈请手动输入片码");
            }
1130
            for (int i = 0; i < proPackaging.getPieceBox(); i++) {
李泰瑜 authored
1131
1132
                inventoryDetail.setId(null);
                inventoryDetail.setBoxCode(boxCode);
1133
1134
                inventoryDetail.setChipCode1(chipCode);
                inventoryDetail.setChipCode2("盘盈片码");
李泰瑜 authored
1135
1136
                inventoryDetailService.save(inventoryDetail);
            }
1137
1138
        } else {
            for (TaskDetail taskDetail : taskDetails) {
李泰瑜 authored
1139
1140
                taskDetailService.removeById(taskDetail);
            }
lty authored
1141
1142
1143
1144
        }
        return AjaxResult.success("成功");
    }
1145
1146
    @Override
    public AjaxResult boxCodeInsert(String boxCode, String toBoxCode) {
lty authored
1147
1148
        // 1.先在平库找到对应库存明细
1149
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1150
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getBoxCode, boxCode).eq(InventoryDetail::getZoneCode, QuantityConstant.ZONE_STOCK_UP)
1151
            .eq(InventoryDetail::getUserDef1, "整箱出库");
1152
        List<InventoryDetail> inventoryDetails = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
1153
        if (inventoryDetails.size() < 1) {
lty authored
1154
1155
1156
1157
1158
            return AjaxResult.error("没在平库找到您对应扫的箱码");
        }

        InventoryDetail inventoryDetail = inventoryDetails.get(0);
1159
        // 查出这一箱是多少片 防止这一箱码反复出库找错
lty authored
1160
1161
1162
1163
1164
1165
1166
1167
1168
        LambdaQueryWrapper<ProPackaging> proPackagingLambdaQueryWrapper = Wrappers.lambdaQuery();
        proPackagingLambdaQueryWrapper.eq(ProPackaging::getNumber, inventoryDetail.getProPackaging());
        ProPackaging proPackaging = proPackingService.getOne(proPackagingLambdaQueryWrapper);
        if (proPackaging == null) {
            return AjaxResult.error("没有包装信息");
        }
        int pieceBox = proPackaging.getPieceBox();

        LambdaQueryWrapper<InventoryHistoryDetail> inventoryHistoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1169
1170
        inventoryHistoryDetailLambdaQueryWrapper.eq(InventoryHistoryDetail::getBoxCode, toBoxCode).orderByDesc(InventoryHistoryDetail::getId)
            .last(" limit " + pieceBox);
lty authored
1171
1172
        List<InventoryHistoryDetail> inventoryHistoryDetails = inventoryHistoryDetailService.list(inventoryHistoryDetailLambdaQueryWrapper);
1173
        for (InventoryHistoryDetail inventoryHistoryDetail : inventoryHistoryDetails) {
lty authored
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
            inventoryDetail.setId(null);
            inventoryDetail.setBoxCode(inventoryHistoryDetail.getBoxCode());
            inventoryDetail.setChipCode1(inventoryHistoryDetail.getChipCode1());
            inventoryDetail.setMaterialName(inventoryHistoryDetail.getMaterialName());
            inventoryDetail.setMaterialCode(inventoryHistoryDetail.getMaterialCode());
            inventoryDetail.setMaterialSpec(inventoryHistoryDetail.getMaterialSpec());
            inventoryDetail.setMaterialUnit(inventoryHistoryDetail.getMaterialUnit());
            inventoryDetail.setColor(inventoryHistoryDetail.getColor());
            inventoryDetail.setLevel(inventoryHistoryDetail.getLevel());
            inventoryDetail.setBatch(inventoryHistoryDetail.getBatch());
            inventoryDetail.setInventorySts(inventoryHistoryDetail.getInventorySts());
            inventoryDetail.setProPackaging(inventoryHistoryDetail.getProPackaing());
            inventoryDetail.setProductSchedule(inventoryHistoryDetail.getProductSchedule());
            inventoryDetailService.save(inventoryDetail);
        }
1189
lty authored
1190
        return AjaxResult.success("插入成功");
1191
1192
    }
lty authored
1193
    @Override
1194
1195
1196
    public AjaxResult bulkDelivery(String chipCode, String boxCode, String shipmentCode) {
        // 根据库存明细找查 条件片码跟容器号 要防止有重复片码情况(补码跟退货入库不对可能造成 前端入库没验证要防止前端重复片码)
        // 1.查询片码是否存在这个托盘,必须要存在才执行
lty authored
1197
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1198
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getBoxCode, boxCode).eq(InventoryDetail::getChipCode1, chipCode).last("limit 1");
lty authored
1199
        InventoryDetail inventoryDetail = inventoryDetailService.getOne(inventoryDetailLambdaQueryWrapper);
1200
        if (inventoryDetail == null) {
李泰瑜 authored
1201
            return AjaxResult.error("库存明细里面没有这个对应的片码箱码");
lty authored
1202
1203
        }
1204
        // 2.根据明细找到主表 主表数量减去箱数
lty authored
1205
        InventoryHeader inventoryHeader = inventoryHeaderService.getById(inventoryDetail.getInventoryHeaderId());
1206
        if (inventoryHeader == null) {
lty authored
1207
1208
1209
            return AjaxResult.error("库存头不存在");
        }
1210
        // 5.1先查到任务 根据任务找到出库单
1211
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
1212
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getShipmentCode, shipmentCode).ne(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED).last("limit 1");
1213
1214
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
lty authored
1215
1216
1217
1218
1219
1220
1221
1222
1223
        LambdaQueryWrapper<ProPackaging> proPackagingLambdaQueryWrapper = Wrappers.lambdaQuery();
        proPackagingLambdaQueryWrapper.eq(ProPackaging::getNumber, inventoryHeader.getProPackaging());
        ProPackaging proPackaging = proPackingService.getOne(proPackagingLambdaQueryWrapper);
        if (proPackaging == null) {
            return AjaxResult.error("没有包装信息");
        }
        int pieceBox = proPackaging.getPieceBox();
        inventoryHeader.setBoxQty(inventoryHeader.getBoxQty().subtract(BigDecimal.valueOf(1)));
        inventoryHeader.setTotalQty(inventoryHeader.getTotalQty().subtract(BigDecimal.valueOf(pieceBox)));
1224
        inventoryHeader.setTotalLines(inventoryHeader.getTotalLines() - pieceBox);
1225
        String code = MessageFormat.format("{0}{1}", "LT", String.format("%d", Calendar.getInstance().getTimeInMillis()));
1226
1227
1228
        int inventoryid = inventoryHeader.getId();
        if (inventoryHeader.getTotalQty().subtract(BigDecimal.valueOf(pieceBox)).compareTo(new BigDecimal(1)) == -1) {
1229
            inventoryHeaderService.removeById(inventoryHeader);
1230
        } else {
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
            inventoryHeaderService.updateById(inventoryHeader);
            inventoryHeader.setId(null);
            inventoryHeader.setContainerCode(code);
            inventoryHeader.setLocationCode(code);
            inventoryHeader.setZoneCode(QuantityConstant.ZONE_E);
            inventoryHeader.setBoxQty(BigDecimal.valueOf(0));
            inventoryHeader.setTotalQty(BigDecimal.valueOf(pieceBox - 1));
            inventoryHeader.setTotalLines(1);
            inventoryHeader.setRoadWays("0");
            inventoryHeader.setContainerStatus(QuantityConstant.STATUS_CONTAINER_SOME);
            inventoryHeaderService.save(inventoryHeader);

        }
1245
        // 3.根据主表找查明细
lty authored
1246
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper1 = Wrappers.lambdaQuery();
1247
        inventoryDetailLambdaQueryWrapper1.eq(InventoryDetail::getInventoryHeaderId, inventoryid).eq(InventoryDetail::getBoxCode, inventoryDetail.getBoxCode());
lty authored
1248
1249
        List<InventoryDetail> inventoryDetails = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper1);
1250
        // 4.去除主表id 库位 容器 状态 库区保存
lty authored
1251
1252
1253
1254
1255
1256

        // 5.删除刚刚那个1步查出片码的 写入为第4步的主表
        inventoryDetails.removeIf(inventoryDetail1 -> inventoryDetail1.getId().equals(inventoryDetail.getId()));
        inventoryDetailService.removeById(inventoryDetail.getId());
        for (InventoryDetail inventoryDetail1 : inventoryDetails) {
            inventoryDetail1.setInventoryHeaderId(inventoryHeader.getId());
1257
1258
            inventoryDetail1.setLocationCode(code);
            inventoryDetail1.setContainerCode(code);
lty authored
1259
1260
1261
            inventoryDetailService.updateById(inventoryDetail1);
        }
1262
        // 5.出库单 调拨单数量+1 修改状态
lty authored
1263
1264
        // 5.2查询出库单
lty authored
1265
        LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1266
1267
1268
1269
        shipmentDetailLambdaQueryWrapper.eq(ShipmentDetail::getShipmentCode, shipmentCode).eq(ShipmentDetail::getMaterialCode, inventoryHeader.getMaterialCode())
            .eq(ShipmentDetail::getMaterialName, inventoryHeader.getMaterialName()).eq(ShipmentDetail::getBatch, inventoryHeader.getBatch())
            .eq(ShipmentDetail::getProPackaging, inventoryHeader.getProPackaging()).eq(ShipmentDetail::getProductSchedule, inventoryHeader.getProductSchedule())
            .eq(ShipmentDetail::getLevel, inventoryHeader.getLevel()).eq(ShipmentDetail::getColor, inventoryHeader.getColor());
lty authored
1270
1271
1272
1273
1274
        ShipmentDetail shipmentDetail = shipmentDetailService.getOne(shipmentDetailLambdaQueryWrapper);

        shipmentDetail.setTaskQty(shipmentDetail.getTaskQty().add(BigDecimal.valueOf(1)));
        shipmentDetailService.updateById(shipmentDetail);
        ShipmentHeader shipmentHeader = shipmentHeaderService.getById(shipmentDetail.getShipmentId());
李泰瑜 authored
1275
1276
        if (shipmentHeader.getLastStatus() >= QuantityConstant.RECEIPT_HEADER_POSTING) {
李泰瑜 authored
1277
1278
1279
            throw new ServiceException("当前订单状态不可出散片");
        }
1280
        LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper1 = Wrappers.lambdaQuery();
李泰瑜 authored
1281
        shipmentDetailLambdaQueryWrapper1.eq(ShipmentDetail::getShipmentCode, shipmentCode);
1282
1283
        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(shipmentDetailLambdaQueryWrapper1);
1284
1285
1286
1287
        int 标识9 = 0;
        for (ShipmentDetail shipment : shipmentDetailList) {
            if (shipment.getQty().compareTo(shipment.getTaskQty()) != 0) {
                标识9 = 1;
1288
1289
1290
            }

        }
1291
        if (标识9 == 0) {
lty authored
1292
1293
1294
1295
            shipmentHeader.setLastStatus(QuantityConstant.SHIPMENT_HEADER_COMPLETED);
            shipmentHeader.setFirstStatus(QuantityConstant.SHIPMENT_HEADER_COMPLETED);
            shipmentHeaderService.updateById(shipmentHeader);
        }
1296
1297
        // 5.3查询入库单
lty authored
1298
        LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery();
1299
        receiptHeaderLambda.eq(ReceiptHeader::getShipmentCode, shipmentCode).eq(ReceiptHeader::getReceiptType, QuantityConstant.RECEIPT_TYPE_DIRECT_TRANSGER);
lty authored
1300
1301
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderLambda);
1302
        ReceiptDetail receiptDetail = new ReceiptDetail();
lty authored
1303
1304
        if (receiptHeader == null && inventoryDetail.getQty().intValue() == 1) {
1305
            AjaxResult result = receiptHeaderService.createDirectTransferReceipt(shipmentHeader);
1306
            ReceiptHeader receiptHeader1 = receiptHeaderService.getById((int)result.getData());
1307
            receiptHeader = receiptHeader1;
1308
            LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1309
            receiptDetailLambdaQueryWrapper.eq(ReceiptDetail::getReceiptId, receiptHeader1.getId()).last(" limit 1");
1310
            receiptDetail = receiptDetailService.getOne(receiptDetailLambdaQueryWrapper);
1311
1312
1313
1314
1315
            int 标识2 = 0;
            for (ShipmentDetail shipment : shipmentDetailList) {
                if (shipment.getQty().compareTo(shipment.getTaskQty()) != 0) {
                    标识2 = 1;
1316
1317
1318
1319
                }

            }
1320
1321
            if (标识2 == 0) {
                if (receiptHeader1.getLastStatus().intValue() < QuantityConstant.RECEIPT_HEADER_POSTING) {
1322
1323
1324
1325
                    receiptHeader1.setLastStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
                    receiptHeader1.setFirstStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
                    receiptHeaderService.updateById(receiptHeader1);
                }
1326
            }
1327
1328
        } else {
1329
            LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1330
            receiptDetailLambdaQueryWrapper.eq(ReceiptDetail::getMaterialCode, inventoryHeader.getMaterialCode())
1331
1332
1333
                .eq(ReceiptDetail::getMaterialName, inventoryHeader.getMaterialName()).eq(ReceiptDetail::getBatch, inventoryHeader.getBatch())
                .eq(ReceiptDetail::getProPackaging, inventoryHeader.getProPackaging()).eq(ReceiptDetail::getProductSchedule, inventoryHeader.getProductSchedule())
                .eq(ReceiptDetail::getLevel, inventoryHeader.getLevel()).eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
1334
1335
1336
1337
            receiptDetail = receiptDetailService.getOne(receiptDetailLambdaQueryWrapper);

            receiptDetail.setTaskQty(receiptDetail.getTaskQty().add(BigDecimal.valueOf(1)));
            receiptDetailService.updateById(receiptDetail);
1338
1339

            LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper1 = Wrappers.lambdaQuery();
1340
            receiptDetailLambdaQueryWrapper1.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
1341
1342
            List<ReceiptDetail> details = receiptDetailService.list(receiptDetailLambdaQueryWrapper1);
1343
1344
1345
1346
            int 标识1 = 0;
            for (ReceiptDetail receiptDetail2 : details) {
                if (receiptDetail2.getQty().compareTo(receiptDetail2.getTaskQty()) != 0) {
                    标识1 = 1;
1347
1348
                }
            }
1349
1350
            if (标识1 == 0) {
                if (receiptHeader.getLastStatus().intValue() < QuantityConstant.RECEIPT_HEADER_POSTING) {
1351
1352
1353
1354
                    receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
                    receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_POSTING);
                    receiptHeaderService.updateById(receiptHeader);
                }
1355
            }
李泰瑜 authored
1356
lty authored
1357
1358
        }
1359
        if (receiptHeader.getLastStatus().equals(QuantityConstant.RECEIPT_HEADER_POSTING)) {
1360
1361
            pdaService.createSPShipment(Collections.singletonList(shipmentHeader));
        }
lty authored
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
        InventoryHistoryHeader inventoryHistoryHandler = new InventoryHistoryHeader();
        inventoryHistoryHandler.setId(inventoryHeader.getId());
        inventoryHistoryHandler.setContainerCode(inventoryHeader.getContainerCode());
        inventoryHistoryHandler.setWarehouseCode(inventoryHeader.getWarehouseCode());
        inventoryHistoryHandler.setLocationCode(inventoryHeader.getLocationCode());
        inventoryHistoryHandler.setZoneCode(inventoryHeader.getZoneCode());
        inventoryHistoryHandler.setContainerStatus(inventoryHeader.getContainerStatus());
        inventoryHistoryHandler.setCompanyCode(inventoryHeader.getCompanyCode());
        inventoryHistoryHandler.setStack(inventoryHeader.getStack());
        inventoryHistoryHandler.setMaterialCode(inventoryHeader.getMaterialCode());
        inventoryHistoryHandler.setMaterialName(inventoryHeader.getMaterialName());
        inventoryHistoryHandler.setMaterialSpec(inventoryHeader.getMaterialSpec());
        inventoryHistoryHandler.setMaterialUnit(inventoryHeader.getMaterialUnit());
        inventoryHistoryHandler.setLevel(inventoryHeader.getLevel());
        inventoryHistoryHandler.setColor(inventoryHeader.getColor());
        inventoryHistoryHandler.setProPackaging(inventoryHeader.getProPackaging());
        inventoryHistoryHandler.setProductSchedule(inventoryHeader.getProductSchedule());
        inventoryHistoryHandler.setBatch(inventoryHeader.getBatch());
        inventoryHistoryHandler.setReceiptCode(receiptHeader.getCode());
        inventoryHistoryHandler.setShipmentCode(shipmentHeader.getCode());
        inventoryHistoryHandler.setOrderCode(shipmentHeader.getReferCode());
        inventoryHistoryHandler.setOrderName(shipmentHeader.getCustomerName());
        inventoryHistoryHandler.setTotalQty(BigDecimal.ZERO);
        inventoryHistoryHandler.setTotalLines(0);
        inventoryHistoryHandler.setUserDef1("销售出库");
        inventoryHistoryHeaderService.save(inventoryHistoryHandler);
1389
        // 6.出库的单片插入到追溯表
lty authored
1390
1391
1392
1393
        InventoryHistoryDetail inventoryHistoryDetail = new InventoryHistoryDetail();
        inventoryHistoryDetail.setInventoryHistoryHeaderId(inventoryHistoryHandler.getId());
        inventoryHistoryDetail.setWarehouseCode("CS0001");
        inventoryHistoryDetail.setZoneCode("D");
李泰瑜 authored
1394
        inventoryHistoryDetail.setContainerCode(inventoryDetail.getContainerCode());
1395
        if (taskHeader != null) {
1396
            inventoryHistoryDetail.setLocationCode(taskHeader.getFromLocation());
1397
        } else {
1398
1399
            inventoryHistoryDetail.setLocationCode("散片区E");
        }
lty authored
1400
1401
1402
1403
1404
1405
1406
        inventoryHistoryDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
        inventoryHistoryDetail.setChipCode1(inventoryDetail.getChipCode1());
        inventoryHistoryDetail.setMaterialCode(inventoryDetail.getMaterialCode());
        inventoryHistoryDetail.setMaterialName(inventoryDetail.getMaterialName());
        inventoryHistoryDetail.setMaterialSpec(inventoryDetail.getMaterialSpec());
        inventoryHistoryDetail.setMaterialUnit(inventoryDetail.getMaterialUnit());
        inventoryHistoryDetail.setProPackaing(inventoryDetail.getProPackaging());
1407
1408
1409
1410
        inventoryHistoryDetail.setProductSchedule(inventoryDetail.getProductSchedule());// 排产订单
        inventoryHistoryDetail.setProductSize(inventoryDetail.getProductSize());// 产品规格
        inventoryHistoryDetail.setLevel(inventoryDetail.getLevel());// 等级
        inventoryHistoryDetail.setColor(inventoryDetail.getColor());// 色号
lty authored
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
        inventoryHistoryDetail.setQty(BigDecimal.ONE);
        inventoryHistoryDetail.setTaskQty(BigDecimal.ZERO);
        inventoryHistoryDetail.setBatch(inventoryDetail.getBatch());
        inventoryHistoryDetail.setReceiptCode(inventoryDetail.getReceiptCode());
        inventoryHistoryDetail.setBoxCode(inventoryDetail.getBoxCode());
        inventoryHistoryDetail.setInventorySts(QuantityConstant.QUALITY_GOOD);
        inventoryHistoryDetail.setCreatedBy(QuantityConstant.PLATFORM_WMS);
        inventoryHistoryDetail.setLastUpdatedBy(QuantityConstant.PLATFORM_WMS);
        inventoryHistoryDetail.setReceiptDetailId(receiptDetail.getId());
        inventoryHistoryDetail.setUserDef1("退货入库");
        inventoryHistoryDetailService.save(inventoryHistoryDetail);
lty authored
1422
        return AjaxResult.success("单片出库成功");
lty authored
1423
1424
    }
李泰瑜 authored
1425
1426
    @Override
    public AjaxResult chipCode(String boxCode) {
1427
        // 1.立库 或 平库
李泰瑜 authored
1428
1429
1430
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getBoxCode, boxCode);
        List<InventoryDetail> inventoryDetails = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
1431
        if (inventoryDetails.size() > 0) {
李泰瑜 authored
1432
1433
1434
1435
            List<String> ChipS = inventoryDetails.stream().map(t -> t.getChipCode1()).distinct().collect(Collectors.toList());
            return AjaxResult.success(ChipS);
        }
1436
        // 2.出库缓存表
李泰瑜 authored
1437
        LambdaQueryWrapper<InventoryHistoryDetail> inventoryHistoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
1438
        inventoryHistoryDetailLambdaQueryWrapper.eq(InventoryHistoryDetail::getBoxCode, boxCode);
李泰瑜 authored
1439
        List<InventoryHistoryDetail> inventoryHistoryDetails = inventoryHistoryDetailService.list(inventoryHistoryDetailLambdaQueryWrapper);
1440
        if (inventoryHistoryDetails.size() > 0) {
李泰瑜 authored
1441
1442
1443
1444
1445
1446
1447
            List<String> ChipS = inventoryHistoryDetails.stream().map(t -> t.getChipCode1()).distinct().collect(Collectors.toList());
            return AjaxResult.success(ChipS);
        }

        return AjaxResult.error("没有查到对应片码");
    }
李泰瑜 authored
1448
1449
1450
    @Override
    public AjaxResult goOnline(String port, String barcode) {
        Map<String, Object> paramMap = new HashMap();
1451
1452
        paramMap.put("port", port);
        paramMap.put("barcode", barcode);
李泰瑜 authored
1453
        String jsonParam = JSON.toJSONString(paramMap);
李泰瑜 authored
1454
        String url = addressService.selectAddress(QuantityConstant.WCS_PUSH_ARTIFICIAL);
李泰瑜 authored
1455
        String result = OkHttpUtils.bodypost(url, jsonParam);
1456
        if (com.huaheng.common.utils.StringUtils.isEmpty(result)) {
李泰瑜 authored
1457
1458
1459
            throw new ServiceException("接口地址错误或返回为空");
        }
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
1460
        if (ajaxResult.getCode() != HttpConstant.OK) {
李泰瑜 authored
1461
1462
            return AjaxResult.error(ajaxResult.getMsg());
        }
李泰瑜 authored
1463
        return AjaxResult.success("请求wcs成功");
李泰瑜 authored
1464
1465
    }
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
//    @Override
//    public AjaxResult generateDoc(String boxCode, String containerCode) {
//        //出砖
//        //1.新建出库单
//
//        ShipmentHeader shipmentHeader=new ShipmentHeader();
//        shipmentHeader.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
//        shipmentHeader.setShipmentType(QuantityConstant.SHIPMENT_TYPE_BH);
//        shipmentHeader.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
//        String code = shipmentHeaderService.createCode(shipmentHeader.getShipmentType());
//        shipmentHeader.setId(null);
//        shipmentHeader.setLastUpdated(null);
//        shipmentHeader.setLastUpdatedBy("WMS");
//        shipmentHeader.setFirstStatus(0);
//        shipmentHeader.setLastStatus(0);
//        shipmentHeader.setCreated(null);
//        shipmentHeader.setCreatedBy("WMS");
//        shipmentHeader.setCode(code);
//        boolean result = shipmentHeaderService.save(shipmentHeader);
//
//        ShipmentDetail shipmentDetail=new ShipmentDetail();
//        shipmentDetail.setId(null);
//        shipmentDetail.setShipmentId(shipmentHeader.getId());
//        shipmentDetail.setWarehouseCode(QuantityConstant.DEFAULT_WAREHOUSE);
//        shipmentDetail.setCompanyCode(QuantityConstant.DEFAULT_COMPANY);
//        shipmentDetail.setShipmentCode(shipmentHeader.getCode());
//        shipmentDetail.setMaterialCode(materialCode);
//        shipmentDetail.setQty(BigDecimal.valueOf(1));
//        shipmentDetail.setBatch(batch);
//        shipmentDetail.setInventorySts(QuantityConstant.QUALITY_GOOD);
//        shipmentDetail.setProPackaging(proPackaging);
//        shipmentDetail.setProductSchedule(productSchedule);
//        shipmentDetail.setLevel(level);
//        shipmentDetail.setColor(color);
//        shipmentDetail.setMaterialSpec(materialSpec);
//        shipmentDetail.setMaterialName(materialName);
//        boolean save = shipmentDetailService.save(shipmentDetail);
//
//
//
//        int lastStatus = shipmentHeader.getLastStatus();
//        if(lastStatus == QuantityConstant.SHIPMENT_HEADER_SHIPPING) {
//            return AjaxResult.error("出库单正在出库中");
//        }
//        LambdaQueryWrapper<ShipmentDetail> shipmentDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
//        shipmentDetailLambdaQueryWrapper.eq(ShipmentDetail::getShipmentId, shipmentHeader.getId());
//        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(shipmentDetailLambdaQueryWrapper);
//        if(shipmentDetailList.size() == 0) {
//            return AjaxResult.error("根据出库单,没有找到出库单详情");
//        }
//        AjaxResult ajaxResult = shipmentContainerHeaderService.autoShipmentCombination(shipmentDetailList);
//        if(ajaxResult.hasErr()) {
//            return ajaxResult;
//        }
//
//        List<Integer> list = (List<Integer>)ajaxResult.getData();
//        list = list.stream().distinct().collect(Collectors.toList());
//        if(list.size() == 0) {
//            return AjaxResult.error("出库单已经出库完毕");
//        }
//        long shipmentOrder = System.currentTimeMillis();
//        int sequenceNumber = list.size();
//        int sequence = 0;
//        for(int id : list) {
//            sequence++;
//            ShipmentContainerHeader shipmentContainerHeader = shipmentContainerHeaderService.getById(id);
//            if(shipmentContainerHeader == null) {
//                throw new ServiceException("没有找到出库表头:" + id);
//            }
//            shipmentContainerHeader.setPortGroup(QuantityConstant.PORTGROUP_P10);
//            shipmentContainerHeaderService.updateById(shipmentContainerHeader);
//            AjaxResult ajaxResults = shipmentTaskService.createSortingShipmentTaskFromShipmentContainer(
//                    id, shipmentOrder, sequence, sequenceNumber);
//            if (ajaxResults.hasErr()) {
//                throw new ServiceException("任务生成失败");
//            }
//            Object data = ajaxResults.getData();
//            int i = Integer.parseInt(data.toString());
//            TaskHeader taskHeader = taskHeaderService.getById(Integer.parseInt(data.toString()));
//            taskHeader.setShipmentOrder(taskHeader.getShipmentOrder()-1000000000);
//            taskHeader.setPriority(9999);
//            taskHeaderService.updateById(taskHeader);
//        }
//        shipmentHeader.setFirstStatus(QuantityConstant.SHIPMENT_HEADER_SHIPPING);
//        shipmentHeader.setLastStatus(QuantityConstant.SHIPMENT_HEADER_SHIPPING);
//        shipmentHeaderService.updateById(shipmentHeader);
//
//        return AjaxResult.success("处理成功");
//    }
1556
}