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

This commit is contained in:
王奎兴
2026-03-31 09:31:37 +08:00
33 changed files with 1352 additions and 138 deletions
@@ -188,4 +188,12 @@ public class InventoryAdjustmentRecord extends BaseVOEntity {
@Excel(name = "调整后面积")
private BigDecimal adjustedArea;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
}
@@ -244,4 +244,12 @@ public class InventoryAdjustmentRecordPO extends BaseVOEntity {
@ApiModelProperty("调整后面积")
@Excel(name = "调整后面积")
private BigDecimal adjustedArea;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String LotNumber;
}
@@ -227,4 +227,13 @@ public class MaterialInventory extends BaseVOEntity {
@ApiModelProperty("条码")
@Excel(name = "条码")
private String barCode;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
}
@@ -269,7 +269,9 @@ public class MaterialInventoryImpl extends ServiceImpl<MaterialInventoryMapper,
+ materialInventoryDO.getBatchRefNo() + "_"
+ materialInventoryDO.getBatchNumber() + "_"
+ materialInventoryDO.getMaterialStatusCode() + "_"
+ materialInventoryDO.getContainerCode();
+ materialInventoryDO.getContainerCode() + "_"
+ materialInventoryDO.getLotNumber() + "_"
+ materialInventoryDO.getInOrderNumber();
// 注意:如果唯一性约束包含批次号、容器ID、物料状态等字段,那么key也应该包含这些字段
// 但是,根据唯一性约束名称IDX_MAT_INV_LOC_MAT_ID,它应该只包含storage_location_id和material_base_info_id
@@ -221,4 +221,12 @@ public class MaterialInventoryPO extends MaterialBasePO {
@ApiModelProperty("条码")
@Excel(name = "条码")
private String barCode;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
}
@@ -236,4 +236,12 @@ public class MaterialInventoryDO extends MaterialBaseDO {
@ApiModelProperty("冻结数量大于0条件")
@Excel(name = "冻结数量大于0条件")
private String greaterThanFreezeQuantity;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
}
@@ -75,6 +75,22 @@ public class ReceiptMaterialDetail extends BaseVOEntity {
@Excel(name = "已收货数量")
private BigDecimal alreadyReceiptQuantity;
@ApiModelProperty("累计已收货毛重(KG),称重实绩")
@TableField("already_receipt_gross_weight")
private BigDecimal alreadyReceiptGrossWeight;
@ApiModelProperty("累计已收货净重(KG),与毛重同口径累加本次净重")
@TableField("already_receipt_net_weight")
private BigDecimal alreadyReceiptNetWeight;
@ApiModelProperty("累计已收货体积(CBM)")
@TableField("already_receipt_volume")
private BigDecimal alreadyReceiptVolume;
@ApiModelProperty("累计已收货面积(SQM)")
@TableField("already_receipt_area")
private BigDecimal alreadyReceiptArea;
@ApiModelProperty("收货数量")
@Excel(name = "收货数量")
private BigDecimal receiptQuantity;
@@ -359,6 +359,7 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
extractBatchAttributesToReceiptDetail(receiptMaterialDetailDOChild);
ReceiptMaterialDetail receiptMaterialDetailChild = new ReceiptMaterialDetail();
BeanUtils.copyProperties(receiptMaterialDetailDOChild, receiptMaterialDetailChild);
alignPersistedReceiptQuantityToCumulative(receiptMaterialDetailDOChild, receiptMaterialDetailChild);
receiptMaterialDetailChild.setCreateBy(loginUser.getUserid());
receiptMaterialDetailChild.setCreateByName(loginUser.getUsername());
receiptMaterialDetailChild.setCreateTime(new Date());
@@ -376,6 +377,7 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
}
ReceiptMaterialDetail receiptMaterialDetail = new ReceiptMaterialDetail();
BeanUtils.copyProperties(receiptMaterialDetailDO, receiptMaterialDetail);
alignPersistedReceiptQuantityToCumulative(receiptMaterialDetailDO, receiptMaterialDetail);
receiptMaterialDetail.setUpdateBy(loginUser.getUserid());
receiptMaterialDetail.setUpdateByName(loginUser.getUsername());
receiptMaterialDetail.setUpdateTime(new Date());
@@ -412,6 +414,20 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
updateInMaterialDetailFromAttributeOption(receiptMaterialDetailDOList);
}
/**
* PDA 上传的 receiptQuantity 为「本次收货量」;落库时与累计已收货 already_receipt_quantity 对齐,
* 否则多次收货会把 receipt_quantity 覆盖成仅最后一次本次量(如先 1000 再 100 却存成 100)。
*/
private static void alignPersistedReceiptQuantityToCumulative(ReceiptMaterialDetailDO detailDO,
ReceiptMaterialDetail entity) {
if (detailDO == null || entity == null) {
return;
}
if (detailDO.getAlreadyReceiptQuantity() != null) {
entity.setReceiptQuantity(detailDO.getAlreadyReceiptQuantity());
}
}
/**
* @description 从materialMoreDetailList中根据attributeOption提取字段值并更新入库单明细
* @author Auto
@@ -80,6 +80,20 @@ public class ReceiptMaterialDetailPO extends BaseVOEntity {
@Excel(name = "已收货数量")
private BigDecimal alreadyReceiptQuantity;
@ApiModelProperty("累计已收货毛重(KG),称重实绩")
@Excel(name = "累计已收货毛重(KG)")
private BigDecimal alreadyReceiptGrossWeight;
@ApiModelProperty("累计已收货净重(KG)")
@Excel(name = "累计已收货净重(KG)")
private BigDecimal alreadyReceiptNetWeight;
@ApiModelProperty("累计已收货体积(CBM)")
private BigDecimal alreadyReceiptVolume;
@ApiModelProperty("累计已收货面积(SQM)")
private BigDecimal alreadyReceiptArea;
@ApiModelProperty("待收货数量")
@Excel(name = "待收货数量")
private BigDecimal pendingReceiptQuantity;
@@ -242,6 +256,26 @@ public class ReceiptMaterialDetailPO extends BaseVOEntity {
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
/** 计划净重:入库单明细 total(联表 b),与收货单行首次创建时计划 total 同源;不落库,仅查询带出 */
@ApiModelProperty("计划净重(KG),入库单口径,不落库")
private BigDecimal planNetWeight;
@ApiModelProperty("计划毛重(KG),入库单口径,不落库")
private BigDecimal planGrossWeight;
@ApiModelProperty("计划体积(CBM),入库单口径,不落库")
private BigDecimal planVolume;
@ApiModelProperty("计划面积(SQM),入库单口径,不落库")
private BigDecimal planArea;
/** 待收 = 计划 − 累计已收货,仅接口计算不落库 */
@ApiModelProperty("待收净重=计划净重-累计已收货净重,仅计算不落库")
private BigDecimal pendingNetWeight;
@ApiModelProperty("待收毛重=计划毛重-累计已收货毛重,仅计算不落库")
private BigDecimal pendingGrossWeight;
@ApiModelProperty("待收体积=计划体积-累计已收货体积,仅计算不落库")
private BigDecimal pendingVolume;
@ApiModelProperty("待收面积=计划面积-累计已收货面积,仅计算不落库")
private BigDecimal pendingArea;
@ApiModelProperty("Invoice No.")
@Excel(name = "Invoice No.")
private String invoiceNo;
@@ -78,6 +78,30 @@ public class ReceiptMaterialDetailDO extends BaseVOEntity {
@Excel(name = "已收货数量")
private BigDecimal alreadyReceiptQuantity;
@ApiModelProperty("累计已收货毛重(KG),称重实绩")
private BigDecimal alreadyReceiptGrossWeight;
@ApiModelProperty("累计已收货净重(KG)")
private BigDecimal alreadyReceiptNetWeight;
@ApiModelProperty("本次称重毛重(KG),仅提交请求使用,不落库")
private BigDecimal receiptGrossWeight;
@ApiModelProperty("本次净重(KG),仅提交请求使用,不落库")
private BigDecimal receiptNetWeight;
@ApiModelProperty("累计已收货体积(CBM)")
private BigDecimal alreadyReceiptVolume;
@ApiModelProperty("累计已收货面积(SQM)")
private BigDecimal alreadyReceiptArea;
@ApiModelProperty("本次体积(CBM),仅提交请求使用,不落库")
private BigDecimal receiptVolume;
@ApiModelProperty("本次面积(SQM),仅提交请求使用,不落库")
private BigDecimal receiptArea;
@ApiModelProperty("收货数量")
@Excel(name = "收货数量")
private BigDecimal receiptQuantity;
@@ -314,15 +314,39 @@ public class ShelfMaterialDetail extends BaseVOEntity {
@Excel(name = "总净重(KG)")
private BigDecimal totalNetWeight;
@ApiModelProperty("累计已上架净重(KG),与 totalNetWeight 同口径累加本次净重")
@TableField("total_net_weight")
private BigDecimal alreadyShelvesNetWeight;
@ApiModelProperty("总毛重(KG)")
@Excel(name = "总毛重(KG)")
private BigDecimal totalGrossWeight;
@ApiModelProperty("累计已上架毛重(KG),与 totalGrossWeight 同口径累加本次毛重")
@TableField("total_gross_weight")
private BigDecimal alreadyShelvesGrossWeight;
@ApiModelProperty("总体积(CBM)")
@Excel(name = "总体积(CBM)")
private BigDecimal totalVolume;
@ApiModelProperty("累计已上架体积(CBM),与 totalVolume 同口径累加本次体积")
@TableField("total_volume")
private BigDecimal alreadyShelvesVolume;
@ApiModelProperty("总面积(SQM)")
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
@ApiModelProperty("累计已上架面积(SQM),与 totalArea 同口径累加本次面积")
@TableField("total_area")
private BigDecimal alreadyShelvesArea;
}
@@ -290,6 +290,7 @@ public class ShelfMaterialDetailImpl extends ServiceImpl<ShelfMaterialDetailMapp
throw new ServiceException("物料明细不能为空");
}
LoginUser loginUser = SecurityUtils.getLoginUser();
boolean fromApp = Boolean.TRUE.equals(stockShelfOrderDO.getFromApp());
//批量新增或修改物料信息
List<ShelfMaterialDetail> shelfMaterialDetailList = new ArrayList<>();
// 批量新增序列号
@@ -326,11 +327,21 @@ public class ShelfMaterialDetailImpl extends ServiceImpl<ShelfMaterialDetailMapp
totalActualQuantity = totalActualQuantity.add(childActualQuantity);
}
}
if (shelfMaterialDetailDO.getShelvesStatus() == 2){//部分上架 第二次上架 这次上架数量覆盖掉已上架数量
// 不要覆盖累计已上架数量alreadyShelvesQuantity 应由上层 assembleParamByShelf 累计计算
// 仅当 alreadyShelvesQuantity 为空时才回退到 shelvesQuantity兼容旧/缺字段场景
if (shelfMaterialDetailDO.getAlreadyShelvesQuantity() == null) {
shelfMaterialDetailDO.setAlreadyShelvesQuantity(shelfMaterialDetailDO.getShelvesQuantity());
}
ShelfMaterialDetail shelfMaterialDetail = new ShelfMaterialDetail();
BeanUtils.copyProperties(shelfMaterialDetailDO, shelfMaterialDetail);
// PDA明细表 shelves_quantity 也要跟累计 already_shelves_quantity 同步
// PC保持旧语义shelves_quantity=本次上架数量
if (fromApp) {
BigDecimal already = shelfMaterialDetailDO.getAlreadyShelvesQuantity();
if (already != null) {
shelfMaterialDetail.setShelvesQuantity(already);
}
}
shelfMaterialDetail.setUpdateBy(loginUser.getUserid());
shelfMaterialDetail.setUpdateByName(loginUser.getUsername());
shelfMaterialDetail.setUpdateTime(new Date());
@@ -77,6 +77,10 @@ public class ShelfMaterialDetailPO extends BaseVOEntity {
@Excel(name = "已上架数量")
private BigDecimal alreadyShelvesQuantity;
@ApiModelProperty("待上架数量")
@Excel(name = "待上架数量")
private BigDecimal pendingShelvesQuantity;
@ApiModelProperty("上架数量")
@Excel(name = "上架数量")
private BigDecimal shelvesQuantity;
@@ -317,15 +321,35 @@ public class ShelfMaterialDetailPO extends BaseVOEntity {
@Excel(name = "总净重(KG)")
private BigDecimal totalNetWeight;
@ApiModelProperty("累计已上架净重(KG),与 totalNetWeight 同口径累加本次净重")
private BigDecimal alreadyShelvesNetWeight;
@ApiModelProperty("总毛重(KG)")
@Excel(name = "总毛重(KG)")
private BigDecimal totalGrossWeight;
@ApiModelProperty("累计已上架毛重(KG),与 totalGrossWeight 同口径累加本次毛重")
private BigDecimal alreadyShelvesGrossWeight;
@ApiModelProperty("总体积(CBM)")
@Excel(name = "总体积(CBM)")
private BigDecimal totalVolume;
@ApiModelProperty("累计已上架体积(CBM),与 totalVolume 同口径累加本次体积")
private BigDecimal alreadyShelvesVolume;
@ApiModelProperty("总面积(SQM)")
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
@ApiModelProperty("累计已上架面积(SQM),与 totalArea 同口径累加本次面积")
private BigDecimal alreadyShelvesArea;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
}
@@ -870,6 +870,8 @@ public class ShiftManageDomainService {
if (ObjectUtil.isNull(materialInventoryDb)){
MaterialInventoryDO materialInventoryDONow = new MaterialInventoryDO();
BatchAttributeAssignment(materialMoreDetailList, materialInventoryDONow);//批次属性赋值
materialInventoryDONow.setLotNumber(shiftMaterialDetailPO.getLotNumber());
materialInventoryDONow.setInOrderNumber(shiftMaterialDetailPO.getInOrderNumber());
materialInventoryDONow.setMaterialBaseInfoId(shiftMaterialDetailPO.getMaterialBaseInfoId());
materialInventoryDONow.setWarehouseId(shiftMaterialDetailPO.getNewWarehouseId());
materialInventoryDONow.setWarehouseCode(shiftMaterialDetailPO.getNewWarehouseCode());
@@ -260,6 +260,14 @@ public class ShiftMaterialDetail extends BaseVOEntity {
@Excel(name = "面积")
private BigDecimal area;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
@ApiModelProperty("移位详情")
@TableField(exist = false)
private List<ShiftMoveMaterialQuantityPO> shiftMoveMaterialQuantityList;
@@ -729,6 +729,8 @@ public class ShiftMaterialDetailImpl extends ServiceImpl<ShiftMaterialDetailMapp
inventoryAdjustmentRecord.setAdjustAction("移位管理");
inventoryAdjustmentRecord.setInOrderNumber(shiftMaterialDetailDO.getInOrderNumber());
inventoryAdjustmentRecord.setLotNumber(shiftMaterialDetailDO.getLotNumber());
inventoryAdjustmentRecord.setRelateNo(shiftMaterialDetailDO.getShiftNumber());
inventoryAdjustmentRecord.setAdjustAfterStatusCode(materialInventory1.getMaterialStatusCode() == null ? "" : materialInventory1.getMaterialStatusCode());
inventoryAdjustmentRecord.setAdjustBeforeStatusCode(materialInventory1.getMaterialStatusCode() == null ? "" : materialInventory1.getMaterialStatusCode());
@@ -275,6 +275,14 @@ public class ShiftMaterialDetailPO extends BaseVOEntity {
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
@ApiModelProperty("移位详情")
@TableField(exist = false)
private List<ShiftMaterialDetailPO> children;
@@ -273,6 +273,14 @@ public class ShiftMaterialDetailDO extends BaseVOEntity {
@ApiModelProperty("总面积(SQM),PDA 表单区修改后回传")
private BigDecimal totalArea;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
@ApiModelProperty("移位详情")
@TableField(exist = false)
private List<ShiftMaterialDetailDO> children;
@@ -127,4 +127,11 @@ public class ImmediateInventoryPO {
@ApiModelProperty("批次号")
private String batchNumber;
@ApiModelProperty("入库单号")
@Excel(name = "入库单号")
private String inOrderNumber;
@ApiModelProperty("LOT编号")
@Excel(name = "LOT编号")
private String lotNumber;
}
@@ -259,7 +259,7 @@ public class StockInOrderDomainService {
}
}
// 填充入库单明细的收货数量上架数量以及更新毛重净重面积体积
// 填充入库单明细的收货数量上架数量入库单明细 total* 保持计划值不因收货覆盖原按收货汇总 total* 已注释保留
for (InMaterialDetailPO inMaterialDetail : inMaterialDetailPOList) {
Long materialDetailId = inMaterialDetail.getMaterialDetailId();
if (materialDetailId != null) {
@@ -273,18 +273,18 @@ public class StockInOrderDomainService {
// 更新毛重净重面积体积根据收货时所填的明细行数据更新到入库单明细中
// 将收货单明细中填写的数据汇总后更新到入库单明细
if (receiptDetail.getTotalGrossWeight() != null) {
inMaterialDetail.setTotalGrossWeight(receiptDetail.getTotalGrossWeight());
}
if (receiptDetail.getTotalNetWeight() != null) {
inMaterialDetail.setTotalNetWeight(receiptDetail.getTotalNetWeight());
}
if (receiptDetail.getTotalArea() != null) {
inMaterialDetail.setTotalArea(receiptDetail.getTotalArea());
}
if (receiptDetail.getTotalVolume() != null) {
inMaterialDetail.setTotalVolume(receiptDetail.getTotalVolume());
}
// if (receiptDetail.getTotalGrossWeight() != null) {
// inMaterialDetail.setTotalGrossWeight(receiptDetail.getTotalGrossWeight());
// }
// if (receiptDetail.getTotalNetWeight() != null) {
// inMaterialDetail.setTotalNetWeight(receiptDetail.getTotalNetWeight());
// }
// if (receiptDetail.getTotalArea() != null) {
// inMaterialDetail.setTotalArea(receiptDetail.getTotalArea());
// }
// if (receiptDetail.getTotalVolume() != null) {
// inMaterialDetail.setTotalVolume(receiptDetail.getTotalVolume());
// }
}
// 填充上架数量入库单对应的上架单实际上架数量
@@ -301,7 +301,7 @@ public class StockInOrderDomainService {
}
/**
* 递归处理收货单明细汇总毛重净重面积体积
* 递归处理收货单明细汇总收货数量毛重/净重/面积/体积汇总已注释入库单明细 total* 不因收货覆盖
* @param receiptDetail 收货单明细
* @param receiptDetailMap 收货单明细汇总Map
*/
@@ -323,23 +323,23 @@ public class StockInOrderDomainService {
BigDecimal newReceiptQuantity = receiptDetail.getReceiptQuantity() != null ? receiptDetail.getReceiptQuantity() : BigDecimal.ZERO;
existing.setReceiptQuantity(receiptQuantity.add(newReceiptQuantity));
// 汇总毛重净重面积体积根据收货时填写的数据
// 汇总毛重净重面积体积根据收货时填写的数据 入库单明细 total* 不因收货覆盖已注释保留
// 累加所有收货单明细的毛重净重面积体积
BigDecimal existingGrossWeight = existing.getTotalGrossWeight() != null ? existing.getTotalGrossWeight() : BigDecimal.ZERO;
BigDecimal newGrossWeight = receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO;
existing.setTotalGrossWeight(existingGrossWeight.add(newGrossWeight));
BigDecimal existingNetWeight = existing.getTotalNetWeight() != null ? existing.getTotalNetWeight() : BigDecimal.ZERO;
BigDecimal newNetWeight = receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO;
existing.setTotalNetWeight(existingNetWeight.add(newNetWeight));
BigDecimal existingArea = existing.getTotalArea() != null ? existing.getTotalArea() : BigDecimal.ZERO;
BigDecimal newArea = receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO;
existing.setTotalArea(existingArea.add(newArea));
BigDecimal existingVolume = existing.getTotalVolume() != null ? existing.getTotalVolume() : BigDecimal.ZERO;
BigDecimal newVolume = receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO;
existing.setTotalVolume(existingVolume.add(newVolume));
// BigDecimal existingGrossWeight = existing.getTotalGrossWeight() != null ? existing.getTotalGrossWeight() : BigDecimal.ZERO;
// BigDecimal newGrossWeight = receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO;
// existing.setTotalGrossWeight(existingGrossWeight.add(newGrossWeight));
//
// BigDecimal existingNetWeight = existing.getTotalNetWeight() != null ? existing.getTotalNetWeight() : BigDecimal.ZERO;
// BigDecimal newNetWeight = receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO;
// existing.setTotalNetWeight(existingNetWeight.add(newNetWeight));
//
// BigDecimal existingArea = existing.getTotalArea() != null ? existing.getTotalArea() : BigDecimal.ZERO;
// BigDecimal newArea = receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO;
// existing.setTotalArea(existingArea.add(newArea));
//
// BigDecimal existingVolume = existing.getTotalVolume() != null ? existing.getTotalVolume() : BigDecimal.ZERO;
// BigDecimal newVolume = receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO;
// existing.setTotalVolume(existingVolume.add(newVolume));
}
// 递归处理子明细
@@ -404,7 +404,7 @@ public class StockReceiptOrderDomainService {
genInventoryStandingReport(stockReceiptOrderPO, stockReceiptOrderDO);
//修改物料明细信息
receiptMaterialDetailService.batchReceiptUpdate(stockReceiptOrderDO);
//同步更新入库单明细的收货数量总毛重总净重总面积总体积
// 同步更新入库单明细的收货数量入库单 totalNetWeight/totalGrossWeight/totalVolume/totalArea 不因收货改库 sync 内注释
syncUpdateInMaterialDetailFromReceipt(stockReceiptOrderDO, stockReceiptOrderPO);
//生成 收货作业单
genStockReceiptTaskOrderByReceivingGoods(stockReceiptOrderPO,stockReceiptOrderDO);
@@ -419,8 +419,8 @@ public class StockReceiptOrderDomainService {
}
/**
* 同步更新入库单明细的收货数量总毛重总净重总面积总体积
* 根据收货单明细中填写的数据materialDetailId分组汇总后更新到入库单明细
* 同步更新入库单明细的收货数量总毛重/总净重/总面积/总体积不再写入入库单明细逻辑已注释保留
* 根据收货单明细中填写的数据 materialDetailId 分组汇总后更新到入库单明细
* @param stockReceiptOrderDO 收货单DO
* @param stockReceiptOrderPO 收货单PO可选如果为null则从DO中获取
*/
@@ -511,29 +511,26 @@ public class StockReceiptOrderDomainService {
hasUpdate = true;
}
// 更新总毛重
if (summary.containsKey("totalGrossWeight") && summary.get("totalGrossWeight") != null) {
updateWrapper.set("total_gross_weight", summary.get("totalGrossWeight"));
hasUpdate = true;
}
// 更新总净重
if (summary.containsKey("totalNetWeight") && summary.get("totalNetWeight") != null) {
updateWrapper.set("total_net_weight", summary.get("totalNetWeight"));
hasUpdate = true;
}
// 更新总面积
if (summary.containsKey("totalArea") && summary.get("totalArea") != null) {
updateWrapper.set("total_area", summary.get("totalArea"));
hasUpdate = true;
}
// 更新总体积
if (summary.containsKey("totalVolume") && summary.get("totalVolume") != null) {
updateWrapper.set("total_volume", summary.get("totalVolume"));
hasUpdate = true;
}
// 更新总毛重/总净重/总面积/总体积入库单明细保持计划值收货实绩仅在收货单侧此处不再改库原逻辑保留如下
// if (summary.containsKey("totalGrossWeight") && summary.get("totalGrossWeight") != null) {
// updateWrapper.set("total_gross_weight", summary.get("totalGrossWeight"));
// hasUpdate = true;
// }
//
// if (summary.containsKey("totalNetWeight") && summary.get("totalNetWeight") != null) {
// updateWrapper.set("total_net_weight", summary.get("totalNetWeight"));
// hasUpdate = true;
// }
//
// if (summary.containsKey("totalArea") && summary.get("totalArea") != null) {
// updateWrapper.set("total_area", summary.get("totalArea"));
// hasUpdate = true;
// }
//
// if (summary.containsKey("totalVolume") && summary.get("totalVolume") != null) {
// updateWrapper.set("total_volume", summary.get("totalVolume"));
// hasUpdate = true;
// }
if (hasUpdate) {
updateWrapper.set("update_by", loginUser.getUserid());
@@ -541,13 +538,9 @@ public class StockReceiptOrderDomainService {
updateWrapper.set("update_time", updateTime);
boolean updateResult = iInMaterialDetailService.update(updateWrapper);
if (updateResult) {
log.info("成功更新入库单明细,uniqueId: {}, 收货数量: {}, 总毛重: {}, 总净重: {}, 总面积: {}, 总体积: {}",
log.info("成功更新入库单明细,uniqueId: {}, 收货数量: {}(入库单 total* 不再随收货同步)",
uniqueId,
summary.get("receiptQuantity"),
summary.get("totalGrossWeight"),
summary.get("totalNetWeight"),
summary.get("totalArea"),
summary.get("totalVolume"));
summary.get("receiptQuantity"));
} else {
log.warn("更新入库单明细失败,uniqueId: {}, inOrderNumber: {}", uniqueId, inOrderNumber);
}
@@ -562,7 +555,7 @@ public class StockReceiptOrderDomainService {
}
/**
* 递归处理收货单明细汇总收货数量总毛重总净重总面积总体积
* 递归处理收货单明细汇总收货数量总毛重/净重/面积/体积的汇总已注释不再写入入库单
* @param receiptDetail 收货单明细PO
* @param uniqueIdSummaryMap 汇总Mapkey为入库单明细的unique_id即收货单明细的in_unique_idvalue为字段汇总Map
*/
@@ -576,30 +569,36 @@ public class StockReceiptOrderDomainService {
Long uniqueId = receiptDetail.getInUniqueId();
Map<String, BigDecimal> summary = uniqueIdSummaryMap.computeIfAbsent(uniqueId, k -> new HashMap<>());
// 汇总收货数量
// 汇总收货数量必须按累计已收货汇总receipt_quantity 字段存的是本次收货量多次收货会覆盖为最后一次
// 同步入库单明细应使用 already_receipt_quantity否则会误把最后一次的本次量写入 in_material_detail
BigDecimal receiptQuantity = summary.getOrDefault("receiptQuantity", BigDecimal.ZERO);
BigDecimal newReceiptQuantity = receiptDetail.getReceiptQuantity() != null ? receiptDetail.getReceiptQuantity() : BigDecimal.ZERO;
summary.put("receiptQuantity", receiptQuantity.add(newReceiptQuantity));
BigDecimal alreadyReceipt = receiptDetail.getAlreadyReceiptQuantity() != null ? receiptDetail.getAlreadyReceiptQuantity() : BigDecimal.ZERO;
summary.put("receiptQuantity", receiptQuantity.add(alreadyReceipt));
// 汇总总毛重
BigDecimal totalGrossWeight = summary.getOrDefault("totalGrossWeight", BigDecimal.ZERO);
BigDecimal newGrossWeight = receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO;
summary.put("totalGrossWeight", totalGrossWeight.add(newGrossWeight));
// 汇总总净重
BigDecimal totalNetWeight = summary.getOrDefault("totalNetWeight", BigDecimal.ZERO);
BigDecimal newNetWeight = receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO;
summary.put("totalNetWeight", totalNetWeight.add(newNetWeight));
// 汇总总面积
BigDecimal totalArea = summary.getOrDefault("totalArea", BigDecimal.ZERO);
BigDecimal newArea = receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO;
summary.put("totalArea", totalArea.add(newArea));
// 汇总总体积
BigDecimal totalVolume = summary.getOrDefault("totalVolume", BigDecimal.ZERO);
BigDecimal newVolume = receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO;
summary.put("totalVolume", totalVolume.add(newVolume));
// 汇总总毛重/净重/面积/体积曾用于同步写入入库单明细现已不再改入库单 total*汇总逻辑注释保留
// BigDecimal totalGrossWeight = summary.getOrDefault("totalGrossWeight", BigDecimal.ZERO);
// BigDecimal newGrossWeight = receiptDetail.getAlreadyReceiptGrossWeight() != null
// ? receiptDetail.getAlreadyReceiptGrossWeight()
// : (receiptDetail.getTotalGrossWeight() != null ? receiptDetail.getTotalGrossWeight() : BigDecimal.ZERO);
// summary.put("totalGrossWeight", totalGrossWeight.add(newGrossWeight));
//
// BigDecimal totalNetWeight = summary.getOrDefault("totalNetWeight", BigDecimal.ZERO);
// BigDecimal newNetWeight = receiptDetail.getAlreadyReceiptNetWeight() != null
// ? receiptDetail.getAlreadyReceiptNetWeight()
// : (receiptDetail.getTotalNetWeight() != null ? receiptDetail.getTotalNetWeight() : BigDecimal.ZERO);
// summary.put("totalNetWeight", totalNetWeight.add(newNetWeight));
//
// BigDecimal totalArea = summary.getOrDefault("totalArea", BigDecimal.ZERO);
// BigDecimal newArea = receiptDetail.getAlreadyReceiptArea() != null
// ? receiptDetail.getAlreadyReceiptArea()
// : (receiptDetail.getTotalArea() != null ? receiptDetail.getTotalArea() : BigDecimal.ZERO);
// summary.put("totalArea", totalArea.add(newArea));
//
// BigDecimal totalVolume = summary.getOrDefault("totalVolume", BigDecimal.ZERO);
// BigDecimal newVolume = receiptDetail.getAlreadyReceiptVolume() != null
// ? receiptDetail.getAlreadyReceiptVolume()
// : (receiptDetail.getTotalVolume() != null ? receiptDetail.getTotalVolume() : BigDecimal.ZERO);
// summary.put("totalVolume", totalVolume.add(newVolume));
// 递归处理子明细
if (!CollectionUtils.isEmpty(receiptDetail.getChildren())) {
@@ -712,6 +711,8 @@ public class StockReceiptOrderDomainService {
if (abnormal == 1){
genInOrderAbnormal(stockReceiptOrderPO);
}
// 完成收货同步更新本单全部明细收货状态与整单收货 entireReceipt 一致否则 PDA/列表仍显示收货中
updateReceiptMaterialDetailReceiptStatusWhenOrderCompleted(stockReceiptOrderPO, loginUser, userRealName);
return stockReceiptOrderService.update(null, new UpdateWrapper<StockReceiptOrder>().lambda()
.set(StockReceiptOrder::getStatus, 3)
.set(StockReceiptOrder::getAbnormal, abnormal)
@@ -721,6 +722,45 @@ public class StockReceiptOrderDomainService {
.eq(StockReceiptOrder::getReceiptOrderId, receiptOrderId));
}
/**
* 收货单完成时按累计已收与计划数量比较更新明细 receipt_status3 正常收完 / 4 少收 / 5 超收
*/
private void updateReceiptMaterialDetailReceiptStatusWhenOrderCompleted(StockReceiptOrderPO stockReceiptOrderPO,
LoginUser loginUser, String userRealName) {
if (stockReceiptOrderPO == null || StringUtils.isBlank(stockReceiptOrderPO.getReceiptOrderNumber())) {
return;
}
Date updateTime = new Date();
List<ReceiptMaterialDetail> details = receiptMaterialDetailService.list(
new QueryWrapper<ReceiptMaterialDetail>().lambda()
.eq(ReceiptMaterialDetail::getReceiptOrderNumber, stockReceiptOrderPO.getReceiptOrderNumber())
.eq(ReceiptMaterialDetail::getDelFlag, 1));
if (CollectionUtils.isEmpty(details)) {
return;
}
for (ReceiptMaterialDetail d : details) {
d.setReceiptStatus(resolveReceiptDetailStatusOnOrderComplete(d.getAlreadyReceiptQuantity(), d.getQuantity()));
d.setUpdateBy(loginUser.getUserid());
d.setUpdateByName(userRealName);
d.setUpdateTime(updateTime);
}
receiptMaterialDetailService.updateBatchById(details);
}
/** 3=已收足 4=少收 5=超收 */
private static Integer resolveReceiptDetailStatusOnOrderComplete(BigDecimal alreadyReceiptQuantity, BigDecimal quantity) {
BigDecimal already = alreadyReceiptQuantity != null ? alreadyReceiptQuantity : BigDecimal.ZERO;
BigDecimal plan = quantity != null ? quantity : BigDecimal.ZERO;
int cmp = already.compareTo(plan);
if (cmp > 0) {
return 5;
}
if (cmp < 0) {
return 4;
}
return 3;
}
/**
* @param receiptOrderId
* @return Boolean
@@ -649,12 +649,14 @@ public class StockShelfOrderDomainService {
.collect(Collectors.toList());
}
Long shipperId = stockReceiptOrderDO.getShipperId();
MaterialInventory param = getParam(shelfMaterialDetail, fieldNames, shipperId);
MaterialInventory param = getParam(shelfMaterialDetail, fieldNames, shipperId,stockReceiptOrderDO.getInOrderNumber());
List<MaterialInventoryPO> materialInventoryPOS = materialInventoryMapper.selectListByWhere(param);
MaterialBaseInfo materialBaseInfo = materialBaseInfoMapper.selectById(materialBaseInfoId);
LoginUser loginUser = SecurityUtils.getLoginUser();
if (materialInventoryPOS.size() == 0) {
MaterialInventory materialInventory = new MaterialInventory();
materialInventory.setInOrderNumber(stockReceiptOrderDO.getInOrderNumber());
materialInventory.setLotNumber(shelfMaterialDetail.getLotNumber());
//仓库信息
materialInventory.setWarehouseId(stockReceiptOrderDO.getWarehouseId());
materialInventory.setWarehouseCode(stockReceiptOrderDO.getWarehouseCode());
@@ -733,6 +735,8 @@ public class StockShelfOrderDomainService {
//库存调整记录
InventoryAdjustmentRecord inventoryAdjustmentRecord = new InventoryAdjustmentRecord();
inventoryAdjustmentRecord.setInOrderNumber(stockReceiptOrderDO.getInOrderNumber());
inventoryAdjustmentRecord.setLotNumber(shelfMaterialDetail.getLotNumber());
inventoryAdjustmentRecord.setAdjustAction("入库");
inventoryAdjustmentRecord.setRelateNo(stockReceiptOrderDO.getInOrderNumber());
inventoryAdjustmentRecord.setAdjustAfterStatusCode(materialInventory.getMaterialStatusCode() == null ? "" : materialInventory.getMaterialStatusCode());
@@ -802,6 +806,9 @@ public class StockShelfOrderDomainService {
inventoryAdjustmentRecordMapper.insert(inventoryAdjustmentRecord);
} else if (materialInventoryPOS.size() == 1) {
MaterialInventory materialInventory = new MaterialInventory();
materialInventory.setInOrderNumber(stockReceiptOrderDO.getInOrderNumber());
materialInventory.setLotNumber(shelfMaterialDetail.getLotNumber());
BigDecimal shelvesQuantity = shelfMaterialDetail.getShelvesQuantity();
shelvesQuantity = shelvesQuantity != null ? shelvesQuantity : BigDecimal.ZERO;
MaterialInventoryPO materialInventoryPO = materialInventoryPOS.get(0);
@@ -869,6 +876,8 @@ public class StockShelfOrderDomainService {
InventoryAdjustmentRecord inventoryAdjustmentRecord = new InventoryAdjustmentRecord();
inventoryAdjustmentRecord.setInOrderNumber(stockReceiptOrderDO.getInOrderNumber());
inventoryAdjustmentRecord.setLotNumber(shelfMaterialDetail.getLotNumber());
inventoryAdjustmentRecord.setAdjustAction("入库");
inventoryAdjustmentRecord.setRelateNo(stockReceiptOrderDO.getInOrderNumber());
inventoryAdjustmentRecord.setAdjustAfterStatusCode(materialInventory.getMaterialStatusCode() == null ? "" : materialInventory.getMaterialStatusCode());
@@ -923,7 +932,7 @@ public class StockShelfOrderDomainService {
}
}
private MaterialInventory getParam(ShelfMaterialDetail shelfMaterialDetail, List<String> fieldNames,Long shipperId){
private MaterialInventory getParam(ShelfMaterialDetail shelfMaterialDetail, List<String> fieldNames,Long shipperId,String inOrderNumber){
MaterialInventory param = new MaterialInventory();
param.setShipperId(shipperId);
param.setWarehouseId(shelfMaterialDetail.getWarehouseId());
@@ -932,6 +941,8 @@ public class StockShelfOrderDomainService {
param.setStorageLocationId(shelfMaterialDetail.getStorageLocationId());
param.setOrganizationId(shelfMaterialDetail.getOrganizationId());
param.setBatchNumber(shelfMaterialDetail.getBatchNumber());
param.setLotNumber(shelfMaterialDetail.getLotNumber());
param.setInOrderNumber(inOrderNumber);
if (fieldNames.size() > 0) {
for (String fieldName : fieldNames) {
switch (fieldName) {