Browse Source

定向包

liuxiaona 1 year ago
parent
commit
91969a2ed2

+ 1 - 0
src/api/ApiModel.ts

@@ -152,6 +152,7 @@ export interface directPacket extends pageParams{
152 152
     device_price?:string,
153 153
     account_id?:any,
154 154
     type?:string,
155
+    targeting_id?:string
155 156
 }
156 157
 
157 158
 

+ 1 - 1
src/api/api.ts

@@ -79,7 +79,7 @@ export enum Api{
79 79
     //定向包
80 80
     directPacket_add = '/api/ad/targetingsAdd',
81 81
     directPacket_list = '/api/ad/targetingGet',
82
-    directPacket_detial = '/api/ad/targetingsUp',
82
+    directPacket_edit = '/api/ad/targetingsUp',
83 83
     directPacket_get_behavior_list = '/api/ad/getOptimizationGoal',
84 84
     directPacket_get_customer_base_list = '/api/ad/customAudiencesGet',
85 85
     directPacket_user_os_list = '/api/ad/userOsList',

+ 2 - 0
src/components/basisMoudle/layout/index_head.vue

@@ -37,6 +37,8 @@ const size = ref<string>('small')
37 37
     padding: 0;
38 38
     background-color: #F7F7F7;;
39 39
     color: #161E46;
40
+    height: calc(100vh - 70px);
41
+    overflow-y: auto;
40 42
   }
41 43
 }
42 44
 </style>

+ 5 - 6
src/components/businessMoudle/batchGdt/configArea/checkGroup.vue

@@ -33,7 +33,7 @@ import {nextTick, onMounted, reactive, ref} from "vue";
33 33
 import {reactiveTableAndAny} from "@/api/ApiModel";
34 34
 interface Emits {
35 35
   (event: "changeEvent", val: string | number | boolean): void;
36
-  (event: "returnEvent", val: any): void;
36
+  (event: "returnEvent", val: any,flag?:boolean): void;
37 37
 }
38 38
 const emit = defineEmits<Emits>();
39 39
 
@@ -71,18 +71,17 @@ const changeEvent=(val:any)=>{
71 71
   if(flag){
72 72
     pageInfo.acIdx = 0
73 73
     pageInfo.values = ['unlimited']
74
-    emit('returnEvent',[{name:'不限',value:'unlimited'}])
74
+    emit('returnEvent',[{name:'不限',value:'unlimited'}],true)
75 75
   }else{
76 76
     returnValueEvent()
77 77
   }
78
-
79 78
 }
80 79
 
81 80
 //不限-点击
82 81
 const unlimitedChange = () => {
83 82
   pageInfo.acIdx = 0
84 83
   pageInfo.values = ['unlimited']
85
-  emit('returnEvent',[{name:'不限',value:'unlimited'}])
84
+  emit('returnEvent',[{name:'不限',value:'unlimited'}],true)
86 85
 }
87 86
 
88 87
 //返回值
@@ -95,7 +94,7 @@ const returnValueEvent = ()=>{
95 94
       }
96 95
     })
97 96
   })
98
-  emit('returnEvent',reVal)
97
+  emit('returnEvent',reVal,true)
99 98
 }
100 99
 
101 100
 // 暴露自己的属性供父组件使用
@@ -105,7 +104,7 @@ defineExpose({
105 104
 
106 105
 onMounted(()=>{
107 106
   nextTick(()=>{
108
-    emit('returnEvent',[{name:'不限',value:'unlimited'}])
107
+    emit('returnEvent',[{name:'不限',value:'unlimited'}],false)
109 108
   })
110 109
 })
111 110
 </script>

+ 33 - 11
src/components/businessMoudle/batchGdt/configArea/directPacket/index.vue

@@ -62,25 +62,47 @@ const pageInfo = reactive<reactiveTableAndAny>({
62 62
 
63 63
 const wayChange = (val:any) => {
64 64
   pageInfo.exposeObj.type = val.value
65
+  if(pageInfo.exposeObj.type=='2'){
66
+    comRef2.value!.echoChooseList()
67
+  }else if(pageInfo.exposeObj.type=='1'){
68
+    comRef.value!.echoChooseList()
69
+  }
65 70
 }
66 71
 
67 72
 const loading = ref<boolean>(false)
68
-const comRef = ref<{ExposeChooseList:()=>void,echoInit:()=>void,init:()=>void,clearTableSelect:()=>void}>()
69
-const comRef2 = ref<{ExposeChooseList:()=>void,echoInit:()=>void,init:()=>void,clearTableSelect:()=>void}>()
73
+const comRef = ref<{ExposeChooseList:()=>void,echoInit:()=>void,init:()=>void,clearTableSelect:()=>void,echoChooseList:()=>void}>()
74
+const comRef2 = ref<{ExposeChooseList:()=>void,echoInit:()=>void,init:()=>void,clearTableSelect:()=>void,echoChooseList:()=>void}>()
70 75
 
71 76
 //确定按钮
72 77
 const confirmEvent = () => {
73 78
   nextTick(async ()=>{
74
-    if(pageInfo.exposeObj.type=='1'){ //使用定向包
75
-      pageInfo.exposeObj.chooseList = _.cloneDeep(comRef.value!.ExposeChooseList())
76
-      comRef.value!.clearTableSelect()
77
-    }else if(pageInfo.exposeObj.type=='2'){ //使用定向包内容
78
-      pageInfo.exposeObj.chooseList = _.cloneDeep(comRef2.value!.ExposeChooseList())
79
-      comRef2.value!.clearTableSelect()
79
+    let Obj:any = pageInfo.exposeObj
80
+    let flag:boolean = true //是否符合条件
81
+    // 将选中的赋值给本页面
82
+    if(Obj.type=='1'){ //使用定向包
83
+      Obj.chooseList = _.cloneDeep(comRef.value!.ExposeChooseList())
84
+    }else if(Obj.type=='2'){ //使用定向包内容
85
+      Obj.chooseList = _.cloneDeep(comRef2.value!.ExposeChooseList())
86
+    }
87
+    //判断是否符合条件
88
+    for(var i=0;i<Obj.chooseList.length;i++){
89
+      let item:any = Obj.chooseList[i]
90
+      if((item.chooseList && item.chooseList.length<=0) || !item.chooseList){
91
+        ElMessage.error(item.id+'账户的定向包还未选择!')
92
+        flag = false
93
+        break
94
+      }
95
+    }
96
+    // 符合再关闭弹框之类的
97
+    if(flag) {
98
+      if(Obj.type=='1'){ //使用定向包
99
+        comRef.value!.clearTableSelect()
100
+      }else if(Obj.type=='2'){ //使用定向包内容
101
+        comRef2.value!.clearTableSelect()
102
+      }
103
+      await emit('assignEvent',Obj)
104
+      dialogShow.value = false
80 105
     }
81
-    console.log(pageInfo.exposeObj);
82
-    await emit('assignEvent',pageInfo.exposeObj)
83
-    dialogShow.value = false
84 106
   })
85 107
 }
86 108
 

+ 50 - 10
src/components/businessMoudle/batchGdt/configArea/directPacket/newDirecPacket.vue

@@ -15,8 +15,8 @@
15 15
         <Input class="bMar20" ref="InputRef_name" spanTitleWidth="112px" :showTitle="true" title="定向包名称" inputWidth="400px" maxLength="15"/>
16 16
         <template v-for="item in pageInfo.jsonInfo">
17 17
           {{item.value}}
18
-          <CheckGroup v-if="item.isMultiple" :checkList="item.list" :haveNotes="item.haveNotes" :haveFlex="item.haveFlex" :title="item.name" :key="item.EgName" @returnEvent="val=>{item.value = val,getEstimation(4)}"></CheckGroup>
19
-          <RadioGroup v-else :radioList="item.list" :title="item.name"  :haveNotes="item.haveNotes" :haveFlex="item.haveFlex" :key="item.EgName" @returnEvent="val=>reEvent(val,item)">
18
+          <CheckGroup v-if="item.isMultiple" :checkList="item.list" :haveNotes="item.haveNotes" :haveFlex="item.haveFlex" :title="item.name" :key="item.EgName" @returnEvent="(val,flag)=>reEventCheck(val,item,flag)"></CheckGroup>
19
+          <RadioGroup v-else :radioList="item.list" :title="item.name"  :haveNotes="item.haveNotes" :haveFlex="item.haveFlex" :key="item.EgName" @returnEvent="(val,flag)=>reEvent(val,item,flag)">
20 20
             <template v-if="item.EgName=='geo_location'" v-slot:appoint>
21 21
               <div class="tMar20">
22 22
                 <el-checkbox-group v-model="pageInfo.locationCheckList">
@@ -71,7 +71,7 @@
71 71
 </template>
72 72
 <script setup lang="ts">
73 73
 import {computed, getCurrentInstance, inject, nextTick, onMounted, reactive, ref} from "vue";
74
-import {collectParam, directPacket, reactiveTableAndAny} from "@/api/ApiModel";
74
+import { directPacket, reactiveTableAndAny} from "@/api/ApiModel";
75 75
 import Dialog from '@/components/capsulationMoudle/_dialog.vue'
76 76
 import RadioGroup from '@/components/businessMoudle/batchGdt/configArea/radioGroup.vue'
77 77
 import CheckGroup from '@/components/businessMoudle/batchGdt/configArea/checkGroup.vue'
@@ -83,7 +83,7 @@ import Select from '@/components/capsulationMoudle/_select.vue'
83 83
 import {ElMessage} from "element-plus";
84 84
 import {Api} from "@/api/api";
85 85
 import Input from '@/components/capsulationMoudle/_input.vue'
86
-
86
+import _ from "lodash";
87 87
 
88 88
 
89 89
 const { proxy } = getCurrentInstance() as any;
@@ -94,6 +94,14 @@ const emit = defineEmits<{
94 94
   (event: "init"): void;
95 95
 }>();
96 96
 
97
+const props = withDefaults(defineProps<{
98
+  id?: string,
99
+  echoList?: any,
100
+}>(), {
101
+  id: '',
102
+  echoList: []
103
+})
104
+
97 105
 //得到上边传来的值
98 106
 const inject_accountId = inject('accountId')
99 107
 
@@ -312,18 +320,18 @@ const age_min = ref<number>(14)
312 320
 const age_max = ref<number>(66)
313 321
 const ageEvent = (item:any) => {
314 322
   item.value.subValue = age_min.value + '至' + age_max.value + '岁'
315
-  getEstimation(1)
323
+  getEstimation()
316 324
 }
317 325
 //排除已转化用户
318 326
 const transformation_behaviorRef = ref<{value:any}>()
319 327
 const behaviorEvent = (val:any,item:any) => {
320 328
   item.value.subValue = pageInfo.transformation_behavior_list[pageInfo.transformation_behavior_list.findIndex(n=>n.key == val)]
321
-  getEstimation(2)
329
+  getEstimation()
322 330
 }
323 331
 
324 332
 
325 333
 //回显值
326
-const reEvent = (val:any,item:any) => {
334
+const reEvent = (val:any,item:any,flag?:boolean) => {
327 335
   item.value = val
328 336
   if(item.EgName=='age'&&item.value.value=='appoint'){
329 337
     nextTick(()=>{
@@ -336,7 +344,15 @@ const reEvent = (val:any,item:any) => {
336 344
       transformation_behaviorRef.value!.value = ''
337 345
     })
338 346
   }
339
-  getEstimation(3)
347
+  if(flag){
348
+    getEstimation()
349
+  }
350
+}
351
+const reEventCheck = (val:any,item:any,flag?:boolean) => {
352
+  item.value = val
353
+  if(flag){
354
+    getEstimation()
355
+  }
340 356
 }
341 357
 
342 358
 const init = () => {
@@ -344,7 +360,7 @@ const init = () => {
344 360
 }
345 361
 
346 362
 //获取预览展示的信息
347
-const getEstimation =  (test?:number) => {
363
+const getEstimation =  () => {
348 364
   nextTick(async()=>{
349 365
     let obj:directPacket = {}
350 366
     pageInfo.jsonInfo.forEach(item=>{
@@ -455,8 +471,15 @@ const confirmEvent = async () => {
455 471
     targeting_name:InputRef_name.value!.value,
456 472
     account_id: inject_accountId,
457 473
   })
474
+  let api:string = Api.directPacket_add
475
+  //如果是编辑
476
+  if(props.id){
477
+    paramsModel.targeting_id = JSON.parse(JSON.stringify(props.id))
478
+    api = Api.directPacket_edit
479
+  }
458 480
 
459
-  let res:any = await proxy.$http.post(Api.directPacket_add,{...paramsModel,...obj})
481
+  return
482
+  let res:any = await proxy.$http.post(api,{...paramsModel,...obj})
460 483
   loading.value = false
461 484
   ElMessage.info(res.errMsg)
462 485
   if(res&&res.errNo=='0'){
@@ -466,6 +489,16 @@ const confirmEvent = async () => {
466 489
   }
467 490
 }
468 491
 
492
+//编辑回显
493
+const editEchoEcent = () => {
494
+  let taregtArr:any = _.cloneDeep(props.echoList)
495
+  if(taregtArr&&taregtArr.length==0){//全是不限
496
+
497
+  }else{
498
+
499
+  }
500
+}
501
+
469 502
 
470 503
 
471 504
 // 切换显隐
@@ -481,6 +514,13 @@ const switchShow = (val:boolean)=>{
481 514
 
482 515
       get_location_list()
483 516
 
517
+      //得到右边人群覆盖的数据
518
+      getEstimation()
519
+
520
+      console.log(props.id);
521
+      if(props.id){ //编辑
522
+        editEchoEcent()
523
+      }
484 524
     })
485 525
   }
486 526
 }

+ 0 - 1
src/components/businessMoudle/batchGdt/configArea/directPacket/newDirecPacket_preview.vue

@@ -62,7 +62,6 @@
62 62
           </div>
63 63
         </div>
64 64
       </div>
65
-
66 65
     </div>
67 66
   </div>
68 67
 

+ 19 - 3
src/components/businessMoudle/batchGdt/configArea/directPacket/useDirect.vue

@@ -48,7 +48,7 @@
48 48
 
49 49
     </div>
50 50
     <!--    新建定向包-->
51
-    <NewDirecPacket ref="NewDirecPacketRef" @init="get_direct_list()"></NewDirecPacket>
51
+    <NewDirecPacket ref="NewDirecPacketRef" @init="get_direct_list()" :id="pageInfo.targeting_id+''" :echoList="pageInfo.targeting"></NewDirecPacket>
52 52
   </div>
53 53
 
54 54
 </template>
@@ -80,6 +80,8 @@ const props = withDefaults(defineProps<{
80 80
 const pageInfo = reactive<reactiveTableAndAny>({
81 81
   accList:[],
82 82
   accId:-1,
83
+  targeting_id:'',
84
+  targeting:[]
83 85
 })
84 86
 
85 87
 //暴露出需要的值
@@ -102,6 +104,7 @@ const accItemEvent = async (item:any,idx:number) => {
102 104
 //打开新建定向
103 105
 const NewDirecPacketRef = ref<{switchShow:(val:boolean)=>void}>()
104 106
 const newAddEvent = () => {
107
+  pageInfo.targeting_id = ''
105 108
   nextTick(()=>{
106 109
     NewDirecPacketRef.value!.switchShow(true)
107 110
   })
@@ -123,7 +126,11 @@ const selectEvent = (obj:any)=>{
123 126
 
124 127
 //编辑
125 128
 const editEvent = (item:any) => {
126
-
129
+  pageInfo.targeting_id = item.targeting_id
130
+  pageInfo.targeting = item.targeting
131
+  nextTick(()=>{
132
+    NewDirecPacketRef.value!.switchShow(true)
133
+  })
127 134
 }
128 135
 
129 136
 const InputRef_text = ref<{value:string}>()
@@ -180,12 +187,21 @@ const clearTableSelect = () => {
180 187
   tableListRef.value!.clearSelected()
181 188
 }
182 189
 
190
+//回显选中的 - 切换使用方式
191
+const echoChooseList = () => {
192
+  if(pageInfo.accId){
193
+    let idx:number = pageInfo.accList.findIndex(n=>n.id == pageInfo.accId)
194
+    tableListRef.value!.toggleSelected(pageInfo.accList&&pageInfo.accList[idx].chooseList,true)
195
+  }
196
+}
197
+
183 198
 // 父组件共享值
184 199
 defineExpose({
185 200
   ExposeChooseList,
186 201
   echoInit,
187 202
   init,
188
-  clearTableSelect
203
+  clearTableSelect,
204
+  echoChooseList
189 205
 });
190 206
 
191 207
 //传值

+ 29 - 18
src/components/businessMoudle/batchGdt/configArea/directPacket/useDirectCon.vue

@@ -59,7 +59,6 @@
59 59
     <!--    新建定向包-->
60 60
     <NewDirecPacket ref="NewDirecPacketRef" @init="get_direct_list()"></NewDirecPacket>
61 61
   </div>
62
-
63 62
 </template>
64 63
 <script setup lang="ts">
65 64
 import {getCurrentInstance, inject, nextTick, onMounted, provide, reactive, ref, toRef} from "vue";
@@ -71,7 +70,7 @@ import TableList from '@/components/capsulationMoudle/tableList.vue'
71 70
 import Input from '@/components/capsulationMoudle/_input.vue'
72 71
 import {publicTableTs} from "@/components/businessMoudle/tableInfo";
73 72
 import NewDirecPacket from "@/components/businessMoudle/batchGdt/configArea/directPacket/newDirecPacket.vue";
74
-import _ from "lodash";
73
+import _, {iteratee} from "lodash";
75 74
 
76 75
 
77 76
 
@@ -101,12 +100,10 @@ const accRef = ref<{value:any}>()
101 100
 const accItemEvent = async (val:any) => {
102 101
   pageInfo.accId = val
103 102
   let idx:number = pageInfo.accList.findIndex(n=>n.id == val)
104
-  let obj:any = pageInfo.accList[idx].chooseList
103
+  let arr:any = pageInfo.accList[idx].chooseList
105 104
   await get_direct_list()
106
-  if(obj && obj.length>0){
107
-    nextTick(()=>{
108
-      tableListRef.value!.toggleSelected(obj,true)
109
-    })
105
+  if(arr && arr.length>0){
106
+    tableListRef.value!.toggleSelected(arr,true)
110 107
   }
111 108
 }
112 109
 
@@ -195,6 +192,8 @@ const get_direct_list = async (page?:any,pageSize?:any) => {
195 192
     ElMessage.error(res.errMsg)
196 193
   }
197 194
 }
195
+
196
+
198 197
 const init = async () => {
199 198
   await initAccList()
200 199
   await get_direct_list()
@@ -205,21 +204,37 @@ const inject_echoAcId = inject('echoAcId')
205 204
 
206 205
 const initAccList = () => {
207 206
   pageInfo.accList = _.cloneDeep(inject_accountIds)
208
-  accRef.value!.value = pageInfo.accList[0].id
207
+  accRef.value!.value = pageInfo.accList&&pageInfo.accList.length> 0 ? pageInfo.accList[0].id : -1
209 208
   pageInfo.accId = accRef.value!.value
210 209
   tableListRef.value!.clearSelected()
211 210
 }
212 211
 
212
+//回显选中的 - 切换使用方式
213
+const echoChooseList = () => {
214
+  if(pageInfo.accId){
215
+    let idx:number = pageInfo.accList.findIndex(n=>n.id == pageInfo.accId)
216
+    let arr:any = pageInfo.accList&&pageInfo.accList[idx].chooseList
217
+    if(arr&&arr.length>0){
218
+      tableListRef.value!.toggleSelected(arr,true)
219
+    }
220
+  }
221
+}
213 222
 
214 223
 //编辑初始化
215
-const echoInit = () => {
224
+const echoInit = async () => {
216 225
   let flag:boolean = props.echoValue&&props.echoValue.length>0
217 226
   pageInfo.accList = flag ? props.echoValue : _.cloneDeep(inject_accountIds)
218 227
   pageInfo.accId = inject_echoAcId
219
-  accRef.value!.value = inject_echoAcId
228
+  nextTick(()=>{accRef.value!.value = pageInfo.accId})
229
+  await get_direct_list()
230
+  // pageInfo.chooseList = _.cloneDeep(pageInfo.accList)
220 231
   if(flag&&pageInfo.accId){
221 232
     let idx:number = pageInfo.accList.findIndex(n=>n.id == pageInfo.accId)
222
-    tableListRef.value!.toggleSelected(pageInfo.accList&&pageInfo.accList[idx].chooseList,true)
233
+    let arr:any = pageInfo.accList&&pageInfo.accList[idx].chooseList
234
+
235
+    if(arr&&arr.length>0){
236
+      tableListRef.value!.toggleSelected(arr,true)
237
+    }
223 238
   }
224 239
 }
225 240
 
@@ -247,22 +262,18 @@ const ExposeChooseList = () => {
247 262
 const clearTableSelect = () => {
248 263
   tableListRef.value!.clearSelected()
249 264
 }
250
-
251
-// 将选中的值回显到表格中,切换select的时候
252
-const chooseItemToTableList = () => {
253
-
254
-}
255
-
256 265
 // 父组件共享值
257 266
 defineExpose({
258 267
   ExposeChooseList,
259 268
   echoInit,
260 269
   init,
261
-  clearTableSelect
270
+  clearTableSelect,
271
+  echoChooseList
262 272
 });
263 273
 
264 274
 //传值
265 275
 provide('accountId',toRef(pageInfo,'accId'))
276
+
266 277
 </script>
267 278
 <style lang="scss" scoped>
268 279
 @import "src/assets/style/batchGdt.scss";

+ 5 - 5
src/components/businessMoudle/batchGdt/configArea/radioGroup.vue

@@ -6,7 +6,7 @@
6 6
       <template v-if="radioList&&radioList.length>0">
7 7
         <div :class="haveFlex ? 'haveFlex' : ''">
8 8
           <div class="flex">
9
-            <el-radio-group v-model="value" @change="returnValueEvent">
9
+            <el-radio-group v-model="value" @change="val=>returnValueEvent(true)">
10 10
               <el-radio-button v-for="item in radioList" :label="item.value" :disabled="item.disabled" :title="item.disTitle">{{item.name}}</el-radio-button>
11 11
             </el-radio-group>
12 12
             <Tooltip v-if="toolTipsVal" :notes="toolTipsVal" effect="light" popperClass="wid400"/>
@@ -31,7 +31,7 @@ import {nextTick, onMounted, ref} from "vue";
31 31
 import Tooltip from '@/components/capsulationMoudle/_tooltip.vue'
32 32
 
33 33
 const emit = defineEmits<{
34
-  (event: "returnEvent", val: string | number | boolean): void;
34
+  (event: "returnEvent", val: string | number | boolean,flag?:boolean): void;
35 35
 }>();
36 36
 
37 37
 const value=ref('')
@@ -63,14 +63,14 @@ const props = withDefaults(defineProps<{
63 63
 })
64 64
 
65 65
 //返回值
66
-const returnValueEvent = ()=>{
66
+const returnValueEvent = (flag?:boolean)=>{
67 67
   let reVal:any = {}
68 68
   props.radioList.forEach(item=>{
69 69
     if(value.value == item.value){
70 70
       reVal = item
71 71
     }
72 72
   })
73
-  emit('returnEvent',reVal)
73
+  emit('returnEvent',reVal,flag)
74 74
 }
75 75
 
76 76
 
@@ -83,7 +83,7 @@ onMounted(()=>{
83 83
   nextTick(()=>{
84 84
     if(props.radioList&&props.radioList.length>0){
85 85
       value.value = props.echoValue ? props.echoValue : props.radioList[0].value
86
-      returnValueEvent()
86
+      returnValueEvent(false)
87 87
     }
88 88
   })
89 89
 })