| package com.vincent.rsf.server.api.service.impl; | 
|   | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.vincent.rsf.framework.common.Cools; | 
| import com.vincent.rsf.framework.common.R; | 
| import com.vincent.rsf.framework.exception.CoolException; | 
| import com.vincent.rsf.server.api.entity.dto.ContainerWaveDto; | 
| import com.vincent.rsf.server.api.entity.params.ContainerWaveParam; | 
| import com.vincent.rsf.server.api.service.PdaOutStockService; | 
| import com.vincent.rsf.server.manager.entity.*; | 
| import com.vincent.rsf.server.manager.enums.AsnExceStatus; | 
| import com.vincent.rsf.server.manager.enums.TaskStsType; | 
| import com.vincent.rsf.server.manager.service.*; | 
| import lombok.Synchronized; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
|   | 
| import javax.annotation.Resource; | 
| import java.math.BigDecimal; | 
| import java.util.ArrayList; | 
| import java.util.List; | 
| import java.util.Map; | 
| import java.util.Objects; | 
| import java.util.stream.Collectors; | 
|   | 
| @Service | 
| public class PdaOutStockServiceImpl implements PdaOutStockService { | 
|   | 
|     @Resource | 
|     private TaskService taskService; | 
|     @Resource | 
|     private TaskItemService taskItemService; | 
|     @Autowired | 
|     private WaveService waveService; | 
|     @Autowired | 
|     private AsnOrderService asnOrderService; | 
|     @Autowired | 
|     private AsnOrderItemService asnOrderItemService; | 
|     @Autowired | 
|     private WaveOrderRelaService waveOrderRelaService; | 
|   | 
|     @Override | 
|     public R getOutStockTaskItem(String barcode) { | 
|         LambdaQueryWrapper<Task> lambdaQueryWrapper = new LambdaQueryWrapper<>(); | 
|         lambdaQueryWrapper.eq(Task::getBarcode, barcode); | 
|         Task task = taskService.getOne(lambdaQueryWrapper); | 
|         if (null == task) { | 
|             return R.error("未查询到相关任务"); | 
|         } | 
|         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); | 
|         if (null == taskItems || taskItems.size() <= 0) { | 
|             return R.error("任务出错,未查询到相关任务明细"); | 
|         } | 
|   | 
|   | 
|         return R.ok(taskItems); | 
|     } | 
|   | 
|     @Override | 
|     public R saveOutTaskSts(String barcode) { | 
|         LambdaQueryWrapper<Task> lambdaQueryWrapper = new LambdaQueryWrapper<>(); | 
|         lambdaQueryWrapper.eq(Task::getBarcode, barcode); | 
|         Task task = taskService.getOne(lambdaQueryWrapper); | 
|         if (null == task) { | 
|             throw new CoolException("未找到容器号对应任务"); | 
|         } | 
|         if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) { | 
|             return R.error("任务状态不是等待确认"); | 
|         } | 
|         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); | 
|         Map<Long, List<TaskItem>> maps = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getSource)); | 
|         maps.keySet().forEach(key -> { | 
|             WkOrderItem orderItem = asnOrderItemService.getById(key); | 
|             if (Objects.isNull(orderItem)) { | 
|                 throw new CoolException("单据明细不存在!!"); | 
|             } | 
|         }); | 
|         task.setTaskStatus(TaskStsType.COMPLETE_OUT.id); | 
|         if (!taskService.updateById(task)) { | 
|             return R.error("更新任务状态失败"); | 
|         } | 
|   | 
|         return R.ok("确认成功"); | 
|     } | 
|   | 
|     @Override | 
|     public R getWaveListItem(String barcode) { | 
|         LambdaQueryWrapper<Wave> lambdaQueryWrapper = new LambdaQueryWrapper<>(); | 
|         lambdaQueryWrapper.eq(!Cools.isEmpty(barcode), Wave::getCode, barcode); | 
|         List<Wave> waveList = waveService.list(lambdaQueryWrapper); | 
|         return R.ok(waveList); | 
|     } | 
|   | 
|     @Override | 
|     public R getContainerWaveList(Map<String, String> map) { | 
|         String barcode = map.get("barcode"); | 
|   | 
|         if (Cools.isEmpty(barcode)) { | 
|             throw new CoolException("参数有误"); | 
|         } | 
|         Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, barcode)); | 
|         if (null == task) { | 
|             throw new CoolException("未找到容器号对应任务"); | 
|         } | 
|         if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) { | 
|             return R.error("任务状态不是等待确认"); | 
|         } | 
|         ArrayList<ContainerWaveDto> containerWaveDtos = new ArrayList<>(); | 
|         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); | 
|         for (TaskItem taskItem : taskItems) { | 
|             ContainerWaveDto containerWaveDto = new ContainerWaveDto(); | 
|             containerWaveDto.setTaskItem(taskItem); | 
|             Wave wave = waveService.getById(taskItem.getSourceId()); | 
|             if (null == wave) { | 
|                 throw new CoolException("未找到容器号对应波次"); | 
|             } | 
|             List<WaveOrderRela> waveOrderRelas = waveOrderRelaService.list(new LambdaQueryWrapper<WaveOrderRela>().eq(WaveOrderRela::getWaveId, wave.getId())); | 
|             if (Cools.isEmpty(waveOrderRelas)) { | 
|                 throw new CoolException("波次对应关联单未找到"); | 
|             } | 
|             List<Long> ids = waveOrderRelas.stream().map(WaveOrderRela::getOrderId).collect(Collectors.toList()); | 
|             ArrayList<WkOrderItem> list = new ArrayList<>(); | 
|             List<WkOrder> wkOrderList = asnOrderService.list(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getId, ids)); | 
|             for (WkOrder wkOrder : wkOrderList) { | 
|                 WkOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>() | 
|                         .eq(WkOrderItem::getOrderId, wkOrder.getId()) | 
|                         .eq(StringUtils.isNotEmpty(taskItem.getMatnrCode()), WkOrderItem::getMatnrCode, taskItem.getMatnrCode()) | 
|                         .eq(StringUtils.isNotEmpty(taskItem.getBatch()), WkOrderItem::getSplrBatch, taskItem.getBatch()) | 
|                 ); | 
|                 if (null != orderItem) { | 
|                     list.add(orderItem); | 
|                 } | 
|             } | 
|             containerWaveDto.setWkOrderItems(list); | 
|             containerWaveDtos.add(containerWaveDto); | 
|         } | 
|   | 
|         return R.ok(containerWaveDtos); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     @Synchronized | 
|     public R saveWavePick(ContainerWaveParam containerWaveParam, Long loginUserId) { | 
|         if (null == containerWaveParam || containerWaveParam.getContainerWaveDtos().size() <= 0) { | 
|             return R.error("参数错误"); | 
|         } | 
|         Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, containerWaveParam.getContainer())); | 
|         if (null == task) { | 
|             return R.error("未找到托盘对应的任务"); | 
|         } | 
|         if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) { | 
|             return R.error("任务状态不是等待确认"); | 
|         } | 
|   | 
|         for (ContainerWaveDto containerWaveDto : containerWaveParam.getContainerWaveDtos()) { | 
|             //做一次校验,判断前端所有出库数量是否超过本托出库数量 | 
|             double sum = containerWaveDto.getWkOrderItems().stream().mapToDouble(WkOrderItem::getDemandQty).sum(); | 
|             BigDecimal total = new BigDecimal(String.valueOf(sum)); | 
|             BigDecimal anfme = new BigDecimal(containerWaveDto.getTaskItem().getAnfme().toString()); | 
|             if (!anfme.equals(total)) { | 
|                 throw new CoolException("播种数量不等于容器出库数量,请检查"); | 
|             } | 
|             for (WkOrderItem oldOrderItem : containerWaveDto.getWkOrderItems()) { | 
|                 if (Double.compare(oldOrderItem.getDemandQty(), 0.0) == 0) { | 
|                     continue; | 
|                 } | 
|                 WkOrderItem orderItem = asnOrderItemService.getById(oldOrderItem.getId()); | 
|                 BigDecimal num = new BigDecimal(orderItem.getWorkQty().toString()).subtract(new BigDecimal(orderItem.getQty().toString())); | 
|                 BigDecimal orderDemandQty = new BigDecimal(oldOrderItem.getDemandQty().toString()); | 
|                 if (num.compareTo(orderDemandQty) < 0) { | 
|                     throw new CoolException("播种数量大于单据出库数量,请检查"); | 
|                 } | 
|                 WkOrder wkOrder = asnOrderService.getById(orderItem.getOrderId()); | 
|                 if (Cools.isEmpty(wkOrder)) { | 
|                     throw new CoolException("出库单主单未找到"); | 
|                 } | 
|                 wkOrder.setQty(new BigDecimal(wkOrder.getQty().toString()).add(orderDemandQty).doubleValue()); | 
|                 if (!asnOrderService.updateById(wkOrder)) { | 
|                     throw new CoolException("出库单更新状态失败"); | 
|                 } | 
|                 orderItem.setQty(new BigDecimal(orderItem.getQty().toString()).add(orderDemandQty).doubleValue()); | 
|                 if (!asnOrderItemService.updateById(orderItem)) { | 
|                     throw new CoolException("单据明细更新失败"); | 
|                 } | 
|                 //检查单据是否完成 | 
|                 Boolean orderChecked = checkOrderComplete(orderItem); | 
|                 if (orderChecked) { | 
|                     wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val); | 
|                     if (!asnOrderService.updateById(wkOrder)) { | 
|                         throw new CoolException("出库单更新状态失败"); | 
|                     } | 
|                 } | 
|             } | 
|             //检查波次是否完成 | 
| //            Boolean waveChecked = checkWaveComplete(containerWaveDto.getTaskItem()); | 
| //            if (waveChecked){ | 
| //                Wave wave = waveService.getById(containerWaveDto.getTaskItem().getSourceId()); | 
| //                if (null == wave){ | 
| //                    throw new CoolException("未找到容器号对应波次"); | 
| //                } | 
| //                wave.setExceStatus(WaveExceStatus.WAVE_EXCE_STATUS_TASK.val); | 
| //                if (!waveService.updateById(wave)){ | 
| //                    throw new CoolException("波次单更新状态失败"); | 
| //                } | 
| //            } | 
|   | 
|         } | 
|   | 
|         task.setTaskStatus(TaskStsType.COMPLETE_OUT.id); | 
|         if (!taskService.updateById(task)) { | 
|             throw new CoolException("任务状态更新失败"); | 
|         } | 
|   | 
|   | 
|         return R.ok(); | 
|     } | 
|   | 
|   | 
|     private Boolean checkWaveComplete(TaskItem taskItem) { | 
|         Wave wave = waveService.getById(taskItem.getSourceId()); | 
|         List<WkOrder> wkOrderList = asnOrderService.list(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getWaveId, wave.getId())); | 
|         return wkOrderList.stream().allMatch(item -> new BigDecimal(item.getAnfme().toString()).equals(new BigDecimal(item.getQty().toString()))); | 
|     } | 
|   | 
|     private Boolean checkOrderComplete(WkOrderItem orderItem) { | 
|         List<WkOrderItem> wkOrderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderCode, orderItem.getOrderCode())); | 
|         return wkOrderItems.stream().allMatch(item -> new BigDecimal(item.getAnfme().toString()).equals(new BigDecimal(item.getQty().toString()))); | 
|     } | 
| } |