daShangDao_planA/service/sqLite/taskExport.go

337 lines
8.8 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 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
}
// 获取插入记录的自增IDSQLite中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
}