Explorar el Código

膳食治疗移动

Huanyi hace 1 mes
padre
commit
6dec9fe8d4
Se han modificado 19 ficheros con 590 adiciones y 22 borrados
  1. 69 2
      ruoyi-admin/src/main/java/org/dromara/web/controller/ExcelController.java
  2. 47 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/LongTermManagementInstructionsController.java
  3. 17 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/LongTermManagementExecuteBo.java
  4. 62 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/LongTermManagementListPageBo.java
  5. 17 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/LongTermManagementStopBo.java
  6. 105 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LongTermManagementListPageVo.java
  7. 23 0
      ruoyi-admin/src/main/java/org/dromara/web/service/LongTermManagementService.java
  8. 2 1
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/HospitalMealPlanServiceImpl.java
  9. 161 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/LongTermManagementServiceImpl.java
  10. 3 3
      ruoyi-admin/src/main/resources/application-prod.yml
  11. 1 1
      ruoyi-admin/src/main/resources/application.yml
  12. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDiseaseLabel.java
  13. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRecipeBo.java
  14. 1 3
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysFoodIngredientVo.java
  15. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRecipeVo.java
  16. 77 12
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeServiceImpl.java
  17. 0 0
      script/sql/biz/2025/08/dump_2025_08_14.sql
  18. 0 0
      script/sql/biz/2025/08/dump_2025_08_20.sql
  19. 0 0
      script/sql/biz/2025/08/dump_2025_08_21.sql

+ 69 - 2
ruoyi-admin/src/main/java/org/dromara/web/controller/ExcelController.java

@@ -4,12 +4,16 @@ import cn.dev33.satoken.annotation.SaIgnore;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.checkerframework.checker.units.qual.C;
 import org.dromara.common.core.domain.R;
+import org.dromara.system.domain.SysDiseaseLabel;
 import org.dromara.system.domain.SysFoodIngredient;
 import org.dromara.system.mapper.SysDictDataMapper;
+import org.dromara.system.mapper.SysDiseaseLabelMapper;
 import org.dromara.system.mapper.SysFoodIngredientMapper;
 import org.springframework.http.MediaType;
 import org.springframework.transaction.annotation.Transactional;
@@ -38,10 +42,11 @@ import java.util.Objects;
 public class ExcelController {
 
     private final SysFoodIngredientMapper sysFoodIngredientMapper;
+    private final SysDiseaseLabelMapper sysDiseaseLabelMapper;
 
-    @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @PostMapping(value = "/food", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     @Transactional(rollbackFor = Exception.class)
-    public R insertBatch(@RequestPart("file") MultipartFile file) {
+    public R insertBatchFood(@RequestPart("file") MultipartFile file) {
 
         try {
             XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
@@ -107,4 +112,66 @@ public class ExcelController {
         }
     }
 
+    @PostMapping(value = "/disease", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @Transactional(rollbackFor = Exception.class)
+    public R insertBatchDisease(@RequestPart("file") MultipartFile file) {
+        try {
+            System.err.println("开始读取文件");
+
+            XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
+
+            Sheet sheet = workbook.getSheetAt(0);
+
+            List<SysDiseaseLabel> list = new ArrayList<>();
+
+            System.err.println("开始处理表格数据");
+            for (Row row : sheet) {
+
+                if (row.getRowNum() == 0) continue;
+
+                SysDiseaseLabel disease = new SysDiseaseLabel();
+                for (Cell cell : row) {
+
+//                    System.err.println(cell.getColumnIndex() + " : " + cell.getCellType());
+
+                    switch (cell.getColumnIndex()) {
+                        case 0 -> {
+                            if (cell.getCellType() == CellType.STRING) disease.setLabelId(Long.valueOf(cell.getStringCellValue()));
+                            else disease.setLabelId((long) cell.getNumericCellValue());
+                        }
+                        case 1 -> {
+                            if (cell.getCellType() == CellType.STRING) disease.setLabelName(cell.getStringCellValue());
+                            else disease.setLabelName(String.valueOf((int) cell.getNumericCellValue()));
+                        }
+                        case 2 -> {
+                            if (cell.getCellType() == CellType.STRING) disease.setLabelCode(cell.getStringCellValue());
+                            else disease.setLabelCode(String.valueOf((int) cell.getNumericCellValue()));
+                        }
+                        case 3 -> {
+                            if (cell.getCellType() == CellType.STRING) disease.setType(cell.getStringCellValue());
+                            else disease.setType(String.valueOf((int) cell.getNumericCellValue()));
+                        }
+                    }
+
+                }
+
+                list.add(disease);
+
+            }
+
+            System.err.println("已成功提取 " + list.size() + " 条数据");
+
+            boolean flag = sysDiseaseLabelMapper.insertBatch(list);
+            if (!flag) throw new RuntimeException("批量插入失败!");
+
+            System.err.println("输入导入成功!");
+
+            return R.ok();
+
+        } catch (Exception e) {
+            System.err.println("处理文件异常 : " + e.getMessage());
+            throw new RuntimeException("文件处理异常");
+        }
+    }
+
 }

+ 47 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/LongTermManagementInstructionsController.java

@@ -0,0 +1,47 @@
+package org.dromara.web.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.web.domain.bo.LongTermManagementExecuteBo;
+import org.dromara.web.domain.bo.LongTermManagementListPageBo;
+import org.dromara.web.domain.bo.LongTermManagementStopBo;
+import org.dromara.web.domain.vo.LongTermManagementListPageVo;
+import org.dromara.web.service.LongTermManagementService;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-25
+ * @Description:
+ * @Version: 1.0
+ */
+
+@RestController
+@RequestMapping("/longTerm/management")
+@RequiredArgsConstructor
+public class LongTermManagementInstructionsController {
+
+    private final LongTermManagementService longTermManagementService;
+
+    @GetMapping("/list")
+    @SaCheckPermission("workbench:long:list")
+    public TableDataInfo<LongTermManagementListPageVo> listPage(LongTermManagementListPageBo bo, PageQuery pageQuery) {
+        return longTermManagementService.listPage(bo, pageQuery);
+    }
+
+    @PutMapping("/execute")
+    @SaCheckPermission("workbench:long:execute")
+    public R execute(@RequestBody LongTermManagementExecuteBo bo) {
+        return longTermManagementService.execute(bo);
+    }
+
+    @PutMapping("/stop")
+    @SaCheckPermission("workbench:long:stop")
+    public R stop(@RequestBody LongTermManagementStopBo bo) {
+        return longTermManagementService.stop(bo);
+    }
+
+}

+ 17 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/LongTermManagementExecuteBo.java

@@ -0,0 +1,17 @@
+package org.dromara.web.domain.bo;
+
+import lombok.Data;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-25
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class LongTermManagementExecuteBo {
+
+    private Long id;
+
+}

+ 62 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/LongTermManagementListPageBo.java

@@ -0,0 +1,62 @@
+package org.dromara.web.domain.bo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-25
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class LongTermManagementListPageBo {
+
+    /**
+     * 最早执行时间
+     */
+    private Date executeTimeEarliest;
+
+    /**
+     * 最晚执行时间
+     */
+    private Date executeTimeLatest;
+
+    /**
+     * 最早开方时间
+     */
+    private Date createTimeEarliest;
+
+    /**
+     * 最晚开放时间
+     */
+    private Date createTimeLatest;
+
+    /**
+     * 患者科室
+     */
+    private Long patientDepartment;
+
+    /**
+     * 病区
+     */
+    private Long wardId;
+
+    /**
+     * 看诊类型
+     */
+    private String consultationType;
+
+    /**
+     * 执行状态
+     */
+    private String executeStatus;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+}

+ 17 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/LongTermManagementStopBo.java

@@ -0,0 +1,17 @@
+package org.dromara.web.domain.bo;
+
+import lombok.Data;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-25
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class LongTermManagementStopBo {
+
+    private Long id;
+
+}

+ 105 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LongTermManagementListPageVo.java

@@ -0,0 +1,105 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-25
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class LongTermManagementListPageVo {
+
+    /**
+     *
+     */
+    private Long id;
+
+    /**
+     * 执行时间
+     */
+    private LocalTime executeTime;
+
+    /**
+     * 开方时间
+     */
+    private Date createTime;
+
+    /**
+     * 用餐时间
+     */
+    private String mealTime;
+
+    /**
+     * 执行状态
+     */
+    private String executeStatus;
+
+    /**
+     * 停嘱时间
+     */
+    private Date stopTime;
+
+    /**
+     * 处方ID
+     */
+    private Long settlementId;
+
+    /**
+     * 处方明细
+     */
+    private String nutritionDetail;
+
+    /**
+     * 患者科室
+     */
+    private String patientDepartment;
+
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+    private Long patientId;
+
+    /**
+     * 看诊类型
+     */
+    private String consultationType;
+
+    /**
+     * 门诊/住院号
+     */
+    private String medicalId;
+
+    /**
+     * 病区
+     */
+    private String wardName;
+
+    /**
+     * 床号
+     */
+    private String bedId;
+
+    /**
+     * 医生姓名
+     */
+    private String doctorName;
+
+    /**
+     * 医生科室
+     */
+    private String doctorDepartment;
+
+    /**
+     * 备注
+     */
+    private String note;
+
+}

+ 23 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/LongTermManagementService.java

@@ -0,0 +1,23 @@
+package org.dromara.web.service;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.web.domain.bo.LongTermManagementExecuteBo;
+import org.dromara.web.domain.bo.LongTermManagementListPageBo;
+import org.dromara.web.domain.bo.LongTermManagementStopBo;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-25
+ * @Description:
+ * @Version: 1.0
+ */
+
+public interface LongTermManagementService {
+    TableDataInfo listPage(LongTermManagementListPageBo bo, PageQuery pageQuery);
+
+    R execute(LongTermManagementExecuteBo bo);
+
+    R stop(LongTermManagementStopBo bo);
+}

+ 2 - 1
ruoyi-admin/src/main/java/org/dromara/web/service/impl/HospitalMealPlanServiceImpl.java

@@ -142,6 +142,7 @@ public class HospitalMealPlanServiceImpl implements IHospitalMealPlanService {
      */
     @Override
     public Boolean insertByBo(HospitalMealPlanBo bo) {
+        log.info(bo.toString());
         /*新增院内膳食时新增一条结算管理的待收费订单*/
         TreatmentUser treatmentUser = treatmentUserMapper.selectById(bo.getPatientId());
         Settlement settlement = new Settlement();
@@ -178,7 +179,7 @@ public class HospitalMealPlanServiceImpl implements IHospitalMealPlanService {
                 bo.setId(add.getId());
             }
         }
-
+        log.info("{}", flag);
         return flag;
     }
 

+ 161 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/LongTermManagementServiceImpl.java

@@ -0,0 +1,161 @@
+package org.dromara.web.service.impl;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.*;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.mapper.SysDeptMapper;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.web.domain.EnteralNutrition;
+import org.dromara.web.domain.Settlement;
+import org.dromara.web.domain.TreatmentUser;
+import org.dromara.web.domain.bo.LongTermManagementExecuteBo;
+import org.dromara.web.domain.bo.LongTermManagementListPageBo;
+import org.dromara.web.domain.bo.LongTermManagementStopBo;
+import org.dromara.web.domain.vo.LongTermManagementListPageVo;
+import org.dromara.web.mapper.EnteralNutritionMapper;
+import org.dromara.web.mapper.SettlementMapper;
+import org.dromara.web.mapper.TreatmentUserMapper;
+import org.dromara.web.service.LongTermManagementService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-25
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class LongTermManagementServiceImpl implements LongTermManagementService {
+
+    private final EnteralNutritionMapper enteralNutritionMapper;
+    private final SettlementMapper settlementMapper;
+    private final TreatmentUserMapper treatmentUserMapper;
+    private final SysDeptMapper sysDeptMapper;
+    private final SysUserMapper sysUserMapper;
+
+    @Override
+    public TableDataInfo listPage(LongTermManagementListPageBo bo, PageQuery pageQuery) {
+
+        List<Long> patientIds = new ArrayList<>();
+        Map<Long, String> patientNames = new HashMap<>();
+        List<TreatmentUser> patientList = treatmentUserMapper.selectList(
+            Wrappers.lambdaQuery(TreatmentUser.class)
+                .like(bo.getPatientName() != null, TreatmentUser::getTreatName, bo.getPatientName())
+                .eq(bo.getConsultationType() != null, TreatmentUser::getType, bo.getConsultationType())
+                .eq(bo.getWardId() != null, TreatmentUser::getWardId, bo.getWardId())
+        );
+        patientList.forEach(e -> {
+            patientIds.add(e.getId());
+            patientNames.put(e.getId(), e.getTreatName());
+        });
+
+        Map<Long, String> deptMap = new HashMap<>();
+        sysDeptMapper.selectList().forEach(e -> deptMap.put(e.getDeptId(), e.getDeptName()));
+        Map<Long, String> doctorMap = new HashMap<>();
+        sysUserMapper.selectList().forEach(e -> doctorMap.put(e.getUserId(), e.getName()));
+
+        Page<EnteralNutrition> page = enteralNutritionMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(EnteralNutrition.class)
+                .ge(bo.getCreateTimeEarliest() != null, EnteralNutrition::getCreateTime, bo.getCreateTimeEarliest())
+                .le(bo.getCreateTimeLatest() != null, EnteralNutrition::getCreateTime, bo.getCreateTimeLatest())
+                .ge(bo.getExecuteTimeEarliest() != null, EnteralNutrition::getExecuteTime, bo.getExecuteTimeEarliest())
+                .le(bo.getExecuteTimeLatest() != null, EnteralNutrition::getExecuteTime, bo.getExecuteTimeLatest())
+                .eq(bo.getExecuteStatus() != null, EnteralNutrition::getExecuteStatus, bo.getExecuteStatus())
+                .eq(EnteralNutrition::getStatus, "0")
+                .eq(EnteralNutrition::getExecuteStatus, "0")
+        );
+
+        List<Long> settlementIds = new ArrayList<>();
+        page.getRecords().forEach(e -> settlementIds.add(e.getSettlementId()));
+
+        List<Settlement> settlementList = settlementMapper.selectList(
+            Wrappers.lambdaQuery(Settlement.class).in(!settlementIds.isEmpty(), Settlement::getId, settlementIds)
+        );
+
+        return TableDataInfo.build(page.convert(e -> {
+            LongTermManagementListPageVo vo = new LongTermManagementListPageVo();
+            vo.setId(e.getId());
+            vo.setExecuteTime(e.getExecuteTime());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setMealTime(e.getMealTime());
+            vo.setExecuteStatus(Objects.equals(e.getExecuteStatus(), "0") ? "未执行" : "已执行");
+            vo.setStopTime(e.getStopDate());
+            vo.setSettlementId(e.getSettlementId());
+            vo.setNutritionDetail(e.getNutritionProduct());
+            vo.setPatientDepartment(deptMap.get(e.getCreateDept()));
+
+            for (Settlement settlement : settlementList) {
+                if (Objects.equals(settlement.getId(), e.getSettlementId())) {
+                    vo.setPatientId(settlement.getPatientId());
+                    vo.setPatientName(patientNames.get(settlement.getPatientId()));
+                    vo.setConsultationType(Objects.equals(settlement.getVisitType(), "0") ? "门诊" : "住院");
+                    vo.setMedicalId(settlement.getPatientNo());
+                    vo.setWardName(settlement.getWardName());
+                    vo.setBedId(settlement.getBedNo());
+                }
+            }
+
+            vo.setDoctorName(doctorMap.get(e.getCreateBy()));
+            vo.setDoctorDepartment(deptMap.get(e.getCreateDept()));
+            vo.setNote(e.getPrescriptionRemark());
+            return vo;
+        }));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R execute(LongTermManagementExecuteBo bo) {
+
+        LoginUser loginUser = LoginHelper.getLoginUser();
+
+        int flag = enteralNutritionMapper.update(
+            Wrappers.lambdaUpdate(EnteralNutrition.class).eq(EnteralNutrition::getId, bo.getId())
+                .set(EnteralNutrition::getExecuteStatus, "1")
+                .set(EnteralNutrition::getExecuteBy, Objects.nonNull(loginUser) ? loginUser.getUserId() : null)
+                .set(EnteralNutrition::getExecuteTime, LocalTime.now())
+                .set(EnteralNutrition::getExecuteDate, LocalDate.now())
+        );
+        if (flag <= 0) throw new RuntimeException("执行失败");
+
+        return R.ok();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R stop(LongTermManagementStopBo bo) {
+
+        EnteralNutrition nutrition = enteralNutritionMapper.selectOne(
+            Wrappers.lambdaQuery(EnteralNutrition.class).eq(EnteralNutrition::getId, bo.getId())
+        );
+
+        if (Objects.isNull(nutrition)) throw new RuntimeException("找不到该处方");
+
+        int settlementFlag = settlementMapper.update(
+            Wrappers.lambdaUpdate(Settlement.class).eq(Settlement::getId, nutrition.getSettlementId())
+                .set(Settlement::getStatus, "1").set(Settlement::getStopDate, new Date())
+        );
+        if (settlementFlag <= 0) throw new RuntimeException("停嘱失败");
+
+        int enteralNutritionFlag = enteralNutritionMapper.update(
+            Wrappers.lambdaUpdate(EnteralNutrition.class).eq(EnteralNutrition::getSettlementId, nutrition.getSettlementId())
+                .set(EnteralNutrition::getStatus, "1").set(EnteralNutrition::getStopDate, new Date())
+        );
+        if (enteralNutritionFlag <= 0) throw new RuntimeException("批量停嘱失败");
+
+        return R.ok();
+    }
+}

+ 3 - 3
ruoyi-admin/src/main/resources/application-prod.yml

@@ -64,9 +64,9 @@ spring:
                     driverClassName: com.mysql.cj.jdbc.Driver
                     # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
                     # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-                    url: jdbc:mysql://localhost:3306/wkx_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+                    url: jdbc:mysql://192.168.1.146:3306/wkx_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
                     username: root
-                    password: 1234
+                    password: P@ssw0rd
             #        # 从库数据源
             #        slave:
             #          lazy: true
@@ -113,7 +113,7 @@ spring:
 spring.data:
     redis:
         # 地址
-        host: localhost
+        host: 192.168.1.146
         # 端口,默认为6379
         port: 6379
         # 数据库索引

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

@@ -236,7 +236,7 @@ management:
 
 --- # 默认/推荐使用sse推送
 sse:
-    enabled: false
+    enabled: true
     path: /resource/sse
 
 --- # websocket

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

@@ -53,5 +53,6 @@ public class SysDiseaseLabel extends TenantEntity {
     @TableLogic
     private String delFlag;
 
+    private String type;
 
 }

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

@@ -92,4 +92,6 @@ public class SysRecipeBo extends BaseEntity {
 
     @NotEmpty(message = "食材组成不能为空", groups = { AddGroup.class, EditGroup.class })
     private List<SysRecipeFoodIngredientBo> foodList;
+
+    private List<Long> categoryIds;
 }

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

@@ -1,6 +1,5 @@
 package org.dromara.system.domain.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import org.dromara.system.domain.SysFoodIngredient;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
@@ -12,7 +11,6 @@ import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.util.Date;
 
 
 /**
@@ -239,7 +237,6 @@ public class SysFoodIngredientVo implements Serializable {
     @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
     private String status;
 
-
     private BigDecimal quantity;
     /**
      * 备注
@@ -249,4 +246,5 @@ public class SysFoodIngredientVo implements Serializable {
     private BigDecimal caloriesForInput;
 
     private BigDecimal stockNum;
+
 }

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

@@ -116,5 +116,7 @@ public class SysRecipeVo implements Serializable {
 
     private List<SysFoodIngredientVo> foodList;
 
+    private String foodNames;
+
     private JSONObject nutrientAnalysis;
 }

+ 77 - 12
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRecipeServiceImpl.java

@@ -31,11 +31,7 @@ import org.dromara.system.domain.vo.SysDiseaseLabelVo;
 import org.dromara.system.domain.vo.SysFoodCategoryVo;
 import org.dromara.system.domain.vo.SysFoodIngredientVo;
 import org.dromara.system.domain.vo.SysRecipeFoodIngredientVo;
-import org.dromara.system.mapper.SysDiseaseLabelMapper;
-import org.dromara.system.mapper.SysFoodCategoryMapper;
-import org.dromara.system.mapper.SysFoodIngredientMapper;
-import org.dromara.system.mapper.SysRecipeCategoryMapper;
-import org.dromara.system.mapper.SysRecipeFoodIngredientMapper;
+import org.dromara.system.mapper.*;
 import org.dromara.system.service.ISysDictDataService;
 import org.dromara.system.service.ISysDiseaseLabelService;
 import org.dromara.system.service.ISysRecipeCategoryService;
@@ -43,18 +39,12 @@ import org.springframework.stereotype.Service;
 import org.dromara.system.domain.bo.SysRecipeBo;
 import org.dromara.system.domain.vo.SysRecipeVo;
 import org.dromara.system.domain.SysRecipe;
-import org.dromara.system.mapper.SysRecipeMapper;
 import org.dromara.system.service.ISysRecipeService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.ObjectInput;
 import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -75,6 +65,7 @@ public class SysRecipeServiceImpl implements ISysRecipeService {
     private final SysDiseaseLabelMapper diseaseLabelMapper;
     private final SysFoodCategoryMapper foodCategoryMapper;
     private final SysFoodIngredientMapper foodIngredientMapper;
+    private final SysDictDataMapper sysDictDataMapper;
 
     @Override
     public int updateRecipeStatus(List<Long> recipeIds, String status) {
@@ -196,6 +187,79 @@ public class SysRecipeServiceImpl implements ISysRecipeService {
                 v.setCategoryName(recipeCategoryMap.get(v.getCategoryId()));
             });
         }
+
+        Map<Long, List<Long>> foodToIngredientMap = new HashMap<>();
+        List<SysRecipeFoodIngredient> recipeFoodIngredientList = sysRecipeFoodIngredientMapper.selectList();
+        recipeFoodIngredientList.forEach(e -> {
+            foodToIngredientMap.computeIfAbsent(e.getRecipeId(), k -> new ArrayList<>())
+                .add(e.getFoodIngredientId());
+        });
+        List<SysFoodIngredient> foodIngredientList = foodIngredientMapper.selectList();
+        Map<String, String> unitMap = new HashMap<>();
+        sysDictDataMapper.selectDictDataByType("food_unit").forEach(e -> unitMap.put(e.getDictValue(), e.getDictLabel()));
+
+        result.getRecords().forEach(e -> {
+            List<SysFoodIngredientVo> foodList = new ArrayList<>();
+            StringBuilder foodNames = new StringBuilder();
+            List<Long> ids = foodToIngredientMap.get(e.getRecipeId());
+            for (Long id : ids) {
+                for (SysFoodIngredient sysFoodIngredient : foodIngredientList) {
+                    if (Objects.equals(id, sysFoodIngredient.getFoodIngredientId())) {
+                        SysFoodIngredientVo vo = new SysFoodIngredientVo();
+                        vo.setFoodIngredientId(sysFoodIngredient.getFoodIngredientId());
+                        vo.setFoodCategoryId(sysFoodIngredient.getFoodCategoryId());
+                        vo.setBigCategory(sysFoodIngredient.getBigCategory());
+                        vo.setSubCategory(sysFoodIngredient.getSubCategory());
+                        vo.setName(sysFoodIngredient.getName());
+                        vo.setCode(sysFoodIngredient.getCode());
+                        vo.setUnit(sysFoodIngredient.getUnit());
+                        vo.setUnitName(sysFoodIngredient.getUnitName());
+                        vo.setPurchasePrice(sysFoodIngredient.getPurchasePrice());
+                        vo.setEdibleRatio(sysFoodIngredient.getEdibleRatio());
+                        vo.setShelfLife(sysFoodIngredient.getShelfLife());
+                        vo.setStockWarning(sysFoodIngredient.getStockWarning());
+                        vo.setExpiryWarning(sysFoodIngredient.getExpiryWarning());
+                        vo.setDescription(sysFoodIngredient.getDescription());
+                        vo.setProtein(sysFoodIngredient.getProtein());
+                        vo.setFat(sysFoodIngredient.getFat());
+                        vo.setCarbohydrate(sysFoodIngredient.getCarbohydrate());
+                        vo.setWater(sysFoodIngredient.getWater());
+                        vo.setVitaminA(sysFoodIngredient.getVitaminA());
+                        vo.setVitaminB2(sysFoodIngredient.getVitaminB2());
+                        vo.setVitaminC(sysFoodIngredient.getVitaminC());
+                        vo.setSodium(sysFoodIngredient.getSodium());
+                        vo.setIron(sysFoodIngredient.getIron());
+                        vo.setPhosphorus(sysFoodIngredient.getPhosphorus());
+                        vo.setDietaryFiber(sysFoodIngredient.getDietaryFiber());
+                        vo.setVitaminB1(sysFoodIngredient.getVitaminB1());
+                        vo.setNiacin(sysFoodIngredient.getNiacin());
+                        vo.setVitaminE(sysFoodIngredient.getVitaminE());
+                        vo.setCalcium(sysFoodIngredient.getCalcium());
+                        vo.setPotassium(sysFoodIngredient.getPotassium());
+                        vo.setCholesterol(sysFoodIngredient.getCholesterol());
+                        vo.setStatus(sysFoodIngredient.getStatus());
+
+                        for (SysRecipeFoodIngredient sysRecipeFoodIngredient : recipeFoodIngredientList) {
+                            if (Objects.equals(sysRecipeFoodIngredient.getFoodIngredientId(), sysFoodIngredient.getFoodIngredientId())) {
+                                vo.setQuantity(sysRecipeFoodIngredient.getQuantity());
+                                vo.setCalories(sysRecipeFoodIngredient.getCalories());
+                                vo.setRemark(sysRecipeFoodIngredient.getRemark());
+                                foodNames
+                                    .append(sysFoodIngredient.getName())
+                                    .append(sysRecipeFoodIngredient.getQuantity())
+                                    .append(unitMap.get(sysFoodIngredient.getUnit()))
+                                    .append(";");
+                            }
+                        }
+                        vo.setCaloriesForInput(sysFoodIngredient.getCaloriesForInput());
+                        vo.setStockNum(sysFoodIngredient.getStockWarning());
+                        foodList.add(vo);
+                    }
+                }
+            }
+            e.setFoodNames(foodNames.toString());
+            e.setFoodList(foodList);
+        });
         return TableDataInfo.build(result);
     }
 
@@ -226,6 +290,7 @@ public class SysRecipeServiceImpl implements ISysRecipeService {
         lqw.eq(StringUtils.isNotBlank(bo.getSmartRecommend()), SysRecipe::getSmartRecommend, bo.getSmartRecommend());
         lqw.eq(StringUtils.isNotBlank(bo.getCookingMethod()), SysRecipe::getCookingMethod, bo.getCookingMethod());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysRecipe::getStatus, bo.getStatus());
+        lqw.in(bo.getCategoryIds() != null && !bo.getCategoryIds().isEmpty(), SysRecipe::getCategoryId, bo.getCategoryIds());
         return lqw;
     }
 

+ 0 - 0
script/sql/biz/dump_2025_08_14.sql → script/sql/biz/2025/08/dump_2025_08_14.sql


+ 0 - 0
script/sql/biz/dump_2025_08_20.sql → script/sql/biz/2025/08/dump_2025_08_20.sql


+ 0 - 0
script/sql/biz/dump_2025_08_21.sql → script/sql/biz/2025/08/dump_2025_08_21.sql