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; }