库存分配时如果没有库存抛异常
导入模版没有物料抛异常
This commit is contained in:
+1
-1
@@ -308,7 +308,7 @@ public class StorageLocationDomainService {
|
||||
updateWrapper.in("storage_location_group_id", storageLocationGroupIds);
|
||||
updateWrapper.set("update_by", loginUser.getUserid());
|
||||
updateWrapper.set("update_by_name", loginUser.getUsername());
|
||||
updateWrapper.set("update_by", new Date());
|
||||
updateWrapper.set("update_time", new Date());
|
||||
updateWrapper.setSql("storage_location_count = storage_location_count - 1");
|
||||
storageLocationGroupService.update(updateWrapper);
|
||||
}
|
||||
|
||||
+33
-112
@@ -1202,124 +1202,45 @@ public class StockInOrderApplicationService {
|
||||
}
|
||||
}
|
||||
|
||||
// 根据明细表中的字段查询物料基础信息(优先:料号 > 商品SKU码 > 商品名称)
|
||||
// 注意:查询时必须加上货主ID条件,确保查询到的是该货主绑定的物料
|
||||
// 导入文件中必须填写料号,根据料号获取商品信息,必须是货主下有的才可以匹配
|
||||
// 如果没有填写,提示用户:请在导入文件中填写正确的料号
|
||||
if (StringUtils.isBlank(r.getMaterialCode())) {
|
||||
String errorMsg = String.format("导入失败:请在导入文件中填写正确的料号",
|
||||
r.getMaterialName());
|
||||
log.error(errorMsg);
|
||||
throw new ServiceException(errorMsg);
|
||||
}
|
||||
|
||||
// 根据料号查询物料基础信息,必须是货主下有的才可以匹配
|
||||
Long materialBaseInfoId = null;
|
||||
LoginUser currentLoginUser = SecurityUtils.getLoginUser();
|
||||
Long topOrganizationId = currentLoginUser != null && currentLoginUser.getUserPo() != null
|
||||
? currentLoginUser.getUserPo().getTopOrganizationId() : null;
|
||||
|
||||
// 优先使用料号查询
|
||||
if (StringUtils.isNotBlank(r.getMaterialCode())) {
|
||||
MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO();
|
||||
queryDO.setMaterialCode(r.getMaterialCode());
|
||||
if (topOrganizationId != null) {
|
||||
queryDO.setTopOrganizationId(topOrganizationId);
|
||||
}
|
||||
// 加上货主ID条件,确保查询到的是该货主绑定的物料
|
||||
if (shipperId != null) {
|
||||
queryDO.setShipperId(shipperId);
|
||||
}
|
||||
log.info("尝试通过料号查询物料基础信息,料号: [{}], topOrganizationId: {}, shipperId: {}",
|
||||
r.getMaterialCode(), topOrganizationId, shipperId);
|
||||
List<MaterialBaseInfoPO> materialList = materialBaseInfoService.queryList(queryDO);
|
||||
log.info("料号查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0);
|
||||
if (materialList != null && !materialList.isEmpty()) {
|
||||
materialBaseInfoId = materialList.get(0).getMaterialBaseInfoId();
|
||||
log.info("通过料号查询到物料基础信息,料号: {}, 物料ID: {}, 货主ID: {}",
|
||||
r.getMaterialCode(), materialBaseInfoId, shipperId);
|
||||
} else {
|
||||
// 如果提供了料号但查询不到,直接报错,不允许导入
|
||||
String errorMsg = String.format("导入失败:该货主下不存在该料号(委托编号NO=%s,货主名称=%s,料号=%s)。请确保该料号已在物料管理中创建,且属于该货主",
|
||||
h.getConsignmentNo(), order.getShipperName(), r.getMaterialCode());
|
||||
log.error(errorMsg);
|
||||
throw new ServiceException(errorMsg);
|
||||
}
|
||||
// 使用料号查询,必须加上货主ID条件,确保查询到的是该货主绑定的物料
|
||||
MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO();
|
||||
queryDO.setMaterialCode(r.getMaterialCode());
|
||||
if (topOrganizationId != null) {
|
||||
queryDO.setTopOrganizationId(topOrganizationId);
|
||||
}
|
||||
// 加上货主ID条件,确保查询到的是该货主绑定的物料
|
||||
if (shipperId != null) {
|
||||
queryDO.setShipperId(shipperId);
|
||||
}
|
||||
log.info("尝试通过料号查询物料基础信息,料号: [{}], topOrganizationId: {}, shipperId: {}",
|
||||
r.getMaterialCode(), topOrganizationId, shipperId);
|
||||
List<MaterialBaseInfoPO> materialList = materialBaseInfoService.queryList(queryDO);
|
||||
log.info("料号查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0);
|
||||
if (materialList != null && !materialList.isEmpty()) {
|
||||
materialBaseInfoId = materialList.get(0).getMaterialBaseInfoId();
|
||||
log.info("通过料号查询到物料基础信息,料号: {}, 物料ID: {}, 货主ID: {}",
|
||||
r.getMaterialCode(), materialBaseInfoId, shipperId);
|
||||
} else {
|
||||
log.warn("料号为空,跳过料号查询,将尝试使用SKU码或商品名称查询");
|
||||
}
|
||||
|
||||
// 只有在料号为空的情况下,才使用商品SKU码查询
|
||||
if (materialBaseInfoId == null && StringUtils.isNotBlank(r.getSkuCode())) {
|
||||
MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO();
|
||||
queryDO.setBarCode(r.getSkuCode());
|
||||
if (topOrganizationId != null) {
|
||||
queryDO.setTopOrganizationId(topOrganizationId);
|
||||
}
|
||||
// 加上货主ID条件,确保查询到的是该货主绑定的物料
|
||||
if (shipperId != null) {
|
||||
queryDO.setShipperId(shipperId);
|
||||
}
|
||||
log.info("尝试通过商品SKU码查询物料基础信息,SKU码: [{}], topOrganizationId: {}, shipperId: {}",
|
||||
r.getSkuCode(), topOrganizationId, shipperId);
|
||||
List<MaterialBaseInfoPO> materialList = materialBaseInfoService.queryList(queryDO);
|
||||
log.info("SKU码查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0);
|
||||
if (materialList != null && !materialList.isEmpty()) {
|
||||
materialBaseInfoId = materialList.get(0).getMaterialBaseInfoId();
|
||||
log.info("通过商品SKU码查询到物料基础信息,SKU码: {}, 物料ID: {}, 货主ID: {}",
|
||||
r.getSkuCode(), materialBaseInfoId, shipperId);
|
||||
} else {
|
||||
log.warn("通过SKU码未查询到物料基础信息,SKU码: [{}], 货主ID: [{}]", r.getSkuCode(), shipperId);
|
||||
}
|
||||
} else if (materialBaseInfoId == null) {
|
||||
log.warn("SKU码为空,跳过SKU码查询");
|
||||
}
|
||||
|
||||
// 如果料号和SKU码都查询不到,使用商品名称查询
|
||||
if (materialBaseInfoId == null && StringUtils.isNotBlank(r.getMaterialName())) {
|
||||
MaterialBaseInfoDO queryDO = new MaterialBaseInfoDO();
|
||||
queryDO.setMaterialName(r.getMaterialName());
|
||||
if (topOrganizationId != null) {
|
||||
queryDO.setTopOrganizationId(topOrganizationId);
|
||||
}
|
||||
// 加上货主ID条件,确保查询到的是该货主绑定的物料
|
||||
if (shipperId != null) {
|
||||
queryDO.setShipperId(shipperId);
|
||||
}
|
||||
log.info("尝试通过商品名称查询物料基础信息,商品名称: [{}], topOrganizationId: {}, shipperId: {}",
|
||||
r.getMaterialName(), topOrganizationId, shipperId);
|
||||
List<MaterialBaseInfoPO> materialList = materialBaseInfoService.queryList(queryDO);
|
||||
log.info("商品名称查询结果,查询到 {} 条记录", materialList != null ? materialList.size() : 0);
|
||||
if (materialList != null && !materialList.isEmpty()) {
|
||||
materialBaseInfoId = materialList.get(0).getMaterialBaseInfoId();
|
||||
log.info("通过商品名称查询到物料基础信息,商品名称: {}, 物料ID: {}, 货主ID: {}",
|
||||
r.getMaterialName(), materialBaseInfoId, shipperId);
|
||||
} else {
|
||||
log.warn("通过商品名称未查询到物料基础信息,商品名称: [{}], 货主ID: [{}]", r.getMaterialName(), shipperId);
|
||||
}
|
||||
} else if (materialBaseInfoId == null) {
|
||||
log.warn("商品名称为空,跳过商品名称查询");
|
||||
}
|
||||
|
||||
// 如果都查询不到物料基础信息,阻止导入并抛出异常
|
||||
if (materialBaseInfoId == null) {
|
||||
// 检查是否至少有一个查询条件
|
||||
boolean hasQueryCondition = StringUtils.isNotBlank(r.getMaterialCode())
|
||||
|| StringUtils.isNotBlank(r.getSkuCode())
|
||||
|| StringUtils.isNotBlank(r.getMaterialName());
|
||||
|
||||
// 构建错误信息,说明物料在物料管理中不存在
|
||||
StringBuilder errorMsg = new StringBuilder();
|
||||
errorMsg.append("导入失败:物料在物料管理中不存在(委托编号NO=").append(h.getConsignmentNo());
|
||||
errorMsg.append(",货主名称=").append(order.getShipperName());
|
||||
if (StringUtils.isNotBlank(r.getMaterialCode())) {
|
||||
errorMsg.append(",料号=").append(r.getMaterialCode());
|
||||
}
|
||||
if (StringUtils.isNotBlank(r.getSkuCode())) {
|
||||
errorMsg.append(",SKU码=").append(r.getSkuCode());
|
||||
}
|
||||
if (StringUtils.isNotBlank(r.getMaterialName())) {
|
||||
errorMsg.append(",商品名称=").append(r.getMaterialName());
|
||||
}
|
||||
errorMsg.append(")");
|
||||
|
||||
if (!hasQueryCondition) {
|
||||
errorMsg.append("。明细行缺少物料标识信息(料号、SKU码或商品名称至少需要填写一个)");
|
||||
} else {
|
||||
errorMsg.append("。请确保该物料已在物料管理中创建,且料号、SKU码或商品名称与货主信息匹配");
|
||||
}
|
||||
log.error(errorMsg.toString());
|
||||
throw new ServiceException(errorMsg.toString());
|
||||
// 如果提供了料号但查询不到(或不属于该货主),直接报错,不允许导入
|
||||
String errorMsg = String.format("导入失败:该货主下不存在该料号(货主名称=%s,料号=%s)。请确保该料号已在物料管理中创建,且属于该货主",
|
||||
order.getShipperName(), r.getMaterialCode());
|
||||
log.error(errorMsg);
|
||||
throw new ServiceException(errorMsg);
|
||||
}
|
||||
|
||||
// 数量已在前面检查过,这里直接使用
|
||||
|
||||
+63
-4
@@ -1,9 +1,14 @@
|
||||
package com.mhd.wms.interfaces.facadeApi.materialInventory;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.mhd.common.core.domain.po.UserPo;
|
||||
import com.mhd.common.core.exception.ServiceException;
|
||||
import com.mhd.common.core.utils.StringUtils;
|
||||
import com.mhd.common.core.web.controller.BaseController;
|
||||
import com.mhd.common.core.web.domain.AjaxResult;
|
||||
import com.mhd.common.core.web.page.TableDataInfo;
|
||||
import com.mhd.system.api.UserServiceFeign;
|
||||
import com.mhd.wms.application.service.materialInventory.MaterialInventoryApplicationService;
|
||||
import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryPO;
|
||||
import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryQueryListPO;
|
||||
@@ -13,6 +18,7 @@ import com.mhd.wms.interfaces.assember.materialInventory.MaterialInventoryAssemb
|
||||
import com.mhd.wms.interfaces.dto.materialInventory.MaterialInventoryDTO;
|
||||
import com.mhd.wms.interfaces.dto.materialInventory.MaterialInventoryQueryListDTO;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@@ -27,6 +33,7 @@ import java.util.List;
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/materialInventoryApi")
|
||||
@Slf4j
|
||||
public class MaterialInventoryApi extends BaseController {
|
||||
@Autowired
|
||||
private MaterialInventoryApplicationService materialInventoryApplicationService;
|
||||
@@ -34,6 +41,9 @@ public class MaterialInventoryApi extends BaseController {
|
||||
@Resource
|
||||
private MaterialInventoryAssembler materialInventoryAssembler;
|
||||
|
||||
@Autowired
|
||||
private UserServiceFeign userServiceFeign;
|
||||
|
||||
/**
|
||||
* 分页查询物料库存列表
|
||||
*/
|
||||
@@ -42,9 +52,26 @@ public class MaterialInventoryApi extends BaseController {
|
||||
public TableDataInfo list(MaterialInventoryDTO materialInventoryDTO,
|
||||
@RequestParam(value = "customerName", required = false) String customerName)
|
||||
{
|
||||
// 出库分配前端传的是客户名称 customerName,这里转成货主筛选条件(模糊匹配货主编码 / 名称)
|
||||
if (StringUtils.isNotBlank(customerName) && StringUtils.isBlank(materialInventoryDTO.getShipperInfo())) {
|
||||
materialInventoryDTO.setShipperInfo(customerName);
|
||||
// 出库分配前端传的是客户名称 customerName,这里通过名称查询货主ID,使用精确匹配(不模糊匹配)
|
||||
String shipperName = null; // 保存查询到的货主名称
|
||||
if (StringUtils.isNotBlank(customerName) && materialInventoryDTO.getShipperId() == null) {
|
||||
try {
|
||||
AjaxResult ajaxResult = userServiceFeign.getInfoByName(customerName);
|
||||
if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) {
|
||||
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
|
||||
if (userPo != null && userPo.getUserId() != null) {
|
||||
materialInventoryDTO.setShipperId(userPo.getUserId());
|
||||
// 获取货主名称:优先使用企业名称,如果没有则使用用户名称
|
||||
shipperName = StringUtils.isNotBlank(userPo.getShipperEnterpriseName())
|
||||
? userPo.getShipperEnterpriseName()
|
||||
: userPo.getUserName();
|
||||
log.info("根据客户名称查询到货主信息,客户名称:{},货主ID:{},货主名称:{}",
|
||||
customerName, userPo.getUserId(), shipperName);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("根据客户名称查询货主ID失败,客户名称:{},错误:{}", customerName, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
//转换实体
|
||||
@@ -52,7 +79,39 @@ public class MaterialInventoryApi extends BaseController {
|
||||
startPage();
|
||||
// 使用带批次属性的查询方法,批次属性值从库存表中获取
|
||||
List<MaterialInventoryPO> list = materialInventoryApplicationService.queryListWithBatchAttributes(materialInventoryDO);
|
||||
return getDataTable(list);
|
||||
TableDataInfo tableDataInfo = getDataTable(list);
|
||||
// 如果查询结果为空,抛出异常提示用户该物料在库存中不存在
|
||||
if (tableDataInfo.getTotal() == 0) {
|
||||
StringBuilder errorMsg = new StringBuilder("该物料在库存中不存在");
|
||||
// 如果有物料信息,添加到提示中
|
||||
if (StringUtils.isNotBlank(materialInventoryDTO.getMaterialName())) {
|
||||
errorMsg.append(",物料名称:").append(materialInventoryDTO.getMaterialName());
|
||||
} else if (StringUtils.isNotBlank(materialInventoryDTO.getMaterialCode())) {
|
||||
errorMsg.append(",物料编码:").append(materialInventoryDTO.getMaterialCode());
|
||||
} else if (StringUtils.isNotBlank(materialInventoryDTO.getBarCode())) {
|
||||
errorMsg.append(",物料条码:").append(materialInventoryDTO.getBarCode());
|
||||
}
|
||||
// 如果有货主信息,添加到提示中(优先显示查询到的货主名称,否则显示客户名称)
|
||||
if (StringUtils.isNotBlank(shipperName)) {
|
||||
errorMsg.append(",货主:").append(shipperName);
|
||||
} else if (StringUtils.isNotBlank(customerName)) {
|
||||
errorMsg.append(",货主:").append(customerName);
|
||||
}
|
||||
// 如果有批次参考号,添加到提示中
|
||||
if (StringUtils.isNotBlank(materialInventoryDTO.getBatchRefNo())) {
|
||||
errorMsg.append(",Batch Ref NO's:").append(materialInventoryDTO.getBatchRefNo());
|
||||
}
|
||||
// 如果有单据参考号,添加到提示中
|
||||
if (StringUtils.isNotBlank(materialInventoryDTO.getSheetRefNo())) {
|
||||
errorMsg.append(",Sheet Ref NO's:").append(materialInventoryDTO.getSheetRefNo());
|
||||
}
|
||||
// 如果有箱号/卡板号,添加到提示中
|
||||
if (StringUtils.isNotBlank(materialInventoryDTO.getBoxPalletNo())) {
|
||||
errorMsg.append(",箱号/卡板号:").append(materialInventoryDTO.getBoxPalletNo());
|
||||
}
|
||||
throw new ServiceException(errorMsg.toString());
|
||||
}
|
||||
return tableDataInfo;
|
||||
}
|
||||
|
||||
@ApiOperation("查询物料库存列表不分页")
|
||||
|
||||
Reference in New Issue
Block a user