This commit is contained in:
Your Name
2026-05-06 12:19:46 +08:00
parent dddc4d202a
commit 64ab3197ec
3 changed files with 276 additions and 68 deletions
+113 -17
View File
@@ -57,6 +57,15 @@
class="pending-assign-month"
@change="onPendingAssignOrderMonthChange"
/>
<el-input
v-if="formData.pending_assign === '1'"
v-model="formData.pending_assign_keyword"
placeholder="搜身份证/诊单ID/患者号/备注…"
clearable
class="pending-assign-search"
@keyup.enter="doSearch"
@clear="doSearch"
/>
</span>
</div>
<div class="search-row">
@@ -132,6 +141,7 @@
<div class="table-wrap px-4">
<el-table
:data="pager.lists"
row-key="id"
size="default"
v-loading="pager.loading"
@selection-change="handleSelectionChange"
@@ -425,6 +435,7 @@
v-model="assignDialogVisible"
:title="assignMode === 'batch' ? '批量指派医助' : '指派医助'"
width="500px"
@closed="resetAssignDialog"
>
<el-form :model="assignForm" label-width="100px">
<el-form-item label="选择医助" required>
@@ -434,7 +445,6 @@
class="w-full"
filterable
clearable
value-key="id"
>
<el-option
v-for="item in assistantOptions"
@@ -445,7 +455,7 @@
</el-select>
</el-form-item>
<el-form-item v-if="assignMode === 'batch'" label="已选择">
<div class="text-gray-500">{{ selectedIds.length }} 条诊单记录</div>
<div class="text-gray-500">{{ batchAssignIds.length }} 条诊单记录</div>
</el-form-item>
<el-form-item v-else label="诊单信息">
<div class="text-gray-500">
@@ -721,7 +731,9 @@ const formData = reactive({
/** 顶部「已完成」Tab:至少有一条挂号记录为已完成 status=3 */
completed_appointment: '' as '' | '1',
/** 待分配医助:按业务订单创建月份筛选 YYYY-MM,空表示不限月份 */
pending_assign_order_month: '' as string
pending_assign_order_month: '' as string,
/** 待分配医助 Tab:多字段检索(后端扩展至身份证/诊单ID/备注等;不额外套数据权限) */
pending_assign_keyword: '' as string
})
const activeTab = ref('all')
@@ -756,7 +768,65 @@ const setConfirmed = (v: string) => {
fetchDateCounts()
}
/** 待分配 + 宽搜时:请求只吃分页与关键词,不带其它 Tab/日期/筛选(与 buildTcmDiagnosisListRequestPayload 一致) */
function isPendingAssignWideKeywordParams(req: Record<string, unknown>): boolean {
const pa = req.pending_assign === '1' || req.pending_assign === 1
if (!pa) {
return false
}
const k1 = String(req.pending_assign_keyword ?? '').trim()
const k2 = String(req.keyword ?? '').trim()
return k1 !== '' || k2 !== ''
}
/** 待分配宽搜:仅传分页 + pending_assign + 关键词,丢弃其余查询参数 */
function buildTcmDiagnosisListRequestPayload(req: Record<string, unknown>): Record<string, unknown> {
if (!isPendingAssignWideKeywordParams(req)) {
return req
}
const k1 = String(req.pending_assign_keyword ?? '').trim()
const k2 = String(req.keyword ?? '').trim()
const kw = k1 !== '' ? k1 : k2
return {
page_no: req.page_no,
page_size: req.page_size,
pending_assign: 1,
pending_assign_keyword: kw
}
}
const fetchTcmDiagnosisListsForPaging = (req: Record<string, unknown>) =>
tcmDiagnosisLists(buildTcmDiagnosisListRequestPayload(req) as any)
/** 宽搜提交前清理界面上的其它检索,避免 Chip 仍显示「已选」但与实际请求不一致 */
function clearSecondaryFiltersWhenPendingAssignWideSearch() {
if (formData.pending_assign !== '1') {
return
}
const kw1 = (formData.pending_assign_keyword ?? '').trim()
const kw2 = (formData.keyword ?? '').trim()
if (kw1 === '' && kw2 === '') {
return
}
formData.appointment_date = ''
formData.pending_booking = ''
formData.completed_appointment = ''
formData.diagnosis_confirmed = ''
formData.has_appointment = ''
formData.diagnosis_type = ''
formData.syndrome_type = ''
formData.assistant_id = ''
formData.start_time = ''
formData.end_time = ''
formData.pending_assign_order_month = ''
activeTab.value = 'all'
if (kw1 !== '') {
formData.keyword = ''
}
}
const doSearch = () => {
clearSecondaryFiltersWhenPendingAssignWideSearch()
pager.page = 1
getLists()
fetchDateCounts()
@@ -780,6 +850,7 @@ const pendingAssignCount = ref<number | undefined>(undefined)
const handleDateTabClick = async (value: string) => {
formData.pending_assign = ''
formData.pending_assign_order_month = ''
formData.pending_assign_keyword = ''
formData.pending_booking = ''
formData.completed_appointment = ''
formData.has_appointment = ''
@@ -793,6 +864,7 @@ const handleDateTabClick = async (value: string) => {
const handlePendingBookingTabClick = async () => {
formData.pending_assign = ''
formData.pending_assign_order_month = ''
formData.pending_assign_keyword = ''
formData.pending_booking = '1'
formData.completed_appointment = ''
formData.appointment_date = ''
@@ -806,6 +878,7 @@ const handlePendingBookingTabClick = async () => {
const handleCompletedVisitTabClick = async () => {
formData.pending_assign = ''
formData.pending_assign_order_month = ''
formData.pending_assign_keyword = ''
formData.pending_booking = ''
formData.completed_appointment = '1'
formData.has_appointment = ''
@@ -850,14 +923,16 @@ const fetchDateCounts = async () => {
tcmDiagnosisLists({ page_no: 1, page_size: 1 }),
tcmDiagnosisLists({ has_appointment: 0, page_no: 1, page_size: 1 }),
tcmDiagnosisLists({ completed_appointment: 1, page_no: 1, page_size: 1 }),
tcmDiagnosisLists({
pending_assign: 1,
page_no: 1,
page_size: 1,
...(formData.pending_assign === '1' && formData.pending_assign_order_month
? { pending_assign_order_month: formData.pending_assign_order_month }
: {})
})
tcmDiagnosisLists(
buildTcmDiagnosisListRequestPayload({
pending_assign: 1,
page_no: 1,
page_size: 1,
pending_assign_order_month: formData.pending_assign_order_month,
pending_assign_keyword: formData.pending_assign_keyword,
keyword: formData.keyword
}) as any
)
])
dateCounts.value = {
[yesterdayStr.value]: yesterday?.count ?? 0,
@@ -991,7 +1066,7 @@ const getAssistantName = (assistantId: number | string) => {
}
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: tcmDiagnosisLists,
fetchFun: fetchTcmDiagnosisListsForPaging,
params: formData
})
@@ -1010,6 +1085,7 @@ const handleReset = () => {
formData.has_appointment = ''
formData.pending_assign = ''
formData.pending_assign_order_month = ''
formData.pending_assign_keyword = ''
formData.pending_booking = ''
formData.completed_appointment = ''
pager.page = 1
@@ -1238,6 +1314,8 @@ const lastQRCodeType = ref<'video' | 'confirm'>('confirm')
// 批量指派相关
const selectedIds = ref<number[]>([])
/** 批量指派打开弹窗时的诊单 id 快照(弹窗内选医助可能触发表格重绘导致勾选丢失,提交以快照为准) */
const batchAssignIds = ref<number[]>([])
const assignDialogVisible = ref(false)
const assignLoading = ref(false)
const assignMode = ref<'batch' | 'single'>('batch')
@@ -1246,6 +1324,11 @@ const assignForm = ref({
assistant_id: null as number | null
})
function resetAssignDialog() {
batchAssignIds.value = []
assignForm.value.assistant_id = null
}
const handleSelectionChange = (selection: any[]) => {
selectedIds.value = selection.map(item => item.id)
}
@@ -1267,6 +1350,7 @@ const canBatchCancelAssign = computed(() => {
const handleSingleAssign = (row: any) => {
assignMode.value = 'single'
currentRow.value = row
batchAssignIds.value = []
// 确保类型一致,转换为数字
assignForm.value.assistant_id = row.assistant_id ? Number(row.assistant_id) : null
assignDialogVisible.value = true
@@ -1281,6 +1365,7 @@ const handleBatchAssign = () => {
assignMode.value = 'batch'
currentRow.value = null
assignForm.value.assistant_id = null
batchAssignIds.value = [...selectedIds.value]
assignDialogVisible.value = true
}
@@ -1299,15 +1384,21 @@ const handleConfirmAssign = async () => {
assistant_id: assignForm.value.assistant_id
})
} else {
// 批量指派
const promises = selectedIds.value.map(id =>
tcmDiagnosisAssign({
id,
assistant_id: assignForm.value.assistant_id
// 批量指派:使用打开弹窗时的 id 快照(避免弹窗内操作导致表格勾选被清空后提交为空)
const ids = batchAssignIds.value
if (!ids.length) {
feedback.msgWarning('没有可指派的诊单,请关闭后重新勾选')
return
}
const promises = ids.map((id) =>
tcmDiagnosisAssign({
id,
assistant_id: assignForm.value.assistant_id
})
)
await Promise.all(promises)
selectedIds.value = []
batchAssignIds.value = []
}
assignDialogVisible.value = false
@@ -1994,6 +2085,11 @@ onUnmounted(() => {
.pending-assign-month {
width: 128px;
}
.pending-assign-search {
width: 220px;
max-width: 42vw;
}
}
.search-row {
File diff suppressed because one or more lines are too long