|
- package xjlab
-
- import (
- "context"
- "time"
-
- jsoniter "github.com/json-iterator/go"
- "github.com/zeromicro/go-zero/core/logx"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
- "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result"
- "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils/timeutils"
- "gorm.io/gorm"
- )
-
- type PageListTaskLogic struct {
- logx.Logger
- ctx context.Context
- svcCtx *svc.ServiceContext
- }
-
- func NewPageListTaskLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PageListTaskLogic {
- return &PageListTaskLogic{
- Logger: logx.WithContext(ctx),
- ctx: ctx,
- svcCtx: svcCtx,
- }
- }
-
- type TaskResp struct {
- Id int64 `json:"id,omitempty,string" db:"id"` // id
- Name string `json:"name,omitempty" db:"name"` // 作业名称
- Description string `json:"description,omitempty" db:"description"` // 作业描述
- Status string `json:"status,omitempty" db:"status"` // 作业状态
- Strategy int64 `json:"strategy" db:"strategy"` // 策略
- SynergyStatus int64 `json:"synergyStatus" db:"synergy_status"` // 协同状态(0-未协同、1-已协同)
- CommitTime string `json:"commitTime,omitempty" db:"commit_time"` // 提交时间
- StartTime string `json:"startTime,omitempty" db:"start_time"` // 开始时间
- EndTime string `json:"endTime,omitempty" db:"end_time"` // 结束运行时间
- RunningTime int64 `json:"runningTime" db:"running_time"` // 已运行时间(单位秒)
- YamlString string `json:"yamlString,omitempty" db:"yaml_string"`
- Result string `json:"result,omitempty" db:"result"` // 作业结果
- DeletedAt string `json:"deletedAt,omitempty" gorm:"index" db:"deleted_at"`
- NsID string `json:"nsId,omitempty" db:"ns_id"`
- TenantId string `json:"tenantId,omitempty" db:"tenant_id"`
- CreatedTime string `json:"createdTime,omitempty" db:"created_time" gorm:"autoCreateTime"`
- UpdatedTime string `json:"updatedTime,omitempty" db:"updated_time"`
- AdapterTypeDict string `json:"adapterTypeDict" db:"adapter_type_dict" gorm:"adapter_type_dict"` //适配器类型(对应字典表的值
- TaskTypeDict string `json:"taskTypeDict" db:"task_type_dict" gorm:"task_type_dict"` //任务类型(对应字典表的值
- UserId int64 `json:"userId,omitempty" db:"user_id"`
- UserName string `json:"userName,omitempty" db:"user_name"`
-
- ClusterId string `json:"clusterId,omitempty" db:"cluster_id"`
- ClusterName string `json:"clusterName,omitempty" db:"cluster_name"`
- ResourceSpec string `json:"resourceSpec,omitempty" db:"resource_spec"`
- Card string `json:"card,omitempty" db:"card"`
- }
-
- // clusterInfo 集群信息结构体
- type clusterInfo struct {
- ClusterId string `json:"cluster_id"`
- ClusterName string `json:"cluster_name"`
- ResourceSpec string `json:"resource_spec"`
- Card string `json:"card"`
- }
-
- func (l *PageListTaskLogic) PageListTask(req *types.XJLABTaskReq) (*types.PageResult, error) {
- // 验证请求参数
- if err := l.validateRequest(req); err != nil {
- return nil, err
- }
-
- // 查询任务总数
- total, err := l.getTaskCount(req)
- if err != nil {
- return nil, err
- }
-
- // 查询任务列表
- tasks, err := l.getTaskList(req)
- if err != nil {
- return nil, err
- }
-
- // 异步更新任务状态
- l.updateTaskStatusAsync(tasks)
-
- // 处理任务响应数据
- taskResps := l.processTaskResponses(tasks)
-
- // 构建分页结果
- return &types.PageResult{
- List: &taskResps,
- PageSize: req.PageSize,
- PageNum: req.PageNum,
- Total: total,
- }, nil
- }
-
- // validateRequest 验证请求参数
- func (l *PageListTaskLogic) validateRequest(req *types.XJLABTaskReq) error {
- if req.PageSize <= 0 || req.PageNum <= 0 {
- return result.NewDefaultError("Invalid page size or page number")
- }
- return nil
- }
-
- // buildBaseQuery 构建基础查询条件
- func (l *PageListTaskLogic) buildBaseQuery(req *types.XJLABTaskReq) *gorm.DB {
- db := l.svcCtx.DbEngin.Model(&types.TaskModel{}).Table("task").Where("deleted_at is null")
-
- // 用户权限过滤
- if req.UserName != "" && req.UserName != "admin" {
- db = db.Where("user_name = ?", req.UserName)
- }
-
- // 任务名称模糊查询
- if req.Name != "" {
- db = db.Where("name LIKE ?", "%"+req.Name+"%")
- }
-
- // 计算类型筛选
- if req.AdapterTypeDict != "" {
- db = db.Where("adapter_type_dict = ?", req.AdapterTypeDict)
- }
-
- // 任务状态筛选
- if req.Status != "" {
- db = db.Where("status = ?", req.Status)
- }
-
- // 时间范围筛选
- if req.StartTime != "" && req.EndTime != "" {
- db = db.Where("start_time BETWEEN ? AND ?", req.StartTime, req.EndTime)
- }
-
- return db
- }
-
- // getTaskCount 获取任务总数
- func (l *PageListTaskLogic) getTaskCount(req *types.XJLABTaskReq) (int64, error) {
- var total int64
- db := l.buildBaseQuery(req)
-
- if err := db.Count(&total).Error; err != nil {
- return 0, result.NewDefaultError(err.Error())
- }
-
- return total, nil
- }
-
- // getTaskList 获取任务列表
- func (l *PageListTaskLogic) getTaskList(req *types.XJLABTaskReq) ([]*types.TaskModel, error) {
- var list []*types.TaskModel
-
- limit := req.PageSize
- offset := req.PageSize * (req.PageNum - 1)
-
- db := l.buildBaseQuery(req)
-
- if err := db.Limit(limit).Offset(offset).Order("created_time desc").Find(&list).Error; err != nil {
- return nil, result.NewDefaultError(err.Error())
- }
-
- return list, nil
- }
-
- // updateTaskStatusAsync 异步更新任务状态
- func (l *PageListTaskLogic) updateTaskStatusAsync(tasks []*types.TaskModel) {
- go l.svcCtx.Scheduler.AiService.St.UpdateTaskStatus(tasks)
- go l.svcCtx.Scheduler.AiService.St.UpdateAiTaskStatus(tasks)
- }
-
- // processTaskResponses 处理任务响应数据
- func (l *PageListTaskLogic) processTaskResponses(tasks []*types.TaskModel) []*TaskResp {
- taskResps := make([]*TaskResp, 0, len(tasks))
-
- for _, model := range tasks {
- // 计算运行时间
- model.RunningTime = l.calculateRunningTime(model.StartTime, model.EndTime)
-
- // 转换为响应结构体
- taskResp, err := l.convertToTaskResp(model)
- if err != nil {
- l.Errorf("Failed to convert task model: %v", err)
- continue
- }
-
- // 丰富任务详情
- enrichedTask := l.enrichTaskDetails(taskResp)
- taskResps = append(taskResps, &enrichedTask)
- }
-
- return taskResps
- }
-
- // convertToTaskResp 将TaskModel转换为TaskResp
- func (l *PageListTaskLogic) convertToTaskResp(model *types.TaskModel) (*TaskResp, error) {
- jsonData, err := jsoniter.Marshal(model)
- if err != nil {
- return nil, err
- }
-
- var taskResp TaskResp
- if err := jsoniter.Unmarshal(jsonData, &taskResp); err != nil {
- return nil, err
- }
-
- return &taskResp, nil
- }
-
- // calculateRunningTime 计算任务的运行时间
- func (l *PageListTaskLogic) calculateRunningTime(startTimeStr, endTimeStr string) int64 {
- if startTimeStr == "" {
- return 0
- }
-
- startTime := timeutils.TimeStringToGoTime(startTimeStr)
-
- // 如果没有结束时间,计算到当前时间
- if endTimeStr == "" {
- return int64(time.Since(startTime).Seconds())
- }
-
- endTime := timeutils.TimeStringToGoTime(endTimeStr)
- return int64(endTime.Sub(startTime).Seconds())
- }
-
- // enrichTaskDetails 丰富任务详情
- func (l *PageListTaskLogic) enrichTaskDetails(task *TaskResp) TaskResp {
- cluster := l.getClusterInfo(task.Id, task.AdapterTypeDict)
-
- task.ClusterId = cluster.ClusterId
- task.ClusterName = cluster.ClusterName
- task.ResourceSpec = cluster.ResourceSpec
- task.Card = cluster.Card
-
- return *task
- }
-
- // getClusterInfo 根据适配器类型获取集群信息
- func (l *PageListTaskLogic) getClusterInfo(taskId int64, adapterType string) clusterInfo {
- var cluster clusterInfo
-
- switch adapterType {
- case constants.AdapterTypeCloud:
- // 云计算任务
- l.svcCtx.DbEngin.Table("task_cloud").
- Where("task_id = ?", taskId).
- Select("cluster_id,cluster_name,resource_spec").
- Find(&cluster)
-
- case constants.AdapterTypeAI:
- // AI计算任务
- l.svcCtx.DbEngin.Table("task_ai").
- Where("task_id = ?", taskId).
- Select("cluster_id,cluster_name,resource_spec,card").
- Find(&cluster)
-
- // AI任务特殊处理:如果没有resource_spec,使用card字段
- if cluster.ResourceSpec == "" {
- cluster.ResourceSpec = cluster.Card
- }
-
- case constants.AdapterTypeHPC:
- // 高性能计算任务
- l.svcCtx.DbEngin.Table("task_hpc").
- Where("task_id = ?", taskId).
- Select("cluster_id,cluster_name,resource_spec").
- Find(&cluster)
- }
-
- return cluster
- }
|