chenying2100 3 kuukautta sitten
vanhempi
sitoutus
5501c6a8ca
23 muutettua tiedostoa jossa 1313 lisäystä ja 3 poistoa
  1. BIN
      ruoyi-admin/src/main/resources/download-template/diseaseLabel.xlsx
  2. 18 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java
  3. 36 0
      ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java
  4. 125 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDiseaseLabelController.java
  5. 111 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysFoodCategoryController.java
  6. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDiseaseLabel.java
  7. 59 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysFoodCategory.java
  8. 52 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDiseaseLabelBo.java
  9. 51 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysFoodCategoryBo.java
  10. 67 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDiseaseLabelVo.java
  11. 66 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysFoodCategoryVo.java
  12. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDiseaseLabel.java
  13. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDiseaseLabelMapper.java
  14. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysFoodCategoryMapper.java
  15. 72 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDiseaseLabelService.java
  16. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysFoodCategoryService.java
  17. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/QiNiuContentServiceImpl.java
  18. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java
  19. 218 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDiseaseLabelServiceImpl.java
  20. 175 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysFoodCategoryServiceImpl.java
  21. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDiseaseLabelMapper.xml
  22. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysFoodCategoryMapper.xml
  23. 33 1
      script/sql/biz/create.sql

BIN
ruoyi-admin/src/main/resources/download-template/diseaseLabel.xlsx


+ 18 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java

@@ -16,6 +16,24 @@ import java.nio.charset.StandardCharsets;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public class FileUtils extends FileUtil {
 
+    /**
+     * 从文件名中提取扩展名
+     *
+     * @param fileName 文件名
+     * @return 扩展名
+     */
+    public static String getFileExtension(String fileName) {
+        if (fileName == null || fileName.isEmpty()) {
+            return "";
+        }
+
+        int dotIndex = fileName.lastIndexOf('.');
+        if (dotIndex > 0 && dotIndex < fileName.length() - 1) {
+            return fileName.substring(dotIndex + 1);
+        }
+        return "";
+    }
+
     /**
      * 下载文件名重新编码
      *

+ 36 - 0
ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java

@@ -20,10 +20,12 @@ import org.dromara.common.excel.convert.ExcelBigNumberConvert;
 import org.dromara.common.excel.core.*;
 import org.dromara.common.excel.handler.DataWriteHandler;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -92,6 +94,40 @@ public class ExcelUtil {
         }
     }
 
+    public static void downLoadTemplate(String fileName, String title, HttpServletResponse response) {
+        StringBuffer path = new StringBuffer();
+        //D:\workspace\big-member-manage\jeecg-module-system\jeecg-system-biz\src\main\resources\jeecg\download-template
+        path.append("download-template");
+        path.append(File.separator);
+        path.append(fileName);
+
+        org.springframework.core.io.ClassPathResource resource = new org.springframework.core.io.ClassPathResource(path.toString());
+        if (!resource.exists()) {
+            throw new RuntimeException("文件路径为空");
+        }
+
+        // 创建文件输入流
+        try {
+            InputStream is = resource.getInputStream();
+            OutputStream out = response.getOutputStream();
+            // 设置响应头
+//            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(title + "." + FileUtils.getFileExtension(fileName), "UTF-8"));
+            response.setHeader("content-Type", "application/vnd.ms-excel");
+            // 将文件内容写入响应流
+            byte[] buffer = new byte[4096];
+            int bytesRead;
+            while ((bytesRead = is.read(buffer)) != -1) {
+                out.write(buffer, 0, bytesRead);
+            }
+            // 刷新并关闭输出流
+            out.flush();
+        } catch (IOException e) {
+            // 内部服务器错误
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
+    }
+
     /**
      * 导出excel
      *

+ 125 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDiseaseLabelController.java

@@ -0,0 +1,125 @@
+package org.dromara.system.controller.system;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.apache.commons.lang3.StringUtils;
+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.SysDiseaseLabelVo;
+import org.dromara.system.domain.bo.SysDiseaseLabelBo;
+import org.dromara.system.service.ISysDiseaseLabelService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 疾病/部位标签
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/diseaseLabel")
+public class SysDiseaseLabelController extends BaseController {
+
+    private final ISysDiseaseLabelService sysDiseaseLabelService;
+
+    /**
+     * 查询疾病/部位标签列表
+     */
+    @SaCheckPermission("system:diseaseLabel:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysDiseaseLabelVo> list(SysDiseaseLabelBo bo, PageQuery pageQuery) {
+        return sysDiseaseLabelService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出疾病/部位标签列表
+     */
+    @SaCheckPermission("system:diseaseLabel:export")
+    @Log(title = "疾病/部位标签", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysDiseaseLabelBo bo, HttpServletResponse response) {
+        List<SysDiseaseLabelVo> list = sysDiseaseLabelService.queryList(bo);
+        ExcelUtil.exportExcel(list, "疾病/部位标签", SysDiseaseLabelVo.class, response);
+    }
+
+    /**
+     * 获取疾病/部位标签详细信息
+     *
+     * @param labelId 主键
+     */
+    @SaCheckPermission("system:diseaseLabel:query")
+    @GetMapping("/{labelId}")
+    public R<SysDiseaseLabelVo> getInfo(@NotNull(message = "主键不能为空")
+                                        @PathVariable Long labelId) {
+        return R.ok(sysDiseaseLabelService.queryById(labelId));
+    }
+
+    /**
+     * 新增疾病/部位标签
+     */
+    @SaCheckPermission("system:diseaseLabel:add")
+    @Log(title = "疾病/部位标签", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysDiseaseLabelBo bo) {
+        return toAjax(sysDiseaseLabelService.insertByBo(bo));
+    }
+
+    /**
+     * 修改疾病/部位标签
+     */
+    @SaCheckPermission("system:diseaseLabel:edit")
+    @Log(title = "疾病/部位标签", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysDiseaseLabelBo bo) {
+        return toAjax(sysDiseaseLabelService.updateByBo(bo));
+    }
+
+    /**
+     * 删除疾病/部位标签
+     *
+     * @param labelIds 主键串
+     */
+    @SaCheckPermission("system:diseaseLabel:remove")
+    @Log(title = "疾病/部位标签", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{labelIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] labelIds) {
+        return toAjax(sysDiseaseLabelService.deleteWithValidByIds(List.of(labelIds), true));
+    }
+
+    @SaCheckPermission("system:diseaseLabel:downLoadTemplate")
+    @RequestMapping(value = "/downLoadTemplate", method = RequestMethod.GET)
+    public void downLoadTemplate(HttpServletResponse response) {
+        ExcelUtil.downLoadTemplate("diseaseLabel.xlsx", "疾病_部位标签模版", response);
+    }
+
+    @SaCheckPermission("system:diseaseLabel:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public R<?> importExcel(MultipartFile file) throws Exception {
+        return sysDiseaseLabelService.importExcel(file);
+    }
+}

+ 111 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysFoodCategoryController.java

@@ -0,0 +1,111 @@
+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.SysFoodCategoryVo;
+import org.dromara.system.domain.bo.SysFoodCategoryBo;
+import org.dromara.system.service.ISysFoodCategoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 食材分类
+ *
+ * @author Lion Li
+ * @date 2025-06-27
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/foodCategory")
+public class SysFoodCategoryController extends BaseController {
+
+    private final ISysFoodCategoryService sysFoodCategoryService;
+
+    /**
+     * 查询食材分类列表
+     */
+    @SaCheckPermission("system:foodCategory:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysFoodCategoryVo> list(SysFoodCategoryBo bo, PageQuery pageQuery) {
+        return sysFoodCategoryService.queryPageList(bo, pageQuery);
+    }
+
+    @SaCheckPermission("system:foodCategory:list")
+    @GetMapping("/listTree")
+    public TableDataInfo<SysFoodCategoryVo> listTree(SysFoodCategoryBo bo) {
+        return sysFoodCategoryService.listTree(bo);
+    }
+
+    /**
+     * 导出食材分类列表
+     */
+    @SaCheckPermission("system:foodCategory:export")
+    @Log(title = "食材分类", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysFoodCategoryBo bo, HttpServletResponse response) {
+        List<SysFoodCategoryVo> list = sysFoodCategoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "食材分类", SysFoodCategoryVo.class, response);
+    }
+
+    /**
+     * 获取食材分类详细信息
+     *
+     * @param foodCategoryId 主键
+     */
+    @SaCheckPermission("system:foodCategory:query")
+    @GetMapping("/{foodCategoryId}")
+    public R<SysFoodCategoryVo> getInfo(@NotNull(message = "主键不能为空")
+                                        @PathVariable Long foodCategoryId) {
+        return R.ok(sysFoodCategoryService.queryById(foodCategoryId));
+    }
+
+    /**
+     * 新增食材分类
+     */
+    @SaCheckPermission("system:foodCategory:add")
+    @Log(title = "食材分类", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysFoodCategoryBo bo) {
+        return toAjax(sysFoodCategoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改食材分类
+     */
+    @SaCheckPermission("system:foodCategory:edit")
+    @Log(title = "食材分类", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysFoodCategoryBo bo) {
+        return toAjax(sysFoodCategoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除食材分类
+     *
+     * @param foodCategoryIds 主键串
+     */
+    @SaCheckPermission("system:foodCategory:remove")
+    @Log(title = "食材分类", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{foodCategoryIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] foodCategoryIds) {
+        return toAjax(sysFoodCategoryService.deleteWithValidByIds(List.of(foodCategoryIds), true));
+    }
+}

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

@@ -0,0 +1,57 @@
+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_disease_label
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_disease_label")
+public class SysDiseaseLabel extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "label_id")
+    private Long labelId;
+
+    /**
+     * 疾病/部位名称
+     */
+    private String labelName;
+
+    /**
+     * 疾病/部位编码
+     */
+    private String labelCode;
+
+    /**
+     * 所属分类
+     */
+    private String category;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 59 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysFoodCategory.java

@@ -0,0 +1,59 @@
+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_food_category
+ *
+ * @author Lion Li
+ * @date 2025-06-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_food_category")
+public class SysFoodCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "food_category_id")
+    private Long foodCategoryId;
+
+    private Integer isDefault;
+
+    /**
+     * 分类名称
+     */
+    private String name;
+
+    /**
+     * 上级分类ID
+     */
+    private Long parentId;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

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

@@ -0,0 +1,52 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysDiseaseLabel;
+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_disease_label
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysDiseaseLabel.class, reverseConvertGenerate = false)
+public class SysDiseaseLabelBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long labelId;
+
+    /**
+     * 疾病/部位名称
+     */
+    @NotBlank(message = "疾病/部位名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String labelName;
+
+    /**
+     * 疾病/部位编码
+     */
+    @NotBlank(message = "疾病/部位编码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String labelCode;
+
+    /**
+     * 所属分类
+     */
+    private String category;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 51 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysFoodCategoryBo.java

@@ -0,0 +1,51 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysFoodCategory;
+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_food_category
+ *
+ * @author Lion Li
+ * @date 2025-06-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysFoodCategory.class, reverseConvertGenerate = false)
+public class SysFoodCategoryBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long foodCategoryId;
+
+    /**
+     * 分类名称
+     */
+    @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 上级分类ID
+     */
+    private Long parentId;
+
+    /**
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 67 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDiseaseLabelVo.java

@@ -0,0 +1,67 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysDiseaseLabel;
+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_disease_label
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysDiseaseLabel.class)
+public class SysDiseaseLabelVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long labelId;
+
+    /**
+     * 疾病/部位名称
+     */
+    @ExcelProperty(value = "疾病/部位名称")
+    private String labelName;
+
+    /**
+     * 疾病/部位编码
+     */
+    @ExcelProperty(value = "疾病/部位编码")
+    private String labelCode;
+
+    /**
+     * 所属分类
+     */
+    private String category;
+
+    /**
+     * 所属分类
+     */
+    @ExcelProperty(value = "所属分类名称")
+    private String categoryName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 66 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysFoodCategoryVo.java

@@ -0,0 +1,66 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysFoodCategory;
+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;
+import java.util.List;
+
+
+/**
+ * 食材分类视图对象 sys_food_category
+ *
+ * @author Lion Li
+ * @date 2025-06-27
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysFoodCategory.class)
+public class SysFoodCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long foodCategoryId;
+
+    private Integer isDefault;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String name;
+
+    /**
+     * 上级分类ID
+     */
+    @ExcelProperty(value = "上级分类ID")
+    private Long parentId;
+
+    /**
+     * 排序
+     */
+    @ExcelProperty(value = "排序")
+    private Long sort;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+    private List<SysFoodCategoryVo> children;
+}

+ 57 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDiseaseLabel.java

@@ -0,0 +1,57 @@
+package org.dromara.system.mapper;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 疾病/部位标签对象 sys_disease_label
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_disease_label")
+public class SysDiseaseLabel extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "label_id")
+    private Long labelId;
+
+    /**
+     * 疾病/部位名称
+     */
+    private String labelName;
+
+    /**
+     * 疾病/部位编码
+     */
+    private String labelCode;
+
+    /**
+     * 所属分类
+     */
+    private String category;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysDiseaseLabel;
+import org.dromara.system.domain.vo.SysDiseaseLabelVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 疾病/部位标签Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+public interface SysDiseaseLabelMapper extends BaseMapperPlus<SysDiseaseLabel, SysDiseaseLabelVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysFoodCategory;
+import org.dromara.system.domain.vo.SysFoodCategoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 食材分类Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-06-27
+ */
+public interface SysFoodCategoryMapper extends BaseMapperPlus<SysFoodCategory, SysFoodCategoryVo> {
+
+}

+ 72 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDiseaseLabelService.java

@@ -0,0 +1,72 @@
+package org.dromara.system.service;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.system.domain.vo.SysDiseaseLabelVo;
+import org.dromara.system.domain.bo.SysDiseaseLabelBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 疾病/部位标签Service接口
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+public interface ISysDiseaseLabelService {
+
+    /**
+     * 查询疾病/部位标签
+     *
+     * @param labelId 主键
+     * @return 疾病/部位标签
+     */
+    SysDiseaseLabelVo queryById(Long labelId);
+
+    /**
+     * 分页查询疾病/部位标签列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 疾病/部位标签分页列表
+     */
+    TableDataInfo<SysDiseaseLabelVo> queryPageList(SysDiseaseLabelBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的疾病/部位标签列表
+     *
+     * @param bo 查询条件
+     * @return 疾病/部位标签列表
+     */
+    List<SysDiseaseLabelVo> queryList(SysDiseaseLabelBo bo);
+
+    /**
+     * 新增疾病/部位标签
+     *
+     * @param bo 疾病/部位标签
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysDiseaseLabelBo bo);
+
+    /**
+     * 修改疾病/部位标签
+     *
+     * @param bo 疾病/部位标签
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysDiseaseLabelBo bo);
+
+    /**
+     * 校验并批量删除疾病/部位标签信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    R<?> importExcel(MultipartFile file) throws Exception;
+}

+ 70 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysFoodCategoryService.java

@@ -0,0 +1,70 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.vo.SysFoodCategoryVo;
+import org.dromara.system.domain.bo.SysFoodCategoryBo;
+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-06-27
+ */
+public interface ISysFoodCategoryService {
+
+    TableDataInfo<SysFoodCategoryVo> listTree(SysFoodCategoryBo bo);
+
+    /**
+     * 查询食材分类
+     *
+     * @param foodCategoryId 主键
+     * @return 食材分类
+     */
+    SysFoodCategoryVo queryById(Long foodCategoryId);
+
+    /**
+     * 分页查询食材分类列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 食材分类分页列表
+     */
+    TableDataInfo<SysFoodCategoryVo> queryPageList(SysFoodCategoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的食材分类列表
+     *
+     * @param bo 查询条件
+     * @return 食材分类列表
+     */
+    List<SysFoodCategoryVo> queryList(SysFoodCategoryBo bo);
+
+    /**
+     * 新增食材分类
+     *
+     * @param bo 食材分类
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysFoodCategoryBo bo);
+
+    /**
+     * 修改食材分类
+     *
+     * @param bo 食材分类
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysFoodCategoryBo bo);
+
+    /**
+     * 校验并批量删除食材分类信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/QiNiuContentServiceImpl.java

@@ -119,7 +119,7 @@ public class QiNiuContentServiceImpl extends ServiceImpl<SysOssMapper, SysOss> i
             }
             JSONObject jsonObject = new JSONObject();
             dictMap.forEach((k,v)->{
-                jsonObject.put(k,v.getDictValue());
+                jsonObject.put(v.getDictLabel(),v.getDictValue());
             });
             redisTemplate.opsForValue().set(BizConst.QNY_CONFIG_CACHE, JSON.toJSONString(jsonObject));
             redisTemplate.expire(BizConst.QNY_CONFIG_CACHE, 30, TimeUnit.MINUTES);

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java

@@ -61,7 +61,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService {
             return R.ok();
         }
 
-        return R.ok(dataList.stream().collect(Collectors.toMap(k1 -> k1.getDictLabel(), k2 -> k2, (k1, k2) -> k1)));
+        return R.ok(dataList.stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2, (k1, k2) -> k1)));
     }
 
     @Override

+ 218 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDiseaseLabelServiceImpl.java

@@ -0,0 +1,218 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.idev.excel.FastExcel;
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.context.AnalysisContext;
+import cn.idev.excel.read.builder.ExcelReaderBuilder;
+import cn.idev.excel.read.listener.ReadListener;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.excel.utils.ExcelUtil;
+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.dromara.system.domain.vo.SysDictDataVo;
+import org.dromara.system.mapper.SysDictDataMapper;
+import org.dromara.system.service.ISysDictDataService;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysDiseaseLabelBo;
+import org.dromara.system.domain.vo.SysDiseaseLabelVo;
+import org.dromara.system.domain.SysDiseaseLabel;
+import org.dromara.system.mapper.SysDiseaseLabelMapper;
+import org.dromara.system.service.ISysDiseaseLabelService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 疾病/部位标签Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysDiseaseLabelServiceImpl implements ISysDiseaseLabelService {
+
+    private final SysDiseaseLabelMapper baseMapper;
+    private final ISysDictDataService dictDataService;
+
+    /**
+     * 查询疾病/部位标签
+     *
+     * @param labelId 主键
+     * @return 疾病/部位标签
+     */
+    @Override
+    public SysDiseaseLabelVo queryById(Long labelId) {
+        return baseMapper.selectVoById(labelId);
+    }
+
+    /**
+     * 分页查询疾病/部位标签列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 疾病/部位标签分页列表
+     */
+    @Override
+    public TableDataInfo<SysDiseaseLabelVo> queryPageList(SysDiseaseLabelBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysDiseaseLabel> lqw = buildQueryWrapper(bo);
+        Page<SysDiseaseLabelVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        if (CollUtil.isNotEmpty(result.getRecords())) {
+            Map<String, SysDictDataVo> labelMap = dictDataService.selectMapByType("disease_label").getData();
+            result.getRecords().forEach(v -> {
+                SysDictDataVo dataVo = labelMap.get(v.getCategory());
+                if (ObjUtil.isNotNull(dataVo)) {
+                    v.setCategoryName(dataVo.getDictLabel());
+                }
+            });
+        }
+
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的疾病/部位标签列表
+     *
+     * @param bo 查询条件
+     * @return 疾病/部位标签列表
+     */
+    @Override
+    public List<SysDiseaseLabelVo> queryList(SysDiseaseLabelBo bo) {
+        LambdaQueryWrapper<SysDiseaseLabel> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysDiseaseLabel> buildQueryWrapper(SysDiseaseLabelBo bo) {
+        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.eq(StringUtils.isNotBlank(bo.getCategory()), SysDiseaseLabel::getCategory, bo.getCategory());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDiseaseLabel::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增疾病/部位标签
+     *
+     * @param bo 疾病/部位标签
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysDiseaseLabelBo bo) {
+        SysDiseaseLabel add = MapstructUtils.convert(bo, SysDiseaseLabel.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setLabelId(add.getLabelId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改疾病/部位标签
+     *
+     * @param bo 疾病/部位标签
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysDiseaseLabelBo bo) {
+        SysDiseaseLabel update = MapstructUtils.convert(bo, SysDiseaseLabel.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysDiseaseLabel entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除疾病/部位标签信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    public R<?> importExcel(MultipartFile file) throws Exception {
+        if (ObjUtil.isNull(file)) {
+            return R.fail("请选择文件!");
+        }
+
+        List<Map<Integer, String>> excelList = FastExcel.read(file.getInputStream())
+            .headRowNumber(3)
+            .sheet().doReadSync();
+
+        log.info("开始导入数据");
+        if (CollUtil.isEmpty(excelList)) {
+            return R.fail("读取数据为空!");
+        }
+        log.info("size:" + excelList.size());
+
+        Map<String, String> labelMap = MapUtil.newHashMap(excelList.size());
+        dictDataService.selectMapByType("disease_label").getData().forEach((k, v) -> {
+            labelMap.put(v.getDictLabel(), k);
+        });
+
+        List<SysDiseaseLabel> labelList = new ArrayList<>();
+        StringBuilder builder = new StringBuilder();
+        excelList.forEach(v -> {
+            if (MapUtil.isEmpty(v) || v.size() != 3) {
+                builder.append(labelList.size() + 4).append("、");
+                return;
+            }
+            SysDiseaseLabel label = new SysDiseaseLabel();
+            label.setLabelCode(v.get(0));
+            label.setLabelName(v.get(1));
+            label.setCategory(labelMap.get(v.get(2)));
+            if (StrUtil.isBlank(label.getCategory()) || StrUtil.isBlank(label.getLabelCode())
+                || StrUtil.isBlank(label.getLabelName())) {
+                builder.append(labelList.size() + 4).append("、");
+                return;
+            }
+            labelList.add(label);
+        });
+
+        if (builder.length() == 0) {
+            baseMapper.insertBatch(labelList);
+        } else {
+            return R.fail("以下行数据不完整:" + builder);
+        }
+        
+        return R.ok("导入成功!");
+    }
+}

+ 175 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysFoodCategoryServiceImpl.java

@@ -0,0 +1,175 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+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.SysFoodCategoryBo;
+import org.dromara.system.domain.vo.SysFoodCategoryVo;
+import org.dromara.system.domain.SysFoodCategory;
+import org.dromara.system.mapper.SysFoodCategoryMapper;
+import org.dromara.system.service.ISysFoodCategoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 食材分类Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-06-27
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysFoodCategoryServiceImpl implements ISysFoodCategoryService {
+
+    private final SysFoodCategoryMapper baseMapper;
+
+    @Override
+    public TableDataInfo<SysFoodCategoryVo> listTree(SysFoodCategoryBo bo) {
+        List<SysFoodCategory> foodCategoryList = null;
+        if (StrUtil.isNotBlank(bo.getName())) {
+            foodCategoryList = baseMapper.selectList(Wrappers.lambdaQuery(SysFoodCategory.class)
+                .like(SysFoodCategory::getName, bo.getName()));
+            List<SysFoodCategory> parentList = CollUtil.newArrayList();
+            for (int i = foodCategoryList.size() - 1; i >= 0; i--) {
+                SysFoodCategory category = foodCategoryList.get(i);
+//                if () {
+//
+//                }
+            }
+        } else {
+            foodCategoryList = baseMapper.selectList();
+        }
+
+        List<SysFoodCategoryVo> treeList = CollUtil.newArrayList();
+        Map<Long, SysFoodCategoryVo> foodMap = MapUtil.newHashMap(foodCategoryList.size());
+        foodCategoryList.forEach(v -> {
+            SysFoodCategoryVo vo = MapstructUtils.convert(v, SysFoodCategoryVo.class);
+            if (ObjUtil.isNull(v.getParentId()) || v.getParentId() == 0) {
+                treeList.add(vo);
+            } else {
+                SysFoodCategoryVo pVo = foodMap.get(v.getParentId());
+                if (CollUtil.isEmpty(pVo.getChildren())) {
+                    pVo.setChildren(CollUtil.newArrayList());
+                }
+                pVo.getChildren().add(vo);
+            }
+            foodMap.put(v.getFoodCategoryId(), vo);
+        });
+
+        return TableDataInfo.build(treeList);
+    }
+
+    /**
+     * 查询食材分类
+     *
+     * @param foodCategoryId 主键
+     * @return 食材分类
+     */
+    @Override
+    public SysFoodCategoryVo queryById(Long foodCategoryId) {
+        return baseMapper.selectVoById(foodCategoryId);
+    }
+
+    /**
+     * 分页查询食材分类列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 食材分类分页列表
+     */
+    @Override
+    public TableDataInfo<SysFoodCategoryVo> queryPageList(SysFoodCategoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysFoodCategory> lqw = buildQueryWrapper(bo);
+        Page<SysFoodCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的食材分类列表
+     *
+     * @param bo 查询条件
+     * @return 食材分类列表
+     */
+    @Override
+    public List<SysFoodCategoryVo> queryList(SysFoodCategoryBo bo) {
+        LambdaQueryWrapper<SysFoodCategory> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysFoodCategory> buildQueryWrapper(SysFoodCategoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysFoodCategory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysFoodCategory::getFoodCategoryId);
+        lqw.like(StringUtils.isNotBlank(bo.getName()), SysFoodCategory::getName, bo.getName());
+        lqw.eq(bo.getParentId() != null, SysFoodCategory::getParentId, bo.getParentId());
+        lqw.eq(bo.getSort() != null, SysFoodCategory::getSort, bo.getSort());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysFoodCategory::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增食材分类
+     *
+     * @param bo 食材分类
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysFoodCategoryBo bo) {
+        SysFoodCategory add = MapstructUtils.convert(bo, SysFoodCategory.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setFoodCategoryId(add.getFoodCategoryId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改食材分类
+     *
+     * @param bo 食材分类
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysFoodCategoryBo bo) {
+        SysFoodCategory update = MapstructUtils.convert(bo, SysFoodCategory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysFoodCategory 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/SysDiseaseLabelMapper.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.SysDiseaseLabelMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysFoodCategoryMapper.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.SysFoodCategoryMapper">
+
+</mapper>

+ 33 - 1
script/sql/biz/create.sql

@@ -39,7 +39,7 @@ CREATE TABLE sys_disease_label (
    tenant_id varchar(20) default '000000' null comment '租户编号',
    label_name VARCHAR(100) NOT NULL COMMENT '疾病/部位名称',
    label_code VARCHAR(50) NOT NULL COMMENT '疾病/部位编码',
-   category VARCHAR(100) COMMENT '所属分类',
+   category CHAR(1) COMMENT '所属分类',
    status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
    del_flag char default '0' null comment '删除标志(0代表存在 1代表删除)',
    create_dept  bigint null comment '创建部门',
@@ -48,3 +48,35 @@ CREATE TABLE sys_disease_label (
    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_food_category (
+   food_category_id  BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+   tenant_id varchar(20) default '000000' null comment '租户编号',
+   name          VARCHAR(300) NOT NULL COMMENT '分类名称',
+   parent_id     BIGINT DEFAULT 0 COMMENT '上级分类ID',
+   type          INT DEFAULT 2 COMMENT '类型',
+   is_default    INT DEFAULT 0 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='食材分类表';
+
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('调料类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('油脂类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('奶及奶制品', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('大豆及坚果类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('禽畜肉类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('水产类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('蛋类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('蔬菜类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('水果类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('谷类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('全谷物和杂豆', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('薯类', 0, '1', '1');
+INSERT INTO sys_food_category (name, parent_id, create_by, update_by) VALUES ('水', 0, '1', '1');