|
|
|
@ -179,6 +179,22 @@
|
|
|
|
<el-button type="primary" @click="crossTimeDialogVisible = false">确定</el-button>
|
|
|
|
<el-button type="primary" @click="crossTimeDialogVisible = false">确定</el-button>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</el-dialog>
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
<el-dialog v-model="conflictDialogVisible" title="时段冲突" width="800">
|
|
|
|
|
|
|
|
<div style="display: flex; align-items: flex-start; gap: 12px;">
|
|
|
|
|
|
|
|
<el-icon style="color: #F56C6C; font-size: 24px; flex-shrink: 0; margin-top: 2px;">
|
|
|
|
|
|
|
|
<WarningFilled />
|
|
|
|
|
|
|
|
</el-icon>
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
|
|
|
<p style="margin: 0 0 12px 0; font-weight: 700;">
|
|
|
|
|
|
|
|
以下项目与当前选择的时间段存在冲突,请确认是否继续预约:
|
|
|
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
<div v-html="conflictDialogHtml"></div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<template #footer>
|
|
|
|
|
|
|
|
<el-button type="primary" @click="conflictDialogVisible = false">确定</el-button>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-dialog>
|
|
|
|
<el-dialog v-model="resultDialogVisible" title="预约结果" width="800">
|
|
|
|
<el-dialog v-model="resultDialogVisible" title="预约结果" width="800">
|
|
|
|
<div style="display: flex; align-items: flex-start; gap: 12px;">
|
|
|
|
<div style="display: flex; align-items: flex-start; gap: 12px;">
|
|
|
|
<el-icon style="color: #e6a23c; font-size: 24px; flex-shrink: 0; margin-top: 2px;">
|
|
|
|
<el-icon style="color: #e6a23c; font-size: 24px; flex-shrink: 0; margin-top: 2px;">
|
|
|
|
@ -276,6 +292,8 @@
|
|
|
|
let crossTimeDialogVisible = ref(false)
|
|
|
|
let crossTimeDialogVisible = ref(false)
|
|
|
|
let crossTimeDialogHtml = ref('')
|
|
|
|
let crossTimeDialogHtml = ref('')
|
|
|
|
let cachedCrossDialogData = ref(null) // 缓存跨时段 dialog 数据:{ html, idx }
|
|
|
|
let cachedCrossDialogData = ref(null) // 缓存跨时段 dialog 数据:{ html, idx }
|
|
|
|
|
|
|
|
let conflictDialogVisible = ref(false)
|
|
|
|
|
|
|
|
let conflictDialogHtml = ref('')
|
|
|
|
let resultDialogVisible = ref(false)
|
|
|
|
let resultDialogVisible = ref(false)
|
|
|
|
let resultDialogHtml = ref('')
|
|
|
|
let resultDialogHtml = ref('')
|
|
|
|
const getWeekday = (date1) => {
|
|
|
|
const getWeekday = (date1) => {
|
|
|
|
@ -1231,28 +1249,67 @@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const checkDaijianFuc = () => {
|
|
|
|
const checkDaijianFuc = () => {
|
|
|
|
planLoading.value = true
|
|
|
|
planLoading.value = true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取当前选中排班的时间信息
|
|
|
|
|
|
|
|
const selectedPlan = cachedPlans.value.find(p => p.id === selectedPlanId.value)
|
|
|
|
|
|
|
|
if (!selectedPlan) {
|
|
|
|
|
|
|
|
planLoading.value = false
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const planStart = selectedPlan.date + ' ' + selectedPlan.begin_time
|
|
|
|
|
|
|
|
const planEnd = selectedPlan.date + ' ' + selectedPlan.end_time
|
|
|
|
|
|
|
|
const currentRoom = selectedPlan.department_resources_name
|
|
|
|
|
|
|
|
|
|
|
|
CheckIsDaiJian({
|
|
|
|
CheckIsDaiJian({
|
|
|
|
reg_num: props.reg_num,
|
|
|
|
reg_num: props.reg_num,
|
|
|
|
planid: selectedPlanId.value
|
|
|
|
planid: selectedPlanId.value
|
|
|
|
}).then(res => {
|
|
|
|
}).then(res => {
|
|
|
|
planLoading.value = false
|
|
|
|
planLoading.value = false
|
|
|
|
if (res.status) {
|
|
|
|
let allConflicts = []
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// ① 后端返回的已预约冲突(过滤同检查室)
|
|
|
|
ElMessageBox.confirm(
|
|
|
|
if (!res.status && res.data?.conflicts) {
|
|
|
|
res.msg,
|
|
|
|
allConflicts = allConflicts.concat(
|
|
|
|
'提示', {
|
|
|
|
res.data.conflicts.filter(c => c.room_name !== currentRoom)
|
|
|
|
confirmButtonText: '确定',
|
|
|
|
|
|
|
|
cancelButtonText: '取消',
|
|
|
|
|
|
|
|
type: 'warning',
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.then(() => {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ② 前端临时匹配的冲突(过滤同检查室)
|
|
|
|
|
|
|
|
entrustTableDate.value.forEach(item => {
|
|
|
|
|
|
|
|
if (item.list_status !== 0 || !item.temp_plan_id || !item.reservation_date) return
|
|
|
|
|
|
|
|
const itemRoom = item.department_resources?.department_resources_name
|
|
|
|
|
|
|
|
if (itemRoom === currentRoom) return // 同检查室允许重叠
|
|
|
|
|
|
|
|
const itemStart = item.reservation_date + ' ' + item.period_begin_time
|
|
|
|
|
|
|
|
const itemEnd = item.reservation_date + ' ' + item.period_end_time
|
|
|
|
|
|
|
|
if (itemStart <= planEnd && planStart <= itemEnd) {
|
|
|
|
|
|
|
|
const exists = allConflicts.some(c =>
|
|
|
|
|
|
|
|
c.entrust === item.entrust && c.date === item.reservation_date
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
if (!exists) {
|
|
|
|
|
|
|
|
allConflicts.push({
|
|
|
|
|
|
|
|
entrust: item.entrust,
|
|
|
|
|
|
|
|
date: item.reservation_date,
|
|
|
|
|
|
|
|
begin_time: item.period_begin_time?.substring(0, 5),
|
|
|
|
|
|
|
|
end_time: item.period_end_time?.substring(0, 5),
|
|
|
|
|
|
|
|
room_name: item.department_resources?.department_resources_name || '',
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
.catch(() => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ③ 展示冲突(使用独立 dialog)
|
|
|
|
|
|
|
|
if (allConflicts.length > 0) {
|
|
|
|
|
|
|
|
let msg = '<table style="width:100%;border-collapse:collapse;font-size:14px;">'
|
|
|
|
|
|
|
|
msg += '<tr style="background:#f5f5f5;"><td style="padding:4px 8px;border:1px solid #ddd;font-weight:700;">序号</td><td style="padding:4px 8px;border:1px solid #ddd;font-weight:700;">项目名称</td><td style="padding:4px 8px;border:1px solid #ddd;font-weight:700;">检查室</td><td style="padding:4px 8px;border:1px solid #ddd;font-weight:700;">日期</td><td style="padding:4px 8px;border:1px solid #ddd;font-weight:700;">时间段</td></tr>'
|
|
|
|
|
|
|
|
allConflicts.forEach((c, i) => {
|
|
|
|
|
|
|
|
msg += '<tr><td style="padding:4px 8px;border:1px solid #ddd;">' + (i + 1) + '</td><td style="padding:4px 8px;border:1px solid #ddd;">' + c.entrust + '</td><td style="padding:4px 8px;border:1px solid #ddd;">' + (c.room_name || '') + '</td><td style="padding:4px 8px;border:1px solid #ddd;">' + c.date + '</td><td style="padding:4px 8px;border:1px solid #ddd;">' + c.begin_time + '-' + c.end_time + '</td></tr>'
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
msg += '</table>'
|
|
|
|
|
|
|
|
conflictDialogHtml.value = msg
|
|
|
|
|
|
|
|
conflictDialogVisible.value = true
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// 无冲突,继续预约流程
|
|
|
|
|
|
|
|
// 由调用方处理
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|