mirror of https://github.com/allinssl/allinssl
125 lines
2.5 KiB
Go
125 lines
2.5 KiB
Go
package monitor
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/tealeg/xlsx"
|
|
"io"
|
|
"mime/multipart"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
func ParseMonitorFile(fileHeader *multipart.FileHeader) ([]*Monitor, error) {
|
|
ext := strings.ToLower(filepath.Ext(fileHeader.Filename))
|
|
|
|
file, err := fileHeader.Open()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("无法打开文件: %v", err)
|
|
}
|
|
defer file.Close()
|
|
|
|
switch ext {
|
|
case ".csv", ".txt":
|
|
return parseCSV(file)
|
|
case ".json":
|
|
return parseJSON(file)
|
|
case ".xlsx":
|
|
return parseXLSX(file)
|
|
default:
|
|
return nil, fmt.Errorf("不支持的文件类型: %s", ext)
|
|
}
|
|
}
|
|
|
|
func parseCSV(reader io.Reader) ([]*Monitor, error) {
|
|
csvReader := csv.NewReader(reader)
|
|
var monitors []*Monitor
|
|
isHeader := true
|
|
|
|
for {
|
|
record, err := csvReader.Read()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
if err != nil {
|
|
return nil, fmt.Errorf("CSV 解析失败: %v", err)
|
|
}
|
|
|
|
if isHeader {
|
|
isHeader = false
|
|
continue
|
|
}
|
|
|
|
if len(record) < 8 {
|
|
continue
|
|
}
|
|
|
|
monitor := &Monitor{
|
|
Name: record[0],
|
|
Target: record[1],
|
|
MonitorType: record[2],
|
|
ReportTypes: record[3],
|
|
Cycle: record[4],
|
|
RepeatSendGap: record[5],
|
|
Active: record[6],
|
|
AdvanceDay: record[7],
|
|
}
|
|
monitors = append(monitors, monitor)
|
|
}
|
|
|
|
return monitors, nil
|
|
}
|
|
|
|
func parseJSON(reader io.Reader) ([]*Monitor, error) {
|
|
var monitors []*Monitor
|
|
err := json.NewDecoder(reader).Decode(&monitors)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("JSON 解析失败: %v", err)
|
|
}
|
|
return monitors, nil
|
|
}
|
|
|
|
func parseXLSX(file multipart.File) ([]*Monitor, error) {
|
|
var monitors []*Monitor
|
|
|
|
// 读取文件内容到内存
|
|
data, err := io.ReadAll(file)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 解析 XLSX 内容
|
|
xlFile, err := xlsx.OpenBinary(data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("解析 xlsx 失败: %v", err)
|
|
}
|
|
|
|
if len(xlFile.Sheets) == 0 {
|
|
return nil, fmt.Errorf("未找到工作表")
|
|
}
|
|
|
|
sheet := xlFile.Sheets[0]
|
|
for i, row := range sheet.Rows {
|
|
if i == 0 {
|
|
continue // 跳过表头
|
|
}
|
|
if len(row.Cells) < 8 {
|
|
continue
|
|
}
|
|
monitor := &Monitor{
|
|
Name: row.Cells[0].String(),
|
|
Target: row.Cells[1].String(),
|
|
MonitorType: row.Cells[2].String(),
|
|
ReportTypes: row.Cells[3].String(),
|
|
Cycle: row.Cells[4].String(),
|
|
RepeatSendGap: row.Cells[5].String(),
|
|
Active: row.Cells[6].String(),
|
|
AdvanceDay: row.Cells[7].String(),
|
|
}
|
|
monitors = append(monitors, monitor)
|
|
}
|
|
|
|
return monitors, nil
|
|
}
|