Compare commits

...

3 Commits

Author SHA1 Message Date
ChenQiuYu b5b89e7fa1 dev 2025-04-30 11:55:52 +08:00
ChenQiuYu 32da952250 Merge branch 'main' of ssh://git.jizhiweb.cn:2222/clinic-v2/web 2025-04-30 10:52:10 +08:00
ChenQiuYu ad0003ad7b dev 2025-04-30 10:52:02 +08:00
7 changed files with 276 additions and 159 deletions

View File

@ -1,39 +1,52 @@
<template> <template>
<div class="container"> <Panel title="收费队列">
<div class="search"> <template #tools>
<el-input v-model="query.keyword" placeholder="根据姓名搜索"/> <el-button type="primary" size="small">新增患者</el-button>
<el-button type="success" @click="addChargeOrder" size="small">+收费</el-button> </template>
</div> <template #default>
<div class="list"> <div class="container">
<el-scrollbar> <div class="tabs">
<ul> <span v-for="(item,index) in statusList " :key="index" :class="query.status == item.value ? 'tabs-item' : ''"
<li class="list-item" :class="curItem.id == item.id ? 'active' : ''" v-for="(item, index) in orderList" @click="tab(item)">{{ item.label }}&nbsp;{{ item.num }}
:key="index" @click="clickItem(item)"> </span>
</div>
<div class="search">
<el-input v-model="query.keyword" style="height: 100%;width: 100%" placeholder="根据姓名搜索"/>
<!-- <el-button type="success" @click="addChargeOrder" size="small">+收费</el-button>-->
</div>
<div class="list">
<el-scrollbar>
<ul>
<li class="list-item" :class="curItem.id == item.id ? 'active' : ''" v-for="(item, index) in orderList"
:key="index" @click="clickItem(item)">
<span> <span>
<img v-if="item.patientRegistration.gender==''" class="avatar" src="/static/images/outpatient/man.png" <img v-if="item.patientRegistration.gender=='1'" class="avatar"
src="/static/images/outpatient/man.png"
alt="头像"/> alt="头像"/>
<img v-if="item.patientRegistration.gender==''" class="avatar" src="/static/images/outpatient/women.png" <img v-if="item.patientRegistration.gender=='2'" class="avatar"
src="/static/images/outpatient/women.png"
alt="头像"/> alt="头像"/>
</span> </span>
<span class="item_name">{{ item.patientInfo.name }}</span> <span class="item_name">{{ item.patientInfo.name }}</span>
<el-tooltip <el-tooltip
class="box-item" class="box-item"
effect="dark" effect="dark"
:content="formatTime(item.patientRegistration.createDatetime)||'-'" :content="formatTime(item.patientRegistration.createDatetime)||'-'"
placement="bottom-start" placement="bottom-start"
> >
<span class="item_time"> <span class="item_time">
{{ formatTime(item.patientRegistration.createDatetime) || '-' }} {{ formatTime(item.patientRegistration.createDatetime) || '-' }}
</span> </span>
</el-tooltip> </el-tooltip>
<span :class="[item.status == 0 ?'status-active':'']">{{item.status == 0 ? '未收' : '已收'}}</span> <span :class="[item.status == 0 ?'status-active':'']">{{ item.status == 0 ? '未收' : '已收' }}</span>
</li> </li>
</ul> </ul>
</el-scrollbar> </el-scrollbar>
</div>
</div>
</div>
</div>
</template>
</Panel>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -41,26 +54,28 @@ import {onMounted, ref} from "vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import Panel from "@/components/common/Panel.vue"; import Panel from "@/components/common/Panel.vue";
import {formatTime} from "@/utils/dateUtils.ts"; import {formatTime} from "@/utils/dateUtils.ts";
const curItem = ref<any>({}); const curItem = ref<any>({});
const emit = defineEmits(['clickItem']) const emit = defineEmits(['clickItem'])
const clickItem = (item: any) => { const clickItem = (item: any) => {
curItem.value = item curItem.value = item
emit('clickItem', item); emit('clickItem', item, query.value.status);
} }
const orderList = ref<any>([]); const orderList = ref<any>([]);
const query = ref({ const query = ref({
pageSize: 20, pageSize: 20,
pageNum: 1, pageNum: 1,
keyword: "" keyword: "",
status: 0
}) })
const addChargeOrder = () => { const addChargeOrder = () => {
const newOrder = { const newOrder = {
id:-1, id: -1,
patientName :"匿名患者", patientName: "匿名患者",
payType : -1, payType: -1,
} }
if (orderList.value[0]?.id == -1){ if (orderList.value[0]?.id == -1) {
return return
} }
orderList.value.unshift(newOrder) orderList.value.unshift(newOrder)
@ -77,28 +92,45 @@ const getOrderList = () => {
} }
) )
} }
const delDraft = () =>{ const delDraft = () => {
orderList.value.shift(); orderList.value.shift();
clickFirst() clickFirst()
} }
defineExpose({delDraft,getOrderList}) defineExpose({delDraft, getOrderList})
onMounted(()=>{ onMounted(() => {
getOrderList() getOrderList()
}) })
const statusList = ref([
{
label: '待收',
num: 0,
value: 0
},
{
label: '已收',
num: 0,
value: 1
},
])
const tab = (item: any) => {
query.value.status = item.value
getOrderList()
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container{ .container {
display: flex; display: flex;
flex-direction: column; // flex-direction: column; //
width: 100%; width: 320px;
.search{
height: 25px; .search {
padding: 16px;
height: 74px;
width: 100%; width: 100%;
display: flex; display: flex;
margin: 0; margin: 0;
padding: 0;
} }
.list { .list {
display: flex; display: flex;
min-height: 0; min-height: 0;
@ -172,10 +204,12 @@ onMounted(()=>{
} }
.status-active{
.status-active {
font-weight: bold; font-weight: bold;
color: #409EFF; color: #409EFF;
} }
.active { .active {
color: #fff; color: #fff;
background: #4D6DE4; background: #4D6DE4;
@ -187,4 +221,27 @@ onMounted(()=>{
} }
} }
} }
.tabs {
height: 27px;
border-bottom: 1px solid #EAEAEC;
font-weight: 500;
color: #999999;
font-style: normal;
display: flex;
justify-content: space-between;
padding: 0 67px;
span {
width: 66px;
cursor: pointer;
text-align: center;
}
.tabs-item {
border-bottom: 2px solid #4D6DE4;
color: #4D6DE4;
padding-bottom: 10px;
}
}
</style> </style>

View File

@ -1,6 +1,6 @@
<template> <template>
<el-table :data="data.goodsDetail" max-height="150"> <el-table :data="data.goodsDetail" max-height="150">
<el-table-column prop="name" label="名称"></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="单价"></el-table-column>
<el-table-column prop="number" label="数量"> <el-table-column prop="number" label="数量">
<template #default="scope"> <template #default="scope">
@ -30,11 +30,17 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<SearchInput :request-api="goodsSearchApi" :show-config="goodsShowConfig" @selectedCallBack="goodsSelect"></SearchInput> <SearchInput :disabled="data.status == 1" :request-api="goodsSearchApi" :show-config="goodsShowConfig" @selectedCallBack="goodsSelect"></SearchInput>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SearchInput from "@/components/SearchInput.vue"; import SearchInput from "@/components/SearchInput.vue";
const props = defineProps({
disabled: {
type: Boolean,
default: false
}
})
const data = defineModel<any>(); const data = defineModel<any>();
const delGoods = (item: any) => { const delGoods = (item: any) => {
data.value.goodsDetail = data.value.filter((i: any) => i.id != item.id) data.value.goodsDetail = data.value.filter((i: any) => i.id != item.id)

View File

@ -1,34 +1,30 @@
<template> <template>
<el-table :data="data.itemDetail" max-height="150"> <el-table :data="data.itemDetail" max-height="150">
<el-table-column prop="itemName" label="名称"></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 prop="selectedUnit" label="单位"></el-table-column>
<el-table-column prop="selectedPrice" label="单价"></el-table-column> <el-table-column prop="selectedPrice" label="单价"></el-table-column>
<el-table-column label="数量"> <el-table-column label="数量">
<template #default="scope"> <template #default="scope">
<div v-if="data.status == 0"> <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"></el-input-number>
</div> </template>
<div v-else> </el-table-column>
{{ scope.row.selectedNum }} <el-table-column label="操作" v-if="data.status ==0">
</div> <template #default="scope">
</template> <el-button type="danger" link @click="delService(scope.row)">X</el-button>
</el-table-column> </template>
<el-table-column label="操作" v-if="data.status ==0"> </el-table-column>
<template #default="scope"> </el-table>
<el-button type="danger" link @click="delService(scope.row)">X</el-button> <SearchInput :disabled="data.status == 1" :request-api="serviceSearchApi" :show-config="serviceShowConfig"
</template> @selectedCallBack="serviceSelect"></SearchInput>
</el-table-column>
</el-table>
<SearchInput :request-api="serviceSearchApi" :show-config="serviceShowConfig" @selectedCallBack="serviceSelect"></SearchInput>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import SearchInput from "@/components/SearchInput.vue"; import SearchInput from "@/components/SearchInput.vue";
const data =defineModel<any>(); const data = defineModel<any>();
const delService = (item: any) => { const delService = (item: any) => {
data.value.itemDetail = data.value.filter((i: any) => i.id != item.id) data.value.itemDetail = data.value.filter((i: any) => i.id != item.id)
} }
const serviceSearchApi = "item/search"; const serviceSearchApi = "item/search";
const serviceShowConfig = [ const serviceShowConfig = [
{ {
@ -50,9 +46,9 @@ const serviceSelect = (row: any) => {
row.selectedUnit = row.unit row.selectedUnit = row.unit
row.selectedPrice = row.unitPrice row.selectedPrice = row.unitPrice
data.value.itemDetail.push(row) data.value.itemDetail.push(row)
emit('totalPriceChange',row) emit('totalPriceChange', row)
} }
const handleNumChange = ()=>{ const handleNumChange = () => {
emit('totalPriceChange') emit('totalPriceChange')
} }

View File

@ -0,0 +1,48 @@
<script setup lang="ts">
import Panel from '../common/Panel.vue';
import {defineEmits, defineModel,defineProps} from 'vue'
const {status}=defineProps(['status'])
const emit = defineEmits(['save','deleteItem','edit']);
const save = () => {
emit('save');
};
const deleteItem = () => {
emit('deleteItem');
};
const totalAmount = defineModel<any>()
const editItem= () => {
emit('edit');
};
</script>
<template>
<Panel :showTools="false" :showHeader="false">
<div class="footer">
<div>总金额<span class="text icon"></span><span class="text">{{ totalAmount || '0' }}</span></div>
<div class="btn-group">
<el-button type="primary" disabled>追溯码</el-button>
<el-button type="primary" @click="editItem">收费</el-button>
</div>
</div>
</Panel>
</template>
<style scoped lang="scss">
.footer {
height: 86px;
display: flex;
justify-content: space-between;
align-items: center;
font-weight: 400;
font-size: 22px;
color: #333333;
font-style: normal;
padding:0 24px 0 24px;
.icon{
font-size: 16px;
}
.text {
color: #FF282E
}
}
</style>

View File

@ -1,7 +1,7 @@
<template> <template>
<el-popover placement="bottom-start" trigger="click" :width="props.width" ref="popoverRef" @before-enter="beforeShow"> <el-popover placement="bottom-start" trigger="click" :width="props.width" ref="popoverRef" @before-enter="beforeShow">
<template #reference> <template #reference>
<el-input v-model="keyword" :style="{'width': props.width+'px'}" @input="changeInput" :disabled="disabled" <el-input v-model="keyword" style="width:100%;height: 100%" @input="changeInput" :disabled="disabled"
placeholder="诊断选择"></el-input> placeholder="诊断选择"></el-input>
</template> </template>
<div class="container" v-if="searchList.length > 0"> <div class="container" v-if="searchList.length > 0">

View File

@ -12,21 +12,19 @@
clearable/> clearable/>
<el-button type="primary" @click="searchSocialItem">搜索</el-button> <el-button type="primary" @click="searchSocialItem">搜索</el-button>
</div> </div>
<el-scrollbar style="width: 100%;overflow: hidden"> <div class="search_result" style="width: 100%;padding: 0 12px">
<div class="search_result" style="width: 100%;padding: 0 24px"> <div class="result_table" style="width: 100%;height: 100%;box-sizing: border-box;padding-bottom: 20px">
<div class="result_table" style=""> <el-table v-loading="isloading" :data="searchResult.list"
<el-table v-loading="isloading" :data="searchResult.list" style="width: 100%;height: 100%"
style="width: 100%" highlight-current-row
highlight-current-row @row-click="changeCurRow"
@row-click="changeCurRow" :row-class-name="tableRowClassName">
:row-class-name="tableRowClassName"> <el-table-column prop="name" label="名称" fixed show-overflow-tooltip/>
<el-table-column prop="name" label="名称" fixed show-overflow-tooltip/> <el-table-column prop="code" fixed label="医疗目录编码" show-overflow-tooltip/>
<el-table-column prop="code" fixed label="医疗目录编码" show-overflow-tooltip/> <el-table-column prop="unit" label="计价单位" width="180" show-overflow-tooltip/>
<el-table-column prop="unit" label="计价单位" width="180" show-overflow-tooltip/> </el-table>
</el-table>
</div>
</div> </div>
</el-scrollbar> </div>
</div> </div>
</template> </template>
<template #footer> <template #footer>

View File

@ -1,70 +1,73 @@
<template> <template>
<div class="container"> <div class="container">
<div class="left"> <div class="left">
<Panel title="收费队列"> <chargeQueue @clickItem="clickItem" ref="chargeQueueRef"></ChargeQueue>
<chargeQueue @clickItem="clickItem" ref="chargeQueueRef"></ChargeQueue>
</Panel>
</div> </div>
<div class="middle"> <div class="middle">
<Panel title="零售收费"> <el-scrollbar>
<template #tools> <Panel title="零售收费">
<span>{{formData.totalPrice}}</span> <el-form :model="formData" inline label-width="0">
<div v-if="formData.status == 0 "> <el-form-item>
<el-button type="primary" @click="delDraft()" v-if="formData.id == -1" >删除</el-button> <el-input v-model="formData.patientInfo.name" :disabled="statusDisabled==1"
<el-button type="primary" @click="saveAndCharge" >收费</el-button> placeholder="请输入姓名"></el-input>
<el-button type="primary" >追溯码</el-button> </el-form-item>
<el-button type="primary" >挂单</el-button> <el-form-item>
</div> <el-select v-model="formData.patientInfo.sex" style="width: 80px;" :disabled="statusDisabled==1">
<el-option :label="'男'" :value="'1'"></el-option>
<el-option :label="'女'" :value="'2'"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input v-model="formData.patientInfo.age" :disabled="statusDisabled==1">
<template #suffix>
</template>
</el-input>
</el-form-item>
<el-form-item>
<el-input v-model="formData.patientInfo.phone" placeholder="手机号" :disabled="statusDisabled==1">
</el-input>
</el-form-item>
<el-form-item>
<el-select v-model="formData.diagnosisMedicalRecord.dockerId" placeholder="医生" style="width: 100px"
:disabled="statusDisabled==1">
<el-option v-for="item in dockerList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-form>
</template> </Panel>
<el-form :model="formData" inline label-width="0"> <div style="margin-top: 24px">
<el-form-item> <Panel title="医疗诊断">
<el-input v-model="formData.patientInfo.name" placeholder="请输入姓名"></el-input> <div style="height:64px;padding:0 24px 24px">
</el-form-item> <DiagnosisSearchInput
<el-form-item> v-model="diagnosisKeyword"
<el-select v-model="formData.patientInfo.sex" style="width: 80px;"> :request-api="diagnosisSearchApi"
<el-option :label="'男'" :value="'男'"></el-option> :show-config="diagnosisShowConfig"
<el-option :label="'女'" :value="'女'"></el-option> @selectedCallBack="diagnosisSelect"
</el-select> ref="diagnosisSearchRef"
</el-form-item> :show-header="false"
<el-form-item> :disabled="statusDisabled==1"
<el-input v-model="formData.patientInfo.age">
<template #suffix>
</template>
</el-input>
</el-form-item>
<el-form-item>
<el-input v-model="formData.patientInfo.phone" placeholder="手机号">
</el-input>
</el-form-item>
<el-form-item>
<el-button></el-button>
<el-button>+</el-button>
</el-form-item>
<el-form-item>
<el-select v-model="formData.diagnosisMedicalRecord.dockerId" placeholder="医生" style="width: 100px">
<el-option v-for="item in dockerList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-form>
<DiagnosisSearchInput
v-model="diagnosisKeyword"
:request-api="diagnosisSearchApi"
:show-config="diagnosisShowConfig"
@selectedCallBack="diagnosisSelect"
ref="diagnosisSearchRef"
:show-header="false">
</DiagnosisSearchInput>
</Panel> >
<Panel title="服务项目"> </DiagnosisSearchInput>
<ServiceDetail v-model="formData" @totalPriceChange="getOrderTotalPrice"> </ServiceDetail> </div>
</Panel>
</Panel> </div>
<Panel title="药品耗材"> <div style="margin-top: 24px">
<GoodsDetail v-model="formData" @totalPriceChange="getOrderTotalPrice" ></GoodsDetail> <Panel title="服务项目">
</Panel> <ServiceDetail v-model="formData" @totalPriceChange="getOrderTotalPrice"></ServiceDetail>
</Panel>
</div>
<div style="margin-top: 24px">
<Panel title="药品耗材">
<GoodsDetail v-model="formData" @totalPriceChange="getOrderTotalPrice"></GoodsDetail>
</Panel>
</div>
<div class="bottom">
<TotalPrice v-model="formData.totalPrice" @edit="saveAndCharge"></TotalPrice>
</div>
</el-scrollbar>
</div> </div>
<div class="right"> <div class="right">
<div class="top"> <div class="top">
@ -91,12 +94,14 @@ import ServiceDetail from "@/components/charge/ServiceDetail.vue";
import GoodsDetail from "@/components/charge/GoodsDetail.vue"; import GoodsDetail from "@/components/charge/GoodsDetail.vue";
import DiagnosisSearchInput from "@/components/outpatient/DiagnosisSearchInput.vue"; import DiagnosisSearchInput from "@/components/outpatient/DiagnosisSearchInput.vue";
import Settlement from "@/components/charge/Settlement.vue"; import Settlement from "@/components/charge/Settlement.vue";
import TotalPrice from "@/components/charge/TotalPrice.vue";
const socialCard = ref<any>({payInfo:{}}) const socialCard = ref<any>({payInfo: {}})
const formData = ref<any>({ const formData = ref<any>({
patientInfo:{}, patientInfo: {},
diagnosisMedicalRecord:{}, diagnosisMedicalRecord: {},
}) })
const statusDisabled = ref(0)
const diagnosisKeyword = ref("") const diagnosisKeyword = ref("")
const chargeQueueRef = ref() const chargeQueueRef = ref()
const delDraft = () => { const delDraft = () => {
@ -106,9 +111,9 @@ const delDraft = () => {
} }
const settlementRef = ref() const settlementRef = ref()
const saveAndCharge = () => { const saveAndCharge = () => {
post('charge/save', {data:formData.value}).then((res: any) => { post('charge/save', {data: formData.value}).then((res: any) => {
formData.value.code = res formData.value.code = res
nextTick(()=>{ nextTick(() => {
settlementRef.value?.init(res) settlementRef.value?.init(res)
}) })
}) })
@ -131,38 +136,40 @@ const diagnosisSelect = (list: any) => {
formData.value.diagnosisMedicalRecord.diagnosisSummary = diagnosisNames formData.value.diagnosisMedicalRecord.diagnosisSummary = diagnosisNames
} }
const clickItem = (item: any) => { const clickItem = (item: any, status: any) => {
formData.value = item formData.value = item
statusDisabled.value = status
getOrderTotalPrice() getOrderTotalPrice()
nextTick(() => { nextTick(() => {
let list = JSON.parse(formData.value.diagnosisMedicalRecord.diagnosisDetail) let list = JSON.parse(formData.value.diagnosisMedicalRecord.diagnosisDetail)
let nList = formData.value.diagnosisMedicalRecord.diagnosisSummary.split(',') let nList = formData.value.diagnosisMedicalRecord.diagnosisSummary.split(',')
diagnosisSearchRef.value?.init(list,nList); diagnosisSearchRef.value?.init(list, nList);
}) })
} }
const dockerList = ref<any[]>([]) const dockerList = ref<any[]>([])
const getDockerList = () => { const getDockerList = () => {
let query={ let query = {
role:1 role: 1
} }
post('organization/member/search',{query:query}).then((res: any) => { post('organization/member/search', {query: query}).then((res: any) => {
dockerList.value = res dockerList.value = res
}) })
} }
const orderCompleted = () => { const orderCompleted = () => {
nextTick(()=>{ nextTick(() => {
chargeQueueRef.value?.getOrderList() chargeQueueRef.value?.getOrderList()
}) })
} }
const orderCanceled = () => { const orderCanceled = () => {
nextTick(()=>{ nextTick(() => {
chargeQueueRef.value?.getOrderList() chargeQueueRef.value?.getOrderList()
}) })
} }
onMounted(()=>{ onMounted(() => {
getDockerList() getDockerList()
}) })
const getOrderTotalPrice = () => { const getOrderTotalPrice = () => {
@ -252,5 +259,10 @@ const getOrderTotalPrice = () => {
} }
.bottom{
margin-top: 24px;
height: 86px;
background: #FFFFFF;
border-radius: 8px;
}
</style> </style>