From a6f64303f88508d1c4d6ce53ff46be6b745cfb93 Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期二, 14 十月 2025 15:21:59 +0800
Subject: [PATCH] 完成营养师管理
---
src/views/home/index.vue | 650 ++++++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 440 insertions(+), 210 deletions(-)
diff --git a/src/views/home/index.vue b/src/views/home/index.vue
index 3c14bf2..800dfd7 100644
--- a/src/views/home/index.vue
+++ b/src/views/home/index.vue
@@ -1,130 +1,252 @@
<template>
- <div class="home-container layout-pd ">
- <el-row :gutter="15" >
- <el-col :span="4" class="patTabel">
- <el-table :data="state.filterTableData"
- stripe
- :height="state.tableHeight.left"
- size="default"
- highlight-current-row
- @current-change="handleCurrentChange"
- style="width: 100%">
- <el-table-column>
- <template #header>
- <div class="home-title">
- <el-avatar shape="square" style="width: 16px; height: 16px;background-color: #ffffff;margin-right: 10px;margin-left: 10px;" fit="contain" :src="huanzheliebiao" />
-
- <div class="titleHome">患者列表</div>
- </div>
- <el-input size="default" @change="getPatients" v-model="state.search" placeholder="支持模糊查询" :prefix-icon="Search"/>
- </template>
- <template #default="scope">
- <el-row>
- <el-col :span="12">{{scope.row.patientName}}</el-col>
- <el-col :span="6">{{scope.row.patientGenderText}}</el-col>
- <el-col :span="6">{{scope.row.age}}</el-col>
- </el-row>
- </template>
- </el-table-column>
- </el-table>
- </el-col>
- <el-col :span="20" class="detailRight">
- <el-tabs v-model="state.activeName" class="demo-tabs" @tab-click="handleClick">
- <el-tab-pane label="患者档案" name="患者档案">
- <template #label>
- <span class="custom-tabs-label home-title">
- <el-icon><Avatar /></el-icon>
- <span style="margin-left: 5px">患者档案</span>
- </span>
- </template>
- 患者档案
- </el-tab-pane>
- <el-tab-pane label="生化数据" name="生化数据">
- <template #label>
- <span class="custom-tabs-label home-title">
- <el-icon><Aim /></el-icon>
- <span style="margin-left: 5px">生化数据</span>
- </span>
- </template>
- Config
- </el-tab-pane>
- <el-tab-pane label="用药记录" name="用药记录">
- <template #label>
- <span class="custom-tabs-label home-title">
- <el-icon><Edit /></el-icon>
- <span style="margin-left: 5px">用药记录</span>
- </span>
- </template>
- Role
- </el-tab-pane>
- <el-tab-pane label="历史服务" name="历史服务">
- <template #label>
- <span class="custom-tabs-label home-title">
- <el-icon><ZoomIn /></el-icon>
- <span style="margin-left: 5px">历史服务</span>
- </span>
- </template>
- Task
- </el-tab-pane>
- <el-tab-pane label="膳食调查" name="膳食调查">
- <template #label>
- <span class="custom-tabs-label home-title">
- <el-icon><Notification /></el-icon>
- <span style="margin-left: 5px">膳食调查</span>
- </span>
- </template>
- Task
- </el-tab-pane>
- <el-tab-pane label="营养筛查评估" name="营养筛查评估">
- <template #label>
- <span class="custom-tabs-label home-title">
- <el-icon><Histogram /></el-icon>
- <span style="margin-left: 5px">营养筛查评估</span>
- </span>
- </template>
- Task
- </el-tab-pane>
- <el-tab-pane label="方案" name="方案">
- <template #label>
- <span class="custom-tabs-label home-title">
- <el-icon><Grid /></el-icon>
- <span style="margin-left: 5px">方案</span>
- </span>
- </template>
- Task
- </el-tab-pane>
- <el-tab-pane label="随访记录" name="随访记录">
- <template #label>
- <span class="custom-tabs-label home-title">
- <el-icon><ChatDotRound /></el-icon>
- <span style="margin-left: 5px">随访记录</span>
- </span>
- </template>
- Task
- </el-tab-pane>
- </el-tabs>
- </el-col>
- </el-row>
+ <div class="home-container layout-pd">
+ <div class="container">
+ <div class="container-left" v-if="isLeftVisible">
+ <div class="patTabel">
+ <el-table
+ :data="state.filterTableData"
+ stripe
+ :height="state.tableHeight.left"
+ size="default"
+ highlight-current-row
+ @current-change="handleCurrentChange"
+ style="width: 300px"
+ >
+ <el-table-column>
+ <template #header>
+ <div class="home-title">
+ <el-avatar
+ shape="square"
+ style="width: 16px; height: 16px; background-color: #ffffff; margin-right: 10px; margin-left: 10px"
+ fit="contain"
+ :src="huanzheliebiao"
+ />
+ <div class="titleHome">
+ 患者列表 <span style="color: blue" v-if="state.filterTableData.length">   共({{ state.filterTableData.length }})人</span>
+ </div>
+ </div>
+ <el-input size="default" @change="getPatients()" v-model="state.search" placeholder="支持模糊查询" :prefix-icon="Search" />
+ <el-row :gutter="5" style="margin-top: 5px">
+ <el-col :span="12">
+ <el-date-picker
+ size="default"
+ :clearable="false"
+ v-model="state.queryDete"
+ type="date"
+ value-format="YYYY-MM-DD"
+ :placeholder="$t('message.透析单.选择排班日期')"
+ class="dialysis_form_date"
+ style="width: 100%"
+ @change="() => getPatients()"
+ >
+ </el-date-picker>
+ </el-col>
+ <el-col :span="12" style="text-align: right">
+ <el-select size="default" v-model="state.timeSlot" class="w_100" :clearable="false" @change="() => getPatients()">
+ <el-option
+ v-for="(item, index) in state.timeSlotOptions"
+ :key="index"
+ :label="item.label"
+ :value="item.value"
+ ></el-option>
+ </el-select>
+ </el-col>
+ </el-row>
+ <el-row style="margin-top: 5px">
+ <el-col :span="10">姓名</el-col>
+ <el-col :span="5">性别</el-col>
+ <el-col :span="4">年龄</el-col>
+ <el-col :span="5">床号</el-col>
+ </el-row>
+ </template>
+ <template #default="scope">
+ <el-row>
+ <el-col :span="10">{{ scope.row.patientName }}</el-col>
+ <el-col :span="5">{{ scope.row?.patientGender === 0 ? '男' : '女' }}</el-col>
+ <el-col :span="4">{{ scope.row.age }}</el-col>
+ <el-col :span="5">{{ scope.row.deviceNo }}</el-col>
+ </el-row>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ </div>
+ <div class="right" :class="{ 'full-width': !isLeftVisible }" style="width: 100%">
+ <div style="width: 100%">
+ <el-tabs v-model="state.activeName" class="demo-tabs" @tab-click="handleClick">
+ <el-tab-pane label="患者档案" name="患者档案">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <Avatar />
+ </el-icon>
+ <span style="margin-left: 5px">患者档案</span>
+ </span>
+ </template>
+ </el-tab-pane>
+ <el-tab-pane label="营养筛查评估" name="营养筛查评估">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <Histogram />
+ </el-icon>
+ <span style="margin-left: 5px">营养筛查评估</span>
+ </span>
+ </template>
+ </el-tab-pane>
+ <el-tab-pane label="膳食调查" name="膳食调查">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <Notification />
+ </el-icon>
+ <span style="margin-left: 5px">膳食调查</span>
+ </span>
+ </template>
+ </el-tab-pane>
+
+ <el-tab-pane label="食物过敏原及胃肠功能调查" name="食物过敏原及胃肠功能调查">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <Notification />
+ </el-icon>
+ <span style="margin-left: 5px">食物过敏原及胃肠功能调查</span>
+ </span>
+ </template>
+ </el-tab-pane>
+ <el-tab-pane label="随访记录" name="随访记录">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <ChatDotRound />
+ </el-icon>
+ <span style="margin-left: 5px">随访记录</span>
+ </span>
+ </template>
+ </el-tab-pane>
+ <el-tab-pane label="营养饮食指导方案" name="营养饮食指导方案">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <Grid />
+ </el-icon>
+ <span style="margin-left: 5px">营养饮食指导方案</span>
+ </span>
+ </template>
+ </el-tab-pane>
+ <el-tab-pane label="生化数据" name="生化数据">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <Aim />
+ </el-icon>
+ <span style="margin-left: 5px">生化数据</span>
+ </span>
+ </template>
+ </el-tab-pane>
+ <el-tab-pane label="用药记录" name="用药记录">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <Edit />
+ </el-icon>
+ <span style="margin-left: 5px">用药记录</span>
+ </span>
+ </template>
+ </el-tab-pane>
+ <el-tab-pane label="营养服务管理记录" name="营养服务管理记录">
+ <template #label>
+ <span class="custom-tabs-label home-title">
+ <el-icon>
+ <Edit />
+ </el-icon>
+ <span style="margin-left: 5px">营养服务管理记录</span>
+ </span>
+ </template>
+ </el-tab-pane>
+ </el-tabs>
+ <div class="itemDoby">
+ <patientFile v-show="state.activeName === '患者档案'" :tableHeight="state.tableHeight.detailRight" ref="patientFileRef" />
+ <lisUi v-show="state.activeName === '生化数据'" ref="lisUiRef"> </lisUi>
+ <MedicationRecords v-show="state.activeName === '用药记录'" :tableHeight="state.tableHeight.detailRight" ref="MedicationRecordsRef">
+ </MedicationRecords>
+ <dietarySurvey
+ ref="dietarySurveyRef"
+ v-show="state.activeName === '膳食调查'"
+ :tableHeight="state.tableHeight.detailRight"
+ ></dietarySurvey>
+ <shiwuguoming
+ ref="shiwuguomingRef"
+ v-show="state.activeName === '食物过敏原及胃肠功能调查'"
+ :tableHeight="state.tableHeight.detailRight"
+ ></shiwuguoming>
+ <pinggubiao ref="pinggubiaoRef" v-show="state.activeName === '营养筛查评估'" :tableHeight="state.tableHeight.detailRight"></pinggubiao>
+ <fangAn ref="fangAnRef" v-show="state.activeName === '营养饮食指导方案'" :tableHeight="state.tableHeight.detailRight"></fangAn>
+ <suifangjilu ref="suifangjiluRef" v-show="state.activeName === '随访记录'" :tableHeight="state.tableHeight.detailRight"></suifangjilu>
+
+ <jilubiao ref="jilubiaoRef" v-show="state.activeName === '营养服务管理记录'" :tableHeight="state.tableHeight.detailRight"></jilubiao>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="fixed-div" v-show="patientsInfo.patientName" @click="toggleVisibility">
+ <el-avatar :size="80" :src="patientsInfo.patientAvatarIcon" />
+ <div>{{ patientsInfo.patientName }}</div>
+ <el-icon size="20" v-if="isLeftVisible"><Fold /></el-icon>
+ <el-icon size="20" v-else><Expand /></el-icon>
+ </div>
</div>
</template>
<script setup lang="ts" name="home">
-import huanzheliebiao from '/@/assets/imgs/huanzheliebiao.png'
+import huanzheliebiao from '/@/assets/imgs/huanzheliebiao.png';
import { reactive, onMounted, ref, watch, nextTick, onActivated, markRaw } from 'vue';
-import {QueryList} from '/@/api/Patients'
+import { QueryList, getRecordsInToday2 } from '/@/api/Patients';
import { storeToRefs } from 'pinia';
+import { formatDate } from '/@/utils/formatTime';
import { useUserInfo } from '/@/stores/userInfo';
+import { usePatientsInfo } from '/@/stores/patientsInfo';
const stores = useUserInfo();
+const storesPat = usePatientsInfo();
const { userInfos } = storeToRefs(stores);
-import { ElLoading, TabsPaneContext } from 'element-plus'
-import { Search } from '@element-plus/icons-vue'
+const { patientsInfo } = storeToRefs(storesPat);
+import { ElLoading, TabsPaneContext } from 'element-plus';
+import { Search } from '@element-plus/icons-vue';
+// 用药记录
+import MedicationRecords from './components/Medication_records.vue';
+// 膳食调查
+import dietarySurvey from './components/dietary_survey.vue';
+import shiwuguoming from './components/shiwuguoming/index.vue';
+// 患者档案
+import patientFile from './components/patient_file.vue';
+// 化验结果
+import lisUi from './components/lis_.ui.vue';
+// 评估表
+import pinggubiao from './components/pingubiao/index.vue';
+// 方案
+import fangAn from './components/fangAn/index.vue';
+// 随访记录
+import suifangjilu from './components/suifangjilu/index.vue';
+// 营养记录表
+import jilubiao from './components/jilubiao/index.vue';
interface User {
- code:string,
- patientName: string
- patientGenderText: string
- age: string
+ code: string;
+ patientName: string;
+ patientGenderText: string;
+ age: string;
}
-const currentRow=ref()
+const MedicationRecordsRef = ref();
+const patientFileRef = ref();
+const currentRow = ref();
+const lisUiRef = ref();
+const pinggubiaoRef = ref();
+const dietarySurveyRef = ref(); // 膳食调查
+const shiwuguomingRef = ref();
+const fangAnRef = ref();
+const suifangjiluRef = ref();
+const jilubiaoRef = ref();
+const isLeftVisible = ref(true);
const state = reactive({
global: {
homeChartOne: null,
@@ -132,116 +254,224 @@
homeCharThree: null,
dispose: [null, '', undefined],
} as any,
- filterTableData:[
- {
- name: '张山',
- sex: '男',
- age: '12',
- },
- {
- name: '张山二',
- sex: '男',
- age: '12',
- },
- {
- name: '王二小',
- sex: '男',
- age: '12',
- },
- ],
- activeName:'患者档案',
- tableHeight:{
- left:0,
- detailRight:0
- },
- search:''
+ queryDete: formatDate(new Date(), 'YYYY-mm-dd'),
+ filterTableData: [],
+ activeName: '患者档案',
+ tableHeight: {
+ left: 0,
+ detailRight: 0,
+ },
+ search: '',
+ isTable: true,
+ timeSlot:-1, // 排班时间段
+ timeSlotOptions:[{label:'全部患者',value:3},{label:"排班患者",value:-1}]
});
-onMounted(()=>{
- setTableHeight()
- getPatients()
-})
-const handleCurrentChange = (val: User | undefined) => {
- currentRow.value = val
-}
-const getPatients=()=>{
- const loading = ElLoading.service({
- lock: true,
- text: 'Loading',
- background: 'rgba(0, 0, 0, 0.7)',
- })
- var ps= {
- page: 0,
- size: 0,
- wherecondition:`client_code="${userInfos.value.clientCode}" and (patient_name like "%${state.search.toLowerCase()}%"
- OR patient_name_py like "%${state.search.toLowerCase()}%")`
- }
- QueryList(ps).then(res=>{
- console.log('----------------患者--------')
- console.log(res.data)
- state.filterTableData=res.data.list
- }).finally(e=>{
- loading.close()
- })
-}
+onMounted(() => {
+ setTableHeight();
+ getPatients();
+});
+// 定义一个方法来切换左边div的显示状态
+const toggleVisibility = () => {
+ isLeftVisible.value = !isLeftVisible.value;
+};
+const handleCurrentChange = (val: any | undefined) => {
+ if (val) {
+ console.log(val);
+ currentRow.value = val;
+ const ps = {
+ id: val.patientId,
+ code: val.patientCode,
+ age: val.age,
+ patientName: val.patientName,
+ patientGenderText: val?.patientGender ? '女' : '男',
+ patientAvatarIcon: val?.patientAvatar,
+ clientCode: val.clientCode,
+ };
+ //缓存到vuex 中
+ storesPat.setPatientsInfo(ps);
+ getTabsData();
+ }
+};
+/**获取患者列表 */
+const getPatients = () => {
+ // 初始化患者信息
+ storesPat.setPatientsInfo({
+ id: '',
+ code: '',
+ age: 0,
+ patientName: '',
+ patientGenderText: '',
+ patientAvatarIcon: '',
+ clientCode: '',
+ });
+ // 患者信息查询条件
+ const pp = {
+ timeSlot: state.timeSlot,
+ patientFrom: -1,
+ patientName: state.search.toLowerCase(),
+ orderCondition: 2,
+ clientCode: userInfos.value.clientCode,
+ dateBegin: formatDate(new Date(state.queryDete), 'YYYY-mm-dd') + ' 00:00:00',
+ dateEnd: formatDate(new Date(state.queryDete), 'YYYY-mm-dd') + ' 23:59:59',
+ };
+ const loading = ElLoading.service({
+ lock: true,
+ text: 'Loading',
+ background: 'rgba(0, 0, 0, 0.7)',
+ });
+ getRecordsInToday2(pp)
+ .then((re) => {
+ console.log(re.data);
+ state.filterTableData = re.data;
+ })
+ .finally(() => {
+ loading.close();
+ });
+
+ // var ps = {
+ // page: 0,
+ // size: 0,
+ // wherecondition: `client_code="${userInfos.value.clientCode}" and (patient_name like "%${state.search.toLowerCase()}%"
+ // OR patient_name_py like "%${state.search.toLowerCase()}%")`
+ // }
+
+ // QueryList(ps).then(res => {
+ // console.log('----------------患者--------')
+ // console.log(res.data)
+ // state.filterTableData = res.data.list
+ // }).finally(() => {
+ // loading.close()
+ // })
+};
/**设置高度 */
const setTableHeight = () => {
let height = document.documentElement.clientHeight;
- console.log('窗口高度')
+ console.log('窗口高度');
const navDom = document.querySelector('.layout-navbars-breadcrumb-index');
if (navDom) {
height -= navDom.scrollHeight;
}
- state.tableHeight.detailRight=height
- state.tableHeight.left = height-77;
+ state.tableHeight.detailRight = height;
+ state.tableHeight.left = height - 77;
// const demoFormDom = document.querySelector('.card_box_search')
-
};
/** 切换明细tabs*/
-const handleClick=(tab: TabsPaneContext, event: Event)=>{
- console.log(tab, event)
-}
+const handleClick = (tab: TabsPaneContext, event: Event) => {
+ state.activeName = tab.paneName as string;
+ getTabsData();
+};
+/** 获取明细项数据 */
+const getTabsData = () => {
+ if (patientsInfo.value.id) {
+ if (state.activeName === '用药记录') {
+ MedicationRecordsRef.value.getData();
+ } else if (state.activeName === '患者档案') {
+ patientFileRef.value.getData();
+ } else if (state.activeName === '膳食调查') {
+ dietarySurveyRef.value.getData();
+ } else if (state.activeName === '食物过敏原及胃肠功能调查') {
+ shiwuguomingRef.value.getData();
+ } else if (state.activeName === '营养筛查评估') {
+ pinggubiaoRef.value.getData();
+ } else if (state.activeName === '营养饮食指导方案') {
+ fangAnRef.value.getData();
+ } else if (state.activeName === '随访记录') {
+ suifangjiluRef.value.getData();
+ } else if (state.activeName === '营养服务管理记录') {
+ jilubiaoRef.value.getData();
+ }
+ }
+};
</script>
-<style lang="scss">
-$homeNavLengh: 8;
+<style lang="scss">
+.container {
+ gap: 10px; /* 在flex项目之间设置间距 */
+ display: flex;
+}
+
+.container-left {
+ width: 300px; /* 右边div的固定宽度 */
+ transition: all 0.3s ease; /* 添加过渡效果,使宽度变化更加平滑 */
+}
+.right {
+ flex-grow: 1; /* 让这个div扩展以填充可用空间 */
+ transition: all 0.3s ease; /* 添加过渡效果,使宽度变化更加平滑 */
+}
+.full-width {
+ width: 100%; /* 当左边div隐藏时,右边div占据全部宽度 */
+}
.home-container {
overflow: hidden;
- .patTabel{
- .el-table th.el-table__cell {
- background-color: #6babfa;
- color:#606266;
- }
- .el-table__body tr.current-row>td.el-table__cell{
- background: #E4F6DE;
- color: #5FCD00;
- /* height: 25px; */
- /* border: tomato solid 1px; */
- }
- }
-
-}
-.patTitle{
- height: 25px;
- font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
- font-weight: 500;
- font-size: 18px;
- color: #333333;
- line-height: 20px;
- letter-spacing: 1px;
- text-align: left;
- font-style: normal;
- // margin-top: -10px;
-}
-.home-title{
- margin-bottom: 4px;
- flex: 1;
- height: inherit;
- display: flex;
- align-items: center;
-}
-.detailRight{
- background-color: #ffffff;
+ .patTabel {
+ width: 100%;
+ .el-table th.el-table__cell {
+ background-color: #6babfa;
+ color: #ffffff;
+ }
+
+ .el-table__body tr.current-row > td.el-table__cell {
+ background: rgb(197.7, 225.9, 255);
+ color: #409eff;
+ }
+ }
}
+.patTitle {
+ height: 25px;
+ font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
+ font-weight: 500;
+ font-size: 18px;
+ color: #333333;
+ line-height: 20px;
+ letter-spacing: 1px;
+ text-align: left;
+ font-style: normal;
+ // margin-top: -10px;
+}
+
+.home-title {
+ margin-bottom: 4px;
+ flex: 1;
+ height: inherit;
+ display: flex;
+ align-items: center;
+}
+
+.detailRight {
+ margin-left: 10px;
+ background-color: #ffffff;
+}
+.itemDoby {
+ width: 100%; /* 设置容器宽度 */
+ overflow-x: auto; /* 横向内容溢出时显示滚动条 */
+}
+.fixed-div {
+ position: fixed;
+ flex: 1;
+ display: flex;
+ align-items: center;
+ bottom: 10px;
+ right: 30px;
+ width: 220px;
+ height: 100px;
+ color: rgb(16, 3, 3);
+ padding: 10px;
+ z-index: 999;
+
+ div {
+ font-weight: 800;
+ margin-left: 10px;
+ font-size: 20px;
+ }
+}
+.el-tabs__nav-scroll {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch; /* 确保在 iOS 上平滑滚动 */
+}
+
+.el-tabs__item {
+ cursor: pointer;
+ user-select: none;
+}
</style>
-
--
Gitblit v1.8.0