fix(#613): 医嘱退回流程完整修复(护士端弹窗 + 医生端展示 + 全链路 6 环)

新 Harness 方法论全链路分析:

📤 发起方(护士端-医嘱校对):
- ① 前端/页面  handleCancel 直接调 API →  改为弹窗要求必填退回原因
- ② Controller  不涉及(纯转发)
- ③ Service  adviceReject 提取 backReason 传入
- ④ Mapper/DB  backReason 参数已就绪
- ⑤ DB  back_reason 迁移脚本已执行
- ⑥ 关联模块  ServiceRequest 写入 reasonText

📥 接收方(医生端-临床医嘱):
- ① 前端/页面  无退回原因列 →  在诊断列前新增橙色退回原因列
- ② Controller  不涉及
- ③ Service  DTO 新增 reasonText 字段
- ④ Mapper/XML  5 个 UNION ALL 分支均选取 reason_text
- ⑤ DB  med_medication_request.back_reason 已存在
- ⑥ 展示  医生端可看到退回原因

变更:6 文件,+101/-13 行
This commit is contained in:
2026-05-29 21:34:10 +08:00
parent 58ae7c418c
commit a7d93cb13e
7 changed files with 118 additions and 13 deletions

View File

@@ -1345,6 +1345,21 @@
</span>
</template>
</el-table-column>
<el-table-column
label="退回原因"
align="center"
prop="reasonText"
width="160"
>
<template #default="scope">
<span
v-if="!scope.row.isEdit"
style="color: #e6a23c;"
>
{{ scope.row.reasonText || '-' }}
</span>
</template>
</el-table-column>
<el-table-column
label="诊断"
align="center"

View File

@@ -226,6 +226,44 @@
/>
</div>
</div>
<!-- 退回原因弹窗 -->
<el-dialog
v-model="backReasonVisible"
title="退回原因"
width="400px"
:close-on-click-modal="false"
>
<el-form
ref="backReasonFormRef"
:model="backReasonForm"
:rules="backReasonRules"
>
<el-form-item
label="退回原因"
prop="reason"
>
<el-input
v-model="backReasonForm.reason"
type="textarea"
:rows="4"
placeholder="请输入退回原因(必填)"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="backReasonVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="confirmCancel"
>
确定退回
</el-button>
</template>
</el-dialog>
</template>
<script setup>
import {ref, computed, getCurrentInstance} from 'vue';
@@ -239,6 +277,9 @@ const prescriptionList = ref([]);
const deadline = ref(formatDateStr(new Date(), 'YYYY-MM-DD') + ' 23:59:59');
const type = ref(null);
const { proxy } = getCurrentInstance();
const backReasonVisible = ref(false);
const backReasonForm = ref({ reason: '' });
const backReasonFormRef = ref(null);
const loading = ref(false);
const chooseAll = ref(false);
const selectionTrigger = ref(0);
@@ -438,24 +479,39 @@ function handleCheck() {
function handleCancel() {
let list = getSelectRows();
if (list.length > 0) {
// 校验已发药的医嘱不允许退回
let dispensedItems = list.filter(item => item.dispenseStatus === 4);
if (dispensedItems.length > 0) {
proxy.$message.error('该药品已由药房发放,请先执行退药处理,不可直接退回');
return;
}
cancel(list).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess(res.msg);
handleGetPrescription();
}
});
console.log(list, 'list');
// 显示退回原因弹窗
backReasonForm.value.reason = '';
backReasonVisible.value = true;
} else {
proxy.$message.warning('请先选择医嘱信息');
}
}
/** 确定退回 — 从弹窗获取原因后调用API */
function confirmCancel() {
if (!backReasonForm.value.reason.trim()) {
proxy.$message.warning('请输入退回原因');
return;
}
let list = getSelectRows();
let requestList = list.map(item => ({
...item,
backReason: backReasonForm.value.reason.trim()
}));
cancel(requestList).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess(res.msg);
handleGetPrescription();
}
});
backReasonVisible.value = false;
}
function getSelectRows() {
// 获取选中的医嘱信息
let list = [];