337 lines
8.8 KiB
Go
337 lines
8.8 KiB
Go
package sqLite
|
||
|
||
import (
|
||
"database/sql"
|
||
"errors"
|
||
"fmt"
|
||
"planA/initialization/golabl"
|
||
"planA/tool"
|
||
sqLiteType "planA/type/sqLite"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// CreateTaskExportTab 创建task_export表
|
||
// @return error 错误信息
|
||
func CreateTaskExportTab() error {
|
||
createTableSQL := `
|
||
CREATE TABLE IF NOT EXISTS task_export (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
user_id VARCHAR(100) NOT NULL,
|
||
shop_id VARCHAR(100) NOT NULL,
|
||
task_id VARCHAR(100) NOT NULL,
|
||
shop_name VARCHAR(100) NOT NULL,
|
||
file_url VARCHAR(300),
|
||
status INTEGER NOT NULL DEFAULT 0,
|
||
total INTEGER NOT NULL DEFAULT 0,
|
||
complete_at DATETIME,
|
||
create_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_task_id ON task_export(task_id);
|
||
CREATE INDEX IF NOT EXISTS idx_status ON task_export(status);
|
||
CREATE INDEX IF NOT EXISTS idx_create_at ON task_export(create_at);
|
||
`
|
||
_, err := golabl.SqliteDb.Exec(createTableSQL)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// CreateTaskExport 向task_export表插入一条记录
|
||
// @param export TaskExport 要插入的导出记录
|
||
// @return int64 插入记录的自增ID
|
||
// @return error 错误信息
|
||
func CreateTaskExport(export sqLiteType.TaskExport) (int64, error) {
|
||
// 在 Go 代码中计算当前时间
|
||
currentTime := time.Now().Format("2006-01-02 15:04:05")
|
||
|
||
insertSQL := `INSERT INTO task_export (user_id, shop_id, task_id, shop_name, file_url, status,total,create_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
|
||
result, err := golabl.SqliteDb.Exec(
|
||
insertSQL,
|
||
export.UserID, // user_id
|
||
export.ShopID, // shop_id
|
||
export.TaskID, // task_id
|
||
export.ShopName, // shop_name
|
||
export.FileUrl, // file_url(允许空字符串)
|
||
export.Status, // status
|
||
export.Total, // total
|
||
currentTime,
|
||
)
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
// 获取插入记录的自增ID(SQLite中LastInsertId()返回rowid)
|
||
insertID, err := result.LastInsertId()
|
||
if err != nil {
|
||
return 0, err // 获取ID失败返回0和错误
|
||
}
|
||
|
||
return insertID, nil // 成功返回自增ID和nil
|
||
}
|
||
|
||
// UpdateTaskExportStatus 更新task_export表中的status字段
|
||
// @param taskId string 任务Id
|
||
// @param status int64 状态
|
||
// @param fullPath string 文件路径
|
||
// @return error 错误信息
|
||
func UpdateTaskExportStatus(taskId string, status int64, fullPath string) error {
|
||
var err error
|
||
if status == 2 {
|
||
// 当status=2时,同时更新status、complete_at和file_url字段
|
||
_, err = golabl.SqliteDb.Exec(
|
||
"UPDATE task_export SET status = ?, complete_at = ?, file_url = ? WHERE task_id = ?",
|
||
status,
|
||
time.Now().Format("2006-01-02 15:04:05"), // 设置为当前系统时间
|
||
fullPath,
|
||
taskId,
|
||
)
|
||
} else {
|
||
// 其他状态只更新status字段
|
||
_, err = golabl.SqliteDb.Exec(
|
||
"UPDATE task_export SET status = ? WHERE task_id = ?",
|
||
status,
|
||
taskId,
|
||
)
|
||
}
|
||
return err
|
||
}
|
||
|
||
// GetTaskExportsList 分页查询task_export表记录(无查询条件)
|
||
// @param page 页码(从1开始)
|
||
// @param pageSize 每页条数
|
||
// @param userId 用户ID
|
||
// @return []TaskExport 记录列表
|
||
// @return int64 总记录数
|
||
// @return error 错误信息
|
||
func GetTaskExportsList(page, pageSize int, userId string) ([]sqLiteType.TaskExport, int64, error) {
|
||
// 参数校验
|
||
pageSize, offset := tool.GetPage(page, pageSize)
|
||
|
||
// 构建查询条件(当前为空)
|
||
var conditions []string
|
||
var args []interface{}
|
||
|
||
// 如果userId不为空,则添加用户ID条件
|
||
if userId != "" {
|
||
conditions = append(conditions, "user_id = ?")
|
||
args = append(args, userId)
|
||
}
|
||
|
||
// 构建 WHERE子句
|
||
whereClause := ""
|
||
if len(conditions) > 0 {
|
||
whereClause = "WHERE " + strings.Join(conditions, " AND ")
|
||
}
|
||
|
||
// 查询总数
|
||
var total int64
|
||
countSQL := fmt.Sprintf(`SELECT COUNT(*) FROM task_export %s`, whereClause)
|
||
|
||
var countErr error
|
||
if len(args) > 0 {
|
||
countErr = golabl.SqliteDb.QueryRow(countSQL, args...).Scan(&total)
|
||
} else {
|
||
countErr = golabl.SqliteDb.QueryRow(countSQL).Scan(&total)
|
||
}
|
||
|
||
if countErr != nil {
|
||
return nil, 0, fmt.Errorf("查询总数失败: %v", countErr)
|
||
}
|
||
|
||
// 分页查询
|
||
querySQL := fmt.Sprintf(`
|
||
SELECT id, user_id, task_id, shop_name, file_url, status, total, complete_at, create_at
|
||
FROM task_export
|
||
%s
|
||
ORDER BY create_at DESC
|
||
LIMIT ? OFFSET ?
|
||
`, whereClause)
|
||
// 添加分页参数到args
|
||
queryArgs := append(args, pageSize, offset)
|
||
|
||
rows, err := golabl.SqliteDb.Query(querySQL, queryArgs...)
|
||
if err != nil {
|
||
return nil, 0, fmt.Errorf("查询失败: %v", err)
|
||
}
|
||
defer rows.Close()
|
||
|
||
var records []sqLiteType.TaskExport
|
||
|
||
for rows.Next() {
|
||
var record sqLiteType.TaskExport
|
||
// 扫描所有字段
|
||
err = rows.Scan(
|
||
&record.ID,
|
||
&record.UserID,
|
||
&record.TaskID,
|
||
&record.ShopName,
|
||
&record.FileUrl,
|
||
&record.Status,
|
||
&record.Total,
|
||
&record.CompleteAt,
|
||
&record.CreateAt,
|
||
)
|
||
if err != nil {
|
||
return nil, 0, fmt.Errorf("扫描数据失败: %v", err)
|
||
}
|
||
records = append(records, record)
|
||
}
|
||
|
||
if err = rows.Err(); err != nil {
|
||
return nil, 0, fmt.Errorf("遍历结果集错误: %v", err)
|
||
}
|
||
|
||
return records, total, nil
|
||
}
|
||
|
||
// DeleteOldExport 删除task_export表中N天前的记录
|
||
// @return error 错误信息
|
||
func DeleteOldExport() error {
|
||
days := golabl.Config.Server.DataDay
|
||
sql := fmt.Sprintf("DELETE FROM task_export WHERE create_at < datetime('now','localtime', '-%d days')", days)
|
||
result, err := golabl.SqliteDb.Exec(sql)
|
||
if err != nil {
|
||
return fmt.Errorf("删除旧数据失败: %v", err)
|
||
}
|
||
|
||
rowsAffected, err := result.RowsAffected()
|
||
if err != nil {
|
||
return fmt.Errorf("获取影响行数失败: %v", err)
|
||
}
|
||
|
||
fmt.Printf("已删除 %d 条大于N天的记录\n", rowsAffected)
|
||
return nil
|
||
}
|
||
|
||
// GetOldExport 获取task_export表中N天前的记录
|
||
// @return []TaskExport N天前的记录
|
||
// @return error 错误信息
|
||
func GetOldExport() ([]sqLiteType.TaskExport, error) {
|
||
days := golabl.Config.Server.DataDay
|
||
sevenDaysAgo := time.Now().AddDate(0, 0, -days)
|
||
|
||
// 查询N天前的记录
|
||
rows, err := golabl.SqliteDb.Query(`
|
||
SELECT id, user_id, task_id, shop_name, file_url, status, total, complete_at, create_at
|
||
FROM task_export
|
||
WHERE create_at < ?
|
||
ORDER BY create_at ASC
|
||
`, sevenDaysAgo)
|
||
|
||
if err != nil {
|
||
return nil, fmt.Errorf("查询N天前导出记录失败: %v", err)
|
||
}
|
||
defer rows.Close()
|
||
|
||
var tasks []sqLiteType.TaskExport
|
||
|
||
for rows.Next() {
|
||
var task sqLiteType.TaskExport
|
||
var completeAt, createAt sql.NullTime
|
||
|
||
err := rows.Scan(
|
||
&task.ID,
|
||
&task.UserID,
|
||
&task.TaskID,
|
||
&task.ShopName,
|
||
&task.FileUrl,
|
||
&task.Status,
|
||
&task.Total,
|
||
&completeAt,
|
||
&createAt,
|
||
)
|
||
|
||
if err != nil {
|
||
return nil, fmt.Errorf("扫描导出记录失败: %v", err)
|
||
}
|
||
|
||
// 转换时间字段
|
||
if completeAt.Valid {
|
||
task.CompleteAt = sql.NullTime{
|
||
Time: completeAt.Time,
|
||
Valid: true,
|
||
}
|
||
}
|
||
if createAt.Valid {
|
||
task.CreateAt = createAt.Time
|
||
}
|
||
|
||
tasks = append(tasks, task)
|
||
}
|
||
|
||
if err = rows.Err(); err != nil {
|
||
return nil, fmt.Errorf("遍历导出记录失败: %v", err)
|
||
}
|
||
|
||
return tasks, nil
|
||
}
|
||
|
||
// GetTaskExportByTaskID 根据任务ID获取导出记录
|
||
// @param taskID string 任务ID
|
||
// @return sqLiteType.TaskExport 导出记录
|
||
// @return error 错误信息
|
||
func GetTaskExportByTaskID(taskID string) (sqLiteType.TaskExport, error) {
|
||
query := `SELECT id, user_id, shop_id, task_id, shop_name, file_url,
|
||
status, total, complete_at, create_at
|
||
FROM task_export
|
||
WHERE task_id = ?`
|
||
|
||
var task sqLiteType.TaskExport
|
||
err := golabl.SqliteDb.QueryRow(query, taskID).Scan(
|
||
&task.ID,
|
||
&task.UserID,
|
||
&task.ShopID,
|
||
&task.TaskID,
|
||
&task.ShopName,
|
||
&task.FileUrl,
|
||
&task.Status,
|
||
&task.Total,
|
||
&task.CompleteAt,
|
||
&task.CreateAt,
|
||
)
|
||
|
||
if err != nil {
|
||
if errors.Is(err, sql.ErrNoRows) {
|
||
return task, nil // 未找到记录
|
||
}
|
||
return task, err
|
||
}
|
||
|
||
return task, nil
|
||
}
|
||
|
||
// UpdateTaskExport 更新task_export信息
|
||
// @param export sqLiteType.TaskExport 要更新的任务信息
|
||
// @return error 错误信息
|
||
func UpdateTaskExport(export sqLiteType.TaskExport) error {
|
||
query := `
|
||
UPDATE task_export
|
||
SET user_id = ?,
|
||
shop_id = ?,
|
||
task_id = ?,
|
||
shop_name = ?,
|
||
file_url = ?,
|
||
status = ?,
|
||
total = ?,
|
||
complete_at = ?
|
||
WHERE task_id = ?
|
||
`
|
||
|
||
result, err := golabl.SqliteDb.Exec(query, export.TaskID, export.ShopID, export.TaskID, export.ShopName, export.FileUrl, export.Status, export.Total, export.CompleteAt, export.TaskID)
|
||
if err != nil {
|
||
return fmt.Errorf("更新任务失败: %v", err)
|
||
}
|
||
|
||
rowsAffected, err := result.RowsAffected()
|
||
if err != nil {
|
||
return fmt.Errorf("获取影响行数失败: %v", err)
|
||
}
|
||
|
||
if rowsAffected == 0 {
|
||
return fmt.Errorf("未找到task_id为 %s 的任务", export.TaskID)
|
||
}
|
||
return nil
|
||
}
|