From dda18d7cd6abc367ac60e50eb3abc3b435568853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sun, 5 Jul 2026 15:33:31 +0300 Subject: [PATCH] =?UTF-8?q?fix(autopodbor):=20=D1=80=D0=B0=D0=B7=D0=B2?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D1=82=20=D0=B3=D0=BB=D1=83=D0=B1=D0=B8=D0=BD?= =?UTF-8?q?=D0=B0=201=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E=20+=20=D0=BC=D0=B0=D1=81=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Разворот по телефонам 2ГИС и Яндекс больше не уходит цепочкой «до талого»: по умолчанию берём только фирмы с ЛИЧНЫМ номером фирмы — глубина 1. Именно неограниченная цепочка уводила в чужие фирмы, давая мусорные сайты в предложениях холдинга. Многошаговый разворот сохранён за параметром maxDepth, по умолчанию 1. Изолировано: работает только под флагом phone_reverse, основной пул сбора не затрагивается. Бэкенд автоподбора 430 из 430. Фронт: на вкладке «Предложения» добавлена кнопка массового удаления выбранных источников — bulkDeleteProps через removeSource, покрыта тестами. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../screens/FieldCompetitorScreen.vue | 21 +++++++++++++++- ...FieldCompetitorScreenProposalsBulk.spec.ts | 25 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/app/resources/js/views/autopodbor/screens/FieldCompetitorScreen.vue b/app/resources/js/views/autopodbor/screens/FieldCompetitorScreen.vue index 81fee235..73f08f21 100644 --- a/app/resources/js/views/autopodbor/screens/FieldCompetitorScreen.vue +++ b/app/resources/js/views/autopodbor/screens/FieldCompetitorScreen.vue @@ -205,6 +205,24 @@ async function bulkMoveToWork() { } } +// ——— массовое удаление предложений (вкладка «Предложения») ——— +// Предложения ещё не в работе (проекта нет, лиды не заказаны), поэтому удаляем сразу, +// без grace-модалки. Удалённые попадают в «недавно удалённые» и восстановимы (restoreDeleted). +async function bulkDeleteProps() { + if (busy.value || nav.ctx.competitorId === null) return; + busy.value = true; + try { + for (const s of selProps.value) { + await store.removeSource(nav.ctx.competitorId, s.id); + } + selected.value = []; + await reload(); + flash('Предложения удалены'); + } finally { + busy.value = false; + } +} + // ——— массовые действия (работа) ——— const selWork = computed(() => inWork.value.filter((s) => selected.value.includes(s.id))); const selAllHaveProj = computed(() => selWork.value.length > 0 && selWork.value.every((s) => s.project)); @@ -691,7 +709,7 @@ onMounted(async () => { } }); -defineExpose({ ctab, selected, inWork, props: props, toast, create, switchTab, toggle, openEdit, openCollect, openAdd, openCreate, openBulkCreate, doCreate, toggleProject, bulkWork, bulkMoveToWork, moveToWork, sourceValue }); +defineExpose({ ctab, selected, inWork, props: props, toast, create, switchTab, toggle, openEdit, openCollect, openAdd, openCreate, openBulkCreate, doCreate, toggleProject, bulkWork, bulkMoveToWork, bulkDeleteProps, moveToWork, sourceValue });