Compare commits

...

3 Commits

Author SHA1 Message Date
曹鹏飞 78ed6670e2 feat(exception): 添加数据警告异常处理机制
- 新增 DataAlertException 类用于处理数据警告情况
- 在全局控制器增强中添加 DataAlertException 的异常处理器
- 将多个控制器中的直接返回错误改为抛出 DataAlertException 异常
- 统一处理库存不足等数据警告场景的异常响应格式
2026-03-23 22:01:35 +08:00
曹鹏飞 110b189be3 Merge remote-tracking branch '惠信/develop' into develop 2026-03-23 21:18:23 +08:00
曹鹏飞 5ae75d46c0 fix(inventory): 解决库存不足时的错误处理和查询逻辑
- 在OutAssistanceController中添加库存不足验证和错误提示
- 在OutCostCenterController中添加库存不足验证和错误提示
- 在OutProduceController中添加库存不足验证和错误提示
- 在TransferCompanyController中添加库存不足验证和错误提示
- 在TransferFactoryController中添加库存不足验证和错误提示
- 在WmsReturnRequestServiceImpl中添加库存不足验证和错误提示
- 修复WmsWarehouseMapper.xml中的仓库名称查询SQL逻辑
- 统一库存锁定列表的获取和验证流程
2026-03-23 21:17:50 +08:00
10 changed files with 65 additions and 18 deletions

View File

@ -16,6 +16,7 @@ import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil; import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.constant.STATE; 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.exception.NflgException;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
@ -344,7 +345,9 @@ public class OutAssistanceController extends BaseController {
// 等待5秒获取锁10秒后自动释放 // 等待5秒获取锁10秒后自动释放
if (lock.tryLock(5, 10, TimeUnit.SECONDS)) { if (lock.tryLock(5, 10, TimeUnit.SECONDS)) {
if (inventoryService.getNumOne(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo()).compareTo(lockNum) < 0) { if (inventoryService.getNumOne(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo()).compareTo(lockNum) < 0) {
lockVOS.addAll(inventoryService.getLockList(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo())); List<InventoryLockVO> itemLocks = inventoryService.getLockList(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + info.getMaterialNo());
lockVOS.addAll(itemLocks);
} }
} else { } else {
throw new NflgException(STATE.BusinessError, "获取锁失败"); throw new NflgException(STATE.BusinessError, "获取锁失败");
@ -359,7 +362,7 @@ public class OutAssistanceController extends BaseController {
} }
}); });
if (CollectionUtil.isNotEmpty(lockVOS)) { if (CollectionUtil.isNotEmpty(lockVOS)) {
return ApiResult.errorWithExtras(STATE.OutOfStock, lockVOS); throw new DataAlertException(STATE.OutOfStock, lockVOS);
} }
outAssistanceItemService.updateBatchById(datas); outAssistanceItemService.updateBatchById(datas);
outAssistanceTicketItemService.saveBatch(ticketItems); outAssistanceTicketItemService.saveBatch(ticketItems);

View File

@ -16,6 +16,7 @@ import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil; import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.constant.STATE; 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.exception.NflgException;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
@ -338,7 +339,9 @@ public class OutCostCenterController extends BaseController {
// 等待5秒获取锁10秒后自动释放 // 等待5秒获取锁10秒后自动释放
if (lock.tryLock(5, 10, TimeUnit.SECONDS)) { if (lock.tryLock(5, 10, TimeUnit.SECONDS)) {
if (inventoryService.getNumOne(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo()).compareTo(lockNum) < 0) { if (inventoryService.getNumOne(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo()).compareTo(lockNum) < 0) {
lockVOS.addAll(inventoryService.getLockList(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo())); List<InventoryLockVO> itemLocks = inventoryService.getLockList(info.getFactoryNo(), info.getWarehouseNo(), info.getMaterialNo());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + info.getMaterialNo());
lockVOS.addAll(itemLocks);
} }
} else { } else {
throw new NflgException(STATE.BusinessError, "获取锁失败"); throw new NflgException(STATE.BusinessError, "获取锁失败");
@ -353,7 +356,7 @@ public class OutCostCenterController extends BaseController {
} }
}); });
if (CollectionUtil.isNotEmpty(lockVOS)) { if (CollectionUtil.isNotEmpty(lockVOS)) {
return ApiResult.errorWithExtras(STATE.OutOfStock, lockVOS); throw new DataAlertException(STATE.OutOfStock, lockVOS);
} }
outCostcenterItemService.updateBatchById(datas); outCostcenterItemService.updateBatchById(datas);
outCostcenterTicketItemService.saveBatch(ticketItems); outCostcenterTicketItemService.saveBatch(ticketItems);

View File

@ -15,6 +15,7 @@ import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil; import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.constant.STATE; 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.exception.NflgException;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
@ -167,7 +168,9 @@ public class OutProduceController extends BaseController {
if (inventoryService.getNumOne(item.getDwerk(), item.getLgort2(), item.getMatnr()) if (inventoryService.getNumOne(item.getDwerk(), item.getLgort2(), item.getMatnr())
.compareTo(item.getSqsl()) < 0 .compareTo(item.getSqsl()) < 0
) { ) {
lockVOS.addAll(inventoryService.getLockList(item.getDwerk(), item.getLgort2(), item.getMatnr())); List<InventoryLockVO> itemLocks = inventoryService.getLockList(item.getDwerk(), item.getLgort2(), item.getMatnr());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + item.getMatnr());
lockVOS.addAll(itemLocks);
} else { } else {
WmsOutProduceItem data = Convert.convert(WmsOutProduceItem.class, item); WmsOutProduceItem data = Convert.convert(WmsOutProduceItem.class, item);
data.setLockNum(item.getSqsl()); data.setLockNum(item.getSqsl());
@ -190,7 +193,7 @@ public class OutProduceController extends BaseController {
if (CollectionUtil.isEmpty(lockVOS)) { if (CollectionUtil.isEmpty(lockVOS)) {
return ApiResult.success(); return ApiResult.success();
} else { } else {
return ApiResult.errorWithExtras(STATE.OutOfStock, lockVOS); throw new DataAlertException(STATE.OutOfStock, lockVOS);
} }
} }
@ -226,7 +229,9 @@ public class OutProduceController extends BaseController {
if (inventoryService.getNumOne(item.getDwerk(), item.getLgort2(), item.getMatnr()) if (inventoryService.getNumOne(item.getDwerk(), item.getLgort2(), item.getMatnr())
.compareTo(item.getSqsl()) < 0 .compareTo(item.getSqsl()) < 0
) { ) {
lockVOS.addAll(inventoryService.getLockList(item.getDwerk(), item.getLgort2(), item.getMatnr())); List<InventoryLockVO> itemLocks = inventoryService.getLockList(item.getDwerk(), item.getLgort2(), item.getMatnr());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + item.getMatnr());
lockVOS.addAll(itemLocks);
} else { } else {
WmsOutProduceItem data = Convert.convert(WmsOutProduceItem.class, item); WmsOutProduceItem data = Convert.convert(WmsOutProduceItem.class, item);
data.setLockNum(data.getSqsl()); data.setLockNum(data.getSqsl());
@ -250,7 +255,7 @@ public class OutProduceController extends BaseController {
if (CollectionUtil.isEmpty(lockVOS)) { if (CollectionUtil.isEmpty(lockVOS)) {
return ApiResult.success(); return ApiResult.success();
} else { } else {
return ApiResult.errorWithExtras(STATE.OutOfStock, lockVOS); throw new DataAlertException(STATE.OutOfStock, lockVOS);
} }
} }

View File

@ -16,6 +16,7 @@ import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.constant.UserType; import com.nflg.wms.common.constant.UserType;
import com.nflg.wms.common.exception.DataAlertException;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.*; import com.nflg.wms.common.pojo.dto.*;
@ -132,7 +133,7 @@ public class PurchaseReturnController extends BaseController {
if (CollectionUtil.isEmpty(inventoryLockVOS)) { if (CollectionUtil.isEmpty(inventoryLockVOS)) {
return ApiResult.success(); return ApiResult.success();
} else { } else {
return ApiResult.errorWithExtras(STATE.OutOfStock, inventoryLockVOS); throw new DataAlertException(STATE.OutOfStock, inventoryLockVOS);
} }
} }
@ -442,7 +443,7 @@ public class PurchaseReturnController extends BaseController {
if (CollectionUtil.isEmpty(inventoryLockVOS)) { if (CollectionUtil.isEmpty(inventoryLockVOS)) {
return ApiResult.success(); return ApiResult.success();
} else { } else {
return ApiResult.errorWithExtras(STATE.OutOfStock, inventoryLockVOS); throw new DataAlertException(STATE.OutOfStock, inventoryLockVOS);
} }
} }

View File

@ -18,6 +18,7 @@ import com.nflg.wms.admin.service.SapService;
import com.nflg.wms.admin.util.*; import com.nflg.wms.admin.util.*;
import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.constant.STATE; 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.exception.NflgException;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
@ -144,7 +145,9 @@ public class TransferCompanyController extends BaseController {
if (inventoryService.getNumOne(item.getReswk(), item.getLgfsb1(), item.getMatnr()) if (inventoryService.getNumOne(item.getReswk(), item.getLgfsb1(), item.getMatnr())
.compareTo(item.getNum()) < 0 .compareTo(item.getNum()) < 0
) { ) {
lockVOS.addAll(inventoryService.getLockList(item.getReswk(), item.getLgfsb1(), item.getMatnr())); List<InventoryLockVO> itemLocks = inventoryService.getLockList(item.getReswk(), item.getLgfsb1(), item.getMatnr());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + item.getMatnr());
lockVOS.addAll(itemLocks);
} else { } else {
WmsTransferCompanyItem data = Convert.convert(WmsTransferCompanyItem.class, item); WmsTransferCompanyItem data = Convert.convert(WmsTransferCompanyItem.class, item);
data.setOrderId(order.getId()); data.setOrderId(order.getId());
@ -167,7 +170,7 @@ public class TransferCompanyController extends BaseController {
if (CollectionUtil.isEmpty(lockVOS)) { if (CollectionUtil.isEmpty(lockVOS)) {
return ApiResult.success(); return ApiResult.success();
} else { } else {
return ApiResult.errorWithExtras(STATE.OutOfStock, lockVOS); throw new DataAlertException(STATE.OutOfStock, lockVOS);
} }
} }

View File

@ -16,6 +16,7 @@ import com.nflg.wms.admin.util.QRCodeUtil;
import com.nflg.wms.admin.util.ThymeleafUtil; import com.nflg.wms.admin.util.ThymeleafUtil;
import com.nflg.wms.common.constant.BarCodeProcessStage; import com.nflg.wms.common.constant.BarCodeProcessStage;
import com.nflg.wms.common.constant.STATE; 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.exception.NflgException;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
@ -142,7 +143,9 @@ public class TransferFactoryController extends BaseController {
if (inventoryService.getNumOne(item.getWerks(), item.getLgort(), item.getMatnr()) if (inventoryService.getNumOne(item.getWerks(), item.getLgort(), item.getMatnr())
.compareTo(item.getNum()) < 0 .compareTo(item.getNum()) < 0
) { ) {
lockVOS.addAll(inventoryService.getLockList(item.getWerks(), item.getLgort(), item.getMatnr())); List<InventoryLockVO> itemLocks = inventoryService.getLockList(item.getWerks(), item.getLgort(), item.getMatnr());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + item.getMatnr());
lockVOS.addAll(itemLocks);
} else { } else {
WmsTransferFactoryItem data = Convert.convert(WmsTransferFactoryItem.class, item); WmsTransferFactoryItem data = Convert.convert(WmsTransferFactoryItem.class, item);
data.setOrderId(order.getId()); data.setOrderId(order.getId());
@ -165,7 +168,7 @@ public class TransferFactoryController extends BaseController {
if (CollectionUtil.isEmpty(lockVOS)) { if (CollectionUtil.isEmpty(lockVOS)) {
return ApiResult.success(); return ApiResult.success();
} else { } else {
return ApiResult.errorWithExtras(STATE.OutOfStock, lockVOS); throw new DataAlertException(STATE.OutOfStock, lockVOS);
} }
} }

View File

@ -0,0 +1,18 @@
package com.nflg.wms.common.exception;
import com.nflg.wms.common.constant.STATE;
import lombok.Data;
@Data
public class DataAlertException extends RuntimeException {
private final STATE state;
private final Object obj;
public DataAlertException(STATE state, Object obj) {
super(state.getType());
this.state = state;
this.obj = obj;
}
}

View File

@ -17,6 +17,7 @@ import com.nflg.wms.common.pojo.qo.GoodsReceiptSearchQO;
import com.nflg.wms.common.pojo.vo.ApplyReturnRequestVO; import com.nflg.wms.common.pojo.vo.ApplyReturnRequestVO;
import com.nflg.wms.common.pojo.vo.GoodsReceiptVO; import com.nflg.wms.common.pojo.vo.GoodsReceiptVO;
import com.nflg.wms.common.pojo.vo.InventoryLockVO; import com.nflg.wms.common.pojo.vo.InventoryLockVO;
import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.WmsOutProduceItem; import com.nflg.wms.repository.entity.WmsOutProduceItem;
import com.nflg.wms.repository.entity.WmsReturnRequest; import com.nflg.wms.repository.entity.WmsReturnRequest;
import com.nflg.wms.repository.entity.WmsReturnRequestItem; import com.nflg.wms.repository.entity.WmsReturnRequestItem;
@ -71,7 +72,9 @@ public class WmsReturnRequestServiceImpl extends ServiceImpl<WmsReturnRequestMap
if (inventoryService.getNumOne(item.getFactoryCode(), item.getStorageLocation(), item.getMaterialCode()) if (inventoryService.getNumOne(item.getFactoryCode(), item.getStorageLocation(), item.getMaterialCode())
.compareTo(item.getLeft()) < 0 .compareTo(item.getLeft()) < 0
) { ) {
lockVOS.addAll(inventoryService.getLockList(item.getFactoryCode(), item.getStorageLocation(), item.getMaterialCode())); List<InventoryLockVO> itemLocks = inventoryService.getLockList(item.getFactoryCode(), item.getStorageLocation(), item.getMaterialCode());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(itemLocks)).throwMessage("库存不足:" + item.getMaterialCode());
lockVOS.addAll(itemLocks);
} else { } else {
itemService.save(item); itemService.save(item);
} }

View File

@ -86,9 +86,10 @@
</select> </select>
<select id="getWname" resultType="java.lang.String"> <select id="getWname" resultType="java.lang.String">
SELECT name SELECT wh.name
FROM wms_inventory a,dictonary_item b FROM wms_warehouse wh
WHERE a.factory_no=b.id AND a.warehouse_no=#{warehouseNo} AND a.no=#{factoryNo} LEFT JOIN dictionary_item di ON wh.factory_id=di.id
WHERE di.code=#{factoryNo} AND wh.no=#{warehouseNo}
</select> </select>
</mapper> </mapper>

View File

@ -4,6 +4,7 @@ import cn.dev33.satoken.exception.NotLoginException;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.nflg.wms.common.constant.Constant; import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.constant.STATE; 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.exception.NflgException;
import com.nflg.wms.common.exception.SAPException; import com.nflg.wms.common.exception.SAPException;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
@ -81,4 +82,10 @@ public class GlobalRestControllerAdvice {
log.error("SAP错误: ", ex); log.error("SAP错误: ", ex);
return ApiResult.error(ex.getState(), "SAP错误:" + ex.getMessage()); return ApiResult.error(ex.getState(), "SAP错误:" + ex.getMessage());
} }
@ExceptionHandler(DataAlertException.class)
public ApiResult<Void> handleDataAlertException(DataAlertException ex) {
log.error("返回数据的错误: ", ex);
return ApiResult.errorWithExtras(ex.getState(), ex.getObj());
}
} }