Blame view

src/main/java/com/huaheng/pc/shipment/shipmentContainerHeader/service/ShipmentContainerHeaderServiceImpl.java 30.8 KB
1
2
package com.huaheng.pc.shipment.shipmentContainerHeader.service;
pengcheng authored
3
4
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
pengcheng authored
5
import com.huaheng.common.constant.QuantityConstant;
pengcheng authored
6
7
8
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
9
import com.huaheng.framework.web.domain.RetCode;
10
11
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
12
13
14
15
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;
16
import com.huaheng.pc.config.shipmentPreference.service.ShipmentPreferenceService;
pengcheng authored
17
18
19
20
21
22
23
24
25
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.shipment.shipmentContainerDetail.domain.ShipmentContainerDetail;
import com.huaheng.pc.shipment.shipmentContainerDetail.service.ShipmentContainerDetailService;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentCombinationModel;
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;
pengcheng authored
26
27
import com.huaheng.pc.shipment.shippingCombination.domain.ShippingSearch;
import com.huaheng.pc.shipment.shippingCombination.service.ShippingCombinationService;
pengcheng authored
28
29
import com.huaheng.pc.shipment.wave.domain.Wave;
import com.huaheng.pc.shipment.wave.service.WaveService;
30
31
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
32
import com.huaheng.pc.task.taskHeader.domain.ShipmentTaskCreateModel;
33
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
34
import com.huaheng.pc.task.taskHeader.service.ShipmentTaskService;
35
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
pengcheng authored
36
import org.springframework.beans.factory.annotation.Autowired;
37
38
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
pengcheng authored
39
import java.math.BigDecimal;
pengcheng authored
40
import java.util.ArrayList;
41
import java.util.List;
pengcheng authored
42
43
import java.util.Map;
44
45
46
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.huaheng.pc.shipment.shipmentContainerHeader.domain.ShipmentContainerHeader;
import com.huaheng.pc.shipment.shipmentContainerHeader.mapper.ShipmentContainerHeaderMapper;
pengcheng authored
47
48
import org.springframework.transaction.annotation.Transactional;
49
50
51
@Service
public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentContainerHeaderMapper, ShipmentContainerHeader> implements ShipmentContainerHeaderService{
pengcheng authored
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    @Autowired
    private ShipmentDetailService shipmentDetailService;
    @Autowired
    private InventoryDetailService inventoryDetailService;
    @Autowired
    private LocationService locationService;
    @Autowired
    private ShipmentHeaderService shipmentHeaderService;
    @Resource
    private ShipmentContainerHeaderMapper shipmentContainerHeaderMapper;
    @Autowired
    private ShipmentContainerDetailService shipmentContainerDetailService;
    @Autowired
    private MaterialService materialService;
pengcheng authored
66
67
    @Autowired
    private ShippingCombinationService shippingCombinationService;
68
69
    @Autowired
    private TaskHeaderService taskHeaderService;
70
71
    @Autowired
    private TaskDetailService taskDetailService;
pengcheng authored
72
73
    @Autowired
    private WaveService waveService;
74
75
    @Autowired
    private ShipmentPreferenceService shipmentPreferenceService;
76
77
    @Autowired
    private ContainerService containerService;
78
79
    @Resource
    private ShipmentTaskService shipmentTaskService;
pengcheng authored
80
81
82
83
84
85
86
87
88
89


    @Override
    public Map<String, Integer> getShipmentContainerMaxAndMinStatusByShipmentID(int shipmentId) {
        return shipmentContainerHeaderMapper.getShipmentContainerMaxAndMinStatusByShipmentID(shipmentId);
    }



    /**
90
91
92
93
94
95
96
97
     * 1.检查基本属性
     * 2.更改库存明细
     * 3.更新单据明细的已出库数量
     * 4.自动判定出库任务状态,根据库存数量减去预定库存相等就是整盘出--预计任务状态
     * 5.增加出库组盘头
     * 6.增加出库组盘明细
     * 7.更新单据状态
     *
pengcheng authored
98
99
100
101
102
103
     * 出库组盘单条保存
     * @param shipmentCombinationModel
     * @return
     */
    @Transactional
    @Override
pengcheng authored
104
    public ShipmentContainerHeader combination(ShipmentCombinationModel shipmentCombinationModel) {
pengcheng authored
105
106
        //1.检查基本属性
pengcheng authored
107
108
        //校验
        if(shipmentCombinationModel.getShipQty().compareTo(new BigDecimal("0")) <= 0){
pengcheng authored
109
            throw new ServiceException("出库数量必须大于0");
pengcheng authored
110
111
112
        }
        ShipmentDetail shipmentDetail = shipmentDetailService.getById(shipmentCombinationModel.getShipmentDetailId());
        if(shipmentDetail==null){
pengcheng authored
113
            throw new ServiceException("出库明细未找到");
pengcheng authored
114
115
116
        }
        InventoryDetail inventoryDetail = inventoryDetailService.getById((shipmentCombinationModel.getInventoryDetailId()));
        if(inventoryDetail==null){
pengcheng authored
117
            throw new ServiceException("库存未找到");
pengcheng authored
118
119
120
        }
        //校验数量是否超出
        if((shipmentDetail.getShipQty().subtract(shipmentDetail.getRequestQty())).compareTo(shipmentCombinationModel.getShipQty())<0){
pengcheng authored
121
            throw new ServiceException("录入数量超出明细待出数量");
pengcheng authored
122
123
124
        }
        //校验库存可用数量
        if(inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty()).subtract(inventoryDetail.getLockedQty()).compareTo(shipmentCombinationModel.getShipQty())<0){
pengcheng authored
125
            throw new ServiceException("录入数量超出可出数量");
pengcheng authored
126
127
        }
        if(!shipmentDetail.getMaterialCode().equals(inventoryDetail.getMaterialCode())){
pengcheng authored
128
            throw new ServiceException("配盘物料不一致");
pengcheng authored
129
130
131
132
133
134
        }
        //库位
        LambdaQueryWrapper<Location> lambdaQueryWrapper= Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(Location::getWarehouseCode,inventoryDetail.getWarehouseCode())
                .eq(Location::getCode,inventoryDetail.getLocationCode());
        Location location = locationService.getOne(lambdaQueryWrapper);
135
136
137
        if (location == null) {
            throw new ServiceException("库位 " + inventoryDetail.getLocationCode() + " 不存在");
        }
pengcheng authored
138
139
        //2.更新库存分配数
pengcheng authored
140
141
142
        inventoryDetail.setTaskQty(inventoryDetail.getTaskQty().add(shipmentCombinationModel.getShipQty()));
        inventoryDetailService.saveOrUpdate(inventoryDetail);
        //获取库位,然后锁定
xqs authored
143
        if("empty".equals(location.getStatus())) {
144
145
146
            location.setStatus("lock");
            locationService.saveOrUpdate(location);
        }
147
        //3.更新单据明细的已出库数量
pengcheng authored
148
149
150
        shipmentDetail.setRequestQty(shipmentDetail.getRequestQty().add(shipmentCombinationModel.getShipQty()));
        int i = shipmentDetail.getShipQty().compareTo(shipmentDetail.getRequestQty());
        if(i > 0){
pengcheng authored
151
            shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_WAVE);
pengcheng authored
152
        }else if(i == 0){
pengcheng authored
153
            shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_GROUPDISK);
pengcheng authored
154
155
156
157
158
159
160
161
        }else if(i < 0){
            throw new ServiceException("出库数量不能大于单据数量!");
        }
        shipmentDetailService.saveOrUpdate(shipmentDetail);

        //自动判定出库任务状态,根据库存数量减去预定库存相等就是整盘出--预计任务状态
        BigDecimal inventoryQty = inventoryDetail.getQty().subtract(inventoryDetail.getTaskQty());
        if(inventoryQty.compareTo(new BigDecimal(0)) <= 0) {
pengcheng authored
162
            shipmentCombinationModel.setTaskType(QuantityConstant.TASK_TYPE_WHOLESHIPMENT);
pengcheng authored
163
        } else {
pengcheng authored
164
            shipmentCombinationModel.setTaskType(QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
pengcheng authored
165
166
        }
167
168
169
        //5.增加出库组盘头
        ShipmentContainerHeader shipmentContainerHeader = ShipmentContainerHeaderAdd(location, shipmentDetail);
        //6.增加出库组盘明细
pengcheng authored
170
        ShipmentContainerDetail shipmentContainerDetail = ShipmentContainerDetailAdd(shipmentDetail, shipmentContainerHeader, shipmentCombinationModel);
171
        //7.更新单据状态
pengcheng authored
172
173
        shipmentHeaderService.updateShipmentStatus(shipmentDetail.getShipmentId());
pengcheng authored
174
        return  shipmentContainerHeader;
pengcheng authored
175
176
177
    }

    /**
178
179
180
181
     * 组盘头
     * 1.查看是否有状态小于等于20的组盘头,有就需新建组盘头,没有就新建
     * 2.没有符合条件的组盘头,新建组盘头
     *
pengcheng authored
182
     * @param location
183
     * @param shipmentDetail
pengcheng authored
184
185
186
     * @return
     */
    private ShipmentContainerHeader ShipmentContainerHeaderAdd(Location location,
187
188
189
                                                               ShipmentDetail shipmentDetail) {

        //1.查看是否有状态小于等于20的组盘头,有就需新建组盘头,没有就新建
pengcheng authored
190
        LambdaQueryWrapper<ShipmentContainerHeader> lambdaQueryWrapper=Wrappers.lambdaQuery();
pengcheng authored
191
192
        lambdaQueryWrapper.eq(ShipmentContainerHeader::getLocationCode,location.getCode())
                .eq(ShipmentContainerHeader::getContainerCode,location.getContainerCode())
pengcheng authored
193
                .eq(ShipmentContainerHeader::getWarehouseCode,ShiroUtils.getWarehouseCode())
pengcheng authored
194
                .le(ShipmentContainerHeader::getStatus,QuantityConstant.SHIPMENT_CONTAINER_FINISHED);
pengcheng authored
195
196
        ShipmentContainerHeader shipmentContainerHeader = this.getOne(lambdaQueryWrapper);
        if(shipmentContainerHeader != null)  {
197
            return shipmentContainerHeader;
pengcheng authored
198
199
        }
        else {
200
201
202
203
204
205
206
207
208
            // 2.没有符合条件的组盘头,新建组盘头
            //找到容器类型
            LambdaQueryWrapper<Container> containerLam=Wrappers.lambdaQuery();
            containerLam.eq(Container::getCode,location.getContainerCode())
                    .eq(Container::getWarehouseCode,ShiroUtils.getWarehouseCode());
            Container container = containerService.getOne(containerLam);
            if(container == null){
                throw new ServiceException("系统没有此容器编码");
            }
pengcheng authored
209
210
                shipmentContainerHeader = new ShipmentContainerHeader();
                shipmentContainerHeader.setContainerCode(location.getContainerCode());
211
                shipmentContainerHeader.setLocationCode(location.getCode());
pengcheng authored
212
213
                shipmentContainerHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
                shipmentContainerHeader.setCompanyCode(shipmentDetail.getCompanyCode());
游杰 authored
214
                shipmentContainerHeader.setStationCode(shipmentDetail.getStationCode());
215
                shipmentContainerHeader.setContainerType(container.getContainerType());
pengcheng authored
216
                shipmentContainerHeader.setStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
pengcheng authored
217
                shipmentContainerHeader.setTaskCreated(0);
pengcheng authored
218
                shipmentContainerHeader.setCreatedBy(ShiroUtils.getLoginName());
219
220
221
222
                Boolean flag = this.save(shipmentContainerHeader);
                if(flag == false){
                    throw new ServiceException("新建组盘头失败,sql错误");
                }
223
            return shipmentContainerHeader;
pengcheng authored
224
225
226
227
            }
    }

    /**
228
229
230
231
232
233
     * 组盘明细
     * 1.查看是否有同一出库明细的物料需要出库
     * 2.有时修改阻盘明细的出库数量就行
     * 3.没有就新建明细
     * 4。查看组盘头状态,如果状态在1020,则生成任务明细或修改任务明细的数量
     *
pengcheng authored
234
235
236
237
238
239
240
241
     * @param shipmentDetail
     * @param shipmentContainerHeader
     * @param shipmentCombinationModel
     * @return
     */
    private ShipmentContainerDetail ShipmentContainerDetailAdd(ShipmentDetail shipmentDetail,
                                                               ShipmentContainerHeader shipmentContainerHeader,
                                                               ShipmentCombinationModel shipmentCombinationModel) {
242
243
244

        Boolean flag =true;
        //1.查看是否有同一出库明细的物料需要出库
pengcheng authored
245
        LambdaQueryWrapper<ShipmentContainerDetail> lambdaQueryWrapper=Wrappers.lambdaQuery();
246
247
248
249
250
251
        lambdaQueryWrapper.eq(ShipmentContainerDetail::getShippingContainerId, shipmentContainerHeader.getId())
                .eq(ShipmentContainerDetail::getLocationCode, shipmentContainerHeader.getLocationCode())
                .eq(ShipmentContainerDetail::getContainerCode, shipmentContainerHeader.getContainerCode())
                .eq(ShipmentContainerDetail::getShipmentDetailId, shipmentCombinationModel.getShipmentDetailId())
                .eq(ShipmentContainerDetail::getInventoryId, shipmentCombinationModel.getInventoryDetailId())
                .eq(ShipmentContainerDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
pengcheng authored
252
        ShipmentContainerDetail shipmentContainerDetail = shipmentContainerDetailService.getOne(lambdaQueryWrapper);
253
254
255
        ShipmentContainerDetail shipmentContainerDetaill = new ShipmentContainerDetail();

        //2.有时修改阻盘明细的出库数量就行
pengcheng authored
256
257
        if(shipmentContainerDetail != null)    {
            shipmentContainerDetail.setQty(shipmentContainerDetail.getQty().add(shipmentCombinationModel.getShipQty()));
258
259
260
261
            flag=shipmentContainerDetailService.saveOrUpdate(shipmentContainerDetail);
            if(flag == false){
                throw new ServiceException("修改组盘明细失败,sql错误");
            }
pengcheng authored
262
        }
263
        else  {
pengcheng authored
264
265
            //3.没有就新建明细
pengcheng authored
266
267
268
269
            LambdaQueryWrapper<Material> lam=Wrappers.lambdaQuery();
            lam.eq(Material::getCode,shipmentDetail.getMaterialCode())
                    .eq(Material::getWarehouseCode,ShiroUtils.getWarehouseCode());
            Material material = materialService.getOne(lam);
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
            if (material == null) {
                throw new ServiceException("出库单(" + shipmentDetail.getShipmentCode() + ")的物料(" + shipmentDetail.getMaterialCode() + ")不存在!");
            }
            shipmentContainerDetaill.setWarehouseCode(shipmentContainerHeader.getWarehouseCode());
            shipmentContainerDetaill.setCompanyCode(shipmentContainerHeader.getCompanyCode());
            shipmentContainerDetaill.setContainerCode(shipmentContainerHeader.getContainerCode());
            shipmentContainerDetaill.setLocationCode(shipmentContainerHeader.getLocationCode());
            shipmentContainerDetaill.setInventoryId(shipmentCombinationModel.getInventoryDetailId());
            shipmentContainerDetaill.setInventorySts(shipmentDetail.getInventorySts());
            shipmentContainerDetaill.setShippingContainerId(shipmentContainerHeader.getId());
            shipmentContainerDetaill.setShipmentCode(shipmentDetail.getShipmentCode());
            shipmentContainerDetaill.setShipmentId(shipmentDetail.getShipmentId());
            shipmentContainerDetaill.setShipmentDetailId(shipmentDetail.getId());
            shipmentContainerDetaill.setMaterialCode(shipmentDetail.getMaterialCode());
            shipmentContainerDetaill.setMaterialName(shipmentDetail.getMaterialName());
            shipmentContainerDetaill.setMaterialSpec(shipmentDetail.getMaterialSpec());
            shipmentContainerDetaill.setMaterialUnit(shipmentDetail.getMaterialUnit());
            shipmentContainerDetaill.setQty(shipmentCombinationModel.getShipQty());
            shipmentContainerDetaill.setWaveId(shipmentDetail.getWaveId());
            shipmentContainerDetaill.setTaskCreated(0);
pengcheng authored
290
            shipmentContainerDetaill.setStatus(QuantityConstant.SHIPMENT_CONTAINER_BUILD);
291
292
293
294
            shipmentContainerDetaill.setBatch(shipmentDetail.getBatch());
            shipmentContainerDetaill.setLot(shipmentDetail.getLot());
            shipmentContainerDetaill.setProjectNo(shipmentDetail.getProjectNo());
            shipmentContainerDetaill.setCreatedBy(ShiroUtils.getLoginName());
pengcheng authored
295
            flag = shipmentContainerDetailService.save(shipmentContainerDetaill);
296
297
298
            if(flag == false){
                throw new ServiceException("新建组盘明细失败,sql错误");
            }
pengcheng authored
299
        }
300
301
302
        //4.查看组盘头状态,如果状态在10到20,则生成任务明细或修改任务明细的数量
        //查看任务头
pengcheng authored
303
        if(shipmentContainerHeader.getStatus()>=QuantityConstant.SHIPMENT_CONTAINER_TASK && shipmentContainerHeader.getStatus()<QuantityConstant.SHIPMENT_CONTAINER_REVIEWSUCCESS){
304
305
            LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper=Wrappers.lambdaQuery();
            taskHeaderLambdaQueryWrapper.eq(TaskHeader::getWarehouseCode,shipmentContainerHeader.getWarehouseCode())
pengcheng authored
306
                    .eq(TaskHeader::getInternalTaskType,QuantityConstant.TASK_INTENERTYPE_PICKING)
307
                    .eq(TaskHeader::getAllocationHeadId,shipmentContainerHeader.getId());
308
309
            TaskHeader taskHeader=taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
            if(taskHeader==null){
pengcheng authored
310
                throw new ServiceException("有相同的组盘头,但找不到相应的任务头");
311
            }
312
313
314
315
316
317
318
319

            if(shipmentContainerDetaill == null) {
                //shipmentContainerDetaill为空时,说明组盘明细不是新建,so修改任务明细
                //查找任务明细
                LambdaQueryWrapper<TaskDetail> taskDetailLam = Wrappers.lambdaQuery();
                taskDetailLam.eq(TaskDetail::getWarehouseCode,shipmentContainerDetail.getWarehouseCode())
                        .eq(TaskDetail::getAllocationId,shipmentContainerDetail.getId())
                        .eq(TaskDetail::getTaskId,taskHeader.getId())
pengcheng authored
320
                        .eq(TaskDetail::getInternalTaskType,QuantityConstant.TASK_INTENERTYPE_PICKING);
321
322
323
324
325
326
327
328
329
                TaskDetail taskDetail = taskDetailService.getOne(taskDetailLam);
                if(taskDetail == null){
                    throw new ServiceException("找不到对应的任务明细");
                }
                taskDetail.setQty(taskDetail.getQty().add(shipmentCombinationModel.getShipQty()));
                flag=taskDetailService.saveOrUpdate(taskDetail);
                if(flag == false){
                    throw new ServiceException("修改任务明细失败,sql错误");
                }
330
            }else {
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
                //shipmentContainerDetaill不为空时,说明组盘明细是新建,so新建任务明细
                TaskDetail taskDetail = new TaskDetail();
                taskDetail.setTaskId(taskHeader.getId());
                taskDetail.setInternalTaskType(taskHeader.getInternalTaskType());
                taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
                taskDetail.setCompanyCode(taskHeader.getCompanyCode());
                taskDetail.setTaskType(taskHeader.getTaskType());
                taskDetail.setAllocationId(shipmentContainerDetaill.getId());
                taskDetail.setBillCode(shipmentContainerDetaill.getShipmentCode());
                taskDetail.setBillDetailId(shipmentContainerDetaill.getShipmentDetailId());
                taskDetail.setMaterialCode(shipmentContainerDetaill.getMaterialCode());
                taskDetail.setMaterialName(shipmentContainerDetaill.getMaterialName());
                taskDetail.setMaterialSpec(shipmentContainerDetaill.getMaterialSpec());
                taskDetail.setMaterialUnit(shipmentContainerDetaill.getMaterialUnit());
                taskDetail.setFromInventoryId(shipmentContainerDetaill.getInventoryId());
                taskDetail.setQty(shipmentContainerDetaill.getQty());
                taskDetail.setContainerCode(taskHeader.getContainerCode());
                taskDetail.setFromLocation(taskHeader.getFromLocation());
                taskDetail.setToLocation(taskHeader.getToLocation());
                taskDetail.setLot(shipmentContainerDetaill.getLot());
                taskDetail.setWaveId(shipmentContainerDetaill.getWaveId());
                taskDetail.setBatch(shipmentContainerDetaill.getBatch());
                taskDetail.setProjectNo(shipmentContainerDetail.getProjectNo());
xqs authored
354
                if (shipmentContainerHeader.getStatus().equals(QuantityConstant.SHIPMENT_CONTAINER_TASK)) {
pengcheng authored
355
                    taskDetail.setStatus(QuantityConstant.TASK_STATUS_BUILD);
356
                } else {
pengcheng authored
357
                    taskDetail.setStatus(QuantityConstant.TASK_STATUS_RELEASE);
358
359
360
361
362
363
364
                }
                taskDetail.setCreatedBy(ShiroUtils.getLoginName());
                taskDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
                flag = taskDetailService.save(taskDetail);
                if(flag == false){
                    throw new ServiceException("新建任务明细失败,sql错误");
                }
365
366
            }
        }
pengcheng authored
367
368
369
        return shipmentContainerDetail;
    }
pengcheng authored
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396

    /**
     * 取消组盘的一组明细
     * @param detailIds
     * @return
     */
    @Override
    public AjaxResult cancelCombinationDetail(List<Integer> detailIds)  {
        List<ShipmentContainerDetail> shipmentContainerDetails = new ArrayList<>();
        for(int detailId:detailIds){
            ShipmentContainerDetail shipmentContainerDetail = shipmentContainerDetailService.getById(detailId);
            shipmentContainerDetails.add(shipmentContainerDetail);
        }
        return cancelCombinationDetailInner(shipmentContainerDetails);
    }

    /**
     * 取消组盘的一组明细
     * @param shipmentContainerDetails
     * @return
     */
    @Override
    @Transactional
    public AjaxResult cancelCombinationDetailInner(List<ShipmentContainerDetail> shipmentContainerDetails)  {
        for(ShipmentContainerDetail shipmentContainerDetail:shipmentContainerDetails){
            //获取头
            ShipmentContainerHeader shipmentContainerHeader = this.getById(shipmentContainerDetail.getShippingContainerId());
pengcheng authored
397
            if(shipmentContainerHeader.getStatus()>= QuantityConstant.SHIPMENT_CONTAINER_TASK){
pengcheng authored
398
399
400
401
402
403
404
405
406
407
                return AjaxResult.error("容器"+shipmentContainerHeader.getContainerCode()+"非新建状态,不允许取消明细");
            }
            //恢复占用库存
            InventoryDetail inventoryDetail = inventoryDetailService.getById(shipmentContainerDetail.getInventoryId());
            inventoryDetail.setTaskQty(inventoryDetail.getTaskQty().subtract(shipmentContainerDetail.getQty()));
            inventoryDetailService.saveOrUpdate(inventoryDetail);
            //恢复单据发货数量
            ShipmentDetail shipmentDetail = shipmentDetailService.getById(shipmentContainerDetail.getShipmentDetailId());
            shipmentDetail.setRequestQty(shipmentDetail.getRequestQty().subtract(shipmentContainerDetail.getQty()));
            if(shipmentDetail.getRequestQty().compareTo(BigDecimal.ZERO) != 0 ){
pengcheng authored
408
                shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_WAVE);//明细状态恢复,如果删除后还有以出数量就是波次
pengcheng authored
409
            }else{
pengcheng authored
410
                shipmentDetail.setStatus(QuantityConstant.SHIPMENT_HEADER_POOL );//明细状态
pengcheng authored
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
            }
            shipmentDetailService.saveOrUpdate(shipmentDetail);
            //删除这个配盘明细
            shipmentContainerDetailService.removeById(shipmentContainerDetail.getId());

            //查询头表下还有没有明细,如果没有,则删了这个头表
            ShipmentContainerDetail condition = new ShipmentContainerDetail();
            condition.setShippingContainerId(shipmentContainerDetail.getShippingContainerId());
            List<Map<String, Object>> list= shipmentContainerDetailService.selectListMapByEqual("id", condition);
            if(list==null||list.size() == 0){
                this.removeById(shipmentContainerHeader.getId());
                locationService.updateStatus(shipmentContainerHeader.getLocationCode(),"empty");
            }
            //更新单据状态
            shipmentHeaderService.updateShipmentStatus(shipmentDetail.getShipmentId());
        }
        return AjaxResult.success("");
    }
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
    /**
     * 取消组盘
     * @param shipmentContainerIds
     * @return
     */
    @Override
    public AjaxResult cancelCombination(List<Integer> shipmentContainerIds)  {

        AjaxResult result = checkForCancelCombination(shipmentContainerIds);
        if(result.getCode()!= RetCode.SUCCESS.getValue()){
            return result;
        }
        for(int id : shipmentContainerIds){
            LambdaQueryWrapper<ShipmentContainerDetail> lambdaQueryWrapper=Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(ShipmentContainerDetail::getShippingContainerId,id);
            List<ShipmentContainerDetail> shipmentContainerDetails = shipmentContainerDetailService.list(lambdaQueryWrapper);
            result = cancelCombinationDetailInner(shipmentContainerDetails);
            if(result.hasErr()){
                return result;
            }
        }

        return AjaxResult.success("");
    }
pengcheng authored
454
455
456
457
458
459
460
461
462

    /**
     *  出库自动组盘
     * @param shipmentCode
     * @return
     */
    @Override
    @Transactional
    public AjaxResult autoCombination(String shipmentCode) {
463
464
465
466
467
468
469
        LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLam = Wrappers.lambdaQuery();
        shipmentHeaderLam.eq(ShipmentHeader::getWarehouseCode,ShiroUtils.getWarehouseCode())
                .eq(ShipmentHeader::getCode,shipmentCode);
        ShipmentHeader shipmentHeader = shipmentHeaderService.getOne(shipmentHeaderLam);
        if(shipmentHeader == null){
            throw new ServiceException("系统没有此单据");
        }
470
        shipmentPreferenceService.checkShipmentProcess(shipmentHeader.getId().toString(),100,shipmentCode);
471
pengcheng authored
472
473
474
        LambdaQueryWrapper<ShipmentDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ShipmentDetail::getShipmentCode, shipmentCode)
                .eq(ShipmentDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
pengcheng authored
475
        List<ShipmentDetail> shipmentDetailList = shipmentDetailService.list(lambdaQueryWrapper);
476
        if (shipmentDetailList.isEmpty()) {
pengcheng authored
477
478
            return AjaxResult.error("找不到子单链");
        }
479
480
481
482
483
        for(ShipmentDetail shipmentDetail: shipmentDetailList){
            if(shipmentDetail.getWaveId() != 0){
                return AjaxResult.error(shipmentCode+"单号已加入波次"+shipmentDetail.getWaveId()+",无法自动组盘");
            }
        }
pengcheng authored
484
485
486
487
488
        return this.autoCombination(shipmentDetailList);
    }


    //出库自动组盘
xqs authored
489
    @Override
pengcheng authored
490
491
492
    public AjaxResult autoCombination(List<ShipmentDetail> shipmentDetailList){
        int num = 0;
        List<Integer> list=new ArrayList<>();
pengcheng authored
493
494
495
496
497
498
499
        for (ShipmentDetail item : shipmentDetailList) {
            //获取需要出库数量
            BigDecimal shipmentQty = item.getShipQty().subtract(item.getRequestQty());
            //判断是否还有需要出库的物料,如果没有就跳过该物料
            if (shipmentQty.compareTo(BigDecimal.ZERO) <= 0) {
                continue;
            }
500
            // 根据 仓库编码、货主编码、物料编码,物料状态,项目号来查找可以出库的物料
501
502
503
504
505
//            ShippingSearch search = new ShippingSearch();
//            search.setWarehouseCode(ShiroUtils.getWarehouseCode());
//            search.setCompanyCode(item.getCompanyCode());
//            search.setMaterialCode(item.getMaterialCode());
//            search.setInventorySts(item.getInventorySts()); //物料状态
pengcheng authored
506
507
            List<InventoryDetail> inventoryList = shippingCombinationService.getInventorys(item);
pengcheng authored
508
            if(inventoryList.size() < 1 && item.getWaveId() != 0){
pengcheng authored
509
                Wave wave = waveService.getById(item.getWaveId());
pengcheng authored
510
511
512
                wave.setStatus(QuantityConstant.WAVE_STATUS_ERROR);
                wave.setCurrentWaveStep(QuantityConstant.WAVE_STEP_ERROR);
                wave.setLastWaveStep(QuantityConstant.WAVE_STEP_BUILD);
pengcheng authored
513
                waveService.updateById(wave);
514
                throw new ServiceException("主单为"+item.getShipmentCode()+"子单id为"+item.getId() + "的单据没有库存,波次失败");
pengcheng authored
515
            }
pengcheng authored
516
517
518
519
520
521
522
523
524
525
526
527
528
            if (inventoryList.size() < 1) {
                num = num + 1;
            } else {
                for (InventoryDetail inventory : inventoryList) {
                    //判断是否组盘完毕,完毕就退出内循环
                    if (shipmentQty.compareTo(BigDecimal.ZERO) <= 0) {
                        break;
                    }

                    BigDecimal inventoryQty = inventory.getQty().subtract(inventory.getTaskQty());
                    ShipmentCombinationModel shipmentCombination = new ShipmentCombinationModel();
                    shipmentCombination.setInventoryDetailId(inventory.getId());
                    shipmentCombination.setShipmentDetailId(item.getId());
pengcheng authored
529
                    shipmentCombination.setType((short) QuantityConstant.TASK_TYPE_WHOLESHIPMENT.intValue());
pengcheng authored
530
pengcheng authored
531
532
533
534
                    //如果库存数 >= 待出库数,组盘数就是待出库数并且结束组盘,否则组盘数就是库存数
                    if (inventoryQty.compareTo(shipmentQty) > -1) {
                        shipmentCombination.setShipQty(shipmentQty);
                        ShipmentContainerHeader shipmentContainerHeader=this.combination(shipmentCombination);
pengcheng authored
535
                        list.add(shipmentContainerHeader.getId());
pengcheng authored
536
537
538
539
540
541
542
543
544
545
                    } else {
                        shipmentCombination.setShipQty(inventoryQty);
                        ShipmentContainerHeader shipmentContainerHeader=this.combination(shipmentCombination);
                        list.add(shipmentContainerHeader.getId());
                    }
                    shipmentQty = shipmentQty.subtract(shipmentCombination.getShipQty());
                }
            }
        }
        if(num==shipmentDetailList.size()){
546
            throw new ServiceException("单据物料的库存分配规则在此库区没有库存,无法出库");
pengcheng authored
547
        }
pengcheng authored
548
        return AjaxResult.success("成功",list);
pengcheng authored
549
550
    }
551
552
553
554
555
556
557
558
559
    /**
     * 检查是否可以进行取消配盘
     * @param shipmentContainerIds
     * @return
     */
    @Override
    public AjaxResult checkForCancelCombination(List<Integer> shipmentContainerIds) {
        for(int id : shipmentContainerIds){
            ShipmentContainerHeader shipmentContainerHeader = this.getById(id);
pengcheng authored
560
            if(shipmentContainerHeader.getStatus()>=QuantityConstant.SHIPMENT_CONTAINER_TASK){
561
562
563
564
565
566
567
568
569
570
571
572
573
                return AjaxResult.error("存在已生成任务的记录,请先取消任务再取消组盘");
            }
        }
        return AjaxResult.success("");
    }

    /* 生成任务 */
    @Override
    @Transactional
    public AjaxResult createTask(List<Integer> idList) {
        ShipmentTaskCreateModel shipmentTask = new ShipmentTaskCreateModel();
        for (Integer id : idList)   {
            shipmentTask.setShipmentContainerHeaderIds(id);
574
            AjaxResult ajaxResult = shipmentTaskService.createTaskFromShipmentContainers(shipmentTask);
pengcheng authored
575
576
577
            if(ajaxResult.hasErr()){
                return ajaxResult;
            }
578
579
580
581
        }
        return AjaxResult.success("全部生成完毕");
    }
582
}