Files
customer-server/controller/product_controller.go
2026-03-14 10:02:49 +08:00

97 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Package controller - 产品控制器
// 功能:产品的增删改查、导入/导出ZIP、绑定/解绑客服账号
package controller
import (
"context"
"customer-server/model/dto"
"customer-server/service"
"gitea.com/red-future/common/beans"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
)
var Product = new(product)
type product struct{}
// Add 添加产品
// 参数: req - 添加产品请求,包含产品名称、描述、价格等信息
// 返回: res - 添加成功后的产品ID等信息
// 功能: 创建新产品记录并同步到RAGFlow知识库
func (c *product) Add(ctx context.Context, req *dto.AddProductReq) (res *dto.AddProductRes, err error) {
res, err = service.Product.Add(ctx, req)
return
}
// Update 更新产品
// 参数: req - 更新产品请求包含产品ID和待更新字段
// 返回: res - 空响应成功则err为nil
// 功能: 更新产品信息并同步到RAGFlow
func (c *product) Update(ctx context.Context, req *dto.UpdateProductReq) (res *beans.ResponseEmpty, err error) {
err = service.Product.Update(ctx, req)
return
}
// Delete 删除产品
// 参数: req - 删除产品请求包含产品ID
// 返回: res - 空响应成功则err为nil
// 功能: 逻辑删除产品记录并从RAGFlow移除
func (c *product) Delete(ctx context.Context, req *dto.DeleteProductReq) (res *beans.ResponseEmpty, err error) {
err = service.Product.Delete(ctx, req)
return
}
// List 获取产品列表
// 参数: req - 列表查询请求,支持分页、关键词搜索
// 返回: res - 产品列表及分页信息
// 功能: 分页查询产品记录,支持按名称、描述搜索
func (c *product) List(ctx context.Context, req *dto.ListProductReq) (res *dto.ListProductRes, err error) {
res, err = service.Product.List(ctx, req)
return
}
// Export 导出产品为ZIP文件
// 参数: req - 导出请求,包含筛选条件
// 返回: res - 空响应直接写入Response流
// 功能: 将产品数据导出为ZIP文件包含JSON数据
func (c *product) Export(ctx context.Context, req *dto.ExportProductReq) (res *dto.ExportProductRes, err error) {
// 调用Service层导出
zipData, filename, err := service.Product.Export(ctx, req)
if err != nil {
return nil, err
}
// 获取原始 Response 对象以设置响应头和写入文件
r := g.RequestFromCtx(ctx)
// 设置响应头为文件下载
r.Response.Header().Set("Content-Type", "application/zip")
r.Response.Header().Set("Content-Disposition", "attachment; filename=\""+filename+"\"")
r.Response.Header().Set("Content-Length", gconv.String(len(zipData)))
// 写入 ZIP 数据
r.Response.Write(zipData)
return
}
// Import 导入产品从ZIP文件
// 参数: req - 导入请求实际从multipart/form-data获取文件
// 返回: res - 导入结果,包含成功和失败数量
// 功能: 从ZIP文件批量导入产品数据并同步到RAGFlow
func (c *product) Import(ctx context.Context, req *dto.ImportProductReq) (res *dto.ImportProductRes, err error) {
r := g.RequestFromCtx(ctx)
// 获取上传的文件(虽然 req 中定义了 File但实际需要从 Request 中获取)
file := r.GetUploadFile("file")
if file == nil {
return nil, gerror.New("请上传ZIP文件")
}
// 调用 Service 层处理导入(传递 FileHeader
res, err = service.Product.Import(ctx, file.FileHeader)
return
}