| | |
| | | import com.vincent.rsf.server.manager.enums.*; |
| | | import com.vincent.rsf.server.manager.service.*; |
| | | import com.vincent.rsf.server.manager.service.impl.BasContainerServiceImpl; |
| | | import com.vincent.rsf.server.manager.service.impl.BasStationAreaServiceImpl; |
| | | import com.vincent.rsf.server.system.constant.SerialRuleCode; |
| | | import com.vincent.rsf.server.system.utils.SerialRuleUtils; |
| | | import lombok.Synchronized; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import jakarta.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | |
| | | private WaitPakinService waitPakinService; |
| | | @Autowired |
| | | private WaitPakinItemService waitPakinItemService; |
| | | @Autowired |
| | | private BasStationAreaServiceImpl basStationAreaService; |
| | | |
| | | @Override |
| | | public R getOutStockTaskItem(String barcode) { |
| | |
| | | if (!task.getResource().equals(TaskResouceType.TASK_RESOUCE_STOCK_UP.val)) { |
| | | throw new CoolException("当前托盘不是备货出库任务"); |
| | | } |
| | | List<TaskItem> taskItems = taskItemService |
| | | .list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); |
| | | if (Cools.isEmpty(param.getTaskItemList())) { |
| | | throw new CoolException("任务明细为空"); |
| | | } |
| | | |
| | | WaitPakin waitPakin = waitPakinService |
| | | .getOne(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, param.getNewContainerNo())); |
| | |
| | | throw new CoolException("编码规则错误: 编码规则「SYS_WAIT_PAKIN_CODE」规则是不存在"); |
| | | } |
| | | waitPakin1.setCode(ruleCode) |
| | | .setIoStatus(PakinIOStatus.PAKIN_IO_STATUS_HOLD.val) |
| | | .setAnfme(taskItems.stream().map(TaskItem::getAnfme).mapToDouble(Double::doubleValue).sum()) |
| | | .setIoStatus(PakinIOStatus.PAKIN_IO_STATUS_DONE.val) |
| | | .setAnfme(param.getTaskItemList().stream() |
| | | .map(TaskItem::getInputQty) |
| | | .filter(Objects::nonNull) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add) |
| | | .doubleValue()) |
| | | .setUpdateBy(userId) |
| | | .setCreateBy(userId) |
| | | .setBarcode(param.getNewContainerNo()); |
| | |
| | | throw new CoolException("组托主单保存失败!!"); |
| | | } |
| | | List<WaitPakinItem> items = new ArrayList<>(); |
| | | for (TaskItem taskItem : taskItems) { |
| | | for (TaskItem taskItem : param.getTaskItemList()) { |
| | | WaitPakinItem pakinItem = new WaitPakinItem(); |
| | | pakinItem.setAnfme(taskItem.getAnfme()) |
| | | pakinItem.setAnfme(taskItem.getInputQty().doubleValue()) |
| | | .setPakinId(waitPakin1.getId()) |
| | | .setSource(taskItem.getId()) |
| | | .setAsnId(taskItem.getSourceId()) |
| | |
| | | throw new CoolException("组托明细保存失败!!"); |
| | | } |
| | | } else { |
| | | double sum = taskItems.stream().map(TaskItem::getAnfme).mapToDouble(Double::doubleValue).sum(); |
| | | double sum = param.getTaskItemList().stream() |
| | | .map(TaskItem::getInputQty) |
| | | .filter(Objects::nonNull) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add) |
| | | .doubleValue(); |
| | | waitPakin |
| | | .setAnfme(waitPakin.getAnfme() + sum) |
| | | .setUpdateBy(userId) |
| | |
| | | List<WaitPakinItem> existPakinItems = waitPakinItemService |
| | | .list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, waitPakin.getId())); |
| | | List<WaitPakinItem> items = new ArrayList<>(); |
| | | for (TaskItem taskItem : taskItems) { |
| | | for (TaskItem taskItem : param.getTaskItemList()) { |
| | | Optional<WaitPakinItem> optionalItem = existPakinItems.stream() |
| | | .filter(e -> Objects.equals(e.getMatnrCode(), taskItem.getMatnrCode()) |
| | | && Objects.equals(e.getBatch(), taskItem.getSplrBatch()) |
| | |
| | | |
| | | if (optionalItem.isPresent()) { |
| | | WaitPakinItem existItem = optionalItem.get(); |
| | | existItem.setAnfme(existItem.getAnfme() + taskItem.getAnfme()) |
| | | existItem.setAnfme(existItem.getAnfme() + taskItem.getInputQty().doubleValue()) |
| | | .setUpdateBy(userId); |
| | | if (!items.contains(existItem)) { |
| | | items.add(existItem); |
| | | } |
| | | } else { |
| | | WaitPakinItem pakinItem = new WaitPakinItem(); |
| | | pakinItem.setAnfme(taskItem.getAnfme()) |
| | | pakinItem.setAnfme(taskItem.getInputQty().doubleValue()) |
| | | .setPakinId(waitPakin.getId()) |
| | | .setSource(taskItem.getId()) |
| | | .setAsnId(taskItem.getSourceId()) |
| | |
| | | if (!waitPakinItemService.saveOrUpdateBatch(items)) { |
| | | throw new CoolException("组托明细保存失败!!"); |
| | | } |
| | | } |
| | | |
| | | Map<Long, BigDecimal> taskItemInputQtyMap = param.getTaskItemList().stream() |
| | | .filter(Objects::nonNull) |
| | | .filter(e -> !Objects.isNull(e.getId())) |
| | | .collect(Collectors.toMap(TaskItem::getId, |
| | | e -> Objects.isNull(e.getInputQty()) ? BigDecimal.ZERO : e.getInputQty(), |
| | | BigDecimal::add)); |
| | | if (taskItemInputQtyMap.isEmpty()) { |
| | | throw new CoolException("任务明细参数错误"); |
| | | } |
| | | List<TaskItem> toUpdateTaskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>() |
| | | .eq(TaskItem::getTaskId, task.getId()) |
| | | .in(TaskItem::getId, taskItemInputQtyMap.keySet())); |
| | | if (Cools.isEmpty(toUpdateTaskItems) || toUpdateTaskItems.size() != taskItemInputQtyMap.size()) { |
| | | throw new CoolException("未找到对应任务明细"); |
| | | } |
| | | toUpdateTaskItems.forEach(item -> { |
| | | double currentWorkQty = Objects.isNull(item.getWorkQty()) ? 0D : item.getWorkQty(); |
| | | BigDecimal inputQty = taskItemInputQtyMap.getOrDefault(item.getId(), BigDecimal.ZERO); |
| | | item.setWorkQty(BigDecimal.valueOf(currentWorkQty).add(inputQty).doubleValue()) |
| | | .setUpdateBy(userId); |
| | | }); |
| | | if (!taskItemService.updateBatchById(toUpdateTaskItems)) { |
| | | throw new CoolException("任务明细更新失败"); |
| | | } |
| | | |
| | | |
| | | //判断任务明细是否全部完成 |
| | | List<TaskItem> allTaskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>() |
| | | .eq(TaskItem::getTaskId, task.getId())); |
| | | if (Cools.isEmpty(allTaskItems)) { |
| | | throw new CoolException("未找到任务明细"); |
| | | } |
| | | boolean allTaskItemsFinished = allTaskItems.stream().allMatch(item -> { |
| | | BigDecimal workQty = BigDecimal.valueOf(Objects.isNull(item.getWorkQty()) ? 0D : item.getWorkQty()); |
| | | BigDecimal qty = BigDecimal.valueOf(Objects.isNull(item.getAnfme()) ? 0D : item.getAnfme()); |
| | | return workQty.compareTo(qty) == 0; |
| | | }); |
| | | if (allTaskItemsFinished) { |
| | | task.setTaskStatus(TaskStsType.COMPLETE_OUT.id) |
| | | .setUpdateBy(userId) |
| | | .setUpdateTime(new Date()); |
| | | if (!taskService.updateById(task)) { |
| | | throw new CoolException("任务状态更新失败"); |
| | | } |
| | | if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) { |
| | | BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>() |
| | | .eq(BasStation::getBarcode, param.getContainerNo())); |
| | | if (!Cools.isEmpty(basStation)) { |
| | | basStation.setUseStatus(LocStsType.LOC_STS_TYPE_D.type); |
| | | basStation.setUpdateTime(new Date()); |
| | | if (!basStationService.updateById(basStation)){ |
| | | throw new CoolException("站点状态更新失败"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | return R.ok(); |
| | | } |
| | | |
| | | @Override |
| | | public R taskItemList(PdaGeneralParam param, Long loginUserId) { |
| | | if (Cools.isEmpty(param.getContainerNo())) { |
| | | throw new CoolException("无容器号"); |
| | | } |
| | | Task task = taskService.getOne(new LambdaQueryWrapper<Task>() |
| | | .eq(Task::getBarcode, param.getContainerNo()) |
| | | .eq(Task::getTaskStatus, TaskStsType.AWAIT.id) |
| | | ); |
| | | if (null == task) { |
| | | throw new CoolException("未找到任务"); |
| | | } |
| | | if (!task.getResource().equals(TaskResouceType.TASK_RESOUCE_STOCK_UP.val)) { |
| | | throw new CoolException("当前托盘不是备货出库任务"); |
| | | } |
| | | List<TaskItem> taskItems = taskItemService |
| | | .list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId())); |
| | | |
| | | return R.ok(taskItems); |
| | | } |
| | | |
| | | @Override |
| | | public R getOrderItem(PdaGeneralParam param) { |
| | | WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>() |
| | | .eq(WkOrder::getCode, param.getOrderNo()) |
| | | .eq(WkOrder::getType,OrderType.ORDER_OUT.type) |
| | | ); |
| | | if (null == order) { |
| | | throw new CoolException("未找到对应订单"); |
| | | } |
| | | if (!order.getExceStatus().equals(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val) && !order.getExceStatus().equals(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) ) { |
| | | throw new CoolException("当前订单不在可执行状态"); |
| | | } |
| | | List<WkOrderItem> list = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>() |
| | | .eq(WkOrderItem::getOrderId, order.getId()) |
| | | .apply("anfme <> work_qty") |
| | | ); |
| | | |
| | | return R.ok(list); |
| | | } |
| | | |
| | | @Override |
| | | public R getStationArea(PdaGeneralParam param) { |
| | | return R.ok(basStationAreaService.list()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public R productionDirectDelivery(PdaGeneralParam param,Long loginUserId) { |
| | | WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>() |
| | | .eq(WkOrder::getCode, param.getOrderNo()) |
| | | .eq(WkOrder::getType,OrderType.ORDER_OUT.type) |
| | | ); |
| | | if (null == order) { |
| | | throw new CoolException("未找到对应订单"); |
| | | } |
| | | ArrayList<String> arrayList = new ArrayList<>(); |
| | | arrayList.add(param.getStationAreaId().toString()); |
| | | Task task = new Task(); |
| | | String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); |
| | | task.setTaskCode(ruleCode) |
| | | .setOrgSite(param.getSta1()) |
| | | .setSort(Constants.TASK_SORT_DEFAULT_VALUE) |
| | | .setUpdateBy(loginUserId) |
| | | .setCreateBy(loginUserId) |
| | | .setCreateTime(new Date()) |
| | | .setUpdateTime(new Date()) |
| | | .setTaskStatus(TaskStsType.MISSION_INITIAL.id) |
| | | .setBarcode(param.getContainerNo()) |
| | | .setTargSiteArea(arrayList) |
| | | .setTaskType(TaskType.TASK_TYPE_PDD.type); |
| | | |
| | | if (!taskService.save(task)) { |
| | | throw new CoolException("任务创建失败!!"); |
| | | } |
| | | List<TaskItem> taskItems = new ArrayList<>(); |
| | | param.getWkOrderItems().forEach(item -> { |
| | | TaskItem taskItem = new TaskItem(); |
| | | BeanUtils.copyProperties(item, taskItem); |
| | | taskItem.setTaskId(task.getId()) |
| | | .setAnfme(item.getDemandQty()) |
| | | .setWorkQty(0D) |
| | | .setBatch(item.getBatch()) |
| | | .setUpdateBy(loginUserId) |
| | | .setCreateBy(loginUserId) |
| | | .setCreateTime(new Date()) |
| | | .setUpdateTime(new Date()) |
| | | .setSplrBatch(item.getBatch()) |
| | | .setPlatWorkCode(item.getPlatWorkCode()) |
| | | .setPlatItemId(item.getPlatItemId()) |
| | | .setOrderType(OrderType.ORDER_OUT.type) |
| | | .setWkType(Short.parseShort(order.getWkType())) |
| | | .setSourceCode(order.getCode()) |
| | | .setSourceId(order.getId()); |
| | | taskItems.add(taskItem); |
| | | |
| | | item.setWorkQty(item.getWorkQty()+item.getDemandQty()); |
| | | }); |
| | | if (!taskItemService.saveBatch(taskItems)) { |
| | | throw new CoolException("任务明细生成失败!!"); |
| | | } |
| | | if (!order.getExceStatus().equals(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val)) { |
| | | order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val); |
| | | order.setUpdateBy(loginUserId); |
| | | order.setUpdateTime(new Date()); |
| | | if (!asnOrderService.updateById(order)){ |
| | | throw new CoolException("单据状态更新失败!!"); |
| | | } |
| | | } |
| | | if (!asnOrderItemService.updateBatchById(param.getWkOrderItems())) { |
| | | throw new CoolException("单据明细更新失败!!"); |
| | | } |
| | | |
| | | return R.ok(); |
| | | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public R finishedProductDirectOutput(PdaGeneralParam param, Long loginUserId) { |
| | | WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>() |
| | | .eq(WkOrder::getCode, param.getOrderNo()) |
| | | .eq(WkOrder::getType,OrderType.ORDER_OUT.type) |
| | | ); |
| | | if (null == order) { |
| | | throw new CoolException("未找到对应订单"); |
| | | } |
| | | ArrayList<String> arrayList = new ArrayList<>(); |
| | | arrayList.add(param.getStationAreaId().toString()); |
| | | Task task = new Task(); |
| | | String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); |
| | | task.setTaskCode(ruleCode) |
| | | .setOrgSite(param.getSta1()) |
| | | .setSort(Constants.TASK_SORT_DEFAULT_VALUE) |
| | | .setUpdateBy(loginUserId) |
| | | .setCreateBy(loginUserId) |
| | | .setCreateTime(new Date()) |
| | | .setUpdateTime(new Date()) |
| | | .setTaskStatus(TaskStsType.MISSION_INITIAL.id) |
| | | .setBarcode(param.getContainerNo()) |
| | | .setTargSiteArea(arrayList) |
| | | .setTaskType(TaskType.TASK_TYPE_FPDO.type); |
| | | |
| | | if (!taskService.save(task)) { |
| | | throw new CoolException("任务创建失败!!"); |
| | | } |
| | | List<TaskItem> taskItems = new ArrayList<>(); |
| | | param.getWkOrderItems().forEach(item -> { |
| | | TaskItem taskItem = new TaskItem(); |
| | | BeanUtils.copyProperties(item, taskItem); |
| | | taskItem.setTaskId(task.getId()) |
| | | .setAnfme(item.getDemandQty()) |
| | | .setWorkQty(0D) |
| | | .setBatch(item.getBatch()) |
| | | .setUpdateBy(loginUserId) |
| | | .setCreateBy(loginUserId) |
| | | .setCreateTime(new Date()) |
| | | .setUpdateTime(new Date()) |
| | | .setSplrBatch(item.getBatch()) |
| | | .setPlatWorkCode(item.getPlatWorkCode()) |
| | | .setPlatItemId(item.getPlatItemId()) |
| | | .setOrderType(OrderType.ORDER_OUT.type) |
| | | .setWkType(Short.parseShort(order.getWkType())) |
| | | .setSourceCode(order.getCode()) |
| | | .setSourceId(order.getId()); |
| | | taskItems.add(taskItem); |
| | | |
| | | item.setWorkQty(item.getWorkQty()+item.getDemandQty()); |
| | | }); |
| | | if (!taskItemService.saveBatch(taskItems)) { |
| | | throw new CoolException("任务明细生成失败!!"); |
| | | } |
| | | if (!order.getExceStatus().equals(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val)) { |
| | | order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val); |
| | | order.setUpdateBy(loginUserId); |
| | | order.setUpdateTime(new Date()); |
| | | if (!asnOrderService.updateById(order)){ |
| | | throw new CoolException("单据状态更新失败!!"); |
| | | } |
| | | } |
| | | if (!asnOrderItemService.updateBatchById(param.getWkOrderItems())) { |
| | | throw new CoolException("单据明细更新失败!!"); |
| | | } |
| | | |
| | | return R.ok(); |
| | |
| | | throw new CoolException("站点状态不为空闲"); |
| | | } |
| | | |
| | | List<Long> areaList = basStation.getCrossZoneArea(); |
| | | List<Long> areaList = basStation.getCrossZoneArea().stream() |
| | | .map(Integer::longValue) |
| | | .collect(Collectors.toList()); |
| | | if (Cools.isEmpty(areaList)) { |
| | | throw new CoolException("当前站点库区未配置"); |
| | | } |
| | |
| | | item -> new BigDecimal(item.getAnfme().toString()).equals(new BigDecimal(item.getQty().toString()))); |
| | | } |
| | | } |
| | | |