创建无缝的仓库转移方法
#javascript #网络开发人员 #编程 #showdev

嘿,软件自由式工程师!

今天,我想与您分享我最近开始的令人振奋的旅程 - 一个独奏的使命,旨在解决仓库管理应用程序“在仓库之间创建转移方法”的困惑问题。图片以下图片:多个仓库,每个仓库都有不同数量的商品,以及在它们之间进行平滑传输的挑战。

作为一名软件自由式工程师,我决定单枪匹马地承担这一挑战。我带着我的编码能力和好奇心,首先跳进了任务,渴望找到优雅有效的解决方案。

手头的问题不是很小的壮举。每个仓库都包含不同数量的商品,并设计一种可以优雅地处理这些变化的转移方法在公园里没有步行。错误潜伏在每个角落,准备在我的代码上弹跳。

这次编码冒险是在我舒适的家庭工作空间中进行的,周围是我值得信赖的键盘和多个监视器的温暖光芒。我拿着我最喜欢的小吃,努力解决这个复杂的挑战。

该项目在深夜编码会议和清晨调试马拉松比赛的几周内展开。当我深入到这个问题的复杂性时,时间似乎既飞逝又站着。

我喜欢一个挑战,这个问题为突破我的编码技巧的界限提供了一个令人兴奋的机会。此外,在仓库之间实现无缝转移是任何仓库管理应用程序的宝贵资产,我想为社区做出强大和可靠的贡献。

我遇到的第一个障碍是数据不一致。每个仓库以不同的格式和单位存储商品,从而导致计算和处理的差异。找出一种使数据归一化的方法对于确保转移过程中的准确性至关重要。

第二个挑战是设计一种可以适应各种商品的转移方法。传统的方法根本不会在这里削减。我需要一种灵活的解决方案,可以容纳小型转移和大量库存运动而不会破坏汗水。

我首先对现有代码库进行彻底分析并了解数据结构。然后,我潜入设计一种新算法,该算法将更有效地处理转移。

我的方法涉及创建一个动态映射系统,该系统可以处理仓库数据并为转移建立共同点。我专注于可伸缩性,确保该方法可以处理数百或数千个独特物品的仓库。

在无数的反复试验会议,大量的代码修订和清空咖啡壶之后,我终于有了一个工作原型。现在,转移方法完美地处理仓库之间的转移,优雅地容纳了不同数量的货物。

这种方法不仅为仓库经理节省了时间和精力,而且还消除了由于数据不一致而引起的头痛。编码社区的反应是压倒性的,许多人对强大的解决方案表示感谢。

承担在仓库之间创建转移方法的挑战一直是一个令人难以置信的成长和学习之旅。一路上面对障碍是可以的。拥抱它们,向他们学习,并将这些精力引导创造有意义的东西。我们的编码社区在协作和知识共享方面蓬勃发展,因此让我们继续在我们的编码工作中互相支持。


这是代码段隐喻看起来,“这很混乱,但这很工作!” (注意:在展示案例中,这只是一堆蛋糕的蛋糕):

  • itemSourceDetail包含Origin Warehouse中项目的细节。
  • formData包含表格收集的数据

首先检查项目!

const checkIsBarangExists = await findBarang(
    itemSourceDetail.item.produk.barang_nama
)

if (checkIsBarangExists) {
   // Update Data Already Exist in Dexie Database 
} else {
   // Add New Items in The Dexie Database That Want to Transfer
}

检查源仓库中是否存在要传输的项目。它通过将findBarang函数称为“ item.produk.barang_nama”(item.produk.barang_nama)作为参数来做到这一点。此检查的结果存储在变量checkIsBarangExists中。

更新数据已经存在于Dexie数据库中

如果该项目存在于源仓库中(checkIsBarangExists是真实的),则代码以传输操作进行。

此代码将通过从源仓库中现有项目的元数据添加sourcetransferamout和sourceIsiJual值来计算要传输的总金额(jumlah)。

const jumlah = checkIsBarangExists.metadata.sourceTransferAmout +
            checkIsBarangExists.metadata.sourceIsiJual

在项目源和目标之间创建单元定义。此操作将通过将jumlahdestinationRate相乘,可以计算在目标单位中要传输的金额。结果被四舍五入,以确保没有分数单位。

const convertSourceUnitToDestination = Math.ceil(
    checkIsBarangExists.metadata.destinationRate * jumlah
)

然后使用humanable函数获取人类可读的库存单元(此功能也像我的思想一样复杂)

const humanSource = await humanable({
    barangId: checkIsBarangExists.metadata.sourceBarangId,
    gudangId: Number(gudangId),
    jumlah: jumlah,
})

- 翻译:

  • 咀嚼11 ===感冒12
  • gudangId === warehouseId
  • 咀嚼6 ===感冒16

将在源和目标仓库中更新的数据作为对象updateData

const updateData = {
    'metadata.sourceTransferAmout': jumlah,
    'metadata.humanSource': humanSource,
    'transfer_detail.jumlah_transfer': convertSourceUnitToDestination,
    'transfer_detail.humanDestination': humanDestination,
}

然后调用updateTransfer功能以更新源仓库中的项目的传输详细信息。如果更新成功,它会触发所有当前转移的 refetch ,并显示成功的吐司消息ð¢。否则,它显示错误吐司消息ð´。

const updated = await updateTransfer(checkIsBarangExists.id, updateData);
if (updated) {
    mutate("/dexie/get-all-current-transfer");
    addToast("success", "bottom-left", "Berhasil", `${checkIsBarangExists.metadata.sourceBarangNama} berhasil diupdate`);
} else {
    addToast("error", "bottom-left", "Gagal", `${checkIsBarangExists.metadata.sourceBarangNama} gagal diupdate`);
}

在Dexie数据库中添加想要转移的新项目

如果该项目在源仓库中不存在(checkIsBarangExists是虚假的),则该功能将继续创建传输。

调用getDetailItemByProdukId功能以获取目标仓库中项目的详细信息。获取的细节存储在变量itemDestinationDetail中。

const itemDestinationDetail = await getDetailItemByProdukId(
    data.item.produk_id,
    values.transferKe
);

通过从项目详细信息中滤除零值来计算源和目标单元之间的转换率。然后使用createObjectFromArray函数来创建对象destinationValuedestinationValuedestinationValuesourceKeysourceValue

const destinationKey = [
    itemDestinationDetail.satuan_jual_level_1 || 0,
    itemDestinationDetail.satuan_jual_level_2 || 0,
    itemDestinationDetail.satuan_jual_level_3 || 0,
    itemDestinationDetail.satuan_jual_level_4 || 0
].filter((x) => x !== 0);

const destinationValue = [
    itemDestinationDetail.isi_jual_level_1 || 0,
    itemDestinationDetail.isi_jual_level_2 || 0,
    itemDestinationDetail.isi_jual_level_3 || 0,
    itemDestinationDetail.isi_jual_level_4 || 0
].filter((x) => x !== 0);

const destinationUnits = createObjectFromArray(
    destinationKey,
    destinationValue
);

const sourceKey = [
    itemSourceDetail.item.satuan_jual_level_1 || 0,
    itemSourceDetail.item.satuan_jual_level_2 || 0,
    itemSourceDetail.item.satuan_jual_level_3 || 0,
    itemSourceDetail.item.satuan_jual_level_4 || 0
].filter((x) => x !== 0);

const sourceValue = [
    itemSourceDetail.item.isi_jual_level_1 || 0,
    itemSourceDetail.item.isi_jual_level_2 || 0,
    itemSourceDetail.item.isi_jual_level_3 || 0,
    itemSourceDetail.item.isi_jual_level_4 || 0
].filter((x) => x !== 0);

const sourceUnits = createObjectFromArray(
    sourceKey,
    sourceValue
);

根据转移单位,根据sourceUnitssourceUnits确定isiJualAsal(源单位值)和isiJualTujuan(目标单位值)。

var isiJualAsal, isiJualTujuan;
if (sourceUnits[itemDestinationDetail.satuan_beli_local]) {
    isiJualAsal = sourceUnits[itemSourceDetail.item.satuan_jual_level_1];
    isiJualTujuan = destinationUnits[itemSourceDetail.item.satuan_jual_level_1];
} else {
    isiJualAsal = sourceUnits[itemDestinationDetail.satuan_jual_level_1];
    isiJualTujuan = destinationUnits[itemDestinationDetail.satuan_jual_level_1];
}

获得源和目的地项目的库存单位的人类可读表示。

const humanSource = await humanable({
    barangId: itemSourceDetail.item.barang_id,
    gudangId: Number(gudangId),
    jumlah: isiJualAsal,
});

const humanDestination = await humanable({
    barangId: itemDestinationDetail.barang_id,
    gudangId: Number(formData.transferKe),
    jumlah: isiJualTujuan,
});

传输的数据是作为对象transferItem准备的,其中包含诸如传输号码,仓库ID,项目ID,转移状态,传输详细信息和元数据等详细信息。

const transferItem = {
    no_transfer: values.noTransfer,
    transfer_dari: gudangId,
    transfer_ke: values.transferKe,
    transfer_status: TRANSFER_STATUS.PENDING,
    transportasi_id: values.transportasiId,
    pengirim: values.pengirim,
    metadata: {
        sourceUserId: app.user.userId,
        sourceGudangId: gudangId,
        sourceBarangNama: itemSourceDetail.item.produk.barang_nama,
        sourceTransferAmout: isiJualAsal,
        sourceProdukId: itemSourceDetail.item.produk_id,
        sourceBarangId: itemSourceDetail.item.barang_id,
        sourceIsiJual: isiJualAsal,
        destinationRate: isiJualTujuan,
        humanSource,
    },
    transfer_detail: {
        no_transfer: values.noTransfer,
        barang_id: itemDestinationDetail.barang_id,
        produk_id: itemDestinationDetail.produk_id,
        jumlah_transfer: isiJualTujuan,
        humanDestination,
    },
};

然后调用createTransfer函数以在(后端)数据库中创建传输记录。如果创建成功,它会触发所有当前转移的重新提示,并显示成功的吐司消息ð¢。否则,它显示错误吐司消息ð´。

const created = await createTransfer(transferItem);
if (created) {
    mutate("/dexie/get-all-current-transfer");
    addToast("success", "bottom-left", "Berhasil", `${itemSourceDetail.item.produk.barang_nama} berhasil ditambahkan`);
} else {
    addToast("error", "bottom-left", "Gagal", `${itemSourceDetail.item.produk.barang_nama} gagal ditambahkan`);
}

完整的混乱

const checkIsBarangExists = await findBarang(itemSourceDetail.item.produk.barang_nama);

if (checkIsBarangExists) {
    const jumlah = checkIsBarangExists.metadata.sourceTransferAmout + checkIsBarangExists.metadata.sourceIsiJual;
    // Create unit definition between item source and destination
    const convertSourceUnitToDestination = Math.ceil(checkIsBarangExists.metadata.destinationRate * jumlah);

    // Get humanable stok unit
    const humanSource = await humanable({
        barangId: checkIsBarangExists.metadata.sourceBarangId,
        gudangId: Number(gudangId),
        jumlah: jumlah,
    });

    const humanDestination = await humanable({
        barangId: checkIsBarangExists.transfer_detail.barang_id,
        gudangId: Number(checkIsBarangExists.transfer_ke),
        jumlah: convertSourceUnitToDestination,
    });

    const updateData = {
        "metadata.sourceTransferAmout": jumlah,
        "metadata.humanSource": humanSource,
        "transfer_detail.jumlah_transfer": convertSourceUnitToDestination,
        "transfer_detail.humanDestination": humanDestination,
    };

    const updated = await updateTransfer(checkIsBarangExists.id, updateData);
    if (updated) {
        mutate("/dexie/get-all-current-transfer");
        addToast("success", "bottom-left", "Berhasil", `${checkIsBarangExists.metadata.sourceBarangNama} berhasil diupdate`);
    } else {
        addToast("error", "bottom-left", "Gagal", `${checkIsBarangExists.metadata.sourceBarangNama} gagal diupdate`);
    }
} else {
    const itemDestinationDetail = await getDetailItemByProdukId(data.item.produk_id, values.transferKe);

    // Create unit definition between item source and destination
    const destinationKey = [itemDestinationDetail.satuan_jual_level_1 || 0, itemDestinationDetail.satuan_jual_level_2 || 0, itemDestinationDetail.satuan_jual_level_3 || 0, itemDestinationDetail.satuan_jual_level_4 || 0].filter(
        (x) => x !== 0
    );
    const destinationValue = [itemDestinationDetail.isi_jual_level_1 || 0, itemDestinationDetail.isi_jual_level_2 || 0, itemDestinationDetail.isi_jual_level_3 || 0, itemDestinationDetail.isi_jual_level_4 || 0].filter((x) => x !== 0);
    const destinationUnits = createObjectFromArray(destinationKey, destinationValue);

    const sourceKey = [itemSourceDetail.item.satuan_jual_level_1 || 0, itemSourceDetail.item.satuan_jual_level_2 || 0, itemSourceDetail.item.satuan_jual_level_3 || 0, itemSourceDetail.item.satuan_jual_level_4 || 0].filter((x) => x !== 0);
    const sourceValue = [itemSourceDetail.item.isi_jual_level_1 || 0, itemSourceDetail.item.isi_jual_level_2 || 0, itemSourceDetail.item.isi_jual_level_3 || 0, itemSourceDetail.item.isi_jual_level_4 || 0].filter((x) => x !== 0);
    const sourceUnits = createObjectFromArray(sourceKey, sourceValue);

    // Ambil isi jual
    var isiJualAsal, isiJualTujuan;
    if (sourceUnits[itemDestinationDetail.satuan_beli_local]) {
        isiJualAsal = sourceUnits[itemSourceDetail.item.satuan_jual_level_1];
        isiJualTujuan = destinationUnits[itemSourceDetail.item.satuan_jual_level_1];
    } else {
        isiJualAsal = sourceUnits[itemDestinationDetail.satuan_jual_level_1];
        isiJualTujuan = destinationUnits[itemDestinationDetail.satuan_jual_level_1];
    }

    // Get humanable stok unit
    const humanSource = await humanable({
        barangId: itemSourceDetail.item.barang_id,
        gudangId: Number(gudangId),
        jumlah: isiJualAsal,
    });

    const humanDestination = await humanable({
        barangId: itemDestinationDetail.barang_id,
        gudangId: Number(formData.transferKe),
        jumlah: isiJualTujuan,
    });

    const transferItem = {
        no_transfer: values.noTransfer,
        transfer_dari: gudangId,
        transfer_ke: values.transferKe,
        transfer_status: TRANSFER_STATUS.PENDING,
        transportasi_id: values.transportasiId,
        pengirim: values.pengirim,
        metadata: {
            sourceUserId: app.user.userId,
            sourceGudangId: gudangId,
            sourceBarangNama: itemSourceDetail.item.produk.barang_nama,
            sourceTransferAmout: isiJualAsal,
            sourceProdukId: itemSourceDetail.item.produk_id,
            sourceBarangId: itemSourceDetail.item.barang_id,
            sourceIsiJual: isiJualAsal,
            destinationRate: isiJualTujuan,
            humanSource,
        },
        transfer_detail: {
            no_transfer: values.noTransfer,
            barang_id: itemDestinationDetail.barang_id,
            produk_id: itemDestinationDetail.produk_id,
            jumlah_transfer: isiJualTujuan,
            humanDestination,
        },
    };

    const created = await createTransfer(transferItem);
    if (created) {
        mutate("/dexie/get-all-current-transfer");
        addToast("success", "bottom-left", "Berhasil", `${itemSourceDetail.item.produk.barang_nama} berhasil ditambahkan`);
    } else {
        addToast("error", "bottom-left", "Gagal", `${itemSourceDetail.item.produk.barang_nama} gagal ditambahkan`);
    }
}

此代码是系统的 至关重要的部分 ,可促进项目在不同仓库位置之间的转移。它有效地处理了项目的存在检查,单位之间的转换和数据库操作,以确保光滑,准确的项目传输过程。


您如何看待,这是一个非常令人印象深刻的工作, SpongeBob ,他的想象力 。这是“ The Art Of Mess Code

的一个例子

我是一个Software Freestyle Engineer,这个标题不仅是一个笑话,这是我的职业道路和心态,总是认为与他人的想法相反。

您对奇怪的事情而不是虚构的故事感兴趣,而是真实的故事?跟随我,得到有趣的事情,这些事情可能会激发您对某事的思考和观点的灵感。

跟随我