2 changed files with 717 additions and 0 deletions
@ -0,0 +1,711 @@ |
|||
<template> |
|||
<div class="box"> |
|||
<div> |
|||
<div class="middlebox"> |
|||
<div class="contenttitle"> |
|||
基础资料 / |
|||
<span class="contenttitleBold">平板叫号</span> |
|||
</div> |
|||
<div class="seachinput"> |
|||
<div style="display: flex;align-items: center;"> |
|||
<div style="margin-right: 20px;"> |
|||
<span>分诊房间:</span> |
|||
<el-select |
|||
v-model="LocalConfig.doctorCheck.queueRoom" |
|||
placeholder="分诊房间" |
|||
clearable |
|||
filterable |
|||
style="width: 100px" |
|||
size="small" |
|||
> |
|||
<el-option |
|||
v-for="item in dict.room" |
|||
:key="item.id" |
|||
:label="item.displayName" |
|||
:value="item.id" |
|||
/> |
|||
</el-select> |
|||
</div> |
|||
<div style="margin-right: 20px;"> |
|||
<el-cascader |
|||
:options="dict.itemTypeTree" |
|||
v-model="LocalConfig.doctorCheck.queueItemTypeIds" |
|||
popper-class="example" |
|||
style="width: 160px" |
|||
:props="{ |
|||
checkStrictly: true, |
|||
expandTrigger: 'hover', |
|||
label: 'displayName', |
|||
value: 'id', |
|||
id: 'id', |
|||
children: 'treeChildren', |
|||
multiple: true, |
|||
}" |
|||
clearable |
|||
filterable |
|||
size="small" |
|||
collapse-tags |
|||
> |
|||
</el-cascader> |
|||
</div> |
|||
<div style="margin-right: 20px;"> |
|||
<el-button |
|||
type="primary" |
|||
class="commonbutton" |
|||
:style="[ |
|||
{ |
|||
backgroundColor: isSignIn == 'N' ? 'red' : '', |
|||
}, |
|||
]" |
|||
:disabled="isSignIn == 'Y'" |
|||
@click="btnIsSignIn('0')" |
|||
>签到</el-button |
|||
> |
|||
</div> |
|||
<div> |
|||
<el-button |
|||
type="primary" |
|||
class="commonbutton" |
|||
:disabled="isSignIn == 'N'" |
|||
@click="btnIsSignIn('1')" |
|||
>签退</el-button |
|||
> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div style="display: flex"> |
|||
<el-table |
|||
:data="waitDetail" |
|||
style="width: 100%" |
|||
border |
|||
highlight-current-row |
|||
@row-click="rowClickWait" |
|||
:row-style="{ height: '28px' }" |
|||
:height="Math.floor((tableHeight) / 3)" |
|||
> |
|||
<el-table-column |
|||
prop="queueRegisterNumber" |
|||
label="号" |
|||
min-width="30" |
|||
align="center" |
|||
/> |
|||
<el-table-column |
|||
prop="patientName" |
|||
label="姓名" |
|||
min-width="80" |
|||
align="center" |
|||
/> |
|||
<el-table-column |
|||
prop="isVip" |
|||
label="Vip" |
|||
min-width="40" |
|||
align="center" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<div style="font-family: 'Microsoft YaHei'"> |
|||
{{ scope.row.isVip == "Y" ? "√" : "" }} |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div style="margin-top: 20px"> |
|||
<div> |
|||
<el-button |
|||
type="primary" |
|||
class="commonbutton" |
|||
@click="btnCall(waitRow.queueRegisterId, '1')" |
|||
>呼叫</el-button |
|||
> |
|||
</div> |
|||
<div style="margin: 10px 0"> |
|||
<el-button |
|||
type="primary" |
|||
class="commonbutton" |
|||
@click=" |
|||
getQueueRegisterList( |
|||
LocalConfig.doctorCheck.queueRoom, |
|||
LocalConfig.doctorCheck.queueItemTypeIds |
|||
) |
|||
" |
|||
>刷新</el-button |
|||
> |
|||
</div> |
|||
<div> |
|||
<el-button |
|||
type="primary" |
|||
class="commonbutton" |
|||
@click="fnQueue" |
|||
>排队</el-button |
|||
> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div style="margin-top: 6px">已呼人员:</div> |
|||
<div style="display: flex"> |
|||
<el-table |
|||
:data="alreadyCalledDetail" |
|||
style="width: 100%" |
|||
border |
|||
highlight-current-row |
|||
@row-click="rowClickAlready" |
|||
:row-style="{ height: '28px' }" |
|||
:height="Math.floor((tableHeight) / 3)" |
|||
> |
|||
<el-table-column |
|||
prop="queueRegisterNumber" |
|||
label="号" |
|||
min-width="30" |
|||
align="center" |
|||
/> |
|||
<el-table-column |
|||
prop="patientName" |
|||
label="姓名" |
|||
min-width="80" |
|||
align="center" |
|||
/> |
|||
<el-table-column |
|||
prop="isVip" |
|||
label="Vip" |
|||
min-width="40" |
|||
align="center" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<div style="font-family: 'Microsoft YaHei'"> |
|||
{{ scope.row.isVip == "Y" ? "√" : "" }} |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div style="margin-top: 20px"> |
|||
<div> |
|||
<el-button |
|||
type="primary" |
|||
class="commonbutton" |
|||
@click="btnCall(alreadyRow, '2')" |
|||
>过号</el-button |
|||
> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div style="margin-top: 6px">过号人员:</div> |
|||
<div style="display: flex"> |
|||
<el-table |
|||
:data="overNumberDetail" |
|||
style="width: 100%" |
|||
border |
|||
highlight-current-row |
|||
@row-click="rowClickOver" |
|||
:row-style="{ height: '28px' }" |
|||
:height="Math.floor((tableHeight) / 3)" |
|||
> |
|||
<el-table-column |
|||
prop="queueRegisterNumber" |
|||
label="号" |
|||
min-width="30" |
|||
align="center" |
|||
/> |
|||
<el-table-column |
|||
prop="patientName" |
|||
label="姓名" |
|||
min-width="80" |
|||
align="center" |
|||
/> |
|||
<el-table-column |
|||
prop="isVip" |
|||
label="Vip" |
|||
min-width="40" |
|||
align="center" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<div style="font-family: 'Microsoft YaHei'"> |
|||
{{ scope.row.isVip == "Y" ? "√" : "" }} |
|||
</div> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<div style="margin-top: 20px"> |
|||
<div> |
|||
<el-button |
|||
type="primary" |
|||
class="commonbutton" |
|||
@click="btnCall(overRow, '9')" |
|||
>重呼</el-button |
|||
> |
|||
</div> |
|||
<div style="margin: 10px 0"> |
|||
<el-button |
|||
type="primary" |
|||
class="commonbutton" |
|||
@click="btnCall(overRow, '0')" |
|||
>退回</el-button |
|||
> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!--组件弹窗--> |
|||
<div> |
|||
<!-- 修改信息 --> |
|||
<el-dialog |
|||
title="分诊排队" |
|||
:visible.sync="dialogWin.queue" |
|||
width="800px" |
|||
:append-to-body="true" |
|||
:close-on-click-modal="false" |
|||
> |
|||
<Queue :refParams="queueParams" /> |
|||
</el-dialog> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import { mapState } from "vuex"; |
|||
import { getapi, postapi, putapi, deletapi } from "@/api/api"; |
|||
import { |
|||
listOrderBy, |
|||
setCheckStatusColor, |
|||
deepCopy, |
|||
tcdate |
|||
} from "../../utlis/proFunc"; |
|||
import Queue from "../../components/queue/Queue.vue"; |
|||
export default { |
|||
components: { |
|||
Queue, |
|||
}, |
|||
data() { |
|||
return { |
|||
queueParams: {}, |
|||
patientName: "", |
|||
waitDetail: [], |
|||
alreadyCalledDetail: [], |
|||
overNumberDetail: [], |
|||
|
|||
waitRow: {}, |
|||
alreadyRow: {}, |
|||
overRow: {}, |
|||
|
|||
LocalConfig: { |
|||
doctorCheck: { |
|||
// 医生诊台 |
|||
isQueue: "N", //启用分诊排队 |
|||
queueRoom: "", //默认分诊房间 |
|||
queueItemTypeIds: [], // 检查类别 |
|||
isBroadcast: "N", // 是否广播 |
|||
}, |
|||
}, |
|||
LocalConfigInit: {}, |
|||
interval: null, // 定时器句柄 |
|||
queue_refresh_interval: 15, // 叫号刷新时间间隔(秒) |
|||
|
|||
queue_play_voice_repeate_times: 2, // 语音重复播放次数 |
|||
queue_play_voice_repeate_interval: 1, // 语音重复播放时间间隔(秒) |
|||
isSignIn: "N", //是否签到 |
|||
}; |
|||
}, |
|||
|
|||
created() {}, |
|||
|
|||
//挂载完成 |
|||
mounted() { |
|||
this.fnMounted(); |
|||
}, |
|||
|
|||
destroyed() { |
|||
console.log("this.interval", JSON.stringify(this.interval)); |
|||
if (this.interval) clearInterval(this.interval); |
|||
console.log("this.interval clearInterval", JSON.stringify(this.interval)); |
|||
}, |
|||
|
|||
computed: { |
|||
...mapState([ |
|||
"window", |
|||
"dialogWin", |
|||
"dataTransOpts", |
|||
"dict", |
|||
"doctorCheck", |
|||
]), |
|||
|
|||
tableHeight() { |
|||
return this.window.pageHeight < 600 ? 330 : this.window.pageHeight - 150; |
|||
}, |
|||
}, |
|||
|
|||
methods: { |
|||
setCheckStatusColor, |
|||
|
|||
tableRowClassName({ row, rowIndex }) { |
|||
//console.log('tableRowClassName',rowIndex,row) |
|||
if (row.completeFlag === "0") { |
|||
return "danger"; //未检 |
|||
} else if (row.completeFlag === "2") { |
|||
return "info"; //弃检 |
|||
} |
|||
return ""; |
|||
}, |
|||
|
|||
async fnMounted() { |
|||
this.LocalConfigInit = deepCopy(this.LocalConfig); |
|||
let LocalConfig = window.localStorage.getItem("LocalConfig") || null; |
|||
try { |
|||
this.LocalConfig = Object.assign( |
|||
{}, |
|||
deepCopy(this.LocalConfigInit), |
|||
JSON.parse(LocalConfig) || {} |
|||
); |
|||
} catch (error) { |
|||
console.log('window.localStorage.getItem("LocalConfig")', error); |
|||
} |
|||
|
|||
if (this.LocalConfig.doctorCheck.isQueue == "Y") { |
|||
this.dictInit().then((res) => { |
|||
if (!this.LocalConfig.doctorCheck.queueRoom) { |
|||
if (res.data.length > 0) |
|||
this.LocalConfig.doctorCheck.queueRoom = res.data[0].id; |
|||
} |
|||
if (this.LocalConfig.doctorCheck.queueRoom) |
|||
this.getQueueRegisterListByRoomId( |
|||
this.LocalConfig.doctorCheck.queueRoom |
|||
); |
|||
}); |
|||
|
|||
try { |
|||
let sysParam = await postapi( |
|||
"/api/app/SysParmValue/GetSysParmValueBySysParmId", |
|||
{ sysParmId: "queue_refresh_interval" } |
|||
); |
|||
this.queue_refresh_interval = Number(sysParam.data || 15); |
|||
} catch (error) { |
|||
console.log(error); |
|||
} |
|||
|
|||
// 壳端 |
|||
if (this.$peisAPI) { |
|||
postapi("/api/app/SysParmValue/GetSysParmValueBySysParmId", { |
|||
sysParmId: "queue_play_voice_repeate_times", |
|||
}).then((res) => { |
|||
if (res.code > -1) |
|||
this.queue_play_voice_repeate_times = Number(res.data || 2); |
|||
}); |
|||
|
|||
postapi("/api/app/SysParmValue/GetSysParmValueBySysParmId", { |
|||
sysParmId: "queue_play_voice_repeate_interval", |
|||
}).then((res) => { |
|||
if (res.code > -1) |
|||
this.queue_play_voice_repeate_interval = Number(res.data || 1); |
|||
}); |
|||
} |
|||
|
|||
// 启动自动刷新 |
|||
if (!this.interval && this.queue_refresh_interval != 0) { |
|||
this.interval = setInterval(() => { |
|||
this.getQueueRegisterList( |
|||
this.LocalConfig.doctorCheck.queueRoom, |
|||
this.LocalConfig.doctorCheck.queueItemTypeIds |
|||
); |
|||
}, this.queue_refresh_interval * 1000); |
|||
} |
|||
} |
|||
}, |
|||
|
|||
btnCall(refRow, completeFlag) { |
|||
let row = Object.assign({}, refRow); |
|||
switch (completeFlag) { |
|||
case "0": // 退回 |
|||
if (!row.queueRegisterId) { |
|||
if (this.overNumberDetail.length > 0) |
|||
row = this.overNumberDetail[0]; |
|||
} |
|||
if (!row.queueRegisterId) |
|||
this.$message.warning({ |
|||
showClose: true, |
|||
message: "未可操作的数据,或未选择过号人员", |
|||
}); |
|||
break; |
|||
case "1": // 呼叫 |
|||
if (!row.queueRegisterId) { |
|||
if (this.waitDetail.length > 0){ |
|||
row = this.waitDetail[0]; |
|||
this.setQueueParams(row) |
|||
} |
|||
} |
|||
if (!row.queueRegisterId) |
|||
this.$message.warning({ |
|||
showClose: true, |
|||
message: "未可操作的数据,或未选择候诊人员", |
|||
}); |
|||
break; |
|||
case "2": // 过号 |
|||
if (!row.queueRegisterId) { |
|||
if (this.alreadyCalledDetail.length > 0) |
|||
row = this.alreadyCalledDetail[0]; |
|||
} |
|||
if (!row.queueRegisterId) |
|||
this.$message.warning({ |
|||
showClose: true, |
|||
message: "未可操作的数据,或未选择已呼人员", |
|||
}); |
|||
break; |
|||
case "9": // 重呼 |
|||
if (!row.queueRegisterId) { |
|||
if (this.overNumberDetail.length > 0) |
|||
queueRegisterId = this.overNumberDetail[0]; |
|||
} |
|||
if (!row.queueRegisterId) |
|||
this.$message.warning({ |
|||
showClose: true, |
|||
message: "未可操作的数据,或未选择过号人员", |
|||
}); |
|||
break; |
|||
} |
|||
|
|||
// "patientRegisterId": "3a143cf9-0b1b-7765-a90a-b087c4aad1b9", |
|||
// "patientRegisterNo": "003485" |
|||
// 叫号即调人员信息出来 |
|||
if (row.patientRegisterNo) { |
|||
this.dataTransOpts.tableS.patient_register.patientRegisterNo = |
|||
row.patientRegisterNo; |
|||
this.dataTransOpts.refresh.patient_register.S++; |
|||
} |
|||
|
|||
if (row.queueRegisterId && completeFlag != "9") { |
|||
postapi("/api/app/QueueRegister/UpdateQueueRegisterStatus", { |
|||
queueRegisterId: row.queueRegisterId, |
|||
completeFlag, |
|||
}).then((res) => { |
|||
if (res.code > -1) { |
|||
this.getQueueRegisterList( |
|||
this.LocalConfig.doctorCheck.queueRoom, |
|||
this.LocalConfig.doctorCheck.queueItemTypeIds |
|||
); |
|||
if (this.$peisAPI && completeFlag == "1") this.outShellCall(row); |
|||
} |
|||
}); |
|||
} else if (completeFlag == "9") { |
|||
if (this.$peisAPI) this.outShellCall(row); |
|||
} |
|||
}, |
|||
|
|||
// 调用壳呼叫 api |
|||
outShellCall(row) { |
|||
let roomName = ""; |
|||
postapi("/api/app/Room/Get", { |
|||
roomId: this.LocalConfig.doctorCheck.queueRoom, |
|||
}) |
|||
.then((res) => { |
|||
if (res.code > -1) { |
|||
roomName = res.data.displayName; |
|||
return this.$peisAPI.getIsSpeechEnable(); |
|||
} |
|||
}) |
|||
.then((res) => { |
|||
if (res == "Y") return this.$peisAPI.speechConnect(); |
|||
}) |
|||
.then((res) => { |
|||
// queue_play_voice_repeate_times: 2, // 语音重复播放次数 |
|||
// queue_play_voice_repeate_interval: 1, // 语音重复播放时间间隔(秒) |
|||
let toOutShell = { |
|||
SendText: `请${row.patientName}到${roomName}检查`, |
|||
RepatPlayNum: this.queue_play_voice_repeate_times, |
|||
Delay: this.queue_play_voice_repeate_interval, |
|||
}; |
|||
return this.$peisAPI.speechSendText(JSON.stringify(toOutShell)); |
|||
}) |
|||
.catch((err) => { |
|||
// console.log('呼叫失败', err) |
|||
this.$message.error({ showClose: true, message: err }); |
|||
}); |
|||
}, |
|||
|
|||
dictInit() { |
|||
return new Promise((resolve, reject) => { |
|||
postapi("/api/app/Room/GetList") |
|||
.then((res) => { |
|||
if (res.code > -1) { |
|||
this.dict.room = res.data; |
|||
// this.tableData = res.data.filter(e => { |
|||
// return medicalCenterId ? (e.medicalCenterId == medicalCenterId) : e |
|||
// }); |
|||
resolve(res); |
|||
} else { |
|||
reject(res.message); |
|||
} |
|||
}) |
|||
.catch((err) => { |
|||
reject(err); |
|||
}); |
|||
//体检类别 树结构 |
|||
getapi("/api/app/item-type/by-code-all").then((res) => { |
|||
if (res.code == 1) { |
|||
this.dict.itemTypeTree = res.data; |
|||
tcdate(this.dict.itemTypeTree); |
|||
} |
|||
}); |
|||
}); |
|||
}, |
|||
btnIsSignIn(signInFlag) { |
|||
postapi("/api/app/RegisterCheck/CreateDoctorSignIn", { |
|||
roomId: this.LocalConfig.doctorCheck.queueRoom, |
|||
signInFlag: signInFlag, |
|||
}).then((res) => { |
|||
if (res.code != -1) { |
|||
if (signInFlag == "0") { |
|||
this.isSignIn = "Y"; |
|||
} else { |
|||
this.isSignIn = "N"; |
|||
} |
|||
} |
|||
}); |
|||
}, |
|||
getQueueRegisterList(roomId, itemType) { |
|||
return new Promise((resolve, reject) => { |
|||
this.waitDetail = []; |
|||
this.alreadyCalledDetail = []; |
|||
this.overNumberDetail = []; |
|||
|
|||
this.waitRow = {}; |
|||
this.alreadyRow = {}; |
|||
this.overRow = {}; |
|||
|
|||
let itemTypeIds = []; |
|||
itemType.forEach((e) => { |
|||
e.forEach((item) => { |
|||
itemTypeIds.push(item); |
|||
}); |
|||
}); |
|||
|
|||
if (roomId) { |
|||
postapi("/api/app/QueueRegister/GetQueueRegisterListByRoomId", { |
|||
roomId, |
|||
itemTypeIds, |
|||
}) |
|||
.then((res) => { |
|||
if (res.code > -1) { |
|||
this.waitDetail = res.data.waitDetail; |
|||
this.alreadyCalledDetail = res.data.alreadyCalledDetail; |
|||
this.overNumberDetail = res.data.overNumberDetail; |
|||
|
|||
resolve(res); |
|||
} else { |
|||
reject(res.message); |
|||
} |
|||
}) |
|||
.catch((err) => { |
|||
reject(err); |
|||
}); |
|||
} else { |
|||
reject("请选择房间"); |
|||
} |
|||
}); |
|||
}, |
|||
|
|||
// 获取房间排队信息 ByRoomId |
|||
getQueueRegisterListByRoomId(roomId) { |
|||
if (!roomId) { |
|||
this.$message.warning({ showClose: true, message: "请选择房间" }); |
|||
return; |
|||
} |
|||
postapi("/api/app/RegisterCheck/GetDoctorIsSignIn", { |
|||
roomId: roomId, |
|||
}).then((res) => { |
|||
this.isSignIn = res.data.isSignIn; |
|||
}); |
|||
this.getQueueRegisterList( |
|||
roomId, |
|||
this.LocalConfig.doctorCheck.queueItemTypeIds |
|||
); |
|||
}, |
|||
|
|||
// 获取房间排队信息 ByRoomId |
|||
getQueueRegisterListByItemTypeIds(itemTypeIds) { |
|||
if (this.LocalConfig.doctorCheck.queueRoom) { |
|||
this.getQueueRegisterList( |
|||
this.LocalConfig.doctorCheck.queueRoom, |
|||
itemTypeIds |
|||
); |
|||
} |
|||
}, |
|||
|
|||
setQueueParams(row) { |
|||
this.queueParams.patientRegisterId =row.patientRegisterId |
|||
}, |
|||
|
|||
// 分诊排队 |
|||
fnQueue() { |
|||
if (!this.queueParams.patientRegisterId) { |
|||
this.$message.warning({ showClose: true, message: "未获取到人员信息" }); |
|||
return; |
|||
} |
|||
|
|||
this.queueParams = { |
|||
patientRegisterId: this.queueParams.patientRegisterId, |
|||
}; |
|||
this.dataTransOpts.plus.queue++; |
|||
this.dialogWin.queue = true; |
|||
}, |
|||
|
|||
// 选择候诊人员 |
|||
rowClickWait(row) { |
|||
this.waitRow = row; |
|||
this.setQueueParams(row) |
|||
}, |
|||
|
|||
// 选择过号人员 |
|||
rowClickAlready(row) { |
|||
this.alreadyRow = row; |
|||
this.setQueueParams(row) |
|||
}, |
|||
|
|||
// 选择过号人员 |
|||
rowClickOver(row) { |
|||
this.overRow = row; |
|||
this.setQueueParams(row) |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
<style scoped> |
|||
@import "../../assets/css/global_button.css"; |
|||
@import "../../assets/css/global_dialog.css"; |
|||
@import "../../assets/css/global_table.css"; |
|||
@import "../../assets/css/global_form.css"; |
|||
@import "../../assets/css/global_input.css"; |
|||
@import "../../assets/css/global.css"; |
|||
|
|||
.mainleftbox { |
|||
flex: 1; |
|||
} |
|||
|
|||
.Selectbutton { |
|||
margin: 0 20px; |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
|
|||
.mainbox { |
|||
display: flex; |
|||
justify-content: center; |
|||
margin-top: 5px; |
|||
} |
|||
|
|||
.box { |
|||
display: flex; |
|||
flex-direction: column; |
|||
} |
|||
::v-deep .el-collapse-item__header { |
|||
height: 32px; |
|||
line-height: 32px; |
|||
background-color: #f4f8ff; |
|||
color: #303133; |
|||
cursor: pointer; |
|||
font-size: 14px; |
|||
font-weight: 700; |
|||
text-align: center; |
|||
padding: 0 0 0 50px; |
|||
} |
|||
</style> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue