From 10a80587f1f42ecfbc4c557cad76285e484d2788 Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Sun, 17 May 2026 21:18:47 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#514:=20[=E5=BA=93=E6=88=BF?= =?UTF-8?q?=E7=AE=A1=E7=90=86-=E8=B0=83=E6=8B=A8=E7=AE=A1=E7=90=86-?= =?UTF-8?q?=E8=B0=83=E6=8B=A8]=20=E8=B0=83=E6=8B=A8=E5=8D=95=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E4=B8=8E=E6=8F=90=E4=BA=A4=E6=A0=A1=E9=AA=8C=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=20-=20=E5=89=8D=E7=AB=AF=E5=A2=9E=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E9=87=8F>0=E5=92=8C=E5=BA=93=E5=AD=98=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=EF=BC=8C=E5=90=8E=E7=AB=AF=E6=89=B9=E9=87=8F=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=A1=A5=E5=85=85@Validated=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:批量调拨页面handleSave仅校验单价未校验数量,submitApproval未校验数据完整性即提交审批;后端批量保存接口缺少@Validated导致DTO层@Min(1)未生效 修复: 1. batchTransfer/index.vue handleSave() 增加调拨数量>0和不超过源库存的前端校验 2. batchTransfer/index.vue handleSubmitApproval() 增加数量>0校验后再提交审批 3. ProductTransferController.java 批量保存接口添加@Validated注解启用DTO校验 Co-Authored-By: Claude Opus 4.7 --- .../controller/ProductTransferController.java | 2 +- .../transferManagent/batchTransfer/index.vue | 42 +++++++++++++++---- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/controller/ProductTransferController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/controller/ProductTransferController.java index e92c8cf84..bbdac4e2f 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/controller/ProductTransferController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inventorymanage/controller/ProductTransferController.java @@ -93,7 +93,7 @@ public class ProductTransferController { * @return 操作结果 */ @PutMapping("/product-transfer-batch") - public R addOrEditBatchTransferReceipt(@RequestBody List productTransferDtoList) { + public R addOrEditBatchTransferReceipt(@Validated @RequestBody List productTransferDtoList) { // 批量保存按钮 Boolean flag = true; return productTransferAppService.addOrEditBatchTransferReceipt(productTransferDtoList, flag); diff --git a/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/batchTransfer/index.vue b/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/batchTransfer/index.vue index b173b2994..b7d6f4349 100755 --- a/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/batchTransfer/index.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/transferManagent/batchTransfer/index.vue @@ -739,15 +739,25 @@ function handleSubmitApproval() { let length = totalIncentoryInfoList.value.length; if (length < 1) { proxy.$modal.msgWarning('请先添加单据'); - } else if (data.isEdit) { - proxy.$modal.msgWarning('单据未保存'); - } else { - submitApproval(receiptHeaderForm.busNo).then((response) => { - proxy.$modal.msgSuccess('提交审批成功'); - tagsViewStore.delView(router.currentRoute.value); - router.replace({ path: 'transferManagentList' }); - }); + return; } + // 校验调拨数量:必须 > 0 + const invalidQtyRow = totalIncentoryInfoList.value.find( + (row) => !row.itemQuantity || row.itemQuantity <= 0 + ); + if (invalidQtyRow) { + proxy.$modal.msgWarning('存在调拨数量为0或无效的明细,请检查后提交'); + return; + } + if (data.isEdit) { + proxy.$modal.msgWarning('单据未保存'); + return; + } + submitApproval(receiptHeaderForm.busNo).then((response) => { + proxy.$modal.msgSuccess('提交审批成功'); + tagsViewStore.delView(router.currentRoute.value); + router.replace({ path: 'transferManagentList' }); + }); } // 切换仓库类型获取药房/药库列表 目的仓库切换 @@ -907,6 +917,22 @@ function remakeBlur(row, index) { editBatchTransfer(index); } function handleSave() { + // 校验调拨数量:必须 > 0 + const invalidQtyRow = totalIncentoryInfoList.value.find( + (row) => !row.itemQuantity || row.itemQuantity <= 0 + ); + if (invalidQtyRow) { + proxy.$modal.msgError('调拨数量必须大于0,请检查!'); + return; + } + // 校验调拨数量不能超过源仓库库存 + const exceedStockRow = totalIncentoryInfoList.value.find( + (row) => row.itemQuantity > row.totalSourceQuantity + ); + if (exceedStockRow) { + proxy.$modal.msgError('调拨数量不可超出源库存数量,请检查!'); + return; + } // 校验单价 const invalidPriceRow = totalIncentoryInfoList.value.find( (row) => !row.price || row.price <= 0