package handler import ( "net/http" "github.com/gin-gonic/gin" "gorm.io/gorm" "github.com/wangjia/jiu/backend/internal/middleware" "github.com/wangjia/jiu/backend/internal/model" "github.com/wangjia/jiu/backend/internal/util" ) type NumberRuleHandler struct { db *gorm.DB } func NewNumberRuleHandler(db *gorm.DB) *NumberRuleHandler { return &NumberRuleHandler{db: db} } var defaultRules = []struct { Type string Prefix string Mode string DateFormat string }{ {"stock_in", "RK", "date_seq", "YYYYMMDD"}, {"stock_out", "CK", "date_seq", "YYYYMMDD"}, {"inventory_check", "PD", "date_seq", "YYYYMMDD"}, {"product", "SP", "seq", "YYYYMMDD"}, } // List GET /api/v1/number-rules func (h *NumberRuleHandler) List(c *gin.Context) { shopID := middleware.GetShopID(c) rules := make([]model.NumberRule, 0) h.db.Where("shop_id = ?", shopID).Order("id").Find(&rules) if len(rules) == 0 { for _, d := range defaultRules { r := model.NumberRule{ShopID: shopID, Type: d.Type, Prefix: d.Prefix, Mode: d.Mode, DateFormat: d.DateFormat} h.db.Create(&r) rules = append(rules, r) } } util.RespondSuccess(c, rules) } // Update PUT /api/v1/number-rules/:id func (h *NumberRuleHandler) Update(c *gin.Context) { shopID := middleware.GetShopID(c) id := c.Param("id") var rule model.NumberRule if err := h.db.Where("id = ? AND shop_id = ?", id, shopID).First(&rule).Error; err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "not found"}) return } var req struct { Prefix string `json:"prefix"` Mode string `json:"mode"` CurrentNo *int `json:"current_no"` DateFormat string `json:"date_format"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 当前序号只能调大、不能调小(防止单号重复) if req.CurrentNo != nil && *req.CurrentNo < rule.CurrentNo { c.JSON(http.StatusBadRequest, gin.H{"error": "当前序号只能调大,不能调小(防止单号重复)"}) return } // 模式仅允许 date_seq / seq if req.Mode != "" && req.Mode != "date_seq" && req.Mode != "seq" { c.JSON(http.StatusBadRequest, gin.H{"error": "模式只能是 date_seq 或 seq"}) return } updates := map[string]any{} if req.Prefix != "" { updates["prefix"] = req.Prefix } if req.Mode != "" { updates["mode"] = req.Mode } if req.CurrentNo != nil { updates["current_no"] = *req.CurrentNo } if req.DateFormat != "" { updates["date_format"] = req.DateFormat } if err := h.db.Model(&rule).Updates(updates).Error; err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } util.RespondSuccess(c, rule) }