From 3879cdc7ef6e60037041e920ccd48be5af8b4809 Mon Sep 17 00:00:00 2001 From: v6ole Date: Sun, 12 Jul 2026 18:29:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E8=AE=A1=E5=88=92/=E5=95=86=E6=9C=BA=E8=B7=9F?= =?UTF-8?q?=E5=8D=95/=E8=A6=81=E5=AE=A2=E6=8B=9C=E8=AE=BF=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=BF=AB=E9=80=9F=E6=96=B0=E5=BB=BA=E5=AE=A2=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三个移动端表单现均支持搜索时直接新建客户(el-select #empty 插槽) Co-Authored-By: Claude --- frontend/src/views/mobile/KeyVisitForm.vue | 35 ++++++++++++++++++- .../src/views/mobile/MiniBusinessForm.vue | 35 ++++++++++++++++++- frontend/src/views/mobile/WorkPlanForm.vue | 35 ++++++++++++++++++- 3 files changed, 102 insertions(+), 3 deletions(-) diff --git a/frontend/src/views/mobile/KeyVisitForm.vue b/frontend/src/views/mobile/KeyVisitForm.vue index 6a31fdb..7b182fd 100644 --- a/frontend/src/views/mobile/KeyVisitForm.vue +++ b/frontend/src/views/mobile/KeyVisitForm.vue @@ -42,6 +42,8 @@ onMounted(async () => { } }) +const customerSearch = ref('') + async function loadCustomers(q?: string) { try { const params: any = { page_size: 100 } @@ -51,6 +53,28 @@ async function loadCustomers(q?: string) { } catch (_) {} } +async function handleCustomerSearch(query: string) { + customerSearch.value = query + if (query) { await loadCustomers(query) } + else { await loadCustomers() } +} + +async function handleQuickCreate() { + const name = customerSearch.value.trim() + if (!name) { ElMessage.warning('请输入单位名称'); return } + try { + const res = await api.post('/customers/quick-create', null, { params: { name } }) + const newCust = res.data + customers.value.unshift(newCust) + form.value.customer_id = newCust.id + customerSearch.value = '' + ElMessage.success(`已创建客户:${name}`) + await loadCustomers() + } catch (e: any) { + ElMessage.error('创建失败: ' + (e.response?.data?.detail || e.message)) + } +} + async function loadUsers() { try { const res = await api.get('/users/') @@ -90,8 +114,14 @@ async function handleSubmit() { - + + @@ -245,4 +275,7 @@ async function handleSubmit() { animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } +.quick-create-btn { display: inline-flex; align-items: center; gap: 4px; background: none; border: 1px dashed var(--gold); padding: 8px 14px; color: var(--gold-dark); font-family: var(--font-body); font-size: 13px; cursor: pointer; transition: all 0.2s; letter-spacing: 0.03em; } +.quick-create-btn:hover { border-color: var(--vermilion); color: var(--vermilion); background: rgba(184,71,46,0.03); } +.select-empty-create { padding: 8px 12px; text-align: center; } diff --git a/frontend/src/views/mobile/MiniBusinessForm.vue b/frontend/src/views/mobile/MiniBusinessForm.vue index 457ab83..db62702 100644 --- a/frontend/src/views/mobile/MiniBusinessForm.vue +++ b/frontend/src/views/mobile/MiniBusinessForm.vue @@ -30,6 +30,8 @@ onMounted(() => { } }) +const customerSearch = ref('') + async function loadCustomers(q?: string) { try { const params: any = { page_size: 100 } @@ -39,6 +41,28 @@ async function loadCustomers(q?: string) { } catch (_) {} } +async function handleCustomerSearch(query: string) { + customerSearch.value = query + if (query) { await loadCustomers(query) } + else { await loadCustomers() } +} + +async function handleQuickCreate() { + const name = customerSearch.value.trim() + if (!name) { ElMessage.warning('请输入单位名称'); return } + try { + const res = await api.post('/customers/quick-create', null, { params: { name } }) + const newCust = res.data + customers.value.unshift(newCust) + form.value.customer_id = newCust.id + customerSearch.value = '' + ElMessage.success(`已创建客户:${name}`) + await loadCustomers() + } catch (e: any) { + ElMessage.error('创建失败: ' + (e.response?.data?.detail || e.message)) + } +} + async function handleSubmit() { if (!form.value.customer_id) { ElMessage.warning('请选择客户'); return } submitLoading.value = true @@ -71,8 +95,14 @@ async function handleSubmit() { - + + @@ -184,4 +214,7 @@ async function handleSubmit() { animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } +.quick-create-btn { display: inline-flex; align-items: center; gap: 4px; background: none; border: 1px dashed var(--gold); padding: 8px 14px; color: var(--gold-dark); font-family: var(--font-body); font-size: 13px; cursor: pointer; transition: all 0.2s; letter-spacing: 0.03em; } +.quick-create-btn:hover { border-color: var(--vermilion); color: var(--vermilion); background: rgba(184,71,46,0.03); } +.select-empty-create { padding: 8px 12px; text-align: center; } diff --git a/frontend/src/views/mobile/WorkPlanForm.vue b/frontend/src/views/mobile/WorkPlanForm.vue index e9d8a43..6c2581f 100644 --- a/frontend/src/views/mobile/WorkPlanForm.vue +++ b/frontend/src/views/mobile/WorkPlanForm.vue @@ -29,6 +29,8 @@ onMounted(() => { } }) +const customerSearch = ref('') + async function loadCustomers(q?: string) { try { const params: any = { page_size: 100 } @@ -38,6 +40,28 @@ async function loadCustomers(q?: string) { } catch (_) {} } +async function handleCustomerSearch(query: string) { + customerSearch.value = query + if (query) { await loadCustomers(query) } + else { await loadCustomers() } +} + +async function handleQuickCreate() { + const name = customerSearch.value.trim() + if (!name) { ElMessage.warning('请输入单位名称'); return } + try { + const res = await api.post('/customers/quick-create', null, { params: { name } }) + const newCust = res.data + customers.value.unshift(newCust) + form.value.customer_id = newCust.id + customerSearch.value = '' + ElMessage.success(`已创建客户:${name}`) + await loadCustomers() + } catch (e: any) { + ElMessage.error('创建失败: ' + (e.response?.data?.detail || e.message)) + } +} + async function handleSubmit() { if (!form.value.customer_id) { ElMessage.warning('请选择客户'); return } submitLoading.value = true @@ -70,8 +94,14 @@ async function handleSubmit() { - + + @@ -164,4 +194,7 @@ async function handleSubmit() { animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } +.quick-create-btn { display: inline-flex; align-items: center; gap: 4px; background: none; border: 1px dashed var(--gold); padding: 8px 14px; color: var(--gold-dark); font-family: var(--font-body); font-size: 13px; cursor: pointer; transition: all 0.2s; letter-spacing: 0.03em; } +.quick-create-btn:hover { border-color: var(--vermilion); color: var(--vermilion); background: rgba(184,71,46,0.03); } +.select-empty-create { padding: 8px 12px; text-align: center; }