瀏覽代碼

评估配置

chenying2100 3 月之前
父節點
當前提交
1560364362
共有 21 個文件被更改,包括 1366 次插入73 次删除
  1. 1 1
      ruoyi-admin/src/main/resources/application.yml
  2. 4 4
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/BizConst.java
  3. 125 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysScreeningAssessmentConfigController.java
  4. 105 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysScreeningAssessmentQuestionController.java
  5. 72 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysScreeningAssessmentConfig.java
  6. 76 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysScreeningAssessmentQuestion.java
  7. 71 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysScreeningAssessmentConfigBo.java
  8. 97 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysScreeningAssessmentQuestionBo.java
  9. 90 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysScreeningAssessmentConfigVo.java
  10. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysScreeningAssessmentQuestionVo.java
  11. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysScreeningAssessmentConfigMapper.java
  12. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysScreeningAssessmentQuestionMapper.java
  13. 0 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRecipeService.java
  14. 68 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysScreeningAssessmentConfigService.java
  15. 68 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysScreeningAssessmentQuestionService.java
  16. 0 66
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeServiceImpl.java
  17. 261 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysScreeningAssessmentConfigServiceImpl.java
  18. 135 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysScreeningAssessmentQuestionServiceImpl.java
  19. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysScreeningAssessmentConfigMapper.xml
  20. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysScreeningAssessmentQuestionMapper.xml
  21. 43 0
      script/sql/biz/create.sql

+ 1 - 1
ruoyi-admin/src/main/resources/application.yml

@@ -1,7 +1,7 @@
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 8080
+  port: 8081
   servlet:
     # 应用的访问路径
     context-path: /

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

@@ -9,11 +9,11 @@ public interface BizConst {
 
     String FOOD_UNIT = "food_unit";
 
-    String NUTRIENT_REFERENCE = "nutrient_reference";
+    String SCALE_TYPE = "scale_type";
 
-    String NUTRIENT_PROTEIN = "nutrient_protein";
-    String NUTRIENT_FAT = "nutrient_fat";
-    String NUTRIENT_CARBOHYDRATE = "nutrient_carbohydrate";
+    String QUESTION_OTHER_INFO = "otherInfo";
+
+    String QUESTION_BASE_INFO = "baseInfo";
 
     String DIETARY_TYPES = "dietary_types";
 

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

@@ -0,0 +1,125 @@
+package org.dromara.system.controller.system;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.system.domain.bo.SysRecipeBo;
+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.SysScreeningAssessmentConfigVo;
+import org.dromara.system.domain.bo.SysScreeningAssessmentConfigBo;
+import org.dromara.system.service.ISysScreeningAssessmentConfigService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 筛查/评估配置
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/screeningAssessmentConfig")
+public class SysScreeningAssessmentConfigController extends BaseController {
+
+    private final ISysScreeningAssessmentConfigService sysScreeningAssessmentConfigService;
+
+    /**
+     * 查询筛查/评估配置列表
+     */
+    @SaCheckPermission("system:screeningAssessmentConfig:list")
+    @GetMapping("/list")
+    public TableDataInfo<SysScreeningAssessmentConfigVo> list(SysScreeningAssessmentConfigBo bo, PageQuery pageQuery) {
+        return sysScreeningAssessmentConfigService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 状态修改
+     */
+    @SaCheckPermission("system:screeningAssessmentConfig:edit")
+    @Log(title = "筛查/评估配置管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public R<Void> changeStatus(@RequestBody SysScreeningAssessmentConfigBo configBo) {
+        if (ObjUtil.isNull(configBo.getConfigId())) {
+            throw new ServiceException("id不能为空!");
+        }
+        return toAjax(sysScreeningAssessmentConfigService.updateConfigStatus(
+            List.of(configBo.getConfigId()), configBo.getStatus()));
+    }
+
+    /**
+     * 导出筛查/评估配置列表
+     */
+    @SaCheckPermission("system:screeningAssessmentConfig:export")
+    @Log(title = "筛查/评估配置", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysScreeningAssessmentConfigBo bo, HttpServletResponse response) {
+        List<SysScreeningAssessmentConfigVo> list = sysScreeningAssessmentConfigService.queryList(bo);
+        ExcelUtil.exportExcel(list, "筛查/评估配置", SysScreeningAssessmentConfigVo.class, response);
+    }
+
+    /**
+     * 获取筛查/评估配置详细信息
+     *
+     * @param configId 主键
+     */
+    @SaCheckPermission("system:screeningAssessmentConfig:query")
+    @GetMapping("/{configId}")
+    public R<SysScreeningAssessmentConfigVo> getInfo(@NotNull(message = "主键不能为空")
+                                                     @PathVariable Long configId) {
+        return R.ok(sysScreeningAssessmentConfigService.queryById(configId));
+    }
+
+    /**
+     * 新增筛查/评估配置
+     */
+    @SaCheckPermission("system:screeningAssessmentConfig:add")
+    @Log(title = "筛查/评估配置", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysScreeningAssessmentConfigBo bo) {
+        return toAjax(sysScreeningAssessmentConfigService.insertByBo(bo));
+    }
+
+    /**
+     * 修改筛查/评估配置
+     */
+    @SaCheckPermission("system:screeningAssessmentConfig:edit")
+    @Log(title = "筛查/评估配置", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysScreeningAssessmentConfigBo bo) {
+        return toAjax(sysScreeningAssessmentConfigService.updateByBo(bo));
+    }
+
+    /**
+     * 删除筛查/评估配置
+     *
+     * @param configIds 主键串
+     */
+    @SaCheckPermission("system:screeningAssessmentConfig:remove")
+    @Log(title = "筛查/评估配置", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{configIds}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] configIds) {
+        return toAjax(sysScreeningAssessmentConfigService.deleteWithValidByIds(List.of(configIds), true));
+    }
+}

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

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

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

@@ -0,0 +1,72 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 筛查/评估配置对象 sys_screening_assessment_config
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_screening_assessment_config")
+public class SysScreeningAssessmentConfig extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "config_id")
+    private Long configId;
+
+    /**
+     * 量表类型
+     */
+    private String type;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 年龄
+     */
+    private String age;
+
+    /**
+     * 量表名称
+     */
+    private String name;
+
+    /**
+     * 量表说明
+     */
+    private String description;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 76 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysScreeningAssessmentQuestion.java

@@ -0,0 +1,76 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.system.domain.bo.SysScreeningAssessmentQuestionBo;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * 题目对象 sys_screening_assessment_question
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_screening_assessment_question")
+public class SysScreeningAssessmentQuestion extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "question_id")
+    private Long questionId;
+
+    /**
+     * 主键ID
+     */
+    private Long configId;
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 题型
+     */
+    private String questionType;
+
+    /**
+     * 子题型
+     */
+    private String questionChildType;
+
+    /**
+     * 系统参数-other类型:
+     */
+    private String lastType;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 是否必填
+     */
+    private Boolean required;
+
+    /**
+     * 横向排列、竖向排列
+     */
+    private String arrangement;
+
+    /**
+     * 累计选项得分、按最高分、按最低分
+     */
+    private String scoreMethod;
+}

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

@@ -0,0 +1,71 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysScreeningAssessmentConfig;
+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.*;
+
+import java.util.List;
+
+/**
+ * 筛查/评估配置业务对象 sys_screening_assessment_config
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysScreeningAssessmentConfig.class, reverseConvertGenerate = false)
+public class SysScreeningAssessmentConfigBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = {EditGroup.class})
+    private Long configId;
+
+    /**
+     * 量表类型
+     */
+    @NotBlank(message = "量表类型不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String type;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 年龄
+     */
+    private String age;
+
+    /**
+     * 量表名称
+     */
+    @NotBlank(message = "量表名称不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String name;
+
+    /**
+     * 量表说明
+     */
+    private String description;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    private SysScreeningAssessmentQuestionBo baseInfo;
+
+    private List<SysScreeningAssessmentQuestionBo> otherInfo;
+}

+ 97 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysScreeningAssessmentQuestionBo.java

@@ -0,0 +1,97 @@
+package org.dromara.system.domain.bo;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.dromara.system.domain.SysScreeningAssessmentQuestion;
+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.*;
+
+import java.util.List;
+
+/**
+ * 题目业务对象 sys_screening_assessment_question
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysScreeningAssessmentQuestion.class, reverseConvertGenerate = false)
+public class SysScreeningAssessmentQuestionBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = {EditGroup.class})
+    private Long questionId;
+
+    /**
+     * 主键ID
+     */
+    private Long configId;
+
+    /**
+     * 标题
+     */
+    @NotBlank(message = "标题不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String title;
+
+    /**
+     * 题型
+     */
+    @NotBlank(message = "题型不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String questionType;
+
+    /**
+     * 子题型
+     */
+    private String questionChildType;
+
+    /**
+     * 系统参数-other类型:
+     */
+    private String lastType;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    private List<QuestionAttrBo> contentList;
+
+    /**
+     * 是否必填
+     */
+    private Boolean required;
+
+    /**
+     * 横向排列、竖向排列
+     */
+    private String arrangement;
+
+    /**
+     * 累计选项得分、按最高分、按最低分
+     */
+    private String scoreMethod;
+
+    @Getter
+    @Setter
+    public static class QuestionAttrBo {
+        private Boolean labelFlag;
+        private String label;
+        private String value;
+        private String nameEn;
+        private String formType;
+        private String score;
+        private String img;
+        private Boolean allowFillBlank;
+        private String unit;
+        private String optionContent;
+        private Boolean optionFlag;
+    }
+}

+ 90 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysScreeningAssessmentConfigVo.java

@@ -0,0 +1,90 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.SysScreeningAssessmentConfig;
+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 org.dromara.system.domain.bo.SysScreeningAssessmentQuestionBo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 筛查/评估配置视图对象 sys_screening_assessment_config
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysScreeningAssessmentConfig.class)
+public class SysScreeningAssessmentConfigVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long configId;
+
+    /**
+     * 量表类型
+     */
+    @ExcelProperty(value = "量表类型")
+    private String type;
+
+    private String typeName;
+
+    /**
+     * 性别
+     */
+    @ExcelProperty(value = "性别")
+    private String gender;
+
+    /**
+     * 年龄
+     */
+    @ExcelProperty(value = "年龄")
+    private String age;
+
+    /**
+     * 量表名称
+     */
+    @ExcelProperty(value = "量表名称")
+    private String name;
+
+    /**
+     * 量表说明
+     */
+    @ExcelProperty(value = "量表说明")
+    private String description;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    private Long createBy;
+
+    private String createByName;
+
+    private SysScreeningAssessmentQuestionVo baseInfo;
+
+    private List<SysScreeningAssessmentQuestionVo> otherInfo;
+}

+ 106 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysScreeningAssessmentQuestionVo.java

@@ -0,0 +1,106 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.dromara.system.domain.SysScreeningAssessmentQuestion;
+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 org.dromara.system.domain.bo.SysScreeningAssessmentQuestionBo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 题目视图对象 sys_screening_assessment_question
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysScreeningAssessmentQuestion.class)
+public class SysScreeningAssessmentQuestionVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long questionId;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long configId;
+
+    /**
+     * 标题
+     */
+    @ExcelProperty(value = "标题")
+    private String title;
+
+    /**
+     * 题型
+     */
+    @ExcelProperty(value = "题型")
+    private String questionType;
+
+    /**
+     * 子题型
+     */
+    private String questionChildType;
+
+    /**
+     * 系统参数-other类型:
+     */
+    private String lastType;
+
+    /**
+     * 内容
+     */
+    @ExcelProperty(value = "内容")
+    private String content;
+
+    private List<SysScreeningAssessmentQuestionVo.QuestionAttrVo> contentList;
+
+    /**
+     * 是否必填
+     */
+    private Boolean required;
+
+    /**
+     * 横向排列、竖向排列
+     */
+    private String arrangement;
+
+    /**
+     * 累计选项得分、按最高分、按最低分
+     */
+    private String scoreMethod;
+
+    @Getter
+    @Setter
+    public static class QuestionAttrVo {
+        private Boolean labelFlag;
+        private String label;
+        private String value;
+        private String nameEn;
+        private String formType;
+        private String score;
+        private String img;
+        private Boolean allowFillBlank;
+        private String unit;
+        private String optionContent;
+        private Boolean optionFlag;
+    }
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysScreeningAssessmentConfig;
+import org.dromara.system.domain.vo.SysScreeningAssessmentConfigVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 筛查/评估配置Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+public interface SysScreeningAssessmentConfigMapper extends BaseMapperPlus<SysScreeningAssessmentConfig, SysScreeningAssessmentConfigVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysScreeningAssessmentQuestion;
+import org.dromara.system.domain.vo.SysScreeningAssessmentQuestionVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 题目Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+public interface SysScreeningAssessmentQuestionMapper extends BaseMapperPlus<SysScreeningAssessmentQuestion, SysScreeningAssessmentQuestionVo> {
+
+}

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

@@ -26,8 +26,6 @@ public interface ISysRecipeService {
      */
     SysRecipeVo queryById(Long recipeId);
 
-    R<JSONObject> nutrientAnalysis(Long recipeId);
-
     /**
      * 分页查询食谱管理列表
      *

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

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

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

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

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

@@ -84,70 +84,6 @@ public class SysRecipeServiceImpl implements ISysRecipeService {
                 .in(SysRecipe::getRecipeId, recipeIds));
     }
 
-    @Override
-    public R<com.alibaba.fastjson.JSONObject> nutrientAnalysis(Long recipeId) {
-        List<SysRecipeFoodIngredient> recipeFoodIngredientList =
-            sysRecipeFoodIngredientMapper.selectList(Wrappers.lambdaQuery(SysRecipeFoodIngredient.class)
-                .eq(SysRecipeFoodIngredient::getRecipeId, recipeId));
-        if (CollUtil.isEmpty(recipeFoodIngredientList)) {
-            return R.ok();
-        }
-
-        List<SysFoodIngredient> foodIngredientList = foodIngredientMapper.selectList(Wrappers.lambdaQuery(SysFoodIngredient.class)
-            .in(SysFoodIngredient::getFoodIngredientId, recipeFoodIngredientList.stream().map(v -> v.getFoodIngredientId()).collect(Collectors.toList())));
-
-        List<JSONObject> leftList = CollUtil.newArrayList();
-        List<JSONObject> rightList = CollUtil.newArrayList();
-        List<JSONObject> pieList = CollUtil.newArrayList();
-        List<JSONObject> pieLegendList = CollUtil.newArrayList();
-
-        JSONObject protein = new JSONObject();
-        JSONObject fat = new JSONObject();
-        JSONObject carbohydrate = new JSONObject();
-        BigDecimal treeNutrient = BigDecimal.ZERO;
-        for (SysFoodIngredient v : foodIngredientList) {
-            protein.put("val", protein.getBigDecimal("val", BigDecimal.ZERO).add(v.getProtein()).setScale(4, BigDecimal.ROUND_HALF_UP));
-            treeNutrient = treeNutrient.add(protein.getBigDecimal("val"));
-
-            fat.put("val", fat.getBigDecimal("val", BigDecimal.ZERO).add(v.getFat()).setScale(4, BigDecimal.ROUND_HALF_UP));
-            treeNutrient = treeNutrient.add(fat.getBigDecimal("val"));
-
-            carbohydrate.put("val", carbohydrate.getBigDecimal("val", BigDecimal.ZERO).add(v.getCarbohydrate()).setScale(4, BigDecimal.ROUND_HALF_UP));
-            treeNutrient = treeNutrient.add(carbohydrate.getBigDecimal("val"));
-        }
-
-        if (treeNutrient.equals(BigDecimal.ZERO)) {
-            protein.put("ratio", BigDecimal.ZERO);
-            fat.put("ratio", BigDecimal.ZERO);
-            carbohydrate.put("ratio", BigDecimal.ZERO);
-        } else {
-            protein.put("ratio", protein.getBigDecimal("val", BigDecimal.ZERO).divide(treeNutrient).setScale(2, BigDecimal.ROUND_HALF_UP));
-            fat.put("ratio", protein.getBigDecimal("val", BigDecimal.ZERO).divide(treeNutrient).setScale(2, BigDecimal.ROUND_HALF_UP));
-            carbohydrate.put("ratio", protein.getBigDecimal("val", BigDecimal.ZERO).divide(treeNutrient).setScale(2, BigDecimal.ROUND_HALF_UP));
-        }
-
-        Map<String, SysDictDataVo> dictDataVoMap = dictDataService.selectMapByType(BizConst.NUTRIENT_REFERENCE).getData();
-        SysDictDataVo nutrientProtein = dictDataVoMap.get(BizConst.NUTRIENT_PROTEIN);
-        SysDictDataVo nutrientFat = dictDataVoMap.get(BizConst.NUTRIENT_FAT);
-        SysDictDataVo nutrientCarbohydrate = dictDataVoMap.get(BizConst.NUTRIENT_CARBOHYDRATE);
-
-        protein.put("name", nutrientProtein.getRemark());
-        fat.put("name", nutrientFat.getRemark());
-        carbohydrate.put("name", nutrientCarbohydrate.getRemark());
-
-        protein.put("referenceValue", nutrientProtein.getDictValue());
-        fat.put("referenceValue", nutrientFat.getDictValue());
-        carbohydrate.put("referenceValue", nutrientCarbohydrate.getDictValue());
-
-        leftList.add(protein);
-        leftList.add(fat);
-        leftList.add(carbohydrate);
-
-        com.alibaba.fastjson.JSONObject result = new com.alibaba.fastjson.JSONObject();
-        result.put("left", leftList);
-
-        return R.ok(result);
-    }
 
     /**
      * 查询食谱管理
@@ -230,8 +166,6 @@ public class SysRecipeServiceImpl implements ISysRecipeService {
             vo.setFoodList(MapstructUtils.convert(foodIngredientList, SysFoodIngredientVo.class));
         }
 
-//        vo.setNutrientAnalysis(nutrientAnalysis(recipeId).getData());
-
         return vo;
     }
 

+ 261 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysScreeningAssessmentConfigServiceImpl.java

@@ -0,0 +1,261 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.aspectj.weaver.ast.Or;
+import org.dromara.common.core.constant.BizConst;
+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.SysRecipe;
+import org.dromara.system.domain.SysScreeningAssessmentQuestion;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.bo.SysScreeningAssessmentQuestionBo;
+import org.dromara.system.domain.vo.SysDictDataVo;
+import org.dromara.system.domain.vo.SysScreeningAssessmentQuestionVo;
+import org.dromara.system.mapper.SysScreeningAssessmentQuestionMapper;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.system.service.ISysDictDataService;
+import org.dromara.system.service.ISysUserService;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysScreeningAssessmentConfigBo;
+import org.dromara.system.domain.vo.SysScreeningAssessmentConfigVo;
+import org.dromara.system.domain.SysScreeningAssessmentConfig;
+import org.dromara.system.mapper.SysScreeningAssessmentConfigMapper;
+import org.dromara.system.service.ISysScreeningAssessmentConfigService;
+import org.springframework.transaction.annotation.Transactional;
+
+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-07-08
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysScreeningAssessmentConfigServiceImpl implements ISysScreeningAssessmentConfigService {
+
+    private final SysScreeningAssessmentConfigMapper baseMapper;
+    private final SysScreeningAssessmentQuestionMapper questionMapper;
+    private final ISysDictDataService dictDataService;
+    private final SysUserMapper userMapper;
+
+    @Override
+    public int updateConfigStatus(List<Long> configIdIds, String status) {
+        return baseMapper.update(null,
+            new LambdaUpdateWrapper<SysScreeningAssessmentConfig>()
+                .set(SysScreeningAssessmentConfig::getStatus, status)
+                .in(SysScreeningAssessmentConfig::getConfigId, configIdIds));
+    }
+
+    /**
+     * 查询筛查/评估配置
+     *
+     * @param configId 主键
+     * @return 筛查/评估配置
+     */
+    @Override
+    public SysScreeningAssessmentConfigVo queryById(Long configId) {
+        SysScreeningAssessmentConfigVo vo = baseMapper.selectVoById(configId);
+        if (ObjUtil.isNotNull(vo)) {
+            List<SysScreeningAssessmentQuestionVo> voList = questionMapper.selectVoList(Wrappers.lambdaQuery(SysScreeningAssessmentQuestion.class)
+                .eq(SysScreeningAssessmentQuestion::getConfigId, vo.getConfigId()));
+
+            Map<String, List<SysScreeningAssessmentQuestionVo>> voMap = voList.stream().collect(Collectors.groupingBy(v -> {
+                if (StrUtil.isNotBlank(v.getContent())) {
+                    v.setContentList(JSON.parseArray(v.getContent(), SysScreeningAssessmentQuestionVo.QuestionAttrVo.class));
+                }
+                if (BizConst.QUESTION_BASE_INFO.equalsIgnoreCase(v.getQuestionType())) {
+                    return BizConst.QUESTION_BASE_INFO;
+                } else {
+                    return BizConst.QUESTION_OTHER_INFO;
+                }
+            }));
+
+            List<SysScreeningAssessmentQuestionVo> questionList = voMap.get(BizConst.QUESTION_BASE_INFO);
+            if (CollUtil.isNotEmpty(questionList)) {
+                vo.setBaseInfo(questionList.get(0));
+            }
+
+            questionList = voMap.get(BizConst.QUESTION_OTHER_INFO);
+            if (CollUtil.isNotEmpty(questionList)) {
+                vo.setOtherInfo(questionList);
+            }
+        }
+
+        return vo;
+    }
+
+    /**
+     * 分页查询筛查/评估配置列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 筛查/评估配置分页列表
+     */
+    @Override
+    public TableDataInfo<SysScreeningAssessmentConfigVo> queryPageList(SysScreeningAssessmentConfigBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysScreeningAssessmentConfig> lqw = buildQueryWrapper(bo);
+        Page<SysScreeningAssessmentConfigVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        if (CollUtil.isNotEmpty(result.getRecords())) {
+            Map<String, SysDictDataVo> dictMap = dictDataService.selectMapByType(BizConst.SCALE_TYPE).getData();
+            Set<Long> userList = CollUtil.newHashSet();
+            result.getRecords().forEach(v -> {
+                userList.add(v.getCreateBy());
+                SysDictDataVo dataVo = dictMap.get(v.getType());
+                if (ObjUtil.isNotNull(dataVo)) {
+                    v.setTypeName(dataVo.getDictLabel());
+                }
+            });
+
+            Map<Long, String> userMap = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class)
+                .select(SysUser::getUserId, SysUser::getNickName)
+                .in(SysUser::getUserId, userList)).stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> k2.getNickName(), (k1, k2) -> k1));
+
+            result.getRecords().forEach(v -> {
+                v.setCreateByName(userMap.get(v.getCreateBy()));
+            });
+
+        }
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的筛查/评估配置列表
+     *
+     * @param bo 查询条件
+     * @return 筛查/评估配置列表
+     */
+    @Override
+    public List<SysScreeningAssessmentConfigVo> queryList(SysScreeningAssessmentConfigBo bo) {
+        LambdaQueryWrapper<SysScreeningAssessmentConfig> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysScreeningAssessmentConfig> buildQueryWrapper(SysScreeningAssessmentConfigBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysScreeningAssessmentConfig> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysScreeningAssessmentConfig::getConfigId);
+        lqw.eq(StringUtils.isNotBlank(bo.getType()), SysScreeningAssessmentConfig::getType, bo.getType());
+        lqw.eq(StringUtils.isNotBlank(bo.getGender()), SysScreeningAssessmentConfig::getGender, bo.getGender());
+        lqw.eq(StringUtils.isNotBlank(bo.getAge()), SysScreeningAssessmentConfig::getAge, bo.getAge());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), SysScreeningAssessmentConfig::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), SysScreeningAssessmentConfig::getDescription, bo.getDescription());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysScreeningAssessmentConfig::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增筛查/评估配置
+     *
+     * @param bo 筛查/评估配置
+     * @return 是否新增成功
+     */
+    @Override
+    @Transactional
+    public Boolean insertByBo(SysScreeningAssessmentConfigBo bo) {
+        SysScreeningAssessmentConfig add = MapstructUtils.convert(bo, SysScreeningAssessmentConfig.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setConfigId(add.getConfigId());
+
+            if (ObjUtil.isNotNull(bo.getBaseInfo())) {
+                SysScreeningAssessmentQuestionBo questionBo = bo.getBaseInfo();
+                questionBo.setConfigId(add.getConfigId());
+                questionBo.setContent(JSON.toJSONString(questionBo.getContentList()));
+                SysScreeningAssessmentQuestion question = MapstructUtils.convert(questionBo, SysScreeningAssessmentQuestion.class);
+                questionMapper.insert(question);
+            }
+            if (CollUtil.isNotEmpty(bo.getOtherInfo())) {
+                List<SysScreeningAssessmentQuestionBo> questionBoList = bo.getOtherInfo();
+                questionBoList.forEach(questionBo -> {
+                    questionBo.setConfigId(add.getConfigId());
+                    questionBo.setContent(JSON.toJSONString(questionBo.getContentList()));
+                });
+
+                List<SysScreeningAssessmentQuestion> questionList = MapstructUtils.convert(questionBoList, SysScreeningAssessmentQuestion.class);
+                questionMapper.insertBatch(questionList);
+            }
+        }
+        return flag;
+    }
+
+    /**
+     * 修改筛查/评估配置
+     *
+     * @param bo 筛查/评估配置
+     * @return 是否修改成功
+     */
+    @Override
+    @Transactional
+    public Boolean updateByBo(SysScreeningAssessmentConfigBo bo) {
+        SysScreeningAssessmentConfig update = MapstructUtils.convert(bo, SysScreeningAssessmentConfig.class);
+        validEntityBeforeSave(update);
+        boolean flag = baseMapper.updateById(update) > 0;
+
+        if (flag) {
+            questionMapper.delete(Wrappers.lambdaQuery(SysScreeningAssessmentQuestion.class)
+                .eq(SysScreeningAssessmentQuestion::getConfigId, update.getConfigId()));
+
+            if (ObjUtil.isNotNull(bo.getBaseInfo())) {
+                SysScreeningAssessmentQuestionBo questionBo = bo.getBaseInfo();
+                questionBo.setConfigId(update.getConfigId());
+                questionBo.setContent(JSON.toJSONString(questionBo.getContentList()));
+                SysScreeningAssessmentQuestion question = MapstructUtils.convert(questionBo, SysScreeningAssessmentQuestion.class);
+                questionMapper.insert(question);
+            }
+            if (CollUtil.isNotEmpty(bo.getOtherInfo())) {
+                List<SysScreeningAssessmentQuestionBo> questionBoList = bo.getOtherInfo();
+                questionBoList.forEach(questionBo -> {
+                    questionBo.setConfigId(update.getConfigId());
+                    questionBo.setContent(JSON.toJSONString(questionBo.getContentList()));
+                });
+
+                List<SysScreeningAssessmentQuestion> questionList = MapstructUtils.convert(questionBoList, SysScreeningAssessmentQuestion.class);
+                questionMapper.insertBatch(questionList);
+            }
+        }
+
+        return flag;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysScreeningAssessmentConfig entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除筛查/评估配置信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 135 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysScreeningAssessmentQuestionServiceImpl.java

@@ -0,0 +1,135 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysScreeningAssessmentQuestionBo;
+import org.dromara.system.domain.vo.SysScreeningAssessmentQuestionVo;
+import org.dromara.system.domain.SysScreeningAssessmentQuestion;
+import org.dromara.system.mapper.SysScreeningAssessmentQuestionMapper;
+import org.dromara.system.service.ISysScreeningAssessmentQuestionService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 题目Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-08
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysScreeningAssessmentQuestionServiceImpl implements ISysScreeningAssessmentQuestionService {
+
+    private final SysScreeningAssessmentQuestionMapper baseMapper;
+
+    /**
+     * 查询题目
+     *
+     * @param questionId 主键
+     * @return 题目
+     */
+    @Override
+    public SysScreeningAssessmentQuestionVo queryById(Long questionId){
+        return baseMapper.selectVoById(questionId);
+    }
+
+    /**
+     * 分页查询题目列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 题目分页列表
+     */
+    @Override
+    public TableDataInfo<SysScreeningAssessmentQuestionVo> queryPageList(SysScreeningAssessmentQuestionBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysScreeningAssessmentQuestion> lqw = buildQueryWrapper(bo);
+        Page<SysScreeningAssessmentQuestionVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的题目列表
+     *
+     * @param bo 查询条件
+     * @return 题目列表
+     */
+    @Override
+    public List<SysScreeningAssessmentQuestionVo> queryList(SysScreeningAssessmentQuestionBo bo) {
+        LambdaQueryWrapper<SysScreeningAssessmentQuestion> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysScreeningAssessmentQuestion> buildQueryWrapper(SysScreeningAssessmentQuestionBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysScreeningAssessmentQuestion> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysScreeningAssessmentQuestion::getQuestionId);
+        lqw.eq(bo.getConfigId() != null, SysScreeningAssessmentQuestion::getConfigId, bo.getConfigId());
+        lqw.eq(StringUtils.isNotBlank(bo.getTitle()), SysScreeningAssessmentQuestion::getTitle, bo.getTitle());
+        lqw.eq(StringUtils.isNotBlank(bo.getQuestionType()), SysScreeningAssessmentQuestion::getQuestionType, bo.getQuestionType());
+        lqw.eq(StringUtils.isNotBlank(bo.getContent()), SysScreeningAssessmentQuestion::getContent, bo.getContent());
+        return lqw;
+    }
+
+    /**
+     * 新增题目
+     *
+     * @param bo 题目
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysScreeningAssessmentQuestionBo bo) {
+        SysScreeningAssessmentQuestion add = MapstructUtils.convert(bo, SysScreeningAssessmentQuestion.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setQuestionId(add.getQuestionId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改题目
+     *
+     * @param bo 题目
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysScreeningAssessmentQuestionBo bo) {
+        SysScreeningAssessmentQuestion update = MapstructUtils.convert(bo, SysScreeningAssessmentQuestion.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysScreeningAssessmentQuestion 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/SysScreeningAssessmentConfigMapper.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.SysScreeningAssessmentConfigMapper">
+
+</mapper>

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

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

@@ -187,3 +187,46 @@ CREATE TABLE sys_recipe_food_ingredient (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='食谱与食材关联表';
 
 
+
+CREATE TABLE sys_screening_assessment_config (
+    config_id     BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+    tenant_id  varchar(20) default '000000' null comment '租户编号',
+    type          char(1) NOT NULL COMMENT '量表类型',           -- 如:营养筛查、营养评估
+    gender        char(2) DEFAULT '-1' COMMENT '性别',         -- 男、女、不限
+    age           char(2) DEFAULT '-1' COMMENT '年龄',         -- 如:不限、18-65、>65等
+    name          VARCHAR(150) NOT NULL COMMENT '量表名称',
+    description   VARCHAR(300) DEFAULT NULL COMMENT '量表说明',
+    remark        text DEFAULT NULL COMMENT '备注',
+
+    -- 系统字段
+    status CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+    del_flag char default '0' null comment '删除标志(0代表存在 1代表删除)',
+    create_dept  bigint null comment '创建部门',
+    create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
+    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
+    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='筛查/评估配置表';
+
+
+CREATE TABLE sys_screening_assessment_question(
+    question_id     BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+    tenant_id  varchar(20) default '000000' null comment '租户编号',
+    config_id     BIGINT  COMMENT '主键ID',
+    title     VARCHAR(600) NOT NULL COMMENT '标题',
+    question_type VARCHAR(50) NOT NULL COMMENT '题型',
+    question_Child_Type VARCHAR(50)  COMMENT '子题型',
+    last_type CHAR(1)  COMMENT '系统参数-other类型',
+    arrangement CHAR(1)  COMMENT '横向排列、竖向排列',
+    score_method CHAR(1)  COMMENT '累计选项得分、按最高分、按最低分',
+    required tinyint  COMMENT '是否必填',
+    content   text COMMENT '内容',
+
+    -- 系统字段
+    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='题目表';
+