Browse Source

推广计划 & 广告 总计 、 自定义表头

liuxiaona 1 year ago
parent
commit
ae17269bfb

+ 7 - 1
src/common/common.ts

@@ -125,7 +125,13 @@ export const hasDot = (num:any, numberDigit:any)=> {
125 125
     return formatNum((num + '').indexOf('.') != -1 ? parseFloat(Number(num).toFixed(digit)) : num);
126 126
 }
127 127
 
128
-
128
+export const getCurrentTime = ()=>{
129
+    var today = new Date();
130
+    var hours = today.getHours();
131
+    var minutes = today.getMinutes(); //分
132
+    var seconds = today.getSeconds(); //秒
133
+    return hours + ':' + fillZero(minutes) + ':' + fillZero(seconds)
134
+}
129 135
 
130 136
 export const getDay = (day:number, haveHours?:boolean)=>{
131 137
     //day为0表示今天的日期   -1为昨天   haveHours存在表示要时分秒 haveHours:true,false

+ 161 - 155
src/components/businessMoudle/gdtList/advert.vue

@@ -21,119 +21,125 @@
21 21
       <el-button class="lMarauto" type="primary" @click="goNewPlanEvent">新建计划</el-button>
22 22
     </div>
23 23
 
24
-    <div>
24
+    <div  v-loading="loading">
25 25
       <div class="bMar10 flex">
26
-  <!--
27 26
         <Dropdown title="批量操作" :list="tableInfo.moreList" @close="dropdownEvent" class="rMar10"
28 27
                   :disabledFlag="tableInfo.multipleSelection&&tableInfo.multipleSelection.length == 0"></Dropdown>
29
-      -->
30
-
31 28
         <div>已选 : <span>{{tableInfo.multipleSelection&&tableInfo.multipleSelection.length}}</span></div>
32 29
         <div  class="lMarauto">
33
-          <Indicators type="campaign_base" @refresh="IndicatorsRefreshList"></Indicators>
30
+          <Indicators type="campaign_base" @refresh="init"></Indicators>
34 31
         </div>
35 32
       </div>
36 33
 
37
-      <el-table v-loading="loading" ref="tableRef" :data="tableInfo.tableList"
38
-                :header-cell-style="tableHeaderStyle"
39
-                :key="tableInfo.updateKey" style="width: 100%"
40
-                border empty-text="暂无数据"
41
-                row-key="adgroup_id"
42
-                max-height="calc(100vh - 294px)">
43
-        <el-table-column fixed width="80" >
44
-          <template #header>
45
-            <div class="flex">
46
-              <el-checkbox v-model="tableInfo.chooseAll" @change="allChooseCheckboxEvent"></el-checkbox>
47
-              <el-dropdown class="lMar10" @command="handleCommandChoosePage">
48
-                <el-icon color="#3173FF"><i-ep-ArrowDownBold /></el-icon>
49
-                <template #dropdown>
50
-                  <el-dropdown-menu>
51
-                    <el-dropdown-item command="1">当前页</el-dropdown-item>
52
-                    <el-dropdown-item command="2">全部</el-dropdown-item>
53
-                  </el-dropdown-menu>
54
-                </template>
55
-              </el-dropdown>
56
-            </div>
57
-          </template>
58
-          <template #default="scope">
59
-            <div class="checkBoxSelf flex"
60
-                 @click="singleChooseCheckboxEvent(tableInfo.multipleSelection.findIndex(n=>n.adgroup_id == scope.row.adgroup_id),scope.row)"
61
-                 :class="tableInfo.multipleSelection.findIndex(n=>n.adgroup_id == scope.row.adgroup_id)>=0 ? 'active' : ''">
62
-              <el-icon color="#fff" v-if="tableInfo.multipleSelection.findIndex(n=>n.adgroup_id == scope.row.adgroup_id)>=0"><i-ep-Check /></el-icon>
63
-            </div>
64
-          </template>
65
-        </el-table-column>
66
-        <template v-for="item in tableInfo.descol">
67
-          <el-table-column :fixed="item.isfixed" :min-width="item.minWidth ? item.minWidth : '80px'">
34
+      <div class="noDataBcg" v-if="Number(tableInfo.total) == 0">
35
+        <noData></noData>
36
+      </div>
37
+      <template v-else>
38
+        <el-table ref="tableRef" :data="tableInfo.tableList"
39
+                  :header-cell-style="tableHeaderStyle"
40
+                  :key="tableInfo.updateKey" style="width: 100%"
41
+                  border empty-text="暂无数据"
42
+                  row-key="adgroup_id"
43
+                  max-height="calc(100vh - 294px)">
44
+          <el-table-column fixed width="80" >
68 45
             <template #header>
69
-              <div class="flex"
70
-                   :style="{ justifyContent: item.alignSelf ? item.alignSelf : 'center' }"
71
-                   :class="[tableInfo.sortKey == item.column ? 'active_css' : '',item.isSort ? 'pointer' : '']"
72
-                   @click="item.isSort&&sortEvent(item.column)">
73
-                {{ item.name }}
74
-                <el-tooltip v-if="item.notes" effect="dark" :content="item.notes"><i-ep-QuestionFilled class="lMar5 c-999 f14 pointer" /></el-tooltip>
75
-                <div v-if="item.isSort">
76
-                  <div class="sortItem"><el-icon :color="tableInfo.sortKey == item.column ? '#3173FF' : ''"><i-ep-CaretBottom /></el-icon></div>
77
-                </div>
46
+              <div class="flex">
47
+                <el-checkbox v-model="tableInfo.chooseAll" @change="allChooseCheckboxEvent"></el-checkbox>
48
+                <el-dropdown class="lMar10" @command="handleCommandChoosePage">
49
+                  <el-icon color="#3173FF"><i-ep-ArrowDownBold /></el-icon>
50
+                  <template #dropdown>
51
+                    <el-dropdown-menu>
52
+                      <el-dropdown-item command="1">当前页</el-dropdown-item>
53
+                      <el-dropdown-item command="2">全部</el-dropdown-item>
54
+                    </el-dropdown-menu>
55
+                  </template>
56
+                </el-dropdown>
78 57
               </div>
79 58
             </template>
80 59
             <template #default="scope">
81
-              <div class="flex" :style="{ justifyContent: item.alignSelf ? item.alignSelf : 'center' }">
82
-
83
-                <div v-if="item.column == 'campaign_name'">
84
-                <span class="c-theme flex campaignName">
85
-                  <span class="pointer">{{scope.row[item.column]}}</span>
86
-                  <el-icon color="#3173FF" class="pointer lMarauto f16 icon" @click="edit_campaign_name_event(scope.row)"><i-ep-Edit /></el-icon>
87
-                </span>
88
-                </div>
89
-                <div v-else-if="item.column == 'configured_status'">
90
-                  <span class="c-green" v-if="scope.row[item.column] == 'AD_STATUS_NORMAL'">正常</span>
91
-                  <span class="c-red" v-else-if="scope.row[item.column] == 'AD_STATUS_SUSPEND'">暂停</span>
92
-                  <span v-else>-</span>
93
-                </div>
94
-                <div v-else-if="item.column == 'speed_mode'">
95
-                  <span v-if="scope.row[item.column] == 'SPEED_MODE_STANDARD'">标准投</span>
96
-                  <span v-else-if="scope.row[item.column] == 'SPEED_MODE_FAST'">加速投放</span>
97
-                  <span v-else>-</span>
98
-                </div>
99
-                <div v-else-if="item.column == 'operate'">
100
-                  <div class="flex">
101
-                    <span class="c-theme pointer" @click="copyEvent(scope.row)">复制</span>
102
-                    <span class="c-theme pointer lMar10" @click="goDetial(scope.row)">详情</span>
103
-                  </div>
104
-                </div>
105
-                <div class="flex c-theme pointer" v-else-if="item.column == 'daily_budget'" @click="editPlanEvent(scope.row)">
106
-                  {{scope.row[item.column] ? NumberHandle(scope.row[item.column]) : '不限'}}
107
-                </div>
108
-                <div class="flex c-theme pointer" v-else-if="item.column == 'site_set'">
109
-                  {{scope.row[item.column]}}
110
-<!--                  {{siteIdtoText(scope.row[item.column])}}-->
111
-                </div>
112
-
113
-
114
-                <div class="cellDiv" :class="tableInfo.sortKey == item.column ? 'active_css' : ''" v-else>
115
-                  <el-tooltip :disabled="!(scope.row[item.column] && scope.row[item.column].length >30)" effect="dark" :content="scope.row[item.column]+''">
116
-                    <div class="clampTwo line21" style="flex: 1">
117
-                      {{ scope.row[item.column] || scope.row[item.column]==0 ?
118
-                        (item.cancleForMat ? (scope.row[item.column] ? scope.row[item.column] : '-') : NumberHandle(scope.row[item.column])) : '-'}}
119
-                      <span v-if="item.hasPercent&&(scope.row[item.column] || scope.row[item.column] ==0)">%</span>
120
-                    </div>
121
-                  </el-tooltip>
122
-                </div>
60
+              <div class="checkBoxSelf flex"
61
+                   @click="singleChooseCheckboxEvent(tableInfo.multipleSelection.findIndex(n=>n.adgroup_id == scope.row.adgroup_id),scope.row)"
62
+                   :class="tableInfo.multipleSelection.findIndex(n=>n.adgroup_id == scope.row.adgroup_id)>=0 ? 'active' : ''">
63
+                <el-icon color="#fff" v-if="tableInfo.multipleSelection.findIndex(n=>n.adgroup_id == scope.row.adgroup_id)>=0"><i-ep-Check /></el-icon>
123 64
               </div>
124 65
             </template>
125 66
           </el-table-column>
126
-        </template>
127
-      </el-table>
128
-
129
-      <div class="paginationBox flex" style="justify-content: center" v-if="Number(tableInfo.total) > 0">
130
-        <el-pagination
131
-            v-model:currentPage="tableInfo.currentPage"
132
-            v-model:page-size="tableInfo.pageSize"
133
-            background
134
-            :total="tableInfo.total"
135
-            @current-change="handleCurrentChange" />
136
-      </div>
67
+          <template v-for="bigItem in tableInfo.descol">
68
+            <el-table-column>
69
+              <template #header>
70
+                <div class="flex" style="justify-content:center"
71
+                     :class="[tableInfo.sortKey == bigItem.key_value ? 'active_css' : '']">
72
+                  <span :style="{color:tableInfo.sortKey == bigItem.key_value ? '#3173FF' : ''}">{{ bigItem.label }}</span>
73
+                  <el-tooltip v-if="bigItem.tooltip" effect="dark" :content="bigItem.tooltip"><i-ep-QuestionFilled class="lMar5 c-999 f12 pointer" /></el-tooltip>
74
+                  <div v-if="bigItem.if_sort == 1" class="sortBox lMar5">
75
+                    <div class="sortItem" @click="sortEvent(bigItem.key_value,'desc')">
76
+                      <el-icon :color="(tableInfo.sortType == 'desc' && tableInfo.sortKey == bigItem.key_value) ? '#3173FF' : ''"><i-ep-CaretTop /></el-icon>
77
+                    </div>
78
+                    <div class="sortItem" @click="sortEvent(bigItem.key_value,'asc')">
79
+                      <el-icon :color="(tableInfo.sortType == 'asc' && tableInfo.sortKey == bigItem.key_value) ? '#3173FF' : ''"><i-ep-CaretBottom /></el-icon>
80
+                    </div>
81
+                  </div>
82
+                </div>
83
+              </template>
84
+
85
+              <template v-for="item in bigItem.sub">
86
+                <el-table-column :label="item.label"  :fixed="item.disabled == 1"
87
+                                 :min-width="bigItem.key_value == 'adgroup_name' ? '200px' :
88
+                               (bigItem.label.length <= 4 ? '100px' : bigItem.label.length <= 8 ? '150px' : '200px')">
89
+
90
+                  <template #default="scope">
91
+                    <div class="flex" style="justify-content:center"  :style="{color:tableInfo.sortKey == item.key_value ? '#3173FF' : ''}">
92
+                      <div v-if="item.key_value == 'configured_status'">
93
+                        <span class="c-green" v-if="scope.row[item.key_value] == 'AD_STATUS_NORMAL'">正常</span>
94
+                        <span class="c-red" v-else-if="scope.row[item.key_value] == 'AD_STATUS_SUSPEND'">暂停</span>
95
+                        <span v-else>-</span>
96
+                      </div>
97
+                      <div v-else-if="item.key_value == 'speed_mode'">
98
+                        <span v-if="scope.row[item.key_value] == 'SPEED_MODE_STANDARD'">标准投</span>
99
+                        <span v-else-if="scope.row[item.key_value] == 'SPEED_MODE_FAST'">加速投放</span>
100
+                        <span v-else>-</span>
101
+                      </div>
102
+                      <div v-else-if="item.key_value == 'operate'">
103
+                        <div class="flex">
104
+                          <span class="c-theme pointer" @click="copyEvent(scope.row)">复制</span>
105
+                          <span class="c-theme pointer lMar10" @click="goDetial(scope.row)">详情</span>
106
+                        </div>
107
+                      </div>
108
+                      <div class="flex c-theme pointer" v-else-if="item.key_value == 'daily_budget'" @click="editPlanEvent(scope.row)">
109
+                        {{scope.row[item.key_value] ? NumberHandle(scope.row[item.key_value]) : '不限'}}
110
+                      </div>
111
+                      <div class="flex c-theme pointer" v-else-if="item.key_value == 'site_set'">
112
+                        {{scope.row[item.key_value]}}
113
+                        <!--                  {{siteIdtoText(scope.row[item.key_value])}}-->
114
+                      </div>
115
+
116
+
117
+                      <div class="cellDiv" :class="tableInfo.sortKey == item.key_value ? 'active_css' : ''" v-else>
118
+                        <el-tooltip :disabled="!(scope.row[item.key_value] && scope.row[item.key_value].length >30)" effect="dark" :content="scope.row[item.key_value]+''">
119
+                          <div class="clampTwo line21" style="flex: 1">
120
+                            {{ scope.row[item.key_value] || scope.row[item.key_value]==0 ?
121
+                              (item.cancleForMat ? (scope.row[item.key_value] ? scope.row[item.key_value] : '-') : NumberHandle(scope.row[item.key_value])) : '-'}}
122
+                            <span v-if="item.hasPercent&&(scope.row[item.key_value] || scope.row[item.key_value] ==0)">%</span>
123
+                          </div>
124
+                        </el-tooltip>
125
+                      </div>
126
+                    </div>
127
+                  </template>
128
+                </el-table-column>
129
+              </template>
130
+            </el-table-column>
131
+          </template>
132
+        </el-table>
133
+
134
+        <div class="paginationBox flex" style="justify-content: center" v-if="Number(tableInfo.total) > 0">
135
+          <el-pagination
136
+              v-model:currentPage="tableInfo.currentPage"
137
+              v-model:page-size="tableInfo.pageSize"
138
+              background
139
+              :total="tableInfo.total"
140
+              @current-change="handleCurrentChange" />
141
+        </div>
142
+      </template>
137 143
     </div>
138 144
 
139 145
     <EditIpt ref="planEditIptRef" title="推广计划" @confirm="planEditConfirm"></EditIpt>
@@ -158,6 +164,8 @@ import {ElMessage} from "element-plus";
158 164
 import { batchGdt_list, reactiveTableAndAny} from "@/api/ApiModel";
159 165
 import Indicators from './indicators/index.vue'
160 166
 import {commonlistTs} from "@/components/businessMoudle/ts/commonList";
167
+import {getCurrentTime} from "@/common/common";
168
+import _ from "lodash";
161 169
 
162 170
 
163 171
 const { proxy } = getCurrentInstance() as any;
@@ -181,36 +189,44 @@ const loading = ref<boolean>(false)
181 189
 const tableInfo = reactive<reactiveTableAndAny>({
182 190
   tableList:[],
183 191
   tableList_all:[],
184
-  descol:[
185
-    { name:'广告',column:'adgroup_name',slotFlag: true,isfixed:true,alignSelf:'left'},
186
-    { name:'操作',column:'operate',slotFlag: true,isfixed:true},
187
-    { name:'账号ID',column:'account_id',cancleForMat:true},
188
-    { name:'日预算(元)',column:'daily_budget',slotFlag: true},
189
-    { name:'状态',column:'configured_status',slotFlag: true},
190
-    { name:'创建时间',column:'created_time',cancleForMat:true},
191
-    { name:'更新时间',column:'last_modified_time'},
192
-    { name:'托管状态',column:'promoted_object_type'},
193
-    { name:'推广日期',column:'begin_date'},
194
-    { name:'投放时间',column:'time_series',cancleForMat:true},
195
-    { name:'出价方式',column:'bid_amount'},
196
-    { name:'优化目标',column:'optimization_goal'},
197
-    { name:'版位',column:'site_set'},
198
-  ],
192
+  descol:[],
199 193
   multipleSelection:[],
200 194
   updateKey:1,
201 195
   chooseAll:false,
202
-  sortKey:'',
203 196
   moreList:[
204 197
     {value:'1',label:'启用'},
205
-    {value:'2',label:'暂停'},
198
+    {value:'2',label:'禁用'},
206 199
     {value:'3',label:'删除'},
200
+    {value:'4',label:'修改日预算'},
201
+    {value:'5',label:'修改出价'},
202
+    {value:'6',label:'深度优化出价'},
203
+    {value:'7',label:'期望roi'},
204
+    {value:'8',label:'推广日期'},
205
+    {value:'9',label:'投放时段'},
206
+    {value:'10',label:'开启一键起量'},
207
+    {value:'11',label:'暂停一键起量'},
207 208
   ],
208 209
   currentPage:1,
209 210
   pageSize:20,
210 211
   total:0,
211 212
   totalPages:0,//共多少页
213
+  summary:[],
214
+  sortKey:'',
215
+  sortType:'',
212 216
 })
213 217
 
218
+const dropdownEvent = (val: string | number | object) => {
219
+  // loading.value = true
220
+  // let arr:any = []
221
+  // tableInfo.multipleSelection.forEach(item=>{
222
+  //   arr.push({
223
+  //     account_id:item.account_id,
224
+  //     campaign_id:item.campaign_id
225
+  //   })
226
+  // })
227
+  // batchPlanApi(arr,val)
228
+}
229
+
214 230
 //复制
215 231
 const copyEvent = (row:any) => {
216 232
 
@@ -253,11 +269,6 @@ const editPlanEvent = (row:any) => {
253 269
   })
254 270
 }
255 271
 //修改计划名称
256
-const edit_campaign_name_event = (row:any) => {
257
-  nextTick(()=>{
258
-    planEditIptRef.value!.switchShow(true,row.campaign_name)
259
-  })
260
-}
261 272
 //推广计划 - 确定
262 273
 const planEditConfirm = () => {
263 274
 
@@ -265,13 +276,14 @@ const planEditConfirm = () => {
265 276
 
266 277
 
267 278
 //排序
268
-const sortEvent = (row:any) => {
269
-
279
+const sortEvent = (sortKey,sortType) => {
280
+  tableInfo.sortKey = sortKey
281
+  tableInfo.sortType = sortType
282
+  init()
270 283
 }
271 284
 
272 285
 //列表
273 286
 const init = async (page?:any,totalPages?:any) => {
274
-  console.log(props.campaign_id,'props.campaign_id');
275 287
   loading.value = true
276 288
   const paramsModel = reactive<batchGdt_list>({
277 289
     account_ids:acRef.value!.value,
@@ -283,15 +295,35 @@ const init = async (page?:any,totalPages?:any) => {
283 295
     page:page?page:1,
284 296
     pageSize:totalPages ? totalPages : tableInfo.pageSize
285 297
   })
298
+  if(tableInfo.sortKey){
299
+    paramsModel['field'] = tableInfo.sortKey
300
+    paramsModel['order'] = tableInfo.sortType
301
+  }
286 302
   let res:any = await proxy.$http.get(Api.batchGdt_advert_list,paramsModel)
287 303
   loading.value = false
288 304
   if(res&&res.errNo=='0'){
305
+    tableInfo.updateKey++
289 306
     if(totalPages){
290 307
       tableInfo.tableList_all = res.rst.data.list
291 308
     }else{
292
-      tableInfo.tableList = res.rst.data.list
293 309
       tableInfo.total = res.rst.pageInfo.total
294 310
       tableInfo.totalPages = res.rst.pageInfo.total
311
+      if(!res.rst.data){
312
+        tableInfo.tableList = []
313
+        return
314
+      }
315
+      tableInfo.summary = res.rst.data.summary
316
+      tableInfo.summary[0].adgroup_name = '合计(缓存时间:' + getCurrentTime() + ')'
317
+      tableInfo.descol = []
318
+      res.rst.data.explain.forEach(ex=>{
319
+        ex.sub = []
320
+        let subObj:any = _.cloneDeep(ex)
321
+        subObj.label = tableInfo.summary[0][ex.key_value] || ''
322
+        ex.sub.push(subObj)
323
+      })
324
+      tableInfo.descol = res.rst.data.explain;
325
+      tableInfo.descol.splice(1,0,{label:'操作',key_value:'operate',disabled:1,sub:[{label:'',key_value:'operate',disabled:1}]})
326
+      tableInfo.tableList = res.rst.data.list
295 327
     }
296 328
   }else{
297 329
     ElMessage.error(res.errMsg)
@@ -356,10 +388,6 @@ const singleChooseCheckboxEvent = (idx:number,row:any)=>{
356 388
   }
357 389
 }
358 390
 
359
-const IndicatorsRefreshList = () => {
360
-  //这里刷新列表
361
-}
362
-
363 391
 
364 392
 const {
365 393
   init_acList,
@@ -371,15 +399,17 @@ const {
371 399
   clearEvent,
372 400
   tableHeaderStyle,
373 401
   planEditIptRef,
374
-  TargetEditRef
402
+  TargetEditRef,
403
+  init_ad_statusList
375 404
 } = listTs()
376 405
 
377 406
 
378 407
 const initAll = () => {
379 408
   nextTick(async ()=>{
380 409
     await init_acList()
381
-    await get_siteSet_list()
410
+    // await get_siteSet_list()
382 411
     await init()
412
+    init_ad_statusList()
383 413
   })
384 414
 }
385 415
 
@@ -391,29 +421,5 @@ onMounted(()=>{
391 421
 })
392 422
 </script>
393 423
 <style lang="scss" scoped>
394
-.campaignName{
395
-  .icon{
396
-    color: #3173FF;
397
-    opacity: 0;
398
-  }
399
-  &:hover{
400
-    .icon{
401
-      opacity: 1;
402
-    }
403
-  }
404
-}
405
-.checkBoxSelf{
406
-  width: 13px;
407
-  height: 13px;
408
-  border: 1px solid #d9d9d9;
409
-  border-radius: 2px;
410
-  &:hover{
411
-    cursor: pointer;
412
-    border: 1px solid #3173FF;
413
-  }
414
-  &.active{
415
-    border: 1px solid #3173FF;
416
-    background-color: #3173FF;
417
-  }
418
-}
424
+@import "./index.scss";
419 425
 </style>

+ 43 - 0
src/components/businessMoudle/gdtList/index.scss

@@ -0,0 +1,43 @@
1
+.campaignName{
2
+  .icon{
3
+    color: #3173FF;
4
+    opacity: 0;
5
+  }
6
+  &:hover{
7
+    .icon{
8
+      opacity: 1;
9
+    }
10
+  }
11
+}
12
+.checkBoxSelf{
13
+  width: 13px;
14
+  height: 13px;
15
+  border: 1px solid #d9d9d9;
16
+  border-radius: 2px;
17
+  &:hover{
18
+    cursor: pointer;
19
+    border: 1px solid #3173FF;
20
+  }
21
+  &.active{
22
+    border: 1px solid #3173FF;
23
+    background-color: #3173FF;
24
+  }
25
+}
26
+.sortBox{
27
+  height: 16px;
28
+  margin-left: 2px;
29
+  margin-top: -4px;
30
+  .sortItem{
31
+    width: 8px;
32
+    height: 8px;
33
+    line-height: 8px;
34
+    cursor: pointer;
35
+    color: #999;
36
+  }
37
+}
38
+.noDataBcg{
39
+  height: 500px;
40
+  width: 100%;
41
+  background-color: #fff;
42
+  padding-top: 80px;
43
+}

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

@@ -33,7 +33,7 @@ const NumberHandle = proxy.$NumberHandle
33 33
 
34 34
 // 类型切换公共ts
35 35
 const typeListParams = reactive([
36
-    {name:'媒体账户',key:'account'},
36
+  {name:'媒体账户',key:'account'},
37 37
   {name:'推广计划',key:'plan'},
38 38
   {name:'广告',key:'advert'},
39 39
 ])
@@ -60,7 +60,10 @@ const pageInfo = reactive<reactiveTableAndAny>({
60 60
 const advertRef = ref<{initAll:()=>void}>()
61 61
 //去广告栏
62 62
 const goAdvert = (campaign_id:any) => {
63
-  switchTypeItem(typeList.list[1])
63
+  let arr:any = typeList.list.filter(n=>{
64
+    return n.key == 'advert'
65
+  })
66
+  switchTypeItem(arr[0])
64 67
   pageInfo.campaign_id = campaign_id
65 68
   nextTick(()=>{
66 69
     advertRef.value!.initAll()

+ 138 - 154
src/components/businessMoudle/gdtList/plan.vue

@@ -20,128 +20,136 @@
20 20
       <span class="pointer c-theme lMar10" @click="clearEvent">清空</span>
21 21
       <el-button class="lMarauto" type="primary" @click="goNewPlanEvent">新建计划</el-button>
22 22
     </div>
23
-    <div>
23
+    <div v-loading="loading">
24 24
       <div class="bMar10 flex">
25 25
         <Dropdown title="批量操作" :list="tableInfo.moreList" @close="dropdownEvent" class="rMar10"
26 26
                   :disabledFlag="tableInfo.multipleSelection&&tableInfo.multipleSelection.length == 0"></Dropdown>
27 27
         <div>已选 : <span>{{tableInfo.multipleSelection&&tableInfo.multipleSelection.length}}</span></div>
28
-<!--        <el-button class="lMarauto" type="primary" @click="customIndEvent">自定义指标</el-button>-->
29
-
30 28
         <div  class="lMarauto">
31
-          <Indicators type="campaign_base" @refresh="IndicatorsRefreshList"></Indicators>
29
+          <Indicators type="campaign_base" @refresh="init()"></Indicators>
32 30
         </div>
33 31
       </div>
34
-
35
-      <el-table v-loading="loading" ref="tableRef" :data="tableInfo.tableList"
36
-                :header-cell-style="tableHeaderStyle"
37
-                :key="tableInfo.updateKey" style="width: 100%"
38
-                border empty-text="暂无数据"
39
-                row-key="campaign_id"
40
-                max-height="calc(100vh - 294px)">
41
-        <el-table-column fixed width="80" >
42
-          <template #header>
43
-            <div class="flex">
44
-              <el-checkbox v-model="tableInfo.chooseAll" @change="allChooseCheckboxEvent"></el-checkbox>
45
-              <el-dropdown class="lMar10" @command="handleCommandChoosePage">
46
-                <el-icon color="#3173FF"><i-ep-ArrowDownBold /></el-icon>
47
-                <template #dropdown>
48
-                  <el-dropdown-menu>
49
-                    <el-dropdown-item command="1">当前页</el-dropdown-item>
50
-                    <el-dropdown-item command="2">全部</el-dropdown-item>
51
-                  </el-dropdown-menu>
52
-                </template>
53
-              </el-dropdown>
54
-            </div>
55
-          </template>
56
-          <template #default="scope">
57
-            <div class="checkBoxSelf flex"
58
-                 @click="singleChooseCheckboxEvent(tableInfo.multipleSelection.findIndex(n=>n.campaign_id == scope.row.campaign_id),scope.row)"
59
-                 :class="tableInfo.multipleSelection.findIndex(n=>n.campaign_id == scope.row.campaign_id)>=0 ? 'active' : ''">
60
-              <el-icon color="#fff" v-if="tableInfo.multipleSelection.findIndex(n=>n.campaign_id == scope.row.campaign_id)>=0"><i-ep-Check /></el-icon>
61
-            </div>
62
-          </template>
63
-        </el-table-column>
64
-        <template v-for="item in tableInfo.descol">
65
-          <el-table-column :fixed="item.isfixed" :min-width="item.minWidth ? item.minWidth : '80px'">
32
+      <div class="noDataBcg" v-if="Number(tableInfo.total) == 0">
33
+        <noData></noData>
34
+      </div>
35
+      <template v-else>
36
+        <el-table ref="tableRef" :data="tableInfo.tableList"
37
+                  :header-cell-style="tableHeaderStyle"
38
+                  :key="tableInfo.updateKey" style="width: 100%"
39
+                  border empty-text="暂无数据"
40
+                  row-key="campaign_id"
41
+                  max-height="calc(100vh - 294px)">
42
+          <el-table-column fixed width="80" >
66 43
             <template #header>
67
-              <div class="flex"
68
-                   :style="{ justifyContent: item.alignSelf ? item.alignSelf : 'center' }"
69
-                   :class="[tableInfo.sortKey == item.column ? 'active_css' : '',item.isSort ? 'pointer' : '']"
70
-                   @click="item.isSort&&sortEvent(item.column)">
71
-                {{ item.name }}
72
-                <el-tooltip v-if="item.notes" effect="dark" :content="item.notes"><i-ep-QuestionFilled class="lMar5 c-999 f14 pointer" /></el-tooltip>
73
-                <div v-if="item.isSort">
74
-                  <div class="sortItem"><el-icon :color="tableInfo.sortKey == item.column ? '#3173FF' : ''"><i-ep-CaretBottom /></el-icon></div>
75
-                </div>
44
+              <div class="flex">
45
+                <el-checkbox v-model="tableInfo.chooseAll" @change="allChooseCheckboxEvent"></el-checkbox>
46
+                <el-dropdown class="lMar10" @command="handleCommandChoosePage">
47
+                  <el-icon color="#3173FF"><i-ep-ArrowDownBold /></el-icon>
48
+                  <template #dropdown>
49
+                    <el-dropdown-menu>
50
+                      <el-dropdown-item command="1">当前页</el-dropdown-item>
51
+                      <el-dropdown-item command="2">全部</el-dropdown-item>
52
+                    </el-dropdown-menu>
53
+                  </template>
54
+                </el-dropdown>
76 55
               </div>
77 56
             </template>
78 57
             <template #default="scope">
79
-              <div class="flex" :style="{ justifyContent: item.alignSelf ? item.alignSelf : 'center' }">
80
-
81
-              <div v-if="item.column == 'campaign_name'">
82
-                <span class="c-theme flex campaignName">
83
-                  <span class="pointer" @click="goAdvertEvent(scope.row.campaign_id)">{{scope.row[item.column]}}</span>
84
-                  <el-icon color="#3173FF" class="pointer lMarauto f16 icon" @click="edit_campaign_name_event(scope.row)"><i-ep-Edit /></el-icon>
85
-                </span>
86
-              </div>
87
-              <div v-else-if="item.column == 'configured_status'">
88
-                <span class="c-green" v-if="scope.row[item.column] == 'AD_STATUS_NORMAL'">正常</span>
89
-                <span class="c-red" v-else-if="scope.row[item.column] == 'AD_STATUS_SUSPEND'">暂停</span>
90
-                <span v-else>-</span>
58
+              <div class="checkBoxSelf flex"
59
+                   @click="singleChooseCheckboxEvent(tableInfo.multipleSelection.findIndex(n=>n.campaign_id == scope.row.campaign_id),scope.row)"
60
+                   :class="tableInfo.multipleSelection.findIndex(n=>n.campaign_id == scope.row.campaign_id)>=0 ? 'active' : ''">
61
+                <el-icon color="#fff" v-if="tableInfo.multipleSelection.findIndex(n=>n.campaign_id == scope.row.campaign_id)>=0"><i-ep-Check /></el-icon>
91 62
               </div>
92
-              <div v-else-if="item.column == 'speed_mode'">
93
-                <span v-if="scope.row[item.column] == 'SPEED_MODE_STANDARD'">标准投</span>
94
-                <span v-else-if="scope.row[item.column] == 'SPEED_MODE_FAST'">加速投放</span>
95
-                <span v-else>-</span>
96
-              </div>
97
-              <div v-else-if="item.column == 'operate'">
98
-                <div class="flex">
99
-                  <span class="c-theme pointer" @click="editPlanEvent(scope.row)">修改</span>
100
-                  <span class="lMar10"
101
-                        :class="scope.row.configured_status == 'AD_STATUS_NORMAL' ? 'pointer-drop c-green-opa' : 'pointer c-green'"
102
-                        @click="scope.row.configured_status == 'AD_STATUS_SUSPEND'&&batchPlanEvent(scope.row,1)">启用</span>
103
-                </div>
104
-                <div>
105
-                    <span :class="scope.row.configured_status == 'AD_STATUS_SUSPEND' ? 'pointer-drop c-red-opa' : 'pointer c-red'"
106
-                          @click="scope.row.configured_status == 'AD_STATUS_NORMAL'&&batchPlanEvent(scope.row,2)">暂停</span>
107
-                  <Popconfirm key="dele" @confirm="batchPlanEvent(scope.row,3)" :slotFlag="true">
108
-                    <template #con>
109
-                      <span class="pointer lMar10">删除</span>
110
-                    </template>
111
-                  </Popconfirm>
112
-
63
+            </template>
64
+          </el-table-column>
65
+          <template v-for="bigItem in tableInfo.descol">
66
+            <el-table-column>
67
+              <template #header>
68
+                <div class="flex" style="justify-content:center"
69
+                     :class="[tableInfo.sortKey == bigItem.key_value ? 'active_css' : '']">
70
+                  <span :style="{color:tableInfo.sortKey == bigItem.key_value ? '#3173FF' : ''}">{{ bigItem.label }}</span>
71
+                  <el-tooltip v-if="bigItem.tooltip" effect="dark" :content="bigItem.tooltip"><i-ep-QuestionFilled class="lMar5 c-999 f12 pointer" /></el-tooltip>
72
+                  <div v-if="bigItem.if_sort == 1" class="sortBox lMar5">
73
+                    <div class="sortItem" @click="sortEvent(bigItem.key_value,'desc')">
74
+                      <el-icon :color="(tableInfo.sortType == 'desc' && tableInfo.sortKey == bigItem.key_value) ? '#3173FF' : ''"><i-ep-CaretTop /></el-icon>
75
+                    </div>
76
+                    <div class="sortItem" @click="sortEvent(bigItem.key_value,'asc')">
77
+                      <el-icon :color="(tableInfo.sortType == 'asc' && tableInfo.sortKey == bigItem.key_value) ? '#3173FF' : ''"><i-ep-CaretBottom /></el-icon>
78
+                    </div>
79
+                  </div>
113 80
                 </div>
81
+              </template>
82
+              <template v-for="item in bigItem.sub">
83
+                <el-table-column :label="item.label"  :fixed="item.disabled == 1"
84
+                                 :min-width="bigItem.key_value == 'campaign_name' ? '200px' :
85
+                               (bigItem.label.length <= 4 ? '100px' : bigItem.label.length <= 8 ? '150px' : '200px')">
114 86
 
87
+                  <template #default="scope">
88
+                    <div class="flex"  style="justify-content:center" :style="{color:tableInfo.sortKey == item.key_value ? '#3173FF' : ''}">
89
+                      <div v-if="item.key_value == 'campaign_name'">
90
+                    <span class="c-theme flex campaignName">
91
+                      <span class="pointer" @click="goAdvertEvent(scope.row.campaign_id)">{{scope.row[item.key_value]}}</span>
92
+                      <el-icon color="#3173FF" class="pointer lMarauto f16 icon" @click="edit_campaign_name_event(scope.row)"><i-ep-Edit /></el-icon>
93
+                    </span>
94
+                      </div>
95
+                      <div v-else-if="item.key_value == 'configured_status'">
96
+                        <span class="c-green" v-if="scope.row[item.key_value] == 'AD_STATUS_NORMAL'">正常</span>
97
+                        <span class="c-red" v-else-if="scope.row[item.key_value] == 'AD_STATUS_SUSPEND'">暂停</span>
98
+                        <span v-else>-</span>
99
+                      </div>
100
+                      <div v-else-if="item.key_value == 'speed_mode'">
101
+                        <span v-if="scope.row[item.key_value] == 'SPEED_MODE_STANDARD'">标准投</span>
102
+                        <span v-else-if="scope.row[item.key_value] == 'SPEED_MODE_FAST'">加速投放</span>
103
+                        <span v-else>-</span>
104
+                      </div>
105
+                      <div v-else-if="item.key_value == 'operate'">
106
+                        <div class="flex">
107
+                          <span class="c-theme pointer" @click="editPlanEvent(scope.row)">修改</span>
108
+                          <span class="lMar10"
109
+                                :class="scope.row.configured_status == 'AD_STATUS_NORMAL' ? 'pointer-drop c-green-opa' : 'pointer c-green'"
110
+                                @click="scope.row.configured_status == 'AD_STATUS_SUSPEND'&&batchPlanEvent(scope.row,1)">启用</span>
111
+                        </div>
112
+                        <div>
113
+                        <span :class="scope.row.configured_status == 'AD_STATUS_SUSPEND' ? 'pointer-drop c-red-opa' : 'pointer c-red'"
114
+                              @click="scope.row.configured_status == 'AD_STATUS_NORMAL'&&batchPlanEvent(scope.row,2)">暂停</span>
115
+                          <Popconfirm key="dele" @confirm="batchPlanEvent(scope.row,3)" :slotFlag="true">
116
+                            <template #con>
117
+                              <span class="pointer lMar10">删除</span>
118
+                            </template>
119
+                          </Popconfirm>
115 120
 
116
-              </div>
117
-              <div class="flex c-theme pointer" v-else-if="item.column == 'daily_budget'" @click="editPlanEvent(scope.row)">
118
-                {{scope.row[item.column] ? NumberHandle(scope.row[item.column]) : '不限'}}
119
-              </div>
120
-
121
+                        </div>
122
+                      </div>
123
+                      <div class="flex c-theme pointer" v-else-if="item.key_value == 'daily_budget'" @click="editPlanEvent(scope.row)">
124
+                        {{scope.row[item.key_value] ? NumberHandle(scope.row[item.key_value]) : '不限'}}
125
+                      </div>
121 126
 
122
-              <div class="cellDiv" :class="tableInfo.sortKey == item.column ? 'active_css' : ''" v-else>
123
-                <el-tooltip :disabled="!(scope.row[item.column] && scope.row[item.column].length >30)" effect="dark" :content="scope.row[item.column]+''">
124
-                  <div class="clampTwo line21" style="flex: 1">
125
-                    {{ scope.row[item.column] || scope.row[item.column]==0 ?
126
-                      (item.cancleForMat ? (scope.row[item.column] ? scope.row[item.column] : '-') : NumberHandle(scope.row[item.column])) : '-'}}
127
-                    <span v-if="item.hasPercent&&(scope.row[item.column] || scope.row[item.column] ==0)">%</span>
128
-                  </div>
129
-                </el-tooltip>
130
-              </div>
131
-              </div>
132
-            </template>
133
-          </el-table-column>
134
-        </template>
135
-      </el-table>
127
+                      <div class="cellDiv" :class="tableInfo.sortKey == item.key_value ? 'active_css' : ''" v-else>
128
+                        <el-tooltip :disabled="!(scope.row[item.key_value] && scope.row[item.key_value].length >30)" effect="dark" :content="scope.row[item.key_value]+''">
129
+                          <div class="clampTwo line21" style="flex: 1">
130
+                            {{ scope.row[item.key_value] || scope.row[item.key_value]==0 ?
131
+                              (item.if_sort == 1 ?  NumberHandle(scope.row[item.key_value]) : (scope.row[item.key_value] || '-')) : '-'}}
132
+                            <span v-if="item.hasPercent&&(scope.row[item.key_value] || scope.row[item.key_value] ==0)">%</span>
133
+                          </div>
134
+                        </el-tooltip>
135
+                      </div>
136
+                    </div>
137
+                  </template>
138
+                </el-table-column>
139
+              </template>
140
+            </el-table-column>
141
+          </template>
142
+        </el-table>
143
+        <div class="paginationBox flex" style="justify-content: center" v-if="Number(tableInfo.total) > 0">
144
+          <el-pagination
145
+              v-model:currentPage="tableInfo.currentPage"
146
+              v-model:page-size="tableInfo.pageSize"
147
+              background
148
+              :total="tableInfo.total"
149
+              @current-change="handleCurrentChange" />
150
+        </div>
151
+      </template>
136 152
 
137
-      <div class="paginationBox flex" style="justify-content: center" v-if="Number(tableInfo.total) > 0">
138
-        <el-pagination
139
-            v-model:currentPage="tableInfo.currentPage"
140
-            v-model:page-size="tableInfo.pageSize"
141
-            background
142
-            :total="tableInfo.total"
143
-            @current-change="handleCurrentChange" />
144
-      </div>
145 153
     </div>
146 154
 
147 155
     <EditIpt ref="planEditIptRef" title="推广计划" @confirm="planEditConfirm"></EditIpt>
@@ -163,6 +171,8 @@ import {Api} from "@/api/api";
163 171
 import {ElMessage} from "element-plus";
164 172
 import {batchGdt_edit, batchGdt_list, reactiveTableAndAny} from "@/api/ApiModel";
165 173
 import Indicators from './indicators/index.vue'
174
+import _ from "lodash";
175
+import {getCurrentTime} from "@/common/common";
166 176
 
167 177
 const { proxy } = getCurrentInstance() as any;
168 178
 // 全局方法定义
@@ -183,23 +193,12 @@ const loading = ref<boolean>(false)
183 193
 const tableInfo = reactive<reactiveTableAndAny>({
184 194
   tableList:[],
185 195
   tableList_all:[],
186
-  descol:[
187
-    { name:'计划名称',column:'campaign_name',slotFlag: true,isfixed:true,alignSelf:'left'},
188
-    { name:'操作',column:'operate',slotFlag: true,isfixed:true},
189
-    { name:'账号ID',column:'account_id',cancleForMat:true},
190
-    { name:'计划ID',column:'campaign_id',cancleForMat:true},
191
-    { name:'计划类型',column:'campaign_type'},
192
-    { name:'推广目标类型',column:'promoted_object_type'},
193
-    { name:'日预算(元)',column:'daily_budget',slotFlag: true},
194
-    // { name:'总预算',column:'total_budget'},
195
-    { name:'投放日期',column:'created_time'},
196
-    { name:'客户状态',column:'configured_status',slotFlag: true},
197
-    { name:'投放速度',column:'speed_mode',slotFlag: true},
198
-  ],
196
+  descol:[],
199 197
   multipleSelection:[],
200 198
   updateKey:1,
201 199
   chooseAll:false,
202 200
   sortKey:'',
201
+  sortType:'',
203 202
   moreList:[
204 203
     {value:'1',label:'启用'},
205 204
     {value:'2',label:'暂停'},
@@ -209,15 +208,10 @@ const tableInfo = reactive<reactiveTableAndAny>({
209 208
   pageSize:20,
210 209
   total:0,
211 210
   totalPages:0,//共多少页
211
+  summary:[]
212 212
 })
213 213
 
214 214
 
215
-
216
-//批量操作
217
-const batchEvent = () => {
218
-
219
-}
220
-
221 215
 // 启用 暂停 删除
222 216
 const batchPlanApi = async (arr?:any,val?:any) => {
223 217
   const paramsModel = reactive<batchGdt_edit>({
@@ -274,8 +268,10 @@ const planEditConfirm = () => {
274 268
 
275 269
 
276 270
 //排序
277
-const sortEvent = (row:any) => {
278
-
271
+const sortEvent = (sortKey,sortType) => {
272
+  tableInfo.sortKey = sortKey
273
+  tableInfo.sortType = sortType
274
+  init()
279 275
 }
280 276
 
281 277
 //列表
@@ -290,12 +286,27 @@ const init = async (page?:any,totalPages?:any) => {
290 286
     page:page?page:1,
291 287
     pageSize:totalPages ? totalPages : tableInfo.pageSize
292 288
   })
289
+  if(tableInfo.sortKey){
290
+    paramsModel['field'] = tableInfo.sortKey
291
+    paramsModel['order'] = tableInfo.sortType
292
+  }
293 293
   let res:any = await proxy.$http.get(Api.batchGdt_plan_list,paramsModel)
294 294
   loading.value = false
295 295
   if(res&&res.errNo=='0'){
296 296
     if(totalPages){
297 297
       tableInfo.tableList_all = res.rst.data.list
298 298
     }else{
299
+      tableInfo.summary = res.rst.data.summary
300
+      tableInfo.summary[0].campaign_name = '合计(缓存时间:' + getCurrentTime() + ')'
301
+      tableInfo.descol = []
302
+      res.rst.data.explain.forEach(ex=>{
303
+        ex.sub = []
304
+        let subObj:any = _.cloneDeep(ex)
305
+        subObj.label = tableInfo.summary[0][ex.key_value] || ''
306
+        ex.sub.push(subObj)
307
+      })
308
+      tableInfo.descol = res.rst.data.explain;
309
+      tableInfo.descol.splice(1,0,{label:'操作',key_value:'operate',disabled:1,sub:[{label:'',key_value:'operate',disabled:1}]})
299 310
       tableInfo.tableList = res.rst.data.list
300 311
       tableInfo.total = res.rst.pageInfo.total
301 312
       tableInfo.totalPages = res.rst.pageInfo.total
@@ -363,9 +374,6 @@ const singleChooseCheckboxEvent = (idx:number,row:any)=>{
363 374
   }
364 375
 }
365 376
 
366
-const IndicatorsRefreshList = () => {
367
-  //这里刷新列表
368
-}
369 377
 
370 378
 const {
371 379
   init_acList,
@@ -389,29 +397,5 @@ onMounted(()=>{
389 397
 })
390 398
 </script>
391 399
 <style lang="scss" scoped>
392
-.campaignName{
393
-  .icon{
394
-    color: #3173FF;
395
-    opacity: 0;
396
-  }
397
-  &:hover{
398
-    .icon{
399
-      opacity: 1;
400
-    }
401
-  }
402
-}
403
-.checkBoxSelf{
404
-  width: 13px;
405
-  height: 13px;
406
-  border: 1px solid #d9d9d9;
407
-  border-radius: 2px;
408
-  &:hover{
409
-    cursor: pointer;
410
-    border: 1px solid #3173FF;
411
-  }
412
-  &.active{
413
-    border: 1px solid #3173FF;
414
-    background-color: #3173FF;
415
-  }
416
-}
400
+@import "./index.scss";
417 401
 </style>

+ 2 - 1
src/components/businessMoudle/gdtList/ts/list.ts

@@ -12,7 +12,8 @@ export function listTs(){
12 12
         return {
13 13
             backgroundColor: '#FAFAFA',
14 14
             color: '#161E46',
15
-            height: '44px'
15
+            height: '44px',
16
+            textAlign: 'center'
16 17
         }
17 18
     }
18 19