首页 > 解决方案 > 如何在 Flutter/Firestore 中实现先进先出系统?

问题描述

我正在构建一个非常类似于库存管理系统的应用程序。我现在的障碍是firestore中允许的查询数量,因为它不允许多个.where()。

因此,使用库存管理系统概念,我们创建了一个集合:

我们将其称为“InventoryCollection”。假设它有3个字段:

- ItemID
- ItemName
- DateAdded

“InventoryCollection”中的每个文档都有一个名为“PurchaseHistory”的子集合:它具有以下字段:

- PurchaseID (auto generated document id)
- ItemID (from parent collection document)
- PurchaseDate
- Quantity

困境:如何使用先进先出的概念扣除物品的数量?因此,假设 Item1 有4 个PurchseHistory 数据。假设其中一个的数量为 0,因为它们已经售出。

- PurchaseID: 12340 
- ItemID: 00001
- PurchaseDate: 01-feb-2021
- Quantity: 0

- PurchaseID: 12341(auto generated document id)
- ItemID: 00001
- PurchaseDate: 02-feb-2021
- Quantity: 10

- PurchaseID: 12342
- ItemID: 00001
- PurchaseDate: 03-feb-2021
- Quantity: 5

- PurchaseID: 12343
- ItemID: 00001
- PurchaseDate: 03-feb-2021
- Quantity: 15

我需要找到一种方法来检索 PurchaseId 12341 以使用以下参数获取“First In”。然后我可以想办法自己做“先出”:

void _deductQuantity(String itemId, String PurchaseID {
  final itemCollection = FirebaseFirestore.instance.collection('InventoryCollection').doc(ItemId).collection('PurchaseHistory').doc(purchaseID);
  itemCollection.update({
    'Quantity':  _quantity - int.parse(_editItemQuantityController.text.trim()),
  });
}

在我看来,查询如下所示:

String purchaseIdStream;


   final docRef = FirebaseFirestore.instance.collection('InventoryCollection').doc(ItemId).collection('PurchaseHistory').doc();
    
    purchaseIdStream = await docRef
        .where('ItemId', isEqualTo: ItemId)
        .where('Quantity', isGreaterThan: 0)
        .orderBy('PurchaseDate')
        .get();
     var _id = purchaseIdStream.ref.documentID;

我完全理解,如果您在 .where 中没有用于购买的字段,firebase 不允许订购。所以绝对不可能在上面的代码上做到这一点。因为我已经有 2 个 where 和第 3 个 where 是不可能的。

我知道我必须进行服务器端过滤而不是多个 .where 但是,我只是前端开发人员。我对后端概念的理解非常有限。所以我需要关于如何在 dart/flutter 中实现这一点的糟糕指导。

任何建议将不胜感激。谢谢!

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


首先,该.where()属性仅用于CollectionReference,而不是DocumentReference。删除.doc(ItemId)in docRef。我认为它应该在那之后工作。

如果没有,请获取数据并手动对其进行排序,如下所示:

final purchaseIdList =
    await docRef.where('ItemId', isEqualTo: ItemId).where('Quantity', isGreaterThan: 0).get();
purchaseIdList.docs.sort((QueryDocumentSnapshot a, QueryDocumentSnapshot b) =>
    (a.data()['PurchaseHistory']['PurchaseDate'] as String)
        .compareTo(b.data()['PurchaseHistory']['PurchaseDate'] as String));
final fifoId = purchaseIdList.docs[0].get('PurchaseId');

如果我遗漏了什么,请告诉我。我会编辑答案。


推荐阅读