liuxiaona 1 anno fa
parent
commit
7e6beb3f23
96 ha cambiato i file con 641 aggiunte e 191 eliminazioni
  1. 1 1
      dist/assets/_dialog.f81dc45c.css
  2. 1 1
      dist/assets/_input.443bfc7b.css
  3. 1 1
      dist/assets/_select.45a53dbb.css
  4. 1 1
      dist/assets/accountManage.e596ae97.css
  5. 1 1
      dist/assets/adqManage.c38660fd.css
  6. 0 1
      dist/assets/element-plus.42083445.css
  7. 1 0
      dist/assets/element-plus.de6aff2c.css
  8. 1 1
      dist/assets/error.c755c3af.css
  9. 1 1
      dist/assets/home.67358f3d.css
  10. 0 1
      dist/assets/index.07826104.css
  11. 1 1
      dist/assets/index.b2b9d624.js
  12. 0 1
      dist/assets/index.2610afaa.css
  13. 1 0
      dist/assets/index.28168f3c.css
  14. 1 0
      dist/assets/index.2b4782a6.css
  15. 1 0
      dist/assets/index.2bf49ec0.css
  16. 0 1
      dist/assets/index.2e049eb2.css
  17. 1 0
      dist/assets/index.3191aa97.css
  18. 1 0
      dist/assets/index.3ba3880e.css
  19. 1 0
      dist/assets/index.563e5dd5.css
  20. 0 1
      dist/assets/index.63306221.css
  21. 1 0
      dist/assets/index.648b9e10.css
  22. 1 0
      dist/assets/index.69a03749.css
  23. 0 1
      dist/assets/index.69ddcace.css
  24. 0 1
      dist/assets/index.7cc73b3f.css
  25. 0 1
      dist/assets/index.8b776482.css
  26. 0 1
      dist/assets/index.9ac83a14.css
  27. 1 0
      dist/assets/index.a956448f.css
  28. 0 1
      dist/assets/index.e0c76342.css
  29. 0 1
      dist/assets/index.e93eadb8.css
  30. 1 0
      dist/assets/index.f1d960a4.css
  31. 1 1
      dist/assets/index_head.749167cf.css
  32. 1 0
      dist/assets/login.1a99fd9e.css
  33. 0 1
      dist/assets/login.beda51df.css
  34. 1 0
      dist/assets/materialBlock.2adf2181.css
  35. 0 1
      dist/assets/materialBlock.c7482e77.css
  36. 1 1
      dist/assets/menuList.0fd4f2be.css
  37. 0 1
      dist/assets/radioGroup.0160dc8d.css
  38. 1 0
      dist/assets/radioGroup.937a6c75.css
  39. 0 1
      dist/assets/tableInfo.2ba43d84.css
  40. 1 0
      dist/assets/tableInfo.b66a93c1.css
  41. 0 1
      dist/assets/timeScreen.54304402.css
  42. 1 0
      dist/assets/timeScreen.9bc08e8b.css
  43. 4 4
      dist/index.html
  44. 1 1
      dist/js/_dialog/_dialog.4fc4a290.js
  45. 1 0
      dist/js/_drawer/_drawer.292e960a.js
  46. 0 1
      dist/js/_drawer/_drawer.69a0f214.js
  47. 1 1
      dist/js/_dropdown/_dropdown.44bd9fa0.js
  48. 1 1
      dist/js/_input/_input.65ce393b.js
  49. 1 1
      dist/js/_popconfirm/_popconfirm.0df63186.js
  50. 1 1
      dist/js/_select/_select.72445a62.js
  51. 1 1
      dist/js/api/api.eea43b67.js
  52. 1 1
      dist/js/basisMoudle/accountManage.52f3da9d.js
  53. 1 1
      dist/js/basisMoudle/error.574ddcc4.js
  54. 1 1
      dist/js/basisMoudle/home.60ef4258.js
  55. 1 0
      dist/js/basisMoudle/login.2b896cad.js
  56. 0 1
      dist/js/basisMoudle/login.79ecf05b.js
  57. 1 1
      dist/js/businessMoudle/adqManage.9a497387.js
  58. 1 1
      dist/js/collectClip/index.fc9aff48.js
  59. 0 1
      dist/js/configArea/index.3603cd6f.js
  60. 1 0
      dist/js/configArea/index.670d0b1b.js
  61. 0 0
      dist/js/element-plus/element-plus.6d451228.js
  62. 1 0
      dist/js/gdtList/index.0fe5e157.js
  63. 0 1
      dist/js/gdtList/index.46f694f6.js
  64. 1 1
      dist/js/index/index.989967a9.js
  65. 1 1
      dist/js/index/index.a78b085e.js
  66. 1 1
      dist/js/layout/index.3ad454ea.js
  67. 1 1
      dist/js/layout/index_head.f33e198f.js
  68. 1 1
      dist/js/materialBlock/materialBlock.fe6fab80.js
  69. 1 1
      dist/js/materialLibrary/index.cc5f1976.js
  70. 1 1
      dist/js/materialTs/materialTs.aa881f10.js
  71. 1 1
      dist/js/menuPermission/menuList.ab95dbfc.js
  72. 1 1
      dist/js/miniprogram/index.e3274605.js
  73. 0 0
      dist/js/question-filled/question-filled.23a894b6.js
  74. 0 1
      dist/js/radioGroup/radioGroup.5c1a2e8b.js
  75. 1 0
      dist/js/radioGroup/radioGroup.d8d723f6.js
  76. 1 1
      dist/js/tableInfo/tableInfo.8a3e1c7b.js
  77. 1 1
      dist/js/taskList/index.de60a06d.js
  78. 1 1
      dist/js/timeScreen/timeScreen.f1ce7818.js
  79. 8 0
      src/api/ApiModel.ts
  80. 2 1
      src/api/api.ts
  81. 5 0
      src/assets/style/element/index.scss
  82. 94 13
      src/components/businessMoudle/batchGdt/configArea/basicInfo/components/select.vue
  83. 63 87
      src/components/businessMoudle/batchGdt/configArea/basicInfo/index.vue
  84. 38 12
      src/components/businessMoudle/batchGdt/configArea/basicInfo/ts/basicApi.ts
  85. 7 7
      src/components/businessMoudle/batchGdt/configArea/basicInfo/ts/fillBack.ts
  86. 0 4
      src/components/businessMoudle/batchGdt/configArea/basicInfo/ts/information.ts
  87. 1 1
      src/components/businessMoudle/batchGdt/configArea/index.vue
  88. 1 1
      src/components/businessMoudle/batchGdt/configArea/originalityBasic/components/brand/brand.vue
  89. 1 1
      src/components/businessMoudle/batchGdt/configArea/originalityBasic/components/brand/brandManage.vue
  90. 1 1
      src/components/businessMoudle/batchGdt/configArea/originalityBasic/components/brand/brandUpload.vue
  91. 1 1
      src/components/businessMoudle/batchGdt/configArea/originalityBasic/components/brand/profilesManage.vue
  92. 3 1
      src/components/businessMoudle/batchGdt/configArea/ts/adBasic.ts
  93. 352 0
      src/components/businessMoudle/gdtList/account.vue
  94. 3 0
      src/components/businessMoudle/gdtList/index.vue
  95. 2 2
      src/components/businessMoudle/gdtList/indicators/index.vue
  96. 1 1
      src/components/businessMoudle/gdtList/indicators/indexDialog.vue

File diff suppressed because it is too large
+ 1 - 1
dist/assets/_dialog.f81dc45c.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/_input.443bfc7b.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/_select.45a53dbb.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/accountManage.e596ae97.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/adqManage.c38660fd.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/element-plus.42083445.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/element-plus.de6aff2c.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/error.c755c3af.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/home.67358f3d.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.07826104.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/index.b2b9d624.js


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.2610afaa.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.28168f3c.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.2b4782a6.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.2bf49ec0.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.2e049eb2.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.3191aa97.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.3ba3880e.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.563e5dd5.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.63306221.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.648b9e10.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.69a03749.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.69ddcace.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.7cc73b3f.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.8b776482.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.9ac83a14.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.a956448f.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.e0c76342.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/index.e93eadb8.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/index.f1d960a4.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/index_head.749167cf.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/login.1a99fd9e.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/login.beda51df.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/materialBlock.2adf2181.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/materialBlock.c7482e77.css


File diff suppressed because it is too large
+ 1 - 1
dist/assets/menuList.0fd4f2be.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/radioGroup.0160dc8d.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/radioGroup.937a6c75.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/tableInfo.2ba43d84.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/tableInfo.b66a93c1.css


File diff suppressed because it is too large
+ 0 - 1
dist/assets/timeScreen.54304402.css


File diff suppressed because it is too large
+ 1 - 0
dist/assets/timeScreen.9bc08e8b.css


+ 4 - 4
dist/index.html

@@ -6,7 +6,7 @@
6 6
     <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
7 7
     <title>广告系统</title>
8 8
       <script src="//open.thunderurl.com/thunder-link.js"></script>
9
-    <script type="module" crossorigin src="./assets/index.b2b9d624.js"></script>
9
+    <script type="module" crossorigin src="./assets/index.1588bb7e.js"></script>
10 10
     <link rel="modulepreload" href="./js/@vue/@vue.e7eafc10.js">
11 11
     <link rel="modulepreload" href="./js/vue-router/vue-router.647267ed.js">
12 12
     <link rel="modulepreload" href="./js/axios/axios.27022086.js">
@@ -21,14 +21,14 @@
21 21
     <link rel="modulepreload" href="./js/@ctrl/@ctrl.9c8f424f.js">
22 22
     <link rel="modulepreload" href="./js/escape-html/escape-html.d572c0fd.js">
23 23
     <link rel="modulepreload" href="./js/normalize-wheel-es/normalize-wheel-es.94de1731.js">
24
-    <link rel="modulepreload" href="./js/element-plus/element-plus.f07772b8.js">
24
+    <link rel="modulepreload" href="./js/element-plus/element-plus.6d451228.js">
25 25
     <link rel="modulepreload" href="./js/@element-plus/@element-plus.6e467d43.js">
26 26
     <link rel="modulepreload" href="./js/tslib/tslib.e35f93b8.js">
27 27
     <link rel="modulepreload" href="./js/zrender/zrender.fe59a237.js">
28 28
     <link rel="modulepreload" href="./js/echarts/echarts.5b4b2848.js">
29 29
     <link rel="stylesheet" href="./assets/nprogress.18a10d8a.css">
30
-    <link rel="stylesheet" href="./assets/element-plus.42083445.css">
31
-    <link rel="stylesheet" href="./assets/index.63306221.css">
30
+    <link rel="stylesheet" href="./assets/element-plus.de6aff2c.css">
31
+    <link rel="stylesheet" href="./assets/index.f1d960a4.css">
32 32
   </head>
33 33
   <body>
34 34
     <div id="app"></div>

File diff suppressed because it is too large
+ 1 - 1
dist/js/_dialog/_dialog.4fc4a290.js


File diff suppressed because it is too large
+ 1 - 0
dist/js/_drawer/_drawer.292e960a.js


File diff suppressed because it is too large
+ 0 - 1
dist/js/_drawer/_drawer.69a0f214.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/_dropdown/_dropdown.44bd9fa0.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/_input/_input.65ce393b.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/_popconfirm/_popconfirm.0df63186.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/_select/_select.72445a62.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/api/api.eea43b67.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/basisMoudle/accountManage.52f3da9d.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/basisMoudle/error.574ddcc4.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/basisMoudle/home.60ef4258.js


File diff suppressed because it is too large
+ 1 - 0
dist/js/basisMoudle/login.2b896cad.js


File diff suppressed because it is too large
+ 0 - 1
dist/js/basisMoudle/login.79ecf05b.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/businessMoudle/adqManage.9a497387.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/collectClip/index.fc9aff48.js


File diff suppressed because it is too large
+ 0 - 1
dist/js/configArea/index.3603cd6f.js


File diff suppressed because it is too large
+ 1 - 0
dist/js/configArea/index.670d0b1b.js


dist/js/element-plus/element-plus.f07772b8.js → dist/js/element-plus/element-plus.6d451228.js


File diff suppressed because it is too large
+ 1 - 0
dist/js/gdtList/index.0fe5e157.js


File diff suppressed because it is too large
+ 0 - 1
dist/js/gdtList/index.46f694f6.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/index/index.989967a9.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/index/index.a78b085e.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/layout/index.3ad454ea.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/layout/index_head.f33e198f.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/materialBlock/materialBlock.fe6fab80.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/materialLibrary/index.cc5f1976.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/materialTs/materialTs.aa881f10.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/menuPermission/menuList.ab95dbfc.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/miniprogram/index.e3274605.js


dist/js/question-filled/question-filled.b57e6305.js → dist/js/question-filled/question-filled.23a894b6.js


File diff suppressed because it is too large
+ 0 - 1
dist/js/radioGroup/radioGroup.5c1a2e8b.js


File diff suppressed because it is too large
+ 1 - 0
dist/js/radioGroup/radioGroup.d8d723f6.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/tableInfo/tableInfo.8a3e1c7b.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/taskList/index.de60a06d.js


File diff suppressed because it is too large
+ 1 - 1
dist/js/timeScreen/timeScreen.f1ce7818.js


+ 8 - 0
src/api/ApiModel.ts

@@ -209,6 +209,14 @@ export interface advert_detial{
209 209
     account_id?:any,
210 210
     adcreative_id?:string,
211 211
 }
212
+export interface batchAccount_list extends pageParams{
213
+    st_date:any,
214
+    en_date:any,
215
+    keyword?:string,
216
+    temp_id?:string,
217
+    field?:string,
218
+    order?:string
219
+}
212 220
 
213 221
 
214 222
 

+ 2 - 1
src/api/api.ts

@@ -86,7 +86,7 @@ export enum Api{
86 86
     directPacket_add = '/api/ad/targetingsAdd',
87 87
     directPacket_list = '/api/ad/targetingGet',
88 88
     directPacket_edit = '/api/ad/targetingsUp',
89
-    directPacket_get_behavior_list = '/api/ad/getOptimizationGoal',
89
+    directPacket_get_behavior_list = 'api/ad/moreOptimizationGoal',
90 90
     directPacket_get_customer_base_list = '/api/ad/customAudiencesGet',
91 91
     directPacket_user_os_list = '/api/ad/userOsList',
92 92
     directPacket_location_list = '/api/ad/targetingTagsGet',
@@ -110,6 +110,7 @@ export enum Api{
110 110
     batchGdt_plan_single_edit = '/api/ad/campaignEdit',
111 111
     batchGdt_advert_select = '/api/ad/getAdStatusList',
112 112
     batchGdt_advert_list = '/api/ad/adsList',
113
+    batchGdt_accountList_list = '/api/ad/accountList',
113 114
     //创意详情
114 115
     advert_detial = '/api/adcreatives/detail',
115 116
 

+ 5 - 0
src/assets/style/element/index.scss

@@ -59,4 +59,9 @@
59 59
   .el-drawer__body{
60 60
     padding-top: 0;
61 61
   }
62
+}
63
+.select-self {
64
+  .el-select-dropdown__list{
65
+    padding-bottom: 40px !important;
66
+  }
62 67
 }

+ 94 - 13
src/components/businessMoudle/batchGdt/configArea/basicInfo/components/select.vue

@@ -1,27 +1,59 @@
1 1
 <template>
2 2
   <div class="flex-baseline marB15">
3
-    <div class="form-block-item-title" v-if="title&&title!=''">{{ title }}</div>
3
+    <div class="form-block-item-title" v-if="title && title != ''">{{ title }}</div>
4 4
     <div class="flex-center" style="flex:1;flex-wrap: wrap;">
5
-      <el-select v-model="selectValue" filterable clearable :placeholder="placeholder" @change="onChange">
6
-        <el-option
7
-          v-for="item in list"
8
-          :key="item.value"
9
-          :label="item.label"
10
-          :value="item.value"
11
-        />
5
+      <el-select v-model="selectValue" popper-class="select-self" style="width:300px" filterable clearable
6
+        :placeholder="placeholder" @change="onChange">
7
+        <el-option v-for="item in selectList" :key="item.value" :label="item.label" :value="item.value" />
8
+        <template v-slot:empty v-if="isMoreTarget">
9
+          <div class="dropdown_footer" style="position: relative;">若找不到所需目标?请点这里:<span class="c-theme pointer"
10
+              @click="OnClickMore">更多目标</span></div>
11
+        </template>
12
+        <div class="dropdown_footer" v-if="isMoreTarget">若找不到所需目标?请点这里:<span class="c-theme pointer"
13
+            @click="OnClickMore">更多目标</span></div>
12 14
       </el-select>
13 15
       <slot name="content_item"></slot>
14 16
     </div>
15 17
   </div>
16
-  
18
+
19
+  <el-dialog class="gdt-dialog" append-to-body v-model="moreVisible" :title="title" width="480px" align-center>
20
+    <div class="deepexternalaction-tip">
21
+      <el-icon color="#ff9b48"><WarningFilled /></el-icon>请确保账户在广点通下可以使用该深度优化目标投放广告 </div>
22
+    <div class="flex" style="margin-bottom: 30px;">
23
+      <div class="form-block-item-title" v-if="title && title != ''">{{ title }}</div>
24
+      <div class="flex-center" style="flex:1;flex-wrap: wrap;">
25
+        <el-select v-model="moreValue" style="width:300px" filterable clearable
26
+          placeholder="请选择">
27
+          <el-option v-for="item in moreList" :key="item.value" :label="item.label" :value="item.value" />
28
+        </el-select>
29
+      </div>
30
+    </div>
31
+    <template #footer>
32
+      <span class="dialog-footer">
33
+        <el-button @click="moreVisible = false" size="default">取 消</el-button>
34
+        <el-button type="primary" @click="dialogSubmit" size="default">确 定</el-button>
35
+      </span>
36
+    </template>
37
+  </el-dialog>
17 38
 </template>
18 39
 <script setup lang="ts">
19 40
 import { onBeforeMount, ref } from 'vue'
41
+import { moreOptimizationGoal } from '../ts/basicApi'
42
+import { ElMessage } from 'element-plus'
43
+import _ from 'lodash'
20 44
 interface IList {
21 45
   value: string,
22 46
   label: string
23 47
 }
24 48
 const props = defineProps({
49
+  GoalType: {
50
+    type: Number,
51
+    default: 1,
52
+  },
53
+  isMoreTarget: {
54
+    type: Boolean,
55
+    default: false
56
+  },
25 57
   title: {
26 58
     type: String,
27 59
     default: ''
@@ -32,22 +64,71 @@ const props = defineProps({
32 64
   },
33 65
   list: {
34 66
     type: Array<IList>,
35
-    default: ()=>{[]}
67
+    default: () => { [] }
36 68
   },
37 69
   fillBack: {
38
-    type:String
70
+    type: String
39 71
   }
40 72
 })
41 73
 const emit = defineEmits<{
42 74
   (event: "change", val: any): void;
43 75
 }>();
76
+const moreVisible = ref(false)
44 77
 const selectValue = ref('')
45
-onBeforeMount(()=>{
78
+const moreValue = ref('')
79
+const moreList = ref<any[]>([])
80
+const selectList = ref(_.cloneDeep(props.list))
81
+onBeforeMount(() => {
46 82
   selectValue.value = props.fillBack || '';
47 83
   emit('change', selectValue.value)
48 84
 })
49 85
 const onChange = () => {
50 86
   emit('change', selectValue.value)
51 87
 }
88
+const OnClickMore = () => {
89
+  moreOptimizationGoal({ type: props.GoalType }).then((res: any) => {
90
+    moreVisible.value = true
91
+    moreList.value = res
92
+  }).catch(() => {
93
+    ElMessage.warning('暂无更多数据!')
94
+  })
95
+}
96
+const dialogSubmit = () => {
97
+  if(!moreValue.value || moreValue.value == ''){
98
+    ElMessage.warning('请选择目标!')
99
+    return;
100
+  }
101
+  if(selectList.value.filter((v)=>v.value == moreValue.value).length == 0){
102
+    moreList.value.forEach((item)=>{
103
+      if(item.value == moreValue.value) {
104
+        selectList.value.push(item)
105
+      }
106
+    })
107
+  }
108
+  selectValue.value = moreValue.value
109
+  moreVisible.value = false
110
+}
52 111
 </script>
53
-<style lang="scss" scoped>@import "@/assets/style/batchDialogGdt.scss";</style>
112
+<style lang="scss" scoped>
113
+@import "@/assets/style/batchDialogGdt.scss";
114
+
115
+.dropdown_footer {
116
+  position: absolute;
117
+  right: 0;
118
+  bottom: 0;
119
+  left: 0;
120
+  font-size: 14px;
121
+  background-color: #e6ecf5;
122
+  line-height: 40px;
123
+  text-align: center;
124
+}
125
+.deepexternalaction-tip{
126
+  color: #606266;
127
+  font-size: 14px;
128
+  line-height: 30px;
129
+  word-break: break-all;
130
+  display: flex;
131
+  align-items: center;
132
+  margin: 20px 0 15px;
133
+}
134
+</style>

+ 63 - 87
src/components/businessMoudle/batchGdt/configArea/basicInfo/index.vue

@@ -141,7 +141,7 @@
141 141
             @change="radioChange" :fillBack="props.dataFillBack['conversion_tracking_scene']"></MyRadio>
142 142
         </template>
143 143
         <!-- 优化目标 -->
144
-        <MySelect v-if="form.bid_mode == 'BID_MODE_OCPM' || form.bid_mode == 'BID_MODE_OCPC'" :list="optimizationGoal_1"
144
+        <MySelect v-if="form.bid_mode == 'BID_MODE_OCPM' || form.bid_mode == 'BID_MODE_OCPC'" :GoalType="1" :isMoreTarget="true" :list="optimizationGoal_1"
145 145
           title="优化目标" placeholder="请选择优化目标" :fillBack="props.dataFillBack['optimization_goal']"
146 146
           @change="(val) => { onChangeKey({ val, key: 'optimization_goal' }) }">
147 147
         </MySelect>
@@ -150,7 +150,8 @@
150 150
           :info="scheduleBidInfo.forward_link_assist_enabled"
151 151
           :fillBack="props.dataFillBack['forward_link_assist_enabled']" @change="radioChange">
152 152
           <template v-slot:content_item v-if="form.forward_link_assist_enabled == '1'">
153
-            <MySelect class="block marT15" :list="optimizationGoal_1" title="" placeholder="请选择助攻行为"
153
+            <div style="height: 15px;width:1px;"></div>
154
+            <MySelect class="block marT15" :list="moreOptimizationGoalList" title="" placeholder="请选择助攻行为"
154 155
               :fillBack="props.dataFillBack['forward_link_assist']"
155 156
               @change="(val) => { onChangeKey({ val, key: 'forward_link_assist' }) }"></MySelect>
156 157
           </template>
@@ -210,7 +211,7 @@
210 211
             :info="scheduleBidInfo.deep_optimize_type" @change="radioChange">
211 212
             <template v-slot:default v-if="form.deep_optimize_type != 0">
212 213
               <MyRadio :info="scheduleBidInfo.deep_conversion_type" :fillBack="props.dataFillBack['deep_conversion_type']" @change="radioChange"></MyRadio>
213
-              <MySelect class="marT15" :list="optimizationGoal_2" title="深度优化目标" placeholder="请选择深度优化目标" :fillBack="deep_conversion_behavior_spec.target" 
214
+              <MySelect class="marT15" :GoalType="form.deep_conversion_type == 'DEEP_CONVERSION_BEHAVIOR' ? 2 : 3" :isMoreTarget="true" :list="optimizationGoal_2" title="深度优化目标" placeholder="请选择深度优化目标" :fillBack="deep_conversion_behavior_spec.target" 
214 215
                 @change="(val) => { deep_conversion_behavior_spec.target = val; }">
215 216
               </MySelect>
216 217
               <!-- 优化转化行为 -->
@@ -303,11 +304,11 @@
303 304
 </template>
304 305
 <script setup lang="ts">
305 306
 import { ref, reactive, watch, onBeforeMount, computed, nextTick } from 'vue'
306
-import { basicInfoJson, scheduleBid, conversion_tracking_way, optimizationGoal_1, optimizationGoal_2 } from './ts/information'
307
+import { basicInfoJson, scheduleBid, conversion_tracking_way } from './ts/information'
307 308
 import { specificPositionAll, expand_targeting, unbreakable_targeting } from './ts/other'
308 309
 import { scene, wechatScene, positionMapping, search_expand_targeting_switch } from './ts/scene'
309 310
 import { FillBackData } from './ts/fillBack'
310
-import { adPresetsSet } from './ts/basicApi'
311
+import { adPresetsSet,getOptimizationGoal, moreOptimizationGoal } from './ts/basicApi'
311 312
 import { getDay, deepCopy } from "@/common/common";
312 313
 import MyRadio from './components/radio.vue'
313 314
 import AdPosition from './components/adPosition.vue'
@@ -321,6 +322,7 @@ import wildcard from './components/wildcard.vue'
321 322
 import WeekTime from './components/weekTime.vue'
322 323
 import { ElMessage } from "element-plus";
323 324
 import _ from 'lodash'
325
+
324 326
 const props = defineProps({
325 327
   visible: {
326 328
     type: Boolean,
@@ -329,6 +331,10 @@ const props = defineProps({
329 331
   dataFillBack: {
330 332
     type: Object,
331 333
     default: () => { }
334
+  },
335
+  promoted_object_type: {
336
+    type: String,
337
+    default: ''
332 338
   }
333 339
 })
334 340
 const emit = defineEmits<{
@@ -343,6 +349,9 @@ const site_ids_arr_1: any = ref([])
343 349
 const site_ids_arr_2: any = ref([])
344 350
 const scheduleBidInfo = reactive(scheduleBid)
345 351
 const specificPositionInfo2 = specificPositionAll()
352
+const optimizationGoal_1 = ref<any[]>([])
353
+const optimizationGoal_2 = ref<any[]>([])
354
+const moreOptimizationGoalList = ref<any[]>([])
346 355
 const defaultAdPositionList = ['SITE_SET_KANDIAN', 'SITE_SET_QQ_MUSIC_GAME', 'SITE_SET_TENCENT_NEWS', 'SITE_SET_TENCENT_VIDEO', 'SITE_SET_MOBILE_UNION']
347 356
 let adPositionList: any = ref([]);// 广告版位默认列表
348 357
 const deep_conversion_behavior_spec: any = reactive({ // 深度目标优化 - 优化转化行为
@@ -408,7 +417,9 @@ const computed_deep_conversion_behavior_spec_fillBack2 = () => {
408 417
 const form: any = reactive(props.dataFillBack || {})
409 418
 const basicInfoJsonInfo: any = reactive(basicInfoJson)
410 419
 onBeforeMount(() => {
411
-  
420
+  moreOptimizationGoal({type: 1}).then((res:any)=>{//助攻行为
421
+    moreOptimizationGoalList.value = res
422
+  })
412 423
 })
413 424
 /**提交保存 */
414 425
 const submitEvent = () => {
@@ -461,7 +472,10 @@ const submitEvent = () => {
461 472
   if (flag) return
462 473
 
463 474
   FillBackData({
464
-    data: form, type: 'me', 'updateScene': basicInfoJsonInfo['场景'], cb: (data: { params: any, copywriting: [] }) => {
475
+    data: form, 
476
+    type: 'me', 
477
+    updateScene: basicInfoJsonInfo['场景'],
478
+    cb: (data: { params: any, copywriting: [] }) => {
465 479
       if (adSet.value) {
466 480
         loading.value = true;
467 481
         // let setParams = _.cloneDeep(data.params)
@@ -487,6 +501,20 @@ const handleClose = () => {
487 501
 /**特定版位回调 */
488 502
 const onChangeAdPosition = (val: string) => {
489 503
   form['site_ids'] = val;
504
+  getOptimizationGoal({
505
+    site_set: val.split(','),
506
+    promoted_object_type: props.promoted_object_type
507
+  }).then((res:any)=>{
508
+    res.forEach((item)=>{
509
+      item.label = item.name;
510
+      item.value = item.goal;
511
+    })
512
+    optimizationGoal_1.value = res.filter((v)=>{return v.name && v.name != '' && v.goal && v.goal != ''});
513
+    console.log('optimizationGoal_1',optimizationGoal_1.value)
514
+  }).catch((res)=>{
515
+    optimizationGoal_1.value = [];
516
+    optimizationGoal_2.value = [];
517
+  })
490 518
   watchSiteIds()// 版位变化
491 519
 }
492 520
 const change_site_table = () => {
@@ -567,6 +595,9 @@ const radioChange = (obj: object) => {
567 595
     if(keys_arr.includes('bid_way')){//优化目标出价方式变化
568 596
       watch_deep_conversion()
569 597
     }
598
+    if(keys_arr.includes('deep_conversion_type')){//深度转化类型
599
+      changeOptimizationGoal()
600
+    }
570 601
   }
571 602
 }
572 603
 
@@ -633,10 +664,35 @@ const onChangeKey = ({ val, key }) => {
633 664
   }else if(key == 'bid_amount'){
634 665
     form[key] = val;
635 666
     computed_deep_conversion_behavior_spec_fillBack2()
667
+  }else if(key == 'optimization_goal'){// 优化目标
668
+    form[key] = val;
669
+    form['optimization_goal_name'] = optimizationGoal_1.value.filter((v: any) => { return v.value == val })[0]?.label
670
+    changeOptimizationGoal()
636 671
   }else{
637 672
     form[key] = val;
638 673
   }
639 674
 }
675
+/**优化目标 及 深度转化类型 变化 ==> 导致 深度优化目标 发生变化 */
676
+const changeOptimizationGoal = () => {
677
+  optimizationGoal_1.value.forEach((item)=>{
678
+    if(item.goal == form.optimization_goal){
679
+      let deep_info:any[] = []
680
+      if(form.deep_conversion_type == 'DEEP_CONVERSION_BEHAVIOR'){//优化转化行为
681
+        deep_info = _.cloneDeep(item.deep_behaviors) || []
682
+      }else if (form.deep_conversion_type == 'DEEP_CONVERSION_WORTH') {//优化ROI
683
+        deep_info = _.cloneDeep(item.deep_worths) || []
684
+      }
685
+      deep_info = deep_info.filter((v)=>{
686
+        return v.name && v.name != '' && v.goal && v.goal != ''
687
+      })
688
+      deep_info.forEach((v)=>{
689
+        v.label = v.name;
690
+        v.value = v.goal;
691
+      })
692
+      optimizationGoal_2.value = deep_info
693
+    }
694
+  })
695
+}
640 696
 const onChangeWechat = (flag) => {
641 697
   if (flag) {
642 698
     adPositionList.value = ['SITE_SET_MOMENTS', 'SITE_SET_WECHAT', 'SITE_SET_WECHAT_PLUGIN'].concat(defaultAdPositionList)
@@ -701,29 +757,6 @@ const watch_deep_conversion = (type?) => {
701 757
     });
702 758
   }
703 759
 }
704
-/**自动扩量监听 */
705
-// watch([
706
-//   () => form.expand_enabled
707
-// ], (newValue, oldValue) => {
708
-//   let obj = basicInfoJsonInfo['定向扩展']['smart_targeting_switch']
709
-//   if (newValue[0] == '1') {
710
-//     obj.data.list[1].disabled = true;
711
-//   } else {
712
-//     obj.data.list[1].disabled = false;
713
-//   }
714
-// }, { immediate: true})
715
-
716
-/**智能定向监听 */
717
-// watch([
718
-//   () => form.smart_targeting_switch
719
-// ], (newValue, oldValue) => {
720
-//   let obj = basicInfoJsonInfo['定向扩展']['expand_enabled']
721
-//   if (newValue[0] == '1') {
722
-//     obj.data.list[1].disabled = true;
723
-//   } else {
724
-//     obj.data.list[1].disabled = false;
725
-//   }
726
-// }, { immediate: true})
727 760
 /**监听出价 - 更改 -》 分版位出价 */
728 761
 watch([
729 762
   () => form.bid_way,
@@ -822,65 +855,8 @@ watch(
822 855
     checkedWechat.value = props.dataFillBack.bid_site_wechat_enabled == '1' ? true : false; // 支持微信朋友圈&微信公众号与小程序版位
823 856
     watch_deep_conversion()
824 857
   }, { immediate: true})
825
-/**监听数据回显 */
826
-// watch(
827
-//   () => props.dataFillBack,
828
-//   (newValue, oldValue) => {
829
-//     if (!newValue.id) return;
830
-//      form.daily_budget_radio = newValue?.daily_budget ? '2' : '1';
831
-//      for(let i in newValue){
832
-//       form[i] = newValue[i]
833
-//      }
834
-//     form.bid_scene_radio = newValue?.bid_scene == 'BID_SCENE_NORMAL_AVERAGE' || newValue?.bid_scene == 'BID_SCENE_NORMAL_TARGET' ? '' : newValue?.bid_scene;
835
-//     if(form.bid_way == '2'){
836
-//       let arr = form.bid_range?.split('-') || [];
837
-//       form.bid_range_1 = {
838
-//         con: form.bid_range,
839
-//         min: arr.length > 0 ? arr[0] : '',
840
-//         max: arr.length > 1 ? arr[1] : '',
841
-//       }
842
-//     }
843
-//     watchSiteIds()
844
-//     if (form.bid_site == '1') { // 分版位出价
845
-//       if (newValue.bid_site_details){
846
-//         let bid_site_details = JSON.parse(newValue.bid_site_details)
847
-//         site_ids_arr_1.value.forEach((item) => {
848
-//           item.coefficient = bid_site_details[item.value] || 1;
849
-//           item.offer = getOffer(bid_site_details[item.value], 'site')
850
-//         });
851
-//       }
852
-//     }
853
-//     if (newValue.deep_conversion_behavior_spec || newValue.deep_conversion_worth_spec) {
854
-//       let deep_spec = JSON.parse(newValue.deep_conversion_behavior_spec)
855
-//       if(newValue.deep_conversion_type == 'DEEP_CONVERSION_WORTH') { // 优化ROI
856
-//         deep_spec = JSON.parse(newValue.deep_conversion_worth_spec)
857
-//       }
858
-//       deep_conversion_behavior_spec.target = deep_spec.target;
859
-//       deep_conversion_behavior_spec.rate = deep_spec.rate || '';
860
-//       deep_conversion_behavior_spec.price = newValue.deep_conversion_type == 'DEEP_CONVERSION_WORTH' ? deep_spec.roi : deep_spec.price;
861
-//       deep_conversion_behavior_spec.min = deep_spec.min;
862
-//       deep_conversion_behavior_spec.max = deep_spec.max;
863
-//       deep_conversion_behavior_spec_fillBack.min = deep_spec.min;
864
-//       deep_conversion_behavior_spec_fillBack.max = deep_spec.max;
865
-//       deep_conversion_behavior_spec_fillBack2.value = newValue.deep_conversion_type == 'DEEP_CONVERSION_WORTH' ? deep_spec.roi : deep_spec.price;
866
-//     }
867
-//     if (form.deep_bid_site == '1') { // 分版位深度出价
868
-//       if (newValue.deep_bid_site_details){
869
-//         let deep_bid_site_details = JSON.parse(newValue.deep_bid_site_details)
870
-//         site_ids_arr_2.value.forEach((item) => {
871
-//           item.coefficient = deep_bid_site_details[item.value] || 1;
872
-//           item.offer = getOffer(deep_bid_site_details[item.value], 'deep_bit_site')
873
-//         });
874
-//       }
875
-//     }
876
-//     first_day_begin_time.flag = newValue.first_day_begin_time && newValue.first_day_begin_time != '' ? true : false;
877
-//     first_day_begin_time.value = newValue.first_day_begin_time.slice(0,5)
878
-//     checkedWechat.value = newValue.bid_site_wechat_enabled == '1' ? true : false; // 支持微信朋友圈&微信公众号与小程序版位
879
-//     watch_deep_conversion()
880
-//   }, { immediate: true})
881 858
 </script>
882 859
 <style lang="scss" scoped>@import "@/assets/style/batchDialogGdt.scss";
883
-
884 860
 .flex-1 {
885 861
   flex: 1;
886 862
 }</style>

+ 38 - 12
src/components/businessMoudle/batchGdt/configArea/basicInfo/ts/basicApi.ts

@@ -27,21 +27,47 @@ export async function getSceneSpecTags(params: ISceneSpecTags) {
27 27
     return []
28 28
   }
29 29
 }
30
-/**1优化目标/助攻行为   2深度优化目标 */
30
+/** 优化目标下拉列表 */
31 31
 interface IOptimizationGoal {
32
-  type: '1' | '2'
32
+  site_set: string[],
33
+  promoted_object_type: string
33 34
 }
34
-export async function getOptimizationGoal(params: IOptimizationGoal) {
35
-  const res: any = await http.get('/api/ad/getOptimizationGoal', params)
36
-  if (res.errNo == 0) {
37
-    let arr:Array<{label:string, value: string}> = [];
38
-    for(let i in res.rst){
39
-      arr.push({label: res.rst[i], value: i})
35
+export function getOptimizationGoal(params: IOptimizationGoal) {
36
+  return new Promise( async (resolve, reject)=>{
37
+    const res: any = await http.get('/api/ad/getOptimizationGoal', params)
38
+    if (res.errNo == 0 && Array.isArray(res.rst)) {
39
+      // let arr:Array<{label:string, value: string}> = [];
40
+      // res.rst.forEach((item)=>{
41
+      //   arr.push({label: item.name, value: item.goal})
42
+      // })
43
+      resolve(res.rst)
44
+    } else {
45
+      reject()
40 46
     }
41
-    return arr
42
-  } else {
43
-    return []
44
-  }
47
+  })
48
+}
49
+
50
+/** 优化目标-更多  
51
+ * 1优化目标/助攻行为   
52
+ * 2深度优化转化目标 
53
+ * 3深度优化roi目标
54
+*/
55
+interface IMoreOptimizationGoal {
56
+  type: number,
57
+}
58
+export function moreOptimizationGoal(params: IMoreOptimizationGoal) {
59
+  return new Promise( async (resolve, reject)=>{
60
+    const res: any = await http.get('api/ad/moreOptimizationGoal', params)
61
+    if (res.errNo == 0 && res.rst) {
62
+      let arr:Array<{label:string, value: string}> = [];
63
+      for(let key in res.rst){
64
+        arr.push({label: res.rst[key], value: key})
65
+      }
66
+      resolve(arr)
67
+    } else {
68
+      reject()
69
+    }
70
+  })
45 71
 }
46 72
 
47 73
 /**通配符 */

+ 7 - 7
src/components/businessMoudle/batchGdt/configArea/basicInfo/ts/fillBack.ts

@@ -1,5 +1,5 @@
1 1
 import { ElMessage } from "element-plus";
2
-import { basicInfoJson, scheduleBid, optimizationGoal_1, optimizationGoal_2 } from './information'
2
+import { basicInfoJson, scheduleBid } from './information'
3 3
 import { specificPositionAll } from './other'
4 4
 import { scene } from './scene'
5 5
 import { number, time } from "echarts";
@@ -106,7 +106,7 @@ interface IFillBackData {
106 106
   data: any,
107 107
   type: 'me' | 'api',
108 108
   cb?: Function,
109
-  updateScene?: any
109
+  updateScene?: any,
110 110
 }
111 111
 export const FillBackData = ({ data, type, updateScene = {}, cb }: IFillBackData) => {
112 112
   let copywriting: string[] = [];
@@ -176,7 +176,7 @@ export const FillBackData = ({ data, type, updateScene = {}, cb }: IFillBackData
176 176
         params['auto_acquisition_enabled'] = data.auto_acquisition_enabled
177 177
         params['auto_acquisition_amount'] = data.auto_acquisition_amount
178 178
         params['optimization_goal'] = data.optimization_goal
179
-        params['optimization_goal_name'] = optimizationGoal_1.filter((v: any) => { return v.value == data.optimization_goal })[0]?.label
179
+        params['optimization_goal_name'] = data.optimization_goal_name
180 180
         params['forward_link_assist_enabled'] = data.forward_link_assist_enabled
181 181
         params['forward_link_assist'] = data.forward_link_assist_enabled == 1 ? data.forward_link_assist : ''
182 182
         params['bid_strategy'] = data.bid_strategy
@@ -361,9 +361,9 @@ export const FillBackData = ({ data, type, updateScene = {}, cb }: IFillBackData
361 361
     }
362 362
 
363 363
     if (data.bid_mode == 'BID_MODE_OCPM' || data.bid_mode == 'BID_MODE_OCPC') {
364
-      copywriting.push(`优化目标:${optimizationGoal_1.filter((v: any) => { return v.value == data.optimization_goal })[0]?.label}`)
364
+      copywriting.push(`优化目标:${data.optimization_goal_name}`)
365 365
       if (data.forward_link_assist_enabled == 1) {
366
-        copywriting.push(`助攻行为:${optimizationGoal_1.filter((v: any) => { return v.value == data.forward_link_assist })[0]?.label}`)
366
+        // copywriting.push(`助攻行为:${optimizationGoal_1.filter((v: any) => { return v.value == data.forward_link_assist })[0]?.label}`)
367 367
       }
368 368
       copywriting.push(`出价策略:${scheduleBid.bid_strategy.data.list.filter((v: any) => { return v.value == data.bid_strategy })[0]?.label}`)
369 369
       copywriting.push(`深度转化优化:${scheduleBid.deep_optimize_type.data.list.filter((v: any) => { return v.value == data.deep_optimize_type })[0]?.label}`)
@@ -372,7 +372,7 @@ export const FillBackData = ({ data, type, updateScene = {}, cb }: IFillBackData
372 372
 
373 373
         if (data.deep_conversion_type == 'DEEP_CONVERSION_BEHAVIOR' && data.deep_conversion_behavior_spec && data.deep_conversion_behavior_spec != '') {
374 374
           let obj = JSON.parse(data.deep_conversion_behavior_spec)
375
-          copywriting.push(`深度优化目标:${optimizationGoal_2.filter((v: any) => { return v.value == obj.target })[0]?.label}`)
375
+          // copywriting.push(`深度优化目标:${optimizationGoal_2.filter((v: any) => { return v.value == obj.target })[0]?.label}`)
376 376
           if (data.bid_way == '1') {
377 377
             copywriting.push(`深度优化出价:${obj.price}元`)
378 378
           } else {
@@ -381,7 +381,7 @@ export const FillBackData = ({ data, type, updateScene = {}, cb }: IFillBackData
381 381
         }
382 382
         if (data.deep_conversion_type == 'DEEP_CONVERSION_WORTH' && data.deep_conversion_worth_spec && data.deep_conversion_worth_spec != '') {
383 383
           let obj = JSON.parse(data.deep_conversion_worth_spec)
384
-          copywriting.push(`深度优化目标:${optimizationGoal_2.filter((v: any) => { return v.value == obj.target })[0]?.label}`)
384
+          // copywriting.push(`深度优化目标:${optimizationGoal_2.filter((v: any) => { return v.value == obj.target })[0]?.label}`)
385 385
           if (data.bid_way == '1') {
386 386
             copywriting.push(`期望ROI:${obj.roi}元`)
387 387
           } else {

+ 0 - 4
src/components/businessMoudle/batchGdt/configArea/basicInfo/ts/information.ts

@@ -1,7 +1,3 @@
1
-import { getOptimizationGoal } from './basicApi'
2
-export const optimizationGoal_1 = await getOptimizationGoal({ type: '1' })
3
-export const optimizationGoal_2 = await getOptimizationGoal({ type: '2' })
4
-
5 1
 export const conversion_tracking_way = [
6 2
   { label: '点击归因', value: '1' },
7 3
   { label: '曝光归因', value: '2'},

+ 1 - 1
src/components/businessMoudle/batchGdt/configArea/index.vue

@@ -127,7 +127,7 @@
127 127
                     @submitIsOver="switch_complate_flag_creaBasicInfo"
128 128
   ></OriginalityBasic>
129 129
   <!-- 广告基本信息 -->
130
-  <BasicInfo :visible="basicInfoData.visible" :dataFillBack="basicInfoData.fillBack" @close="basicInfoClose"></BasicInfo>
130
+  <BasicInfo :visible="basicInfoData.visible" :dataFillBack="basicInfoData.fillBack" :promoted_object_type="pageInfo.targetValue" @close="basicInfoClose"></BasicInfo>
131 131
   <!-- 扩量种子人群 -->
132 132
   <ExpandPopulation :visible="basicInfoData.outerConfig.expandPopulation.visible" :accIdsList="pageInfo.accIdsList" :fillback="basicInfoData.outerConfig['expandPopulation'].value" @close="(obj)=>{basicOuterClose({val: obj?.val || null, type: obj?.type || null, key:'expandPopulation'})}" title="扩量种子人群"></ExpandPopulation>
133 133
   <!-- 一方数据助攻 - 智能定向 -->

+ 1 - 1
src/components/businessMoudle/batchGdt/configArea/originalityBasic/components/brand/brand.vue

@@ -60,7 +60,7 @@ const init = (keyword)=>{
60 60
     page: 1,
61 61
     page_size: 20,
62 62
     keyword: keyword
63
-  }).then((res)=>{
63
+  }).then((res:any)=>{
64 64
     options.value = res.data
65 65
   })
66 66
 }

+ 1 - 1
src/components/businessMoudle/batchGdt/configArea/originalityBasic/components/brand/brandManage.vue

@@ -79,7 +79,7 @@ const init = () => {
79 79
     page: pagination.page,
80 80
     page_size: pagination.page_size,
81 81
     keyword: keyword.value
82
-  }).then((res) => {
82
+  }).then((res:any) => {
83 83
     loading.value = false
84 84
     tableData.value = res.data;
85 85
     pagination.total = res.pageInfo.total

+ 1 - 1
src/components/businessMoudle/batchGdt/configArea/originalityBasic/components/brand/brandUpload.vue

@@ -120,7 +120,7 @@ const httpRequest = (params) => {
120 120
           file_type: data.rst.file_type,
121 121
           local_file: data.rst.local_file,
122 122
           type: props.type
123
-        }).then((result) => {
123
+        }).then((result:any) => {
124 124
           ruleForm['oss_url'] = result.oss_url;
125 125
           ruleForm['mType'] = result.mType;
126 126
         })

+ 1 - 1
src/components/businessMoudle/batchGdt/configArea/originalityBasic/components/brand/profilesManage.vue

@@ -83,7 +83,7 @@ const accItemEvent = (item) => {
83 83
   adcreativesGetProfiles({
84 84
     account_id: accId.value,
85 85
     profile_type: 'PROFILE_TYPE_DEFINITION'
86
-  }).then((res) => {
86
+  }).then((res:any) => {
87 87
     tableData.value = res.list;
88 88
     loading.value = false
89 89
   }).catch(() => { loading.value = false })

+ 3 - 1
src/components/businessMoudle/batchGdt/configArea/ts/adBasic.ts

@@ -119,7 +119,9 @@ export function handleAdBasic({
119 119
     getAdPresets({ 'promoted_object_type': targetRef.value?.value }).then((res) => {
120 120
       getButtonBasicOuter(res)
121 121
       FillBackData({
122
-        data: res, type: 'api', cb: (data: { params: any, copywriting: [] }) => {
122
+        data: res, 
123
+        type: 'api', 
124
+        cb: (data: { params: any, copywriting: [] }) => {
123 125
           if (data.copywriting && Array.isArray(data.copywriting) && data.copywriting.length > 0) {
124 126
             basicInfoData.copywriting = data.copywriting
125 127
             basicInfoData.fillBack = data.params

+ 352 - 0
src/components/businessMoudle/gdtList/account.vue

@@ -0,0 +1,352 @@
1
+<template>
2
+  <div>
3
+    <div class="screenBox_mini">
4
+      <Input ref="InputRef_text" title="关键词" placeholderTxt="关键词" @changeEvent="()=>init()" @clearEvent="()=>init()"/>
5
+      <TimeScreen title="时间" selectWidth="260px" :haveQuick="false" :timeIdx="1"
6
+                  ref="timeRef"
7
+                  @init="()=>init()"></TimeScreen>
8
+      <!-- <span class="pointer c-theme lMar10" @click="clearEvent">清空</span> -->
9
+      <el-button class="lMarauto" type="primary" @click="goNewPlanEvent">新建计划</el-button>
10
+    </div>
11
+    <div>
12
+      <div class="bMar10 flex">
13
+        <Dropdown title="批量操作" :list="tableInfo.moreList" @close="dropdownEvent" class="rMar10"
14
+                  :disabledFlag="tableInfo.multipleSelection&&tableInfo.multipleSelection.length == 0"></Dropdown>
15
+        <div>已选 : <span>{{tableInfo.multipleSelection&&tableInfo.multipleSelection.length}}</span></div>
16
+
17
+        <div  class="lMarauto">
18
+          <Indicators type="media_base" @refresh="init()"></Indicators>
19
+        </div>
20
+      </div>
21
+
22
+      <el-table v-loading="loading" ref="tableRef" :data="tableInfo.tableList"
23
+                :header-cell-style="tableHeaderStyle"
24
+                :key="tableInfo.updateKey" style="width: 100%;"
25
+                border empty-text="暂无数据"
26
+                row-key="campaign_id"
27
+                max-height="calc(100vh - 294px)">
28
+        <el-table-column type="selection" width="55" align="center" fixed="left"/>
29
+        <template v-for="item in tableInfo.descol">
30
+          <el-table-column :fixed="item.isfixed" :min-width="item.label.length <= 4 ? '100px' : item.label.length <= 8 ? '150px' : '180px'">
31
+            <template #header>
32
+              <div class="flex"
33
+                   :style="{ justifyContent: item.alignSelf ? item.alignSelf : 'center' }"
34
+                   :class="[tableInfo.sortKey == item.key_value ? 'active_css' : '',item.isSort ? 'pointer' : '']"
35
+                   @click="item.isSort&&sortEvent(item.key_value)">
36
+                {{ item.label }}
37
+                <el-tooltip v-if="item.tooltip && item.tooltip != item.label" placement="top" effect="dark" :content="item.tooltip"><i-ep-QuestionFilled class="lMar5 c-999 f14 pointer" /></el-tooltip>
38
+                <div v-if="item.isSort">
39
+                  <div class="sortItem"><el-icon :color="tableInfo.sortKey == item.key_value ? '#3173FF' : ''"><i-ep-CaretBottom /></el-icon></div>
40
+                </div>
41
+              </div>
42
+            </template>
43
+            <template #default="scope">
44
+              <div class="flex" :style="{ justifyContent: item.alignSelf ? item.alignSelf : 'center' }">
45
+
46
+              <!-- <div v-if="item.column == 'campaign_name'">
47
+                <span class="c-theme flex campaignName">
48
+                  <span class="pointer" @click="goAdvertEvent(scope.row.campaign_id)">{{scope.row[item.column]}}</span>
49
+                  <el-icon color="#3173FF" class="pointer lMarauto f16 icon" @click="edit_campaign_name_event(scope.row)"><i-ep-Edit /></el-icon>
50
+                </span>
51
+              </div>
52
+              <div v-else-if="item.column == 'configured_status'">
53
+                <span class="c-green" v-if="scope.row[item.column] == 'AD_STATUS_NORMAL'">正常</span>
54
+                <span class="c-red" v-else-if="scope.row[item.column] == 'AD_STATUS_SUSPEND'">暂停</span>
55
+                <span v-else>-</span>
56
+              </div>
57
+              <div v-else-if="item.column == 'speed_mode'">
58
+                <span v-if="scope.row[item.column] == 'SPEED_MODE_STANDARD'">标准投</span>
59
+                <span v-else-if="scope.row[item.column] == 'SPEED_MODE_FAST'">加速投放</span>
60
+                <span v-else>-</span>
61
+              </div>
62
+              <div v-else-if="item.column == 'operate'">
63
+                <div class="flex">
64
+                  <span class="c-theme pointer" @click="editPlanEvent(scope.row)">修改</span>
65
+                  <span class="lMar10"
66
+                        :class="scope.row.configured_status == 'AD_STATUS_NORMAL' ? 'pointer-drop c-green-opa' : 'pointer c-green'"
67
+                        @click="scope.row.configured_status == 'AD_STATUS_SUSPEND'&&batchPlanEvent(scope.row,1)">启用</span>
68
+                </div>
69
+                <div>
70
+                    <span :class="scope.row.configured_status == 'AD_STATUS_SUSPEND' ? 'pointer-drop c-red-opa' : 'pointer c-red'"
71
+                          @click="scope.row.configured_status == 'AD_STATUS_NORMAL'&&batchPlanEvent(scope.row,2)">暂停</span>
72
+                  <Popconfirm key="dele" @confirm="batchPlanEvent(scope.row,3)" :slotFlag="true">
73
+                    <template #con>
74
+                      <span class="pointer lMar10">删除</span>
75
+                    </template>
76
+                  </Popconfirm>
77
+
78
+                </div>
79
+
80
+
81
+              </div>
82
+              <div class="flex c-theme pointer" v-else-if="item.column == 'daily_budget'" @click="editPlanEvent(scope.row)">
83
+                {{scope.row[item.column] ? NumberHandle(scope.row[item.column]) : '不限'}}
84
+              </div> -->
85
+
86
+
87
+              <div class="cellDiv" :class="tableInfo.sortKey == item.key_value ? 'active_css' : ''">
88
+                <el-tooltip :disabled="!(scope.row[item.key_value] && scope.row[item.key_value].length >30)" effect="dark" :content="scope.row[item.key_value]+''">
89
+                  <div class="clampTwo line21" style="flex: 1">
90
+                    {{ scope.row[item.key_value] || scope.row[item.key_value]==0 ?
91
+                      (item.cancleForMat ? (scope.row[item.key_value] ? scope.row[item.key_value] : '-') : scope.row[item.key_value]) : '-'}}
92
+                    <span v-if="item.hasPercent&&(scope.row[item.key_value] || scope.row[item.key_value] ==0)">%</span>
93
+                  </div>
94
+                </el-tooltip>
95
+              </div>
96
+              </div>
97
+            </template>
98
+          </el-table-column>
99
+        </template>
100
+      </el-table>
101
+
102
+    </div>
103
+
104
+    <EditIpt ref="planEditIptRef" title="推广计划" @confirm="planEditConfirm"></EditIpt>
105
+    <TargetEdit ref="TargetEditRef" title="计划设置" @confirm="init"></TargetEdit>
106
+  </div>
107
+</template>
108
+<script setup lang="ts">
109
+import {getCurrentInstance, nextTick, onMounted, reactive, ref} from "vue";
110
+import Select from '@/components/capsulationMoudle/_select.vue'
111
+import TimeScreen from '@/components/capsulationMoudle/timeScreen.vue'
112
+import Input from '@/components/capsulationMoudle/_input.vue'
113
+import EditIpt from '@/components/businessMoudle/gdtList/dialog/editIpt.vue'
114
+import TargetEdit from '@/components/businessMoudle/gdtList/dialog/target.vue'
115
+import Dropdown from '@/components/capsulationMoudle/_dropdown.vue'
116
+import Popconfirm from '@/components/capsulationMoudle/_popconfirm.vue'
117
+import noData from '@/components/capsulationMoudle/noData.vue'
118
+import {listTs} from "@/components/businessMoudle/gdtList/ts/list";
119
+import {Api} from "@/api/api";
120
+import {ElMessage} from "element-plus";
121
+import {batchGdt_edit, batchAccount_list, reactiveTableAndAny} from "@/api/ApiModel";
122
+import Indicators from './indicators/index.vue'
123
+
124
+const { proxy } = getCurrentInstance() as any;
125
+// 全局方法定义
126
+const NumberHandle = proxy.$NumberHandle
127
+
128
+const emit = defineEmits<{
129
+  (event: "goNewPlan"): void;
130
+  (event: "goAdvert",campaign_id:any): void;
131
+}>();
132
+const goNewPlanEvent = () => {
133
+  emit('goNewPlan')
134
+}
135
+const goAdvertEvent = (campaign_id:any) => {
136
+  emit('goAdvert',campaign_id)
137
+}
138
+
139
+const loading = ref<boolean>(false)
140
+const tableInfo = reactive<reactiveTableAndAny>({
141
+  tableList:[],
142
+  tableList_all:[],
143
+  descol:[],
144
+  summary:[],
145
+  multipleSelection:[],
146
+  updateKey:1,
147
+  chooseAll:false,
148
+  sortKey:'',
149
+  moreList:[
150
+    {value:'1',label:'启用'},
151
+    {value:'2',label:'暂停'},
152
+    {value:'3',label:'删除'},
153
+  ],
154
+  currentPage:1,
155
+  pageSize:20,
156
+  total:0,
157
+  totalPages:0,//共多少页
158
+})
159
+
160
+
161
+
162
+//批量操作
163
+const batchEvent = () => {
164
+
165
+}
166
+
167
+// 启用 暂停 删除
168
+const batchPlanApi = async (arr?:any,val?:any) => {
169
+  const paramsModel = reactive<batchGdt_edit>({
170
+    campaign_infos:JSON.stringify(arr),
171
+    flag:val?val:0
172
+  })
173
+  let res:any = await proxy.$http.post(Api.batchGdt_plan_batch_edit,paramsModel)
174
+  ElMessage.info(res.errMsg)
175
+  if(res&&res.errNo=='0'){
176
+    init()
177
+    tableInfo.multipleSelection = []
178
+  }else{
179
+    loading.value = false
180
+  }
181
+}
182
+const batchPlanEvent = async (row?:any,val?:any) => {
183
+  loading.value = true
184
+  let arr:any = []
185
+  arr.push({
186
+    account_id:row.account_id,
187
+    campaign_id:row.campaign_id
188
+  })
189
+  batchPlanApi(arr,val)
190
+
191
+}
192
+const dropdownEvent = (val: string | number | object) => {
193
+  loading.value = true
194
+  let arr:any = []
195
+  tableInfo.multipleSelection.forEach(item=>{
196
+    arr.push({
197
+      account_id:item.account_id,
198
+      campaign_id:item.campaign_id
199
+    })
200
+  })
201
+  batchPlanApi(arr,val)
202
+}
203
+
204
+//修改计划
205
+const editPlanEvent = (row:any) => {
206
+  nextTick(()=>{
207
+    TargetEditRef.value!.switchShow(true,row)
208
+  })
209
+}
210
+//修改计划名称
211
+const edit_campaign_name_event = (row:any) => {
212
+  nextTick(()=>{
213
+    planEditIptRef.value!.switchShow(true,row.campaign_name)
214
+  })
215
+}
216
+//推广计划 - 确定
217
+const planEditConfirm = () => {
218
+
219
+}
220
+
221
+
222
+//排序
223
+const sortEvent = (row:any) => {
224
+
225
+}
226
+
227
+//列表
228
+const init = async () => {
229
+  loading.value = true
230
+  const paramsModel = reactive<batchAccount_list>({
231
+    keyword:InputRef_text.value!.value,
232
+    st_date:timeRef.value!.dateVal&&timeRef.value!.dateVal[0],
233
+    en_date:timeRef.value!.dateVal&&timeRef.value!.dateVal[1],
234
+  })
235
+  let res:any = await proxy.$http.get(Api.batchGdt_accountList_list,paramsModel)
236
+  loading.value = false
237
+  if(res&&res.errNo=='0'){
238
+    tableInfo.summary = res.rst.summary;
239
+    tableInfo.descol = res.rst.explain;
240
+    tableInfo.tableList = res.rst.list;
241
+  }else{
242
+    ElMessage.error(res.errMsg)
243
+  }
244
+}
245
+
246
+
247
+//清空值
248
+const clearChooseVal = ()=>{
249
+  tableInfo.chooseAll = false
250
+  tableInfo.multipleSelection = []
251
+}
252
+//添加值
253
+const multipleSelection_add = (item?:any) => {
254
+  let idx:number = tableInfo.multipleSelection.findIndex(n=>n.campaign_id == item.campaign_id)
255
+  if(idx<0){
256
+    tableInfo.multipleSelection.push(item)
257
+  }
258
+}
259
+//删除值
260
+const multipleSelection_splice = (item?:any) => {
261
+  let idx:number = tableInfo.multipleSelection.findIndex(n=>n.campaign_id == item.campaign_id)
262
+  if(idx>=0){
263
+    tableInfo.multipleSelection.splice(idx,1)
264
+  }
265
+}
266
+const handleCommandChoosePage = async (command: string | number | object)=>{
267
+  let arr:any = tableInfo.tableList
268
+  clearChooseVal()
269
+  tableInfo.chooseAll = true
270
+  if(command == 2){ // 全部
271
+    await init()
272
+    arr = tableInfo.tableList_all
273
+  }
274
+  arr.forEach(item=>{
275
+    multipleSelection_add(item)
276
+  })
277
+}
278
+//全选
279
+const allChooseCheckboxEvent = (val:string | number | boolean)=>{
280
+  tableInfo.tableList.forEach(item=>{
281
+    if(val){
282
+      multipleSelection_add(item)
283
+    }else{
284
+      tableInfo.multipleSelection = []
285
+    }
286
+  })
287
+}
288
+//单选
289
+const singleChooseCheckboxEvent = (idx:number,row:any)=>{
290
+  if(idx==-1){
291
+    tableInfo.multipleSelection.push(row)
292
+  }else{
293
+    tableInfo.multipleSelection.splice(idx,1)
294
+    tableInfo.chooseAll = false
295
+  }
296
+}
297
+
298
+
299
+const {
300
+  init_acList,
301
+  pageInfo,
302
+  timeRef,
303
+  acRef,
304
+  statusRef,
305
+  InputRef_text,
306
+  clearEvent,
307
+  tableHeaderStyle,
308
+  planEditIptRef,
309
+  TargetEditRef,
310
+  customIndEvent
311
+} = listTs()
312
+
313
+onMounted(()=>{
314
+  nextTick(async ()=>{
315
+    await init_acList()
316
+    await init()
317
+  })
318
+})
319
+</script>
320
+<style lang="scss" scoped>
321
+.el-table th div.cell {
322
+  white-space: nowrap;
323
+  text-overflow: ellipsis;
324
+  overflow: hidden;
325
+  max-width: 600px; /* 设置最大宽度,根据需要调整 */
326
+}
327
+.campaignName{
328
+  .icon{
329
+    color: #3173FF;
330
+    opacity: 0;
331
+  }
332
+  &:hover{
333
+    .icon{
334
+      opacity: 1;
335
+    }
336
+  }
337
+}
338
+.checkBoxSelf{
339
+  width: 13px;
340
+  height: 13px;
341
+  border: 1px solid #d9d9d9;
342
+  border-radius: 2px;
343
+  &:hover{
344
+    cursor: pointer;
345
+    border: 1px solid #3173FF;
346
+  }
347
+  &.active{
348
+    border: 1px solid #3173FF;
349
+    background-color: #3173FF;
350
+  }
351
+}
352
+</style>

+ 3 - 0
src/components/businessMoudle/gdtList/index.vue

@@ -9,6 +9,7 @@
9 9
   <!-- 表格组件 -->
10 10
   <keep-alive>
11 11
     <div>
12
+      <account v-show="typeAc == 'account'"  @goAdvert="goAdvert"  @goNewPlan="goNewPlan"></account>
12 13
       <plan v-show="typeAc == 'plan'"  @goAdvert="goAdvert"  @goNewPlan="goNewPlan"></plan>
13 14
       <advert v-show="typeAc == 'advert'" ref="advertRef"
14 15
               @goNewPlan="goNewPlan"
@@ -21,6 +22,7 @@ import {getCurrentInstance, markRaw, nextTick, onBeforeMount, onMounted, reactiv
21 22
 import { useRouter } from "vue-router";
22 23
 import advert from "@/components/businessMoudle/gdtList/advert.vue";
23 24
 import plan from "@/components/businessMoudle/gdtList/plan.vue";
25
+import account from "@/components/businessMoudle/gdtList/account.vue";
24 26
 import {publicSwitchType} from "@/components/businessMoudle/switchType";
25 27
 import {reactiveTableAndAny} from "@/api/ApiModel";
26 28
 
@@ -31,6 +33,7 @@ const NumberHandle = proxy.$NumberHandle
31 33
 
32 34
 // 类型切换公共ts
33 35
 const typeListParams = reactive([
36
+    {name:'媒体账户',key:'account'},
34 37
   {name:'推广计划',key:'plan'},
35 38
   {name:'广告',key:'advert'},
36 39
 ])

+ 2 - 2
src/components/businessMoudle/gdtList/indicators/index.vue

@@ -75,7 +75,7 @@ const selectTemplate = (info) => {
75 75
     type: props.type
76 76
   }).then((res)=>{
77 77
     ElMessage.success(`自定义指标“${info.name}”应用成功!`)
78
-    getTemplate()
78
+    saveSuccess({ refreshList: true })
79 79
     loading.value = false
80 80
   }).catch(()=>{
81 81
     loading.value = false
@@ -89,7 +89,7 @@ const deleteTemplate = (info) => {
89 89
     temp_id: info.id,
90 90
   }).then((res)=>{
91 91
     ElMessage.success(`删除自定义指标“${info.name}”成功!`)
92
-    getTemplate()
92
+    saveSuccess({ refreshList: true })
93 93
     loading.value = false
94 94
   }).catch(()=>{
95 95
     loading.value = false

+ 1 - 1
src/components/businessMoudle/gdtList/indicators/indexDialog.vue

@@ -25,7 +25,7 @@
25 25
               <div class="indicator-group"><span>{{ item.label }}</span></div>
26 26
               <el-row :gutter="1">
27 27
                 <el-col :span="8" v-for="child_item in item.child">
28
-                  <el-tooltip :content="child_item.label" :disabled="child_item.label?.length < 16" placement="top">
28
+                  <el-tooltip :content="`${child_item.tooltip}`" :disabled="!child_item.tooltip || child_item.tooltip == child_item.label && child_item.label?.length < 16" placement="top">
29 29
                     <el-checkbox class="checkbox-item" :label="child_item.key_value"
30 30
                       :disabled="child_item.disabled == 1">{{
31 31
                         child_item.label }}</el-checkbox>