车辆采集修改 客户删除 添加删除原因

This commit is contained in:
浅念
2025-11-18 11:03:19 +08:00
parent 7638eaf80f
commit 4281cb3740
6 changed files with 341 additions and 103 deletions
+1 -1
View File
@@ -169,7 +169,7 @@ export class commonService {
//关键字抓取车辆保存
static crawlModelCreate(params: any) {
return request.post<Api.Work.AddResponse>({
url: '/common/brand/series/crawlModelCreate',
url: '/common/brand/series/crawlKeywordCreate',
params
})
}
+27 -13
View File
@@ -57,8 +57,8 @@
<el-table-column prop="enter_user_name" label="录单人"></el-table-column>
<el-table-column prop="user_name" label="跟单人"></el-table-column>
<el-table-column prop="del_source" label="来源"></el-table-column>
<el-table-column prop="follow_last" label="上次跟进"></el-table-column>
<el-table-column prop="follow_next" label="下次跟进"></el-table-column>
<!-- <el-table-column prop="follow_last" label="上次跟进"></el-table-column> -->
<!-- <el-table-column prop="follow_next" label="下次跟进"></el-table-column> -->
<el-table-column
prop="code"
label="编号"
@@ -257,20 +257,34 @@
})
}
const delectfn = (row: any) => {
ElMessageBox.confirm('确定要删除此客户吗?删除后将无法恢复!', '提示', {
ElMessageBox.prompt('确定要删除此客户吗?请填写入删除原因!', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
inputPattern: /^(?!\s*$).+/,
inputErrorMessage: '请填写入删除原因'
}).then(async ({ value }) => {
const res = await manageService.crmCustomerDelete({
customer_id: row.id,
scene: 'force',
status_desc: value
})
ElMessage.success(res?.message || '提交成功!')
gettableList()
})
.then(async () => {
const res = await manageService.crmCustomerDelete({ customer_id: row.id, scene: 'force' })
ElMessage.success(res?.message || '提交成功!')
gettableList()
// 你可以在这里调用接口或做后续处理
})
.catch(() => {
// 用户点击了取消
})
// ElMessageBox.confirm('确定要删除此客户吗?删除后将无法恢复!', '提示', {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
// type: 'warning'
// })
// .then(async () => {
// const res = await manageService.crmCustomerDelete({ customer_id: row.id, scene: 'force' })
// ElMessage.success(res?.message || '提交成功!')
// gettableList()
// // 你可以在这里调用接口或做后续处理
// })
// .catch(() => {
// // 用户点击了取消
// })
}
const closeImageViewer = () => {
imageViewerVisible.value = false
+11 -4
View File
@@ -117,7 +117,7 @@
<el-form-item label="阿里订单号/PI号" prop="payment_apply_id">
<el-select
v-model="form.payment_apply_id"
placeholder="请选择阿里订单号/PI号"
placeholder="订单号需要与畅捷通系统保持一致"
@change="fetchOrders"
>
<el-option
@@ -167,7 +167,7 @@
</ElCol>
<ElCol :sm="24" :md="12" :lg="12">
<el-form-item label="收汇公司">
<el-select v-model="form.corp_id" placeholder="请选择收汇公司">
<el-select v-model="form.corp_id" placeholder="集团所有收款公司可选">
<el-option
v-for="item in corpOptions"
:key="item.item_value"
@@ -187,6 +187,9 @@
:value="item.id"
></el-option>
</el-select>
<el-text class="mx-12"
>当客户为公司时填写公司注册地,当客户为个人时填写个人出生地</el-text
>
</el-form-item>
</ElCol>
<ElCol :sm="24" :md="12" :lg="12">
@@ -209,7 +212,7 @@
</ElCol>
<ElCol :sm="24" :md="12" :lg="12">
<el-form-item label="汇款人">
<el-input v-model="form.remitter" placeholder="请于到账水单的汇款人名称保持一致" />
<el-input v-model="form.remitter" placeholder="汇款人为实际打款人" />
</el-form-item>
</ElCol>
<ElCol :sm="24" :md="12" :lg="12">
@@ -252,7 +255,7 @@
</ElCol>
<ElCol :sm="24" :md="24" :lg="24">
<el-form-item label="汇款行" prop="swift">
<el-input v-model="form.swift" placeholder="请填写SWIFT号" />
<el-input v-model="form.swift" placeholder="客户付款的swift" />
</el-form-item>
</ElCol>
<ElCol :sm="24" :md="24" :lg="24">
@@ -1014,4 +1017,8 @@
justify-content: center;
margin-bottom: 20px;
}
.mx-12 {
color: #e37474;
font-size: 12px;
}
</style>
+137 -35
View File
@@ -44,9 +44,7 @@
<div class="table-container boxshadow">
<div class="btntab">
<ElButton type="primary" v-ripple @click="handleAdd">新增车辆</ElButton>
<ElButton type="success" v-ripple @click="crawlKeywordfn"
>通过车系名称查找抓取车辆</ElButton
>
<ElButton type="success" v-ripple @click="crawlKeywordfn">通过关键字查找车辆</ElButton>
</div>
<ArtTable
ref="tableRef"
@@ -994,7 +992,12 @@
</template>
</ElDialog>
<!-- 关键字 车型抓取弹出框 -->
<ElDialog v-model="keywordDialogVisible" title="关键字-车型采集" width="900px" align-center>
<ElDialog
v-model="keywordDialogVisible"
title="关键字-车型采集"
:width="keywordwidth"
align-center
>
<div class="collect-models-container">
<div style="display: flex; gap: 12px">
<el-form-item label="关键字:" label-width="70px">
@@ -1011,33 +1014,91 @@
</el-form-item>
</div>
<div class="collect-models-content">
<div v-if="modelLstLoading" class="loading-container">
<ElLoading text="正在采集车型数据..." />
<div v-if="is_series == 0">
<ElRow :gutter="16">
<el-col :span="7">
<ElTable :data="keywordbrand" style="width: 100%" max-height="400">
<ElTableColumn prop="brand" label="品牌" width="100">
<template #default="scope">
<span>{{ scope.row.brand.brand_name }}</span>
</template>
</ElTableColumn>
<ElTableColumn prop="series" label="车系" width="120">
<template #default="scope">
<span>{{ scope.row.series.series_name }}</span>
</template>
</ElTableColumn>
<ElTableColumn prop="id" label="操作" width="120">
<template #default="scope">
<ElButton
type="primary"
size="small"
@click="getcrawlSeries(scope.row.series.series_name)"
>
采集车型
</ElButton>
</template>
</ElTableColumn>
</ElTable>
</el-col>
<el-col :span="17">
<ElTable
:data="modelLst"
style="width: 100%"
max-height="400"
@selection-change="handleModelSelectionChange"
>
<ElTableColumn prop="brand_name" label="品牌" width="100" />
<ElTableColumn prop="series_name" label="车系" width="120" />
<ElTableColumn
prop="title"
label="车型名称"
min-width="200"
show-overflow-tooltip
/>
<ElTableColumn prop="year" label="年款" width="80" />
<ElTableColumn prop="msrp" label="指导价" width="120">
<template #default="scope">
<span v-if="scope.row.msrp" class="price-text">
¥{{ formatPrice(scope.row.msrp) }}
</span>
<span v-else>-</span>
</template>
</ElTableColumn>
<ElTableColumn type="selection" width="55" />
</ElTable>
</el-col>
</ElRow>
</div>
<div v-else-if="!modelLst || modelLst.length === 0" class="empty-container">
<ElEmpty description="暂无车型数据" />
</div>
<div v-else class="models-table-container">
<ElTable
:data="modelLst"
style="width: 100%"
max-height="400"
@selection-change="handleModelSelectionChange"
>
<ElTableColumn type="selection" width="55" />
<ElTableColumn prop="brand_name" label="品牌" width="100" />
<ElTableColumn prop="series_name" label="车系" width="120" />
<ElTableColumn prop="title" label="车型名称" min-width="200" show-overflow-tooltip />
<ElTableColumn prop="year" label="年款" width="80" />
<ElTableColumn prop="msrp" label="指导价" width="120">
<template #default="scope">
<span v-if="scope.row.msrp" class="price-text">
¥{{ formatPrice(scope.row.msrp) }}
</span>
<span v-else>-</span>
</template>
</ElTableColumn>
</ElTable>
<div v-else>
<div v-if="modelLstLoading" class="loading-container">
<ElLoading text="正在采集车型数据..." />
</div>
<div v-else-if="!modelLst || modelLst.length === 0" class="empty-container">
<ElEmpty description="暂无车型数据" />
</div>
<div v-else class="models-table-container">
<ElTable
:data="modelLst"
style="width: 100%"
max-height="400"
@selection-change="handleModelSelectionChange"
>
<ElTableColumn type="selection" width="55" />
<ElTableColumn prop="brand_name" label="品牌" width="100" />
<ElTableColumn prop="series_name" label="车系" width="120" />
<ElTableColumn prop="title" label="车型名称" min-width="200" show-overflow-tooltip />
<ElTableColumn prop="year" label="年款" width="80" />
<ElTableColumn prop="msrp" label="指导价" width="120">
<template #default="scope">
<span v-if="scope.row.msrp" class="price-text">
¥{{ formatPrice(scope.row.msrp) }}
</span>
<span v-else>-</span>
</template>
</ElTableColumn>
</ElTable>
</div>
</div>
</div>
</div>
@@ -1062,7 +1123,8 @@
import { vehicleService } from '@/api/vehicleApi'
import { commonService } from '@/api/commonApi'
defineOptions({ name: 'AdminVehicleList' })
const keywordwidth = ref('900px')
const is_series = ref(1)
// 搜索表单
const searchForm = reactive({
keyword: '',
@@ -1307,24 +1369,36 @@
const modelLst = ref<any>([])
const modelLstLoading = ref(false)
const crawlKeywordfn = async () => {
keywordwidth.value = '900px'
is_series.value = 1
keywordDialogVisible.value = true
carkeyword.value = ''
keywordModelsData.value = {}
selectedModels.value = []
modelLst.value = []
keywordbrand.value = []
keywordModelsData.value = {}
}
const keywordclose = () => {
keywordwidth.value = '900px'
is_series.value = 1
keywordDialogVisible.value = false
carkeyword.value = ''
keywordModelsData.value = {}
selectedModels.value = []
keywordbrand.value = []
modelLst.value = []
}
const handleModelSelectionChange = (selection: any[]) => {
selectedModels.value = selection
}
const selectedModels = ref<any[]>([])
const keywordbrand = ref<any>([])
const getcarkeyword = async () => {
modelLstLoading.value = true
selectedModels.value = []
keywordbrand.value = []
modelLst.value = []
keywordModelsData.value = {}
const loading = ElLoading.service({
lock: true,
text: 'Loading',
@@ -1332,9 +1406,36 @@
})
try {
const res = await commonService.getcrawlKeyword({ keyword: carkeyword.value })
keywordModelsData.value = res
modelLst.value = res.model
console.log(modelLst.value)
is_series.value = res.is_series
if (res.is_series == 1) {
keywordwidth.value = '900px'
keywordModelsData.value = res.data[0]
modelLst.value = res.data[0].model
} else {
keywordwidth.value = '1200px'
keywordbrand.value = res.data
}
console.log(res)
} finally {
loading.close()
modelLstLoading.value = false
}
}
const getcrawlSeries = async (keyword: any) => {
modelLstLoading.value = true
selectedModels.value = []
modelLst.value = []
keywordModelsData.value = {}
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)'
})
try {
const res = await commonService.getcrawlKeyword({ keyword: keyword })
keywordModelsData.value = res.data[0]
modelLst.value = res.data[0].model
console.log(res)
} finally {
loading.close()
modelLstLoading.value = false
@@ -1346,6 +1447,7 @@
return
}
await commonService.crawlModelCreate({
series_name: keywordModelsData.value.series.series_name,
series_id: keywordModelsData.value.series.id ? keywordModelsData.value.series.id : 0,
brand_id: keywordModelsData.value.brand.id ? keywordModelsData.value.brand.id : 0,
models: selectedModels.value
+32 -14
View File
@@ -630,23 +630,41 @@
})
}
const crmdelectfn = (row: any) => {
ElMessageBox.confirm(
'确定要删除此客户吗?删除后无法恢复,若存在疑问可标记为无效用户或操作移除,将客户移除到公海!',
// ElMessageBox.confirm(
// '确定要删除此客户吗?删除后无法恢复,若存在疑问可标记为无效用户或操作移除,将客户移除到公海!',
// '提示',
// {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
// type: 'warning'
// })
// .then(async () => {
// const res = await CrmService.crmCustomerDelete({ id: row.id, scene: 'force' })
// ElMessage.success(res?.message || '提交成功!')
// gettableList()
// // 你可以在这里调用接口或做后续处理
// })
// .catch(() => {
// // 用户点击了取消
// })
ElMessageBox.prompt(
'确定要删除此客户吗?删除后无法恢复,若存在疑问可标记为无效用户或操作移除,将客户移除到公海!删除请填写入删除原因!',
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /^(?!\s*$).+/,
inputErrorMessage: '请填写入删除原因'
}
).then(async ({ value }) => {
const res = await CrmService.crmCustomerDelete({
id: row.id,
scene: 'force',
status_desc: value
})
ElMessage.success(res?.message || '提交成功!')
gettableList()
})
.then(async () => {
const res = await CrmService.crmCustomerDelete({ id: row.id, scene: 'force' })
ElMessage.success(res?.message || '提交成功!')
gettableList()
// 你可以在这里调用接口或做后续处理
})
.catch(() => {
// 用户点击了取消
})
}
// 标记无效
const reportfn = (row: any) => {
+133 -36
View File
@@ -44,9 +44,7 @@
<div class="table-container boxshadow">
<div class="btntab">
<ElButton type="primary" v-ripple @click="handleAdd">新增车辆</ElButton>
<ElButton type="success" v-ripple @click="crawlKeywordfn"
>通过车系名称查找抓取车辆</ElButton
>
<ElButton type="success" v-ripple @click="crawlKeywordfn">通过关键字查找车辆</ElButton>
</div>
<ArtTable
ref="tableRef"
@@ -993,8 +991,12 @@
</div>
</template>
</ElDialog>
<!-- 关键字 车型抓取弹出框 -->
<ElDialog v-model="keywordDialogVisible" title="关键字-车型采集" width="900px" align-center>
<ElDialog
v-model="keywordDialogVisible"
title="关键字-车型采集"
:width="keywordwidth"
align-center
>
<div class="collect-models-container">
<div style="display: flex; gap: 12px">
<el-form-item label="关键字:" label-width="70px">
@@ -1011,33 +1013,86 @@
</el-form-item>
</div>
<div class="collect-models-content">
<div v-if="modelLstLoading" class="loading-container">
<ElLoading text="正在采集车型数据..." />
<div v-if="is_series == 0">
<ElRow :gutter="16">
<el-col :span="7">
<ElTable :data="keywordbrand" style="width: 100%" max-height="400">
<ElTableColumn prop="brand" label="品牌" width="100">
<template #default="scope">
<span>{{ scope.row.brand.brand_name }}</span>
</template>
</ElTableColumn>
<ElTableColumn prop="series" label="车系" width="120">
<template #default="scope">
<span>{{ scope.row.series.series_name }}</span>
</template>
</ElTableColumn>
<ElTableColumn prop="id" label="操作" width="120">
<template #default="scope">
<ElButton
type="primary"
size="small"
@click="getcrawlSeries(scope.row.series.series_name)"
>
采集车型
</ElButton>
</template>
</ElTableColumn>
</ElTable>
</el-col>
<el-col :span="17">
<ElTable
:data="modelLst"
style="width: 100%"
max-height="400"
@selection-change="handleModelSelectionChange"
>
<ElTableColumn prop="brand_name" label="品牌" width="100" />
<ElTableColumn prop="series_name" label="车系" width="120" />
<ElTableColumn prop="title" label="车型名称" min-width="200" show-overflow-tooltip />
<ElTableColumn prop="year" label="年款" width="80" />
<ElTableColumn prop="msrp" label="指导价" width="120">
<template #default="scope">
<span v-if="scope.row.msrp" class="price-text">
¥{{ formatPrice(scope.row.msrp) }}
</span>
<span v-else>-</span>
</template>
</ElTableColumn>
<ElTableColumn type="selection" width="55" />
</ElTable>
</el-col>
</ElRow>
</div>
<div v-else-if="!modelLst || modelLst.length === 0" class="empty-container">
<ElEmpty description="暂无车型数据" />
</div>
<div v-else class="models-table-container">
<ElTable
:data="modelLst"
style="width: 100%"
max-height="400"
@selection-change="handleModelSelectionChange"
>
<ElTableColumn type="selection" width="55" />
<ElTableColumn prop="brand_name" label="品牌" width="100" />
<ElTableColumn prop="series_name" label="车系" width="120" />
<ElTableColumn prop="title" label="车型名称" min-width="200" show-overflow-tooltip />
<ElTableColumn prop="year" label="年款" width="80" />
<ElTableColumn prop="msrp" label="指导价" width="120">
<template #default="scope">
<span v-if="scope.row.msrp" class="price-text">
¥{{ formatPrice(scope.row.msrp) }}
</span>
<span v-else>-</span>
</template>
</ElTableColumn>
</ElTable>
<div v-else>
<div v-if="modelLstLoading" class="loading-container">
<ElLoading text="正在采集车型数据..." />
</div>
<div v-else-if="!modelLst || modelLst.length === 0" class="empty-container">
<ElEmpty description="暂无车型数据" />
</div>
<div v-else class="models-table-container">
<ElTable
:data="modelLst"
style="width: 100%"
max-height="400"
@selection-change="handleModelSelectionChange"
>
<ElTableColumn type="selection" width="55" />
<ElTableColumn prop="brand_name" label="品牌" width="100" />
<ElTableColumn prop="series_name" label="车系" width="120" />
<ElTableColumn prop="title" label="车型名称" min-width="200" show-overflow-tooltip />
<ElTableColumn prop="year" label="年款" width="80" />
<ElTableColumn prop="msrp" label="指导价" width="120">
<template #default="scope">
<span v-if="scope.row.msrp" class="price-text">
¥{{ formatPrice(scope.row.msrp) }}
</span>
<span v-else>-</span>
</template>
</ElTableColumn>
</ElTable>
</div>
</div>
</div>
</div>
@@ -1061,7 +1116,9 @@
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'
import { vehicleService } from '@/api/crmpc/vehicleApi'
import { commonService } from '@/api/commonApi'
defineOptions({ name: 'AdminVehicleList' })
const keywordwidth = ref('900px')
const is_series = ref(1)
defineOptions({ name: 'CrmVehicleList' })
// 搜索表单
const searchForm = reactive({
keyword: '',
@@ -1840,24 +1897,36 @@
const modelLst = ref<any>([])
const modelLstLoading = ref(false)
const crawlKeywordfn = async () => {
keywordwidth.value = '900px'
is_series.value = 1
keywordDialogVisible.value = true
carkeyword.value = ''
keywordModelsData.value = {}
selectedModels.value = []
modelLst.value = []
keywordbrand.value = []
keywordModelsData.value = {}
}
const keywordclose = () => {
keywordwidth.value = '900px'
is_series.value = 1
keywordDialogVisible.value = false
carkeyword.value = ''
keywordModelsData.value = {}
selectedModels.value = []
keywordbrand.value = []
modelLst.value = []
}
const handleModelSelectionChange = (selection: any[]) => {
selectedModels.value = selection
}
const selectedModels = ref<any[]>([])
const keywordbrand = ref<any>([])
const getcarkeyword = async () => {
modelLstLoading.value = true
selectedModels.value = []
keywordbrand.value = []
modelLst.value = []
keywordModelsData.value = {}
const loading = ElLoading.service({
lock: true,
text: 'Loading',
@@ -1865,9 +1934,36 @@
})
try {
const res = await commonService.getcrawlKeyword({ keyword: carkeyword.value })
keywordModelsData.value = res
modelLst.value = res.model
console.log(modelLst.value)
is_series.value = res.is_series
if (res.is_series == 1) {
keywordwidth.value = '900px'
keywordModelsData.value = res.data[0]
modelLst.value = res.data[0].model
} else {
keywordwidth.value = '1200px'
keywordbrand.value = res.data
}
console.log(res)
} finally {
loading.close()
modelLstLoading.value = false
}
}
const getcrawlSeries = async (keyword: any) => {
modelLstLoading.value = true
selectedModels.value = []
modelLst.value = []
keywordModelsData.value = {}
const loading = ElLoading.service({
lock: true,
text: 'Loading',
background: 'rgba(0, 0, 0, 0.7)'
})
try {
const res = await commonService.getcrawlKeyword({ keyword: keyword })
keywordModelsData.value = res.data[0]
modelLst.value = res.data[0].model
console.log(res)
} finally {
loading.close()
modelLstLoading.value = false
@@ -1879,6 +1975,7 @@
return
}
await commonService.crawlModelCreate({
series_name: keywordModelsData.value.series.series_name,
series_id: keywordModelsData.value.series.id ? keywordModelsData.value.series.id : 0,
brand_id: keywordModelsData.value.brand.id ? keywordModelsData.value.brand.id : 0,
models: selectedModels.value