From a9cbdbed2623d57393d07c92d1a9ede13afdc0d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Thu, 2 Apr 2026 10:23:58 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E8=AE=A2=E5=8D=95=E5=85=A5=E5=BA=93=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E7=BB=84=E4=BB=B6=E5=8C=85=E8=A3=85?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 InProduceOrderController 实现生产订单入库管理功能 - 在 BOM 服务中添加 isQiTao 方法用于判断物料是否为齐套物料 - 重构组件包装控制器中的齐套判断逻辑,统一使用 isQiTao 方法 - 移除 ComponentPackingController 中未使用的 PageUtil 导入 - 为生产订单添加完整的 CRUD 操作和 PDF 导出功能 - 实现 PDA 端生产订单收货和入库流程 - 添加物料扫描记录和库存同步功能 - 优化多个出库控制器中的齐套判断逻辑 - 实现出库单据的批量处理和打印功能 --- .../ComponentPackingController.java | 5 ++--- .../controller/InProduceOrderController.java | 20 ++++++------------- .../controller/OutAssistanceController.java | 2 +- .../controller/OutCostCenterController.java | 2 +- .../controller/OutProduceController.java | 2 +- .../controller/TransferCompanyController.java | 2 +- .../controller/TransferFactoryController.java | 2 +- .../repository/service/IWmsBomService.java | 2 ++ .../service/impl/WmsBomServiceImpl.java | 8 ++++++++ 9 files changed, 23 insertions(+), 22 deletions(-) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentPackingController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentPackingController.java index 65cf4ba9..dc5e789f 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentPackingController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentPackingController.java @@ -16,7 +16,6 @@ import com.nflg.wms.common.pojo.qo.ComponentPackingEditInputQO; import com.nflg.wms.common.pojo.qo.ComponentPackingInputQO; import com.nflg.wms.common.pojo.qo.ComponentPackingQO; import com.nflg.wms.common.pojo.vo.*; -import com.nflg.wms.common.util.PageUtil; import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.WmsComponentPacking; import com.nflg.wms.repository.entity.WmsComponentPackingItem; @@ -195,12 +194,12 @@ public class ComponentPackingController { if (CollectionUtil.isEmpty(tasks)) { return ApiResult.success(Collections.emptyList()); } - Integer type = bomService.getScanType(packing.getMatnr()); // 转换为 VO 对象 List daVos = tasks.stream() .map(item1 -> { ComponentPackingItemPdaVO vo = Convert.convert(ComponentPackingItemPdaVO.class, item1); - vo.setQiTao(type > 0); + vo.setQiTao(bomService.isQiTao(vo.getIdnrk())); + Integer type = bomService.getScanType(vo.getIdnrk()); if (Objects.equals(type, 1)) { vo.setChildren(bomService.getChildrenVO(vo.getIdnrk())); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java index fa0ca52c..fb29282b 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java @@ -118,7 +118,6 @@ public class InProduceOrderController extends BaseController { /** * 从SAP查询生产订单信息 - * * @param no 生产订单号 * @return 订单信息 */ @@ -129,7 +128,6 @@ public class InProduceOrderController extends BaseController { /** * 保存 - * * @param request 请求参数 */ @Transactional @@ -222,7 +220,6 @@ public class InProduceOrderController extends BaseController { /** * 搜索 - * * @param request 搜索参数 * @return 搜索结果 */ @@ -233,7 +230,6 @@ public class InProduceOrderController extends BaseController { /** * 获取订单的物料列表 - * * @param id 订单ID * @return 列表 */ @@ -252,7 +248,6 @@ public class InProduceOrderController extends BaseController { /** * 删除 - * * @param id 订单ID */ @Transactional @@ -269,7 +264,6 @@ public class InProduceOrderController extends BaseController { /** * 导出物料条码pdf(逐个) - * * @param id 订单ID * @param type 1:逐个,2:一页 */ @@ -378,7 +372,6 @@ public class InProduceOrderController extends BaseController { /** * 获取订单信息(PDA使用) - * * @param no 报工单号 */ @GetMapping("getOrderInfo") @@ -398,13 +391,13 @@ public class InProduceOrderController extends BaseController { List children = list.stream() .filter(child -> Objects.equals(child.getParentId(), it.getId())) .toList(); + it.setQiTao(CollectionUtil.isNotEmpty(children)); Integer type = bomService.getScanType(it.getMaterialNo()); - it.setQiTao(type > 0); if (Objects.equals(type, 0)) { it.setMustScan(false); } children.forEach(child -> { - child.setQiTao(it.isQiTao()); + child.setQiTao(false); child.setMustScan(it.isMustScan()); child.setBinNo(binService.getBinNo(child.getMaterialNo(), child.getFactoryNo(), child.getWarehouseNo())); child.setIsDisableLocation(warehouseService.isEnableLocation(child.getFactoryNo(), child.getWarehouseNo())); @@ -418,7 +411,6 @@ public class InProduceOrderController extends BaseController { /** * 收货和入库(PDA使用) - * * @param request 请求参数 */ @Transactional @@ -438,7 +430,7 @@ public class InProduceOrderController extends BaseController { .toList(); Integer type = bomService.getScanType(it.getMaterialNo()); children.forEach(child -> { - child.setQiTao(type > 0); + child.setQiTao(false); if (Objects.equals(type, 0)) { child.setMustScan(false); } @@ -459,9 +451,9 @@ public class InProduceOrderController extends BaseController { List qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery() - .ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState()) - .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes) - .list(); + .ne(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState()) + .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes) + .list(); datas.forEach(it -> { InventoryIn1ItemQO qitem = request.getItems().stream() .filter(item -> Objects.equals(item.getItemId(), it.getId())) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutAssistanceController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutAssistanceController.java index e17fe600..163d3b44 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutAssistanceController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutAssistanceController.java @@ -211,7 +211,7 @@ public class OutAssistanceController extends BaseController { .setMatnr(item.getMatnr1()) .setMeins(item.getMeins()) .setNum(item.getLeft()); - vo.setQiTao(type > 0); + vo.setQiTao(bomService.isQiTao(item.getMatnr1())); if (Objects.equals(type, 1)) { vo.setChildren(bomService.getChildrenVO(item.getMatnr1())); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutCostCenterController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutCostCenterController.java index 2bc329d0..1dea1b9e 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutCostCenterController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutCostCenterController.java @@ -213,7 +213,7 @@ public class OutCostCenterController extends BaseController { .setMatnr(item.getMatnr()) .setNum(item.getLeft()) .setMeins(item.getMeins()); - vo.setQiTao(type > 0); + vo.setQiTao(bomService.isQiTao(item.getMatnr())); if (Objects.equals(type, 1)) { vo.setChildren(bomService.getChildrenVO(item.getMatnr())); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutProduceController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutProduceController.java index c8adecb3..f420eaf0 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutProduceController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutProduceController.java @@ -365,7 +365,7 @@ public class OutProduceController extends BaseController { .setMeins(item.getMeins()) .setNum(item.getSqsl().subtract(item.getNum())); Integer type = bomService.getScanType(item.getMatnr()); - vo.setQiTao(type > 0); + vo.setQiTao(bomService.isQiTao(item.getMatnr())); if (Objects.equals(type, 1)) { vo.setChildren(bomService.getChildrenVO(item.getMatnr())); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferCompanyController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferCompanyController.java index 01df8512..663112ca 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferCompanyController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferCompanyController.java @@ -269,7 +269,7 @@ public class TransferCompanyController extends BaseController { .setMaktx(item.getMaktx()) .setNum(item.getLeft()) .setMeins(item.getMeins()); - vo.setQiTao(type > 0); + vo.setQiTao(bomService.isQiTao(item.getMatnr())); if (Objects.equals(type, 1)) { vo.setChildren(bomService.getChildrenVO(item.getMatnr())); } diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java index b71a8019..05265cc5 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java @@ -268,7 +268,7 @@ public class TransferFactoryController extends BaseController { .setMeins(item.getMeins()) .setBinIn(StrUtil.join("/", storageService.getBinNo(item.getMatnr(), order.getWerks(), order.getUmlgo()))) .setBinOut(StrUtil.join("/", storageService.getBinNo(item.getMatnr(), order.getWerks(), order.getLgort()))); - vo.setQiTao(type > 0); + vo.setQiTao(bomService.isQiTao(item.getMatnr())); if (Objects.equals(type, 1)) { vo.setChildren(bomService.getChildrenVO(item.getMatnr())); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsBomService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsBomService.java index cdad6da6..6c75c349 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsBomService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IWmsBomService.java @@ -35,4 +35,6 @@ public interface IWmsBomService extends IService { // boolean isParent(String materialNo); Integer getScanType(String materialNo); + + boolean isQiTao(String materialNo); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsBomServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsBomServiceImpl.java index a5c6423e..05eb1b8d 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsBomServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/WmsBomServiceImpl.java @@ -188,4 +188,12 @@ public class WmsBomServiceImpl extends ServiceImpl impleme ).orElse(new WmsBom().setScanType(-1)) .getScanType(); } + + @Override + public boolean isQiTao(String materialNo) { + return lambdaQuery() + .eq(WmsBom::getParentId, 0) + .eq(WmsBom::getNo, materialNo) + .exists(); + } } \ No newline at end of file From 2a8d96a14afc2321d65ac3ada4f0a338bc2da6b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Thu, 2 Apr 2026 14:06:45 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=A6=82=E6=9E=9C=E6=98=AF=E9=BD=90=E5=A5=97?= =?UTF-8?q?=E7=89=A9=E6=96=99=EF=BC=8C=E5=AD=90=E9=A1=B9=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E6=94=B9=E4=B8=BA=E6=AF=94=E4=BE=8B=E8=80=8C=E4=B8=8D?= =?UTF-8?q?=E6=98=AF=E6=80=BB=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/InProduceOrderController.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java index fb29282b..613af772 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java @@ -22,9 +22,13 @@ import com.nflg.wms.common.pojo.vo.InProduceOrderItemVO; import com.nflg.wms.common.pojo.vo.InProduceOrderMaterialVO; import com.nflg.wms.common.pojo.vo.InProduceOrderVO; import com.nflg.wms.common.util.DateTimeUtil; +import com.nflg.wms.common.util.NumberUtil; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; -import com.nflg.wms.repository.entity.*; +import com.nflg.wms.repository.entity.WmsBom; +import com.nflg.wms.repository.entity.WmsInProduceOrder; +import com.nflg.wms.repository.entity.WmsInProduceOrderItem; +import com.nflg.wms.repository.entity.WmsQrCodeMaster; import com.nflg.wms.repository.service.*; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; @@ -167,7 +171,7 @@ public class InProduceOrderController extends BaseController { .setId(IdUtil.getSnowflakeNextId()) .setOrderId(order.getId()) .setParentId(parent.getId()) - .setNum(request.getNum().multiply(it.getNum())) + .setNum(it.getNum()) .setMaterialNo(it.getNo()) .setMaterialDesc(it.getDescribe()) .setUnit(request.getMeins()) @@ -187,7 +191,7 @@ public class InProduceOrderController extends BaseController { .setMaterialCode(it.getMaterialNo()) .setMaterialDescription(it.getMaterialDesc()) .setPackagingType((short) 0) - .setQuantity(it.getNum()) + .setQuantity(NumberUtil.multiply(it.getNum(), parent.getNum())) .setUnit(it.getUnit()) .setBatchNo(it.getBatchNo()) .setSerialNo(it.getSernr()) @@ -424,19 +428,21 @@ public class InProduceOrderController extends BaseController { List datas; if (order.getList()) { datas = new ArrayList<>(); - list.stream().filter(it -> Objects.equals(it.getParentId(), 0L)).forEach(it -> { - List children = list.stream() - .filter(child -> Objects.equals(child.getParentId(), it.getId())) - .toList(); - Integer type = bomService.getScanType(it.getMaterialNo()); - children.forEach(child -> { - child.setQiTao(false); - if (Objects.equals(type, 0)) { - child.setMustScan(false); - } - }); - datas.addAll(children); - }); + list.stream().filter(it -> Objects.equals(it.getParentId(), 0L)) + .forEach(it -> { + List children = list.stream() + .filter(child -> Objects.equals(child.getParentId(), it.getId())) + .toList(); + Integer type = bomService.getScanType(it.getMaterialNo()); + children.forEach(child -> { + child.setNum(NumberUtil.multiply(child.getNum(), it.getNum())); + child.setQiTao(false); + if (Objects.equals(type, 0)) { + child.setMustScan(false); + } + }); + datas.addAll(children); + }); } else { datas = list; } From 461775b5dbf8ebabbe7978e225e22d8f3db34249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Thu, 2 Apr 2026 18:33:35 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat(component):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=9B=B6=E9=83=A8=E4=BB=B6=E6=89=93=E5=8C=85=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=92=8C=E5=A4=96=E5=8D=8F=E9=A2=86=E6=96=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现零部件打包管理控制器,支持打包单的增删改查 - 添加零部件订单信息查询和装箱单详情查看功能 - 实现零部件打包信息的保存、更新和删除操作 - 添加装箱单PDF导出功能 - 实现外协领料控制器,支持SAP领料订单数据查询 - 添加外协领料订单的保存、搜索和详情查看功能 - 实现PDA端外协领料功能和物料扫码提交功能 - 添加出库单审核和库存管理功能 - 实现二维码扫描和批次管理功能 --- .../ComponentPackingController.java | 4 +- .../controller/OutAssistanceController.java | 71 +++++++------- .../controller/OutCostCenterController.java | 85 +++++++++-------- .../controller/OutProduceController.java | 14 +-- .../controller/TransferCompanyController.java | 10 +- .../controller/TransferFactoryController.java | 10 +- .../ComponentPackingControllerService.java | 92 ++++++++++++++----- .../entity/WmsComponentPacking.java | 3 +- 8 files changed, 162 insertions(+), 127 deletions(-) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentPackingController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentPackingController.java index dc5e789f..6f305c09 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentPackingController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/ComponentPackingController.java @@ -113,9 +113,7 @@ public class ComponentPackingController { /** * 添加零部件的打包信息 - * - * @param request - * @return + * @return {@link InventoryLockVO} */ @PostMapping("add") public ApiResult savePacking(@Valid @RequestBody ComponentPackingInputQO request) { diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutAssistanceController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutAssistanceController.java index 163d3b44..5c14ecad 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutAssistanceController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutAssistanceController.java @@ -11,7 +11,6 @@ import com.nflg.wms.admin.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.SapService; -import com.nflg.wms.admin.util.NoUtil; import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.QRCodeUtil; import com.nflg.wms.admin.util.ThymeleafUtil; @@ -105,6 +104,7 @@ public class OutAssistanceController extends BaseController { /** * 保存 + * @return {@link InventoryLockVO} */ @Transactional @PostMapping("save") @@ -119,6 +119,7 @@ public class OutAssistanceController extends BaseController { VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(materialNos)) .throwMessage("以下物料的申请数量超出限制:" + StrUtil.join(",", materialNos)); Map> maps = datas.stream().collect(Collectors.groupingBy(SubcontractedOrderDTO::getKey)); + List lockVOS = new ArrayList<>(); maps.forEach((key, items) -> { WmsOutAssistance order = Convert.convert(WmsOutAssistance.class, items.get(0)); order.setNo(serialNumberControllerService.generateSerialNumber(16)); @@ -127,11 +128,35 @@ public class OutAssistanceController extends BaseController { outAssistanceService.save(order); items.forEach(item -> { WmsOutAssistanceItem data = Convert.convert(WmsOutAssistanceItem.class, item); - data.setLeft(data.getNum()); - data.setOrderId(order.getId()); - outAssistanceItemService.save(data); + RLock lock = redissonClient.getLock(StrUtil.format("lock:inventory:{}:{}:{}", order.getWerks(), order.getLgort1(), item.getMatnr1())); + try { + // 等待5秒获取锁,10秒后自动释放 + if (lock.tryLock(5, 10, TimeUnit.SECONDS)) { + if (inventoryService.getNumOne(order.getWerks(), order.getLgort1(), item.getMatnr1()).compareTo(data.getNum()) < 0) { + List itemLocks = inventoryService.getLockList(order.getWerks(), order.getLgort1(), item.getMatnr1()); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + item.getMatnr1()); + lockVOS.addAll(itemLocks); + }else { + data.setLeft(data.getNum()); + data.setOrderId(order.getId()); + outAssistanceItemService.save(data); + } + } else { + throw new NflgException(STATE.BusinessError, "获取锁失败"); + } + } catch (Exception e) { + log.error("保存单据出错", e); + throw new NflgException(STATE.BusinessError, e.getMessage()); + } finally { + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } }); }); + if (CollectionUtil.isNotEmpty(lockVOS)) { + throw new DataAlertException(STATE.OutOfStock, lockVOS); + } return ApiResult.success(); } @@ -230,10 +255,10 @@ public class OutAssistanceController extends BaseController { public ApiResult submit(@Valid @RequestBody OutProduceSubmitQO request) { WmsOutAssistance order = outAssistanceService.lambdaQuery().eq(WmsOutAssistance::getNo, request.getNo()).one(); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); - Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); - matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); - VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) - .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); +// Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); +// matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); +// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) +// .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); WmsOutAssistanceTicket ticket = new WmsOutAssistanceTicket() .setId(IdUtil.getSnowflakeNextId()) .setNo(serialNumberControllerService.generateSerialNumber(17)) @@ -354,36 +379,6 @@ public class OutAssistanceController extends BaseController { }); } }); - List lockVOS = new ArrayList<>(); - records.stream() - .collect(Collectors.groupingBy(OutMaterialScanRecord::getKey10)) - .forEach((key, vs) -> { - OutMaterialScanRecord info = vs.get(0); - BigDecimal lockNum = vs.stream().map(OutMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add); - RLock lock = redissonClient.getLock(StrUtil.format("lock:inventory:{}:{}:{}", info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo())); - try { - // 等待5秒获取锁,10秒后自动释放 - if (lock.tryLock(5, 10, TimeUnit.SECONDS)) { - if (inventoryService.getNumOne(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo()).compareTo(lockNum) < 0) { - List itemLocks = inventoryService.getLockList(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo()); - VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + info.getMaterialNo()); - lockVOS.addAll(itemLocks); - } - } else { - throw new NflgException(STATE.BusinessError, "获取锁失败"); - } - } catch (Exception e) { - log.error("保存生产领料单出错", e); - throw new NflgException(STATE.BusinessError, e.getMessage()); - } finally { - if (lock.isHeldByCurrentThread()) { - lock.unlock(); - } - } - }); - if (CollectionUtil.isNotEmpty(lockVOS)) { - throw new DataAlertException(STATE.OutOfStock, lockVOS); - } outAssistanceItemService.updateBatchById(datas); outAssistanceTicketItemService.saveBatch(ticketItems); outAssistanceTicketService.save(ticket); diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutCostCenterController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutCostCenterController.java index 1dea1b9e..c49afff4 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutCostCenterController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutCostCenterController.java @@ -11,7 +11,6 @@ import com.nflg.wms.admin.repository.InventoryForOutRepository; import com.nflg.wms.admin.repository.OutMaterialScanRecordRespository; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.SapService; -import com.nflg.wms.admin.util.NoUtil; import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.QRCodeUtil; import com.nflg.wms.admin.util.ThymeleafUtil; @@ -108,6 +107,7 @@ public class OutCostCenterController extends BaseController { /** * 保存 + * @return {@link InventoryLockVO} */ @Transactional @PostMapping("save") @@ -121,6 +121,7 @@ public class OutCostCenterController extends BaseController { }); VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(materialNos)) .throwMessage("以下物料的申请数量超出限制:" + StrUtil.join(",", materialNos)); + List lockVOS = new ArrayList<>(); Map> maps = datas.stream().collect(Collectors.groupingBy(DepartmentMaterialRequisitionDTO::getKey1)); maps.forEach((key, items) -> { WmsOutCostcenter order = Convert.convert(WmsOutCostcenter.class, items.get(0)); @@ -130,11 +131,35 @@ public class OutCostCenterController extends BaseController { outCostcenterService.save(order); items.forEach(item -> { WmsOutCostcenterItem data = Convert.convert(WmsOutCostcenterItem.class, item); - data.setLeft(data.getNum()); - data.setOrderId(order.getId()); - outCostcenterItemService.save(data); + RLock lock = redissonClient.getLock(StrUtil.format("lock:inventory:{}:{}:{}", order.getWerks(), data.getLgort(), data.getMatnr())); + try { + // 等待5秒获取锁,10秒后自动释放 + if (lock.tryLock(5, 10, TimeUnit.SECONDS)) { + if (inventoryService.getNumOne(order.getWerks(), data.getLgort(), data.getMatnr()).compareTo(data.getNum()) < 0) { + List itemLocks = inventoryService.getLockList(order.getWerks(), data.getLgort(), data.getMatnr()); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + data.getMatnr()); + lockVOS.addAll(itemLocks); + } else { + data.setLeft(data.getNum()); + data.setOrderId(order.getId()); + outCostcenterItemService.save(data); + } + } else { + throw new NflgException(STATE.BusinessError, "获取锁失败"); + } + } catch (Exception e) { + log.error("保存单据出错", e); + throw new NflgException(STATE.BusinessError, e.getMessage()); + } finally { + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } }); }); + if (CollectionUtil.isNotEmpty(lockVOS)) { + throw new DataAlertException(STATE.OutOfStock, lockVOS); + } return ApiResult.success(); } @@ -232,10 +257,10 @@ public class OutCostCenterController extends BaseController { public ApiResult submit(@Valid @RequestBody OutProduceSubmitQO request) { WmsOutCostcenter order = outCostcenterService.lambdaQuery().eq(WmsOutCostcenter::getNo, request.getNo()).one(); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); - Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); - matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); - VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) - .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); +// Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); +// matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); +// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) +// .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); WmsOutCostcenterTicket ticket = new WmsOutCostcenterTicket() .setId(IdUtil.getSnowflakeNextId()) .setNo(serialNumberControllerService.generateSerialNumber(15)) @@ -253,7 +278,9 @@ public class OutCostCenterController extends BaseController { .flatMap(Collection::stream) .map(QRCodeQO::getContent) .collect(Collectors.toSet()); - List qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) ? Collections.emptyList() : qrCodeMasterService.lambdaQuery() + List qrCodeMasters = CollectionUtil.isEmpty(allQrCodes) + ? Collections.emptyList() : + qrCodeMasterService.lambdaQuery() .eq(WmsQrCodeMaster::getProcessStage, BarCodeProcessStage.InBound.getState()) .in(WmsQrCodeMaster::getBarcodeCode, allQrCodes) .list(); @@ -348,36 +375,6 @@ public class OutCostCenterController extends BaseController { }); } }); - List lockVOS = new ArrayList<>(); - records.stream() - .collect(Collectors.groupingBy(OutMaterialScanRecord::getKey10)) - .forEach((key, vs) -> { - OutMaterialScanRecord info = vs.get(0); - BigDecimal lockNum = vs.stream().map(OutMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add); - RLock lock = redissonClient.getLock(StrUtil.format("lock:inventory:{}:{}:{}", info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo())); - try { - // 等待5秒获取锁,10秒后自动释放 - if (lock.tryLock(5, 10, TimeUnit.SECONDS)) { - if (inventoryService.getNumOne(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo()).compareTo(lockNum) < 0) { - List itemLocks = inventoryService.getLockList(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo()); - VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + info.getMaterialNo()); - lockVOS.addAll(itemLocks); - } - } else { - throw new NflgException(STATE.BusinessError, "获取锁失败"); - } - } catch (Exception e) { - log.error("保存生产领料单出错", e); - throw new NflgException(STATE.BusinessError, e.getMessage()); - } finally { - if (lock.isHeldByCurrentThread()) { - lock.unlock(); - } - } - }); - if (CollectionUtil.isNotEmpty(lockVOS)) { - throw new DataAlertException(STATE.OutOfStock, lockVOS); - } outCostcenterItemService.updateBatchById(datas); outCostcenterTicketItemService.saveBatch(ticketItems); outCostcenterTicketService.save(ticket); @@ -433,17 +430,17 @@ public class OutCostCenterController extends BaseController { .setFactoryNo(list.get(0).getFactoryNo()) .setWarehouseNo(list.get(0).getWarehouseNo()) .setBinLocation(list.get(0).isQiTao() ? list.get(0).getBinNo() : qrCodeMasters.stream() - .filter(qr -> StrUtil.equals(qr.getBarcodeCode(), list.get(0).getUniqNo())) - .findFirst() - .map(WmsQrCodeMaster::getBinLocation) - .orElse("") + .filter(qr -> StrUtil.equals(qr.getBarcodeCode(), list.get(0).getUniqNo())) + .findFirst() + .map(WmsQrCodeMaster::getBinLocation) + .orElse("") ) .setNum(list.stream().map(OutMaterialScanRecord::getNum).reduce(BigDecimal.ZERO, BigDecimal::add)) ).toList() ); Map> dmaps = records.stream().collect(Collectors.groupingBy(OutMaterialScanRecord::getKey7)); OptRecordDTO optRecordDTO = new OptRecordDTO(); - optRecordDTO.setOperationType((short)1) + optRecordDTO.setOperationType((short) 1) .setOrderId(order.getNo()); optRecordService.add(optRecordDTO); C_MaterialOutboundDTO vo = sapService.ZWM00_MB115(new C_MaterialOutboundQO() diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutProduceController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutProduceController.java index f420eaf0..a5351678 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutProduceController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/OutProduceController.java @@ -21,7 +21,10 @@ import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.document.OutMaterialScanRecord; -import com.nflg.wms.common.pojo.dto.*; +import com.nflg.wms.common.pojo.dto.InventoryForOutDTO; +import com.nflg.wms.common.pojo.dto.InventoryInDTO; +import com.nflg.wms.common.pojo.dto.InventoryOutDTO; +import com.nflg.wms.common.pojo.dto.OptRecordDTO; import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.common.util.EecExcelUtil; @@ -46,7 +49,6 @@ import java.io.IOException; import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -384,10 +386,10 @@ public class OutProduceController extends BaseController { public ApiResult submit(@Valid @RequestBody OutProduceSubmitQO request) { WmsOutProduce order = outProduceService.lambdaQuery().eq(WmsOutProduce::getNo, request.getNo()).one(); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); - Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); - matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); - VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) - .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); +// Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); +// matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); +// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) +// .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); WmsOutProduceTicket ticket = new WmsOutProduceTicket() .setId(IdUtil.getSnowflakeNextId()) .setNo(serialNumberControllerService.generateSerialNumber(21)) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferCompanyController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferCompanyController.java index 663112ca..39beb135 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferCompanyController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferCompanyController.java @@ -162,7 +162,7 @@ public class TransferCompanyController extends BaseController { throw new NflgException(STATE.BusinessError, "获取锁失败"); } } catch (Exception e) { - log.error("保存生产领料单出错", e); + log.error("保存出错", e); throw new NflgException(STATE.BusinessError, e.getMessage()); } finally { if (lock.isHeldByCurrentThread()) { @@ -288,10 +288,10 @@ public class TransferCompanyController extends BaseController { public ApiResult submitForOut(@Valid @RequestBody OutProduceSubmitQO request) { WmsTransferCompany order = transferCompanyService.lambdaQuery().eq(WmsTransferCompany::getNo, request.getNo()).one(); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("转储单不存在"); - Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); - matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); - VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) - .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); +// Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); +// matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); +// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) +// .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); List datas = transferCompanyItemService.getList(order.getId()); List records = new ArrayList<>(); List ticketItems = new ArrayList<>(); diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java index 05265cc5..d3c97925 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/TransferFactoryController.java @@ -160,7 +160,7 @@ public class TransferFactoryController extends BaseController { throw new NflgException(STATE.BusinessError, "获取锁失败"); } } catch (Exception e) { - log.error("保存生产领料单出错", e); + log.error("保存出错", e); throw new NflgException(STATE.BusinessError, e.getMessage()); } finally { if (lock.isHeldByCurrentThread()) { @@ -287,10 +287,10 @@ public class TransferFactoryController extends BaseController { public ApiResult submitForOut(@Valid @RequestBody OutProduceSubmitQO request) { WmsTransferFactory order = transferFactoryService.lambdaQuery().eq(WmsTransferFactory::getNo, request.getNo()).one(); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("调拨单不存在"); - Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); - matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); - VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) - .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); +// Set matnrs = request.getItems().stream().map(OutProduceSubmitItemQO::getMaterialNo).collect(Collectors.toSet()); +// matnrs.removeAll(request.getRecommendBatch().stream().map(InventoryForOutVO::getMaterialNo).collect(Collectors.toSet())); +// VUtil.trueThrowBusinessError(CollectionUtil.isNotEmpty(matnrs)) +// .throwMessage("以下物料无库存,不能出库:" + StrUtil.join(",", matnrs)); List datas = transferFactoryItemService.getList(order.getId()); List records = new ArrayList<>(); WmsTransferFactoryTicket ticket = new WmsTransferFactoryTicket() diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ComponentPackingControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ComponentPackingControllerService.java index 909ef495..2158b1ef 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ComponentPackingControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/ComponentPackingControllerService.java @@ -2,27 +2,38 @@ package com.nflg.wms.admin.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.nflg.wms.common.constant.STATE; +import com.nflg.wms.common.exception.DataAlertException; +import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.qo.ComponentPackingEditInputQO; import com.nflg.wms.common.pojo.qo.ComponentPackingInputQO; import com.nflg.wms.common.pojo.qo.ComponentPackingItemEditInputQO; +import com.nflg.wms.common.pojo.vo.InventoryLockVO; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.WmsComponentPacking; import com.nflg.wms.repository.entity.WmsComponentPackingItem; import com.nflg.wms.repository.service.IWmsComponentPackingItemService; import com.nflg.wms.repository.service.IWmsComponentPackingService; +import com.nflg.wms.repository.service.IWmsInventoryService; import jakarta.annotation.Resource; import jakarta.validation.Valid; -import org.springframework.cloud.commons.util.IdUtils; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.TimeUnit; +@Slf4j @Component public class ComponentPackingControllerService { @Resource @@ -34,6 +45,12 @@ public class ComponentPackingControllerService { @Resource private BasdeSerialNumberControllerService basdeSerialNumberControllerService; + @Resource + private RedissonClient redissonClient; + + @Resource + private IWmsInventoryService inventoryService; + @Transactional public void savePacking(@Valid ComponentPackingInputQO request) { WmsComponentPacking wmsComponentPacking = new WmsComponentPacking(); @@ -65,32 +82,57 @@ public class ComponentPackingControllerService { wmsComponentPacking.setCreateId(UserUtil.getUserId()); wmsComponentPacking.setCreateTime(LocalDateTime.now()); wmsComponentPacking.setFactoryNo(request.getFactoryNo()); - List wmsComponentPackingItems = request.getItems().stream() - .map(item -> new WmsComponentPackingItem() - .setId(IdUtil.getSnowflakeNextId()) - .setItemIndex(item.getIndex()) - .setVbeln(item.getVbeln()) - .setPosnr(item.getPosnr()) - .setIdnrk(item.getIdnrk()) - .setOjtxb(item.getOjtxb()) - .setMeins(item.getMeins()) - .setMenge(item.getMenge()) - .setAtwrt(item.getAtwrt()) - .setZatwrt(item.getZatwrt()) - .setZxiah(item.getZxiah()) - .setZtext(item.getZtext()) - .setPotx2(item.getPotx2()) - .setPmenge(item.getPmenge()) - .setLgpbe(item.getLgpbe()) - .setLgort(item.getLgort()) - .setLgobe(item.getLgobe()) - .setOutQty(new BigDecimal(0)) - .setPackingId(wmsComponentPacking.getId()) - ).toList(); - + List lockVOS = new ArrayList<>(); + request.getItems().forEach(item -> { + RLock lock = redissonClient.getLock(StrUtil.format("lock:inventory:{}:{}:{}", wmsComponentPacking.getFactoryNo(), item.getLgort(), item.getIdnrk())); + try { + // 等待5秒获取锁,10秒后自动释放 + if (lock.tryLock(5, 10, TimeUnit.SECONDS)) { + if (inventoryService.getNumOne(wmsComponentPacking.getFactoryNo(), item.getLgort(), item.getIdnrk()).compareTo(item.getMenge()) < 0) { + List itemLocks = inventoryService.getLockList(wmsComponentPacking.getFactoryNo(), item.getLgort(), item.getIdnrk()); + VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + item.getIdnrk()); + lockVOS.addAll(itemLocks); + } else { + wmsComponentPackingItemService.save( + new WmsComponentPackingItem() + .setId(IdUtil.getSnowflakeNextId()) + .setItemIndex(item.getIndex()) + .setVbeln(item.getVbeln()) + .setPosnr(item.getPosnr()) + .setIdnrk(item.getIdnrk()) + .setOjtxb(item.getOjtxb()) + .setMeins(item.getMeins()) + .setMenge(item.getMenge()) + .setAtwrt(item.getAtwrt()) + .setZatwrt(item.getZatwrt()) + .setZxiah(item.getZxiah()) + .setZtext(item.getZtext()) + .setPotx2(item.getPotx2()) + .setPmenge(item.getPmenge()) + .setLgpbe(item.getLgpbe()) + .setLgort(item.getLgort()) + .setLgobe(item.getLgobe()) + .setOutQty(new BigDecimal(0)) + .setPackingId(wmsComponentPacking.getId()) + ); + } + } else { + throw new NflgException(STATE.BusinessError, "获取锁失败"); + } + } catch (Exception e) { + log.error("保存单据出错", e); + throw new NflgException(STATE.BusinessError, e.getMessage()); + } finally { + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + }); + if (CollectionUtil.isNotEmpty(lockVOS)) { + throw new DataAlertException(STATE.OutOfStock, lockVOS); + } // 直接保存 wmscomponentPackingService.save(wmsComponentPacking); - wmsComponentPackingItemService.saveBatch(wmsComponentPackingItems); } @Transactional diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsComponentPacking.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsComponentPacking.java index 5c6e92be..6a27a4b8 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsComponentPacking.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/WmsComponentPacking.java @@ -3,13 +3,13 @@ package com.nflg.wms.repository.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import jakarta.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import java.io.Serializable; -import java.time.LocalDate; import java.time.LocalDateTime; /** @@ -157,6 +157,7 @@ public class WmsComponentPacking implements Serializable { /** * 所属工厂 */ + @NotBlank private String factoryNo; /**