Kaynağa Gözat

Merge branch 'dev-cy/begin250711'

chenying2100 2 ay önce
ebeveyn
işleme
de7c1b5824
46 değiştirilmiş dosya ile 2999 ekleme ve 45 silme
  1. 105 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/EnteralNutritionConsumableController.java
  2. 134 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/EnteralNutritionController.java
  3. 6 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/ProductNutritionController.java
  4. 113 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/SettlementController.java
  5. 6 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/SuppliesManageController.java
  6. 153 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/EnteralNutrition.java
  7. 100 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/EnteralNutritionConsumable.java
  8. 106 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/Settlement.java
  9. 146 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EnteralNutritionBo.java
  10. 97 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EnteralNutritionConsumableBo.java
  11. 55 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EnteralNutritionSaveBo.java
  12. 96 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/SettlementBo.java
  13. 115 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionConsumableVo.java
  14. 61 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionQueryVo.java
  15. 177 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionVo.java
  16. 117 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/SettlementVo.java
  17. 15 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/EnteralNutritionConsumableMapper.java
  18. 16 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/EnteralNutritionMapper.java
  19. 15 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/SettlementMapper.java
  20. 68 0
      ruoyi-admin/src/main/java/org/dromara/web/service/IEnteralNutritionConsumableService.java
  21. 78 0
      ruoyi-admin/src/main/java/org/dromara/web/service/IEnteralNutritionService.java
  22. 2 0
      ruoyi-admin/src/main/java/org/dromara/web/service/IProductNutritionService.java
  23. 68 0
      ruoyi-admin/src/main/java/org/dromara/web/service/ISettlementService.java
  24. 2 0
      ruoyi-admin/src/main/java/org/dromara/web/service/ISuppliesManageService.java
  25. 145 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/EnteralNutritionConsumableServiceImpl.java
  26. 482 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/EnteralNutritionServiceImpl.java
  27. 31 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/ProductNutritionServiceImpl.java
  28. 143 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/SettlementServiceImpl.java
  29. 31 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/SuppliesManageServiceImpl.java
  30. 1 1
      ruoyi-admin/src/main/resources/application.yml
  31. 7 0
      ruoyi-admin/src/main/resources/mapper/EnteralNutritionConsumableMapper.xml
  32. 7 0
      ruoyi-admin/src/main/resources/mapper/EnteralNutritionMapper.xml
  33. 7 0
      ruoyi-admin/src/main/resources/mapper/SettlementMapper.xml
  34. 11 3
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/BizConst.java
  35. 21 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/DelFlag.java
  36. 25 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/FeeType.java
  37. 1 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/PaymentStatus.java
  38. 21 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/PutFlag.java
  39. 38 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/QuestionsList.java
  40. 0 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/RedisUtil.java
  41. 32 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/SnowflakeConfig.java
  42. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysScreeningAssessmentQuestionBo.java
  43. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysScreeningAssessmentQuestionVo.java
  44. 6 5
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/NutritionEvaluationServiceImpl.java
  45. 27 18
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/NutritionScreeningServiceImpl.java
  46. 110 16
      script/sql/biz/create.sql

+ 105 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/EnteralNutritionConsumableController.java

@@ -0,0 +1,105 @@
+package org.dromara.web.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.web.domain.bo.EnteralNutritionConsumableBo;
+import org.dromara.web.domain.vo.EnteralNutritionConsumableVo;
+import org.dromara.web.service.IEnteralNutritionConsumableService;
+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.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 肠内营养耗材
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/nutritionConsumable")
+public class EnteralNutritionConsumableController extends BaseController {
+
+    private final IEnteralNutritionConsumableService enteralNutritionConsumableService;
+
+    /**
+     * 查询肠内营养耗材列表
+     */
+    @SaCheckPermission("system:nutritionConsumable:list")
+    @GetMapping("/list")
+    public TableDataInfo<EnteralNutritionConsumableVo> list(EnteralNutritionConsumableBo bo, PageQuery pageQuery) {
+        return enteralNutritionConsumableService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出肠内营养耗材列表
+     */
+    @SaCheckPermission("system:nutritionConsumable:export")
+    @Log(title = "肠内营养耗材", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(EnteralNutritionConsumableBo bo, HttpServletResponse response) {
+        List<EnteralNutritionConsumableVo> list = enteralNutritionConsumableService.queryList(bo);
+        ExcelUtil.exportExcel(list, "肠内营养耗材", EnteralNutritionConsumableVo.class, response);
+    }
+
+    /**
+     * 获取肠内营养耗材详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:nutritionConsumable:query")
+    @GetMapping("/{id}")
+    public R<EnteralNutritionConsumableVo> getInfo(@NotNull(message = "主键不能为空")
+                                                   @PathVariable Long id) {
+        return R.ok(enteralNutritionConsumableService.queryById(id));
+    }
+
+    /**
+     * 新增肠内营养耗材
+     */
+    @SaCheckPermission("system:nutritionConsumable:add")
+    @Log(title = "肠内营养耗材", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody EnteralNutritionConsumableBo bo) {
+        return toAjax(enteralNutritionConsumableService.insertByBo(bo));
+    }
+
+    /**
+     * 修改肠内营养耗材
+     */
+    @SaCheckPermission("system:nutritionConsumable:edit")
+    @Log(title = "肠内营养耗材", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EnteralNutritionConsumableBo bo) {
+        return toAjax(enteralNutritionConsumableService.updateByBo(bo));
+    }
+
+    /**
+     * 删除肠内营养耗材
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:nutritionConsumable:remove")
+    @Log(title = "肠内营养耗材", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(enteralNutritionConsumableService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 134 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/EnteralNutritionController.java

@@ -0,0 +1,134 @@
+package org.dromara.web.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+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.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.web.domain.bo.EnteralNutritionBo;
+import org.dromara.web.domain.bo.EnteralNutritionSaveBo;
+import org.dromara.web.domain.bo.SettlementBo;
+import org.dromara.web.domain.vo.EnteralNutritionQueryVo;
+import org.dromara.web.domain.vo.EnteralNutritionVo;
+import org.dromara.web.service.IEnteralNutritionService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 肠内营养
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/nutrition")
+public class EnteralNutritionController extends BaseController {
+
+    private final IEnteralNutritionService enteralNutritionService;
+
+    /**
+     * 查询肠内营养列表
+     */
+    @SaCheckPermission("system:nutrition:list")
+    @GetMapping("/list")
+    public TableDataInfo<EnteralNutritionQueryVo> list(SettlementBo bo, PageQuery pageQuery) {
+        return enteralNutritionService.queryPageList(bo, pageQuery);
+    }
+
+
+    /**
+     * 查询营养评估列表
+     */
+    @SaCheckPermission("system:evaluation:list")
+    @GetMapping("/listHistory")
+    public TableDataInfo<EnteralNutritionQueryVo> listHistory(SettlementBo bo, PageQuery pageQuery) {
+        return enteralNutritionService.listHistory(bo, pageQuery);
+    }
+
+    /**
+     * 查询营养评估详情
+     */
+    @SaCheckPermission("system:evaluation:list")
+    @GetMapping("/detail")
+    public R<EnteralNutritionQueryVo> detail(@RequestParam Long id) {
+        return enteralNutritionService.detail(id);
+    }
+
+    /**
+     * 导出肠内营养列表
+     */
+    @SaCheckPermission("system:nutrition:export")
+    @Log(title = "肠内营养", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(EnteralNutritionBo bo, HttpServletResponse response) {
+        List<EnteralNutritionVo> list = enteralNutritionService.queryList(bo);
+        ExcelUtil.exportExcel(list, "肠内营养", EnteralNutritionVo.class, response);
+    }
+
+    /**
+     * 获取肠内营养详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:nutrition:query")
+    @GetMapping("/{id}")
+    public R<EnteralNutritionVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+        return R.ok(enteralNutritionService.queryById(id));
+    }
+
+    /**
+     * 新增肠内营养
+     */
+    @SaCheckPermission("system:nutrition:add")
+    @Log(title = "肠内营养", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody EnteralNutritionSaveBo bo) {
+        return toAjax(enteralNutritionService.insertByBo(bo));
+    }
+
+    /**
+     * 修改肠内营养
+     */
+    @SaCheckPermission("system:nutrition:edit")
+    @Log(title = "肠内营养", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody EnteralNutritionSaveBo bo) {
+        return toAjax(enteralNutritionService.updateByBo(bo));
+    }
+
+    /**
+     * 删除肠内营养
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:nutrition:remove")
+    @Log(title = "肠内营养", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+        return toAjax(enteralNutritionService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 6 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/ProductNutritionController.java

@@ -48,6 +48,12 @@ public class ProductNutritionController extends BaseController {
         return productNutritionService.queryPageList(bo, pageQuery);
     }
 
+    @SaCheckPermission("warehouse:nutrition:list")
+    @GetMapping("/listAll")
+    public TableDataInfo<ProductNutritionVo> listAll() {
+        return productNutritionService.listAll();
+    }
+
     /**
      * 导出营养产品信息列表
      */

+ 113 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/SettlementController.java

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

+ 6 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/SuppliesManageController.java

@@ -49,6 +49,12 @@ public class SuppliesManageController extends BaseController {
         return suppliesManageService.queryPageList(bo, pageQuery);
     }
 
+    @SaCheckPermission("warehouse:suppliesManage:list")
+    @GetMapping("/listAll")
+    public TableDataInfo<SuppliesManageVo> listAll() {
+        return suppliesManageService.listAll();
+    }
+
     /**
      * 导出耗材管理列表
      */

+ 153 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/EnteralNutrition.java

@@ -0,0 +1,153 @@
+package org.dromara.web.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 肠内营养对象 enteral_nutrition
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("enteral_nutrition")
+public class EnteralNutrition extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 结算管理id
+     */
+    private Long settlementId;
+
+    /**
+     * 开方日期
+     */
+    private Date prescriptionDate;
+
+    /**
+     * 组号
+     */
+    private String groupNo;
+
+    /**
+     * 营养产品
+     */
+    private String nutritionProduct;
+    private Long nutritionProductId;
+
+    /**
+     * 停嘱日期
+     */
+    private Date stopDate;
+
+    /**
+     * 处方类型
+     */
+    private String prescriptionType;
+
+    /**
+     * 数量
+     */
+    private Long quantity;
+
+    /**
+     * 用量/次
+     */
+    private String dosePerTime;
+
+    /**
+     * 餐次时间
+     */
+    private String mealTime;
+
+    /**
+     * 频次
+     */
+    private String frequency;
+
+    /**
+     * 首日
+     */
+    private String firstDay;
+
+    /**
+     * 用量/日
+     */
+    private String dosePerDay;
+
+    /**
+     * 使用天数
+     */
+    private Long usageDays;
+
+    /**
+     * 用量/总
+     */
+    private String totalDose;
+
+    /**
+     * 规格
+     */
+    private String specification;
+
+    /**
+     * 用法
+     */
+    @TableField(value = "`usage`")
+    private String usage;
+
+    /**
+     * 制剂液量/次
+     */
+    private String preparationVolumePerTime;
+
+    /**
+     * 制剂浓度/次
+     */
+    private String preparationConcentrationPerTime;
+
+    /**
+     * 能量密度/次
+     */
+    private String energyDensityPerTime;
+
+    /**
+     * 处方备注
+     */
+    private String prescriptionRemark;
+
+    /**
+     * 每日热量
+     */
+    private String dailyCalories;
+
+    /**
+     * 金额
+     */
+    private Long amount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    private String delFlag;
+}

+ 100 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/EnteralNutritionConsumable.java

@@ -0,0 +1,100 @@
+package org.dromara.web.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 肠内营养耗材对象 enteral_nutrition_consumable
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("enteral_nutrition_consumable")
+public class EnteralNutritionConsumable extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 结算管理id
+     */
+    private Long settlementId;
+
+    /**
+     * 组号
+     */
+    private String groupNo;
+
+    /**
+     * 耗材
+     */
+    private String consumable;
+    private Long consumableId;
+
+    /**
+     * 规格
+     */
+    private String specification;
+
+    /**
+     * 用量/次
+     */
+    private String dosePerTime;
+
+    /**
+     * 频次
+     */
+    private String frequency;
+
+    /**
+     * 用量/日
+     */
+    private String dosePerDay;
+
+    /**
+     * 使用天数
+     */
+    private Long usageDays;
+
+    /**
+     * 首日
+     */
+    private String firstDay;
+
+    /**
+     * 数量
+     */
+    private Long quantity;
+
+    /**
+     * 处方备注
+     */
+    private String prescriptionRemark;
+
+    /**
+     * 金额
+     */
+    private Long amount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    private String delFlag;
+}

+ 106 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/Settlement.java

@@ -0,0 +1,106 @@
+package org.dromara.web.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 结算管理对象 settlement
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("settlement")
+public class Settlement extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 开单时间
+     */
+    private Date orderTime;
+
+    /**
+     * 看诊类型
+     */
+    private String visitType;
+
+    /**
+     * 收费类型
+     */
+    private String chargeType;
+
+    /**
+     * 患者ID
+     */
+    private Long patientId;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 患者科室
+     */
+    private Long doorId;
+
+    /**
+     * 门诊/住院号
+     */
+    private String patientNo;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 应收金额
+     */
+    private BigDecimal receivableAmount;
+
+    /**
+     * 支付状态(未支付/已支付/已退款)
+     */
+    private String paymentStatus;
+
+    /**
+     * 支付方式
+     */
+    private String paymentMethod;
+
+    /**
+     * 状态(0正常 1停用 2草稿)
+     */
+    private String status;
+
+    private Date stopDate;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+//    @TableLogic
+    private String delFlag;
+}

+ 146 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EnteralNutritionBo.java

@@ -0,0 +1,146 @@
+package org.dromara.web.domain.bo;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.web.domain.EnteralNutrition;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 肠内营养业务对象 enteral_nutrition
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EnteralNutrition.class, reverseConvertGenerate = false)
+public class EnteralNutritionBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = {EditGroup.class})
+    private Long id;
+
+    /**
+     * 结算管理id
+     */
+    private Long settlementId;
+
+    /**
+     * 开方日期
+     */
+    private Date prescriptionDate;
+
+    /**
+     * 组号
+     */
+    private String groupNo;
+
+    /**
+     * 营养产品
+     */
+    private String nutritionProduct;
+    private Long nutritionProductId;
+
+    /**
+     * 停嘱日期
+     */
+    private Date stopDate;
+
+    /**
+     * 处方类型
+     */
+    private String prescriptionType;
+
+    /**
+     * 数量
+     */
+    private Long quantity;
+
+    /**
+     * 用量/次
+     */
+    private BigDecimal dosePerTime;
+
+    /**
+     * 餐次时间
+     */
+    private String mealTime;
+
+    /**
+     * 频次
+     */
+    private Long frequency;
+
+    /**
+     * 首日
+     */
+    private Long firstDay;
+
+    /**
+     * 用量/日
+     */
+    private BigDecimal dosePerDay;
+
+    /**
+     * 使用天数
+     */
+    private Long usageDays;
+
+    /**
+     * 用量/总
+     */
+    private BigDecimal totalDose;
+
+    /**
+     * 规格
+     */
+    private String specification;
+
+    /**
+     * 用法
+     */
+    private String usage;
+
+    /**
+     * 制剂液量/次
+     */
+    private BigDecimal preparationVolumePerTime;
+
+    /**
+     * 制剂浓度/次
+     */
+    private BigDecimal preparationConcentrationPerTime;
+
+    /**
+     * 能量密度/次
+     */
+    private BigDecimal energyDensityPerTime;
+
+    /**
+     * 处方备注
+     */
+    private String prescriptionRemark;
+
+    /**
+     * 每日热量
+     */
+    private BigDecimal dailyCalories;
+
+    /**
+     * 金额
+     */
+    private BigDecimal amount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+}

+ 97 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EnteralNutritionConsumableBo.java

@@ -0,0 +1,97 @@
+package org.dromara.web.domain.bo;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.web.domain.EnteralNutritionConsumable;
+
+import java.math.BigDecimal;
+
+/**
+ * 肠内营养耗材业务对象 enteral_nutrition_consumable
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = EnteralNutritionConsumable.class, reverseConvertGenerate = false)
+public class EnteralNutritionConsumableBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = {EditGroup.class})
+    private Long id;
+
+    /**
+     * 结算管理id
+     */
+    private Long settlementId;
+
+    /**
+     * 组号
+     */
+    private String groupNo;
+
+    /**
+     * 耗材
+     */
+    private String consumable;
+    private Long consumableId;
+
+    /**
+     * 规格
+     */
+    private String specification;
+
+    /**
+     * 用量/次
+     */
+    private BigDecimal dosePerTime;
+
+    /**
+     * 频次
+     */
+    private Long frequency;
+
+    /**
+     * 用量/日
+     */
+    private BigDecimal dosePerDay;
+
+    /**
+     * 使用天数
+     */
+    private Long usageDays;
+
+    /**
+     * 首日
+     */
+    private Long firstDay;
+
+    /**
+     * 数量
+     */
+    private Long quantity;
+
+    /**
+     * 处方备注
+     */
+    private String prescriptionRemark;
+
+    /**
+     * 金额
+     */
+    private BigDecimal amount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+
+}

+ 55 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EnteralNutritionSaveBo.java

@@ -0,0 +1,55 @@
+package org.dromara.web.domain.bo;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+
+import java.util.List;
+
+/**
+ * 肠内营养业务对象 enteral_nutrition
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+public class EnteralNutritionSaveBo {
+    /**
+     * 结算管理id
+     */
+    @NotNull(message = "肠内营养不能为空", groups = {EditGroup.class})
+    private Long settlementId;
+
+    /**
+     * 患者ID
+     */
+    @NotNull(message = "患者不能为空", groups = {AddGroup.class})
+    private Long patientId;
+    /**
+     * 看诊类型
+     */
+    @NotBlank(message = "看诊类型(0门诊 1住院)不能为空", groups = {AddGroup.class})
+    private String visitType;
+
+    /**
+     * 收费类型
+     */
+    @NotBlank(message = "收费类型不能为空", groups = {AddGroup.class})
+    private String chargeType;
+    /**
+     * 门诊/住院号
+     */
+    @NotBlank(message = "门诊/住院号不能为空", groups = {AddGroup.class})
+    private String patientNo;
+
+    /**
+     * 状态(0正常 1停用 2草稿)
+     */
+    private String status;
+
+    private List<EnteralNutritionBo> nutritionList;
+
+    private List<EnteralNutritionConsumableBo> consumableList;
+}

+ 96 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/SettlementBo.java

@@ -0,0 +1,96 @@
+package org.dromara.web.domain.bo;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.web.domain.Settlement;
+
+import java.util.Date;
+
+/**
+ * 结算管理业务对象 settlement
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Settlement.class, reverseConvertGenerate = false)
+public class SettlementBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 开单时间
+     */
+    private Date orderTime;
+
+    /**
+     * 看诊类型
+     */
+    private String visitType;
+
+    /**
+     * 收费类型
+     */
+    private String chargeType;
+
+    /**
+     * 患者ID
+     */
+    private Long patientId;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 患者科室
+     */
+    private String patientDepartment;
+
+    /**
+     * 门诊/住院号
+     */
+    private String patientNo;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 应收金额
+     */
+    private Long receivableAmount;
+
+    /**
+     * 支付状态(未支付/已支付/已退款)
+     */
+    private String paymentStatus;
+
+    /**
+     * 支付方式
+     */
+    private String paymentMethod;
+
+    /**
+     * 状态(0正常 1停用 2草稿)
+     */
+    private String status;
+
+
+}

+ 115 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionConsumableVo.java

@@ -0,0 +1,115 @@
+package org.dromara.web.domain.vo;
+
+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.web.domain.EnteralNutritionConsumable;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 肠内营养耗材视图对象 enteral_nutrition_consumable
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EnteralNutritionConsumable.class)
+public class EnteralNutritionConsumableVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 结算管理id
+     */
+    @ExcelProperty(value = "结算管理id")
+    private Long settlementId;
+
+    /**
+     * 组号
+     */
+    @ExcelProperty(value = "组号")
+    private String groupNo;
+
+    /**
+     * 耗材
+     */
+    @ExcelProperty(value = "耗材")
+    private String consumable;
+
+    /**
+     * 规格
+     */
+    @ExcelProperty(value = "规格")
+    private String specification;
+
+    /**
+     * 用量/次
+     */
+    @ExcelProperty(value = "用量/次")
+    private String dosePerTime;
+
+    /**
+     * 频次
+     */
+    @ExcelProperty(value = "频次")
+    private String frequency;
+
+    /**
+     * 用量/日
+     */
+    @ExcelProperty(value = "用量/日")
+    private String dosePerDay;
+
+    /**
+     * 使用天数
+     */
+    @ExcelProperty(value = "使用天数")
+    private Long usageDays;
+
+    /**
+     * 首日
+     */
+    @ExcelProperty(value = "首日")
+    private String firstDay;
+
+    /**
+     * 数量
+     */
+    @ExcelProperty(value = "数量")
+    private Long quantity;
+
+    /**
+     * 处方备注
+     */
+    @ExcelProperty(value = "处方备注")
+    private String prescriptionRemark;
+
+    /**
+     * 金额
+     */
+    @ExcelProperty(value = "金额")
+    private Long amount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 61 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionQueryVo.java

@@ -0,0 +1,61 @@
+package org.dromara.web.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.web.domain.EnteralNutrition;
+import org.dromara.web.domain.ProductNutrition;
+import org.dromara.web.domain.bo.EnteralNutritionBo;
+import org.dromara.web.domain.bo.EnteralNutritionConsumableBo;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 肠内营养视图对象 enteral_nutrition
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EnteralNutrition.class)
+public class EnteralNutritionQueryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 结算管理id
+     */
+    private Long settlementId;
+
+    private Date orderTime;
+
+    private String chargeType;
+
+    private String paymentStatus;
+
+    private String createByName;
+
+    private Boolean stopFlag;
+
+    private Boolean delFlag;
+
+    /**
+     * 状态(0正常 1停用 2草稿)
+     */
+    private String status;
+
+    private List<EnteralNutritionVo> nutritionList;
+
+    private List<EnteralNutritionConsumableVo> consumableList;
+
+    private Map<Long, ProductNutritionVo> productNutritionMap;
+}

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

@@ -0,0 +1,177 @@
+package org.dromara.web.domain.vo;
+
+import java.util.Date;
+
+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.web.domain.EnteralNutrition;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 肠内营养视图对象 enteral_nutrition
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EnteralNutrition.class)
+public class EnteralNutritionVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 结算管理id
+     */
+    @ExcelProperty(value = "结算管理id")
+    private Long settlementId;
+
+    /**
+     * 开方日期
+     */
+    @ExcelProperty(value = "开方日期")
+    private Date prescriptionDate;
+
+    /**
+     * 组号
+     */
+    @ExcelProperty(value = "组号")
+    private String groupNo;
+
+    /**
+     * 营养产品
+     */
+    @ExcelProperty(value = "营养产品")
+    private String nutritionProduct;
+
+    /**
+     * 停嘱日期
+     */
+    @ExcelProperty(value = "停嘱日期")
+    private Date stopDate;
+
+    /**
+     * 处方类型
+     */
+    @ExcelProperty(value = "处方类型")
+    private String prescriptionType;
+
+    /**
+     * 数量
+     */
+    @ExcelProperty(value = "数量")
+    private Long quantity;
+
+    /**
+     * 用量/次
+     */
+    @ExcelProperty(value = "用量/次")
+    private String dosePerTime;
+
+    /**
+     * 餐次时间
+     */
+    @ExcelProperty(value = "餐次时间")
+    private String mealTime;
+
+    /**
+     * 频次
+     */
+    @ExcelProperty(value = "频次")
+    private String frequency;
+
+    /**
+     * 首日
+     */
+    @ExcelProperty(value = "首日")
+    private String firstDay;
+
+    /**
+     * 用量/日
+     */
+    @ExcelProperty(value = "用量/日")
+    private String dosePerDay;
+
+    /**
+     * 使用天数
+     */
+    @ExcelProperty(value = "使用天数")
+    private Long usageDays;
+
+    /**
+     * 用量/总
+     */
+    @ExcelProperty(value = "用量/总")
+    private String totalDose;
+
+    /**
+     * 规格
+     */
+    @ExcelProperty(value = "规格")
+    private String specification;
+
+    /**
+     * 用法
+     */
+    @ExcelProperty(value = "用法")
+    private String usage;
+
+    /**
+     * 制剂液量/次
+     */
+    @ExcelProperty(value = "制剂液量/次")
+    private String preparationVolumePerTime;
+
+    /**
+     * 制剂浓度/次
+     */
+    @ExcelProperty(value = "制剂浓度/次")
+    private String preparationConcentrationPerTime;
+
+    /**
+     * 能量密度/次
+     */
+    @ExcelProperty(value = "能量密度/次")
+    private String energyDensityPerTime;
+
+    /**
+     * 处方备注
+     */
+    @ExcelProperty(value = "处方备注")
+    private String prescriptionRemark;
+
+    /**
+     * 每日热量
+     */
+    @ExcelProperty(value = "每日热量")
+    private String dailyCalories;
+
+    /**
+     * 金额
+     */
+    @ExcelProperty(value = "金额")
+    private Long amount;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 117 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/SettlementVo.java

@@ -0,0 +1,117 @@
+package org.dromara.web.domain.vo;
+
+import java.util.Date;
+
+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.web.domain.Settlement;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 结算管理视图对象 settlement
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = Settlement.class)
+public class SettlementVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 开单时间
+     */
+    @ExcelProperty(value = "开单时间")
+    private Date orderTime;
+
+    /**
+     * 看诊类型
+     */
+    @ExcelProperty(value = "看诊类型")
+    private String visitType;
+
+    /**
+     * 收费类型
+     */
+    @ExcelProperty(value = "收费类型")
+    private String chargeType;
+
+    /**
+     * 患者ID
+     */
+    @ExcelProperty(value = "患者ID")
+    private Long patientId;
+
+    /**
+     * 患者姓名
+     */
+    @ExcelProperty(value = "患者姓名")
+    private String patientName;
+
+    /**
+     * 患者科室
+     */
+    @ExcelProperty(value = "患者科室")
+    private String patientDepartment;
+
+    /**
+     * 门诊/住院号
+     */
+    @ExcelProperty(value = "门诊/住院号")
+    private String patientNo;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phone;
+
+    /**
+     * 身份证号
+     */
+    @ExcelProperty(value = "身份证号")
+    private String idCard;
+
+    /**
+     * 应收金额
+     */
+    @ExcelProperty(value = "应收金额")
+    private Long receivableAmount;
+
+    /**
+     * 支付状态(未支付/已支付/已退款)
+     */
+    @ExcelProperty(value = "支付状态(未支付/已支付/已退款)")
+    private String paymentStatus;
+
+    /**
+     * 支付方式
+     */
+    @ExcelProperty(value = "支付方式")
+    private String paymentMethod;
+
+    /**
+     * 状态(0正常 1停用 2草稿)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 15 - 0
ruoyi-admin/src/main/java/org/dromara/web/mapper/EnteralNutritionConsumableMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.web.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.web.domain.EnteralNutritionConsumable;
+import org.dromara.web.domain.vo.EnteralNutritionConsumableVo;
+
+/**
+ * 肠内营养耗材Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+public interface EnteralNutritionConsumableMapper extends BaseMapperPlus<EnteralNutritionConsumable, EnteralNutritionConsumableVo> {
+
+}

+ 16 - 0
ruoyi-admin/src/main/java/org/dromara/web/mapper/EnteralNutritionMapper.java

@@ -0,0 +1,16 @@
+package org.dromara.web.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.web.domain.EnteralNutrition;
+import org.dromara.web.domain.vo.EnteralNutritionVo;
+
+import java.util.List;
+
+/**
+ * 肠内营养Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+public interface EnteralNutritionMapper extends BaseMapperPlus<EnteralNutrition, EnteralNutritionVo> {
+}

+ 15 - 0
ruoyi-admin/src/main/java/org/dromara/web/mapper/SettlementMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.web.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.web.domain.Settlement;
+import org.dromara.web.domain.vo.SettlementVo;
+
+/**
+ * 结算管理Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+public interface SettlementMapper extends BaseMapperPlus<Settlement, SettlementVo> {
+
+}

+ 68 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/IEnteralNutritionConsumableService.java

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

+ 78 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/IEnteralNutritionService.java

@@ -0,0 +1,78 @@
+package org.dromara.web.service;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.system.domain.bo.NutritionEvaluationBo;
+import org.dromara.system.domain.vo.NutritionEvaluationVo;
+import org.dromara.web.domain.bo.EnteralNutritionBo;
+import org.dromara.web.domain.bo.EnteralNutritionSaveBo;
+import org.dromara.web.domain.bo.SettlementBo;
+import org.dromara.web.domain.vo.EnteralNutritionQueryVo;
+import org.dromara.web.domain.vo.EnteralNutritionVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 肠内营养Service接口
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+public interface IEnteralNutritionService {
+
+    /**
+     * 查询肠内营养
+     *
+     * @param id 主键
+     * @return 肠内营养
+     */
+    EnteralNutritionVo queryById(Long id);
+
+    /**
+     * 分页查询肠内营养列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 肠内营养分页列表
+     */
+    TableDataInfo<EnteralNutritionQueryVo> queryPageList(SettlementBo bo, PageQuery pageQuery);
+
+    TableDataInfo<EnteralNutritionQueryVo> listHistory(SettlementBo bo, PageQuery pageQuery);
+
+    R<EnteralNutritionQueryVo> detail(Long id);
+
+    /**
+     * 查询符合条件的肠内营养列表
+     *
+     * @param bo 查询条件
+     * @return 肠内营养列表
+     */
+    List<EnteralNutritionVo> queryList(EnteralNutritionBo bo);
+
+    /**
+     * 新增肠内营养
+     *
+     * @param bo 肠内营养
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(EnteralNutritionSaveBo bo);
+
+    /**
+     * 修改肠内营养
+     *
+     * @param bo 肠内营养
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(EnteralNutritionSaveBo bo);
+
+    /**
+     * 校验并批量删除肠内营养信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 2 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/IProductNutritionService.java

@@ -38,6 +38,8 @@ public interface IProductNutritionService {
      */
     TableDataInfo<ProductNutritionVo> queryPageList(ProductNutritionBo bo, PageQuery pageQuery);
 
+    TableDataInfo<ProductNutritionVo> listAll();
+
     /**
      * 查询符合条件的营养产品信息列表
      *

+ 68 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/ISettlementService.java

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

+ 2 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/ISuppliesManageService.java

@@ -37,6 +37,8 @@ public interface ISuppliesManageService {
      */
     TableDataInfo<SuppliesManageVo> queryPageList(SuppliesManageBo bo, PageQuery pageQuery);
 
+    TableDataInfo<SuppliesManageVo> listAll();
+
     /**
      * 查询符合条件的耗材管理列表
      *

+ 145 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/EnteralNutritionConsumableServiceImpl.java

@@ -0,0 +1,145 @@
+package org.dromara.web.service.impl;
+
+import cn.hutool.core.util.ObjUtil;
+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.web.domain.EnteralNutritionConsumable;
+import org.dromara.web.domain.bo.EnteralNutritionConsumableBo;
+import org.dromara.web.domain.vo.EnteralNutritionConsumableVo;
+import org.dromara.web.mapper.EnteralNutritionConsumableMapper;
+import org.dromara.web.service.IEnteralNutritionConsumableService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 肠内营养耗材Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class EnteralNutritionConsumableServiceImpl implements IEnteralNutritionConsumableService {
+
+    private final EnteralNutritionConsumableMapper baseMapper;
+
+    /**
+     * 查询肠内营养耗材
+     *
+     * @param id 主键
+     * @return 肠内营养耗材
+     */
+    @Override
+    public EnteralNutritionConsumableVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询肠内营养耗材列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 肠内营养耗材分页列表
+     */
+    @Override
+    public TableDataInfo<EnteralNutritionConsumableVo> queryPageList(EnteralNutritionConsumableBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<EnteralNutritionConsumable> lqw = buildQueryWrapper(bo);
+        Page<EnteralNutritionConsumableVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的肠内营养耗材列表
+     *
+     * @param bo 查询条件
+     * @return 肠内营养耗材列表
+     */
+    @Override
+    public List<EnteralNutritionConsumableVo> queryList(EnteralNutritionConsumableBo bo) {
+        LambdaQueryWrapper<EnteralNutritionConsumable> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<EnteralNutritionConsumable> buildQueryWrapper(EnteralNutritionConsumableBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<EnteralNutritionConsumable> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(EnteralNutritionConsumable::getId);
+        lqw.eq(bo.getSettlementId() != null, EnteralNutritionConsumable::getSettlementId, bo.getSettlementId());
+        lqw.eq(StringUtils.isNotBlank(bo.getGroupNo()), EnteralNutritionConsumable::getGroupNo, bo.getGroupNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getConsumable()), EnteralNutritionConsumable::getConsumable, bo.getConsumable());
+        lqw.eq(StringUtils.isNotBlank(bo.getSpecification()), EnteralNutritionConsumable::getSpecification, bo.getSpecification());
+        lqw.eq(ObjUtil.isNotNull(bo.getDosePerTime()), EnteralNutritionConsumable::getDosePerTime, bo.getDosePerTime());
+        lqw.eq(ObjUtil.isNotNull(bo.getFrequency()), EnteralNutritionConsumable::getFrequency, bo.getFrequency());
+        lqw.eq(ObjUtil.isNotNull(bo.getDosePerDay()), EnteralNutritionConsumable::getDosePerDay, bo.getDosePerDay());
+        lqw.eq(bo.getUsageDays() != null, EnteralNutritionConsumable::getUsageDays, bo.getUsageDays());
+        lqw.eq(ObjUtil.isNotNull(bo.getFirstDay()), EnteralNutritionConsumable::getFirstDay, bo.getFirstDay());
+        lqw.eq(bo.getQuantity() != null, EnteralNutritionConsumable::getQuantity, bo.getQuantity());
+        lqw.eq(StringUtils.isNotBlank(bo.getPrescriptionRemark()), EnteralNutritionConsumable::getPrescriptionRemark, bo.getPrescriptionRemark());
+        lqw.eq(bo.getAmount() != null, EnteralNutritionConsumable::getAmount, bo.getAmount());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), EnteralNutritionConsumable::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增肠内营养耗材
+     *
+     * @param bo 肠内营养耗材
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(EnteralNutritionConsumableBo bo) {
+        EnteralNutritionConsumable add = MapstructUtils.convert(bo, EnteralNutritionConsumable.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改肠内营养耗材
+     *
+     * @param bo 肠内营养耗材
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(EnteralNutritionConsumableBo bo) {
+        EnteralNutritionConsumable update = MapstructUtils.convert(bo, EnteralNutritionConsumable.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(EnteralNutritionConsumable entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除肠内营养耗材信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 482 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/EnteralNutritionServiceImpl.java

@@ -0,0 +1,482 @@
+package org.dromara.web.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+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.common.core.constant.BizConst;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.biz.DelFlag;
+import org.dromara.common.core.enums.biz.FeeType;
+import org.dromara.common.core.enums.biz.PaymentStatus;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.vo.SysDictDataVo;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.system.service.ISysDictDataService;
+import org.dromara.web.domain.EnteralNutrition;
+import org.dromara.web.domain.EnteralNutritionConsumable;
+import org.dromara.web.domain.ProductNutrition;
+import org.dromara.web.domain.Settlement;
+import org.dromara.web.domain.SuppliesManage;
+import org.dromara.web.domain.TreatmentUser;
+import org.dromara.web.domain.bo.EnteralNutritionBo;
+import org.dromara.web.domain.bo.EnteralNutritionSaveBo;
+import org.dromara.web.domain.bo.SettlementBo;
+import org.dromara.web.domain.vo.EnteralNutritionConsumableVo;
+import org.dromara.web.domain.vo.EnteralNutritionQueryVo;
+import org.dromara.web.domain.vo.EnteralNutritionVo;
+import org.dromara.web.domain.vo.ProductNutritionVo;
+import org.dromara.web.mapper.EnteralNutritionConsumableMapper;
+import org.dromara.web.mapper.EnteralNutritionMapper;
+import org.dromara.web.mapper.ProductNutritionMapper;
+import org.dromara.web.mapper.SettlementMapper;
+import org.dromara.web.mapper.SuppliesManageMapper;
+import org.dromara.web.mapper.TreatmentUserMapper;
+import org.dromara.web.service.IEnteralNutritionService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 肠内营养Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
+
+    private final EnteralNutritionMapper baseMapper;
+    private final SettlementMapper settlementMapper;
+    private final EnteralNutritionConsumableMapper consumableMapper;
+    private final TreatmentUserMapper treatmentUserMapper;
+    private final ProductNutritionMapper productNutritionMapper;
+    private final SuppliesManageMapper suppliesManageMapper;
+    private final SysUserMapper userMapper;
+    private final ISysDictDataService dataService;
+
+    /**
+     * 查询肠内营养
+     *
+     * @param id 主键
+     * @return 肠内营养
+     */
+    @Override
+    public EnteralNutritionVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    @Override
+    public R<EnteralNutritionQueryVo> detail(Long id) {
+        if (ObjUtil.isNull(id)) {
+            throw new ServiceException("id不能为空!");
+        }
+
+        List<EnteralNutrition> nutritionList = baseMapper.selectList(Wrappers.lambdaQuery(EnteralNutrition.class)
+            .eq(EnteralNutrition::getSettlementId, id));
+        List<EnteralNutritionConsumable> consumableList = consumableMapper.selectList(Wrappers.lambdaQuery(EnteralNutritionConsumable.class)
+            .eq(EnteralNutritionConsumable::getSettlementId, id));
+
+        EnteralNutritionQueryVo queryVo = new EnteralNutritionQueryVo();
+        queryVo.setNutritionList(MapstructUtils.convert(nutritionList, EnteralNutritionVo.class));
+        queryVo.setConsumableList(MapstructUtils.convert(consumableList, EnteralNutritionConsumableVo.class));
+
+        if (CollUtil.isNotEmpty(nutritionList)) {
+            queryVo.setProductNutritionMap(productNutritionMapper.selectByIds(nutritionList.stream().map(EnteralNutrition::getNutritionProductId).collect(Collectors.toSet()))
+                .stream().map(v -> MapstructUtils.convert(v, ProductNutritionVo.class)).collect(Collectors.toMap(k1 -> k1.getId(), k2 -> k2, (k1, k12) -> k1)));
+        }
+
+        return R.ok(queryVo);
+    }
+
+    @Override
+    public TableDataInfo<EnteralNutritionQueryVo> listHistory(SettlementBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<Settlement> lqw = Wrappers.lambdaQuery();
+        lqw.eq(Settlement::getPatientId, bo.getPatientId());
+        List<Settlement> settlementList = settlementMapper.selectList(lqw);
+
+        Map<String, List<SysDictDataVo>> dictMap = dataService.selectGroupByType(List.of(BizConst.PAYMENT_STATUS, BizConst.FEE_TYPE)).getData();
+        Map<String, String> paymentMap = dictMap.get(BizConst.PAYMENT_STATUS).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+        Map<String, String> feeTypeMap = dictMap.get(BizConst.FEE_TYPE).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+        List<EnteralNutritionQueryVo> nutritionQueryVoList = new ArrayList<>(settlementList.size());
+        String today = DateUtil.today();
+        settlementList.forEach(settlement -> {
+            EnteralNutritionQueryVo queryVo = new EnteralNutritionQueryVo();
+
+            queryVo.setPaymentStatus(paymentMap.get(settlement.getPaymentStatus()));
+            queryVo.setChargeType(feeTypeMap.get(settlement.getChargeType()));
+            queryVo.setOrderTime(settlement.getOrderTime());
+            queryVo.setSettlementId(settlement.getId());
+            String stopDate = DateUtil.formatDate(settlement.getStopDate());
+            queryVo.setStopFlag(stopDate.compareTo(today) < 0);
+            queryVo.setDelFlag(DelFlag.YES.getCode().equals(settlement.getDelFlag()));
+
+            nutritionQueryVoList.add(queryVo);
+        });
+
+        return TableDataInfo.build(nutritionQueryVoList);
+    }
+
+    /**
+     * 分页查询肠内营养列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 肠内营养分页列表
+     */
+    @Override
+    public TableDataInfo<EnteralNutritionQueryVo> queryPageList(SettlementBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<Settlement> lqw = Wrappers.lambdaQuery();
+        lqw.eq(Settlement::getPatientId, bo.getPatientId());
+
+        String today = DateUtil.today();
+        String beginTime = today + " 00:00:00";
+        String endTime = today + " 23:59:59";
+
+        lqw.and(lqw2 -> {
+            lqw2.eq(Settlement::getStatus, "2");
+            lqw2.or();
+            lqw2.between(Settlement::getCreateTime, beginTime, endTime);
+        });
+        List<Settlement> settlementList = settlementMapper.selectList(lqw);
+        Map<Long, Settlement> settlementMap = MapUtil.newHashMap();
+        Set<Long> userList = CollUtil.newHashSet();
+        settlementList.forEach(sm -> {
+            settlementMap.put(sm.getId(), sm);
+            userList.add(sm.getCreateBy());
+        });
+
+        Set<Long> settlementIdList = settlementMap.keySet();
+        Map<Long, List<EnteralNutrition>> nutritionGroupMap = baseMapper.selectList(
+                Wrappers.lambdaQuery(EnteralNutrition.class).in(EnteralNutrition::getSettlementId, settlementIdList))
+            .stream().collect(Collectors.groupingBy(EnteralNutrition::getSettlementId));
+
+        Map<Long, List<EnteralNutritionConsumable>> consumableGroupMap = consumableMapper.selectList(
+                Wrappers.lambdaQuery(EnteralNutritionConsumable.class).in(EnteralNutritionConsumable::getSettlementId, settlementIdList))
+            .stream().collect(Collectors.groupingBy(EnteralNutritionConsumable::getSettlementId));
+
+        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));
+
+        Map<String, List<SysDictDataVo>> dictMap = dataService.selectGroupByType(List.of(BizConst.PAYMENT_STATUS, BizConst.FEE_TYPE)).getData();
+        Map<String, String> paymentMap = dictMap.get(BizConst.PAYMENT_STATUS).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+        Map<String, String> feeTypeMap = dictMap.get(BizConst.FEE_TYPE).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+
+        List<EnteralNutritionQueryVo> nutritionQueryVoList = new ArrayList<>(settlementList.size());
+        settlementList.forEach(settlement -> {
+            EnteralNutritionQueryVo queryVo = new EnteralNutritionQueryVo();
+            nutritionQueryVoList.add(queryVo);
+            List<EnteralNutrition> nutritionList = nutritionGroupMap.get(settlement.getId());
+            if (CollUtil.isNotEmpty(nutritionList)) {
+                queryVo.setNutritionList(MapstructUtils.convert(nutritionList, EnteralNutritionVo.class));
+            }
+
+            List<EnteralNutritionConsumable> consumableList = consumableGroupMap.get(settlement.getId());
+            if (CollUtil.isNotEmpty(consumableList)) {
+                queryVo.setConsumableList(MapstructUtils.convert(consumableList, EnteralNutritionConsumableVo.class));
+            }
+
+            queryVo.setPaymentStatus(paymentMap.get(settlement.getPaymentStatus()));
+            queryVo.setStatus(settlement.getStatus());
+            queryVo.setChargeType(feeTypeMap.get(settlement.getChargeType()));
+            queryVo.setOrderTime(settlement.getOrderTime());
+            queryVo.setSettlementId(settlement.getId());
+            queryVo.setCreateByName(userMap.get(settlement.getCreateBy()));
+        });
+
+        return TableDataInfo.build(nutritionQueryVoList);
+    }
+
+    /**
+     * 查询符合条件的肠内营养列表
+     *
+     * @param bo 查询条件
+     * @return 肠内营养列表
+     */
+    @Override
+    public List<EnteralNutritionVo> queryList(EnteralNutritionBo bo) {
+        LambdaQueryWrapper<EnteralNutrition> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+
+    private LambdaQueryWrapper<EnteralNutrition> buildQueryWrapper(EnteralNutritionBo bo) {
+        LambdaQueryWrapper<EnteralNutrition> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(EnteralNutrition::getId);
+        lqw.eq(bo.getSettlementId() != null, EnteralNutrition::getSettlementId, bo.getSettlementId());
+        return lqw;
+    }
+
+    /**
+     * 新增肠内营养
+     *
+     * @param bo 肠内营养
+     * @return 是否新增成功
+     */
+    @Override
+    @Transactional
+    public Boolean insertByBo(EnteralNutritionSaveBo bo) {
+        if (CollUtil.isEmpty(bo.getNutritionList())) {
+            throw new ServiceException("请至少选择一个营养产品");
+        }
+
+        TreatmentUser treatmentUser = treatmentUserMapper.selectById(bo.getPatientId());
+        Settlement settlement = new Settlement();
+        settlement.setOrderTime(new Date());
+        settlement.setPatientId(bo.getPatientId());
+        settlement.setVisitType(bo.getVisitType());
+        settlement.setChargeType(bo.getChargeType());
+        settlement.setPatientNo(bo.getPatientNo());
+        settlement.setPatientName(treatmentUser.getTreatName());
+        settlement.setDoorId(treatmentUser.getDoorId());
+        settlement.setPhone(treatmentUser.getPhoneNum());
+        settlement.setIdCard(treatmentUser.getIdCard());
+        settlement.setPaymentStatus(PaymentStatus.UNPAID.getCode());
+        settlement.setStatus(bo.getStatus());
+
+        saveOrUpdateData(bo, settlement);
+        return Boolean.TRUE;
+    }
+
+    private void saveOrUpdateData(EnteralNutritionSaveBo bo, Settlement settlement) {
+        Map<String, List<SysDictDataVo>> dictMap = dataService.selectGroupByType(
+            List.of(BizConst.PRODUCT_SPEC_UNIT, BizConst.PRODUCT_PACKAGE_UNIT)).getData();
+        Map<String, String> specUnitMap = dictMap.get(BizConst.PRODUCT_SPEC_UNIT).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+        Map<String, String> packageUnitMap = dictMap.get(BizConst.PRODUCT_PACKAGE_UNIT).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+
+        Set<Long> idList = bo.getNutritionList().stream().map(EnteralNutritionBo::getNutritionProductId).collect(Collectors.toSet());
+        Map<Long, ProductNutrition> nutritionMap = productNutritionMapper.selectByIds(idList)
+            .stream().collect(Collectors.toMap(k1 -> k1.getId(), k2 -> k2, (k1, k2) -> k1));
+        BigDecimal total = BigDecimal.ZERO;
+        Map<String, EnteralNutritionBo> groupNoMap = MapUtil.newHashMap(bo.getNutritionList().size());
+        for (EnteralNutritionBo nutritionBo : bo.getNutritionList()) {
+            if (ObjUtil.isNull(nutritionBo.getPrescriptionDate())) {
+                throw new ServiceException("开方日期不能为空");
+            }
+            if (StrUtil.isBlank(nutritionBo.getPrescriptionType())) {
+                throw new ServiceException("处方类型不能为空");
+            }
+            if (StrUtil.isBlank(nutritionBo.getMealTime())) {
+                throw new ServiceException("餐次时间不能为空");
+            }
+            if (ObjUtil.isNull(nutritionBo.getDosePerTime())) {
+                throw new ServiceException("用量/次不能为空");
+            }
+            if (StrUtil.isBlank(nutritionBo.getGroupNo())) {
+                throw new ServiceException("组号不能为空");
+            }
+            Set<String> mealTimeSet = Arrays.stream(nutritionBo.getMealTime().split(",")).map(String::trim).filter(StrUtil::isNotBlank).collect(Collectors.toSet());
+            nutritionBo.setMealTime(StrUtil.join(",", mealTimeSet));
+            nutritionBo.setFrequency(Long.valueOf(mealTimeSet.size()));
+            groupNoMap.put(nutritionBo.getGroupNo(), nutritionBo);
+
+            ProductNutrition nutrition = nutritionMap.get(nutritionBo.getNutritionProductId());
+            nutritionBo.setNutritionProduct(nutrition.getProductName());
+            if (ObjUtil.isNull(nutrition)) {
+                continue;
+            }
+            if (FeeType.CONFIGURE_PRESCRIPTION.getCode().equalsIgnoreCase(nutritionBo.getPrescriptionType())) {
+                if (ObjUtil.isNull(nutrition.getConfigSalePrice())) {
+                    throw new ServiceException("配置销售价格不能为空");
+                }
+                if (ObjUtil.isNull(nutritionBo.getUsageDays())) {
+                    throw new ServiceException("使用天数不能为空");
+                }
+                if (ObjUtil.isNull(nutritionBo.getFirstDay())) {
+                    throw new ServiceException("首日不能为空");
+                }
+                nutritionBo.setAmount(BigDecimal.valueOf(nutrition.getConfigSalePrice() *
+                        (nutritionBo.getFrequency() * (nutritionBo.getUsageDays() - 1) + nutritionBo.getFirstDay()))
+                    .multiply(nutritionBo.getDosePerTime()));
+
+                nutritionBo.setDailyCalories(BigDecimal.valueOf(nutrition.getCalorie() * nutritionBo.getFrequency() / 100.0)
+                    .multiply(nutritionBo.getDosePerTime()));
+
+                nutritionBo.setTotalDose(BigDecimal.valueOf((nutritionBo.getFrequency() * (nutritionBo.getUsageDays() - 1) + nutritionBo.getFirstDay()))
+                    .multiply(nutritionBo.getDosePerTime()));
+
+                settlement.setStopDate(DateUtil.offsetDay(nutritionBo.getPrescriptionDate(), nutritionBo.getUsageDays().intValue() - 1));
+
+            } else if (FeeType.PRE_PACKAGED_PRESCRIPTION.getCode().equalsIgnoreCase(nutritionBo.getPrescriptionType())) {
+                if (ObjUtil.isNull(nutrition.getPackagePrice())) {
+                    throw new ServiceException("预包装销售价不能为空");
+                }
+                if (StrUtil.isBlank(nutrition.getProductSpec())) {
+                    throw new ServiceException("商品规格不能为空");
+                }
+                if (ObjUtil.isNull(nutritionBo.getQuantity())) {
+                    throw new ServiceException("数量不能为空");
+                }
+
+                nutritionBo.setAmount(BigDecimal.valueOf(nutritionBo.getQuantity() * nutrition.getPackagePrice())
+                    .multiply(new BigDecimal(nutrition.getProductSpec())).multiply(nutritionBo.getDosePerTime()));
+
+                nutritionBo.setDailyCalories(BigDecimal.valueOf(nutrition.getCalorie() * nutritionBo.getFrequency() / 100.0)
+                    .multiply(nutritionBo.getDosePerTime()));
+
+                settlement.setStopDate(DateUtil.offsetDay(nutritionBo.getPrescriptionDate(), nutritionBo.getUsageDays().intValue() - 1));
+
+            } else if (FeeType.LONG_TERM_PRESCRIPTION.getCode().equalsIgnoreCase(nutritionBo.getPrescriptionType())) {
+                if (ObjUtil.isNull(nutritionBo.getStopDate())) {
+                    throw new ServiceException("停嘱日期不能为空");
+                }
+                if (ObjUtil.isNull(nutritionBo.getStopDate())) {
+                    throw new ServiceException("停嘱日期不能为空");
+                }
+                if (ObjUtil.isNull(nutritionBo.getFirstDay())) {
+                    throw new ServiceException("首日不能为空");
+                }
+                if (ObjUtil.isNull(nutrition.getConfigSalePrice())) {
+                    throw new ServiceException("配置销售价格不能为空");
+                }
+                long days = DateUtil.between(nutritionBo.getPrescriptionDate(), nutritionBo.getStopDate(), DateUnit.DAY);
+                nutritionBo.setUsageDays(days);
+
+                nutritionBo.setAmount(BigDecimal.valueOf(((days - 1) * nutritionBo.getFrequency() + nutritionBo.getFirstDay()) * nutrition.getConfigSalePrice())
+                    .multiply(nutritionBo.getDosePerTime()));
+
+                nutritionBo.setDailyCalories(BigDecimal.valueOf(nutrition.getCalorie() * nutritionBo.getFrequency() / 100.0)
+                    .multiply(nutritionBo.getDosePerTime()));
+
+                settlement.setStopDate(nutritionBo.getStopDate());
+            }
+            nutritionBo.setDosePerDay(BigDecimal.valueOf(nutritionBo.getFrequency()).multiply(nutritionBo.getDosePerTime()));
+
+            String packageUnit = StrUtil.emptyToDefault(packageUnitMap.get(nutrition.getPackageUnit()), StrUtil.EMPTY);
+            String productSpecUnit = StrUtil.emptyToDefault(specUnitMap.get(nutrition.getProductSpecUnit()), StrUtil.EMPTY);
+            nutritionBo.setSpecification(nutrition.getProductSpec() + productSpecUnit + "/" + packageUnit);
+            total = total.add(nutritionBo.getAmount());
+        }
+        settlement.setReceivableAmount(total);
+
+        if (ObjUtil.isNull(settlement.getId())) {
+            settlementMapper.insert(settlement);
+        } else {
+            settlementMapper.updateById(settlement);
+        }
+
+        if (CollUtil.isNotEmpty(bo.getConsumableList())) {
+            Set<Long> consumableIds = CollUtil.newHashSet();
+            bo.getConsumableList().forEach(v -> {
+                if (ObjUtil.isNull(v.getDosePerTime())) {
+                    throw new ServiceException("耗材[用量/次]不能为空");
+                }
+                if (ObjUtil.isNull(v.getQuantity())) {
+                    throw new ServiceException("耗材[数量]不能为空");
+                }
+
+                v.setSettlementId(settlement.getId());
+                consumableIds.add(v.getConsumableId());
+            });
+
+            Map<Long, SuppliesManage> suppliesManageMap = suppliesManageMapper.selectByIds(consumableIds).stream()
+                .collect(Collectors.toMap(k1 -> k1.getId(), k2 -> k2, (k1, k2) -> k1));
+
+            bo.getConsumableList().forEach(v -> {
+                SuppliesManage suppliesManage = suppliesManageMap.get(v.getConsumableId());
+                EnteralNutritionBo nutritionBo = groupNoMap.get(v.getGroupNo());
+                if (ObjUtil.isNotNull(nutritionBo)) {
+                    v.setFrequency(nutritionBo.getFrequency());
+                    v.setDosePerDay(v.getDosePerTime().multiply(BigDecimal.valueOf(v.getFrequency())));
+                    v.setFirstDay(nutritionBo.getFirstDay());
+
+                    long days = 0L;
+
+                    if (FeeType.LONG_TERM_PRESCRIPTION.getCode().equalsIgnoreCase(nutritionBo.getPrescriptionType())) {
+                        days = DateUtil.between(nutritionBo.getPrescriptionDate(), nutritionBo.getStopDate(), DateUnit.DAY);
+                    } else {
+                        days = nutritionBo.getUsageDays();
+                    }
+
+                    v.setQuantity(BigDecimal.valueOf(days - 1).multiply(v.getDosePerDay())
+                        .add(v.getDosePerTime().multiply(BigDecimal.valueOf(v.getFirstDay()))).longValue());
+                }
+
+                if (ObjUtil.isNotNull(suppliesManage)) {
+                    v.setConsumable(suppliesManage.getSuppliesName());
+                    String packageUnit = StrUtil.emptyToDefault(packageUnitMap.get(suppliesManage.getSuppliesUnit()), StrUtil.EMPTY);
+                    String productSpecUnit = StrUtil.emptyToDefault(specUnitMap.get(suppliesManage.getSuppliesSpecUnit()), StrUtil.EMPTY);
+                    v.setSpecification(suppliesManage.getSuppliesSpec() + productSpecUnit + "/" + packageUnit);
+
+                    Optional<Long> quantity = Optional.ofNullable(v.getQuantity());
+                    v.setAmount(BigDecimal.valueOf(quantity.orElse(0L)).multiply(suppliesManage.getSellPrice()));
+                }
+
+                if (ObjUtil.isNotNull(suppliesManage) && ObjUtil.isNotNull(nutritionBo)) {
+                    nutritionBo.setNutritionProduct(nutritionBo.getNutritionProduct() + "," + suppliesManage.getSuppliesName());
+                }
+
+            });
+            consumableMapper.insertBatch(MapstructUtils.convert(bo.getConsumableList(), EnteralNutritionConsumable.class));
+        }
+
+        bo.setSettlementId(settlement.getId());
+        bo.getNutritionList().forEach(v -> v.setSettlementId(settlement.getId()));
+        baseMapper.insertBatch(MapstructUtils.convert(bo.getNutritionList(), EnteralNutrition.class));
+    }
+
+
+    /**
+     * 修改肠内营养
+     *
+     * @param bo 肠内营养
+     * @return 是否修改成功
+     */
+    @Override
+    @Transactional
+    public Boolean updateByBo(EnteralNutritionSaveBo bo) {
+        baseMapper.delete(Wrappers.lambdaQuery(EnteralNutrition.class).eq(EnteralNutrition::getSettlementId, bo.getSettlementId()));
+        consumableMapper.delete(Wrappers.lambdaQuery(EnteralNutritionConsumable.class).eq(EnteralNutritionConsumable::getSettlementId, bo.getSettlementId()));
+
+        Settlement settlement = new Settlement();
+        settlement.setId(bo.getSettlementId());
+        saveOrUpdateData(bo, settlement);
+
+        return Boolean.TRUE;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(EnteralNutrition entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除肠内营养信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 31 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/ProductNutritionServiceImpl.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.idev.excel.FastExcel;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.dromara.common.core.constant.BizConst;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -19,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.dromara.system.domain.SysDiseaseLabel;
 import org.dromara.system.domain.bo.SysDiseaseLabelBo;
 import org.dromara.system.domain.vo.SysDeptVo;
+import org.dromara.system.domain.vo.SysDictDataVo;
 import org.dromara.system.domain.vo.SysDiseaseLabelVo;
 import org.dromara.system.service.ISysDeptService;
 import org.dromara.system.service.ISysDictDataService;
@@ -61,6 +63,8 @@ public class ProductNutritionServiceImpl implements IProductNutritionService {
 
     private final ISysDiseaseLabelService diseaseLabelService;
 
+    private final ISysDictDataService dataService;
+
 
     /**
      * 查询营养产品信息
@@ -168,6 +172,33 @@ public class ProductNutritionServiceImpl implements IProductNutritionService {
         return TableDataInfo.build(result);
     }
 
+    @Override
+    public TableDataInfo<ProductNutritionVo> listAll() {
+        List<ProductNutritionVo> dataList = baseMapper.selectVoList(Wrappers.lambdaQuery(ProductNutrition.class)
+            .select(ProductNutrition::getId, ProductNutrition::getProductName, ProductNutrition::getProductCategory,
+                ProductNutrition::getProductSpec, ProductNutrition::getProductSpecUnit, ProductNutrition::getPackageUnit,
+                ProductNutrition::getConfigSalePrice, ProductNutrition::getPackagePrice, ProductNutrition::getCalorie,
+                ProductNutrition::getDefaultUsage)
+            .orderByDesc(ProductNutrition::getId));
+
+        if (CollUtil.isNotEmpty(dataList)) {
+            Map<String, List<SysDictDataVo>> dictMap = dataService.selectGroupByType(
+                List.of(BizConst.PRODUCT_SPEC_UNIT, BizConst.PRODUCT_PACKAGE_UNIT)).getData();
+            Map<String, String> specUnitMap = dictMap.get(BizConst.PRODUCT_SPEC_UNIT).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+            Map<String, String> packageUnitMap = dictMap.get(BizConst.PRODUCT_PACKAGE_UNIT).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+
+            dataList.forEach(v -> {
+                String packageUnit = StrUtil.emptyToDefault(packageUnitMap.get(v.getPackageUnit()), StrUtil.EMPTY);
+                String productSpecUnit = StrUtil.emptyToDefault(specUnitMap.get(v.getProductSpecUnit()), StrUtil.EMPTY);
+                v.setProductSpec(v.getProductSpec() + productSpecUnit + "/" + packageUnit);
+                v.setProductSpecUnit(productSpecUnit);
+                v.setPackageUnit(packageUnit);
+            });
+        }
+
+        return TableDataInfo.build(dataList);
+    }
+
     /**
      * 查询符合条件的营养产品信息列表
      *

+ 143 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/SettlementServiceImpl.java

@@ -0,0 +1,143 @@
+package org.dromara.web.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.dromara.web.domain.Settlement;
+import org.dromara.web.domain.bo.SettlementBo;
+import org.dromara.web.domain.vo.SettlementVo;
+import org.dromara.web.mapper.SettlementMapper;
+import org.dromara.web.service.ISettlementService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 结算管理Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-22
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SettlementServiceImpl implements ISettlementService {
+
+    private final SettlementMapper baseMapper;
+
+    /**
+     * 查询结算管理
+     *
+     * @param id 主键
+     * @return 结算管理
+     */
+    @Override
+    public SettlementVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询结算管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 结算管理分页列表
+     */
+    @Override
+    public TableDataInfo<SettlementVo> queryPageList(SettlementBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<Settlement> lqw = buildQueryWrapper(bo);
+        Page<SettlementVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的结算管理列表
+     *
+     * @param bo 查询条件
+     * @return 结算管理列表
+     */
+    @Override
+    public List<SettlementVo> queryList(SettlementBo bo) {
+        LambdaQueryWrapper<Settlement> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<Settlement> buildQueryWrapper(SettlementBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<Settlement> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(Settlement::getId);
+        lqw.eq(bo.getOrderTime() != null, Settlement::getOrderTime, bo.getOrderTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getVisitType()), Settlement::getVisitType, bo.getVisitType());
+        lqw.eq(StringUtils.isNotBlank(bo.getChargeType()), Settlement::getChargeType, bo.getChargeType());
+        lqw.eq(bo.getPatientId() != null, Settlement::getPatientId, bo.getPatientId());
+        lqw.like(StringUtils.isNotBlank(bo.getPatientName()), Settlement::getPatientName, bo.getPatientName());
+        lqw.eq(StringUtils.isNotBlank(bo.getPatientNo()), Settlement::getPatientNo, bo.getPatientNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), Settlement::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getIdCard()), Settlement::getIdCard, bo.getIdCard());
+        lqw.eq(bo.getReceivableAmount() != null, Settlement::getReceivableAmount, bo.getReceivableAmount());
+        lqw.eq(StringUtils.isNotBlank(bo.getPaymentStatus()), Settlement::getPaymentStatus, bo.getPaymentStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPaymentMethod()), Settlement::getPaymentMethod, bo.getPaymentMethod());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Settlement::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增结算管理
+     *
+     * @param bo 结算管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SettlementBo bo) {
+        Settlement add = MapstructUtils.convert(bo, Settlement.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改结算管理
+     *
+     * @param bo 结算管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SettlementBo bo) {
+        Settlement update = MapstructUtils.convert(bo, Settlement.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(Settlement entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除结算管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 31 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/SuppliesManageServiceImpl.java

@@ -11,6 +11,7 @@ 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.constant.BizConst;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -22,6 +23,7 @@ import org.dromara.system.domain.SysDiseaseLabel;
 import org.dromara.system.domain.SysFoodCategory;
 import org.dromara.system.domain.SysFoodIngredient;
 import org.dromara.system.domain.vo.SysDeptVo;
+import org.dromara.system.domain.vo.SysDictDataVo;
 import org.dromara.system.domain.vo.SysDiseaseLabelVo;
 import org.dromara.system.mapper.SysDeptMapper;
 import org.dromara.system.mapper.SysDiseaseLabelMapper;
@@ -29,11 +31,13 @@ import org.dromara.system.service.ISysDeptService;
 import org.dromara.system.service.ISysDictDataService;
 import org.dromara.system.service.ISysDiseaseLabelService;
 import org.dromara.web.domain.ProductManufacturer;
+import org.dromara.web.domain.ProductNutrition;
 import org.dromara.web.domain.ProductSupplier;
 import org.dromara.web.domain.SuppliesCategory;
 import org.dromara.web.domain.SuppliesManage;
 import org.dromara.web.domain.bo.BatchSuppliesManageBo;
 import org.dromara.web.domain.bo.SuppliesManageBo;
+import org.dromara.web.domain.vo.ProductNutritionVo;
 import org.dromara.web.domain.vo.SuppliesCategoryVo;
 import org.dromara.web.domain.vo.SuppliesManageVo;
 import org.dromara.web.mapper.ProductManufacturerMapper;
@@ -176,6 +180,33 @@ public class SuppliesManageServiceImpl implements ISuppliesManageService {
         return TableDataInfo.build(result);
     }
 
+    @Override
+    public TableDataInfo<SuppliesManageVo> listAll() {
+        List<SuppliesManageVo> dataList = baseMapper.selectVoList(Wrappers.lambdaQuery(SuppliesManage.class)
+            .select(SuppliesManage::getId, SuppliesManage::getSuppliesName,
+                SuppliesManage::getSuppliesSpec, SuppliesManage::getSuppliesUnit, SuppliesManage::getSuppliesSpecUnit,
+                SuppliesManage::getSellPrice)
+            .orderByDesc(SuppliesManage::getId));
+
+        if (CollUtil.isNotEmpty(dataList)) {
+            Map<String, List<SysDictDataVo>> dictMap = dictDataService.selectGroupByType(
+                List.of(BizConst.PRODUCT_SPEC_UNIT, BizConst.PRODUCT_PACKAGE_UNIT)).getData();
+            Map<String, String> specUnitMap = dictMap.get(BizConst.PRODUCT_SPEC_UNIT).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+            Map<String, String> packageUnitMap = dictMap.get(BizConst.PRODUCT_PACKAGE_UNIT).stream().collect(Collectors.toMap(k1 -> k1.getDictValue(), k2 -> k2.getDictLabel(), (k1, k2) -> k1));
+
+            dataList.forEach(v -> {
+                String packageUnit = StrUtil.emptyToDefault(packageUnitMap.get(v.getSuppliesUnit()), StrUtil.EMPTY);
+                String productSpecUnit = StrUtil.emptyToDefault(specUnitMap.get(v.getSuppliesSpecUnit()), StrUtil.EMPTY);
+
+                v.setSuppliesSpec(v.getSuppliesSpec() + productSpecUnit + "/" + packageUnit);
+                v.setSuppliesSpecUnit(productSpecUnit);
+                v.setSuppliesUnit(packageUnit);
+            });
+        }
+
+        return TableDataInfo.build(dataList);
+    }
+
     /**
      * 查询符合条件的耗材管理列表
      *

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

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

+ 7 - 0
ruoyi-admin/src/main/resources/mapper/EnteralNutritionConsumableMapper.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.web.mapper.EnteralNutritionConsumableMapper">
+
+</mapper>

+ 7 - 0
ruoyi-admin/src/main/resources/mapper/EnteralNutritionMapper.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.web.mapper.EnteralNutritionMapper">
+
+</mapper>

+ 7 - 0
ruoyi-admin/src/main/resources/mapper/SettlementMapper.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.web.mapper.SettlementMapper">
+
+</mapper>

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

@@ -6,6 +6,12 @@ package org.dromara.common.core.constant;
  **/
 public interface BizConst {
     String PAYMENT_STATUS = "payment_status";
+
+    String PRODUCT_SPEC_UNIT = "product_spec_unit";
+
+    String PRODUCT_PACKAGE_UNIT = "product_package_unit";
+
+    String FEE_TYPE = "fee_type";
     String TREATMENT_USER_TYPE = "treatment_user_type";
 
     String HOSPITAL_ROLE_TYPE = "hospital_role_type";
@@ -34,14 +40,16 @@ public interface BizConst {
 
     String QNY_STATIC_DOMAIN = "static_domain";
 
-    String QNY_CONFIG_CACHE = "qny:config";
+    String QNY_CONFIG_CACHE = "his:qny:config";
 
-    String FOOD_INGREDIENT_CODE = "food:ingredient:code:";
+    String FOOD_INGREDIENT_CODE = "his:food:ingredient:code:";
 
     String FOOD_INGREDIENT_CODE_PREFIX = "SC";
 
     String DATE_PATTERN_FOR_SIMPLE_DAY = "yyMMdd";
 
-    String PATIENT_NUMBER = "patient:number";
+    String PATIENT_NUMBER = "his:patient:number";
+
+    String HIS_SNOW_FLAKE = "his:snowflake";
 
 }

+ 21 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/DelFlag.java

@@ -0,0 +1,21 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+/**
+ * @author chenYing
+ * @date 2025-07-23 14:23:38
+ **/
+@Getter
+public enum DelFlag {
+    NO("0", "未删除"),
+    YES("1", "已删除");
+
+    private String code;
+    private String remark;
+
+    private DelFlag(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}

+ 25 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/FeeType.java

@@ -0,0 +1,25 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+/**
+ * @author chenYing
+ * @date 2025-07-22 10:05:18
+ **/
+@Getter
+public enum FeeType {
+    NUTRITION_SCREENING("0", "营养筛查"),
+    NUTRITION_EVALUATION("1", "营养评估"),
+    PRE_PACKAGED_PRESCRIPTION("2", "预包装处方"),
+    CONFIGURE_PRESCRIPTION("3", "配置处方"),
+    LONG_TERM_PRESCRIPTION("4", "长嘱处方"),
+    IN_HOSPITAL_MEALS("5", "院内膳食");
+
+    private String code;
+    private String remark;
+
+    private FeeType(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}

+ 1 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/PaymentStatus.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/PaymentStatus.java

@@ -1,4 +1,4 @@
-package org.dromara.common.core.enums;
+package org.dromara.common.core.enums.biz;
 
 import lombok.Getter;
 

+ 21 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/PutFlag.java

@@ -0,0 +1,21 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+/**
+ * @author chenYing
+ * @date 2025-07-23 16:13:09
+ **/
+@Getter
+public enum PutFlag {
+    NO("0", "已下架"),
+    YES("1", "已上架");
+
+    private String code;
+    private String remark;
+
+    private PutFlag(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}

+ 38 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/QuestionsList.java

@@ -0,0 +1,38 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+/**
+ * @author chenYing
+ * @date 2025-07-21 13:59:58
+ **/
+@Getter
+public enum QuestionsList {
+    BASE_INFO("baseInfo", "基本信息"),
+    OTHER_INFO("otherInfo", "其它"),
+    ANTHROPOMETRY("anthropometry", "人体测量"),
+    ANTHROPOMETRY_CHILD_ONE("1", "人体测量-人体测量"),
+    ANTHROPOMETRY_CHILD_TWO("2", "人体测量-调查时间"),
+    ANTHROPOMETRY_CHILD_THREE("3", "人体测量-过去体重"),
+    ANTHROPOMETRY_CHILD_FOUR("4", "人体测量-体重变化"),
+    DIETARY_STATUS("dietaryStatus", "膳食状况"),
+    DIETARY_STATUS_CHILD_ONE("1", "膳食状况-膳食状况"),
+    DIETARY_STATUS_CHILD_TWO("2", "膳食状况-食物摄入量"),
+    DIETARY_STATUS_CHILD_THREE("3", "膳食状况-食物摄入种类"),
+    DIETARY_STATUS_CHILD_FOUR("4", "膳食状况-营养素摄入分析"),
+    NUTRITIONAL_BIOCHEMICAL("nutritionalBiochemical", "营养生化检查"),
+    QUESTION_TYPE_SELECTION("questionTypeSelection", "题型选择"),
+    SINGLE_CHOICE("singleChoice", "单选"),
+    MULTIPLE_CHOICE("multipleChoice", "多选"),
+    FILL_BLANKS("fillBlanks", "填空"),
+    SCALE_QUESTIONS("scaleQuestions", "量表"),
+    MATRIX_SCALE("matrixScale", "矩阵");
+
+    private String code;
+    private String remark;
+
+    private QuestionsList(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}

+ 0 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/RedisUtil.java

@@ -40,5 +40,4 @@ public class RedisUtil {
         }
         return prefix + today + StrUtil.padPre(String.valueOf(val), 6, "0");
     }
-
 }

+ 32 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/SnowflakeConfig.java

@@ -0,0 +1,32 @@
+package org.dromara.system.config;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Snowflake;
+import org.dromara.common.core.constant.BizConst;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.util.Date;
+
+/**
+ * @author chenYing
+ * @date 2025-07-22 10:46:19
+ **/
+@Configuration
+public class SnowflakeConfig {
+    private static RedisTemplate redisTemplate;
+
+    public SnowflakeConfig(RedisTemplate redisTemplate) {
+        SnowflakeConfig.redisTemplate = redisTemplate;
+    }
+
+    @Bean
+    public Snowflake createSnowflake() {
+        Long val = redisTemplate.opsForValue().increment(BizConst.HIS_SNOW_FLAKE, 1);
+        long workerId = val / 32 % 32;
+        long dataCenterId = val % 32;
+        return new Snowflake(DateUtil.parseDate("2025-01-01"), workerId, dataCenterId, false);
+    }
+}

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

@@ -92,6 +92,7 @@ public class SysScreeningAssessmentQuestionBo extends BaseEntity {
         private String score;
         private String img;
         private Boolean allowFillBlank;
+        private String matrixFillBlank;
         private String unit;
         private String optionContent;
         private Boolean optionFlag;

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

@@ -99,6 +99,7 @@ public class SysScreeningAssessmentQuestionVo implements Serializable {
         private String score;
         private String img;
         private Boolean allowFillBlank;
+        private String matrixFillBlank;
         private String unit;
         private String optionContent;
         private Boolean optionFlag;

+ 6 - 5
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/NutritionEvaluationServiceImpl.java

@@ -1,11 +1,12 @@
 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.alibaba.fastjson.TypeReference;
 import org.dromara.common.core.constant.BizConst;
-import org.dromara.common.core.enums.PaymentStatus;
+import org.dromara.common.core.enums.biz.PaymentStatus;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -60,7 +61,7 @@ public class NutritionEvaluationServiceImpl implements INutritionEvaluationServi
      * @return 营养评估
      */
     @Override
-    public NutritionEvaluationVo queryById(Long id){
+    public NutritionEvaluationVo queryById(Long id) {
         return baseMapper.selectVoById(id);
     }
 
@@ -149,7 +150,7 @@ public class NutritionEvaluationServiceImpl implements INutritionEvaluationServi
         }
         SysScreeningAssessmentConfigBo configBo = JSON.parseObject(bo.getContent(), new TypeReference<SysScreeningAssessmentConfigBo>() {
         });
-        if (CollUtil.isEmpty(configBo.getOtherInfo())) {
+        if (CollUtil.isEmpty(configBo.getOtherInfo()) && ObjUtil.isEmpty(configBo.getBaseInfo())) {
             throw new ServiceException("没有任何“营养评估”!");
         }
 
@@ -180,7 +181,7 @@ public class NutritionEvaluationServiceImpl implements INutritionEvaluationServi
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(NutritionEvaluation entity){
+    private void validEntityBeforeSave(NutritionEvaluation entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -193,7 +194,7 @@ public class NutritionEvaluationServiceImpl implements INutritionEvaluationServi
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;

+ 27 - 18
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/NutritionScreeningServiceImpl.java

@@ -7,7 +7,8 @@ import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import org.dromara.common.core.constant.BizConst;
-import org.dromara.common.core.enums.PaymentStatus;
+import org.dromara.common.core.enums.biz.PaymentStatus;
+import org.dromara.common.core.enums.biz.QuestionsList;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -157,29 +158,37 @@ public class NutritionScreeningServiceImpl implements INutritionScreeningService
         }
         SysScreeningAssessmentConfigBo configBo = JSON.parseObject(bo.getContent(), new TypeReference<SysScreeningAssessmentConfigBo>() {
         });
-        if (CollUtil.isEmpty(configBo.getOtherInfo())) {
+        if (CollUtil.isEmpty(configBo.getOtherInfo()) && ObjUtil.isEmpty(configBo.getBaseInfo())) {
             throw new ServiceException("没有任何“营养筛查”!");
         }
 
         BigDecimal total = BigDecimal.ZERO;
-        for (SysScreeningAssessmentQuestionBo questionBo : configBo.getOtherInfo()) {
-            if (ObjUtil.isNull(questionBo.getValue())) {
-                continue;
-            }
+        if (CollUtil.isNotEmpty(configBo.getOtherInfo())) {
+            for (SysScreeningAssessmentQuestionBo questionBo : configBo.getOtherInfo()) {
+                if (ObjUtil.isNull(questionBo.getValue())) {
+                    continue;
+                }
 
-            List<Integer> valueList = CollUtil.newArrayList();
-            String obj = String.valueOf(questionBo.getValue());
-            if (NumberUtil.isNumber(obj)) {
-                valueList.add(Integer.valueOf(obj));
-            } else {
-                List objList = (List) questionBo.getValue();
-                objList.forEach(v -> valueList.add(Integer.valueOf(String.valueOf(v))));
-            }
+                List<Integer> valueList = CollUtil.newArrayList();
+                boolean pass = QuestionsList.QUESTION_TYPE_SELECTION.getCode().equals(questionBo.getQuestionType()) ||
+                    (QuestionsList.ANTHROPOMETRY.getCode().equals(questionBo.getQuestionType()) && QuestionsList.ANTHROPOMETRY_CHILD_FOUR.getCode().equals(questionBo.getLastType())) ||
+                    (QuestionsList.DIETARY_STATUS.getCode().equals(questionBo.getQuestionType()) && QuestionsList.DIETARY_STATUS_CHILD_TWO.getCode().equals(questionBo.getLastType()));
+                if (!pass) {
+                    continue;
+                }
+                String obj = String.valueOf(questionBo.getValue());
+                if (NumberUtil.isNumber(obj)) {
+                    valueList.add(Integer.valueOf(obj));
+                } else {
+                    List objList = (List) questionBo.getValue();
+                    objList.forEach(v -> valueList.add(Integer.valueOf(String.valueOf(v))));
+                }
 
-            for (Integer index : valueList) {
-                SysScreeningAssessmentQuestionBo.QuestionAttrBo attrBo = questionBo.getContentList().get(index);
-                if (StrUtil.isNotBlank(attrBo.getScore()) && NumberUtil.isNumber(attrBo.getScore())) {
-                    total = total.add(new BigDecimal(attrBo.getScore()));
+                for (Integer index : valueList) {
+                    SysScreeningAssessmentQuestionBo.QuestionAttrBo attrBo = questionBo.getContentList().get(index);
+                    if (StrUtil.isNotBlank(attrBo.getScore()) && NumberUtil.isNumber(attrBo.getScore())) {
+                        total = total.add(new BigDecimal(attrBo.getScore()));
+                    }
                 }
             }
         }

+ 110 - 16
script/sql/biz/create.sql

@@ -242,17 +242,17 @@ CREATE TABLE `nutrition_screening` (
     `patient_no` varchar(50) NOT NULL COMMENT '门诊/住院号',
     `screening_score` decimal(5,2) DEFAULT NULL COMMENT '营养筛查分数',
     `screening_conclusion` varchar(500) DEFAULT NULL COMMENT '营养筛查结论',
-    `payment_status` varchar(20) DEFAULT '未支付' COMMENT '支付状态(未支付/已支付/已退款)',
+    `payment_status` varchar(20)  COMMENT '支付状态(未支付/已支付/已退款)',
     `content` longtext 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 '更新时间'
+    `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 COLLATE=utf8mb4_unicode_ci COMMENT='营养筛查表';
 
 
@@ -265,15 +265,109 @@ CREATE TABLE `nutrition_evaluation` (
     `screening_time` datetime NOT NULL COMMENT '筛查时间',
     `visit_type` char(1) NOT NULL COMMENT '看诊类型(0门诊 1住院)',
     `patient_no` varchar(50) NOT NULL COMMENT '门诊/住院号',
-    `payment_status` varchar(20) DEFAULT '未支付' COMMENT '支付状态(未支付/已支付/已退款)',
+    `payment_status` varchar(20)  COMMENT '支付状态(未支付/已支付/已退款)',
     `content` longtext  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 '更新时间'
+    `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 COLLATE=utf8mb4_unicode_ci COMMENT='营养评估表';
+
+
+CREATE TABLE `settlement` (
+    `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+    `tenant_id`  varchar(20) default '000000' null comment '租户编号',
+    `order_time` DATETIME COMMENT '开单时间',
+    `visit_type` VARCHAR(32) COMMENT '看诊类型',
+    `charge_type` VARCHAR(32) COMMENT '收费类型',
+    `patient_id` bigint(20) DEFAULT NULL COMMENT '患者ID',
+    `patient_name` VARCHAR(64) COMMENT '患者姓名',
+    `door_id` bigint null comment '患者科室',
+    `patient_no` VARCHAR(32) COMMENT '门诊/住院号',
+    `phone` VARCHAR(32) COMMENT '联系电话',
+    `id_card` VARCHAR(32) COMMENT '身份证号',
+    `receivable_amount` DECIMAL(10,2) COMMENT '应收金额',
+    `payment_status` varchar(20)   COMMENT '支付状态(未支付/已支付/已退款)',
+    `payment_method` CHAR(1) COMMENT '支付方式',
+    `stop_date` DATE 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 COLLATE=utf8mb4_unicode_ci COMMENT='结算管理';
+
+
+CREATE TABLE `enteral_nutrition` (
+    `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+    `tenant_id`  varchar(20) default '000000' null comment '租户编号',
+    `settlement_id` BIGINT COMMENT '结算管理id',
+    `prescription_date` DATE COMMENT '开方日期',
+    `group_no` VARCHAR(32) COMMENT '组号',
+    `nutrition_product_id` BIGINT COMMENT '营养产品',
+    `nutrition_product` VARCHAR(64) COMMENT '营养产品',
+    `stop_date` DATE COMMENT '停嘱日期',
+    `prescription_type` VARCHAR(32) COMMENT '处方类型',
+    `quantity` INT COMMENT '数量',
+    `dose_per_time` DECIMAL(10,4) COMMENT '用量/次',
+    `meal_time` VARCHAR(64) COMMENT '餐次时间',
+    `frequency` INT COMMENT '频次',
+    `first_day` INT COMMENT '首日',
+    `dose_per_day` DECIMAL(10,4) COMMENT '用量/日',
+    `usage_days` INT COMMENT '使用天数',
+    `total_dose` DECIMAL(10,4) COMMENT '用量/总',
+    `specification` VARCHAR(64) COMMENT '规格',
+    `usage` CHAR(2) COMMENT '用法',
+    `preparation_volume_per_time` DECIMAL(10,4) COMMENT '制剂液量/次',
+    `preparation_concentration_per_time` DECIMAL(10,4) COMMENT '制剂浓度/次',
+    `energy_density_per_time` DECIMAL(10,4) COMMENT '能量密度/次',
+    `prescription_remark` VARCHAR(255) COMMENT '处方备注',
+    `daily_calories` DECIMAL(10,4) COMMENT '每日热量',
+    `amount` DECIMAL(10,2) 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 COLLATE=utf8mb4_unicode_ci COMMENT='肠内营养';
+
+
+CREATE TABLE `enteral_nutrition_consumable` (
+    `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
+    `tenant_id`  varchar(20) default '000000' null comment '租户编号',
+    `settlement_id` BIGINT COMMENT '结算管理id',
+    `group_no` VARCHAR(32) COMMENT '组号',
+    `consumable_id` BIGINT COMMENT '耗材',
+    `consumable` VARCHAR(64) COMMENT '耗材',
+    `specification` VARCHAR(64) COMMENT '规格',
+    `dose_per_time` DECIMAL(10,4) COMMENT '用量/次',
+    `frequency` INT COMMENT '频次',
+    `dose_per_day` DECIMAL(10,4) COMMENT '用量/日',
+    `usage_days` INT COMMENT '使用天数',
+    `first_day` INT COMMENT '首日',
+    `quantity` INT COMMENT '数量',
+    `prescription_remark` VARCHAR(255) COMMENT '处方备注',
+    `amount` DECIMAL(10,2) 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 COLLATE=utf8mb4_unicode_ci COMMENT='肠内营养耗材';