Bläddra i källkod

大部分完成

Huanyi 2 månader sedan
förälder
incheckning
aa00583c28
30 ändrade filer med 1478 tillägg och 8 borttagningar
  1. 11 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/ChargeRecordController.java
  2. 118 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/ConsultPatientController.java
  3. 35 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/EmailController.java
  4. 34 0
      ruoyi-admin/src/main/java/org/dromara/web/controller/HistoryPatientController.java
  5. 6 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/ChargeRecord.java
  6. 158 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/ConsultPatient.java
  7. 0 1
      ruoyi-admin/src/main/java/org/dromara/web/domain/TreatmentUser.java
  8. 138 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/ConsultPatientBo.java
  9. 23 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/ConsultPatientEditBo.java
  10. 21 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/ConsultPatientInitiateBo.java
  11. 23 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EmailSendBo.java
  12. 27 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/bo/TotalPatientBo.java
  13. 23 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/ChargeRecordTotalizeVo.java
  14. 191 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/ConsultPatientVo.java
  15. 45 0
      ruoyi-admin/src/main/java/org/dromara/web/domain/vo/TotalPatientVo.java
  16. 12 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/ChargeRecordMapper.java
  17. 15 0
      ruoyi-admin/src/main/java/org/dromara/web/mapper/ConsultPatientMapper.java
  18. 17 0
      ruoyi-admin/src/main/java/org/dromara/web/service/EmailService.java
  19. 5 0
      ruoyi-admin/src/main/java/org/dromara/web/service/IChargeRecordService.java
  20. 75 0
      ruoyi-admin/src/main/java/org/dromara/web/service/IConsultPatientService.java
  21. 17 0
      ruoyi-admin/src/main/java/org/dromara/web/service/TotalPatientService.java
  22. 22 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/ChargeRecordServiceImpl.java
  23. 220 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/ConsultPatientServiceImpl.java
  24. 50 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailServiceImpl.java
  25. 69 0
      ruoyi-admin/src/main/java/org/dromara/web/service/impl/TotalPatientServiceImpl.java
  26. 6 6
      ruoyi-admin/src/main/resources/application-dev.yml
  27. 7 0
      ruoyi-admin/src/main/resources/mapper/ConsultPatientMapper.xml
  28. 41 1
      script/sql/biz/create.sql
  29. 66 0
      script/sql/biz/dump_2025_08_14.sql
  30. 3 0
      script/sql/biz/update.sql

+ 11 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/ChargeRecordController.java

@@ -7,6 +7,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 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.service.IChargeRecordService;
 import org.springframework.web.bind.annotation.*;
@@ -103,4 +104,14 @@ public class ChargeRecordController extends BaseController {
                           @PathVariable Long[] ids) {
         return toAjax(chargeRecordService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    @GetMapping("/listInvoice")
+    public TableDataInfo<ChargeRecordVo> listInvoice(PageQuery pageQuery) {
+        return chargeRecordService.queryInvoicePageList(pageQuery);
+    }
+
+    @GetMapping("/totalize")
+    public R<ChargeRecordTotalizeVo> totalize() {
+        return chargeRecordService.totalize();
+    }
 }

+ 118 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/ConsultPatientController.java

@@ -0,0 +1,118 @@
+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.ConsultPatientEditBo;
+import org.dromara.web.domain.bo.ConsultPatientInitiateBo;
+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.web.domain.vo.ConsultPatientVo;
+import org.dromara.web.domain.bo.ConsultPatientBo;
+import org.dromara.web.service.IConsultPatientService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 会诊患者
+ *
+ * @author Huanyi
+ * @date 2025-08-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/web/patient")
+public class ConsultPatientController extends BaseController {
+
+    private final IConsultPatientService consultPatientService;
+
+    /**
+     * 查询会诊患者列表
+     */
+    @SaCheckPermission("web:patient:list")
+    @GetMapping("/list")
+    public TableDataInfo<ConsultPatientVo> list(ConsultPatientBo bo, PageQuery pageQuery) {
+        return consultPatientService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出会诊患者列表
+     */
+    @SaCheckPermission("web:patient:export")
+    @Log(title = "会诊患者", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ConsultPatientBo bo, HttpServletResponse response) {
+        List<ConsultPatientVo> list = consultPatientService.queryList(bo);
+        ExcelUtil.exportExcel(list, "会诊患者", ConsultPatientVo.class, response);
+    }
+
+    /**
+     * 获取会诊患者详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("web:patient:query")
+    @GetMapping("/{id}")
+    public R<ConsultPatientVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(consultPatientService.queryById(id));
+    }
+
+    /**
+     * 新增会诊患者
+     */
+    @SaCheckPermission("web:patient:add")
+    @Log(title = "会诊患者", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ConsultPatientBo bo) {
+        return toAjax(consultPatientService.insertByBo(bo));
+    }
+
+    /**
+     * 修改会诊患者
+     */
+    @SaCheckPermission("web:patient:edit")
+    @Log(title = "会诊患者", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ConsultPatientBo bo) {
+        return toAjax(consultPatientService.updateByBo(bo));
+    }
+
+    /**
+     * 删除会诊患者
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("web:patient:remove")
+    @Log(title = "会诊患者", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(consultPatientService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    @PostMapping("/initiateConsultation")
+    public R initiateConsultation(@RequestBody ConsultPatientInitiateBo bo) {
+        return consultPatientService.initiateConsultation(bo);
+    }
+
+    @PutMapping("/edit")
+    @SaCheckPermission("web:patient:edit")
+    public R edit(@RequestBody ConsultPatientEditBo bo) {
+        return consultPatientService.edit(bo);
+    }
+}

+ 35 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/EmailController.java

@@ -0,0 +1,35 @@
+package org.dromara.web.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.web.domain.bo.EmailSendBo;
+import org.dromara.web.service.EmailService;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.File;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-13
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/email")
+@SaIgnore
+public class EmailController {
+
+    private final EmailService emailService;
+
+    @PostMapping(value ="/send")
+    public R sendEmail(@RequestBody EmailSendBo bo) {
+        return emailService.send(bo);
+    }
+
+}

+ 34 - 0
ruoyi-admin/src/main/java/org/dromara/web/controller/HistoryPatientController.java

@@ -0,0 +1,34 @@
+package org.dromara.web.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.web.domain.bo.TotalPatientBo;
+import org.dromara.web.domain.vo.TotalPatientVo;
+import org.dromara.web.service.TotalPatientService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-14
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/total/patient")
+public class HistoryPatientController {
+
+    private final TotalPatientService totalPatientService;
+
+    @GetMapping("/list")
+    public TableDataInfo<TotalPatientVo> listPage(TotalPatientBo bo, PageQuery pageQuery) {
+        return totalPatientService.listPage(bo, pageQuery);
+    }
+
+}

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

@@ -145,5 +145,11 @@ public class ChargeRecord extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 是否已开发票
+     * 0、否
+     * 1、是
+     */
+    private Integer whetherInvoice;
 
 }

+ 158 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/ConsultPatient.java

@@ -0,0 +1,158 @@
+package org.dromara.web.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import java.io.Serial;
+
+/**
+ * 会诊患者对象 consult_patient
+ *
+ * @author Huanyi
+ * @date 2025-08-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("consult_patient")
+public class ConsultPatient extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 看诊类型
+     */
+    private String visitType;
+
+    /**
+     * 就诊卡号
+     */
+    private String consultNum;
+
+    /**
+     * 门诊号
+     */
+    private String outpatientNo;
+
+    /**
+     * 科室
+     */
+    private Long doorId;
+
+    /**
+     * 姓名
+     */
+    private String consultName;
+
+    /**
+     * 出生日期
+     */
+    private String birthday;
+
+    /**
+     * 联系电话
+     */
+    private String phoneNum;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 年龄
+     */
+    private String age;
+
+    /**
+     * 体重
+     */
+    private String height;
+
+    /**
+     * 过敏食物
+     */
+    private String allergyFood;
+
+    /**
+     * 过敏药物
+     */
+    private String allergyDrug;
+
+    /**
+     * 删除标记
+     */
+    private String activity;
+
+    /**
+     * 床号
+     */
+    private String bedNo;
+
+    /**
+     * 病区
+     */
+    private Long wardId;
+
+    /**
+     * 入院时间
+     */
+    private Date admissionDate;
+
+    /**
+     * 诊断类型 0未诊 1诊中
+     */
+    private String medicalType;
+
+    /**
+     * 患者状态
+     */
+    private String consultPatientStatus;
+
+    /**
+     * 评估状态
+     */
+    private String evaluationStatus;
+
+    /**
+     * 病区名称
+     */
+    private String wardName;
+
+    /**
+     * bmi
+     */
+    private Long bmi;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    private String purpose;
+
+    private String requirements;
+
+    private String result;
+
+    private BigDecimal score;
+
+    private Integer status;
+}

+ 0 - 1
ruoyi-admin/src/main/java/org/dromara/web/domain/TreatmentUser.java

@@ -131,5 +131,4 @@ public class TreatmentUser extends BaseEntity {
 
     private String wardName;
 
-
 }

+ 138 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/ConsultPatientBo.java

@@ -0,0 +1,138 @@
+package org.dromara.web.domain.bo;
+
+import org.dromara.web.domain.ConsultPatient;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 会诊患者业务对象 consult_patient
+ *
+ * @author Huanyi
+ * @date 2025-08-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ConsultPatient.class, reverseConvertGenerate = false)
+public class ConsultPatientBo extends BaseEntity {
+
+    private Long id;
+
+    /**
+     * 看诊类型
+     */
+    private String visitType;
+
+    /**
+     * 就诊卡号
+     */
+    private String consultNum;
+
+    /**
+     * 门诊号
+     */
+    private String outpatientNo;
+
+    /**
+     * 科室
+     */
+    private Long doorId;
+
+    /**
+     * 姓名
+     */
+    private String consultName;
+
+    /**
+     * 出生日期
+     */
+    private String birthday;
+
+    /**
+     * 联系电话
+     */
+    private String phoneNum;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 身份证号
+     */
+    private String idCard;
+
+    /**
+     * 年龄
+     */
+    private String age;
+
+    /**
+     * 体重
+     */
+    private String height;
+
+    /**
+     * 过敏食物
+     */
+    private String allergyFood;
+
+    /**
+     * 过敏药物
+     */
+    private String allergyDrug;
+
+    /**
+     * 删除标记
+     */
+    private String activity;
+
+    /**
+     * 床号
+     */
+    private String bedNo;
+
+    /**
+     * 病区
+     */
+    private Long wardId;
+
+    /**
+     * 入院时间
+     */
+    private Date admissionDate;
+
+    /**
+     * 诊断类型 0未诊 1诊中
+     */
+    private String medicalType;
+
+    /**
+     * 患者状态
+     */
+    private String consultPatientStatus;
+
+    /**
+     * 评估状态
+     */
+    private String evaluationStatus;
+
+    /**
+     * 病区名称
+     */
+    private String wardName;
+
+    /**
+     * bmi
+     */
+    private Long bmi;
+
+
+}

+ 23 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/ConsultPatientEditBo.java

@@ -0,0 +1,23 @@
+package org.dromara.web.domain.bo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-13
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ConsultPatientEditBo {
+
+    private Long id;
+
+    private BigDecimal score;
+
+    private String result;
+
+}

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

@@ -0,0 +1,21 @@
+package org.dromara.web.domain.bo;
+
+import lombok.Data;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-12
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ConsultPatientInitiateBo {
+
+    private Long id;
+
+    private String purpose;
+
+    private String requirements;
+
+}

+ 23 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EmailSendBo.java

@@ -0,0 +1,23 @@
+package org.dromara.web.domain.bo;
+
+import lombok.Data;
+
+import java.io.File;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-13
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class EmailSendBo {
+
+    private String email;
+
+    private String message;
+
+    private String fileBase64;
+
+}

+ 27 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/bo/TotalPatientBo.java

@@ -0,0 +1,27 @@
+package org.dromara.web.domain.bo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-14
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class TotalPatientBo {
+
+    private Integer type;
+
+    private Integer sex;
+
+    private String medicalId;
+
+    private Date updateTimeEarliest;
+
+    private Date updateTimeLatest;
+
+}

+ 23 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/ChargeRecordTotalizeVo.java

@@ -0,0 +1,23 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-13
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class ChargeRecordTotalizeVo {
+
+    private BigDecimal availableAmount;
+
+    private BigDecimal invoicedAmount;
+
+    private Long count;
+
+}

+ 191 - 0
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/ConsultPatientVo.java

@@ -0,0 +1,191 @@
+package org.dromara.web.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.web.domain.ConsultPatient;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 会诊患者视图对象 consult_patient
+ *
+ * @author Huanyi
+ * @date 2025-08-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ConsultPatient.class)
+public class ConsultPatientVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @ExcelProperty(value = "id")
+    private Long id;
+
+    /**
+     * 看诊类型
+     */
+    @ExcelProperty(value = "看诊类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "treatment_user_type")
+    private String visitType;
+
+    /**
+     * 就诊卡号
+     */
+    @ExcelProperty(value = "就诊卡号")
+    private String consultNum;
+
+    /**
+     * 门诊号
+     */
+    @ExcelProperty(value = "门诊号")
+    private String outpatientNo;
+
+    /**
+     * 科室
+     */
+    @ExcelProperty(value = "科室")
+    private Long doorId;
+
+    /**
+     * 姓名
+     */
+    @ExcelProperty(value = "姓名")
+    private String consultName;
+
+    /**
+     * 出生日期
+     */
+    @ExcelProperty(value = "出生日期")
+    private String birthday;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String phoneNum;
+
+    /**
+     * 性别
+     */
+    @ExcelProperty(value = "性别", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_user_sex")
+    private String sex;
+
+    /**
+     * 身份证号
+     */
+    @ExcelProperty(value = "身份证号")
+    private String idCard;
+
+    /**
+     * 年龄
+     */
+    @ExcelProperty(value = "年龄")
+    private String age;
+
+    /**
+     * 体重
+     */
+    @ExcelProperty(value = "体重")
+    private String height;
+
+    /**
+     * 过敏食物
+     */
+    @ExcelProperty(value = "过敏食物")
+    private String allergyFood;
+
+    /**
+     * 过敏药物
+     */
+    @ExcelProperty(value = "过敏药物")
+    private String allergyDrug;
+
+    /**
+     * 删除标记
+     */
+    @ExcelProperty(value = "删除标记")
+    private String activity;
+
+    /**
+     * 床号
+     */
+    @ExcelProperty(value = "床号")
+    private String bedNo;
+
+    /**
+     * 病区
+     */
+    @ExcelProperty(value = "病区")
+    private Long wardId;
+
+    /**
+     * 入院时间
+     */
+    @ExcelProperty(value = "入院时间")
+    private Date admissionDate;
+
+    /**
+     * 诊断类型 0未诊 1诊中
+     */
+    @ExcelProperty(value = "诊断类型 0未诊 1诊中")
+    private String medicalType;
+
+    /**
+     * 患者状态
+     */
+    @ExcelProperty(value = "患者状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "treatment_user_status")
+    private String consultPatientStatus;
+
+    /**
+     * 评估状态
+     */
+    @ExcelProperty(value = "评估状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "evaluation_status")
+    private String evaluationStatus;
+
+    /**
+     * 病区名称
+     */
+    @ExcelProperty(value = "病区名称")
+    private String wardName;
+
+    /**
+     * bmi
+     */
+    @ExcelProperty(value = "bmi")
+    private Long bmi;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "会诊目的")
+    private String purpose;
+
+    @ExcelProperty(value = "会诊要求")
+    private String requirements;
+
+    private String result;
+
+    private BigDecimal score;
+
+    private Integer status;
+
+}

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

@@ -0,0 +1,45 @@
+package org.dromara.web.domain.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-14
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Data
+public class TotalPatientVo {
+
+    private Long id;
+
+    private Date updateTime;
+
+    private String name;
+
+    private String type;
+
+    private String sex;
+
+    private String age;
+
+    private String idCard;
+
+    private String medicalId;
+
+    private Date appointmentTime;
+
+    private String phoneNumber;
+
+    private String principleAction;
+
+    private String presentIllnessHistory;
+
+    private String previousHistory;
+
+    private String diagnose;
+
+}

+ 12 - 0
ruoyi-admin/src/main/java/org/dromara/web/mapper/ChargeRecordMapper.java

@@ -1,7 +1,9 @@
 package org.dromara.web.mapper;
 
+import org.apache.ibatis.annotations.Select;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.web.domain.ChargeRecord;
+import org.dromara.web.domain.vo.ChargeRecordTotalizeVo;
 import org.dromara.web.domain.vo.ChargeRecordVo;
 import org.springframework.stereotype.Repository;
 
@@ -14,4 +16,14 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface ChargeRecordMapper extends BaseMapperPlus<ChargeRecord, ChargeRecordVo> {
 
+    @Select(
+        """
+        SELECT
+            SUM(CASE WHEN whether_invoice = 0 THEN funds_received ELSE 0 END) AS availableAmount,
+            SUM(CASE WHEN whether_invoice = 1 THEN funds_received ELSE 0 END) AS invoicedAmount,
+            COUNT(CASE WHEN whether_invoice = 1 THEN 1 END) AS count
+        FROM charge_record;
+        """
+    )
+    ChargeRecordTotalizeVo totalize();
 }

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

@@ -0,0 +1,15 @@
+package org.dromara.web.mapper;
+
+import org.dromara.web.domain.ConsultPatient;
+import org.dromara.web.domain.vo.ConsultPatientVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 会诊患者Mapper接口
+ *
+ * @author Huanyi
+ * @date 2025-08-12
+ */
+public interface ConsultPatientMapper extends BaseMapperPlus<ConsultPatient, ConsultPatientVo> {
+
+}

+ 17 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/EmailService.java

@@ -0,0 +1,17 @@
+package org.dromara.web.service;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.web.domain.bo.EmailSendBo;
+
+import java.io.File;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-13
+ * @Description:
+ * @Version: 1.0
+ */
+
+public interface EmailService {
+    R send(EmailSendBo bo);
+}

+ 5 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/IChargeRecordService.java

@@ -1,6 +1,7 @@
 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.ChargeRecordBo;
@@ -66,4 +67,8 @@ public interface IChargeRecordService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    TableDataInfo<ChargeRecordVo> queryInvoicePageList(PageQuery pageQuery);
+
+    R totalize();
 }

+ 75 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/IConsultPatientService.java

@@ -0,0 +1,75 @@
+package org.dromara.web.service;
+
+import org.dromara.common.core.domain.R;
+import org.dromara.web.domain.bo.ConsultPatientEditBo;
+import org.dromara.web.domain.bo.ConsultPatientInitiateBo;
+import org.dromara.web.domain.vo.ConsultPatientVo;
+import org.dromara.web.domain.bo.ConsultPatientBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 会诊患者Service接口
+ *
+ * @author Huanyi
+ * @date 2025-08-12
+ */
+public interface IConsultPatientService {
+
+    /**
+     * 查询会诊患者
+     *
+     * @param id 主键
+     * @return 会诊患者
+     */
+    ConsultPatientVo queryById(Long id);
+
+    /**
+     * 分页查询会诊患者列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 会诊患者分页列表
+     */
+    TableDataInfo<ConsultPatientVo> queryPageList(ConsultPatientBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的会诊患者列表
+     *
+     * @param bo 查询条件
+     * @return 会诊患者列表
+     */
+    List<ConsultPatientVo> queryList(ConsultPatientBo bo);
+
+    /**
+     * 新增会诊患者
+     *
+     * @param bo 会诊患者
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ConsultPatientBo bo);
+
+    /**
+     * 修改会诊患者
+     *
+     * @param bo 会诊患者
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ConsultPatientBo bo);
+
+    /**
+     * 校验并批量删除会诊患者信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    R initiateConsultation(ConsultPatientInitiateBo bo);
+
+    R edit(ConsultPatientEditBo bo);
+}

+ 17 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/TotalPatientService.java

@@ -0,0 +1,17 @@
+package org.dromara.web.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.web.domain.bo.TotalPatientBo;
+import org.dromara.web.domain.vo.TotalPatientVo;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-14
+ * @Description:
+ * @Version: 1.0
+ */
+
+public interface TotalPatientService {
+    TableDataInfo<TotalPatientVo> listPage(TotalPatientBo bo, PageQuery pageQuery);
+}

+ 22 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/ChargeRecordServiceImpl.java

@@ -1,5 +1,7 @@
 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;
@@ -11,6 +13,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.web.domain.ChargeRecord;
 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;
@@ -150,4 +153,23 @@ public class ChargeRecordServiceImpl implements IChargeRecordService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    @Override
+    public TableDataInfo<ChargeRecordVo> queryInvoicePageList(PageQuery pageQuery) {
+        LambdaQueryWrapper<ChargeRecord> wrapper = buildInvoiceQueryWrapper();
+        IPage<ChargeRecordVo> page = baseMapper.selectVoPage(pageQuery.build(), wrapper);
+        return TableDataInfo.build(page);
+    }
+
+    @Override
+    public R totalize() {
+        return R.ok(baseMapper.totalize());
+    }
+
+    private LambdaQueryWrapper<ChargeRecord> buildInvoiceQueryWrapper() {
+        LambdaQueryWrapper<ChargeRecord> wrapper = new LambdaQueryWrapper<>();
+        wrapper.orderByAsc(ChargeRecord::getId)
+            .eq(ChargeRecord::getWhetherInvoice, 0);
+        return wrapper;
+    }
 }

+ 220 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/ConsultPatientServiceImpl.java

@@ -0,0 +1,220 @@
+package org.dromara.web.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.web.domain.bo.ConsultPatientEditBo;
+import org.dromara.web.domain.bo.ConsultPatientInitiateBo;
+import org.dromara.web.domain.vo.TreatmentUserVo;
+import org.dromara.web.mapper.TreatmentUserMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.web.domain.bo.ConsultPatientBo;
+import org.dromara.web.domain.vo.ConsultPatientVo;
+import org.dromara.web.domain.ConsultPatient;
+import org.dromara.web.mapper.ConsultPatientMapper;
+import org.dromara.web.service.IConsultPatientService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 会诊患者Service业务层处理
+ *
+ * @author Huanyi
+ * @date 2025-08-12
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ConsultPatientServiceImpl implements IConsultPatientService {
+
+    private final ConsultPatientMapper baseMapper;
+    private final TreatmentUserMapper treatmentUserMapper;
+
+    /**
+     * 查询会诊患者
+     *
+     * @param id 主键
+     * @return 会诊患者
+     */
+    @Override
+    public ConsultPatientVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询会诊患者列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 会诊患者分页列表
+     */
+    @Override
+    public TableDataInfo<ConsultPatientVo> queryPageList(ConsultPatientBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ConsultPatient> lqw = buildQueryWrapper(bo);
+        Page<ConsultPatientVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的会诊患者列表
+     *
+     * @param bo 查询条件
+     * @return 会诊患者列表
+     */
+    @Override
+    public List<ConsultPatientVo> queryList(ConsultPatientBo bo) {
+        LambdaQueryWrapper<ConsultPatient> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ConsultPatient> buildQueryWrapper(ConsultPatientBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ConsultPatient> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ConsultPatient::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getVisitType()), ConsultPatient::getVisitType, bo.getVisitType());
+        lqw.eq(StringUtils.isNotBlank(bo.getConsultNum()), ConsultPatient::getConsultNum, bo.getConsultNum());
+        lqw.eq(StringUtils.isNotBlank(bo.getOutpatientNo()), ConsultPatient::getOutpatientNo, bo.getOutpatientNo());
+        lqw.eq(bo.getDoorId() != null, ConsultPatient::getDoorId, bo.getDoorId());
+        lqw.like(StringUtils.isNotBlank(bo.getConsultName()), ConsultPatient::getConsultName, bo.getConsultName());
+        lqw.eq(StringUtils.isNotBlank(bo.getBirthday()), ConsultPatient::getBirthday, bo.getBirthday());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhoneNum()), ConsultPatient::getPhoneNum, bo.getPhoneNum());
+        lqw.eq(StringUtils.isNotBlank(bo.getSex()), ConsultPatient::getSex, bo.getSex());
+        lqw.eq(StringUtils.isNotBlank(bo.getIdCard()), ConsultPatient::getIdCard, bo.getIdCard());
+        lqw.eq(StringUtils.isNotBlank(bo.getAge()), ConsultPatient::getAge, bo.getAge());
+        lqw.eq(StringUtils.isNotBlank(bo.getHeight()), ConsultPatient::getHeight, bo.getHeight());
+        lqw.eq(StringUtils.isNotBlank(bo.getAllergyFood()), ConsultPatient::getAllergyFood, bo.getAllergyFood());
+        lqw.eq(StringUtils.isNotBlank(bo.getAllergyDrug()), ConsultPatient::getAllergyDrug, bo.getAllergyDrug());
+        lqw.eq(StringUtils.isNotBlank(bo.getActivity()), ConsultPatient::getActivity, bo.getActivity());
+        lqw.eq(StringUtils.isNotBlank(bo.getBedNo()), ConsultPatient::getBedNo, bo.getBedNo());
+        lqw.eq(bo.getWardId() != null, ConsultPatient::getWardId, bo.getWardId());
+        lqw.eq(bo.getAdmissionDate() != null, ConsultPatient::getAdmissionDate, bo.getAdmissionDate());
+        lqw.eq(StringUtils.isNotBlank(bo.getMedicalType()), ConsultPatient::getMedicalType, bo.getMedicalType());
+        lqw.eq(StringUtils.isNotBlank(bo.getConsultPatientStatus()), ConsultPatient::getConsultPatientStatus, bo.getConsultPatientStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getEvaluationStatus()), ConsultPatient::getEvaluationStatus, bo.getEvaluationStatus());
+        lqw.like(StringUtils.isNotBlank(bo.getWardName()), ConsultPatient::getWardName, bo.getWardName());
+        lqw.eq(bo.getBmi() != null, ConsultPatient::getBmi, bo.getBmi());
+//        lqw.ne(ConsultPatient::getStatus, 2);
+        return lqw;
+    }
+
+    /**
+     * 新增会诊患者
+     *
+     * @param bo 会诊患者
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ConsultPatientBo bo) {
+        ConsultPatient add = MapstructUtils.convert(bo, ConsultPatient.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改会诊患者
+     *
+     * @param bo 会诊患者
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ConsultPatientBo bo) {
+        ConsultPatient update = MapstructUtils.convert(bo, ConsultPatient.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ConsultPatient entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除会诊患者信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R initiateConsultation(ConsultPatientInitiateBo bo) {
+
+        TreatmentUserVo vo = treatmentUserMapper.selectVoById(bo.getId());
+        ConsultPatient patient = new ConsultPatient();
+        patient.setVisitType(vo.getType());
+        patient.setConsultNum(vo.getTreatNum());
+        patient.setOutpatientNo(vo.getOutpatientNo());
+        patient.setDoorId(vo.getDoorId());
+        patient.setConsultName(vo.getTreatName());
+        patient.setBirthday(vo.getBirthday());
+        patient.setPhoneNum(vo.getPhoneNum());
+        patient.setSex(vo.getSex());
+        patient.setIdCard(vo.getIdCard());
+        patient.setAge(vo.getAge());
+        patient.setHeight(vo.getHeight());
+        patient.setAllergyFood(vo.getAllergyFoot());
+        patient.setAllergyDrug(vo.getAllergyDrug());
+        patient.setActivity(vo.getActivity());
+        patient.setBedNo(vo.getBedNo());
+        patient.setWardId(vo.getWardId());
+        patient.setAdmissionDate(vo.getAdmissionDate());
+        patient.setMedicalType(vo.getMedicalType());
+        patient.setConsultPatientStatus(vo.getTreatmentUserStatus());
+        patient.setEvaluationStatus(vo.getEvaluationStatus());
+        patient.setWardName(vo.getWardName());
+        patient.setRequirements(bo.getRequirements());
+        patient.setPurpose(bo.getPurpose());
+
+        int flag = baseMapper.insert(patient);
+        if (flag <= 0) {
+            throw new RuntimeException("申请会诊失败!");
+        }
+
+        return R.ok();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R edit(ConsultPatientEditBo bo) {
+
+        LambdaQueryWrapper<ConsultPatient> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ConsultPatient::getId, bo.getId());
+        ConsultPatient patient = baseMapper.selectOne(queryWrapper);
+        LambdaUpdateWrapper<ConsultPatient> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(ConsultPatient::getId, bo.getId())
+            .set(ConsultPatient::getStatus, patient.getStatus() == 0 ? 1 : 2)
+            .set(ConsultPatient::getScore, bo.getScore())
+            .set(ConsultPatient::getResult, bo.getResult());
+        int flag = baseMapper.update(wrapper);
+        if (flag <= 0) {
+            throw new RuntimeException("结束会诊失败");
+        }
+
+        return R.ok();
+    }
+}

+ 50 - 0
ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailServiceImpl.java

@@ -0,0 +1,50 @@
+package org.dromara.web.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mail.utils.MailUtils;
+import org.dromara.web.domain.bo.EmailSendBo;
+import org.dromara.web.service.EmailService;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.Base64;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-13
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class EmailServiceImpl implements EmailService {
+
+    @Override
+    public R send(EmailSendBo bo) {
+
+        String base64 = bo.getFileBase64();
+        byte[] bytes = Base64.getDecoder().decode(base64);
+
+        try {
+
+            File goal = File.createTempFile("prefix", ".tmp");
+            goal.deleteOnExit();
+
+            FileOutputStream fos = new FileOutputStream(goal);
+            fos.write(bytes);
+
+            MailUtils.sendText(bo.getEmail(), "测试", bo.getMessage(), goal);
+        } catch (Exception e) {
+            log.error("邮箱发送失败 : {}", e.getMessage());
+            throw new RuntimeException("邮箱发送失败 : " + e.getMessage());
+        }
+
+        return R.ok();
+    }
+}

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

@@ -0,0 +1,69 @@
+package org.dromara.web.service.impl;
+import java.sql.Date;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.web.domain.TreatmentUser;
+import org.dromara.web.domain.bo.TotalPatientBo;
+import org.dromara.web.domain.vo.TotalPatientVo;
+import org.dromara.web.mapper.TreatmentUserMapper;
+import org.dromara.web.service.TotalPatientService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: Huanyi
+ * @CreateTime: 2025-08-14
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class TotalPatientServiceImpl implements TotalPatientService {
+
+    private final TreatmentUserMapper treatmentUserMapper;
+
+    @Override
+    public TableDataInfo<TotalPatientVo> listPage(TotalPatientBo bo, PageQuery pageQuery) {
+
+        LambdaQueryWrapper<TreatmentUser> wrapper = buildQueryWrapper(bo);
+        IPage<TreatmentUser> page = treatmentUserMapper.selectPage(pageQuery.build(), wrapper);
+        return TableDataInfo.build(page.convert(this::convertToVo));
+    }
+
+    private TotalPatientVo convertToVo(TreatmentUser user) {
+        TotalPatientVo vo = new TotalPatientVo();
+        vo.setId(user.getId());
+        vo.setUpdateTime(user.getUpdateTime());
+        vo.setName(user.getTreatName());
+        vo.setType(user.getType());
+        vo.setSex(user.getSex());
+        vo.setAge(user.getAge());
+        vo.setIdCard(user.getIdCard());
+        vo.setMedicalId(user.getTreatNum());
+//        vo.setAppointmentTime();
+        vo.setPhoneNumber(user.getPhoneNum());
+//        vo.setPrincipleAction("");
+//        vo.setPresentIllnessHistory("");
+//        vo.setPreviousHistory("");
+//        vo.setDiagnose("");
+        return vo;
+    }
+
+    private LambdaQueryWrapper<TreatmentUser> buildQueryWrapper(TotalPatientBo bo) {
+        LambdaQueryWrapper<TreatmentUser> wrapper = new LambdaQueryWrapper<>();
+
+        wrapper.eq(bo.getType() != null, TreatmentUser::getType, bo.getType())
+            .eq(bo.getSex() != null, TreatmentUser::getSex, bo.getSex())
+            .like(bo.getMedicalId() != null, TreatmentUser::getTreatNum, bo.getMedicalId())
+            .ge(bo.getUpdateTimeEarliest() != null, TreatmentUser::getUpdateTime, bo.getUpdateTimeEarliest())
+            .le(bo.getUpdateTimeLatest() != null, TreatmentUser::getUpdateTime, bo.getUpdateTimeLatest());
+        return wrapper;
+    }
+}

+ 6 - 6
ruoyi-admin/src/main/resources/application-dev.yml

@@ -13,7 +13,7 @@ spring.boot.admin.client:
 
 --- # snail-job 配置
 snail-job:
-  enabled:  false
+  enabled: false
   # 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
   group: "ruoyi_group"
   # SnailJob 接入验证令牌 详见 script/sql/ry_job.sql `sj_group_config` 表
@@ -135,17 +135,17 @@ redisson:
 
 --- # mail 邮件发送
 mail:
-  enabled: false
-  host: smtp.163.com
+  enabled: true
+  host: smtp.qq.com
   port: 465
   # 是否需要用户名密码验证
   auth: true
   # 发送方,遵循RFC-822标准
-  from: xxx@163.com
+  from: 2053999261@qq.com
   # 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
-  user: xxx@163.com
+  user: 2053999261@qq.com
   # 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
-  pass: xxxxxxxxxx
+  pass: iblppzcfoyrgbifg
   # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
   starttlsEnable: true
   # 使用SSL安全连接

+ 7 - 0
ruoyi-admin/src/main/resources/mapper/ConsultPatientMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.web.mapper.ConsultPatientMapper">
+
+</mapper>

+ 41 - 1
script/sql/biz/create.sql

@@ -448,7 +448,7 @@ CREATE TABLE `enteral_nutrition_template`
 CREATE TABLE `invoice_setting`
 (
     `id`          bigint PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT 'id',
-    `tenant_id`            varchar(20) COLLATE utf8mb4_unicode_ci  DEFAULT '000000' COMMENT '租户编号',
+    `tenant_id`   varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT '000000' COMMENT '租户编号',
     `payee`       varchar(255) COMMENT '收款人',
     `reviewer`    varchar(255) COMMENT '复核人',
     `drawer`      varchar(255) COMMENT '开票人',
@@ -461,3 +461,43 @@ CREATE TABLE `invoice_setting`
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4
   COLLATE = utf8mb4_unicode_ci COMMENT ='发票设置';
+
+CREATE TABLE `consult_patient`
+(
+    `id`                     bigint PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT 'id',
+    `tenant_id`              varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT '000000' COMMENT '租户编号',
+    `visit_type`             char(1)                                DEFAULT '0' COMMENT '看诊类型',
+    `consult_num`            varchar(255) COMMENT '就诊卡号',
+    `outpatient_no`          varchar(64) COMMENT '门诊号',
+    `door_id`                bigint COMMENT '科室',
+    `consult_name`           varchar(64) COMMENT '姓名',
+    `birthday`               varchar(50) COMMENT '出生日期',
+    `phone_num`              varchar(50) COMMENT '联系电话',
+    `sex`                    char(1) COMMENT '性别',
+    `id_card`                varchar(255) COMMENT '身份证号',
+    `age`                    varchar(10) COMMENT '年龄',
+    `height`                 varchar(10) COMMENT '体重',
+    `allergy_food`           varchar(255) COMMENT '过敏食物',
+    `allergy_drug`           varchar(255) COMMENT '过敏药物',
+    `activity`               char(1) COMMENT '删除标记',
+    `bed_no`                 varchar(64) COMMENT '床号',
+    `ward_id`                bigint COMMENT '病区',
+    `admission_date`         datetime COMMENT '入院时间',
+    `medical_type`           char(1) COMMENT '诊断类型 0未诊 1诊中',
+    `consult_patient_status` char(1) COMMENT '患者状态',
+    `evaluation_status`      char(1) COMMENT '评估状态',
+    `ward_name`              char(1) COMMENT '病区名称',
+    `bmi`                    decimal(10, 2) COMMENT 'bmi',
+    `purpose`                text COMMENT '会诊目的',
+    `requirements`           text COMMENT '会诊要求',
+    `score`                  decimal(10, 2) COMMENT '筛查得分',
+    `result`                 text COMMENT '会诊结果',
+    `del_flag`               char(1) COLLATE utf8mb4_unicode_ci     DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `create_dept`            bigint                                 DEFAULT NULL COMMENT '创建部门',
+    `create_by`              varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+    `create_time`            datetime                               DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_by`              varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+    `update_time`            datetime                               DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_unicode_ci COMMENT ='会诊患者';

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 66 - 0
script/sql/biz/dump_2025_08_14.sql


+ 3 - 0
script/sql/biz/update.sql

@@ -21,3 +21,6 @@ ALTER TABLE `enteral_nutrition_template` ADD COLUMN `type` tinyint(1) COMMENT '
 ALTER TABLE `enteral_nutrition_template` ADD COLUMN `template_type` tinyint(1) COMMENT '模板类型(0 个人模板; 1 基础公共模板)';
 
 ALTER TABLE `invoice_setting` ADD COLUMN `drawer_type` tinyint(1) COMMENT '开票人类型(0 固定人员名称; 1 跟随账号名称)';
+ALTER TABLE `charge_record` ADD COLUMN `whether_invoice` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否已开票(0 否; 1 是)';
+ALTER TABLE `consult_patient` ADD COLUMN `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '诊断状态(0 会诊中; 1 已结束)';
+ALTER TABLE `consult_patient` MODIFY COLUMN `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '诊断状态(0 待会诊; 1 会诊中; 2 已结束)';

Vissa filer visades inte eftersom för många filer har ändrats