Merge branch 'main' of ssh://git.jizhiweb.cn:2222/clinic-v2/web

This commit is contained in:
ChenQiuYu 2025-05-07 14:15:27 +08:00
commit a601da3426
6 changed files with 202 additions and 184 deletions

View File

@ -1,11 +1,15 @@
<template> <template>
<el-table :data="data.goodsDetail" max-height="150" style="width: 100%"> <el-table :data="data.goodsDetail" max-height="150" style="width: 100%">
<el-table-column prop="name" label="名称" show-overflow-tooltip ></el-table-column> <el-table-column prop="name" label="名称" show-overflow-tooltip ></el-table-column>
<el-table-column prop="selectedPrice" label="单价" ></el-table-column> <el-table-column prop="selectedPrice" label="单价" >
<template #default="scope">
{{scope.row.selectedPrice}}
</template>
</el-table-column>
<el-table-column prop="number" label="数量" > <el-table-column prop="number" label="数量" >
<template #default="scope"> <template #default="scope">
<div v-if="data.status == 0"> <div v-if="data.status == 0">
<el-input-number v-model="scope.row.selectedNum" min="0" @change="handleNumChange"></el-input-number> <el-input-number v-model="scope.row.selectedNum" min="0" @change="handleNumChange" size="small"></el-input-number>
<el-dropdown> <el-dropdown>
<span style="line-height: 30px;margin-left: 10px">{{ scope.row.selectedUnit }}</span> <span style="line-height: 30px;margin-left: 10px">{{ scope.row.selectedUnit }}</span>
<template #dropdown> <template #dropdown>
@ -24,13 +28,19 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="小计" >
<template #default="scope">
{{ scope.row.selectedNum*scope.row.selectedPrice }}
</template>
</el-table-column>
<el-table-column label="操作" v-if="data.status == 0" > <el-table-column label="操作" v-if="data.status == 0" >
<template #default="scope"> <template #default="scope">
<el-button type="danger" link @click="delGoods(scope.row)">X</el-button> <el-button type="danger" link @click="delGoods(scope.row)">X</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<SearchInput :disabled="data.status == 1" :request-api="goodsSearchApi" :show-config="goodsShowConfig" @selectedCallBack="goodsSelect"></SearchInput> <SearchInput v-if="data.status == 0" :request-api="goodsSearchApi" :show-config="goodsShowConfig" @selectedCallBack="goodsSelect"></SearchInput>
<span>合计{{getTotalPrice()}}</span>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SearchInput from "@/components/SearchInput.vue"; import SearchInput from "@/components/SearchInput.vue";
@ -82,7 +92,16 @@ const emit = defineEmits(["totalPriceChange"])
const handleNumChange = ()=>{ const handleNumChange = ()=>{
emit('totalPriceChange') emit('totalPriceChange')
} }
const getTotalPrice =()=>{
let totalPrice = 0;
data.value.goodsDetail?.forEach((item:any)=>{
totalPrice += item.selectedNum*item.selectedPrice
})
return totalPrice;
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
:deep(.el-table__cell){
padding: 0 4px;
}
</style> </style>

View File

@ -2,45 +2,150 @@
<template> <template>
<Panel title="患者信息"> <Panel title="患者信息">
<div style="height: 100%;"> <div v-if="!seeDockerInfo?.patientInfo" style="display: flex;align-items: center;justify-content: center;height: 120px">请选择患者......</div>
<el-descriptions <div v-else style="padding: 0 24px">
border <div class="avatar">
:column="2" <img class="avatar-image"
style="padding: 0 10px;height: 100%" :src="seeDockerInfo?.patientInfo?.sex == 1 ?'/static/images/outpatient/man.png':seeDockerInfo?.patientInfo?.sex == 2 ?'/static/images/outpatient/women.png':'-'"
> alt=""/>
<el-descriptions-item label="姓名"> <div class="avatar-info-wrapper">
{{patientInfo.name}} <div class="avatar-info">
</el-descriptions-item> <span class="avatar-info-name">{{ seeDockerInfo?.patientInfo?.name }}</span>
<el-descriptions-item label="性别"> <span class="avatar-info-age">{{ seeDockerInfo?.patientInfo?.age}}</span>
{{ patientInfo.sex == 1 ? '男' : '女'}} </div>
</el-descriptions-item> <div class="avatar-info-phone-num">
<el-descriptions-item label="年龄"> <span class="avatar-info-phone">{{ seeDockerInfo?.patientInfo?.phone }}</span>
{{patientInfo.age}} <span class="avatar-info-num">就诊次数<i class="caret-num">{{
</el-descriptions-item> seeDockerInfo?.seeDoctorCount || 0
<el-descriptions-item label="民族"> }}</i></span>
{{getKey(antys,patientInfo.nation)}} </div>
</el-descriptions-item> </div>
<el-descriptions-item :span="2" label="手机号"> </div>
{{patientInfo.phone }} <div class="detail">
</el-descriptions-item> <div>挂号医生:&nbsp;<span
<el-descriptions-item :span="2" label="证件类型"> class="detail-doctor">{{ seeDockerInfo?.dockerName }}-{{ seeDockerInfo?.sectionName }}</span>
{{getKey(psnCertTypes,patientInfo.certType)}} </div>
</el-descriptions-item> <div class="detail-middle">
<el-descriptions-item :span="2" label="证件号码"> <div>费用类别:&nbsp;<span class="detail-doctor">医保</span></div>
{{ patientInfo.certNo}} <div>医保卡剩余金额:&nbsp;<span class="detail-balance">{{ seeDockerInfo?.socialBalance }}</span></div>
</el-descriptions-item> </div>
</el-descriptions> <div>上次就诊时间:&nbsp;<span class="detail-doctor">{{
formatDate(seeDockerInfo?.lastSeeDoctorTime)
}}</span></div>
</div>
</div> </div>
</Panel> </Panel>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
.avatar {
height: 60px;
display: flex;
align-items: center;
.avatar-image {
width: 60px;
margin-right: 20px;
}
.avatar-info-wrapper {
width: 100%;
height: 60px;
padding: 6px 0;
display: flex;
flex-direction: column;
justify-content: space-between;
font-weight: 500;
font-size: 14px;
color: #333333;
font-style: normal;
.avatar-info {
display: flex;
align-items: center;
.avatar-info-name {
font-weight: 500;
font-size: 18px;
color: #333333;
font-style: normal;
margin-right: 10px;
}
.avatar-info-age {
height: 20px;
line-height: 20px;
}
}
.avatar-info-phone-num {
width: 100%;
display: flex;
justify-content: space-between;
.avatar-info-num {
margin-left: 28px;
.avatar-info-phone {
height: 20px;
line-height: 20px;
}
.caret-num {
color: #4D6DE4;
font-style: normal;
}
}
}
}
}
.detail {
margin-top: 16px;
font-weight: 400;
font-size: 16px;
color: rgba(23, 26, 29, 0.7);
font-style: normal;
height: 80px;
display: flex;
flex-direction: column;
justify-content: space-between;
.detail-doctor {
font-weight: 500;
color: rgba(23, 26, 29, 1);
}
.detail-middle {
display: flex;
justify-content: space-between;
}
.detail-balance {
font-weight: 500;
color: rgba(#FF4D4F, 1);
}
}
</style> </style>
<script setup lang="ts"> <script setup lang="ts">
import {getKey} from "@/utils/discrotyUtil.ts"; import {formatDate} from "@/utils/dateUtils.ts"
import antys from "@/assets/config/directory/antys.json";
import psnCertTypes from "@/assets/config/directory/psnCertTypes.json";
import Panel from "@/components/common/Panel.vue"; import Panel from "@/components/common/Panel.vue";
const patientInfo:any = defineModel(); import {onMounted, ref} from "vue";
import {post} from "@/utils/request.ts";
const seeDockerInfo = ref<any>();
const getSeeDockerInfo = (newValue:any) => {
debugger
if (!newValue)return;
post('medical/record/getSeeDockerInfo', {regisId: newValue}).then((res: any) => {
seeDockerInfo.value = res
debugger
})
}
const init =(regisId:any)=>{
getSeeDockerInfo(regisId)
}
defineExpose({ init})
</script> </script>

View File

@ -1,12 +1,22 @@
<template> <template>
<el-table :data="data.itemDetail" max-height="150"> <el-table :data="data.itemDetail" max-height="150">
<el-table-column prop="itemName" label="名称" show-overflow-tooltip></el-table-column> <el-table-column prop="itemName" label="项目名称" show-overflow-tooltip></el-table-column>
<el-table-column prop="selectedUnit" label="单位"></el-table-column> <el-table-column label="单价">
<el-table-column prop="selectedPrice" label="单价"></el-table-column> <template #default="scope">
{{scope.row.selectedPrice}}
</template>
</el-table-column>
<el-table-column label="数量"> <el-table-column label="数量">
<template #default="scope"> <template #default="scope">
<el-input-number v-model="scope.row.selectedNum" min="0" <el-input-number v-model="scope.row.selectedNum" min="0"
@change="handleNumChange"></el-input-number> @change="handleNumChange" v-if="data.status == 0" size="small"></el-input-number>
<span v-else>{{scope.row.selectedNum}}</span>
{{scope.row.selectedUnit}}
</template>
</el-table-column>
<el-table-column label="小计">
<template #default="scope">
{{scope.row.selectedNum*scope.row.selectedPrice}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" v-if="data.status ==0"> <el-table-column label="操作" v-if="data.status ==0">
@ -15,8 +25,9 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<SearchInput :disabled="data.status == 1" :request-api="serviceSearchApi" :show-config="serviceShowConfig" <SearchInput v-if="data.status == 0" :request-api="serviceSearchApi" :show-config="serviceShowConfig"
@selectedCallBack="serviceSelect"></SearchInput> @selectedCallBack="serviceSelect"></SearchInput>
<span>合计{{getTotalPrice()}}</span>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SearchInput from "@/components/SearchInput.vue"; import SearchInput from "@/components/SearchInput.vue";
@ -52,8 +63,16 @@ const handleNumChange = () => {
emit('totalPriceChange') emit('totalPriceChange')
} }
const getTotalPrice =()=>{
let totalPrice = 0;
data.value.itemDetail?.forEach((item:any)=>{
totalPrice += item.selectedNum*item.selectedPrice
})
return totalPrice;
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
:deep(.el-table__cell){
padding: 0 4px;
}
</style> </style>

View File

@ -1,133 +0,0 @@
<template>
<Panel :title="'就诊信息'">
<div v-if="!patientRegistration?.patientInfo" style="display: flex;align-items: center;justify-content: center;height: 120px">请选择患者......</div>
<div v-else style="padding: 0 24px">
<div class="avatar">
<img class="avatar-image"
:src="patientRegistration?.patientInfo?.sex == 1 ?'/static/images/outpatient/man.png':patientRegistration?.patientInfo?.sex == 2 ?'/static/images/outpatient/women.png':'-'"
alt=""/>
<div class="avatar-info-wrapper">
<div class="avatar-info">
<span class="avatar-info-name">{{ patientRegistration?.patientInfo?.name }}</span>
<span class="avatar-info-age">{{ patientRegistration?.patientInfo?.age}}</span>
</div>
<div class="avatar-info-phone-num">
<span class="avatar-info-phone">{{ patientRegistration?.patientInfo?.phone }}</span>
<span class="avatar-info-num">就诊次数<i class="caret-num">{{
patientRegistration?.seeDoctorCount || 0
}}</i></span>
</div>
</div>
</div>
<div class="detail">
<div>挂号医生:&nbsp;<span
class="detail-doctor">{{ patientRegistration?.dockerName }}-{{ patientRegistration?.sectionName }}</span>
</div>
<div class="detail-middle">
<div>费用类别:&nbsp;<span class="detail-doctor">医保</span></div>
<div>医保卡剩余金额:&nbsp;<span class="detail-balance">{{ patientRegistration?.socialBalance }}</span></div>
</div>
<div>上次就诊时间:&nbsp;<span class="detail-doctor">{{
formatDate(patientRegistration?.lastSeeDoctorTime)
}}</span></div>
</div>
</div>
</Panel>
</template>
<script setup lang="ts">
import Panel from "@/components/common/Panel.vue";
import {formatDate} from "@/utils/dateUtils.ts"
const patientRegistration = defineModel<any>()
</script>
<style scoped lang="scss">
.avatar {
height: 60px;
display: flex;
align-items: center;
.avatar-image {
width: 60px;
margin-right: 20px;
}
.avatar-info-wrapper {
width: 100%;
height: 60px;
padding: 6px 0;
display: flex;
flex-direction: column;
justify-content: space-between;
font-weight: 500;
font-size: 14px;
color: #333333;
font-style: normal;
.avatar-info {
display: flex;
align-items: center;
.avatar-info-name {
font-weight: 500;
font-size: 18px;
color: #333333;
font-style: normal;
margin-right: 10px;
}
.avatar-info-age {
height: 20px;
line-height: 20px;
}
}
.avatar-info-phone-num {
width: 100%;
display: flex;
justify-content: space-between;
.avatar-info-num {
margin-left: 28px;
.avatar-info-phone {
height: 20px;
line-height: 20px;
}
.caret-num {
color: #4D6DE4;
font-style: normal;
}
}
}
}
}
.detail {
margin-top: 16px;
font-weight: 400;
font-size: 16px;
color: rgba(23, 26, 29, 0.7);
font-style: normal;
height: 80px;
display: flex;
flex-direction: column;
justify-content: space-between;
.detail-doctor {
font-weight: 500;
color: rgba(23, 26, 29, 1);
}
.detail-middle {
display: flex;
justify-content: space-between;
}
.detail-balance {
font-weight: 500;
color: rgba(#FF4D4F, 1);
}
}
</style>

View File

@ -50,7 +50,7 @@
</div> </div>
<div class="right"> <div class="right">
<div class="top"> <div class="top">
<PatientCard v-model="formData.patientInfo"></PatientCard> <PatientCard ref="patientCardRef"></PatientCard>
</div> </div>
<div class="bottom"> <div class="bottom">
<RecordsLog ref="recordsConsumptionRef"></RecordsLog> <RecordsLog ref="recordsConsumptionRef"></RecordsLog>
@ -121,8 +121,8 @@ const diagnosisSelect = (list: any) => {
formData.value.diagnosisMedicalRecord.diagnosisSummary = diagnosisNames formData.value.diagnosisMedicalRecord.diagnosisSummary = diagnosisNames
} }
const recordsConsumptionRef= ref<any>("") const recordsConsumptionRef= ref<any>("")
const patientCardRef = ref()
const clickItem = async (item: any, status: any) => { const clickItem = async (item: any, status: any) => {
formData.value = await post('medical/record/getByDiagnosisCode', {diagnosisCode: item.code}) formData.value = await post('medical/record/getByDiagnosisCode', {diagnosisCode: item.code})
statusDisabled.value = status statusDisabled.value = status
getOrderTotalPrice() getOrderTotalPrice()
@ -131,6 +131,7 @@ const clickItem = async (item: any, status: any) => {
let nList = formData.value.diagnosisMedicalRecord.diagnosisSummary.split(',') let nList = formData.value.diagnosisMedicalRecord.diagnosisSummary.split(',')
diagnosisSearchRef.value?.init(list, nList); diagnosisSearchRef.value?.init(list, nList);
recordsConsumptionRef.value?.init(formData.value.patientInfo.id); recordsConsumptionRef.value?.init(formData.value.patientInfo.id);
patientCardRef.value?.init(formData.value.registrationId);
}) })
} }
const dockerList = ref<any[]>([]) const dockerList = ref<any[]>([])
@ -271,7 +272,7 @@ const generateOptions = () => {
flex-direction: column; flex-direction: column;
.top { .top {
height: 312px; height: 240px;
} }
.bottom { .bottom {

View File

@ -24,10 +24,11 @@
@edit="edit"></Settlement> @edit="edit"></Settlement>
</div> </div>
</div> </div>
<div class="right"> <div class="right">
<div class="top"> <div class="top">
<MedicalInformation v-model="seeDockerInfo" ref="medicalInformationRef"></MedicalInformation> <PatientCard ref="patientCardRef"></PatientCard>
</div> </div>
<div class="bottom"> <div class="bottom">
<MedicalHistory ref="medicalHistoryRef" @copy="copyForm" @copyItem="copyItemList" @copyGoods="copyGoodsList" ></MedicalHistory> <MedicalHistory ref="medicalHistoryRef" @copy="copyForm" @copyItem="copyItemList" @copyGoods="copyGoodsList" ></MedicalHistory>
@ -37,7 +38,6 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import MedicalQueue from "@/components/outpatient/MedicalQueue.vue"; import MedicalQueue from "@/components/outpatient/MedicalQueue.vue";
import MedicalInformation from "@/components/outpatient/MedicalInformation.vue";
import MedicalHistory from "@/components/outpatient/MedicalHistory.vue"; import MedicalHistory from "@/components/outpatient/MedicalHistory.vue";
import Case from "@/components/outpatient/Case.vue"; import Case from "@/components/outpatient/Case.vue";
@ -52,6 +52,7 @@ import ServiceItemsDetail from "@/components/outpatient/ServiceItemsDetail.vue";
import PharmaceuticalConsumablesDetail from "@/components/outpatient/PharmaceuticalConsumablesDetail.vue"; import PharmaceuticalConsumablesDetail from "@/components/outpatient/PharmaceuticalConsumablesDetail.vue";
import CaseDetail from "@/components/outpatient/CaseDetail.vue"; import CaseDetail from "@/components/outpatient/CaseDetail.vue";
import {apiConfig} from "@/assets/config/apiConfig.ts"; import {apiConfig} from "@/assets/config/apiConfig.ts";
import PatientCard from "@/components/charge/PatientCard.vue";
const registerId = ref() const registerId = ref()
const patientId = ref() const patientId = ref()
@ -94,15 +95,14 @@ const save = () => {
const totalAmount = ref(0) const totalAmount = ref(0)
const medicalInformationRef = ref() const medicalInformationRef = ref()
const medicalHistoryRef = ref() const medicalHistoryRef = ref()
const patientCardRef = ref()
const patientRegistration = ref<any>({}) const patientRegistration = ref<any>({})
const getId = (item: any) => { const getId = (item: any) => {
registerId.value = item.id registerId.value = item.id
itemId.value = item.id itemId.value = item.id
patientId.value = item.patientInfoId patientId.value = item.patientInfoId
status.value = item.status status.value = item.status
nextTick(() => {
medicalHistoryRef.value?.init(patientId.value);
})
if (item.status == 1) { if (item.status == 1) {
ElMessageBox.confirm(`您将要接诊${item.name}`, "提示", { ElMessageBox.confirm(`您将要接诊${item.name}`, "提示", {
confirmButtonText: '确定', confirmButtonText: '确定',
@ -127,6 +127,11 @@ const getId = (item: any) => {
}) })
} }
nextTick(() => {
medicalHistoryRef.value?.init(patientId.value);
patientCardRef.value?.init(registerId.value)
})
} }
const status = ref<any>(1) const status = ref<any>(1)
const deleteItem = () => { const deleteItem = () => {
@ -176,6 +181,8 @@ const copyItemList=(item:any) => {
const copyGoodsList=(item:any) => { const copyGoodsList=(item:any) => {
goodsList.value = item.goodsDetail goodsList.value = item.goodsDetail
} }
const seeDockerInfo = ref<any>() const seeDockerInfo = ref<any>()
const getSeeDockerInfo = (newValue:any) => { const getSeeDockerInfo = (newValue:any) => {
if (!registerId.value)return; if (!registerId.value)return;