diff --git a/md/需求/103-医生个人报卡管理界面-2026-1-29.md b/md/需求/103-医生个人报卡管理界面-2026-1-29.md new file mode 100644 index 00000000..4e17d5f6 --- /dev/null +++ b/md/需求/103-医生个人报卡管理界面-2026-1-29.md @@ -0,0 +1,349 @@ +## 医生个人报卡管理界面PRD文档 + +### 一、页面概述 + +**页面名称**:医生个人报卡管理界面 + **页面目标**:为医生提供传染病报告卡的管理功能,包括查看、编辑、提交、撤回、导出等操作,并提供数据统计和筛选功能。 + **适用场景**:医生需要查看/编辑或管理已填写的传染病报告卡,进行批量操作或筛选特定状态的报告卡 + **页面类型**:列表页(含筛选功能) + 表单页(编辑/查看模态框)。 + +**核心功能**: + +1. 报卡数据统计展示(总报卡数/待处理失败/已成功上报) +2. 报卡列表筛选与查询(按日期/状态/关键词) +3. 报卡详情查看与编辑 +4. 批量操作(全选/批量提交/批量删除) +5. 报卡导出为Word格式 + +**用户价值**: + +- 快速掌握个人报卡工作整体情况 +- 高效管理不同状态的报卡记录 +- 规范疾病报告卡流程,确保数据及时准确上报 +**原型图地址**:https://static.pm-ai.cn/prototype/20260129/865d147e5650ff42c054b38244ed8239/index.html +**流程图**: + ```mermaid +flowchart TD + Start([医生进入个人报卡管理界面]) --> Load[展示数据统计卡片] + Load --> Stats[展示统计卡片\n总报卡数待处理已上报] + Stats --> Filter[渲染筛选区日期状态名称] + Filter --> Table[展示报卡列表] + + Table --> Op{用户操作选择} + + Op -->|点击查看| View1[弹出只读模态框] + View1 --> View2[展示完整报卡信息] + View2 --> View3[关闭模态框] + View3 --> Table + + Op -->|点击编辑| Edit1{状态是待提交?} + Edit1 -->|否| Table + Edit1 -->|是| Edit2[弹出编辑模态框] + Edit2 --> Edit3[修改表单字段] + Edit3 --> Edit4[点击保存] + Edit4 --> Edit5{验证必填项} + Edit5 -->|失败| Edit6[显示错误原因] + Edit6 --> Edit2 + Edit5 -->|通过| Edit7[保存数据] + Edit7 --> Edit8[提示成功] + Edit8 --> Table + + Op -->|点击提交| Sub1{状态是待提交?} + Sub1 -->|是| Sub2[确认对话框] + Sub2 --> Sub3[变更为已提交] + Sub3 --> Sub4[刷新表格统计] + Sub4 --> Table + Sub1 -->|否| Table + + Op -->|点击撤回| Back1{状态是已提交?} + Back1 -->|是| Back2[变更为待提交] + Back2 --> Table + Back1 -->|否| Table + + Op -->|点击导出| Exp1{状态是已上报?} + Exp1 -->|是| Exp2[报告卡导出预览] + Exp2 --> Exp3[导出Word文档] + Exp3 --> Table + Exp1 -->|否| Table + + Op -->|应用筛选| Filt1[触发筛选条件] + Filt1 --> Filt2[重新加载列表] + Filt2 --> Table + + Op -->|批量操作| Batch1{已选记录?} + Batch1 -->|否| Batch2[提示请选择记录] + Batch2 --> Table + Batch1 -->|是| Batch3{操作类型} + + Batch3 -->|批量提交| Batch4{全是待提交?} + Batch4 -->|否| Batch5[提示只能提交待提交] + Batch5 --> Table + Batch4 -->|是| Batch6[确认数量] + Batch6 --> Batch7[更新为已提交] + Batch7 --> Batch8[刷新统计数据] + Batch8 --> Table + + Batch3 -->|批量删除| Batch9{全是待提交?} + Batch9 -->|否| Batch10[提示只能删除待提交] + Batch10 --> Table + Batch9 -->|是| Batch11[确认删除] + Batch11 --> Batch12[状态变为作废] + Batch12 --> Batch13[刷新数据] + Batch13 --> Table +``` + +### 二、整体布局分析 + +**页面宽度**:自适应布局 + **主要区域划分**: + +1. **顶部标题区**(5%):页面标题。 +2. **数据统计区**(15%):展示总报卡数、待处理失败数、已成功上报数。 +3. **高级筛选区**(15%):提供日期范围、状态、报卡名称等筛选条件。 +4. **数据表格区**(55%):展示报卡列表,支持多选和操作按钮。 +5. **底部批量操作区**(10%):全选、批量删除、批量提交功能。 + +**布局特点**:上下布局,采用卡片式设计,主内容区为表格展示 + +### 三、页面区域详细描述 + +#### 1. 顶部标题区 + +**区域位置**:页面最上方 + **区域尺寸**:高度60px,宽度100%。 + **区域功能**:展示页面标题和主要操作入口 + **包含元素**: + +- **页面标题**: + +- - 元素类型:文本 + - 显示内容:“我的报卡” + - 样式特征:20px/600,深灰色(#1e293b) + +#### 2. 数据统计卡片区 + +**区域位置**:标题区下方 + **区域尺寸**:高度150px,宽度100%。 + **区域功能**:展示关键统计数据,帮助医生快速了解报卡状态分布。 + **包含元素**: + +- **总报卡数卡片**: + +- - 元素类型:统计卡片 + - 显示内容:图标+数值+“总报卡数” + - 样式特征:紫色渐变背景,圆角12px + +- **待处理失败卡片**: + +- - 同总报卡数卡片,红色系配色 + +- **已成功上报卡片**: + +- - 同总报卡数卡片,绿色系配色 + +#### 3. 高级筛选区 + +**区域位置**:统计卡片下方 + **区域尺寸**:高度150px,宽度100% + **区域功能**:提供多维筛选条件,支持快速定位目标报卡。 + **包含元素**: + +- **日期范围选择器**: + +- - 元素类型:表单控件(两个date输入框) + - 交互行为:选择日期后触发筛选。 + - 限制条件:结束日期不能早于开始日期。 + +- **状态筛选下拉框**: + +- - 元素类型:下拉选择 + - 可选值:全部状态/待提交/已提交/已审核/已上报/失败/作废 + +- **报卡名称搜索框**: + +- - 元素类型:文本输入框 + - 占位文本:“输入报卡名称…” + +- **应用筛选按钮**: + +- - 元素类型:主要操作按钮 + - 交互行为:点击后触发表格数据刷新 + +- **重置条件按钮**: + +- - 元素类型:次要操作按钮 + - 交互行为:清空所有筛选条件 + +#### 4. 数据表格区 + +**区域位置**:页面中部 + **区域尺寸**:高度自适应,宽度100%。 + **区域功能**:展示报卡列表及提供行级操作 + **包含元素**: + +- **表格头部**: + +**数据主要取值于传染病报卡表(infectious_card)** + +- - 包含字段:选择框、卡片ID、患者姓名、身份证号、联系电话、就诊卡号、报卡名称、提交时间、状态、操作 + - 样式特征:灰色背景,13px字号,大写字母 + +- **表格内容行**: + +- - 展示方式:每行显示一条报卡记录 + + - 数据字段: + + - - 卡片ID:文本 - HOSP202601150001 - 不可操作 + - 患者姓名:文本 - 张三 - 不可操作 + - 身份证号:不脱敏文本 - 110101199001011234 - 不可操作 + - 联系电话:文本 - 13800138000 - 不可操作 + - 就诊卡号:文本 - M12345678 - 不可操作 + - 报卡名称:文本 - 中华人民共和国传染病报告卡 - 不可操作 + - 提交时间:时间 - 2026-01-15 14:30 - 不可操作 + - 状态标签:根据状态值显示不同颜色 + + - 操作功能: + + - - 查看按钮:所有状态可见 + - 编辑按钮:仅"待提交"状态可见 + - 提交按钮:仅"待提交"状态可见 + - 撤回按钮:仅"已提交"状态可见 + - 导出按钮:仅"已上报"状态可见 + +#### 5. 底部批量操作区 + +**区域位置**:页面底部 + **区域尺寸**:高度60px,宽度100%。 + **区域功能**:支持批量操作选中报卡。 + **包含元素**: + +- **全选复选框**: + +- - 交互行为:勾选后选中当前页所有记录 + +- **批量删除按钮**: + +- - 元素类型:文本按钮 + - 限制条件:仅对"待提交"状态记录有效 + - 交互行为:提交后状态变为"作废"。 + +- **批量提交按钮**: + +- - 元素类型:主要操作按钮 + - 限制条件:仅对"待提交"状态记录有效 + - 交互行为:提交后状态变为"已提交"。 + +#### 6. 报卡详情弹窗(界面内容功能与需求编号102界面保持一致,建议用同一个界面) + +**区域位置**:页面居中模态框 + **区域功能**:查看/编辑完整报卡信息 + **包含元素**: + +- 表单字段(按模块分组): + +- 1. 患者基本信息(姓名/身份证号/联系方式*) + 2. 临床信息(发病日期/诊断日期*) + 3. 传染病分类(甲/乙/丙类多选*) + 4. 报告信息(报告单位/医生*) + +- 操作按钮: + +o 取消:关闭弹窗不保存 + +o 保存:验证必填项后保持数据 + +### 四、交互功能详细说明 + +#### 1. 报卡查看功能 + +**功能描述**:查看报卡详细信息 + **触发条件**:点击任意行的"查看"按钮 + **操作流程**: + +1. 弹出模态框展示完整报卡信息 +2. 所有字段为只读状态 +3. 点击关闭按钮或蒙层关闭模态框 + +#### 2. 报卡编辑功能 + +**功能描述**:修改待提交的报卡信息 + **触发条件**:点击"待提交"状态的"编辑"按钮 + **操作流程**: + +1. 弹出可编辑的报卡表单模态框 +2. 修改必要字段(带*号为必填项) +3. 点击"保存"按钮提交修改 +4. 成功提示后关闭模态框 + +#### 3. 批量提交功能 + +**功能描述**:批量提交选中的待提交报卡 + **触发条件**:勾选记录后点击"批量提交"按钮 + **操作流程**: + +1. 校验是否选中有效记录(状态为待提交) +2. 弹出确认对话框显示待提交数量 +3. 确认后更新记录状态为"已提交" +4. 刷新表格数据和统计卡片 + +**异常处理**: + +- 未选中记录:提示"请选择待提交的记录" +- 包含不可提交记录:提示"只能提交待提交状态的记录" + +#### 4. 报卡状态流转 + +**触发方式**:点击操作列按钮 + **执行流程**: + +1. 待提交 → 已提交:点击"提交"按钮 → 弹窗确认 → 状态变更 +2. 已提交 → 待提交:点击"撤回"按钮 → 状态回滚 +3. 已上报 → 导出:生成标准疾病报告卡Word文档(含医院红头格式) + +**异常处理**: + +- 提交失败:显示具体错误原因(如:必填项未完成) + +### 五、数据结构说明 + +**关键数据字段**: + +**传染病报卡表(infectious_card)** + +### 六、开发实现要点 + +**样式规范**: + +- **主色调**:#6366f1(紫色) + +- **状态色**: + +- - 待提交:#f59e0b(橙色) + - 已提交:#2563eb(蓝色) + - 已上报:#16a34a(绿色) + - 失败:#dc2626(红色) + +- **字体规范**: + +- - 标题:20px/600 + - 正文:14px/400 + +- **间距系统**: + +- - 卡片内边距:24px + - 元素间距:16px + +**技术要求**: + +- **表格组件**:需支持虚拟滚动(大数据量场景) +- **导出功能**:实现Word导出 + +**注意事项**: + +1. 身份证号等敏感信息不需做脱敏处理 +2. 批量操作需考虑性能优化(分页处理) +3. 状态变更需同步更新统计卡片数据 +4. 移动端需特别处理表格的横向滚动体验 +5. ‘待提交’状态就是‘暂存’状态 +6. 只能查询医生本人报卡的数据 \ No newline at end of file diff --git a/openhis-server-new/core-admin/src/main/java/com/core/web/controller/common/FrontRouterController.java b/openhis-server-new/core-admin/src/main/java/com/core/web/controller/common/FrontRouterController.java new file mode 100644 index 00000000..e84424c1 --- /dev/null +++ b/openhis-server-new/core-admin/src/main/java/com/core/web/controller/common/FrontRouterController.java @@ -0,0 +1,46 @@ +package com.core.web.controller.common; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * 前端路由 fallback 控制器 + * 处理 Vue Router History 模式下的路由 + * + * @author + */ +@Controller +public class FrontRouterController { + + /** + * 处理前端路由,将所有前端路由请求转发到 index.html + */ + @RequestMapping(value = { + "/ybmanagement/**", + "/system/**", + "/monitor/**", + "/tool/**", + "/doctorstation/**", + "/features/**", + "/todo/**", + "/appoinmentmanage/**", + "/clinicmanagement/**", + "/medicationmanagement/**", + "/yb/**", + "/patient/**", + "/charge/**", + "/nurse/**", + "/pharmacy/**", + "/report/**", + "/document/**", + "/triage/**", + "/check/**", + "/lab/**", + "/financial/**", + "/crosssystem/**", + "/workflow/**" + }) + public String index() { + return "forward:/index.html"; + } +} \ No newline at end of file diff --git a/openhis-server-new/core-common/src/main/java/com/core/common/core/domain/PageResult.java b/openhis-server-new/core-common/src/main/java/com/core/common/core/domain/PageResult.java new file mode 100644 index 00000000..e3420295 --- /dev/null +++ b/openhis-server-new/core-common/src/main/java/com/core/common/core/domain/PageResult.java @@ -0,0 +1,34 @@ +package com.core.common.core.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 分页结果类 + * + * @author + * @date 2026-02-02 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 数据列表 + */ + private List rows; + + /** + * 总数 + */ + private long total; +} \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/impl/OutpatientRegistrationAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/impl/OutpatientRegistrationAppServiceImpl.java index 78623cba..6e65d769 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/impl/OutpatientRegistrationAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/chargemanage/appservice/impl/OutpatientRegistrationAppServiceImpl.java @@ -10,16 +10,21 @@ import com.core.common.utils.MessageUtils; import com.core.common.utils.SecurityUtils; import com.core.common.utils.StringUtils; import com.core.common.utils.bean.BeanUtils; +import com.core.common.core.domain.entity.SysRole; +import com.core.common.core.domain.model.LoginUser; import com.openhis.administration.domain.*; import com.openhis.administration.mapper.PatientMapper; import com.openhis.administration.service.*; import com.openhis.common.constant.CommonConstants; import com.openhis.common.constant.PromptMsgConstant; import com.openhis.common.enums.*; +import com.openhis.common.enums.ybenums.YbPayment; import com.openhis.common.utils.EnumUtils; import com.openhis.common.utils.HisPageUtils; import com.openhis.common.utils.HisQueryUtils; import com.openhis.financial.domain.PaymentReconciliation; +import com.openhis.financial.domain.RefundLog; +import com.openhis.financial.service.IRefundLogService; import com.openhis.web.basicservice.dto.HealthcareServiceDto; import com.openhis.web.basicservice.mapper.HealthcareServiceBizMapper; import com.openhis.web.chargemanage.appservice.IOutpatientRegistrationAppService; @@ -40,10 +45,14 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; /** * 门诊挂号 应用实现类 @@ -85,6 +94,9 @@ public class OutpatientRegistrationAppServiceImpl implements IOutpatientRegistra @Resource TriageCandidateExclusionService triageCandidateExclusionService; + @Resource + IRefundLogService iRefundLogService; + /** * 门诊挂号 - 查询患者信息 * @@ -260,7 +272,7 @@ public class OutpatientRegistrationAppServiceImpl implements IOutpatientRegistra R result = iPaymentRecService.cancelRegPayment(cancelPaymentDto); PaymentReconciliation paymentRecon = null; - if (PaymentReconciliation.class.isAssignableFrom(result.getData().getClass())) { + if (result.getData() != null && PaymentReconciliation.class.isAssignableFrom(result.getData().getClass())) { paymentRecon = (PaymentReconciliation)result.getData(); } if (paymentRecon != null) { @@ -275,6 +287,9 @@ public class OutpatientRegistrationAppServiceImpl implements IOutpatientRegistra } } + // 记录退号日志 + recordRefundLog(cancelRegPaymentDto, byId, result, paymentRecon); + // 2025/05/05 该处保存费用项后,会通过统一收费处理进行收费 return R.ok(paymentRecon, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[] {"退号"})); } @@ -394,4 +409,124 @@ public class OutpatientRegistrationAppServiceImpl implements IOutpatientRegistra return R.ok(null, "补打挂号成功"); } + /** + * 记录退号日志 + * + * @param cancelRegPaymentDto 退号请求对象 + * @param encounter 就诊信息 + * @param result 退号结果 + * @param paymentRecon 支付对账信息 + */ + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void recordRefundLog(CancelRegPaymentDto cancelRegPaymentDto, + Encounter encounter, + R result, + PaymentReconciliation paymentRecon) { + RefundLog refundLog = new RefundLog(); + try { + // 1. 订单ID(唯一) + String orderId = String.valueOf(cancelRegPaymentDto.getEncounterId()); + refundLog.setOrderId(orderId); + + // 已存在则不重复插入(防止唯一约束异常) + long exist = iRefundLogService.lambdaQuery() + .eq(RefundLog::getOrderId, orderId) + .count(); + if (exist > 0) { + log.warn("退号日志已存在,orderId={}", orderId); + return; + } + + // 2. 患者信息 + if (encounter != null) { + refundLog.setPatientId(String.valueOf(encounter.getPatientId())); + Patient patient = patientMapper.selectById(encounter.getPatientId()); + refundLog.setPatientName(patient != null ? patient.getName() : "未知"); + } else { + refundLog.setPatientId("0"); + refundLog.setPatientName("未知"); + } + + // 3. 金额 + // 优先使用paymentRecon中的displayAmount,如果没有则尝试使用cancelRegPaymentDto中的displayAmount + BigDecimal refundAmount = BigDecimal.ZERO; + if (paymentRecon != null) { + // 使用退号后生成的paymentRecon的实际金额(这个金额应该是负数) + refundAmount = paymentRecon.getDisplayAmount() != null + ? paymentRecon.getDisplayAmount().abs() // 取绝对值,因为退费金额通常显示为正数 + : BigDecimal.ZERO; + } else if (cancelRegPaymentDto.getDisplayAmount() != null) { + refundAmount = cancelRegPaymentDto.getDisplayAmount(); + } + refundLog.setRefundAmount(refundAmount); + + // 4. 原因 & 类型 + refundLog.setRefundReason( + StringUtils.isNotEmpty(cancelRegPaymentDto.getReason()) + ? cancelRegPaymentDto.getReason() + : "诊前退号-已缴费签到未就诊" + ); + refundLog.setRefundType("FULL"); + + // 5. 退款方式 + String refundMethod = "UNKNOWN"; + if (cancelRegPaymentDto.getPaymentDetails() != null + && !cancelRegPaymentDto.getPaymentDetails().isEmpty()) { + Integer payEnum = cancelRegPaymentDto.getPaymentDetails().get(0).getPayEnum(); + if (payEnum != null) { + YbPayment ybPayment = YbPayment.getByValue(payEnum); + refundMethod = (ybPayment != null ? ybPayment.getInfo() : payEnum.toString()); + } + } + refundLog.setRefundMethod(refundMethod); + + // 6. 原交易号 + refundLog.setOriginalTradeNo( + paymentRecon != null ? paymentRecon.getPaymentNo() : null + ); + + // 7. 时间 + refundLog.setRefundTime(LocalDateTime.now()); + + // 8. 操作人 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null) { + refundLog.setOpUserId(String.valueOf(loginUser.getUserId())); + refundLog.setOpUserName(loginUser.getUsername()); + List roles = loginUser.getRoleList(); + refundLog.setOpRole( + roles != null && !roles.isEmpty() ? roles.get(0).getRoleName() : "SYSTEM" + ); + } else { + refundLog.setOpUserId("0"); + refundLog.setOpUserName("SYSTEM"); + refundLog.setOpRole("SYSTEM"); + } + + // 9. 状态 + if (result != null && result.getCode() == 200) { + refundLog.setState(1); + } else { + refundLog.setState(0); + refundLog.setFailReason(result != null ? result.getMsg() : "未知错误"); + } + + // 10. 创建时间 + refundLog.setCreatedAt(LocalDateTime.now()); + refundLog.setUpdatedAt(LocalDateTime.now()); + + // 11. 保存 + boolean saved = iRefundLogService.save(refundLog); + if (!saved) { + throw new RuntimeException("退号日志保存失败"); + } + + log.info("退号日志入库成功, orderId={}", orderId); + + } catch (Exception e) { + log.error("退号日志入库失败,数据={}", refundLog, e); + throw e; // 让事务感知(你也可以只记录不抛) + } + } + } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/dto/HomeStatisticsDto.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/dto/HomeStatisticsDto.java index 90fef91c..36a7b79b 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/dto/HomeStatisticsDto.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/dto/HomeStatisticsDto.java @@ -59,4 +59,14 @@ public class HomeStatisticsDto { * 待审核数量 */ private Integer pendingApprovals; + + /** + * 我的患者数量(医生专属) + */ + private Integer myPatients; + + /** + * 待写病历数量 + */ + private Integer pendingEmr; } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/patientmanage/appservice/impl/PatientInformationServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/patientmanage/appservice/impl/PatientInformationServiceImpl.java index 8018fd8d..aa7a63c5 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/patientmanage/appservice/impl/PatientInformationServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/patientmanage/appservice/impl/PatientInformationServiceImpl.java @@ -136,6 +136,7 @@ public class PatientInformationServiceImpl implements IPatientInformationService // 获取登录者信息 LoginUser loginUser = SecurityUtils.getLoginUser(); Long userId = loginUser.getUserId(); + Integer tenantId = loginUser.getTenantId().intValue(); // 先构建基础查询条件 QueryWrapper queryWrapper = HisQueryUtils.buildQueryWrapper( @@ -159,8 +160,9 @@ public class PatientInformationServiceImpl implements IPatientInformationService if (practitioner != null) { // 查询该医生作为接诊医生(ADMITTER, code="1")和挂号医生(REGISTRATION_DOCTOR, code="12")的所有就诊记录的患者ID List doctorPatientIds = patientManageMapper.getPatientIdsByPractitionerId( - practitioner.getId(), - Arrays.asList(ParticipantType.ADMITTER.getCode(), ParticipantType.REGISTRATION_DOCTOR.getCode())); + practitioner.getId(), + Arrays.asList(ParticipantType.ADMITTER.getCode(), ParticipantType.REGISTRATION_DOCTOR.getCode()), + tenantId); if (doctorPatientIds != null && !doctorPatientIds.isEmpty()) { // 添加患者ID过滤条件 - 注意:这里使用列名而不是表别名 diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/patientmanage/mapper/PatientManageMapper.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/patientmanage/mapper/PatientManageMapper.java index 6abd7532..2b6b738b 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/patientmanage/mapper/PatientManageMapper.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/patientmanage/mapper/PatientManageMapper.java @@ -64,8 +64,10 @@ public interface PatientManageMapper extends BaseMapper { * * @param practitionerId 医生ID * @param typeCodes 参与者类型代码列表 + * @param tenantId 租户ID * @return 患者ID列表 */ - List getPatientIdsByPractitionerId(@Param("practitionerId") Long practitionerId, - @Param("typeCodes") List typeCodes); + List getPatientIdsByPractitionerId(@Param("practitionerId") Long practitionerId, + @Param("typeCodes") List typeCodes, + @Param("tenantId") Integer tenantId); } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/service/impl/HomeStatisticsServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/service/impl/HomeStatisticsServiceImpl.java index 8d74adc2..c46a6c87 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/service/impl/HomeStatisticsServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/service/impl/HomeStatisticsServiceImpl.java @@ -66,23 +66,34 @@ public class HomeStatisticsServiceImpl implements IHomeStatisticsService { Practitioner practitioner = practitionerList != null && !practitionerList.isEmpty() ? practitionerList.get(0) : null; int totalPatients = 0; + int myPatients = 0; // 如果当前用户是医生,查询该医生接诊和被挂号的所有患者 if (practitioner != null) { + // 获取当前登录用户的租户ID + Integer tenantId = SecurityUtils.getLoginUser().getTenantId().intValue(); + // 查询该医生作为接诊医生(ADMITTER, code="1")和挂号医生(REGISTRATION_DOCTOR, code="12")的所有就诊记录的患者ID List doctorPatientIds = patientManageMapper.getPatientIdsByPractitionerId( - practitioner.getId(), - Arrays.asList(ParticipantType.ADMITTER.getCode(), ParticipantType.REGISTRATION_DOCTOR.getCode())); - - totalPatients = doctorPatientIds != null ? doctorPatientIds.size() : 0; + practitioner.getId(), + Arrays.asList(ParticipantType.ADMITTER.getCode(), ParticipantType.REGISTRATION_DOCTOR.getCode()), + tenantId); + + myPatients = doctorPatientIds != null ? doctorPatientIds.size() : 0; + + // 对于医生,"我的患者"数量即为该医生负责的患者数量 + statistics.setMyPatients(myPatients); } else { - // 如果不是医生,查询所有患者(与患者管理页面逻辑保持一致) - LambdaQueryWrapper patientQuery = new LambdaQueryWrapper<>(); - patientQuery.eq(Patient::getDeleteFlag, "0"); - List patientList = patientService.list(patientQuery); - totalPatients = patientList != null ? patientList.size() : 0; + // 如果不是医生,"我的患者"数量为0 + statistics.setMyPatients(0); } + // 查询所有患者作为总患者数 + LambdaQueryWrapper patientQuery = new LambdaQueryWrapper<>(); + patientQuery.eq(Patient::getDeleteFlag, "0"); + List patientList = patientService.list(patientQuery); + totalPatients = patientList != null ? patientList.size() : 0; + statistics.setTotalPatients(totalPatients); // 查询昨日在院患者数量(暂时简化处理) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/system/controller/HomeController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/system/controller/HomeController.java index ffcb4719..d128d482 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/system/controller/HomeController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/system/controller/HomeController.java @@ -3,6 +3,8 @@ package com.openhis.web.system.controller; import com.core.common.core.domain.R; import com.core.common.utils.SecurityUtils; import com.openhis.web.doctorstation.appservice.IDoctorStationEmrAppService; +import com.openhis.web.dto.HomeStatisticsDto; +import com.openhis.web.service.IHomeStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; @@ -20,19 +22,21 @@ import org.springframework.web.bind.annotation.RestController; public class HomeController { private final IDoctorStationEmrAppService doctorStationEmrAppService; + private final IHomeStatisticsService homeStatisticsService; @ApiOperation("获取首页统计数据") @GetMapping("/statistics") public R getStatistics() { - // 这里可以返回各种统计数据 - // 为了简化,我们只返回待写病历数量 + // 获取基础统计数据 + HomeStatisticsDto statisticsDto = homeStatisticsService.getHomeStatistics(); + + // 获取待写病历数量 Long userId = SecurityUtils.getLoginUser().getUserId(); R pendingEmrCount = doctorStationEmrAppService.getPendingEmrCount(userId); - - // 构建返回数据 - java.util.Map data = new java.util.HashMap<>(); - data.put("pendingEmr", pendingEmrCount.getData()); - - return R.ok(data); + + // 将待写病历数量添加到统计数据中 + statisticsDto.setPendingEmr((Integer) pendingEmrCount.getData()); + + return R.ok(statisticsDto); } } \ No newline at end of file diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/patientmanage/PatientManageMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/patientmanage/PatientManageMapper.xml index ce9d8166..1428cd34 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/patientmanage/PatientManageMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/patientmanage/PatientManageMapper.xml @@ -136,13 +136,13 @@