Ver Fonte

Merge branch 'dev-cy/end250630'

chenying2100 há 3 meses atrás
pai
commit
86745f5665
25 ficheiros alterados com 1639 adições e 2 exclusões
  1. 105 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRecipeCategoryController.java
  2. 105 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRecipeController.java
  3. 92 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRecipe.java
  4. 52 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRecipeCategory.java
  5. 72 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRecipeFoodIngredient.java
  6. 87 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRecipeBo.java
  7. 46 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRecipeCategoryBo.java
  8. 67 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRecipeFoodIngredientBo.java
  9. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRecipeCategoryVo.java
  10. 84 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRecipeFoodIngredientVo.java
  11. 109 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRecipeVo.java
  12. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRecipeCategoryMapper.java
  13. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRecipeFoodIngredientMapper.java
  14. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRecipeMapper.java
  15. 68 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRecipeCategoryService.java
  16. 68 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRecipeFoodIngredientService.java
  17. 68 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRecipeService.java
  18. 7 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDiseaseLabelServiceImpl.java
  19. 144 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeCategoryServiceImpl.java
  20. 137 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeFoodIngredientServiceImpl.java
  21. 142 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeServiceImpl.java
  22. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRecipeCategoryMapper.xml
  23. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRecipeFoodIngredientMapper.xml
  24. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRecipeMapper.xml
  25. 63 0
      script/sql/biz/create.sql

+ 105 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRecipeCategoryController.java

@@ -0,0 +1,105 @@
+package org.dromara.system.controller.system;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SysRecipeCategoryVo;
+import org.dromara.system.domain.bo.SysRecipeCategoryBo;
+import org.dromara.system.service.ISysRecipeCategoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 食谱分类管理
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/recipeCategory")
+public class SysRecipeCategoryController extends BaseController {
+
+    private final ISysRecipeCategoryService sysRecipeCategoryService;
+
+    /**
+     * 查询食谱分类管理列表
+     */
+    @SaCheckPermission("system:recipeCategory:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysRecipeCategoryVo> list(SysRecipeCategoryBo bo, PageQuery pageQuery) {
+        return sysRecipeCategoryService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出食谱分类管理列表
+     */
+    @SaCheckPermission("system:recipeCategory:export")
+    @Log(title = "食谱分类管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysRecipeCategoryBo bo, HttpServletResponse response) {
+        List<SysRecipeCategoryVo> list = sysRecipeCategoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "食谱分类管理", SysRecipeCategoryVo.class, response);
+    }
+
+    /**
+     * 获取食谱分类管理详细信息
+     *
+     * @param recipeCategoryId 主键
+     */
+    @SaCheckPermission("system:recipeCategory:query")
+    @GetMapping("/{recipeCategoryId}")
+    public R<SysRecipeCategoryVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long recipeCategoryId) {
+        return R.ok(sysRecipeCategoryService.queryById(recipeCategoryId));
+    }
+
+    /**
+     * 新增食谱分类管理
+     */
+    @SaCheckPermission("system:recipeCategory:add")
+    @Log(title = "食谱分类管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysRecipeCategoryBo bo) {
+        return toAjax(sysRecipeCategoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改食谱分类管理
+     */
+    @SaCheckPermission("system:recipeCategory:edit")
+    @Log(title = "食谱分类管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysRecipeCategoryBo bo) {
+        return toAjax(sysRecipeCategoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除食谱分类管理
+     *
+     * @param recipeCategoryIds 主键串
+     */
+    @SaCheckPermission("system:recipeCategory:remove")
+    @Log(title = "食谱分类管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{recipeCategoryIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] recipeCategoryIds) {
+        return toAjax(sysRecipeCategoryService.deleteWithValidByIds(List.of(recipeCategoryIds), true));
+    }
+}

+ 105 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRecipeController.java

@@ -0,0 +1,105 @@
+package org.dromara.system.controller.system;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SysRecipeVo;
+import org.dromara.system.domain.bo.SysRecipeBo;
+import org.dromara.system.service.ISysRecipeService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 食谱管理
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/recipe")
+public class SysRecipeController extends BaseController {
+
+    private final ISysRecipeService sysRecipeService;
+
+    /**
+     * 查询食谱管理列表
+     */
+    @SaCheckPermission("system:recipe:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysRecipeVo> list(SysRecipeBo bo, PageQuery pageQuery) {
+        return sysRecipeService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出食谱管理列表
+     */
+    @SaCheckPermission("system:recipe:export")
+    @Log(title = "食谱管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysRecipeBo bo, HttpServletResponse response) {
+        List<SysRecipeVo> list = sysRecipeService.queryList(bo);
+        ExcelUtil.exportExcel(list, "食谱管理", SysRecipeVo.class, response);
+    }
+
+    /**
+     * 获取食谱管理详细信息
+     *
+     * @param recipeId 主键
+     */
+    @SaCheckPermission("system:recipe:query")
+    @GetMapping("/{recipeId}")
+    public R<SysRecipeVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long recipeId) {
+        return R.ok(sysRecipeService.queryById(recipeId));
+    }
+
+    /**
+     * 新增食谱管理
+     */
+    @SaCheckPermission("system:recipe:add")
+    @Log(title = "食谱管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysRecipeBo bo) {
+        return toAjax(sysRecipeService.insertByBo(bo));
+    }
+
+    /**
+     * 修改食谱管理
+     */
+    @SaCheckPermission("system:recipe:edit")
+    @Log(title = "食谱管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysRecipeBo bo) {
+        return toAjax(sysRecipeService.updateByBo(bo));
+    }
+
+    /**
+     * 删除食谱管理
+     *
+     * @param recipeIds 主键串
+     */
+    @SaCheckPermission("system:recipe:remove")
+    @Log(title = "食谱管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{recipeIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] recipeIds) {
+        return toAjax(sysRecipeService.deleteWithValidByIds(List.of(recipeIds), true));
+    }
+}

+ 92 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRecipe.java

@@ -0,0 +1,92 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 食谱管理对象 sys_recipe
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_recipe")
+public class SysRecipe extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "recipe_id")
+    private Long recipeId;
+
+    /**
+     * 食谱名称
+     */
+    private String name;
+
+    /**
+     * 食谱分类ID
+     */
+    private Long categoryId;
+
+    /**
+     * 基本膳食
+     */
+    private String baseDiet;
+
+    /**
+     * 餐次
+     */
+    private String mealTime;
+
+    /**
+     * 食谱价格
+     */
+    private Long price;
+
+    /**
+     * 适用疾病(可用逗号分隔多个)
+     */
+    private String suitableDisease;
+
+    /**
+     * 忌食病症(可用逗号分隔多个)
+     */
+    private String avoidDisease;
+
+    /**
+     * 适用科室(可用逗号分隔多个)
+     */
+    private String suitableDept;
+
+    /**
+     * 智能推荐(0否 1是)
+     */
+    private String smartRecommend;
+
+    /**
+     * 制作方式
+     */
+    private String cookingMethod;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRecipeCategory.java

@@ -0,0 +1,52 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 食谱分类管理对象 sys_recipe_category
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_recipe_category")
+public class SysRecipeCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "recipe_category_id")
+    private Long recipeCategoryId;
+
+    /**
+     * 食谱分类名称
+     */
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 72 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRecipeFoodIngredient.java

@@ -0,0 +1,72 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 食谱与食材关联对象 sys_recipe_food_ingredient
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_recipe_food_ingredient")
+public class SysRecipeFoodIngredient extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 食谱ID
+     */
+    private Long recipeId;
+
+    /**
+     * 食材ID
+     */
+    private Long foodIngredientId;
+
+    /**
+     * 用量(可选,单位自定义)
+     */
+    private Long quantity;
+
+    /**
+     * 热量(kcal)
+     */
+    private Long calories;
+
+    /**
+     * 排序(可选)
+     */
+    private Long sort;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 87 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRecipeBo.java

@@ -0,0 +1,87 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysRecipe;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 食谱管理业务对象 sys_recipe
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysRecipe.class, reverseConvertGenerate = false)
+public class SysRecipeBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long recipeId;
+
+    /**
+     * 食谱名称
+     */
+    @NotBlank(message = "食谱名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 食谱分类ID
+     */
+    @NotNull(message = "食谱分类ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long categoryId;
+
+    /**
+     * 基本膳食
+     */
+    private String baseDiet;
+
+    /**
+     * 餐次
+     */
+    private String mealTime;
+
+    /**
+     * 食谱价格
+     */
+    private Long price;
+
+    /**
+     * 适用疾病(可用逗号分隔多个)
+     */
+    private String suitableDisease;
+
+    /**
+     * 忌食病症(可用逗号分隔多个)
+     */
+    private String avoidDisease;
+
+    /**
+     * 适用科室(可用逗号分隔多个)
+     */
+    private String suitableDept;
+
+    /**
+     * 智能推荐(0否 1是)
+     */
+    private String smartRecommend;
+
+    /**
+     * 制作方式
+     */
+    private String cookingMethod;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 46 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRecipeCategoryBo.java

@@ -0,0 +1,46 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysRecipeCategory;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 食谱分类管理业务对象 sys_recipe_category
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysRecipeCategory.class, reverseConvertGenerate = false)
+public class SysRecipeCategoryBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long recipeCategoryId;
+
+    /**
+     * 食谱分类名称
+     */
+    @NotBlank(message = "食谱分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 67 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRecipeFoodIngredientBo.java

@@ -0,0 +1,67 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysRecipeFoodIngredient;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 食谱与食材关联业务对象 sys_recipe_food_ingredient
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysRecipeFoodIngredient.class, reverseConvertGenerate = false)
+public class SysRecipeFoodIngredientBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 食谱ID
+     */
+    @NotNull(message = "食谱ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long recipeId;
+
+    /**
+     * 食材ID
+     */
+    @NotNull(message = "食材ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long foodIngredientId;
+
+    /**
+     * 用量(可选,单位自定义)
+     */
+    private Long quantity;
+
+    /**
+     * 热量(kcal)
+     */
+    private Long calories;
+
+    /**
+     * 排序(可选)
+     */
+    private Long sort;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRecipeCategoryVo.java

@@ -0,0 +1,57 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysRecipeCategory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 食谱分类管理视图对象 sys_recipe_category
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysRecipeCategory.class)
+public class SysRecipeCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long recipeCategoryId;
+
+    /**
+     * 食谱分类名称
+     */
+    @ExcelProperty(value = "食谱分类名称")
+    private String name;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 84 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRecipeFoodIngredientVo.java

@@ -0,0 +1,84 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysRecipeFoodIngredient;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 食谱与食材关联视图对象 sys_recipe_food_ingredient
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysRecipeFoodIngredient.class)
+public class SysRecipeFoodIngredientVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 食谱ID
+     */
+    @ExcelProperty(value = "食谱ID")
+    private Long recipeId;
+
+    /**
+     * 食材ID
+     */
+    @ExcelProperty(value = "食材ID")
+    private Long foodIngredientId;
+
+    /**
+     * 用量(可选,单位自定义)
+     */
+    @ExcelProperty(value = "用量", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=选,单位自定义")
+    private Long quantity;
+
+    /**
+     * 热量(kcal)
+     */
+    @ExcelProperty(value = "热量", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "k=cal")
+    private Long calories;
+
+    /**
+     * 排序(可选)
+     */
+    @ExcelProperty(value = "排序", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=选")
+    private Long sort;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 109 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRecipeVo.java

@@ -0,0 +1,109 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysRecipe;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 食谱管理视图对象 sys_recipe
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysRecipe.class)
+public class SysRecipeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long recipeId;
+
+    /**
+     * 食谱名称
+     */
+    @ExcelProperty(value = "食谱名称")
+    private String name;
+
+    /**
+     * 食谱分类ID
+     */
+    @ExcelProperty(value = "食谱分类ID")
+    private Long categoryId;
+
+    /**
+     * 基本膳食
+     */
+    @ExcelProperty(value = "基本膳食")
+    private String baseDiet;
+
+    /**
+     * 餐次
+     */
+    @ExcelProperty(value = "餐次")
+    private String mealTime;
+
+    /**
+     * 食谱价格
+     */
+    @ExcelProperty(value = "食谱价格")
+    private Long price;
+
+    /**
+     * 适用疾病(可用逗号分隔多个)
+     */
+    @ExcelProperty(value = "适用疾病", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=用逗号分隔多个")
+    private String suitableDisease;
+
+    /**
+     * 忌食病症(可用逗号分隔多个)
+     */
+    @ExcelProperty(value = "忌食病症", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=用逗号分隔多个")
+    private String avoidDisease;
+
+    /**
+     * 适用科室(可用逗号分隔多个)
+     */
+    @ExcelProperty(value = "适用科室", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=用逗号分隔多个")
+    private String suitableDept;
+
+    /**
+     * 智能推荐(0否 1是)
+     */
+    @ExcelProperty(value = "智能推荐", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=否,1=是")
+    private String smartRecommend;
+
+    /**
+     * 制作方式
+     */
+    @ExcelProperty(value = "制作方式")
+    private String cookingMethod;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRecipeCategoryMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysRecipeCategory;
+import org.dromara.system.domain.vo.SysRecipeCategoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 食谱分类管理Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+public interface SysRecipeCategoryMapper extends BaseMapperPlus<SysRecipeCategory, SysRecipeCategoryVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRecipeFoodIngredientMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysRecipeFoodIngredient;
+import org.dromara.system.domain.vo.SysRecipeFoodIngredientVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 食谱与食材关联Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+public interface SysRecipeFoodIngredientMapper extends BaseMapperPlus<SysRecipeFoodIngredient, SysRecipeFoodIngredientVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRecipeMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysRecipe;
+import org.dromara.system.domain.vo.SysRecipeVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 食谱管理Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+public interface SysRecipeMapper extends BaseMapperPlus<SysRecipe, SysRecipeVo> {
+
+}

+ 68 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRecipeCategoryService.java

@@ -0,0 +1,68 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.vo.SysRecipeCategoryVo;
+import org.dromara.system.domain.bo.SysRecipeCategoryBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 食谱分类管理Service接口
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+public interface ISysRecipeCategoryService {
+
+    /**
+     * 查询食谱分类管理
+     *
+     * @param recipeCategoryId 主键
+     * @return 食谱分类管理
+     */
+    SysRecipeCategoryVo queryById(Long recipeCategoryId);
+
+    /**
+     * 分页查询食谱分类管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 食谱分类管理分页列表
+     */
+    TableDataInfo<SysRecipeCategoryVo> queryPageList(SysRecipeCategoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的食谱分类管理列表
+     *
+     * @param bo 查询条件
+     * @return 食谱分类管理列表
+     */
+    List<SysRecipeCategoryVo> queryList(SysRecipeCategoryBo bo);
+
+    /**
+     * 新增食谱分类管理
+     *
+     * @param bo 食谱分类管理
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysRecipeCategoryBo bo);
+
+    /**
+     * 修改食谱分类管理
+     *
+     * @param bo 食谱分类管理
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysRecipeCategoryBo bo);
+
+    /**
+     * 校验并批量删除食谱分类管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 68 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRecipeFoodIngredientService.java

@@ -0,0 +1,68 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.vo.SysRecipeFoodIngredientVo;
+import org.dromara.system.domain.bo.SysRecipeFoodIngredientBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 食谱与食材关联Service接口
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+public interface ISysRecipeFoodIngredientService {
+
+    /**
+     * 查询食谱与食材关联
+     *
+     * @param id 主键
+     * @return 食谱与食材关联
+     */
+    SysRecipeFoodIngredientVo queryById(Long id);
+
+    /**
+     * 分页查询食谱与食材关联列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 食谱与食材关联分页列表
+     */
+    TableDataInfo<SysRecipeFoodIngredientVo> queryPageList(SysRecipeFoodIngredientBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的食谱与食材关联列表
+     *
+     * @param bo 查询条件
+     * @return 食谱与食材关联列表
+     */
+    List<SysRecipeFoodIngredientVo> queryList(SysRecipeFoodIngredientBo bo);
+
+    /**
+     * 新增食谱与食材关联
+     *
+     * @param bo 食谱与食材关联
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysRecipeFoodIngredientBo bo);
+
+    /**
+     * 修改食谱与食材关联
+     *
+     * @param bo 食谱与食材关联
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysRecipeFoodIngredientBo bo);
+
+    /**
+     * 校验并批量删除食谱与食材关联信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 68 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRecipeService.java

@@ -0,0 +1,68 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.vo.SysRecipeVo;
+import org.dromara.system.domain.bo.SysRecipeBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 食谱管理Service接口
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+public interface ISysRecipeService {
+
+    /**
+     * 查询食谱管理
+     *
+     * @param recipeId 主键
+     * @return 食谱管理
+     */
+    SysRecipeVo queryById(Long recipeId);
+
+    /**
+     * 分页查询食谱管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 食谱管理分页列表
+     */
+    TableDataInfo<SysRecipeVo> queryPageList(SysRecipeBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的食谱管理列表
+     *
+     * @param bo 查询条件
+     * @return 食谱管理列表
+     */
+    List<SysRecipeVo> queryList(SysRecipeBo bo);
+
+    /**
+     * 新增食谱管理
+     *
+     * @param bo 食谱管理
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysRecipeBo bo);
+
+    /**
+     * 修改食谱管理
+     *
+     * @param bo 食谱管理
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysRecipeBo bo);
+
+    /**
+     * 校验并批量删除食谱管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 7 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDiseaseLabelServiceImpl.java

@@ -108,10 +108,15 @@ public class SysDiseaseLabelServiceImpl implements ISysDiseaseLabelService {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<SysDiseaseLabel> lqw = Wrappers.lambdaQuery();
         lqw.orderByAsc(SysDiseaseLabel::getLabelId);
-        lqw.like(StringUtils.isNotBlank(bo.getLabelName()), SysDiseaseLabel::getLabelName, bo.getLabelName());
-        lqw.eq(StringUtils.isNotBlank(bo.getLabelCode()), SysDiseaseLabel::getLabelCode, bo.getLabelCode());
+//        lqw.like(StringUtils.isNotBlank(bo.getLabelName()), SysDiseaseLabel::getLabelName, bo.getLabelName());
+//        lqw.eq(StringUtils.isNotBlank(bo.getLabelCode()), SysDiseaseLabel::getLabelCode, bo.getLabelCode());
         lqw.eq(StringUtils.isNotBlank(bo.getCategory()), SysDiseaseLabel::getCategory, bo.getCategory());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDiseaseLabel::getStatus, bo.getStatus());
+        lqw.and(StringUtils.isNotBlank(bo.getLabelCode()), (wrapper) -> {
+            wrapper.like(SysDiseaseLabel::getLabelCode, bo.getLabelCode())
+                .or()
+                .like(SysDiseaseLabel::getLabelName, bo.getLabelCode());
+        });
         return lqw;
     }
 

+ 144 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeCategoryServiceImpl.java

@@ -0,0 +1,144 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.util.ObjUtil;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysRecipeCategoryBo;
+import org.dromara.system.domain.vo.SysRecipeCategoryVo;
+import org.dromara.system.domain.SysRecipeCategory;
+import org.dromara.system.mapper.SysRecipeCategoryMapper;
+import org.dromara.system.service.ISysRecipeCategoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 食谱分类管理Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysRecipeCategoryServiceImpl implements ISysRecipeCategoryService {
+
+    private final SysRecipeCategoryMapper baseMapper;
+
+    /**
+     * 查询食谱分类管理
+     *
+     * @param recipeCategoryId 主键
+     * @return 食谱分类管理
+     */
+    @Override
+    public SysRecipeCategoryVo queryById(Long recipeCategoryId) {
+        return baseMapper.selectVoById(recipeCategoryId);
+    }
+
+    /**
+     * 分页查询食谱分类管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 食谱分类管理分页列表
+     */
+    @Override
+    public TableDataInfo<SysRecipeCategoryVo> queryPageList(SysRecipeCategoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysRecipeCategory> lqw = buildQueryWrapper(bo);
+        Page<SysRecipeCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的食谱分类管理列表
+     *
+     * @param bo 查询条件
+     * @return 食谱分类管理列表
+     */
+    @Override
+    public List<SysRecipeCategoryVo> queryList(SysRecipeCategoryBo bo) {
+        LambdaQueryWrapper<SysRecipeCategory> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysRecipeCategory> buildQueryWrapper(SysRecipeCategoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysRecipeCategory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysRecipeCategory::getRecipeCategoryId);
+        lqw.like(StringUtils.isNotBlank(bo.getName()), SysRecipeCategory::getName, bo.getName());
+        lqw.eq(bo.getSort() != null, SysRecipeCategory::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysRecipeCategory::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增食谱分类管理
+     *
+     * @param bo 食谱分类管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysRecipeCategoryBo bo) {
+        SysRecipeCategory add = MapstructUtils.convert(bo, SysRecipeCategory.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setRecipeCategoryId(add.getRecipeCategoryId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改食谱分类管理
+     *
+     * @param bo 食谱分类管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysRecipeCategoryBo bo) {
+        SysRecipeCategory update = MapstructUtils.convert(bo, SysRecipeCategory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysRecipeCategory entity) {
+        if (ObjUtil.isNull(entity.getRecipeCategoryId())) {
+            long cnt = baseMapper.selectCount(Wrappers.lambdaQuery(SysRecipeCategory.class)
+                .eq(SysRecipeCategory::getName, entity.getName()));
+            if (cnt > 0) {
+                throw new ServiceException("食材名称已经存在!");
+            }
+        } else {
+            //TODO 做一些数据校验,如唯一约束
+        }
+    }
+
+    /**
+     * 校验并批量删除食谱分类管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 137 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeFoodIngredientServiceImpl.java

@@ -0,0 +1,137 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysRecipeFoodIngredientBo;
+import org.dromara.system.domain.vo.SysRecipeFoodIngredientVo;
+import org.dromara.system.domain.SysRecipeFoodIngredient;
+import org.dromara.system.mapper.SysRecipeFoodIngredientMapper;
+import org.dromara.system.service.ISysRecipeFoodIngredientService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 食谱与食材关联Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysRecipeFoodIngredientServiceImpl implements ISysRecipeFoodIngredientService {
+
+    private final SysRecipeFoodIngredientMapper baseMapper;
+
+    /**
+     * 查询食谱与食材关联
+     *
+     * @param id 主键
+     * @return 食谱与食材关联
+     */
+    @Override
+    public SysRecipeFoodIngredientVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询食谱与食材关联列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 食谱与食材关联分页列表
+     */
+    @Override
+    public TableDataInfo<SysRecipeFoodIngredientVo> queryPageList(SysRecipeFoodIngredientBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysRecipeFoodIngredient> lqw = buildQueryWrapper(bo);
+        Page<SysRecipeFoodIngredientVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的食谱与食材关联列表
+     *
+     * @param bo 查询条件
+     * @return 食谱与食材关联列表
+     */
+    @Override
+    public List<SysRecipeFoodIngredientVo> queryList(SysRecipeFoodIngredientBo bo) {
+        LambdaQueryWrapper<SysRecipeFoodIngredient> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysRecipeFoodIngredient> buildQueryWrapper(SysRecipeFoodIngredientBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysRecipeFoodIngredient> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysRecipeFoodIngredient::getId);
+        lqw.eq(bo.getRecipeId() != null, SysRecipeFoodIngredient::getRecipeId, bo.getRecipeId());
+        lqw.eq(bo.getFoodIngredientId() != null, SysRecipeFoodIngredient::getFoodIngredientId, bo.getFoodIngredientId());
+        lqw.eq(bo.getQuantity() != null, SysRecipeFoodIngredient::getQuantity, bo.getQuantity());
+        lqw.eq(bo.getCalories() != null, SysRecipeFoodIngredient::getCalories, bo.getCalories());
+        lqw.eq(bo.getSort() != null, SysRecipeFoodIngredient::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysRecipeFoodIngredient::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增食谱与食材关联
+     *
+     * @param bo 食谱与食材关联
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysRecipeFoodIngredientBo bo) {
+        SysRecipeFoodIngredient add = MapstructUtils.convert(bo, SysRecipeFoodIngredient.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改食谱与食材关联
+     *
+     * @param bo 食谱与食材关联
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysRecipeFoodIngredientBo bo) {
+        SysRecipeFoodIngredient update = MapstructUtils.convert(bo, SysRecipeFoodIngredient.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysRecipeFoodIngredient entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除食谱与食材关联信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 142 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeServiceImpl.java

@@ -0,0 +1,142 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysRecipeBo;
+import org.dromara.system.domain.vo.SysRecipeVo;
+import org.dromara.system.domain.SysRecipe;
+import org.dromara.system.mapper.SysRecipeMapper;
+import org.dromara.system.service.ISysRecipeService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 食谱管理Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-01
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysRecipeServiceImpl implements ISysRecipeService {
+
+    private final SysRecipeMapper baseMapper;
+
+    /**
+     * 查询食谱管理
+     *
+     * @param recipeId 主键
+     * @return 食谱管理
+     */
+    @Override
+    public SysRecipeVo queryById(Long recipeId){
+        return baseMapper.selectVoById(recipeId);
+    }
+
+    /**
+     * 分页查询食谱管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 食谱管理分页列表
+     */
+    @Override
+    public TableDataInfo<SysRecipeVo> queryPageList(SysRecipeBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysRecipe> lqw = buildQueryWrapper(bo);
+        Page<SysRecipeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的食谱管理列表
+     *
+     * @param bo 查询条件
+     * @return 食谱管理列表
+     */
+    @Override
+    public List<SysRecipeVo> queryList(SysRecipeBo bo) {
+        LambdaQueryWrapper<SysRecipe> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysRecipe> buildQueryWrapper(SysRecipeBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysRecipe> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysRecipe::getRecipeId);
+        lqw.like(StringUtils.isNotBlank(bo.getName()), SysRecipe::getName, bo.getName());
+        lqw.eq(bo.getCategoryId() != null, SysRecipe::getCategoryId, bo.getCategoryId());
+        lqw.eq(StringUtils.isNotBlank(bo.getBaseDiet()), SysRecipe::getBaseDiet, bo.getBaseDiet());
+        lqw.eq(StringUtils.isNotBlank(bo.getMealTime()), SysRecipe::getMealTime, bo.getMealTime());
+        lqw.eq(bo.getPrice() != null, SysRecipe::getPrice, bo.getPrice());
+        lqw.eq(StringUtils.isNotBlank(bo.getSuitableDisease()), SysRecipe::getSuitableDisease, bo.getSuitableDisease());
+        lqw.eq(StringUtils.isNotBlank(bo.getAvoidDisease()), SysRecipe::getAvoidDisease, bo.getAvoidDisease());
+        lqw.eq(StringUtils.isNotBlank(bo.getSuitableDept()), SysRecipe::getSuitableDept, bo.getSuitableDept());
+        lqw.eq(StringUtils.isNotBlank(bo.getSmartRecommend()), SysRecipe::getSmartRecommend, bo.getSmartRecommend());
+        lqw.eq(StringUtils.isNotBlank(bo.getCookingMethod()), SysRecipe::getCookingMethod, bo.getCookingMethod());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysRecipe::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增食谱管理
+     *
+     * @param bo 食谱管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysRecipeBo bo) {
+        SysRecipe add = MapstructUtils.convert(bo, SysRecipe.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setRecipeId(add.getRecipeId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改食谱管理
+     *
+     * @param bo 食谱管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysRecipeBo bo) {
+        SysRecipe update = MapstructUtils.convert(bo, SysRecipe.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysRecipe entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除食谱管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRecipeCategoryMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysRecipeCategoryMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRecipeFoodIngredientMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysRecipeFoodIngredientMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRecipeMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysRecipeMapper">
+
+</mapper>

+ 63 - 0
script/sql/biz/create.sql

@@ -127,3 +127,66 @@ CREATE TABLE sys_food_ingredient (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食材管理表';
 
 
+CREATE TABLE sys_recipe_category (
+    recipe_category_id     BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+    tenant_id varchar(20) default '000000' null comment '租户编号',
+    name            VARCHAR(100) NOT NULL COMMENT '食谱分类名称',
+    sort            INT DEFAULT 0 COMMENT '排序',
+    -- 系统字段
+    status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+    del_flag char default '0' null comment '删除标志(0代表存在 1代表删除)',
+    create_dept  bigint null comment '创建部门',
+    create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
+    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
+    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食谱分类管理表';
+
+
+CREATE TABLE sys_recipe (
+    recipe_id         BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+    tenant_id  varchar(20) default '000000' null comment '租户编号',
+    name              VARCHAR(100) NOT NULL COMMENT '食谱名称',
+    category_id       BIGINT NOT NULL COMMENT '食谱分类ID',
+    base_diet         VARCHAR(100) DEFAULT NULL COMMENT '基本膳食',
+    meal_time         VARCHAR(100) DEFAULT NULL COMMENT '餐次',
+    price             DECIMAL(10,2) DEFAULT 0.00 COMMENT '食谱价格',
+    suitable_disease  VARCHAR(255) DEFAULT NULL COMMENT '适用疾病(可用逗号分隔多个)',
+    avoid_disease     VARCHAR(255) DEFAULT NULL COMMENT '忌食病症(可用逗号分隔多个)',
+    suitable_dept     VARCHAR(255) DEFAULT NULL COMMENT '适用科室(可用逗号分隔多个)',
+    smart_recommend   char(1) DEFAULT 1 COMMENT '智能推荐(0否 1是)',
+    cooking_method    VARCHAR(255) DEFAULT NULL COMMENT '制作方式',
+
+    -- 系统字段
+    status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+    del_flag char default '0' null comment '删除标志(0代表存在 1代表删除)',
+    create_dept  bigint null comment '创建部门',
+    create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
+    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
+    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食谱管理表';
+
+
+
+CREATE TABLE sys_recipe_food_ingredient (
+    id                  BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+    tenant_id  varchar(20) default '000000' null comment '租户编号',
+    recipe_id           BIGINT NOT NULL COMMENT '食谱ID',
+    food_ingredient_id  BIGINT NOT NULL COMMENT '食材ID',
+    quantity            DECIMAL(10,2) DEFAULT 0.00 COMMENT '用量(可选,单位自定义)',
+    calories            DECIMAL(10,2) DEFAULT 0.00 COMMENT '热量(kcal)',
+    sort                INT DEFAULT 0 COMMENT '排序(可选)',
+    remark              VARCHAR(255) DEFAULT NULL COMMENT '备注',
+
+    -- 系统字段
+    status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+    del_flag char default '0' null comment '删除标志(0代表存在 1代表删除)',
+    create_dept  bigint null comment '创建部门',
+    create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
+    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
+    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食谱与食材关联表';
+
+