|
@@ -18,11 +18,34 @@
|
|
|
</el-input>
|
|
|
</div>
|
|
|
<el-tab-pane label="亚马逊受众" name="audience">
|
|
|
- <div class="el-row align-center-bottom" style="flex-wrap: nowrap">
|
|
|
- <el-select v-model="audienceType" style="width: 140px; margin-right: 10px">
|
|
|
- <el-option v-for="item in audienceTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
- </el-select>
|
|
|
- <el-input v-model="keywordInput" placeholder="请输入关键词进行过滤"></el-input>
|
|
|
+ <div>
|
|
|
+ <div style="display: flex">
|
|
|
+ <el-select v-model="audienceType" @change="handleSearchChange" style="width: 140px; margin-right: 10px">
|
|
|
+ <el-option v-for="item in audienceTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
|
|
|
+ </el-select>
|
|
|
+ <el-input v-model="keywordInput" @change="handleSearchChange" placeholder="请输入关键词进行过滤"></el-input>
|
|
|
+ </div>
|
|
|
+ <hr style="margin-top: 5px" />
|
|
|
+ <el-table
|
|
|
+ :data="searchData"
|
|
|
+ :row-key="(item) => item.audienceId"
|
|
|
+ :show-header="false"
|
|
|
+ v-loading="searchLoading"
|
|
|
+ height="550"
|
|
|
+ style="width: 100%">
|
|
|
+ <el-table-column prop="date" label="Date">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <div style="font-weight: 500; color: #000">{{ row.category }}</div>
|
|
|
+ <div style="white-space: nowrap; text-overflow: ellipsis; overflow: hidden">{{ row.audienceName }}</div>
|
|
|
+ <div style="color: rgba(0, 0, 0, 0.45)">预估人数: {{ row.lowerBoundInclusive }} - {{ row.upperBoundExclusive }}</div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="opotion" label="option" width="80">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button type="primary" size="small" link @click="handleAddButtonClick(row)">添加</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
</div>
|
|
|
</el-tab-pane>
|
|
|
<el-tab-pane label="浏览再营销" name="views">
|
|
@@ -35,10 +58,23 @@
|
|
|
</el-select>
|
|
|
</div>
|
|
|
<el-tab-pane label="建议" name="advice">
|
|
|
- <div style="height: 450px"></div>
|
|
|
+ <div style="height: 450px">
|
|
|
+ <div>动态细分</div>
|
|
|
+ <hr style="margin: 5px 0" />
|
|
|
+ <div>
|
|
|
+ <div style="display: flex; justify-content: space-between">
|
|
|
+ <div>推广商品</div>
|
|
|
+ <el-button type="primary" size="small" link @click="addPromoteProduct">添加</el-button>
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; justify-content: space-between">
|
|
|
+ <div>与推广商品类似的商品</div>
|
|
|
+ <el-button type="primary" size="small" link @click="addPromoteSimilar">添加</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</el-tab-pane>
|
|
|
<el-tab-pane label="搜索" name="search">
|
|
|
- <BrowseSearch @add-to-table="handleAddToTable" @form-submitted="handleFormSubmitted"></BrowseSearch>
|
|
|
+ <BrowseSearch @add-to-table="browseOrientation" @form-submitted="browseRefine"></BrowseSearch>
|
|
|
</el-tab-pane>
|
|
|
</el-tabs>
|
|
|
</el-tab-pane>
|
|
@@ -55,7 +91,7 @@
|
|
|
<div style="height: 450px"></div>
|
|
|
</el-tab-pane>
|
|
|
<el-tab-pane label="搜索" name="search">
|
|
|
- <BuySearch @add-to-table="handleAddToTable" @form-submitted="handleFormSubmitted"></BuySearch>
|
|
|
+ <BuySearch @add-to-table="buyOrientation" @form-submitted="buyRefine"></BuySearch>
|
|
|
</el-tab-pane>
|
|
|
</el-tabs>
|
|
|
</el-tab-pane>
|
|
@@ -72,25 +108,33 @@
|
|
|
<el-table :data="addedTableData" :header-cell-style="changeTableHeader" height="600" style="width: 100%">
|
|
|
<el-table-column prop="date" label="商品">
|
|
|
<template #default="{ row }">
|
|
|
- <div>浏览再营销</div>
|
|
|
- <div>
|
|
|
+ <div v-if="row.cna || row.dialogTitle">浏览再营销</div>
|
|
|
+ <div v-if="row.cna || row.dialogTitle">
|
|
|
分类: <span style="color: black">{{ row.cna ? row.cna : row.dialogTitle }}</span>
|
|
|
</div>
|
|
|
- <div v-if="row.prices">
|
|
|
- 商品价格: <span style="color: black">{{ row.prices ? row.prices : '--' }}</span>
|
|
|
+ <div v-if="row.low_prices || row.high_prices">
|
|
|
+ 商品价格: <span style="color: black">{{ row.low_prices ? row.low_prices : '--' }}</span>
|
|
|
+ <span style="color: black">{{ row.high_prices ? row.high_prices : '--' }}</span>
|
|
|
</div>
|
|
|
<div v-if="row.delivery">
|
|
|
配送:
|
|
|
- <span style="color: black">{{ row.delivery ? (row.delivery === 'eligible' ? '具备Prime资格' : '不具备Prime资格') : '--' }}</span>
|
|
|
+ <span style="color: black">{{ row.delivery ? row.delivery: '--' }}</span>
|
|
|
</div>
|
|
|
- <div>
|
|
|
- 回溯期: <span style="color: black">{{ row.lookBack ? row.lookBack : '--' }}</span>
|
|
|
+ <div v-if="row.lookback">
|
|
|
+ 回溯期: <span style="color: black">{{ row.lookback ? row.lookback : '--' }}</span>
|
|
|
+ </div>
|
|
|
+ <div v-if="row.audienceName">
|
|
|
+ <div style="font-weight: 500; color: #000">{{ row.category }}</div>
|
|
|
+ <el-tooltip class="box-item" effect="dark" :content="row.audienceName" placement="top">
|
|
|
+ <div style="white-space: nowrap; text-overflow: ellipsis; overflow: hidden">{{ row.audienceName }}</div>
|
|
|
+ </el-tooltip>
|
|
|
+ <div style="color: rgba(0, 0, 0, 0.45)">预估人数: {{ row.lowerBoundInclusive }} - {{ row.upperBoundExclusive }}</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="name" label="竞价" width="160">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-model.number="bid">
|
|
|
+ <el-input v-model.number="row.bid">
|
|
|
<template #prepend>$</template>
|
|
|
</el-input>
|
|
|
</template>
|
|
@@ -122,6 +166,7 @@ import { request } from '/@/utils/service'
|
|
|
import BrowseSearch from './BrowseSearch.vue'
|
|
|
import BuySearch from './BuySearch.vue'
|
|
|
import { ElMessage, type FormInstance, type FormRules, type TabsPaneContext } from 'element-plus'
|
|
|
+import { getAudiencesList } from '../api/index'
|
|
|
import { useShopInfo } from '/@/stores/shopInfo'
|
|
|
import { storeToRefs } from 'pinia'
|
|
|
|
|
@@ -162,26 +207,26 @@ watch(
|
|
|
)
|
|
|
|
|
|
// 亚马逊受众tab的 下拉框和输入框
|
|
|
-const audienceType = ref('1')
|
|
|
+const audienceType = ref('')
|
|
|
const audienceTypeOptions = [
|
|
|
{
|
|
|
- value: '1',
|
|
|
+ value: '',
|
|
|
label: '所有受众',
|
|
|
},
|
|
|
{
|
|
|
- value: '2',
|
|
|
+ value: 'Lifestyle',
|
|
|
label: '生活方式',
|
|
|
},
|
|
|
{
|
|
|
- value: '3',
|
|
|
+ value: 'Interest',
|
|
|
label: '兴趣',
|
|
|
},
|
|
|
{
|
|
|
- value: '4',
|
|
|
+ value: 'Life event',
|
|
|
label: '生活事件',
|
|
|
},
|
|
|
{
|
|
|
- value: '5',
|
|
|
+ value: 'In-market',
|
|
|
label: '场内客群',
|
|
|
},
|
|
|
]
|
|
@@ -243,11 +288,35 @@ const purchasesLookBackOptions = [
|
|
|
// 已添加的表格数据
|
|
|
const addedTableData = ref([])
|
|
|
|
|
|
-function handleAddToTable(data) {
|
|
|
- // 检查该数据是否已经存在于 addedTableData 中
|
|
|
+function browseOrientation(data) {
|
|
|
+ const exists = addedTableData.value.some((item) => item.cid === data.cid)
|
|
|
+ if (!exists) {
|
|
|
+ const dataWithLookback = {
|
|
|
+ type: 'c',
|
|
|
+ tactictype: 'views',
|
|
|
+ lookback: viewsLookBack.value,
|
|
|
+ bid: bid.value,
|
|
|
+ classificationId: data.cid
|
|
|
+ }
|
|
|
+ console.log('dataWithLookback', dataWithLookback)
|
|
|
+ addedTableData.value.push(dataWithLookback)
|
|
|
+ } else {
|
|
|
+ ElMessage({
|
|
|
+ message: '请勿重复添加',
|
|
|
+ type: 'warning',
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function buyOrientation(data) {
|
|
|
const exists = addedTableData.value.some((item) => item.cid === data.cid)
|
|
|
if (!exists) {
|
|
|
- addedTableData.value.push(data)
|
|
|
+ const dataWithLookback = {
|
|
|
+ ...data,
|
|
|
+ lookback: viewsLookBack.value,
|
|
|
+ }
|
|
|
+ console.log('dataWithLookback', dataWithLookback)
|
|
|
+ addedTableData.value.push(dataWithLookback)
|
|
|
} else {
|
|
|
ElMessage({
|
|
|
message: '请勿重复添加',
|
|
@@ -257,22 +326,63 @@ function handleAddToTable(data) {
|
|
|
}
|
|
|
|
|
|
// 点击细化后弹窗确认触发
|
|
|
-function handleFormSubmitted(data) {
|
|
|
+const deliveryMap = {
|
|
|
+ eligible: '具备Prime资格',
|
|
|
+ diseligible: '不具备Prime资格',
|
|
|
+ all: '所有',
|
|
|
+}
|
|
|
+
|
|
|
+function browseRefine(data) {
|
|
|
+ const exists = addedTableData.value.some((item) => item.cid === data.cid)
|
|
|
+
|
|
|
+ if (!exists) {
|
|
|
+ console.log('data', data)
|
|
|
+ const tableRow = {
|
|
|
+ type: 'c',
|
|
|
+ tactictype: 'views',
|
|
|
+ lookback: viewsLookBack.value,
|
|
|
+ bid: bid.value,
|
|
|
+ brandId: data.selectedBrands,
|
|
|
+ classificationId: data.cid,
|
|
|
+ delivery: data.delivery,
|
|
|
+ // categoryId: data.categoryId,
|
|
|
+ dialogTitle: data.dialogTitle, // 分类名称
|
|
|
+ low_prices: data.prices.lowest,
|
|
|
+ high_prices: data.prices.highest,
|
|
|
+ low_rating: data.starRating[0],
|
|
|
+ high_rating: data.starRating[1],
|
|
|
+ }
|
|
|
+ addedTableData.value.push(tableRow) // 添加到表格数据
|
|
|
+ console.log('tableRow', tableRow)
|
|
|
+ } else {
|
|
|
+ ElMessage({
|
|
|
+ message: '请勿重复添加',
|
|
|
+ type: 'warning',
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function buyRefine(data) {
|
|
|
const exists = addedTableData.value.some((item) => item.cid === data.cid)
|
|
|
|
|
|
if (!exists) {
|
|
|
// addedTableData.value.push(data)
|
|
|
- const deliveryText = data.delivery === 'eligible' ? '具备Prime资格' : data.delivery === 'diseligible' ? '不具备Prime资格' : '所有'
|
|
|
+ const deliveryText = deliveryMap[data.delivery]
|
|
|
|
|
|
const tableRow = {
|
|
|
+ type: 'c',
|
|
|
+ tactictype: 'views',
|
|
|
+ lookback: viewsLookBack.value,
|
|
|
+ bid: bid.value,
|
|
|
+ brandId: data.brandId,
|
|
|
+ classificationId: data.cid,
|
|
|
+ delivery: data.delivery,
|
|
|
categoryId: data.categoryId,
|
|
|
dialogTitle: data.dialogTitle, // 分类名称
|
|
|
prices: `\$${data.prices.lowest} ~ \$${data.prices.highest}`, // 价格范围
|
|
|
- delivery: deliveryText, // 配送选项
|
|
|
// 其他需要的字段...
|
|
|
}
|
|
|
addedTableData.value.push(tableRow) // 添加到表格数据
|
|
|
- console.log('data', data)
|
|
|
} else {
|
|
|
ElMessage({
|
|
|
message: '请勿重复添加',
|
|
@@ -281,29 +391,104 @@ function handleFormSubmitted(data) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 获取搜索的数据
|
|
|
+const searchLoading = ref(false)
|
|
|
+const searchData = ref([])
|
|
|
+const categoryMap = {
|
|
|
+ Lifestyle: '生活方式',
|
|
|
+ 'In-market': '场内客群',
|
|
|
+ Interest: '兴趣',
|
|
|
+ 'Life event': '生活事件',
|
|
|
+}
|
|
|
+
|
|
|
+function handleSearchChange() {
|
|
|
+ getCustomData()
|
|
|
+}
|
|
|
+
|
|
|
+async function getCustomData() {
|
|
|
+ searchLoading.value = true
|
|
|
+ const query = {
|
|
|
+ profile_id: profile.value.profile_id,
|
|
|
+ categoryvalues: audienceType.value,
|
|
|
+ values: keywordInput.value,
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ const response = await getAudiencesList(query)
|
|
|
+ searchData.value = response.data.audiences.map((audience) => ({
|
|
|
+ ...audience,
|
|
|
+ category: categoryMap[audience.category] || audience.category,
|
|
|
+ }))
|
|
|
+ } catch (error) {
|
|
|
+ console.error('error: ', error)
|
|
|
+ } finally {
|
|
|
+ searchLoading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function handleAddButtonClick(row) {
|
|
|
+ // 检查该行数据是否已经存在于 addedTableData 中
|
|
|
+ const exists = addedTableData.value.some((item) => item.audienceId === row.audienceId)
|
|
|
+ if (!exists) {
|
|
|
+ // 如果不存在,则添加它到 addedTableData
|
|
|
+ addedTableData.value.push(row)
|
|
|
+ } else {
|
|
|
+ // 如果已存在,显示一个警告消息
|
|
|
+ ElMessage({
|
|
|
+ message: `选项 ${row.audienceName} 已经添加,不能重复添加`,
|
|
|
+ type: 'warning',
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// 删除所有Table数据
|
|
|
function handleDeleteAll() {
|
|
|
addedTableData.value = []
|
|
|
}
|
|
|
|
|
|
-// 操作列按钮功能
|
|
|
+// 单独删除功能
|
|
|
function handleButtonClick(row) {
|
|
|
- addedTableData.value = addedTableData.value.filter((item) => item.cid !== row.cid)
|
|
|
+ if ('cid' in row) {
|
|
|
+ // 如果行数据包含 cid 属性,使用 cid 来过滤
|
|
|
+ addedTableData.value = addedTableData.value.filter((item) => item.cid !== row.cid)
|
|
|
+ } else if ('audienceId' in row) {
|
|
|
+ addedTableData.value = addedTableData.value.filter((item) => item.audienceId !== row.audienceId)
|
|
|
+ } else if ('categoryId' in row) {
|
|
|
+ addedTableData.value = addedTableData.value.filter((item) => item.cid !== row.cid)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-// 点击保存触发
|
|
|
-function handleSave() {
|
|
|
- createPromote()
|
|
|
+function addPromoteProduct() {
|
|
|
+ const newProduct = {
|
|
|
+ type: 'p',
|
|
|
+ tactictype: 'purchases',
|
|
|
+ lookback: viewsLookBack.value,
|
|
|
+ asin: '',
|
|
|
+ bid: 0.2,
|
|
|
+ productType: 'relatedProduct',
|
|
|
+ }
|
|
|
+ // 例如 type, tactictype, productType 等字段来判断
|
|
|
+ const exists = addedTableData.value.some(
|
|
|
+ (item) => item.type === newProduct.type && item.tactictype === newProduct.tactictype && item.productType === newProduct.productType
|
|
|
+ )
|
|
|
+
|
|
|
+ if (!exists) {
|
|
|
+ // 如果不存在,则添加它到 addedTableData
|
|
|
+ addedTableData.value.push(newProduct)
|
|
|
+ } else {
|
|
|
+ // 如果已存在,显示一个警告消息
|
|
|
+ ElMessage({
|
|
|
+ message: '已经添加了相关商品,不能重复添加',
|
|
|
+ type: 'warning',
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-async function createPromote() {
|
|
|
- try {
|
|
|
- const body = {}
|
|
|
- const response = await xx()
|
|
|
- console.log('response', response.data)
|
|
|
- } catch (error) {
|
|
|
+function addPromoteSimilar() {}
|
|
|
|
|
|
- }
|
|
|
+// 点击保存触发
|
|
|
+function handleSave() {
|
|
|
+ // createCustom()
|
|
|
+ console.log('addedTableData:', addedTableData.value)
|
|
|
}
|
|
|
|
|
|
function changeTableHeader(row) {
|