Files
backend-go/controllers/product_traces_controller.go
T
2026-06-05 17:21:06 +08:00

198 lines
4.6 KiB
Go

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, "产品溯源删除成功")
}