package userstore import ( "fmt" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" ) type FoodRecipeItemParam struct { Name string `json:"name"` SkuIDs []int `json:"skuIDs"` } type FoodRecipeStepParam struct { Name string `orm:"size(48)" json:"name"` Description string `orm:"size(4096)" json:"description"` Img string `orm:"size(48)" json:"img"` } func updateFoodRecipeItemAndStep(ctx *jxcontext.Context, db *dao.DaoDB, recipeID int, itemList []*FoodRecipeItemParam, stepList []*FoodRecipeStepParam) (err error) { for k, v := range itemList { if len(v.SkuIDs) == 0 { return fmt.Errorf("SkuIDs必须要有值") } skuIDs, err2 := dao.GetSkus(db, v.SkuIDs, nil, nil, nil) if err = err2; err != nil { return err } if len(v.SkuIDs) != len(skuIDs) { return fmt.Errorf("某些SkuIDs不存在") } item := &model.FoodRecipeItem{ RecipeID: recipeID, Index: int8(k + 1), Name: v.Name, } dao.WrapAddIDCULEntity(item, ctx.GetUserName()) if err = dao.CreateEntity(db, item); err != nil { return err } for k2, v2 := range v.SkuIDs { choice := &model.FoodRecipeItemChoice{ RecipeID: recipeID, Index: item.Index, SkuID: v2, ChoiceIndex: int8(k2 + 1), } dao.WrapAddIDCULEntity(choice, ctx.GetUserName()) if err = dao.CreateEntity(db, choice); err != nil { return err } } } for k, v := range stepList { step := &model.FoodRecipeStep{ RecipeID: recipeID, Index: int8(k + 1), Name: v.Name, } dao.WrapAddIDCULEntity(step, ctx.GetUserName()) if err = dao.CreateEntity(db, step); err != nil { return err } } return err } func CreateFoodRecipe(ctx *jxcontext.Context, foodRecipe *model.FoodRecipe, itemList []*FoodRecipeItemParam, stepList []*FoodRecipeStepParam) (err error) { if len(itemList) == 0 { return fmt.Errorf("必须要有配料") } if len(stepList) == 0 { return fmt.Errorf("必须要有操作步骤") } db := dao.GetDB() dao.Begin(db) defer func() { if r := recover(); r != nil || err != nil { dao.Rollback(db) if r != nil { panic(r) } } }() _, foodRecipe.AuthorID = ctx.GetMobileAndUserID() dao.WrapAddIDCULEntity(foodRecipe, ctx.GetUserName()) if err = dao.CreateEntity(db, foodRecipe); err != nil { return err } if err = updateFoodRecipeItemAndStep(ctx, db, foodRecipe.ID, itemList, stepList); err != nil { return err } dao.Commit(db) return err } func UpdateFoodRecipe(ctx *jxcontext.Context, recipeID int, mapData map[string]interface{}, itemList []*FoodRecipeItemParam, stepList []*FoodRecipeStepParam) (err error) { db := dao.GetDB() localRecipe := &model.FoodRecipe{} localRecipe.ID = recipeID if err = dao.GetEntity(db, localRecipe); err != nil { return err } valid := dao.StrictMakeMapByStructObject(mapData, localRecipe, ctx.GetUserName()) dao.Begin(db) defer func() { if r := recover(); r != nil || err != nil { dao.Rollback(db) if r != nil { panic(r) } } }() if len(valid) > 0 { if _, err = dao.UpdateEntityLogically(db, localRecipe, valid, ctx.GetUserName(), nil); err != nil { return err } } if len(itemList) > 0 { choice := &model.FoodRecipeItemChoice{ RecipeID: recipeID, } if _, err = dao.DeleteEntity(db, choice, "RecipeID"); err != nil { return err } recipeItems := &model.FoodRecipeItem{ RecipeID: recipeID, } if _, err = dao.DeleteEntity(db, recipeItems, "RecipeID"); err != nil { return err } } if len(stepList) > 0 { recipeSteps := &model.FoodRecipeStep{ RecipeID: recipeID, } if _, err = dao.DeleteEntity(db, recipeSteps, "RecipeID"); err != nil { return err } } if err = updateFoodRecipeItemAndStep(ctx, db, recipeID, itemList, stepList); err != nil { return err } dao.Commit(db) return err } func QueryFoodRecipes(ctx *jxcontext.Context, keyword, userID string) (recipeList []*model.FoodRecipe, err error) { recipeList, err = dao.QueryFoodRecipes(dao.GetDB(), keyword, userID) return recipeList, err }