Browse Source

就诊记录相关

HuRongxin 2 months ago
parent
commit
ac800434d1
22 changed files with 862 additions and 32 deletions
  1. 33 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/HospitalRecordController.java
  2. 6 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/NutritionDiagnosis.java
  3. 44 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/HospitalRecordBo.java
  4. 10 4
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/NutritionDiagnosisBo.java
  5. 2 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionVo.java
  6. 45 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/HospitalRecordVo.java
  7. 6 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/NutritionDiagnosisVo.java
  8. 104 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/EntityFieldRegistry.java
  9. 46 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordDailyMealPlanVo.java
  10. 34 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordDiagnosisVo.java
  11. 31 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordEvaluationVo.java
  12. 45 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordHospitalMealPlanVo.java
  13. 42 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordScreeningVo.java
  14. 35 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordSettlementVo.java
  15. 8 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/HospitalRecordDiagnosisMapper.java
  16. 20 0
      ruoyi-admin/src/main/java/org/dromara/web/service/IHospitalRecordService.java
  17. 13 8
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/DailyMealPlanServiceImpl.java
  18. 14 10
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/HospitalMealPlanServiceImpl.java
  19. 303 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/HospitalRecordServiceImpl.java
  20. 16 9
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/NutritionEducationServiceImpl.java
  21. 3 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/NutritionEvaluationVo.java
  22. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/NutritionScreeningVo.java

+ 33 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/HospitalRecordController.java

@@ -0,0 +1,33 @@
+package org.dromara.web.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.web.domain.bo.HospitalRecordBo;
+import org.dromara.web.domain.bo.NutritionDiagnosisBo;
+import org.dromara.web.domain.vo.HospitalRecordVo;
+import org.dromara.web.domain.vo.NutritionDiagnosisVo;
+import org.dromara.web.service.IHospitalRecordService;
+import org.dromara.web.service.INutritionDiagnosisService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/patients/hospitalRecord")
+public class HospitalRecordController {
+    private final IHospitalRecordService hospitalRecordService;
+
+    /**
+     * 查询营养诊断列表
+     */
+    @SaCheckPermission("patients:hospitalRecord:list")
+    @GetMapping("/list")
+    public HospitalRecordVo list(HospitalRecordBo bo) {
+        return hospitalRecordService.queryHospitalRecordList(bo );
+    }
+}

+ 6 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/NutritionDiagnosis.java

@@ -1,5 +1,6 @@
 package org.dromara.web.domain;
 
+import cn.idev.excel.annotation.ExcelProperty;
 import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
@@ -38,6 +39,11 @@ public class NutritionDiagnosis extends TenantEntity {
      */
     private String type;
 
+    /**
+     * 科室ID
+     */
+    private Long deptId;
+
     /**
      * 门诊号
      */

+ 44 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/HospitalRecordBo.java

@@ -0,0 +1,44 @@
+package org.dromara.web.domain.bo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.util.Date;
+import java.util.List;
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class HospitalRecordBo extends BaseEntity {
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 患者id
+     */
+    @NotNull(message = "患者id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long patientId;
+
+    /**
+     * 看诊类型
+     */
+    private String type;
+
+    /**
+     * 门诊号
+     */
+    private String outpatientNo;
+
+    /**
+     * 科室
+     */
+    private Long deptId;
+
+    private List<Date> dateRange;
+
+}

+ 10 - 4
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/NutritionDiagnosisBo.java

@@ -1,5 +1,6 @@
 package org.dromara.web.domain.bo;
 
+import cn.idev.excel.annotation.ExcelProperty;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -26,13 +27,13 @@ public class NutritionDiagnosisBo extends BaseEntity {
     /**
      *
      */
-    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    @NotNull(message = "不能为空", groups = {EditGroup.class})
     private Long id;
 
     /**
      * 患者id
      */
-    @NotNull(message = "患者id不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "患者id不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long treatmentUserId;
 
     /**
@@ -40,6 +41,11 @@ public class NutritionDiagnosisBo extends BaseEntity {
      */
     private String type;
 
+    /**
+     * 科室ID
+     */
+    private Long deptId;
+
     /**
      * 门诊号
      */
@@ -69,9 +75,9 @@ public class NutritionDiagnosisBo extends BaseEntity {
      */
     private String medicalOrder;
 
-    private List<String>labelList;
+    private List<String> labelList;
 
-    private List<Date>dateRange;
+    private List<Date> dateRange;
 
 
 }

+ 2 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionVo.java

@@ -173,5 +173,7 @@ public class EnteralNutritionVo implements Serializable {
     @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
     private String status;
 
+    /*创建时间*/
+    private Date createTime;
 
 }

+ 45 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/HospitalRecordVo.java

@@ -0,0 +1,45 @@
+package org.dromara.web.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import lombok.Data;
+import org.dromara.web.domain.vo.hospitalRecord.*;
+import org.springframework.data.annotation.CreatedBy;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ExcelIgnoreUnannotated
+public class HospitalRecordVo implements Serializable {
+    /*创建时间*/
+    private Date createTime;
+
+    /*科室*/
+    private Long deptId;
+
+    private String deptName;
+
+    private Long createBy;
+
+    private String createByUser;
+
+    /*营养诊断*/
+    List<RecordDiagnosisVo> recordDiagnosisVoList;
+
+    /*院内膳食*/
+    List<RecordHospitalMealPlanVo> recordHospitalMealPlanVoList;
+
+    /*日常膳食*/
+    List<RecordDailyMealPlanVo> recordDailyMealPlanVoList;
+
+    /*营养筛查*/
+    List<RecordScreeningVo> recordScreeningVoList;
+
+    /*营养评估*/
+    List<RecordEvaluationVo> recordEvaluationVoList;
+
+    /*处方*/
+    List<RecordSettlementVo> recordSettlementVoList;
+
+}

+ 6 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/NutritionDiagnosisVo.java

@@ -40,6 +40,12 @@ public class NutritionDiagnosisVo implements Serializable {
     @ExcelProperty(value = "看诊类型")
     private String type;
 
+    /**
+     * 科室ID
+     */
+    @ExcelProperty(value = "科室ID")
+    private Long deptId;
+
     @ExcelProperty(value = "门诊号")
     private String outpatientNo;
 

+ 104 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/EntityFieldRegistry.java

@@ -0,0 +1,104 @@
+package org.dromara.web.domain.vo.hospitalRecord;
+
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import org.dromara.system.domain.NutritionEvaluation;
+import org.dromara.system.domain.NutritionScreening;
+import org.dromara.web.domain.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+
+public class EntityFieldRegistry {
+    private static final Map<Class<?>, Function<String, ? extends SFunction<?, ?>>> FIELD_MAPPINGS = new HashMap<>();
+
+    // 注册实体类的字段映射
+    public static <T> void register(Class<T> entityClass, Function<String, SFunction<T, ?>> fieldResolver) {
+        FIELD_MAPPINGS.put(entityClass, fieldResolver);
+    }
+
+    // 获取字段映射(类型安全)
+    @SuppressWarnings("unchecked")
+    public static <T> SFunction<T, ?> getField(Class<T> entityClass, String fieldName) {
+        Function<String, SFunction<T, ?>> resolver = (Function<String, SFunction<T, ?>>) FIELD_MAPPINGS.get(entityClass);
+        if (resolver == null) {
+            throw new IllegalArgumentException("Unsupported entity class: " + entityClass);
+        }
+        return resolver.apply(fieldName);
+    }
+
+    static {
+        register(NutritionDiagnosis.class, fieldName -> {
+            switch (fieldName) {
+                case "id": return NutritionDiagnosis::getId;
+                case "type": return NutritionDiagnosis::getType;
+                case "deptId": return NutritionDiagnosis::getDeptId;
+                case "patientId": return NutritionDiagnosis::getTreatmentUserId;
+                case "createBy": return NutritionDiagnosis::getCreateBy;
+                case "outpatientNo": return NutritionDiagnosis::getOutpatientNo;
+                case "createTime": return NutritionDiagnosis::getCreateTime;
+                default: throw new IllegalArgumentException("Unsupported field: " + fieldName);
+            }
+        });
+        register(HospitalMealPlan.class, fieldName -> {
+            switch (fieldName) {
+                case "id": return HospitalMealPlan::getId;
+                case "type": return HospitalMealPlan::getType;
+                case "deptId": return HospitalMealPlan::getDeptId;
+                case "patientId": return HospitalMealPlan::getPatientId;
+                case "createBy": return HospitalMealPlan::getCreateBy;
+                case "outpatientNo": return HospitalMealPlan::getOutpatientNo;
+                case "createTime": return HospitalMealPlan::getCreateTime;
+                default: throw new IllegalArgumentException("Unsupported field: " + fieldName);
+            }
+        });
+        register(DailyMealPlan.class, fieldName -> {
+            switch (fieldName) {
+                case "id": return DailyMealPlan::getId;
+                case "type": return DailyMealPlan::getType;
+                case "deptId": return DailyMealPlan::getDeptId;
+                case "patientId": return DailyMealPlan::getPatientId;
+                case "createBy": return DailyMealPlan::getCreateBy;
+                case "outpatientNo": return DailyMealPlan::getOutpatientNo;
+                case "createTime": return DailyMealPlan::getCreateTime;
+                default: throw new IllegalArgumentException("Unsupported field: " + fieldName);
+            }
+        });
+        register(NutritionScreening.class, fieldName -> {
+            switch (fieldName) {
+                case "id": return NutritionScreening::getId;
+                case "type": return NutritionScreening::getVisitType;
+//                case "deptId": return NutritionScreening::getDetpId;
+                case "patientId": return NutritionScreening::getPatientId;
+                case "createBy": return NutritionScreening::getCreateBy;
+                case "outpatientNo": return NutritionScreening::getPatientNo;
+                case "createTime": return NutritionScreening::getCreateTime;
+                default: throw new IllegalArgumentException("Unsupported field: " + fieldName);
+            }
+        });
+        register(NutritionEvaluation.class, fieldName -> {
+            switch (fieldName) {
+                case "id": return NutritionEvaluation::getId;
+                case "type": return NutritionEvaluation::getVisitType;
+//                case "deptId": return NutritionScreening::getDetpId;
+                case "patientId": return NutritionEvaluation::getPatientId;
+                case "createBy": return NutritionEvaluation::getCreateBy;
+                case "outpatientNo": return NutritionEvaluation::getPatientNo;
+                case "createTime": return NutritionEvaluation::getCreateTime;
+                default: throw new IllegalArgumentException("Unsupported field: " + fieldName);
+            }
+        });
+        register(Settlement.class, fieldName -> {
+            switch (fieldName) {
+                case "id": return Settlement::getId;
+                case "type": return Settlement::getVisitType;
+                case "deptId": return Settlement::getDoorId;
+                case "patientId": return Settlement::getPatientId;
+                case "createBy": return Settlement::getCreateBy;
+                case "outpatientNo": return Settlement::getPatientNo;
+                case "createTime": return Settlement::getCreateTime;
+                default: throw new IllegalArgumentException("Unsupported field: " + fieldName);
+            }
+        });
+    }
+}

+ 46 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordDailyMealPlanVo.java

@@ -0,0 +1,46 @@
+package org.dromara.web.domain.vo.hospitalRecord;
+
+import lombok.Data;
+import org.dromara.web.domain.vo.DailyMealRecipeVo;
+import org.dromara.web.domain.vo.HospitalMealRecipeVo;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class RecordDailyMealPlanVo implements Serializable {
+
+    private Long id;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 诊断医生
+     */
+    private Long createBy;
+
+    private String createByUser;
+
+    /**
+     * 推荐/配餐开始日期
+     */
+    private Date recommendStartDate;
+
+    /**
+     * 推荐/配餐结束日期
+     */
+    private Date recommendEndDate;
+
+
+    private BigDecimal totalCalorie;
+
+
+    Map<String, List<DailyMealRecipeVo>> recipeMap;
+
+}

+ 34 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordDiagnosisVo.java

@@ -0,0 +1,34 @@
+package org.dromara.web.domain.vo.hospitalRecord;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class RecordDiagnosisVo implements Serializable {
+
+    private Long id;
+
+    /**
+     * 营养诊断标签id
+     */
+    private String diagnosisLableId;
+
+    private String diagnosisLabelStr;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 诊断医生
+     */
+    @ExcelProperty(value = "诊断医生")
+    private Long createBy;
+
+    private String createByUser;
+
+}

+ 31 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordEvaluationVo.java

@@ -0,0 +1,31 @@
+package org.dromara.web.domain.vo.hospitalRecord;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class RecordEvaluationVo implements Serializable {
+    private Long id;
+
+    private Long configId;
+
+    private String configName;
+
+    private String content;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 诊断医生
+     */
+    @ExcelProperty(value = "诊断医生")
+    private Long createBy;
+
+    private String createByUser;
+}

+ 45 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordHospitalMealPlanVo.java

@@ -0,0 +1,45 @@
+package org.dromara.web.domain.vo.hospitalRecord;
+
+import lombok.Data;
+import org.dromara.web.domain.vo.HospitalMealRecipeVo;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class RecordHospitalMealPlanVo implements Serializable {
+
+    private Long id;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 诊断医生
+     */
+    private Long createBy;
+
+    private String createByUser;
+
+    /**
+     * 推荐/配餐开始日期
+     */
+    private Date recommendStartDate;
+
+    /**
+     * 推荐/配餐结束日期
+     */
+    private Date recommendEndDate;
+
+
+    private BigDecimal totalCalorie;
+
+
+    Map<String, List<HospitalMealRecipeVo>> recipeMap;
+
+}

+ 42 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordScreeningVo.java

@@ -0,0 +1,42 @@
+package org.dromara.web.domain.vo.hospitalRecord;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class RecordScreeningVo implements Serializable {
+
+    private Long id;
+
+    private Long configId;
+
+    private String configName;
+
+    /**
+     * 营养筛查分数
+     */
+    private BigDecimal screeningScore;
+
+    /**
+     * 营养筛查结论
+     */
+    private String screeningConclusion;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 诊断医生
+     */
+    @ExcelProperty(value = "诊断医生")
+    private Long createBy;
+
+    private String createByUser;
+
+}

+ 35 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/hospitalRecord/RecordSettlementVo.java

@@ -0,0 +1,35 @@
+package org.dromara.web.domain.vo.hospitalRecord;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.web.domain.vo.EnteralNutritionVo;
+import org.dromara.web.domain.vo.HospitalMealRecipeVo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class RecordSettlementVo implements Serializable {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 开单时间
+     */
+    private Date orderTime;
+
+
+    private Long createBy;
+
+    private String createByUser;
+
+    private Date createTime;
+
+    Map<String, List<EnteralNutritionVo>> enteralMap;
+}

+ 8 - 0
ruoyi-admin/src/main/java/org/dromara/web/mapper/HospitalRecordDiagnosisMapper.java

@@ -0,0 +1,8 @@
+package org.dromara.web.mapper;
+
+
+
+public interface HospitalRecordDiagnosisMapper {
+
+
+}

+ 20 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/IHospitalRecordService.java

@@ -0,0 +1,20 @@
+package org.dromara.web.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.web.domain.bo.HospitalRecordBo;
+import org.dromara.web.domain.bo.NutritionDiagnosisBo;
+import org.dromara.web.domain.vo.HospitalRecordVo;
+import org.dromara.web.domain.vo.NutritionDiagnosisVo;
+
+import java.util.List;
+
+public interface IHospitalRecordService {
+    /**
+     * @param bo        查询条件
+     * @return
+     */
+    HospitalRecordVo queryHospitalRecordList(HospitalRecordBo bo);
+
+
+}

+ 13 - 8
ruoyi-admin/src/main/java/org/dromara/web/service/impl/DailyMealPlanServiceImpl.java

@@ -27,10 +27,7 @@ import org.dromara.web.service.IDailyMealPlanService;
 import org.springframework.stereotype.Service;
 
 import java.text.SimpleDateFormat;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -75,13 +72,21 @@ public class DailyMealPlanServiceImpl implements IDailyMealPlanService {
      */
     @Override
     public TableDataInfo<DailyMealPlanVo> queryPageList(DailyMealPlanBo bo, PageQuery pageQuery) {
-        List<SysUser> userList = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId, SysUser::getUserName));
-        Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> String.valueOf(k2.getUserName()), (k1, k2) -> k1));
+
         LambdaQueryWrapper<DailyMealPlan> lqw = buildQueryWrapper(bo);
         Page<DailyMealPlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         List<DailyMealPlanVo> records = result.getRecords();
-        if (CollUtil.isNotEmpty(records)) for (DailyMealPlanVo record : records) {
-            record.setCreateByUser(userMap.get(record.getCreateBy()));
+        if (CollUtil.isNotEmpty(records)) {
+            Set<Long> userList = CollUtil.newHashSet();
+            records.forEach(v -> {
+                userList.add(v.getCreateBy());
+            });
+            Map<Long, String> userMap = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class)
+                .select(SysUser::getUserId, SysUser::getUserName)
+                .in(SysUser::getUserId, userList)).stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> k2.getUserName(), (k1, k2) -> k1));
+            records.forEach(v -> {
+                v.setCreateByUser(userMap.get(v.getCreateBy()));
+            });
         }
         return TableDataInfo.build(result);
     }

+ 14 - 10
ruoyi-admin/src/main/java/org/dromara/web/service/impl/HospitalMealPlanServiceImpl.java

@@ -32,10 +32,7 @@ import org.springframework.stereotype.Service;
 
 
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -81,15 +78,22 @@ public class HospitalMealPlanServiceImpl implements IHospitalMealPlanService {
      */
     @Override
     public TableDataInfo<HospitalMealPlanVo> queryPageList(HospitalMealPlanBo bo, PageQuery pageQuery) {
-        List<SysUser> userList = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId, SysUser::getUserName));
-        Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> String.valueOf(k2.getUserName()), (k1, k2) -> k1));
+
         LambdaQueryWrapper<HospitalMealPlan> lqw = buildQueryWrapper(bo);
         Page<HospitalMealPlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         List<HospitalMealPlanVo> records = result.getRecords();
-        if (CollUtil.isNotEmpty(records))
-            for (HospitalMealPlanVo record : records) {
-                record.setCreateByUser(userMap.get(record.getCreateBy()));
-            }
+        if (CollUtil.isNotEmpty(records)) {
+            Set<Long> userList = CollUtil.newHashSet();
+            records.forEach(v -> {
+                userList.add(v.getCreateBy());
+            });
+            Map<Long, String> userMap = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class)
+                .select(SysUser::getUserId, SysUser::getUserName)
+                .in(SysUser::getUserId, userList)).stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> k2.getUserName(), (k1, k2) -> k1));
+            records.forEach(v -> {
+                v.setCreateByUser(userMap.get(v.getCreateBy()));
+            });
+        }
         return TableDataInfo.build(result);
     }
 

+ 303 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/HospitalRecordServiceImpl.java

@@ -0,0 +1,303 @@
+package org.dromara.web.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.util.StringUtil;
+import org.dromara.common.core.constant.BizConst;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.system.domain.*;
+import org.dromara.system.domain.vo.NutritionEvaluationVo;
+import org.dromara.system.domain.vo.NutritionScreeningVo;
+import org.dromara.system.domain.vo.SysDictDataVo;
+import org.dromara.system.domain.vo.SysDiseaseLabelVo;
+import org.dromara.system.mapper.*;
+import org.dromara.system.service.ISysDictDataService;
+import org.dromara.system.service.ISysDiseaseLabelService;
+import org.dromara.web.domain.*;
+import org.dromara.web.domain.bo.HospitalRecordBo;
+import org.dromara.web.domain.vo.*;
+import org.dromara.web.domain.vo.hospitalRecord.*;
+import org.dromara.web.mapper.*;
+import org.dromara.web.service.IHospitalRecordService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class HospitalRecordServiceImpl implements IHospitalRecordService {
+
+    private final SysUserMapper userMapper;
+
+    private final SysDeptMapper sysDeptMapper;
+
+    private final TreatmentUserMapper treatmentUserMapper;
+
+    private final ISysDictDataService dictDataService;
+
+    private final NutritionDiagnosisMapper diagnosisMapper;
+
+    private final HospitalMealPlanMapper hospitalMealPlanMapper;
+
+    private final HospitalMealRecipeMapper hospitalMealRecipeMapper;
+
+    private final DailyMealPlanMapper dailyMealPlanMapper;
+
+    private final DailyMealRecipeMapper dailyMealRecipeMapper;
+
+    private final NutritionScreeningMapper nutritionScreeningMapper;
+
+    private final NutritionEvaluationMapper nutritionEvaluationMapper;
+
+    private final SettlementMapper settlementMapper;
+
+    private final EnteralNutritionMapper enteralNutritionMapper;
+
+    private final SysScreeningAssessmentConfigMapper sysScreeningAssessmentConfigMapper;
+
+    private final ISysDiseaseLabelService diseaseLabelService;
+
+    @Override
+    public HospitalRecordVo queryHospitalRecordList(HospitalRecordBo bo) {
+        HospitalRecordVo recordVo = new HospitalRecordVo();
+        /*获取所有用户信息*/
+        List<SysUser> userList = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId, SysUser::getUserName));
+        Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> String.valueOf(k2.getUserName()), (k1, k2) -> k1));
+
+        /*获取所有用户信息*/
+        List<SysDept> deptList = sysDeptMapper.selectList(Wrappers.lambdaQuery(SysDept.class).select(SysDept::getDeptId, SysDept::getDeptName));
+        Map<Long, String> deptMap = deptList.stream().collect(Collectors.toMap(k1 -> k1.getDeptId(), k2 -> String.valueOf(k2.getDeptName()), (k1, k2) -> k1));
+
+        /*获取支付类型字典*/
+        Map<String, List<SysDictDataVo>> dictMap = dictDataService.selectGroupByType(List.of(BizConst.PAYMENT_STATUS, BizConst.FEE_TYPE)).getData();
+        Map<String, String> feeTypeMap = dictMap.get(BizConst.FEE_TYPE).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+        if (null != bo.getPatientId()) {
+            TreatmentUser treatmentUser = treatmentUserMapper.selectById(bo.getPatientId());
+            if (null != treatmentUser) {
+                recordVo.setDeptId(treatmentUser.getDoorId());
+                recordVo.setDeptName(deptMap.get(treatmentUser.getDoorId()));
+                recordVo.setCreateTime(treatmentUser.getCreateTime());
+                recordVo.setCreateBy(treatmentUser.getCreateBy());
+                recordVo.setCreateByUser(userMap.get(treatmentUser.getCreateBy()));
+            }
+        }
+
+        /*获取就诊记录中 营养诊断明细*/
+        LambdaQueryWrapper<NutritionDiagnosis> nutritionDiagnosisLambdaQueryWrapper = buildQueryWrapper(bo, NutritionDiagnosis.class);
+        List<NutritionDiagnosisVo> diagnosisVoList = diagnosisMapper.selectVoList(nutritionDiagnosisLambdaQueryWrapper);
+
+        List<RecordDiagnosisVo> recordDiagnosisVoList = null;
+        RecordDiagnosisVo recordDiagnosisVo = null;
+        if (CollUtil.isNotEmpty(diagnosisVoList)) {
+            recordDiagnosisVoList = new ArrayList<>();
+            String labelIdsStr = null;
+            List<String> labelNames = null;
+            for (NutritionDiagnosisVo diagnosisVo : diagnosisVoList) {
+                recordDiagnosisVo = new RecordDiagnosisVo();
+                BeanUtils.copyProperties(diagnosisVo, recordDiagnosisVo);
+                recordDiagnosisVo.setCreateByUser(userMap.get(diagnosisVo.getCreateBy()));
+                labelIdsStr = diagnosisVo.getDiagnosisLableId();
+                // 处理产品标签
+                if (StringUtils.isNotBlank(labelIdsStr)) {
+                    labelNames = Arrays.stream(labelIdsStr.split(",")).map(String::trim).filter(StringUtils::isNotBlank).map(labelid -> {
+                        try {
+                            return diseaseLabelService.queryById(Long.parseLong(labelid));
+                        } catch (NumberFormatException e) {
+                            return null;
+                        }
+                    }).filter(Objects::nonNull).map(SysDiseaseLabelVo::getLabelName).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+
+                    if (!labelNames.isEmpty()) {
+                        recordDiagnosisVo.setDiagnosisLabelStr(String.join(",", labelNames));
+                    }
+                }
+                recordDiagnosisVoList.add(recordDiagnosisVo);
+            }
+        }
+        recordVo.setRecordDiagnosisVoList(recordDiagnosisVoList);
+
+        /*获取就诊记录中 院内膳食*/
+        LambdaQueryWrapper<HospitalMealPlan> hospitalMealPlanLambdaQueryWrapper = buildQueryWrapper(bo, HospitalMealPlan.class);
+        List<HospitalMealPlanVo> hospitalMealPlanVos = hospitalMealPlanMapper.selectVoList(hospitalMealPlanLambdaQueryWrapper);
+        List<RecordHospitalMealPlanVo> recordHospitalMealPlanVoList = null;
+        RecordHospitalMealPlanVo recordHospitalMealPlanVo = null;
+        List<HospitalMealRecipeVo> voList = null;
+        if (CollUtil.isNotEmpty(hospitalMealPlanVos)) {
+            recordHospitalMealPlanVoList = new ArrayList<>();
+            Map<String, List<HospitalMealRecipeVo>> recipeMap = null;
+            for (HospitalMealPlanVo planVo : hospitalMealPlanVos) {
+                recordHospitalMealPlanVo = new RecordHospitalMealPlanVo();
+                BeanUtils.copyProperties(planVo, recordHospitalMealPlanVo);
+                recordHospitalMealPlanVo.setCreateByUser(userMap.get(planVo.getCreateBy()));
+                voList = hospitalMealRecipeMapper.selectVoList(Wrappers.lambdaQuery(HospitalMealRecipe.class)
+                    .eq(HospitalMealRecipe::getPlanId, planVo.getId()));
+                if (CollUtil.isNotEmpty(voList)) {
+                    recipeMap = voList.stream()
+                        .collect(Collectors.groupingBy(
+                            recipe -> "recipeNo" + recipe.getRecipeNo(),
+                            Collectors.toList()
+                        ));
+                    recordHospitalMealPlanVo.setRecipeMap(recipeMap);
+                }
+                recordHospitalMealPlanVoList.add(recordHospitalMealPlanVo);
+            }
+        }
+        recordVo.setRecordHospitalMealPlanVoList(recordHospitalMealPlanVoList);
+
+        /*获取就诊记录中 日常膳食*/
+        LambdaQueryWrapper<DailyMealPlan> dailyMealPlanLambdaQueryWrapper = buildQueryWrapper(bo, DailyMealPlan.class);
+        List<DailyMealPlanVo> dailyMealPlanVos = dailyMealPlanMapper.selectVoList(dailyMealPlanLambdaQueryWrapper);
+        List<RecordDailyMealPlanVo> recordDailyMealPlanVoList = null;
+        RecordDailyMealPlanVo recordDailyMealPlanVo = null;
+        List<DailyMealRecipeVo> dailyMealRecipeVos = null;
+        if (CollUtil.isNotEmpty(dailyMealPlanVos)) {
+            recordDailyMealPlanVoList = new ArrayList<>();
+            Map<String, List<DailyMealRecipeVo>> recipeMap = null;
+            for (DailyMealPlanVo planVo : dailyMealPlanVos) {
+                recordDailyMealPlanVo = new RecordDailyMealPlanVo();
+                BeanUtils.copyProperties(planVo, recordDailyMealPlanVo);
+                recordDailyMealPlanVo.setCreateByUser(userMap.get(planVo.getCreateBy()));
+                dailyMealRecipeVos = dailyMealRecipeMapper.selectVoList(Wrappers.lambdaQuery(DailyMealRecipe.class)
+                    .eq(DailyMealRecipe::getPlanId, planVo.getId()));
+                if (CollUtil.isNotEmpty(voList)) {
+                    recipeMap = dailyMealRecipeVos.stream()
+                        .collect(Collectors.groupingBy(
+                            recipe -> "recipeNo" + recipe.getRecipeNo(),
+                            Collectors.toList()
+                        ));
+                    recordDailyMealPlanVo.setRecipeMap(recipeMap);
+                }
+                recordDailyMealPlanVoList.add(recordDailyMealPlanVo);
+            }
+        }
+        recordVo.setRecordDailyMealPlanVoList(recordDailyMealPlanVoList);
+
+        /*获取就诊记录中营养筛查*/
+        LambdaQueryWrapper<NutritionScreening> nutritionScreeningLambdaQueryWrapper = buildQueryWrapper(bo, NutritionScreening.class);
+        List<NutritionScreeningVo> nutritionScreeningVos = nutritionScreeningMapper.selectVoList(nutritionScreeningLambdaQueryWrapper);
+        List<RecordScreeningVo> recordScreeningVoList = null;
+        RecordScreeningVo recordScreeningVo = null;
+        if (CollUtil.isNotEmpty(nutritionScreeningVos)) {
+            recordScreeningVoList = new ArrayList<>();
+            Set<Long> configIdList = CollUtil.newHashSet();
+            nutritionScreeningVos.forEach(v -> {
+                configIdList.add(v.getConfigId());
+            });
+            Map<Long, String> configMap = sysScreeningAssessmentConfigMapper.selectList(Wrappers.lambdaQuery(SysScreeningAssessmentConfig.class)
+                .select(SysScreeningAssessmentConfig::getConfigId, SysScreeningAssessmentConfig::getName)
+                .in(SysScreeningAssessmentConfig::getConfigId, configIdList)).stream().collect(Collectors.toMap(k1 -> k1.getConfigId(), k2 -> k2.getName(), (k1, k2) -> k1));
+            for (NutritionScreeningVo screeningVo : nutritionScreeningVos) {
+                recordScreeningVo = new RecordScreeningVo();
+                BeanUtils.copyProperties(screeningVo, recordScreeningVo);
+                recordScreeningVo.setCreateByUser(userMap.get(recordScreeningVo.getCreateBy()));
+                recordScreeningVo.setConfigName(configMap.get(recordScreeningVo.getConfigId()));
+                recordScreeningVoList.add(recordScreeningVo);
+            }
+        }
+        recordVo.setRecordScreeningVoList(recordScreeningVoList);
+
+        /*获取就诊记录中营养评估*/
+        LambdaQueryWrapper<NutritionEvaluation> nutritionEvaluationLambdaQueryWrapper = buildQueryWrapper(bo, NutritionEvaluation.class);
+        List<NutritionEvaluationVo> nutritionEvaluationVos = nutritionEvaluationMapper.selectVoList(nutritionEvaluationLambdaQueryWrapper);
+        List<RecordEvaluationVo> recordEvaluationVoList = null;
+        RecordEvaluationVo recordEvaluationVo = null;
+        if (CollUtil.isNotEmpty(nutritionEvaluationVos)) {
+            recordEvaluationVoList = new ArrayList<>();
+            Set<Long> configIdList = CollUtil.newHashSet();
+            nutritionEvaluationVos.forEach(v -> {
+                configIdList.add(v.getConfigId());
+            });
+            Map<Long, String> configMap = sysScreeningAssessmentConfigMapper.selectList(Wrappers.lambdaQuery(SysScreeningAssessmentConfig.class)
+                .select(SysScreeningAssessmentConfig::getConfigId, SysScreeningAssessmentConfig::getName)
+                .in(SysScreeningAssessmentConfig::getConfigId, configIdList)).stream().collect(Collectors.toMap(k1 -> k1.getConfigId(), k2 -> k2.getName(), (k1, k2) -> k1));
+            for (NutritionEvaluationVo evaluationVo : nutritionEvaluationVos) {
+                recordEvaluationVo = new RecordEvaluationVo();
+                BeanUtils.copyProperties(evaluationVo, recordEvaluationVo);
+                recordEvaluationVo.setCreateByUser(userMap.get(recordEvaluationVo.getCreateBy()));
+                recordEvaluationVo.setConfigName(configMap.get(recordEvaluationVo.getConfigId()));
+                recordEvaluationVoList.add(recordEvaluationVo);
+            }
+        }
+        recordVo.setRecordEvaluationVoList(recordEvaluationVoList);
+
+
+        /*获取就诊记录中的处方信息*/
+        LambdaQueryWrapper<Settlement> settlementLambdaQueryWrapper = buildQueryWrapper(bo, Settlement.class);
+        List<SettlementVo> settlementVos = settlementMapper.selectVoList(settlementLambdaQueryWrapper);
+        List<RecordSettlementVo> recordSettlementVoList = null;
+        RecordSettlementVo recordSettlementVo = null;
+        List<EnteralNutritionVo> enteralNutritionVoList = null;
+        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
+        if (CollUtil.isNotEmpty(settlementVos)) {
+            recordSettlementVoList = new ArrayList<>();
+            Map<String, List<EnteralNutritionVo>> enteralMap = null;
+            for (SettlementVo settlementVo : settlementVos) {
+                recordSettlementVo = new RecordSettlementVo();
+                BeanUtils.copyProperties(settlementVo, recordSettlementVo);
+                recordSettlementVo.setCreateByUser(userMap.get(recordSettlementVo.getCreateBy()));
+                enteralNutritionVoList = enteralNutritionMapper.selectVoList(Wrappers.lambdaQuery(EnteralNutrition.class)
+                    .eq(EnteralNutrition::getSettlementId, settlementVo.getId()));
+                if (CollUtil.isNotEmpty(voList)) {
+                    enteralMap = enteralNutritionVoList.stream()
+                        .collect(Collectors.groupingBy(
+                            enteral -> sdf.format(enteral.getCreateTime()) + " " + feeTypeMap.get(enteral.getPrescriptionType()),
+                            Collectors.toList()
+                        ));
+                    recordSettlementVo.setEnteralMap(enteralMap);
+                }
+                recordSettlementVoList.add(recordSettlementVo);
+            }
+
+        }
+        recordVo.setRecordSettlementVoList(recordSettlementVoList);
+
+
+        return recordVo;
+    }
+
+    // 泛型方法,T 代表任意实体类
+    private <T> LambdaQueryWrapper<T> buildQueryWrapper(HospitalRecordBo bo, Class<T> entityClass) {
+        LambdaQueryWrapper<T> lqw = Wrappers.lambdaQuery(entityClass);
+
+        List<SysUser> userList = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId, SysUser::getUserName));
+        Map<String, Long> userMap = userList.stream().collect(Collectors.toMap(k1 -> String.valueOf(k1.getUserName()), k2 -> k2.getUserId(), (k1, k2) -> k1));
+        List<Date> dateRange = bo.getDateRange();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        // 公共查询条件(所有实体类通用的字段)
+        lqw.orderByAsc(getField(entityClass, "id")); // 动态获取主键字段
+        lqw.eq(StringUtils.isNotBlank(bo.getType()), getField(entityClass, "type"), bo.getType());
+        lqw.eq(bo.getPatientId() != null, getField(entityClass, "patientId"), bo.getPatientId());
+//        lqw.eq(bo.getDeptId() != null, getField(entityClass, "deptId"), bo.getDeptId());
+        if (StringUtil.isNotBlank(bo.getSearchValue())) {
+            lqw.and(wrapper -> wrapper
+                .like(getField(entityClass, "createBy"), userMap.get(bo.getSearchValue()))
+                .or()
+                .like(getField(entityClass, "outpatientNo"), bo.getSearchValue()));
+
+        }
+
+        // 日期范围查询(
+        if (null != dateRange && dateRange.size() == 2) {
+            String startTime = sdf.format(dateRange.get(0)) + " 00:00:00";  // 开始时间
+            String endTime = sdf.format(dateRange.get(1)) + " 23:59:59";    // 结束时间
+            if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) {
+                lqw.between(getField(entityClass, "createTime"), startTime, endTime);
+            }
+        }
+        return lqw;
+    }
+
+    // 统一获取字段的方法
+    private <T> SFunction<T, ?> getField(Class<T> entityClass, String fieldName) {
+        return EntityFieldRegistry.getField(entityClass, fieldName);
+    }
+
+}

+ 16 - 9
ruoyi-admin/src/main/java/org/dromara/web/service/impl/NutritionEducationServiceImpl.java

@@ -70,20 +70,27 @@ public class NutritionEducationServiceImpl implements INutritionEducationService
      */
     @Override
     public TableDataInfo<NutritionEducationVo> queryPageList(NutritionEducationBo bo, PageQuery pageQuery) {
-        List<SysDept> deptList = deptMapper.selectList(Wrappers.lambdaQuery(SysDept.class).select(SysDept::getDeptId, SysDept::getDeptName));
-        Map<Long, String> deptMap = deptList.stream().collect(Collectors.toMap(k1 -> k1.getDeptId(), k2 -> String.valueOf(k2.getDeptName()), (k1, k2) -> k1));
-
-        List<SysUser> userList = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId, SysUser::getUserName));
-        Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> String.valueOf(k2.getUserName()), (k1, k2) -> k1));
 
         LambdaQueryWrapper<NutritionEducation> lqw = buildQueryWrapper(bo);
         Page<NutritionEducationVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         List<NutritionEducationVo> records = result.getRecords();
         if (CollUtil.isNotEmpty(records)) {
-            for (NutritionEducationVo record : records) {
-                record.setDeptName(deptMap.get(record.getDeptId()));
-                record.setCreateByUser(userMap.get(record.getCreateBy()));
-            }
+            Set<Long> deptList = CollUtil.newHashSet();
+            Set<Long> userList = CollUtil.newHashSet();
+            records.forEach(v -> {
+                deptList.add(v.getDeptId());
+                userList.add(v.getCreateBy());
+            });
+            Map<Long, String> deptMap = deptMapper.selectList(Wrappers.lambdaQuery(SysDept.class)
+                .select(SysDept::getDeptId, SysDept::getDeptName)
+                .in(SysDept::getDeptId, deptList)).stream().collect(Collectors.toMap(k1 -> k1.getDeptId(), k2 -> k2.getDeptName(), (k1, k2) -> k1));
+            Map<Long, String> userMap = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class)
+                .select(SysUser::getUserId, SysUser::getUserName)
+                .in(SysUser::getUserId, userList)).stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> k2.getUserName(), (k1, k2) -> k1));
+            records.forEach(v -> {
+                v.setDeptName(deptMap.get(v.getDeptId()));
+                v.setCreateByUser(userMap.get(v.getCreateBy()));
+            });
         }
         return TableDataInfo.build(result);
     }

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

@@ -1,6 +1,7 @@
 package org.dromara.system.domain.vo;
 
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.system.domain.NutritionEvaluation;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
@@ -15,7 +16,6 @@ import java.io.Serializable;
 import java.util.Date;
 
 
-
 /**
  * 营养评估视图对象 nutrition_evaluation
  *
@@ -90,5 +90,7 @@ public class NutritionEvaluationVo implements Serializable {
 
     private Long createBy;
 
+    private Date createTime;
+
     private String createByName;
 }

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

@@ -99,5 +99,7 @@ public class NutritionScreeningVo implements Serializable {
 
     private Long createBy;
 
+    private Date createTime;
+
     private String createByName;
 }