diff --git a/internal/app/controller/plan/converter.go b/internal/app/controller/plan/converter.go new file mode 100644 index 0000000..25eff56 --- /dev/null +++ b/internal/app/controller/plan/converter.go @@ -0,0 +1,170 @@ +package plan + +import ( + "git.huangwc.com/pig/pig-farm-controller/internal/app/controller" + "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" + "gorm.io/datatypes" +) + +// PlanToResponse 将Plan模型转换为PlanResponse +func PlanToResponse(plan *models.Plan) *PlanResponse { + if plan == nil { + return nil + } + + response := &PlanResponse{ + ID: plan.ID, + Name: plan.Name, + Description: plan.Description, + ExecutionType: plan.ExecutionType, + CronExpression: plan.CronExpression, + ContentType: plan.ContentType, + } + + // 转换子计划 + if plan.ContentType == models.PlanContentTypeSubPlans { + response.SubPlans = make([]SubPlanResponse, len(plan.SubPlans)) + for i, subPlan := range plan.SubPlans { + response.SubPlans[i] = SubPlanToResponse(&subPlan) + } + } + + // 转换任务 + if plan.ContentType == models.PlanContentTypeTasks { + response.Tasks = make([]TaskResponse, len(plan.Tasks)) + for i, task := range plan.Tasks { + response.Tasks[i] = TaskToResponse(&task) + } + } + + return response +} + +// PlanFromCreateRequest 将CreatePlanRequest转换为Plan模型 +func PlanFromCreateRequest(req *CreatePlanRequest) *models.Plan { + if req == nil { + return nil + } + + plan := &models.Plan{ + Name: req.Name, + Description: req.Description, + ExecutionType: req.ExecutionType, + CronExpression: req.CronExpression, + ContentType: req.ContentType, + } + + // 处理子计划 (通过ID引用) + if req.ContentType == models.PlanContentTypeSubPlans && req.SubPlanIDs != nil { + plan.SubPlans = make([]models.SubPlan, len(req.SubPlanIDs)) + for i, childPlanID := range req.SubPlanIDs { + plan.SubPlans[i] = models.SubPlan{ + ChildPlanID: childPlanID, + ExecutionOrder: i + 1, // 默认执行顺序 + } + } + } + + // 处理任务 + if req.ContentType == models.PlanContentTypeTasks && req.Tasks != nil { + plan.Tasks = make([]models.Task, len(req.Tasks)) + for i, taskReq := range req.Tasks { + plan.Tasks[i] = TaskFromRequest(&taskReq) + // 设置执行顺序 + plan.Tasks[i].ExecutionOrder = i + 1 + } + } + + return plan +} + +// PlanFromUpdateRequest 将UpdatePlanRequest转换为Plan模型 +func PlanFromUpdateRequest(req *UpdatePlanRequest) *models.Plan { + if req == nil { + return nil + } + + plan := &models.Plan{ + Name: req.Name, + Description: req.Description, + ExecutionType: req.ExecutionType, + CronExpression: req.CronExpression, + ContentType: req.ContentType, + } + + // 处理子计划 (通过ID引用) + if req.ContentType == models.PlanContentTypeSubPlans && req.SubPlanIDs != nil { + plan.SubPlans = make([]models.SubPlan, len(req.SubPlanIDs)) + for i, childPlanID := range req.SubPlanIDs { + plan.SubPlans[i] = models.SubPlan{ + ChildPlanID: childPlanID, + ExecutionOrder: i + 1, // 默认执行顺序 + } + } + } + + // 处理任务 + if req.ContentType == models.PlanContentTypeTasks && req.Tasks != nil { + plan.Tasks = make([]models.Task, len(req.Tasks)) + for i, taskReq := range req.Tasks { + plan.Tasks[i] = TaskFromRequest(&taskReq) + // 设置执行顺序 + plan.Tasks[i].ExecutionOrder = i + 1 + } + } + + return plan +} + +// SubPlanToResponse 将SubPlan模型转换为SubPlanResponse +func SubPlanToResponse(subPlan *models.SubPlan) SubPlanResponse { + if subPlan == nil { + return SubPlanResponse{} + } + + response := SubPlanResponse{ + ID: subPlan.ID, + ParentPlanID: subPlan.ParentPlanID, + ChildPlanID: subPlan.ChildPlanID, + ExecutionOrder: subPlan.ExecutionOrder, + } + + // 如果有完整的子计划数据,也进行转换 + if subPlan.ChildPlan != nil { + response.ChildPlan = PlanToResponse(subPlan.ChildPlan) + } + + return response +} + +// TaskToResponse 将Task模型转换为TaskResponse +func TaskToResponse(task *models.Task) TaskResponse { + if task == nil { + return TaskResponse{} + } + + return TaskResponse{ + ID: task.ID, + PlanID: task.PlanID, + Name: task.Name, + Description: task.Description, + ExecutionOrder: task.ExecutionOrder, + Type: task.Type, + Parameters: controller.Properties(task.Parameters), + } +} + +// TaskFromRequest 将TaskRequest转换为Task模型 +func TaskFromRequest(req *TaskRequest) models.Task { + if req == nil { + return models.Task{} + } + + return models.Task{ + Name: req.Name, + Description: req.Description, + ExecutionOrder: req.ExecutionOrder, + Type: req.Type, + Parameters: datatypes.JSON(req.Parameters), + } +}