feat: 添加和删除养护事项

This commit is contained in:
Blizzard
2026-02-10 14:57:53 +08:00
parent 556ab6baff
commit 01f8306be2
6 changed files with 172 additions and 4 deletions
+44
View File
@@ -206,3 +206,47 @@ func (a *MyPlantApi) DeletePlans(c *gin.Context) {
} }
response.OkWithMsg("删除任务成功", c) response.OkWithMsg("删除任务成功", c)
} }
// AddCarePlan 添加养护事项
// @Tags 我的植物
// @Summary 添加养护事项
// @Security BearerAuth
// @accept json
// @Produce application/json
// @Param data body plantReq.CreateCarePlan true "添加养护事项"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"添加成功"}"
// @Router /plant/plan/add [post]
func (a *MyPlantApi) AddCarePlan(c *gin.Context) {
var req plantReq.AddPlans
err := c.ShouldBindJSON(&req)
if err != nil {
response.FailWithMsg("请求参数错误", c)
return
}
err = plantService.AddCarePlan(req)
if err != nil {
global.Logger.Error("添加任务失败", zap.Error(err))
response.FailWithMsg("添加任务失败", c)
return
}
response.OkWithMsg("添加任务成功", c)
}
// DeletePlan 删除养护事项
// @Tags 我的植物
// @Summary 删除养护事项
// @Security BearerAuth
// @Produce application/json
// @Param id query string true "id"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
// @Router /plant/plan/delete [get]
func (a *MyPlantApi) DeletePlan(c *gin.Context) {
id := c.Query("id")
err := plantService.DeletePlan(id)
if err != nil {
global.Logger.Error("删除任务失败", zap.Error(err))
response.FailWithMsg("删除任务失败", c)
return
}
response.OkWithMsg("删除任务成功", c)
}
+19
View File
@@ -6,6 +6,7 @@ import (
"sundynix-go/model/commom/response" "sundynix-go/model/commom/response"
"sundynix-go/model/system" "sundynix-go/model/system"
systemReq "sundynix-go/model/system/request" systemReq "sundynix-go/model/system/request"
"sundynix-go/utils/auth"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"go.uber.org/zap" "go.uber.org/zap"
@@ -14,6 +15,24 @@ import (
type UserApi struct { type UserApi struct {
} }
// CurrentUser
// @tags 用户管理
// @Summary 当前登录用户
// @Security ApiKeyAuth
// @Produce json
// @Success 200 {object} response.Response "{"code": 200, "data": {}, "msg": "添加成功"}"
// @Router /user/info [get]
func (u *UserApi) CurrentUser(c *gin.Context) {
userId := auth.GetUserId(c)
user, err := userService.GetUserById(userId)
if err != nil {
global.Logger.Error("获取用户信息失败!", zap.Error(err))
response.FailWithMsg(err.Error(), c)
return
}
response.OkWithData(user, c)
}
// SaveUser // SaveUser
// @tags 用户管理 // @tags 用户管理
// @Summary 新增用户 // @Summary 新增用户
+9
View File
@@ -5,6 +5,15 @@ type CarePlan struct {
Name string `json:"name"` // 农事名称 Name string `json:"name"` // 农事名称
Period int `json:"period"` // 周期 Period int `json:"period"` // 周期
} }
type CreateCarePlan struct {
PlantId string `json:"plantId" binding:"required"`
Icon string `json:"icon"` // icon信息
Name string `json:"name"` // 农事名称
Period int `json:"period"` // 周期
}
type AddPlans struct {
CarePlan []CreateCarePlan `json:"carePlan"`
}
// CreateMyPlant 创建植物 // CreateMyPlant 创建植物
type CreateMyPlant struct { type CreateMyPlant struct {
+6 -1
View File
@@ -12,10 +12,15 @@ func (c *MyPlantRouter) InitPlantRouter(Router *gin.RouterGroup) {
myPlantRouter.POST("add", myPlantApi.AddPlant) // 添加植物 myPlantRouter.POST("add", myPlantApi.AddPlant) // 添加植物
myPlantRouter.POST("page", myPlantApi.PlantPage) // 分页获取我的植物 myPlantRouter.POST("page", myPlantApi.PlantPage) // 分页获取我的植物
myPlantRouter.GET("detail", myPlantApi.PlantDetail) // 获取植物详情 myPlantRouter.GET("detail", myPlantApi.PlantDetail) // 获取植物详情
myPlantRouter.POST("update", myPlantApi.UpdatePlant) // 修改基本信息 myPlantRouter.POST("update", myPlantApi.UpdatePlant) // 修改植物信息(可以修改养护事项)
myPlantRouter.POST("deletePlant", myPlantApi.DeletePlants) // 删除植物 myPlantRouter.POST("deletePlant", myPlantApi.DeletePlants) // 删除植物
myPlantRouter.POST("deletePlan", myPlantApi.DeletePlans) // 删除计划 myPlantRouter.POST("deletePlan", myPlantApi.DeletePlans) // 删除计划
//养护事项
myPlantRouter.POST("/plan/add", myPlantApi.AddCarePlan) //添加养护计划
myPlantRouter.GET("/plan/delete", myPlantApi.DeletePlan) //删除事项
//任务
myPlantRouter.GET("todayTask", myPlantApi.TodayTask) // 获取今日任务 myPlantRouter.GET("todayTask", myPlantApi.TodayTask) // 获取今日任务
myPlantRouter.POST("completeTask", myPlantApi.CompleteTask) // 完成任务 myPlantRouter.POST("completeTask", myPlantApi.CompleteTask) // 完成任务
+1
View File
@@ -10,6 +10,7 @@ type UserRouter struct {
func (s *UserRouter) InitUserRouter(Router *gin.RouterGroup) { func (s *UserRouter) InitUserRouter(Router *gin.RouterGroup) {
userRouter := Router.Group("user") userRouter := Router.Group("user")
{ {
userRouter.POST("info", userApi.CurrentUser)
userRouter.POST("save", userApi.SaveUser) userRouter.POST("save", userApi.SaveUser)
userRouter.POST("update", userApi.UpdateUser) userRouter.POST("update", userApi.UpdateUser)
userRouter.POST("getUserList", userApi.GetUserList) userRouter.POST("getUserList", userApi.GetUserList)
+93 -3
View File
@@ -112,6 +112,11 @@ func (s *MyPlantService) PlantDetail(id string) (p plant.MyPlant, err error) {
func (s *MyPlantService) UpdatePlant(req plantReq.UpdateMyPlant) error { func (s *MyPlantService) UpdatePlant(req plantReq.UpdateMyPlant) error {
return global.DB.Transaction(func(tx *gorm.DB) error { return global.DB.Transaction(func(tx *gorm.DB) error {
var myPlant plant.MyPlant
err := tx.Where("id = ?", req.Id).First(&myPlant).Error
if err != nil {
return err
}
// 以map形式更新 先构建map // 以map形式更新 先构建map
updateMap := map[string]interface{}{ updateMap := map[string]interface{}{
"name": req.Name, "name": req.Name,
@@ -122,19 +127,40 @@ func (s *MyPlantService) UpdatePlant(req plantReq.UpdateMyPlant) error {
"sunlight": req.Sunlight, "sunlight": req.Sunlight,
} }
//1.修改基本信息 //1.修改基本信息
err := tx.Model(&plant.MyPlant{}).Where("id = ?", req.Id).Updates(updateMap).Error err = tx.Model(&plant.MyPlant{}).Where("id = ?", req.Id).Updates(updateMap).Error
if err != nil { if err != nil {
return err return err
} }
//2.修改计划 //2.修改计划
if len(req.CarePlans) > 0 { if len(req.CarePlans) > 0 {
today := timer.GetZeroTime()
for _, plan := range req.CarePlans { for _, plan := range req.CarePlans {
err = tx.Model(&plant.CarePlan{}).Where("id = ?", plan.Id).Updates(map[string]interface{}{ err = tx.Model(&plant.CarePlan{}).Where("id = ?", plan.Id).Updates(map[string]interface{}{
"icon": plan.Icon, "icon": plan.Icon,
"name": plan.Name, "name": plan.Name,
"period": plan.Period, "period": plan.Period,
}).Error }).Error
//3.重新生成任务 使用钩子函数自动执行 if err != nil {
return err
}
//3.重新生成任务 CarePlans 结构体中使用钩子函数自动执行
//3.1 删除旧任务
err = tx.Where("plan_id = ?", plan.Id).Unscoped().Delete(&plant.CareTask{}).Error
if err != nil {
return err
}
//3.2 创建新任务
dueDate := today.AddDate(0, 0, plan.Period)
task := plant.CareTask{
UserId: myPlant.UserId,
PlantId: myPlant.Id,
PlanId: plan.Id,
Name: plan.Name,
Icon: plan.Icon,
DueDate: dueDate,
Status: 1,
}
err = tx.Create(&task).Error
if err != nil { if err != nil {
return err return err
} }
@@ -142,7 +168,6 @@ func (s *MyPlantService) UpdatePlant(req plantReq.UpdateMyPlant) error {
} }
return nil return nil
}) })
} }
// TodayTask 今日任务 // TodayTask 今日任务
@@ -285,3 +310,68 @@ func (s *MyPlantService) DeletePlans(req common.IdsReq) error {
return nil return nil
}) })
} }
// AddCarePlan 添加CarePlan
func (s *MyPlantService) AddCarePlan(req plantReq.AddPlans) error {
return global.DB.Transaction(func(tx *gorm.DB) error {
for _, plan := range req.CarePlan {
var myPlant plant.MyPlant
err := tx.Where("id = ?", plan.PlantId).First(&myPlant).Error
if err != nil {
return err
}
//1.新增计划
newPlan := plant.CarePlan{
UserId: myPlant.UserId,
PlantId: myPlant.Id,
Name: plan.Name,
Icon: plan.Icon,
Period: plan.Period,
}
err = tx.Create(&newPlan).Error
if err != nil {
return err
}
//2.新增任务
today := timer.GetZeroTime()
dueDate := today.AddDate(0, 0, plan.Period)
task := plant.CareTask{
UserId: myPlant.UserId,
PlantId: myPlant.Id,
PlanId: newPlan.Id,
Name: plan.Name,
Icon: plan.Icon,
DueDate: dueDate,
Status: 1,
}
err = tx.Create(&task).Error
if err != nil {
return err
}
}
return nil
})
}
// DeletePlan 删除CarePlan
func (s *MyPlantService) DeletePlan(id string) error {
return global.DB.Transaction(func(tx *gorm.DB) error {
var plan plant.CarePlan
if err := tx.Where("id = ?", id).First(&plan).Error; err != nil {
return err
}
var tasks []plant.CareTask
if err := tx.Where("plan_id = ?", plan.Id).Find(&tasks).Error; err != nil {
return err
}
err := tx.Unscoped().Delete(&plan).Error
if err != nil {
return err
}
err = tx.Unscoped().Delete(&tasks).Error
if err != nil {
return err
}
return nil
})
}