Merge remote-tracking branch 'origin/main'

This commit is contained in:
牛子源 2025-05-12 17:01:38 +08:00
commit 7facb0adc2
40 changed files with 1339 additions and 361 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 B

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

@ -18,7 +18,7 @@ $border-color-extra-light: #F2F6FC;
// 背景颜色 // 背景颜色
$background-color-base: #eee; $background-color-base: #eee;
$background-color-main: #5078c8; $background-color-main: #4D6DE4;
// 边框圆角 // 边框圆角
$border-radius-base: 4px; $border-radius-base: 4px;

View File

@ -90,3 +90,8 @@ body {
.clear-margin { .clear-margin {
margin: 0; margin: 0;
} }
.el-popper.is-light.type-popper, .el-popper.is-light>.el-popper__arrow:before{
background:#F5FAFF !important;
padding: 0 !important;
border: 1px solid #4D6DE4 !important;
}

View File

@ -1,7 +1,7 @@
<template> <template>
<el-popover placement="bottom-start" :visible="isVisible" :width="props.width" ref="popoverRef" <el-popover placement="bottom-start" :visible="isVisible" :width="props.width" ref="popoverRef"
:trigger-keys="[]"> :trigger-keys="[]" style="height: 500px" popper-class="type-popper">
<template #reference> <template #reference>
<el-input <el-input
ref="inputRef" ref="inputRef"
@ -19,19 +19,40 @@
/> />
</template> </template>
<div class="container"> <div class="container">
<el-table <el-scrollbar>
:data="searchList" style="width: 100%" <table class="table" style="width: 100%; border-collapse: collapse;max-height: 50px">
@row-click="clickRow" <!-- 表头 -->
:show-header="props.showHeader" <thead>
max-height="200px" <tr class="table-title">
> <th
<el-table-column
v-for="item in showConfig" v-for="item in showConfig"
:prop="item.prop" :key="item.prop"
:label="item.label||'-'" style="background-color: #f5f7fa; padding: 8px;"
show-overflow-tooltip >
></el-table-column> {{ item.label }}
</el-table> </th>
</tr>
</thead>
<!-- 表体 -->
<tbody>
<tr class="table-body"
v-for="(item, index) in searchList"
:key="index"
@click="clickRow(item)"
style="cursor: pointer; transition: background-color 0.2s;"
>
<td
v-for="showItem in showConfig"
:key="showItem.prop"
style="vertical-align: middle; padding: 8px;"
>
{{ item[showItem.prop] }}
</td>
</tr>
</tbody>
</table>
</el-scrollbar>
</div> </div>
</el-popover> </el-popover>
@ -107,7 +128,7 @@ const beforeShow = () => {
const isVisible = ref(false) const isVisible = ref(false)
const focus = () => { const focus = () => {
isVisible.value = true isVisible.value = true
console.log("focus输入框") changeInput("")
emit('focus', true) emit('focus', true)
} }
const handlerBlur = () => { const handlerBlur = () => {
@ -131,4 +152,57 @@ const handlerBlur = () => {
border: 1px solid #409eff !important; border: 1px solid #409eff !important;
} }
} }
.table {
th {
background: none !important;
}
.table-title {
height: 52px;
font-weight: 500;
font-size: 14px;
color: #333333;
font-style: normal;
th {
text-align: left;
&:nth-child(1) {
width: 200px;
text-align: left;
border-radius: 8px 8px 0 0;
padding-left: 24px !important;
}
}
}
.table-body {
height: 52px;
font-weight: 500;
font-size: 14px;
color: #666666;
font-style: normal;
td {
&:nth-child(1) {
width: 200px;
text-align: left;
padding-left: 30px !important;
white-space: nowrap; /* 防止文本换行 */
overflow: hidden; /* 隐藏溢出的文本 */
text-overflow: ellipsis; /* 显示省略号 */
}
}
&:last-child {
border-radius: 0 0 8px 8px;
}
&:hover {
background-color: #4D6DE4;
color: #fff;
}
}
}
</style> </style>

View File

@ -0,0 +1,152 @@
<template>
<Mask :height="600" :width="700" :is-show="show">
<CloseBtn @click="show = false"></CloseBtn>
<el-card>
<div class="panel">
<div class="header">
请勾选该追溯码关联的发药项目商品
</div>
<div class="code">
<div class="before-code">
{{ traceabilityCode.slice(0, 7) }}
</div>
<div class="after-code">
{{ traceabilityCode.slice(7, traceabilityCode.length) }}
</div>
</div>
<div class="table">
<table class="simple-table">
<thead>
<tr>
<th>选择</th>
<th>发药项目</th>
<th>产品标识码</th>
<th>系统处理</th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in tableData">
<td><input class="blue-radio" type="radio" :value="item.id" v-model="selected"/></td>
<td>{{ item.name }}</td>
<td>
<IdCodeListShow :idCodeList="item.idCode" v-if="item.idCode && item.idCode.length > 0"/>
<div v-else>未关联</div>
</td>
<td style="width: 300px;">
<template v-if="selected === item.id">
关联产品标识码采集追溯码自动识别商品
</template>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<template #footer>
<el-button @click="addIdCode" type="primary">确定</el-button>
<el-button @click="show = false" type="primary">关闭</el-button>
</template>
</el-card>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import {ref} from "vue"
import IdCodeListShow from "@/components/retail/IdCodeListShow.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {post} from "@/utils/request.ts";
import {ElMessage} from "element-plus";
interface TableItem {
id: string;
name: string;
idCode?: string[] | undefined; // undefined
gatherNumber?: number;
retailNumber?: number;
packagingUnit?: string;
minPackagingUnit?: string;
selectedUnit?: string;
minPackagingNumber?: number;
traceAbilityCodeList?: { code: string; number: number }[];
}
const show = ref(false);
const traceabilityCode = ref("");
const tableData = ref<TableItem[]>([]);
const init = (newIdCode: any, newTableDate: any) => {
traceabilityCode.value = newIdCode;
tableData.value = newTableDate;
show.value = true;
}
const selected = ref()
defineExpose({init})
const addIdCode = ()=>{
if (traceabilityCode.value ==""){
return;
}
let idCode = traceabilityCode.value.slice(0, 7);
post("goods/goods/addIdCode",{goodsId:selected.value,idCode:idCode}).then((res:any)=>{
show.value = false;
for (let subItem of tableData.value){
if (subItem.id === selected.value){
subItem.idCode?.push(idCode);
break
}
}
})
const selectedItem = tableData.value.find((item: any) => item.id === selected.value);
if(!selectedItem){
return
}
addTraceabilityCodeDo(selectedItem)
}
const emit = defineEmits(["addIdCode","addTraceabilityCode"])
const addTraceabilityCodeDo = (item: any) => {
emit("addTraceabilityCode",item,traceabilityCode.value)
}
</script>
<style scoped lang="scss">
.panel {
height: 400px;
.header {
margin-top: 20px;
font-size: 24px;
display: flex;
justify-content: center;
align-items: center;
}
.code {
height: 50px;
display: flex;
font-size: 24px;
justify-content: center;
align-items: center;
.before-code {
color: #7a8794;
}
.after-code {
margin-left: 10px;
}
}
.table {
.simple-table {
.blue-radio {
accent-color: #28addd;
}
}
}
}
</style>

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

@ -70,7 +70,7 @@ import {CaretBottom} from "@element-plus/icons-vue";
import {apiConfig} from "@/assets/config/apiConfig.ts"; import {apiConfig} from "@/assets/config/apiConfig.ts";
const curItem = ref<any>({}); const curItem = ref<any>({});
const emit = defineEmits(['clickItem']) const emit = defineEmits(['clickItem','getStatus'])
const clickItem = (item: any) => { const clickItem = (item: any) => {
curItem.value = item curItem.value = item
emit('clickItem', item, query.value.status); emit('clickItem', item, query.value.status);
@ -141,6 +141,8 @@ const statusList = ref([
]) ])
const tab = (item: any) => { const tab = (item: any) => {
query.value.status = item.value query.value.status = item.value
curItem.value={}
emit('getStatus', item.value)
init() init()
} }
const getTipCount = () => { const getTipCount = () => {

View File

@ -0,0 +1,180 @@
<template>
<Mask :top="50" :height="650" :width="900" :is-show="show">
<CloseBtn @click="show = false"></CloseBtn>
<el-card>
<template #header>
<div class="header">追溯码采集</div>
</template>
<div class="detail">
<el-input placeholder="请输入追溯码" v-model="inputIdCode" clearable @keydown.enter="openAssociationIdCode()">
<template #prefix>
<el-icon>
<Monitor/>
</el-icon>
</template>
</el-input>
<div class="list">
<table class="simple-table">
<thead>
<tr>
<th>发药项目</th>
<th>产品标识码</th>
<th>发药数量</th>
<th>已采/应采</th>
<th>追溯码</th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in list" :key="index">
<td>{{ item.name }}</td>
<td>
<IdCodeListShow :idCodeList="item.idCode" v-if="item.idCode&&item.idCode.length>0"
@addTraceabilityCode="addTraceAbilityCodeHandler"/>
<div v-else>未关联</div>
</td>
<td>{{ item.selectedNum }}{{ item.selectedUnit }}</td>
<td>{{ item.traceAbilityCodeList ? item.traceAbilityCodeList.length : 0 }}/{{ item.shouldNumber }}</td>
<td>
<TraceabilityCodeAdd :item="item" @addTraceabilityCode="addTraceAbilityCodeHandler"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<template #footer>
<div class="bottom-btn">
<el-button @click="saveRetail()" type="primary">确定</el-button>
<el-button @click="show = false">关闭</el-button>
</div>
</template>
</el-card>
<AssociationIdCode
ref="associationIdCodeRef"
@addIdCode="cleanInputIdCode"
@addTraceabilityCode="addTraceAbilityCodeHandler"></AssociationIdCode>
</Mask>
</template>
<script setup lang="ts">
import Mask from "@/components/Mask.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {nextTick, ref} from "vue";
import IdCodeListShow from "@/components/charge/IdCodeListShow.vue";
import AssociationIdCode from "@/components/charge/AssociationIdCode.vue";
import TraceabilityCodeAdd from "@/components/charge/TraceabilityCodeAdd.vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {Monitor} from '@element-plus/icons-vue'
import {post} from "@/utils/request.ts";
const show = ref(false)
const list = ref()
const orderInfo = ref()
const init = (data: any) => {
list.value = data
console.log(list)
show.value = true
}
const close = () => {
show.value = false
}
defineExpose({init, close})
const emit = defineEmits(['confirm'])
const saveRetail = () => {
if (!checkTraceCode()) {
ElMessageBox.confirm(
`追溯码采集未完成是否继续?`,
'Warning',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
emit('confirm')
})
return
}
emit('confirm')
}
const checkTraceCode = () => {
for (let i = 0; i < list.value.length; i++) {
const item = list.value[i];
if (!item.traceAbilityCodeList || item.shouldNumber !== item.traceAbilityCodeList.length) {
return false;
}
}
return true;
}
const inputIdCode = ref()
const associationIdCodeRef = ref()
const openAssociationIdCode = () => {
if (addTraceAbilityCode()) {
return
}
nextTick(() => {
associationIdCodeRef.value.init(inputIdCode.value, list.value)
})
}
const addTraceAbilityCode = () => {
for (let i = 0; i < list.value.length; i++) {
let item = list.value[i];
let idCode = inputIdCode.value.slice(0, 7);
if (!item.idCode) break
if (item.idCode.includes(idCode)) {
addTraceabilityCodeDo(item, inputIdCode.value);
return true
}
}
return false
}
const addTraceabilityCodeDo = (item: any, inputStr: any) => {
if (!item.traceAbilityCodeList) {
item.traceAbilityCodeList = []
}
let traceAbilityCodeListList = item.traceAbilityCodeList.length
if (traceAbilityCodeListList == item.shouldNumber) {
ElMessage({
message: '采集数量已满',
type: 'warning',
})
return
}
const index = item.traceAbilityCodeList.findIndex((codeObj: any) => codeObj.code === inputStr);
if (index != -1) {
ElMessage({
message: '该追溯码已采集',
type: 'warning',
})
return
}
item.traceAbilityCodeList.push(inputStr)
cleanInputIdCode()
}
const cleanInputIdCode = () => {
inputIdCode.value = ''
}
const addTraceAbilityCodeHandler = (item: any, code: any) => {
addTraceabilityCodeDo(item, code)
}
</script>
<style scoped lang="scss">
.header {
font-size: 18px;
font-weight: bold;
}
.detail {
.list {
height: 400px;
}
}
</style>

View File

@ -0,0 +1,47 @@
<script setup lang="ts">
const props = defineProps({
idCodeList: {
type: Array,
default: () => []
}
})
</script>
<template>
<el-popover
title="已关联的追溯码产品标识码:"
placement="bottom-start"
trigger="hover"
width="250px"
>
<template #reference>
<div class="id-code-panel">
<div class="code" v-if="props.idCodeList.length >0">{{props.idCodeList[0]}}</div>
<div class="number" v-if="props.idCodeList.length >1">
+{{props.idCodeList.length-1}}
</div>
</div>
</template>
<template #default>
<div class="id-code-detail">
<div class="item" v-for="(item,index) in props.idCodeList" :key="index">
{{index+1}}.{{item}}
</div>
</div>
</template>
</el-popover>
</template>
<style scoped lang="scss">
.id-code-panel{
display: flex;
.number{
margin-left: 10px;
color: green;
}
}
</style>

View File

@ -11,7 +11,7 @@
<div class="avatar-info-wrapper"> <div class="avatar-info-wrapper">
<div class="avatar-info"> <div class="avatar-info">
<span class="avatar-info-name">{{ seeDockerInfo?.patientInfo?.name }}</span> <span class="avatar-info-name">{{ seeDockerInfo?.patientInfo?.name }}</span>
<span class="avatar-info-age">{{ seeDockerInfo?.patientInfo?.age}}</span> <span class="avatar-info-age">{{ seeDockerInfo?.patientInfo?.age||0}}</span>
</div> </div>
<div class="avatar-info-phone-num"> <div class="avatar-info-phone-num">
<span class="avatar-info-phone">{{ seeDockerInfo?.patientInfo?.phone }}</span> <span class="avatar-info-phone">{{ seeDockerInfo?.patientInfo?.phone }}</span>
@ -26,11 +26,11 @@
class="detail-doctor">{{ seeDockerInfo?.dockerName }}-{{ seeDockerInfo?.sectionName }}</span> class="detail-doctor">{{ seeDockerInfo?.dockerName }}-{{ seeDockerInfo?.sectionName }}</span>
</div> </div>
<div class="detail-middle"> <div class="detail-middle">
<div>费用类别:&nbsp;<span class="detail-doctor">医保</span></div> <div>费用类别:&nbsp;<span class="detail-doctor">{{seeDockerInfo?.feeTypeName||'-'}}</span></div>
<div>医保卡剩余金额:&nbsp;<span class="detail-balance">{{ seeDockerInfo?.socialBalance }}</span></div> <div>医保卡剩余金额:&nbsp;<span class="detail-balance">{{ seeDockerInfo?.socialBalance }}</span></div>
</div> </div>
<div>上次就诊时间:&nbsp;<span class="detail-doctor">{{ <div>上次就诊时间:&nbsp;<span class="detail-doctor">{{
formatDate(seeDockerInfo?.lastSeeDoctorTime) formatDate(seeDockerInfo?.lastSeeDoctorTime)||'-'
}}</span></div> }}</span></div>
</div> </div>
</div> </div>

View File

@ -6,16 +6,9 @@
<el-collapse-item :name="index" v-for="(item, index) in list" :key="index"> <el-collapse-item :name="index" v-for="(item, index) in list" :key="index">
<template #title> <template #title>
<div class="list-item-content"> <div class="list-item-content">
<el-tooltip
class="box-item"
effect="dark"
:content="item.diagnosisMedicalRecord?.diagnosisSummary"
placement="bottom-start"
>
<span class="disease-name">{{ item.diagnosisMedicalRecord?.diagnosisSummary }}</span> <span class="disease-name">{{ item.diagnosisMedicalRecord?.diagnosisSummary }}</span>
</el-tooltip> <span class="doctor">{{ item.doctorName }}</span>
<!-- <span class="doctor">{{ item.patientId }}</span>--> <span class="time">{{ formatListTime(item.createTime) }}</span>
<!-- <span class="time">{{ item.createDatetime }}</span>-->
</div> </div>
</template> </template>
<div> <div>
@ -32,9 +25,9 @@ import Panel from '@/components/common/Panel.vue';
import Detail from './RecordsLog/Detail.vue'; import Detail from './RecordsLog/Detail.vue';
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import {ref} from "vue"; import {ref} from "vue";
import {formatListTime} from "@/utils/dateUtils.ts";
const list = ref<any>([]) const list = ref<any>([])
const init = (patientId: any) => { const init = (patientId: any) => {
const query = { const query = {
patientId: patientId, patientId: patientId,
@ -42,6 +35,7 @@ const init = (patientId: any) => {
} }
post('charge/listDetail', {query}).then((res: any) => { post('charge/listDetail', {query}).then((res: any) => {
list.value = res.list list.value = res.list
console.log(list,'list')
}) })
} }
const clearList = () => { const clearList = () => {
@ -61,14 +55,19 @@ defineExpose({init,clearList})
justify-content: space-between; justify-content: space-between;
.disease-name { .disease-name {
width: 135px; width: 90px;
overflow: hidden; /* 隐藏溢出的内容 */ overflow: hidden; /* 隐藏溢出的内容 */
white-space: nowrap; /* 防止文本换行 */ white-space: nowrap; /* 防止文本换行 */
text-overflow: ellipsis; /* 显示省略号 */ text-overflow: ellipsis; /* 显示省略号 */
text-align: left;
} }
.doctor { .doctor {
width: 85px; width: 80px;
}
.time{
display: inline-block;
overflow: hidden;
} }
} }
} }

View File

@ -44,10 +44,10 @@
</div> </div>
<div class="content"> <div class="content">
<div class="content-middle"> <div class="content-middle">
<div class="item"> <div class="item" style="margin-top: 8px">
<div class="name">合计</div> <div class="name">合计</div>
<div class="price"> <div class="price">
<div class="price-right">{{ sumPrice }}</div> <div class="price-right sumPrice">{{ sumPrice }}</div>
</div> </div>
</div> </div>
</div> </div>
@ -143,6 +143,12 @@ onMounted(() => {
.price-left { .price-left {
margin-right: 38px; margin-right: 38px;
} }
.sumPrice{
font-weight: bold;
font-size: 16px;
color: #FF0000;
font-style: normal;
}
} }
} }
} }

View File

@ -1,38 +1,50 @@
<template> <template>
<Mask :width="800" :height="438" :is-show="show"> <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>
<!-- </template>--> </div>
<div class="panel"> <div class="pay">
<div class="price">{{ retailOrder.totalPrice }}</div> <div class="pay-left">
<div class="social" > <span class="pay-left-title">应收金额</span>
<span class="pay-left-money">{{ retailOrder.totalPrice }}</span>
</div>
<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>
<el-button @click="completeSettlement()" type="primary">完成收费</el-button> <el-button @click="completeSettlement()" type="primary">完成收费</el-button>
</div> </div>
<!-- </template>--> </template>
<!-- </el-card>-->
</Mask> </Mask>
<PersonalPayment ref="psnPaymentRef" @orderCompleted="orderCompleted" @orderCancel="orderCanceled"></PersonalPayment> <PersonalPayment ref="psnPaymentRef" @orderCompleted="orderCompleted" @orderCancel="orderCanceled"></PersonalPayment>
</template> </template>
@ -42,45 +54,46 @@
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";
import PersonalPayment from "@/components/charge/PersonalPayment.vue"; import PersonalPayment from "@/components/charge/PersonalPayment.vue";
import {ElMessage} from "element-plus"; import {ElMessage} from "element-plus";
const wsStore = useWsStore(); const wsStore = useWsStore();
const socialCard =defineModel<any>(); const socialCard = defineModel<any>();
const show = ref(false) const show = ref(false)
const printReceipt = ref(false); const printReceipt = ref(false);
const payType = ref(null); const payType = ref(null);
const retailOrder = ref<any>(null); const retailOrder = ref<any>(null);
const init = (code: any) => { const init = (code: any) => {
post ('charge/getByCode',{code:code}).then((res:any)=>{ post('charge/getByCode', {code: code}).then((res: any) => {
retailOrder.value = res; retailOrder.value = res;
show.value = true; show.value = true;
}) })
} }
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 = () => {
if (!retailOrder.value){ if (!retailOrder.value) {
return; return;
} }
if (payType.value == null){ if (payType.value == null) {
return return
} }
if(payType.value == 1){ if (payType.value == 1) {
// //
console.log('医保结算',socialCard.value)
socialSettlement(); socialSettlement();
}else { } else {
// //
post('charge/completeOrder',{id:retailOrder.value.id,payType:payType.value}).then((res:any)=>{ post('charge/completeOrder', {id: retailOrder.value.id, payType: payType.value}).then((res: any) => {
orderCompleted() orderCompleted()
}) })
} }
@ -88,18 +101,18 @@ const completeSettlement = ()=>{
} }
const orderCompleted = ()=>{ const orderCompleted = () => {
show.value = false; show.value = false;
ElMessage.success("保存成功") ElMessage.success("保存成功")
emit('orderComplete',printReceipt.value) emit('orderComplete', printReceipt.value)
} }
const orderCanceled = ()=>{ const orderCanceled = () => {
show.value = false; show.value = false;
emit('orderCanceled') emit('orderCanceled')
} }
const getBalcByInsutype = (type:any) =>{ const getBalcByInsutype = (type: any) => {
let balc =0; let balc = 0;
for (const item of socialCard.value.data.insuinfo) { for (const item of socialCard.value.data.insuinfo) {
if (item.insutype == type) { if (item.insutype == type) {
balc = item.balc; balc = item.balc;
@ -109,50 +122,94 @@ const getBalcByInsutype = (type:any) =>{
return balc return balc
} }
const socialSettlement = ()=>{ const socialSettlement = () => {
const params = { const params = {
mdtrtCertType: socialCard.value.mdtrtCertType, mdtrtCertType: socialCard.value.mdtrtCertType,
mdtrtCertNo: socialCard.value.mdtrtCertNo, mdtrtCertNo: socialCard.value.mdtrtCertNo,
insutype: socialCard.value.payInfo.selfpay_prop_type, insutype: socialCard.value.payInfo.selfpay_prop_type,
changeOrderCode:retailOrder.value.code, changeOrderCode: retailOrder.value.code,
} }
post("charge/uploadCostDetails",{changeOrderCode:retailOrder.value.code}).then((res:any)=>{ post("charge/uploadCostDetails", {changeOrderCode: retailOrder.value.code}).then((res: any) => {
// //
post("charge/socialPrePay",{...params}).then((res:any)=>{ post("charge/socialPrePay", {...params}).then((res: any) => {
openPsnPayment(res,params) openPsnPayment(res, params)
}) })
}) })
} }
const psnPaymentRef = ref(); const psnPaymentRef = ref();
const openPsnPayment = (payInfo:any,orderInfo:any)=>{ const openPsnPayment = (payInfo: any, orderInfo: any) => {
nextTick(()=>{ nextTick(() => {
psnPaymentRef.value?.open(payInfo,orderInfo); psnPaymentRef.value?.open(payInfo, orderInfo);
}) })
} }
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>
<style scoped lang="scss"> <style scoped lang="scss">
.panel { .panel {
.price{ .price {
height: 50px; height: 50px;
text-align: center; text-align: center;
font-size: 25px; font-size: 25px;
font-weight: 600; font-weight: 600;
color: rgba(237, 120, 23, 0.8); color: rgba(237, 120, 23, 0.8);
} }
.price-type { .price-type {
display: flex; display: flex;
margin-top: 20px; margin-top: 20px;
justify-content: space-between; justify-content: space-between;
flex-wrap: wrap; flex-wrap: wrap;
align-items: center; align-items: center;
.btn { .btn {
height: 45px; height: 45px;
width: 95px; width: 95px;
@ -165,7 +222,8 @@ const openPsnPayment = (payInfo:any,orderInfo:any)=>{
align-items: center; align-items: center;
padding: 10px; padding: 10px;
cursor: pointer; cursor: pointer;
.image{
.image {
width: 16px; width: 16px;
height: 16px; height: 16px;
margin-right: 3px; margin-right: 3px;
@ -184,14 +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

@ -2,17 +2,18 @@
import Panel from '../common/Panel.vue'; import Panel from '../common/Panel.vue';
import {defineEmits, defineModel,defineProps} from 'vue' import {defineEmits, defineModel,defineProps} from 'vue'
const {status}=defineProps(['status']) const {status}=defineProps(['status'])
const emit = defineEmits(['save','deleteItem','edit']); const emit = defineEmits(['save','deleteItem','edit','openCheckOut']);
const save = () => { const save = () => {
emit('save'); emit('save');
}; };
const openCheckOut= () => {
emit('openCheckOut');
};
const deleteItem = () => { const deleteItem = () => {
emit('deleteItem'); emit('deleteItem');
}; };
const totalAmount = defineModel<any>() const totalAmount = defineModel<any>()
const editItem= () => {
emit('edit');
};
</script> </script>
<template> <template>
@ -20,8 +21,8 @@ const editItem= () => {
<div class="footer"> <div class="footer">
<div>总金额<span class="text icon"></span><span class="text">{{ totalAmount || '0' }}</span></div> <div>总金额<span class="text icon"></span><span class="text">{{ totalAmount || '0' }}</span></div>
<div class="btn-group" v-if="status == 0"> <div class="btn-group" v-if="status == 0">
<el-button type="primary" disabled>追溯码</el-button> <el-button type="primary" @click="openCheckOut()">追溯码</el-button>
<el-button type="primary" @click="editItem">收费</el-button> <el-button type="primary" @click="save">收费</el-button>
</div> </div>
</div> </div>
</Panel> </Panel>

View File

@ -0,0 +1,104 @@
<template>
<el-popover
title="追溯码:"
placement="bottom-start"
trigger="click"
width="300px"
>
<template #reference>
<el-input
placeholder="追溯码"
clearable
v-model="inputTraceabilityCode"
style="width: 300px;"
@keydown.enter="addTraceabilityCodeDo(props.item)"
></el-input>
</template>
<template #default>
<div v-for="(subItem,index) in item.traceAbilityCodeList" class="list">
<div class="code"> {{ subItem }}</div>
<div class="remove" @click="removeTraceAbility(subItem)">
<el-icon>
<CloseBold/>
</el-icon>
</div>
</div>
</template>
</el-popover>
</template>
<script setup lang="ts">
import {ref,watch} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {CloseBold} from "@element-plus/icons-vue";
import {post} from "@/utils/request.ts";
interface TraceAbilityCode {
code: string;
number: number;
showNumberInput?: boolean;
}
const props = defineProps({
item: {
type: Object as () => {
id?: number|undefined;
traceAbilityCodeList: TraceAbilityCode[];
retailNumber: number;
gatherNumber: number;
selectedUnit: string;
idCode: string[];
packagingUnit: string;
minPackagingUnit: string;
minPackagingNumber: number;
},
default: () => ({
traceAbilityCodeList: [],
retailNumber: 0,
gatherNumber: 0,
selectedUnit: "",
idCode:[],
packagingUnit: "",
minPackagingUnit: "",
minPackagingNumber: 0,
}),
},
})
const inputTraceabilityCode = ref("");
const emit = defineEmits(["addTraceabilityCode"]);
const addTraceabilityCodeDo = (item: any) => {
emit("addTraceabilityCode",item,inputTraceabilityCode.value)
inputTraceabilityCode.value = ""
}
const removeTraceAbility = (code: any) => {
const index = props.item.traceAbilityCodeList.findIndex(
(codeObj: any) => codeObj === code
);
if (index !== -1) {
props.item.traceAbilityCodeList.splice(index, 1); //
}
}
</script>
<style scoped lang="scss">
.list {
display: flex;
.code {
width: 100px;
}
.number {
width: 100px;
}
.remove {
font-size: 16px;
width: 50px;
&:hover {
color: #409eff;
}
}
}
</style>

View File

@ -75,6 +75,7 @@ console.log(calendarData);
<template> <template>
<div class="calendar-wrapper"> <div class="calendar-wrapper">
<span class="current">{{ currentYear }}{{ currentMonth + 1 }}</span>
<div class="row"> <div class="row">
<div class="item"> <div class="item">
<span class="tip"></span> <span class="tip"></span>
@ -97,15 +98,13 @@ console.log(calendarData);
<div class="item"> <div class="item">
<span class="tip"></span> <span class="tip"></span>
</div> </div>
</div> </div>
<div v-for="item in calendarData" class="row"> <div v-for="item in calendarData" class="row">
<div class="item" v-for="subItem in item"> <div class="item" v-for="subItem in item">
<span :class="subItem.isCurrentDay ? 'currentDay' : subItem.isCurrentMonth ? '' : 'otherMonth'"> <span :class="subItem.isCurrentDay ? 'currentDay' : subItem.isCurrentMonth ? '' : 'otherMonth'">
{{ subItem.day }} {{ subItem.isCurrentDay ? "今" : subItem.day }}
</span> </span>
</div> </div>
</div> </div>
</div> </div>
@ -114,31 +113,51 @@ console.log(calendarData);
<style scoped lang="scss"> <style scoped lang="scss">
.calendar-wrapper { .calendar-wrapper {
width: 100%; width: 100%;
height: 320px; height: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 20px; padding:0 20px 20px;
background-color: #FFF; background-color: #FFF;
border-radius: 0 0 8px 8px;
.row { display: flex;
width: 100%; flex-direction: column;
height: 45px; .current{
font-weight: 500;
.item { font-size: 18px;
color: #333333;
float: left; font-style: normal;
width: 14.2%; margin-bottom: 8px;
height: 45px; }
.row {
span { flex: 1;
display: block; width: 100%;
margin: auto; background: #F9FAFC ;
width: 30px; padding: 0 20px;
height: 30px; display: flex;
text-align: center; justify-content: space-between;
line-height: 30px; align-items: center;
border-radius: 15px; font-weight: 500;
font-size: 14px;
color: #999999;
font-style: normal;
.item {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
span {
margin: auto;
height: 34px;
width: 34px;
display: flex;
justify-content: center;
align-items: center;
font-weight: bold;
font-size: 16px;
color: #666666;
font-style: normal;
border-radius:17px;
} }
.currentDay { .currentDay {
background: #1677FE; background: #1677FE;
color: #fff; color: #fff;

View File

@ -1,6 +1,10 @@
<template> <template>
<header> <header>
<div class="center-wrapper"> <div class="center-wrapper">
<div class="logo">
<img style="width: 62px;height: 46px;" src="/favicon.ico" alt=""/>
<span>药慧精灵</span>
</div>
<div class="menu"> <div class="menu">
<router-link to="/home" class="menu-item" active-class="active active1">首页</router-link> <router-link to="/home" class="menu-item" active-class="active active1">首页</router-link>
<router-link to="/registration" class="menu-item" active-class="active active2">挂号</router-link> <router-link to="/registration" class="menu-item" active-class="active active2">挂号</router-link>
@ -11,25 +15,28 @@
<router-link to="/social" class="menu-item" active-class="active active7">医保</router-link> <router-link to="/social" class="menu-item" active-class="active active7">医保</router-link>
<router-link to="/statistics" class="menu-item" active-class="active active8">统计</router-link> <router-link to="/statistics" class="menu-item" active-class="active active8">统计</router-link>
<router-link to="/settings" class="menu-item" active-class="active active9">设置</router-link> <router-link to="/settings" class="menu-item" active-class="active active9">设置</router-link>
</div>
<div class="info"> <div class="info">
<span class="username">{{username}}</span> <span class="username">{{ username }}</span>
<el-button class="hover" :icon="Right" style="color: #fff" @click="logout" text>退出登录</el-button> <el-button class="hover" :icon="Right" style="color: #fff" @click="logout" text>退出登录</el-button>
</div> </div>
</div> </div>
</div>
</header> </header>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
@use "@/assets/scss/base"; @use "@/assets/scss/base";
.center-wrapper{
display: flex;
justify-content: space-between;
align-items: center;
}
.menu { .menu {
position: relative; position: relative;
display: flex;
align-items: center;
text-align: center; text-align: center;
line-height: 50px;
.menu-item { .menu-item {
display: inline-block; display: inline-block;
color: #FFF; color: #FFF;
@ -142,7 +149,6 @@ header {
position: relative; position: relative;
width: 100%; width: 100%;
height: 80px; height: 80px;
background-color: base.$background-color-main; background-color: base.$background-color-main;
padding: 15px 0; padding: 15px 0;
} }
@ -153,19 +159,37 @@ header {
float: right; float: right;
display: flex; display: flex;
align-items: center; // align-items: center; //
.username{ .username {
display: inline-block; display: inline-block;
height: 50px; height: 50px;
line-height: 50px; line-height: 50px;
} }
.hover{
.hover {
margin-left: 10px; margin-left: 10px;
cursor: pointer; cursor: pointer;
&:hover{
&:hover {
color: #4d6de4 !important; color: #4d6de4 !important;
} }
} }
} }
.logo{
margin-left: 30px;
display: flex;
align-items: center;
font-weight: 400;
font-size: 28px;
color: #FFFFFF;
font-style: normal;
}
/* 响应式设计 */
@media (max-width: 1630px) {
.logo span {
display: none; //
}
}
</style> </style>
<script setup lang="ts"> <script setup lang="ts">
import {useRouter} from 'vue-router' import {useRouter} from 'vue-router'
@ -173,7 +197,7 @@ import {type Action, ElMessage, ElMessageBox} from 'element-plus'
import {apiConfig} from "@/assets/config/apiConfig.ts"; import {apiConfig} from "@/assets/config/apiConfig.ts";
import {post} from "@/utils/request"; import {post} from "@/utils/request";
import {Right} from "@element-plus/icons-vue"; import {Right} from "@element-plus/icons-vue";
import {onMounted,ref} from "vue"; import {onMounted, ref} from "vue";
let logout = function () { let logout = function () {
@ -200,13 +224,13 @@ let logout = function () {
useRouter().push("/") useRouter().push("/")
}) })
} }
onMounted(()=>{ onMounted(() => {
getInfo() getInfo()
}) })
const username=ref<any>('') const username = ref<any>('')
const getInfo=()=>{ const getInfo = () => {
post(apiConfig.managerUserVerify).then((res: any) => { post(apiConfig.managerUserVerify).then((res: any) => {
username.value=res.username username.value = res.username
}) })
} }
</script> </script>

View File

@ -14,7 +14,6 @@
<template #reference> <template #reference>
{{ scope.row.name }} {{ scope.row.name }}
</template> </template>
<div class="detail"> <div class="detail">
<div style="display: flex;justify-content: space-between"> <div style="display: flex;justify-content: space-between">
<div style="font-size: 18px;font-weight: 500;color: #000">{{ <div style="font-size: 18px;font-weight: 500;color: #000">{{
@ -48,7 +47,7 @@
<el-table-column prop="number" label="数量"> <el-table-column prop="number" label="数量">
<template #default="scope"> <template #default="scope">
<div v-if="props.status"> <div v-if="props.status">
<el-input-number v-model="scope.row.selectedNum" :min="0" @change="handleNumChange" <el-input-number v-model="scope.row.selectedNum" :min="0" @change="handleNumChange(scope.row)"
size="small"></el-input-number> 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>
@ -79,7 +78,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%"
@ -89,6 +88,7 @@
@selectedCallBack="goodsSelect" @selectedCallBack="goodsSelect"
:disabled="!props.status" :disabled="!props.status"
@focus="focus" @focus="focus"
:width="1000"
></SearchInput> ></SearchInput>
</div> </div>
<span v-if="status">合计{{ getTotalPrice() }}</span> <span v-if="status">合计{{ getTotalPrice() }}</span>
@ -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>();
@ -152,6 +156,10 @@ const goodsSelect = (row: any) => {
row.selectedNum = 1 row.selectedNum = 1
row.selectedUnit = row.packagingUnit row.selectedUnit = row.packagingUnit
row.selectedPrice = row.unitPrice row.selectedPrice = row.unitPrice
row.shouldNumber = 1;
row.idCode = row.idCode.split(",")
if (goodsDetail.value.find((i: any) => i.id == row.id)) { if (goodsDetail.value.find((i: any) => i.id == row.id)) {
ElMessage.warning("数据已存在,只能加数量") ElMessage.warning("数据已存在,只能加数量")
goodsDetail.value.find((i: any) => i.id == row.id).selectedNum += 1 goodsDetail.value.find((i: any) => i.id == row.id).selectedNum += 1
@ -174,7 +182,16 @@ const selectUnit = (item: any, unit: any) => {
} }
const emit = defineEmits(["totalPriceChange", 'focus']) const emit = defineEmits(["totalPriceChange", 'focus'])
const handleNumChange = () => { const handleNumChange = (row:any) => {
//
let shouldNumber = 0;
if (row.selectedUnit == row.packagingUnit) {
shouldNumber = row.selectedNum
} else {
shouldNumber = Math.ceil(row.selectedNum / row.minPackagingNumber)
}
row.shouldNumber = shouldNumber
emit('totalPriceChange') emit('totalPriceChange')
} }
const getTotalPrice = () => { const getTotalPrice = () => {
@ -213,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

@ -1,6 +1,6 @@
<template> <template>
<Panel title="服务项目"> <Panel title="服务项目">
<el-table v-if="itemDetail.length>0" :data="itemDetail" max-height="150"> <el-table v-if="itemDetail.length>0" :data="itemDetail">
<el-table-column prop="itemName" label="项目名称" show-overflow-tooltip width="200"> <el-table-column prop="itemName" label="项目名称" show-overflow-tooltip width="200">
<template #default="scope"> <template #default="scope">
<el-popover <el-popover
@ -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>();
@ -112,6 +116,7 @@ const emit = defineEmits(['totalPriceChange', 'focus'])
const serviceSelect = (row: any) => { const serviceSelect = (row: any) => {
row.selectedNum = 1 row.selectedNum = 1
row.selectedUnit = row.unit row.selectedUnit = row.unit
row.selectedPrice = row.unitPrice row.selectedPrice = row.unitPrice
if (itemDetail.value.find((i: any) => i.id == row.id)) { if (itemDetail.value.find((i: any) => i.id == row.id)) {
ElMessage.warning("数据已存在,只能加数量") ElMessage.warning("数据已存在,只能加数量")

View File

@ -32,7 +32,8 @@
<PopoverInput :disabled="props.disabled" v-model="formDate.nowMedicalHistory" :list="nowMedicalHistoryList"/> <PopoverInput :disabled="props.disabled" v-model="formDate.nowMedicalHistory" :list="nowMedicalHistoryList"/>
</el-form-item> </el-form-item>
<el-form-item label="既往史:" v-if="!props.isShowFrom"> <el-form-item label="既往史:" v-if="!props.isShowFrom">
<PopoverInput :disabled="props.disabled" v-model="formDate.beforeMedicalHistory" :list="beforeMedicalHistoryList"/> <PopoverInput :disabled="props.disabled" v-model="formDate.beforeMedicalHistory"
:list="beforeMedicalHistoryList"/>
</el-form-item> </el-form-item>
<el-form-item label="过敏史:" v-if="!props.isShowFrom"> <el-form-item label="过敏史:" v-if="!props.isShowFrom">
<PopoverInput :disabled="props.disabled" v-model="formDate.allergyHistory" :list="allergyHistoryList"/> <PopoverInput :disabled="props.disabled" v-model="formDate.allergyHistory" :list="allergyHistoryList"/>
@ -50,7 +51,8 @@
<el-input :disabled="props.disabled" v-model="formDate.mouthCheck"></el-input> <el-input :disabled="props.disabled" v-model="formDate.mouthCheck"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="辅助检查:" v-if="(modelType==2 || modelType ==0)&&!props.isShowFrom"> <el-form-item label="辅助检查:" v-if="(modelType==2 || modelType ==0)&&!props.isShowFrom">
<el-input style="height: 100%;width: 100%" :disabled="props.disabled" v-model="formDate.adjunctCheck"></el-input> <el-input style="height: 100%;width: 100%" :disabled="props.disabled"
v-model="formDate.adjunctCheck"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="处置:" v-if="(modelType==0 || modelType ==2)&&!props.isShowFrom"> <el-form-item label="处置:" v-if="(modelType==0 || modelType ==2)&&!props.isShowFrom">
<el-input style="height: 100%;width: 100%" :disabled="props.disabled" v-model="formDate.deal"></el-input> <el-input style="height: 100%;width: 100%" :disabled="props.disabled" v-model="formDate.deal"></el-input>
@ -61,7 +63,7 @@
</Panel> </Panel>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {computed, nextTick, ref,defineEmits} from "vue"; import {computed, nextTick, ref, defineEmits} from "vue";
import { import {
mainAppealList, mainAppealList,
nowMedicalHistoryList, nowMedicalHistoryList,
@ -79,7 +81,7 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: 0 default: 0
}, },
isShowFrom:{ isShowFrom: {
type: Boolean, type: Boolean,
default: false default: false
} }
@ -108,49 +110,53 @@ const diagnosisSelect = (list: any) => {
formDate.value.diagnosisDetail = JSON.stringify(list) formDate.value.diagnosisDetail = JSON.stringify(list)
formDate.value.diagnosisSummary = diagnosisNames formDate.value.diagnosisSummary = diagnosisNames
} }
const diagnosisSearchRef= ref() const diagnosisSearchRef = ref()
const initDiagnosisSearch = (list:any,nList:any)=>{ const initDiagnosisSearch = (list: any, nList: any) => {
nextTick(()=>{ nextTick(() => {
diagnosisSearchRef.value?.init(list,nList); diagnosisSearchRef.value?.init(list, nList);
}) })
} }
const emit = defineEmits(['focus']) const emit = defineEmits(['focus'])
const focus = (e:any)=>{ const focus = (e: any) => {
emit('focus',e) emit('focus', e)
} }
const clearDiagnosis = ()=>{ const clearDiagnosis = () => {
diagnosisSearchRef.value?.clear() diagnosisSearchRef.value?.clear()
} }
defineExpose({initDiagnosisSearch,clearDiagnosis}) defineExpose({initDiagnosisSearch, clearDiagnosis})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.content { .content {
display: flex; display: flex;
.model-selector { .model-selector {
width: 100px; width: 100px;
} }
} }
.container { .container {
margin:0 24px; margin: 0 24px;
} }
:deep(.el-form-item){
:deep(.el-form-item) {
margin-bottom: 0; margin-bottom: 0;
} }
:deep(.el-form-item__label){
:deep(.el-form-item__label) {
height: 42px; height: 42px;
line-height: 42px; line-height: 42px;
} }
:deep(.el-input__wrapper){
:deep(.el-input__wrapper) {
border-radius: 0; border-radius: 0;
height: 42px; height: 42px;
background: #FFFFFF; background: #FFFFFF;
&:nth-child(2n){ border: 1px solid #EAEAEC;
border-top: none; box-shadow: 0 0 0 0 var(--el-input-border-color, var(--el-border-color)) inset;
border-bottom: none; }
} :deep(.is-disabled .el-input__wrapper){
box-shadow: 0 0 0 0 var(--el-input-border-color, var(--el-border-color)) inset;
} }
</style> </style>

View File

@ -25,7 +25,7 @@ import Panel from '@/components/common/Panel.vue';
import DiseaseDetails from './DiseaseDetails.vue'; import DiseaseDetails from './DiseaseDetails.vue';
import {post} from "@/utils/request.ts"; import {post} from "@/utils/request.ts";
import {ref} from "vue"; import {ref} from "vue";
import {formatListTime} from "../../utils/dateUtils.ts"; import {formatListTime} from "@/utils/dateUtils.ts";
const list = ref<any>([]) const list = ref<any>([])
const init = (patientId: any) => { const init = (patientId: any) => {
post("medical/record/listByPatient",{patientId:patientId}).then((res: any) => { post("medical/record/listByPatient",{patientId:patientId}).then((res: any) => {

View File

@ -19,7 +19,7 @@
<div class="panel-content" style="display: flex;flex-direction: column;height: 100%"> <div class="panel-content" style="display: flex;flex-direction: column;height: 100%">
<div class="tabs"> <div class="tabs">
<span v-for="(item,index) in statusList" :class="curStatus == item.status ? 'tabs-item' : ''" <span v-for="(item,index) in statusList" :class="curStatus == item.status ? 'tabs-item' : ''"
@click="clickTab(item)">{{ item.label }}&nbsp;{{ item.num }}</span> @click="clickTab(item)">{{ item.label }}&nbsp;({{ item.num }})</span>
</div> </div>
<div class="search"> <div class="search">
<img src="/static/images/outpatient/search.png" class="search-icon" alt="搜索图标"> <img src="/static/images/outpatient/search.png" class="search-icon" alt="搜索图标">

View File

@ -108,75 +108,10 @@ const addIdCode = ()=>{
addTraceabilityCode(selectedItem) addTraceabilityCode(selectedItem)
} }
const getGatherNumber=(item:any)=>{
let gatherNumber = 0; const emit = defineEmits(["addIdCode","addTraceabilityCode"])
for (let subItem of item.traceAbilityCodeList){
gatherNumber+=subItem.number;
}
item.gatherNumber = gatherNumber;
}
const emit = defineEmits(["addIdCode"])
const addTraceabilityCode = (item: any) => { const addTraceabilityCode = (item: any) => {
if (!item.traceAbilityCodeList) { emit("addTraceabilityCode",traceabilityCode)
item.traceAbilityCodeList = []
}
if (item.retailNumber == item.gatherNumber) {
ElMessage({
message: '采集数量已满',
type: 'warning',
})
return
}
const index = item.traceAbilityCodeList.findIndex((codeObj: any) => codeObj.code === traceabilityCode.value);
if (index == -1 && item.selectedUnit == item.packagingUnit){
item.traceAbilityCodeList.push({
code: traceabilityCode.value,
number: 1
})
traceabilityCode.value = "";
getGatherNumber(item)
emit("addIdCode")
return;
}
if (index == -1&& item.selectedUnit == item.minPackagingUnit){
let needCodeCount = item.retailNumber - item.gatherNumber;
let number = 1;
if (needCodeCount >= item.minPackagingNumber){
number = item.minPackagingNumber;
}
if (needCodeCount < item.minPackagingNumber){
number = needCodeCount;
}
item.traceAbilityCodeList.push({
code: traceabilityCode.value,
number: number
})
traceabilityCode.value = "";
getGatherNumber(item)
emit("addIdCode")
return;
}
if(item.selectedUnit == item.packagingUnit){
//
ElMessage({
message: '该追溯码已达到最大使用限制',
type: 'warning',
})
return;
}else {
//使minPackagingNumber
if (item.traceAbilityCodeList[index].number == item.minPackagingNumber) {
ElMessage({
message: '该追溯码已达到最大使用限制',
type: 'warning',
})
return;
}
item.traceAbilityCodeList[index].number += 1;
}
traceabilityCode.value = "";
getGatherNumber(item)
emit("addIdCode")
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -30,11 +30,9 @@ export const formatListTime = (date: any) => {
} else if (typeof date === 'string') { } else if (typeof date === 'string') {
dateDetail = new Date(date); dateDetail = new Date(date);
if (isNaN(dateDetail.getTime())) { if (isNaN(dateDetail.getTime())) {
console.error(`Invalid date string: ${date}`);
return '-'; return '-';
} }
} else { } else {
console.error(`Invalid date type: ${typeof date}`);
return '-'; return '-';
} }
const year = dateDetail.getFullYear(); const year = dateDetail.getFullYear();

View File

@ -1,7 +1,7 @@
<template xmlns="http://www.w3.org/1999/html"> <template xmlns="http://www.w3.org/1999/html">
<div class="container"> <div class="container">
<div class="left"> <div class="left">
<chargeQueue @clickItem="clickItem" ref="chargeQueueRef"></ChargeQueue> <chargeQueue @clickItem="clickItem" @getStatus="getStatus" ref="chargeQueueRef"></ChargeQueue>
</div> </div>
<div class="middle"> <div class="middle">
<el-scrollbar> <el-scrollbar>
@ -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,6 +30,7 @@
@change="handleChange" @change="handleChange"
clearable clearable
style="width: 100%" style="width: 100%"
:disabled="statusDisabled==1||formData.status==1"
> >
<el-option <el-option
v-for="item in doctorList" v-for="item in doctorList"
@ -46,14 +47,14 @@
</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" @edit="saveAndCharge" :status="formData.status"></TotalPrice> <TotalPrice v-model="formData.totalPrice" @save="charge" :status="formData.status" @openCheckOut ="openCheckoutDetail(formData.goodsDetail)"></TotalPrice>
</div> </div>
</el-scrollbar> </el-scrollbar>
</div> </div>
@ -66,6 +67,7 @@
</div> </div>
</div> </div>
</div> </div>
<CheckoutDetail ref="checkoutDetailRef" @confirm ="saveAndCharge"></CheckoutDetail>
<Settlement <Settlement
ref="settlementRef" ref="settlementRef"
v-model="socialCard" v-model="socialCard"
@ -86,11 +88,11 @@ import DiagnosisSearchInput from "@/components/outpatient/DiagnosisSearchInput.v
import Settlement from "@/components/charge/Settlement.vue"; import Settlement from "@/components/charge/Settlement.vue";
import TotalPrice from "@/components/charge/TotalPrice.vue"; import TotalPrice from "@/components/charge/TotalPrice.vue";
import psnCertTypes from "@/assets/config/directory/psnCertTypes.json" import psnCertTypes from "@/assets/config/directory/psnCertTypes.json"
import {getKey} from "@/utils/discrotyUtil.ts";
import antys from "@/assets/config/directory/antys.json"
import RecordsLog from "@/components/charge/RecordsLog.vue"; import RecordsLog from "@/components/charge/RecordsLog.vue";
import PatientCard from "@/components/charge/PatientCard.vue"; import PatientCard from "@/components/charge/PatientCard.vue";
import {apiConfig} from "@/assets/config/apiConfig.ts"; import {apiConfig} from "@/assets/config/apiConfig.ts";
import CheckoutDetail from "@/components/charge/CheckoutDetail.vue";
import {ElMessage} from "element-plus";
const socialCard = ref<any>({payInfo: {}}) const socialCard = ref<any>({payInfo: {}})
const formData = ref<any>({ const formData = ref<any>({
@ -98,6 +100,7 @@ const formData = ref<any>({
diagnosisMedicalRecord: {}, diagnosisMedicalRecord: {},
goodsDetail: [], goodsDetail: [],
itemDetail: [], itemDetail: [],
patientRegistration: {}
}) })
const statusDisabled = ref(0) const statusDisabled = ref(0)
const diagnosisKeyword = ref("") const diagnosisKeyword = ref("")
@ -108,6 +111,116 @@ const delDraft = () => {
}) })
} }
const settlementRef = ref() const settlementRef = ref()
const charge = () => {
if (checkTraceCode(formData.value.goodsDetail)) {
//
saveAndCharge()
} else {
//
openCheckoutDetail(formData.value.goodsDetail)
}
}
const checkTraceCode = (goodsList: any[]) => {
for (let i = 0; i < goodsList.length; i++) {
const item = goodsList[i];
if (!item.traceAbilityCodeList || item.shouldNumber != item.traceAbilityCodeList.length) {
ElMessage({
message: `${item.name}的追溯码采集未完成`,
type: 'warning',
})
return false;
}
}
return true;
}
const checkoutDetailRef = ref()
const openCheckoutDetail = (goodsList: any[]) => {
if (!goodsList || goodsList.length == 0) {
ElMessage({
message: '没有商品信息,请先选择需要售卖的商品',
type: 'info',
plain: true,
});
return
}
nextTick(() => {
checkoutDetailRef.value.init(goodsList);
})
}
const saveAndCharge = () => {
post('charge/save', {data: {...formData.value, doctorId: doctorId.value}}).then((res: any) => {
formData.value.code = res
nextTick(() => {
settlementRef.value?.init(res)
})
})
}
const diagnosisSearchRef = ref()
const diagnosisSearchApi = "social/diagnose/search"
const diagnosisShowConfig = [
{
label: "诊断名称",
prop: "name",
},
{
label: "诊断编码",
prop: "code",
}
]
const diagnosisSelect = (list: any) => {
const diagnosisNames = list.map((item: any) => item.name).join(',')
formData.value.diagnosisMedicalRecord.diagnosisDetail = JSON.stringify(list)
formData.value.diagnosisMedicalRecord.diagnosisSummary = diagnosisNames
}
const recordsConsumptionRef = ref<any>("")
const patientCardRef = ref()
const clickItem = async (item: any, status: any) => {
statusDisabled.value = status
formData.value = await post('medical/record/getByDiagnosisCode', {diagnosisCode: item.code})
//
for (let i =0;i<formData.value.goodsDetail.length;i++){
let goodsItem =formData.value.goodsDetail[i]
if (goodsItem.packagingUnit == goodsItem.selectedUnit){
goodsItem.shouldNumber = goodsItem.selectedNum;
}else {
goodsItem.shouldNumber = Math.ceil(goodsItem.selectedNum / goodsItem.minPackagingNumber);
}
goodsItem.idCode = goodsItem.idCode?.split(",")
}
getOrderTotalPrice()
nextTick(() => {
let list = JSON.parse(formData.value.diagnosisMedicalRecord.diagnosisDetail)
let nList = formData.value.diagnosisMedicalRecord.diagnosisSummary.split(',')
diagnosisSearchRef.value?.init(list, nList);
recordsConsumptionRef.value?.init(formData.value.patientInfo.id);
patientCardRef.value?.init(formData.value.registrationId);
})
}
const dockerList = ref<any[]>([])
const getDockerList = () => {
let query = {
role: 1
}
post('organization/member/search', {query: query}).then((res: any) => {
dockerList.value = res
})
}
const orderCompleted = () => {
nextTick(() => {
chargeQueueRef.value?.getOrderList()
})
}
const orderCanceled = () => {
nextTick(() => {
chargeQueueRef.value?.getOrderList()
})
const saveAndCharge = () => { const saveAndCharge = () => {
post('charge/save', {data: {...formData.value, doctorId: doctorId.value}}).then((res: any) => { post('charge/save', {data: {...formData.value, doctorId: doctorId.value}}).then((res: any) => {
formData.value.code = res formData.value.code = res
@ -138,6 +251,7 @@ const patientCardRef = ref()
const clickItem = async (item: any, status: any) => { const clickItem = async (item: any, status: any) => {
statusDisabled.value = status statusDisabled.value = status
formData.value = await post('medical/record/getByDiagnosisCode', {diagnosisCode: item.code}) formData.value = await post('medical/record/getByDiagnosisCode', {diagnosisCode: item.code})
formData.value.doctorId = formData.value.patientRegistration.organizationDoctorId
getOrderTotalPrice() getOrderTotalPrice()
nextTick(() => { nextTick(() => {
let list = JSON.parse(formData.value.diagnosisMedicalRecord.diagnosisDetail) let list = JSON.parse(formData.value.diagnosisMedicalRecord.diagnosisDetail)
@ -157,6 +271,8 @@ const getDockerList = () => {
}) })
} }
const orderCompleted = () => { const orderCompleted = () => {
getDockerList()
list()
nextTick(() => { nextTick(() => {
chargeQueueRef.value?.getOrderList() chargeQueueRef.value?.getOrderList()
}) })
@ -166,42 +282,53 @@ const orderCanceled = () => {
chargeQueueRef.value?.getOrderList() chargeQueueRef.value?.getOrderList()
}) })
} }
onMounted(() => { onMounted(() => {
getDockerList() getDockerList()
list() list()
}) })
const getOrderTotalPrice = () => { const getOrderTotalPrice = () => {
let totalPrice = 0 let totalPrice = 0
formData.value.itemDetail?.forEach((item: any) => { formData.value.itemDetail?.forEach((item: any) => {
totalPrice += item.selectedPrice * item.selectedNum totalPrice += (item.selectedPrice*100 * item.selectedNum*100)/10000
}) })
formData.value.goodsDetail.forEach((item: any) => { formData.value.goodsDetail.forEach((item: any) => {
totalPrice += item.selectedPrice * item.selectedNum totalPrice += (item.selectedPrice*100 * item.selectedNum*100)/10000
}) })
formData.value.preTotalPrice = totalPrice formData.value.preTotalPrice = totalPrice
formData.value.totalPrice = totalPrice formData.value.totalPrice = totalPrice
} }
const props = { const props = {
expandTrigger: 'hover' as const, expandTrigger: 'hover' as const,
} }
const doctorId = ref<any>('') const doctorId = ref<any>('')
const handleChange = (value: any) => { const handleChange = (value: any) => {
doctorId.value = value[value.length - 1] doctorId.value = value[value.length - 1]
} }
const cardTypeList = ref<any>(Object.entries(psnCertTypes).map(([id, name]) => ({id, name}))) const cardTypeList = ref<any>(Object.entries(psnCertTypes).map(([id, name]) => ({id, name})))
const doctorList = ref<any>([]) const doctorList = ref<any>([])
const sectionDoctorOption = ref<any>('') const sectionDoctorOption = ref<any>('')
const list = () => { const list = () => {
post(apiConfig.OrganizationMemberSearch, {query: {role: 1}}).then((res: any) => { post(apiConfig.OrganizationMemberSearch, {query: {role: 1}}).then((res: any) => {
doctorList.value = res doctorList.value = res
}) })
}
const getStatus=(status:any)=>{
statusDisabled.value = status
formData.value = {
patientInfo: {},
diagnosisMedicalRecord: {},
goodsDetail: [],
itemDetail: [],
patientRegistration: {}
}
} }
</script> </script>
@ -235,6 +362,7 @@ const list = () => {
margin-right: 24px; margin-right: 24px;
} }
.doctor { .doctor {
width: 200px; width: 200px;
} }

View File

@ -1,10 +1,10 @@
<script setup lang="ts"> <script setup lang="ts">
import Calendar from "@/components/common/Calendar.vue";
</script> </script>
<template> <template>
<Calendar /> <input type="date">
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -6,8 +6,8 @@
<div class="middle"> <div class="middle">
<el-scrollbar> <el-scrollbar>
<div class="case"> <div class="case">
<CaseDetail v-if="patientRegistration.status==3" v-model="formData"></CaseDetail> <!-- <CaseDetail v-if="patientRegistration.status==3" v-model="formData"></CaseDetail>-->
<Case ref="caseRef" v-else v-model="formData" :disabled="curRegister?.status !=2" :isShowFrom="isShowFrom" <Case ref="caseRef" v-model="formData" :disabled="curRegister?.status !=2" :isShowFrom="isShowFrom"
@focus="focus"></Case> @focus="focus"></Case>
</div> </div>
<div class="service-items"> <div class="service-items">
@ -133,6 +133,7 @@ const clickItem = (item: any) => {
formData.value = res.diagnosisMedicalRecord formData.value = res.diagnosisMedicalRecord
formData.value.goodsDetail = res.goodsDetail formData.value.goodsDetail = res.goodsDetail
formData.value.itemDetail = res.itemDetail formData.value.itemDetail = res.itemDetail
formData.value.diagType = Number(formData.value.diagType)
patientRegistration.value = res.patientRegistration patientRegistration.value = res.patientRegistration
}) })

View File

@ -9,18 +9,24 @@
</div> </div>
<div class="left-bottom"> <div class="left-bottom">
<Panel title="医生列表"> <Panel title="医生列表">
<div class="search" style="padding: 0 24px"> <div class="search" style="padding: 0 24px ;height: 42px">
<el-input v-model="keyword" placeholder="搜索医生" <el-input style="height: 100%" v-model="keyword" placeholder="搜索医生姓名"
@keydown.enter="initDoctor"></el-input> @keydown.enter="initDoctor" :prefix-icon="Search"></el-input>
</div> </div>
<div class="content_list" style="padding: 0 24px"> <div class="content_list" style="padding: 0 24px">
<div class="role_list"> <div class="role_list">
<ul> <ul>
<li v-for="(item, index) in roleList" :key="index" <li v-for="(item, index) in roleList" :key="index"
@click="openDialog(item,index)" :class="{active:isShowNum==index}" > :class="{active:isShowNum==index}">
<span class="name">{{ item.name }}</span> <span class="name">{{ item.name }}</span>
<span class="section_name">{{ item.sectionNames }}</span> <span class="section_name">{{ item.sectionNames }}</span>
<span class="btn">挂号</span> <span class="btn" @click="openDialog(item,index)"
@mouseover="isShowNum = index"
@mouseleave="isShowNum = -1">
<img v-if="isShowNum==index" src="/static/images/registration/3-active.png" style="width: 15px;height: 14px;margin-right: 8px" alt="">
<img v-else src="/static/images/registration/3.png" alt="" style="width: 15px;height: 14px;margin-right: 8px">
挂号
</span>
</li> </li>
</ul> </ul>
</div> </div>
@ -43,6 +49,10 @@
end-placeholder="结束时间" end-placeholder="结束时间"
/> />
</div> </div>
<div class="btn">
<el-button @click="reset">重置</el-button>
<el-button type="primary" @click="getPatientList">搜索</el-button>
</div>
</div> </div>
<div class="middle"> <div class="middle">
<List :patientList="patientList" @rowClick="rowClick"></List> <List :patientList="patientList" @rowClick="rowClick"></List>
@ -77,6 +87,7 @@ import {getEndOfDay, getToday, formatDateArray} from "@/utils/dateUtils.ts";
import Calendar from "@/components/common/Calendar.vue"; import Calendar from "@/components/common/Calendar.vue";
import Panel from "@/components/common/Panel.vue"; import Panel from "@/components/common/Panel.vue";
import {apiConfig} from "@/assets/config/apiConfig.ts"; import {apiConfig} from "@/assets/config/apiConfig.ts";
import {Search} from "@element-plus/icons-vue";
const isShowNum = ref(-1) const isShowNum = ref(-1)
const roleList = ref<any>([]) const roleList = ref<any>([])
@ -97,16 +108,18 @@ const initDoctor = () => {
}) })
} }
const patientList = ref<any>([]) const patientList = ref<any>([])
const selectedDate = ref<any>([getToday().start, getToday().end]) const selectedDate = ref<any>([])
const handleDateChange = (date: any[]) => { const handleDateChange = (date: any[]) => {
selectedDate.value = formatDateArray(date) selectedDate.value = formatDateArray(date)
if(selectedDate.value[0]==selectedDate.value[1]){ if (selectedDate.value[0] == selectedDate.value[1]) {
selectedDate.value[1] =getEndOfDay(selectedDate.value[1]); // 23:59 selectedDate.value[1] = getEndOfDay(selectedDate.value[1]); // 23:59
} }
getPatientList() getPatientList()
} }
const getPatientList = () => { const getPatientList = () => {
isShowNum.value = -1
id.value = null id.value = null
selectedDate.value = [getToday().start, getToday().end]
post('registration/list', { post('registration/list', {
page: page.value, page: page.value,
size: size.value, size: size.value,
@ -128,20 +141,24 @@ const id = ref<any>('')
const rowClick = (row: any) => { const rowClick = (row: any) => {
id.value = row.id id.value = row.id
nextTick(() => { nextTick(() => {
editRef.value?.init(row.organizationDoctorId,row.id) editRef.value?.init(row.organizationDoctorId, row.id)
}) })
} }
const editRef = ref<any>('') const editRef = ref<any>('')
const openDialog = (item: any,index: any) => { const openDialog = (item: any, index: any) => {
isShowNum.value=index isShowNum.value = index
nextTick(() => { nextTick(() => {
editRef.value?.init(item.id,null) editRef.value?.init(item.id, null)
}) })
} }
const close = () => { const close = () => {
id.value = null id.value = null
getPatientList() getPatientList()
} }
const reset=() =>{
keyword.value=''
getPatientList()
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container-wrapper { .container-wrapper {
@ -156,12 +173,14 @@ const close = () => {
.left { .left {
height: 100%; height: 100%;
width: 319px; width: 382px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.left-top { .left-top {
height: 380px; height: 399px;
background: #FFFFFF;
border-radius: 8px;
} }
.left-bottom { .left-bottom {
@ -177,22 +196,9 @@ const close = () => {
padding: 0 10px; padding: 0 10px;
border-radius: 5px; border-radius: 5px;
align-items: center; align-items: center;
cursor: pointer;
&:hover { &:hover {
background: #4D6DE4; background: rgba(#4D6DE4, 0.3);
.name {
color: #fff;
}
.section_name {
color: #fff;
}
.btn {
color: #fff;
}
} }
.name { .name {
@ -206,10 +212,24 @@ const close = () => {
} }
.btn { .btn {
width: 50px; cursor: pointer;
color: #b9b9ba;
padding: 5px; padding: 5px;
border-radius: 3px; width: 78px;
height: 32px;
border-radius: 6px;
background: #FFFFFF;
border: 1px solid #4D6DE4;
font-weight: bold;
font-size: 14px;
color: #4D6DE4;
font-style: normal;
display: flex;
align-items: center;
justify-content: center;
&:hover {
background: #4D6DE4;
color: #FFF;
}
} }
@ -245,6 +265,7 @@ const close = () => {
flex: 1; flex: 1;
height: 100%; height: 100%;
min-width: 0; min-width: 0;
.right-content { .right-content {
padding-left: 20px; padding-left: 20px;
display: flex; display: flex;
@ -252,7 +273,10 @@ const close = () => {
height: 100%; height: 100%;
.top { .top {
padding-right: 24px;
height: 40px; height: 40px;
display: flex;
justify-content: space-between;
} }
.middle { .middle {