114 lines
4.6 KiB
Vue
114 lines
4.6 KiB
Vue
|
|
<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 = `本次问诊已取消,取消原因: ${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>
|