Merge remote-tracking branch 'origin/dev_WMS20260401' into dev_WMS20260401

This commit is contained in:
zhou-hongcheng
2026-04-16 16:38:42 +08:00
5 changed files with 303 additions and 84 deletions
@@ -139,6 +139,9 @@ public class StockReceiptOrderPO extends StockInOrderBasePO {
@ApiModelProperty("物料明细")
private List<ReceiptMaterialDetailPO> materialDetailList;
@ApiModelProperty("整单是否含抄码物料:1-是(至少一行物料主数据 copyCode=1) 2-否;与明细行 copyCode 同源,来自物料主数据")
private Integer hasCopyCodeMaterial;
@ApiModelProperty("收货作业单号")
private String receiptTaskNumber;
@@ -1123,33 +1123,92 @@ public class StockShelfOrderDomainService {
}
}
/**
* 上架完成、库存入账后写入抄码对照表。数据来自上架明细 {@link ShelfMaterialDetail#getCopyDetails()}
* 与收货明细/PDA 提交的 JSON 一致:key 为序号(字符串),value 为单件净重(千克,支持小数如 1.343)。
*/
private void copyCodeProductComparison(MaterialBaseInfo materialBaseInfo, ShelfMaterialDetail shelfMaterialDetail, MaterialInventoryParamDO materialInventoryId) {
JSONObject jsonObject = JSONObject.parseObject(shelfMaterialDetail.getCopyDetails());
ArrayList<CopyCodeReference> copyCodeReferences = new ArrayList<>();
if (materialBaseInfo == null || shelfMaterialDetail == null || materialInventoryId == null) {
return;
}
if (StringUtils.isBlank(shelfMaterialDetail.getCopyDetails())) {
return;
}
JSONObject jsonObject;
try {
jsonObject = JSONObject.parseObject(shelfMaterialDetail.getCopyDetails().trim());
} catch (Exception e) {
log.warn("抄码 copyDetails 非合法 JSON,跳过写入对照表,materialDetailId={}raw={}",
shelfMaterialDetail.getMaterialDetailId(), shelfMaterialDetail.getCopyDetails(), e);
return;
}
if (jsonObject == null || jsonObject.size() == 0) {
return;
}
List<CopyCodeReference> copyCodeReferences = new ArrayList<>();
for (String key : jsonObject.keySet()) {
if (StringUtils.isBlank(key)) {
continue;
}
BigDecimal lineNetKg = parseCopyDetailNetWeightKg(jsonObject.get(key));
if (lineNetKg == null) {
continue;
}
int serial;
try {
serial = Integer.parseInt(key.trim());
} catch (NumberFormatException e) {
log.warn("抄码 copyDetails 序号非数字,已跳过 key={}", key);
continue;
}
CopyCodeReference copyCodeReference = new CopyCodeReference();
BeanUtils.copyProperties(materialBaseInfo, copyCodeReference);
BeanUtils.copyProperties(shelfMaterialDetail, copyCodeReference, IgnoreNullUtil.getNullPropertyNames(shelfMaterialDetail));
copyCodeReference.setBoxPalletNo(shelfMaterialDetail.getPalletNumber());
copyCodeReference.setBatchNumber(shelfMaterialDetail.getCopyBatch());
copyCodeReference.setSerialNumber(Integer.parseInt(key));
Integer value = jsonObject.getInteger(key);
copyCodeReference.setNetWeight(new BigDecimal(value));
copyCodeReference.setSerialNumber(serial);
copyCodeReference.setNetWeight(lineNetKg);
copyCodeReference.setGrossWeight(shelfMaterialDetail.getTotalGrossWeight());
copyCodeReference.setMaterialStatusName("可用");
copyCodeReference.setMaterialStatusCode("1");
copyCodeReference.setMaterialDetailId(shelfMaterialDetail.getMaterialDetailId());
copyCodeReference.setMaterialInventoryId(materialInventoryId.getMaterialInventoryId());
copyCodeReference.setInOrderNumber(materialInventoryId.getInOrderNumber());
copyCodeReference.setInventoryQuantity(new BigDecimal(1));
copyCodeReference.setNetWeight(shelfMaterialDetail.getTotalNetWeight());
copyCodeReference.setGrossWeight(shelfMaterialDetail.getTotalGrossWeight());
copyCodeReference.setInventoryQuantity(BigDecimal.ONE);
copyCodeReference.setShipperName(materialBaseInfo.getShipperName());
copyCodeReference.setShipperId(materialBaseInfo.getShipperId());
copyCodeReferences.add(copyCodeReference);
}
if (CollectionUtils.isEmpty(copyCodeReferences)) {
return;
}
copyCodeReferenceService.saveBatch(copyCodeReferences);
}
/**
* 解析 copyDetails JSON 中单件净重(千克),支持整数与小数。
*/
private static BigDecimal parseCopyDetailNetWeightKg(Object raw) {
if (raw == null) {
return null;
}
try {
if (raw instanceof BigDecimal) {
return (BigDecimal) raw;
}
if (raw instanceof Number) {
return BigDecimal.valueOf(((Number) raw).doubleValue());
}
String s = raw.toString().trim();
if (StringUtils.isBlank(s)) {
return null;
}
return new BigDecimal(s);
} catch (Exception e) {
return null;
}
}
private MaterialInventory getParam(ShelfMaterialDetail shelfMaterialDetail, List<String> fieldNames,Long shipperId,String inOrderNumber){
MaterialInventory param = new MaterialInventory();
param.setShipperId(shipperId);