Ver Fonte

合并加速探索代买

朱鑫波 há 3 anos atrás
pai
commit
1bd0e0ee73

+ 22 - 19
src/api/manage.js

@@ -21,24 +21,27 @@ export function postNoCacheAction(url, parameter) {
   })
 }
 // post---文件
-export function postFileAction(url,parameter) {
+export function postFileAction(url, parameter) {
   return axios({
     headers: {
       'Content-Type': 'multipart/form-data'
     },
     url: url,
-    method:'post' ,
+    method: 'post',
     data: parameter
   })
 }
 //post
-export function postAction(url,parameter) {
+export function postAction(url, parameter) {
   return axios({
     url: url,
-    method:'post' ,
-    data: parameter
+    method: 'post',
+    data: parameter,
+
   })
+
 }
+
 export function getAction(url, parameter) {
   return axios({
     url: url,
@@ -46,10 +49,10 @@ export function getAction(url, parameter) {
     params: parameter
   })
 }
-export function postFormAction(url,parameter) {
+export function postFormAction(url, parameter) {
   return axios({
     url: url,
-    method:'post' ,
+    method: 'post',
     params: parameter
   })
 }
@@ -62,10 +65,10 @@ export function deleteAction(url, parameter) {
   })
 }
 //post method= {post | put}
-export function httpAction(url,parameter,method) {
+export function httpAction(url, parameter, method) {
   return axios({
     url: url,
-    method:method ,
+    method: method,
     data: parameter
   })
 }
@@ -105,10 +108,10 @@ export function saveService(parameter) {
 }
 
 //put
-export function putAction(url,parameter) {
+export function putAction(url, parameter) {
   return axios({
     url: url,
-    method:'put',
+    method: 'put',
     data: parameter
   })
 }
@@ -202,11 +205,11 @@ export function downloadFile(url, fileName, parameter) {
  * @param parameter
  * @returns {*}
  */
-export function uploadAction(url,parameter){
+export function uploadAction(url, parameter) {
   return axios({
     url: url,
     data: parameter,
-    method:'post' ,
+    method: 'post',
     headers: {
       'Content-Type': 'multipart/form-data',  // 文件上传
     },
@@ -219,17 +222,17 @@ export function uploadAction(url,parameter){
  * @param subStr
  * @returns {*}
  */
-export function getFileAccessHttpUrl(avatar,subStr) {
-  if(!subStr) subStr = 'http'
-  if(avatar && avatar.startsWith(subStr)){
+export function getFileAccessHttpUrl(avatar, subStr) {
+  if (!subStr) subStr = 'http'
+  if (avatar && avatar.startsWith(subStr)) {
     return avatar;
-  }else{
-    if(avatar && avatar.length>0 && avatar.indexOf('[')==-1){
+  } else {
+    if (avatar && avatar.length > 0 && avatar.indexOf('[') == -1) {
       return window._CONFIG['staticDomainURL'] + "/" + avatar;
     }
   }
 }
-export function postFile(URL,parameter) {
+export function postFile(URL, parameter) {
   return axios({
     url: URL,
     method: 'post',

+ 9 - 0
src/main.js

@@ -110,6 +110,15 @@ Vue.prototype.doMian = "http://139.186.31.213:8804/jeecg-boot";
 Vue.prototype.postFormAction = postFormAction;
 Vue.prototype.postDataAction = postAction;
 Vue.prototype.getAction = getAction;
+
+Vue.prototype.cancel = function () {
+  let cancelArr = window.axiosCancel
+  cancelArr = cancelArr || [] //判断空值
+  cancelArr.forEach((ele, index) => {
+    ele.cancel('取消了请求') // 在失败函数中返回这里自定义的错误信息
+    delete window.axiosCancel[index]
+  })
+}
 new Vue({
   router,
   store,

+ 82 - 68
src/utils/request.js

@@ -6,86 +6,89 @@
 import Vue from 'vue';
 import axios from 'axios';
 import store from '@/store';
-import {VueAxios} from './axios';
-import {Modal, notification} from 'ant-design-vue';
-import {ACCESS_TOKEN} from '@/store/mutation-types';
+import { VueAxios } from './axios';
+import { Modal, notification } from 'ant-design-vue';
+import { ACCESS_TOKEN } from '@/store/mutation-types';
 const key = '1';
 // 创建 axios 实例
 
+window.axiosCancel = []
 if (process.env.NODE_ENV === 'development') {
-    axios.defaults.baseURL = '/jeecg-boot';
+	axios.defaults.baseURL = '/jeecg-boot';
 }
 else if (process.env.NODE_ENV === 'debug') {
 }
 else if (process.env.NODE_ENV === 'production') {
 	// axios.defaults.baseURL = 'http://apipre.tjyourong.com.cn/jeecg-boot'; // 预生产
-    // axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot';//测试
+	// axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot';//测试
 	axios.defaults.baseURL = 'http://api.tjyourong.com.cn/jeecg-boot'; // 生产环境
+	// axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot'; // 生产环境
+
 }
 const service = axios.create({
 	// baseURL: '/jeecg-boot', // api base_url
-    timeout: 6000000 // 请求超时时间
+	timeout: 6000000, // 请求超时时间
 });
 
 
 
 
 const err = (error) => {
-    if (error.esponse) {
+	if (error.esponse) {
 		let data = error.response.data
 		const token = Vue.ls.get(ACCESS_TOKEN)
 		// console.log("------异常响应------", token)
 		// console.log("------异常响应------", error.response.status)
 		switch (error.response.status) {
-		case 403:
-			notification.error({key,message: '系统提示', description: '拒绝访问', duration: 4})
-			break
-		case 500:
-			//notification.error({ message: '系统提示', description:'Token失效,请重新登录!',duration: 4})
-			if (token && data.message == "Token失效,请重新登录") {
-			// update-begin- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转----
-			// store.dispatch('Logout').then(() => {
-			//     window.location.reload()
-			// })
-			Modal.error({
-				title: '登录已过期',
-				content: '很抱歉,登录已过期,请重新登录',
-				okText: '重新登录',
-				mask: false,
-				onOk: () => {
-				store.dispatch('Logout').then(() => {
-					Vue.ls.remove(ACCESS_TOKEN)
-					window.location.reload()
-				})
+			case 403:
+				notification.error({ key, message: '系统提示', description: '拒绝访问', duration: 4 })
+				break
+			case 500:
+				//notification.error({ message: '系统提示', description:'Token失效,请重新登录!',duration: 4})
+				if (token && data.message == "Token失效,请重新登录") {
+					// update-begin- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转----
+					// store.dispatch('Logout').then(() => {
+					//     window.location.reload()
+					// })
+					Modal.error({
+						title: '登录已过期',
+						content: '很抱歉,登录已过期,请重新登录',
+						okText: '重新登录',
+						mask: false,
+						onOk: () => {
+							store.dispatch('Logout').then(() => {
+								Vue.ls.remove(ACCESS_TOKEN)
+								window.location.reload()
+							})
+						}
+					})
+					// update-end- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转----
 				}
-			})
-			// update-end- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转----
-			}
-			break
-		case 404:
-			notification.error({key,message: '系统提示', description: '很抱歉,资源未找到!', duration: 4})
-			break
-		case 504:
-			notification.error({key,message: '系统提示', description: '网络超时'})
-			break
-		case 401:
-			notification.error({key,message: '系统提示', description: '未授权,请重新登录', duration: 4})
-			if (token) {
-			store.dispatch('Logout').then(() => {
-				setTimeout(() => {
-				window.location.reload()
-				}, 1500)
-			})
-			}
-			break
-		default:
-			notification.error({
-			key,
-			message: '系统提示',
-			description: data.message,
-			duration: 4
-			})
-			break
+				break
+			case 404:
+				notification.error({ key, message: '系统提示', description: '很抱歉,资源未找到!', duration: 4 })
+				break
+			case 504:
+				notification.error({ key, message: '系统提示', description: '网络超时' })
+				break
+			case 401:
+				notification.error({ key, message: '系统提示', description: '未授权,请重新登录', duration: 4 })
+				if (token) {
+					store.dispatch('Logout').then(() => {
+						setTimeout(() => {
+							window.location.reload()
+						}, 1500)
+					})
+				}
+				break
+			default:
+				notification.error({
+					key,
+					message: '系统提示',
+					description: data.message,
+					duration: 4
+				})
+				break
 		}
 	}
 	return Promise.reject(error)
@@ -94,30 +97,41 @@ const err = (error) => {
 // request interceptor
 service.interceptors.request.use(config => {
 	const token = Vue.ls.get(ACCESS_TOKEN);
-    if (token) {
+	if (token) {
 		config.headers['X-Access-Token'] = token; // 让每个请求携带自定义 token 请根据实际情况自行修改
-    }
-    if (config.method === 'get') {
+	}
+	if (config.method === 'get') {
 		config.params = {
 			_t: Date.parse(new Date()) / 1000,
 			...config.params
 		};
-    }
+	}
+	config.cancelToken = new axios.CancelToken(cancel => {
+		window.axiosCancel.push({
+			cancel
+		})
+	})
+
 	return config;
 }, (error) => {
-  	return Promise.reject(error);
+	return Promise.reject(error);
 });
 
 // response interceptor
 service.interceptors.response.use((response) => {
-    return response.data;
+	return response.data;
 }, (error) => {
-    notification.error({
-        key,
-        message: '系统提示',
-        description: '网络超时,请刷新页面'
-    });
-    return;
+	if (axios.isCancel(error)) {
+		
+	} else {
+		notification.error({
+			key,
+			message: '系统提示',
+			description: '网络超时,请刷新页面'
+		});
+	}
+
+	return;
 });
 
 const installer = {
@@ -128,6 +142,6 @@ const installer = {
 };
 
 export {
-    installer as VueAxios,
+	installer as VueAxios,
 	service as axios
 };

+ 634 - 0
src/views/modules/autoLaunch/components/configLaunchExploreDrawer.vue

@@ -0,0 +1,634 @@
+<style scoped lang="scss">
+/deep/ .ant-drawer-header {
+    border-bottom: 0px;
+    padding: 0;
+}
+/deep/.ant-drawer-body {
+    padding-top: 0;
+}
+/deep/.ant-tooltip-inner {
+    color: #fff !important;
+    background-color: rgba(0, 0, 0, 0.75) !important;
+}
+/deep/.ant-tooltip-arrow::before {
+    color: #fff !important;
+    background-color: rgba(0, 0, 0, 0.75) !important;
+}
+</style>
+<template>
+    <a-drawer width="50%" :visible="exploreVisible" @close="closeDrawer" id="explore">
+        <a-tabs v-model="exploreKey" slot="title">
+            <a-tab-pane key="1" tab="加速探索"> </a-tab-pane>
+            <a-tab-pane key="2" tab="辅助探索" disabled> </a-tab-pane>
+        </a-tabs>
+        <div v-if="exploreKey == '1'" style="padding-bottom:30px">
+            <a-tabs v-model="exploreHistory" @change="checkTab">
+                <a-tab-pane key="1" tab="批量加速探索"> </a-tab-pane>
+                <a-tab-pane key="2" tab="加速探索历史"> </a-tab-pane>
+            </a-tabs>
+            <div v-if="exploreHistory == '1'">
+                <a-form :form="form">
+                    <p style="font-size:16px">
+                        加速探索开启后预算会在6小时内消耗完成,给单元提供更多的曝光机会,是系统对当前单元的判断更加精准,加速探索不一定能使单元探索成功。
+                    </p>
+                    <p style="font-size:16px">
+                        当前预算:<span v-if="nowBudget == 0" style="font-weight:700"> 不限 </span
+                        ><span v-else style="font-weight:700">{{ nowBudget | decimalsHandle }}</span>
+                    </p>
+                    <p style="font-size:16px;">
+                        探索预算
+                        <a-tooltip>
+                            <template slot="title">
+                                注意:此处的预算为单组预算,总预算为 选择广告组数*单组预算 ,总预算不能超过当前账户预算
+                            </template>
+                            <a-icon type="question-circle" /> </a-tooltip
+                        >:
+                        <a-form-item style="display:inline-block;position:relative;top:-5px;margin-bottom:0">
+                            <a-input-number
+                                style="width:200px"
+                                v-decorator="[
+                                    'exploreDudget',
+                                    { rules: [{ required: true, message: '您还未设置加速探索预算,请先设置预算。' }] }
+                                ]"
+                                :min="100"
+                                :max="nowBudget == 0 ? 99999999999999 : nowBudget"
+                                :step="0.01"
+                            />
+                            <span style="margin: 0 10px" v-if="getFormData('exploreDudget')">
+                                可选:{{
+                                    nowBudget == 0 ? '不限' : Math.floor(nowBudget / getFormData('exploreDudget'))
+                                }}
+                            </span>
+                            <span style="margin: 0 10px"> 已选:{{ selectedRowKeys.length }} </span>
+                        </a-form-item>
+                    </p>
+                    <p>
+                        批量选择需要使用探索工具的广告组
+                        <a style="margin-left:15px" @click="allOpen">一键全部开启</a>
+                    </p>
+                </a-form>
+            </div>
+            <div v-else>
+                <a-form layout="inline" :form="formSearch" hide-required-mark :selfUpdate="true">
+                    <a-row :gutter="24" style="margin-bottom:15px">
+                        <a-col :md="8" :sm="8" :xxl="8">
+                            <a-form-item label="广告组ID">
+                                <a-input v-decorator="['unitId']" type="text" placeholder="请输入需要搜索的广告组ID" />
+                            </a-form-item>
+                        </a-col>
+                        <!--  -->
+                        <a-col :md="8" :sm="8" :xxl="8">
+                            <a-form-item label="广告组名称">
+                                <a-input
+                                    v-decorator="['unitName']"
+                                    type="text"
+                                    placeholder="请输入需要搜索的广告组名称"
+                                />
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="8" :sm="8" :xxl="8">
+                            <a-form-item label="状态">
+                                <a-select
+                                    v-decorator="['exploreStatus', { initialValue: 'null' }]"
+                                    placeholder="请选择"
+                                    style="width:200px"
+                                    allow-clear
+                                >
+                                    <a-select-option key="null">
+                                        全选
+                                    </a-select-option>
+                                    <a-select-option :key="0">
+                                        默认
+                                    </a-select-option>
+                                    <a-select-option :key="1">
+                                        加速探索
+                                    </a-select-option>
+                                    <a-select-option :key="2">
+                                        加速探索手动暂停
+                                    </a-select-option>
+                                    <a-select-option :key="3">
+                                        探索金额完成
+                                    </a-select-option>
+                                    <a-select-option :key="4">
+                                        时间到达截止时间
+                                    </a-select-option>
+                                </a-select>
+                            </a-form-item>
+                        </a-col>
+                    </a-row>
+                    <a-row :gutter="24">
+                        <a-col :md="16" :sm="16" :xxl="16">
+                            <a-form-item label="时间维度">
+                                <a-radio-group v-decorator="['timeRange', { initialValue: 'lastWeek' }]">
+                                    <a-radio-button value="today">
+                                        今天
+                                    </a-radio-button>
+                                    <a-radio-button value="yesterday">
+                                        昨天
+                                    </a-radio-button>
+                                    <a-radio-button value="lastWeek">
+                                        最近七天
+                                    </a-radio-button>
+                                    <a-radio-button value="lastMonth">
+                                        最近一月
+                                    </a-radio-button>
+                                </a-radio-group>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="8" :sm="8" :xxl="8">
+                            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+                                <a-button type="primary" icon="search" @click="handleQueryList">查询</a-button>
+                                <a-button type="primary" @click="handleResetForm" icon="reload" style="margin-left:10px"
+                                    >重置</a-button
+                                >
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+            <!-- :scroll="{ x: scrollX }" -->
+            <div class="table">
+                <a-table
+                    :columns="exploreColumns"
+                    :data-source="exploreList"
+                    bordered
+                    :pagination="ipagination"
+                    :loading="loading"
+                    :scroll="{ x: changeNum }"
+                    :rowSelection="
+                        exploreHistory == '1' ? { selectedRowKeys: selectedRowKeys, onChange: onSelectChange } : null
+                    "
+                    @change="sort"
+                    rowKey="unit_id"
+                >
+                    <span slot="ocpxActionType" slot-scope="text, record">
+                        {{ text | ocpxActionType }}
+                    </span>
+                </a-table>
+            </div>
+        </div>
+        <div v-else></div>
+        <div
+            v-if="exploreHistory == '1'"
+            :style="{
+                position: 'absolute',
+                right: 0,
+                bottom: 0,
+                width: '100%',
+                borderTop: '1px solid #e9e9e9',
+                padding: '10px 16px',
+                background: '#fff',
+                textAlign: 'right',
+                zIndex: 1
+            }"
+        >
+            <a-button :style="{ marginRight: '8px' }" @click="closeDrawer">
+                取消
+            </a-button>
+            <a-button type="primary" @click="batchOpen" :disabled="selectedRowKeys.length == 0">
+                批量开启
+            </a-button>
+        </div>
+    </a-drawer>
+</template>
+
+<script>
+import moment from 'moment'
+import { getAction, postAction, downFile, downFilePost, deleteAction } from '@/api/manage'
+import qs from 'qs'
+let typeValue = '预算'
+const exploreColumns = [
+    {
+        title: '组名称',
+        dataIndex: 'unit_name',
+        key: 'unit_name',
+        align: 'center',
+        scopedSlots: { customRender: 'unit_name' },
+        width: 200,
+        fixed: 'left'
+    },
+    {
+        title: '消耗',
+        dataIndex: 'charge',
+        key: 'charge',
+        align: 'center',
+        scopedSlots: { customRender: 'charge' },
+        sorter: () => {}
+    },
+    {
+        title: '激活数',
+        dataIndex: 'activation',
+        key: 'activation',
+        align: 'center',
+        scopedSlots: { customRender: 'activation' },
+        sorter: () => {}
+    },
+    {
+        title: '激活成本',
+        dataIndex: 'activationCost',
+        key: 'activationCost',
+        align: 'center',
+        scopedSlots: { customRender: 'activationCost' },
+        sorter: () => {}
+    },
+    {
+        title: '新增付费人数',
+        dataIndex: 'eventPay',
+        key: 'eventPay',
+        align: 'center',
+        scopedSlots: { customRender: 'eventPay' },
+        sorter: () => {}
+    },
+    {
+        title: '新增付费人数成本',
+        dataIndex: 'eventPayCost',
+        key: 'eventPayCost',
+        align: 'center',
+        scopedSlots: { customRender: 'eventPayCost' },
+        sorter: () => {}
+    },
+    {
+        title: '注册数',
+        dataIndex: 'eventRegister',
+        key: 'eventRegister',
+        align: 'center',
+        scopedSlots: { customRender: 'eventRegister' },
+        sorter: () => {}
+    },
+    {
+        title: '注册成本',
+        dataIndex: 'eventRegisterCost',
+        key: 'eventRegisterCost',
+        align: 'center',
+        scopedSlots: { customRender: 'eventRegisterCost' },
+        sorter: () => {}
+    },
+    {
+        title: '曝光数',
+        dataIndex: 'aclick',
+        key: 'aclick',
+        align: 'center',
+        scopedSlots: { customRender: 'aclick' },
+        sorter: () => {}
+    }
+]
+const exploreHistoryColumns = [
+    {
+        title: '广告组ID',
+        dataIndex: 'unitId',
+        key: 'unitId',
+        align: 'center',
+        scopedSlots: { customRender: 'unitId' },
+        fixed: 'left',
+        width: 120
+    },
+    {
+        title: '组名称',
+        dataIndex: 'unitName',
+        key: 'unitName',
+        align: 'center',
+        scopedSlots: { customRender: 'unitName' },
+        fixed: 'left',
+        width: 200
+    },
+    {
+        title: '总消耗',
+        dataIndex: 'totalCharge',
+        key: 'totalCharge',
+        align: 'center',
+        scopedSlots: { customRender: 'totalCharge' },
+        fixed: 'left',
+        width: 100
+    },
+    {
+        title: '探索预算',
+        dataIndex: 'exploreBudget',
+        key: 'exploreBudget',
+        align: 'center',
+        scopedSlots: { customRender: 'exploreBudget' }
+    },
+    {
+        title: '优化目标',
+        dataIndex: 'ocpxActionType',
+        key: 'ocpxActionType',
+        align: 'center',
+        scopedSlots: { customRender: 'ocpxActionType' }
+    },
+    {
+        title: '封面曝光数',
+        dataIndex: 'impression',
+        key: 'impression',
+        align: 'center',
+        scopedSlots: { customRender: 'impression' }
+    },
+    {
+        title: '素材曝光数',
+        dataIndex: 'click',
+        key: 'click',
+        align: 'center',
+        scopedSlots: { customRender: 'click' }
+    },
+    {
+        title: '封面点击数',
+        dataIndex: 'photoClick',
+        key: 'photoClick',
+        align: 'center',
+        scopedSlots: { customRender: 'photoClick' }
+    },
+    {
+        title: '转化数',
+        dataIndex: 'unifiedConversion',
+        key: 'unifiedConversion',
+        align: 'center',
+        scopedSlots: { customRender: 'unifiedConversion' }
+    },
+    {
+        title: '转化成本',
+        dataIndex: 'unitfiedConversionCost',
+        key: 'unitfiedConversionCost',
+        align: 'center',
+        scopedSlots: { customRender: 'unitfiedConversionCost' }
+    },
+    {
+        title: '状态',
+        dataIndex: 'exploreStatus',
+        key: 'exploreStatus',
+        align: 'center',
+        customRender: function(text) {
+            if (text == 0) {
+                return '默认'
+            } else if (text == 1) {
+                return '加速探索'
+            } else if (text == 2) {
+                return '加速探索手动暂停'
+            } else if (text == 3) {
+                return '探索金额完成'
+            } else if (text == 4) {
+                return '时间到达截止时间'
+            }
+        }
+    }
+]
+export default {
+    name: 'strategy-list',
+    components: {},
+    props: {
+        exploreVisible: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        exploreKey: {
+            type: String,
+            default() {
+                return '1'
+            }
+        }
+    },
+    // mixins: [JeecgListMixin],
+    data() {
+        return {
+            accountId: '',
+            exploreHistory: '1',
+            nowBudget: 0,
+            changeNum: 1500,
+            target: 'charge',
+            order: 'descend',
+            exploreList: [],
+            exploreDudget: null,
+            loading: false,
+            exploreColumns: [...exploreColumns],
+            selectedRowKeys: [],
+            selectedRows: [],
+            form: this.$form.createForm(this),
+            formSearch: this.$form.createForm(this),
+            exploreUrl: '/explore/todaylist',
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                //   pageSizeOptions: ['10', '20', '30'],
+                showTotal: (total, range) => {
+                    return range[0] + '-' + range[1] + ' 共' + total + '条'
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                pageSizeOptions: ['10', '30', '50'],
+                total: 0,
+                onChange: (current, pageSize) => {
+                    // 切换分页时的回调,
+                    // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+                    this.ipagination.current = current
+                    this.ipagination.pageSize = pageSize
+                }
+            }
+        }
+    },
+
+    methods: {
+        closeDrawer() {
+            this.exploreList = []
+            this.selectedRowKeys = []
+            this.exploreKey = '1'
+            this.exploreHistory = '1'
+            this.exploreUrl = '/explore/todaylist'
+            this.exploreColumns = [...exploreColumns]
+            this.form.resetFields()
+            this.$emit('update:exploreVisible', false)
+            this.$emit('update:exploreKey', '1')
+            this.$emit('update:accountId', '')
+        },
+        allOpen() {
+            this.form.validateFields((err, values) => {
+                if (!err) {
+                    if (this.nowBudget == 0) {
+                    } else {
+                        if (this.ipagination.total > Math.floor(this.nowBudget / values.exploreDudget)) {
+                            this.$message.error('预算不足,请重新选择广告组!')
+                            return
+                        }
+                    }
+                    let params = {}
+                    params.accountId = this.accountId
+                    params.exploreBudget = values.exploreDudget
+                    let that = this
+                    this.$confirm({
+                        title: '该操作有数倍超预算风险,你还要继续吗?',
+                        onOk() {
+                            that.postDataAction('/explore/openBudgets', params).then(res => {
+                                if (res.success) {
+                                    that.closeDrawer()
+                                    that.$message.success(res.result)
+                                } else {
+                                }
+                            })
+                        },
+                        onCancel() {}
+                    })
+                }
+            })
+        },
+        batchOpen() {
+            this.form.validateFields((err, values) => {
+                if (!err) {
+                    if (this.selectedRowKeys.length == 0) {
+                        this.$message.error('请选择广告组')
+                        return
+                    }
+                    if (this.nowBudget == 0) {
+                    } else {
+                        if (this.selectedRowKeys.length > Math.floor(this.nowBudget / values.exploreDudget)) {
+                            this.$message.error('预算不足,请重新选择广告组!')
+                            return
+                        }
+                    }
+                    let params = {}
+                    params.accountId = this.accountId
+                    params.unitIds = this.selectedRowKeys
+                    params.exploreBudget = values.exploreDudget
+                    let that = this
+                    this.$confirm({
+                        title: '该操作有数倍超预算风险,你还要继续吗?',
+                        onOk() {
+                            that.postDataAction('/explore/openBudgets', params).then(res => {
+                                if (res.success) {
+                                    that.closeDrawer()
+                                    that.$message.success(res.result)
+                                } else {
+                                }
+                            })
+                        },
+                        onCancel() {}
+                    })
+                }
+            })
+        },
+        onSelectChange(selectedRowKeys, selectionRows) {
+            this.selectedRowKeys = selectedRowKeys
+            this.selectionRows = selectionRows
+        },
+        sort(pagination, filters, sorter, { currentDataSource }) {
+            this.ipagination.current = pagination.current
+            this.ipagination.pageSize = pagination.pageSize
+
+            if (sorter.order) {
+                this.order = sorter.order ? sorter.order : 'descend'
+                this.target = sorter.columnKey
+                this.getData(this.accountId, {
+                    target: sorter.columnKey,
+                    order: sorter.order ? sorter.order : 'descend'
+                })
+            } else {
+                if (this.exploreHistory == '2') {
+                    const paramsData = this.formSearch.getFieldsValue()
+                    this.getData(this.accountId, paramsData)
+                } else {
+                    this.getData(this.accountId, null)
+                }
+            }
+        },
+        checkTab(key) {
+            if (key == '1') {
+                this.exploreUrl = '/explore/todaylist'
+                this.changeNum = 1500
+                this.exploreColumns = [...exploreColumns]
+                this.getData(this.accountId, null)
+            } else if (key == '2') {
+                this.exploreUrl = '/explore/historyList'
+                this.cancel()
+                this.ipagination.current = 1
+                this.exploreColumns = [...exploreHistoryColumns]
+                const paramsData = this.formSearch.getFieldsValue()
+                this.getData(this.accountId, paramsData)
+            }
+        },
+        handleQueryList() {
+            this.ipagination.current = 1
+            const paramsData = this.formSearch.getFieldsValue()
+            this.getData(this.accountId, paramsData)
+        },
+        handleResetForm() {
+            this.ipagination.current = 1
+            this.formSearch.resetFields()
+            const paramsData = this.formSearch.getFieldsValue()
+            this.getData(this.accountId, paramsData)
+        },
+        getData(accountId, data) {
+            this.exploreList = []
+            this.loading = true
+            this.accountId = accountId
+            let params = {}
+            params.accountId = accountId
+            params.pageSize = this.ipagination.pageSize
+            params.pageNo = this.ipagination.current
+            if (data && data.target) {
+                params.sortCode = data.target
+                if (data.order == 'descend') {
+                    params.sortType = 'DESC'
+                } else {
+                    params.sortType = 'ASC'
+                }
+            } else {
+                if (this.exploreHistory == '2') {
+                    params.unitId = data.unitId ? data.unitId : null
+                    params.unitName = data.unitName ? data.unitName : null
+                    params.exploreStatus = data.exploreStatus == 'null' ? null : data.exploreStatus
+                    switch (data.timeRange) {
+                        case 'today':
+                            params.startTime = moment().format('YYYY-MM-DD')
+                            params.endTime = moment().format('YYYY-MM-DD')
+                            break
+                        case 'yesterday':
+                            params.startTime = moment()
+                                .subtract(1, 'days')
+                                .format('YYYY-MM-DD')
+                            params.endTime = moment()
+                                .subtract(1, 'days')
+                                .format('YYYY-MM-DD')
+                            break
+                        case 'lastWeek':
+                            params.startTime = moment()
+                                .subtract(6, 'days')
+                                .format('YYYY-MM-DD')
+                            params.endTime = moment().format('YYYY-MM-DD')
+                            break
+                        case 'lastMonth':
+                            params.startTime = moment()
+                                .subtract(1, 'months')
+                                .format('YYYY-MM-DD')
+                            params.endTime = moment().format('YYYY-MM-DD')
+                            break
+                        default:
+                            params.startTime = moment()
+                                .subtract(6, 'days')
+                                .format('YYYY-MM-DD')
+                            params.endTime = moment().format('YYYY-MM-DD')
+                            break
+                    }
+                } else {
+                    params.sortCode = this.target
+                    params.sortType = this.order == 'descend' ? 'DESC' : 'ASC'
+                }
+            }
+            this.postDataAction(this.exploreUrl, params)
+                .then(res => {
+                    this.loading = false
+                    if (res.success) {
+                        this.nowBudget = res.result.dayBudget ? res.result.dayBudget : 0
+                        this.exploreList = res.result.pageInfo.list
+                        this.ipagination.total = res.result.pageInfo.total
+                    }
+                })
+                .catch(err => {
+                    // 3、调用取消 注意:要写在catch回调函数里
+                })
+        },
+        getFormData(className) {
+            return this.form.getFieldValue(className)
+        }
+    },
+    mounted() {},
+
+    filters: {}
+}
+</script>

+ 35 - 38
src/views/modules/autoLaunch/configLaunchList.vue

@@ -1,3 +1,8 @@
+<style scoped lang="scss">
+    /deep/ .ant-drawer-header{
+        border-bottom: 0px;
+    }
+</style>
 <template>
     <div class="toutiaoBatch">
         
@@ -117,44 +122,22 @@
                             </template>
                             <a href="javascript:;"  type='primary' @click="()=>{record.visible=true}">修改出价</a>
                         </a-popover>
+                        <!-- <a-divider type="vertical" />
+                        <a  @click="goExplore(record)">加速探索</a> -->
                     </span>
+                    <span slot="action" slot-scope="text,record">
+                        <a  @click="goExplore(record)">加速探索</a>
+                    </span>
+                    
 
                 </a-table>
             </div>
         </div>
-        
-       <!-- 加速坍缩 -->
-        <!-- <a-modal v-model="targetVisible" title="加速探索" @ok="targethandleOk">
-            <div class="linkBody">
-                <a-row>
-                    <a-col :span="4">
-                        <p style="text-align:right">加速探索预算:</p>
-                    </a-col>
-                    <a-col :span="18">
-                        <a-input-number :min="100"  :step="0.01"  />
-                    </a-col>
-                </a-row>
-                <p></p>
-                <a-row>
-                    <a-col :span="4">
-                        <p style="text-align:right">最多探索量:
-                            <a-tooltip>
-                                <template slot="title">
-                                该广告账户中加速探索的广告组数量的最大值
-                                </template>
-                                <a-icon type="question-circle" />
-                            </a-tooltip>
-                        </p>
-                    </a-col>
-                    <a-col :span="18">
-                        <a-input-number :min="1" :max="10" :step="1"  />
-                    </a-col>
-                </a-row>
-                
-            </div>
-        </a-modal> -->
-              
-    <!-- </a-spin> -->
+        <configLaunchExploreDrawer 
+        :exploreVisible.sync="exploreVisible" 
+        :exploreKey.sync="exploreKey" 
+        ref="exploreDrawer" />
+       
     </div>
 </template>
 
@@ -164,6 +147,7 @@ import { getAction, postAction, downFile, downFilePost,deleteAction } from '@/ap
 // import { JeecgListMixin } from '@/mixins/ipagination'
 // import editableCell from './editableCell'
 import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
+import configLaunchExploreDrawer from './components/configLaunchExploreDrawer.vue'
 import qs from 'qs'
 let typeValue='预算'
 
@@ -241,6 +225,14 @@ const strategyColumns = [
     width:350,
    
   },
+  {
+    title: '探索工具',
+    dataIndex: 'action',
+    key: 'action',
+    align: 'center',
+    scopedSlots: { customRender: 'action' }
+   
+  },
 
 ];
 
@@ -253,10 +245,14 @@ export default {
     components: {
         // editableCell,
         Treeselect,
+        configLaunchExploreDrawer
     },
     // mixins: [JeecgListMixin],
     data() {
         return {
+            exploreAccountId:"",
+            exploreVisible:false,
+            exploreKey:'',
             targetVisible:false,
             selectedRecord:{},
             bidErrorMessage:'',
@@ -268,7 +264,6 @@ export default {
             strategyState:undefined,
             strategyName:'',
             strategyId:undefined,
-            accountId:[],
             scrollX:0,
             ipagination: {
                 current: 1,
@@ -322,6 +317,12 @@ export default {
         },
     },
     methods: {
+        goExplore(item) {
+            this.exploreVisible = true
+            this.exploreKey = '1'
+            this.exploreAccountId = item.accountId
+            this.$refs.exploreDrawer.getData(item.accountId)
+        },
         //状态改变
         switchChange(text,record){
             // this.spinning=true;
@@ -631,10 +632,6 @@ export default {
 
     }
     
-    .ant-tooltip-inner,.ant-tooltip-arrow::before{
-        background-color: #fff;
-        color: #333;
-    }
     #batchModal{
         .rules,.totalPrice{
             font-weight: 600;

+ 1 - 1
vue.config.js

@@ -105,7 +105,7 @@ module.exports = {
         // target: 'http://192.168.1.43:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.1.43:8806', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.0.252:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
-        // target: 'http://192.168.1.219:8081', //请求本地 需要jeecg-boot后台项目  赵西安
+        // target: 'http://192.168.1.219:8080', //请求本地 需要jeecg-boot后台项目  赵西安
         // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目