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.

376 lines
11 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.

<script setup>
/**
* name
* usersa0ChunLuyu
* date2023年4月10日 11:08:42
*/
import {
AppointmentListAction,
AppointmentChangeStatusAction,
AppointmentChangeCountAction,
$response, HospitalSelectListAction, AppointmentDeleteAction
} from '~/api'
import $router from '~/router'
import {onBeforeRouteUpdate} from "vue-router";
import {NSpace, NTag} from "naive-ui";
const default_page_options = {
start_date: null,
end_date: null,
weeks: [1, 2, 3, 4, 5, 6, 7],
hospital: null,
status: 0,
page: 1
}
const page_options = ref(JSON.parse(JSON.stringify(default_page_options)))
onBeforeRouteUpdate((to) => {
routerChange(to.query)
})
const routerChange = (query) => {
page_options.value = {
start_date: query.start_date || default_page_options.start_date,
end_date: query.end_date || default_page_options.end_date,
weeks: (query.weeks || default_page_options.weeks.join(',')).split(',').map(Number),
hospital: Number(query.hospital || default_page_options.hospital),
status: Number(query.status) || default_page_options.status,
page: Number(query.page) || default_page_options.page
}
appointment_active.value = []
if (hospital_select_list.value.length === 0) {
HospitalSelectList()
} else {
AppointmentList()
}
}
onMounted(() => {
routerChange($router.currentRoute.value.query)
})
const appointment_active = ref([])
const appointment_list = ref([])
const appointment_list_last_page = ref(0)
const AppointmentList = async () => {
const response = await AppointmentListAction(page_options.value)
$response(response, () => {
appointment_list.value = response.data.data
appointment_list_last_page.value = response.data.last_page
})
}
const week_arr = ['一', '二', '三', '四', '五', '六', '日'];
const date_type_arr = ['info', 'success', 'error'];
const date_type_text_arr = ['普', '假', '班'];
const appointment_columns = [
{
type: 'selection'
},
{
title: '日期',
key: 'date',
render(row) {
let children = [h(
'span',
{},
row.date
)]
if (row.date_type > 0) {
children.push(h(
NTag,
{
class: 'ml-2',
size: 'small',
type: date_type_arr[row.date_type]
},
{
default: () => {
return date_type_text_arr[row.date_type]
}
}
))
}
return children
}
},
{
title: '星期',
key: 'week',
render(row) {
return `星期${week_arr[row.week - 1]}`
}
},
{
title: '开始时间',
key: 'start_time'
},
{
title: '结束时间',
key: 'end_time'
},
{
title: '停止预约时间',
key: 'stop_time'
},
{
title: '最大预约人数',
key: 'max_count'
},
{
title: '已预约人数',
key: 'used_count'
},
{
title: '已预约人数',
key: 'date_type'
},
{
title: '剩余数量',
key: 'max_count',
render(row) {
let count = row.max_count - row.used_count
return count > 0 ? count : 0
}
},
{
title: '状态',
key: 'status',
render(row) {
return h(
NTag,
{
type: row.status === 1 ? 'success' : 'error'
},
{
default: () => {
return row.status === 1 ? '可用' : '停用'
}
}
)
}
}
]
const searchClick = () => {
updatePage(1)
}
const updatePage = (page) => {
page_options.value.page = page
pagePush()
}
const pagePush = () => {
$router.push({
name: 'appointment-list',
query: {
...page_options.value,
weeks: page_options.value.weeks.join(',')
}
})
}
const hospital_select_list = ref([])
const HospitalSelectList = async () => {
const response = await HospitalSelectListAction()
$response(response, () => {
hospital_select_list.value = response.data.list.map((item) => {
return {
label: item.name,
value: item.id
}
})
if (hospital_select_list.value.length && !page_options.value.hospital) {
page_options.value.hospital = hospital_select_list.value[0].value
}
if (!!page_options.value.hospital) {
AppointmentList()
}
})
}
const delete_show = ref(false)
const deleteShowClick = () => {
if (appointment_active.value.length === 0) return window.$message().error('请选择一个计划')
delete_show.value = true
}
const AppointmentDelete = async () => {
const response = await AppointmentDeleteAction({
ids: appointment_active.value
})
$response(response, () => {
window.$message().success(response.message)
delete_show.value = false
appointment_active.value = []
AppointmentList()
})
}
const createClick = () => {
$router.push({
name: 'appointment-template'
})
}
const change_status_show = ref(false)
const change_status = ref(1)
const changeStatusShowClick = () => {
if (appointment_active.value.length === 0) return window.$message().error('请选择一个计划')
let status = 1
for (let i in appointment_list.value) {
if (appointment_active.value.indexOf(appointment_list.value[i].id) !== -1) {
status = appointment_list.value[i].status
}
}
change_status.value = status
change_status_show.value = true
}
const AppointmentChangeStatus = async () => {
const response = await AppointmentChangeStatusAction({
ids: appointment_active.value,
status: change_status.value
})
$response(response, () => {
change_status_show.value = false
window.$message().success(response.message)
AppointmentList()
})
}
const change_count_show = ref(false)
const change_count = ref(1)
const changeCountShowClick = () => {
if (appointment_active.value.length === 0) return window.$message().error('请选择一个计划')
let max_count = 0
for (let i in appointment_list.value) {
if (appointment_active.value.indexOf(appointment_list.value[i].id) !== -1) {
if (appointment_list.value[i].max_count > max_count) {
max_count = appointment_list.value[i].max_count
}
}
}
change_count.value = max_count
change_count_show.value = true
}
const AppointmentChangeCount = async () => {
const response = await AppointmentChangeCountAction({
ids: appointment_active.value,
count: change_count.value
})
$response(response, () => {
change_count_show.value = false
window.$message().success(response.message)
AppointmentList()
})
}
</script>
<template>
<div>
<n-modal v-model:show="delete_show" preset="card" :style="{width: '400px'}" title="删除确认" :auto-focus="false"
:bordered="false">
<div>
<n-space justify="center">
<n-button @click="AppointmentDelete()" type="info">确定</n-button>
<n-button @click="delete_show = false">取消</n-button>
</n-space>
</div>
</n-modal>
<n-modal v-model:show="change_status_show" preset="card" :style="{width: '400px'}" title="修改状态"
:auto-focus="false" :bordered="false">
<div>
<div>
<n-space align="center">
<n-tag>
<div class="form_tag_wrapper">状态</div>
</n-tag>
<n-select class="form_input_wrapper" v-model:value="change_status" :options="[
{value:1,label:'可用'},
{value:2,label:'停用'},
]"/>
</n-space>
</div>
<n-space mt-2 justify="center">
<n-button @click="AppointmentChangeStatus()" type="info">确定</n-button>
<n-button @click="change_status_show = false">取消</n-button>
</n-space>
</div>
</n-modal>
<n-modal v-model:show="change_count_show" preset="card" :style="{width: '400px'}" title="修改数量"
:auto-focus="false" :bordered="false">
<div>
<div>
<n-space align="center">
<n-tag>
<div class="form_tag_wrapper">最大计划数量</div>
</n-tag>
<n-input-number class="form_input_wrapper" v-model:value="change_count"></n-input-number>
</n-space>
</div>
<n-space mt-2 justify="center">
<n-button @click="AppointmentChangeCount()" type="info">确定</n-button>
<n-button @click="change_count_show = false">取消</n-button>
</n-space>
</div>
</n-modal>
<n-card title="预约计划">
<div>
<n-space align="center">
<n-tag>
<div class="form_tag_wrapper">医院</div>
</n-tag>
<n-select class="form_input_wrapper" v-model:value="page_options.hospital"
:options="hospital_select_list"/>
<n-tag>
<div class="form_tag_wrapper">开始日期</div>
</n-tag>
<n-date-picker v-model:formatted-value="page_options.start_date" type="date"/>
<n-tag>
<div class="form_tag_wrapper">结束日期</div>
</n-tag>
<n-date-picker v-model:formatted-value="page_options.end_date" type="date"/>
</n-space>
<n-space mt-2 align="center">
<n-tag>
<div class="form_tag_wrapper">状态</div>
</n-tag>
<n-radio-group v-model:value="page_options.status" name="status_radio">
<n-space>
<n-radio :value="0">全部</n-radio>
<n-radio :value="1">可用</n-radio>
<n-radio :value="2">停用</n-radio>
</n-space>
</n-radio-group>
<n-tag>
<div class="form_tag_wrapper">星期</div>
</n-tag>
<n-checkbox-group v-model:value="page_options.weeks">
<n-space item-style="display: flex;">
<n-checkbox v-for="(i,k) in week_arr" :key="k" :value="k+1" :label="`星期${i}`"/>
</n-space>
</n-checkbox-group>
<n-button @click="searchClick()" type="info">搜索</n-button>
</n-space>
<n-space mt-2>
<n-button @click="createClick()" type="success">新建</n-button>
<n-button @click="deleteShowClick()" type="error">删除</n-button>
<n-button @click="changeStatusShowClick()" type="info">修改状态</n-button>
<n-button @click="changeCountShowClick()" type="info"></n-button>
</n-space>
<n-data-table mt-2 v-model:checked-row-keys="appointment_active" :columns="appointment_columns"
:row-key="row=>row.id" :data="appointment_list"/>
<n-pagination v-if="appointment_list_last_page > 1" @update:page="updatePage" mt-2
v-model:page="page_options.page"
:page-count="appointment_list_last_page"/>
</div>
</n-card>
</div>
</template>
<style scoped>
</style>
<route>
{"meta":{"title":"预约计划"}}
</route>