gx
chenyc
2025-06-09 81ced3885266779c3a3813a0e4687962375b1d62
src/views/home/components/patient_file.vue
@@ -1,82 +1,165 @@
<template>
    <div class="dietarySurvey-home">
        <div v-if="patientsInfo.id" v-loading="state.loading">
            <el-card class="box-card" >
                <div  class="clearfix" >
                    <el-icon size="16" color="#409efc"><Briefcase /></el-icon>  <span> &nbsp; 服务套餐</span>
            <el-card class="box-card">
                <div class="clearfix">
                    <el-icon size="16" color="#409efc">
                        <Briefcase />
                    </el-icon> <span> &nbsp; 服务套餐</span>
                </div>
                <div>
                   基础服务100套餐
                   膳食套餐,
                   体检套餐,
                    <el-form  :inline="true" class="demo-form-inline">
                        <el-form-item label="基础服务:">
                            <el-radio-group class="elradiozdi" :disabled="state.formdispl" v-model="state.taochan.基础服务">
                                <el-radio value="是">是</el-radio>
                                <el-radio value="否">否</el-radio>
                            </el-radio-group>
                        </el-form-item>
                        <el-form-item label="自购套餐:" >
                            <el-row>
                                <el-col :span='12'>
                                    <el-input v-model="state.taochan.自购几月" :disabled="state.formdispl" placeholder="购买多少个月">
                                        <template #append>月</template>
                                    </el-input>
                                </el-col>
                                <el-col :span='12'>
                                    <el-input v-model="state.taochan.多少元套餐" :disabled="state.formdispl" placeholder="套餐金额">
                                        <template #append>元</template>
                                    </el-input>
                                </el-col>
                            </el-row>
                        </el-form-item>
                        <el-form-item label="自购产品名称">
                            <el-row>
                                <el-col :span='12'>
                                    <el-input v-model="state.taochan.产品名称" :disabled="state.formdispl" placeholder="产品名称"></el-input>
                                </el-col>
                                <el-col :span='12'>
                                    <el-input v-model="state.taochan.自购多少盒" :disabled="state.formdispl" placeholder="数量">
                                        <template #append>盒</template>
                                    </el-input>
                                </el-col>
                            </el-row>
                        </el-form-item>
                        <el-form-item>
                            <el-button v-if="state.formdispl" type="primary" :icon="Edit" @click="state.formdispl=false">编辑</el-button>
                            <el-button v-else type="success" :icon="Check" @click="onSubmitTC" >保存</el-button>
                        </el-form-item>
                    </el-form>
                </div>
            </el-card>
            <el-card class="box-card" style="margin-top:10px;">
                <div  class="clearfix" >
                    <el-icon size="16" color="#409efc"><CreditCard /></el-icon>  <span> &nbsp; 患者基本信息</span>
                <div class="clearfix">
                    <el-icon size="16" color="#409efc">
                        <CreditCard />
                    </el-icon> <span> &nbsp; 患者基本信息</span>
                </div>
                <div>
                    <table class="gridtable">
                        <tr>
                            <td>姓名:{{patientsInfo.patientName}}</td>
                            <td>年龄:<span v-if="patientsInfo.age">{{patientsInfo.age}}  岁</span></td>
                            <td>性别:{{patientsInfo.patientGenderText}}</td>
                            <td>身高:{{patientsInfo.patientHeight}}</td>
                            <td>干体重:<span v-if="state.patientData.干体重">{{state.patientData.干体重}} (kg)</span></td>
                            <td>姓名:{{ patientsInfo.patientName }}</td>
                            <td>年龄:<span v-if="patientsInfo.age">{{ patientsInfo.age }} 岁</span></td>
                            <td>性别:{{ patientsInfo.patientGenderText }}</td>
                            <td>身高:{{ state.patientData.身高 }} <span v-if="state.patientData.身高">(cm)</span>
                                <span>
                                    <el-icon :size="14" color="#409EFF" @click="updateSg">
                                        <Edit />
                                    </el-icon>
                                </span>
                            </td>
                            <td>干体重:<span>{{ state.patientData.干体重 }} (kg)</span>
                                <el-icon :size="14" color="#409EFF" @click="state.gtzshow=true">
                                    <Calendar />
                                </el-icon>
                            </td>
                        </tr>
                        <tr>
                            <td>透析龄:<span v-if="patientsInfo.medHistoryStatByMonth">{{patientsInfo.medHistoryStatByMonth}} (月)</span></td>
                            <td colspan="4">证件号:{{patientsInfo.patientIdentityNo}}</td>
                            <td colspan="2">证件号:{{ state.patientData.证件号 }}</td>
                            <td>透析龄:<span>{{透析年龄}}</span></td>
                            <td>最近体重:<span>{{ state.patientData.上一次透前体重 }} (kg)</span></td>
                            <td>BMI:<span>{{ BMI }}</span></td>
                        </tr>
                        <tr>
                            <td >电话号码:{{patientsInfo.patientTelNo}}</td>
                            <td >家属电话:{{patientsInfo.patientTelNoRelative}}</td>
                            <td colspan="3">家庭地址:{{patientsInfo.patientAddress}}</td>
                            <td>电话号码:{{ state.patientData.电话号码 }}</td>
                            <td>家属电话:{{ state.patientData.亲属手机号 }}</td>
                            <td colspan="3">家庭地址:{{ state.patientData.家庭住址 }}</td>
                        </tr>
                        <tr>
                            <td colspan="5">患者诊断:{{state.patientData.诊断}}</td>
                            <td colspan="5">患者诊断:{{ state.patientData.诊断 }}</td>
                        </tr>
                        <tr>
                            <td colspan="5">外院出院诊断:{{ state.patientData.出院诊断 }}
                                <span>
                                    <el-icon :size="14" color="#409EFF" @click="updateZD">
                                        <Edit />
                                    </el-icon>
                                </span>
                                </td>
                        </tr>
                    </table>
                </div>
            </el-card>
            <el-card class="box-card" style="margin-top:10px;">
                <div  class="clearfix" >
                    <el-icon size="16" color="#409efc"><CreditCard /></el-icon>  <span> &nbsp; 最新生化数据</span>
                <div class="clearfix">
                    <el-icon size="16" color="#409efc">
                        <CreditCard />
                    </el-icon> <span> &nbsp; 最新生化数据</span>
                </div>
                <div >
                    <el-row :gutter="10" v-if="state.listData.length">
                        <el-col :xs="8" :sm="8" :md="6" :lg="6" :xl="4" v-for="(item, key) in state.listData" :key="key">
                            <div class="itemLis" v-if="item?.item_result" >
                                <div class="title">
                                    {{key}}
                                </div>
                                <div  class="itemRes">
                                    <div  class="itemResDtile"   >
                                       <div style="text-align: center;width: 100%;">
                                        {{ item?.item_name }}
                                       </div>
                                       <div>
                                        {{ item?.item_result }}<span class="tdate">{{item?.item_result_unit}}</span>
                                       </div>
                <el-scrollbar :height="(tableHeight-520)+'px'">
                    <div>
                        <el-row :gutter="10" v-if="state.listData.length">
                            <el-col :xs="8" :sm="8" :md="6" :lg="6" :xl="4" v-for="(item, key) in state.listData"
                                :key="key">
                                <div class="itemLis" v-if="item?.item_result">
                                    <div class="title">
                                        {{ key }}
                                    </div>
                                    <div class="itemRes">
                                        <div class="itemResDtile">
                                            <div style="text-align: center;width: 100%;">
                                                {{ item?.item_name }}
                                            </div>
                                            <div>
                                                {{ item?.item_result }}<span class="tdate">{{ item?.item_result_unit
                                                    }}</span>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="tdate">
                                        {{ item?.sample_date_str }}
                                    </div>
                                </div>
                                <div  class="tdate" >
                                    {{item?.sample_date_str}}
                                </div>
                            </div>
                        </el-col>
                    </el-row>
                </div>
                            </el-col>
                        </el-row>
                    </div>
                </el-scrollbar>
            </el-card>
        </div>
        <el-empty v-else description="无数据,请先选择患者"></el-empty>
        <el-dialog v-model="state.gtzshow" title="干体重历史调整记录" width="800px">
            <el-table  :data="state.gtztableData" height="300" >
                    <el-table-column align="center" prop="createTime"  label="时间"  width="180" />
                    <el-table-column align="center" prop="pureWeight" label="干体重"  />
                    <el-table-column align="center" label="启用时间">
                        <template #default="scope">
                            <span v-if="scope.row.enableRecordTime">{{scope.row.enableRecordTime.substring(0,11)}}</span>
                        </template>
                    </el-table-column>
                    <el-table-column align="center" prop="remark"  label="备注" />
                </el-table>
        </el-dialog>
    </div>
</template>
@@ -86,9 +169,14 @@
import { usePatientsInfo } from '/@/stores/patientsInfo';
import { useUserInfo } from '/@/stores/userInfo';
import { computed, onMounted, reactive } from 'vue';
import { getPatData,getLisResults } from '/@/api/Patients';
import { getPatData, getLisResults, update ,updateNurtion,listNurtion,AddNurtion,getDryWeightList} from '/@/api/Patients';
import { userInfo } from 'os';
import { Search ,Edit,Check} from '@element-plus/icons-vue'
import dayjs from 'dayjs';
import { ElMessage, ElMessageBox } from 'element-plus';
import { number } from 'echarts';
import { rowKey } from 'element-plus/es/components/table-v2/src/common';
const storesPat = usePatientsInfo();
const stores = useUserInfo();
@@ -96,77 +184,256 @@
const { userInfos } = storeToRefs(stores);
const props = defineProps(['tableHeight'])
const state = reactive({
    gtztableData:[],
    gtzshow:false,
    formdispl:true,// 表单是否编辑
    // 患者套餐表
    taochanId:0,
    taochan: {
        基础服务: '',
        自购几月: '',
        多少元套餐: '',
        自购多少盒: '',
        产品名称: ''
    },
    tableData: [],
    loading: false,
    patientData:{
        姓名:'',
        干体重:'',
        证件号:"",
        诊断:'',
        身高:''
    patientData: {
        姓名: '',
        干体重: '',
        证件号: "",
        诊断: '',
        身高: '',
        上一次透前体重: '',
        出院诊断:'',
        '透析龄(月)':''
    },
    listData:<any>{}
    listData: <any>{}
})
const tableHe = computed(() => {
    return props.tableHeight - 130
})
const onSubmitTC=()=>{
    const data={
        id:state.taochanId,
        patient_code:patientsInfo.value.code,
        plan_json_body:JSON.stringify(state.taochan)
    }
    if(state.taochanId){
        state.loading = true
        updateNurtion(data).then(re=>{
            getlistNurtion()
        }).finally(()=>{
            state.formdispl=true
            state.loading = false
        })
    }else{
        state.loading = true
        AddNurtion(data).then(re=>{
            getlistNurtion()
        }).finally(()=>{
            state.formdispl=true
            state.loading = false
        })
    }
}
const updateZD=()=>{
    ElMessageBox.prompt('请输入你要编辑的外院出院诊断', '提示', {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        inputValue: state.patientData.出院诊断,
    })
        .then(({ value }) => {
            const params = {
                id: patientsInfo.value.id,
                outDiagnoseFromPrevHospital: value
            }
            update(params).then(re => {
                getPatData({ patCode: patientsInfo.value.code, }).then(res => {
                    state.patientData = res.data
                })
            })
        })
        .catch(() => {
            ElMessage({
                type: 'info',
                message: '取消修改',
            })
        })
}
/**打开修改身高 */
const updateSg = () => {
    ElMessageBox.prompt('请输入你要修改的身高单位cm', '提示', {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        inputValue: state.patientData.身高,
    })
        .then(({ value }) => {
            const params = {
                id: patientsInfo.value.id,
                patientHeight: value
            }
            update(params).then(re => {
                getPatData({ patCode: patientsInfo.value.code, }).then(res => {
                    state.patientData = res.data
                })
            })
        })
        .catch(() => {
            ElMessage({
                type: 'info',
                message: '取消修改',
            })
        })
}
const BMI = computed(() => {
    if (state.patientData.干体重 && state.patientData.身高) {
        return (Number(state.patientData.干体重) / (Number(state.patientData.身高) / 100 * Number(state.patientData.身高) / 100)).toFixed(2)
    } else {
        return ''
    }
})
const 透析年龄=computed(() => {
    if (state.patientData['透析龄(月)']) {
        const nian=Math.floor(Number(state.patientData['透析龄(月)']) / 12)===0?'':Math.floor(Number(state.patientData['透析龄(月)']) / 12)+'年'
        const yue=(Number(state.patientData['透析龄(月)']) % 12)===0?'':Number(state.patientData['透析龄(月)']) % 12+'月'
        return  nian +yue
    } else {
        return ''
    }
})
// 第一步:定义子组件里面的方法
const getData = async (str: string) => {
    var pam = {
        patCode: patientsInfo.value.code,
    }
    const pam2={
        clientCode:userInfos.value.clientCode,
        patCode:patientsInfo.value.code,
        date1:dayjs().add(-30, 'day').format('YYYY-MM-DD'),
        date2:dayjs().format('YYYY-MM-DD'),
    const pam2 = {
        clientCode: userInfos.value.clientCode,
        patCode: patientsInfo.value.code,
        date1: dayjs().add(-30, 'day').format('YYYY-MM-DD'),
        date2: dayjs().format('YYYY-MM-DD'),
    }
    try{
    const pas3={
        page: 0,
        size: 0,
        wherecondition:`patient_code='${patientsInfo.value.code}'`,
    }
    try {
        state.loading = true
        const [res1,res2]=await Promise.all([
        getGtzList()
        const [res1, res2,res3] = await Promise.all([
            getPatData(pam),
            getLisResults(pam2)
            getLisResults(pam2),
            listNurtion(pas3)
        ])
        state.patientData=res1.data
        state.listData=res2.data
        console.log('lis数据',state.listData)
        state.patientData = res1.data
        console.log('赋值患者信息',state.patientData)
        state.listData = res2.data
        if(res3.data?.list.length>=1){
            const row=res3.data.list[0]
            console.log('taochanshuju----',row)
            state.taochanId=row.id
            state.taochan=JSON.parse(row.planJsonBody)
        }else{
            state.taochanId=0
            state.taochan={
                基础服务: '',
                自购几月: '',
                多少元套餐: '',
                自购多少盒: '',
                产品名称: ''
            }
        }
        console.log('lis数据', state.listData)
        state.loading = false
    }
    catch(error){
    catch (error) {
        state.loading = false
        ElMessage.error('结果请求错误,请联系管理员!')
    }
}
onMounted(()=>{
const getGtzList=()=>{
    var data = {
    wherecondition: `patient_code = '${patientsInfo.value.code}'`,
    ordercondition: 'create_time desc'
    }
    getDryWeightList(data).then((res:any) => {
        state.gtztableData = res.data.list
    }).finally(()=>{
    })
}
// 刷新套餐
const getlistNurtion=()=>{
    const pas3={
        page: 0,
        size: 0,
        wherecondition:`patient_code='${patientsInfo.value.code}'`,
    }
    listNurtion(pas3).then(res3=>{
        if(res3.data.list&&res3.data.list>=1){
            const row=res3.data.list[0]
            state.taochanId=row.id
            state.taochan=JSON.parse(row.planJsonBody)
        }else{
            state.taochanId=0
        }
    })
}
onMounted(() => {
    // console.log(dayjs().add(-7, 'day').format('YYYY-MM-DD'),'---shan')
})
const formatResKeys = (obj: Object) => {
   return Object.keys(obj).filter((k) => k !== '标本日期');
    return Object.keys(obj).filter((k) => k !== '标本日期');
};
const formatResKeysDate = (obj: Object) => {
   return Object.keys(obj).filter((k) => k === '标本日期');
    return Object.keys(obj).filter((k) => k === '标本日期');
};
// 第二步:暴露方法
defineExpose({ getData })
</script>
<style  lang="scss">
 .gridtable {font-family: verdana,arial,sans-serif;font-size:14px;color:#333333;border-width: 1px;border-color: #666666;border-collapse: collapse;width: 100%;}
<style lang="scss">
.gridtable {
    font-family: verdana, arial, sans-serif;
    font-size: 14px;
    color: #333333;
    border-width: 1px;
    border-color: #666666;
    border-collapse: collapse;
    width: 100%;
}
.gridtable th {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #dedede;}
.gridtable th {
    border-width: 1px;
    padding: 8px;
    border-style: solid;
    border-color: #666666;
    background-color: #dedede;
}
.gridtable td {border-width: 1px;padding: 8px;border-style: solid;border-color: #666666;background-color: #ffffff;}
.clearfix{
.gridtable td {
    border-width: 1px;
    padding: 8px;
    border-style: solid;
    border-color: #666666;
    background-color: #ffffff;
}
.clearfix {
    font-weight: 800;
    flex: 1;
    height: inherit;
    display: flex;
    align-items: center;
    margin-top: -10px;margin-bottom: 10px;
    margin-top: -10px;
    margin-bottom: 10px;
}
.itemLis{
.itemLis {
    margin-bottom: 10px;
    width: 100%;
    padding-left: 10px;
@@ -179,37 +446,44 @@
    border-radius: 5px;
    text-align: center;
    margin-left: 10px;
    .title{
    .title {
        text-align: left;
        color: #909399;
        font-size: 13px;
        height: 20px;
        line-height: 20px;
    }
    .itemRes{
    .itemRes {
        height: 60px;
        flex: 1;
        display: flex;
        align-items: center;
        color: #303133;
        font-size: 16px;
        div{
        div {
            width: 100%;
            line-height: 30px;text-align: center; padding-left: 10px; padding-right: 10px;
            line-height: 30px;
            text-align: center;
            padding-left: 10px;
            padding-right: 10px;
        }
        .itemResDtile:not(:first-child) {
            width: 100%;
            /* 在这里添加你想要的样式 */
            border-left: 1px solid #909399; /* 示例样式:为除第一个div外的所有div添加红色边框 */
            border-left: 1px solid #909399;
            /* 示例样式:为除第一个div外的所有div添加红色边框 */
        }
    }
    .tdate{
    .tdate {
        color: #909399;
        font-size: 13px;
        height: 20px;
        line-height: 20px;
    }
}
</style>