This commit is contained in:
ChenQiuYu 2025-05-06 14:52:50 +08:00
parent cda4634a1e
commit bffb3fcaa6
12 changed files with 158 additions and 94 deletions

View File

@ -1,5 +1,5 @@
<template>
<el-input v-model="input" :style="{'width': props.width+'px'}" clearable :disabled="disabled" ref="inputRef" @click="showPopo"></el-input>
<el-input v-model="input" :style="{'width': props.width+'px'}" clearable :disabled="disabled" ref="inputRef" @click="showPopo" @focus="focus"></el-input>
<el-popover placement="bottom-start" trigger="click" :width="props.width" :virtual-ref="inputRef" ref="popoverRef">
<div class="code-popo" v-if="props.list.length > 0">
<div class="code-item" v-for="item in props.list">
@ -50,6 +50,10 @@ const inputStr = (str: string,item:ListItem) => {
}
const inputRef = ref();
const emit=defineEmits(["focus"])
const focus = () => {
emit("focus", false)
}
</script>
<style scoped lang="scss">
.code-popo {

View File

@ -1,24 +1,25 @@
<template>
<el-input
ref="inputRef"
style="width: 100%;height: 100%"
v-model="keyword"
:prefix-icon="Plus"
:placeholder="props.placeholder"
:style="{'width': props.width+'px'}"
clearable
@input="changeInput"
class="no-border-input"
:disabled="disabled"
v-model="keyword"
:prefix-icon="Plus"
:placeholder="props.placeholder"
:style="{'width': props.width+'px'}"
clearable
@input="changeInput"
class="no-border-input"
:disabled="disabled"
@focus="focus"
>
</el-input>
<el-popover placement="bottom-start" trigger="click" :width="props.width" ref="popoverRef" :virtual-ref="inputRef" :trigger-keys="[]">
<el-popover placement="bottom-start" trigger="click" :width="props.width" ref="popoverRef" :virtual-ref="inputRef"
:trigger-keys="[]">
<div class="container">
<el-table
:data="searchList" style="width: 100%"
:data="searchList" style="width: 100%"
@row-click="clickRow"
:show-header="props.showHeader"
max-height="200px"
@ -35,12 +36,13 @@
</template>
<script setup lang="ts">import {ref, unref} from "vue";
import { post } from "@/utils/request.ts";
import { Plus } from "@element-plus/icons-vue";
import {post} from "@/utils/request.ts";
import {Plus} from "@element-plus/icons-vue";
const keyword = ref("");
const popoverRef = ref();
const inputRef = ref();
interface showConfig {
prop: string;
label: string;
@ -80,18 +82,18 @@ const changeInput = (inputStr: string) => {
if (!props.requestApi || props.requestApi === "") {
return;
}
post(props.requestApi, { keyword: keyword.value }).then((res: any) => {
post(props.requestApi, {keyword: keyword.value}).then((res: any) => {
searchList.value = res;
});
};
const emit = defineEmits(['selectedCallBack']);
const emit = defineEmits(['selectedCallBack','focus']);
const clickRow = (row: any) => {
emit('selectedCallBack', row);
popoverRef.value.hide();
keyword.value=""
keyword.value = ""
};
const beforeShow = () => {
@ -100,7 +102,9 @@ const beforeShow = () => {
}
};
const focus=()=>{
emit('focus',true)
}
</script>
<style scoped lang="scss">
@ -114,7 +118,8 @@ const beforeShow = () => {
border: none !important;
box-shadow: none !important;
}
&:hover{
&:hover {
border: 1px solid #409eff !important;
}
}

View File

@ -15,7 +15,7 @@
<div class="container">
<el-form :model="formDate" label-width="auto" ref="formRef">
<el-form-item label="主诉">
<PopoverInput :disabled="disabled" v-model="formDate.mainAppeal" :list="mainAppealList"/>
<PopoverInput :disabled="disabled" v-model="formDate.mainAppeal" :list="mainAppealList" @focus="focus"/>
</el-form-item>
<el-form-item label="诊断">
<DiagnosisSearchInput
@ -24,34 +24,36 @@
:request-api="diagnosisSearchApi"
:show-config="diagnosisShowConfig"
@selectedCallBack="diagnosisSelect"
:show-header="false">
:show-header="false"
@focus="focus"
>
</DiagnosisSearchInput>
</el-form-item>
<el-form-item label="现病史">
<el-form-item label="现病史" v-if="!props.isShowFrom">
<PopoverInput :disabled="disabled" v-model="formDate.nowMedicalHistory" :list="nowMedicalHistoryList"/>
</el-form-item>
<el-form-item label="既往史">
<el-form-item label="既往史" v-if="!props.isShowFrom">
<PopoverInput :disabled="disabled" v-model="formDate.beforeMedicalHistory" :list="beforeMedicalHistoryList"/>
</el-form-item>
<el-form-item label="过敏史">
<el-form-item label="过敏史" v-if="!props.isShowFrom">
<PopoverInput :disabled="disabled" v-model="formDate.allergyHistory" :list="allergyHistoryList"/>
</el-form-item>
<el-form-item label="体格检查">
<el-form-item label="体格检查" v-if="!props.isShowFrom">
<PhysiqueExamInuput :disabled="disabled" v-model="formDate.exam" :list="physiqueExamList"/>
</el-form-item>
<el-form-item label="望闻问切" v-if="modelType==1">
<el-form-item label="望闻问切" v-if="modelType==1&&!props.isShowFrom">
<PopoverInput :disabled="disabled" v-model="formDate.chinaAdjunctCheck" :list="chinaAdjunctCheckList"/>
</el-form-item>
<el-form-item label="治法" v-if="modelType==1">
<el-form-item label="治法" v-if="modelType==1&&!props.isShowFrom">
<el-input v-model="formDate.chinaDeal" :disabled="disabled"></el-input>
</el-form-item>
<el-form-item label="口腔检查" v-if="modelType==2">
<el-form-item label="口腔检查" v-if="modelType==2&&!props.isShowFrom">
<el-input :disabled="disabled" v-model="formDate.mouthCheck"></el-input>
</el-form-item>
<el-form-item label="辅助检查" v-if="modelType==2 || modelType ==0">
<el-form-item label="辅助检查" v-if="(modelType==2 || modelType ==0)&&!props.isShowFrom">
<el-input :disabled="disabled" v-model="formDate.adjunctCheck"></el-input>
</el-form-item>
<el-form-item label="处置" v-if="modelType==0 || modelType ==2">
<el-form-item label="处置" v-if="(modelType==0 || modelType ==2)&&!props.isShowFrom">
<el-input :disabled="disabled" v-model="formDate.deal"></el-input>
</el-form-item>
</el-form>
@ -60,7 +62,7 @@
</Panel>
</template>
<script setup lang="ts">
import {computed, nextTick, ref} from "vue";
import {computed, nextTick, ref,defineEmits} from "vue";
import {
mainAppealList,
nowMedicalHistoryList,
@ -77,6 +79,10 @@ const props = defineProps({
status: {
type: Number,
default: 0
},
isShowFrom:{
type: Boolean,
default: false
}
})
const disabled = computed(() => {
@ -114,6 +120,10 @@ const initDiagnosisSearch = (list:any,nList:any)=>{
diagnosisSearchRef.value?.init(list,nList);
})
}
const emit = defineEmits(['focus'])
const focus = (e:any)=>{
emit('focus',e)
}
defineExpose({initDiagnosisSearch})
</script>
<style scoped lang="scss">

View File

@ -1,6 +1,6 @@
<template>
<el-input v-model="keyword" style="width:100%;height: 100%" @input="changeInput" :disabled="disabled"
placeholder="诊断选择" ref="inputRef"></el-input>
placeholder="诊断选择" ref="inputRef" @focus="focus"></el-input>
<el-popover placement="bottom-start" trigger="click" :width="props.width" ref="popoverRef" @before-enter="beforeShow" :virtual-ref="inputRef" @hide ="afterShow">
@ -78,7 +78,7 @@ const changeInput = (inputStr: string) => {
searchList.value = res;
})
}
const emit = defineEmits(['selectedCallBack'])
const emit = defineEmits(['selectedCallBack','focus'])
const clickRow = (row: any) => {
selectList.value.push(row)
nameList.value.push(row.name)
@ -112,6 +112,10 @@ const init = (list: any, nList: any) => {
nameList.value = nList;
keyword.value = nameList.value.join(",") + ","
}
const focus = ()=>{
emit("focus",false)
}
defineExpose({init})
</script>
<style scoped lang="scss">

View File

@ -241,7 +241,7 @@ watch(() => props.status, () => {
}
&:hover {
background: rgba(#4D6DE4, 0.1);
background: rgba(#4D6DE4, 0.5);
}
.item_name {

View File

@ -5,9 +5,6 @@
<ul>
<li class="item" v-for="(item, index) in list" :key="index">
<div class="index">{{ index + 1 }}</div>
<div class="name">
<el-popover
placement="top-start"
@ -59,6 +56,7 @@
@selectedCallBack="itemSelect"
:placeholder="'请输入药材名称'"
:disabled="disabled"
@focus="focus"
>
</SearchInput>
</div>
@ -124,6 +122,10 @@ const selectUnit = (item: any, unit: any) => {
}
}
const sumPrice = ref(0)
const emit = defineEmits(['focus'])
const focus=(e:any)=>{
emit('focus',e)
}
watch(()=>list.value, (newList) => {
sumPrice.value = newList.reduce((total, item) => {
return total + (item.selectedNum || 0) * (item.selectedPrice || 0);

View File

@ -5,7 +5,22 @@
<ul>
<li class="item" v-for="(item, index) in list" :key="index">
<div class="index">{{ index + 1 }}</div>
<div class="name">{{ item.itemName }}</div>
<div class="name">
<el-popover width="485">
<template #reference>
{{ item.itemName }}
</template>
<div class="detail">
<div style="display: flex;justify-content: space-between">
<div>{{ item.itemName }}</div>
<div>{{ item.unitPrice }}/{{ item.unit }}</div>
</div>
<div>
<div> {{item.itemSocialCode}}</div>
</div>
</div>
</el-popover>
</div>
<div class="price">{{ item.unitPrice }}</div>
<div class="unit">
<div style="display: flex; align-items: center;">
@ -33,6 +48,7 @@
:placeholder="'请输入项目名称'"
:disabled="disabled"
style="height: 100%"
@focus="focus"
>
</SearchInput>
</div>
@ -43,7 +59,7 @@
</Panel>
</template>
<script setup lang="ts">
import {defineModel, computed} from "vue";
import {defineModel, computed,defineEmits} from "vue";
import Panel from "@/components/common/Panel.vue";
import {Close} from '@element-plus/icons-vue'
import SearchInput from "@/components/SearchInput.vue";
@ -83,7 +99,10 @@ const list = defineModel<any[]>({default: () => []});
const deleteItem = (id: any) => {
list.value = list.value.filter((item) => item.id !== id);
};
const emit = defineEmits(['focus'])
const focus=(e:any)=>{
emit('focus',e)
}
</script>
<style scoped lang="scss">
@ -116,6 +135,7 @@ const deleteItem = (id: any) => {
margin-left: 10px;
height: 100%;
line-height: 30px;
}
.code {

View File

@ -15,6 +15,7 @@ const wsStore = useWsStore();
const isReading = ref(false)
const socialCard: any = defineModel();
const ReadSocialCard = async (readType: string) => {
emit("changeLoading",true)
socialCard.value.lastUse = "CardDefault"
isReading.value = true;
let config_db: any = await post('common/config/getall');
@ -40,6 +41,7 @@ const ReadSocialCard = async (readType: string) => {
};
const reciceMessage = (response: Response) => {
emit('changeLoading',false)
if (socialCard.value.lastUse != "CardDefault") {
return;
}
@ -66,24 +68,37 @@ const reciceMessage = (response: Response) => {
cardSn: response.Data.card_sn ? response.Data.card_sn : "",
}
getInfoFor1101(params)
}
const loading = ref(false)
const emit = defineEmits(['socialCardUpdate', 'close'])
const emit = defineEmits(['socialCardUpdate', 'close','changeLoading'])
const getInfoFor1101 = (params: any) => {
loading.value = true
post("social/person/getCustomSocialInfo", {data: params}).then((res: any) => {
emit('changeLoading',true)
ElMessage({
message: "正在读取中,请稍后......",
duration: 500,
type: 'info',
});
post("social/person/getCustomSocialInfo", {data: params},{catch_error: true}).then((res: any) => {
emit('changeLoading',false)
socialCard.value.data = res;
socialCard.value.mdtrtCertType = params.mdtrtCertType;
socialCard.value.mdtrtCertNo = params.mdtrtCertNo;
ElMessage({
message: "读取成功",
type: 'success',
duration: 1000,
});
emit('socialCardUpdate', socialCard.value)
loading.value = false
}).finally(() => {
}).catch(()=>{
isReading.value = false;
loading.value = false
emit('changeLoading',false)
ElMessage({
message: "读取失败",
duration: 1000,
type: 'error',
});
})
}
@ -92,28 +107,18 @@ onMounted(async () => {
});
onUnmounted(() => {
wsStore.removeAllMessageCallback()
emit('changeLoading',false)
})
const close = () => {
ElMessageBox.confirm("退出识别", "提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
callback: (action: any) => {
if (action == "confirm") {
socialCard.value.data = null
emit('close')
}
if (action == "cancel") {
emit('socialCardUpdate', socialCard.value)
}
},
});
socialCard.value.data = null
}
defineExpose({close})
</script>
<template>
<div class="card-default">
<div v-loading="loading" class="empty">
<div
class="empty">
<div class="btn-wrapper">
<div class="btn" @click="ReadSocialCard('03')" @keydown.enter.prevent tabindex="-1">医保卡</div>
<div class="btn" @click="ReadSocialCard('01')" @keydown.enter.prevent tabindex="-1">电子凭证</div>
@ -130,6 +135,7 @@ const close = () => {
height: 100%;
background: #FFFFFF;
border-radius: 8px;
.btn {
width: 100%;
height: 46px;
@ -141,16 +147,20 @@ const close = () => {
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&:hover {
background: #4D6DE4;
color: #FFFFFF;
}
:last-child {
border-bottom: none;
border-radius:0 0 8px 8px;
border-radius: 0 0 8px 8px;
}
:first-child {
border-radius:8px 8px 0 0;
border-radius: 8px 8px 0 0;
}
}
}

View File

@ -4,6 +4,7 @@
<el-scrollbar>
<div style="padding:0 24px 24px">
<el-form
v-loading="loading"
:model="edit_data"
label-width="auto"
:rules="rules"
@ -16,19 +17,6 @@
:column="4"
style="margin-top: 20px"
>
<!-- <el-descriptions-item label="结算方式">-->
<!-- <el-form-item prop="gender">-->
<!-- <el-radio-group v-model="edit_data.type">-->
<!-- <el-radio value="1">医保</el-radio>-->
<!-- <el-radio value="2">自费</el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-descriptions-item>-->
<el-descriptions-item label="姓名">
<el-form-item prop="name">
<el-input v-model="edit_data.name" placeholder="请输入姓名" clearable></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="gender">
<el-radio-group v-model="edit_data.gender">
@ -37,6 +25,12 @@
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="姓名">
<el-form-item prop="name">
<el-input v-model="edit_data.name" placeholder="请输入姓名" clearable></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="年龄">
<el-form-item prop="age">
<el-input v-model.number="edit_data.age" placeholder="请输入年龄"></el-input>
@ -152,8 +146,8 @@
</span>
</div>
<template #dropdown>
<CardDefault v-model="socialCard" @socialCardUpdate="socialCardUpdate"
@close="deleteCard"/>
<CardDefault ref="cardDefaultRef" v-model="socialCard" @socialCardUpdate="socialCardUpdate"
@close="deleteCard" @changeLoading="changeLoading"/>
</template>
</el-dropdown>
<div class="closeBtn" v-else @click="deleteCard" style="outline: none;">
@ -171,7 +165,7 @@
</template>
<script setup lang="ts">
import {onMounted, ref} from 'vue'
import {nextTick, onMounted, ref} from 'vue'
import {post} from '@/utils/request.ts'
import CardDefault from '@/components/registration/CardDefault.vue'
import {ElMessage, ElMessageBox} from "element-plus";
@ -312,8 +306,9 @@ const socialCardUpdate = (e: any) => {
tableData.value = e.data.insuinfo
edit_data.value.organizationDoctorId = props.doctorId
}
loading.value = false
}
const cardDefaultRef = ref<any>("")
const deleteCard = () => {
ElMessageBox.confirm("退出识别", "提示", {
confirmButtonText: '确定',
@ -322,6 +317,9 @@ const deleteCard = () => {
if (action == "confirm") {
isShowCard.value = true
edit_data.value = {}
nextTick(() => {
cardDefaultRef.value?.close()
})
}
},
});
@ -340,6 +338,10 @@ const list = () => {
sectionList.value = res
})
}
const loading = ref(false)
const changeLoading = (e: any) => {
loading.value = e
}
defineExpose({init})
</script>
<style scoped lang="scss">

View File

@ -5,13 +5,14 @@
@row-click="rowClick"
style="height: 100%"
>
<el-table-column prop="name" label="姓名" width="180"></el-table-column>
<el-table-column prop="gender" label="性别" width="180">
<el-table-column prop="name" label="姓名" width="180">
<template #default="scope">
<img style="width: 25px;height: 25px"
:src="scope.row.gender === 1 ? '/public/static/images/member/man.png' :scope.row.gender === 2 ? '/public/static/images/member/women.png':'无'"
alt="" srcset="">
<div style="display: flex;align-items: center;">
<img style="width: 25px;height: 25px;margin-right: 10px"
:src="scope.row.gender === 1 ? '/public/static/images/member/man.png' :scope.row.gender === 2 ? '/public/static/images/member/women.png':'无'"
alt="" srcset="">
<span> {{ scope.row.name }}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="phone" label="手机号" width="180"></el-table-column>

View File

@ -7,22 +7,23 @@
<el-scrollbar>
<div class="case">
<CaseDetail v-if="patientRegistration.status==3" v-model="formData" ></CaseDetail>
<Case ref="caseRef" v-else v-model="formData" :status="status"></Case>
<Case ref="caseRef" v-else v-model="formData" :status="status" :isShowFrom="isShowFrom" @focus="focus"></Case>
</div>
<div class="service-items">
<ServiceItemsDetail v-if="patientRegistration.status==3" v-model="itemList"></ServiceItemsDetail>
<ServiceItems v-else v-model="itemList" :status="status"></ServiceItems>
<ServiceItems v-else v-model="itemList" :status="status" @focus="focus"></ServiceItems>
</div>
<div class="pharmaceutical-consumables">
<PharmaceuticalConsumablesDetail v-if="patientRegistration.status==3"
v-model="goodsList" ></PharmaceuticalConsumablesDetail>
<PharmaceuticalConsumables v-else v-model="goodsList" :status="status"></PharmaceuticalConsumables>
</div>
<div class="bottom">
<Settlement v-if="status!=1" v-model="totalAmount" @deleteItem="deleteItem" @save="save" :status="status"
@edit="edit"></Settlement>
<PharmaceuticalConsumables v-else v-model="goodsList" :status="status" @focus="focus"></PharmaceuticalConsumables>
</div>
</el-scrollbar>
<div class="bottom">
<Settlement v-model="totalAmount" @deleteItem="deleteItem" @save="save" :status="status"
@edit="edit"></Settlement>
</div>
</div>
<div class="right">
<div class="top">
@ -182,6 +183,10 @@ const getSeeDockerInfo = (newValue:any) => {
seeDockerInfo.value = res
})
}
const isShowFrom= ref<any>(false)
const focus=(e:any)=>{
isShowFrom.value=e
}
watch(() => registerId.value, (newValue) => {
if (!newValue) {
seeDockerInfo.value = {}

View File

@ -153,6 +153,7 @@ const openDialog = () => {
ItemEditRef.value?.init()
})
}
const loading= ref(true)
</script>
<style scoped lang="scss">
.container-wrapper {