患者管理

This commit is contained in:
2024-02-26 17:16:31 +08:00
parent 49741f033e
commit 27caafc32a
15 changed files with 1456 additions and 2 deletions

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询患者信息列表
export function listPatientInfo(query) {
return request({
url: '/manage/patientInfo/list',
method: 'get',
params: query
})
}
// 查询患者信息详细
export function getPatientInfo(id) {
return request({
url: '/manage/patientInfo/' + id,
method: 'get'
})
}
// 新增患者信息
export function addPatientInfo(data) {
return request({
url: '/manage/patientInfo',
method: 'post',
data: data
})
}
// 修改患者信息
export function updatePatientInfo(data) {
return request({
url: '/manage/patientInfo',
method: 'put',
data: data
})
}
// 删除患者信息
export function delPatientInfo(id) {
return request({
url: '/manage/patientInfo/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,32 @@
import request from '@/utils/request'
// 就诊记录
export function getList(query) {
return request({
url: '/manage/visitRecord/getList',
method: 'get',
params: query
})
}
// 入院记录
export function InRecord(patientVisitRecordId) {
return request({
url: `/manage/visitIn/getByVisitRecord/${patientVisitRecordId}`,
method: 'get',
})
}
// 出院记录
export function OutRecord(patientVisitRecordId) {
return request({
url: `/manage/visitOut/getByVisitRecord/${patientVisitRecordId}`,
method: 'get',
})
}
// 手术记录
export function OperationRecord(patientVisitRecordId) {
return request({
url: `/manage/visitOperation/getByVisitRecord/${patientVisitRecordId}`,
method: 'get',
})
}

BIN
src/assets/manage/gld.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/assets/manage/gzh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
src/assets/manage/xcx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -7,7 +7,7 @@
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/> <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
<div class="right-menu"> <div class="right-menu">
<template v-if="device!=='mobile'"> <!-- <template v-if="device!=='mobile'">
<search id="header-search" class="right-menu-item"/> <search id="header-search" class="right-menu-item"/>
<el-tooltip content="源码地址" effect="dark" placement="bottom"> <el-tooltip content="源码地址" effect="dark" placement="bottom">
@ -24,7 +24,7 @@
<size-select id="size-select" class="right-menu-item hover-effect"/> <size-select id="size-select" class="right-menu-item hover-effect"/>
</el-tooltip> </el-tooltip>
</template> </template> -->
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper"> <div class="avatar-wrapper">

View File

@ -37,6 +37,8 @@ import DictTag from '@/components/DictTag'
import VueMeta from 'vue-meta' import VueMeta from 'vue-meta'
// 字典数据组件 // 字典数据组件
import DictData from '@/components/DictData' import DictData from '@/components/DictData'
import echarts from "echarts";
Vue.prototype.$echarts = echarts;
// 全局方法挂载 // 全局方法挂载
Vue.prototype.getDicts = getDicts Vue.prototype.getDicts = getDicts

69
src/utils/age.js Normal file
View File

@ -0,0 +1,69 @@
function getAge(str){
var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})/);
if(r==null)return false;
var d= new Date(r[1],r[3]-1,r[4]);
var returnStr = "输入的日期格式错误!";
if(d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]){
var date = new Date();
var yearNow = date.getFullYear();
var monthNow = date.getMonth() + 1;
var dayNow = date.getDate();
var largeMonths = [1,3,5,7,8,10,12], //大月, 用于计算天,只在年月都为零时,天数有效
lastMonth = monthNow -1>0?monthNow-1:12, // 上一个月的月份
isLeapYear = false, // 是否是闰年
daysOFMonth = 0; // 当前日期的上一个月多少天
if((yearNow%4===0&&yearNow%100!==0)||yearNow%400===0){ // 是否闰年, 用于计算天,只在年月都为零时,天数有效
isLeapYear = true;
}
if(largeMonths.indexOf(lastMonth)>-1){
daysOFMonth = 31;
}else if(lastMonth===2){
if(isLeapYear){
daysOFMonth = 29;
}else{
daysOFMonth = 28;
}
}else{
daysOFMonth = 30;
}
var Y = yearNow - parseInt(r[1]);
var M = monthNow - parseInt(r[3]);
var D = dayNow - parseInt(r[4]);
if(D < 0){
D = D + daysOFMonth; //借一个月
M--;
}
if(M<0){ // 借一年 12个月
Y--;
M = M + 12; //
}
if(Y<0){
returnStr = "出生日期有误!";
}else if(Y===0){
if(M===0){
returnStr = D+"D";
}else{
returnStr = M+"M";
}
}else{
if(M===0){
returnStr = Y
}else{
returnStr = Y
}
}
}
return returnStr;
}
export{getAge}

View File

@ -0,0 +1,133 @@
<template>
<div class="header">
<div class="leftheader">
<div class="item" v-for="(item, index) in categorylist" :key="item.id" @click="clickcategory(item, index)"
:class="index == categoryindex ? 'selectitem' : ''">
<div class="name">
{{ item.title }}
</div>
</div>
</div>
<div class="rightheader">
<div class="richtext">
饮食种类宣教知多少
00:00:00
00:02:26
1 普通饮食
①适用范围:病情较轻或疾病恢复期无消化道疾患不必限制饮食的病人
②饮食要求:一般易消化无刺激性食物均可大多数疾病恢复期的病人需要补充蛋白质热量和多种维生素故可多合动物理白加H内难内マ向饮食种类宣教知多少
00:00:00
00:02:26
1 普通饮食
①适用范围:病情较轻或疾病恢复期无消化道疾患不必限制饮食的病人
②饮食要求:一般易消化无刺激性食物均可大多数疾病恢复期的病人需要补充蛋白质热量和多种维生素故可多合动物理白加H内难内マ向饮食种类宣教知多少
00:00:00
00:02:26
1 普通饮食
①适用范围:病情较轻或疾病恢复期无消化道疾患不必限制饮食的病人
②饮食要求:一般易消化无刺激性食物均可大多数疾病恢复期的病人需要补充蛋白质热量和多种维生素故可多合动物理白加H内难内マ向饮食种类宣教知多少
00:00:00
00:02:26
1 普通饮食
①适用范围:病情较轻或疾病恢复期无消化道疾患不必限制饮食的病人
②饮食要求:一般易消化无刺激性食物均可大多数疾病恢复期的病人需要补充蛋白质热量和多种维生素故可多合动物理白加H内难内マ向饮食种类宣教知多少
00:00:00
00:02:26
1 普通饮食
①适用范围:病情较轻或疾病恢复期无消化道疾患不必限制饮食的病人
②饮食要求:一般易消化无刺激性食物均可大多数疾病恢复期的病人需要补充蛋白质热量和多种维生素故可多合动物理白加H内难内マ向
</div>
</div>
</div>
</template>
<script>
export default {
name: "visitRecords",
data() {
return {
pickerOptions: {
disabledDate(time) {
return time.getTime() > Date.now(); //
},
},
//
datePickerStart: "",
datePickerEnd: "",
//
recordindex: 0,
//
categoryindex: 0,
//item
categoryItem: {},
//list
categorylist: [{
id: 1,
title: '冠状动脉粥样硬化性心脏病',
}, {
id: 2,
title: '冠状动脉粥样硬化性心脏病冠状动脉粥样硬化性心脏病',
}]
};
},
created() {
this.categoryItem = this.categorylist[0]
},
methods: {
clickcategory(item, index) {
this.categoryindex = index
this.categoryItem = item
}
}
};
</script>
<style lang="scss" scoped>
.header {
background-color: #fff !important;
padding: 0 !important;
display: flex;
.rightheader {
width: 75%;
padding-top: 20px;
border-left: 3px solid #DFE4ED;
.richtext {
overflow: scroll;
//
overflow-x: hidden !important;
width: 400px;
margin: 0 auto;
height: 450px;
border: 1px solid #CCCCCC;
}
}
.leftheader {
width: 20%;
margin-top: 20px;
height: 450px;
overflow: scroll;
//
overflow-x: hidden !important;
.selectitem {
background-color: #D2E9FC;
border-left: 2px solid #1890ff !important;
border-bottom: 1px solid #fff !important;
}
.item {
padding: 25px 10px;
position: relative;
border-left: 2px solid #fff;
border-bottom: 1px solid #E7E7E7;
.name {
font-size: 18px;
font-weight: 600;
}
}
}
}
</style>

View File

@ -0,0 +1,133 @@
<template>
<div class="header">
<div class="leftheader">
<div class="item" v-for="(item, index) in categorylist" :key="item.id" @click="clickcategory(item, index)"
:class="index == categoryindex ? 'selectitem' : ''">
<div class="name">
{{ item.title }}
</div>
</div>
</div>
<div class="rightheader">
<div id="main" class="main"></div>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts';
export default {
name: "visitRecords",
data() {
return {
pickerOptions: {
disabledDate(time) {
return time.getTime() > Date.now(); //
},
},
//
datePickerStart: "",
datePickerEnd: "",
//
recordindex: 0,
//
categoryindex: 0,
//item
categoryItem: {},
//list
categorylist: [{
id: 1,
title: '冠状动脉粥样硬化性心脏病',
}, {
id: 2,
title: '冠状动脉粥样硬化性心脏病冠状动脉粥样硬化性心脏病',
}]
};
},
created() {
this.categoryItem = this.categorylist[0]
},
mounted() {
this.info();
},
methods: {
clickcategory(item, index) {
this.categoryindex = index
this.categoryItem = item
},
info() {
// domecharts
var myChart = echarts.init(document.getElementById('main'));
//
myChart.setOption({
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
});
},
}
};
</script>
<style lang="scss" scoped>
.header {
background-color: #fff !important;
padding: 0 !important;
display: flex;
.rightheader {
width: 75%;
padding-top: 20px;
border-left: 3px solid #DFE4ED;
.richtext {
overflow: scroll;
//
overflow-x: hidden !important;
width: 400px;
margin: 0 auto;
height: 450px;
border: 1px solid #CCCCCC;
}
}
.leftheader {
width: 20%;
margin-top: 20px;
height: 450px;
overflow: scroll;
//
overflow-x: hidden !important;
.selectitem {
background-color: #D2E9FC;
border-left: 2px solid #1890ff !important;
border-bottom: 1px solid #fff !important;
}
.item {
padding: 25px 10px;
position: relative;
border-left: 2px solid #fff;
border-bottom: 1px solid #E7E7E7;
.name {
font-size: 18px;
font-weight: 600;
}
}
}
}
</style>

View File

@ -0,0 +1,351 @@
<template>
<div class="header">
<div class="leftheader">
<div class="time">
<el-date-picker v-model="query.visitDateStart" type="date" placeholder="开始日期"
style="width: 40%;padding-right:5px" :picker-options="pickerOptions"></el-date-picker>
-
<el-date-picker v-model="query.visitDateEnd" type="date" placeholder="结束日期"
style="width: 40%;padding-left:5px" :picker-options="pickerOptions"></el-date-picker>
</div>
<div class="list">
<div class="item" v-for="(item, index) in categorylist" :key="item.id" @click="clickcategory(item, index)"
:class="item.visitType == 'BE_HOSPITALIZED' && index == categoryindex ? 'zyitem' : item.visitType == 'OUTPATIENT_SERVICE' && index == categoryindex ? 'mzitem' : ''">
<div class="time">{{ item.visitDate }}
</div>
<div class="name">
{{ item.visitName }}
</div>
<div class="text">
<span>
{{ item.visitDept }}
</span>
<span style="margin-left: 10px;">
{{ item.createBy }}
赵明
</span>
</div>
<el-tag v-if="item.visitType == 'BE_HOSPITALIZED'" class="type" size="mini">住院</el-tag>
<el-tag v-if="item.visitType == 'OUTPATIENT_SERVICE'" class="type" size="mini"
type="success">门诊</el-tag>
</div>
</div>
</div>
<div class="rightheader">
<div class="toptitle" v-if="categoryItem">
<div style="border-radius: 10px 0 0 10px"
:class="categoryItem.visitType == 'BE_HOSPITALIZED' && recordindex == 0 ? 'zyclass' : categoryItem.visitType == 'OUTPATIENT_SERVICE' && recordindex == 0 ? 'mzclass' : ''"
@click="clickrecord(0)">
入院记录
</div>
<div class="centerdiv"
:class="categoryItem.visitType == 'BE_HOSPITALIZED' && recordindex == 1 ? 'zyclass' : categoryItem.visitType == 'OUTPATIENT_SERVICE' && recordindex == 1 ? 'mzclass' : ''"
@click="clickrecord(1)">出院记录
</div>
<div style="border-radius: 0 10px 10px 0"
:class="categoryItem.visitType == 'BE_HOSPITALIZED' && recordindex == 2 ? 'zyclass' : categoryItem.visitType == 'OUTPATIENT_SERVICE' && recordindex == 2 ? 'mzclass' : ''"
@click="clickrecord(2)">
手术记录</div>
</div>
<div class="righttext" v-if="categoryItem">
<div v-if="recordindex == 0 && recordlist">
<p>婚姻史{{ recordlist.maritalHistory }}</p>
<p>个人史{{ recordlist.personalHistory }}</p>
<p>月经生育史{{ recordlist.menstrualFertilityHistory }}</p>
<p>现病史{{ recordlist.presentIllnessHistory }}</p>
<p>家族史{{ recordlist.familyHistory }}</p>
<p>既往史{{ recordlist.pastHistory }}</p>
</div>
<div v-if="recordindex == 1 && recordlist">
<p>入院诊断{{ recordlist.admissionDiagnosis }}</p>
<p>入院情况{{ recordlist.admissionSituation }}</p>
<p>诊疗经过{{ recordlist.diagnosisTreatmentProcess }}</p>
<p>出院诊断{{ recordlist.dischargeDiagnosis }}</p>
<p>出院情况{{ recordlist.dischargeStatus }}</p>
<p>出院医嘱{{ recordlist.dischargeOrder }}</p>
</div>
<div v-if="recordindex == 2 && recordlist">
<p>手术名称{{ recordlist.operationName }}</p>
<p>手术日期{{ recordlist.operationDate }}</p>
<p>手术麻醉方式{{
recordlist.operationAnesthesiaWay == 'GENERAL_ANESTHESIA' ? '全身麻醉' :
recordlist.operationAnesthesiaWay == 'LOCAL_ANESTHESIA' ? '局部麻醉' : '' }}
</p>
<p>手术入路{{ recordlist.operationApproach }}</p>
<p>手术方式{{ recordlist.operationWay }}</p>
</div>
</div>
</div>
</div>
</template>
<script>
import {
getList,
InRecord,
OutRecord,
OperationRecord
} from '@/api/manage/visitRecords'
export default {
name: "visitRecords",
data() {
return {
pickerOptions: {
disabledDate(time) {
return time.getTime() > Date.now(); //
},
},
//
recordindex: undefined,
//
categoryindex: undefined,
//item
categoryItem: undefined,
//list
categorylist: [],
//list
recordlist: undefined,
//query
query: {
patientId: undefined,
//
visitDateStart: "",
visitDateEnd: "",
},
};
},
watch: {
'query.visitDateStart': {
handler(newValue, oldValue) {
var pastDate = new Date(newValue)
var pastYear = pastDate.getFullYear()
var pastMonth = pastDate.getMonth() + 1
var pastDay = pastDate.getDate()
if (pastMonth >= 1 && pastMonth <= 9) {
pastMonth = '0' + pastMonth
}
if (pastDay >= 0 && pastDay <= 9) {
pastDay = '0' + pastDay
}
this.query.visitDateStart = pastYear + '-' + pastMonth + '-' + pastDay
this.getListinfo();
},
deep: true,
},
'query.visitDateEnd': {
handler(newValue, oldValue) {
var pastDate = new Date(newValue)
var pastYear = pastDate.getFullYear()
var pastMonth = pastDate.getMonth() + 1
var pastDay = pastDate.getDate()
if (pastMonth >= 1 && pastMonth <= 9) {
pastMonth = '0' + pastMonth
}
if (pastDay >= 0 && pastDay <= 9) {
pastDay = '0' + pastDay
}
this.query.visitDateEnd = pastYear + '-' + pastMonth + '-' + pastDay
this.getListinfo();
},
deep: true,
},
},
created() {
this.info();
},
methods: {
//
clickrecord(index) {
this.recordindex = index
if (index == 0) {
this.InRecordinfo();
} else if (index == 1) {
this.OutRecordinfo();
} else if (index == 2) {
this.OperationRecordinfo();
}
},
//item
clickcategory(item, index) {
this.categoryindex = index
this.categoryItem = item
this.recordindex = 0
this.InRecordinfo();
},
//list
getListinfo() {
getList(this.query).then(res => {
if (res.data.length > 0) {
this.categorylist = res.data
this.clickcategory(res.data[0], 0)
}
})
},
//
OperationRecordinfo() {
OperationRecord(this.categoryItem.id).then(res => {
this.recordlist = res.data
})
},
//
OutRecordinfo() {
OutRecord(this.categoryItem.id).then(res => {
this.recordlist = res.data
})
},
//
InRecordinfo() {
InRecord(this.categoryItem.id).then(res => {
this.recordlist = res.data
})
},
//info
info() {
var date = new Date();
var seperator1 = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var pastDate = new Date()
var pastYear = pastDate.getFullYear()
var pastMonth = pastDate.getMonth() + 1 - 6
if (pastMonth < 0) {
pastYear = pastYear - 1
pastMonth = 12 + pastMonth
}
var pastDay = pastDate.getDate()
if (pastMonth >= 1 && pastMonth <= 9) {
pastMonth = '0' + pastMonth
}
if (pastDay >= 0 && pastDay <= 9) {
pastDay = '0' + pastDay
}
this.query.visitDateStart = pastYear + '-' + pastMonth + '-' + pastDay
this.query.visitDateEnd = year + seperator1 + month + seperator1 + strDate;
this.query.patientId = this.$route.query.patientId
this.getListinfo();
},
}
};
</script>
<style lang="scss" scoped>
.header {
background-color: #fff !important;
padding: 0 !important;
display: flex;
.rightheader {
width: 75%;
padding-top: 20px;
border-left: 3px solid #DFE4ED;
.righttext {
width: 100%;
padding-left: 20px;
height: 450px;
overflow: scroll;
//
overflow-x: hidden !important;
}
.toptitle {
display: flex;
margin-left: 20px;
.zyclass {
color: #1890ff !important;
border: 2px solid #1890ff !important;
}
.mzclass {
color: #009982 !important;
border: 2px solid #009982 !important;
}
div {
width: 80px;
font-size: 14px;
line-height: 36px;
text-align: center;
height: 36px;
border: 1.5px solid #CCCCCC;
}
.centerdiv {
border-left: none;
border-right: none
}
}
}
.leftheader {
margin-top: 20px;
width: 25%;
.list {
margin-top: 20px;
height: 450px;
overflow: scroll;
//
overflow-x: hidden !important;
width: 96%;
.zyitem {
background-color: #D2E9FC;
border-left: 2px solid #1890ff !important;
border-bottom: 1px solid #fff !important;
}
.mzitem {
background-color: #EBF7F5;
border-left: 2px solid #009982 !important;
border-bottom: 1px solid #fff !important;
}
.item {
height: 120px;
padding: 25px 10px;
position: relative;
border-left: 2px solid #fff;
border-bottom: 1px solid #E7E7E7;
.type {
position: absolute;
right: 10px;
top: 20px;
font-size: 12px;
}
.text {
height: 20px;
line-height: 20px;
font-size: 12px;
color: #999999;
}
.name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
height: 30px;
line-height: 30px;
font-size: 18px;
font-weight: 600;
}
.time {
line-height: 20px;
height: 20px;
font-size: 14px;
}
}
}
}
}
</style>

View File

@ -0,0 +1,191 @@
<template>
<div class="header">
<div class="topheader">
<div class="user">
<img class="headsculpture" src="../../../assets/manage/touxiang.png" alt="" v-if="$route.query.sex == 'MALE'">
<img class="headsculpture" src="../../../assets/manage/nvtouxiang.png" alt="" v-if="$route.query.sex == 'FEMALE'">
<div class="name">
{{ $route.query.patientName }}
</div>
<div class="gender">
{{ $route.query.sex == 'MALE' ? '男' : $route.query.sex == 'FEMALE' ? '女' : '' }}
</div>
<div class="age">
{{ $route.query.age }}
</div>
<div class="source">
<div class="item" v-if="$route.query.patientSource == 'WE_CHAT_OFFICIAL_ACCOUNT'">
<img src="../../../assets/manage/gzh.png" alt="">
<div>
公众号
</div>
</div>
<div class="item" v-if="$route.query.patientSource == 'WE_CHAT_APPLET'">
<img src="../../../assets/manage/xcx.png" alt="">
<div>
小程序
</div>
</div>
<div class="item" v-if="$route.query.patientSource == 'MANAGE_END'">
<img src="../../../assets/manage/gld.png" alt="">
<div>
管理端
</div>
</div>
</div>
</div>
<div class="information">
<div class="top">
<div>身份证号{{ $route.query.cardNo }}</div>
<div>患者电话{{ $route.query.patientPhone }}</div>
<div style="width: 50%;">出生日期{{ $route.query.birthDate }}</div>
</div>
<div class="bottom">
<div>注册时间{{ $route.query.createTime }}</div>
<div>家属电话{{ $route.query.familyMemberPhone }}</div>
<div style="width: 50%;">住址{{ $route.query.address }}</div>
</div>
</div>
</div>
<div class="bottomheader">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="就诊记录" name="first">
<visitRecords></visitRecords>
</el-tab-pane>
<el-tab-pane label="康复计划及记录" name="second">康复计划及记录</el-tab-pane>
<el-tab-pane label="健康宣教" name="third">
<healthEducation></healthEducation>
</el-tab-pane>
<el-tab-pane label="指标监测" name="fourth">
<indicatorMonitoring></indicatorMonitoring>
</el-tab-pane>
<el-tab-pane label="签约记录" name="five">签约记录</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script>
import visitRecords from '../components/visitRecords.vue';
import healthEducation from '../components/healthEducation.vue';
import indicatorMonitoring from '../components/indicatorMonitoring.vue';
export default {
components: {
//
visitRecords,
//
healthEducation,
//
indicatorMonitoring,
},
name: "patientdetails",
data() {
return {
activeName: 'first'
};
},
created() {
},
methods: {
handleClick(tab, event) {
console.log(tab, event);
},
}
};
</script>
<style lang="scss" scoped>
.header {
background-color: #F1F3F5;
padding-top: 10px;
::v-deep .el-tabs__header {
margin: 0 !important;
}
.bottomheader {
width: 99%;
background-color: #fff;
margin: 10px auto;
padding: 10px 20px;
}
.topheader {
width: 99%;
background-color: #fff;
margin: 0 auto;
.information {
display: flex;
flex-wrap: wrap;
padding: 10px 20px;
height: 110px;
.top,
.bottom {
color: #666666;
width: 100%;
display: flex;
div {
width: 25%;
}
}
}
.user {
width: 100%;
padding: 0 20px;
display: flex;
height: 80px;
align-items: center;
line-height: 80px;
.source {
display: flex;
.item {
color: #787878;
line-height: 30px;
font-size: 14px;
margin-left: 20px;
border: 1px solid #C7C7C7;
width: 100px;
border-radius: 5px;
justify-content: center;
height: 30px;
display: flex;
align-items: center;
background-color: #F5F5F5;
img {
margin-right: 10px;
width: 20px;
height: 20px;
}
}
}
.name {
font-size: 20px;
padding-left: 12px;
}
.gender {
padding-left: 10px;
}
.age {
padding-left: 10px;
}
.headsculpture {
border-radius: 50%;
width: 40px;
height: 40px;
}
}
}
}
</style>

View File

@ -0,0 +1,499 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="患者姓名" prop="patientName">
<el-input v-model="queryParams.patientName" placeholder="请输入患者姓名" clearable @keyup.enter.native="handleQuery"
style="width:200px" />
</el-form-item>
<el-form-item label="患者电话" prop="patientPhone">
<el-input v-model="queryParams.patientPhone" placeholder="请输入患者电话" clearable @keyup.enter.native="handleQuery"
style="width:200px" />
</el-form-item>
<el-form-item label="出生日期" prop="birthDate">
<el-date-picker clearable v-model="queryParams.birthDate" type="date" value-format="yyyy-MM-dd"
style="width:200px" placeholder="请选择出生日期">
</el-date-picker>
</el-form-item>
<!-- 微信小程序WE_CHAT_APPLET微信公众号WE_CHAT_OFFICIAL_ACCOUNT管理端MANAGE_END -->
<el-form-item label="患者来源" prop="patientSource">
<el-select v-model="queryParams.patientSource" placeholder="请选择就诊方式" clearable style="width:200px">
<el-option v-for="dict in dict.type.patient_source" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<!-- 预住院患者PRE_HOSPITALIZED_PATIENT在院患者IN_HOSPITAL_PATIENT门诊患者OUTPATIENT出院患者DISCHARGED_PATIENT签约患者CONTRACTED_PATIENT -->
<el-form-item label="患者类型" prop="patientType">
<el-select v-model="queryParams.patientType" placeholder="请选择患者类型" clearable style="width:200px">
<el-option v-for="dict in dict.type.patient_type" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<!-- 门诊OUTPATIENT_SERVICE住院BE_IN_HOSPITAL -->
<el-form-item label="就诊方式" prop="visitMethod">
<el-select v-model="queryParams.visitMethod" placeholder="请选择就诊方式" clearable style="width:200px">
<el-option v-for="dict in dict.type.visit_method" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<!-- <el-form-item label="主要诊断" prop="mainDiagnosis">
<el-input v-model="queryParams.mainDiagnosis" placeholder="请输入主要诊断" clearable @keyup.enter.native="handleQuery" />
</el-form-item> -->
<el-form-item label="主治医生" prop="attendingPhysician">
<el-input v-model="queryParams.attendingPhysician" placeholder="请输入主治医生" clearable style="width:200px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="手术名称" prop="surgicalName">
<el-input v-model="queryParams.surgicalName" placeholder="请输入手术名称" clearable @keyup.enter.native="handleQuery"
style="width:200px" />
</el-form-item>
<el-form-item label="门诊号" prop="outpatientNumber">
<el-input v-model="queryParams.outpatientNumber" placeholder="请输入门诊号" clearable style="width:200px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="入院时间">
<el-date-picker v-model="queryParams.admissionDate" value-format="yyyy-MM-dd" style="width:250px" type="daterange"
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item>
<el-form-item label="就诊时间" prop="visitTime">
<el-date-picker clearable v-model="queryParams.visitTime" type="date" value-format="yyyy-MM-dd"
style="width:200px" placeholder="请选择就诊时间">
</el-date-picker>
</el-form-item>
<el-form-item label="出院方式" prop="dischargeMethod">
<el-input v-model="queryParams.dischargeMethod" placeholder="请输入出院方式" clearable style="width:200px"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- <el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['manage:patientInfo:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
v-hasPermi="['manage:patientInfo:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
v-hasPermi="['manage:patientInfo:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
v-hasPermi="['manage:patientInfo:export']">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>-->
<el-table v-loading="loading" :data="patientInfoList" @selection-change="handleSelectionChange">
<el-table-column label="患者姓名" align="center" prop="patientName" />
<el-table-column label="患者电话" align="center" prop="patientPhone" />
<el-table-column label="性别" align="center" prop="sex">
<template slot-scope="scope">
{{ scope.row.sex == 'MALE' ? '男' : '' }}
{{ scope.row.sex == 'FEMALE' ? '女' : '' }}
</template>
</el-table-column>
<el-table-column label="住址" align="center" prop="address" />
<el-table-column label="签约状态" align="center" prop="signStatus">
<template slot-scope="scope">
<dict-tag :options="dict.type.sign_status" :value="scope.row.signStatus" />
</template>
</el-table-column>
<el-table-column label="签约时间" align="center" prop="signTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.signTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="开证医生" align="center" prop="certificateIssuingDoctor" />
<el-table-column label="就诊方式" align="center" prop="visitMethod">
<template slot-scope="scope">
<dict-tag :options="dict.type.visit_method" :value="scope.row.visitMethod" />
</template>
</el-table-column>
<el-table-column label="主治医生" align="center" prop="attendingPhysician" />
<el-table-column label="所属医院名称" align="center" prop="hospitalAgencyName" />
<el-table-column label="所属院区名称" align="center" prop="campusAgencyName" />
<el-table-column label="所属科室名称" align="center" prop="departmentName" />
<el-table-column label="所属病区名称" align="center" prop="wardName" />
<el-table-column label="住院号" align="center" prop="admissionNumber" />
<el-table-column label="门诊号" align="center" prop="outpatientNumber" />
<el-table-column label="就诊时间" align="center" prop="visitTime">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.visitTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="出院方式" align="center" prop="dischargeMethod" />
<el-table-column label="患者来源" align="center" prop="patientSource">
<template slot-scope="scope">
<dict-tag :options="dict.type.patient_source" :value="scope.row.patientSource" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope">
<!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
v-hasPermi="['manage:patientInfo:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['manage:patientInfo:remove']">删除</el-button> -->
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleAuthRole(scope.row)">详情</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<!-- 添加或修改患者信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="1000px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px" :inline="true">
<el-form-item label="患者姓名" prop="patientName">
<el-input v-model="form.patientName" placeholder="请输入患者姓名" style="width:200px" />
</el-form-item>
<el-form-item label="患者电话" prop="patientPhone">
<el-input v-model="form.patientPhone" placeholder="请输入患者电话" style="width:200px" />
</el-form-item>
<el-form-item label="家属电话" prop="familyMemberPhone">
<el-input v-model="form.familyMemberPhone" placeholder="请输入家属电话" style="width:200px" />
</el-form-item>
<el-form-item label="出生日期" prop="birthDate">
<el-date-picker clearable v-model="form.birthDate" style="width:200px" type="date" value-format="yyyy-MM-dd"
placeholder="请选择出生日期">
</el-date-picker>
</el-form-item>
<el-form-item label="身份证号" prop="cardNo">
<el-input v-model="form.cardNo" placeholder="请输入身份证号" style="width:200px" />
</el-form-item>
<el-form-item label="住址" prop="address">
<el-input v-model="form.address" placeholder="请输入住址" style="width:200px" />
</el-form-item>
<el-form-item label="患者类型" prop="patientType">
<el-select v-model="form.patientType" placeholder="请选择患者类型" style="width:200px">
<el-option v-for="dict in dict.type.patient_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="签约状态" prop="signStatus">
<el-select v-model="form.signStatus" placeholder="请选择签约状态" style="width:200px">
<el-option v-for="dict in dict.type.sign_status" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="签约时间" prop="signTime">
<el-date-picker clearable v-model="form.signTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择签约时间"
style="width:200px">
</el-date-picker>
</el-form-item>
<el-form-item label="开证医生" prop="certificateIssuingDoctor">
<el-input v-model="form.certificateIssuingDoctor" placeholder="请输入开证医生" style="width:200px" />
</el-form-item>
<el-form-item label="就诊方式" prop="visitMethod">
<el-select v-model="form.visitMethod" placeholder="请选择就诊方式" style="width:200px">
<el-option v-for="dict in dict.type.visit_method" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="主要诊断" prop="mainDiagnosis">
<el-input v-model="form.mainDiagnosis" placeholder="请输入主要诊断" style="width:200px" />
</el-form-item>
<el-form-item label="主治医生" prop="attendingPhysician">
<el-input v-model="form.attendingPhysician" placeholder="请输入主治医生" style="width:200px" />
</el-form-item>
<el-form-item label="所属医院名称" prop="hospitalAgencyName">
<el-input v-model="form.hospitalAgencyName" placeholder="请输入所属医院名称" style="width:200px" />
</el-form-item>
<el-form-item label="所属院区名称" prop="campusAgencyName">
<el-input v-model="form.campusAgencyName" placeholder="请输入所属院区名称" style="width:200px" />
</el-form-item>
<el-form-item label="所属科室名称" prop="departmentName">
<el-input v-model="form.departmentName" placeholder="请输入所属科室名称" style="width:200px" />
</el-form-item>
<el-form-item label="所属病区名称" prop="wardName">
<el-input v-model="form.wardName" placeholder="请输入所属病区名称" style="width:200px" />
</el-form-item>
<el-form-item label="住院号" prop="admissionNumber">
<el-input v-model="form.admissionNumber" placeholder="请输入住院号" style="width:200px" />
</el-form-item>
<el-form-item label="责任护士" prop="responsibleNurse">
<el-input v-model="form.responsibleNurse" placeholder="请输入责任护士" style="width:200px" />
</el-form-item>
<el-form-item label="就诊流水号" prop="visitSerialNumber">
<el-input v-model="form.visitSerialNumber" placeholder="请输入就诊流水号" style="width:200px" />
</el-form-item>
<el-form-item label="手术名称" prop="surgicalName">
<el-input v-model="form.surgicalName" placeholder="请输入手术名称" style="width:200px" />
</el-form-item>
<el-form-item label="入院时间" prop="admissionDate">
<el-date-picker clearable v-model="form.admissionDate" type="date" value-format="yyyy-MM-dd" style="width:200px"
placeholder="请选择入院时间">
</el-date-picker>
</el-form-item>
<el-form-item label="出院时间" prop="dischargeDate">
<el-date-picker clearable v-model="form.dischargeDate" type="date" value-format="yyyy-MM-dd" style="width:200px"
placeholder="请选择出院时间">
</el-date-picker>
</el-form-item>
<el-form-item label="病历内容">
<editor v-model="form.medicalRecordContent" :min-height="192" />
</el-form-item>
<el-form-item label="预约资料组" prop="appointmentTreatmentGroup">
<el-input v-model="form.appointmentTreatmentGroup" placeholder="请输入预约资料组" style="width:200px" />
</el-form-item>
<el-form-item label="登记号" prop="registrationNo">
<el-input v-model="form.registrationNo" placeholder="请输入登记号" style="width:200px" />
</el-form-item>
<el-form-item label="登记日期" prop="registrationDate">
<el-date-picker clearable v-model="form.registrationDate" type="date" value-format="yyyy-MM-dd"
style="width:200px" placeholder="请选择登记日期">
</el-date-picker>
</el-form-item>
<el-form-item label="预约时间" prop="appointmentDate">
<el-date-picker clearable v-model="form.appointmentDate" type="date" value-format="yyyy-MM-dd"
style="width:200px" placeholder="请选择预约时间">
</el-date-picker>
</el-form-item>
<el-form-item label="门诊号" prop="outpatientNumber">
<el-input v-model="form.outpatientNumber" placeholder="请输入门诊号" style="width:200px" />
</el-form-item>
<el-form-item label="就诊时间" prop="visitTime">
<el-date-picker clearable v-model="form.visitTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择就诊时间"
style="width:200px">
</el-date-picker>
</el-form-item>
<el-form-item label="出院方式" prop="dischargeMethod">
<el-input v-model="form.dischargeMethod" placeholder="请输入出院方式" style="width:200px" />
</el-form-item>
<el-form-item label="微信openid" prop="openId">
<el-input v-model="form.openId" placeholder="请输入微信openid" style="width:200px" />
</el-form-item>
<el-form-item label="患者来源" prop="patientSource">
<el-select v-model="form.patientSource" placeholder="请选择就诊方式" clearable style="width:200px">
<el-option v-for="dict in dict.type.patient_source" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listPatientInfo, getPatientInfo, delPatientInfo, addPatientInfo, updatePatientInfo } from "@/api/manage/patientInfo";
import { getAge } from "@/utils/age";
export default {
name: "PatientInfo",
dicts: ['patient_type', 'visit_method', 'sign_status', 'patient_source'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
patientInfoList: [],
//
title: "",
//
open: false,
// 01
daterange: 1,
admissionDate: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
patientName: null,
patientPhone: null,
birthDate: null,
patientType: null,
visitMethod: null,
mainDiagnosis: null,
attendingPhysician: null,
hospitalAgencyId: null,
campusAgencyId: null,
departmentId: null,
wardId: null,
surgicalName: null,
admissionDate: null,
outpatientNumber: null,
visitTime: null,
dischargeMethod: null,
patientSource: null,
},
//
form: {},
//
rules: {
}
};
},
created() {
this.getList();
},
methods: {
/** 详情操作 */
handleAuthRole(row) {
this.$router.push({
path: "/patient/patientdetails",
query: {
patientId: row.id,
cardNo: row.cardNo,
patientName: row.patientName,
patientPhone: row.patientPhone,
sex: row.sex,
birthDate: row.birthDate,
familyMemberPhone: row.familyMemberPhone,
address: row.address,
patientSource: row.patientSource,
createTime: row.createTime,
age: getAge(row.birthDate)
},
});
},
/** 查询患者信息列表 */
getList() {
this.loading = true;
this.queryParams.params = {};
if (null != this.admissionDate && '' != this.admissionDate) {
this.queryParams.params["beginadmissionDate"] = this.daterange.admissionDate[0];
this.queryParams.params["endadmissionDate"] = this.daterange.admissionDate[1];
}
listPatientInfo(this.queryParams).then(response => {
this.patientInfoList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
patientName: null,
patientPhone: null,
familyMemberPhone: null,
birthDate: null,
cardNo: null,
sex: null,
address: null,
patientType: null,
signStatus: null,
signTime: null,
certificateIssuingDoctor: null,
visitMethod: null,
mainDiagnosis: null,
attendingPhysician: null,
hospitalAgencyId: null,
hospitalAgencyName: null,
campusAgencyId: null,
campusAgencyName: null,
departmentId: null,
departmentName: null,
wardId: null,
wardName: null,
admissionNumber: null,
responsibleNurse: null,
visitSerialNumber: null,
surgicalName: null,
admissionDate: null,
dischargeDate: null,
medicalRecordContent: null,
appointmentTreatmentGroup: null,
registrationNo: null,
registrationDate: null,
appointmentDate: null,
outpatientNumber: null,
visitTime: null,
dischargeMethod: null,
openId: null,
unionId: null,
patientSource: null,
delFlag: null,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams.admissionDate = [];
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加患者信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getPatientInfo(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改患者信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updatePatientInfo(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addPatientInfo(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除患者信息编号为"' + ids + '"的数据项?').then(function () {
return delPatientInfo(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => { });
},
/** 导出按钮操作 */
handleExport() {
this.download('manage/patientInfo/export', {
...this.queryParams
}, `patientInfo_${new Date().getTime()}.xlsx`)
}
}
};
</script>