增加任务管理模块
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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"))
|
||||
}
|
||||
Reference in New Issue
Block a user