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.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 lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(Task::getBarcode, barcode); Task task = taskService.getOne(lambdaQueryWrapper); if (null == task){ return R.error("未查询到相关任务"); } List taskItems = taskItemService.list(new LambdaQueryWrapper().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 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 taskItems = taskItemService.list(new LambdaQueryWrapper().eq(TaskItem::getTaskId, task.getId())); Map> 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 lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(!Cools.isEmpty(barcode),Wave::getCode,barcode); List waveList = waveService.list(lambdaQueryWrapper); return R.ok(waveList); } @Override public R getContainerWaveList(Map map) { String barcode = map.get("barcode"); if (Cools.isEmpty(barcode) ){ throw new CoolException("参数有误"); } Task task = taskService.getOne(new LambdaQueryWrapper().eq(Task::getBarcode, barcode)); if (null == task){ throw new CoolException("未找到容器号对应任务"); } if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)){ return R.error("任务状态不是等待确认"); } ArrayList containerWaveDtos = new ArrayList<>(); List taskItems = taskItemService.list(new LambdaQueryWrapper().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 waveOrderRelas = waveOrderRelaService.list(new LambdaQueryWrapper().eq(WaveOrderRela::getWaveId, wave.getId())); if (Cools.isEmpty(waveOrderRelas)){ throw new CoolException("波次对应关联单未找到"); } List ids = waveOrderRelas.stream().map(WaveOrderRela::getOrderId).collect(Collectors.toList()); ArrayList list = new ArrayList<>(); List wkOrderList = asnOrderService.list(new LambdaQueryWrapper().in(WkOrder::getId, ids)); for (WkOrder wkOrder : wkOrderList) { WkOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper() .eq(WkOrderItem::getOrderId, wkOrder.getId()) .eq(WkOrderItem::getMatnrCode, taskItem.getMatnrCode()) .eq(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().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 wkOrderList = asnOrderService.list(new LambdaQueryWrapper().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 wkOrderItems = asnOrderItemService.list(new LambdaQueryWrapper().eq(WkOrderItem::getOrderCode, orderItem.getOrderCode())); return wkOrderItems.stream().allMatch(item -> new BigDecimal(item.getAnfme().toString()).equals(new BigDecimal(item.getQty().toString()))); } }