You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter实现商品库存逻辑:存在则更新库存,不存在则新增

问题分析

你的代码存在几个关键问题导致重复创建文档:

  1. 集合名称不一致:查询时用了productstoc,但实际操作的目标集合是productstock,导致查询不到已有匹配数据,误触发新增逻辑。
  2. 更新操作错误:调用updateStock.doc()会生成新的文档ID,而非更新找到的匹配文档本身。
  3. 逻辑冗余与缺失:where条件已经过滤出完全匹配的文档,无需重复判断;同时未处理查询结果为空(无匹配商品)的场景。
修正后的代码实现

以下是符合需求的代码,可实现"存在匹配商品则更新库存,不存在则新增"的逻辑:

// 统一目标集合引用,避免名称错误
final userStockCollection = FirebaseFirestore.instance
    .collection('users')
    .doc(user?.uid)
    .collection('productstock');

// 查询三个字段完全匹配的商品
userStockCollection
    .where('productname', isEqualTo: productName)
    .where('productcategory', isEqualTo: productCategory)
    .where('productcode', isEqualTo: produtcCode) // 注意:变量名produtcCode存在拼写错误,建议改为productCode
    .get()
    .then((querySnapshot) {
  if (querySnapshot.docs.isNotEmpty) {
    // 存在匹配商品,更新第一个匹配文档的库存(假设三字段组合唯一)
    final existingDoc = querySnapshot.docs.first;
    final currentStock = existingDoc['stockamount'] as int;
    userStockCollection.doc(existingDoc.id).update({
      'stockamount': currentStock + amount,
    });
  } else {
    // 无匹配商品,创建新文档
    userStockCollection.doc().set({
      'productname': productName,
      'productcategory': productCategory,
      'productcode': produtcCode,
      'stockamount': amount,
    });
  }
}).catchError((error) {
  // 处理查询或写入过程中的错误
  print('商品操作失败: $error');
});
额外优化建议
  • 修正变量名:produtcCode拼写错误,建议改为productCode,避免后续逻辑出现隐性问题。
  • 创建复合索引:如果要确保productname+productcategory+productcode的组合绝对唯一,建议在Firebase控制台为这三个字段创建复合索引,提升查询效率的同时避免数据不一致。
  • 类型安全校验:确保stockamount始终为数字类型(int/double),避免运算时出现类型转换错误。

内容的提问来源于stack exchange,提问作者DaBay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:07:08