You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
5.4 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-dialog
:model-value="modelValue"
class="report-generate-dialog"
top="15vh"
:close-on-click-modal="false"
@update:model-value="(v) => $emit('update:modelValue', v)"
@open="onOpen"
>
<div class="body-wrap">
<div class="body-header">
<div class="body-title">生成报告</div>
<img src="@/assets/image/close-btn.svg" alt="" class="close-btn" @click="closeDialog" />
</div>
<el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="医院名称" prop="hospitalId">
<el-select
v-model="form.hospitalId"
placeholder="全部医院"
clearable
filterable
style="width: 100%"
>
<el-option
v-for="h in hospitals"
:key="h.id"
:label="h.name"
:value="h.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告类型" prop="type">
<el-select v-model="form.type" placeholder="季度报告" style="width: 100%">
<el-option label="季度报告" value="quarterly" />
<el-option label="年度报告" value="annual" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="年份" prop="year">
<el-date-picker
v-model="form.year"
type="year"
format="YYYY年"
value-format="YYYY"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col v-if="form.type !== 'annual'" :span="12">
<el-form-item label="报告周期" prop="quarter">
<el-select
v-model="form.quarter"
placeholder="Q1第一季度"
style="width: 100%"
>
<el-option label="Q1第一季度" :value="1" />
<el-option label="Q2第二季度" :value="2" />
<el-option label="Q3第三季度" :value="3" />
<el-option label="Q4第四季度" :value="4" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div class="body-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" :loading="submitting" @click="onSubmit">确定</el-button>
</div>
</el-dialog>
</template>
<script setup>
import { onMounted, reactive, ref, watch } from "vue";
import { ElMessage } from "element-plus";
import dayjs from "dayjs";
import { useI18n } from "vue-i18n";
import { generateAdminReport, getAdminHospitals } from "@/service/modular/admin";
const { t: $t } = useI18n();
const props = defineProps({
modelValue: { type: Boolean, default: false },
});
const emit = defineEmits(["update:modelValue", "generated"]);
const formRef = ref();
const submitting = ref(false);
const hospitals = ref([]);
const currentYear = new Date().getFullYear();
const yearOptions = Array.from({ length: 5 }, (_, i) => currentYear - i);
const form = reactive({
hospitalId: undefined,
type: "quarterly",
year: dayjs().format('YYYY'),
quarter: 1,
});
const rules = {
hospitalId: [{ required: true, message: "请选择医院名称", trigger: "change" }],
type: [{ required: true, message: "请选择报告类型", trigger: "change" }],
year: [{ required: true, message: "请选择年份", trigger: "change" }],
quarter: [
{
validator: (_, value, cb) => {
if (form.type === "quarterly" && (value === undefined || value === null || value === ""))
return cb(new Error("季度报告必须选择季度"));
cb();
},
trigger: "change",
},
],
};
watch(
() => form.type,
(v) => {
if (v === "annual") form.quarter = 0;
else if (form.quarter === 0 || form.quarter === undefined) form.quarter = 1;
},
);
const loadHospitals = async () => {
try {
const res = await getAdminHospitals({ page: 1, pageSize: 1000 });
hospitals.value = res?.list || [];
} catch (_) {
hospitals.value = [];
}
};
const reset = () => {
form.hospitalId = undefined;
form.type = "quarterly";
form.year = dayjs().format("YYYY");
form.quarter = 1;
};
const onOpen = () => {
reset();
if (hospitals.value.length === 0) loadHospitals();
};
watch(
() => props.modelValue,
(v) => {
if (v) onOpen();
},
);
onMounted(() => {
if (hospitals.value.length === 0) loadHospitals();
});
const closeDialog = () => emit("update:modelValue", false);
const onSubmit = async () => {
if (!formRef.value) return;
await formRef.value.validate(async (valid) => {
if (!valid) return;
submitting.value = true;
try {
const payload = {
hospitalId: form.hospitalId,
type: form.type,
year: Number(form.year),
quarter: form.type === "annual" ? 0 : form.quarter,
};
await generateAdminReport(payload);
emit("generated");
closeDialog();
} finally {
submitting.value = false;
}
});
};
</script>
<style lang="scss">
.report-generate-dialog {
width: 800px;
.body-wrap {
padding: 24px;
}
}
</style>