Blame view

src/main/java/com/huaheng/pc/receipt/receiptContainerHeader/service/ReceiptContainerHeaderServiceImpl.java 57 KB
1
2
package com.huaheng.pc.receipt.receiptContainerHeader.service;
3
import com.alibaba.fastjson.JSONException;
mahuandong authored
4
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
5
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
mahuandong authored
6
7
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
mahuandong authored
8
import com.huaheng.common.utils.StringUtils;
9
import com.huaheng.common.utils.Wrappers;
mahuandong authored
10
11
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
12
import com.huaheng.framework.web.service.ConfigService;
mahuandong authored
13
import com.huaheng.mobile.receipt.ReceiptBill;
周鸿 authored
14
15
import com.huaheng.pc.config.company.domain.CompanyU8;
import com.huaheng.pc.config.company.service.CompanyU8Service;
16
17
import com.huaheng.pc.config.configValue.domain.ConfigValue;
import com.huaheng.pc.config.configValue.mapper.ConfigValueMapper;
mahuandong authored
18
19
20
21
22
23
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
24
25
import com.huaheng.pc.config.receiptPreference.domain.ReceiptPreference;
import com.huaheng.pc.config.receiptPreference.mapper.ReceiptPreferenceMapper;
mahuandong authored
26
27
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
mahuandong authored
28
29
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
30
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
mahuandong authored
31
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView;
32
import com.huaheng.pc.receipt.receiptContainerHeader.mapper.ReceiptContainerHeaderMapper;
mahuandong authored
33
34
35
36
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;
37
38
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.service.ShipmentContainerHeaderService;
周鸿 authored
39
import com.huaheng.pc.srm.service.FinishedProductService;
40
import com.huaheng.pc.system.dict.service.IDictDataService;
41
42
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
mahuandong authored
43
44
45
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.stereotype.Service;
46
import org.springframework.transaction.annotation.Isolation;
mahuandong authored
47
48
49
50
51
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.MessageFormat;
周鸿 authored
52
import java.util.*;
53
54
55
56

/**
 * @author huaheng
 */
57
@Service
58
public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContainerHeaderMapper, ReceiptContainerHeader> implements ReceiptContainerHeaderService {
59
mahuandong authored
60
61
62
63
64
65
66
67
68
69
70
71
72
73
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private LocationService locationService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private MaterialService materialService;
    @Resource
    private ContainerService containerService;
    @Resource
    private ReceiptHeaderService receiptHeaderService;
74
75
    @Resource
    private InventoryDetailService inventoryDetailService;
76
77
78
79
    @Resource
    private ReceiptPreferenceMapper receiptPreferenceMapper;
    @Resource
    private ConfigValueMapper configValueMapper;
80
81
    @Resource
    private ConfigService configService;
82
83
    @Resource
    private ShipmentContainerHeaderService shipmentContainerHeaderService;
周鸿 authored
84
85
86
87
    @Resource
    private CompanyU8Service companyU8Service;
    @Resource
    private FinishedProductService finishedProductService;
88
89
    @Resource
    private IDictDataService dictDataService;
90
91
    @Resource
    private TaskDetailService taskDetailService;
92
肖超群 authored
93
mahuandong authored
94
95
    /**
     * 保存入库组盘
96
97
98
99
100
101
     * param receiptCode 入库单编码
     * param containerCode 容器编码
     * param receiptDetailId 入库单详情id
     * param locationCode 库位编码
     * param qty 收货数量
     * param locatingRule 定位规则
102
     *
mahuandong authored
103
104
105
     * @return 是否保存成功
     */
    @Override
周鸿 authored
106
    @Transactional(rollbackFor = Exception.class)
107
    public AjaxResult saveContainer(ReceiptContainerView receivingDamain) {
108
109
110
111
112
113
        String receiptCode = receivingDamain.getReceiptCode();
        String containerCode = receivingDamain.getContainerCode();
        Integer receiptDetailId = receivingDamain.getReceiptDetailId();
        String locationCode = receivingDamain.getLocationCode();
        BigDecimal qty = receivingDamain.getQty();
        String locatingRule = receivingDamain.getLocatingRule();
mahuandong authored
114
        ReceiptDetail detail = receiptDetailService.getById(receiptDetailId);
115
肖超群 authored
116
        BigDecimal receiptQty = detail.getQty().subtract(detail.getTaskQty());
117
118
        if (receiptQty.compareTo(qty) < 0) {
            return AjaxResult.error("入库明细可用数量" + receiptQty + ",收货数量" + qty + ";不允许超收");
肖超群 authored
119
        }
120
121
122
        if (ShiroUtils.getWarehouseCode().equals("KS0001")) {
            if (StringUtils.isEmpty(detail.getUWarehouseCode())) {
123
124
125
                throw new ServiceException("该单据没有关联u8仓库");
            }
        }
mahuandong authored
126
127
        //检查容器编码合法性
        Integer taskType = checkContainer(containerCode, detail.getMaterialCode());
128
        switch (taskType) {
129
130
            case 1:
                //创建临时容器
肖超群 authored
131
132
//            containerCode = createContainer();
//            taskType = QuantityConstant.TASK_TYPE_WHOLERECEIPT;
133
134
135
                throw new ServiceException("没有容器");
            case 2:
                throw new ServiceException("该物料不能放在这个容器上,请检查该物料是否可以混放");
周鸿 authored
136
            case 3:
137
                return AjaxResult.error("该物料不能放在这个容器或货架上,该容器已被其他操作员使用");
138
            default:
139
140
141
                if (taskType == 0) {
                    throw new ServiceException("容器状态未知");
                }
142
143
144
145
                break;
        }

        /*if (taskType == 1) {
肖超群 authored
146
            throw new ServiceException("没有容器");
147
        } else if (taskType == 2) {
mahuandong authored
148
149
            throw new ServiceException("该物料不能放在这个容器上,请检查该物料是否可以混放");
        } else {
mahuandong authored
150
            if (taskType == 0){ throw new ServiceException("容器状态未知"); }
151
        }*/
152
游杰 authored
153
        if (QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT == taskType.intValue()) {
游杰 authored
154
            Container container = containerService.getContainerByCode(containerCode);
mahuandong authored
155
156
            if (StringUtils.isNotNull(container) && StringUtils.isNotEmpty(container.getLocationCode())) {
                locationCode = container.getLocationCode();
157
            }
mahuandong authored
158
        }
mahuandong authored
159
160
        //检查库位编码合法性
        checkLocationCode(locationCode, containerCode, taskType);
mahuandong authored
161
162
        int unCompleteCombineNumber = shipmentContainerHeaderService.getUnCompleteCombineNumber(containerCode);
163
        if (unCompleteCombineNumber > 0) {
164
165
            throw new ServiceException("该托盘已经用于出库组盘");
        }
mahuandong authored
166
167
168
169
        /* 新建保存组盘头表记录*/
        //根据容器编码查询组盘表头记录
        LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptContainerHeader::getContainerCode, containerCode)
170
                .le(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_TASK);
171
172
        lambda.last("limit 1");
        ReceiptContainerHeader receiptContainerHeader = this.getOne(lambda);
mahuandong authored
173
174
//        ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
175
        //当size大于等于1表示容器已经有组盘了
176
        if (receiptContainerHeader == null) {
mahuandong authored
177
            ReceiptDetail receiptDetail = receiptDetailService.getById(receiptDetailId);
178
            // 创建组盘头表
179
180
            receiptContainerHeader = createReceiptContainerHeader(receiptContainerHeader, containerCode, locationCode, receiptDetail, taskType, locatingRule);
            if (!this.save(receiptContainerHeader)) {
mahuandong authored
181
182
183
                throw new ServiceException("入库组盘头表保存失败");
            }
        } else {
184
//            receiptContainerHeader = list.get(0);
185
            if (receiptContainerHeader.getStatus() > QuantityConstant.RECEIPT_CONTAINER_TASK && receiptContainerHeader.getStatus() < QuantityConstant.RECEIPT_CONTAINER_FINISHED) {
mahuandong authored
186
187
188
                throw new ServiceException("容器已经生成任务,不能放物料了!");
            }
        }
周鸿 authored
189
//        List<ReceiptContainerHeader> receiptContainerHeaders = this.list(lambda);
mahuandong authored
190
191
192
193
        /* 更新入库单详情的收货数量*/
        //根据入库单详情id查询入库详情
        ReceiptDetail receiptDetail = receiptDetailService.getById(receiptDetailId);
        receiptDetail.setId(receiptDetailId);
肖超群 authored
194
        receiptDetail.setTaskQty(qty.add(receiptDetail.getTaskQty()));
mahuandong authored
195
        //更新入库单详情的收货数量
196
        if (!receiptDetailService.updateById(receiptDetail)) {
mahuandong authored
197
198
199
200
            throw new ServiceException("更新入库单详情失败");
        }

        receiptDetail = receiptDetailService.getById(receiptDetailId);
201
        //save组盘明细
周鸿 authored
202
        receiptContainerDetailAdd(receiptContainerHeader, receiptDetail, qty, containerCode, locationCode);
mahuandong authored
203
        //如果单据数量等于已收数量,更新入库详情状态和入库单状态
204
205
        if (receiptDetail.getQty().compareTo(receiptDetail.getTaskQty()) == 0) {
            if (StringUtils.isNotEmpty(locationCode)) {
mahuandong authored
206
207
208
209
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_POSITION.toString());
            } else {
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_RECEIVING.toString());
            }
210
            if (!receiptDetailService.updateById(receiptDetail)) {
mahuandong authored
211
212
213
214
                throw new ServiceException("更新入库详情处理标记失败");
            }

            ReceiptDetail receiptDetail1 = receiptDetailService.queryflow(receiptDetail);
215
            if (!receiptDetailService.updateById(receiptDetail1)) {
mahuandong authored
216
217
218
219
                throw new ServiceException("更新入库详情下一流程失败");
            }
        }
        receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
肖超群 authored
220
        return AjaxResult.success("组盘成功");
mahuandong authored
221
222
    }
223
    public ReceiptContainerHeader createReceiptContainerHeader(ReceiptContainerHeader receiptContainerHeader
224
            , String containerCode, String locationCode, ReceiptDetail receiptDetail, Integer taskType, String locatingRule) {
225
        Container container = containerService.getContainerByCode(containerCode);
226
        if (ShiroUtils.getWarehouseCode().equals("KS0001")) {
227
228
229
230
231
232
233
234
            if(!container.getContainerType().equals("J")){
                if (!container.getCompanyCode().equals(receiptDetail.getCompanyCode())) {
                    throw new ServiceException("容器货主属性和单据不一致,请换容器");
                }
                if (StringUtils.isNotEmpty(receiptDetail.getUWarehouseCode()) && StringUtils.isNotEmpty(container.getUWarehouseCode())) {
                    if (!container.getUWarehouseCode().equals(receiptDetail.getUWarehouseCode())) {
                        throw new ServiceException("容器仓库属性和单据不一致,请换容器");
                    }
235
236
237
                }
            }
        }
238
        receiptContainerHeader = new ReceiptContainerHeader();
239
240
241
        receiptContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
        receiptContainerHeader.setCompanyCode(receiptDetail.getCompanyCode());
        receiptContainerHeader.setContainerCode(containerCode);
242
243
244
        receiptContainerHeader.setContainerType(container.getContainerType());
        receiptContainerHeader.setTaskType(taskType);
tongzhonghao authored
245
        //判断地面托盘
246
        if ("D".equals(container.getContainerType())) {
tongzhonghao authored
247
248
249
250
            receiptContainerHeader.setToLocation(container.getLocationCode());
            receiptContainerHeader.setFromLocation(container.getLocationCode());
            taskType = QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT;
        }
251
        if (ShiroUtils.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_KS)) {
周鸿 authored
252
253
254
255
            //U8工单领料齐套验证
            ksCheckMesReceipt(receiptDetail);
        }
256
        if (taskType.equals(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT)) {
257
258
259
            if(StringUtils.isEmpty(container.getLocationCode())){
                throw new ServiceException("补充入库,该托盘没有绑定库位"+container.getCode());
            }
260
            receiptContainerHeader.setFromLocation(container.getLocationCode());
261
            Location location = locationService.getLocationByCode(container.getLocationCode());
262
            String value = dictDataService.getDictValueByLabel(QuantityConstant.RULE_TASK_LOCATION, location.getZoneCode(), ShiroUtils.getWarehouseCode());
263
            int taskLocationRule = Integer.parseInt(value);
264
            if (taskLocationRule == QuantityConstant.RULE_TASK_SET_LOCATION) {
265
266
267
                receiptContainerHeader.setToLocation(container.getLocationCode());
            }
        } else {
268
//            receiptContainerHeader.setPort("P1004");
269
270
271
            receiptContainerHeader.setToLocation(locationCode);
        }
        receiptContainerHeader.setProjectNo(receiptDetail.getProjectNo());
272
273
        receiptContainerHeader.setCreatedBy(ShiroUtils.getLoginName()==null?"wms":ShiroUtils.getLoginName());
        receiptContainerHeader.setLastUpdatedBy(ShiroUtils.getLoginName()==null?"wms":ShiroUtils.getLoginName());
274
275
276
        receiptContainerHeader.setLocatingRule(locatingRule);
        return receiptContainerHeader;
    }
277
周鸿 authored
278
    //U8工单领料齐套验证
279
280
281
    public void ksCheckMesReceipt(ReceiptDetail receiptDetail) {
        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
        if (receiptHeader.getReceiptType().equals("SI") && StringUtils.isNotEmpty(receiptDetail.getReferLineNum())) {
周鸿 authored
282
283
284
            CompanyU8 companyWu = new CompanyU8();
            companyWu.setCompanyCode(receiptHeader.getCompanyCode());
            companyWu = companyU8Service.getByCode(companyWu);
285
            if (companyWu == null) {
周鸿 authored
286
287
288
                throw new ServiceException("入库单对应的U8账套不存在");
            }
            Map detailMap = new HashMap();
289
290
291
            detailMap.put("MODID", receiptDetail.getReferLineNum());
            detailMap.put("iQuantity", receiptDetail.getQty().subtract(receiptDetail.getTaskQty()));
            detailMap.put("itemcode", receiptDetail.getMaterialCode());
周鸿 authored
292
293
294
295

            List<Map> maps = new ArrayList<>();
            maps.add(detailMap);
296
297
298
            Map<String, Object> map = new HashMap();
            map.put("CompanyCode", companyWu.getUCompanyCode());
            map.put("details", maps);
周鸿 authored
299
            AjaxResult ajaxResult = finishedProductService.checkMesReceipt(map);
300
            if (ajaxResult.hasErr()) {
周鸿 authored
301
302
303
304
                throw new ServiceException(ajaxResult.getMsg());
            }
        }
    }
305
mahuandong authored
306
    /**
307
     * 超收检查
308
     *
309
310
311
     * @param detail
     * @param qty
     */
312
    private void checkOverReceiving(ReceiptDetail detail, BigDecimal qty) {
肖超群 authored
313
        BigDecimal _total = detail.getTaskQty().add(qty);
314
        if (_total.compareTo(detail.getQty()) <= 0) {
315
316
317
318
319
            //收货量<=明细总量
            return;
        }

        ConfigValue configValue = configValueMapper.getConfigValue(ShiroUtils.getWarehouseCode(), "receipt");
320
321
        ReceiptPreference preference = receiptPreferenceMapper.getReceiptPreference(ShiroUtils.getWarehouseCode(), configValue.getValue());
        if (!preference.getAllowOverReceiving()) {
322
323
324
325
326
327
328
            //入库首选项配置为不允许超收
            throw new ServiceException(String.format("不允许超收"));
        }

        //超收比例
        BigDecimal _over_rate = new BigDecimal(String.valueOf(1 + preference.getAllowOverReceivingQty() / 100.0));
        //超收量上限
329
330
        BigDecimal _total_over = detail.getQty().multiply(_over_rate);
        if (_total_over.compareTo(_total) >= 0) {
331
332
333
334
335
336
            //在入库首选项的超收范围内
            return;
        }

        //超过了入库首选项配置的超收比例
        throw new ServiceException(String.format("超收上限是: %s%",
337
                _over_rate.multiply(new BigDecimal(100))));
338
339
340
    }

    /**
mahuandong authored
341
     * 批量撤销入库组盘
342
     *
343
344
     * @param ids 容器头表标识列表
     * @return true 全部取消成功
mahuandong authored
345
346
     */
    @Override
mahuandong authored
347
    @Transactional(rollbackFor = Exception.class)
mahuandong authored
348
349
350
    public Boolean cancelByIds(List<Integer> ids) {
        for (Integer id : ids) {
            //如果已生成任务则不允许取消组盘
351
            if (this.getById(id).getStatus() < QuantityConstant.RECEIPT_CONTAINER_TASK) {
mahuandong authored
352
353
354
355
356
357
                //根据组盘头表id查询组盘明细表
                LambdaQueryWrapper<ReceiptContainerDetail> containerDetailLambda = Wrappers.lambdaQuery();
                containerDetailLambda.eq(ReceiptContainerDetail::getReceiptContainerId, id);
                List<ReceiptContainerDetail> receiptContainerDetails = receiptContainerDetailService.list(containerDetailLambda);

                //查询入库单明细,减去已收数量,更新单据
358
                for (ReceiptContainerDetail receiptContainerDetail : receiptContainerDetails) {
mahuandong authored
359
                    ReceiptDetail receiptDetail = receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId());
肖超群 authored
360
                    receiptDetail.setTaskQty(receiptDetail.getTaskQty().subtract(receiptContainerDetail.getQty()));
361
362
363
                    if (!receiptDetailService.updateById(receiptDetail)) {
                        throw new ServiceException("回滚入库明细失败");
                    }
mahuandong authored
364
365
366
367
368
369
370
371
372

                    containerDetailLambda = Wrappers.lambdaQuery();
                    containerDetailLambda.eq(ReceiptContainerDetail::getReceiptId, receiptContainerDetail.getReceiptId());
                    List<ReceiptContainerDetail> containerDetailList = receiptContainerDetailService.list(containerDetailLambda);

                    //如果是临时容器,取消组盘时删除容器表
                    containerService.removeContainer(receiptContainerDetail.getContainerType(), receiptContainerDetail.getContainerCode());

                    //如果入库组盘没有该入库单的组盘信息,回滚入库单状态
373
                    if (containerDetailList == null) {
mahuandong authored
374
375
376
377
378
379
                        ReceiptHeader receiptHeader = new ReceiptHeader();
                        receiptHeader.setId(receiptContainerDetail.getReceiptId());
                        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
                        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
                        receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
380
381
382
                        if (!receiptHeaderService.updateById(receiptHeader)) {
                            throw new ServiceException("回滚头表状态失败");
                        }
mahuandong authored
383
384
                    }
385
386
                    if (!receiptContainerDetailService.removeById(receiptContainerDetail.getId())) {
                        throw new ServiceException("删除入库组盘明细表失败,id是" + receiptContainerDetail.getId());
mahuandong authored
387
388
389
                    }
                }
                //删除入库组盘头表
390
                if (!this.removeById(id)) {
mahuandong authored
391
392
393
394
395
396
397
398
399
400
401
402
                    throw new ServiceException("删除入库组盘头表失败");
                }
            } else {
                throw new ServiceException("已生成任务不允许取消");
            }
        }
        return true;
    }

    /**
     * 检查容器状态
     *
403
404
     * @param record 容器实列
     * @return 成功 ;可以使用容器
mahuandong authored
405
406
407
408
409
     */
    @Override
    public AjaxResult checkContainer(ReceiptContainerView record) {
        //容器都是单据SN码,每个入库单都是新增容器
410
        if (com.huaheng.common.utils.StringUtils.isEmpty(record.getContainerCode())) {
mahuandong authored
411
412
413
            throw new ServiceException("容器不能为空");
        }
414
        if (taskHeaderService.UncompleteCount(record.getContainerCode()).intValue() > 0) {
mahuandong authored
415
416
417
418
419
420
421
422
423
424
425
426
            throw new ServiceException("容器已经存在任务,请更换容器");
        }
        return AjaxResult.success("");
    }


    @Override
    public AjaxResult batchSave(List<ReceiptContainerView> list) {
        if (list.size() < 1) {
            throw new ServiceException("收货明细是空!");
        }
        checkContainer(list.get(0));
427
游杰 authored
428
429
        AjaxResult ajaxResult = null;
        for (ReceiptContainerView receiptContainerView : list) {
430
           /* ReceivingDamain receivingDamain=new ReceivingDamain();
431
            com.huaheng.common.utils.bean.BeanUtils.copyBeanProp(receivingDamain, receiptContainerView);
432
            receivingDamain.setContainerCode(receiptContainerView.getReceiptContainerCode());*/
433
434
            ajaxResult = saveContainer(receiptContainerView);
游杰 authored
435
436
        }
        return ajaxResult;
mahuandong authored
437
438
    }
xumiao authored
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
    @Override
    public AjaxResult PDAbatchSave(List<ReceiptContainerView> list) {
        if (list.size() < 1) {
            throw new ServiceException("收货明细是空!");
        }
        checkContainer(list.get(0));

        AjaxResult ajaxResult = null;
        for (ReceiptContainerView receiptContainerView : list) {
           /* ReceivingDamain receivingDamain=new ReceivingDamain();
            com.huaheng.common.utils.bean.BeanUtils.copyBeanProp(receivingDamain, receiptContainerView);
            receivingDamain.setContainerCode(receiptContainerView.getReceiptContainerCode());*/

            ajaxResult = PDAsaveContainer(receiptContainerView);
        }
        return ajaxResult;
    }
456
mahuandong authored
457
458
    /**
     * 移动端校验库位
459
     *
mahuandong authored
460
461
462
463
464
     * @param record
     * @return
     */
    @Override
    public Boolean mobileCheckLocationCode(ReceiptContainerView record) {
465
        return checkLocationCode(record.getLocationCode(), record.getContainerCode(), Integer.valueOf(record.getTaskType()));
mahuandong authored
466
467
468
469
    }

    /**
     * 检查容器编码合法性
470
     *
471
     * @param containerCode 容器编码
472
     * @param materialCode  物料编码
mahuandong authored
473
474
     * @return 返回容器状态,如果需自动生成容器编码返回1
     */
475
    @Transactional(isolation = Isolation.READ_UNCOMMITTED)
mahuandong authored
476
    public Integer checkContainer(String containerCode, String materialCode) {
肖超群 authored
477
        Material material = materialService.getMaterialByCode(materialCode);
478
479
480
481
        if (StringUtils.isEmpty(containerCode)) {
            if (material.getAutoGenSerialNum() == 0) {
                return 1;
                //需自动生成容器编码
mahuandong authored
482
483
484
485
            } else {
                throw new ServiceException("容器不能为空");
            }
        }
mahuandong authored
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
        /**
         * 判断物料是否可以放在当前容器
         */
        if (!material.getIsMix()) {
            LambdaQueryWrapper<InventoryDetail> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.eq(InventoryDetail::getContainerCode, containerCode);
            /* 该容器已存物料数*/
            int inventoryDetailCount = inventoryDetailService.count(queryWrapper);
            LambdaQueryWrapper<InventoryDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode)
                    .eq(InventoryDetail::getMaterialCode, materialCode);
            /* 该容器存放该物料的记录数*/
            int inventoryDetailMaterialCount = inventoryDetailService.count(lambdaQueryWrapper);
            /* 存放多种物料时返回*/
            if (inventoryDetailCount != inventoryDetailMaterialCount) {
                return 2;
            }
        }
mahuandong authored
504
505
        LambdaQueryWrapper<Container> lambda = Wrappers.lambdaQuery();
        lambda.eq(Container::getCode, containerCode);
506
        lambda.eq(Container::getWarehouseCode, ShiroUtils.getWarehouseCode());
mahuandong authored
507
        Container container = containerService.getOne(lambda);
508
        if (container == null) {
mahuandong authored
509
510
            throw new ServiceException("该容器编号不存在");
        }
511
512
        if (ShiroUtils.getWarehouseCode().equals("KS0001")) {
            if (!ShiroUtils.getCompanyCodeList().contains(container.getCompanyCode())) {
513
514
                throw new ServiceException("该操作员没有此容器的操作权限");
            }
515
            if (StringUtils.isEmpty(container.getUWarehouseCode())) {
516
517
                throw new ServiceException("该容器没有关联u8仓库");
            }
518
        }
519
        if (container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) {
520
//            throw new ServiceException("容器已经锁定,不能再组盘");
521
        }
mahuandong authored
522
523
        //检查该容器编码是否已存任务
        LambdaQueryWrapper<TaskHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
周鸿 authored
524
525
526
527
        lambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode)
                .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED)
                .ge(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_RELEASE)
                .eq(TaskHeader::getWarehouseCode, ShiroUtils.getWarehouseCode());
528
        if (taskHeaderService.count(lambdaQueryWrapper) > 0) {
周鸿 authored
529
            throw new ServiceException("容器已经存在任务,请更换容器");
周鸿 authored
530
        }
周鸿 authored
531
532
        //昆山检查该容器或者货架编码是否已存任务
        checkKSContainerORShelf(container);
周鸿 authored
533
534
        if (StringUtils.isEmpty(container.getLocationCode())) {
mahuandong authored
535
            return QuantityConstant.TASK_TYPE_WHOLERECEIPT;
536
537
538
        } else if (StringUtils.isNotEmpty(container.getStatus())
                && (container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)
                || container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_SOME))) {
mahuandong authored
539
            return QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT;
540
        } else if (QuantityConstant.STATUS_CONTAINER_FULL.equals(container.getStatus())) {
mahuandong authored
541
            throw new ServiceException("该容器已满,请更换容器");
542
543
        } else if (StringUtils.isNotEmpty(container.getStatus())
                && container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_LOCK)) {
周鸿 authored
544
            //当容器锁住时,同一个用户可以再次组盘
545
546
            LambdaQueryWrapper<TaskHeader> lambdaQuery = Wrappers.lambdaQuery();
            lambdaQuery.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
547
548
            lambdaQuery.eq(TaskHeader::getInternalTaskType, 100);
            lambdaQuery.eq(TaskHeader::getContainerCode, containerCode);
549
550
551
552
            lambdaQuery.eq(TaskHeader::getCreatedBy, ShiroUtils.getUserName());
//            if (ShiroUtils.getWarehouseCode().equals("KS0001")) {
//                lambdaQuery.eq(TaskHeader::getCreatedBy, ShiroUtils.getUserName());
//            }
553
554
            lambdaQuery.last("limit 1");
            lambdaQuery.orderByDesc(TaskHeader::getId);
555
556
            TaskHeader taskHeader = taskHeaderService.getOne(lambdaQuery);
            if (taskHeader != null) {
557
558
                return taskHeader.getTaskType();
            }
周鸿 authored
559
            return 3;
mahuandong authored
560
561
562
563
        }
        return 0;
    }
周鸿 authored
564
565
566
567
    public void checkKSContainerORShelf(Container container) {
        if (StringUtils.isNotEmpty(ShiroUtils.getWarehouseCode())
                && ShiroUtils.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_KS)) {
周鸿 authored
568
            LambdaQueryWrapper<TaskHeader> lambdaQueryWrapper1 = Wrappers.lambdaQuery();
569
570
            if (container.getZoneCode().equals("AGV")) {
                if (StringUtils.isEmpty(container.getGoodsShelfNo())) {
周鸿 authored
571
572
                    throw new ServiceException("该容器没有绑定货架");
                }
573
                lambdaQueryWrapper1.eq(TaskHeader::getGoodsShelfNo, container.getGoodsShelfNo());
574
            } else {
周鸿 authored
575
576
577
578
579
                lambdaQueryWrapper1.eq(TaskHeader::getContainerCode, container.getCode());
            }
            lambdaQueryWrapper1.eq(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_BUILD);
            lambdaQueryWrapper1.eq(TaskHeader::getWarehouseCode, ShiroUtils.getWarehouseCode());
            lambdaQueryWrapper1.last("limit 1");
580
581
582
583
            TaskHeader task = taskHeaderService.getOne(lambdaQueryWrapper1);
            if (task != null) {
                if (task.getCreatedBy().equals(ShiroUtils.getUserName())) {
                } else {
周鸿 authored
584
585
586
587
588
589
                    throw new ServiceException("容器或货架已经存在任务,请更换容器");
                }
            }
        }
    }
mahuandong authored
590
591
    /**
     * 检查库位是否合法
592
593
     *
     * @param locationCode  库位编码
mahuandong authored
594
     * @param containerCode 容器编码
595
     * @param taskType      任务类型
mahuandong authored
596
597
     * @return
     */
598
599
    @Transactional(rollbackFor = Exception.class)
    public Boolean checkLocationCode(String locationCode, String containerCode, Integer taskType) {
mahuandong authored
600
601
        //如果选了库位,就要校验库位和已经组盘的库位是否一致,避免重入库
        if (StringUtils.isEmpty(locationCode)) {
602
            if (QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT == taskType.intValue()) {
mahuandong authored
603
604
                throw new ServiceException("补充入库,必须填写库位");
            } else {
mahuandong authored
605
                return true;
mahuandong authored
606
607
608
            }
        }
肖超群 authored
609
        Location location = locationService.getLocationByCode(locationCode, ShiroUtils.getWarehouseCode());
mahuandong authored
610
611
612
        if (location == null) {
            throw new ServiceException("库位不存在!");
        }
613
        if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(location.getStatus())) {
614
//            throw new ServiceException("库位不是空闲状态!");
mahuandong authored
615
        }
游杰 authored
616
        if (QuantityConstant.TASK_TYPE_WHOLERECEIPT == taskType.intValue()) {
肖超群 authored
617
            if (StringUtils.isNotEmpty(location.getContainerCode())) {
618
                throw new ServiceException("库位(" + locationCode + ")有容器(" + location.getContainerCode() + "),不能整盘入库!");
mahuandong authored
619
620
            }
        }
621
622
        if (QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT == taskType.intValue()) {
            if (StringUtils.isEmpty(location.getContainerCode())) {
mahuandong authored
623
624
                throw new ServiceException("库位(" + locationCode + ")没有容器,不能补充入库!");
            } else if (!location.getContainerCode().equals(containerCode)) {
625
                throw new ServiceException("库位(" + containerCode + ")对应的容器是:" + location.getContainerCode() + ",请重选库位!");
mahuandong authored
626
627
628
629
630
631
632
            }
        }
        return true;
    }

    /**
     * 增加组盘明细记录
633
     *
634
     * @param
mahuandong authored
635
     * @param receiptDetail 入库详情
636
     * @param qty           收货数量
mahuandong authored
637
638
639
     * @param containerCode 容器编码
     */
    @Transactional
640
    public void receiptContainerDetailAdd(ReceiptContainerHeader receiptContainerHeader, ReceiptDetail receiptDetail, BigDecimal qty, String containerCode, String locationCode) {
641
        int receiptContainerHeaderId = receiptContainerHeader.getId();
mahuandong authored
642
643
644
645
646
647
        LambdaQueryWrapper<ReceiptContainerDetail> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptContainerDetail::getReceiptContainerId, receiptContainerHeaderId)
                .eq(ReceiptContainerDetail::getReceiptId, receiptDetail.getReceiptId())
                .eq(ReceiptContainerDetail::getReceiptDetailId, receiptDetail.getId())
                .last("Limit 1");
        ReceiptContainerDetail receiptContainerDetail = receiptContainerDetailService.getOne(lambda);
周鸿 authored
648
649
650
651
652
        //查询容器
        LambdaQueryWrapper<Container> containerLambda = Wrappers.lambdaQuery();
        containerLambda.eq(Container::getCode, containerCode)
                .eq(Container::getWarehouseCode, ShiroUtils.getWarehouseCode());
        Container container = containerService.getOne(containerLambda);
653
        if (receiptContainerDetail == null) {
mahuandong authored
654
655
656
657
658
659
            //查询入库头表
            LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery();
            receiptHeaderLambda.eq(ReceiptHeader::getId, receiptDetail.getReceiptId())
                    .eq(ReceiptHeader::getCode, receiptDetail.getReceiptCode());
            ReceiptHeader receiptHeader = receiptHeaderService.getOne(receiptHeaderLambda);
周鸿 authored
660
mahuandong authored
661
662
663
            receiptContainerDetail = new ReceiptContainerDetail();
            receiptContainerDetail.setReceiptContainerId(receiptContainerHeaderId);
            receiptContainerDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
周鸿 authored
664
            receiptContainerDetail.setUWarehouseCode(receiptHeader.getUWarehouseCode());
mahuandong authored
665
666
            receiptContainerDetail.setReceiptId(receiptDetail.getReceiptId());
            receiptContainerDetail.setReceiptDetailId(receiptDetail.getId());
667
            receiptContainerDetail.setTaskType(receiptContainerHeader.getTaskType());
mahuandong authored
668
669
670
671
672
673
674
675
676
677
            receiptContainerDetail.setReceiptCode(receiptDetail.getReceiptCode());
            receiptContainerDetail.setReceiptType(receiptHeader.getReceiptType());
            receiptContainerDetail.setLocationCode(locationCode);
            receiptContainerDetail.setContainerCode(container.getCode());
            receiptContainerDetail.setContainerType(container.getContainerType());
            receiptContainerDetail.setCompanyCode(receiptDetail.getCompanyCode());
            receiptContainerDetail.setMaterialCode(receiptDetail.getMaterialCode());
            receiptContainerDetail.setMaterialName(receiptDetail.getMaterialName());
            receiptContainerDetail.setMaterialSpec(receiptDetail.getMaterialSpec());
            receiptContainerDetail.setMaterialUnit(receiptDetail.getMaterialUnit());
mahuandong authored
678
            receiptContainerDetail.setQty(qty);
mahuandong authored
679
680
681
682
683
684
685
686
            receiptContainerDetail.setSupplierCode(receiptDetail.getSupplierCode());
            receiptContainerDetail.setBatch(receiptDetail.getBatch());
            receiptContainerDetail.setLot(receiptDetail.getLot());
            receiptContainerDetail.setProjectNo(receiptDetail.getProjectNo());
            receiptContainerDetail.setManufactureDate(receiptDetail.getManufactureDate());
            receiptContainerDetail.setExpirationDate(receiptDetail.getExpirationDate());
            receiptContainerDetail.setAgingDate(receiptDetail.getAgingDate());
            receiptContainerDetail.setInventorySts(receiptDetail.getInventorySts());
687
688
            receiptContainerDetail.setCreatedBy(ShiroUtils.getLoginName()==null?"wms":ShiroUtils.getLoginName());
            receiptContainerDetail.setLastUpdatedBy(ShiroUtils.getLoginName()==null?"wms":ShiroUtils.getLoginName());
689
            receiptContainerDetail.setSyncMms(0);
周鸿 authored
690
            receiptContainerDetail.setZoneCode(container.getZoneCode());
691
692
            receiptContainerDetail.setColor(receiptDetail.getColor());
            if (!receiptContainerDetailService.save(receiptContainerDetail)) {
mahuandong authored
693
694
695
                throw new ServiceException("保存入库组盘详情失败");
            }
        } else {
mahuandong authored
696
            receiptContainerDetail.setQty(receiptContainerDetail.getQty().add(qty));
周鸿 authored
697
            receiptContainerDetail.setZoneCode(container.getZoneCode());
698
            if (!receiptContainerDetailService.updateById(receiptContainerDetail)) {
mahuandong authored
699
700
701
702
703
704
705
706
707
                throw new ServiceException("更新入库组盘详情失败");
            }
        }

    }


    /**
     * 自动生成容器编码
708
     *
mahuandong authored
709
710
711
     * @return 容器编码
     */
    @Transactional
712
    public String createContainer() {
mahuandong authored
713
714
715
716
717
718
719
720
721
722
723
724
        String code = MessageFormat.format("{0}{1}",
                "LS",
                String.format("%d", Calendar.getInstance().getTimeInMillis()));
        Container container = new Container();
        container.setCode(code);
        container.setWarehouseCode(ShiroUtils.getWarehouseCode());
        container.setCompanyCode(ShiroUtils.getCompanyCodeList().get(0));
        container.setContainerType("LS");
        container.setCreatedBy(ShiroUtils.getLoginName());
        container.setLastUpdated(new Date());
        container.setLastUpdatedBy(ShiroUtils.getLoginName());
        container.setEnable(true);
游杰 authored
725
        container.setStatus(QuantityConstant.STATUS_CONTAINER_EMPTY);
726
        if (!containerService.save(container)) {
mahuandong authored
727
728
729
730
            throw new ServiceException("新增容器失败");
        }
        return code;
    }
mahuandong authored
731
732
733
734
735
736
737
738
739

    @Override
    @Transactional
    public int insertTodayReceiptContainerHeader(ReceiptBill receiptBill, String receiptCode) {
        String receiptContainerCode = receiptBill.getReceiptContainerCode();
        String locationCode = receiptBill.getLocationCode();
        String companyCode = receiptBill.getCompanyCode();
        ReceiptContainerHeader recorder = new ReceiptContainerHeader();
        recorder.setContainerCode(receiptContainerCode);
游杰 authored
740
        recorder.setToLocation(locationCode);
mahuandong authored
741
742
        recorder.setWarehouseCode(ShiroUtils.getWarehouseCode());
        recorder.setCompanyCode(companyCode);
743
        recorder.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
mahuandong authored
744
        recorder.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
mahuandong authored
745
        recorder.setCreatedBy(ShiroUtils.getLoginName());
游杰 authored
746
        recorder.setLastUpdatedBy(ShiroUtils.getLoginName());
mahuandong authored
747
748
749
750
751
752
753
754

        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambada = Wrappers.lambdaQuery();
        receiptContainerHeaderLambada.eq(ReceiptContainerHeader::getContainerCode, receiptContainerCode)
                .eq(ReceiptContainerHeader::getCompanyCode, companyCode)
                .eq(ReceiptContainerHeader::getTaskType, String.valueOf(QuantityConstant.TASK_TYPE_WHOLERECEIPT))
                .eq(ReceiptContainerHeader::getStatus, 0);

        ReceiptContainerHeader receiptContainerHeader = getOne(receiptContainerHeaderLambada);
755
        if (receiptContainerHeader == null) {
mahuandong authored
756
757
758
759
760
            save(recorder);
        } else {
            return receiptContainerHeader.getId();
        }
游杰 authored
761
762
763
        locationService.updateStatus(locationCode, QuantityConstant.STATUS_LOCATION_LOCK);
        containerService.updateLocationCodeAndStatus(receiptContainerCode,
                locationCode, QuantityConstant.STATUS_CONTAINER_SOME);
mahuandong authored
764
765
        return recorder.getId();
    }
766
767
768

    /**
     * 取消入库任务
769
     *
770
771
772
773
     * @param id 入库组盘头id
     * @return
     */
    @Override
肖超群 authored
774
    @Transactional
775
776
777
778
779
    public AjaxResult cancelReceipt(Integer id) {
        /**
         * 回滚组盘主表状态
         */
        ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
mahuandong authored
780
        receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
781
        receiptContainerHeader.setId(id);
782
        if (!updateById(receiptContainerHeader)) {
783
784
785
786
787
788
789
790
791
792
            throw new ServiceException("回滚入库组盘头表失败");
        }

        /**
         * 回滚组盘明细状态
         */
        LambdaQueryWrapper<ReceiptContainerDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ReceiptContainerDetail::getReceiptContainerId, id);
        List<ReceiptContainerDetail> containerDetailList = receiptContainerDetailService.list(lambdaQueryWrapper);
        for (ReceiptContainerDetail containerDetail : containerDetailList) {
肖超群 authored
793
            containerDetail.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
794
        }
795
        if (containerDetailList != null && containerDetailList.size() > 0 && !receiptContainerDetailService.updateBatchById(containerDetailList)) {
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
            throw new ServiceException("回滚入库组盘明细失败");
        }

        /**
         * 回滚入库单头表、入库单明细状态
         */
        for (ReceiptContainerDetail containerDetail : containerDetailList) {
            ReceiptHeader receiptHeader = receiptHeaderService.getById(containerDetail.getReceiptId());
            receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_WAIT);
            ReceiptDetail receiptDetail = receiptDetailService.getById(containerDetail.getReceiptDetailId());
            receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_WAIT));
            if (!receiptHeaderService.updateById(receiptHeader)) {
                throw new ServiceException("回滚入库单头表失败");
            }
            if (!receiptDetailService.updateById(receiptDetail)) {
                throw new ServiceException("回滚入库单明细失败");
            }
        }
        return AjaxResult.success("成功");
    }
816
817
818
819
820
821
822
823

    @Override
    public int getUnCompleteCombineNumber(String containerCode) {
        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptContainerHeaderLambdaQueryWrapper.eq(ReceiptContainerHeader::getContainerCode, containerCode)
                .lt(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_FINISHED);
        int number = 0;
        List<ReceiptContainerHeader> receiptContainerHeaderList = list(receiptContainerHeaderLambdaQueryWrapper);
824
        if (receiptContainerHeaderList != null && receiptContainerHeaderList.size() > 0) {
825
826
827
828
829
830
831
832
833
834
835
836
837
            number = receiptContainerHeaderList.size();
        }
        return number;
    }

    @Override
    public List<ReceiptContainerHeader> getUnCompleteCombineList() {
        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptContainerHeaderLambdaQueryWrapper
                .lt(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_FINISHED);
        List<ReceiptContainerHeader> receiptContainerHeaderList = list(receiptContainerHeaderLambdaQueryWrapper);
        return receiptContainerHeaderList;
    }
838
839
    @Override
周鸿 authored
840
841
    public ReceiptContainerHeader selectFirstEntity(ReceiptContainerHeader query) {
        LambdaQueryWrapper<ReceiptContainerHeader> lamb = Wrappers.lambdaQuery();
842
843
844
        lamb.eq(StringUtils.isNotNull(query.getStatus()), ReceiptContainerHeader::getStatus, query.getStatus());
        lamb.eq(StringUtils.isNotEmpty(query.getContainerCode()), ReceiptContainerHeader::getContainerCode, query.getContainerCode());
        lamb.eq(StringUtils.isNotEmpty(query.getWarehouseCode()), ReceiptContainerHeader::getWarehouseCode, query.getWarehouseCode());
周鸿 authored
845
846
847
        lamb.last("limit 1");
        return this.getOne(lamb);
    }
848
周鸿 authored
849
850
851
    @Override
    public List<ReceiptContainerHeader> selectFirstEntityList(ReceiptContainerHeader query) {
        LambdaQueryWrapper<ReceiptContainerHeader> lamb = Wrappers.lambdaQuery();
852
853
854
        lamb.eq(StringUtils.isNotNull(query.getStatus()), ReceiptContainerHeader::getStatus, query.getStatus());
        lamb.eq(StringUtils.isNotEmpty(query.getContainerCode()), ReceiptContainerHeader::getContainerCode, query.getContainerCode());
        lamb.eq(StringUtils.isNotEmpty(query.getWarehouseCode()), ReceiptContainerHeader::getWarehouseCode, query.getWarehouseCode());
周鸿 authored
855
856
857
858
        return this.list(lamb);
    }

    @Override
859
    public AjaxResult clearContainerHeader() {
860
861
862
863
864
        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        receiptContainerHeaderLambdaQueryWrapper.eq(ReceiptContainerHeader::getStatus,
                QuantityConstant.RECEIPT_CONTAINER_BUILD);
        List<ReceiptContainerHeader> receiptContainerHeaderList =
                this.list(receiptContainerHeaderLambdaQueryWrapper);
865
        for (ReceiptContainerHeader receiptContainerHeader : receiptContainerHeaderList) {
866
867
868
869
            Date date = receiptContainerHeader.getCreated();
            Date now = new Date();
            int fore = date.getDay();
            int day = now.getDay();
870
            if (fore != day) {
871
872
873
874
875
876
877
878
879
                this.removeById(receiptContainerHeader);
            }
        }

        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper1 = Wrappers.lambdaQuery();
        receiptContainerHeaderLambdaQueryWrapper1.eq(ReceiptContainerHeader::getStatus,
                QuantityConstant.RECEIPT_CONTAINER_TASK);
        List<ReceiptContainerHeader> receiptContainerHeaderList1 =
                this.list(receiptContainerHeaderLambdaQueryWrapper1);
880
        for (ReceiptContainerHeader receiptContainerHeader : receiptContainerHeaderList1) {
881
882
883
884
885
886
887
            String containerCode = receiptContainerHeader.getContainerCode();
            LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
            taskHeaderLambdaQueryWrapper.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED)
                    .in(TaskHeader::getTaskType, QuantityConstant.TASK_TYPE_WHOLERECEIPT,
                            QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT)
                    .eq(TaskHeader::getContainerCode, containerCode);
            List<TaskHeader> taskHeaderList = taskHeaderService.list(taskHeaderLambdaQueryWrapper);
888
            if (taskHeaderList.size() == 0) {
889
890
891
892
893
894
895
896
897
898
                receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_FINISHED);
                this.updateById(receiptContainerHeader);
            }
        }

        LambdaQueryWrapper<ShipmentContainerHeader> shipmentContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        shipmentContainerHeaderLambdaQueryWrapper.eq(ShipmentContainerHeader::getStatus,
                QuantityConstant.SHIPMENT_CONTAINER_BUILD);
        List<ShipmentContainerHeader> shipmentContainerHeaderList =
                shipmentContainerHeaderService.list(shipmentContainerHeaderLambdaQueryWrapper);
899
        for (ShipmentContainerHeader shipmentContainerHeader : shipmentContainerHeaderList) {
900
901
902
903
            Date date = shipmentContainerHeader.getCreated();
            Date now = new Date();
            int fore = date.getDay();
            int day = now.getDay();
904
            if (fore != day) {
905
906
907
908
909
910
911
912
913
                shipmentContainerHeaderService.removeById(shipmentContainerHeader);
            }
        }

        LambdaQueryWrapper<ShipmentContainerHeader> shipmentContainerHeaderLambdaQueryWrapper1 = Wrappers.lambdaQuery();
        shipmentContainerHeaderLambdaQueryWrapper1.eq(ShipmentContainerHeader::getStatus,
                QuantityConstant.SHIPMENT_CONTAINER_TASK);
        List<ShipmentContainerHeader> shipmentContainerHeaderList1 =
                shipmentContainerHeaderService.list(shipmentContainerHeaderLambdaQueryWrapper1);
914
        for (ShipmentContainerHeader shipmentContainerHeader : shipmentContainerHeaderList1) {
915
916
917
918
919
920
921
            String containerCode = shipmentContainerHeader.getContainerCode();
            LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
            taskHeaderLambdaQueryWrapper.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED)
                    .in(TaskHeader::getTaskType, QuantityConstant.TASK_TYPE_WHOLESHIPMENT,
                            QuantityConstant.TASK_TYPE_SORTINGSHIPMENT)
                    .eq(TaskHeader::getContainerCode, containerCode);
            List<TaskHeader> taskHeaderList = taskHeaderService.list(taskHeaderLambdaQueryWrapper);
922
            if (taskHeaderList.size() == 0) {
923
924
925
926
927
928
                shipmentContainerHeader.setStatus(QuantityConstant.SHIPMENT_CONTAINER_FINISHED);
                shipmentContainerHeaderService.updateById(shipmentContainerHeader);
            }
        }
        return AjaxResult.success();
    }
929
930
    @Override
xumiao authored
931
    @Transactional(rollbackFor = Exception.class)
932
933
934
935
    public AjaxResult quickNoListReceipt(List<ReceiptBill> receiptBills) {
        if (receiptBills == null || receiptBills.size() <= 0) {
            throw new JSONException("没有收货信息");
        }
936
        boolean flag = true;
937
938
939
940
        String containerCode = receiptBills.get(0).getReceiptContainerCode();
        String locationCode = receiptBills.get(0).getLocationCode();
        Container container = new Container();
        container.setCode(containerCode);
xumiao authored
941
        container.setWarehouseCode(ShiroUtils.getWarehouseCode());
942
943
944
945
946
947
948
949
        container = containerService.selectFirstEntity(container);
        if (container == null) {
            throw new JSONException("不存在这个托盘");
        }
        if (locationCode != null && locationCode.equals(container.getLocationCode())) {
            //查询未完成的入库任务
            List<TaskHeader> tasks = taskHeaderService.selectNofinishReceiptTaskBycontainer(container.getCode());
            TaskHeader task = tasks.get(0);
950
            if (tasks == null && tasks.size() < 1) {
951
952
                throw new JSONException("没有找到托盘对应的任务");
            }
953
            int receiptHeaderId = receiptHeaderService.createTodayHeader(receiptBills.get(0).getCompanyCode(), container.getUWarehouseCode());
954
955
            ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptHeaderId);
            List<Integer> receiptDetailIds = receiptDetailService.insertTodayReceiptDetail(receiptHeaderId,
956
                    receiptBills, false, receiptBills.get(0).getCompanyCode());
957
958
959
960
961
962
963
964
            ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
            receiptContainerHeader.setContainerCode(containerCode);
            receiptContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
            receiptContainerHeader.setTaskType(200);
            receiptContainerHeader.setCompanyCode(receiptBills.get(0).getCompanyCode());
            receiptContainerHeader.setFromLocation(container.getLocationCode());
            receiptContainerHeader.setCreatedBy(ShiroUtils.getLoginName());
            receiptContainerHeader.setStatus(10);
xumiao authored
965
            if (!this.save(receiptContainerHeader)) {
966
967
968
969
970
971
972
                throw new ServiceException("入库组盘头表保存失败");
            }
            receiptHeader.setFirstStatus(200);
            receiptHeader.setLastStatus(200);
            receiptHeaderService.updateById(receiptHeader);
            task.setAllocationHeadId(receiptContainerHeader.getId());
            taskHeaderService.updateById(task);
973
974
            List<Integer> receiptContainerDetailIds = new ArrayList<>();
            receiptDetailIds.forEach(id -> {
975
976
977
978
979
980
981
                ReceiptDetail receiptDetail = receiptDetailService.getById(id);
                ReceiptContainerDetail receiptContainerDetail = new ReceiptContainerDetail();
                receiptContainerDetail.setReceiptContainerId(receiptContainerHeader.getId());
                receiptContainerDetail.setReceiptId(receiptHeader.getId());
                receiptContainerDetail.setReceiptDetailId(receiptDetail.getId());
                receiptContainerDetail.setReceiptCode(receiptHeader.getCode());
982
                Material material = materialService.getMaterialByCode(receiptDetail.getMaterialCode(), ShiroUtils.getWarehouseCode());
983
984
985
986
987
988
989
990
991
992
993

                receiptContainerDetail.setMaterialCode(material.getCode());
                receiptContainerDetail.setMaterialName(material.getName());
                receiptContainerDetail.setMaterialSpec(material.getSpec());
                receiptContainerDetail.setQty(receiptDetail.getQty());
                receiptContainerDetail.setCreatedBy(ShiroUtils.getLoginName());
                receiptContainerDetailService.save(receiptContainerDetail);
                receiptContainerDetailIds.add(receiptContainerDetail.getId());
            });
994
            receiptContainerDetailIds.forEach(id -> {
995
996
                ReceiptContainerDetail receiptContainerDetail = receiptContainerDetailService.getById(id);
                TaskDetail taskDetail = new TaskDetail();
xumiao authored
997
998
999
                taskDetail.setTaskId(task.getId());
                taskDetail.setTaskType(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT);
                taskDetail.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
                taskDetail.setContainerCode(containerCode);
                taskDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
                taskDetail.setCompanyCode(receiptBills.get(0).getCompanyCode());
                taskDetail.setMaterialCode(receiptContainerDetail.getMaterialCode());
                taskDetail.setMaterialName(receiptContainerDetail.getMaterialName());
                taskDetail.setBillId(receiptHeader.getId());
                taskDetail.setBillCode(receiptHeader.getCode());
                taskDetail.setBillDetailId(receiptContainerDetail.getReceiptDetailId());
                taskDetail.setQty(receiptContainerDetail.getQty());
                taskDetail.setFromLocation(task.getFromLocation());
                taskDetail.setAllocationId(receiptContainerDetail.getId());
                taskDetail.setFromZone("LK");
                taskDetail.setToZone("LK");
                taskDetail.setCompanyCode(task.getCompanyCode());
                taskDetailService.save(taskDetail);
            });
        }
        return AjaxResult.success("收货成功");
    }
xumiao authored
1019
1020
1021
1022
1023
1024


    //这个方法主要用agv库的补充入,不校验托盘情况
    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult PDAsaveContainer(ReceiptContainerView receivingDamain) {
1025
1026
1027
1028
1029
1030
        String receiptCode = receivingDamain.getReceiptCode();
        String containerCode = receivingDamain.getContainerCode();
        Integer receiptDetailId = receivingDamain.getReceiptDetailId();
        String locationCode = receivingDamain.getLocationCode();
        BigDecimal qty = receivingDamain.getQty();
        String locatingRule = receivingDamain.getLocatingRule();
xumiao authored
1031
1032
1033
        ReceiptDetail detail = receiptDetailService.getById(receiptDetailId);

        BigDecimal receiptQty = detail.getQty().subtract(detail.getTaskQty());
1034
1035
        if (receiptQty.compareTo(qty) < 0) {
            return AjaxResult.error("入库明细可用数量" + receiptQty + ",收货数量" + qty + ";不允许超收");
xumiao authored
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
        }

        //检查容器编码合法性

        Container container = containerService.getContainerByCode(containerCode);
        if (StringUtils.isNotNull(container) && StringUtils.isNotEmpty(container.getLocationCode())) {
            locationCode = container.getLocationCode();
        }

        //检查库位编码合法性

        int unCompleteCombineNumber = shipmentContainerHeaderService.getUnCompleteCombineNumber(containerCode);
1048
        if (unCompleteCombineNumber > 0) {
xumiao authored
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
            throw new ServiceException("该托盘已经用于出库组盘");
        }
        /* 新建保存组盘头表记录*/
        //根据容器编码查询组盘表头记录
        LambdaQueryWrapper<ReceiptContainerHeader> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptContainerHeader::getContainerCode, containerCode)
                .le(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_TASK);
        lambda.last("limit 1");
        ReceiptContainerHeader receiptContainerHeader = this.getOne(lambda);

//        ReceiptContainerHeader receiptContainerHeader = new ReceiptContainerHeader();
        //当size大于等于1表示容器已经有组盘了
1061
        if (receiptContainerHeader == null) {
xumiao authored
1062
1063
            ReceiptDetail receiptDetail = receiptDetailService.getById(receiptDetailId);
            // 创建组盘头表
1064
1065
            receiptContainerHeader = createReceiptContainerHeader(receiptContainerHeader, containerCode, locationCode, receiptDetail, 200, locatingRule);
            if (!this.save(receiptContainerHeader)) {
xumiao authored
1066
1067
1068
1069
                throw new ServiceException("入库组盘头表保存失败");
            }
        } else {
//            receiptContainerHeader = list.get(0);
1070
            if (receiptContainerHeader.getStatus() > QuantityConstant.RECEIPT_CONTAINER_TASK && receiptContainerHeader.getStatus() < QuantityConstant.RECEIPT_CONTAINER_FINISHED) {
xumiao authored
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
                throw new ServiceException("容器已经生成任务,不能放物料了!");
            }
        }
//        List<ReceiptContainerHeader> receiptContainerHeaders = this.list(lambda);
        /* 更新入库单详情的收货数量*/
        //根据入库单详情id查询入库详情
        ReceiptDetail receiptDetail = receiptDetailService.getById(receiptDetailId);
        receiptDetail.setId(receiptDetailId);
        receiptDetail.setTaskQty(qty.add(receiptDetail.getTaskQty()));
        //更新入库单详情的收货数量
1081
        if (!receiptDetailService.updateById(receiptDetail)) {
xumiao authored
1082
1083
1084
1085
1086
1087
1088
            throw new ServiceException("更新入库单详情失败");
        }

        receiptDetail = receiptDetailService.getById(receiptDetailId);
        //save组盘明细
        receiptContainerDetailAdd(receiptContainerHeader, receiptDetail, qty, containerCode, locationCode);
        //如果单据数量等于已收数量,更新入库详情状态和入库单状态
1089
1090
        if (receiptDetail.getQty().compareTo(receiptDetail.getTaskQty()) == 0) {
            if (StringUtils.isNotEmpty(locationCode)) {
xumiao authored
1091
1092
1093
1094
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_POSITION.toString());
            } else {
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_RECEIVING.toString());
            }
1095
            if (!receiptDetailService.updateById(receiptDetail)) {
xumiao authored
1096
1097
1098
1099
                throw new ServiceException("更新入库详情处理标记失败");
            }

            ReceiptDetail receiptDetail1 = receiptDetailService.queryflow(receiptDetail);
1100
            if (!receiptDetailService.updateById(receiptDetail1)) {
xumiao authored
1101
1102
1103
1104
1105
1106
                throw new ServiceException("更新入库详情下一流程失败");
            }
        }
        receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
        return AjaxResult.success("组盘成功");
    }
1107
}