154 lines
4.2 KiB
Go
154 lines
4.2 KiB
Go
// Package handlers 实现单元格相关的API请求处理器
|
||
package handlers
|
||
|
||
import (
|
||
"excel-api/models"
|
||
"excel-api/utils"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// CellRequest 单元格更新请求结构体
|
||
type CellRequest struct {
|
||
Row int `json:"row" binding:"required"` // 行号(0-based),必填
|
||
Col int `json:"col" binding:"required"` // 列号(0-based),必填
|
||
CellType string `json:"cellType"` // 单元格类型
|
||
Value string `json:"value"` // 文本值
|
||
Formula string `json:"formula"` // 公式表达式
|
||
FileURL string `json:"fileUrl"` // 文件URL
|
||
FileName string `json:"fileName"` // 文件名
|
||
FileSize int64 `json:"fileSize"` // 文件大小
|
||
MimeType string `json:"mimeType"` // MIME类型
|
||
}
|
||
|
||
// GetCells 获取工作表的单元格数据
|
||
// 请求方式: GET
|
||
// 路径: /api/sheets/:id/cells
|
||
// 路径参数: id - 工作表ID
|
||
// 查询参数: row(起始行), col(起始列), endRow(结束行), endCol(结束列)
|
||
func GetCells(c *gin.Context) {
|
||
id := c.Param("id")
|
||
|
||
// 验证工作表是否存在
|
||
var sheet models.Sheet
|
||
if result := models.DB.First(&sheet, id); result.Error != nil {
|
||
utils.Error(c, 404, "工作表不存在")
|
||
return
|
||
}
|
||
|
||
// 获取查询参数(可选范围查询)
|
||
query := models.DB.Where("sheet_id = ?", id)
|
||
|
||
// 如果提供了范围参数,则按范围过滤
|
||
if row := c.Query("row"); row != "" {
|
||
query = query.Where("row >= ?", row)
|
||
}
|
||
if col := c.Query("col"); col != "" {
|
||
query = query.Where("col >= ?", col)
|
||
}
|
||
if endRow := c.Query("endRow"); endRow != "" {
|
||
query = query.Where("row <= ?", endRow)
|
||
}
|
||
if endCol := c.Query("endCol"); endCol != "" {
|
||
query = query.Where("col <= ?", endCol)
|
||
}
|
||
|
||
var cells []models.Cell
|
||
result := query.Find(&cells)
|
||
if result.Error != nil {
|
||
utils.Error(c, 500, "查询单元格数据失败")
|
||
return
|
||
}
|
||
|
||
utils.Success(c, cells)
|
||
}
|
||
|
||
// BatchUpdateCells 批量更新单元格数据
|
||
// 请求方式: POST
|
||
// 路径: /api/sheets/:id/cells
|
||
// 路径参数: id - 工作表ID
|
||
// 请求体: { "cells": [{ "row": 0, "col": 0, "value": "Hello" }, ...] }
|
||
func BatchUpdateCells(c *gin.Context) {
|
||
id := c.Param("id")
|
||
|
||
// 验证工作表是否存在
|
||
var sheet models.Sheet
|
||
if result := models.DB.First(&sheet, id); result.Error != nil {
|
||
utils.Error(c, 404, "工作表不存在")
|
||
return
|
||
}
|
||
|
||
var req struct {
|
||
Cells []CellRequest `json:"cells" binding:"required"` // 单元格更新列表,必填
|
||
}
|
||
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
utils.Error(c, 400, "参数错误: "+err.Error())
|
||
return
|
||
}
|
||
|
||
// 使用事务批量更新单元格
|
||
tx := models.DB.Begin()
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
tx.Rollback()
|
||
}
|
||
}()
|
||
|
||
for _, cellReq := range req.Cells {
|
||
// 查找已存在的单元格
|
||
var cell models.Cell
|
||
result := tx.Where("sheet_id = ? AND row = ? AND col = ?", id, cellReq.Row, cellReq.Col).First(&cell)
|
||
|
||
if result.Error != nil {
|
||
// 单元格不存在,创建新记录
|
||
cell = models.Cell{
|
||
SheetID: sheet.ID,
|
||
Row: cellReq.Row,
|
||
Col: cellReq.Col,
|
||
CellType: cellReq.CellType,
|
||
Value: cellReq.Value,
|
||
Formula: cellReq.Formula,
|
||
FileURL: cellReq.FileURL,
|
||
FileName: cellReq.FileName,
|
||
FileSize: cellReq.FileSize,
|
||
MimeType: cellReq.MimeType,
|
||
}
|
||
// 设置默认类型
|
||
if cell.CellType == "" {
|
||
cell.CellType = "text"
|
||
}
|
||
if err := tx.Create(&cell).Error; err != nil {
|
||
tx.Rollback()
|
||
utils.Error(c, 500, "创建单元格失败")
|
||
return
|
||
}
|
||
} else {
|
||
// 单元格已存在,更新字段
|
||
if cellReq.CellType != "" {
|
||
cell.CellType = cellReq.CellType
|
||
}
|
||
cell.Value = cellReq.Value
|
||
cell.Formula = cellReq.Formula
|
||
cell.FileURL = cellReq.FileURL
|
||
cell.FileName = cellReq.FileName
|
||
cell.FileSize = cellReq.FileSize
|
||
cell.MimeType = cellReq.MimeType
|
||
|
||
if err := tx.Save(&cell).Error; err != nil {
|
||
tx.Rollback()
|
||
utils.Error(c, 500, "更新单元格失败")
|
||
return
|
||
}
|
||
}
|
||
}
|
||
|
||
// 提交事务
|
||
if err := tx.Commit().Error; err != nil {
|
||
utils.Error(c, 500, "提交事务失败")
|
||
return
|
||
}
|
||
|
||
utils.SuccessWithMessage(c, "批量更新单元格成功", nil)
|
||
}
|