Browse Source

Merge remote-tracking branch 'origin/main'

# Conflicts:
#	ruoyi-admin/src/main/java/org/dromara/web/service/impl/ChargeRecordServiceImpl.java
Huanyi 2 months ago
parent
commit
9e711f49fc
45 changed files with 2603 additions and 137 deletions
  1. 44 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/EnteralNutritionController.java
  2. 42 1
      ruoyi-admin/src/main/java/org/dromara/web/controller/HospitalMealPlanController.java
  3. 106 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/PatientAccountController.java
  4. 8 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/SettlementController.java
  5. 72 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/ChargeRecordLog.java
  6. 22 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/EnteralNutrition.java
  7. 3 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/HospitalMealPlan.java
  8. 21 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/HospitalMealRecipe.java
  9. 156 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/PatientAccount.java
  10. 64 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/ChargeRecordLogBo.java
  11. 35 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EnteralNutritionBo.java
  12. 2 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/HospitalMealPlanBo.java
  13. 25 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/HospitalMealRecipeBo.java
  14. 148 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/PatientAccountBo.java
  15. 80 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/ChargeRecordLogVo.java
  16. 16 1
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/ChargeRecordVo.java
  17. 111 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionQueryOneVo.java
  18. 3 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionQueryVo.java
  19. 37 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionVo.java
  20. 117 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/HospitalMealPlanQueryVo.java
  21. 3 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/HospitalMealPlanVo.java
  22. 31 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/HospitalMealRecipeVo.java
  23. 172 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/PatientAccountVo.java
  24. 13 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/SettlementVo.java
  25. 18 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/ChargeRecordLogMapper.java
  26. 98 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/EnteralNutritionMapper.java
  27. 102 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/HospitalMealPlanMapper.java
  28. 18 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/PatientAccountMapper.java
  29. 2 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/SettlementMapper.java
  30. 19 0
      ruoyi-admin/src/main/java/org/dromara/web/service/IEnteralNutritionService.java
  31. 24 1
      ruoyi-admin/src/main/java/org/dromara/web/service/IHospitalMealPlanService.java
  32. 69 0
      ruoyi-admin/src/main/java/org/dromara/web/service/IPatientAccountService.java
  33. 148 10
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/ChargeRecordServiceImpl.java
  34. 209 70
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/EnteralNutritionServiceImpl.java
  35. 240 33
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/HospitalMealPlanServiceImpl.java
  36. 140 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/PatientAccountServiceImpl.java
  37. 64 20
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/SettlementServiceImpl.java
  38. 23 1
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/TreatmentUserServiceImpl.java
  39. 7 0
      ruoyi-admin/src/main/resources/mapper/PatientAccountMapper.xml
  40. 6 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/BizConst.java
  41. 17 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/ActionStatus.java
  42. 17 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/ConfigStatus.java
  43. 17 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/ExecuteStatus.java
  44. 17 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/MakeStatus.java
  45. 17 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/PrintStatus.java

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

@@ -18,6 +18,7 @@ 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.EnteralNutritionQueryOneVo;
 import org.dromara.web.domain.vo.EnteralNutritionQueryVo;
 import org.dromara.web.domain.vo.EnteralNutritionVo;
 import org.dromara.web.service.IEnteralNutritionService;
@@ -58,6 +59,49 @@ public class EnteralNutritionController extends BaseController {
     }
 
 
+    /**
+     * 查询处方信息列表
+     */
+    @SaCheckPermission("system:nutrition:list")
+    @GetMapping("/enteralNutritionList")
+    public TableDataInfo<EnteralNutritionQueryOneVo> enteralNutritionList(EnteralNutritionBo bo, PageQuery pageQuery) {
+        return enteralNutritionService.queryEnteralNutritionPageList(bo, pageQuery);
+    }
+
+    @SaCheckPermission("system:nutrition:query")
+    @GetMapping("/getBySettlementId")
+    public R<List<EnteralNutritionVo>> getBySettlementId(@RequestParam Long settlementId) {
+        return R.ok(enteralNutritionService.queryBySettlementId(settlementId));
+    }
+
+    @SaCheckPermission("system:nutrition:query")
+    @GetMapping("/queryById")
+    public R<List<EnteralNutritionVo>> queryById(@RequestParam String ids) {
+        return enteralNutritionService.queryById(ids);
+    }
+
+   /*手动配置*/
+    @SaCheckPermission("system:nutrition:edit")
+    @GetMapping("/manualConfig")
+    public R manualConfig(@RequestParam String ids) {
+      return enteralNutritionService.manualConfig(ids);
+    }
+
+    /*执行操作*/
+    @SaCheckPermission("system:nutrition:edit")
+    @GetMapping("/execute")
+    public R execute(@RequestParam String ids) {
+       return enteralNutritionService.execute(ids);
+    }
+
+    /*打印标签*/
+    @SaCheckPermission("system:nutrition:edit")
+    @GetMapping("/tagPrint")
+    public R tagPrint(@RequestParam String ids) {
+        return enteralNutritionService.tagPrint(ids);
+    }
+
+
     /**
      * 查询营养评估列表
      */

+ 42 - 1
ruoyi-admin/src/main/java/org/dromara/web/controller/HospitalMealPlanController.java

@@ -6,8 +6,9 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.web.domain.bo.EnteralNutritionBo;
 import org.dromara.web.domain.bo.HospitalMealPlanBo;
-import org.dromara.web.domain.vo.HospitalMealPlanVo;
+import org.dromara.web.domain.vo.*;
 import org.dromara.web.service.IHospitalMealPlanService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
@@ -103,4 +104,44 @@ public class HospitalMealPlanController extends BaseController {
                           @PathVariable Long[] ids) {
         return toAjax(hospitalMealPlanService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    /**
+     * 查询膳食处方信息列表
+     */
+    @SaCheckPermission("patients:hospitalMealPlan:list")
+    @GetMapping("/makeRecipeList")
+    public TableDataInfo<HospitalMealPlanQueryVo> queryMakeRecipeListList(EnteralNutritionBo bo, PageQuery pageQuery) {
+        return hospitalMealPlanService.queryHospitalMealPlanList(bo, pageQuery);
+    }
+    @SaCheckPermission("patients:hospitalMealPlan:query")
+    @GetMapping("/getBySettlementId")
+    public R<List<HospitalMealRecipeVo>> getBySettlementId(@RequestParam Long settlementId) {
+        return R.ok(hospitalMealPlanService.queryBySettlementId(settlementId));
+    }
+    @SaCheckPermission("patients:hospitalMealPlan:query")
+    @GetMapping("/queryById")
+    public R<List<HospitalMealRecipeVo>> queryById(@RequestParam String ids) {
+        return hospitalMealPlanService.queryById(ids);
+    }
+
+    /*手动配置*/
+    @SaCheckPermission("patients:hospitalMealPlan:edit")
+    @GetMapping("/manualConfig")
+    public R manualConfig(@RequestParam String ids) {
+        return hospitalMealPlanService.manualConfig(ids);
+    }
+
+    /*执行操作*/
+    @SaCheckPermission("patients:hospitalMealPlan:edit")
+    @GetMapping("/execute")
+    public R execute(@RequestParam String ids) {
+        return hospitalMealPlanService.execute(ids);
+    }
+
+    /*打印标签*/
+    @SaCheckPermission("patients:hospitalMealPlan:edit")
+    @GetMapping("/tagPrint")
+    public R tagPrint(@RequestParam String ids) {
+        return hospitalMealPlanService.tagPrint(ids);
+    }
 }

+ 106 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/PatientAccountController.java

@@ -0,0 +1,106 @@
+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.PatientAccountBo;
+import org.dromara.web.domain.vo.PatientAccountVo;
+import org.dromara.web.service.IPatientAccountService;
+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-08-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/settlement/accountSettleAccounts")
+public class PatientAccountController extends BaseController {
+
+    private final IPatientAccountService patientAccountService;
+
+    /**
+     * 查询患者账户信息列表
+     */
+    @SaCheckPermission("settlement:accountSettleAccounts:list")
+    @GetMapping("/list")
+    public TableDataInfo<PatientAccountVo> list(PatientAccountBo bo, PageQuery pageQuery) {
+        return patientAccountService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出患者账户信息列表
+     */
+    @SaCheckPermission("settlement:accountSettleAccounts:export")
+    @Log(title = "患者账户信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(PatientAccountBo bo, HttpServletResponse response) {
+        List<PatientAccountVo> list = patientAccountService.queryList(bo);
+        ExcelUtil.exportExcel(list, "患者账户信息", PatientAccountVo.class, response);
+    }
+
+    /**
+     * 获取患者账户信息详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("settlement:accountSettleAccounts:query")
+    @GetMapping("/{id}")
+    public R<PatientAccountVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(patientAccountService.queryById(id));
+    }
+
+    /**
+     * 新增患者账户信息
+     */
+    @SaCheckPermission("settlement:accountSettleAccounts:add")
+    @Log(title = "患者账户信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody PatientAccountBo bo) {
+        return toAjax(patientAccountService.insertByBo(bo));
+    }
+
+    /**
+     * 修改患者账户信息
+     */
+    @SaCheckPermission("settlement:accountSettleAccounts:edit")
+    @Log(title = "患者账户信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PatientAccountBo bo) {
+        return toAjax(patientAccountService.updateByBo(bo));
+    }
+
+    /**
+     * 删除患者账户信息
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("settlement:accountSettleAccounts:remove")
+    @Log(title = "患者账户信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(patientAccountService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

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

@@ -96,6 +96,14 @@ public class SettlementController extends BaseController {
         return toAjax(settlementService.insertByBo(bo));
     }
 
+    @SaCheckPermission("system:settlement:add")
+    @Log(title = "结算管理", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/addChargeRecord")
+    public R<Void> addChargeRecord(@Validated(AddGroup.class) @RequestBody SettlementBo bo) {
+        return toAjax(settlementService.insertByBo(bo));
+    }
+
     /**
      * 修改结算管理
      */

+ 72 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/ChargeRecordLog.java

@@ -0,0 +1,72 @@
+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;
+
+/**
+ * 收费操作记录对象 charge_record_log
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("charge_record_log")
+public class ChargeRecordLog extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 收费记录id
+     */
+    private Long chargeRecordId;
+
+    /**
+     * 交易处方id
+     */
+    private Long settlementId;
+
+    /**
+     * 身份证号
+     */
+    private String productName;
+
+    /**
+     * 操作
+     */
+    private String paymentMethod;
+
+    /**
+     * 交易金额
+     */
+    private Long receivableAmount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 交易状态
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

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

@@ -4,6 +4,9 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 
@@ -150,4 +153,23 @@ public class EnteralNutrition extends TenantEntity {
      * 删除标志(0代表存在 1代表删除)
      */
     private String delFlag;
+
+    /*配置状态 0 未配置 1已配置*/
+    private String configStatus;
+
+    private Date configTime;
+
+    private Long configBy;
+
+    /*执行状态 0 未执行 1已执行*/
+    private String executeStatus;
+
+    private LocalDate executeDate;
+
+    private LocalTime executeTime;
+
+    private Long executeBy;
+
+    /*标签打印数量*/
+    private Integer tagPrintNum;
 }

+ 3 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/HospitalMealPlan.java

@@ -31,6 +31,9 @@ public class HospitalMealPlan extends TenantEntity {
     @TableId(value = "id")
     private Long id;
 
+    /*结算管理Id*/
+    private Long settlementId;
+
     /**
      * 看诊类型
      */

+ 21 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/HospitalMealRecipe.java

@@ -4,6 +4,9 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 
@@ -95,5 +98,23 @@ public class HospitalMealRecipe extends TenantEntity {
     @TableLogic
     private String delFlag;
 
+    /*制餐状态 0 未配餐 1已配餐*/
+    private String makeStatus;
+
+    private Date makeTime;
+
+    private Long makeBy;
+
+    /*执行状态 0 未执行 1已执行*/
+    private String executeStatus;
+
+    private LocalDate executeDate;
+
+    private LocalTime executeTime;
+
+    private Long executeBy;
+
+    /*标签打印数量*/
+    private Integer tagPrintNum;
 
 }

+ 156 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/PatientAccount.java

@@ -0,0 +1,156 @@
+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;
+
+/**
+ * 患者账户信息对象 patient_account
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("patient_account")
+public class PatientAccount extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 患者ID
+     */
+    private Long patientId;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 患者病例ID
+     */
+    private Long patientCaseId;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 性别:1-男,2-女
+     */
+    private Long sex;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 账户
+     */
+    private String serialNo;
+
+    /**
+     * 账户余额
+     */
+    private Long totalAmount;
+
+    /**
+     * 账户充值
+     */
+    private Long totalIncome;
+
+    /**
+     * 账户消费
+     */
+    private Long totalExpand;
+
+    /**
+     * 待缴金额
+     */
+    private Long unpaidAmount;
+
+    /**
+     * 可用金额
+     */
+    private Long availableAmount;
+
+    /**
+     * 授信金额
+     */
+    private Long creditAmount;
+
+    /**
+     * 可用授信额度
+     */
+    private Long creditLimit;
+
+    /**
+     * 状态:0-正常,1-禁用
+     */
+    private Long status;
+
+    /**
+     * 激活状态:0-未激活,1-已激活
+     */
+    private Long activated;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private Long delFlag;
+
+    /**
+     * 待处理事项
+     */
+    private String waitingTask;
+
+    /**
+     * 患者科室
+     */
+    private Long doorId;
+
+    /**
+     * 门诊/住院号
+     */
+    private String patientNo;
+
+    /**
+     * 病区
+     */
+    private Long wardId;
+
+    /**
+     * 病区名称
+     */
+    private String wardName;
+
+    private String deptName;
+
+    /**
+     * 诊疗卡号
+     */
+    private String treatNum;
+
+    private String visitType;
+
+
+}

+ 64 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/ChargeRecordLogBo.java

@@ -0,0 +1,64 @@
+package org.dromara.web.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.web.domain.ChargeRecordLog;
+
+/**
+ * 收费操作记录业务对象 charge_record_log
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ChargeRecordLog.class, reverseConvertGenerate = false)
+public class ChargeRecordLogBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 收费记录id
+     */
+    private Long chargeRecordId;
+
+    /**
+     * 交易处方id
+     */
+    private Long settlementId;
+
+    /**
+     * 身份证号
+     */
+    private String productName;
+
+    /**
+     * 操作
+     */
+    private String paymentMethod;
+
+    /**
+     * 交易金额
+     */
+    private Long receivableAmount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 交易状态
+     */
+    private String status;
+
+
+}

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

@@ -9,6 +9,8 @@ import jakarta.validation.constraints.*;
 import org.dromara.web.domain.EnteralNutrition;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.Date;
 import java.util.List;
 
@@ -145,5 +147,38 @@ public class EnteralNutritionBo extends BaseEntity {
      */
     private String status;
 
+    /*配置状态 0 未配置 1已配置*/
+    private String configStatus;
+
+    private String makeStatus;
+
+    private String paymentStatus;
+
+    private Date configTime;
+
+    private Long configBy;
+
+    /*执行状态 0 未执行 1已执行*/
+    private String executeStatus;
+
+    private LocalDate executeDate;
+
+    private LocalTime executeTime;
+
+    private Long executeBy;
+
+    /*标签打印数量*/
+    private Integer tagPrintNum;
+
     private List<EnteralNutritionBo> products;
+
+    private Long doorId;
+
+    private String visitType;
+
+    private Long wardId;
+
+    List<Date>executeDateRange;
+
+    List<Date>prescriptionDateRange;
 }

+ 2 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/HospitalMealPlanBo.java

@@ -32,6 +32,8 @@ public class HospitalMealPlanBo extends BaseEntity {
     @NotNull(message = "主键不能为空", groups = {EditGroup.class})
     private Long id;
 
+    private Long settlementId;
+
     /**
      * 看诊类型
      */

+ 25 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/HospitalMealRecipeBo.java

@@ -8,6 +8,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
 
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.Date;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -93,5 +95,28 @@ public class HospitalMealRecipeBo extends BaseEntity {
      */
     private Long price;
 
+    /*制餐状态 0 未配餐 1已配餐*/
+    private String makeStatus;
+
+    private Date makeTime;
+
+    private Long makeBy;
+
+    /*执行状态 0 未执行 1已执行*/
+    private String executeStatus;
+
+    private LocalDate executeDate;
+
+    private LocalTime executeTime;
+
+    private Long executeBy;
+
+    /*标签打印数量*/
+    private Integer tagPrintNum;
+
+    private String makeByName;
+
+    private String executeByName;
+
 
 }

+ 148 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/PatientAccountBo.java

@@ -0,0 +1,148 @@
+package org.dromara.web.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.web.domain.PatientAccount;
+
+/**
+ * 患者账户信息业务对象 patient_account
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PatientAccount.class, reverseConvertGenerate = false)
+public class PatientAccountBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 患者ID
+     */
+    private Long patientId;
+
+    /**
+     * 患者姓名
+     */
+    private String patientName;
+
+    /**
+     * 患者病例ID
+     */
+    private Long patientCaseId;
+
+    /**
+     * 患者科室
+     */
+    private Long doorId;
+
+    /**
+     * 门诊/住院号
+     */
+    private String patientNo;
+
+    /**
+     * 病区
+     */
+    private Long wardId;
+
+    /**
+     * 病区名称
+     */
+    private String wardName;
+
+    private String deptName;
+
+    /**
+     * 诊疗卡号
+     */
+    private String treatNum;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 性别:1-男,2-女
+     */
+    private Long sex;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 账户
+     */
+    private String serialNo;
+
+    /**
+     * 账户余额
+     */
+    private Long totalAmount;
+
+    /**
+     * 账户充值
+     */
+    private Long totalIncome;
+
+    /**
+     * 账户消费
+     */
+    private Long totalExpand;
+
+    /**
+     * 待缴金额
+     */
+    private Long unpaidAmount;
+
+    /**
+     * 可用金额
+     */
+    private Long availableAmount;
+
+    /**
+     * 授信金额
+     */
+    private Long creditAmount;
+
+    /**
+     * 可用授信额度
+     */
+    private Long creditLimit;
+
+    /**
+     * 状态:0-正常,1-禁用
+     */
+    private Long status;
+
+    /**
+     * 激活状态:0-未激活,1-已激活
+     */
+    private Long activated;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 待处理事项
+     */
+    private String waitingTask;
+
+    private String visitType;
+
+
+}

+ 80 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/ChargeRecordLogVo.java

@@ -0,0 +1,80 @@
+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.web.domain.ChargeRecordLog;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 收费操作记录视图对象 charge_record_log
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ChargeRecordLog.class)
+public class ChargeRecordLogVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 收费记录id
+     */
+    @ExcelProperty(value = "收费记录id")
+    private Long chargeRecordId;
+
+    /**
+     * 交易处方id
+     */
+    @ExcelProperty(value = "交易处方id")
+    private Long settlementId;
+
+
+    private String productName;
+
+    /**
+     * 操作
+     */
+    @ExcelProperty(value = "操作")
+    private String paymentMethod;
+
+    /**
+     * 交易金额
+     */
+    @ExcelProperty(value = "交易金额")
+    private Long receivableAmount;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 交易状态
+     */
+    @ExcelProperty(value = "交易状态")
+    private String status;
+
+    private Date createTime;
+
+    private Long createBy;
+
+    private String createByName;
+
+
+}

+ 16 - 1
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/ChargeRecordVo.java

@@ -1,5 +1,6 @@
 package org.dromara.web.domain.vo;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
@@ -13,7 +14,7 @@ import org.dromara.web.domain.ChargeRecord;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
-
+import java.util.List;
 
 
 /**
@@ -171,6 +172,20 @@ public class ChargeRecordVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    /*营养配置费用*/
+    private BigDecimal prescriptionFee;
+
+    private List<HospitalMealRecipeVo>hospitalMealRecipeList;
+
+    /*肠内营养*/
+    private List<EnteralNutritionVo> enteralNutritionList;
+    /*营养筛查数据*/
+    private List<NutritionScreeningVo> nutritionScreeningList;
+    /*营养评估数据*/
+    private List<NutritionEvaluationVo> nutritionEvaluationList;
+
+    private List<ChargeRecordLogVo> recordLogList;
+
     private Date createTime;
 
 }

+ 111 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/EnteralNutritionQueryOneVo.java

@@ -0,0 +1,111 @@
+package org.dromara.web.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.web.domain.EnteralNutrition;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ *
+ * @author Lion Li
+ * @date 2025-08-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = EnteralNutrition.class)
+public class EnteralNutritionQueryOneVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    /**
+     * 结算管理id
+     */
+    private Long settlementId;
+
+    private Date orderTime;
+
+    private String chargeType;
+
+    private String chargeTypeMame;
+
+    private String paymentStatus;
+
+    private String createByName;
+
+    private Boolean stopFlag;
+
+    private Boolean delFlag;
+
+    /*处方明细*/
+    private String productName;
+
+    private Date prescriptionDate;
+
+    private String groupNo;
+
+    private Date stopDate;
+
+    private LocalDate executeDate;
+
+    private LocalTime executeTime;
+
+    private String nutritionProduct;
+
+    private String executeStatus;
+
+    private long executeBy;
+
+    private String executeByName;
+
+    private Integer tagPrintNum;
+
+    private String configStatus;
+
+    private Date configTime;
+
+    private Long configBy;
+
+    private String configByName;
+
+    private String patientDepartment;
+
+    private String patientNo;
+
+    private String idCard;
+
+    private String visitType;
+
+    private String bedNo;
+
+    private String wardName;
+
+    private String treatNum;
+
+    private String idStr;
+
+    private String mealTime;
+
+    private Long patientId;
+
+    private String patientName;
+
+
+    /**
+     * 状态(0正常 1停用 2草稿)
+     */
+    private String status;
+
+
+
+}

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

@@ -50,6 +50,9 @@ public class EnteralNutritionQueryVo implements Serializable {
 
     private Boolean delFlag;
 
+    /*处方明细*/
+    private String productName;
+
     /**
      * 状态(0正常 1停用 2草稿)
      */

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

@@ -1,5 +1,8 @@
 package org.dromara.web.domain.vo;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.Date;
 
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
@@ -9,6 +12,7 @@ import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import org.dromara.web.domain.EnteralNutrition;
+import org.dromara.web.domain.TreatmentUser;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -52,6 +56,8 @@ public class EnteralNutritionVo implements Serializable {
     @ExcelProperty(value = "组号")
     private String groupNo;
 
+    private Long nutritionProductId;
+
     /**
      * 营养产品
      */
@@ -180,4 +186,35 @@ public class EnteralNutritionVo implements Serializable {
 
     private String createByName;
 
+    private BigDecimal salePrice;
+
+    /*配置状态 0 未配置 1已配置*/
+    private String configStatus;
+
+    private Date configTime;
+
+    private Long configBy;
+
+    /*执行状态 0 未执行 1已执行*/
+    private String executeStatus;
+
+    private LocalDate executeDate;
+
+    private LocalTime executeTime;
+
+    private Long executeBy;
+
+    /*标签打印数量*/
+    private Integer tagPrintNum;
+
+    private String configByName;
+
+    private String executeByName;
+
+    private String paymentStatus;
+
+    private String idStr;
+
+    private TreatmentUser patient;
+
 }

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

@@ -0,0 +1,117 @@
+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.web.domain.HospitalMealPlan;
+import org.dromara.web.domain.HospitalMealRecipe;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.sql.Time;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 院内膳食主视图对象 hospital_meal_plan
+ *
+ * @author Lion Li
+ * @date 2025-07-23
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = HospitalMealRecipe.class)
+public class HospitalMealPlanQueryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    /**
+     * 结算管理id
+     */
+    private Long settlementId;
+
+    private Date orderTime;
+
+    private String chargeType;
+
+    private String chargeTypeMame;
+
+    private String paymentStatus;
+
+    private String createByName;
+
+    private Boolean stopFlag;
+
+    private Boolean delFlag;
+
+    /*处方明细*/
+    private String productName;
+
+    private Date prescriptionDate;
+
+    private String recipeNo;
+
+    private LocalDate executeDate;
+
+    private LocalTime executeTime;
+
+    private String nutritionProduct;
+
+    private String executeStatus;
+
+    private long executeBy;
+
+    private String executeByName;
+
+    private Integer tagPrintNum;
+
+    private String makeStatus;
+
+    private Date makeTime;
+
+    private Long makeBy;
+
+    private String makeByName;
+
+    private String patientDepartment;
+
+    private String patientNo;
+
+    private String idCard;
+
+    private String visitType;
+
+    private String bedNo;
+
+    private String wardName;
+
+    private String treatNum;
+
+    private String idStr;
+
+    private String mealTime;
+
+    private Long patientId;
+
+    private String patientName;
+
+    private Date eatTime;
+
+    private LocalDate recommendStartDate;
+
+    private LocalDate recommendEndDate;
+
+    /**
+     * 状态(0正常 1停用 2草稿)
+     */
+    private String status;
+
+
+}

+ 3 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/HospitalMealPlanVo.java

@@ -38,6 +38,9 @@ public class HospitalMealPlanVo implements Serializable {
     @ExcelProperty(value = "主键")
     private Long id;
 
+    /*结算管理Id*/
+    private Long settlementId;
+
     /**
      * 看诊类型
      */

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

@@ -1,5 +1,7 @@
 package org.dromara.web.domain.vo;
 
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
@@ -9,6 +11,7 @@ import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import org.dromara.web.domain.HospitalMealRecipe;
+import org.dromara.web.domain.TreatmentUser;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -108,5 +111,33 @@ public class HospitalMealRecipeVo implements Serializable {
     @ExcelProperty(value = "金额")
     private Long price;
 
+    /*制餐状态 0 未配餐 1已配餐*/
+    private String makeStatus;
+
+    private Date makeTime;
+
+    private Long makeBy;
+
+    /*执行状态 0 未执行 1已执行*/
+    private String executeStatus;
+
+    private LocalDate executeDate;
+
+    private LocalTime executeTime;
+
+    private Long executeBy;
+
+    /*标签打印数量*/
+    private Integer tagPrintNum;
+
+    private String makeByName;
+
+    private String executeByName;
+
+    private Long createBy;
+
+    private String createByName;
+
+    private String idStr;
 
 }

+ 172 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/PatientAccountVo.java

@@ -0,0 +1,172 @@
+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.web.domain.PatientAccount;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+/**
+ * 患者账户信息视图对象 patient_account
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PatientAccount.class)
+public class PatientAccountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 患者ID
+     */
+    @ExcelProperty(value = "患者ID")
+    private Long patientId;
+
+    /**
+     * 患者姓名
+     */
+    @ExcelProperty(value = "患者姓名")
+    private String patientName;
+
+    /**
+     * 患者病例ID
+     */
+    @ExcelProperty(value = "患者病例ID")
+    private Long patientCaseId;
+
+    /**
+     * 身份证号
+     */
+    @ExcelProperty(value = "身份证号")
+    private String idCard;
+
+    /**
+     * 性别:1-男,2-女
+     */
+    @ExcelProperty(value = "性别:1-男,2-女")
+    private Long sex;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phone;
+
+    /**
+     * 账户
+     */
+    @ExcelProperty(value = "账户")
+    private String serialNo;
+
+    /**
+     * 账户余额
+     */
+    @ExcelProperty(value = "账户余额")
+    private Long totalAmount;
+
+    /**
+     * 账户充值
+     */
+    @ExcelProperty(value = "账户充值")
+    private Long totalIncome;
+
+    /**
+     * 账户消费
+     */
+    @ExcelProperty(value = "账户消费")
+    private Long totalExpand;
+
+    /**
+     * 待缴金额
+     */
+    @ExcelProperty(value = "待缴金额")
+    private Long unpaidAmount;
+
+    /**
+     * 可用金额
+     */
+    @ExcelProperty(value = "可用金额")
+    private Long availableAmount;
+
+    /**
+     * 授信金额
+     */
+    @ExcelProperty(value = "授信金额")
+    private Long creditAmount;
+
+    /**
+     * 可用授信额度
+     */
+    @ExcelProperty(value = "可用授信额度")
+    private Long creditLimit;
+
+    /**
+     * 状态:0-正常,1-禁用
+     */
+    @ExcelProperty(value = "状态:0-正常,1-禁用")
+    private Long status;
+
+    /**
+     * 激活状态:0-未激活,1-已激活
+     */
+    @ExcelProperty(value = "激活状态:0-未激活,1-已激活")
+    private Long activated;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 待处理事项
+     */
+    @ExcelProperty(value = "待处理事项")
+    private String waitingTask;
+
+    /**
+     * 患者科室
+     */
+    private Long doorId;
+
+    /**
+     * 门诊/住院号
+     */
+    private String patientNo;
+
+    /**
+     * 病区
+     */
+    private Long wardId;
+
+    /**
+     * 病区名称
+     */
+    private String wardName;
+
+    private String deptName;
+
+    /**
+     * 诊疗卡号
+     */
+    private String treatNum;
+
+    private String visitType;
+
+
+}

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

@@ -1,5 +1,7 @@
 package org.dromara.web.domain.vo;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.Date;
 
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
@@ -144,6 +146,17 @@ public class SettlementVo implements Serializable {
     private String updateByUser;
 
     private String remark;
+
+    private Date recommendStartDate;
+
+    private Date recommendEndDate;
+
+    /*营养配置费用*/
+    private BigDecimal prescriptionFee;
+
+    /*院内膳食*/
+    List<HospitalMealRecipeVo> hospitalMealRecipeList;
+
     /*肠内营养*/
     private List<EnteralNutritionVo> enteralNutritionList;
     /*营养筛查数据*/

+ 18 - 0
ruoyi-admin/src/main/java/org/dromara/web/mapper/ChargeRecordLogMapper.java

@@ -0,0 +1,18 @@
+package org.dromara.web.mapper;
+
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.web.domain.ChargeRecordLog;
+import org.dromara.web.domain.vo.ChargeRecordLogVo;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 收费操作记录Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+@Repository
+public interface ChargeRecordLogMapper extends BaseMapperPlus<ChargeRecordLog, ChargeRecordLogVo> {
+
+}

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

@@ -1,7 +1,10 @@
 package org.dromara.web.mapper;
 
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.web.domain.EnteralNutrition;
+import org.dromara.web.domain.vo.EnteralNutritionQueryOneVo;
 import org.dromara.web.domain.vo.EnteralNutritionVo;
 
 import java.util.List;
@@ -13,4 +16,99 @@ import java.util.List;
  * @date 2025-07-22
  */
 public interface EnteralNutritionMapper extends BaseMapperPlus<EnteralNutrition, EnteralNutritionVo> {
+
+    @Select("<script>" +
+        "SELECT " +
+        "   MIN(en.id) AS id, " +
+        "   en.settlement_id AS settlementId, " +
+        "   GROUP_CONCAT(DISTINCT en.id) AS idStr, " +
+        "   GROUP_CONCAT(DISTINCT en.nutrition_product) AS productName, " +
+        "   MIN(en.prescription_date) AS prescriptionDate, " +
+        "   en.group_no AS groupNo, " +
+        "   MIN(en.execute_date) AS executeDate, " +
+        "   MIN(en.meal_time) AS mealTime, " +
+        "   MIN(en.execute_time) AS executeTime, " +
+        "   MIN(se.payment_status) AS paymentStatus, " +
+        "   MIN(en.execute_status) AS executeStatus, " +
+        "   MIN(en.stop_date) AS stopDate, " +
+        "   MIN(en.config_status) AS configStatus, " +
+        "   MIN(en.config_time) AS configTime, " +
+        "   MIN(en.config_by) AS configBy, " +
+        "   MIN(en.execute_by) AS executeBy, " +
+        "   MIN(en.tag_print_num) AS tagPrintNum, " +
+        "   MIN(sd.dept_name) AS patientDepartment, " +
+        "   MIN(se.visit_type) AS visitType, " +
+        "   MIN(tu.id_card) AS idCard, " +
+        "   MIN(tu.outpatient_no) AS patientNo, " +
+        "   MIN(tu.bed_no) AS bedNo, " +
+        "   MIN(tu.ward_name) AS wardName, " +
+        "   MIN(tu.treat_num) AS treatNum, " +
+        "   MIN(su.user_name) AS configByName, " +
+        "   MIN(syu.user_name) AS executeByName, " +
+        "   MIN(tu.treat_name) AS patientName, " +
+        "   MIN(se.stop_date) AS stopDate, " +
+        "   MIN(se.patient_id) AS patientId, " +
+        "   MIN(en.del_flag) AS delFlag " +
+        "FROM enteral_nutrition en " +
+        "LEFT JOIN settlement se ON en.settlement_id = se.id AND IFNULL(se.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_user su ON en.config_by = su.user_id AND IFNULL(su.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_user syu ON en.execute_by = syu.user_id AND IFNULL(syu.del_Flag, '0') != '1' " +
+        "LEFT JOIN treatment_user tu ON se.patient_id = tu.id AND IFNULL(tu.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_dept sd ON se.door_id = sd.dept_id AND IFNULL(sd.del_Flag, '0') != '1' " +
+        "WHERE 1 = 1 " +
+        "<if test='prescriptionType != null and prescriptionType != \"\"'> and en.prescription_type = #{prescriptionType} </if> " +
+        "<if test='visitType != null and visitType != \"\"'> and se.visit_type = #{visitType} </if> " +
+        "<if test='configStatus != null and configStatus != \"\"'> and en.config_status = #{configStatus} </if> " +
+        "<if test='paymentStatus != null and paymentStatus != \"\"'> and se.payment_status = #{paymentStatus} </if> " +
+        "<if test='executeStatus != null and executeStatus != \"\"'> and en.execute_status = #{executeStatus} </if> " +
+        "<if test='doorId != null '> and se.door_id = #{doorId} </if> " +
+        "<if test='wardId != null '> and se.ward_id = #{wardId} </if> " +
+        "<if test='searchValue != null and searchValue != \"\"'> and (tu.treat_num like concat('%', #{searchValue}, '%') " +
+        "or tu.treat_name like concat('%', #{searchValue}, '%') or tu.id_card like concat('%', #{searchValue}, '%')" +
+        "or tu.outpatient_no like concat('%', #{searchValue}, '%') or en.settlement_id like concat('%', #{searchValue}, '%')) </if> " +
+        "<if test='beginTime != null'> and en.prescription_date <![CDATA[>=]]> #{beginTime} </if>" +
+        "<if test='endTime != null'> and en.prescription_date <![CDATA[<=]]> #{endTime} </if>" +
+        "<if test='exeBeginTime != null'> and en.execute_date <![CDATA[>=]]> #{exeBeginTime} </if>" +
+        "<if test='exeEndTime != null'> and en.execute_date <![CDATA[<=]]> #{exeEndTime} </if>" +
+        "GROUP BY en.settlement_id, en.group_no " +
+        "ORDER BY MIN(en.create_time) DESC " +
+        "<if test='offset != null and rows != null'>LIMIT #{offset}, #{rows}</if>" +
+        "</script>")
+    List<EnteralNutritionQueryOneVo> queryPageVoList(@Param("prescriptionType") String prescriptionType, @Param("visitType") String visitType, @Param("configStatus") String configStatus,
+                                                     @Param("paymentStatus") String paymentStatus, @Param("executeStatus") String executeStatus, @Param("doorId") Long doorId,
+                                                     @Param("wardId") Long wardId, @Param("searchValue") String searchValue, @Param("beginTime") String beginTime,
+                                                     @Param("endTime") String endTime, @Param("exeBeginTime") String exeBeginTime,
+                                                     @Param("exeEndTime") String exeEndTime, @Param("offset") Integer offset, @Param("rows") Integer rows);
+
+    @Select("<script>" +
+        "SELECT COUNT(*) FROM ( SELECT 1 FROM enteral_nutrition en " +
+        "LEFT JOIN settlement se ON en.settlement_id = se.id AND IFNULL(se.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_user su ON en.config_by = su.user_id AND IFNULL(su.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_user syu ON en.execute_by = syu.user_id AND IFNULL(syu.del_Flag, '0') != '1' " +
+        "LEFT JOIN treatment_user tu ON se.patient_id = tu.id AND IFNULL(tu.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_dept sd ON se.door_id = sd.dept_id AND IFNULL(sd.del_Flag, '0') != '1' " +
+        "WHERE 1 = 1 " +
+        "<if test='prescriptionType != null and prescriptionType != \"\"'> and en.prescription_type = #{prescriptionType} </if> " +
+        "<if test='visitType != null and visitType != \"\"'> and se.visit_type = #{visitType} </if> " +
+        "<if test='configStatus != null and configStatus != \"\"'> and en.config_status = #{configStatus} </if> " +
+        "<if test='paymentStatus != null and paymentStatus != \"\"'> and se.payment_status = #{paymentStatus} </if> " +
+        "<if test='executeStatus != null and executeStatus != \"\"'> and en.execute_status = #{executeStatus} </if> " +
+        "<if test='doorId != null '> and se.door_id = #{doorId} </if> " +
+        "<if test='wardId != null '> and se.ward_id = #{wardId} </if> " +
+        "<if test='searchValue != null and searchValue != \"\"'> and (tu.treat_num like concat('%', #{searchValue}, '%') " +
+        "or tu.treat_name like concat('%', #{searchValue}, '%') or tu.id_card like concat('%', #{searchValue}, '%')" +
+        "or tu.outpatient_no like concat('%', #{searchValue}, '%') or en.settlement_id like concat('%', #{searchValue}, '%')) </if> " +
+        "<if test='beginTime != null'> and en.prescription_date <![CDATA[>=]]> #{beginTime} </if>" +
+        "<if test='endTime != null'> and en.prescription_date <![CDATA[<=]]> #{endTime} </if>" +
+        "<if test='exeBeginTime != null'> and en.execute_date <![CDATA[>=]]> #{exeBeginTime} </if>" +
+        "<if test='exeEndTime != null'> and en.execute_date <![CDATA[<=]]> #{exeEndTime} </if>" +
+        "GROUP BY en.settlement_id, en.group_no ) t" +
+        "</script>")
+    Integer queryPageVoCount(@Param("prescriptionType") String prescriptionType, @Param("visitType") String visitType, @Param("configStatus") String configStatus,
+                             @Param("paymentStatus") String paymentStatus, @Param("executeStatus") String executeStatus, @Param("doorId") Long doorId,
+                             @Param("wardId") Long wardId, @Param("searchValue") String searchValue, @Param("beginTime") String beginTime,
+                             @Param("endTime") String endTime, @Param("exeBeginTime") String exeBeginTime,
+                             @Param("exeEndTime") String exeEndTime);
+
+
 }

+ 102 - 0
ruoyi-admin/src/main/java/org/dromara/web/mapper/HospitalMealPlanMapper.java

@@ -1,11 +1,17 @@
 package org.dromara.web.mapper;
 
 
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.web.domain.HospitalMealPlan;
+import org.dromara.web.domain.vo.EnteralNutritionQueryOneVo;
+import org.dromara.web.domain.vo.HospitalMealPlanQueryVo;
 import org.dromara.web.domain.vo.HospitalMealPlanVo;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * 院内膳食主Mapper接口
  *
@@ -15,4 +21,100 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface HospitalMealPlanMapper extends BaseMapperPlus<HospitalMealPlan, HospitalMealPlanVo> {
 
+    @Select("<script>" +
+        "SELECT  " +
+        "    MIN(hmr.id) AS id, " +
+        "    hmp.settlement_id AS settlementId, " +
+        "    GROUP_CONCAT(DISTINCT hmr.id) AS idStr, " +
+        "    GROUP_CONCAT(DISTINCT hmr.food_name) AS productName, " +
+        "    MIN(hmr.create_time) AS prescriptionDate, " +
+        "    hmr.recipe_no AS recipeNo, " +
+        "    MIN(hmr.execute_date) AS executeDate, " +
+        "    MIN(hmr.meal_time) AS mealTime, " +
+        "    hmr.eat_time AS eatTime, " +
+        "    MIN(hmr.execute_time) AS executeTime, " +
+        "    MIN(se.payment_status) AS paymentStatus, " +
+        "    MIN(hmr.execute_status) AS executeStatus, " +
+        "    MIN(hmr.make_status) AS makeStatus, " +
+        "    MIN(hmr.make_time) AS makeTime, " +
+        "    MIN(hmr.make_by) AS makeBy, " +
+        "    MIN(hmr.execute_by) AS executeBy, " +
+        "    MIN(hmr.tag_print_num) AS tagPrintNum, " +
+        "    MIN(sd.dept_name) AS patientDepartment, " +
+        "    MIN(se.visit_type) AS visitType, " +
+        "    MIN(tu.id_card) AS idCard, " +
+        "    MIN(tu.outpatient_no) AS patientNo, " +
+        "    MIN(tu.bed_no) AS bedNo, " +
+        "    MIN(tu.ward_name) AS wardName, " +
+        "    MIN(tu.treat_num) AS treatNum, " +
+        "    MIN(su.user_name) AS makeByName, " +
+        "    MIN(syu.user_name) AS executeByName, " +
+        "    MIN(tu.treat_name) AS patientName, " +
+        "    MIN(se.stop_date) AS stopDate, " +
+        "    MIN(se.patient_id) AS patientId, " +
+        "    MIN(hmp.recommend_start_date) AS recommendStartDate, " +
+        "    MIN(hmp.recommend_end_date) AS recommendEndDate, " +
+        "    MIN(hmr.del_flag) AS delFlag " +
+        "FROM hospital_meal_recipe hmr " +
+        "LEFT JOIN hospital_meal_plan hmp ON hmr.plan_id = hmp.id AND IFNULL(hmp.del_Flag, '0') != '1' " +
+        "LEFT JOIN settlement se ON hmp.settlement_id = se.id AND IFNULL(se.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_user su ON hmr.make_by = su.user_id AND IFNULL(su.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_user syu ON hmr.execute_by = syu.user_id AND IFNULL(syu.del_Flag, '0') != '1' " +
+        "LEFT JOIN treatment_user tu ON se.patient_id = tu.id AND IFNULL(tu.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_dept sd ON se.door_id = sd.dept_id AND IFNULL(sd.del_Flag, '0') != '1' " +
+        "WHERE 1 = 1 " +
+        "<if test='prescriptionType != null and prescriptionType != \"\"'> and se.charge_type = #{prescriptionType} </if> " +
+        "<if test='visitType != null and visitType != \"\"'> and se.visit_type = #{visitType} </if> " +
+        "<if test='makeStatus != null and makeStatus != \"\"'> and hmr.make_status = #{makeStatus} </if> " +
+        "<if test='paymentStatus != null and paymentStatus != \"\"'> and se.payment_status = #{paymentStatus} </if> " +
+        "<if test='executeStatus != null and executeStatus != \"\"'> and hmr.execute_status = #{executeStatus} </if> " +
+        "<if test='doorId != null'> and se.door_id = #{doorId} </if> " +
+        "<if test='wardId != null'> and se.ward_id = #{wardId} </if> " +
+        "<if test='searchValue != null and searchValue != \"\"'> and (tu.treat_num like concat('%', #{searchValue}, '%') " +
+        "or tu.treat_name like concat('%', #{searchValue}, '%') or tu.id_card like concat('%', #{searchValue}, '%') " +
+        "or tu.outpatient_no like concat('%', #{searchValue}, '%') or hmp.settlement_id like concat('%', #{searchValue}, '%')) </if> " +
+        "<if test='beginTime != null'> and hmr.create_time <![CDATA[>=]]> #{beginTime} </if> " +
+        "<if test='endTime != null'> and hmr.create_time <![CDATA[<=]]> #{endTime} </if> " +
+        "<if test='exeBeginTime != null'> and hmr.execute_date <![CDATA[>=]]> #{exeBeginTime} </if> " +
+        "<if test='exeEndTime != null'> and hmr.execute_date <![CDATA[<=]]> #{exeEndTime} </if> " +
+        "GROUP BY hmr.plan_id, hmr.recipe_no, hmp.settlement_id, hmr.eat_time " +
+        "ORDER BY MIN(hmr.create_time) DESC " +
+        "<if test='offset != null and rows != null'>LIMIT #{offset}, #{rows}</if>" +
+        "</script>")
+    List<HospitalMealPlanQueryVo> queryPageVoList(@Param("prescriptionType") String prescriptionType, @Param("visitType") String visitType, @Param("makeStatus") String makeStatus,
+                                                  @Param("paymentStatus") String paymentStatus, @Param("executeStatus") String executeStatus, @Param("doorId") Long doorId,
+                                                  @Param("wardId") Long wardId, @Param("searchValue") String searchValue, @Param("beginTime") String beginTime,
+                                                  @Param("endTime") String endTime, @Param("exeBeginTime") String exeBeginTime,
+                                                  @Param("exeEndTime") String exeEndTime, @Param("offset") Integer offset, @Param("rows") Integer rows);
+
+    @Select("<script>" +
+        "SELECT COUNT(*) FROM ( SELECT 1 FROM hospital_meal_recipe hmr " +
+        "LEFT JOIN hospital_meal_plan hmp ON hmr.plan_id = hmp.id AND IFNULL(hmp.del_Flag, '0') != '1' " +
+        "LEFT JOIN settlement se ON hmp.settlement_id = se.id AND IFNULL(se.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_user su ON hmr.make_by = su.user_id AND IFNULL(su.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_user syu ON hmr.execute_by = syu.user_id AND IFNULL(syu.del_Flag, '0') != '1' " +
+        "LEFT JOIN treatment_user tu ON se.patient_id = tu.id AND IFNULL(tu.del_Flag, '0') != '1' " +
+        "LEFT JOIN sys_dept sd ON se.door_id = sd.dept_id AND IFNULL(sd.del_Flag, '0') != '1' " +
+        "WHERE 1 = 1 " +
+        "<if test='prescriptionType != null and prescriptionType != \"\"'> and se.charge_type = #{prescriptionType} </if> " +
+        "<if test='visitType != null and visitType != \"\"'> and se.visit_type = #{visitType} </if> " +
+        "<if test='makeStatus != null and makeStatus != \"\"'> and hmr.make_status = #{makeStatus} </if> " +
+        "<if test='paymentStatus != null and paymentStatus != \"\"'> and se.payment_status = #{paymentStatus} </if> " +
+        "<if test='executeStatus != null and executeStatus != \"\"'> and hmr.execute_status = #{executeStatus} </if> " +
+        "<if test='doorId != null '> and se.door_id = #{doorId} </if> " +
+        "<if test='wardId != null '> and se.ward_id = #{wardId} </if> " +
+        "<if test='searchValue != null and searchValue != \"\"'> and (tu.treat_num like concat('%', #{searchValue}, '%') " +
+        "or tu.treat_name like concat('%', #{searchValue}, '%') or tu.id_card like concat('%', #{searchValue}, '%')" +
+        "or tu.outpatient_no like concat('%', #{searchValue}, '%') or hmp.settlement_id like concat('%', #{searchValue}, '%')) </if> " +
+        "<if test='beginTime != null'> and hmr.create_time <![CDATA[>=]]> #{beginTime} </if>" +
+        "<if test='endTime != null'> and hmr.create_time <![CDATA[<=]]> #{endTime} </if>" +
+        "<if test='exeBeginTime != null'> and hmr.execute_date <![CDATA[>=]]> #{exeBeginTime} </if>" +
+        "<if test='exeEndTime != null'> and hmr.execute_date <![CDATA[<=]]> #{exeEndTime} </if>" +
+        "GROUP BY hmr.plan_id, hmr.recipe_no,hmp.settlement_id, hmr.eat_time ) t" +
+        "</script>")
+    Integer queryPageVoCount(@Param("prescriptionType") String prescriptionType, @Param("visitType") String visitType, @Param("makeStatus") String makeStatus,
+                             @Param("paymentStatus") String paymentStatus, @Param("executeStatus") String executeStatus, @Param("doorId") Long doorId,
+                             @Param("wardId") Long wardId, @Param("searchValue") String searchValue, @Param("beginTime") String beginTime,
+                             @Param("endTime") String endTime, @Param("exeBeginTime") String exeBeginTime,
+                             @Param("exeEndTime") String exeEndTime);
 }

+ 18 - 0
ruoyi-admin/src/main/java/org/dromara/web/mapper/PatientAccountMapper.java

@@ -0,0 +1,18 @@
+package org.dromara.web.mapper;
+
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.web.domain.PatientAccount;
+import org.dromara.web.domain.vo.PatientAccountVo;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 患者账户信息Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+@Repository
+public interface PatientAccountMapper extends BaseMapperPlus<PatientAccount, PatientAccountVo> {
+
+}

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

@@ -3,6 +3,7 @@ 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;
+import org.springframework.stereotype.Repository;
 
 /**
  * 结算管理Mapper接口
@@ -10,6 +11,7 @@ import org.dromara.web.domain.vo.SettlementVo;
  * @author Lion Li
  * @date 2025-07-22
  */
+@Repository
 public interface SettlementMapper extends BaseMapperPlus<Settlement, SettlementVo> {
 
 }

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

@@ -6,8 +6,10 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 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.EnteralNutritionQueryOneVo;
 import org.dromara.web.domain.vo.EnteralNutritionQueryVo;
 import org.dromara.web.domain.vo.EnteralNutritionVo;
+import org.dromara.web.domain.vo.SettlementVo;
 
 import java.util.Collection;
 import java.util.List;
@@ -41,6 +43,17 @@ public interface IEnteralNutritionService {
 
     R<EnteralNutritionQueryVo> detail(Long id);
 
+    List<EnteralNutritionVo> queryBySettlementId(Long id);
+    R<List<EnteralNutritionVo>> queryById(String ids);
+    //手动配置
+    R manualConfig(String ids);
+
+    //执行操作
+    R execute(String ids);
+
+    //执行操作
+    R tagPrint(String ids);
+
     /**
      * 查询符合条件的肠内营养列表
      *
@@ -73,4 +86,10 @@ public interface IEnteralNutritionService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+
+    TableDataInfo<EnteralNutritionQueryOneVo> queryEnteralNutritionPageList(EnteralNutritionBo bo, PageQuery pageQuery);
+
+
+
 }

+ 24 - 1
ruoyi-admin/src/main/java/org/dromara/web/service/IHospitalMealPlanService.java

@@ -1,10 +1,12 @@
 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.web.domain.bo.EnteralNutritionBo;
 import org.dromara.web.domain.bo.HospitalMealPlanBo;
-import org.dromara.web.domain.vo.HospitalMealPlanVo;
+import org.dromara.web.domain.vo.*;
 
 import java.util.Collection;
 import java.util.List;
@@ -66,4 +68,25 @@ public interface IHospitalMealPlanService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    List<HospitalMealRecipeVo> queryBySettlementId(Long id);
+    R<List<HospitalMealRecipeVo>> queryById(String ids);
+    //手动配置
+    R manualConfig(String ids);
+
+    //执行操作
+    R execute(String ids);
+
+    //执行操作
+    R tagPrint(String ids);
+
+    /**
+     * 查询符合条件的肠内营养列表
+     *
+     * @param bo 查询条件
+     * @return 肠内营养列表
+     */
+    List<HospitalMealRecipeVo> queryList(EnteralNutritionBo bo);
+
+    TableDataInfo<HospitalMealPlanQueryVo> queryHospitalMealPlanList(EnteralNutritionBo bo, PageQuery pageQuery);
 }

+ 69 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/IPatientAccountService.java

@@ -0,0 +1,69 @@
+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.PatientAccountBo;
+import org.dromara.web.domain.vo.PatientAccountVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 患者账户信息Service接口
+ *
+ * @author Lion Li
+ * @date 2025-08-07
+ */
+public interface IPatientAccountService {
+
+    /**
+     * 查询患者账户信息
+     *
+     * @param id 主键
+     * @return 患者账户信息
+     */
+    PatientAccountVo queryById(Long id);
+
+    /**
+     * 分页查询患者账户信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 患者账户信息分页列表
+     */
+    TableDataInfo<PatientAccountVo> queryPageList(PatientAccountBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的患者账户信息列表
+     *
+     * @param bo 查询条件
+     * @return 患者账户信息列表
+     */
+    List<PatientAccountVo> queryList(PatientAccountBo bo);
+
+    /**
+     * 新增患者账户信息
+     *
+     * @param bo 患者账户信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(PatientAccountBo bo);
+
+    /**
+     * 修改患者账户信息
+     *
+     * @param bo 患者账户信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(PatientAccountBo bo);
+
+    /**
+     * 校验并批量删除患者账户信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 148 - 10
ruoyi-admin/src/main/java/org/dromara/web/service/impl/ChargeRecordServiceImpl.java

@@ -1,28 +1,42 @@
 package org.dromara.web.service.impl;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 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.web.domain.ChargeRecord;
+import org.dromara.common.core.constant.BizConst;
+import org.dromara.common.core.enums.biz.ActionStatus;
+import org.dromara.common.core.enums.biz.FeeType;
+import org.dromara.common.core.enums.biz.PaymentStatus;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.SysDept;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.mapper.SysDeptMapper;
+import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.web.domain.*;
 import org.dromara.web.domain.bo.ChargeRecordBo;
-import org.dromara.web.domain.vo.ChargeRecordTotalizeVo;
 import org.dromara.web.domain.vo.ChargeRecordVo;
 import org.dromara.web.mapper.ChargeRecordMapper;
 import org.dromara.web.service.IChargeRecordService;
 import org.springframework.stereotype.Service;
 
-
+import java.math.BigDecimal;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Collection;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 收费记录Service业务层处理
@@ -37,6 +51,26 @@ public class ChargeRecordServiceImpl implements IChargeRecordService {
 
     private final ChargeRecordMapper baseMapper;
 
+    private final SysDeptMapper deptMapper;
+
+    private final SysUserMapper userMapper;
+
+    private final SettlementMapper settlementMapper;
+
+    private final ChargeRecordLogMapper logMapper;
+
+    private final EnteralNutritionMapper enteralNutritionMapper;
+
+    private final NutritionEvaluationMapper evaluationMapper;
+
+    private final NutritionScreeningMapper screeningMapper;
+
+    private final ProductNutritionMapper productNutritionMapper;
+
+    private final HospitalMealPlanMapper mealPlanMapper;
+
+    private final HospitalMealRecipeMapper mealRecipeMapper;
+
     /**
      * 查询收费记录
      *
@@ -44,8 +78,67 @@ public class ChargeRecordServiceImpl implements IChargeRecordService {
      * @return 收费记录
      */
     @Override
-    public ChargeRecordVo queryById(Long id){
-        return baseMapper.selectVoById(id);
+    public ChargeRecordVo queryById(Long id) {
+        ChargeRecordVo chargeRecordVo = baseMapper.selectVoById(id);
+        List<SysUser> userList = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId, SysUser::getUserName));
+        Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> String.valueOf(k2.getUserName()), (k1, k2) -> k1));
+        if (null != chargeRecordVo) {
+            SettlementVo settlementVo = settlementMapper.selectVoById(chargeRecordVo.getSettlementId());
+            if (null != settlementVo) {
+                String chargeType = settlementVo.getChargeType();
+                List<EnteralNutritionVo> enteralNutritionVoList = enteralNutritionMapper.selectVoList(new LambdaQueryWrapper<EnteralNutrition>().eq(EnteralNutrition::getSettlementId, settlementVo.getId()));
+
+                if (CollUtil.isNotEmpty(enteralNutritionVoList)) {
+                    // 提获取所有需要的产品营养信息
+                    Set<Long> productIds = enteralNutritionVoList.stream().map(EnteralNutritionVo::getNutritionProductId).collect(Collectors.toSet());
+                    Map<Long, ProductNutrition> productNutritionMap = productNutritionMapper.selectBatchIds(productIds).stream().collect(Collectors.toMap(ProductNutrition::getId, Function.identity()));
+
+                    // 处理价格设置
+                    for (EnteralNutritionVo nutritionVo : enteralNutritionVoList) {
+                        nutritionVo.setCreateByName(userMap.get(nutritionVo.getCreateBy()));
+                        ProductNutrition productNutrition = productNutritionMap.get(nutritionVo.getNutritionProductId());
+
+                        if (productNutrition != null) {
+                            BigDecimal price = FeeType.PRE_PACKAGED_PRESCRIPTION.getCode().equals(chargeType) ? new BigDecimal(productNutrition.getPackagePrice()) : new BigDecimal(productNutrition.getConfigSalePrice());
+                            nutritionVo.setSalePrice(price);
+                        }
+                    }
+
+                    // 处理处方费用计算
+                    if (FeeType.CONFIGURE_PRESCRIPTION.getCode().equals(chargeType) || FeeType.LONG_TERM_PRESCRIPTION.getCode().equals(chargeType)) {
+                        int lastGroupNo = Integer.valueOf(enteralNutritionVoList.get(enteralNutritionVoList.size() - 1).getGroupNo());
+                        chargeRecordVo.setPrescriptionFee(new BigDecimal(lastGroupNo + 1));
+                    }
+                }
+
+                chargeRecordVo.setEnteralNutritionList(enteralNutritionVoList);
+                List<NutritionScreeningVo> nutritionScreeningVos = screeningMapper.selectVoList(new LambdaQueryWrapper<NutritionScreening>().eq(NutritionScreening::getSettlementId, settlementVo.getId()));
+                nutritionScreeningVos.forEach(v -> {
+                    v.setCreateByName(userMap.get(v.getCreateBy()));
+                });
+                chargeRecordVo.setNutritionScreeningList(nutritionScreeningVos);
+                List<NutritionEvaluationVo> nutritionEvaluationVos = evaluationMapper.selectVoList(new LambdaQueryWrapper<NutritionEvaluation>().eq(NutritionEvaluation::getSettlementId, settlementVo.getId()));
+                nutritionEvaluationVos.forEach(v -> {
+                    v.setCreateByName(userMap.get(v.getCreateBy()));
+                });
+                chargeRecordVo.setNutritionEvaluationList(nutritionEvaluationVos);
+
+                List<HospitalMealPlanVo> hospitalMealPlanVos = mealPlanMapper.selectVoList(new LambdaQueryWrapper<HospitalMealPlan>().eq(HospitalMealPlan::getSettlementId, settlementVo.getId()));
+                if (CollUtil.isNotEmpty(hospitalMealPlanVos)) {
+                    List<HospitalMealRecipeVo> hospitalMealRecipeVos = mealRecipeMapper.selectVoList(new LambdaQueryWrapper<HospitalMealRecipe>().eq(HospitalMealRecipe::getPlanId, hospitalMealPlanVos.get(0).getId()));
+                    hospitalMealRecipeVos.forEach(v -> {
+                        v.setCreateByName(userMap.get(v.getCreateBy()));
+                    });
+                    chargeRecordVo.setHospitalMealRecipeList(hospitalMealRecipeVos);
+                }
+            }
+            List<ChargeRecordLogVo> chargeRecordLogs = logMapper.selectVoList(new LambdaQueryWrapper<ChargeRecordLog>().eq(ChargeRecordLog::getChargeRecordId, chargeRecordVo.getId()));
+            chargeRecordLogs.forEach(v -> {
+                v.setCreateByName(userMap.get(v.getCreateBy()));
+            });
+            chargeRecordVo.setRecordLogList(chargeRecordLogs);
+        }
+        return chargeRecordVo;
     }
 
     /**
@@ -59,6 +152,17 @@ public class ChargeRecordServiceImpl implements IChargeRecordService {
     public TableDataInfo<ChargeRecordVo> queryPageList(ChargeRecordBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<ChargeRecord> lqw = buildQueryWrapper(bo);
         Page<ChargeRecordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<ChargeRecordVo> records = result.getRecords();
+        if (CollUtil.isNotEmpty(records)) {
+            Set<Long> deptList = CollUtil.newHashSet();
+            records.forEach(v -> {
+                deptList.add(v.getDoorId());
+            });
+            Map<Long, String> deptMap = deptMapper.selectList(Wrappers.lambdaQuery(SysDept.class).select(SysDept::getDeptId, SysDept::getDeptName).in(SysDept::getDeptId, deptList)).stream().collect(Collectors.toMap(k1 -> k1.getDeptId(), k2 -> k2.getDeptName(), (k1, k2) -> k1));
+            records.forEach(v -> {
+                v.setPatientDepartment(deptMap.get(v.getDoorId()));
+            });
+        }
         return TableDataInfo.build(result);
     }
 
@@ -110,11 +214,45 @@ public class ChargeRecordServiceImpl implements IChargeRecordService {
      */
     @Override
     public Boolean insertByBo(ChargeRecordBo bo) {
+        bo.setId(null);
+        bo.setPaymentStatus(PaymentStatus.PAID.getCode());
         ChargeRecord add = MapstructUtils.convert(bo, ChargeRecord.class);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
+            SettlementVo settlementVo = settlementMapper.selectVoById(bo.getSettlementId());
+            settlementVo.setPaymentStatus(PaymentStatus.PAID.getCode());
+            settlementMapper.updateById(MapstructUtils.convert(settlementVo, Settlement.class));
+            String productStr = null;
+            if (FeeType.PRE_PACKAGED_PRESCRIPTION.getCode().equals(settlementVo.getChargeType())
+                || FeeType.CONFIGURE_PRESCRIPTION.getCode().equals(settlementVo.getChargeType())
+                || FeeType.LONG_TERM_PRESCRIPTION.getCode().equals(settlementVo.getChargeType())) {
+
+                // 查询肠内营养列表
+                List<EnteralNutritionVo> enteralNutritionVoList = enteralNutritionMapper.selectVoList(
+                    new LambdaQueryWrapper<EnteralNutrition>()
+                        .eq(EnteralNutrition::getSettlementId, settlementVo.getId()));
+
+                if (CollUtil.isNotEmpty(enteralNutritionVoList)) {
+                    // 获取所有产品ID并拼接成字符串
+                    productStr = enteralNutritionVoList.stream()
+                        .map(vo -> String.valueOf(vo.getNutritionProduct()))
+                        .collect(Collectors.joining(","));
+                }
+            } else if (FeeType.NUTRITION_SCREENING.getCode().equals(settlementVo.getChargeType())) {
+                productStr = FeeType.NUTRITION_SCREENING.getRemark();
+            } else if (FeeType.NUTRITION_EVALUATION.getCode().equals(settlementVo.getChargeType())) {
+                productStr = FeeType.NUTRITION_EVALUATION.getRemark();
+            }
+            ChargeRecordLog recordLog = new ChargeRecordLog();
+            recordLog.setChargeRecordId(add.getId());
+            recordLog.setSettlementId(add.getSettlementId());
+            recordLog.setReceivableAmount(add.getReceivableAmount());
+            recordLog.setStatus(ActionStatus.SUCCESS.getCode());
+            recordLog.setPaymentMethod(add.getPaymentMethod());
+            recordLog.setProductName(productStr);
+            logMapper.insert(recordLog);
         }
         return flag;
     }
@@ -135,7 +273,7 @@ public class ChargeRecordServiceImpl implements IChargeRecordService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(ChargeRecord entity){
+    private void validEntityBeforeSave(ChargeRecord entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -148,7 +286,7 @@ public class ChargeRecordServiceImpl implements IChargeRecordService {
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;

+ 209 - 70
ruoyi-admin/src/main/java/org/dromara/web/service/impl/EnteralNutritionServiceImpl.java

@@ -12,51 +12,36 @@ 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.enums.biz.*;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.vo.SysDictDataVo;
+import org.dromara.system.mapper.SysDeptMapper;
 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.*;
 import org.dromara.web.domain.bo.EnteralNutritionBo;
 import org.dromara.web.domain.bo.EnteralNutritionConsumableBo;
 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.domain.vo.*;
+import org.dromara.web.mapper.*;
 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.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 肠内营养Service业务层处理
@@ -78,6 +63,9 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
     private final SysUserMapper userMapper;
     private final ISysDictDataService dataService;
 
+    private final SysDeptMapper deptMapper;
+
+
     /**
      * 查询肠内营养
      *
@@ -89,24 +77,164 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
         return baseMapper.selectVoById(id);
     }
 
+    public List<EnteralNutritionVo> queryBySettlementId(Long settlementId) {
+        SettlementVo selectVoById = settlementMapper.selectVoById(settlementId);
+
+        List<EnteralNutritionVo> nutritionVoList = baseMapper.selectVoList(new LambdaQueryWrapper<EnteralNutrition>().eq(EnteralNutrition::getSettlementId, selectVoById.getId()));
+        if (CollUtil.isNotEmpty(nutritionVoList)) {
+            Set<Long> userList = CollUtil.newHashSet();
+            nutritionVoList.forEach(v -> {
+                userList.add(v.getConfigBy());
+                userList.add(v.getExecuteBy());
+            });
+            // 按settlementId和groupNo分组
+            Map<String, List<EnteralNutritionVo>> groupedRecords = nutritionVoList.stream().collect(Collectors.groupingBy(r -> r.getSettlementId() + "_" + r.getGroupNo(), Collectors.toList()));
+
+            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));
+            for (List<EnteralNutritionVo> group : groupedRecords.values()) {
+                if (CollUtil.isEmpty(group)) continue;
+                // 拼接id
+                String enteralNutritionIds = group.stream().map(EnteralNutritionVo::getId).filter(Objects::nonNull).distinct().map(String::valueOf).collect(Collectors.joining(","));
+
+                for (EnteralNutritionVo record : group) {
+                    // 设置用户信息
+                    record.setIdStr(enteralNutritionIds);
+                    record.setCreateByName(userMap.get(record.getCreateBy()));
+                    record.setConfigByName(userMap.get(record.getConfigBy()));
+                    record.setExecuteByName(userMap.get(record.getExecuteBy()));
+
+                }
+            }
+
+        }
+        return nutritionVoList;
+    }
+
+    @Override
+    public R<List<EnteralNutritionVo>> queryById(String ids) {
+        List<EnteralNutritionVo> nutritionVoList = new ArrayList<>();
+        if (StringUtils.isNotBlank(ids)) {
+            // 获取当前登录用户的ID,并填充更新人信息
+            Long userId = LoginHelper.getUserId();
+            Optional.ofNullable(ids) // 处理ids可能为null的情况
+                .map(str -> Arrays.stream(str.split(","))) // 按逗号分割
+                .orElseGet(Stream::empty) // 如果ids为null,返回空流
+                .map(String::trim) // 去除空格
+                .filter(StringUtils::isNotBlank) // 过滤空字符串
+                .forEach(id -> {
+                    try {
+                        Long parsedId = Long.parseLong(id);
+                        EnteralNutritionVo enteralNutritionVo = baseMapper.selectVoById(parsedId);
+                        nutritionVoList.add(enteralNutritionVo);
+                    } catch (NumberFormatException e) {
+                        log.error("Invalid ID format: {}", id, e); // 记录错误日志
+                    }
+                });
+        }
+        return R.ok(nutritionVoList);
+    }
+
+    //手动配置
+    @Override
+    public R manualConfig(String ids) {
+        if (StringUtils.isNotBlank(ids)) {
+            // 获取当前登录用户的ID,并填充更新人信息
+            Long userId = LoginHelper.getUserId();
+            Optional.ofNullable(ids) // 处理ids可能为null的情况
+                .map(str -> Arrays.stream(str.split(","))) // 按逗号分割
+                .orElseGet(Stream::empty) // 如果ids为null,返回空流
+                .map(String::trim) // 去除空格
+                .filter(StringUtils::isNotBlank) // 过滤空字符串
+                .forEach(id -> {
+                    try {
+                        Long parsedId = Long.parseLong(id);
+                        EnteralNutrition vo = baseMapper.selectById(parsedId);
+                        if (vo != null) {
+                            vo.setConfigStatus(ConfigStatus.ONE.getCode()); // 设置状态
+                            vo.setConfigTime(new Date()); // 设置更新时间
+                            vo.setConfigBy(userId); // 设置操作人(需替换成实际方法)
+                            baseMapper.updateById(vo); // 执行更新
+                        }
+                    } catch (NumberFormatException e) {
+                        log.error("Invalid ID format: {}", id, e); // 记录错误日志
+                    }
+                });
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R execute(String ids) {
+        if (StringUtils.isNotBlank(ids)) {
+            // 获取当前登录用户的ID,并填充更新人信息
+            Long userId = LoginHelper.getUserId();
+            Optional.ofNullable(ids) // 处理ids可能为null的情况
+                .map(str -> Arrays.stream(str.split(","))) // 按逗号分割
+                .orElseGet(Stream::empty) // 如果ids为null,返回空流
+                .map(String::trim) // 去除空格
+                .filter(StringUtils::isNotBlank) // 过滤空字符串
+                .forEach(id -> {
+                    try {
+                        Long parsedId = Long.parseLong(id);
+                        EnteralNutrition vo = baseMapper.selectById(parsedId);
+                        if (vo != null) {
+                            vo.setExecuteStatus(ExecuteStatus.ONE.getCode()); // 设置状态
+                            vo.setExecuteDate(LocalDate.now()); // 更新执行时间
+                            vo.setExecuteTime(LocalTime.now());
+                            vo.setExecuteBy(userId); // 设置操作人(需替换成实际方法)
+                            baseMapper.updateById(vo); // 执行更新
+                        }
+                    } catch (NumberFormatException e) {
+                        log.error("Invalid ID format: {}", id, e); // 记录错误日志
+                    }
+                });
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R tagPrint(String ids) {
+        if (StringUtils.isNotBlank(ids)) {
+            System.err.println("当前打印 ids : " + ids);
+            // 获取当前登录用户的ID,并填充更新人信息
+            Long userId = LoginHelper.getUserId();
+            Optional.ofNullable(ids) // 处理ids可能为null的情况
+                .map(str -> Arrays.stream(str.split(","))) // 按逗号分割
+                .orElseGet(Stream::empty) // 如果ids为null,返回空流
+                .map(String::trim) // 去除空格
+                .filter(StringUtils::isNotBlank) // 过滤空字符串
+                .forEach(id -> {
+                    System.err.println("当前打印:"+id);
+                    try {
+                        Long parsedId = Long.parseLong(id);
+                        EnteralNutrition vo = baseMapper.selectById(parsedId);
+                        if (vo != null) {
+                            vo.setTagPrintNum(vo.getTagPrintNum() + 1);
+                            baseMapper.updateById(vo); // 执行更新
+                        }
+                    } catch (NumberFormatException e) {
+                        log.error("Invalid ID format: {}", id, e); // 记录错误日志
+                    }
+                });
+        }
+        return R.ok();
+    }
+
     @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));
+        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)));
+            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)));
 
             queryVo.getNutritionList().forEach(nutrition -> {
                 nutrition.setMealTime(Arrays.stream(nutrition.getMealTime().split(",")).filter(StrUtil::isNotBlank).collect(Collectors.joining(",")));
@@ -174,17 +302,11 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
         });
 
         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<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, 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<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));
@@ -271,8 +393,7 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
     }
 
     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, 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));
 
@@ -290,8 +411,7 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
             }
         });
 
-        Map<Long, ProductNutrition> nutritionMap = productNutritionMapper.selectByIds(idList)
-            .stream().collect(Collectors.toMap(k1 -> k1.getId(), k2 -> k2, (k1, k2) -> k1));
+        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()) {
@@ -305,8 +425,7 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
                 throw new ServiceException("餐次时间不能为空");
             }
 
-            Set<String> mealTimeSet = Arrays.stream(nutritionBo.getMealTime().split(","))
-                .map(String::trim).filter(StrUtil::isNotBlank).collect(Collectors.toSet());
+            Set<String> mealTimeSet = Arrays.stream(nutritionBo.getMealTime().split(",")).map(String::trim).filter(StrUtil::isNotBlank).collect(Collectors.toSet());
             nutritionBo.setFrequency(Long.valueOf(mealTimeSet.size()));
 
             if (FeeType.PRE_PACKAGED_PRESCRIPTION.getCode().equalsIgnoreCase(bo.getChargeType())) {
@@ -324,11 +443,9 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
                     throw new ServiceException("数量不能为空");
                 }
 
-                nutritionBo.setAmount(BigDecimal.valueOf(nutritionBo.getQuantity() * nutrition.getPackagePrice())
-                    .multiply(new BigDecimal(nutrition.getProductSpec())).multiply(nutritionBo.getDosePerTime()));
+                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()));
+                nutritionBo.setDailyCalories(BigDecimal.valueOf(nutrition.getCalorie() * nutritionBo.getFrequency() / 100.0).multiply(nutritionBo.getDosePerTime()));
 
                 settlement.setStopDate(DateUtil.offsetDay(nutritionBo.getPrescriptionDate(), nutritionBo.getUsageDays().intValue() - 1));
                 nutritionBo.setStopDate(settlement.getStopDate());
@@ -371,16 +488,12 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
                         throw new ServiceException("首日不能为空");
                     }
 
-                    product.setAmount(BigDecimal.valueOf(nutrition.getConfigSalePrice() *
-                            (nutritionBo.getFrequency() * (nutritionBo.getUsageDays() - 1) + nutritionBo.getFirstDay()))
-                        .multiply(product.getDosePerTime()));
+                    product.setAmount(BigDecimal.valueOf(nutrition.getConfigSalePrice() * (nutritionBo.getFrequency() * (nutritionBo.getUsageDays() - 1) + nutritionBo.getFirstDay())).multiply(product.getDosePerTime()));
                     product.setAmount(BigDecimal.ZERO.compareTo(product.getAmount()) > 0 ? BigDecimal.ZERO : product.getAmount());
 
-                    product.setDailyCalories(BigDecimal.valueOf(nutrition.getCalorie() * nutritionBo.getFrequency() / 100.0)
-                        .multiply(product.getDosePerTime()));
+                    product.setDailyCalories(BigDecimal.valueOf(nutrition.getCalorie() * nutritionBo.getFrequency() / 100.0).multiply(product.getDosePerTime()));
 
-                    product.setTotalDose(BigDecimal.valueOf((nutritionBo.getFrequency() * (nutritionBo.getUsageDays() - 1) + nutritionBo.getFirstDay()))
-                        .multiply(product.getDosePerTime()));
+                    product.setTotalDose(BigDecimal.valueOf((nutritionBo.getFrequency() * (nutritionBo.getUsageDays() - 1) + nutritionBo.getFirstDay())).multiply(product.getDosePerTime()));
 
                     settlement.setStopDate(DateUtil.offsetDay(nutritionBo.getPrescriptionDate(), product.getUsageDays().intValue() - 1));
                     product.setStopDate(settlement.getStopDate());
@@ -400,12 +513,10 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
                     long days = DateUtil.between(nutritionBo.getPrescriptionDate(), product.getStopDate(), DateUnit.DAY) + 1;
                     product.setUsageDays(days);
 
-                    product.setAmount(BigDecimal.valueOf(((days - 1) * nutritionBo.getFrequency() + nutritionBo.getFirstDay()) * nutrition.getConfigSalePrice())
-                        .multiply(product.getDosePerTime()));
+                    product.setAmount(BigDecimal.valueOf(((days - 1) * nutritionBo.getFrequency() + nutritionBo.getFirstDay()) * nutrition.getConfigSalePrice()).multiply(product.getDosePerTime()));
                     product.setAmount(BigDecimal.ZERO.compareTo(product.getAmount()) > 0 ? BigDecimal.ZERO : product.getAmount());
 
-                    product.setDailyCalories(BigDecimal.valueOf(nutrition.getCalorie() * nutritionBo.getFrequency() / 100.0)
-                        .multiply(product.getDosePerTime()));
+                    product.setDailyCalories(BigDecimal.valueOf(nutrition.getCalorie() * nutritionBo.getFrequency() / 100.0).multiply(product.getDosePerTime()));
 
                     settlement.setStopDate(product.getStopDate());
                 }
@@ -430,8 +541,7 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
                 consumableIds.add(v.getConsumableId());
             });
 
-            Map<Long, SuppliesManage> suppliesManageMap = suppliesManageMapper.selectByIds(consumableIds).stream()
-                .collect(Collectors.toMap(k1 -> k1.getId(), k2 -> k2, (k1, k2) -> k1));
+            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());
@@ -449,8 +559,7 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
                         days = nutritionBo.getUsageDays();
                     }
 
-                    v.setQuantity(BigDecimal.valueOf(days - 1).multiply(BigDecimal.valueOf(v.getFrequency()))
-                        .add(BigDecimal.valueOf(v.getFirstDay())).multiply(v.getDosePerTime()).longValue());
+                    v.setQuantity(BigDecimal.valueOf(days - 1).multiply(BigDecimal.valueOf(v.getFrequency())).add(BigDecimal.valueOf(v.getFirstDay())).multiply(v.getDosePerTime()).longValue());
                     v.setQuantity(Math.max(v.getQuantity(), 0L));
                 }
 
@@ -551,9 +660,39 @@ public class EnteralNutritionServiceImpl implements IEnteralNutritionService {
         if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
-        int cnt = settlementMapper.update(Wrappers.lambdaUpdate(Settlement.class)
-            .set(Settlement::getDelFlag, DelFlag.YES.getCode())
-            .in(Settlement::getId, ids));
+        int cnt = settlementMapper.update(Wrappers.lambdaUpdate(Settlement.class).set(Settlement::getDelFlag, DelFlag.YES.getCode()).in(Settlement::getId, ids));
         return cnt > 0;
     }
+
+    @Override
+    public TableDataInfo<EnteralNutritionQueryOneVo> queryEnteralNutritionPageList(EnteralNutritionBo bo, PageQuery pageQuery) {
+        Map<String, Object> params = bo.getParams();
+        List<Date> executeDateRange = bo.getExecuteDateRange();
+        List<Date> prescriptionDateRange = bo.getPrescriptionDateRange();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String startExecuteDate = null;
+        String endExecuteDate = null;
+        String startTime = null;
+        String endTime = null;
+        if (executeDateRange != null && executeDateRange.size() == 2) {
+            startExecuteDate = sdf.format(executeDateRange.get(0)) + " 00:00:00";  // 开始时间
+            endExecuteDate = sdf.format(executeDateRange.get(1)) + " 23:59:59";    // 结束时间
+        }
+        if (prescriptionDateRange != null && prescriptionDateRange.size() == 2) {
+            startTime = sdf.format(prescriptionDateRange.get(0)) + " 00:00:00";  // 开始时间
+            endTime = sdf.format(prescriptionDateRange.get(1)) + " 23:59:59";    // 结束时间
+        }
+        // 计算正确的offset
+        int offset = (pageQuery.getPageNum() - 1) * pageQuery.getPageSize();
+        Integer total = baseMapper.queryPageVoCount(bo.getPrescriptionType(), bo.getVisitType(), bo.getConfigStatus(), bo.getPaymentStatus(), bo.getExecuteStatus(), bo.getDoorId(), bo.getWardId(), bo.getSearchValue(), startExecuteDate, endExecuteDate, startTime, endTime);
+
+        List<EnteralNutritionQueryOneVo> enteralNutritionVoList = baseMapper.queryPageVoList(bo.getPrescriptionType(), bo.getVisitType(), bo.getConfigStatus(), bo.getPaymentStatus(), bo.getExecuteStatus(), bo.getDoorId(), bo.getWardId(), bo.getSearchValue(), startExecuteDate, endExecuteDate, startTime, endTime, offset, pageQuery.getPageSize());
+
+        TableDataInfo tableDataInfo = new TableDataInfo();
+        tableDataInfo.setRows(enteralNutritionVoList);
+        tableDataInfo.setTotal(total);
+        return tableDataInfo;
+
+    }
+
 }

+ 240 - 33
ruoyi-admin/src/main/java/org/dromara/web/service/impl/HospitalMealPlanServiceImpl.java

@@ -2,38 +2,37 @@ package org.dromara.web.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
-import org.dromara.common.core.exception.ServiceException;
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.dromara.system.domain.SysRecipeFoodIngredient;
-import org.dromara.system.domain.SysScreeningAssessmentQuestion;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.biz.*;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.domain.SysUser;
-import org.dromara.system.domain.vo.SysScreeningAssessmentQuestionVo;
 import org.dromara.system.mapper.SysUserMapper;
-import org.dromara.web.domain.HospitalMealPlan;
-import org.dromara.web.domain.HospitalMealRecipe;
-import org.dromara.web.domain.NutritionSetting;
+import org.dromara.web.domain.*;
+import org.dromara.web.domain.bo.EnteralNutritionBo;
 import org.dromara.web.domain.bo.HospitalMealPlanBo;
-import org.dromara.web.domain.bo.HospitalMealRecipeBo;
-import org.dromara.web.domain.vo.HospitalMealPlanVo;
-import org.dromara.web.domain.vo.HospitalMealRecipeVo;
-import org.dromara.web.domain.vo.NutritionSettingVo;
+import org.dromara.web.domain.vo.*;
 import org.dromara.web.mapper.HospitalMealPlanMapper;
 import org.dromara.web.mapper.HospitalMealRecipeMapper;
+import org.dromara.web.mapper.SettlementMapper;
+import org.dromara.web.mapper.TreatmentUserMapper;
 import org.dromara.web.service.IHospitalMealPlanService;
 import org.springframework.stereotype.Service;
 
-
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 院内膳食主Service业务层处理
@@ -50,6 +49,10 @@ public class HospitalMealPlanServiceImpl implements IHospitalMealPlanService {
 
     private final SysUserMapper userMapper;
 
+    private final SettlementMapper settlementMapper;
+
+    private final TreatmentUserMapper treatmentUserMapper;
+
     private final HospitalMealRecipeMapper mealRecipeMapper;
 
     /**
@@ -62,8 +65,7 @@ public class HospitalMealPlanServiceImpl implements IHospitalMealPlanService {
     public HospitalMealPlanVo queryById(Long id) {
         HospitalMealPlanVo hospitalMealPlanVo = baseMapper.selectVoById(id);
         if (ObjUtil.isNotNull(hospitalMealPlanVo)) {
-            List<HospitalMealRecipeVo> voList = mealRecipeMapper.selectVoList(Wrappers.lambdaQuery(HospitalMealRecipe.class)
-                .eq(HospitalMealRecipe::getPlanId, hospitalMealPlanVo.getId()));
+            List<HospitalMealRecipeVo> voList = mealRecipeMapper.selectVoList(Wrappers.lambdaQuery(HospitalMealRecipe.class).eq(HospitalMealRecipe::getPlanId, hospitalMealPlanVo.getId()));
             hospitalMealPlanVo.setMealRecipeList(voList);
         }
         return hospitalMealPlanVo;
@@ -87,9 +89,7 @@ public class HospitalMealPlanServiceImpl implements IHospitalMealPlanService {
             records.forEach(v -> {
                 userList.add(v.getCreateBy());
             });
-            Map<Long, String> userMap = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class)
-                .select(SysUser::getUserId, SysUser::getUserName)
-                .in(SysUser::getUserId, userList)).stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> k2.getUserName(), (k1, k2) -> k1));
+            Map<Long, String> userMap = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId, SysUser::getUserName).in(SysUser::getUserId, userList)).stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> k2.getUserName(), (k1, k2) -> k1));
             records.forEach(v -> {
                 v.setCreateByUser(userMap.get(v.getCreateBy()));
             });
@@ -142,19 +142,43 @@ public class HospitalMealPlanServiceImpl implements IHospitalMealPlanService {
      */
     @Override
     public Boolean insertByBo(HospitalMealPlanBo bo) {
-        HospitalMealPlan add = MapstructUtils.convert(bo, HospitalMealPlan.class);
-        validEntityBeforeSave(add);
-        boolean flag = baseMapper.insert(add) > 0;
+        /*新增院内膳食时新增一条结算管理的待收费订单*/
+        TreatmentUser treatmentUser = treatmentUserMapper.selectById(bo.getPatientId());
+        Settlement settlement = new Settlement();
+        settlement.setOrderTime(new Date());
+        settlement.setPatientId(bo.getPatientId());
+        settlement.setVisitType(bo.getType());
+        settlement.setChargeType(FeeType.IN_HOSPITAL_MEALS.getCode());
+        settlement.setPatientNo(bo.getOutpatientNo());
+        settlement.setPatientName(treatmentUser.getTreatName());
+        settlement.setDoorId(treatmentUser.getDoorId());
+        settlement.setPhone(treatmentUser.getPhoneNum());
+        settlement.setIdCard(treatmentUser.getIdCard());
+        settlement.setBedNo(treatmentUser.getBedNo());
+        settlement.setWardId(treatmentUser.getWardId());
+        settlement.setWardName(treatmentUser.getWardName());
+        settlement.setReceivableAmount(bo.getTotalPrice());
+        settlement.setPaymentStatus(PaymentStatus.UNPAID.getCode());
+        settlement.setCheckStatus(CheckStatus.STATUS_TWO.getCode());
+        settlement.setStatus(bo.getStatus());
+        settlement.setTreatNum(treatmentUser.getTreatNum());
+        boolean flag = settlementMapper.insert(settlement) > 0;
         if (flag) {
-            List<HospitalMealRecipe> hList = bo.getMealRecipeList().stream().map(mealRecipe -> {
-                HospitalMealRecipe hospitalMealRecipe = MapstructUtils.convert(mealRecipe, HospitalMealRecipe.class);
-
-                hospitalMealRecipe.setPlanId(add.getId());
-                return hospitalMealRecipe;
-            }).collect(Collectors.toList());
-            mealRecipeMapper.insertBatch(hList);
-            bo.setId(add.getId());
+            bo.setSettlementId(settlement.getId());
+            HospitalMealPlan add = MapstructUtils.convert(bo, HospitalMealPlan.class);
+            validEntityBeforeSave(add);
+            flag = baseMapper.insert(add) > 0;
+            if (flag) {
+                List<HospitalMealRecipe> hList = bo.getMealRecipeList().stream().map(mealRecipe -> {
+                    HospitalMealRecipe hospitalMealRecipe = MapstructUtils.convert(mealRecipe, HospitalMealRecipe.class);
+                    hospitalMealRecipe.setPlanId(add.getId());
+                    return hospitalMealRecipe;
+                }).collect(Collectors.toList());
+                mealRecipeMapper.insertBatch(hList);
+                bo.setId(add.getId());
+            }
         }
+
         return flag;
     }
 
@@ -192,4 +216,187 @@ public class HospitalMealPlanServiceImpl implements IHospitalMealPlanService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    @Override
+    public TableDataInfo<HospitalMealPlanQueryVo> queryHospitalMealPlanList(EnteralNutritionBo bo, PageQuery pageQuery) {
+        Map<String, Object> params = bo.getParams();
+        List<Date> executeDateRange = bo.getExecuteDateRange();
+        List<Date> prescriptionDateRange = bo.getPrescriptionDateRange();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String startExecuteDate = null;
+        String endExecuteDate = null;
+        String startTime = null;
+        String endTime = null;
+        if (executeDateRange != null && executeDateRange.size() == 2) {
+            startExecuteDate = sdf.format(executeDateRange.get(0)) + " 00:00:00";  // 开始时间
+            endExecuteDate = sdf.format(executeDateRange.get(1)) + " 23:59:59";    // 结束时间
+        }
+        if (prescriptionDateRange != null && prescriptionDateRange.size() == 2) {
+            startTime = sdf.format(prescriptionDateRange.get(0)) + " 00:00:00";  // 开始时间
+            endTime = sdf.format(prescriptionDateRange.get(1)) + " 23:59:59";    // 结束时间
+        }
+        // 计算正确的offset
+        int offset = (pageQuery.getPageNum() - 1) * pageQuery.getPageSize();
+        Integer total = baseMapper.queryPageVoCount(bo.getPrescriptionType(), bo.getVisitType(), bo.getMakeStatus(), bo.getPaymentStatus(), bo.getExecuteStatus(), bo.getDoorId(), bo.getWardId(), bo.getSearchValue(), startExecuteDate, endExecuteDate, startTime, endTime);
+
+        List<HospitalMealPlanQueryVo> mealPlanQueryVoList = baseMapper.queryPageVoList(bo.getPrescriptionType(), bo.getVisitType(), bo.getMakeStatus(), bo.getPaymentStatus(), bo.getExecuteStatus(), bo.getDoorId(), bo.getWardId(), bo.getSearchValue(), startExecuteDate, endExecuteDate, startTime, endTime, offset, pageQuery.getPageSize());
+
+        TableDataInfo tableDataInfo = new TableDataInfo();
+        tableDataInfo.setRows(mealPlanQueryVoList);
+        tableDataInfo.setTotal(total);
+        return tableDataInfo;
+
+    }
+
+    @Override
+    public List<HospitalMealRecipeVo> queryBySettlementId(Long id) {
+        List<HospitalMealRecipeVo> hospitalMealRecipes =null;
+        SettlementVo selectVoById = settlementMapper.selectVoById(id);
+
+        List<HospitalMealPlan> mealPlanList = baseMapper.selectList(new LambdaQueryWrapper<HospitalMealPlan>().eq(HospitalMealPlan::getSettlementId, selectVoById.getId()));
+        if (CollUtil.isNotEmpty(mealPlanList)) {
+
+             hospitalMealRecipes = mealRecipeMapper.selectVoList(new LambdaQueryWrapper<HospitalMealRecipe>().eq(HospitalMealRecipe::getPlanId, mealPlanList.get(0).getId()));
+
+
+        if (CollUtil.isNotEmpty(hospitalMealRecipes)) {
+            Set<Long> userList = CollUtil.newHashSet();
+            hospitalMealRecipes.forEach(v -> {
+                userList.add(v.getMakeBy());
+                userList.add(v.getExecuteBy());
+            });
+            // 按settlementId和groupNo分组
+            Map<String, List<HospitalMealRecipeVo>> listMap = hospitalMealRecipes.stream().collect(Collectors.groupingBy(r -> r.getPlanId() + "_" + r.getRecipeNo()+"_"+r.getEatTime(), Collectors.toList()));
+
+            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));
+            for (List<HospitalMealRecipeVo> group : listMap.values()) {
+                if (CollUtil.isEmpty(group)) continue;
+                // 拼接id
+                String ids = group.stream().map(HospitalMealRecipeVo::getId).filter(Objects::nonNull).distinct().map(String::valueOf).collect(Collectors.joining(","));
+                for (HospitalMealRecipeVo record : group) {
+                    // 设置用户信息
+                    record.setIdStr(ids);
+                    record.setCreateByName(userMap.get(record.getCreateBy()));
+                    record.setMakeByName(userMap.get(record.getMakeBy()));
+                    record.setExecuteByName(userMap.get(record.getExecuteBy()));
+                }
+            }
+        }
+
+        }
+        return hospitalMealRecipes;
+    }
+
+    @Override
+    public R<List<HospitalMealRecipeVo>> queryById(String ids) {
+        List<HospitalMealRecipeVo> mealRecipeVoList = new ArrayList<>();
+        if (StringUtils.isNotBlank(ids)) {
+            Optional.ofNullable(ids) // 处理ids可能为null的情况
+                .map(str -> Arrays.stream(str.split(","))) // 按逗号分割
+                .orElseGet(Stream::empty) // 如果ids为null,返回空流
+                .map(String::trim) // 去除空格
+                .filter(StringUtils::isNotBlank) // 过滤空字符串
+                .forEach(id -> {
+                    try {
+                        Long parsedId = Long.parseLong(id);
+                        HospitalMealRecipeVo mealRecipeVo = mealRecipeMapper.selectVoById(parsedId);
+                        mealRecipeVoList.add(mealRecipeVo);
+                    } catch (NumberFormatException e) {
+                        log.error("Invalid ID format: {}", id, e); // 记录错误日志
+                    }
+                });
+        }
+        return R.ok(mealRecipeVoList);
+    }
+
+    @Override
+    public R manualConfig(String ids) {
+        if (StringUtils.isNotBlank(ids)) {
+            // 获取当前登录用户的ID,并填充更新人信息
+            Long userId = LoginHelper.getUserId();
+            Optional.ofNullable(ids) // 处理ids可能为null的情况
+                .map(str -> Arrays.stream(str.split(","))) // 按逗号分割
+                .orElseGet(Stream::empty) // 如果ids为null,返回空流
+                .map(String::trim) // 去除空格
+                .filter(StringUtils::isNotBlank) // 过滤空字符串
+                .forEach(id -> {
+                    try {
+                        Long parsedId = Long.parseLong(id);
+                        HospitalMealRecipe mealRecipe = mealRecipeMapper.selectById(parsedId);
+                        if (mealRecipe != null) {
+                            mealRecipe.setMakeStatus(MakeStatus.ONE.getCode()); // 设置状态
+                            mealRecipe.setMakeTime(new Date()); // 设置更新时间
+                            mealRecipe.setMakeBy(userId); // 设置操作人(需替换成实际方法)
+                            mealRecipeMapper.updateById(mealRecipe); // 执行更新
+                        }
+                    } catch (NumberFormatException e) {
+                        log.error("Invalid ID format: {}", id, e); // 记录错误日志
+                    }
+                });
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R execute(String ids) {
+        if (StringUtils.isNotBlank(ids)) {
+            // 获取当前登录用户的ID,并填充更新人信息
+            Long userId = LoginHelper.getUserId();
+            Optional.ofNullable(ids) // 处理ids可能为null的情况
+                .map(str -> Arrays.stream(str.split(","))) // 按逗号分割
+                .orElseGet(Stream::empty) // 如果ids为null,返回空流
+                .map(String::trim) // 去除空格
+                .filter(StringUtils::isNotBlank) // 过滤空字符串
+                .forEach(id -> {
+                    try {
+                        Long parsedId = Long.parseLong(id);
+                        HospitalMealRecipe mealRecipe = mealRecipeMapper.selectById(parsedId);
+                        if (mealRecipe != null) {
+                            mealRecipe.setExecuteStatus(ExecuteStatus.ONE.getCode()); // 设置状态
+                            mealRecipe.setExecuteDate(LocalDate.now()); // 更新执行时间
+                            mealRecipe.setExecuteTime(LocalTime.now());
+                            mealRecipe.setExecuteBy(userId); // 设置操作人(需替换成实际方法)
+                            mealRecipeMapper.updateById(mealRecipe); // 执行更新
+                        }
+                    } catch (NumberFormatException e) {
+                        log.error("Invalid ID format: {}", id, e); // 记录错误日志
+                    }
+                });
+        }
+        return R.ok();
+    }
+
+    @Override
+    public R tagPrint(String ids) {
+        if (StringUtils.isNotBlank(ids)) {
+            System.err.println("当前打印 ids : " + ids);
+            // 获取当前登录用户的ID,并填充更新人信息
+            Long userId = LoginHelper.getUserId();
+            Optional.ofNullable(ids) // 处理ids可能为null的情况
+                .map(str -> Arrays.stream(str.split(","))) // 按逗号分割
+                .orElseGet(Stream::empty) // 如果ids为null,返回空流
+                .map(String::trim) // 去除空格
+                .filter(StringUtils::isNotBlank) // 过滤空字符串
+                .forEach(id -> {
+                    System.err.println("当前打印:" + id);
+                    try {
+                        Long parsedId = Long.parseLong(id);
+                        HospitalMealRecipe mealRecipe = mealRecipeMapper.selectById(parsedId);
+                        if (mealRecipe != null) {
+                            mealRecipe.setTagPrintNum(mealRecipe.getTagPrintNum() + 1);
+                            mealRecipeMapper.updateById(mealRecipe); // 执行更新
+                        }
+                    } catch (NumberFormatException e) {
+                        log.error("Invalid ID format: {}", id, e); // 记录错误日志
+                    }
+                });
+        }
+        return R.ok();
+    }
+
+
+    @Override
+    public List<HospitalMealRecipeVo> queryList(EnteralNutritionBo bo) {
+        return null;
+    }
 }

+ 140 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/PatientAccountServiceImpl.java

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

+ 64 - 20
ruoyi-admin/src/main/java/org/dromara/web/service/impl/SettlementServiceImpl.java

@@ -18,23 +18,16 @@ import org.dromara.system.domain.SysDept;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.mapper.SysDeptMapper;
 import org.dromara.system.mapper.SysUserMapper;
-import org.dromara.web.domain.EnteralNutrition;
-import org.dromara.web.domain.NutritionEvaluation;
-import org.dromara.web.domain.NutritionScreening;
-import org.dromara.web.domain.Settlement;
+import org.dromara.web.domain.*;
 import org.dromara.web.domain.bo.SettlementBo;
-import org.dromara.web.domain.vo.EnteralNutritionVo;
-import org.dromara.web.domain.vo.NutritionEvaluationVo;
-import org.dromara.web.domain.vo.NutritionScreeningVo;
-import org.dromara.web.domain.vo.SettlementVo;
-import org.dromara.web.mapper.EnteralNutritionMapper;
-import org.dromara.web.mapper.NutritionEvaluationMapper;
-import org.dromara.web.mapper.NutritionScreeningMapper;
-import org.dromara.web.mapper.SettlementMapper;
+import org.dromara.web.domain.vo.*;
+import org.dromara.web.mapper.*;
 import org.dromara.web.service.ISettlementService;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -60,6 +53,12 @@ public class SettlementServiceImpl implements ISettlementService {
 
     private final NutritionScreeningMapper screeningMapper;
 
+    private final ProductNutritionMapper productNutritionMapper;
+
+    private final HospitalMealPlanMapper mealPlanMapper;
+
+    private final HospitalMealRecipeMapper mealRecipeMapper;
+
     /**
      * 查询结算管理
      *
@@ -72,21 +71,64 @@ public class SettlementServiceImpl implements ISettlementService {
         List<SysUser> userList = userMapper.selectList(Wrappers.lambdaQuery(SysUser.class).select(SysUser::getUserId, SysUser::getUserName));
         Map<Long, String> userMap = userList.stream().collect(Collectors.toMap(k1 -> k1.getUserId(), k2 -> String.valueOf(k2.getUserName()), (k1, k2) -> k1));
         if (null != settlementVo) {
-            List<EnteralNutritionVo> enteralNutritionVoList = enteralNutritionMapper.selectVoList(new LambdaQueryWrapper<EnteralNutrition>().eq(EnteralNutrition::getSettlementId, settlementVo.getId()));
-            enteralNutritionVoList.forEach(v->{
-                v.setCreateByName(userMap.get(v.getCreateBy()));
-            });
+            String chargeType = settlementVo.getChargeType();
+            List<EnteralNutritionVo> enteralNutritionVoList = enteralNutritionMapper.selectVoList(
+                new LambdaQueryWrapper<EnteralNutrition>()
+                    .eq(EnteralNutrition::getSettlementId, settlementVo.getId()));
+
+            if (CollUtil.isNotEmpty(enteralNutritionVoList)) {
+                // 提获取所有需要的产品营养信息
+                Set<Long> productIds = enteralNutritionVoList.stream()
+                    .map(EnteralNutritionVo::getNutritionProductId)
+                    .collect(Collectors.toSet());
+                Map<Long, ProductNutrition> productNutritionMap = productNutritionMapper.selectBatchIds(productIds)
+                    .stream()
+                    .collect(Collectors.toMap(ProductNutrition::getId, Function.identity()));
+
+                // 处理价格设置
+                for (EnteralNutritionVo nutritionVo : enteralNutritionVoList) {
+                    nutritionVo.setCreateByName(userMap.get(nutritionVo.getCreateBy()));
+                    ProductNutrition productNutrition = productNutritionMap.get(nutritionVo.getNutritionProductId());
+
+                    if (productNutrition != null) {
+                        BigDecimal price = FeeType.PRE_PACKAGED_PRESCRIPTION.getCode().equals(chargeType)
+                            ? new BigDecimal(productNutrition.getPackagePrice())
+                            : new BigDecimal(productNutrition.getConfigSalePrice());
+                        nutritionVo.setSalePrice(price);
+                    }
+                }
+
+                // 处理处方费用计算
+                if (FeeType.CONFIGURE_PRESCRIPTION.getCode().equals(chargeType)
+                    || FeeType.LONG_TERM_PRESCRIPTION.getCode().equals(chargeType)) {
+                    int lastGroupNo = Integer.valueOf(enteralNutritionVoList.get(enteralNutritionVoList.size() - 1).getGroupNo());
+                    settlementVo.setPrescriptionFee(new BigDecimal(lastGroupNo + 1));
+                }
+            }
+
             settlementVo.setEnteralNutritionList(enteralNutritionVoList);
             List<NutritionScreeningVo> nutritionScreeningVos = screeningMapper.selectVoList(new LambdaQueryWrapper<NutritionScreening>().eq(NutritionScreening::getSettlementId, settlementVo.getId()));
-            nutritionScreeningVos.forEach(v->{
+            nutritionScreeningVos.forEach(v -> {
                 v.setCreateByName(userMap.get(v.getCreateBy()));
             });
             settlementVo.setNutritionScreeningList(nutritionScreeningVos);
             List<NutritionEvaluationVo> nutritionEvaluationVos = evaluationMapper.selectVoList(new LambdaQueryWrapper<NutritionEvaluation>().eq(NutritionEvaluation::getSettlementId, settlementVo.getId()));
-            nutritionEvaluationVos.forEach(v->{
+            nutritionEvaluationVos.forEach(v -> {
                 v.setCreateByName(userMap.get(v.getCreateBy()));
             });
             settlementVo.setNutritionEvaluationList(nutritionEvaluationVos);
+
+            List<HospitalMealPlanVo> hospitalMealPlanVos = mealPlanMapper.selectVoList(new LambdaQueryWrapper<HospitalMealPlan>().eq(HospitalMealPlan::getSettlementId, settlementVo.getId()));
+            if (CollUtil.isNotEmpty(hospitalMealPlanVos)) {
+                HospitalMealPlanVo planVo = hospitalMealPlanVos.get(0);
+                List<HospitalMealRecipeVo> hospitalMealRecipeVos = mealRecipeMapper.selectVoList(new LambdaQueryWrapper<HospitalMealRecipe>().eq(HospitalMealRecipe::getPlanId, planVo.getId()));
+                hospitalMealRecipeVos.forEach(v -> {
+                    v.setCreateByName(userMap.get(v.getCreateBy()));
+                });
+                settlementVo.setRecommendStartDate(planVo.getRecommendStartDate());
+                settlementVo.setRecommendEndDate(planVo.getRecommendEndDate());
+                settlementVo.setHospitalMealRecipeList(hospitalMealRecipeVos);
+            }
         }
         return settlementVo;
     }
@@ -142,10 +184,12 @@ public class SettlementServiceImpl implements ISettlementService {
         lqw.like(StringUtils.isNotBlank(bo.getPatientName()), Settlement::getPatientName, bo.getPatientName());
         lqw.eq(StringUtils.isNotBlank(bo.getPatientNo()), Settlement::getPatientNo, bo.getPatientNo());
         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());
+        lqw.eq(Settlement::getPaymentStatus, PaymentStatus.UNPAID.getCode());//待收费列表只查询未支付订单
         lqw.eq(Settlement::getCheckStatus, CheckStatus.STATUS_TWO.getCode());//结算管理查询已经审核通过的处方
+        lqw.between(params.get("beginTime") != null && params.get("endTime") != null,
+            Settlement::getOrderTime, params.get("beginTime"), params.get("endTime"));
         return lqw;
     }
 
@@ -163,7 +207,7 @@ public class SettlementServiceImpl implements ISettlementService {
         if (flag) {
             bo.setId(add.getId());
         }
-        return flag;
+        return true;
     }
 
     /**

+ 23 - 1
ruoyi-admin/src/main/java/org/dromara/web/service/impl/TreatmentUserServiceImpl.java

@@ -18,9 +18,11 @@ import org.dromara.system.domain.vo.SysWardVo;
 import org.dromara.system.mapper.SysDeptMapper;
 import org.dromara.system.mapper.SysWardMapper;
 import org.dromara.system.service.ISysDeptService;
+import org.dromara.web.domain.PatientAccount;
 import org.dromara.web.domain.TreatmentUser;
 import org.dromara.web.domain.bo.TreatmentUserBo;
 import org.dromara.web.domain.vo.TreatmentUserVo;
+import org.dromara.web.mapper.PatientAccountMapper;
 import org.dromara.web.mapper.TreatmentUserMapper;
 import org.dromara.web.service.ITreatmentUserService;
 import org.springframework.stereotype.Service;
@@ -49,6 +51,8 @@ public class TreatmentUserServiceImpl implements ITreatmentUserService {
 
     private final SysWardMapper wardMapper;
 
+    private final PatientAccountMapper accountMapper;
+
     /**
      * 查询【请填写功能名称】
      *
@@ -144,7 +148,7 @@ public class TreatmentUserServiceImpl implements ITreatmentUserService {
         }
         SysWardVo wardVo = wardMapper.selectVoById(bo.getWardId());
         if (null != wardVo) {
-        add.setWardName(wardVo.getWardName());
+            add.setWardName(wardVo.getWardName());
         }
         add.setBirthday(bo.getBirthday());
         add.setPhoneNum(bo.getPhoneNum());
@@ -152,6 +156,24 @@ public class TreatmentUserServiceImpl implements ITreatmentUserService {
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
+            PatientAccount account = new PatientAccount();
+            account.setSerialNo(RedisUtil.generatePatientNumber("A"));
+            account.setPatientId(add.getId());
+            account.setPatientName(add.getTreatName());
+            account.setIdCard(add.getIdCard());
+            account.setSex(Long.getLong(add.getSex()));
+            account.setPhone(add.getPhoneNum());
+            account.setDoorId(add.getDoorId());
+            SysDeptVo deptVo = deptMapper.selectVoById(add.getDoorId());
+            if (null != deptVo) {
+                account.setDeptName(deptVo.getDeptName());
+            }
+            account.setVisitType(add.getType());
+            account.setWardId(add.getWardId());
+            account.setWardName(add.getWardName());
+            account.setTreatNum(add.getTreatNum());
+            account.setPatientNo(add.getOutpatientNo());
+            accountMapper.insert(account);
         }
         return flag;
     }

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

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

@@ -21,6 +21,12 @@ public interface BizConst {
     String CHECK_STATUS_PASS="2";//通过审核
     String CHECK_STATUS_ALL="9"; //审核状态 全部状态
 
+    String CONFIG_STATUS="config_status"; //配置状态
+
+    String EXECUTE_STATUS="execute_status";  //执行状态
+
+    String PRINT_STATUS = "print_status";//打印状态
+
     String HOSPITAL_ROLE_TYPE = "hospital_role_type";
 
     String FOOD_UNIT = "food_unit";

+ 17 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/ActionStatus.java

@@ -0,0 +1,17 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+@Getter
+public enum ActionStatus {
+    SUCCESS("0", "操作成功"),
+    FAILED("1", "操作失败");
+
+    private String code;
+    private String remark;
+
+    private ActionStatus(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}

+ 17 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/ConfigStatus.java

@@ -0,0 +1,17 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+@Getter
+public enum ConfigStatus {
+    ZERO("0", "待配置"),
+    ONE("1", "已配置");
+
+    private String code;
+    private String remark;
+
+    private ConfigStatus(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}

+ 17 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/ExecuteStatus.java

@@ -0,0 +1,17 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+@Getter
+public enum ExecuteStatus {
+    ZERO("0", "待执行"),
+    ONE("1", "已执行");
+
+    private String code;
+    private String remark;
+
+    private ExecuteStatus(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}

+ 17 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/MakeStatus.java

@@ -0,0 +1,17 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+@Getter
+public enum MakeStatus {
+    ZERO("0", "待制餐"),
+    ONE("1", "已制餐");
+
+    private String code;
+    private String remark;
+
+    private MakeStatus(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}

+ 17 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/biz/PrintStatus.java

@@ -0,0 +1,17 @@
+package org.dromara.common.core.enums.biz;
+
+import lombok.Getter;
+
+@Getter
+public enum PrintStatus {
+    ZERO("0", "未打印"),
+    ONE("1", "已打印");
+
+    private String code;
+    private String remark;
+
+    private PrintStatus(String code, String remark) {
+        this.code = code;
+        this.remark = remark;
+    }
+}