From cbcba09d405b5bcbbbf2f7b8cccd65666691c43f Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Wed, 10 Sep 2025 14:42:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0Update=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/controller/feed/feed.go | 109 +++++++++++++++++++++---------- internal/model/feed.go | 3 - 2 files changed, 75 insertions(+), 37 deletions(-) diff --git a/internal/controller/feed/feed.go b/internal/controller/feed/feed.go index 9b600d9..c638a75 100644 --- a/internal/controller/feed/feed.go +++ b/internal/controller/feed/feed.go @@ -5,14 +5,12 @@ package feed import ( "strconv" - "time" "git.huangwc.com/pig/pig-farm-controller/internal/controller" "git.huangwc.com/pig/pig-farm-controller/internal/logs" "git.huangwc.com/pig/pig-farm-controller/internal/model" "git.huangwc.com/pig/pig-farm-controller/internal/storage/repository" "github.com/gin-gonic/gin" - "gorm.io/gorm" ) // Controller 饲料控制器 @@ -80,6 +78,22 @@ func (c *Controller) ListPlans(ctx *gin.Context) { controller.SendSuccessResponse(ctx, "success", resp) } +// UpdateRequest 更新计划请求结构体 +type UpdateRequest struct { + ID uint `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Type model.FeedingPlanType `json:"type"` + Enabled bool `json:"enabled"` + ScheduleCron *string `json:"scheduleCron"` + ExecutionLimit int `json:"executionLimit"` + ParentID *uint `json:"parentID"` + OrderInParent *int `json:"orderInParent"` + IsMaster bool `json:"isMaster"` + Steps []FeedingPlanStep `json:"steps"` + SubPlans []UpdateRequest `json:"subPlans"` +} + // DetailResponse 喂料计划主表 type DetailResponse struct { // ID 计划ID @@ -109,18 +123,6 @@ type DetailResponse struct { // OrderInParent 在父计划中的执行顺序 OrderInParent *int `json:"orderInParent"` - // IsMaster 是否为主计划(主计划可以包含子计划) - IsMaster bool `json:"isMaster"` - - // CreatedAt 创建时间 - CreatedAt time.Time `json:"createdAt"` - - // UpdatedAt 更新时间 - UpdatedAt time.Time `json:"updatedAt"` - - // DeletedAt 删除时间(用于软删除) - DeletedAt gorm.DeletedAt `json:"deletedAt"` - // Steps 计划步骤列表 Steps []FeedingPlanStep `json:"steps"` @@ -153,15 +155,6 @@ type FeedingPlanStep struct { // ExecutionLimit 步骤执行次数限制(0表示无限制) ExecutionLimit int `json:"executionLimit"` - - // CreatedAt 创建时间 - CreatedAt time.Time `json:"createdAt"` - - // UpdatedAt 更新时间 - UpdatedAt time.Time `json:"updatedAt"` - - // DeletedAt 删除时间(用于软删除) - DeletedAt gorm.DeletedAt `json:"deletedAt"` } // Detail 获取饲料计划列细节 @@ -188,6 +181,65 @@ func (c *Controller) Detail(ctx *gin.Context) { controller.SendSuccessResponse(ctx, "success", resp) } +// Update 更新饲料计划 +func (c *Controller) Update(ctx *gin.Context) { + var req UpdateRequest + if err := ctx.ShouldBindJSON(&req); err != nil { + controller.SendErrorResponse(ctx, controller.InvalidParameterCode, "请求参数错误: "+err.Error()) + return + } + + // 转换请求结构体为模型 + plan := c.convertToUpdateModel(&req) + + // 调用仓库更新计划 + if err := c.feedPlanRepo.UpdateFeedingPlan(plan); err != nil { + c.logger.Error("更新计划失败: " + err.Error()) + controller.SendErrorResponse(ctx, controller.InternalServerErrorCode, "更新计划失败") + return + } + + controller.SendSuccessResponse(ctx, "更新计划成功", nil) +} + +// convertToUpdateModel 将更新请求结构体转换为数据库模型 +func (c *Controller) convertToUpdateModel(req *UpdateRequest) *model.FeedingPlan { + plan := &model.FeedingPlan{ + ID: req.ID, + Name: req.Name, + Description: req.Description, + Type: req.Type, + Enabled: req.Enabled, + ScheduleCron: req.ScheduleCron, + ExecutionLimit: req.ExecutionLimit, + ParentID: req.ParentID, + OrderInParent: req.OrderInParent, + Steps: make([]model.FeedingPlanStep, len(req.Steps)), + SubPlans: make([]model.FeedingPlan, len(req.SubPlans)), + } + + // 转换步骤 + for i, step := range req.Steps { + plan.Steps[i] = model.FeedingPlanStep{ + ID: step.ID, + PlanID: step.PlanID, + StepOrder: step.StepOrder, + DeviceID: step.DeviceID, + TargetValue: step.TargetValue, + Action: step.Action, + ScheduleCron: step.ScheduleCron, + ExecutionLimit: step.ExecutionLimit, + } + } + + // 转换子计划 + for i, subReq := range req.SubPlans { + plan.SubPlans[i] = *c.convertToUpdateModel(&subReq) + } + + return plan +} + // convertToDetailResponse 将数据库模型转换为响应结构体 func (c *Controller) convertToDetailResponse(plan *model.FeedingPlan) *DetailResponse { resp := &DetailResponse{ @@ -200,10 +252,6 @@ func (c *Controller) convertToDetailResponse(plan *model.FeedingPlan) *DetailRes ExecutionLimit: plan.ExecutionLimit, ParentID: plan.ParentID, OrderInParent: plan.OrderInParent, - IsMaster: plan.IsMaster, - CreatedAt: plan.CreatedAt, - UpdatedAt: plan.UpdatedAt, - DeletedAt: plan.DeletedAt, Steps: make([]FeedingPlanStep, len(plan.Steps)), SubPlans: make([]DetailResponse, len(plan.SubPlans)), } @@ -219,9 +267,6 @@ func (c *Controller) convertToDetailResponse(plan *model.FeedingPlan) *DetailRes Action: step.Action, ScheduleCron: step.ScheduleCron, ExecutionLimit: step.ExecutionLimit, - CreatedAt: step.CreatedAt, - UpdatedAt: step.UpdatedAt, - DeletedAt: step.DeletedAt, } } @@ -238,10 +283,6 @@ func (c *Controller) convertToDetailResponse(plan *model.FeedingPlan) *DetailRes ExecutionLimit: subPlan.ExecutionLimit, ParentID: subPlan.ParentID, OrderInParent: subPlan.OrderInParent, - IsMaster: subPlan.IsMaster, - CreatedAt: subPlan.CreatedAt, - UpdatedAt: subPlan.UpdatedAt, - DeletedAt: subPlan.DeletedAt, Steps: subPlan.Steps, SubPlans: subPlan.SubPlans, } diff --git a/internal/model/feed.go b/internal/model/feed.go index 05d4b80..d4712d1 100644 --- a/internal/model/feed.go +++ b/internal/model/feed.go @@ -45,9 +45,6 @@ type FeedingPlan struct { // OrderInParent 在父计划中的执行顺序 OrderInParent *int `gorm:"column:order_in_parent" json:"order_in_parent,omitempty"` - // IsMaster 是否为主计划(主计划可以包含子计划) - IsMaster bool `gorm:"not null;default:false;column:is_master" json:"is_master"` - // CreatedAt 创建时间 CreatedAt time.Time `gorm:"column:created_at" json:"created_at"`