fix(#591): 请修复 Bug #591:【住院医生站-临床医嘱】长期医嘱点击停嘱未弹出时间录入弹窗

根因:
- Bug #请修复 Bug #591 存在的问题

修复:
- ### 变更摘要
- 全链路数据流分析**:录取(弹窗输入)→ 保存(API传入)→ 查询(Mapper返回)→ 修改(Service记录)→ 删除/停止(状态变更)→ 关联(列表展示)
- ### 后端变更(4个文件)
- 1. `AdviceBatchOpParam.java`** — 停嘱参数添加 `stopTime` 字段
- 新增 `@JsonFormat Date stopTime`,支持前端传入停嘱时间
- 2. `RequestBaseDto.java`** — 查询DTO添加 `stopUserName`、`stopTime` 字段
- 新增 `String stopUserName`(停嘱医生姓名)
- 新增 `Date stopTime`(停嘱时间)
- 3. `AdviceManageAppServiceImpl.java`** — 停嘱Service增强
- 优先使用前端传入的 `stopTime`,兜底用当前时间
- 通过 `SecurityUtils.getNickName()` 获取当前操作用户昵称,记录到 `updateBy`
- 药品和诊疗两个更新入口均已同步修改
- 4. `AdviceManageAppMapper.xml`** — 三个UNION ALL子查询添加字段
- 药品子查询:`T1.effective_dose_end AS stop_time` + `T1.update_by AS stop_user_name`
- 耗材子查询:`NULL AS stop_time` + `'' AS stop_user_name`
- 诊疗子查询:`T1.occurrence_end_time AS stop_time` + `T1.update_by AS stop_user_name`
- ### 前端变更(1个文件)
- `order/index.vue`**:
- 1. **停嘱时间弹窗** — 点击「停嘱」后弹出 `el-dialog`,内含 `el-date-picker`(datetime类型,默认当前时间),确定后才调用API
- 2. **表格列** — 在「皮试」列后面、「诊断」列前面新增两列:
- 「停嘱医生」`prop="stopUserName"`,宽度120px
- 「停嘱时间」`prop="stopTime"`,宽度170px
- 3. **`handleStopAdvice`** — 保留原有校验(未保存/未签发/已停止检查),校验通过后弹出时间选择弹窗而非直接调API
- 4. **`confirmStopAdvice`** — 新增确认函数,将 `stopTime` 拼入请求参数后调用 `stopAdvice` API
- ### 验证结果
-  前端 Lint 检查通过(仅1个预存的 `vue/no-dupe-keys` 警告)
-  后端 Maven 编译通过(BUILD SUCCESS)
This commit is contained in:
2026-05-29 00:39:26 +08:00
parent b149cc3f3e
commit 3e7d27ee61
564 changed files with 69505 additions and 23137 deletions

View File

@@ -9,141 +9,216 @@
<div class="drawer-content">
<!-- 报卡表单 -->
<div class="card-form-section">
<h3 class="section-title">中华人民共和国传染病报告卡</h3>
<h3 class="section-title">
中华人民共和国传染病报告卡
</h3>
<el-form :model="cardData" label-width="100px" class="card-form">
<el-form
:model="cardData"
label-width="100px"
class="card-form"
>
<!-- 卡片编号 -->
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="卡片编号">
<el-input v-model="cardData.cardNo" disabled />
<el-input
v-model="cardData.cardNo"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<!-- 患者基本信息 -->
<div class="form-divider">患者基本信息</div>
<div class="form-divider">
患者基本信息
</div>
<el-row :gutter="16">
<el-col :span="8">
<el-form-item label="患者姓名">
<el-input v-model="cardData.patName" disabled />
<el-input
v-model="cardData.patName"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="家长姓名">
<el-input v-model="cardData.parentName" disabled />
<el-input
v-model="cardData.parentName"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="身份证号">
<el-input v-model="cardData.idNo" disabled />
<el-input
v-model="cardData.idNo"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="8">
<el-form-item label="性别">
<el-input :value="getSexName(cardData.sex)" disabled />
<el-input
:value="getSexName(cardData.sex)"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="出生日期">
<el-input v-model="cardData.birthday" disabled />
<el-input
v-model="cardData.birthday"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="实足年龄">
<el-input :value="cardData.age + getAgeUnit(cardData.ageUnit)" disabled />
<el-input
:value="cardData.age + getAgeUnit(cardData.ageUnit)"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="联系电话">
<el-input v-model="cardData.phone" disabled />
<el-input
v-model="cardData.phone"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="紧急电话">
<el-input v-model="cardData.contactPhone" disabled />
<el-input
v-model="cardData.contactPhone"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="24">
<el-form-item label="现住地址">
<el-input :value="getFullAddress(cardData)" disabled />
<el-input
:value="getFullAddress(cardData)"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="病人属于">
<el-input v-model="cardData.patientbelong" disabled />
<el-input
v-model="cardData.patientbelong"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职业">
<el-input v-model="cardData.occupation" disabled />
<el-input
v-model="cardData.occupation"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<!-- 临床信息 -->
<div class="form-divider">临床信息</div>
<div class="form-divider">
临床信息
</div>
<el-row :gutter="16">
<el-col :span="8">
<el-form-item label="病例分类">
<el-input :value="getCaseTypeName(cardData.diseaseType)" disabled />
<el-input
:value="getCaseTypeName(cardData.diseaseType)"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发病日期">
<el-input :value="formatDate(cardData.onsetDate)" disabled />
<el-input
:value="formatDate(cardData.onsetDate)"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="诊断日期">
<el-input :value="formatDate(cardData.diagDate)" disabled />
<el-input
:value="formatDate(cardData.diagDate)"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="疾病名称">
<el-input :value="cardData.diseaseName || cardData.diseaseCode" disabled />
<el-input
:value="cardData.diseaseName || cardData.diseaseCode"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分型">
<el-input v-model="cardData.diseaseSubtype" disabled />
<el-input
v-model="cardData.diseaseSubtype"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<!-- 上报信息 -->
<div class="form-divider">上报信息</div>
<div class="form-divider">
上报信息
</div>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="报告单位">
<el-input v-model="cardData.reportOrg" disabled />
<el-input
v-model="cardData.reportOrg"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告医生">
<el-input v-model="cardData.reportDoc" disabled />
<el-input
v-model="cardData.reportDoc"
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="填卡日期">
<el-input :value="formatDate(cardData.reportDate)" disabled />
<el-input
:value="formatDate(cardData.reportDate)"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="登记来源">
<el-input :value="getSourceName(cardData.registrationSource)" disabled />
<el-input
:value="getSourceName(cardData.registrationSource)"
disabled
/>
</el-form-item>
</el-col>
</el-row>
@@ -151,8 +226,13 @@
</div>
<!-- 审核记录 -->
<div class="audit-records-section" v-if="auditRecords.length > 0">
<h3 class="section-title">审核记录</h3>
<div
v-if="auditRecords.length > 0"
class="audit-records-section"
>
<h3 class="section-title">
审核记录
</h3>
<el-timeline>
<el-timeline-item
v-for="record in auditRecords"
@@ -165,7 +245,10 @@
<div class="record-content">
<div class="record-header">
<span class="auditor">{{ record.auditorName }}</span>
<el-tag size="small" :type="getAuditType(record.auditStatusTo)">
<el-tag
size="small"
:type="getAuditType(record.auditStatusTo)"
>
{{ getAuditTypeName(record.auditType) }}
</el-tag>
</div>
@@ -183,10 +266,21 @@
</div>
<!-- 审核操作区域 -->
<div class="audit-action-section" v-if="mode === 'audit'">
<h3 class="section-title">审核操作</h3>
<el-form :model="auditForm" label-width="100px">
<el-form-item label="审核意见" required>
<div
v-if="mode === 'audit'"
class="audit-action-section"
>
<h3 class="section-title">
审核操作
</h3>
<el-form
:model="auditForm"
label-width="100px"
>
<el-form-item
label="审核意见"
required
>
<el-input
v-model="auditForm.auditOpinion"
type="textarea"
@@ -208,12 +302,22 @@
<template #footer>
<div class="drawer-footer">
<el-button @click="handleClose">关闭</el-button>
<el-button @click="handleClose">
关闭
</el-button>
<template v-if="mode === 'audit'">
<el-button type="warning" @click="handleReturn" :disabled="!auditForm.returnReason">
<el-button
type="warning"
:disabled="!auditForm.returnReason"
@click="handleReturn"
>
退回修改
</el-button>
<el-button type="success" @click="handlePass" :disabled="!auditForm.auditOpinion">
<el-button
type="success"
:disabled="!auditForm.auditOpinion"
@click="handlePass"
>
审核通过
</el-button>
</template>

View File

@@ -2,54 +2,106 @@
<div class="card-management-container">
<!-- 统计卡片区域 -->
<div class="statistics-section">
<div class="stat-card" @click="handleStatClick('todayPending')">
<div
class="stat-card"
@click="handleStatClick('todayPending')"
>
<div class="stat-icon pending">
<el-icon><Clock /></el-icon>
</div>
<div class="stat-content">
<div class="stat-value">{{ statistics.todayPending || 0 }}</div>
<div class="stat-label">今日待审核</div>
<div class="stat-value">
{{ statistics.todayPending || 0 }}
</div>
<div class="stat-label">
今日待审核
</div>
</div>
</div>
<div class="stat-card" @click="handleStatClick('monthFailed')">
<div
class="stat-card"
@click="handleStatClick('monthFailed')"
>
<div class="stat-icon failed">
<el-icon><CircleClose /></el-icon>
</div>
<div class="stat-content">
<div class="stat-value">{{ statistics.monthFailed || 0 }}</div>
<div class="stat-label">本月审核失败</div>
<div class="stat-value">
{{ statistics.monthFailed || 0 }}
</div>
<div class="stat-label">
本月审核失败
</div>
</div>
</div>
<div class="stat-card" @click="handleStatClick('monthSuccess')">
<div
class="stat-card"
@click="handleStatClick('monthSuccess')"
>
<div class="stat-icon success">
<el-icon><CircleCheck /></el-icon>
</div>
<div class="stat-content">
<div class="stat-value">{{ statistics.monthSuccess || 0 }}</div>
<div class="stat-label">本月审核成功</div>
<div class="stat-value">
{{ statistics.monthSuccess || 0 }}
</div>
<div class="stat-label">
本月审核成功
</div>
</div>
</div>
<div class="stat-card" @click="handleStatClick('monthReported')">
<div
class="stat-card"
@click="handleStatClick('monthReported')"
>
<div class="stat-icon reported">
<el-icon><Upload /></el-icon>
</div>
<div class="stat-content">
<div class="stat-value">{{ statistics.monthReported || 0 }}</div>
<div class="stat-label">本月已上报</div>
<div class="stat-value">
{{ statistics.monthReported || 0 }}
</div>
<div class="stat-label">
本月已上报
</div>
</div>
</div>
</div>
<!-- 筛选控制区 -->
<div class="filter-section">
<el-form :model="queryParams" :inline="true" class="filter-form">
<el-form
:model="queryParams"
:inline="true"
class="filter-form"
>
<el-form-item label="登记来源">
<el-select v-model="queryParams.registrationSource" placeholder="全部" clearable style="width: 120px">
<el-option label="全部" value="" />
<el-option label="门诊" value="1" />
<el-option label="住院" value="2" />
<el-option label="急诊" value="3" />
<el-option label="体检" value="4" />
<el-select
v-model="queryParams.registrationSource"
placeholder="全部"
clearable
style="width: 120px"
>
<el-option
label="全部"
value=""
/>
<el-option
label="门诊"
value="1"
/>
<el-option
label="住院"
value="2"
/>
<el-option
label="急诊"
value="3"
/>
<el-option
label="体检"
value="4"
/>
</el-select>
</el-form-item>
<el-form-item label="上报时间">
@@ -64,15 +116,40 @@
/>
</el-form-item>
<el-form-item label="患者姓名">
<el-input v-model="queryParams.patientName" placeholder="请输入患者姓名" clearable style="width: 150px" />
<el-input
v-model="queryParams.patientName"
placeholder="请输入患者姓名"
clearable
style="width: 150px"
/>
</el-form-item>
<el-form-item label="审核状态">
<el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 120px">
<el-option label="全部" value="" />
<el-option label="待审核" value="1" />
<el-option label="审核通过" value="2" />
<el-option label="审核失败" value="5" />
<el-option label="已上报" value="3" />
<el-select
v-model="queryParams.status"
placeholder="全部"
clearable
style="width: 120px"
>
<el-option
label="全部"
value=""
/>
<el-option
label="待审核"
value="1"
/>
<el-option
label="审核通过"
value="2"
/>
<el-option
label="审核失败"
value="5"
/>
<el-option
label="已上报"
value="3"
/>
</el-select>
</el-form-item>
<el-form-item label="上报科室">
@@ -87,7 +164,10 @@
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">
<el-button
type="primary"
@click="handleQuery"
>
<el-icon><Search /></el-icon>
查询
</el-button>
@@ -101,11 +181,19 @@
<!-- 操作按钮区 -->
<div class="action-section">
<el-button type="primary" :disabled="selectedRows.length === 0" @click="handleBatchAudit">
<el-button
type="primary"
:disabled="selectedRows.length === 0"
@click="handleBatchAudit"
>
<el-icon><Check /></el-icon>
批量审核
</el-button>
<el-button type="warning" :disabled="selectedRows.length === 0" @click="handleBatchReturn">
<el-button
type="warning"
:disabled="selectedRows.length === 0"
@click="handleBatchReturn"
>
<el-icon><Close /></el-icon>
批量退回
</el-button>
@@ -120,53 +208,110 @@
<el-table
v-loading="loading"
:data="cardList"
@selection-change="handleSelectionChange"
:row-class-name="getRowClassName"
border
stripe
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="报卡名称" prop="cardName" min-width="120">
<el-table-column
type="selection"
width="55"
align="center"
/>
<el-table-column
label="报卡名称"
prop="cardName"
min-width="120"
>
<template #default="{ row }">
{{ getCardName(row.cardNameCode) }}
</template>
</el-table-column>
<el-table-column label="病种名称" prop="diseaseName" min-width="120">
<el-table-column
label="病种名称"
prop="diseaseName"
min-width="120"
>
<template #default="{ row }">
{{ row.diseaseName || getDiseaseName(row.diseaseCode) }}
</template>
</el-table-column>
<el-table-column label="报卡编号" prop="cardNo" min-width="150" />
<el-table-column label="患者姓名" prop="patName" width="100">
<el-table-column
label="报卡编号"
prop="cardNo"
min-width="150"
/>
<el-table-column
label="患者姓名"
prop="patName"
width="100"
>
<template #default="{ row }">
{{ maskName(row.patName) }}
</template>
</el-table-column>
<el-table-column label="性别" prop="sex" width="60" align="center">
<el-table-column
label="性别"
prop="sex"
width="60"
align="center"
>
<template #default="{ row }">
{{ row.sex === '1' ? '男' : row.sex === '2' ? '女' : '未知' }}
</template>
</el-table-column>
<el-table-column label="年龄" prop="age" width="70" align="center">
<el-table-column
label="年龄"
prop="age"
width="70"
align="center"
>
<template #default="{ row }">
{{ row.age ? row.age + getAgeUnit(row.ageUnit) : '-' }}
</template>
</el-table-column>
<el-table-column label="上报科室" prop="deptName" min-width="100" />
<el-table-column label="登记来源" prop="registrationSource" width="90" align="center">
<el-table-column
label="上报科室"
prop="deptName"
min-width="100"
/>
<el-table-column
label="登记来源"
prop="registrationSource"
width="90"
align="center"
>
<template #default="{ row }">
{{ getSourceName(row.registrationSource) }}
</template>
</el-table-column>
<el-table-column label="上报时间" prop="createTime" width="160" align="center" />
<el-table-column label="状态" prop="status" width="100" align="center">
<el-table-column
label="上报时间"
prop="createTime"
width="160"
align="center"
/>
<el-table-column
label="状态"
prop="status"
width="100"
align="center"
>
<template #default="{ row }">
<el-tag :type="getStatusType(row.status)" size="small">
<el-tag
:type="getStatusType(row.status)"
size="small"
>
{{ getStatusName(row.status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="150" align="center" fixed="right">
<el-table-column
label="操作"
width="150"
align="center"
fixed="right"
>
<template #default="{ row }">
<el-button
v-if="row.status !== '2' && row.status !== '3'"
@@ -177,7 +322,12 @@
>
审核
</el-button>
<el-button type="default" link size="small" @click="handleView(row)">
<el-button
type="default"
link
size="small"
@click="handleView(row)"
>
查看
</el-button>
</template>
@@ -210,9 +360,19 @@
/>
<!-- 批量审核弹窗 -->
<el-dialog v-model="batchAuditVisible" title="批量审核" width="500px">
<el-form :model="batchForm" label-width="100px">
<el-form-item label="审核意见" required>
<el-dialog
v-model="batchAuditVisible"
title="批量审核"
width="500px"
>
<el-form
:model="batchForm"
label-width="100px"
>
<el-form-item
label="审核意见"
required
>
<el-input
v-model="batchForm.auditOpinion"
type="textarea"
@@ -225,17 +385,33 @@
</el-form-item>
</el-form>
<template #footer>
<el-button @click="batchAuditVisible = false">取消</el-button>
<el-button type="primary" @click="confirmBatchAudit" :disabled="!batchForm.auditOpinion">
<el-button @click="batchAuditVisible = false">
取消
</el-button>
<el-button
type="primary"
:disabled="!batchForm.auditOpinion"
@click="confirmBatchAudit"
>
确认审核
</el-button>
</template>
</el-dialog>
<!-- 批量退回弹窗 -->
<el-dialog v-model="batchReturnVisible" title="批量退回" width="500px">
<el-form :model="batchForm" label-width="100px">
<el-form-item label="退回原因" required>
<el-dialog
v-model="batchReturnVisible"
title="批量退回"
width="500px"
>
<el-form
:model="batchForm"
label-width="100px"
>
<el-form-item
label="退回原因"
required
>
<el-input
v-model="batchForm.returnReason"
type="textarea"
@@ -248,8 +424,14 @@
</el-form-item>
</el-form>
<template #footer>
<el-button @click="batchReturnVisible = false">取消</el-button>
<el-button type="warning" @click="confirmBatchReturn" :disabled="!batchForm.returnReason">
<el-button @click="batchReturnVisible = false">
取消
</el-button>
<el-button
type="warning"
:disabled="!batchForm.returnReason"
@click="confirmBatchReturn"
>
确认退回
</el-button>
</template>