Explorar o código

新增: SD广告活动详情页; SD广告组详情页

WanGxC hai 1 ano
pai
achega
83afc93919
Modificáronse 29 ficheiros con 316 adicións e 689 borrados
  1. 1 1
      .prettierrc.js
  2. 41 37
      src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/ads/api.ts
  3. 5 1
      src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/ads/crud.tsx
  4. 6 3
      src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/ads/index.vue
  5. 4 4
      src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/api.ts
  6. 5 6
      src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/index.vue
  7. 20 4
      src/views/adManage/sd/campaigns/campaignDetail/adGroups/api.ts
  8. 96 17
      src/views/adManage/sd/campaigns/campaignDetail/adGroups/crud.tsx
  9. 7 5
      src/views/adManage/sd/campaigns/campaignDetail/adGroups/index.vue
  10. 2 2
      src/views/adManage/sd/campaigns/campaignDetail/api.ts
  11. 0 20
      src/views/adManage/sd/campaigns/campaignDetail/budget/api.ts
  12. 0 56
      src/views/adManage/sd/campaigns/campaignDetail/budget/crud.tsx
  13. 0 46
      src/views/adManage/sd/campaigns/campaignDetail/budget/index.vue
  14. 0 116
      src/views/adManage/sd/campaigns/campaignDetail/budget/lineChart.vue
  15. 10 10
      src/views/adManage/sd/campaigns/campaignDetail/index.vue
  16. 0 12
      src/views/adManage/sd/campaigns/campaignDetail/placement/api.ts
  17. 0 89
      src/views/adManage/sd/campaigns/campaignDetail/placement/crud.tsx
  18. 0 74
      src/views/adManage/sd/campaigns/campaignDetail/placement/index.vue
  19. 3 2
      src/views/adManage/sd/campaigns/index.vue
  20. 3 3
      src/views/adManage/sd/index.vue
  21. 2 2
      src/views/adManage/sd/matchedDelivery/crud.tsx
  22. 51 50
      src/views/adManage/sd/matchedDelivery/index.vue
  23. 2 7
      src/views/adManage/sd/promoteProducts/api.ts
  24. 2 39
      src/views/adManage/sd/promoteProducts/crud.tsx
  25. 24 40
      src/views/adManage/sd/promoteProducts/index.vue
  26. 19 24
      src/views/adManage/sp/campaigns/CreateCampaigns/index.vue
  27. 5 16
      src/views/adManage/sp/campaigns/index.vue
  28. 7 2
      src/views/adManage/utils/enum.ts
  29. 1 1
      tsconfig.json

+ 1 - 1
.prettierrc.js

@@ -21,7 +21,7 @@ module.exports = {
 	bracketSpacing: true,
 	// jsx 标签的反尖括号需要换行
 	jsxBracketSameLine: false,
-	bracketSameLine: false,
+	bracketSameLine: true,
 	// 在单独的箭头函数参数周围包括括号 always:(x) => x \ avoid:x => x
 	arrowParens: 'always',
 	// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码

+ 41 - 37
src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/ads/api.ts

@@ -1,59 +1,63 @@
-import { request } from '/@/utils/service';
-import { UserPageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud';
+import { request } from '/@/utils/service'
+import { UserPageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'
+import { router } from '/@/router'
 
-export const apiPrefix = '/api/ad_manage/sbgroupdetail/ads/';
+export const apiPrefix = '/api/ad_manage/sd-ad-product/report/'
 export function GetList(query: UserPageQuery) {
-    return request({
-        url: apiPrefix + 'list/',
-        method: 'get',
-        params: query,
-    })
+  query['adGroupId'] = router.currentRoute.value.query.adGroupId
+  return request({
+    url: apiPrefix + 'list',
+    method: 'get',
+    params: query,
+  })
 }
 export function GetObj(id: InfoReq) {
-    return request({
-        url: apiPrefix + id + "/",
-        method: 'get',
-    });
+  return request({
+    url: apiPrefix + id + '/',
+    method: 'get',
+  })
 }
 
 export function AddObj(obj: AddReq) {
-    return request({
-        url: apiPrefix,
-        method: 'post',
-        data: obj,
-    });
+  return request({
+    url: apiPrefix,
+    method: 'post',
+    data: obj,
+  })
 }
 
 export function UpdateObj(obj: EditReq) {
-    return request({
-        url: apiPrefix + obj.id + '/',
-        method: 'put',
-        data: obj,
-    });
+  return request({
+    url: apiPrefix + obj.id + '/',
+    method: 'put',
+    data: obj,
+  })
 }
 
 export function DelObj(id: DelReq) {
-    return request({
-        url: apiPrefix + id + '/',
-        method: 'delete',
-        data: { id },
-    });
+  return request({
+    url: apiPrefix + id + '/',
+    method: 'delete',
+    data: { id },
+  })
 }
 
-
 export function getCardData(query: UserPageQuery) {
-    return request({
-        url: apiPrefix + "total/",
-        method: 'GET',
-        params: query
-    })
-  }
+  console.log('router123', router.currentRoute.value.query)
+  query['adGroupId'] = router.currentRoute.value.query.adGroupId
+  return request({
+    url: apiPrefix + 'amount',
+    method: 'GET',
+    params: query,
+  })
+}
 
 export function getLineData(query: UserPageQuery) {
-  query['dateRangeType'] = 'D'
+  query['adGroupId'] = router.currentRoute.value.query.adGroupId
+//   query['profileId'] = router.currentRoute.value.query.profileId
   return request({
-    url: apiPrefix + 'daily/',
+    url: apiPrefix + 'trend/daily',
     method: 'GET',
-    params: query
+    params: query,
   })
 }

+ 5 - 1
src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/ads/crud.tsx

@@ -4,12 +4,16 @@ import { inject } from 'vue'
 import { parseQueryParams } from '/@/views/adManage/utils/tools.js'
 import XEUtils from 'xe-utils'
 import { BaseColumn } from '/@/views/adManage/utils/commonTabColumn.js'
+import { useRoute } from 'vue-router'
+
 
 export const createCrudOptions = function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
+	const route = useRoute()
 	const pageRequest = async (query: UserPageQuery) => {
 		const params = parseQueryParams(context.value)
 		XEUtils.assign(query, params)
-		return await api.GetList(query);
+    // query["adGroupId"] = route.query.adGroupId
+		return await api.GetList(query)
 	};
 	const editRequest = async ({ form, row }: EditReq) => {
 		form.id = row.id;

+ 6 - 3
src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/ads/index.vue

@@ -17,8 +17,8 @@
           :show-compare="showCompare"/>
       </template>
       <template #toolbar-left>
-        <div>
-          <span>数据对比 </span>
+        <div class="campare-switch">
+          <span>数据对比</span>
           <el-switch v-model="showCompare" size="small" />
         </div>
       </template>
@@ -62,7 +62,10 @@ watch(queryParams, async () => {
 }, { deep: true })
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
+.campare-switch {
+  flex: none;
+}
 .chart-tabs {
 	margin: 5px 0;
 

+ 4 - 4
src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/api.ts

@@ -1,12 +1,12 @@
 import { request } from '/@/utils/service'
 import { LocationQueryValue } from 'vue-router'
 
-export const apiPrefix = '/api/ad_manage/sbgroupdetail/'
+export const apiPrefix = '/api/ad_manage/sdcampaigns/report/campaign_info'
 
-export function GetObj(adGroupId: LocationQueryValue | LocationQueryValue[]) {
+export function GetObj(adGroupId: LocationQueryValue | LocationQueryValue[], campaignId: LocationQueryValue | LocationQueryValue[]) {
 	return request({
-		url: apiPrefix + 'head/',
+		url: apiPrefix,
 		method: 'get',
-		params: { adGroupId },
+		params: { adGroupId, campaignId },
 	})
 }

+ 5 - 6
src/views/adManage/sd/campaigns/campaignDetail/adGroups/adGroupDetail/index.vue

@@ -7,15 +7,15 @@
       <div class="asj-detail-info">
         <span style="color: rgb(177, 177, 177);">状态: </span>
         <span>
-          <el-button class="no-hover-effect" type="success" size="small" round plain>{{ dynStatusEnum[adGroupInfo.state] }}</el-button>
+          <el-button class="no-hover-effect" type="success" size="small" round plain>{{( dynStatusEnum[adGroupInfo.state] )}}</el-button>
         </span>
-        <span class="head-span">投放类型: </span> <span>{{ targetTypeEnum[adGroupInfo.creative_type] }}</span>
+        <span class="head-span">投放类型: </span> <span>{{ dynStatusEnum[adGroupInfo.budgetType] }}</span>
         <!-- <span>默认竞价:{{ profile.currency_symbol + adGroupInfo.defaultBid }}</span> -->
         <span class="head-span">投放日期: </span> <span>{{ adGroupInfo.startDate }} ~ {{ adGroupInfo.endDate ?? '无结束日期' }}</span>
       </div>
     </div>
     <el-tabs type="border-card" class="asj-detail-tabs" v-model="tabActiveName">
-      <el-tab-pane label="广告" name="ads">
+      <el-tab-pane label="广告" name="ads">
         <Ads v-if="tabActiveName==='ads'" :adGroupId="route.query.adGroupId"></Ads>
       </el-tab-pane>
       <template v-if="route.query.targetingType ==='target'">
@@ -66,9 +66,8 @@ const route = useRoute()
 const adGroupInfo: Ref<SpAdGroup> = ref({})
 
 onMounted(async () => {
-  const resp = await GetObj(route.query.adGroupId)
-  adGroupInfo.value = resp.data
-  console.log(111, route.query)
+  const resp = await GetObj(route.query.adGroupId, route.query.campaignId)
+  adGroupInfo.value = resp.data[0]
 })
 
 </script>

+ 20 - 4
src/views/adManage/sd/campaigns/campaignDetail/adGroups/api.ts

@@ -1,10 +1,10 @@
 import { request } from '/@/utils/service'
 import { UserPageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'
 
-export const apiPrefix = '/api/ad_manage/sbcampaigndetail/sbgroups/'
+export const apiPrefix = '/api/ad_manage/sdgroups/report/trend/'
 export function GetList(query: UserPageQuery) {
 	return request({
-		url: apiPrefix + 'list/',
+		url: '/api/ad_manage/sdgroups/',
 		method: 'get',
 		params: query,
 	})
@@ -42,7 +42,7 @@ export function DelObj(id: DelReq) {
 
 export function getCardData(query: UserPageQuery) {
 	return request({
-		url: apiPrefix + 'total/',
+		url: '/api/ad_manage/sdgroups/report/amount',
 		method: 'GET',
 		params: query,
 	})
@@ -50,8 +50,24 @@ export function getCardData(query: UserPageQuery) {
 
 export function getLineData(query: UserPageQuery) {
 	return request({
-		url: apiPrefix + 'daily/',
+		url: apiPrefix + 'daily',
 		method: 'GET',
 		params: query,
 	})
 }
+
+export function getLineWeekData(query: UserPageQuery) {
+	return request({
+			url: apiPrefix + "weekly",
+			method: 'GET',
+			params: query
+	})
+}
+
+export function getLineMonthData(query: UserPageQuery) {
+	return request({
+			url: apiPrefix + 'monthly',
+			method: 'GET',
+			params: query
+	})
+}

+ 96 - 17
src/views/adManage/sd/campaigns/campaignDetail/adGroups/crud.tsx

@@ -97,28 +97,107 @@ export const createCrudOptions = function ({ crudExpose, context }: CreateCrudOp
 						rules: [{required: true, message:'必填项'}]
 					}
         },
-				creative_type: {
-					title: '投放类型',
-					type: 'dict-select',
+				state: {
+          title: '状态',
+          sortable: true,
+          column: {
+            width: 90,
+            align: 'center'
+          },
+          type: 'dict-select',
+          search: {
+            show: true
+          },
+          dict: dict({
+            data: [
+              {value: 'paused', label: '已暂停', color: 'warning'},
+              {value: 'enabled', label: '投放中', color: 'success'},
+            ]
+          })
+        },
+				
+				...BaseColumn,
+
+				ViewImpression: {
+					title: '可见曝光量',
 					column: {
-						align: 'center',
-						width: '130px'
-					},
-					dict: dict({
-						data: [
-							{ label: '商品集', value: 'PRODUCT_COLLECTION' },
-							{ label: '品牌视频', value: 'BRAND_VIDEO' },
-							{ label: '视频', value: 'VIDEO' }
-						]
-					})
+						align: 'right',
+						sortable: true,
+						width: '140px',
+						border: '0.5px solid #ddd',
+						renderHeader() {
+							return (
+									<span>
+											<el-tooltip placement="top"
+																	content="来自亚马逊广告API,符合媒体评级委员会(Media Ratings Council)可见标准的曝光量">
+									<span>
+											<el-icon size="14" style="display:inline-block; padding-top:2px; margin-right:3px;"><InfoFilled/></el-icon>
+									</span>
+									</el-tooltip>
+									<span>可见曝光量</span>
+									</span>
+							)
+						},
+						formatter: (row: any) => {
+							if (row.value != null) {
+								return row.value
+							} else {
+								return '--'
+							}
+						}
+					}
 				},
-				state: {
-					title: '状态',
+				VCPM: {
+					title: '千次可见曝光成本',
 					column: {
-						width: 100
+						align: 'right',
+						sortable: true,
+						width: '180px',
+						border: '0.5px solid #ddd',
+						renderHeader() {
+							return (
+									<span>
+											<el-tooltip placement="top"
+																	content="千次可见曝光成本,系统计算,花费/可见曝光量*1000">
+									<span>
+											<el-icon size="14" style="display:inline-block; padding-top:2px; margin-right:3px;"><InfoFilled/></el-icon>
+									</span>
+									</el-tooltip>
+									<span>千次可见曝光成本</span>
+									</span>
+							)
+						},
+						formatter: (row: any) => {
+							if (row.value != null) {
+								return row.value
+							} else {
+								return '--'
+							}
+						}
 					}
 				},
-				...BaseColumn
+				DPV: {
+					title: '商品详情页浏览次数',
+					column: {
+						align: 'right',
+						sortable: true,
+						width: '200px',
+						border: '0.5px solid #ddd',
+						renderHeader() {
+							return (
+									<span>
+											<el-tooltip placement="top" content="商品详情页浏览次数,来自亚马逊广告API。<br />
+							在点击广告后的14天内(品牌推广)、浏览或点击广告后的14天内(展示型推广)的商品详情页浏览次数" raw-content>
+							<span>
+							<el-icon size="14" style="display:inline-block; padding-top:2px; margin-right:3px;"><InfoFilled/></el-icon>
+									</span>
+									</el-tooltip>
+									<span>商品详情页浏览次数</span>
+									</span>
+							)
+						}
+					}
+				}
 			}
 		}
 	}

+ 7 - 5
src/views/adManage/sd/campaigns/campaignDetail/adGroups/index.vue

@@ -8,7 +8,9 @@
         <DataTendencyChart
           :query="queryParams"
           :fetchCard="getCardData"
-          :fetchLine="getLineData">
+          :fetchLine="getLineData"
+          :fetch-line-month="getLineMonthData"
+          :fetch-line-week="getLineWeekData">
         </DataTendencyChart>
       </template>
       <template #cell_adGroupName="scope">
@@ -30,8 +32,8 @@ import {LocationQueryValue, useRouter} from 'vue-router'
 import DateRangePicker from '/@/components/DateRangePicker/index.vue'
 import {usePublicData} from '/@/stores/publicData'
 import {storeToRefs} from 'pinia'
-import DataTendencyChart from '/@/views/adManage/sp/chartComponents/dataTendency.vue'
-import {getCardData, getLineData} from './api'
+import DataTendencyChart from '/@/views/adManage/sd/chartComponents/dataTendency.vue'
+import {getCardData, getLineData, getLineMonthData, getLineWeekData } from './api'
 
 const publicData = usePublicData()
 const router = useRouter()
@@ -51,8 +53,8 @@ onMounted(() => {
 })
 const jumpAds = (row: any) => {
   router.push({
-    name: 'SbAdGroupDetail',
-    query: { adGroupId: row.adGroupId, targetingType: row.targetingType, tagsViewName: row.adGroupName }
+    name: 'SdAdGroupDetail',
+    query: { adGroupId: row.adGroupId, campaignId: row.campaignId, targetingType: row.targetingType, tagsViewName: row.adGroupName }
   })
 }
 watch(

+ 2 - 2
src/views/adManage/sd/campaigns/campaignDetail/api.ts

@@ -3,11 +3,11 @@ import { LocationQueryValue } from 'vue-router'
 // import { UserPageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud';
 // import XEUtils from 'xe-utils';
 
-export const apiPrefix = '/api/ad_manage/sbcampaigndetail/'
+export const apiPrefix = '/api/ad_manage/sdcampaigns/report/campaign_info'
 
 export function GetObj(campaignId: LocationQueryValue | LocationQueryValue[]) {
 	return request({
-		url: apiPrefix + 'head/',
+		url: apiPrefix,
 		method: 'get',
 		params: { campaignId },
 	})

+ 0 - 20
src/views/adManage/sd/campaigns/campaignDetail/budget/api.ts

@@ -1,20 +0,0 @@
-import { request } from '/@/utils/service';
-import { UserPageQuery } from '@fast-crud/fast-crud';
-
-
-export const apiPrefix = '/api/ad_manage/sbcampaigndetail/budget/'
-export function GetList(query: UserPageQuery) {
-    return request({
-        url: apiPrefix,
-        method: 'get',
-        params: query,
-    })
-}
-
-export function GetLineList(query: UserPageQuery) {
-    return request({
-        url: apiPrefix,
-        method: 'get',
-        params: query,
-    })
-}

+ 0 - 56
src/views/adManage/sd/campaigns/campaignDetail/budget/crud.tsx

@@ -1,56 +0,0 @@
-import * as api from './api'
-import {CreateCrudOptionsProps, CreateCrudOptionsRet, UserPageQuery} from '@fast-crud/fast-crud'
-import {parseQueryParams} from '/@/views/adManage/utils/tools.js'
-import XEUtils from 'xe-utils'
-
-export const createCrudOptions = function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
-	const pageRequest = async (query: UserPageQuery) => {
-		const params = parseQueryParams(context.value)
-		XEUtils.assign(query, params)
-		return await api.GetList(query)
-	}
-
-	return {
-		crudOptions: {
-			table: {
-				// height: 800,
-			},
-			container: {
-				fixedHeight: false,
-			},
-			actionbar: {
-				show: false,
-			},
-			search: {
-				show: true,
-				buttons: {
-					search: {
-						show: false
-					},
-					reset: {
-						show: false
-					}
-				}
-			},
-			toolbar: {
-				buttons: {
-					search: {
-						show: true,
-					},
-					compact: {
-						show: false,
-					},
-				},
-			},
-			request: {
-				pageRequest,
-			},
-			rowHandle: {
-				show: false,
-			},
-			columns: {
-
-			},
-		},
-	}
-}

+ 0 - 46
src/views/adManage/sd/campaigns/campaignDetail/budget/index.vue

@@ -1,46 +0,0 @@
-<template>
-  <fs-page class="fs-page-custom">
-    <fs-crud ref="crudRef" v-bind="crudBinding">
-      <template #search-left>
-        <DateRangePicker v-model="dateRange"></DateRangePicker>
-      </template>
-      <template #header-middle>
-        <LineChart :query="queryParams"/>
-      </template>
-    </fs-crud>
-  </fs-page>
-</template>
-
-<script lang="ts" setup>
-import {ref} from 'vue'
-import {FsPage, useFs} from '@fast-crud/fast-crud'
-import {LocationQueryValue} from 'vue-router'
-import {usePublicData} from '/@/stores/publicData'
-import {storeToRefs} from 'pinia'
-import {createCrudOptions} from './crud'
-import LineChart from './lineChart.vue'
-import DateRangePicker from '/@/components/DateRangePicker/index.vue'
-
-const publicData = usePublicData()
-const { dateRange } = storeToRefs(publicData)
-interface Props {
-  campaignId: LocationQueryValue | LocationQueryValue[]
-}
-const props = defineProps<Props>()
-const queryParams = ref({
-  campaignId: props.campaignId,
-  dateRange
-})
-const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: queryParams })
-
-// onMounted(async () => {
-// 	crudExpose.doRefresh()
-// })
-
-</script>
-
-<style scoped>
-:deep(.el-card) {
-  border: none;
-}
-</style>

+ 0 - 116
src/views/adManage/sd/campaigns/campaignDetail/budget/lineChart.vue

@@ -1,116 +0,0 @@
-<template>
-  <el-card v-loading="loading" shadow="never" style="margin-bottom: 5px; border-radius:0;">
-    <div style="height: 350px;" ref="chartRef"></div>
-  </el-card>
-</template>
-
-<script lang="ts" setup>
-import { ref,onMounted, onBeforeUnmount, watch, computed } from 'vue'
-import * as echarts from 'echarts'
-import { GetLineList } from './api'
-import { parseQueryParams } from '/@/views/adManage/utils/tools.js'
-
-interface Props {
-  query: any
-}
-const props = defineProps<Props>()
-const chartRef = ref()
-let chartObj:any
-const loading = ref(true)
-const queryParams = computed(() => parseQueryParams(props.query))
-
-const resizeChart = () => { chartObj.resize() }
-const addResize = () => { window.addEventListener('resize', resizeChart) }
-const removeResize = () => { window.removeEventListener('resize', resizeChart) }
-onMounted(() => {
-  addResize()
-  setTimeout(() => { initLine() }, 0)
-})
-onBeforeUnmount(() => {
-	if(chartObj) {
-		chartObj.dispose()
-    chartObj = null
-	}
-  removeResize()
-})
-
-const initLine = async () => {
-  chartObj = echarts.init(chartRef.value)
-  const option = {
-    dataset: {
-      source: []
-    },
-    tooltip: {
-      trigger: 'axis',
-      axisPointer: {
-        label: {
-          backgroundColor: '#6a7985'
-        }
-      }
-    },
-    grid: { top: 30, bottom: 30, left: 30, right: 30 },
-    xAxis: {
-      type: 'category'
-    },
-    yAxis: {
-      type: 'value',
-      name: '预算',
-      axisLine: {
-        show: true,
-				lineStyle: { color: '#0085ff' }
-      },
-    },
-    series: [
-      {
-        type: 'line',
-        encode: {
-          x: 'date',
-          y: 'campaignBudgetAmount'
-        },
-        smooth: true,
-        symbol: 'circle',
-        symbolSize: 4,
-        lineStyle: { width: 2 },
-        itemStyle: {
-          color: '#0085ff',
-          borderColor: '#0085ff'
-        },
-        areaStyle: {
-          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-            { offset: 0, color: '#0085ff93' },
-            { offset: 1, color: '#0085ff03' },
-          ]),
-        },
-      }
-    ]
-  }
-  const items = await getDataset()
-  option.dataset.source = items
-  chartObj.setOption(option)
-  loading.value = false
-}
-const getDataset = async () => {
-  const resp = await GetLineList(queryParams.value)
-  return resp.data
-}
-watch(
-  props.query,
-  async () => {
-    loading.value = true
-
-    const dataset = await getDataset()
-    chartObj.setOption({
-      dataset: {
-        source: dataset
-      }
-    })
-
-    loading.value = false
-  },
-  { deep: true }
-)
-</script>
-
-<style scoped>
-
-</style>

+ 10 - 10
src/views/adManage/sd/campaigns/campaignDetail/index.vue

@@ -7,28 +7,28 @@
       <div class="asj-detail-info">
         <span style="color: rgb(177, 177, 177)">状态: </span>
         <span>
-          <el-button class="no-hover-effect" type="success" round plain size="small" style="margin-top: -3px">{{ dynStatusEnum[campaignInfo.state] }}</el-button>
+          <el-button class="no-hover-effect" type="success" round plain size="small" style="margin-top: -3px">{{( dynStatusEnum[campaignInfo.state] )}}</el-button>
         </span><!--({{ campaignInfo.servingStatus }})-->
-        <span class="head-span">预算: </span> <span>{{ profile.currency_symbol + campaignInfo.budget }} | {{ campaignInfo.budgetType }}</span>
-        <!-- <span>投放类型:{{ campaignInfo.targetingType }}</span> -->
+        <span class="head-span">预算: </span> <span>{{ profile.currency_symbol + campaignInfo.budget }} | {{ dynStatusEnum[campaignInfo.budgetType] }}</span>
+        <span class="head-span">投放类型:</span> <span>{{ dynStatusEnum[campaignInfo.tactic] }}</span>
         <span class="head-span">投放日期: </span> <span>{{ campaignInfo.startDate }} ~ {{ campaignInfo.endDate ?? '无结束日期' }}</span>
-        <span class="head-span">广告组合: </span> <span>{{ campaignInfo?.portfolioName }}</span>
-        <span class="head-span">竞价: </span> <span>{{ getEnumLabel(dynBidOptimizationEnum, campaignInfo.bidOptimization) }}</span>
+        <span class="head-span">广告组合: </span> <span>{{ campaignInfo?.portfolio_name ? campaignInfo.portfolio_name : '--'}}</span>
+        <span class="head-span">成本类型: </span> <span>{{ campaignInfo.costType }}</span>
       </div>
     </div>
     <el-tabs type="border-card" class="asj-detail-tabs" v-model="tabActiveName">
       <el-tab-pane label="广告组" name="adGroup">
         <AdGroups :campaignId="route.query.campaignId" v-if="tabActiveName==='adGroup'"></AdGroups>
       </el-tab-pane>
-      <el-tab-pane label="预算" name="budget">
+      <!-- <el-tab-pane label="预算" name="budget">
         <Budget :campaignId="route.query.campaignId" v-if="tabActiveName==='budget'"></Budget>
-      </el-tab-pane>
+      </el-tab-pane> -->
       <el-tab-pane label="自动化" name="automation">
         自动化
       </el-tab-pane>
-      <el-tab-pane label="广告位" name="placement">
+      <!-- <el-tab-pane label="广告位" name="placement">
         <Placement :campaignId="route.query.campaignId" v-if="tabActiveName==='placement'"/>
-      </el-tab-pane>
+      </el-tab-pane> -->
     </el-tabs>
   </div>
 </template>
@@ -55,7 +55,7 @@ const tabActiveName = ref('adGroup')
 
 onMounted(async () => {
   const resp = await GetObj(route.query.campaignId)
-  campaignInfo.value = resp.data
+  campaignInfo.value = resp.data[0]
 })
 
 </script>

+ 0 - 12
src/views/adManage/sd/campaigns/campaignDetail/placement/api.ts

@@ -1,12 +0,0 @@
-import { request } from '/@/utils/service';
-import { UserPageQuery } from '@fast-crud/fast-crud';
-
-
-export const apiPrefix = '/api/ad_manage/sbcampaigndetail/placement/'
-export function GetList(query: UserPageQuery) {
-    return request({
-        url: apiPrefix,
-        method: 'get',
-        params: query,
-    })
-}

+ 0 - 89
src/views/adManage/sd/campaigns/campaignDetail/placement/crud.tsx

@@ -1,89 +0,0 @@
-import * as api from './api'
-import {CreateCrudOptionsProps, CreateCrudOptionsRet, UserPageQuery} from '@fast-crud/fast-crud'
-import {parseQueryParams} from '/@/views/adManage/utils/tools.js'
-import XEUtils from 'xe-utils'
-import {sbCampaignPlacementEnum, spCampaignPlacementEnum} from '/@/views/adManage/utils/enum'
-import {BaseColumn} from '/@/views/adManage/utils/commonTabColumn'
-
-export const createCrudOptions = function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet {
-	const pageRequest = async (query: UserPageQuery) => {
-		const params = parseQueryParams(context.value)
-		XEUtils.assign(query, params)
-		return await api.GetList(query)
-	}
-
-
-	return {
-		crudOptions: {
-				table: {
-					height: 750,
-					headerCellStyle: {
-						backgroundColor: '#f6f7fa', // 直接设置背景颜色
-						height: '20px',
-						// border: '0.5px solid #ddd',
-					},
-					cellStyle: {
-						border: 'none',
-						borderBottom: '0.5px solid #ddd',
-					},
-				},
-			container: {
-        fixedHeight: false
-      },
-			actionbar: {
-				show: false,
-				buttons: {
-					add: {
-						show: false
-					}
-				}
-			},
-			search: {
-				show: true,
-				buttons: {
-					search: {
-						show: false
-					},
-					reset: {
-						show: false
-					}
-				}
-			},
-			toolbar: {
-        buttons: {
-					search: {
-						show: true
-					},
-					compact: {
-						show: false
-					},
-				}
-			},
-			request: {
-				pageRequest,
-			},
-			pagination: {
-				show: false
-			},
-			rowHandle: {
-        show: false
-      },
-			columns: {
-        placement: {
-          title: '广告位',
-          column: {
-            width: '200px',
-						fixed: 'left',
-						formatter({ value, row, index }){
-								return XEUtils.find(sbCampaignPlacementEnum, (item) => item.value === value).label
-						}
-          }
-        },
-				bidAdjustment: {
-					title: '竞价调整'
-				},
-        ...BaseColumn
-			}
-		}
-	}
-}

+ 0 - 74
src/views/adManage/sd/campaigns/campaignDetail/placement/index.vue

@@ -1,74 +0,0 @@
-<template>
-  <fs-page class="fs-page-custom" v-loading='loading'>
-    <fs-crud ref="crudRef" v-bind="crudBinding">
-      <template #search-left>
-        <DateRangePicker v-model="dateRange"></DateRangePicker>
-      </template>
-      <template v-for="field of Object.keys(BaseColumn)" #[`cell_${field}`]="scope">
-        <DataCompare
-          :field="field"
-          :value="scope.row[field]"
-          :prev-val="scope.row[`prev${field}`]"
-          :gap-val="scope.row[`gap${field}`]"
-          :date-range="dateRange"
-          :show-compare="showCompare"/>
-      </template>
-      <template #toolbar-left>
-        <div>
-          <span>数据对比 </span>
-          <el-switch v-model="showCompare" size="small" />
-        </div>
-      </template>
-    </fs-crud>
-  </fs-page>
-</template>
-
-<script lang="ts" setup>
-import {onMounted, ref, watch} from 'vue'
-import {FsPage, useFs} from '@fast-crud/fast-crud'
-import {createCrudOptions} from './crud'
-import {usePublicData} from '/@/stores/publicData'
-import {storeToRefs} from 'pinia'
-import DateRangePicker from '/@/components/DateRangePicker/index.vue'
-import {BaseColumn} from '/@/views/adManage/utils/commonTabColumn.js'
-import {LocationQueryValue} from 'vue-router'
-import DataCompare from '/@/components/dataCompare/index.vue'
-
-defineOptions({
-  name: "Placement"
-})
-const publicData = usePublicData()
-const { dateRange } = storeToRefs(publicData)
-interface Props {
-  campaignId: LocationQueryValue | LocationQueryValue[]
-}
-const props = defineProps<Props>()
-// const loading = ref(true)
-
-const showCompare = ref(false)
-
-const queryParams = ref({
-  campaignId: props.campaignId,
-  dateRange
-})
-const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: queryParams })
-
-onMounted(async () => {
-  crudExpose.doRefresh()
-})
-
-watch(
-  dateRange,
-  async () => crudExpose.doRefresh()
-)
-
-</script>
-
-<style scoped>
-.red {
-  color: red;
-}
-.green {
-  color: #1cbc0e;
-}
-</style>

+ 3 - 2
src/views/adManage/sd/campaigns/index.vue

@@ -86,9 +86,10 @@ const showCompare = ref(false)
 
 const jumpGroup = (row: any) => {
   router.push({
-    name: 'SbCampaignDetail',
-    query: {campaignId: row.campaignId, tagsViewName: row.campaignName},
+    name: 'SdCampaignDetail',
+    query: {campaignId: row.campaignId, tagsViewName: row.campaignName, row: row},
   })
+  console.log('row', row)
 }
 
 onMounted(async () => {

+ 3 - 3
src/views/adManage/sd/index.vue

@@ -35,7 +35,7 @@ import Campaigns from '/@/views/adManage/sd/campaigns/index.vue'
 import Audiences from '/@/views/adManage/sd/audiences/index.vue'
 import Targets from '/@/views/adManage/sd/targets/index.vue'
 import MatchedDelivery from '/@/views/adManage/sd/matchedDelivery/index.vue'
-import AdvertisedProducts from './advertisedProducts/index.vue'
+import PromoteProducts from '/@/views/adManage/sd/promoteProducts/index.vue'
 import PurchasedOtherProducts from './purchasedOtherProducts/index.vue'
 import Placement from '/@/views/adManage/sb/placement/index.vue'
 
@@ -50,7 +50,7 @@ const tabsComponents: any = {
   Targets,
   Audiences,
   MatchedDelivery,
-  // AdvertisedProducts,
+  PromoteProducts,
   // PurchasedOtherProducts,
   
   // Placement
@@ -60,7 +60,7 @@ const tabs = [
   { label: '商品投放', name: 'Targets' },
   { label: '受众', name: 'Audiences' },
   { label: '匹配的投放', name: 'MatchedDelivery' },
-  // { label: '推广商品', name: 'AdvertisedProducts' },
+  { label: '推广商品', name: 'PromoteProducts' },
   // { label: '购买的其他商品', name: 'PurchasedOtherProducts' },
 
   // { label: '广告位', name: 'Placement' }

+ 2 - 2
src/views/adManage/sd/matchedDelivery/crud.tsx

@@ -112,7 +112,7 @@ export const createCrudOptions = function ({crudExpose, context}: CreateCrudOpti
             sortable: true
           },
         },
-        campaign__tactic: {
+        tactic: {
           title: '投放类型',
           column: {
             width: 120,
@@ -150,7 +150,7 @@ export const createCrudOptions = function ({crudExpose, context}: CreateCrudOpti
             align: 'left'
           }
         },
-        campaign__costTyp: {
+        costType: {
           title: '成本类型',
           column: {
             width: 90,

+ 51 - 50
src/views/adManage/sd/matchedDelivery/index.vue

@@ -5,22 +5,22 @@
         <el-tabs v-model="tabActiveName" class="chart-tabs" type="border-card" @tab-change="changeTab">
           <el-tab-pane label="数据趋势" name="dataTendency">
             <DataTendencyChart
-                :query="queryParams"
-                v-if="tabActiveName === 'dataTendency'"
-                :fetchCard="getCardData"
-                :fetch-line-month="getLineMonthData"
-                :fetch-line-week="getLineWeekData"
-                :fetchLine="getLineData">
-            </DataTendencyChart>
+              :query="queryParams"
+              v-if="tabActiveName === 'dataTendency'"
+              :fetchCard="getCardData"
+              :fetch-line-month="getLineMonthData"
+              :fetch-line-week="getLineWeekData"
+              :fetchLine="getLineData"
+            ></DataTendencyChart>
           </el-tab-pane>
           <el-tab-pane label="广告结构" name="adStruct">
-            <AdStructChart v-if="tabActiveName === 'adStruct'"/>
+            <AdStructChart v-if="tabActiveName === 'adStruct'" />
           </el-tab-pane>
           <el-tab-pane label="散点视图" name="scatterView"></el-tab-pane>
         </el-tabs>
       </template>
       <template #cell_percentTimeInBudget="scope">
-        <el-progress :percentage="scope.row.percentTimeInBudget > 0 ? scope.row.percentTimeInBudget * 100 : 0"/>
+        <el-progress :percentage="scope.row.percentTimeInBudget > 0 ? scope.row.percentTimeInBudget * 100 : 0" />
       </template>
 
       <template #cell_resolvedExpression_value="scope">
@@ -30,22 +30,22 @@
             {{ scope.row.ASIN }}
           </template>
           <div>
-            <el-link :underline="false" class="ellipsis-inline" style="color: rgb(30, 33, 40); display: inline-block; max-width: 100%;">
+            <el-link :underline="false" class="ellipsis-inline" style="color: rgb(30, 33, 40); display: inline-block; max-width: 100%">
               {{ scope.row.resolvedExpression_value }}
             </el-link>
-            <br>
+            <br />
             <span class="ellipsis">
-              <span style="color: rgb(109, 119, 132)">ASIN: </span>
+              <span style="color: rgb(109, 119, 132)">ASIN:</span>
               <span style="color: rgb(30, 33, 40)">{{ scope.row.ASIN }}</span>
             </span>
           </div>
         </el-tooltip>
       </template>
-      
+
       <template #cell_matchedTargetAsin="scope">
         <el-tooltip effect="dark" :content="scope.row.matchedTargetAsin" placement="top">
           <el-link type="primary" :underline="false" @click="jumpGroup(scope.row)">
-            <div class="en-text">{{ scope.row.matchedTargetAsin.toUpperCase() }}</div>
+            <div class="en-text">{{ scope.row.matchedTargetAsin }}</div>
           </el-link>
         </el-tooltip>
       </template>
@@ -66,29 +66,30 @@
       <template #cell_suggestedBid="scope">
         <div>{{ scope.row.suggestedBid ? `$${scope.row.suggestedBid}` : '--' }}</div>
         <div class="text-range">
-          {{ scope.row.suggestedBid_lower ? `$${scope.row.suggestedBid_lower}` : '--' }} ~ 
+          {{ scope.row.suggestedBid_lower ? `$${scope.row.suggestedBid_lower}` : '--' }} ~
           {{ scope.row.suggestedBid_upper ? `$${scope.row.suggestedBid_upper}` : '--' }}
         </div>
-      </template>      
+      </template>
       <template #cell_MissedImpressions="scope">
         {{ scope.row.MissedImpressionsLower ?? '0' }} ~ {{ scope.row.MissedImpressionsUpper ?? '0' }}
       </template>
-      <template #cell_MissedClicks="scope"> {{ scope.row.MissedClicksLower ?? '0' }} ~ {{ scope.row.MissedClicksUpper ?? '0' }}</template>
-      <template #cell_MissedSales="scope"> {{ scope.row.MissedSalesLower ?? '0' }} ~ {{ scope.row.MissedSalesUpper ?? '0' }}</template>
+      <template #cell_MissedClicks="scope">{{ scope.row.MissedClicksLower ?? '0' }} ~ {{ scope.row.MissedClicksUpper ?? '0' }}</template>
+      <template #cell_MissedSales="scope">{{ scope.row.MissedSalesLower ?? '0' }} ~ {{ scope.row.MissedSalesUpper ?? '0' }}</template>
 
       <template v-for="field of Object.keys(SdMatchedDeliveryColumn)" #[`cell_${field}`]="scope">
         <DataCompare
-            :field="field"
-            :value="scope.row[field]"
-            :prev-val="scope.row[`prev${field}`]"
-            :gap-val="scope.row[`gap${field}`]"
-            :date-range="dateRange"
-            :show-compare="showCompare"/>
+          :field="field"
+          :value="scope.row[field]"
+          :prev-val="scope.row[`prev${field}`]"
+          :gap-val="scope.row[`gap${field}`]"
+          :date-range="dateRange"
+          :show-compare="showCompare"
+        />
       </template>
       <template #toolbar-left>
         <div class="campare-switch">
-          <span>数据对比 </span>
-          <el-switch v-model="showCompare" size="small"/>
+          <span>数据对比</span>
+          <el-switch v-model="showCompare" size="small" />
         </div>
       </template>
     </fs-crud>
@@ -96,38 +97,36 @@
 </template>
 
 <script lang="ts" setup>
-import {nextTick, onMounted, ref, watch} from 'vue'
-import {FsPage, useFs} from '@fast-crud/fast-crud'
-import {createCrudOptions} from './crud'
-import {useRoute, useRouter} from 'vue-router'
+import { nextTick, onMounted, ref, watch } from 'vue'
+import { FsPage, useFs } from '@fast-crud/fast-crud'
+import { createCrudOptions } from './crud'
+import { useRoute, useRouter } from 'vue-router'
 import DataTendencyChart from '/@/views/adManage/sd/chartComponents/dataTendency.vue'
-import {useShopInfo} from '/@/stores/shopInfo'
-import {usePublicData} from '/@/stores/publicData'
+import { useShopInfo } from '/@/stores/shopInfo'
+import { usePublicData } from '/@/stores/publicData'
 import AdStructChart from './chartComponents/adStruct.vue'
-import {getCardData, getLineData, getLineMonthData, getLineWeekData} from './api'
-import {storeToRefs} from 'pinia'
-import {SdMatchedDeliveryColumn} from '/@/views/adManage/utils/commonTabColumn'
+import { getCardData, getLineData, getLineMonthData, getLineWeekData } from './api'
+import { storeToRefs } from 'pinia'
+import { SdMatchedDeliveryColumn } from '/@/views/adManage/utils/commonTabColumn'
 import DataCompare from '/@/components/dataCompare/index.vue'
 
-
 const tabActiveName = ref('dataTendency')
 const shopInfo = useShopInfo()
 const publicData = usePublicData()
-const {dateRange} = storeToRefs(publicData)
-const {profile} = storeToRefs(shopInfo)
+const { dateRange } = storeToRefs(publicData)
+const { profile } = storeToRefs(shopInfo)
 const queryParams = ref({
   profileId: profile.value.profile_id,
-  dateRange
+  dateRange,
 })
 
-const {crudBinding, crudRef, crudExpose} = useFs({createCrudOptions, context: queryParams})
+const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: queryParams })
 const route = useRoute()
 const router = useRouter()
 const adStructChartRef = ref()
 const dataTendencyRef = ref()
 const showCompare = ref(false)
 
-
 onMounted(() => {
   crudExpose.doRefresh()
 })
@@ -135,7 +134,7 @@ onMounted(() => {
 const jumpGroup = (row: any) => {
   router.push({
     name: 'CampaignDetail',
-    query: {campaignId: row.campaignId, tagsViewName: row.campaignName},
+    query: { campaignId: row.campaignId, tagsViewName: row.campaignName },
   })
 }
 
@@ -151,12 +150,15 @@ const changeTab = () => {
     resizeTabChart()
   })
 }
-defineExpose({resizeTabChart})
-
-watch(queryParams, async () => {
-  crudExpose.doRefresh()
-}, {deep: true})
-
+defineExpose({ resizeTabChart })
+
+watch(
+  queryParams,
+  async () => {
+    crudExpose.doRefresh()
+  },
+  { deep: true }
+)
 </script>
 
 <style lang="scss" scoped>
@@ -164,7 +166,7 @@ watch(queryParams, async () => {
   flex: none;
 }
 
-::v-deep(.el-table__footer-wrapper td.el-table__cell:nth-child(n+3):nth-child(-n+6) .cell) {
+::v-deep(.el-table__footer-wrapper td.el-table__cell:nth-child(n + 3):nth-child(-n + 6) .cell) {
   display: none;
 }
 
@@ -225,5 +227,4 @@ watch(queryParams, async () => {
   text-overflow: ellipsis;
   display: inline;
 }
-
 </style>

+ 2 - 7
src/views/adManage/sd/promoteProducts/api.ts

@@ -2,11 +2,10 @@ import { request } from '/@/utils/service';
 import { UserPageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud';
 import XEUtils from 'xe-utils';
 
-export const apiPrefix = '/api/ad_manage/sdtarget/report/';
+export const apiPrefix = '/api/ad_manage/sd-ad-product/report/';
 export function GetList(query: UserPageQuery) {
-    query["tactic"] = "T00030"
     return request({
-        url: '/api/ad_manage/sdtarget/',
+        url: '/api/ad_manage/sd-ad-product/report/list',
         method: 'get',
         params: query,
     })
@@ -43,7 +42,6 @@ export function DelObj(id: DelReq) {
 }
 
 export function getCardData(query: UserPageQuery) {
-    query["tactic"] = "T00030"
     return request({
         url: apiPrefix + "amount",
         method: 'GET',
@@ -52,7 +50,6 @@ export function getCardData(query: UserPageQuery) {
 }
 
 export function getLineData(query: UserPageQuery) {
-    query["tactic"] = "T00030"
     return request({
         url: apiPrefix + "trend/daily",
         method: 'GET',
@@ -61,7 +58,6 @@ export function getLineData(query: UserPageQuery) {
 }
 
 export function getLineWeekData(query: UserPageQuery) {
-    query["tactic"] = "T00030"
     return request({
         url: apiPrefix + "trend/weekly",
         method: 'GET',
@@ -70,7 +66,6 @@ export function getLineWeekData(query: UserPageQuery) {
 }
 
 export function getLineMonthData(query: UserPageQuery) {
-    query["tactic"] = "T00030"
     return request({
         url: apiPrefix + "trend/monthly",
         method: 'GET',

+ 2 - 39
src/views/adManage/sd/promoteProducts/crud.tsx

@@ -104,20 +104,11 @@ export const createCrudOptions = function ({crudExpose, context}: CreateCrudOpti
             show: false
           }
         },
-        expression:{
-          title: '定向投放',
+        commodity:{
+          title: '商品',
           column: {
             fixed: 'left',
             width: 320,
-            sortable: true
-          },
-        },
-        resolvedExpression: {
-          title: '类型',
-          column: {
-            align: 'center',
-            width: 130,
-            sortable: true
           },
         },
         state: {
@@ -150,34 +141,6 @@ export const createCrudOptions = function ({crudExpose, context}: CreateCrudOpti
             width: 180,
           }
         },
-        suggestedBid: {
-          title: '建议竞价',
-          column: {
-            width: 130,
-            align: 'right'
-          }
-        },
-        bid: {
-          title: '出价',
-          column: {
-            width: 80,
-            align: 'center',
-            sortable: true,
-            formatter: (row) => {
-              return '$' + row.value
-            }
-          }
-        },
-        suggestedBid_lower: {
-          column: {
-            show: false,
-          }
-        },
-        suggestedBid_upper: {
-          column: {
-            show: false,
-          }
-        },
 
         ...SdBaseColumn
       }

+ 24 - 40
src/views/adManage/sd/promoteProducts/index.vue

@@ -20,35 +20,31 @@
           <el-tab-pane label="散点视图" name="scatterView"></el-tab-pane>
         </el-tabs>
       </template>
-      <template #cell_percentTimeInBudget="scope">
-        <el-progress :percentage="scope.row.percentTimeInBudget > 0 ? scope.row.percentTimeInBudget * 100 : 0" />
-      </template>
 
-      <template #cell_expression="scope">
-        <div>
-          <!-- 单独渲染第一个元素 -->
-          <div
-            v-if="scope.row.resolvedExpression[0]?.value && scope.row.resolvedExpression[0].value.length > 0" style="font-weight: 550; color: #505968">
-            {{ scope.row.resolvedExpression[0].value[0].value ?? '' }}
-          </div>
-          <!-- 渲染其他所有元素 -->
-          <div v-if="scope.row.resolvedExpression[0]?.value && scope.row.resolvedExpression[0].value.length > 1">
-            <template v-for="(item, index) in scope.row.resolvedExpression[0].value" :key="index">
-              <span v-if="index > 0">
-                <span v-if="item.type &&
-                    (item.type === 'asinPriceGreaterThan' || 
-                    item.type === 'asinPriceLESSThan' || 
-                    item.type === 'asinReviewRatingGreaterThan' || 
-                    item.type === 'asinReviewRatingLessThan')">
-                  {{ sdtargetMap[item.type] }}
-                </span>
-                <span v-else>{{ item.type ? sdtargetMap[item.type] + ': ' : '' }}</span>
-                {{ item.value ?? '' }}
-                <span v-if="index < scope.row.resolvedExpression[0].value.length - 1">&nbsp;</span>
-              </span>
-            </template>
+      <template #cell_commodity="scope">
+        <el-tooltip effect="dark" placement="top">
+          <template #content>
+            <p>{{ scope.row.campaignName }}</p>
+            <p>ASIN: {{ scope.row.promotedAsin }}</p>
+            SKU: {{ scope.row.promotedSku }}
+          </template>
+          <div>
+            <el-link :underline="false" class="ellipsis-inline" style="color: rgb(29, 35, 43); display: inline-block; font-weight: 450;">
+              {{ scope.row.campaignName ? scope.row.campaignName : '--' }}
+            </el-link>
+            <br>
+            <span class="ellipsis">
+              <span style="color: rgb(109, 119, 132)">ASIN: </span>
+              <span style="color: rgb(30, 33, 40)">{{ scope.row.promotedAsin }}</span>
+              <span style="color: rgb(109, 119, 132); margin-left: 10px;">SKU: </span>
+              <span style="color: rgb(30, 33, 40)">{{ scope.row.promotedSku }}</span>
+            </span>
           </div>
-        </div>
+        </el-tooltip>
+      </template>
+
+      <template #cell_percentTimeInBudget="scope">
+        <el-progress :percentage="scope.row.percentTimeInBudget > 0 ? scope.row.percentTimeInBudget * 100 : 0" />
       </template>
       <template #cell_campaignName="scope">
         <el-tooltip effect="dark" :content="scope.row.campaignName" placement="top">
@@ -57,12 +53,6 @@
           </el-link>
         </el-tooltip>
       </template>
-      <!-- 类型 -->
-      <template #cell_resolvedExpression="scope">
-        <div>
-          {{ sdTypeMap[scope.row.resolvedExpression[0].type as string] }}
-        </div>
-      </template>
 
       <template #cell_adGroupName="scope">
         <el-tooltip effect="dark" :content="scope.row.adGroupName" placement="top">
@@ -71,13 +61,7 @@
           </el-link>
         </el-tooltip>
       </template>
-      <template #cell_suggestedBid="scope">
-        <div>{{ scope.row.suggestedBid ? `$${scope.row.suggestedBid}` : '--' }}</div>
-        <div class="text-range">
-          {{ scope.row.suggestedBid_lower ? `$${scope.row.suggestedBid_lower}` : '--' }} ~
-          {{ scope.row.suggestedBid_upper ? `$${scope.row.suggestedBid_upper}` : '--' }}
-        </div>
-      </template>
+
       <template #cell_MissedImpressions="scope">
         {{ scope.row.MissedImpressionsLower ?? '0' }} ~ {{ scope.row.MissedImpressionsUpper ?? '0' }}
       </template>

+ 19 - 24
src/views/adManage/sp/campaigns/CreateCampaigns/index.vue

@@ -13,8 +13,7 @@
           label-width="120px"
           class="demo-ruleForm"
           :size="formSize"
-          status-icon
-        >
+          status-icon>
           <el-form-item label="广告活动名称" prop="name" style="width: 350px">
             <el-input v-model="ruleForm.name" />
           </el-form-item>
@@ -24,7 +23,6 @@
               <el-option label="Zone two" value="beijing" />
             </el-select>
           </el-form-item>
-
           <el-form-item prop="date1" label="开始日期" style="width: 350px">
             <el-date-picker v-model="ruleForm.date1" type="date" label="开始日期" placeholder="开始日期" style="width: 100%" />
           </el-form-item>
@@ -34,9 +32,6 @@
           <el-form-item prop="budget" label="每日预算" style="width: 350px">
             <el-input v-model="ruleForm.budget" />
           </el-form-item>
-          <!-- <el-form-item label="Instant delivery" prop="delivery">
-      <el-switch v-model="ruleForm.delivery" />
-    </el-form-item> -->
           <el-form-item label="投放类型" prop="type" class="column-item">
             <el-radio-group v-model="ruleForm.type" @click="changeType">
               <div>
@@ -52,18 +47,21 @@
           <el-form-item label="竞价策略" prop="bidStrategy" class="column-item column-margin-bottom">
             <el-radio-group v-model="ruleForm.bidStrategy">
               <div>
-                <el-radio label="dynamicBid_Low" border>动态竞价-仅降低
+                <el-radio label="dynamicBid_Low" border>
+                  动态竞价-仅降低
                   <div class="radio-description-2">当您的广告不太可能带来销售时,我们将实时降低您的竞价</div>
                 </el-radio>
               </div>
               <div>
-                <el-radio label="dynamicBid_HighAndLow" border>动态竞价-提高和降低
+                <el-radio label="dynamicBid_HighAndLow" border>
+                  动态竞价-提高和降低
                   <div class="radio-description-2">
                     当您的广告很有可能带来销售时,我们将实时提高您的竞价(最高可达 100%),并在您的广告不太可能带来销售时降低您的竞价
                   </div>
                 </el-radio>
               </div>
-              <el-radio label="staticBid" border>固定竞价
+              <el-radio label="staticBid" border>
+                固定竞价
                 <div class="radio-description-2">我们将使用您的确切竞价和您设置的任何手动调整,而不会根据售出可能性对您的竞价进行更改</div>
               </el-radio>
             </el-radio-group>
@@ -77,8 +75,7 @@
             label-width="120px"
             class="demo-ruleForm"
             :size="formSize"
-            status-icon
-          >
+            status-icon>
             <el-form-item label="按展示位置调整出价" prop="placeBid">
               <p style="color: #8e9196">除了出价策略外,您还可以将出价提高多达900%</p>
               <div class="gap-items">
@@ -101,7 +98,6 @@
               </div>
             </el-form-item>
           </el-form>
-          
           <el-form-item>
             <el-button type="primary" @click="submitForm">Create</el-button>
             <el-button @click="resetForm(ruleFormRef)">Reset</el-button>
@@ -153,17 +149,17 @@ const ruleForm = reactive<RuleForm>({
   bidStrategy: 'dynamicBid_Low',
 })
 const rules = reactive<FormRules<RuleForm>>({
-  name: [ 
-    {required: true, message: 'Please input Activity name', trigger: 'blur' },
-    {min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
+  name: [
+    { required: true, message: 'Please input Activity name', trigger: 'blur' },
+    { min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
   ],
-  adMix: [ {required: false, message: 'Please select Activity zone', trigger: 'change'} ],
-  count: [ {required: true, message: 'Please select Activity count', trigger: 'change'} ],
-  date1: [ {required: true, type: 'date', message: 'Please pick a date', trigger: 'change'} ],
-  date2: [ {required: false, type: 'date', message: 'Please pick a time', trigger: 'change'} ],
-  budget: [ {required: true, message: '请输入预算', trigger: 'blur'} ],
-  type: [ {required: false, message: 'Please select at least one activity type', trigger: 'change'} ],
-  bidStrategy: [ {required: true, message: 'Please select activity resource', trigger: 'change'} ],
+  adMix: [{ required: false, message: 'Please select Activity zone', trigger: 'change' }],
+  count: [{ required: true, message: 'Please select Activity count', trigger: 'change' }],
+  date1: [{ required: true, type: 'date', message: 'Please pick a date', trigger: 'change' }],
+  date2: [{ required: false, type: 'date', message: 'Please pick a time', trigger: 'change' }],
+  budget: [{ required: true, message: '请输入预算', trigger: 'blur' }],
+  type: [{ required: false, message: 'Please select at least one activity type', trigger: 'change' }],
+  bidStrategy: [{ required: true, message: 'Please select activity resource', trigger: 'change' }],
 })
 
 const ruleFormRef2 = ref<FormInstance>()
@@ -220,10 +216,9 @@ function changeType() {
   console.log(ruleForm.type)
 }
 
-
 onMounted(() => {
   const myTest = route.query
-  console.log(222, myTest)
+  console.log('myTest', myTest)
 })
 
 defineOptions({

+ 5 - 16
src/views/adManage/sp/campaigns/index.vue

@@ -10,9 +10,7 @@
               :fetchCard="getCardData"
               :fetchLine="getLineData"
               :fetch-line-month="getLineMonthData"
-              :fetch-line-week="getLineWeekData"
-            >
-            </DataTendencyChart>
+              :fetch-line-week="getLineWeekData"></DataTendencyChart>
           </el-tab-pane>
           <el-tab-pane label="广告结构" name="adStruct">
             <AdStructChart v-if="tabActiveName === 'adStruct'" />
@@ -35,8 +33,8 @@
       <template #cell_MissedImpressions="scope">
         {{ scope.row.MissedImpressionsLower ?? '0' }} ~ {{ scope.row.MissedImpressionsUpper ?? '0' }}
       </template>
-      <template #cell_MissedClicks="scope"> {{ scope.row.MissedClicksLower ?? '0' }} ~ {{ scope.row.MissedClicksUpper ?? '0' }}</template>
-      <template #cell_MissedSales="scope"> {{ scope.row.MissedSalesLower ?? '0' }} ~ {{ scope.row.MissedSalesUpper ?? '0' }}</template>
+      <template #cell_MissedClicks="scope">{{ scope.row.MissedClicksLower ?? '0' }} ~ {{ scope.row.MissedClicksUpper ?? '0' }}</template>
+      <template #cell_MissedSales="scope">{{ scope.row.MissedSalesLower ?? '0' }} ~ {{ scope.row.MissedSalesUpper ?? '0' }}</template>
 
       <template v-for="field of Object.keys(BaseColumn)" #[`cell_${field}`]="scope">
         <DataCompare
@@ -45,12 +43,11 @@
           :prev-val="scope.row[`prev${field}`]"
           :gap-val="scope.row[`gap${field}`]"
           :date-range="dateRange"
-          :show-compare="showCompare"
-        />
+          :show-compare="showCompare" />
       </template>
       <template #toolbar-left>
         <div class="campare-switch">
-          <span>数据对比 </span>
+          <span>数据对比</span>
           <el-switch v-model="showCompare" size="small" />
         </div>
       </template>
@@ -85,7 +82,6 @@ const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context:
 const router = useRouter()
 const showCompare = ref(false)
 const jumpGroup = (row: any) => {
-  console.log(123, row)
   router.push({
     name: 'SpCampaignDetail',
     query: { campaignId: row.campaignId, tagsViewName: row.campaignName },
@@ -104,13 +100,6 @@ watch(
   { deep: true }
 )
 
-watch(
-  queryParams,
-  async () => {
-    crudExpose.doRefresh()
-  },
-  { deep: true }
-)
 </script>
 
 <style lang="scss" scoped>

+ 7 - 2
src/views/adManage/utils/enum.ts

@@ -203,9 +203,14 @@ export const dynBidOptimizationEnum = [
   {label: '自定义竞价', value: 0, color: 'warning'}
 ]
 
-export const dynStatusEnum = {
+export const dynStatusEnum:any = {
     'ENABLED' : '投放中',
-    'DISABLED' : '禁用'
+    'DISABLED' : '禁用',
+    'paused': '已暂停',
+    'enabled': '已开启',
+    'daily': '每日',
+    'T00020': '内容相关投放',
+    'T00030': '受众'
   }
 export const targetTypeEnum = {
   'PRODUCT_COLLECTION': '商品集',

+ 1 - 1
tsconfig.json

@@ -25,7 +25,7 @@
 		"isolatedModules": true /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */,
 
 		/* Strict Type-Checking Options */
-		"strict": true /* Enable all strict type-checking options. */,
+		"strict": false /* Enable all strict type-checking options. */,
 		// "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
 		// "strictNullChecks": true,              /* Enable strict null checks. */
 		// "strictFunctionTypes": true,           /* Enable strict checking of function types. */