增加任务管理模块

This commit is contained in:
2025-11-12 17:32:03 +08:00
parent 12a0ff8afc
commit db16ee70de
54 changed files with 3638 additions and 672 deletions
+138 -2
View File
@@ -41,7 +41,7 @@ func GetModuleName(module string) string {
// 如果菜单表中找不到,使用默认映射
defaultMap := map[string]string{
"auth": "认证",
"auth": "登录模块",
"dict": "字典管理",
"user": "用户管理",
"role": "角色管理",
@@ -142,7 +142,7 @@ func GetModuleNames(modules []string) (map[string]string, error) {
// 3. 对于仍然没有匹配的,使用默认映射
defaultMap := map[string]string{
"auth": "认证",
"auth": "登录模块",
"dict": "字典管理",
"user": "用户管理",
"role": "角色管理",
@@ -367,3 +367,139 @@ func DeleteOldLogs(keepDays int) (int64, error) {
return rowsAffected, nil
}
// GetAccessLogs 获取访问日志列表
func GetAccessLogs(tenantId int, userId int, module string, resourceType string, startTime *time.Time, endTime *time.Time, pageNum int, pageSize int) ([]*models.AccessLog, int64, error) {
o := orm.NewOrm()
qs := o.QueryTable("sys_access_log")
// 租户过滤
if tenantId > 0 {
qs = qs.Filter("tenant_id", tenantId)
}
// 用户过滤
if userId > 0 {
qs = qs.Filter("user_id", userId)
}
// 模块过滤
if module != "" {
qs = qs.Filter("module", module)
}
// 资源类型过滤
if resourceType != "" {
qs = qs.Filter("resource_type", resourceType)
}
// 时间范围过滤
if startTime != nil {
qs = qs.Filter("create_time__gte", startTime)
}
if endTime != nil {
qs = qs.Filter("create_time__lte", endTime)
}
// 获取总数
total, err := qs.Count()
if err != nil {
return nil, 0, fmt.Errorf("查询日志总数失败: %v", err)
}
// 分页查询
var logs []*models.AccessLog
offset := (pageNum - 1) * pageSize
_, err = qs.OrderBy("-create_time").Offset(offset).Limit(pageSize).All(&logs)
if err != nil {
return nil, 0, fmt.Errorf("查询访问日志失败: %v", err)
}
return logs, total, nil
}
// GetAccessLogById 根据ID获取访问日志
func GetAccessLogById(id int64) (*models.AccessLog, error) {
o := orm.NewOrm()
log := &models.AccessLog{Id: id}
err := o.Read(log)
if err != nil {
return nil, fmt.Errorf("日志不存在: %v", err)
}
return log, nil
}
// GetUserAccessStats 获取用户访问统计
func GetUserAccessStats(tenantId int, userId int, days int) (map[string]interface{}, error) {
o := orm.NewOrm()
startTime := time.Now().AddDate(0, 0, -days)
// 获取总访问数
var totalCount int64
err := o.Raw(
"SELECT COUNT(*) FROM sys_access_log WHERE tenant_id = ? AND user_id = ? AND create_time >= ?",
tenantId, userId, startTime,
).QueryRow(&totalCount)
if err != nil {
return nil, err
}
// 获取按模块分组的访问数
type ModuleCount struct {
Module string
Count int
}
var moduleCounts []ModuleCount
_, err = o.Raw(
"SELECT module, COUNT(*) as count FROM sys_access_log WHERE tenant_id = ? AND user_id = ? AND create_time >= ? GROUP BY module",
tenantId, userId, startTime,
).QueryRows(&moduleCounts)
if err != nil {
return nil, err
}
// 获取按状态分组的访问数
type StatusCount struct {
Status int
Count int
}
var statusCounts []StatusCount
_, err = o.Raw(
"SELECT status, COUNT(*) as count FROM sys_access_log WHERE tenant_id = ? AND user_id = ? AND create_time >= ? GROUP BY status",
tenantId, userId, startTime,
).QueryRows(&statusCounts)
if err != nil {
return nil, err
}
// 构建结果
stats := map[string]interface{}{
"total_access": totalCount,
"module_stats": moduleCounts,
"status_stats": statusCounts,
"period_days": days,
"from_time": startTime,
"to_time": time.Now(),
}
return stats, nil
}
// ClearOldAccessLogs 清除旧访问日志(保留指定天数)
func ClearOldAccessLogs(keepDays int) (int64, error) {
o := orm.NewOrm()
cutoffTime := time.Now().AddDate(0, 0, -keepDays)
result, err := o.Raw("DELETE FROM sys_access_log WHERE create_time < ?", cutoffTime).Exec()
if err != nil {
return 0, fmt.Errorf("删除旧访问日志失败: %v", err)
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return 0, fmt.Errorf("获取受影响行数失败: %v", err)
}
return rowsAffected, nil
}
+71
View File
@@ -0,0 +1,71 @@
package services
import (
"fmt"
"server/models"
"time"
)
// ListOATasks 服务层:分页查询任务
func ListOATasks(tenantId int, keyword, status, priority string, page, pageSize int) (tasks []*models.Task, total int64, err error) {
return models.ListTasks(tenantId, keyword, status, priority, page, pageSize)
}
// GetOATaskById 服务层:获取任务详情
func GetOATaskById(id int) (*models.Task, error) {
return models.GetTaskById(id)
}
// CreateOATask 服务层:创建任务
func CreateOATask(t *models.Task, tenantId int, username string) error {
// 填充租户
if t.TenantId == 0 && tenantId > 0 {
t.TenantId = tenantId
}
// 默认状态与优先级
if t.TaskStatus == "" {
t.TaskStatus = ""
}
if t.Priority == "" {
t.Priority = ""
}
// 任务编号
if t.TaskNo == "" {
t.TaskNo = genTaskNo(t.TenantId)
}
// 创建人与操作人
if t.CreatorName == "" && username != "" {
t.CreatorName = username
}
if t.OperatorName == "" && username != "" {
t.OperatorName = username
}
return models.CreateTask(t)
}
// UpdateOATask 服务层:更新任务
func UpdateOATask(t *models.Task, username string, cols ...string) error {
if username != "" {
t.OperatorName = username
}
return models.UpdateTask(t, cols...)
}
// DeleteOATask 服务层:软删除任务
func DeleteOATask(id int, operatorName string, operatorId int) error {
// 读取当前任务
t, err := models.GetTaskById(id)
if err != nil {
return err
}
now := time.Now()
t.DeletedTime = &now
t.OperatorName = operatorName
t.OperatorId = operatorId
return models.UpdateTask(t, "deleted_time", "operator_name", "operator_id")
}
// 生成任务编号:TASK{tenantId}{YYYYMMDDHHMMSS}
func genTaskNo(tenantId int) string {
return fmt.Sprintf("TASK%d%s", tenantId, time.Now().Format("20060102150405"))
}