Browse Source

账户配置 merge work

jiayufei 4 years ago
parent
commit
8ac80521ad

+ 8 - 2
src/views/modules/account-config/account-config-server.js

@@ -1,3 +1,9 @@
-// export const urlAcount = 'http://118.24.244.213:8080'; // 线上
+/**
+ * @file 账户配置API
+ * @author jiayufei
+ */
+
+export const urlAcount = 'http://118.24.244.213:8080'; // 线上
+// export const urlAcount = 'http://apipre.tjyourong.com.cn'; // 预生产
 // export const urlAcount = 'http://192.168.1.43:8080'; // 子安
 // export const urlAcount = 'http://192.168.1.43:8080'; // 子安
-export const urlAcount = 'http://139.186.165.84:8080'; // 测试
+// export const urlAcount = 'http://139.186.165.84:8080'; // 测试

+ 50 - 21
src/views/modules/account-config/account-config.vue

@@ -39,7 +39,7 @@
                         <template slot="title">
                         <template slot="title">
                             <span>当日花费</span>
                             <span>当日花费</span>
                         </template>
                         </template>
-                        <a-icon type="smile-o"/>
+                        <a-icon type="question-circle"/>
                     </a-tooltip>
                     </a-tooltip>
                 </span>
                 </span>
                 <span slot="acountRelax" slot-scope="text, record">
                 <span slot="acountRelax" slot-scope="text, record">
@@ -104,7 +104,7 @@
                             @blur="handleAccountBudget"
                             @blur="handleAccountBudget"
                         /> 元
                         /> 元
                     </a-form-model-item>
                     </a-form-model-item>
-                    <div v-if="adBudgetShowTitle" style="width: 500px;color: #f00;margin-left: 140px;">单次修改预算幅度, 不能低于100.0元</div>
+                    <!-- <div v-if="adBudgetShowTitle" style="width: 500px;color: #f00;margin-left: 140px;">单次修改预算幅度, 不能低于100.0元</div> -->
                 </a-form-model>
                 </a-form-model>
             </div>
             </div>
         </a-modal>
         </a-modal>
@@ -141,6 +141,7 @@
                                 v-model="configForm.adMinBid"
                                 v-model="configForm.adMinBid"
                                 :min="0.1"
                                 :min="0.1"
                                 :max="10000"
                                 :max="10000"
+                                :step="0.01"
                                 placeholder="请输入最小值"
                                 placeholder="请输入最小值"
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
@@ -151,6 +152,7 @@
                                 v-model="configForm.adMaxBid"
                                 v-model="configForm.adMaxBid"
                                 :min="0.1"
                                 :min="0.1"
                                 :max="10000"
                                 :max="10000"
+                                :step="0.01"
                                 placeholder="请输入最大值"
                                 placeholder="请输入最大值"
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
@@ -162,6 +164,7 @@
                                 v-model="configForm.adMinBid"
                                 v-model="configForm.adMinBid"
                                 :min="0.1"
                                 :min="0.1"
                                 :max="10000"
                                 :max="10000"
+                                :step="0.01"
                                 placeholder="请输入最小值"
                                 placeholder="请输入最小值"
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
@@ -172,12 +175,15 @@
                                 v-model="configForm.adMaxBid"
                                 v-model="configForm.adMaxBid"
                                 :min="0.1"
                                 :min="0.1"
                                 :max="10000"
                                 :max="10000"
+                                :step="0.01"
                                 placeholder="请输入最大值"
                                 placeholder="请输入最大值"
                             />
                             />
                         </a-form-model-item>
                         </a-form-model-item>
                         <a-form-model-item label="浮动间隔" prop="adStepBid">
                         <a-form-model-item label="浮动间隔" prop="adStepBid">
                             <a-input-number
                             <a-input-number
                                 class="common-input"
                                 class="common-input"
+                                :min="0"
+                                :step="0.01"
                                 v-model="configForm.adStepBid"
                                 v-model="configForm.adStepBid"
                                 placeholder="请输入浮动间隔"
                                 placeholder="请输入浮动间隔"
                             />
                             />
@@ -203,19 +209,27 @@ export default {
     data() {
     data() {
         let adMinBidValidator = (rule, value, callback) => {
         let adMinBidValidator = (rule, value, callback) => {
             const finallyResult = Number(this.configForm.adMaxBid);
             const finallyResult = Number(this.configForm.adMaxBid);
-            if (finallyResult !== '' && value && Number(value) < finallyResult) {
+            if (finallyResult !== '' && value && Number(value) <= finallyResult) {
                 callback();
                 callback();
             }
             }
             else {
             else {
                 callback('最低出价不能高于最高出价');
                 callback('最低出价不能高于最高出价');
             }
             }
         };
         };
+        let adCpaBidValidator = (rule, value, callback) => {
+            if (Number(this.updateModTxt.adBudget) < Number(value)) {
+                callback('出价不能大于预算');
+            }
+            else {
+                callback();
+            }
+        };
         let adMaxBidValidator = (rule, value, callback) => {
         let adMaxBidValidator = (rule, value, callback) => {
             const finallyResult = Number(this.configForm.adMinBid);
             const finallyResult = Number(this.configForm.adMinBid);
-            if (finallyResult && value && Number(value) < finallyResult) {
+            if (finallyResult && value && Number(value) <= finallyResult) {
                 callback('最高出价不能低于最低出价');
                 callback('最高出价不能低于最低出价');
             }
             }
-            else if (Number(this.updateModTxt.accountBudget) < Number(value)) {
+            else if (Number(this.updateModTxt.adBudget) < Number(value)) {
                 callback('出价不能大于预算');
                 callback('出价不能大于预算');
             }
             }
             else if (Number(this.configForm.adMaxBid) > Number(this.configForm.adMinBid) + Number(this.configForm.adStepBid)) {
             else if (Number(this.configForm.adMaxBid) > Number(this.configForm.adMinBid) + Number(this.configForm.adStepBid)) {
@@ -236,6 +250,18 @@ export default {
                 callback('最低出价+浮动间隔<最高出价');
                 callback('最低出价+浮动间隔<最高出价');
             }
             }
         };
         };
+        let budgetValidator = (rule, value, callback) => {
+            const changeBudget = this.updateModTxt.accountBudget;
+            if (Number(value) > Number(changeBudget) && Number(value) < (Number(changeBudget) + 100)) {
+                callback('单次修改预算幅度, 不能低于100.0元');
+            }
+            else if (Number(value) < Number(changeBudget) && Number(value) > (Number(changeBudget) - 100)) {
+                callback('单次修改预算幅度, 不能低于100.0元');
+            }
+            else {
+                callback();
+            }
+        };
         return {
         return {
             adBudgetShowTitle: false,
             adBudgetShowTitle: false,
             budgetVisible: false,
             budgetVisible: false,
@@ -245,7 +271,8 @@ export default {
             },
             },
             budgetRules: {
             budgetRules: {
                 budget: [
                 budget: [
-                    {required: true, message: '请输入', trigger: 'blur'}
+                    {required: true, message: '请输入', trigger: 'blur'},
+                    {validator: budgetValidator, trigger: 'blur'}
                 ]
                 ]
             },
             },
             labelCol: {span: 4},
             labelCol: {span: 4},
@@ -258,7 +285,8 @@ export default {
             },
             },
             rules: {
             rules: {
                 adCpaBid: [
                 adCpaBid: [
-                    {required: true, message: '请输入', trigger: 'blur'}
+                    {required: true, message: '请输入', trigger: 'blur'},
+                    {validator: adCpaBidValidator, trigger: 'blur'}
                 ],
                 ],
                 adStepBid: [
                 adStepBid: [
                     {required: true, message: '请输入', trigger: 'blur'},
                     {required: true, message: '请输入', trigger: 'blur'},
@@ -312,8 +340,9 @@ export default {
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
-                    title: '账户日预算(元)',
+                    title: '账户日预算(元)',
                     dataIndex: 'accountBudget',
                     dataIndex: 'accountBudget',
+                    width: 180,
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
@@ -324,12 +353,14 @@ export default {
                 {
                 {
                     align: 'center',
                     align: 'center',
                     dataIndex: 'cost',
                     dataIndex: 'cost',
+                    width: 150,
                     slots: {title: 'customTitle'}
                     slots: {title: 'customTitle'}
                 },
                 },
                 {
                 {
                     title: '操作',
                     title: '操作',
                     dataIndex: 'action',
                     dataIndex: 'action',
                     align: 'center',
                     align: 'center',
+                    width: '20%',
                     scopedSlots: {customRender: 'action'}
                     scopedSlots: {customRender: 'action'}
                 }
                 }
             ]
             ]
@@ -344,22 +375,12 @@ export default {
     methods: {
     methods: {
         ...mapGetters(['nickname', 'avatar', 'userInfo']),
         ...mapGetters(['nickname', 'avatar', 'userInfo']),
         handleAccountMode(e) {
         handleAccountMode(e) {
-            this.budgetForm.budget = 0;
+            this.budgetForm.budget = 1000;
+            this.adBudgetShowTitle = false;
         },
         },
         handleAccountBudget(e) {
         handleAccountBudget(e) {
             const adBudgetInput = e.target.value;
             const adBudgetInput = e.target.value;
-            console.log(this.updateModTxt, 'this.updateModTxt-this.updateModTxt');
-            const changeBudget = this.updateModTxt.accountBudget;
-            this.configForm.budget = Number(Number(adBudgetInput).toFixed(2));
-            if (Number(adBudgetInput) >= Number(changeBudget) && Number(adBudgetInput) < (Number(changeBudget) + 100)) {
-                this.adBudgetShowTitle = true;
-            }
-            else if (Number(adBudgetInput) <= Number(changeBudget) && Number(adBudgetInput) > (Number(changeBudget) - 100)) {
-                this.adBudgetShowTitle = true;
-            }
-            else {
-                this.adBudgetShowTitle = false;
-            }
+            this.budgetForm.budget = Number(Number(adBudgetInput).toFixed(2));
         },
         },
         handleModeSure() {
         handleModeSure() {
             let paramsData = new FormData();
             let paramsData = new FormData();
@@ -400,10 +421,16 @@ export default {
         },
         },
         handleUpdateMod(record) {
         handleUpdateMod(record) {
             this.updateModTxt = record;
             this.updateModTxt = record;
+            this.configForm.adCpaBid = record.adCpaBid;
+            this.configForm.adMinBid = record.adMinBid;
+            this.configForm.adMaxBid = record.adMaxBid;
+            this.configForm.adStepBid = record.adStepBid;
             this.modeVisible = true;
             this.modeVisible = true;
         },
         },
         handleUpdateBudget(record) {
         handleUpdateBudget(record) {
             this.updateModTxt = record;
             this.updateModTxt = record;
+            this.budgetForm.budgetType = record.accountBudgetMode;
+            this.budgetForm.budget = record.accountBudget;
             this.budgetVisible = true;
             this.budgetVisible = true;
         },
         },
         handleBudgetSure() {
         handleBudgetSure() {
@@ -430,6 +457,7 @@ export default {
         },
         },
         handleBudgetCancel() {
         handleBudgetCancel() {
             this.budgetVisible = false;
             this.budgetVisible = false;
+            this.budgetForm.budgetType = '1';
         },
         },
         handlePopoverChange(data) {
         handlePopoverChange(data) {
             putAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/updStaOrCpaOrBudgetById', data).then(result => {
             putAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/updStaOrCpaOrBudgetById', data).then(result => {
@@ -441,6 +469,7 @@ export default {
                     this.adCpaBid = undefined;
                     this.adCpaBid = undefined;
                     this.modeVisible = false;
                     this.modeVisible = false;
                     this.budgetVisible = false;
                     this.budgetVisible = false;
+                    this.budgetForm.budgetType = '1';
                     this.handleInitTable();
                     this.handleInitTable();
                 }
                 }
                 else {
                 else {

+ 119 - 0
src/views/modules/account-config/components/check-more-plat/check-more-plat.less

@@ -0,0 +1,119 @@
+.ul-radio-group {
+    border-radius: 5px;
+    height: 32px;
+    padding: 0;
+    margin: 0;
+    border: none;
+    background: transparent;
+    .btn {
+        background: transparent;
+        padding: 0;
+        margin: 0;
+        border: none;
+    }
+    .item {
+        min-width: 80px;
+        padding: 0px 15px;
+        text-align: center;
+        display: inline-block;
+        border: 1px solid #ccc;
+        border-left: 0;
+        height: 32px;
+        line-height: 32px;
+        cursor: pointer;
+        .checkbox-button-input {
+            width: 0;
+            height: 0;
+            opacity: 0;
+        }
+        .ant-checkbox {
+            display: none;
+        }
+    }
+    .bgcolor {
+        color: rgba(0, 0, 0, 0.25);
+        background-color: #f5f5f5;
+        border-color: #d9d9d9;
+        cursor: not-allowed;
+    }
+    .item::after {
+        content: '';
+        position: absolute;
+        right: 1px;
+        top: -2px;
+        width: 0;
+        height: 0;
+        border-top: 6px solid transparent;
+        border-bottom: 6px solid transparent;
+        border-left: 6px solid;
+        border-left-color: #e0e0e0;
+        -webkit-transform: rotate(-45deg);
+        -ms-transform: rotate(-45deg);
+        transform: rotate(-45deg);
+        border-radius: 2px;
+    }
+    .item:hover {
+        color: #1890ff;
+    }
+    .selection {
+        color: #fff;
+        background: #1890ff;
+    }
+    .item.selection:hover {
+        color: #fff;
+        background: #40a9ff;
+    }
+    .item.selection:after {
+        border-left: 6px solid #1890ff;
+    }
+    .item:hover::after {
+        border-left: 6px solid #40a9ff;
+    }
+    .bgcolor:hover {
+        color: rgba(0, 0, 0, 0.25);
+        background-color: #f5f5f5;
+        border-color: #d9d9d9;
+        cursor: not-allowed;
+    }
+    .bgcolor:hover::after {
+        border-left: 6px solid #e0e0e0;
+    }
+    .bgcolor.selection:after {
+        border-left: 6px solid #e0e0e0;
+    }
+    .bgcolor.selection {
+        color: rgba(0, 0, 0, 0.25);
+        background-color: #f5f5f5;
+        border-color: #d9d9d9;
+        cursor: not-allowed;
+    }
+    .bgcolor.selection:hover {
+        color: rgba(0, 0, 0, 0.25);
+        background-color: #f5f5f5;
+        border-color: #d9d9d9;
+        cursor: not-allowed;
+    }
+    .bgcolor.selection:after {
+        border-left: 6px solid #e0e0e0;
+    }
+    .ant-checkbox-wrapper + .ant-checkbox-wrapper {
+        margin-left: 0;
+    }
+}
+.ul-radio-group .item:first-child {
+    border-radius: 5px 0 0 5px;
+    border-left: 1px solid #ccc;
+}
+.ul-radio-group .item.selection:first-child {
+    border-radius: 5px 0 0 5px;
+    border-left: 1px solid #1890ff;
+}
+.ul-radio-group .item.selection:nth-child(2) {
+    border-left: 1px solid #1890ff;
+}
+.ul-radio-group .item:first-child:after {
+    border-left: 0;
+}
+.ul-radio-group .item:last-child {
+    border-radius: 0px 5px 5px 0px;
+}

+ 331 - 0
src/views/modules/account-config/components/check-more-plat/check-more-plat.vue

@@ -0,0 +1,331 @@
+<style lang="scss">
+.ul-radio-group {
+  border-radius: 5px;
+  height: 32px;
+  padding: 0;
+  margin: 0;
+  border: none;
+  background: transparent;
+
+  .btn {
+    background: transparent;
+    padding: 0;
+    margin: 0;
+    border: none;
+  }
+  .item {
+    min-width: 80px;
+    padding: 0px 15px;
+    text-align: center;
+    display: inline-block;
+    border: 1px solid #ccc;
+    border-left: 0;
+    height: 32px;
+    line-height: 32px;
+    cursor: pointer;
+    .checkbox-button-input {
+      width: 0;
+      height: 0;
+      opacity: 0;
+    }
+    .ant-checkbox {
+      display: none;
+    }
+  }
+  .bgcolor {
+    color: rgba(0, 0, 0, 0.25);
+    background-color: #f5f5f5;
+    border-color: #d9d9d9;
+    cursor: not-allowed;
+  }
+  .item::after {
+    content: '';
+    position: absolute;
+    right: 1px;
+    top: -2px;
+    width: 0;
+    height: 0;
+    border-top: 6px solid transparent;
+    border-bottom: 6px solid transparent;
+    border-left: 6px solid;
+    border-left-color: #e0e0e0;
+    -webkit-transform: rotate(-45deg);
+    -ms-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+    border-radius: 2px;
+  }
+  .item:hover {
+    color: #1890ff;
+  }
+  .selection {
+    color: #fff;
+    background: #1890ff;
+    // border-color: #1890ff;
+  }
+  .item.selection:hover {
+    color: #fff;
+    background: #40a9ff;
+  }
+  .item.selection:after {
+    border-left: 6px solid #1890ff;
+  }
+  .item:hover::after {
+    // border-color: #40a9ff;
+    border-left: 6px solid #40a9ff;
+  }
+  .bgcolor:hover {
+    color: rgba(0, 0, 0, 0.25);
+    background-color: #f5f5f5;
+    border-color: #d9d9d9;
+    cursor: not-allowed;
+  }
+  .bgcolor:hover::after {
+    // border-color: #40a9ff;
+    border-left: 6px solid #e0e0e0;
+  }
+  .bgcolor.selection:after {
+    border-left: 6px solid #e0e0e0;
+  }
+  .bgcolor.selection {
+    color: rgba(0, 0, 0, 0.25);
+    background-color: #f5f5f5;
+    border-color: #d9d9d9;
+    cursor: not-allowed;
+  }
+  .bgcolor.selection:hover {
+    // color: #1890ff;
+    color: rgba(0, 0, 0, 0.25);
+    background-color: #f5f5f5;
+    border-color: #d9d9d9;
+    cursor: not-allowed;
+  }
+  .bgcolor.selection:after {
+    border-left: 6px solid #e0e0e0;
+  }
+  .ant-checkbox-wrapper + .ant-checkbox-wrapper {
+    margin-left: 0;
+  }
+}
+.ul-radio-group .item:first-child {
+  border-radius: 5px 0 0 5px;
+  border-left: 1px solid #ccc;
+}
+.ul-radio-group .item.selection:first-child {
+  border-radius: 5px 0 0 5px;
+  border-left: 1px solid #1890ff;
+}
+.ul-radio-group .item.selection:nth-child(2) {
+  border-left: 1px solid #1890ff;
+}
+.ul-radio-group .item:first-child:after {
+  border-left: 0;
+}
+.ul-radio-group .item:last-child {
+  border-radius: 0px 5px 5px 0px;
+}
+</style>
+<template>
+    <div class="ul-radio-group">
+        <a-checkbox-group v-model="selectedVal" :disabled="disabled" style="width: 100%">
+            <a-checkbox
+                v-for="item of selectOption"
+                :label="item.label"
+                :key="item.value"
+                :value="item.value"
+                :class="{
+                    item: true && userButton,
+                    selection: selectedVal && selectedVal.indexOf(item.value) > -1 && userButton,
+                    bgcolor: item.disabled
+                }"
+            >
+                {{ item.label }}
+            </a-checkbox>
+        </a-checkbox-group>
+    </div>
+</template>
+<script>
+import {isArray} from '@/utils/Tools';
+import {getAction } from '@/api/manage';
+export default {
+    name: 'check-more-plat',
+    props: {
+        userButton: {
+            type: Boolean,
+            default() {
+                return true
+            }
+        },
+        code: {
+            // 参数code
+            type: String,
+            default: ''
+        },
+        allValue: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        options: {
+            // 外部传入的option 可替代请求项
+            type: Array,
+            default() {
+                return []
+            }
+        },
+        value: {
+            // v-model绑定值
+            type: [Number, Array, String],
+            default() {
+                return []
+            }
+        },
+        label: {
+            // label 绑定值
+            type: [Array, String],
+            default: ''
+        },
+        radioStyle: {
+            // 是否复选框模拟单选效果
+            type: Boolean,
+            default: false
+        },
+        disabled: {
+            // 是否禁用
+            type: Boolean,
+            default: false
+        }
+    },
+    data() {
+        return {
+            selectOption: []
+        }
+    },
+    watch: {
+        options(val) {
+            if (isArray(val)) {
+                this.selectOption.splice(0, this.selectOption.length);
+                this.selectOption.push(...val);
+            }
+        },
+        selectedVal(n, o) {
+            if (this.radioStyle && !this.allValue) {
+                if (n.length == 0) {
+                this.selectedVal = o;
+                }
+            }
+        }
+    },
+    computed: {
+        selectedVal: {
+            get: function () {
+                return this.value;
+            },
+            set: function (val) {
+                this.selectChange(val);
+            }
+        }
+    },
+    mounted() {
+        this.$nextTick(() => {
+            if (this.code && this.options.length == 0) {
+                // 如果code值不为空且options.lengt==0, 则去请求字典项
+                this.getOptions();
+            }
+            else {
+                // 否则直接获取外部传入的options
+                this.selectOption.splice(0, this.selectOption.length);
+                this.selectOption.push(...this.options);
+            }
+        });
+    },
+  methods: {
+    getOptions() {
+        // 获取字典项
+        getAction('/sys/dictItem/list', { dictId: this.code, pageSize: 1000, pageNo: 1 }).then((res) => {
+            if (res.success && isArray(res.result.records)) {
+                var data = res.result.records;
+                data = data.map((item) => {
+                    return {
+                        label: item.itemText,
+                        value: item.itemValue,
+                        ...item
+                    };
+                });
+                if (this.allValue) {
+                    data.unshift({ label: '不检查', value: 'unlimited' });
+                    if (this.value == '' || this.value == '' || this.value == null || this.value.length == 0) {
+                        this.selectedVal = ['unlimited'];
+                    };
+                }
+                else {
+                    if (this.value == '' || this.value == '' || this.value == null || this.value.length == 0) {
+                        this.selectedVal = [];
+                    }
+                }
+                this.selectOption.push(...data);
+            }
+        });
+    },
+    selectChange(val) {
+        // 选择事件
+        if (!this.radioStyle) {
+            // 多选
+            var retrunData = [];
+            let label = this.selectOption.filter((v) => val.findIndex((item) => item == v.value) > -1).map((v) => v.label);
+            if (this.allValue) {
+                if (val.findIndex((item) => item == 'unlimited') == 0) {
+                    retrunData = val.slice(-1);
+                }
+                else if (val.findIndex((item) => item == 'unlimited') == val.length - 1) {
+                    retrunData = ['unlimited'];
+                }
+                else {
+                    retrunData = val;
+                }
+            }
+            else {
+                retrunData = val;
+            }
+            this.$emit('input', retrunData);
+            this.$emit('update:label', label);
+            this.$emit('change', val);
+        }
+        else {
+            // 模拟单选radio效果
+            let selectVal = [];
+            if (this.allValue) {
+                if (val.length == 0) {
+                    selectVal = ['unlimited'];
+                }
+            }
+            else {
+                if (val.length == 0) {
+                    selectVal = [];
+                }
+            }
+            if (val.length > 0) {
+                selectVal = val.slice(-1);
+            }
+            let label = this.selectOption
+            .filter((v) => selectVal.findIndex((item) => item == v.value) > -1)
+            .map((v) => v.label);
+            this.$emit('input', selectVal);
+            this.$emit('update:label', label);
+            this.$emit('change', selectVal);
+        }
+    },
+    emitChange(...args) {
+        // emit change事件
+        this.$emit('change', ...args);
+    },
+    consoleFun(...args) {
+        // 打印信息
+        if (process.env.NODE_ENV == 'development') {
+            console.log(...args);
+        }
+    }
+  }
+}
+</script>
+

+ 5 - 6
src/views/modules/account-config/components/configuration-modal.less

@@ -15,6 +15,11 @@
                 margin-right: 20px;
                 margin-right: 20px;
             }
             }
         }
         }
+        .form-itrm-icon {
+            position: absolute;
+            top: 3px;
+            left: -175px;
+        }
         .separate-title-header {
         .separate-title-header {
             font-size: 22px;
             font-size: 22px;
             font-weight: bold;
             font-weight: bold;
@@ -187,12 +192,6 @@
             .acount-search-class {
             .acount-search-class {
                 width: 350px;
                 width: 350px;
             }
             }
-            
-            .form-itrm-icon {
-                position: absolute;
-                top: 3px;
-                left: -175px;
-            }
             .advers-title-class {
             .advers-title-class {
                 margin-left: 10px;
                 margin-left: 10px;
                 margin-right: 15px;
                 margin-right: 15px;

+ 357 - 77
src/views/modules/account-config/components/configuration-modal.vue

@@ -128,7 +128,7 @@
                             <span>输入的数量为每天所创建的广告组数量</span>
                             <span>输入的数量为每天所创建的广告组数量</span>
                             <span>以及每个广告组创建的广告计划数量</span>
                             <span>以及每个广告组创建的广告计划数量</span>
                         </template>
                         </template>
-                        <a-icon class="form-itrm-icon" type="smile-o"/>
+                        <a-icon class="form-itrm-icon" type="question-circle"/>
                     </a-tooltip>
                     </a-tooltip>
                     <div v-if="campaignStatus" style="width: 500px;color: #f00;">单账号每天创建计划上限500个</div>
                     <div v-if="campaignStatus" style="width: 500px;color: #f00;">单账号每天创建计划上限500个</div>
                 </a-form-model-item>
                 </a-form-model-item>
@@ -192,6 +192,15 @@
                         allow-clear
                         allow-clear
                     />
                     />
                 </a-form-model-item>
                 </a-form-model-item>
+                <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="优先应用商店下载">
+                    <a-radio-group
+                        v-model="configForm.adDownloadMode"
+                        button-style="solid"
+                    >
+                        <a-radio-button value="DEFAULT">不启用</a-radio-button>
+                        <a-radio-button value="APP_STORE_DELIVERY">启用</a-radio-button>
+                    </a-radio-group>
+                </a-form-model-item>
             </div>
             </div>
             <div class="separate-module-con">
             <div class="separate-module-con">
                 <p class="rock-title">优化目标</p>
                 <p class="rock-title">优化目标</p>
@@ -268,8 +277,8 @@
                 </div>
                 </div>
             </div>
             </div>
             <div class="separate-module-con">
             <div class="separate-module-con">
-                <a-tabs v-model="selectPackageTabs" @change="handleSelectPackageTabs">
-                    <a-tab-pane key="1" tab="新建定向">
+                <a-tabs v-model="configForm.adDirectionalFlag" @change="handleSelectPackageTabs">
+                    <a-tab-pane key="add" tab="新建定向">
                         <p class="rock-title">用户定向</p>
                         <p class="rock-title">用户定向</p>
                         <a-form-model-item label="地域">
                         <a-form-model-item label="地域">
                             <a-radio-group v-model="configForm.adDistrict" button-style="solid">
                             <a-radio-group v-model="configForm.adDistrict" button-style="solid">
@@ -305,6 +314,24 @@
                         <a-form-model-item label="年龄">
                         <a-form-model-item label="年龄">
                             <radio-check v-model="configForm.adSelectAge" :options="ageArr" @change="getAgeSelect"></radio-check>
                             <radio-check v-model="configForm.adSelectAge" :options="ageArr" @change="getAgeSelect"></radio-check>
                         </a-form-model-item>
                         </a-form-model-item>
+                        <a-form-model-item label="行为兴趣">
+                            <a-radio-group
+                                v-model="configForm.adInterestActionMode"
+                                button-style="solid"
+                            >
+                                <a-radio-button value="UNLIMITED">不限</a-radio-button>
+                                <a-radio-button value="RECOMMEND">
+                                    系统推荐
+                                    <a-tooltip placement="top">
+                                        <template slot="title">
+                                            <span>若与自定义人群包同时使用,选择定向人群时系统推荐定向不生效</span>
+                                        </template>
+                                        <a-icon type="question-circle" />
+                                    </a-tooltip>
+                                </a-radio-button>
+                                <a-radio-button value="CUSTOM" disabled>自定义</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
                         <a-form-model-item label="自定义人群">
                         <a-form-model-item label="自定义人群">
                             <a-radio-group v-model="configForm.customPerson" button-style="solid" @change="handleCustomPerson">
                             <a-radio-group v-model="configForm.customPerson" button-style="solid" @change="handleCustomPerson">
                                 <a-radio-button value="NONE">不限</a-radio-button>
                                 <a-radio-button value="NONE">不限</a-radio-button>
@@ -328,6 +355,7 @@
                                     :valueids="configForm.adRetargetingTagsType"
                                     :valueids="configForm.adRetargetingTagsType"
                                     :updatelistinclude="configForm.updateGetingInclude" @selection-alone-event="handleSelectionAloneEvent"
                                     :updatelistinclude="configForm.updateGetingInclude" @selection-alone-event="handleSelectionAloneEvent"
                                     @clearlist="handleClearlist"
                                     @clearlist="handleClearlist"
+                                    @clear-table-alone="handleClearTableAlone"
                                 >
                                 >
                                 </directional-logic>
                                 </directional-logic>
                             </div>
                             </div>
@@ -342,6 +370,7 @@
                                     :valueids="configForm.adRetargetingTagsType"
                                     :valueids="configForm.adRetargetingTagsType"
                                     :updatelistexclude="configForm.updateGetingExclude" @selection-alone-event="handleSelectionAloneEvent"
                                     :updatelistexclude="configForm.updateGetingExclude" @selection-alone-event="handleSelectionAloneEvent"
                                     @clearlist="handleClearlist"
                                     @clearlist="handleClearlist"
+                                    @clear-table-alone="handleClearTableLogic"
                                 >
                                 >
                                 </directional-logic>
                                 </directional-logic>
                             </div>
                             </div>
@@ -358,6 +387,8 @@
                                     :updatelistexclude="configForm.updateGetingExclude" @selection-direct-event="handleDirectEvent"
                                     :updatelistexclude="configForm.updateGetingExclude" @selection-direct-event="handleDirectEvent"
                                     @selection-exclude-event="handleExcludeEvent"
                                     @selection-exclude-event="handleExcludeEvent"
                                     @clearlist="handleClearlist"
                                     @clearlist="handleClearlist"
+                                    @clear-table-direct="handleClearTableAlone"
+                                    @clear-table-exclude="handleClearTableLogic"
                                 >
                                 >
                                 </directional-logic>
                                 </directional-logic>
                             </div>
                             </div>
@@ -370,6 +401,12 @@
                             </a-radio-group>
                             </a-radio-group>
                         </a-form-model-item>
                         </a-form-model-item>
                         <a-form-model-item label="平台">
                         <a-form-model-item label="平台">
+                            <!-- <check-more-plat
+                                v-model="configForm.updateAdPlatform"
+                                :options="adPlatformOption"
+                                @change="handlePlateSelect"
+                            >
+                            </check-more-plat> -->
                             <a-radio-group v-model="configForm.adPlatform" button-style="solid">
                             <a-radio-group v-model="configForm.adPlatform" button-style="solid">
                                 <a-radio-button value="NONE" :disabled="platformLoadingType === 'APP_IOS' || platformLoadingType === 'APP_ANDROID'">不限</a-radio-button>
                                 <a-radio-button value="NONE" :disabled="platformLoadingType === 'APP_IOS' || platformLoadingType === 'APP_ANDROID'">不限</a-radio-button>
                                 <a-radio-button value="IOS" :disabled="platformLoadingType === 'APP_ANDROID'">IOS</a-radio-button>
                                 <a-radio-button value="IOS" :disabled="platformLoadingType === 'APP_ANDROID'">IOS</a-radio-button>
@@ -378,7 +415,12 @@
                             </a-radio-group>
                             </a-radio-group>
                         </a-form-model-item>
                         </a-form-model-item>
                         <a-form-model-item label="设备类型">
                         <a-form-model-item label="设备类型">
-                            <radio-check v-model="configForm.adDeviceSelectType" :options="deviceTypeList" @change="getAgeSelect"></radio-check>
+                            <radio-check
+                                v-model="configForm.adDeviceSelectType"
+                                :options="deviceTypeList"
+                                @change="getAgeSelect"
+                            >
+                            </radio-check>
                         </a-form-model-item>
                         </a-form-model-item>
                         <a-form-model-item v-if="configForm.adDownloadUrl" label="安卓版本">
                         <a-form-model-item v-if="configForm.adDownloadUrl" label="安卓版本">
                             <a-radio-group v-model="configForm.adAndroidVersion" button-style="solid" @change="handleAndroidVersion">
                             <a-radio-group v-model="configForm.adAndroidVersion" button-style="solid" @change="handleAndroidVersion">
@@ -411,7 +453,7 @@
                             </a-radio-group>
                             </a-radio-group>
                         </a-form-model-item>
                         </a-form-model-item>
                         <a-form-model-item v-if="configForm.adConvertType" label="过滤已转化用户">
                         <a-form-model-item v-if="configForm.adConvertType" label="过滤已转化用户">
-                            <a-radio-group v-model="configForm.adHideIfConverted" button-style="solid">
+                            <a-radio-group v-model="configForm.adHideIfConverted" button-style="solid" @change="handleAdhideConver">
                                 <a-radio-button
                                 <a-radio-button
                                     v-for="item in adHideIfConvertedDataOption"
                                     v-for="item in adHideIfConvertedDataOption"
                                     :key="item.id"
                                     :key="item.id"
@@ -421,15 +463,43 @@
                                 </a-radio-button>
                                 </a-radio-button>
                             </a-radio-group>
                             </a-radio-group>
                         </a-form-model-item>
                         </a-form-model-item>
+                        <a-form-model-item v-if="configForm.adHideIfConverted === 'CUSTOMER' || configForm.adHideIfConverted === 'APP'" label="过滤时间">
+                            <a-radio-group v-model="configForm.adConvertedTimeDuration" button-style="solid">
+                                <a-radio-button value="ONE_MONTH">1个月</a-radio-button>
+                                <a-radio-button value="THREE_MONTH">3个月</a-radio-button>
+                                <a-radio-button value="SIX_MONTH">6个月</a-radio-button>
+                                <a-radio-button value="TWELVE_MONTH">12个月</a-radio-button>
+                            </a-radio-group>
+                            <a-tooltip placement="top">
+                                <template slot="title">
+                                    <span>对已转化过的用户避免再次投放的时间</span>
+                                </template>
+                                <a-icon class="form-itrm-icon" style="left: -90px;" type="question-circle"/>
+                            </a-tooltip>
+                        </a-form-model-item>
                         <a-form-model-item label="智能放量">
                         <a-form-model-item label="智能放量">
-                            <a-radio-group v-model="configForm.adAutoExtendEnabled" button-style="solid">
+                            <a-radio-group v-model="configForm.adAutoExtendEnabled" button-style="solid" @change="handleAdAutoExtend">
                                 <a-radio-button value="0">不开启</a-radio-button>
                                 <a-radio-button value="0">不开启</a-radio-button>
                                 <a-radio-button value="1">开启</a-radio-button>
                                 <a-radio-button value="1">开启</a-radio-button>
                             </a-radio-group>
                             </a-radio-group>
+                            <a-tooltip placement="top">
+                                <template slot="title">
+                                    <span>智能放量可以帮您逐步探索已选定向人群之外的目标人群,提升跑量。已选择定向建议放开</span>
+                                </template>
+                                <a-icon class="form-itrm-icon" style="left: -90px;" type="question-circle"/>
+                            </a-tooltip>
                         </a-form-model-item>
                         </a-form-model-item>
+                        <div v-if="configForm.adAutoExtendEnabled === '1'" class="adver-position-radio" style="width: 70%;">
+                            <auto-select
+                                :defaultlist="adAutoExtendList"
+                                :editdata="AutoExtendEditSelect"
+                                @select-finally-result="handleSelectTxtend"
+                            >
+                            </auto-select> 
+                        </div>
                     </a-tab-pane>
                     </a-tab-pane>
-                    <a-tab-pane key="2" tab="选择定向包">
-                        <a-form-model-item class="select-orientation-class" label="选择已有定向包" :prop="selectPackageTabs === '2' ? 'adAudiencePackageId' : ''">
+                    <a-tab-pane key="choice" tab="选择定向包">
+                        <a-form-model-item class="select-orientation-class" label="选择已有定向包" :prop="configForm.adDirectionalFlag === 'choice' ? 'adAudiencePackageId' : ''">
                             <a-select
                             <a-select
                                 class="common-input-long"
                                 class="common-input-long"
                                 v-model="configForm.adAudiencePackageId"
                                 v-model="configForm.adAudiencePackageId"
@@ -453,7 +523,7 @@
                                 <template slot="title">
                                 <template slot="title">
                                     <span>已有定向包只展示当前推广目的和投放范围下,定向功能升级后仍可用的定向包</span>
                                     <span>已有定向包只展示当前推广目的和投放范围下,定向功能升级后仍可用的定向包</span>
                                 </template>
                                 </template>
-                                <a-icon class="form-itrm-icon orientation-icon" type="smile-o"/>
+                                <a-icon class="form-itrm-icon orientation-icon" type="question-circle"/>
                             </a-tooltip>
                             </a-tooltip>
                         </a-form-model-item>
                         </a-form-model-item>
                         <span v-if="selectOrientPlaceholder !== 'able'" style="color: #f00; margin-left: 198px;">{{ selectOrientPlaceholder }}</span>
                         <span v-if="selectOrientPlaceholder !== 'able'" style="color: #f00; margin-left: 198px;">{{ selectOrientPlaceholder }}</span>
@@ -629,6 +699,7 @@
                         <a-input-number
                         <a-input-number
                             class="common-input"
                             class="common-input"
                             v-model="configForm.adStepBid"
                             v-model="configForm.adStepBid"
+                            :min="0"
                             :step="0.01"
                             :step="0.01"
                             placeholder="请输入"
                             placeholder="请输入"
                             @blur="handleFloatingInterval"
                             @blur="handleFloatingInterval"
@@ -748,6 +819,60 @@
                         allow-clear
                         allow-clear
                     />
                     />
                 </a-form-model-item>
                 </a-form-model-item>
+                <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="应用名" prop="creativeAppName">
+                    <a-input
+                        class="common-input-long"
+                        placeholder="请输入应用名"
+                        v-model="configForm.creativeAppName"
+                        allow-clear
+                    />
+                </a-form-model-item>
+                <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL' && platformLoadingType === 'APP_ANDROID'" label="副标题">
+                    <a-input
+                        class="common-input-long"
+                        placeholder="请输入来源"
+                        v-model="configForm.creativeSubTitle"
+                        allow-clear
+                        @blur="handleCreativeSubTitleBlur"
+                    />
+                </a-form-model-item>
+                <div v-if="subTitleMsgStatus" style="width: 500px;color: #f00;margin-left: 140px">{{ subTitleMsg }}</div>
+                <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="自动生成视频素材">
+                    <a-radio-group v-model="configForm.creativeIsPresentedVideo" button-style="solid">
+                        <a-radio-button :value="0">不启用</a-radio-button>
+                        <a-radio-button :value="1">启用</a-radio-button>
+                    </a-radio-group>
+                </a-form-model-item>
+                <a-form-model-item v-if="configForm.adDownloadType === 'DOWNLOAD_URL'" label="最优创意衍生计划">
+                    <a-radio-group v-model="configForm.creativeGenerateDerivedAd" button-style="solid">
+                        <a-radio-button :value="0">不启用</a-radio-button>
+                        <a-radio-button :value="1">启用</a-radio-button>
+                    </a-radio-group>
+                </a-form-model-item>
+                <a-form-model-item label="广告评论">
+                    <a-radio-group v-model="configForm.creativeIsCommentDisable" button-style="solid">
+                        <a-radio-button :value="1">关闭</a-radio-button>
+                        <a-radio-button :value="0">开启</a-radio-button>
+                    </a-radio-group>
+                </a-form-model-item>
+                <a-form-model-item label="客户端下载视频">
+                    <a-radio-group v-model="configForm.creativeDownloadStatus" button-style="solid">
+                        <a-radio-button :value="1">关闭</a-radio-button>
+                        <a-radio-button :value="0">开启</a-radio-button>
+                    </a-radio-group>
+                </a-form-model-item>
+                <a-form-model-item label="创意展现">
+                    <a-radio-group v-model="configForm.creativeDisplayMode" button-style="solid">
+                        <a-radio-button value="CREATIVE_DISPLAY_MODE_CTR">优选模式</a-radio-button>
+                        <a-radio-button value="CREATIVE_DISPLAY_MODE_RANDOM">轮播模式</a-radio-button>
+                    </a-radio-group>
+                </a-form-model-item>
+                <div v-if="configForm.creativeDisplayMode === 'CREATIVE_DISPLAY_MODE_CTR'" class="adver-position-radio">
+                    选择优选模式,系统会自动对效果好的创意进行展示量倾斜,创意效果越好展示量越高
+                </div>
+                <div v-if="configForm.creativeDisplayMode === 'CREATIVE_DISPLAY_MODE_RANDOM'" class="adver-position-radio">
+                    使用创意轮播,系统将平分各创意展现机会,便于广告主比较各创意投放效果
+                </div>
             </div>
             </div>
             <div class="separate-module-con">
             <div class="separate-module-con">
                 <p class="rock-title">创意分类</p>
                 <p class="rock-title">创意分类</p>
@@ -791,7 +916,7 @@
                 </div>
                 </div>
             </div>
             </div>
             <div class="separate-module-con btn-Unique-con">
             <div class="separate-module-con btn-Unique-con">
-                <a-button class="sure-btn" type="primary" @click="handleRelaxSure">确定</a-button>
+                <a-button class="sure-btn" type="primary" :loading="sureLoading" @click="handleRelaxSure">确定</a-button>
                 <a-button class="cancel-btn" @click="handleRelaxCancel">取消</a-button>
                 <a-button class="cancel-btn" @click="handleRelaxCancel">取消</a-button>
             </div>
             </div>
         </a-form-model>
         </a-form-model>
@@ -804,6 +929,8 @@ import SelectCheckAll from '../../BatchCreate/toutiaoTime';
 import radioCheck from '@/components/formComponents/checkBoxGroup';
 import radioCheck from '@/components/formComponents/checkBoxGroup';
 import linkMultiSelect from '@/views/modules/BatchCreate/linkMultiSelect';
 import linkMultiSelect from '@/views/modules/BatchCreate/linkMultiSelect';
 import DirectionalLogic from './directional-logic/directional-logic';
 import DirectionalLogic from './directional-logic/directional-logic';
+import AutoSelect from './tree-select/tree-select';
+import CheckMorePlat from './check-more-plat/check-more-plat';
 
 
 import moment from 'moment';
 import moment from 'moment';
 import BMF from 'browser-md5-file';
 import BMF from 'browser-md5-file';
@@ -834,7 +961,9 @@ export default {
         SelectCheckAll,
         SelectCheckAll,
         radioCheck,
         radioCheck,
         linkMultiSelect,
         linkMultiSelect,
-        DirectionalLogic
+        DirectionalLogic,
+        AutoSelect,
+        CheckMorePlat
     },
     },
     data() {
     data() {
         let handleConfirmValue = (rule, value, callback) => {
         let handleConfirmValue = (rule, value, callback) => {
@@ -852,6 +981,9 @@ export default {
         let handleCharacterLen20 = (rule, value, callback) => {
         let handleCharacterLen20 = (rule, value, callback) => {
             this.handleExportRules(value, 4, 20, callback);
             this.handleExportRules(value, 4, 20, callback);
         };
         };
+        let handleCharacterLenCreativeApp = (rule, value, callback) => {
+            this.handleExportRules(value, 4, 20, callback);
+        };
         let floatingIntervalValidator = (rule, value, callback) => {
         let floatingIntervalValidator = (rule, value, callback) => {
             const finallyResult = Number(this.configForm.adMinBid) + Number(value);
             const finallyResult = Number(this.configForm.adMinBid) + Number(value);
             if (finallyResult < Number(this.configForm.adMaxBid)) {
             if (finallyResult < Number(this.configForm.adMaxBid)) {
@@ -881,10 +1013,66 @@ export default {
                 callback('最高出价不能低于最低出价');
                 callback('最高出价不能低于最低出价');
             }
             }
         };
         };
+        let budgetValidator = (rule, value, callback) => {
+            if (this.modalTitle === 'edit') {
+                if (Number(value) > Number(this.defaultAdBudget) && Number(value) < (Number(this.defaultAdBudget) + 100)) {
+                    callback('单次修改预算幅度, 不能低于100.0元');
+                }
+                else if (Number(value) < Number(this.defaultAdBudget) && Number(value) > (Number(this.defaultAdBudget) - 100)) {
+                    callback('单次修改预算幅度, 不能低于100.0元');
+                }
+                else {
+                    callback();
+                }
+            }
+        };
         return {
         return {
+            sureLoading: false,
+            subTitleMsgStatus: false,
+            subTitleMsg: '',
+            AutoExtendEditSelect: [],
+            adPlatformOption: [
+                {
+                    value: 'NONE',
+                    label: '不限'
+                },
+                {
+                    value: 'IOS',
+                    label: 'IOS'
+                },
+                {
+                    value: 'ANDROID',
+                    label: 'ANDROID'
+                },
+                {
+                    value: 'PC',
+                    label: 'PC'
+                }
+            ],
+            adAutoExtendList: [
+                {
+                    value: 'AGE',
+                    label: '年龄'
+                },
+                {
+                    value: 'REGION',
+                    label: '地域'
+                },
+                {
+                    value: 'GENDER',
+                    label: '性别'
+                },
+                {
+                    value: 'INTEREST_ACTION',
+                    label: '行为兴趣'
+                },
+                {
+                    value: 'CUSTOM_AUDIENCE',
+                    label: '自定人群-定向'
+                }
+            ],
             directionalData: [],
             directionalData: [],
             platformLoadingType: '',
             platformLoadingType: '',
-            selectPackageTabs: '1',
             deviceTypeList: [
             deviceTypeList: [
                 {
                 {
                     value: 'NONE',
                     value: 'NONE',
@@ -959,7 +1147,7 @@ export default {
             regionCityListUrl: 'ctop/bytedanceAreaInfo/list',
             regionCityListUrl: 'ctop/bytedanceAreaInfo/list',
             defaultAdBudget: '',
             defaultAdBudget: '',
             adBudgetShowTitle: false,
             adBudgetShowTitle: false,
-            adBudgetNum: 1,
+            adBudgetNum: 300,
             campaignStatus: false,
             campaignStatus: false,
             detailData: {},
             detailData: {},
             modalTitle: '',
             modalTitle: '',
@@ -1013,6 +1201,10 @@ export default {
             labelCol: {span: 4},
             labelCol: {span: 4},
             wrapperCol: {span: 14},
             wrapperCol: {span: 14},
             rules: {
             rules: {
+                creativeAppName: [
+                    {required: true, message: '请输入', trigger: 'blur'},
+                    {validator: handleCharacterLenCreativeApp, trigger: 'blur'}
+                ],
                 adExternalUrl: [
                 adExternalUrl: [
                     {required: true, message: '请输入', trigger: 'blur'},
                     {required: true, message: '请输入', trigger: 'blur'},
                     {validator: handleConfirmValue, trigger: 'blur'}
                     {validator: handleConfirmValue, trigger: 'blur'}
@@ -1037,7 +1229,8 @@ export default {
                     {required: true, message: '请输入', trigger: 'blur'}
                     {required: true, message: '请输入', trigger: 'blur'}
                 ],
                 ],
                 accountBudget: [
                 accountBudget: [
-                    {required: true, message: '请输入', trigger: 'blur'}
+                    {required: true, message: '请输入', trigger: 'blur'},
+                    {validator: budgetValidator, trigger: 'blur'}
                 ],
                 ],
                 campaignName: [
                 campaignName: [
                     {required: true, message: '请输入广告组名称', trigger: 'blur'},
                     {required: true, message: '请输入广告组名称', trigger: 'blur'},
@@ -1077,6 +1270,17 @@ export default {
                 creativeThirdIndustryIds: [{required: true, message: '请选择', trigger: 'change'}]
                 creativeThirdIndustryIds: [{required: true, message: '请选择', trigger: 'change'}]
             },
             },
             configForm: {
             configForm: {
+                adDirectionalFlag: 'add',
+                adInterestActionMode: 'UNLIMITED',
+                creativeDisplayMode: 'CREATIVE_DISPLAY_MODE_CTR',
+                creativeAppName: undefined,
+                creativeIsPresentedVideo: 0,
+                creativeGenerateDerivedAd: 0,
+                creativeIsCommentDisable: 0,
+                creativeDownloadStatus: 1,
+                creativeSubTitle: '',
+                adConvertedTimeDuration: 'THREE_MONTH',
+                adDownloadMode: 'DEFAULT',
                 dpLinkIndexUsed: 0,
                 dpLinkIndexUsed: 0,
                 adRetargetingTagsType: '',
                 adRetargetingTagsType: '',
                 adAudiencePackageId: undefined,
                 adAudiencePackageId: undefined,
@@ -1095,7 +1299,7 @@ export default {
                 productSellingPoints: [], // 商品买点
                 productSellingPoints: [], // 商品买点
                 adBudgetMode: 'BUDGET_MODE_DAY', // 预算类型
                 adBudgetMode: 'BUDGET_MODE_DAY', // 预算类型
                 adDownloadUrl: '', // 下载链接
                 adDownloadUrl: '', // 下载链接
-                accountBudget: 1000, // 账户日预算
+                accountBudget: 0, // 账户日预算
                 accountId: undefined, // 账户
                 accountId: undefined, // 账户
                 dpLinkStartIndex: 1,
                 dpLinkStartIndex: 1,
                 dpLinkEndIndex: 2,
                 dpLinkEndIndex: 2,
@@ -1123,6 +1327,7 @@ export default {
                 customPerson: 'NONE', // 定向-自定义
                 customPerson: 'NONE', // 定向-自定义
                 adSuperiorPopularityType: 'NONE', // 定向-媒体定向
                 adSuperiorPopularityType: 'NONE', // 定向-媒体定向
                 adPlatform: 'NONE', // 定向-平台
                 adPlatform: 'NONE', // 定向-平台
+                updateAdPlatform: ['NONE'],
                 adDeviceSelectType: ['NONE'],
                 adDeviceSelectType: ['NONE'],
                 adSelectAc: ['NONE'],
                 adSelectAc: ['NONE'],
                 adAc: '', // 定向-网络
                 adAc: '', // 定向-网络
@@ -1132,7 +1337,7 @@ export default {
                 adAndroidVersion: 'NONE', // 定向-安卓版本
                 adAndroidVersion: 'NONE', // 定向-安卓版本
                 androidChangeValue: '', // 安卓版本-自定义
                 androidChangeValue: '', // 安卓版本-自定义
                 adSmartBidType: 'SMART_BID_CUSTOM', // 投放场景
                 adSmartBidType: 'SMART_BID_CUSTOM', // 投放场景
-                adBudget: 1, // 预算
+                adBudget: 300, // 预算
                 adScheduleType: 'SCHEDULE_FROM_NOW', // 投放时间
                 adScheduleType: 'SCHEDULE_FROM_NOW', // 投放时间
                 launchDateRange: [], // 设置开始和结束时间
                 launchDateRange: [], // 设置开始和结束时间
                 launchTimeInterval: 'buxian', // 投放时段
                 launchTimeInterval: 'buxian', // 投放时段
@@ -1152,6 +1357,7 @@ export default {
                 updateGetingExclude: [],
                 updateGetingExclude: [],
                 adRetargetingTagsInclude: '',
                 adRetargetingTagsInclude: '',
                 adRetargetingTagsExclude: '',
                 adRetargetingTagsExclude: '',
+                adAutoExtendTargets: '',
                 creativeCallToAction: '', // 行动号召
                 creativeCallToAction: '', // 行动号召
                 creativeLabel: undefined // 倡议标签
                 creativeLabel: undefined // 倡议标签
             }
             }
@@ -1268,6 +1474,48 @@ export default {
     methods: {
     methods: {
         ...mapGetters(['nickname', 'avatar', 'userInfo']),
         ...mapGetters(['nickname', 'avatar', 'userInfo']),
         moment,
         moment,
+        handleAdhideConver(e) {
+            const defaultValue = e.target.value;
+            if (defaultValue === 'CUSTOMER' || defaultValue === 'APP') {
+                this.configForm.adConvertedTimeDuration = 'THREE_MONTH';
+            }
+        },
+        handleAdAutoExtend(e) {
+            const defaultValue = e.target.value;
+            if (defaultValue === '0') {
+                this.AutoExtendEditSelect = [];
+                this.configForm.adAutoExtendTargets = '';
+            }
+        },
+        handleCreativeSubTitleBlur(e) {
+            const defaultValue = e.target.value;
+            let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/;
+            let length = 0;
+            let strArr = defaultValue.split('');
+            strArr.forEach(item => {
+                if (cnReg.test(item)) {
+                    length += 2;
+                }
+                else {
+                    length += 1;
+                }
+            });
+            if (4 <= length && length <= 24) {
+                this.subTitleMsgStatus = false;
+                this.subTitleMsg = '';
+            }
+            else if (!defaultValue) {
+                this.subTitleMsgStatus = false;
+                this.subTitleMsg = '';
+            }
+            else {
+                this.subTitleMsgStatus = true;
+                this.subTitleMsg = '只能输入4-24个字符';
+            }
+        },
+        handleSelectTxtend(list) {
+            this.configForm.adAutoExtendTargets = list && list.map(item => item.value).join(',');
+        },
         handleSelectPackageTabs(e) {
         handleSelectPackageTabs(e) {
             if (this.modalTitle === 'add') {
             if (this.modalTitle === 'add') {
                 if (e === '1') {
                 if (e === '1') {
@@ -1286,10 +1534,8 @@ export default {
                     this.configForm.adRetargetingTagsExclude = '';
                     this.configForm.adRetargetingTagsExclude = '';
                     this.configForm.updateGetingExclude = [];
                     this.configForm.updateGetingExclude = [];
                     this.configForm.adRetargetingTagsType = '';
                     this.configForm.adRetargetingTagsType = '';
-                    if (!this.platformLoadingType) {
-                        this.configForm.adPlatform = 'NONE';
-                        this.platformLoadingType = '';
-                    }
+                    this.configForm.adPlatform = 'NONE';
+                    this.platformLoadingType = '';
                     this.configForm.adDeviceSelectType = ['NONE'];
                     this.configForm.adDeviceSelectType = ['NONE'];
                     this.configForm.adAndroidVersion = 'NONE';
                     this.configForm.adAndroidVersion = 'NONE';
                     this.configForm.adSelectAc = ['NONE'];
                     this.configForm.adSelectAc = ['NONE'];
@@ -1383,6 +1629,14 @@ export default {
                 this.configForm.adRetargetingTagsInclude = '';
                 this.configForm.adRetargetingTagsInclude = '';
             }
             }
         },
         },
+        handleClearTableAlone(list) {
+            this.configForm.updateGetingInclude = list;
+            this.configForm.adRetargetingTagsInclude = list && list.join(',');
+        },
+        handleClearTableLogic(list) {
+            this.configForm.updateGetingExclude = list;
+            this.configForm.adRetargetingTagsExclude = list && list.join(',');
+        },
         handleClearlist() {
         handleClearlist() {
             this.configForm.updateGetingInclude = [];
             this.configForm.updateGetingInclude = [];
             this.configForm.adRetargetingTagsInclude = '';
             this.configForm.adRetargetingTagsInclude = '';
@@ -1507,6 +1761,17 @@ export default {
                 this.configForm.adSelectCity = [];
                 this.configForm.adSelectCity = [];
             }
             }
         },
         },
+        handlePlateSelect(data) {
+            if (data.length > 1 && data.findIndex(item => item === 'NONE') === 0) {
+                data.splice(data.findIndex(item => item === 'NONE'), 1);
+            }
+            else if (data.length > 1 && data.findIndex(item => item === 'NONE') === data.length - 1) {
+                data.splice(0, data.length - 1);
+            }
+            else if (data.length === 0) {
+                data.push('NONE');
+            }
+        },
         getAgeSelect(data) {
         getAgeSelect(data) {
             if (data.length > 1 && data.findIndex(item => item === 'NONE') === 0) {
             if (data.length > 1 && data.findIndex(item => item === 'NONE') === 0) {
                 data.splice(data.findIndex(item => item === 'NONE'), 1);
                 data.splice(data.findIndex(item => item === 'NONE'), 1);
@@ -1532,17 +1797,6 @@ export default {
         handleAccountBudget(e) {
         handleAccountBudget(e) {
             const adBudgetInput = e.target.value;
             const adBudgetInput = e.target.value;
             this.configForm.accountBudget = Number(Number(adBudgetInput).toFixed(2));
             this.configForm.accountBudget = Number(Number(adBudgetInput).toFixed(2));
-            if (this.modalTitle === 'edit') {
-                if (Number(adBudgetInput) >= Number(this.defaultAdBudget) && Number(adBudgetInput) < (Number(this.defaultAdBudget) + 100)) {
-                    this.adBudgetShowTitle = true;
-                }
-                else if (Number(adBudgetInput) <= Number(this.defaultAdBudget) && Number(adBudgetInput) > (Number(this.defaultAdBudget) - 100)) {
-                    this.adBudgetShowTitle = true;
-                }
-                else {
-                    this.adBudgetShowTitle = false;
-                }
-            }
         },
         },
         handleExportRules(value, min, max, callback) {
         handleExportRules(value, min, max, callback) {
             let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/;
             let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/;
@@ -1668,7 +1922,6 @@ export default {
                         const detailData = result.result;
                         const detailData = result.result;
                         this.configForm.accountId = detailData.accountId;
                         this.configForm.accountId = detailData.accountId;
                         if (detailData.adAudiencePackageId) {
                         if (detailData.adAudiencePackageId) {
-                            this.selectPackageTabs = '2';
                             getAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/getAdAudiencePackage', {accountId: detailData.accountId})
                             getAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/getAdAudiencePackage', {accountId: detailData.accountId})
                                 .then(result => {
                                 .then(result => {
                                     if (result.code === 0) {
                                     if (result.code === 0) {
@@ -1684,13 +1937,11 @@ export default {
                                     console.log(error, 'eeee');
                                     console.log(error, 'eeee');
                                 });
                                 });
                         }
                         }
-                        else {
-                            this.selectPackageTabs = '1';
-                        }
                         this.configForm.dpLinkStartIndex = detailData.dpLinkStartIndex;
                         this.configForm.dpLinkStartIndex = detailData.dpLinkStartIndex;
                         this.configForm.dpLinkEndIndex = detailData.dpLinkEndIndex;
                         this.configForm.dpLinkEndIndex = detailData.dpLinkEndIndex;
                         this.configForm.accountBudgetMode = detailData.accountBudgetMode;
                         this.configForm.accountBudgetMode = detailData.accountBudgetMode;
                         this.configForm.accountBudget = detailData.accountBudget;
                         this.configForm.accountBudget = detailData.accountBudget;
+                        this.configForm.adDirectionalFlag = detailData.adDirectionalFlag;
                         this.configForm.campaignLandingType = detailData.campaignLandingType;
                         this.configForm.campaignLandingType = detailData.campaignLandingType;
                         this.configForm.advertisingType = detailData.advertisingType || '1';
                         this.configForm.advertisingType = detailData.advertisingType || '1';
                         this.configForm.campaignName = detailData.campaignName || '';
                         this.configForm.campaignName = detailData.campaignName || '';
@@ -1703,6 +1954,11 @@ export default {
                         this.configForm.campaignAdCnt = detailData.campaignAdCnt || '';
                         this.configForm.campaignAdCnt = detailData.campaignAdCnt || '';
                         this.configForm.launchTarget = detailData.launchTarget || 'OCPM';
                         this.configForm.launchTarget = detailData.launchTarget || 'OCPM';
                         this.configForm.adDownloadType = detailData.adDownloadType;
                         this.configForm.adDownloadType = detailData.adDownloadType;
+                        if (detailData.adDownloadType === 'DOWNLOAD_URL') {
+                            this.$nextTick(() => {
+                                this.configForm.creativeAppName = detailData.creativeAppName || undefined;
+                            });
+                        }
                         this.configForm.adPlatform = detailData.adPlatform;
                         this.configForm.adPlatform = detailData.adPlatform;
                         this.configForm.adExternalUrl = detailData.adExternalUrl || '';
                         this.configForm.adExternalUrl = detailData.adExternalUrl || '';
                         this.configForm.adOpenUrl = detailData.adOpenUrl || '';
                         this.configForm.adOpenUrl = detailData.adOpenUrl || '';
@@ -1717,13 +1973,51 @@ export default {
                             this.listArr = detailData.adCity.split(',');
                             this.listArr = detailData.adCity.split(',');
                             this.configForm.adSelectCity = detailData.adCity.split(',');
                             this.configForm.adSelectCity = detailData.adCity.split(',');
                         }, 200);
                         }, 200);
+                        let paramsData = {};
+                        if (detailData.adDownloadType === 'DOWNLOAD_URL') {
+                            paramsData = {
+                                advancedCreativeType: 'ATTACHED_CREATIVE_NONE',
+                                advertiserId: detailData.accountId,
+                                appType: 'APP_ANDROID',
+                                deliveryRange: 'DEFAULT',
+                                externalUrl: detailData.adExternalUrl,
+                                landingType: detailData.campaignLandingType,
+                                packageName: detailData.adPackage,
+                                promotionContent: detailData.adDownloadType
+                            };
+                        }
+                        else if (detailData.adDownloadType === 'EXTERNAL_URL') {
+                            paramsData = {
+                                advancedCreativeType: 'ATTACHED_CREATIVE_NONE',
+                                advertiserId: detailData.accountId,
+                                deliveryRange: 'DEFAULT',
+                                externalUrl: detailData.adExternalUrl,
+                                landingType: detailData.campaignLandingType,
+                                promotionContent: detailData.adDownloadType
+                            };
+                        }
+                        postAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/getToolConvert', paramsData).then(result => {
+                            if (result.code === 0) {
+                                const updateResult = result.result.filter(item => item.external_actions.length > 0);
+                                this.configForm.adConvertType = updateResult[0].convert_type;
+                                this.optimizationOption = updateResult[0].external_actions;
+                                setTimeout(() => {
+                                    this.configForm.adConvertId = detailData.adConvertId;
+                                }, 1000);
+                            }
+                            else {
+                                this.$message.error(result.message);
+                            }
+                        }).catch(error => {
+                            console.log(error, 'eeee');
+                        });
                         getAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/getDMPCustomAudience', {accountId: detailData.accountId}).then(result => {
                         getAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/getDMPCustomAudience', {accountId: detailData.accountId}).then(result => {
                             if (result.code === 0) {
                             if (result.code === 0) {
                                 result.result.forEach(item => {
                                 result.result.forEach(item => {
                                     item.key = item.custom_audience_id;
                                     item.key = item.custom_audience_id;
                                 });
                                 });
                                 this.directionalData = result.result;
                                 this.directionalData = result.result;
-                                this.configForm.adRetargetingTagsType = detailData.adRetargetingTagsType || '1';
+                                this.configForm.adRetargetingTagsType = detailData.adRetargetingTagsType;
                                 if (detailData.adRetargetingTagsType === '3') {
                                 if (detailData.adRetargetingTagsType === '3') {
                                     this.configForm.customPerson = 'a';
                                     this.configForm.customPerson = 'a';
                                     this.configForm.adRetargetingTagsInclude = detailData.adRetargetingTagsInclude;
                                     this.configForm.adRetargetingTagsInclude = detailData.adRetargetingTagsInclude;
@@ -1833,44 +2127,18 @@ export default {
                         if (detailData.adKeywords) {
                         if (detailData.adKeywords) {
                             this.creativeTag = detailData.adKeywords;
                             this.creativeTag = detailData.adKeywords;
                         }
                         }
-                        let paramsData = {};
-                        if (this.configForm.adDownloadType === 'DOWNLOAD_URL') {
-                            paramsData = {
-                                advancedCreativeType: 'ATTACHED_CREATIVE_NONE',
-                                advertiserId: this.configForm.accountId,
-                                appType: 'APP_ANDROID',
-                                deliveryRange: 'DEFAULT',
-                                externalUrl: this.configForm.adExternalUrl,
-                                landingType: this.configForm.campaignLandingType,
-                                packageName: this.configForm.adPackage,
-                                promotionContent: this.configForm.adDownloadType
-                            };
-                        }
-                        else if (this.configForm.adDownloadType === 'EXTERNAL_URL') {
-                            paramsData = {
-                                advancedCreativeType: 'ATTACHED_CREATIVE_NONE',
-                                advertiserId: this.configForm.accountId,
-                                deliveryRange: 'DEFAULT',
-                                externalUrl: this.configForm.adExternalUrl,
-                                landingType: this.configForm.campaignLandingType,
-                                promotionContent: this.configForm.adDownloadType
-                            };
-                        }
-                        postAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/getToolConvert', paramsData).then(result => {
-                            if (result.code === 0) {
-                                const updateResult = result.result.filter(item => item.external_actions.length > 0);
-                                this.configForm.adConvertType = updateResult[0].convert_type;
-                                this.optimizationOption = updateResult[0].external_actions;
-                                setTimeout(() => {
-                                    this.configForm.adConvertId = detailData.adConvertId;
-                                }, 300);
-                            }
-                            else {
-                                this.$message.error(result.message);
-                            }
-                        }).catch(error => {
-                            console.log(error, 'eeee');
-                        });
+                        this.configForm.adInterestActionMode = detailData.adInterestActionMode;
+                        this.configForm.creativeDisplayMode = detailData.creativeDisplayMode;
+                        // this.configForm.creativeAppName = detailData.creativeAppName;
+                        this.configForm.creativeIsPresentedVideo = detailData.creativeIsPresentedVideo;
+                        this.configForm.creativeGenerateDerivedAd = detailData.creativeGenerateDerivedAd;
+                        this.configForm.creativeIsCommentDisable = detailData.creativeIsCommentDisable;
+                        this.configForm.creativeDownloadStatus = detailData.creativeDownloadStatus;
+                        this.configForm.creativeSubTitle = detailData.creativeSubTitle;
+                        this.configForm.adConvertedTimeDuration = detailData.adConvertedTimeDuration;
+                        this.configForm.adDownloadMode = detailData.adDownloadMode;
+                        this.configForm.adAutoExtendTargets = detailData.adAutoExtendTargets;
+                        this.AutoExtendEditSelect = detailData.adAutoExtendTargets.length && detailData.adAutoExtendTargets.split(',');
                     }
                     }
                     else {
                     else {
                         this.$message.error(result.message);
                         this.$message.error(result.message);
@@ -1924,10 +2192,12 @@ export default {
             postAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/addBytedanceStrategy', data).then(result => {
             postAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/addBytedanceStrategy', data).then(result => {
                 if (result.code === 0) {
                 if (result.code === 0) {
                     this.$message.success('创建成功');
                     this.$message.success('创建成功');
+                    this.sureLoading = false;
                     this.$router.replace('/account-config/account-config');
                     this.$router.replace('/account-config/account-config');
                     this.$bus.$emit('remove', '/account-config/components/configuration-modal');
                     this.$bus.$emit('remove', '/account-config/components/configuration-modal');
                 }
                 }
                 else {
                 else {
+                    this.sureLoading = false;
                     this.$message.error(result.message);
                     this.$message.error(result.message);
                 }
                 }
             }).catch(error => {
             }).catch(error => {
@@ -1971,7 +2241,7 @@ export default {
             }
             }
             else if (e === 'BUDGET_MODE_DAY') {
             else if (e === 'BUDGET_MODE_DAY') {
                 this.adBudgetNum = 0;
                 this.adBudgetNum = 0;
-                this.configForm.adBudget = 0;
+                this.configForm.adBudget = 300;
             }
             }
         },
         },
         handleDelOrigin(list) {
         handleDelOrigin(list) {
@@ -2130,11 +2400,11 @@ export default {
                     return;
                     return;
                 }
                 }
             }
             }
-            if (this.selectPackageTabs === '2' && !this.configForm.adAudiencePackageId) {
+            if (this.configForm.adDirectionalFlag === 'choice' && !this.configForm.adAudiencePackageId) {
                 this.$message.error('请选择已有定向包');
                 this.$message.error('请选择已有定向包');
                 return;
                 return;
             }
             }
-            if (paramsFormData.customPerson === 'a') {  
+            if (paramsFormData.customPerson === 'a') {
                 if (paramsFormData.adRetargetingTagsType === '1' && !paramsFormData.adRetargetingTagsInclude) {
                 if (paramsFormData.adRetargetingTagsType === '1' && !paramsFormData.adRetargetingTagsInclude) {
                     this.$message.error('请选择人群');
                     this.$message.error('请选择人群');
                     return;
                     return;
@@ -2148,6 +2418,10 @@ export default {
                     return;
                     return;
                 }
                 }
             }
             }
+            if (paramsFormData.adAutoExtendEnabled === '1' && !paramsFormData.adAutoExtendTargets) {
+                this.$message.error('请选择可开放定向');
+                return;
+            }
             if (this.configForm.adScheduleType === 'SCHEDULE_START_END' && !this.configForm.launchDateRange.length) {
             if (this.configForm.adScheduleType === 'SCHEDULE_START_END' && !this.configForm.launchDateRange.length) {
                 this.$message.error('请选择投放时间');
                 this.$message.error('请选择投放时间');
                 return;
                 return;
@@ -2179,6 +2453,9 @@ export default {
             else {
             else {
                 this.isAdCpaBidBlur = false;
                 this.isAdCpaBidBlur = false;
             }
             }
+            if (this.subTitleMsgStatus) {
+                return;
+            }
             if (paramsFormData.adverPosition === 'a') {
             if (paramsFormData.adverPosition === 'a') {
                 paramsFormData.creativeSmartInventory = 1;
                 paramsFormData.creativeSmartInventory = 1;
             }
             }
@@ -2226,6 +2503,7 @@ export default {
             paramsFormData.userId = this.userInfo().id;
             paramsFormData.userId = this.userInfo().id;
             this.$refs.ruleForm.validate(valid => {
             this.$refs.ruleForm.validate(valid => {
                 if (valid) {
                 if (valid) {
+                    this.sureLoading = true;
                     if (this.modalTitle === 'add') {
                     if (this.modalTitle === 'add') {
                         this.handleAddList(paramsFormData);
                         this.handleAddList(paramsFormData);
                     }
                     }
@@ -2246,10 +2524,12 @@ export default {
             putAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/edit', queryData).then(result => {
             putAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/edit', queryData).then(result => {
                 if (result.code === 0) {
                 if (result.code === 0) {
                     this.$message.success(result.message);
                     this.$message.success(result.message);
+                    this.sureLoading = false;
                     this.$router.replace('/account-config/account-config');
                     this.$router.replace('/account-config/account-config');
                     this.$bus.$emit('remove', '/account-config/components/configuration-modal');
                     this.$bus.$emit('remove', '/account-config/components/configuration-modal');
                 }
                 }
                 else {
                 else {
+                    this.sureLoading = false;
                     this.$message.error(result.message);
                     this.$message.error(result.message);
                 }
                 }
             }).catch(error => {
             }).catch(error => {

+ 3 - 0
src/views/modules/account-config/components/directional-logic/directional-logic.vue

@@ -475,17 +475,20 @@ export default {
                 let formData = this.selectRightData;
                 let formData = this.selectRightData;
                 this.selectRightData = formData.filter(item => list.key !== item.key);
                 this.selectRightData = formData.filter(item => list.key !== item.key);
                 this.tableSelectIds = this.selectRightData.map(item => item.key);
                 this.tableSelectIds = this.selectRightData.map(item => item.key);
+                this.$emit('clear-table-alone', this.tableSelectIds);
             }
             }
             else if (type === 'all') {
             else if (type === 'all') {
                 if (style === 'direct') {
                 if (style === 'direct') {
                     let directData = this.tableSelectDirectData;
                     let directData = this.tableSelectDirectData;
                     this.tableSelectDirectData = directData.filter(item => list.key !== item.key);
                     this.tableSelectDirectData = directData.filter(item => list.key !== item.key);
                     this.tableSelectDirectIds = this.tableSelectDirectData.map(item => item.key);
                     this.tableSelectDirectIds = this.tableSelectDirectData.map(item => item.key);
+                    this.$emit('clear-table-direct', this.tableSelectDirectIds);
                 }
                 }
                 else if (style === 'exclude') {
                 else if (style === 'exclude') {
                     let excludeData = this.tableSelectExcludeData;
                     let excludeData = this.tableSelectExcludeData;
                     this.tableSelectExcludeData = excludeData.filter(item => list.key !== item.key);
                     this.tableSelectExcludeData = excludeData.filter(item => list.key !== item.key);
                     this.tableSelectExcludeIds = this.tableSelectExcludeData.map(item => item.key);
                     this.tableSelectExcludeIds = this.tableSelectExcludeData.map(item => item.key);
+                    this.$emit('clear-table-exclude', this.tableSelectExcludeIds);
                 }
                 }
             }
             }
         },
         },

+ 71 - 0
src/views/modules/account-config/components/tree-select/tree-select.less

@@ -0,0 +1,71 @@
+
+.tree-select-content {
+    .input-search {
+        width: 240px;
+        margin: 10px 0 10px 0;
+    }
+    .tree-select-class {
+        display: flex;
+        justify-content: space-between;
+        .class-left-header {
+            display: flex;
+            justify-content: space-between;
+            height: 50px;
+            line-height: 50px;
+            background-color: #f9fafd;
+            border-bottom: 1px solid #eee;
+            text-indent: 10px;
+            .clear-all-class {
+                margin-right: 20px;
+            }
+        }
+        .select-class-left {
+            width: 60%;
+            height: 400px;
+            border: 1px solid #eee;
+            .class-left-content {
+                overflow-y: auto;
+                height: 340px;
+                margin: 10px;
+            }
+            .example {
+                text-align: center;
+                line-height: 200px;
+            }
+        }
+        .select-class-right {
+            width: 35%;
+            height: 400px;
+            border: 1px solid #eee;
+            .class-left-content {
+                padding: 0 10px;
+                height: 348px;
+                overflow-y: auto;
+                .apply-right-tree {
+                    display: flex;
+                    justify-content: space-between;
+                    align-items: baseline;
+                    .left-content-p {
+                        display: inline-block;
+                        width: 85%;
+                        height: 25px;
+                        line-height: 25px;
+                        margin: 0;
+                        overflow: hidden;
+                        text-overflow: ellipsis;
+                        white-space: nowrap;
+                    }
+                    .delete-type-class {
+                        color: #1890ff;
+                        cursor: pointer;
+                    }
+                }
+            }
+            .no-data-class {
+                height: 340px;
+                line-height: 340px;
+                text-align: center;
+            }
+        }
+    }
+}

+ 125 - 0
src/views/modules/account-config/components/tree-select/tree-select.vue

@@ -0,0 +1,125 @@
+<template>
+    <div class="tree-select-content">
+        <!-- <a-input-search class="input-search" placeholder="请输入账户名或ID" @change="onChange" /> -->
+        <div class="tree-select-class">
+            <div class="select-class-left">
+                <div class="class-left-header">可放开定向</div>
+                <div class="class-left-content">
+                    <template>
+                        <a-checkbox-group v-model="checkedValue" @change="handleCheckGroup">
+                            <a-row>
+                                <a-col :span="24" v-for="item in changeCheckData" :key="item.value">
+                                    <a-checkbox :value="item.value">{{ item.label }}</a-checkbox>
+                                </a-col>
+                            </a-row>
+                        </a-checkbox-group>
+                    </template>
+                    <div class="example">
+                        <span v-if="!changeCheckData.length">暂无数据</span>
+                    </div>
+                </div>
+            </div>
+            <div class="select-class-right">
+                <div class="class-left-header">
+                    已选 ({{ applyTypeOption.length ? applyTypeOption.length : 0}})
+                    <span class="clear-all-class"><a @click="handleClearAll">清空</a></span>
+                </div>
+                <div v-if="applyTypeOption.length" class="class-left-content">
+                    <div class="apply-right-tree" v-for="item in applyTypeOption" :key="item.value">
+                        <p class="left-content-p">
+                            <a-tooltip placement="left">
+                                <template slot="title">
+                                    <span>{{ item.label }}</span>
+                                </template>
+                                {{ item.label }}
+                            </a-tooltip>
+                        </p>
+                        <a-icon type="delete" class="delete-type-class" @click="handleDelTree(item)" />
+                    </div>
+                </div>
+                <div v-else class="no-data-class">暂无数据</div>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+import {mapGetters} from 'vuex';
+
+export default {
+    name: 'tree-select',
+    props: {
+        defaultlist: {
+            type: Array,
+            default: () => []
+        },
+        editdata: {
+            type: Array,
+            default: () => []
+        }
+    },
+    data() {
+        return {
+            checkedValue: [],
+            checkedKeys: [],
+            treeData: [],
+            updateTreeData: [],
+            applyTypeOption: [],
+            changeCheckData: []
+        };
+    },
+    mounted() {
+        this.changeCheckData = this.defaultlist;
+        this.updateTreeData = this.defaultlist;
+        if (this.editdata.length) {
+            this.checkedValue = [...this.editdata];
+            const rightSelectList = [];
+            this.updateTreeData.forEach(item => {
+                if (this.editdata.includes(item.value)) {
+                    rightSelectList.push(item);
+                }
+            });
+            this.applyTypeOption = rightSelectList;
+        }
+    },
+    methods: {
+        ...mapGetters(['userInfo']),
+        handleCheckGroup(checkedValues) {
+            const rightSelectList = [];
+            this.checkedValue = checkedValues;
+            this.updateTreeData.forEach(item => {
+                if (checkedValues.includes(item.value)) {
+                    rightSelectList.push(item);
+                }
+            });
+            this.applyTypeOption = rightSelectList;
+            this.$emit('select-finally-result', this.applyTypeOption);
+        },
+        handleClearAll() {
+            this.checkedValue = [];
+            this.applyTypeOption = [];
+        },
+        handleDelTree(list) {
+            const defaultData = this.applyTypeOption;
+            this.applyTypeOption = defaultData.filter(item => item.value !== list.value);
+            this.checkedValue = this.applyTypeOption.map(item => item.value);
+            this.$emit('select-finally-result', this.applyTypeOption);
+        },
+        onChange(e) {
+            const value = e.target.value;
+            this.changeCheckData = value !== '' ? this.getNewTreeData(this.updateTreeData, value) : [...this.updateTreeData];
+        },
+        getNewTreeData(data, value) {
+            const checkList = [];
+            data.forEach(item => {
+                if (item.label.indexOf(value) !== -1) {
+                    checkList.push(item);
+                }
+            });
+            return checkList;
+        },
+    }
+};
+</script>
+<style lang="less" scoped>
+    @import 'tree-select';
+</style>

+ 319 - 60
src/views/modules/autoLaunch/configLaunchInfo.vue

@@ -160,11 +160,11 @@
                    <!-- <a-tag color="#2db7f5" @click="getChangeAll('定向包', 'form', 'groupName')"
                    <!-- <a-tag color="#2db7f5" @click="getChangeAll('定向包', 'form', 'groupName')"
                 >+定向包</a-tag
                 >+定向包</a-tag
               > -->
               > -->
-              <!-- <a-tag color="#2db7f5" @click="getChangeAll('日期', 'form', 'groupName')">+日期</a-tag>
-              <a-tag color="#2db7f5" @click="getChangeAll('标号', 'form', 'groupName')">+标号</a-tag> -->
-              <a-tag color="#2db7f5" @click="getChangeAll('应用包名', 'form', 'groupName')"
+              <a-tag color="#2db7f5" @click="getChangeAll('应用名称', 'form', 'groupName')">+应用名称</a-tag>
+              <a-tag color="#2db7f5" @click="getChangeAll('应用标记', 'form', 'groupName')">+应用标记</a-tag>
+              <!-- <a-tag color="#2db7f5" @click="getChangeAll('应用包名', 'form', 'groupName')"
                 >+应用包名</a-tag
                 >+应用包名</a-tag
-              >
+              > -->
                <a-tag color="#2db7f5" @click="getChangeAll('创意制作方式', 'form', 'groupName')"
                <a-tag color="#2db7f5" @click="getChangeAll('创意制作方式', 'form', 'groupName')"
                 >+创意制作方式</a-tag
                 >+创意制作方式</a-tag
               >
               >
@@ -244,7 +244,7 @@
                         </div>
                         </div>
                         <div class="input-item">
                         <div class="input-item">
                             <a-form-item   >
                             <a-form-item   >
-                                <a-radio-group  v-model="sysType" @change="sysTypeChange">
+                                <a-radio-group  v-model="sysType" @change="sysTypeChange" >
                                 <a-radio-button :value="1">安卓</a-radio-button>
                                 <a-radio-button :value="1">安卓</a-radio-button>
                                 <a-radio-button :value="2">IOS</a-radio-button>
                                 <a-radio-button :value="2">IOS</a-radio-button>
                                 </a-radio-group>
                                 </a-radio-group>
@@ -262,12 +262,13 @@
                             <a-form-item>
                             <a-form-item>
                                 <a-select v-decorator="['appId', { rules: [{ required: true, message: '请选择目标应用' }] }]" showSearch allowClear
                                 <a-select v-decorator="['appId', { rules: [{ required: true, message: '请选择目标应用' }] }]" showSearch allowClear
                                     placeholder="选择应用目标" optionFilterProp="children" style="width: 500px"  
                                     placeholder="选择应用目标" optionFilterProp="children" style="width: 500px"  
-                                   :filterOption="filterOption" @change="appIdChange" :mode="getFormData('singleAppid')==1?'defalut':'multiple'" :maxTagCount='1'>
+                                   :filterOption="filterOption" @change="appIdChange" :mode="getFormData('singleAppid')==1?'defalut':'multiple'" :maxTagCount='1' 
+                                   :labelInValue="true">
                                     <a-select-option v-if="getFormData('singleAppid')==0" :value='0' @click="selectAllAppId">选择以下全部</a-select-option>
                                     <a-select-option v-if="getFormData('singleAppid')==0" :value='0' @click="selectAllAppId">选择以下全部</a-select-option>
                                     <a-select-option v-for="appModel in appList" :key="appModel.appId" :value="appModel.appId">
                                     <a-select-option v-for="appModel in appList" :key="appModel.appId" :value="appModel.appId">
-                                        {{ appModel.appName }}&#12288;&nbsp;&#12288; {{ appModel.appVersion }}&#12288;&#12288;&#12288;{{
+                                        {{
                                         appModel.platform | platform
                                         appModel.platform | platform
-                                        }}
+                                        }}&#12288;&#12288;&#12288;{{ appModel.appName }}&#12288;&nbsp;&#12288; {{ appModel.appVersion }}
                                     </a-select-option>
                                     </a-select-option>
                                 </a-select>
                                 </a-select>
                                 <a-button type="primary" @click="addApplication" style="margin-left:10px" :loading="tongbuLoading">刷新应用</a-button>
                                 <a-button type="primary" @click="addApplication" style="margin-left:10px" :loading="tongbuLoading">刷新应用</a-button>
@@ -292,6 +293,57 @@
                             </a-form-item>
                             </a-form-item>
                         </div>
                         </div>
                     </div>
                     </div>
+
+                    <div class="row-item" v-if="getFormData('singleAppid')==0">
+                    <div class="hint-item"></div>
+                    <div class="label-item">
+                        <div class="text-item">是否多应用分别出价</div>
+                        </div>
+                        <div class="input-item">
+                            <a-form-item  >
+                                <a-radio-group  v-decorator="['multipleBids', {initialValue:0 }]">
+                                    <a-radio-button :value="0">否</a-radio-button>
+                                    <a-radio-button :value="1">是</a-radio-button>
+                                </a-radio-group>
+                            </a-form-item>         
+                        </div>
+                    </div>
+                    <div class="row-item" v-if="getFormData('multipleBids')==1">
+                    <div class="hint-item"></div>
+                    <div class="label-item">
+                        <div class="text-item">分别出价</div>
+                        </div>
+                        <div class="input-item">
+                            <div style="width:120vh;height:300px;overflow:auto;border:1px solid #f2f2f2;padding:10px">
+                                <p v-for="(item,index) in multipleBidData" :key="index" style="display:flex">
+                                   
+                                   
+                                    <span style="white-space:nowrap;line-height: 30px;margin-right: 10px;">OCPM出价</span>
+                                    <a-input-number
+                                        style="width:150px"
+                                        :max="10000"
+                                        :step="0.1"
+                                        v-model="item.cpaBid"
+                                    />
+                                    <span style="white-space:nowrap;line-height: 30px;margin-right: 10px;">深度转化出价</span>
+                                    <a-input-number
+                                        style="width:150px"
+                                        :max="10000"
+                                        :step="0.1"
+                                        v-model="item.deepConversionBid"
+                                    />
+                                    <span style="margin-left:20px;white-space:nowrap;line-height: 30px;margin-right: 10px;">渠道号</span>
+                                    <a-input style="width:150px" placeholder="请填写渠道号" v-model="item.channelCode" />
+                                    <a-icon 
+                                    @click="checkOneBid(item)"
+                                    type="check" style="margin-left:20px;white-space:nowrap;line-height: 30px;margin-right: 10px;cursor:pointer;color:green" />
+                                    <span  style="margin:5px;width:50%">{{item.label}}</span>
+                                   
+                                </p>
+                            </div>
+                        </div>
+                    </div>
+
                     <div class="row-item" v-if="getFormData('campaignType') == 3">
                     <div class="row-item" v-if="getFormData('campaignType') == 3">
                         <div class="hint-item"></div>
                         <div class="hint-item"></div>
                         <div class="label-item">
                         <div class="label-item">
@@ -411,7 +463,7 @@
                     <a-form-item>
                     <a-form-item>
                         <a-select v-decorator="['appId', { rules: [{ required: true, message: '请选择目标应用' }] }]" showSearch allowClear
                         <a-select v-decorator="['appId', { rules: [{ required: true, message: '请选择目标应用' }] }]" showSearch allowClear
                             placeholder="选择应用目标" optionFilterProp="children" style="width: 500px"  
                             placeholder="选择应用目标" optionFilterProp="children" style="width: 500px"  
-                            :filterOption="filterOption" @change="appIdChange">
+                            :filterOption="filterOption" @change="appIdChange" :labelInValue="true">
                             <a-select-option v-for="appModel in appList" :key="appModel.appId" :value="appModel.appId">
                             <a-select-option v-for="appModel in appList" :key="appModel.appId" :value="appModel.appId">
                                 {{ appModel.appName }}&#12288;&nbsp;&#12288; {{ appModel.appVersion }}&#12288;&#12288;&#12288;{{
                                 {{ appModel.appName }}&#12288;&nbsp;&#12288; {{ appModel.appVersion }}&#12288;&#12288;&#12288;{{
                                 appModel.platform | platform
                                 appModel.platform | platform
@@ -536,7 +588,7 @@
                         <div class="input-item">
                         <div class="input-item">
                             <a-form-item>
                             <a-form-item>
                                  <a-radio-group  v-decorator="['platformOs', {initialValue:1 }]" @change="platformOsChange">
                                  <a-radio-group  v-decorator="['platformOs', {initialValue:1 }]" @change="platformOsChange">
-                                    <a-radio-button :value="0">不限</a-radio-button>
+                                    <!-- <a-radio-button :value="0">不限</a-radio-button> -->
                                     <a-radio-button :value="1">Android</a-radio-button>
                                     <a-radio-button :value="1">Android</a-radio-button>
                                     <a-radio-button :value="2">IOS</a-radio-button>
                                     <a-radio-button :value="2">IOS</a-radio-button>
                                 </a-radio-group>
                                 </a-radio-group>
@@ -1079,7 +1131,7 @@
                         </div>    
                         </div>    
                     </div>
                     </div>
                     
                     
-                    <div class="row-item" v-if="getFormData('bidType')==10&&getFormData('ocpxActionType')!= 191">
+                    <div class="row-item" v-if="getFormData('bidType')==10&&getFormData('ocpxActionType')!= 191&&getFormData('multipleBids')!==1">
                         <div class="hint-item">
                         <div class="hint-item">
                         </div>
                         </div>
                         <div class="label-item">
                         <div class="label-item">
@@ -1088,19 +1140,24 @@
                         </div>
                         </div>
                         <div class="input-item">
                         <div class="input-item">
                             <a-form-item>
                             <a-form-item>
-                                <a-input-number
+                                <!-- <a-input-number
                                     style="width:200px"
                                     style="width:200px"
                                     :max="10000"
                                     :max="10000"
                                     :step="0.1"
                                     :step="0.1"
                                     v-decorator="['cpaBid', {rules:validationRules.bid} ]"
                                     v-decorator="['cpaBid', {rules:validationRules.bid} ]"
-                                />
+                                /> -->
+                                <a-input style="width:200px;ime-mode:disabled" v-decorator="['cpaBid', {rules:validationRules.bid} ]" @blur="checkCpaBid"
+                                @keypress="keyDown">
+                                    
+                                </a-input>
                                 <span style="margin-left:5px">元</span>
                                 <span style="margin-left:5px">元</span>
-                              
+                                <br>
+                                <span style="color:red">单出价请输入单数字,阶梯出价请用/隔开</span>
                             </a-form-item>
                             </a-form-item>
                                 <span
                                 <span
                                 class="tip"
                                 class="tip"
-                                v-if="getFormData('cpaBid')<0.1"
-                                >请输入点击出价,不少于0.1元,不超过10000元</span>
+                                v-if="checkCpaBidBloon"
+                                >不允许出现除"-"和"/"之外的所有字符,并且二者不可同时出现</span>
                         </div>    
                         </div>    
                     </div>
                     </div>
                     <div class="row-item" v-if="getFormData('bidType')==10&&getFormData('ocpxActionType') == 191">
                     <div class="row-item" v-if="getFormData('bidType')==10&&getFormData('ocpxActionType') == 191">
@@ -1129,7 +1186,8 @@
                         </div>    
                         </div>    
                     </div>
                     </div>
                     
                     
-                    <div class="row-item" v-if="(getFormData('ocpxActionType') == 180 || getFormData('ocpxActionType') == 53) && groupTypeData.deepConversionTypes && groupTypeData.deepConversionTypes.length > 0 ">
+                    <div class="row-item" v-if="(getFormData('ocpxActionType') == 180 || getFormData('ocpxActionType') == 53) 
+                    && groupTypeData.deepConversionTypes && groupTypeData.deepConversionTypes.length > 0 && getFormData('multipleBids')!==1 ">
                         <div class="hint-item">
                         <div class="hint-item">
                         </div>
                         </div>
                         <div class="label-item">
                         <div class="label-item">
@@ -1493,13 +1551,13 @@
                         <div class="required-item"></div>
                         <div class="required-item"></div>
                         </div>
                         </div>
                         <div class="input-item">
                         <div class="input-item">
-                        <a-form-item>  
+                        <a-form-item v-for="(item,index) in descriptionList" :key="index">  
                             <div style="position:relative">              
                             <div style="position:relative">              
                             <a-textarea
                             <a-textarea
                                 class="rending"
                                 class="rending"
                                 placeholder="请输入广告语"
                                 placeholder="请输入广告语"
-                                @change="descriptionchange"
-                                v-decorator="['description',{rules: [ { required: true, message: '请填写广告语' }] } ]"
+                                @change="descriptionchange(item.value,index)"
+                                v-model.trim="item.value"
                                 :autosize="{ minRows: 2, maxRows: 6 }"
                                 :autosize="{ minRows: 2, maxRows: 6 }"
                                 :max-length="30"
                                 :max-length="30"
                             ></a-textarea>
                             ></a-textarea>
@@ -1517,11 +1575,17 @@
                                 margin-bottom: 0;
                                 margin-bottom: 0;
                               "
                               "
                             >
                             >
-                              {{ description.length  }}/30
+                              {{ item.value.length  }}/30
                               <!-- {{ getFormData('description').length  }}/30 -->
                               <!-- {{ getFormData('description').length  }}/30 -->
                             </p>
                             </p>
+                           <div style="position:absolute;right:-50px;top:-10px">
+                                <a-icon type="plus" @click="addDescription()" style="margin-right:15px"/>
+                                <a-icon type="minus" @click="removeDescription(index)" v-if="descriptionList.length>1"/>
+                           </div>
                             </div>
                             </div>
+
                         </a-form-item>
                         </a-form-item>
+
                         </div>
                         </div>
                     </div>  
                     </div>  
                     <div class="row-item">
                     <div class="row-item">
@@ -1782,6 +1846,7 @@ export default {
     },
     },
     data() {
     data() {
         return {
         return {
+            checkCpaBidBloon:false,
             appType: '0',
             appType: '0',
             uriCheck: false,
             uriCheck: false,
             programUnitCnt:60,
             programUnitCnt:60,
@@ -1934,7 +1999,9 @@ export default {
             appListValue: '',
             appListValue: '',
             checkOptions: [],
             checkOptions: [],
             checkAllApp: false,
             checkAllApp: false,
-            optionsAll: []
+            optionsAll: [],
+            multipleBidData:[],
+            descriptionList:[{value:""}]
            
            
             
             
         }
         }
@@ -1973,14 +2040,20 @@ export default {
                 //     }
                 //     }
                 // })
                 // })
                 this.getAppList()
                 this.getAppList()
-                getAction('/kuaishou/batch/getIsActivate', {
-                    accountId: this.accountId
-                }).then(res => {
-                    if (res.success) {
-                        this.groupTypeData = res.result
-                        
-                    }
-                })
+                let editRecordId=this.$route.query.id;
+                if(editRecordId){
+
+                }else{
+                    getAction('/kuaishou/batch/getIsActivate', {
+                        accountId: this.accountId
+                    }).then(res => {
+                        if (res.success) {
+                            this.groupTypeData = res.result
+                            
+                        }
+                    })
+                }
+               
                
                
 
 
                 getAction('/kuaishou/batch/getCreativeCategory', {
                 getAction('/kuaishou/batch/getCreativeCategory', {
@@ -2041,6 +2114,63 @@ export default {
             },
             },
     },
     },
     methods: {
     methods: {
+        keyDown(event){
+            if((event.keyCode>=96&&event.keyCode<=105)||(event.keyCode>=109&&event.keyCode<=111)||event.keyCode==46||event.keyCode==45||(event.keyCode>=48&&event.keyCode<=57)){
+                
+            }else{
+                event.returnValue = false;
+            }
+        },
+        checkCpaBid(e) {
+            let z = /-/g;
+            let a = /\//g;
+            let d = /\./g;
+            if(e.target.value.startsWith("-")||e.target.value.endsWith("-")){
+                this.checkCpaBidBloon = true
+                return
+            }else if(e.target.value.startsWith(".")||e.target.value.endsWith(".")){
+                this.checkCpaBidBloon = true
+                return
+            }
+            if(e.target.value.match(a)&&e.target.value.match(z)){
+                this.checkCpaBidBloon = true
+            }else {
+                if(e.target.value.match(z)&&e.target.value.match(z).length>1){
+                    this.checkCpaBidBloon = true
+                }else if(e.target.value.match(a)&&e.target.value.match(a)){
+                    var arr = e.target.value.split('/')
+                    var arrary = []
+                    for (let i = 0; i < arr.length; i++) {
+                        if(arr[i].match(d)&&arr[i].match(d).length>1){
+                            arrary.push(true)
+                        }
+                    }
+                    if(arrary.length>0){
+                        this.checkCpaBidBloon = true
+                    }else{
+                        this.checkCpaBidBloon = false
+                    }
+                    
+                }else{
+                    this.checkCpaBidBloon = false
+                }
+            }
+
+            
+        },
+        checkOneBid(item) {
+            console.log(item)
+            let params = {...item}
+            params.cpaBid = params.cpaBid*1000
+            params.deepConversionBid = params.deepConversionBid*1000
+            postAction('/adsp/kuaiShouAppMultipleBids/saveOrUpdate',params).then(res=>{
+                if(res.success){
+                    this.$message.success('添加成功')
+                }else{
+                    this.$message.error('新增失败')
+                }
+            })
+        },
         convertOk() {
         convertOk() {
             var dataLink = []
             var dataLink = []
             dataLink = this.convertList.filter((item) => {
             dataLink = this.convertList.filter((item) => {
@@ -2258,15 +2388,25 @@ export default {
                 appId:undefined
                 appId:undefined
             })
             })
         },
         },
-        descriptionchange(e){
-            if(this.getData('description')){
-                this.$nextTick(()=>{
-                    this.form.setFieldsValue({
-                        description: this.getData('description').replace(/\s/g,'')
-                    })
-                })
-            }
-            this.description=e.target.value.replace(/\s/g,'')
+        addDescription(){
+            this.descriptionList.push({value:""})
+        },
+        removeDescription(index){
+            this.descriptionList.splice(index,1)
+        },
+        descriptionchange(val,index){
+            let data = val;
+            this.$nextTick(()=>{
+                this.descriptionList[index].value = data.replace(/\s/g,'')
+            })
+            // if(this.getData('description')){
+            //     this.$nextTick(()=>{
+            //         this.form.setFieldsValue({
+            //             description: this.getData('description').replace(/\s/g,'')
+            //         })
+            //     })
+            // }
+            // this.description=e.target.value.replace(/\s/g,'')
 
 
            
            
         },
         },
@@ -2416,14 +2556,15 @@ export default {
             })
             })
         },
         },
         appIdChange(val){
         appIdChange(val){
-            //console.log(val)
+            console.log(val)
             this.siteList=[]
             this.siteList=[]
-            
             // this.getPageList(val)
             // this.getPageList(val)
             if(this.getFormData('singleAppid')==0){
             if(this.getFormData('singleAppid')==0){
-                if(val&&val.indexOf(0)>-1){
+                if(val&&val.findIndex(item=>item.key===0)>-1){
                     let appidArr=this.appList.map(item=>{
                     let appidArr=this.appList.map(item=>{
-                        return item.appId
+                        return {key:item.appId,label:`${item.platform === 1?'Android应用下载':item.platform === 2?'Android网页游戏':item.platform === 3?'iOS应用下载':'iOS网页游戏'}`
+                                +'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'+
+                                item.appName+'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'+item.appVersion}
                     })
                     })
                     // setTimeout(()=>{
                     // setTimeout(()=>{
                         
                         
@@ -2435,18 +2576,46 @@ export default {
                         this.form.setFieldsValue({
                         this.form.setFieldsValue({
                             appId:appidArr
                             appId:appidArr
                         })
                         })
+                        this.multipleBidData = appidArr.map(item=>{
+                            return {
+                                ...item,
+                                cpaBid:null,
+                                trackUrl:'',
+                                channelCode:'',
+                                appId:item.key,
+                                accountId:this.accountId,
+                                deepConversionBid:null
+
+                            }
+                        })
                     })
                     })
+                    
                 
                 
+                }else{
+                    this.$nextTick(()=>{
+                        this.multipleBidData = val.map(item=>{
+                            return {
+                                ...item,
+                                cpaBid:null,
+                                trackUrl:'',
+                                channelCode:'',
+                                appId:item.key,
+                                accountId:this.accountId,
+                                deepConversionBid:null
+
+                            }
+                        })
+                    })
                 }
                 }
             }
             }
             
             
-           if(val!=undefined || (val&&val.length>0) ){
+           if(val!=undefined && (val&&val.length>0) ){
                 if(this.getFormData('campaignType')==2){
                 if(this.getFormData('campaignType')==2){
                     
                     
                     if(this.getFormData('singleAppid')==1){
                     if(this.getFormData('singleAppid')==1){
-                        this.getIsActivate(val)
+                        this.getIsActivate(val.key)
                     }else{
                     }else{
-                        this.getIsActivate(val[0])
+                        this.getIsActivate(val[0].key)
                     }
                     }
                     
                     
                 }
                 }
@@ -2689,10 +2858,34 @@ export default {
         goNext() {
         goNext() {
 
 
         this.$nextTick(()=>{
         this.$nextTick(()=>{
-  
+
+            if(this.checkCpaBidBloon){
+                 this.$message.error('请正确填写必填项目')
+                 return 
+            }
+
             this.form.validateFields((err, values) => {
             this.form.validateFields((err, values) => {
                 //console.log(values) 
                 //console.log(values) 
-                if (!err) {     
+                if (!err) {  
+                    let isNotComplete = this.descriptionList.findIndex(item => {
+                        return item.value === ''
+                    })
+                    if (isNotComplete > -1) {
+                        this.$message.error('请正确填写必填项目,广告语未填')
+                        return
+                    } 
+
+
+                    if(values.multipleBids === 1) {
+                        let multipleBidData = this.multipleBidData.findIndex(item => {
+                            return item.cpaBid === null
+                        })
+                        if (multipleBidData > -1) {
+                            this.$message.error('请正确填写必填项目,广告语未填')
+                            return
+                        } 
+                    }
+                   
                     // console.log(values)              
                     // console.log(values)              
                     this.goNextloading=true;
                     this.goNextloading=true;
                    
                    
@@ -2721,11 +2914,14 @@ export default {
                     //     values.beginTime=this.dateRange[0].format('YYYY-MM-DD');
                     //     values.beginTime=this.dateRange[0].format('YYYY-MM-DD');
                     //     values.endTime= this.dateRange[1].format('YYYY-MM-DD');
                     //     values.endTime= this.dateRange[1].format('YYYY-MM-DD');
                     // }
                     // }
+
+
+
                     if(this.getData('campaignType') === 2 ) {
                     if(this.getData('campaignType') === 2 ) {
-                        values.appIdArray=values.appId instanceof Array?JSON.stringify(values.appId):JSON.stringify([values.appId])
+                        values.appIdArray=values.appId instanceof Array?JSON.stringify(values.appId.map(item=>{return item.key})):JSON.stringify([values.appId.key])
                         values.appId=undefined;
                         values.appId=undefined;
                     }else if(this.getData('campaignType') === 7){
                     }else if(this.getData('campaignType') === 7){
-                        values.appIdArray=values.appId instanceof Array?JSON.stringify(values.appId):JSON.stringify([values.appId])
+                        values.appIdArray=values.appId instanceof Array?JSON.stringify(values.appId.map(item=>{return item.key})):JSON.stringify([values.appId.key])
                         values.appId=undefined;
                         values.appId=undefined;
                         values.singleAppid = 1
                         values.singleAppid = 1
                     }else {
                     }else {
@@ -2752,6 +2948,7 @@ export default {
                     }else {
                     }else {
                         values.appIds = JSON.stringify([])
                         values.appIds = JSON.stringify([])
                     }
                     }
+                    
                     // let excludePopulation=this.excludeSelectedKeys.map(item=>{
                     // let excludePopulation=this.excludeSelectedKeys.map(item=>{
                     //     return item.id
                     //     return item.id
                     // })
                     // })
@@ -2767,7 +2964,9 @@ export default {
                         values.population=this.incluedSelectedRowKeys.length>0?JSON.stringify(this.incluedSelectedRowKeys):'[]';
                         values.population=this.incluedSelectedRowKeys.length>0?JSON.stringify(this.incluedSelectedRowKeys):'[]';
                     }
                     }
                     
                     
-                    
+                    values.description = JSON.stringify(this.descriptionList.map(item=>{
+                        return item.value
+                    }))
                     
                     
                     values.useAppMarket=values.useAppMarket?'1':'0'
                     values.useAppMarket=values.useAppMarket?'1':'0'
                     
                     
@@ -2780,11 +2979,32 @@ export default {
                     }else if(this.sysType==1&&!this.getData('useAppMarket')){
                     }else if(this.sysType==1&&!this.getData('useAppMarket')){
                         values.appStore="[]"
                         values.appStore="[]"
                     }
                     }
+
+                   
                     if(values.cpaBid){
                     if(values.cpaBid){
-                        values.cpaBid=parseInt(values.cpaBid*1000)
+                        if((values.cpaBid+'').includes('/')){
+                            let bidArr =  values.cpaBid.split('/')
+                            for (let index = 0; index < bidArr.length; index++) {
+                                bidArr[index] = bidArr[index]*1000
+                                
+                            }
+                            values.cpaBid = bidArr.join('/')
+                        }else if((values.cpaBid+'').includes('-')){
+                            let bidArr =  values.cpaBid.split('-')
+                            for (let index = 0; index < bidArr.length; index++) {
+                                bidArr[index] = bidArr[index]*1000
+                                
+                            }
+                            values.cpaBid = bidArr.join('-')
+                        }else{
+                            values.cpaBid = values.cpaBid*1000
+                        }
                     }else{
                     }else{
                         values.cpaBid=0
                         values.cpaBid=0
                     }
                     }
+
+
+
                     if(values.deepConversionBid){
                     if(values.deepConversionBid){
                         values.deepConversionBid=parseInt(values.deepConversionBid*1000)
                         values.deepConversionBid=parseInt(values.deepConversionBid*1000)
                     }else{
                     }else{
@@ -2909,7 +3129,7 @@ export default {
                 this.convertList = res.result.map(item => {
                 this.convertList = res.result.map(item => {
                 return {
                 return {
                     ...item,
                     ...item,
-                    convert_id: item.convert_id + ''
+                    convert_id: item.convert_id + ""
                 }
                 }
                 })
                 })
             }
             }
@@ -3044,7 +3264,10 @@ export default {
                     this.sysType=res.result.platformOs
                     this.sysType=res.result.platformOs
                     let fngetIsActivate=new Promise((resolve,reject)=>{
                     let fngetIsActivate=new Promise((resolve,reject)=>{
                         getAction('/kuaishou/batch/getIsActivate', {
                         getAction('/kuaishou/batch/getIsActivate', {
-                            accountId: this.accountId
+                            accountId: this.accountId,
+                            campaignType: res.result.campaignType,
+                            appId:res.result.appIdArray?JSON.parse(res.result.appIdArray)[0]:null
+                            
                         }).then(res => {
                         }).then(res => {
                             if (res.success) {
                             if (res.success) {
                                 this.groupTypeData = res.result
                                 this.groupTypeData = res.result
@@ -3087,7 +3310,24 @@ export default {
                         }
                         }
                     }
                     }
                     
                     
-                    
+                    let cpaBid = "";
+                    if(res.result.cpaBid.includes('/')){
+                        let bidArr =  res.result.cpaBid.split('/')
+                        for (let index = 0; index < bidArr.length; index++) {
+                            bidArr[index] = bidArr[index]/1000
+                            
+                        }
+                        cpaBid = bidArr.join('/')
+                    }else if(res.result.cpaBid.includes('-')){
+                        let bidArr =  res.result.cpaBid.split('-')
+                        for (let index = 0; index < bidArr.length; index++) {
+                            bidArr[index] = bidArr[index]/1000
+                            
+                        }
+                        cpaBid = bidArr.join('-')
+                    }else{
+                        cpaBid = res.result.cpaBid/1000
+                    }
                         
                         
                     this.deviceBrand=res.result.deviceBrand?JSON.parse(res.result.deviceBrand).length>0?1:0:0;
                     this.deviceBrand=res.result.deviceBrand?JSON.parse(res.result.deviceBrand).length>0?1:0:0;
                     
                     
@@ -3105,14 +3345,32 @@ export default {
                     this.checkArr = this.appType === '2' ? JSON.parse(res.result.appIds) : []
                     this.checkArr = this.appType === '2' ? JSON.parse(res.result.appIds) : []
                     this.optionsAll =  res.result.appIds ? (typeof  res.result.appIds == 'string' ? JSON.parse(res.result.appIds) : res.result.appIds) : []
                     this.optionsAll =  res.result.appIds ? (typeof  res.result.appIds == 'string' ? JSON.parse(res.result.appIds) : res.result.appIds) : []
                     this.checkAllApp = false
                     this.checkAllApp = false
-                    res.result.appInterest = res.result.appInterest?JSON.parse(res.result.appInterest):[]
-
+                    res.result.appInterest = res.result.appInterest?eval(res.result.appInterest):undefined
+                    this.descriptionList = res.result.description.charAt(0) === '['?eval(res.result.description).map(item=>{
+                        return {value:item}
+                    }):[{value:res.result.description}]
+                   
+                    this.multipleBidData = res.result.appInfoList ? res.result.appInfoList.map(item=>{
+                        
+                        return {
+                            appId:item.app_id,
+                            accountId:item.account_id,
+                            label:`${item.platform === 1?'Android应用下载':item.platform === 2?'Android网页游戏':item.platform === 3?'iOS应用下载':'iOS网页游戏'}`
+                                +'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'+
+                                item.app_name+'\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'+item.app_version,
+                            cpaBid:item.cpa_bid?item.cpa_bid/1000:null,
+                            trackUrl:item.track_url,
+                            channelCode:item.channel_code,
+                            deepConversionBid:item.deep_conversion_bid?item.deep_conversion_bid/1000:null,
+                        }
+                    }):[]
                     setTimeout(()=>{                       
                     setTimeout(()=>{                       
                         this.form.setFieldsValue({
                         this.form.setFieldsValue({
                              ...res.result,
                              ...res.result,
+                            appId:[],
                             creativeTag:res.result.creativeTag?JSON.parse(res.result.creativeTag):[],
                             creativeTag:res.result.creativeTag?JSON.parse(res.result.creativeTag):[],
                             isOpen:res.result.isOpen?res.result.isOpen:0,
                             isOpen:res.result.isOpen?res.result.isOpen:0,
-                            cpaBid:res.result.cpaBid/1000,
+                            
                             
                             
                             deviceBrand:res.result.deviceBrand?JSON.parse(res.result.deviceBrand):[],
                             deviceBrand:res.result.deviceBrand?JSON.parse(res.result.deviceBrand):[],
                             devicePrice:res.result.devicePrice?JSON.parse(res.result.devicePrice):[],
                             devicePrice:res.result.devicePrice?JSON.parse(res.result.devicePrice):[],
@@ -3129,10 +3387,12 @@ export default {
                             iosOsv:res.result.iosOsv?res.result.iosOsv:6,
                             iosOsv:res.result.iosOsv?res.result.iosOsv:6,
                             url:res.result.url,
                             url:res.result.url,
                             schemaUri:res.result.schemaUri,
                             schemaUri:res.result.schemaUri,
-                            appId:res.result.singleAppid?JSON.parse(res.result.appIdArray)[0]:JSON.parse(res.result.appIdArray),
+                            appId:res.result.singleAppid?JSON.parse(res.result.appIdArray).map(item=>{return {key:item}})[0]:JSON.parse(res.result.appIdArray).map(item=>{return {key:item}}),
                             
                             
                             appInterest:res.result.appInterest,
                             appInterest:res.result.appInterest,
                             roiRatio:res.result.roiRatio?res.result.roiRatio:null,
                             roiRatio:res.result.roiRatio?res.result.roiRatio:null,
+                            multipleBids:res.result.multipleBids,
+                            cpaBid:cpaBid,
                         })
                         })
                         
                         
                     },100)
                     },100)
@@ -3256,7 +3516,6 @@ export default {
                 }
                 }
             })
             })
         },
         },
-
         clickTrackUrlFocus(){
         clickTrackUrlFocus(){
             // //console.log('focus')
             // //console.log('focus')
             this.clickTrackUrlTip=true;
             this.clickTrackUrlTip=true;

+ 30 - 2
src/views/modules/autoLaunch/configLaunchList.vue

@@ -48,9 +48,30 @@
                         </a-spin>    
                         </a-spin>    
                         
                         
                     </span>
                     </span>
-                    <span slot="cpaBid" slot-scope="text,record">
-                        {{text==0?record.roiRatio:text/1000}}
+                    <span slot="cpaType" slot-scope="text,record">
+                        {{record.cpaBid.includes('/')?'阶梯出价':record.cpaBid.includes('-')?"随机出价":"统一出价"}}
                     </span>
                     </span>
+                    <div slot="cpaBid" slot-scope="text,record">
+                        <!-- {{
+                          text==0?record.roiRatio:
+                          text.includes('/')? text.split 
+                        }} -->
+                        <span v-if="text===0">{{record.roiRatio}}</span>
+                        <span v-else-if="text.includes('/')">
+                            <!-- {{text.split('/')}} -->
+                            <span v-for="(item,index) in text.split('/')">
+                                {{item/1000+(index === text.split('/').length-1?'':'/')}}
+                            </span>
+                        </span>
+                        <span v-else-if="text.includes('-')">
+                            <!-- {{text.split('/')}} -->
+                            <span v-for="(item,index) in text.split('-')">
+                                {{item/1000+(index === text.split('-').length-1?'':'-')}}
+                            </span>
+                        </span>
+                        <span v-else>{{text/1000}}</span>
+                        
+                    </div>
                     <span slot="ocpxActionType" slot-scope="text">
                     <span slot="ocpxActionType" slot-scope="text">
                         {{text|ocpxActionType}}
                         {{text|ocpxActionType}}
                     </span>
                     </span>
@@ -189,6 +210,13 @@ const strategyColumns = [
         scopedSlots: { customRender: 'ocpxActionType' },
         scopedSlots: { customRender: 'ocpxActionType' },
         // sorter:() => {}
         // sorter:() => {}
     },
     },
+     {
+        title: '出价类型',
+        dataIndex: 'cpaType',
+        align: 'center',    
+        scopedSlots: { customRender: 'cpaType' },
+        // sorter:() => {}
+    },
   {
   {
         title: '出价',
         title: '出价',
         dataIndex: 'cpaBid',
         dataIndex: 'cpaBid',

+ 7 - 0
src/views/modules/creative-copywrit/creative-copywrit.less

@@ -6,6 +6,13 @@
         height: 500px !important;
         height: 500px !important;
         overflow-y: auto;
         overflow-y: auto;
     }
     }
+    .ad-name-tags-class {
+        width: 500px;
+        display: flex;
+        .name-tags-left {
+            width: 350px;
+        }
+    }
     .acount-title {
     .acount-title {
         display: flex;
         display: flex;
         font-size: 14px;
         font-size: 14px;

+ 25 - 11
src/views/modules/creative-copywrit/creative-copywrit.vue

@@ -1476,8 +1476,8 @@
                     <div class="acount-title-left">创意标题</div>
                     <div class="acount-title-left">创意标题</div>
                     <div class="acount-title-right">
                     <div class="acount-title-right">
                         <a-button type="primary" @click="handleAddOrigin"><a-icon type="plus" />创意标题</a-button>
                         <a-button type="primary" @click="handleAddOrigin"><a-icon type="plus" />创意标题</a-button>
-                        <a-button class="examin-select-title" @click="handleSelectTitle">选标题</a-button>
-                        <span>已填:{{ titleFiledResult.length || 0 }}</span>
+                        <!-- <a-button class="examin-select-title" @click="handleSelectTitle">选标题</a-button> -->
+                        <span style="margin-left: 20px;">已填:{{ titleFiledResult.length || 0 }}</span>
                     </div>
                     </div>
                 </div>
                 </div>
                 <div class="acount-title">
                 <div class="acount-title">
@@ -1496,8 +1496,8 @@
                                     v-decorator="[
                                     v-decorator="[
                                         item.name,
                                         item.name,
                                         { rules: [
                                         { rules: [
-                                            {required: true, message: '请输入创意标题'},
-                                            {min: 5, max: 30, message: '创意标题5-30个字'}
+                                            {required: true, message: '请输入创意标题', trigger: 'blur'},
+                                            {min: 5, max: 30, message: '创意标题5-30个字', trigger: 'blur'}
                                         ]}
                                         ]}
                                     ]"
                                     ]"
                                     class="examin-form-input"
                                     class="examin-form-input"
@@ -1534,8 +1534,8 @@
                     <div class="acount-title-left">创意标题</div>
                     <div class="acount-title-left">创意标题</div>
                     <div class="acount-title-right">
                     <div class="acount-title-right">
                         <a-button type="primary" @click="handleAddOrigin"><a-icon type="plus" />创意标题</a-button>
                         <a-button type="primary" @click="handleAddOrigin"><a-icon type="plus" />创意标题</a-button>
-                        <a-button class="examin-select-title" @click="handleSelectTitle">选标题</a-button>
-                        <span>已填:{{ titleFiledResult.length || 0 }}</span>
+                        <!-- <a-button class="examin-select-title" @click="handleSelectTitle">选标题</a-button> -->
+                        <span style="margin-left: 20px;">已填:{{ titleFiledResult.length || 0 }}</span>
                     </div>
                     </div>
                 </div>
                 </div>
                 <div class="acount-title">
                 <div class="acount-title">
@@ -1554,8 +1554,8 @@
                                     v-decorator="[
                                     v-decorator="[
                                         item.name,
                                         item.name,
                                         { rules: [
                                         { rules: [
-                                            {required: true, message: '请输入创意标题'},
-                                            {min: 5, max: 30, message: '创意标题5-30个字'}
+                                            {required: true, message: '请输入创意标题', trigger: 'blur'},
+                                            {min: 5, max: 30, message: '创意标题5-30个字', trigger: 'blur'}
                                         ]}
                                         ]}
                                     ]"
                                     ]"
                                     class="examin-form-input"
                                     class="examin-form-input"
@@ -1955,9 +1955,13 @@ export default {
                     batchList.push(item);
                     batchList.push(item);
                 }
                 }
             });
             });
-            console.log(batchList, 'batchList');
             this.modalShowBatchList = batchList;
             this.modalShowBatchList = batchList;
             this.batchVisible = true;
             this.batchVisible = true;
+            this.materTitltStatus = false;
+            this.accountMaster = {
+                height: '35px',
+                overflow: 'hidden'
+            };
             for (let i = 0; i < 3; i++) {
             for (let i = 0; i < 3; i++) {
                 const randomNum = new Date().getTime() + Math.ceil(Math.random() * 1000);
                 const randomNum = new Date().getTime() + Math.ceil(Math.random() * 1000);
                 this.defaultFormList.push({
                 this.defaultFormList.push({
@@ -1972,11 +1976,16 @@ export default {
                 this.$message.error('请至少输入3条标题');
                 this.$message.error('请至少输入3条标题');
                 return;
                 return;
             }
             }
+            let changeSlogan = this.defaultFormList;
+            changeSlogan.forEach(item => {
+                item.title = item.value;
+                item.creative_word_ids = [];
+            });
             let params = {
             let params = {
                 ids: this.modalShowBatchList.map(item => item.id) || [],
                 ids: this.modalShowBatchList.map(item => item.id) || [],
                 auditorId: this.userInfo().id,
                 auditorId: this.userInfo().id,
                 status: 1,
                 status: 1,
-                slogans: this.defaultFormList.map(item => item.value) || []
+                slogans: changeSlogan
             };
             };
             this.examinForm.validateFields(err => {
             this.examinForm.validateFields(err => {
                 if (!err) {
                 if (!err) {
@@ -2250,11 +2259,16 @@ export default {
                 this.$message.error('请至少输入3条标题');
                 this.$message.error('请至少输入3条标题');
                 return;
                 return;
             }
             }
+            let changeSlogan = this.defaultFormList;
+            changeSlogan.forEach(item => {
+                item.title = item.value;
+                item.creative_word_ids = [];
+            });
             let params = {
             let params = {
                 id: this.currentPageOnlyList.id,
                 id: this.currentPageOnlyList.id,
                 auditorId: this.userInfo().id,
                 auditorId: this.userInfo().id,
                 status: 1,
                 status: 1,
-                slogans: this.defaultFormList.map(item => item.value) || []
+                slogans: changeSlogan
             };
             };
             this.examinForm.validateFields(err => {
             this.examinForm.validateFields(err => {
                 if (!err) {
                 if (!err) {

+ 10 - 0
src/views/modules/headline-view/headline-view-server.js

@@ -0,0 +1,10 @@
+/**
+ * @file 数据查看API
+ * @author jiayufei
+ */
+
+export const urlAcount = 'http://118.24.244.213:8080'; // 线上
+// export const urlAcount = 'http://apipre.tjyourong.com.cn'; // 预生产
+// export const urlAcount = 'http://192.168.1.43:8080'; // 子安
+// export const urlAcount = 'http://139.186.165.84:8080'; // 测试
+// export const urlAcount = 'http://192.168.1.8:8080'; // 学超

+ 0 - 0
src/views/modules/headline-view/headline-view.less


File diff suppressed because it is too large
+ 1658 - 0
src/views/modules/headline-view/headline-view.vue


+ 3 - 2
vue.config.js

@@ -80,7 +80,7 @@ module.exports = {
         // target: 'http://192.168.1.219:8081', //请求本地 需要jeecg-boot后台项目  赵西安
         // target: 'http://192.168.1.219:8081', //请求本地 需要jeecg-boot后台项目  赵西安
         // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
-         target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
+        //  target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
         // target: 'https://trac.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
         // target: 'https://trac.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
         // target: 'http://39.106.184.70:8088/', //请求本地 需要jeecg-boot后台项目
         // target: 'http://39.106.184.70:8088/', //请求本地 需要jeecg-boot后台项目
         //  target: 'http://adsp.tjyourong.com.cn/', //请求本地 需要jeecg-boot后台项目
         //  target: 'http://adsp.tjyourong.com.cn/', //请求本地 需要jeecg-boot后台项目
@@ -88,7 +88,8 @@ module.exports = {
         // target:'http://118.24.244.213:8804',
         // target:'http://118.24.244.213:8804',
         // target: 'http://192.168.1.43:8080', // 子安
         // target: 'http://192.168.1.43:8080', // 子安
         // target: 'http://192.168.1.8:8806', // 学超
         // target: 'http://192.168.1.8:8806', // 学超
-      //  target:'http://139.186.165.84:8806', //测试
+       target:'http://139.186.165.84:8806', //测试
+        // target:'http://apipre.tjyourong.com.cn', //预生产
 
 
         ws: false,
         ws: false,