From f928d5c6a39ca1e38b2157a21b7930045ecdea9d Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Thu, 11 Jun 2026 08:21:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(backend):=20=E6=9E=B6=E6=9E=84=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=E6=94=B9=E8=BF=9B=E6=89=B9=E6=AC=A1=E4=B8=89=20(#41-4?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - #41 CheckInventoryAvailability Scan 加错误检查,DB 故障不再误报库存不足 - #42 finance ListRecords 和 inventory Logs 补加 pageSize 上限(500) - #43 ReconcileInventory 两条 Scan 加错误检查,DB 故障返回 500 而非误导性空结果 - #44 license Info 改用 CountDevices(licenseID) 统计当前 license 绑定数,修复跨 license 计数偏差 Co-Authored-By: Claude Sonnet 4.6 --- backend/internal/handler/admin.go | 10 ++++++++-- backend/internal/handler/finance.go | 5 ++--- backend/internal/handler/inventory.go | 2 ++ backend/internal/handler/license.go | 9 +++++---- backend/internal/service/license.go | 7 +++++++ backend/internal/service/stock.go | 6 ++++-- 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/backend/internal/handler/admin.go b/backend/internal/handler/admin.go index 882102d..d84b881 100644 --- a/backend/internal/handler/admin.go +++ b/backend/internal/handler/admin.go @@ -119,8 +119,14 @@ func (h *AdminHandler) ReconcileInventory(c *gin.Context) { var invRows []invRow var logRows []logRow - invQuery.Scan(&invRows) - logQuery.Scan(&logRows) + if err := invQuery.Scan(&invRows).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "inventory query failed: " + err.Error()}) + return + } + if err := logQuery.Scan(&logRows).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "log query failed: " + err.Error()}) + return + } // 合并为 map 再求差 type key struct{ S, W, P uint64 } diff --git a/backend/internal/handler/finance.go b/backend/internal/handler/finance.go index 5294b08..25c939a 100644 --- a/backend/internal/handler/finance.go +++ b/backend/internal/handler/finance.go @@ -9,6 +9,7 @@ import ( "github.com/wangjia/jiu/backend/internal/middleware" "github.com/wangjia/jiu/backend/internal/model" + "github.com/wangjia/jiu/backend/internal/util" ) type FinanceHandler struct { @@ -33,9 +34,7 @@ func (h *FinanceHandler) ListRecords(c *gin.Context) { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } - if q.PageSize <= 0 { - q.PageSize = 50 - } + q.PageSize = util.ValidatePageSize(q.PageSize, 50, 500) if q.Page <= 0 { q.Page = 1 } diff --git a/backend/internal/handler/inventory.go b/backend/internal/handler/inventory.go index 42ef213..1e6bcb0 100644 --- a/backend/internal/handler/inventory.go +++ b/backend/internal/handler/inventory.go @@ -10,6 +10,7 @@ import ( "github.com/wangjia/jiu/backend/internal/middleware" "github.com/wangjia/jiu/backend/internal/model" + "github.com/wangjia/jiu/backend/internal/util" ) type InventoryHandler struct { @@ -128,6 +129,7 @@ func (h *InventoryHandler) Logs(c *gin.Context) { shopID := middleware.GetShopID(c) page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) + pageSize = util.ValidatePageSize(pageSize, 20, 500) query := h.db.Model(&model.InventoryLog{}).Where("shop_id = ?", shopID) diff --git a/backend/internal/handler/license.go b/backend/internal/handler/license.go index 9221ad3..52d3f93 100644 --- a/backend/internal/handler/license.go +++ b/backend/internal/handler/license.go @@ -64,10 +64,11 @@ func (h *LicenseHandler) Info(c *gin.Context) { return } - var deviceCount int64 - // count active devices for this shop - devs, _ := h.svc.ListDevices(shopID) - deviceCount = int64(len(devs)) + deviceCount, err := h.svc.CountDevices(lic.ID) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } phase := middleware.CalcLicensePhase(lic.ExpiresAt) c.JSON(http.StatusOK, gin.H{"data": gin.H{ diff --git a/backend/internal/service/license.go b/backend/internal/service/license.go index bdaf88a..51fe199 100644 --- a/backend/internal/service/license.go +++ b/backend/internal/service/license.go @@ -118,6 +118,13 @@ func (s *LicenseService) ShopInfo(shopID uint64) (*model.License, error) { return &lic, nil } +// CountDevices 返回指定 license 下已绑定设备数。 +func (s *LicenseService) CountDevices(licenseID uint64) (int64, error) { + var count int64 + err := s.db.Model(&model.LicenseDevice{}).Where("license_id = ?", licenseID).Count(&count).Error + return count, err +} + // ListDevices 列出许可证下所有已绑定设备。 func (s *LicenseService) ListDevices(shopID uint64) ([]model.LicenseDevice, error) { var devs []model.LicenseDevice diff --git a/backend/internal/service/stock.go b/backend/internal/service/stock.go index 8607f33..eeca154 100644 --- a/backend/internal/service/stock.go +++ b/backend/internal/service/stock.go @@ -305,11 +305,13 @@ func (s *StockService) CheckInventoryAvailability(shopID, warehouseID uint64, it Total float64 } var sums []inventorySum - s.db.Model(&model.Inventory{}). + if err := s.db.Model(&model.Inventory{}). Select("product_id, COALESCE(SUM(quantity), 0) AS total"). Where("shop_id = ? AND warehouse_id = ? AND product_id IN ? AND deleted_at IS NULL", shopID, warehouseID, productIDs). - Group("product_id").Scan(&sums) + Group("product_id").Scan(&sums).Error; err != nil { + return err + } sumMap := make(map[uint64]float64, len(sums)) for _, s := range sums {