| | |
| | | import com.vincent.rsf.server.manager.entity.*; |
| | | import com.vincent.rsf.server.manager.enums.PakinIOStatus; |
| | | import com.vincent.rsf.server.manager.mapper.WaitPakinMapper; |
| | | import com.vincent.rsf.server.manager.mapper.MatnrMapper; |
| | | import com.vincent.rsf.server.manager.service.*; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.vincent.rsf.server.common.utils.QuantityUtils; |
| | | import com.vincent.rsf.server.system.constant.SerialRuleCode; |
| | | import com.vincent.rsf.server.system.utils.SerialRuleUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | |
| | | private TaskService taskService; |
| | | @Autowired |
| | | private TaskItemService taskItemService; |
| | | @Autowired |
| | | private MatnrMapper matnrMapper; |
| | | |
| | | |
| | | /** |
| | |
| | | throw new CoolException("参数错误:物料跟踪码为空!"); |
| | | } |
| | | if (StringUtils.isBlank(waitPakin.getBarcode())) { |
| | | throw new CoolException("参数错误:托盘码为空!!"); |
| | | throw new CoolException("参数错误:料箱码为空!!"); |
| | | } |
| | | WaitPakin pakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>() |
| | | .eq(WaitPakin::getBarcode, waitPakin.getBarcode())); |
| | | |
| | | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, waitPakin.getBarcode())); |
| | | if (!tasks.isEmpty()) { |
| | | throw new CoolException("当前托盘已有任务档在执行,不能再次组托!!"); |
| | | } |
| | | // 如果料箱码已经组托过,提示已组托,请更换料箱码 |
| | | if (!Objects.isNull(pakin)) { |
| | | List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(!Objects.isNull(pakin.getId()) ,WaitPakinItem::getPakinId, pakin.getId())); |
| | | waitPakinItems.forEach(item -> { |
| | | for (PakinItem pakinItem : waitPakin.getItems()) { |
| | | WarehouseAreasItem warehouseAreasItems = warehouseAreasItemService.getById(pakinItem.getId()); |
| | | if (Objects.isNull(warehouseAreasItems)) { |
| | | throw new CoolException("物料未送至收货区或已组托完成移出收货区!!"); |
| | | } |
| | | // 只在票号不为空时才进行重复检查 |
| | | if (!Objects.isNull(item.getFieldsIndex()) && !Objects.isNull(warehouseAreasItems.getFieldsIndex()) |
| | | && item.getFieldsIndex().equals(warehouseAreasItems.getFieldsIndex())) { |
| | | String crushNo = item.getExtendFields() != null ? item.getExtendFields().get("crushNo") : ""; |
| | | throw new CoolException("票号:" + crushNo + "已组托,不可重复组托!!"); |
| | | } |
| | | } |
| | | }); |
| | | throw new CoolException("已组托,请更换料箱码"); |
| | | } |
| | | |
| | | List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, waitPakin.getBarcode())); |
| | | if (!tasks.isEmpty()) { |
| | | throw new CoolException("当前料箱已有任务档在执行,不能再次组托!!"); |
| | | } |
| | | |
| | | // 检查料箱码是否在库存中存在(通过库位表查询) |
| | | List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, waitPakin.getBarcode())); |
| | | if (!locs.isEmpty()) { |
| | | List<String> locCodes = locs.stream().map(Loc::getCode).collect(Collectors.toList()); |
| | | String join = StringUtils.join(locCodes, ","); |
| | | throw new CoolException("托盘码:" + waitPakin.getBarcode() + "已被库位:" + join + "使用!!"); |
| | | throw new CoolException("在库,请更换料箱码"); |
| | | } |
| | | double sum = waitPakin.getItems().stream().mapToDouble(PakinItem::getReceiptQty).sum(); |
| | | |
| | | Double sum = QuantityUtils.roundToScale(waitPakin.getItems().stream().mapToDouble(PakinItem::getReceiptQty).sum()); |
| | | |
| | | WaitPakin waitPakin1 = new WaitPakin(); |
| | | if (Objects.isNull(pakin)) { |
| | |
| | | |
| | | List<WaitPakinItem> items = new ArrayList<>(); |
| | | for (PakinItem pakinItem1 : waitPakin.getItems()) { |
| | | //不良标签组托 |
| | | WarehouseAreasItem warehouseAreasItems = warehouseAreasItemService.getById(pakinItem1.getId()); |
| | | if (null == warehouseAreasItems) { |
| | | throw new CoolException("物料未送至收货区!!"); |
| | | } |
| | | WaitPakinItem pakinItem = new WaitPakinItem(); |
| | | pakinItem.setAnfme(warehouseAreasItems.getAnfme()) |
| | | .setPakinId(waitPakin1.getId()) |
| | | .setSource(warehouseAreasItems.getId()) |
| | | .setAsnId(warehouseAreasItems.getAsnId()) |
| | | .setAsnCode(warehouseAreasItems.getAsnCode()) |
| | | .setAsnItemId(warehouseAreasItems.getAsnItemId()) |
| | | .setIsptResult(warehouseAreasItems.getIsptResult()) |
| | | .setPlatItemId(warehouseAreasItems.getPlatItemId()) |
| | | .setPlatOrderCode(warehouseAreasItems.getPlatOrderCode()) |
| | | .setPlatWorkCode(warehouseAreasItems.getPlatWorkCode()) |
| | | .setProjectCode(warehouseAreasItems.getProjectCode()) |
| | | .setBatch(warehouseAreasItems.getSplrBatch()) |
| | | .setUnit(warehouseAreasItems.getStockUnit()) |
| | | .setFieldsIndex(warehouseAreasItems.getFieldsIndex()) |
| | | .setMatnrId(warehouseAreasItems.getMatnrId()) |
| | | .setMaktx(warehouseAreasItems.getMaktx()) |
| | | .setUpdateBy(userId) |
| | | .setCreateBy(userId) |
| | | .setMatnrCode(warehouseAreasItems.getMatnrCode()); |
| | | WkOrder order = asnOrderService.getById(warehouseAreasItems.getAsnId()); |
| | | if (!Objects.isNull(order)) { |
| | | |
| | | // 如果ASN单号为空,从物料信息表获取物料信息,不查询收货区 |
| | | if (StringUtils.isBlank(pakinItem1.getAsnCode())) { |
| | | if (Objects.isNull(pakinItem1.getMatnrId())) { |
| | | throw new CoolException("物料ID不能为空!!"); |
| | | } |
| | | |
| | | // 从物料信息表获取物料信息 |
| | | Matnr matnr = matnrMapper.selectById(pakinItem1.getMatnrId()); |
| | | if (Objects.isNull(matnr)) { |
| | | throw new CoolException("物料信息不存在,物料ID:" + pakinItem1.getMatnrId()); |
| | | } |
| | | |
| | | // 设置组托明细信息(不设置source,因为不在收货区) |
| | | pakinItem.setPakinId(waitPakin1.getId()) |
| | | .setSource(null) // 不在收货区,source设为null |
| | | .setAsnId(null) |
| | | .setAsnCode(null) |
| | | .setAsnItemId(null) |
| | | .setIsptResult(null) |
| | | .setPlatItemId(null) |
| | | .setPlatOrderCode(null) |
| | | .setPlatWorkCode(null) |
| | | .setProjectCode(null) |
| | | .setBatch(null) |
| | | .setUnit(matnr.getStockUnit()) |
| | | .setFieldsIndex(matnr.getFieldsIndex()) |
| | | .setMatnrId(matnr.getId()) |
| | | .setMaktx(matnr.getName()) |
| | | .setUpdateBy(userId) |
| | | .setCreateBy(userId) |
| | | .setMatnrCode(matnr.getCode()); |
| | | |
| | | // 设置组托数量 |
| | | if (pakinItem1.getReceiptQty() == null || pakinItem1.getReceiptQty().compareTo(0.0) <= 0) { |
| | | throw new CoolException("组托数量不能小于等于零!!"); |
| | | } |
| | | pakinItem.setAnfme(QuantityUtils.roundToScale(pakinItem1.getReceiptQty())) |
| | | .setTrackCode(pakinItem1.getTrackCode()); |
| | | } else { |
| | | // 收货区已停用:有ASN单号时从订单明细获取物料信息 |
| | | WkOrderItem orderItem = asnOrderItemService.getById(pakinItem1.getId()); |
| | | if (null == orderItem) { |
| | | throw new CoolException("订单明细不存在!!"); |
| | | } |
| | | WkOrder order = asnOrderService.getById(orderItem.getOrderId()); |
| | | if (null == order) { |
| | | throw new CoolException("订单不存在!!"); |
| | | } |
| | | pakinItem.setAnfme(QuantityUtils.roundToScale(orderItem.getAnfme())) |
| | | .setPakinId(waitPakin1.getId()) |
| | | .setSource(null) // 收货区已停用,不关联收货区 |
| | | .setAsnId(order.getId()) |
| | | .setAsnCode(order.getCode()) |
| | | .setAsnItemId(orderItem.getId()) |
| | | .setIsptResult(orderItem.getIsptResult()) |
| | | .setPlatItemId(orderItem.getPlatItemId()) |
| | | .setPlatOrderCode(orderItem.getPlatOrderCode()) |
| | | .setPlatWorkCode(orderItem.getPlatWorkCode()) |
| | | .setProjectCode(orderItem.getProjectCode()) |
| | | .setBatch(orderItem.getSplrBatch()) |
| | | .setUnit(orderItem.getStockUnit()) |
| | | .setFieldsIndex(orderItem.getFieldsIndex()) |
| | | .setMatnrId(orderItem.getMatnrId()) |
| | | .setMaktx(orderItem.getMaktx()) |
| | | .setUpdateBy(userId) |
| | | .setCreateBy(userId) |
| | | .setMatnrCode(orderItem.getMatnrCode()); |
| | | pakinItem.setType(null == order.getType() ? null : order.getType()) |
| | | .setWkType(null == order.getWkType() ? null : Short.parseShort(order.getWkType())); |
| | | } |
| | | .setWkType(StringUtils.isNotBlank(order.getWkType()) ? Short.parseShort(order.getWkType()) : null); |
| | | |
| | | for (PakinItem waitPakinItem : waitPakin.getItems()) { |
| | | if (waitPakinItem.getId().equals(warehouseAreasItems.getId())) { |
| | | if (waitPakinItem.getReceiptQty() > warehouseAreasItems.getAnfme() || waitPakinItem.getReceiptQty().compareTo(0.0) <= 0) { |
| | | throw new CoolException("组托数量不能大于收货数量且不能小于零!!"); |
| | | for (PakinItem waitPakinItem : waitPakin.getItems()) { |
| | | if (waitPakinItem.getId().equals(orderItem.getId())) { |
| | | if (waitPakinItem.getReceiptQty() == null || waitPakinItem.getReceiptQty().compareTo(0.0) <= 0) { |
| | | throw new CoolException("组托数量不能小于等于零!!"); |
| | | } |
| | | if (QuantityUtils.compare(waitPakinItem.getReceiptQty(), orderItem.getAnfme()) > 0) { |
| | | throw new CoolException("组托数量不能大于计划数量!!"); |
| | | } |
| | | pakinItem.setAnfme(QuantityUtils.roundToScale(waitPakinItem.getReceiptQty())) |
| | | .setTrackCode(waitPakinItem.getTrackCode()); |
| | | } |
| | | pakinItem.setAnfme(waitPakinItem.getReceiptQty()) |
| | | .setTrackCode(waitPakinItem.getTrackCode()); |
| | | } |
| | | } |
| | | |
| | | items.add(pakinItem); |
| | | } |
| | | |
| | |
| | | List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, waitPakin1.getId())); |
| | | Double waitSum = 0.0; |
| | | if (!pakinItems.isEmpty()) { |
| | | waitSum = pakinItems.stream().mapToDouble(WaitPakinItem::getAnfme).sum(); |
| | | waitSum = QuantityUtils.roundToScale(pakinItems.stream().mapToDouble(WaitPakinItem::getAnfme).sum()); |
| | | } |
| | | // Double total = Math.round((sum + waitSum) * 100) / 100.0; |
| | | |
| | | for (WaitPakinItem pakinItem : items) { |
| | | WarehouseAreasItem one = warehouseAreasItemService.getOne(new LambdaQueryWrapper<WarehouseAreasItem>() |
| | | .eq(WarehouseAreasItem::getId, pakinItem.getSource())); |
| | | if (Objects.isNull(one)) { |
| | | throw new CoolException("收货区数据错误!!"); |
| | | } |
| | | Double workQty = Math.round((one.getWorkQty() + pakinItem.getAnfme()) * 1000000) / 1000000.0; |
| | | Double qty = Math.round((workQty + one.getQty()) * 1000000) / 1000000.0; |
| | | one.setWorkQty(workQty); |
| | | if (qty.compareTo(one.getAnfme()) > 0) { |
| | | throw new CoolException("组托数量不能大于收货数量!!"); |
| | | } |
| | | if (!warehouseAreasItemService.saveOrUpdate(one)) { |
| | | throw new CoolException("收货区执行数量修改失败!!"); |
| | | } |
| | | } |
| | | // 收货区已停用,不再更新收货区 |
| | | // for (WaitPakinItem pakinItem : items) { |
| | | // if (Objects.isNull(pakinItem.getSource())) continue; |
| | | // WarehouseAreasItem one = warehouseAreasItemService.getOne(new LambdaQueryWrapper<WarehouseAreasItem>() |
| | | // .eq(WarehouseAreasItem::getId, pakinItem.getSource())); |
| | | // if (Objects.isNull(one)) throw new CoolException("收货区数据错误!!"); |
| | | // Double workQty = Math.round((one.getWorkQty() + pakinItem.getAnfme()) * 1000000) / 1000000.0; |
| | | // Double qty = Math.round((workQty + one.getQty()) * 1000000) / 1000000.0; |
| | | // one.setWorkQty(workQty); |
| | | // if (qty.compareTo(one.getAnfme()) > 0) throw new CoolException("组托数量不能大于收货数量!!"); |
| | | // if (!warehouseAreasItemService.saveOrUpdate(one)) throw new CoolException("收货区执行数量修改失败!!"); |
| | | // } |
| | | |
| | | waitPakin1.setAnfme(waitSum); |
| | | if (!this.updateById(waitPakin1)) { |
| | | throw new CoolException("组托数量修改失败!!"); |
| | | } |
| | | return pakin; |
| | | return waitPakin1; |
| | | } |
| | | |
| | | /** |
| | |
| | | // if (!waitPakinItemService.removeByIds(ids)) { |
| | | // throw new CoolException("组托明细解绑失败!!"); |
| | | // } |
| | | List<Long> list2 = pakinItems.stream().map(WaitPakinItem::getSource).collect(Collectors.toList()); |
| | | List<WarehouseAreasItem> warehouseAreasItems = warehouseAreasItemService.listByIds(list2); |
| | | // 收货区已停用:仅保留非空 source 用于兼容旧数据,不再更新收货区 |
| | | List<Long> list2 = pakinItems.stream().map(WaitPakinItem::getSource).filter(Objects::nonNull).collect(Collectors.toList()); |
| | | List<WarehouseAreasItem> warehouseAreasItems = list2.isEmpty() ? Collections.emptyList() : warehouseAreasItemService.listByIds(list2); |
| | | for (int i1 = 0; i1 < pakinItems.size(); i1++) { |
| | | for (PakinItem item : paramItems) { |
| | | if (item.getId().equals(pakinItems.get(i1).getId())) { |
| | | if (pakinItems.get(i1).getAnfme().compareTo(item.getReceiptQty()) > 0) { |
| | | if (item.getReceiptQty().compareTo(0.00) == 0) { |
| | | if (QuantityUtils.compare(pakinItems.get(i1).getAnfme(), item.getReceiptQty()) > 0) { |
| | | if (QuantityUtils.compare(item.getReceiptQty(), 0.00) == 0) { |
| | | throw new CoolException("解绑数量不能为零!!"); |
| | | } |
| | | Double reslt = Math.round((pakinItems.get(i1).getAnfme() - pakinItems.get(i1).getWorkQty() - pakinItems.get(i1).getQty()) * 1000000) / 1000000.0; |
| | | if (item.getReceiptQty().compareTo(reslt) > 0) { |
| | | Double reslt = QuantityUtils.subtract(QuantityUtils.subtract(pakinItems.get(i1).getAnfme(), pakinItems.get(i1).getWorkQty()), pakinItems.get(i1).getQty()); |
| | | if (QuantityUtils.compare(item.getReceiptQty(), reslt) > 0) { |
| | | throw new CoolException("解绑数量不能大于剩余可执行数!!"); |
| | | } |
| | | |
| | | Double anfme = Math.round((pakinItems.get(i1).getAnfme() - item.getReceiptQty()) * 1000000) / 1000000.0; |
| | | Double anfme = QuantityUtils.subtract(pakinItems.get(i1).getAnfme(), item.getReceiptQty()); |
| | | pakinItems.get(i1).setAnfme(anfme); |
| | | if (!waitPakinItemService.updateById(pakinItems.get(i1))) { |
| | | throw new CoolException("组托明细数量修改失败!!"); |
| | |
| | | throw new CoolException("组托明细删除失败!!"); |
| | | } |
| | | } |
| | | for (int i = 0; i < warehouseAreasItems.size(); i++) { |
| | | if (warehouseAreasItems.get(i).getId().equals(pakinItems.get(i1).getSource())) { |
| | | double v = Math.round((warehouseAreasItems.get(i).getWorkQty() - item.getReceiptQty()) * 1000000) / 1000000.0; |
| | | warehouseAreasItems.get(i).setWorkQty(v); |
| | | if (!warehouseAreasItemService.updateById(warehouseAreasItems.get(i))) { |
| | | throw new CoolException("收货区数量修改失败!!"); |
| | | } |
| | | } |
| | | } |
| | | // 收货区已停用,不再回写收货区 |
| | | // for (int i = 0; i < warehouseAreasItems.size(); i++) { |
| | | // if (warehouseAreasItems.get(i).getId().equals(pakinItems.get(i1).getSource())) { |
| | | // double v = Math.round((warehouseAreasItems.get(i).getWorkQty() - item.getReceiptQty()) * 1000000) / 1000000.0; |
| | | // warehouseAreasItems.get(i).setWorkQty(v); |
| | | // if (!warehouseAreasItemService.updateById(warehouseAreasItems.get(i))) { |
| | | // throw new CoolException("收货区数量修改失败!!"); |
| | | // } |
| | | // } |
| | | // } |
| | | } |
| | | } |
| | | } |
| | | |
| | | double anfmes = paramItems.stream().mapToDouble(PakinItem::getReceiptQty).sum(); |
| | | Double anfmes = QuantityUtils.roundToScale(paramItems.stream().mapToDouble(PakinItem::getReceiptQty).sum()); |
| | | // double anfmes = warehouseAreasItems.stream().mapToDouble(WarehouseAreasItem::getAnfme).sum(); |
| | | if (waitPakins.getAnfme().compareTo(anfmes) <= 0) { |
| | | if (QuantityUtils.compare(waitPakins.getAnfme(), anfmes) <= 0) { |
| | | if (!waitPakinService.removeById(waitPakins.getId())) { |
| | | throw new CoolException("组托删除失败!!"); |
| | | } |
| | | } else { |
| | | Double anfme = Math.round((waitPakins.getAnfme() - anfmes) * 1000000) / 1000000.0; |
| | | waitPakins.setAnfme(anfme); |
| | | waitPakins.setAnfme(QuantityUtils.subtract(waitPakins.getAnfme(), anfmes)); |
| | | if (!waitPakinService.updateById(waitPakins)) { |
| | | throw new CoolException("组托数据修改失败!!"); |
| | | } |
| | |
| | | return R.error("组拖档有明细任务"); |
| | | } |
| | | |
| | | Set<Long> sourceIds = pakinItems.stream().map(WaitPakinItem::getSource).collect(Collectors.toSet()); |
| | | Set<Long> sourceIds = pakinItems.stream().map(WaitPakinItem::getSource).filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | |
| | | List<WarehouseAreasItem> areasItems = warehouseAreasItemService.list(new LambdaQueryWrapper<WarehouseAreasItem>() |
| | | .in(WarehouseAreasItem::getId, sourceIds)); |
| | | List<WarehouseAreasItem> areasItems = sourceIds.isEmpty() ? Collections.emptyList() : warehouseAreasItemService.list(new LambdaQueryWrapper<WarehouseAreasItem>().in(WarehouseAreasItem::getId, sourceIds)); |
| | | |
| | | if (areasItems.isEmpty()) { |
| | | return R.error("收货区数据不存在!!"); |
| | | } |
| | | |
| | | Map<Long, List<WaitPakinItem>> listMap = pakinItems.stream().collect(Collectors.groupingBy(WaitPakinItem::getSource)); |
| | | for (WarehouseAreasItem item : areasItems) { |
| | | List<WaitPakinItem> pakin = listMap.get(item.getId()); |
| | | if (Objects.isNull(pakin)) { |
| | | continue; |
| | | } |
| | | double sum = pakin.stream().mapToDouble(WaitPakinItem::getAnfme).sum(); |
| | | Double workQty = Math.round((item.getWorkQty() - sum) * 1000000) / 1000000.0; |
| | | item.setWorkQty(workQty); |
| | | if (!warehouseAreasItemService.updateById(item)) { |
| | | throw new CoolException("收货区数据回滚失败!!"); |
| | | // 收货区已停用,仅兼容旧数据时回滚收货区数量 |
| | | if (!areasItems.isEmpty()) { |
| | | Map<Long, List<WaitPakinItem>> listMap = pakinItems.stream().collect(Collectors.groupingBy(WaitPakinItem::getSource)); |
| | | for (WarehouseAreasItem item : areasItems) { |
| | | List<WaitPakinItem> pakin = listMap.get(item.getId()); |
| | | if (Objects.isNull(pakin)) { |
| | | continue; |
| | | } |
| | | Double sum = QuantityUtils.roundToScale(pakin.stream().mapToDouble(WaitPakinItem::getAnfme).sum()); |
| | | item.setWorkQty(QuantityUtils.subtract(item.getWorkQty(), sum)); |
| | | if (!warehouseAreasItemService.updateById(item)) { |
| | | throw new CoolException("收货区数据回滚失败!!"); |
| | | } |
| | | } |
| | | } |
| | | |