2026-08-12 15:20:29 +08:00

115 lines
4.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-dialog :model-value="visible" :width="width" title="驳回原因" @close="close()">
<el-scrollbar wrap-class="el-dialog-body-full-scroll">
<el-form label-position="top" class="pt-10px">
<el-form-item class="is-required -mb-8px pl-20px" label="请选择退诊原因">
<div class="w-0 flex-grow pl-20px">
<div v-for="item in reasonGroup" :key="item.key">
<el-checkbox :model-value="groupSelect[item.key]" :label="item.title" @update:model-value="toggle($event, item.key, item.list)">
<span class="font-semibold text-black">{{ item.title }}</span>
</el-checkbox>
<div class="pl-15px">
<el-checkbox-group v-model="reasons">
<div v-for="subItem in item.list">
<el-checkbox :key="subItem" :label="subItem" />
</div>
</el-checkbox-group>
</div>
</div>
</div>
</el-form-item>
<el-form-item class="mt-15px pl-20px" label="请他原因(补充说明)">
<el-input v-model="otherReason" type="textarea" placeholder="请输入" resize="none" :autosize="{ minRows: 5, maxRows: 8 }" maxlength="100" show-word-limit />
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<div text-center>
<el-button plain class="w-100px" type="primary" @click="close()">取消</el-button>
<el-button class="w-100px" :loading="loading" type="primary" @click="confirm()">确定</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { computed, ref, watch } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { refundConsultation } from "@/api/hlw";
const emits = defineEmits(["close", "change", "refund"]);
const props = defineProps({
ids: { type: Array, default: () => [] },
visible: { type: Boolean, default: false },
width: { type: [String, Number], default: "500px" },
memberInfo: { type: Object, default: () => {} },
order: { type: Object, default: () => {} },
});
const reasonGroup = [
{ title: "患者不符合复诊条件", list: ["患者未提供完整的病历资料", "患者病情变化、病情危急或病情复杂,需要线下复查"], key: "patient" },
{ title: "药物相关问题", list: ["需调整药方,建议线下就诊", "所需药品不在互联网医院开药范围", "患者药物过敏史不明确"], key: "drug" },
{ title: "患者资料不全", list: ["患者未填写完整的基本信息", "患者未提供最新病情描述"], key: "profile" },
{ title: "患者沟通问题", list: ["患者无法联系或未回复医生询问", "患者描述病情不清晰,无法判断"], key: "communication" },
{ title: "医生判断原因", list: ["依据现有病历资料依然无法明确诊断", "患者需多学科会诊,无法线上处理", "怀疑可能是传染病病例"], key: "doctor" },
{ title: "缺相关证明", list: ["缺少实体医疗机构诊断证明或三天内有效医嘱单"], key: "missing_proof" },
];
const loading = ref(false);
const reasons = ref([]);
const otherReason = ref("");
const groupSelect = computed(() =>
reasonGroup.reduce((acc, cur) => {
acc[cur.key] = cur.list.every((i) => reasons.value.includes(i));
return acc;
}, {})
);
function toggle(val, key, list) {
const excludeReasons = reasons.value.filter((i) => !list.includes(i));
if (val) {
reasons.value = [...excludeReasons, ...list];
} else {
reasons.value = [...excludeReasons];
}
}
function close() {
emits("close");
}
async function confirm() {
if (loading.value) return;
const arr = [...reasons.value, otherReason.value.trim()].filter((i) => typeof i === "string" && i.trim());
if (arr.length === 0) {
ElMessage.error("请填写驳回原因");
} else {
loading.value = true;
await ElMessageBox.confirm(`确定退诊并退款吗?`, "提示", { type: "warning" });
await refund(arr);
loading.value = false;
}
}
async function refund(arr) {
const reason = arr.join("");
const { orderSource } = props.order;
const str = `本次问诊已取消`;
// const str = `本次问诊已取消,取消原因: ${reason}${orderSource === "MATEPAD" ? "请联系线下退费" : "费用将于48小时内退还您的支付账户"}`;
const { success, message } = await refundConsultation({ orderId: props.order.orderId, reason: str, orderSource });
if (success) {
emits("refund");
} else {
ElMessage.error(message);
}
}
watch(
() => props.visible,
(n) => {
if (n) {
reasons.value = [];
otherReason.value = "";
loading.value = false;
}
}
);
</script>