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

This commit is contained in:
LiJianZhao 2025-05-12 14:56:44 +08:00
commit d77b9c6a93
16 changed files with 341 additions and 84 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 945 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 B

View File

@ -9,9 +9,9 @@ import {useWsStore} from "@/stores/wsStore.ts";
const wsStore = useWsStore(); const wsStore = useWsStore();
const isReading = ref(false) const isReading = ref(false)
const socialCard:any = defineModel(); const socialCard: any = defineModel();
const ReadSocialCard = async (readType: string) => { const ReadSocialCard = async (readType: string) => {
socialCard.value.lastUse="cardPay" socialCard.value.lastUse = "cardPay"
isReading.value = true; isReading.value = true;
let config_db: any = await post('common/config/getall'); let config_db: any = await post('common/config/getall');
let config: any = {} let config: any = {}
@ -35,7 +35,7 @@ const ReadSocialCard = async (readType: string) => {
wsStore.sendMessage(request); wsStore.sendMessage(request);
}; };
const reciceMessage = (response: Response) => { const reciceMessage = (response: Response) => {
if(socialCard.value.lastUse!="cardPay"){ if (socialCard.value.lastUse != "cardPay") {
return; return;
} }
if (response.Code == 301) { if (response.Code == 301) {
@ -75,27 +75,29 @@ const getInfoFor1101 = (params: any) => {
onMounted(async () => { onMounted(async () => {
wsStore.setMessageCallback(reciceMessage) wsStore.setMessageCallback(reciceMessage)
}); });
onUnmounted(()=>{ onUnmounted(() => {
wsStore.removeAllMessageCallback() wsStore.removeAllMessageCallback()
}) })
</script> </script>
<template> <template>
<div class="card-pay"> <div class="card-pay">
<div class="left">医保<br/>信息</div> <div class="title">
<div class="left">医保信息</div>
<el-button type="primary" @click="socialCard.data=null">退出</el-button>
</div>
<div class="right"> <div class="right">
<div class="insuinfo" v-if="socialCard.data"> <div class="insuinfo" v-if="socialCard.data">
<div class="line"> <div class="line">
<div class="label">姓名</div> <div class="label">姓名</div>
<div class="info">{{ socialCard.data.baseinfo.psn_name }}</div> <div class="info">{{ socialCard.data.baseinfo.psn_name }}</div>
<div class="btn" @click="socialCard.data=null">退出</div>
</div> </div>
<div class="line"> <div class="line">
<div class="label">险种</div> <div class="label">险种</div>
<div class="info"> <div class="info">
<el-select v-model="socialCard.payInfo.selfpay_prop_type" placeholder="请选择" style="width: 100%"> <el-select style="width: 340px" v-model="socialCard.payInfo.selfpay_prop_type" placeholder="请选择">
<el-option <el-option
v-for="(item,index) in socialCard.data.insuinfo" v-for="(item) in socialCard.data.insuinfo"
:key="item.insutype" :key="item.insutype"
:label="'账户余额'+getKey(insutypes, item.insutype)+'('+item.balc.toFixed(2)+')'" :label="'账户余额'+getKey(insutypes, item.insutype)+'('+item.balc.toFixed(2)+')'"
:value="item.insutype" :value="item.insutype"
@ -104,48 +106,48 @@ onUnmounted(()=>{
</el-select> </el-select>
</div> </div>
</div> </div>
</div> </div>
<div class="card-empty" v-else> <div class="card-empty" v-else>
<div class="tip" v-loading="isReading">暂无医保信息</div> <div class="tip" v-loading="isReading">暂无医保信息</div>
<div class="btn-wrapper"> <div class="btn" @click="ReadSocialCard('03')" tabindex="-1">医保卡</div> <div class="btn-wrapper">
<div class="btn" @click="ReadSocialCard('03')" tabindex="-1">医保卡</div>
<div class="btn" @click="ReadSocialCard('01')" tabindex="-1">电子码</div> <div class="btn" @click="ReadSocialCard('01')" tabindex="-1">电子码</div>
<div class="btn" @click="ReadSocialCard('02')" tabindex="-1">身份证</div> <div class="btn" @click="ReadSocialCard('02')" tabindex="-1">身份证</div>
<div class="btn" @click="ReadSocialCard('04')" tabindex="-1">人脸识别</div></div> <div class="btn" @click="ReadSocialCard('04')" tabindex="-1">人脸识别</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
.card-pay { .card-pay {
position: relative; width: 436px;
background: #f9fafc;
border-radius: 8px;
padding: 24px;
display: flex; display: flex;
flex-direction: column;
.title{
display: flex;
justify-content: space-between;
}
.left { .left {
width: 100px; font-weight: 800;
height: 100px; font-size: 18px;
background: #DDD; color: #333333;
text-align: center; font-style: normal;
line-height: 30px;
font-size: 24px;
color: #666;
padding: 20px;
box-sizing: border-box;
border-radius: 10px 0 0 10px;
} }
.right { .right {
position: relative;
flex: 1; flex: 1;
background: #EEE; display: flex;
box-sizing: border-box; font-weight: 500;
padding: 10px; font-size: 16px;
border-radius: 0 10px 10px 0; color: #999999;
.line{ font-style: normal;
.line {
position: relative; position: relative;
display: flex; display: flex;
height: 40px; height: 40px;
@ -153,37 +155,56 @@ onUnmounted(()=>{
padding-left: 10px; padding-left: 10px;
padding-right: 10px; padding-right: 10px;
line-height: 40px; line-height: 40px;
.label{ .label {
position: relative; position: relative;
width: 40px; width: 50px;
} }
.info{
.info {
flex: 1; flex: 1;
} }
} }
.card-empty{
.card-empty {
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
.tip{
.tip {
position: relative; position: relative;
width: 100%; width: 100%;
height: 50px; height: 50px;
text-align: center; text-align: center;
line-height: 40px; line-height: 40px;
} }
.btn-wrapper{
position: relative; .btn-wrapper {
height: 30px; height: 38px;
display: flex; display: flex;
.btn{ justify-content: space-between;
flex: 1;
margin-left: 5px; .btn {
margin-right: 5px; width: 91px;
height: 38px;
background: #ffffff;
border-radius: 8px;
border: 1px solid #4d6de4;
font-weight: bold;
font-size: 16px;
color: #4d6de4;
font-style: normal;
text-align: center;
line-height: 38px;
&:hover {
background: #4d6de4;
color: #ffffff;
} }
} }
} }
.btn{ }
.btn {
text-align: center; text-align: center;
line-height: 30px; line-height: 30px;
outline: none; outline: none;
@ -193,4 +214,56 @@ onUnmounted(()=>{
} }
} }
.pay-right {
width: 436px;
background: #f9fafc;
border-radius: 8px;
padding: 24px;
display: flex;
flex-direction: column;
&-title {
font-weight: 800;
font-size: 18px;
color: #333333;
font-style: normal;
}
&-content {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
font-weight: 500;
font-size: 16px;
color: #999999;
font-style: normal;
}
&-btns {
height: 38px;
display: flex;
justify-content: space-between;
&-btn {
width: 91px;
height: 38px;
background: #ffffff;
border-radius: 8px;
border: 1px solid #4d6de4;
font-weight: bold;
font-size: 16px;
color: #4d6de4;
font-style: normal;
text-align: center;
line-height: 38px;
&:hover {
background: #4d6de4;
color: #ffffff;
}
}
}
}
</style> </style>

View File

@ -1,31 +1,44 @@
<template> <template>
<Mask :width="800" :height="438" :is-show="show" @close="show = false" :show-footer="true"> <Mask :width="696" :height="409" title="收费" :is-show="show" @close="show = false" :show-footer="true">
<!-- <el-card>--> <template #default>
<template #header> <div class="content">
<div class="header"> <div class="btns">
<span>收费</span> <div
<CloseBtn @click="show = false" style="margin-top: 12px"></CloseBtn> class="btn"
:style="{
backgroundColor:
selectedIndex == index
? item.activeBackgroundColor
: hoverIndex == index
? item.activeBackgroundColor
: item.backgrountColor,
}"
v-for="(item, index) in btnsList"
:key="index"
@click="changePriceType(item.type,index)"
@mouseover="hoverIndex = index"
@mouseleave="hoverIndex = null"
>
<img
class="img"
:src="selectedIndex == index || hoverIndex == index ? item.imgActive : item.img"
alt=""
srcset=""
/>
<span class="pay-left-text" :style="{color: selectedIndex==index?'#fff':''}">{{ item.name }}</span>
</div>
</div>
<div class="pay">
<div class="pay-left">
<span class="pay-left-title">应收金额</span>
<span class="pay-left-money">{{ retailOrder.totalPrice }}</span>
</div> </div>
</template>
<div class="panel">
<div class="price">{{ retailOrder.totalPrice }}</div>
<div class="social"> <div class="social">
<CardPay v-model="socialCard"/> <CardPay v-model="socialCard"/>
</div> </div>
<div class="price-type">
<div
class="price-type-item"
:class="['btn',payType==item.type?'active':'']"
v-for="(item,index) in priceBtnList"
@click="changePriceType(item.type)"
>
<div class="image" :style="{'background-color':item.color}">
<img style="width: 16px;height: 16px;" :src="item.img" alt=""/>
</div>
<span>{{ item.name }}</span>
</div>
</div> </div>
</div> </div>
</template>
<template #footer> <template #footer>
<div class="footer"> <div class="footer">
<el-checkbox v-model="printReceipt">同时打印凭证</el-checkbox> <el-checkbox v-model="printReceipt">同时打印凭证</el-checkbox>
@ -41,7 +54,7 @@
import {nextTick, onMounted, onUnmounted, ref} from "vue"; import {nextTick, onMounted, onUnmounted, ref} from "vue";
import CloseBtn from "@/components/CloseBtn.vue"; import CloseBtn from "@/components/CloseBtn.vue";
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import Mask from "@/components/Mask.vue"; import Mask from "@/components/common/Mask.vue";
import CardPay from "@/components/charge/CardPay.vue"; import CardPay from "@/components/charge/CardPay.vue";
import {medTypeJson, priceBtnList} from "@/assets/config/constants.ts" import {medTypeJson, priceBtnList} from "@/assets/config/constants.ts"
import {useWsStore} from "@/stores/wsStore.ts"; import {useWsStore} from "@/stores/wsStore.ts";
@ -63,8 +76,9 @@ const init = (code: any) => {
} }
defineExpose({init}) defineExpose({init})
const changePriceType = (type: any) => { const changePriceType = (type: any, index: any) => {
payType.value = type; payType.value = type;
selectedIndex.value = index
} }
const emit = defineEmits(['orderComplete', 'orderCanceled']) const emit = defineEmits(['orderComplete', 'orderCanceled'])
const completeSettlement = () => { const completeSettlement = () => {
@ -76,7 +90,6 @@ const completeSettlement = () => {
} }
if (payType.value == 1) { if (payType.value == 1) {
// //
console.log('医保结算', socialCard.value)
socialSettlement(); socialSettlement();
} else { } else {
// //
@ -132,7 +145,51 @@ const openPsnPayment = (payInfo: any, orderInfo: any) => {
}) })
} }
const selectedIndex = ref<number | null>(null)
const hoverIndex = ref<number | null>(null)
const isShow = ref<boolean>(false)
const btnsList = [
{
type: 1,
name: '医保支付',
backgrountColor: '#F0F4FD ',
activeBackgroundColor: '#4d6de4',
img: '/static/images/slices/1.png',
imgActive: '/static/images/slices/1-active.png',
},
{
type: 2,
name: '微信支付',
backgrountColor: '#ecf8fe',
activeBackgroundColor: '#80cfdb',
img: '/static/images/slices/2.png',
imgActive: '/static/images/slices/2-active.png',
},
{
type: 3,
name: '支付宝',
backgrountColor: '#fff5ec',
activeBackgroundColor: '#fdb376',
img: '/static/images/slices/3.png',
imgActive: '/static/images/slices/3-active.png',
},
{
type: 4,
name: '现金支付',
backgrountColor: '#ffeeee',
activeBackgroundColor: '#ff8686',
img: '/static/images/slices/4.png',
imgActive: '/static/images/slices/4-active.png',
},
{
type: 5,
name: '其他支付',
backgrountColor: '#e5f9ff',
activeBackgroundColor: '#30e3ca',
img: '/static/images/slices/5.png',
imgActive: '/static/images/slices/5-active.png',
},
]
</script> </script>
@ -185,15 +242,133 @@ const openPsnPayment = (payInfo: any, orderInfo: any) => {
} }
.active { .active {
color: #fff; color: #fff !important;
background-color: #409EFF; background-color: #409EFF;
} }
} }
} }
.footer { .content {
flex: 1;
padding: 0 24px;
display: flex;
flex-direction: column;
.btns {
height: 86px;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center;
.btn {
width: 120px;
height: 46px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
font-weight: 500;
font-size: 16px;
color: #333333;
font-style: normal;
.img {
width: 24px;
height: 24px;
margin-right: 4px;
}
&:hover {
color: #fff;
}
}
}
.pay {
flex: 1;
display: flex;
justify-content: space-between;
.pay-left {
padding-top: 24px;
&-title {
display: block;
font-weight: 800;
font-size: 18px;
color: #333333;
font-style: normal;
margin-bottom: 22px;
}
&-money {
font-weight: bold;
font-size: 42px;
color: #ff0000;
font-style: normal;
}
}
.pay-right {
width: 436px;
background: #f9fafc;
border-radius: 8px;
padding: 24px;
display: flex;
flex-direction: column;
&-title {
font-weight: 800;
font-size: 18px;
color: #333333;
font-style: normal;
}
&-content {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
font-weight: 500;
font-size: 16px;
color: #999999;
font-style: normal;
}
&-btns {
height: 38px;
display: flex;
justify-content: space-between;
&-btn {
width: 91px;
height: 38px;
background: #ffffff;
border-radius: 8px;
border: 1px solid #4d6de4;
font-weight: bold;
font-size: 16px;
color: #4d6de4;
font-style: normal;
text-align: center;
line-height: 38px;
&:hover {
background: #4d6de4;
color: #ffffff;
}
}
}
}
}
}
.footer {
height: 100%;
display: flex;
justify-content: space-between;
padding: 0 24px;
align-items: center;
} }
</style> </style>

View File

@ -79,7 +79,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="bottom"> <div class="bottom" v-if="!statusDisabled">
<div class="search"> <div class="search">
<SearchInput <SearchInput
style="height: 100%" style="height: 100%"
@ -106,6 +106,10 @@ const props = defineProps({
status: { status: {
type: Boolean, type: Boolean,
default: 0 default: 0
},
statusDisabled: {
type: Boolean,
default: 0
} }
}) })
const goodsDetail = defineModel<any>(); const goodsDetail = defineModel<any>();
@ -226,6 +230,7 @@ const colosInfo = () => {
display: flex; display: flex;
height: 58px; height: 58px;
align-items: center; align-items: center;
.search { .search {
flex: 1; flex: 1;
height: 100%; height: 100%;

View File

@ -51,7 +51,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="bottom"> <div class="bottom" v-if="!statusDisabled">
<div class="search"> <div class="search">
<SearchInput <SearchInput
style="height: 100%" style="height: 100%"
@ -77,6 +77,10 @@ const props = defineProps({
status: { status: {
type: Boolean, type: Boolean,
default: 0 default: 0
},
statusDisabled:{
type: Boolean,
default: 0
} }
}) })
const itemDetail = defineModel<any>(); const itemDetail = defineModel<any>();

View File

@ -18,7 +18,7 @@
@selectedCallBack="diagnosisSelect" @selectedCallBack="diagnosisSelect"
ref="diagnosisSearchRef" ref="diagnosisSearchRef"
:show-header="false" :show-header="false"
:disabled="statusDisabled==1" :disabled="statusDisabled==1||formData.status==1"
> >
</DiagnosisSearchInput> </DiagnosisSearchInput>
@ -30,7 +30,7 @@
@change="handleChange" @change="handleChange"
clearable clearable
style="width: 100%" style="width: 100%"
:disabled="formData.status == 1" :disabled="statusDisabled==1||formData.status==1"
> >
<el-option <el-option
v-for="item in doctorList" v-for="item in doctorList"
@ -47,11 +47,11 @@
</div> </div>
<div style="margin-top: 24px"> <div style="margin-top: 24px">
<ServiceDetail v-model="formData.itemDetail" :status="formData.status == 0" <ServiceDetail v-model="formData.itemDetail" :status="formData.status == 0"
@totalPriceChange="getOrderTotalPrice"></ServiceDetail> @totalPriceChange="getOrderTotalPrice" :statusDisabled="statusDisabled==1"></ServiceDetail>
</div> </div>
<div style="margin-top: 24px"> <div style="margin-top: 24px">
<GoodsDetail v-model="formData.goodsDetail" :status="formData.status == 0" <GoodsDetail v-model="formData.goodsDetail" :status="formData.status == 0"
@totalPriceChange="getOrderTotalPrice"></GoodsDetail> @totalPriceChange="getOrderTotalPrice" :statusDisabled="statusDisabled==1"></GoodsDetail>
</div> </div>
<div class="bottom"> <div class="bottom">
<TotalPrice v-model="formData.totalPrice" @save="charge" :status="formData.status" @openCheckOut ="openCheckoutDetail(formData.goodsDetail)"></TotalPrice> <TotalPrice v-model="formData.totalPrice" @save="charge" :status="formData.status" @openCheckOut ="openCheckoutDetail(formData.goodsDetail)"></TotalPrice>
@ -262,7 +262,7 @@ const checkTraceCode = (goodsList: any[]) => {
} }
const getStatus=(status:any)=>{ const getStatus=(status:any)=>{
console.log(111) statusDisabled.value = status
formData.value = { formData.value = {
patientInfo: {}, patientInfo: {},
diagnosisMedicalRecord: {}, diagnosisMedicalRecord: {},