cockpit-source/backend/internal/api/import.go
2026-04-02 14:12:43 +08:00

151 lines
3.9 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 api
import (
"io"
"net/http"
"strconv"
"time"
"cockpit/internal/domain"
"cockpit/internal/importer"
"cockpit/internal/middleware"
"github.com/gin-gonic/gin"
)
func (h *Handler) ImportOrdersTemplate(c *gin.Context) {
b, err := importer.BuildOrdersTemplate()
if err != nil {
c.JSON(http.StatusInternalServerError, domain.Fail("生成模板失败:"+err.Error()))
return
}
c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
c.Header("Content-Disposition", "attachment; filename=\"orders.xlsx\"")
c.Writer.WriteHeader(http.StatusOK)
_, _ = c.Writer.Write(b)
}
func (h *Handler) ImportOrdersPreview(c *gin.Context) {
fh, err := c.FormFile("file")
if err != nil {
c.JSON(http.StatusBadRequest, domain.Fail("请上传文件form-data: file"))
return
}
file, err := fh.Open()
if err != nil {
c.JSON(http.StatusBadRequest, domain.Fail("文件打开失败"))
return
}
defer func() { _ = file.Close() }()
total, preview, errs, err := importer.ParseOrdersExcel(c.Request.Context(), h.db, file, 20)
if err != nil {
c.JSON(http.StatusBadRequest, domain.Fail("解析失败:"+err.Error()))
return
}
c.JSON(http.StatusOK, domain.OK(gin.H{
"totalRows": total,
"preview": preview,
"errors": errs,
"errorCount": len(errs),
}))
}
func (h *Handler) ImportOrdersCommit(c *gin.Context) {
uidAny, _ := c.Get(middleware.CtxUserIDKey)
uid, _ := uidAny.(uint64)
fh, err := c.FormFile("file")
if err != nil {
c.JSON(http.StatusBadRequest, domain.Fail("请上传文件form-data: file"))
return
}
file, err := fh.Open()
if err != nil {
c.JSON(http.StatusBadRequest, domain.Fail("文件打开失败"))
return
}
defer func() { _ = file.Close() }()
job, err := importer.CommitOrdersFromExcel(c.Request.Context(), h.db, file, uid, fh.Filename)
if err != nil {
c.JSON(http.StatusBadRequest, domain.Fail("导入失败:"+err.Error()))
return
}
c.JSON(http.StatusOK, domain.OK(job))
}
func (h *Handler) ImportOrdersJSON(c *gin.Context) {
uidAny, _ := c.Get(middleware.CtxUserIDKey)
uid, _ := uidAny.(uint64)
body, err := io.ReadAll(c.Request.Body)
if err != nil {
c.JSON(http.StatusBadRequest, domain.Fail("读取请求失败"))
return
}
job, err := importer.CommitOrdersFromJSON(c.Request.Context(), h.db, body, uid)
if err != nil {
c.JSON(http.StatusBadRequest, domain.Fail("导入失败:"+err.Error()))
return
}
c.JSON(http.StatusOK, domain.OK(job))
}
func (h *Handler) ImportJobs(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
if page < 1 {
page = 1
}
if size < 1 || size > 200 {
size = 20
}
q := h.db.Model(&domain.ImportJob{}).Where("type = ?", "orders")
var total int64
_ = q.Count(&total).Error
var list []domain.ImportJob
_ = q.Order("id DESC").Offset((page - 1) * size).Limit(size).Find(&list).Error
c.JSON(http.StatusOK, domain.OK(gin.H{
"list": list,
"total": total,
}))
}
func (h *Handler) ImportJobGet(c *gin.Context) {
id, _ := strconv.ParseUint(c.Param("id"), 10, 64)
var job domain.ImportJob
if err := h.db.Where("id = ?", id).First(&job).Error; err != nil {
c.JSON(http.StatusNotFound, domain.Fail("不存在"))
return
}
c.JSON(http.StatusOK, domain.OK(job))
}
func (h *Handler) ImportJobErrors(c *gin.Context) {
jobID, _ := strconv.ParseUint(c.Param("id"), 10, 64)
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
if page < 1 {
page = 1
}
if size < 1 || size > 200 {
size = 20
}
q := h.db.Model(&domain.ImportJobError{}).Where("job_id = ?", jobID)
var total int64
_ = q.Count(&total).Error
var list []domain.ImportJobError
_ = q.Order("id ASC").Offset((page - 1) * size).Limit(size).Find(&list).Error
c.JSON(http.StatusOK, domain.OK(gin.H{
"list": list,
"total": total,
"at": time.Now(),
}))
}