package controllers import ( "net/http" "strconv" "github.com/gin-gonic/gin" "git.beifan.cn/trace-system/backend-go/models" "git.beifan.cn/trace-system/backend-go/services" ) // ProductTracesController 产品溯源控制器 type ProductTracesController struct { productTracesService services.ProductTracesService } // NewProductTracesController 创建产品溯源控制器实例 func NewProductTracesController() *ProductTracesController { return &ProductTracesController{ productTracesService: services.ProductTracesService{}, } } // Create 创建产品溯源 func (c *ProductTracesController) Create(ctx *gin.Context) { userModel, ok := GetCurrentUser(ctx) if !ok { return } var dto models.CreateProductTraceDTO if !BindJSON(ctx, &dto) { return } trace, err := c.productTracesService.Create(dto, userModel.ID) if err != nil { ErrorResponse(ctx, http.StatusBadRequest, err.Error()) return } SuccessResponse(ctx, "产品溯源创建成功", gin.H{ "trace": trace, }) } // FindAll 获取产品溯源列表 func (c *ProductTracesController) FindAll(ctx *gin.Context) { page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1")) limit, _ := strconv.Atoi(ctx.DefaultQuery("limit", "20")) search := ctx.DefaultQuery("search", "") traces, total, totalPages, err := c.productTracesService.FindAll(page, limit, search) if err != nil { ErrorResponse(ctx, http.StatusInternalServerError, err.Error()) return } SuccessResponse(ctx, "获取产品溯源列表成功", gin.H{ "data": traces, "pagination": gin.H{ "page": page, "limit": limit, "total": total, "totalPages": totalPages, }, }) } // FindOne 获取产品溯源详情 func (c *ProductTracesController) FindOne(ctx *gin.Context) { serialNumber := ctx.Param("serialNumber") trace, err := c.productTracesService.FindOne(serialNumber) if err != nil { ErrorResponse(ctx, http.StatusNotFound, err.Error()) return } SuccessResponse(ctx, "查询成功", gin.H{ "trace": trace, }) } // Update 更新产品溯源 func (c *ProductTracesController) Update(ctx *gin.Context) { serialNumber := ctx.Param("serialNumber") var dto models.UpdateProductTraceDTO if !BindJSON(ctx, &dto) { return } trace, err := c.productTracesService.Update(serialNumber, dto) if err != nil { ErrorResponse(ctx, http.StatusBadRequest, err.Error()) return } SuccessResponse(ctx, "产品溯源更新成功", gin.H{ "trace": trace, }) } // PublicQuery 公开查询产品溯源 func (c *ProductTracesController) PublicQuery(ctx *gin.Context) { serialNumber := ctx.Param("serialNumber") trace, err := c.productTracesService.PublicQuery(serialNumber) if err != nil { ErrorResponse(ctx, http.StatusNotFound, err.Error()) return } SuccessResponse(ctx, "查询成功", gin.H{ "trace": trace, }) } // GenerateQRCode 生成产品溯源二维码 func (c *ProductTracesController) GenerateQRCode(ctx *gin.Context) { serialNumber := ctx.Param("serialNumber") var qrCodeData models.QRCodeDTO if !BindJSON(ctx, &qrCodeData) { return } protocol := "http" if ctx.Request.TLS != nil { protocol = "https" } qrCodeBase64, queryURL, err := c.productTracesService.GenerateQRCode( serialNumber, qrCodeData.BaseUrl, ctx.Request.Host, protocol, ) if err != nil { ErrorResponse(ctx, http.StatusBadRequest, err.Error()) return } SuccessResponse(ctx, "二维码生成成功", gin.H{ "qrCodeData": qrCodeBase64, "queryUrl": queryURL, }) } // UploadWechatQRCode 上传公众号二维码 func (c *ProductTracesController) UploadWechatQRCode(ctx *gin.Context) { serialNumber := ctx.Param("serialNumber") fileHeader, err := ctx.FormFile("file") if err != nil { ErrorResponse(ctx, http.StatusBadRequest, "请选择公众号二维码图片") return } trace, err := c.productTracesService.UploadWechatQRCode(serialNumber, fileHeader) if err != nil { ErrorResponse(ctx, http.StatusBadRequest, err.Error()) return } SuccessResponse(ctx, "公众号二维码上传成功", gin.H{ "trace": trace, }) } // Revoke 停用产品溯源 func (c *ProductTracesController) Revoke(ctx *gin.Context) { serialNumber := ctx.Param("serialNumber") trace, err := c.productTracesService.Revoke(serialNumber) if err != nil { ErrorResponse(ctx, http.StatusBadRequest, err.Error()) return } SuccessResponse(ctx, "产品溯源已停用", gin.H{ "trace": trace, }) } // Delete 删除产品溯源 func (c *ProductTracesController) Delete(ctx *gin.Context) { serialNumber := ctx.Param("serialNumber") if err := c.productTracesService.Delete(serialNumber); err != nil { ErrorResponse(ctx, http.StatusBadRequest, err.Error()) return } SuccessResponse(ctx, "产品溯源删除成功") }