* связка таблицы архива с пациентами
* добавил разграничение карт по типам баз * модель для хранения изменений статуса карт * добавил окно с просмотром выдачи карты * добавил фильтрацию вывода карт
This commit is contained in:
@@ -1,13 +1,70 @@
|
||||
<script setup>
|
||||
import { NModal } from 'naive-ui'
|
||||
import { NModal, NDataTable } from 'naive-ui'
|
||||
import {ref, watch} from "vue";
|
||||
|
||||
const open = defineModel('open')
|
||||
const props = defineProps({
|
||||
patientId: {
|
||||
type: Number,
|
||||
}
|
||||
})
|
||||
|
||||
const loading = ref(true)
|
||||
const patient = ref({})
|
||||
|
||||
const loadPatientData = async () => {
|
||||
if (!props.patientId) return
|
||||
|
||||
loading.value = true
|
||||
try {
|
||||
axios.get(`/api/si/patients/${props.patientId}`).then(res => {
|
||||
patient.value = res.data
|
||||
})
|
||||
} catch (error) {
|
||||
// message.error('Ошибка при загрузке данных пациента')
|
||||
console.error(error)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const columns = [
|
||||
{
|
||||
title: 'Выдача',
|
||||
key: 'issue_at'
|
||||
},
|
||||
{
|
||||
title: 'Возврат',
|
||||
key: 'return_at'
|
||||
},
|
||||
{
|
||||
title: 'Организация',
|
||||
key: 'org_id'
|
||||
},
|
||||
{
|
||||
title: 'ФИО',
|
||||
key: 'employee_name'
|
||||
},
|
||||
{
|
||||
title: 'Должность',
|
||||
key: 'employee_post'
|
||||
},
|
||||
]
|
||||
|
||||
// Наблюдаем за изменением patientId
|
||||
watch(() => props.patientId, (newId) => {
|
||||
if (newId) {
|
||||
loadPatientData()
|
||||
}
|
||||
}, { immediate: true })
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NModal v-model:show="open">
|
||||
<NModal v-model:show="open" preset="card" class="max-w-4xl" closable @close="open = false">
|
||||
<template #header>
|
||||
|
||||
{{ patient.info?.medcardnum }} {{ patient.info?.family }} {{ patient.info?.name }} {{ patient.info?.ot }}
|
||||
</template>
|
||||
<NDataTable :columns="columns" :data="patient?.journal" />
|
||||
</NModal>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
<script setup>
|
||||
import {NDataTable, NEllipsis} from "naive-ui"
|
||||
import {h, reactive, ref} from "vue"
|
||||
import {useMedicalHistory} from "../../../Composables/useMedicalHistory.js";
|
||||
import {computed, h, reactive, ref} from "vue"
|
||||
import {useMedicalHistoryFilter} from "../../../Composables/useMedicalHistoryFilter.js";
|
||||
import ArchiveHistoryModal from '../ArchiveHistoryModal/Index.vue'
|
||||
|
||||
const { navigate } = useMedicalHistory('/')
|
||||
const props = defineProps({
|
||||
data: {
|
||||
filters: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
meta: {
|
||||
type: Object,
|
||||
default: {}
|
||||
data: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
maxHeight: {
|
||||
type: String,
|
||||
@@ -20,15 +20,17 @@ const props = defineProps({
|
||||
minHeight: {
|
||||
type: String,
|
||||
default: null
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const { isLoading, handlePageChange, handlePageSizeChange, meta } = useMedicalHistoryFilter(props.filters)
|
||||
|
||||
const columns = ref([
|
||||
{
|
||||
title: '№ карты',
|
||||
key: 'nkarta',
|
||||
key: 'medcardnum',
|
||||
width: 100,
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.nkarta })
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.medcardnum })
|
||||
},
|
||||
{
|
||||
title: 'ФИО',
|
||||
@@ -44,21 +46,21 @@ const columns = ref([
|
||||
},
|
||||
{
|
||||
title: 'Дата поступления',
|
||||
key: 'mpostdate',
|
||||
key: 'daterecipient',
|
||||
width: 150,
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.mpostdate })
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.daterecipient })
|
||||
},
|
||||
{
|
||||
title: 'Дата выписки',
|
||||
key: 'menddate',
|
||||
key: 'dateextract',
|
||||
width: 130,
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.menddate })
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.dateextract })
|
||||
},
|
||||
{
|
||||
title: '№ архива',
|
||||
key: 'narhiv',
|
||||
width: 120,
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.narhiv })
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.narhiv || '-' })
|
||||
},
|
||||
{
|
||||
title: 'Дата архива',
|
||||
@@ -73,28 +75,35 @@ const columns = ref([
|
||||
render: (row) => h(NEllipsis, null, { default: () => row.status || '-' })
|
||||
}
|
||||
])
|
||||
const showArchiveHistoryModal = ref(false)
|
||||
const selectedPatientId = ref(null)
|
||||
const rowProps = (row) => ({
|
||||
onDblclick: () => {
|
||||
selectedPatientId.value = row.id
|
||||
showArchiveHistoryModal.value = true
|
||||
}
|
||||
})
|
||||
|
||||
const paginationReactive = reactive({
|
||||
page: props.meta.current_page,
|
||||
pageCount: props.meta.last_page,
|
||||
pageSize: props.meta.per_page,
|
||||
itemCount: props.meta.total,
|
||||
const pagination = computed(() => ({
|
||||
page: meta.value.current_page || 1,
|
||||
pageCount: meta.value.last_page || 1,
|
||||
pageSize: meta.value.per_page || 15,
|
||||
itemCount: meta.value.total || 0,
|
||||
pageSizes: [15, 50, 100],
|
||||
showSizePicker: true,
|
||||
prefix({ itemCount }) {
|
||||
return `Всего карт ${itemCount}.`
|
||||
},
|
||||
onUpdatePage(page) {
|
||||
navigate(undefined, page)
|
||||
onUpdatePage: (page) => {
|
||||
handlePageChange(page)
|
||||
},
|
||||
onUpdatePageSize(pageSize) {
|
||||
navigate(undefined, 1, pageSize)
|
||||
}
|
||||
})
|
||||
onUpdatePageSize: handlePageSizeChange
|
||||
}))
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NDataTable remote striped :columns="columns" :pagination="paginationReactive" :max-height="maxHeight" size="small" :min-height="minHeight" :data="data" />
|
||||
<NDataTable remote striped :loading="isLoading" :row-props="rowProps" :columns="columns" :pagination="pagination" :max-height="maxHeight" size="small" :min-height="minHeight" :data="data" />
|
||||
<ArchiveHistoryModal v-model:open="showArchiveHistoryModal" :patient-id="selectedPatientId" />
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -1,38 +1,51 @@
|
||||
<script setup>
|
||||
import AppLayout from "../../Layouts/AppLayout.vue"
|
||||
import TableCards from './DataTable/Index.vue'
|
||||
import { NInput, NFlex, NDivider, NDatePicker } from 'naive-ui'
|
||||
import { NInput, NFlex, NDivider, NDatePicker, NSpace, NRadioGroup, NRadioButton, NH1 } from 'naive-ui'
|
||||
import {useMedicalHistory} from "../../Composables/useMedicalHistory.js";
|
||||
import {useDebounceFn} from "@vueuse/core";
|
||||
import {useMedicalHistoryFilter} from "../../Composables/useMedicalHistoryFilter.js";
|
||||
import {computed, ref} from "vue";
|
||||
|
||||
const props = defineProps({
|
||||
cards: {
|
||||
type: Array,
|
||||
default: []
|
||||
},
|
||||
filters: {
|
||||
type: Array,
|
||||
default: []
|
||||
}
|
||||
})
|
||||
|
||||
const { navigate } = useMedicalHistory('/')
|
||||
const {
|
||||
isLoading, applyFilters, filtersRef, handleSearch, dateRange,
|
||||
handleDateRangeChange, handleViewTypeChange
|
||||
} = useMedicalHistoryFilter(props.filters)
|
||||
|
||||
const search = (value) => {
|
||||
navigate(value)
|
||||
}
|
||||
|
||||
const debounceSearch = useDebounceFn((searchValue) => {
|
||||
search(searchValue)
|
||||
}, 500)
|
||||
const viewType = ref('archive')
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<AppLayout>
|
||||
<template #header>
|
||||
<NFlex class="py-4" align="center" :wrap="false">
|
||||
<NInput placeholder="Поиск по ФИО, № карты" @update:value="val => debounceSearch(val)"/>
|
||||
<NDivider vertical />
|
||||
<NDatePicker type="daterange" clearable format="dd.MM.yyyy" start-placeholder="Дата выписки с" end-placeholder="по" />
|
||||
</NFlex>
|
||||
<NSpace vertical>
|
||||
<NH1 class="!my-0 mb-5">
|
||||
Архив
|
||||
</NH1>
|
||||
<NRadioGroup v-model:value="viewType" @update:value="val => handleViewTypeChange(val)">
|
||||
<NRadioButton value="archive">Архив</NRadioButton>
|
||||
<NRadioButton value="mis">МИС</NRadioButton>
|
||||
<NRadioButton value="softinfo">СофтИнфо</NRadioButton>
|
||||
</NRadioGroup>
|
||||
<NFlex class="pb-4" align="center" :wrap="false">
|
||||
<NInput placeholder="Поиск по ФИО, № карты" @update:value="val => handleSearch(val)"/>
|
||||
<NDivider vertical />
|
||||
<NDatePicker v-model:value="dateRange" @update:value="handleDateRangeChange" type="daterange" clearable format="dd.MM.yyyy" start-placeholder="Дата выписки с" end-placeholder="по" />
|
||||
</NFlex>
|
||||
</NSpace>
|
||||
</template>
|
||||
<TableCards :data="cards.data" :meta="cards.meta" min-height="calc(100vh - 179px)" max-height="calc(100vh - 196px)" />
|
||||
<TableCards :filters="filters" :data="cards.data" :meta="cards.meta" min-height="calc(100vh - 277px)" max-height="calc(100vh - 320px)" />
|
||||
</AppLayout>
|
||||
</template>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user