Эх сурвалжийг харах

Merge remote-tracking branch 'origin/main'

HuRongxin 3 сар өмнө
parent
commit
106515a28f
65 өөрчлөгдсөн 3504 нэмэгдсэн , 31 устгасан
  1. 2 0
      pom.xml
  2. BIN
      ruoyi-admin/src/main/resources/download-template/diseaseLabel.xlsx
  3. 13 0
      ruoyi-common/ruoyi-common-core/pom.xml
  4. 16 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/BizConst.java
  5. 80 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/QiNiuUtil.java
  6. 324 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtil.java
  7. 18 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtils.java
  8. 36 0
      ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java
  9. 40 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/QiNiuController.java
  10. 4 4
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java
  11. 125 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDiseaseLabelController.java
  12. 111 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysFoodCategoryController.java
  13. 111 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysHospitalController.java
  14. 8 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java
  15. 8 8
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
  16. 112 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysWardController.java
  17. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java
  18. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDiseaseLabel.java
  19. 59 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysFoodCategory.java
  20. 77 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysHospital.java
  21. 85 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java
  22. 51 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysWard.java
  23. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java
  24. 52 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDiseaseLabelBo.java
  25. 51 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysFoodCategoryBo.java
  26. 71 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysHospitalBo.java
  27. 88 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java
  28. 47 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysWardBo.java
  29. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java
  30. 67 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDiseaseLabelVo.java
  31. 66 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysFoodCategoryVo.java
  32. 87 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysHospitalVo.java
  33. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java
  34. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java
  35. 86 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java
  36. 58 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysWardVo.java
  37. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDiseaseLabel.java
  38. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDiseaseLabelMapper.java
  39. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysFoodCategoryMapper.java
  40. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysHospitalMapper.java
  41. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java
  42. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysWardMapper.java
  43. 17 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IQiNiuContentService.java
  44. 72 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDiseaseLabelService.java
  45. 70 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysFoodCategoryService.java
  46. 69 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysHospitalService.java
  47. 3 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java
  48. 72 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysWardService.java
  49. 131 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/QiNiuContentServiceImpl.java
  50. 13 6
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
  51. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java
  52. 218 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDiseaseLabelServiceImpl.java
  53. 175 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysFoodCategoryServiceImpl.java
  54. 154 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysHospitalServiceImpl.java
  55. 17 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
  56. 26 3
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  57. 174 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysWardServiceImpl.java
  58. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDiseaseLabelMapper.xml
  59. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysFoodCategoryMapper.xml
  60. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysHospitalMapper.xml
  61. 16 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
  62. 2 2
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
  63. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysWardMapper.xml
  64. 82 0
      script/sql/biz/create.sql
  65. 20 0
      script/sql/biz/update.sql

+ 2 - 0
pom.xml

@@ -39,6 +39,8 @@
         <justauth.version>1.16.7</justauth.version>
         <!-- 离线IP地址定位库 -->
         <ip2region.version>2.7.0</ip2region.version>
+        <fastjson.version>1.2.83</fastjson.version>
+        <qiniu-java-sdk.version>7.4.0</qiniu-java-sdk.version>
 
         <!-- OSS 配置 -->
         <aws.sdk.version>2.28.22</aws.sdk.version>

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


+ 13 - 0
ruoyi-common/ruoyi-common-core/pom.xml

@@ -16,6 +16,19 @@
     </description>
 
     <dependencies>
+        <!-- 七牛云SDK -->
+        <dependency>
+            <groupId>com.qiniu</groupId>
+            <artifactId>qiniu-java-sdk</artifactId>
+            <version>${qiniu-java-sdk.version}</version>
+        </dependency>
+        <!-- json -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+
         <!-- Spring框架基本的核心工具 -->
         <dependency>
             <groupId>org.springframework</groupId>

+ 16 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/BizConst.java

@@ -6,4 +6,20 @@ package org.dromara.common.core.constant;
  **/
 public interface BizConst {
     String HOSPITAL_ROLE_TYPE = "hospital_role_type";
+
+    String QNY_CONFIG = "qny_config";
+
+    String QNY_MAX_SIZE = "max_size";
+
+    String QNY_SECRET_KEY = "secret_key";
+
+    String QNY_ACCESS_KEY = "access_key";
+
+    String QNY_ZONE = "zone";
+
+    String QNY_BUCKET_NAME = "bucket_name";
+
+    String QNY_STATIC_DOMAIN = "static_domain";
+
+    String QNY_CONFIG_CACHE = "qny:config";
 }

+ 80 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/QiNiuUtil.java

@@ -0,0 +1,80 @@
+/*
+ *  Copyright 2019-2020 Zheng Jie
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.dromara.common.core.utils;
+
+import com.qiniu.storage.Region;
+import org.dromara.common.core.utils.file.FileUtil;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+public class QiNiuUtil {
+
+    /**
+     * 华东
+     */
+    private static final String HUAD = "HUAD";
+    /**
+     * 华北
+     */
+    private static final String HUAB = "HUAB";
+    /**
+     * 华南
+     */
+    private static final String HUAN = "HUAN";
+    /**
+     * 北美
+     */
+    private static final String BEIM = "BEIM";
+
+    /**
+     * 得到机房的对应关系
+     *
+     * @param zone 机房名称
+     * @return Region
+     */
+    public static Region getRegion(String zone) {
+
+        if (HUAD.equals(zone)) {
+            return Region.huadong();
+        } else if (HUAB.equals(zone)) {
+            return Region.huabei();
+        } else if (HUAN.equals(zone)) {
+            return Region.huanan();
+        } else if (BEIM.equals(zone)) {
+            return Region.beimei();
+            // 否则就是东南亚
+        } else {
+            return Region.qvmHuadong();
+        }
+    }
+
+    /**
+     * 默认不指定key的情况下,以文件内容的hash值作为文件名
+     *
+     * @param file 文件名
+     * @return String
+     */
+    public static String getName(String file) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        Date date = new Date();
+        return FileUtil.getFileNameNoEx(file) + "-" +
+            sdf.format(date) +
+            "." +
+            FileUtil.getExtensionName(file);
+    }
+}

+ 324 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileUtil.java

@@ -0,0 +1,324 @@
+package org.dromara.common.core.utils.file;
+
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.IdUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.exception.ServiceException;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.MessageDigest;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+@Slf4j
+public class FileUtil extends cn.hutool.core.io.FileUtil {
+
+
+    /**
+     * 系统临时目录
+     * <br>
+     * windows 包含路径分割符,但Linux 不包含,
+     * 在windows \\==\ 前提下,
+     * 为安全起见 同意拼装 路径分割符,
+     * <pre>
+     *       java.io.tmpdir
+     *       windows : C:\Users/xxx\AppData\Local\Temp\
+     *       linux: /temp
+     * </pre>
+     */
+    public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator;
+    /**
+     * 定义GB的计算常量
+     */
+    private static final int GB = 1024 * 1024 * 1024;
+    /**
+     * 定义MB的计算常量
+     */
+    private static final int MB = 1024 * 1024;
+    /**
+     * 定义KB的计算常量
+     */
+    private static final int KB = 1024;
+
+    /**
+     * 格式化小数
+     */
+    private static final DecimalFormat DF = new DecimalFormat("0.00");
+
+    public static final String IMAGE = "图片";
+    public static final String TXT = "文档";
+    public static final String MUSIC = "音乐";
+    public static final String VIDEO = "视频";
+    public static final String OTHER = "其他";
+
+
+    /**
+     * MultipartFile转File
+     */
+    public static File toFile(MultipartFile multipartFile) {
+        // 获取文件名
+        String fileName = multipartFile.getOriginalFilename();
+        // 获取文件后缀
+        String prefix = "." + getExtensionName(fileName);
+        File file = null;
+        try {
+            // 用uuid作为文件名,防止生成的临时文件重复
+            file = File.createTempFile(IdUtil.simpleUUID(), prefix);
+            // MultipartFile to File
+            multipartFile.transferTo(file);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+        }
+        return file;
+    }
+
+    /**
+     * 获取文件扩展名,不带 .
+     */
+    public static String getExtensionName(String filename) {
+        if ((filename != null) && (filename.length() > 0)) {
+            int dot = filename.lastIndexOf('.');
+            if ((dot > -1) && (dot < (filename.length() - 1))) {
+                return filename.substring(dot + 1);
+            }
+        }
+        return filename;
+    }
+
+    /**
+     * Java文件操作 获取不带扩展名的文件名
+     */
+    public static String getFileNameNoEx(String filename) {
+        if ((filename != null) && (filename.length() > 0)) {
+            int dot = filename.lastIndexOf('.');
+            if ((dot > -1) && (dot < (filename.length()))) {
+                return filename.substring(0, dot);
+            }
+        }
+        return filename;
+    }
+
+    /**
+     * 文件大小转换
+     */
+    public static String getSize(long size) {
+        String resultSize;
+        if (size / GB >= 1) {
+            //如果当前Byte的值大于等于1GB
+            resultSize = DF.format(size / (float) GB) + "GB   ";
+        } else if (size / MB >= 1) {
+            //如果当前Byte的值大于等于1MB
+            resultSize = DF.format(size / (float) MB) + "MB   ";
+        } else if (size / KB >= 1) {
+            //如果当前Byte的值大于等于1KB
+            resultSize = DF.format(size / (float) KB) + "KB   ";
+        } else {
+            resultSize = size + "B   ";
+        }
+        return resultSize;
+    }
+
+    /**
+     * inputStream 转 File
+     */
+    public static File inputStreamToFile(InputStream ins, String name) throws Exception {
+        File file = new File(SYS_TEM_DIR + name);
+        if (file.exists()) {
+            return file;
+        }
+        OutputStream os = new FileOutputStream(file);
+        int bytesRead;
+        int len = 8192;
+        byte[] buffer = new byte[len];
+        while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
+            os.write(buffer, 0, bytesRead);
+        }
+        os.close();
+        ins.close();
+        return file;
+    }
+
+    /**
+     * 将文件名解析成文件的上传路径
+     */
+    public static File upload(MultipartFile file, String filePath) {
+        Date date = new Date();
+        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
+        String name = getFileNameNoEx(file.getOriginalFilename());
+        String suffix = getExtensionName(file.getOriginalFilename());
+        String nowStr = "-" + format.format(date);
+        try {
+            String fileName = name + nowStr + "." + suffix;
+            String path = filePath + fileName;
+            // getCanonicalFile 可解析正确各种路径
+            File dest = new File(path).getCanonicalFile();
+            // 检测是否存在目录
+            if (!dest.getParentFile().exists()) {
+                if (!dest.getParentFile().mkdirs()) {
+                    System.out.println("was not successful.");
+                }
+            }
+            // 文件写入
+            file.transferTo(dest);
+            return dest;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 导出excel
+     */
+//    public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException {
+//        String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx";
+//        File file = new File(tempPath);
+//        BigExcelWriter writer = ExcelUtil.getBigWriter(file);
+//        // 一次性写出内容,使用默认样式,强制输出标题
+//        writer.write(list, true);
+//        SXSSFSheet sheet = (SXSSFSheet) writer.getSheet();
+//        //上面需要强转SXSSFSheet  不然没有trackAllColumnsForAutoSizing方法
+//        sheet.trackAllColumnsForAutoSizing();
+//        //列宽自适应
+//        writer.autoSizeColumnAll();
+//        //response为HttpServletResponse对象
+//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
+//        //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
+//        response.setHeader("Content-Disposition", "attachment;filename=file.xlsx");
+//        ServletOutputStream out = response.getOutputStream();
+//        // 终止后删除临时文件
+//        file.deleteOnExit();
+//        writer.flush(out, true);
+//        //此处记得关闭输出Servlet流
+//        IoUtil.close(out);
+//    }
+    public static String getFileType(String type) {
+        String documents = "txt doc pdf ppt pps xlsx xls docx";
+        String music = "mp3 wav wma mpa ram ra aac aif m4a";
+        String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg";
+        String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg";
+        if (image.contains(type)) {
+            return IMAGE;
+        } else if (documents.contains(type)) {
+            return TXT;
+        } else if (music.contains(type)) {
+            return MUSIC;
+        } else if (video.contains(type)) {
+            return VIDEO;
+        } else {
+            return OTHER;
+        }
+    }
+
+    public static void checkSize(long maxSize, long size) {
+        // 1M
+        int len = 1024 * 1024;
+        if (size > (maxSize * len)) {
+            throw new ServiceException("文件超出规定大小");
+
+        }
+    }
+
+    /**
+     * 判断两个文件是否相同
+     */
+    public static boolean check(File file1, File file2) {
+        String img1Md5 = getMd5(file1);
+        String img2Md5 = getMd5(file2);
+        return img1Md5.equals(img2Md5);
+    }
+
+    /**
+     * 判断两个文件是否相同
+     */
+    public static boolean check(String file1Md5, String file2Md5) {
+        return file1Md5.equals(file2Md5);
+    }
+
+    private static byte[] getByte(File file) {
+        // 得到文件长度
+        byte[] b = new byte[(int) file.length()];
+        try {
+            InputStream in = new FileInputStream(file);
+            try {
+                System.out.println(in.read(b));
+            } catch (IOException e) {
+                log.error(e.getMessage(), e);
+            }
+        } catch (FileNotFoundException e) {
+            log.error(e.getMessage(), e);
+            return null;
+        }
+        return b;
+    }
+
+    private static String getMd5(byte[] bytes) {
+        // 16进制字符
+        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+        try {
+            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
+            mdTemp.update(bytes);
+            byte[] md = mdTemp.digest();
+            int j = md.length;
+            char[] str = new char[j * 2];
+            int k = 0;
+            // 移位 输出字符串
+            for (byte byte0 : md) {
+                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
+                str[k++] = hexDigits[byte0 & 0xf];
+            }
+            return new String(str);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 下载文件
+     *
+     * @param request  /
+     * @param response /
+     * @param file     /
+     */
+    public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, boolean deleteOnExit) {
+        response.setCharacterEncoding(request.getCharacterEncoding());
+        response.setContentType("application/octet-stream");
+        FileInputStream fis = null;
+        try {
+            fis = new FileInputStream(file);
+            response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
+            IoUtil.copy(fis, response.getOutputStream());
+            response.flushBuffer();
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        } finally {
+            if (fis != null) {
+                try {
+                    fis.close();
+                    if (deleteOnExit) {
+                        file.deleteOnExit();
+                    }
+                } catch (IOException e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+        }
+    }
+
+    public static String getMd5(File file) {
+        return getMd5(getByte(file));
+    }
+
+}

+ 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
      *

+ 40 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/QiNiuController.java

@@ -0,0 +1,40 @@
+package org.dromara.system.controller.system;
+
+
+import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.system.domain.SysOss;
+import org.dromara.system.service.IQiNiuContentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+
+@Slf4j
+@RestController
+@RequestMapping("/api/qiniu")
+//@Api(tags = "七牛云存储管理")
+public class QiNiuController {
+
+    @Autowired
+    private IQiNiuContentService qiNiuService;
+
+    //    @ApiOperation("上传文件")
+    @PostMapping("/upload")
+    public R<SysOss> uploadByPrefix(@RequestParam MultipartFile file) {
+        SysOss qiniuContent = qiNiuService.upload(file);
+        if (StrUtil.isNotBlank(qiniuContent.getUrl())) {
+            SysOss ossFile = new SysOss();
+            ossFile.setOssId(qiniuContent.getOssId());
+            ossFile.setFileName(qiniuContent.getOriginalName());
+            ossFile.setUrl(qiniuContent.getUrl());
+            return R.ok("上传成功!", ossFile);
+        }
+
+        return R.fail("上传失败!");
+    }
+}

+ 4 - 4
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java

@@ -38,7 +38,7 @@ import java.util.List;
 public class SysDeptController extends BaseController {
 
     private final ISysDeptService deptService;
-    private final ISysPostService postService;
+//    private final ISysPostService postService;
 
     /**
      * 获取科室列表
@@ -137,9 +137,9 @@ public class SysDeptController extends BaseController {
         if (deptService.checkDeptExistUser(deptId)) {
             return R.warn("科室存在用户,不允许删除");
         }
-        if (postService.countPostByDeptId(deptId) > 0) {
-            return R.warn("科室存在岗位,不允许删除");
-        }
+//        if (postService.countPostByDeptId(deptId) > 0) {
+//            return R.warn("科室存在岗位,不允许删除");
+//        }
         deptService.checkDeptDataScope(deptId);
         return toAjax(deptService.deleteDeptById(deptId));
     }

+ 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));
+    }
+}

+ 111 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysHospitalController.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.SysHospitalVo;
+import org.dromara.system.domain.bo.SysHospitalBo;
+import org.dromara.system.service.ISysHospitalService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 医院管理
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/hospital")
+public class SysHospitalController extends BaseController {
+
+    private final ISysHospitalService sysHospitalService;
+
+    /**
+     * 查询医院管理列表
+     */
+    @SaCheckPermission("system:hospital:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysHospitalVo> list(SysHospitalBo bo, PageQuery pageQuery) {
+        return sysHospitalService.queryPageList(bo, pageQuery);
+    }
+
+    @SaCheckPermission("system:hospital:list")
+    @GetMapping("/getHospitalData")
+    public R<SysHospitalVo> getHospitalData() {
+        return R.ok(sysHospitalService.getOneHospital());
+    }
+
+    /**
+     * 导出医院管理列表
+     */
+    @SaCheckPermission("system:hospital:export")
+    @Log(title = "医院管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysHospitalBo bo, HttpServletResponse response) {
+        List<SysHospitalVo> list = sysHospitalService.queryList(bo);
+        ExcelUtil.exportExcel(list, "医院管理", SysHospitalVo.class, response);
+    }
+
+    /**
+     * 获取医院管理详细信息
+     *
+     * @param hospitalId 主键
+     */
+    @SaCheckPermission("system:hospital:query")
+    @GetMapping("/{hospitalId}")
+    public R<SysHospitalVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long hospitalId) {
+        return R.ok(sysHospitalService.queryById(hospitalId));
+    }
+
+    /**
+     * 新增医院管理
+     */
+    @SaCheckPermission("system:hospital:add")
+    @Log(title = "医院管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysHospitalBo bo) {
+        return toAjax(sysHospitalService.insertByBo(bo));
+    }
+
+    /**
+     * 修改医院管理
+     */
+    @SaCheckPermission("system:hospital:edit")
+    @Log(title = "医院管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysHospitalBo bo) {
+        return toAjax(sysHospitalService.updateByBo(bo));
+    }
+
+    /**
+     * 删除医院管理
+     *
+     * @param hospitalIds 主键串
+     */
+    @SaCheckPermission("system:hospital:remove")
+    @Log(title = "医院管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{hospitalIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] hospitalIds) {
+        return toAjax(sysHospitalService.deleteWithValidByIds(List.of(hospitalIds), true));
+    }
+}

+ 8 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java

@@ -49,6 +49,12 @@ public class SysRoleController extends BaseController {
         return roleService.selectPageRoleList(role, pageQuery);
     }
 
+    @SaCheckPermission("system:role:list")
+    @GetMapping("/listAll")
+    public TableDataInfo<SysRoleVo> listAll() {
+        return roleService.selectAllRoleList();
+    }
+
     /**
      * 导出角色信息列表
      */
@@ -227,6 +233,7 @@ public class SysRoleController extends BaseController {
         return R.ok(selectVo);
     }
 
-    public record DeptTreeSelectVo(List<Long> checkedKeys, List<Tree<Long>> depts) {}
+    public record DeptTreeSelectVo(List<Long> checkedKeys, List<Tree<Long>> depts) {
+    }
 
 }

+ 8 - 8
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java

@@ -53,7 +53,7 @@ public class SysUserController extends BaseController {
     private final ISysRoleService roleService;
     private final ISysPostService postService;
     private final ISysDeptService deptService;
-    private final ISysTenantService tenantService;
+//    private final ISysTenantService tenantService;
 
     /**
      * 获取用户列表
@@ -159,16 +159,16 @@ public class SysUserController extends BaseController {
         deptService.checkDeptDataScope(user.getDeptId());
         if (!userService.checkUserNameUnique(user)) {
             return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
-        } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
+        } /*else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
             return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
         } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
             return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
-        }
-        if (TenantHelper.isEnable()) {
-            if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) {
-                return R.fail("当前租户下用户名额不足,请联系管理员");
-            }
-        }
+        }*/
+//        if (TenantHelper.isEnable()) {
+//            if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) {
+//                return R.fail("当前租户下用户名额不足,请联系管理员");
+//            }
+//        }
         user.setPassword(BCrypt.hashpw(user.getPassword()));
         return toAjax(userService.insertUser(user));
     }

+ 112 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysWardController.java

@@ -0,0 +1,112 @@
+package org.dromara.system.controller.system;
+
+import java.util.List;
+
+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.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.SysWardVo;
+import org.dromara.system.domain.bo.SysWardBo;
+import org.dromara.system.service.ISysWardService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 病区管理
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/ward")
+public class SysWardController extends BaseController {
+
+    private final ISysWardService sysWardService;
+
+    /**
+     * 查询病区管理列表
+     */
+    @SaCheckPermission("system:ward:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysWardVo> list(SysWardBo bo, PageQuery pageQuery) {
+        return sysWardService.queryPageList(bo, pageQuery);
+    }
+
+    @SaCheckPermission("system:ward:list")
+    @GetMapping("/listUsed")
+    public R<JSONObject> listUsed() {
+        return sysWardService.listUsed();
+    }
+
+    /**
+     * 导出病区管理列表
+     */
+    @SaCheckPermission("system:ward:export")
+    @Log(title = "病区管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysWardBo bo, HttpServletResponse response) {
+        List<SysWardVo> list = sysWardService.queryList(bo);
+        ExcelUtil.exportExcel(list, "病区管理", SysWardVo.class, response);
+    }
+
+    /**
+     * 获取病区管理详细信息
+     *
+     * @param wardId 主键
+     */
+    @SaCheckPermission("system:ward:query")
+    @GetMapping("/{wardId}")
+    public R<SysWardVo> getInfo(@NotNull(message = "主键不能为空")
+                                @PathVariable Long wardId) {
+        return R.ok(sysWardService.queryById(wardId));
+    }
+
+    /**
+     * 新增病区管理
+     */
+    @SaCheckPermission("system:ward:add")
+    @Log(title = "病区管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysWardBo bo) {
+        return toAjax(sysWardService.insertByBo(bo));
+    }
+
+    /**
+     * 修改病区管理
+     */
+    @SaCheckPermission("system:ward:edit")
+    @Log(title = "病区管理", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysWardBo bo) {
+        return toAjax(sysWardService.updateByBo(bo));
+    }
+
+    /**
+     * 删除病区管理
+     *
+     * @param wardIds 主键串
+     */
+    @SaCheckPermission("system:ward:remove")
+    @Log(title = "病区管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{wardIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] wardIds) {
+        return toAjax(sysWardService.deleteWithValidByIds(List.of(wardIds), true));
+    }
+}

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java

@@ -37,6 +37,10 @@ public class SysDept extends TenantEntity {
      */
     private Long parentId;
 
+    private String hospOrDept;
+
+    private String logo;
+
     /**
      * 部门名称
      */

+ 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;
+
+
+}

+ 77 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysHospital.java

@@ -0,0 +1,77 @@
+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_hospital
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_hospital")
+public class SysHospital extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "hospital_id")
+    private Long hospitalId;
+
+    /**
+     * 医院名称
+     */
+    private String hospitalName;
+
+    /**
+     * 医院logo
+     */
+    private String hospitalLogo;
+
+    /**
+     * 医院等级
+     */
+    private String hospitalLevel;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 住院床位
+     */
+    private String bedSpace;
+
+    /**
+     * 所属地区
+     */
+    private String region;
+
+    /**
+     * 医院描述
+     */
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 85 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java

@@ -103,6 +103,91 @@ public class SysUser extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 别名
+     */
+    private String alias;
+
+    /**
+     * 角色
+     */
+    private String role;
+
+    /**
+     * 所属科室编码
+     */
+    private String deptCode;
+
+    /**
+     * 工号
+     */
+    private String jobNumber;
+
+    /**
+     * 身份证号码
+     */
+    private String idCard;
+
+    /**
+     * 现住地址
+     */
+    private String address;
+
+    /**
+     * 出生日期
+     */
+    private String birthDate;
+
+    /**
+     * 户籍地址
+     */
+    private String regAddress;
+
+    /**
+     * 民族
+     */
+    private String nation;
+
+    /**
+     * 政治面貌
+     */
+    private String political;
+
+    /**
+     * 婚姻状况
+     */
+    private String marital;
+
+    /**
+     * 职称
+     */
+    private String title;
+
+    /**
+     * 学历
+     */
+    private String education;
+
+    /**
+     * 职工简介
+     */
+    private String intro;
+
+    /**
+     * 擅长疾病
+     */
+    private String expertise;
+
+    /**
+     * 签名图片路径
+     */
+    private String signatureImg;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
 
     public SysUser(Long userId) {
         this.userId = userId;

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

@@ -0,0 +1,51 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 病区管理对象 sys_ward
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_ward")
+public class SysWard extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "ward_id")
+    private Long wardId;
+
+    /**
+     * 病区名称
+     */
+    private String wardName;
+
+    /**
+     * 科室ID
+     */
+    private String deptId;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+}

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java

@@ -26,6 +26,10 @@ public class SysDeptBo extends BaseEntity {
      */
     private Long deptId;
 
+    private String hospOrDept;
+
+    private String logo;
+
     /**
      * 父部门ID
      */

+ 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;
+
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysHospitalBo.java

@@ -0,0 +1,71 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysHospital;
+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_hospital
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysHospital.class, reverseConvertGenerate = false)
+public class SysHospitalBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long hospitalId;
+
+    /**
+     * 医院名称
+     */
+    @NotBlank(message = "医院名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String hospitalName;
+
+    /**
+     * 医院logo
+     */
+    private String hospitalLogo;
+
+    /**
+     * 医院等级
+     */
+    private String hospitalLevel;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 住院床位
+     */
+    private String bedSpace;
+
+    /**
+     * 所属地区
+     */
+    private String region;
+
+    /**
+     * 医院描述
+     */
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 88 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java

@@ -12,6 +12,8 @@ import org.dromara.common.core.xss.Xss;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.system.domain.SysUser;
 
+import java.util.Date;
+
 /**
  * 用户信息业务对象 sys_user
  *
@@ -46,7 +48,6 @@ public class SysUserBo extends BaseEntity {
      * 用户昵称
      */
     @Xss(message = "用户昵称不能包含脚本字符")
-    @NotBlank(message = "用户昵称不能为空")
     @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符")
     private String nickName;
 
@@ -91,7 +92,7 @@ public class SysUserBo extends BaseEntity {
      * 角色组
      */
     @Size(min = 1, message = "用户角色不能为空")
-    private Long[] roleIds;
+    private String  roleIds;
 
     /**
      * 岗位组
@@ -113,6 +114,91 @@ public class SysUserBo extends BaseEntity {
      */
     private String excludeUserIds;
 
+    /**
+     * 别名
+     */
+    private String alias;
+
+    /**
+     * 角色
+     */
+    private String role;
+
+    /**
+     * 所属科室编码
+     */
+    private String deptCode;
+
+    /**
+     * 工号
+     */
+    private String jobNumber;
+
+    /**
+     * 身份证号码
+     */
+    private String idCard;
+
+    /**
+     * 现住地址
+     */
+    private String address;
+
+    /**
+     * 出生日期
+     */
+    private String birthDate;
+
+    /**
+     * 户籍地址
+     */
+    private String regAddress;
+
+    /**
+     * 民族
+     */
+    private String nation;
+
+    /**
+     * 政治面貌
+     */
+    private String political;
+
+    /**
+     * 婚姻状况
+     */
+    private String marital;
+
+    /**
+     * 职称
+     */
+    private String title;
+
+    /**
+     * 学历
+     */
+    private String education;
+
+    /**
+     * 职工简介
+     */
+    private String intro;
+
+    /**
+     * 擅长疾病
+     */
+    private String expertise;
+
+    /**
+     * 签名图片路径
+     */
+    private String signatureImg;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
     public SysUserBo(Long userId) {
         this.userId = userId;
     }

+ 47 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysWardBo.java

@@ -0,0 +1,47 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysWard;
+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_ward
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysWard.class, reverseConvertGenerate = false)
+public class SysWardBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long wardId;
+
+    /**
+     * 病区名称
+     */
+    @NotBlank(message = "病区名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String wardName;
+
+    /**
+     * 科室ID
+     */
+    @NotBlank(message = "科室ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String deptId;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java

@@ -32,6 +32,8 @@ public class SysDeptVo implements Serializable {
      */
     @ExcelProperty(value = "部门id")
     private Long deptId;
+
+    private String hospOrDept;
     /**
      * 科室描述
      */
@@ -46,6 +48,8 @@ public class SysDeptVo implements Serializable {
      */
     private String parentName;
 
+    private String logo;
+
     /**
      * 祖级列表
      */

+ 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;
+}

+ 87 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysHospitalVo.java

@@ -0,0 +1,87 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysHospital;
+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_hospital
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysHospital.class)
+public class SysHospitalVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long hospitalId;
+
+    /**
+     * 医院名称
+     */
+    @ExcelProperty(value = "医院名称")
+    private String hospitalName;
+
+    /**
+     * 医院logo
+     */
+    @ExcelProperty(value = "医院logo")
+    private String hospitalLogo;
+
+    /**
+     * 医院等级
+     */
+    @ExcelProperty(value = "医院等级")
+    private String hospitalLevel;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phone;
+
+    /**
+     * 住院床位
+     */
+    @ExcelProperty(value = "住院床位")
+    private String bedSpace;
+
+    /**
+     * 所属地区
+     */
+    @ExcelProperty(value = "所属地区")
+    private String region;
+
+    /**
+     * 医院描述
+     */
+    @ExcelProperty(value = "医院描述")
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java

@@ -98,6 +98,8 @@ public class SysRoleVo implements Serializable {
     @ExcelProperty(value = "创建时间")
     private Date createTime;
 
+    private Long userId;
+
     /**
      * 用户是否存在此角色标识 默认不存在
      */

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java

@@ -20,7 +20,7 @@ public class SysUserInfoVo {
     /**
      * 角色ID列表
      */
-    private List<Long> roleIds;
+    private Long roleIds;
 
     /**
      * 角色列表

+ 86 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java

@@ -139,4 +139,90 @@ public class SysUserVo implements Serializable {
      */
     private Long roleId;
 
+    private String roleName;
+
+    /**
+     * 别名
+     */
+    private String alias;
+
+    /**
+     * 角色
+     */
+    private String role;
+
+    /**
+     * 所属科室编码
+     */
+    private String deptCode;
+
+    /**
+     * 工号
+     */
+    private String jobNumber;
+
+    /**
+     * 身份证号码
+     */
+    private String idCard;
+
+    /**
+     * 现住地址
+     */
+    private String address;
+
+    /**
+     * 出生日期
+     */
+    private String birthDate;
+
+    /**
+     * 户籍地址
+     */
+    private String regAddress;
+
+    /**
+     * 民族
+     */
+    private String nation;
+
+    /**
+     * 政治面貌
+     */
+    private String political;
+
+    /**
+     * 婚姻状况
+     */
+    private String marital;
+
+    /**
+     * 职称
+     */
+    private String title;
+
+    /**
+     * 学历
+     */
+    private String education;
+
+    /**
+     * 职工简介
+     */
+    private String intro;
+
+    /**
+     * 擅长疾病
+     */
+    private String expertise;
+
+    /**
+     * 签名图片路径
+     */
+    private String signatureImg;
+
+    /**
+     * 姓名
+     */
+    private String name;
 }

+ 58 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysWardVo.java

@@ -0,0 +1,58 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysWard;
+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_ward
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysWard.class)
+public class SysWardVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long wardId;
+
+    /**
+     * 病区名称
+     */
+    @ExcelProperty(value = "病区名称")
+    private String wardName;
+
+    /**
+     * 科室ID
+     */
+    private String deptId;
+
+    @ExcelProperty(value = "科室名称")
+    private String deptName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 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> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysHospital;
+import org.dromara.system.domain.vo.SysHospitalVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 医院管理Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+public interface SysHospitalMapper extends BaseMapperPlus<SysHospital, SysHospitalVo> {
+
+}

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java

@@ -72,4 +72,6 @@ public interface SysRoleMapper extends BaseMapperPlus<SysRole, SysRoleVo> {
      */
     List<SysRoleVo> selectRolesByUserId(Long userId);
 
+    List<SysRoleVo> selectRolesByUserIds(List<Long> userIdList);
+
 }

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysWard;
+import org.dromara.system.domain.vo.SysWardVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 病区管理Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+public interface SysWardMapper extends BaseMapperPlus<SysWard, SysWardVo> {
+
+}

+ 17 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IQiNiuContentService.java

@@ -0,0 +1,17 @@
+package org.dromara.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.system.domain.SysOss;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * <p>
+ * 文件上传 服务类
+ * </p>
+ *
+ * @author tanSir
+ * @since 2021-04-16
+ */
+public interface IQiNiuContentService extends IService<SysOss> {
+    SysOss upload(MultipartFile file);
+}

+ 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);
+}

+ 69 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysHospitalService.java

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

+ 3 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java

@@ -2,6 +2,7 @@ package org.dromara.system.service;
 
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.SysRole;
 import org.dromara.system.domain.SysUserRole;
 import org.dromara.system.domain.bo.SysRoleBo;
 import org.dromara.system.domain.vo.SysRoleVo;
@@ -27,6 +28,7 @@ public interface ISysRoleService {
      */
     List<SysRoleVo> selectRoleList(SysRoleBo role);
 
+    TableDataInfo<SysRoleVo> selectAllRoleList();
     /**
      * 根据用户ID查询角色列表
      *
@@ -64,7 +66,7 @@ public interface ISysRoleService {
      * @param userId 用户ID
      * @return 选中角色ID列表
      */
-    List<Long> selectRoleListByUserId(Long userId);
+    Long selectRoleListByUserId(Long userId);
 
     /**
      * 通过角色ID查询角色

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

@@ -0,0 +1,72 @@
+package org.dromara.system.service;
+
+import com.alibaba.fastjson.JSONObject;
+import org.dromara.common.core.domain.R;
+import org.dromara.system.domain.vo.SysWardVo;
+import org.dromara.system.domain.bo.SysWardBo;
+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-26
+ */
+public interface ISysWardService {
+
+    /**
+     * 查询病区管理
+     *
+     * @param wardId 主键
+     * @return 病区管理
+     */
+    SysWardVo queryById(Long wardId);
+
+    /**
+     * 分页查询病区管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 病区管理分页列表
+     */
+    TableDataInfo<SysWardVo> queryPageList(SysWardBo bo, PageQuery pageQuery);
+
+    R<JSONObject> listUsed();
+
+    /**
+     * 查询符合条件的病区管理列表
+     *
+     * @param bo 查询条件
+     * @return 病区管理列表
+     */
+    List<SysWardVo> queryList(SysWardBo bo);
+
+    /**
+     * 新增病区管理
+     *
+     * @param bo 病区管理
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysWardBo bo);
+
+    /**
+     * 修改病区管理
+     *
+     * @param bo 病区管理
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysWardBo bo);
+
+    /**
+     * 校验并批量删除病区管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,131 @@
+package org.dromara.system.service.impl;
+
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qiniu.http.Response;
+import com.qiniu.storage.Configuration;
+import com.qiniu.storage.UploadManager;
+import com.qiniu.storage.model.DefaultPutRet;
+import com.qiniu.util.Auth;
+import jakarta.annotation.Resource;
+import org.dromara.common.core.constant.BizConst;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.QiNiuUtil;
+import org.dromara.common.core.utils.file.FileUtil;
+import org.dromara.system.domain.SysOss;
+import org.dromara.system.domain.vo.SysDictDataVo;
+import org.dromara.system.mapper.SysOssMapper;
+import org.dromara.system.service.IQiNiuContentService;
+import org.dromara.system.service.ISysDictDataService;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * <p>
+ * 文件上传 服务实现类
+ * </p>
+ *
+ * @author tanSir
+ * @since 2021-04-16
+ */
+@Service
+public class QiNiuContentServiceImpl extends ServiceImpl<SysOssMapper, SysOss> implements IQiNiuContentService {
+    @Resource
+    private ISysDictDataService sysDictItemService;
+
+    @Resource
+    private SysOssMapper qiNiuContentMapper;
+
+    @Resource
+    private RedisTemplate redisTemplate;
+
+
+    /**
+     * 文件上传, 自定义路径前缀
+     *
+     * @return
+     */
+    @Override
+    public SysOss upload(MultipartFile file) {
+        String prefix = "upload/" + DateUtil.format(LocalDateTimeUtil.now(), DatePattern.PURE_DATE_PATTERN) + "/";
+        JSONObject qiNiuConfig = getDynamicQiNiuConfig();
+        FileUtil.checkSize(qiNiuConfig.getInteger(BizConst.QNY_MAX_SIZE), file.getSize());
+        // 构造一个带指定Zone对象的配置类
+        Configuration cfg = new Configuration(QiNiuUtil.getRegion(qiNiuConfig.getString(BizConst.QNY_ZONE)));
+        UploadManager uploadManager = new UploadManager(cfg);
+        Auth auth = Auth.create(qiNiuConfig.getString(BizConst.QNY_ACCESS_KEY), qiNiuConfig.getString(BizConst.QNY_SECRET_KEY));
+        String upToken = auth.uploadToken(qiNiuConfig.getString(BizConst.QNY_BUCKET_NAME));
+        try {
+            Long nextId = IdWorker.getId();
+            String name = getPrefix(prefix) + nextId + "." + FileUtil.extName(file.getOriginalFilename());
+            Response response = uploadManager.put(file.getBytes(), name, upToken);
+            // 解析上传成功的结果
+            DefaultPutRet putRet = JSON.parseObject(response.bodyString(), DefaultPutRet.class);
+            // 存入数据库
+            SysOss qiniuContent = new SysOss();
+            qiniuContent.setFileName(name);
+            qiniuContent.setFileSuffix(FileUtil.getExtensionName(putRet.key));
+//            qiniuContent.setBucket(qiNiuConfig.getString(BizConst.QNY_BUCKET_NAME));
+            qiniuContent.setOriginalName(FileUtil.getFileNameNoEx(file.getOriginalFilename()));
+            qiniuContent.setUrl(qiNiuConfig.getString(BizConst.QNY_STATIC_DOMAIN) + putRet.key);
+//            qiniuContent.setFileSize(FileUtil.getSize(file.getSize()));
+            qiniuContent.setUpdateTime(DateUtil.date());
+            qiniuContent.setOssId(nextId);
+            qiNiuContentMapper.insert(qiniuContent);
+            return qiniuContent;
+        } catch (Exception e) {
+            throw new ServiceException(e.getMessage());
+        }
+    }
+
+
+    private String getPrefix(String prefix) {
+        if (StrUtil.isBlank(prefix)) {
+            prefix = "";
+        } else {
+            String separator = "/";
+            if (!prefix.endsWith(separator)) {
+                prefix += separator;
+            }
+            if (prefix.startsWith(separator)) {
+                prefix = prefix.substring(1);
+            }
+        }
+        return prefix;
+    }
+
+
+    @Nullable
+    private JSONObject getDynamicQiNiuConfig() {
+        Object qnyConfig = redisTemplate.opsForValue().get(BizConst.QNY_CONFIG_CACHE);
+        if (ObjUtil.isNull(qnyConfig)) {
+            Map<String, SysDictDataVo> dictMap = sysDictItemService.selectMapByType(BizConst.QNY_CONFIG).getData();
+            if (MapUtil.isEmpty(dictMap)) {
+                throw new ServiceException("oss配置不存在!");
+            }
+            JSONObject jsonObject = new JSONObject();
+            dictMap.forEach((k,v)->{
+                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);
+            return jsonObject;
+        }
+
+        return JSONObject.parseObject(String.valueOf(qnyConfig));
+    }
+}

+ 13 - 6
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@@ -140,12 +140,15 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
             Long parentId = d.getParentId();
             SysDeptVo sysDeptVo = StreamUtils.findFirst(depts, it -> it.getDeptId().longValue() == parentId);
             if (ObjectUtil.isNull(sysDeptVo)) {
-                List<Tree<Long>> trees = TreeBuildUtils.build(depts, parentId, (dept, tree) ->
-                    tree.setId(dept.getDeptId())
-                        .setParentId(dept.getParentId())
-                        .setName(dept.getDeptName())
-                        .setWeight(dept.getOrderNum())
-                        .putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus())));
+                List<Tree<Long>> trees = TreeBuildUtils.build(depts, parentId, (dept, tree) -> {
+                        tree.setId(dept.getDeptId())
+                            .setParentId(dept.getParentId())
+                            .setName(dept.getDeptName())
+                            .setWeight(dept.getOrderNum())
+                            .putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus()));
+                        tree.putExtra("deptCategory", dept.getDeptCategory());
+                    }
+                );
                 Tree<Long> tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId());
                 treeList.add(tree);
             }
@@ -427,6 +430,10 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
         return baseMapper.deleteById(deptId);
     }
 
+    @Caching(evict = {
+        @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#bo.deptId"),
+        @CacheEvict(cacheNames = CacheNames.SYS_DEPT_AND_CHILD, allEntries = true)
+    })
     @Override
     public int updateDeptStatus(SysDeptBo bo) {
         if (StrUtil.isBlank(bo.getStatus())) {

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

@@ -74,7 +74,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
         lqw.like(StringUtils.isNotBlank(bo.getDictType()), SysDictType::getDictType, bo.getDictType());
         lqw.between(params.get("beginTime") != null && params.get("endTime") != null,
             SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime"));
-        lqw.orderByAsc(SysDictType::getDictId);
+        lqw.orderByDesc(SysDictType::getDictId);
         return lqw;
     }
 

+ 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;
+    }
+}

+ 154 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysHospitalServiceImpl.java

@@ -0,0 +1,154 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+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.dromara.system.domain.SysOss;
+import org.dromara.system.mapper.SysOssMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysHospitalBo;
+import org.dromara.system.domain.vo.SysHospitalVo;
+import org.dromara.system.domain.SysHospital;
+import org.dromara.system.mapper.SysHospitalMapper;
+import org.dromara.system.service.ISysHospitalService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 医院管理Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-06-26
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysHospitalServiceImpl implements ISysHospitalService {
+
+    private final SysHospitalMapper baseMapper;
+    private final SysOssMapper ossMapper;
+
+    @Override
+    public SysHospitalVo getOneHospital() {
+        return baseMapper.selectVoOne(Wrappers.lambdaQuery(SysHospital.class));
+    }
+
+    /**
+     * 查询医院管理
+     *
+     * @param hospitalId 主键
+     * @return 医院管理
+     */
+    @Override
+    public SysHospitalVo queryById(Long hospitalId) {
+        return baseMapper.selectVoById(hospitalId);
+    }
+
+    /**
+     * 分页查询医院管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 医院管理分页列表
+     */
+    @Override
+    public TableDataInfo<SysHospitalVo> queryPageList(SysHospitalBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysHospital> lqw = buildQueryWrapper(bo);
+        Page<SysHospitalVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的医院管理列表
+     *
+     * @param bo 查询条件
+     * @return 医院管理列表
+     */
+    @Override
+    public List<SysHospitalVo> queryList(SysHospitalBo bo) {
+        LambdaQueryWrapper<SysHospital> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysHospital> buildQueryWrapper(SysHospitalBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysHospital> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysHospital::getHospitalId);
+        lqw.like(StringUtils.isNotBlank(bo.getHospitalName()), SysHospital::getHospitalName, bo.getHospitalName());
+        lqw.eq(StringUtils.isNotBlank(bo.getHospitalLogo()), SysHospital::getHospitalLogo, bo.getHospitalLogo());
+        lqw.eq(StringUtils.isNotBlank(bo.getHospitalLevel()), SysHospital::getHospitalLevel, bo.getHospitalLevel());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), SysHospital::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getBedSpace()), SysHospital::getBedSpace, bo.getBedSpace());
+        lqw.eq(StringUtils.isNotBlank(bo.getRegion()), SysHospital::getRegion, bo.getRegion());
+        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), SysHospital::getDescription, bo.getDescription());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysHospital::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增医院管理
+     *
+     * @param bo 医院管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysHospitalBo bo) {
+        SysHospital add = MapstructUtils.convert(bo, SysHospital.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setHospitalId(add.getHospitalId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改医院管理
+     *
+     * @param bo 医院管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysHospitalBo bo) {
+        SysHospital update = MapstructUtils.convert(bo, SysHospital.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysHospital entity) {
+        if (StrUtil.isBlank(entity.getHospitalName())) {
+            throw new ServiceException("医院名称不能为空!");
+        }
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除医院管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 17 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java

@@ -84,6 +84,17 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
         return baseMapper.selectRoleList(this.buildQueryWrapper(role));
     }
 
+    @Override
+    public TableDataInfo<SysRoleVo> selectAllRoleList() {
+        List<SysRole> sysRoles = baseMapper.selectList(Wrappers.lambdaQuery(SysRole.class)
+            .select(SysRole::getRoleId, SysRole::getRoleName)
+            .eq(SysRole::getStatus, SystemConstants.NORMAL)
+            .eq(SysRole::getDelFlag, SystemConstants.NORMAL));
+        List<SysRoleVo> voList = MapstructUtils.convert(sysRoles, SysRoleVo.class);
+        TableDataInfo<SysRoleVo> info = TableDataInfo.build(voList);
+        return info;
+    }
+
     private Wrapper<SysRole> buildQueryWrapper(SysRoleBo bo) {
         Map<String, Object> params = bo.getParams();
         QueryWrapper<SysRole> wrapper = Wrappers.query();
@@ -164,9 +175,13 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
      * @return 选中角色ID列表
      */
     @Override
-    public List<Long> selectRoleListByUserId(Long userId) {
+    public Long selectRoleListByUserId(Long userId) {
         List<SysRoleVo> list = baseMapper.selectRolesByUserId(userId);
-        return StreamUtils.toList(list, SysRoleVo::getRoleId);
+        if (CollUtil.isEmpty(list)) {
+            return null;
+        }
+//        return StreamUtils.toList(list, SysRoleVo::getRoleId);
+        return list.get(0).getRoleId();
     }
 
     /**

+ 26 - 3
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -58,6 +59,19 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
     @Override
     public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
         Page<SysUserVo> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user));
+
+        if (CollUtil.isNotEmpty(page.getRecords())) {
+            List<Long> userIdList = page.getRecords().stream().map(SysUserVo::getUserId).collect(Collectors.toList());
+            Map<Long, SysRoleVo> roleMap = roleMapper.selectRolesByUserIds(userIdList).stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> k2, (k1, k2) -> k1));
+            page.getRecords().forEach(r -> {
+                SysRoleVo vo = roleMap.get(r.getUserId());
+                if (ObjUtil.isNotNull(vo)) {
+                    r.setRoleId(vo.getRoleId());
+                    r.setRoleName(vo.getRoleName());
+                }
+            });
+        }
+
         return TableDataInfo.build(page);
     }
 
@@ -78,7 +92,6 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
         wrapper.eq("u.del_flag", SystemConstants.NORMAL)
             .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId())
             .in(StringUtils.isNotBlank(user.getUserIds()), "u.user_id", StringUtils.splitTo(user.getUserIds(), Convert::toLong))
-            .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
             .like(StringUtils.isNotBlank(user.getNickName()), "u.nick_name", user.getNickName())
             .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
             .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
@@ -89,7 +102,17 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
                 List<Long> ids = StreamUtils.toList(deptList, SysDept::getDeptId);
                 ids.add(user.getDeptId());
                 w.in("u.dept_id", ids);
-            }).orderByAsc("u.user_id");
+            })
+            .and(StringUtils.isNotBlank(user.getUserName()), w -> {
+                w.like("u.user_name", user.getUserName())
+                    .or()
+                    .like("u.job_number", user.getUserName())
+                    .or()
+                    .like("u.name", user.getUserName());
+            })
+            .exists(ObjUtil.isNotNull(user.getRoleId()),
+                "(select 1 from sys_user_role ur where ur.role_id = {0} and ur.user_id=u.user_id)",user.getRoleId())
+            .orderByAsc("u.user_id");
         if (StringUtils.isNotBlank(user.getExcludeUserIds())) {
             wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong));
         }
@@ -429,7 +452,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
      * @param clear 清除已存在的关联数据
      */
     private void insertUserRole(SysUserBo user, boolean clear) {
-        this.insertUserRole(user.getUserId(), user.getRoleIds(), clear);
+        this.insertUserRole(user.getUserId(), new Long[]{Long.valueOf(user.getRoleIds())}, clear);
     }
 
     /**

+ 174 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysWardServiceImpl.java

@@ -0,0 +1,174 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSONObject;
+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.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.SysDept;
+import org.dromara.system.mapper.SysDeptMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysWardBo;
+import org.dromara.system.domain.vo.SysWardVo;
+import org.dromara.system.domain.SysWard;
+import org.dromara.system.mapper.SysWardMapper;
+import org.dromara.system.service.ISysWardService;
+
+import java.util.Arrays;
+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 SysWardServiceImpl implements ISysWardService {
+
+    private final SysWardMapper baseMapper;
+    private final SysDeptMapper deptMapper;
+
+    /**
+     * 查询病区管理
+     *
+     * @param wardId 主键
+     * @return 病区管理
+     */
+    @Override
+    public SysWardVo queryById(Long wardId) {
+        return baseMapper.selectVoById(wardId);
+    }
+
+
+    @Override
+    public R<JSONObject> listUsed() {
+        JSONObject deptUsedMap = new JSONObject();
+        List<SysWard> sysWardList = baseMapper.selectList(Wrappers.lambdaQuery(SysWard.class)
+            .select(SysWard::getDeptId));
+        sysWardList.forEach(v -> {
+            Arrays.stream(v.getDeptId().split(",")).forEach(deptId -> {
+                deptUsedMap.put(deptId, Boolean.TRUE);
+            });
+        });
+
+        return R.ok(deptUsedMap);
+    }
+
+    /**
+     * 分页查询病区管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 病区管理分页列表
+     */
+    @Override
+    public TableDataInfo<SysWardVo> queryPageList(SysWardBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysWard> lqw = buildQueryWrapper(bo);
+        Page<SysWardVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        if (CollUtil.isNotEmpty(result.getRecords())) {
+            Set<Long> deptIds = CollUtil.newHashSet();
+            result.getRecords().forEach(v -> {
+                deptIds.addAll(Arrays.stream(v.getDeptId().split(",")).map(Long::valueOf).collect(Collectors.toSet()));
+            });
+            Map<String, String> deptMap = deptMapper.selectList(Wrappers.lambdaQuery(SysDept.class)
+                .select(SysDept::getDeptId, SysDept::getDeptName)
+                .in(SysDept::getDeptId, deptIds)).stream().collect(Collectors.toMap(k1 -> String.valueOf(k1.getDeptId()), k2 -> k2.getDeptName(), (k1, k2) -> k1));
+
+            result.getRecords().forEach(v -> {
+                v.setDeptName(Arrays.stream(v.getDeptId().split(",")).map(id -> {
+                    return deptMap.get(id);
+                }).filter(StringUtils::isNotBlank).collect(Collectors.joining(",")));
+            });
+        }
+
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的病区管理列表
+     *
+     * @param bo 查询条件
+     * @return 病区管理列表
+     */
+    @Override
+    public List<SysWardVo> queryList(SysWardBo bo) {
+        LambdaQueryWrapper<SysWard> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysWard> buildQueryWrapper(SysWardBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysWard> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysWard::getWardId);
+        lqw.like(StringUtils.isNotBlank(bo.getWardName()), SysWard::getWardName, bo.getWardName());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeptId()), SysWard::getDeptId, bo.getDeptId());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysWard::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增病区管理
+     *
+     * @param bo 病区管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysWardBo bo) {
+        SysWard add = MapstructUtils.convert(bo, SysWard.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setWardId(add.getWardId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改病区管理
+     *
+     * @param bo 病区管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysWardBo bo) {
+        SysWard update = MapstructUtils.convert(bo, SysWard.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysWard 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>

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

+ 16 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml

@@ -52,6 +52,22 @@
         WHERE r.del_flag = '0' and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
     </select>
 
+
+    <select id="selectRolesByUserIds" parameterType="list" resultMap="SysRoleResult">
+        select r.role_id,
+               r.role_name,
+               r.role_key,
+               r.role_sort,
+               r.data_scope,
+               r.status,
+               ur.user_id
+        from sys_role r join sys_user_role ur on r.role_id = ur.role_id
+        WHERE r.del_flag = '0' and ur.user_id in
+            <foreach collection="list" item="item" close=")" separator="," open="(">
+                #{item}
+            </foreach>
+    </select>
+
     <select id="selectRoleById" resultMap="SysRoleResult">
         <include refid="selectRoleVo"/>
         WHERE r.del_flag = '0' and r.role_id = #{roleId}

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -17,8 +17,8 @@
             ${ew.getSqlSelect}
         </if>
         <if test="ew.getSqlSelect == null">
-            u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
-            u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark
+            u.user_id, u.dept_id, u.name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
+            u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.job_number
         </if>
         from sys_user u
         ${ew.getCustomSqlSegment}

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

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

@@ -0,0 +1,82 @@
+
+CREATE TABLE sys_ward (
+  ward_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+  tenant_id varchar(20) default '000000' null comment '租户编号',
+  ward_name VARCHAR(100) NOT NULL COMMENT '病区名称',
+  dept_id VARCHAR(300) NOT NULL COMMENT '科室ID',
+  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_hospital (
+  hospital_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+  tenant_id varchar(20) default '000000' null comment '租户编号',
+  hospital_name VARCHAR(200) NOT NULL COMMENT '医院名称',
+  hospital_logo VARCHAR(300) COMMENT '医院logo',
+  hospital_level char(2) COMMENT '医院等级',
+  phone VARCHAR(20) COMMENT '联系电话',
+  bed_space VARCHAR(100)  COMMENT '住院床位',
+  region VARCHAR(300) COMMENT '所属地区',
+  description VARCHAR(1000) 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_disease_label (
+   label_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+   tenant_id varchar(20) default '000000' null comment '租户编号',
+   label_name VARCHAR(100) NOT NULL COMMENT '疾病/部位名称',
+   label_code VARCHAR(50) NOT NULL 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 '创建部门',
+   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_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');

+ 20 - 0
script/sql/biz/update.sql

@@ -0,0 +1,20 @@
+ALTER TABLE sys_user
+ADD COLUMN name VARCHAR(100) COMMENT '姓名',
+ADD COLUMN alias VARCHAR(50) COMMENT '别名',
+ADD COLUMN role VARCHAR(50) COMMENT '角色',
+ADD COLUMN dept_code VARCHAR(50) COMMENT '所属科室编码',
+ADD COLUMN job_number VARCHAR(50) COMMENT '工号',
+ADD COLUMN id_card VARCHAR(18) COMMENT '身份证号码',
+ADD COLUMN address VARCHAR(200) COMMENT '现住地址',
+ADD COLUMN birth_date DATE COMMENT '出生日期',
+ADD COLUMN reg_address VARCHAR(200) COMMENT '户籍地址',
+ADD COLUMN nation VARCHAR(20) COMMENT '民族',
+ADD COLUMN political VARCHAR(20) COMMENT '政治面貌',
+ADD COLUMN marital VARCHAR(10) COMMENT '婚姻状况',
+ADD COLUMN title VARCHAR(50) COMMENT '职称',
+ADD COLUMN education VARCHAR(20) COMMENT '学历',
+ADD COLUMN intro TEXT COMMENT '职工简介',
+ADD COLUMN expertise VARCHAR(200) COMMENT '擅长疾病',
+ADD COLUMN signature_img VARCHAR(200) COMMENT '签名图片路径';
+
+