fix(backend): 架构质量改进批次三 (#41-44)

- #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 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-11 08:21:42 +08:00
parent 3ab78dbf7a
commit f928d5c6a3
6 changed files with 28 additions and 11 deletions
+8 -2
View File
@@ -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 }
+2 -3
View File
@@ -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
}
+2
View File
@@ -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)
+5 -4
View File
@@ -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{