2 天以前 1ba0dbfde5634c8bf2ec20891d6b226b996f6b59
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/transaction/MesWmTransactionMapper.java
@@ -17,6 +17,7 @@
        return selectPage(reqVO, new LambdaQueryWrapperX<MesWmTransactionDO>()
                .eqIfPresent(MesWmTransactionDO::getItemId, reqVO.getItemId())
                .likeIfPresent(MesWmTransactionDO::getBatchCode, reqVO.getBatchCode())
                .likeIfPresent(MesWmTransactionDO::getBagCode, reqVO.getBagCode())
                .eqIfPresent(MesWmTransactionDO::getWarehouseId, reqVO.getWarehouseId())
                .eqIfPresent(MesWmTransactionDO::getLocationId, reqVO.getLocationId())
                .eqIfPresent(MesWmTransactionDO::getAreaId, reqVO.getAreaId())
@@ -29,4 +30,28 @@
                .orderByDesc(MesWmTransactionDO::getTransactionTime));
    }
    /**
     * 查找虚拟线边库库存记录对应的原始出库仓库信息
     * <p>
     * 通过虚拟线边库的 materialStockId,找到首次入库事务(IN),
     * 再通过 relatedTransactionId 找到关联的出库事务(OUT),
     * 获取物料从哪个实际仓库出库进入虚拟线边库的。
     *
     * @param materialStockId 虚拟线边库库存记录 ID
     * @return 原始出库事务(包含 warehouseId/locationId/areaId),不存在返回 null
     */
    default MesWmTransactionDO selectOriginalOutTransaction(Long materialStockId) {
        // 1. 找到该库存记录的首次入库事务
        MesWmTransactionDO firstInTransaction = selectOne(new LambdaQueryWrapperX<MesWmTransactionDO>()
                .eq(MesWmTransactionDO::getMaterialStockId, materialStockId)
                .eq(MesWmTransactionDO::getType, 1) // IN
                .orderByAsc(MesWmTransactionDO::getId)
                .last("LIMIT 1"));
        if (firstInTransaction == null || firstInTransaction.getRelatedTransactionId() == null) {
            return null;
        }
        // 2. 通过 relatedTransactionId 找到原始出库事务
        return selectById(firstInTransaction.getRelatedTransactionId());
    }
}