fix(oms):入库业务单导入件数未回显计划数量

- 导入模版去掉Qty(cases)列(5列布局),饮用日期列位前移
- 明细计划数量由Qty箱数改为"件数"取值,件数同步落库PIECE_COUNT用于列表回显
- 物料在当前登录组织下不存在时返回明确提示,替代货主列表取值越界导致的500
This commit is contained in:
rcx
2026-08-19 17:59:19 +08:00
parent 83f05dd11d
commit b859aa99d3
3 changed files with 17 additions and 21 deletions
@@ -102,7 +102,7 @@ public class StockInExcelListener extends AnalysisEventListener<Map<String, Obje
/**
* 解析产品明细数据(一行对应一个产品)
* 新模板列顺序:0=产品编号,1=产品名称,2=规格(箱含量),3=件数,4=Qty(cases)(箱数),5=饮用日期
* 新模板列顺序:0=产品编号,1=产品名称,2=规格(箱含量),3=件数,4=饮用日期
*/
private StockInProductDetail parseProductDetail(Map<String, Object> data) {
StockInProductDetail detail = new StockInProductDetail();
@@ -115,10 +115,8 @@ public class StockInExcelListener extends AnalysisEventListener<Map<String, Obje
detail.setBoxCapacity(convertToInteger(getValueSafely(data, 2)));
// 件数(第4列,索引3
detail.setPieceCount(convertToInteger(getValueSafely(data, 3)));
// 箱数/Qty(cases)(第5列,索引4
detail.setBoxCount(convertToInteger(getValueSafely(data, 4)));
// 饮用日期(第6列,索引5
detail.setDrinkDate(convertToDate(getValueSafely(data, 5)));
// 饮用日期(第5列,索引4
detail.setDrinkDate(convertToDate(getValueSafely(data, 4)));
LOGGER.debug("第{}行产品明细解析完成,产品编号:{},产品名称:{}",
currentRowNum, detail.getProductCode(), detail.getProductName());
@@ -399,7 +399,11 @@ public class ReservationStockInOrderImpl extends ServiceImpl<ReservationStockInO
Set<Long> processedShipperIds = new HashSet<>();
for (StockInProductDetail productDetail : productDetailList) {
MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(productDetail.getProductCode(),loginUser.getUserPo().getOrganizationId());
if (materialBaseInfoPO != null && materialBaseInfoPO.getShipperId() != null) {
// 物料在当前登录组织下不存在时给出明确提示,避免后续货主取值越界导致500
if (materialBaseInfoPO == null) {
throw new ServiceException("产品编号[" + productDetail.getProductCode() + "]在当前组织下不存在,请核对产品编号或使用物料所属组织的账号导入");
}
if (materialBaseInfoPO.getShipperId() != null) {
Long shipperId = materialBaseInfoPO.getShipperId();
if (processedShipperIds.add(shipperId)) {
Map<String, Object> shipper = new HashMap<>();
@@ -410,6 +414,9 @@ public class ReservationStockInOrderImpl extends ServiceImpl<ReservationStockInO
}
}
}
if (shipperIds.isEmpty()) {
throw new ServiceException("导入的产品均未配置货主,请先在物料档案中维护货主信息");
}
ReservationStockInOrderDO reservationStockInOrderDO = new ReservationStockInOrderDO();
// 生成业务单号
String orderNumber = reservationStockInOrderDomainService.generateReserveOrderNumber();
@@ -453,12 +460,13 @@ public class ReservationStockInOrderImpl extends ServiceImpl<ReservationStockInO
reservationInMaterialDetailDO.setCreateByName(loginUser.getUserPo().getUserName());
reservationInMaterialDetailDO.setCreateTime(new Date());
MaterialBaseInfoPO materialBaseInfoPO = stockInOrderMapper.getByCode(stockInProductDetail.getProductCode(),loginUser.getUserPo().getOrganizationId());
reservationInMaterialDetailDO.setQuantity(new BigDecimal(stockInProductDetail.getBoxCount()).setScale(2, BigDecimal.ROUND_HALF_UP));
// 计划数量取模版"件数"列,同时件数字段落库用于明细列表回显
reservationInMaterialDetailDO.setQuantity(new BigDecimal(stockInProductDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP));
reservationInMaterialDetailDO.setPieceCount(new BigDecimal(stockInProductDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP));
if (materialBaseInfoPO != null) {
reservationInMaterialDetailDO.setMaterialBaseInfoId(materialBaseInfoPO.getMaterialBaseInfoId());
reservationInMaterialDetailDO.setMaterialName(materialBaseInfoPO.getMaterialName());
reservationInMaterialDetailDO.setMaterialCode(materialBaseInfoPO.getMaterialCode());
// reservationInMaterialDetailDO.setQuantity(new BigDecimal(stockInProductDetail.getPieceCount()).setScale(2, BigDecimal.ROUND_HALF_UP));
BigDecimal unitPrice = materialBaseInfoPO.getUnitPrice();
if (unitPrice != null) {
reservationInMaterialDetailDO.setUnitPrice(unitPrice);
@@ -13,13 +13,11 @@ public class StockInProductDetail {
private String productCode;
// 产品名称(Excel第2列)
private String productName;
// 箱含量(Excel第5列)
// 箱含量(Excel第3列)
private Integer boxCapacity;
// 件数(Excel第6列)
// 件数(Excel第4列)
private Integer pieceCount;
// 箱数Excel第7列:Qty(cases)
private Integer boxCount;
// 饮用日期(Excel第8列)
// 饮用日期Excel第5列
private Date drinkDate;
// Getter和Setter方法
@@ -55,14 +53,6 @@ public class StockInProductDetail {
this.pieceCount = pieceCount;
}
public Integer getBoxCount() {
return boxCount;
}
public void setBoxCount(Integer boxCount) {
this.boxCount = boxCount;
}
public Date getDrinkDate() {
return drinkDate;
}