97 lines
3.4 KiB
Go
97 lines
3.4 KiB
Go
// 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
|
||
}
|