Browse Source

账户配置 定向包

jiayufei 4 years ago
parent
commit
cbd720b15b

+ 9 - 2
src/views/modules/BatchCreate/linkMultiSelect.vue

@@ -385,7 +385,6 @@
                   data.indeterminates=false
               }
               
-              
               this.getItemData({
                 clickObj:{},
                 data: data,
@@ -393,9 +392,9 @@
                 checkList,
                 plainOptions,
               })
-              
 
           }
+          this.$emit('checkedShowList', this.checkedShowList);
           if(item.level==3){
 
           }
@@ -419,6 +418,7 @@
               item.indeterminates=false
           })
           this.checkedShowList=[]
+          this.$emit('checkedShowList', []);
       },
 
       getCheckedList(val){
@@ -579,6 +579,13 @@
                     })
                 };
                 this.listArr1=res.data
+                this.listArr.forEach(item=>{
+                  this.listArr1.forEach(ele=>{
+                    if(ele.value==item){
+                      ele.checked=true
+                    } 
+                  })
+                })
             })
         }
 

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

@@ -1 +1,2 @@
-export const urlAcount = 'http://118.24.244.213:8080';
+export const urlAcount = 'http://118.24.244.213:8080';
+// export const urlAcount = 'http://192.168.1.43:8080';

+ 51 - 0
src/views/modules/account-config/components/configuration-modal.less

@@ -30,6 +30,50 @@
             background: #fff;
             padding: 15px 0;
             margin-bottom: 15px;
+            .select-orientation-content {
+                margin-left: 198px;
+                width: 440px;
+                border: 1px solid #eee;
+                height: 300px;
+                .orientation-header-title {
+                    height: 30px;
+                    line-height: 30px;
+                    background-color: #eee;
+                    text-indent: 12px;
+                    margin: 0;
+                }
+                .orientation-content-msg {
+                    height: 310px;
+                    text-align: center;
+                    .icon {
+                        font-size: 30px;
+                        margin-top: 100px;
+                        margin-bottom: 12px;
+                    }
+                }
+                .orientation-content-substance {
+                    height: 310px;
+                    margin: 12px;
+                    .content-substance-singal {
+                        height: 28px;
+                        line-height: 28px;
+                        .singal-spn {
+                            margin-right: 10px;
+                        }
+                    }
+                }
+            }
+            .ant-tabs-nav-container {
+                margin-left: 40px !important;
+            }
+            .select-orientation-class {
+                .ant-form-item-label {
+                    width: 200px;
+                }
+                .orientation-icon {
+                    left: -140px;
+                }
+            }
             .form-line {
                 width: 100%;
                 height: 1px;
@@ -170,6 +214,13 @@
                     margin-left: 10px;
                 }
             }
+            .selected-city-arr {
+                width: 50%;
+                .city-arr-radio-group {
+                    margin-top: 20px;
+                    margin-bottom: 20px;
+                }
+            }
             .position-radio-change {
                 margin-bottom: 10px;
                 /deep/ .ant-checkbox-wrapper {

+ 401 - 116
src/views/modules/account-config/components/configuration-modal.vue

@@ -106,7 +106,7 @@
                     </div>
                 </a-form-model-item>
                 <a-form-model-item label="创建数量: 广告组数量" class="campaign-cnt-class" prop="campaignCnt">
-                    <a-input-number v-model="configForm.campaignCnt" @change="handleCampaignCnt"/>
+                    <a-input-number v-model="configForm.campaignCnt" :min="0" @change="handleCampaignCnt"/>
                     <a-tooltip placement="top">
                         <template slot="title">
                             <span>输入的数量为每天所创建的广告组数量</span>
@@ -117,7 +117,7 @@
                     <div v-if="campaignStatus" style="width: 500px;color: #f00;">单账号每天创建计划上限500个</div>
                 </a-form-model-item>
                 <a-form-model-item label="广告计划数量" class="campaign-ad-class" prop="campaignAdCnt">
-                    <a-input-number v-model="configForm.campaignAdCnt" @change="handleCampaignAdCnt"/>
+                    <a-input-number v-model="configForm.campaignAdCnt" :min="0" @change="handleCampaignAdCnt"/>
                 </a-form-model-item>
             </div>
             <div class="separate-module-con">
@@ -204,7 +204,7 @@
                         <a-select-option
                             v-for="(item, index) in optimizationOption"
                             :key="index"
-                            :value="item.convert_id "
+                            :value="item.convert_id"
                         >
                             {{ item.external_name }}
                         </a-select-option>
@@ -250,102 +250,170 @@
                 </div>
             </div>
             <div class="separate-module-con">
-                <p class="rock-title">用户定向--新建定向</p>
-                <a-form-model-item label="地域">
-                    <a-radio-group v-model="configForm.adDistrict" button-style="solid">
-                        <a-radio-button value="NONE">不限</a-radio-button>
-                        <a-radio-button value="CITY">按省市</a-radio-button>
-                        <a-radio-button value="COUNTY">按区县</a-radio-button>
-                        <a-radio-button value="BUSINESS_DISTRICT">按商圈</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item label="性别">
-                    <a-radio-group v-model="configForm.adGender" button-style="solid">
-                        <a-radio-button value="NONE">不限</a-radio-button>
-                        <a-radio-button value="GENDER_MALE">男</a-radio-button>
-                        <a-radio-button value="GENDER_FEMALE">女</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item label="年龄">
-                    <a-radio-group v-model="configForm.adAge" button-style="solid">
-                        <a-radio-button value="NONE">不限</a-radio-button>
-                        <a-radio-button value="AGE_BETWEEN_18_23">18-23</a-radio-button>
-                        <a-radio-button value="AGE_BETWEEN_24_30">24-30</a-radio-button>
-                        <a-radio-button value="AGE_BETWEEN_31_40">31-40</a-radio-button>
-                        <a-radio-button value="AGE_BETWEEN_41_49">41-49</a-radio-button>
-                        <a-radio-button value="AGE_ABOVE_50">50+</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item label="自定义人群">
-                    <a-radio-group v-model="configForm.adRetargetingTagsInclude" button-style="solid">
-                        <a-radio-button value="NONE">不限</a-radio-button>
-                        <a-radio-button value="a" disabled>自定义人群</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item label="媒体定向">
-                    <a-radio-group v-model="configForm.adSuperiorPopularityType" button-style="solid">
-                        <a-radio-button value="NONE">不限</a-radio-button>
-                        <a-radio-button value="GAME" disabled>游戏优质媒体</a-radio-button>
-                        <a-radio-button value="b" disabled>自定义</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item label="平台">
-                    <a-radio-group v-model="configForm.adPlatform" button-style="solid">
-                        <a-radio-button value="NONE" :disabled="!!configForm.adDownloadUrl">不限</a-radio-button>
-                        <a-radio-button value="IOS" :disabled="!!configForm.adDownloadUrl">IOS</a-radio-button>
-                        <a-radio-button value="ANDROID">Andriod</a-radio-button>
-                        <a-radio-button value="PC" :disabled="!!configForm.adDownloadUrl">PC</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item v-if="configForm.adDownloadUrl" label="安卓版本">
-                    <a-radio-group v-model="configForm.adAndroidVersion" button-style="solid" @change="handleAndroidVersion">
-                        <a-radio-button value="NONE">不限</a-radio-button>
-                        <a-radio-button value="a">自定义</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <div class="adver-position-radio">
-                    <div v-if="configForm.adDownloadUrl && configForm.adAndroidVersion === 'a'" class="position-radio-change">
-                        <p>安卓版本</p>
-                        <a-radio-group v-model="configForm.androidChangeValue">
-                            <a-radio :style="radioStyle" value="8.0">Andriod 8.0及以上</a-radio>
-                            <a-radio :style="radioStyle" value="7.1">Andriod 7.1及以上</a-radio>
-                            <a-radio :style="radioStyle" value="7.0">Andriod 7.0及以上</a-radio>
-                            <a-radio :style="radioStyle" value="6.0">Andriod 6.0及以上</a-radio>
-                        </a-radio-group>
-                    </div>
-                </div>
-                <a-form-model-item label="网络">
-                    <a-radio-group v-model="configForm.adAc" button-style="solid">
-                        <a-radio-button value="NONE">不限</a-radio-button>
-                        <a-radio-button value="WIFI">Wi-Fi</a-radio-button>
-                        <a-radio-button value="2G">2G</a-radio-button>
-                        <a-radio-button value="3G">3G</a-radio-button>
-                        <a-radio-button value="4G">4G</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item label="已安装用户">
-                    <a-radio-group v-model="configForm.adHideIfExists" button-style="solid">
-                        <a-radio-button value="0">不限</a-radio-button>
-                        <a-radio-button value="1">过滤</a-radio-button>
-                        <a-radio-button value="2">定向</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item v-if="configForm.adConvertType" label="过滤已转化用户">
-                    <a-radio-group v-model="configForm.adHideIfConverted" button-style="solid">
-                        <a-radio-button value="NO_EXCLUDE">不限</a-radio-button>
-                        <a-radio-button value="AD">广告计划</a-radio-button>
-                        <a-radio-button value="CAMPAIGN">广告组</a-radio-button>
-                        <a-radio-button value="ADVERTISER">广告账户</a-radio-button>
-                        <a-radio-button value="CUSTOMER">公司账户</a-radio-button>
-                        <a-radio-button value="APP">APP</a-radio-button>
-                    </a-radio-group>
-                </a-form-model-item>
-                <a-form-model-item label="智能放量">
-                    <a-radio-group v-model="configForm.adAutoExtendEnabled" 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-tabs default-active-key="1">
+                    <a-tab-pane key="1" tab="新建定向">
+                        <p class="rock-title">用户定向</p>
+                        <a-form-model-item label="地域">
+                            <a-radio-group v-model="configForm.adDistrict" button-style="solid">
+                                <a-radio-button value="NONE">不限</a-radio-button>
+                                <a-radio-button value="CITY">按省市</a-radio-button>
+                                <a-radio-button value="COUNTY">按区县</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <div v-if="configForm.adDistrict === 'CITY'" class="adver-position-radio selected-city-arr">
+                            <link-multi-select
+                                title="省份"
+                                :listArr="listArr"
+                                :maxLayers="2"
+                                :listUrl="regionCityListUrl"
+                                @getSelectedArr="getSelectedCityArr"
+                                @checkedShowList="handleCheckedShowList"
+                            >
+                            </link-multi-select>
+                            <a-radio-group class="city-arr-radio-group" v-model="configForm.adLocationType">
+                                <a-radio value="HOME">居住在该地区的用户</a-radio>
+                                <a-radio value="TRAVEL"> 到该地区旅行的用户</a-radio>
+                                <a-radio value="ALL">该地区内的所有用户</a-radio>
+                                <a-radio value="CURRENT">正在该地区的用户</a-radio>
+                            </a-radio-group>
+                        </div>
+                        <a-form-model-item label="性别">
+                            <a-radio-group v-model="configForm.adGender" button-style="solid">
+                                <a-radio-button value="NONE">不限</a-radio-button>
+                                <a-radio-button value="GENDER_MALE">男</a-radio-button>
+                                <a-radio-button value="GENDER_FEMALE">女</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <a-form-model-item label="年龄">
+                            <radio-check v-model="configForm.adSelectAge" :options="ageArr" @change="getAgeSelect"></radio-check>
+                        </a-form-model-item>
+                        <a-form-model-item label="自定义人群">
+                            <a-radio-group v-model="configForm.adRetargetingTagsInclude" button-style="solid">
+                                <a-radio-button value="NONE">不限</a-radio-button>
+                                <a-radio-button value="a">自定义人群</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <a-form-model-item v-if="configForm.adRetargetingTagsInclude === 'a'" label="定向逻辑">
+                            <a-radio-group v-model="configForm.directionalLogic" button-style="solid">
+                                <a-radio-button value="1">定向</a-radio-button>
+                                <a-radio-button value="2">排除</a-radio-button>
+                                <a-radio-button value="3">同时定向排除</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <div v-if="configForm.directionalLogic === '1'" class="adver-position-radio">
+                            <div style="width: 60%;">
+                                <directional-logic packtype="directional"></directional-logic>
+                            </div>
+                        </div>
+                        <div v-if="configForm.directionalLogic === '2'" class="adver-position-radio">
+                            <div style="width: 60%;">
+                                <directional-logic packtype="exclude"></directional-logic>
+                            </div>
+                        </div>
+                        <a-form-model-item label="媒体定向">
+                            <a-radio-group v-model="configForm.adSuperiorPopularityType" button-style="solid">
+                                <a-radio-button value="NONE">不限</a-radio-button>
+                                <a-radio-button value="GAME" disabled>游戏优质媒体</a-radio-button>
+                                <a-radio-button value="b" disabled>自定义</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <a-form-model-item label="平台">
+                            <a-radio-group v-model="configForm.adPlatform" button-style="solid">
+                                <a-radio-button value="NONE" :disabled="!!configForm.adDownloadUrl">不限</a-radio-button>
+                                <a-radio-button value="IOS" :disabled="!!configForm.adDownloadUrl">IOS</a-radio-button>
+                                <a-radio-button value="ANDROID">Andriod</a-radio-button>
+                                <a-radio-button value="PC" :disabled="!!configForm.adDownloadUrl">PC</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <a-form-model-item v-if="configForm.adDownloadUrl" label="安卓版本">
+                            <a-radio-group v-model="configForm.adAndroidVersion" button-style="solid" @change="handleAndroidVersion">
+                                <a-radio-button value="NONE">不限</a-radio-button>
+                                <a-radio-button value="a">自定义</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <div class="adver-position-radio">
+                            <div v-if="configForm.adDownloadUrl && configForm.adAndroidVersion === 'a'" class="position-radio-change">
+                                <p>安卓版本</p>
+                                <a-radio-group v-model="configForm.androidChangeValue">
+                                    <a-radio :style="radioStyle" value="8.0">Andriod 8.0及以上</a-radio>
+                                    <a-radio :style="radioStyle" value="7.1">Andriod 7.1及以上</a-radio>
+                                    <a-radio :style="radioStyle" value="7.0">Andriod 7.0及以上</a-radio>
+                                    <a-radio :style="radioStyle" value="6.0">Andriod 6.0及以上</a-radio>
+                                </a-radio-group>
+                            </div>
+                        </div>
+                        <a-form-model-item label="网络">
+                            <a-radio-group v-model="configForm.adAc" button-style="solid">
+                                <a-radio-button value="NONE">不限</a-radio-button>
+                                <a-radio-button value="WIFI">Wi-Fi</a-radio-button>
+                                <a-radio-button value="2G">2G</a-radio-button>
+                                <a-radio-button value="3G">3G</a-radio-button>
+                                <a-radio-button value="4G">4G</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <a-form-model-item label="已安装用户">
+                            <a-radio-group v-model="configForm.adHideIfExists" button-style="solid">
+                                <a-radio-button value="0">不限</a-radio-button>
+                                <a-radio-button value="1">过滤</a-radio-button>
+                                <a-radio-button value="2">定向</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <a-form-model-item v-if="configForm.adConvertType" label="过滤已转化用户">
+                            <a-radio-group v-model="configForm.adHideIfConverted" button-style="solid">
+                                <a-radio-button value="NO_EXCLUDE">不限</a-radio-button>
+                                <a-radio-button value="AD">广告计划</a-radio-button>
+                                <a-radio-button value="CAMPAIGN">广告组</a-radio-button>
+                                <a-radio-button value="ADVERTISER">广告账户</a-radio-button>
+                                <a-radio-button value="CUSTOMER">公司账户</a-radio-button>
+                                <a-radio-button value="APP">APP</a-radio-button>
+                            </a-radio-group>
+                        </a-form-model-item>
+                        <a-form-model-item label="智能放量">
+                            <a-radio-group v-model="configForm.adAutoExtendEnabled" 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-tab-pane>
+                    <a-tab-pane key="2" tab="选择定向包">
+                        <a-form-model-item class="select-orientation-class" label="选择已有定向包" prop="selectiveOrientation">
+                            <a-select
+                                class="common-input-long"
+                                v-model="configForm.selectiveOrientation"
+                                :placeholder="selectOrientPlaceholder"
+                                :disabled="selectOrientPlaceholder !== '请选择已有定向包名称'"
+                                @change="handleSelectiveOrientation"
+                            >
+                                <a-select-option value="BUDGET_MODE_DAY">日预算</a-select-option>
+                                <a-select-option value="BUDGET_MODE_TOTAL">总预算</a-select-option>
+                            </a-select>
+                            <a-tooltip placement="top">
+                                <template slot="title">
+                                    <span>输入的数量为每天所创建的广告组数量</span>
+                                    <span>以及每个广告组创建的广告计划数量</span>
+                                </template>
+                                <a-icon class="form-itrm-icon orientation-icon" type="smile-o"/>
+                            </a-tooltip>
+                        </a-form-model-item>
+                        <div class="select-orientation-content">
+                            <p class="orientation-header-title">已选定向信息</p>
+                            <!-- <div class="orientation-content-msg">
+                                <div><a-icon type="container"/></div>
+                                <div>请在上方选择一个已有定向包</div>
+                            </div> -->
+                            <div class="orientation-content-substance">
+                                <div class="content-substance-singal">
+                                    <span class="singal-spn">定向人群包:</span>
+                                    <span>行业通用人群包</span>
+                                </div>
+                                <div class="content-substance-singal">
+                                    <span class="singal-spn">地域:</span>
+                                    <span>北京、和白、天津</span>
+                                </div>
+                            </div>
+                        </div>
+                    </a-tab-pane>
+                </a-tabs>
             </div>
             <div class="separate-module-con">
                 <p class="rock-title">预算与出价</p>
@@ -428,38 +496,52 @@
                     <a-input-number
                         class="common-input"
                         v-model="configForm.adCpaBid11"
+                        :min="0.1"
+                        :max="10000"
                         placeholder="请输入"
+                        @blur="handleAdCpaBidOneBlur"
                     />
                     <span>~</span>
                     <span class="especial-label cpaBid-mode-label">*</span>
+                    <div v-if="isAdCpaBid11Blur" style="width: 500px;color: #f00;">{{ adCpaBid11BlurTxt }}</div>
                 </a-form-model-item>
                 <a-form-model-item v-if="configForm.biddingMethod === 'b'" class="dp-link-end">
                     <a-input-number
                         class="common-input"
                         v-model="configForm.adCpaBid122"
+                        :min="0.1"
+                        :max="10000"
                         placeholder="请输入"
+                        @blur="handleAdCpaBidTwoBlur"
                     />
                 </a-form-model-item>
                 <a-form-model-item v-if="configForm.biddingMethod === 'c'" label="目标转化出价" class="dp-link-start">
                     <a-input-number
                         class="common-input"
-                        v-model="configForm.adCpaBid11"
+                        v-model="configForm.ladderOne"
+                        :min="0.1"
+                        :max="10000"
                         placeholder="请输入"
+                        @blur="handleLadderOneBlur"
                     />
                     <span>~</span>
                     <span class="especial-label cpaBid-mode-label">*</span>
+                    <div v-if="isLadderBlur" style="width: 500px;color: #f00;">{{ ladderBlurTxt }}</div>
                 </a-form-model-item>
                 <a-form-model-item v-if="configForm.biddingMethod === 'c'" class="dp-link-end">
                     <a-input-number
                         class="common-input"
-                        v-model="configForm.adCpaBid122"
+                        v-model="configForm.ladderTwo"
+                        :min="0.1"
+                        :max="10000"
                         placeholder="请输入"
+                        @blur="handleLadderTwoBlur"
                     />
                 </a-form-model-item>
-                <a-form-model-item v-if="configForm.biddingMethod === 'c'" label="浮动间隔">
+                <a-form-model-item v-if="configForm.biddingMethod === 'c'" label="浮动间隔" prop="floatingInterval">
                     <a-input-number
                         class="common-input"
-                        v-model="configForm.adCpaBid133"
+                        v-model="configForm.floatingInterval"
                         placeholder="请输入"
                     /> 元
                 </a-form-model-item>
@@ -551,15 +633,22 @@
                         <a-radio-button :value="true">开启智能优选</a-radio-button>
                         <a-radio-button :value="false">关闭智能优选</a-radio-button>
                     </a-radio-group>
+                    <span class="especial-label">*</span>
                 </a-form-model-item>
                 <div class="adver-position-radio">
-                    <a-form-model-item>
-                        <a-input
+                    <a-form-model-item prop="creativeCallToAction">
+                        <a-select
                             class="common-input-long"
-                            placeholder="请输入"
                             v-model="configForm.creativeCallToAction"
-                            allow-clear
-                        />
+                        >
+                            <a-select-option
+                                v-for="(item, index) in configForm.creativeOptions"
+                                :key="index + 1"
+                                :value="item"
+                            >
+                                {{ item }}
+                            </a-select-option>
+                        </a-select>
                     </a-form-model-item>
                 </div>
                 <a-form-model-item label="来源" :prop="getSource">
@@ -623,6 +712,9 @@
 <script>
 import AcountSearch from '@/views/modules/Statistics/components/Treeselect.vue';
 import SelectCheckAll from '../../BatchCreate/toutiaoTime';
+import radioCheck from '@/components/formComponents/checkBoxGroup';
+import linkMultiSelect from '@/views/modules/BatchCreate/linkMultiSelect';
+import DirectionalLogic from './directional-logic/directional-logic';
 
 import moment from 'moment';
 import BMF from 'browser-md5-file';
@@ -650,7 +742,10 @@ export default {
     },
     components: {
         AcountSearch,
-        SelectCheckAll
+        SelectCheckAll,
+        radioCheck,
+        linkMultiSelect,
+        DirectionalLogic
     },
     data() {
         let handleConfirmValue = (rule, value, callback) => {
@@ -668,9 +763,24 @@ export default {
         let handleCharacterLen20 = (rule, value, callback) => {
             this.handleExportRules(value, 4, 20, callback);
         };
+        let floatingIntervalValidator = (rule, value, callback) => {
+            const finallyResult = Number(this.configForm.ladderOne) + Number(value);
+            if (finallyResult < Number(this.configForm.ladderTwo)) {
+                callback();
+            }
+            else {
+                callback('最低出价+浮动间隔<最高出价');
+            }
+        };
         return {
+            isLadderBlur: false,
+            ladderBlurTxt: '',
+            isAdCpaBid11Blur: false,
+            adCpaBid11BlurTxt: '',
             isAdCpaBidBlur: false,
             adCpaBidBlurTxt: '',
+            listArr: [],
+            regionCityListUrl: 'ctop/bytedanceAreaInfo/list',
             defaultAdBudget: '',
             adBudgetShowTitle: false,
             adBudgetNum: 0,
@@ -688,6 +798,32 @@ export default {
                 value: 'industryId',
                 children: 'children'
             },
+            ageArr: [
+                {
+                    value: 'NONE',
+                    label: '不限'
+                },
+                {
+                    value: 'AGE_BETWEEN_18_23',
+                    label: '18-23岁'
+                },
+                {
+                    value: 'AGE_BETWEEN_24_30',
+                    label: '24-30岁'
+                },
+                {
+                    value: 'AGE_BETWEEN_31_40',
+                    label: '31-40岁'
+                },
+                {
+                    value: 'AGE_BETWEEN_41_49',
+                    label: '41-49岁'
+                },
+                {
+                    value: 'AGE_ABOVE_50',
+                    label: '50岁+'
+                }
+            ],
             fileList: [],
             isCoverImgDiv: false,
             imageUrl: '',
@@ -738,6 +874,10 @@ export default {
                 adCpaBid: [
                     {required: true, message: '请输入', trigger: 'blur'}
                 ],
+                floatingInterval: [
+                    {required: true, message: '请输入', trigger: 'blur'},
+                    {validator: floatingIntervalValidator, trigger: 'blur'}
+                ],
                 adName: [
                     {required: true, message: '请输入广告计划名称'},
                     {validator: handleCharacterLen100, trigger: 'blur'}
@@ -746,14 +886,26 @@ export default {
                     {required: true, message: '请输入', trigger: 'blur'},
                     {min: 1, max: 7, message: '请输入1-7个字', trigger: 'blur'}
                 ],
+                selectiveOrientation: [{required: true, message: '请选择', trigger: 'change'}],
+                creativeCallToAction: [{required: true, message: '请选择', trigger: 'change'}],
                 adConvertType: [{required: true, message: '请选择', trigger: 'change'}],
                 adConvertId: [{required: true, message: '请选择', trigger: 'change'}],
                 creativeThirdIndustryIds: [{required: true, message: '请选择', trigger: 'change'}]
             },
             configForm: {
+                directionalLogic: '',
+                selectiveOrientation: undefined,
+                floatingInterval: 0,
+                ladderOne: '',
+                ladderTwo: '',
                 adCpaBid11: '',
                 adCpaBid22: '',
                 biddingMethod: 'a',
+                creativeOptions: [],
+                advancedCreativeType: 'ATTACHED_CREATIVE_NONE',
+                adLocationType: 'HOME',
+                adCity: '',
+                adSelectCity: [],
                 defaultFormList: [],
                 productSellingPoints: [], // 商品买点
                 adBudgetMode: 'BUDGET_MODE_DAY', // 预算类型
@@ -781,7 +933,8 @@ export default {
                 checkboxChangeValue: [], // 广告位置-按照媒体指定位置
                 adDistrict: 'NONE', // 定向-区域
                 adGender: 'NONE', // 定向-性别
-                adAge: 'NONE', // 定向-年龄
+                adAge: '', // 定向-年龄
+                adSelectAge: ['NONE'],
                 adRetargetingTagsInclude: 'NONE', // 定向-自定义
                 adSuperiorPopularityType: 'NONE', // 定向-媒体定向
                 adPlatform: 'NONE', // 定向-平台
@@ -814,6 +967,9 @@ export default {
         };
     },
     computed: {
+        selectOrientPlaceholder() {
+            return this.configForm.accountId ? '请选择已有定向包名称' : '请选择广告账户';
+        },
         getEndIndex() {
             return Number(this.configForm.dpLinkStartIndex);
         },
@@ -876,6 +1032,7 @@ export default {
                 this.handleGetOptimizationObjective(paramsData);
             }
             this.handleGetCreativeClassification();
+            this.handleGetAdvertiserStrategy();
         }
     },
     mounted() {
@@ -891,6 +1048,74 @@ export default {
     methods: {
         ...mapGetters(['nickname', 'avatar', 'userInfo']),
         moment,
+        handleSelectiveOrientation(e) {
+            console.log(e, '----选择定向包');
+        },
+        handleBiddingMethod(e) {
+            console.log(e, '---e---ebid--出价方式');
+        },
+        handleAdCpaBidOneBlur(e) {
+            console.log(e.target.value, 'e----one--one');
+            const defaultTxt = e.target.value;
+            if (!defaultTxt) {
+                this.isAdCpaBid11Blur = true;
+                this.adCpaBid11BlurTxt = '请输入最低出价';
+            }
+            else if (defaultTxt > this.configForm.adCpaBid122) {
+                this.isAdCpaBid11Blur = true;
+                this.adCpaBid11BlurTxt = '最低出价不能大于最高出价';
+            }
+            else {
+                this.isAdCpaBid11Blur = false;
+                this.adCpaBid11BlurTxt = '';
+            }
+        },
+        handleAdCpaBidTwoBlur(e) {
+            console.log(e.target.value, 'e----two--two');
+            const defaultTxt = e.target.value;
+            if (!defaultTxt) {
+                this.isAdCpaBid11Blur = true;
+                this.adCpaBid11BlurTxt = '请输入最高出价';
+            }
+            else if (defaultTxt < this.configForm.adCpaBid11) {
+                this.isAdCpaBid11Blur = true;
+                this.adCpaBid11BlurTxt = '最低出价不能大于最高出价';
+            }
+            else {
+                this.isAdCpaBid11Blur = false;
+                this.adCpaBid11BlurTxt = '';
+            }
+        },
+        handleLadderOneBlur(e) {
+            const defaultTxt = e.target.value;
+            if (!defaultTxt) {
+               this.isLadderBlur = true;
+               this.ladderBlurTxt = '请输入最低出价';
+            }
+            else if (this.configForm.ladderTwo && defaultTxt > this.configForm.ladderTwo) {
+                this.isLadderBlur = true;
+                this.ladderBlurTxt = '最低出价不能大于最高出价';
+            }
+            else {
+                this.isLadderBlur = false;
+                this.ladderBlurTxt = '';
+            }
+        },
+        handleLadderTwoBlur(e) {
+            const defaultTxt = e.target.value;
+            if (!defaultTxt) {
+               this.isLadderBlur = true;
+               this.ladderBlurTxt = '请输入最高出价';
+            }
+            else if (this.configForm.ladderOne && defaultTxt < this.configForm.ladderOne) {
+                this.isLadderBlur = true;
+                this.ladderBlurTxt = '最低出价不能大于最高出价';
+            }
+            else {
+                this.isLadderBlur = false;
+                this.ladderBlurTxt = '';
+            }
+        },
         handleAdCpaBidBlur(e) {
             const defaultValue = e.target.value;
             if (this.configForm.adBudget > 0 && defaultValue > this.configForm.adBudget) {
@@ -905,6 +1130,50 @@ export default {
                 this.isAdCpaBidBlur = false;
             }
         },
+        handleGetAdvertiserStrategy() {
+            const params = {
+                accountId: this.configForm.accountId,
+                landingType: this.configForm.campaignLandingType,
+                advancedCreativeType: 'ATTACHED_CREATIVE_NONE'
+            };
+            getAction(urlAcount + '/bytedance-api/advertiser/aiBytedanceAdvertiserStrategy/getAdActionText', params)
+                .then(result => {
+                    if (result.code === 0) {
+                        this.configForm.creativeOptions = result.result;
+                    }
+                    else {
+                        this.$message.error(result.message);
+                    }
+                })
+                .catch(error => {
+                    console.log(error, 'eeee');
+                });
+        },
+        // 获取选中的城市
+        getSelectedCityArr(val) {
+            setTimeout(() => {
+                this.configForm.adSelectCity = val;
+            }, 200);
+        },
+        handleCheckedShowList(val) {
+            if (val.length) {
+                this.configForm.adSelectCity = val.map(item => item.code);
+            }
+            else {
+                this.configForm.adSelectCity = [];
+            }
+        },
+        getAgeSelect(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');
+            }
+        },
         handleAdBudgetBlur(e) {
             const adBudgetInput = e.target.value;
             if (this.configForm.adCpaBid > adBudgetInput) {
@@ -927,7 +1196,7 @@ export default {
             }
         },
         handleAccountBudget(e) {
-            this.configForm.accountBudget = Number(e.target.value).toFixed(2);
+            this.configForm.accountBudget = Number(Number(e.target.value).toFixed(2));
         },
         handleExportRules(value, min, max, callback) {
             let cnReg = /([\u4e00-\u9fa5]|[\u3000-\u303F]|[\uFF00-\uFF60])/;
@@ -1055,10 +1324,14 @@ export default {
                         this.configForm.adDownloadUrl = detailData.adDownloadUrl || '';
                         this.configForm.adPackage = detailData.adPackage || '';
                         this.configForm.adConvertType = detailData.adConvertType || '';
-                        this.configForm.adConvertId = detailData.adConvertId || '';
                         this.configForm.adDistrict = detailData.adDistrict || 'NONE';
+                        setTimeout(() => {
+                            this.listArr = detailData.adCity.split(',');
+                            this.configForm.adSelectCity = detailData.adCity.split(',');
+                        }, 200);
                         this.configForm.adGender = detailData.adGender || 'NONE';
-                        this.configForm.adAge = detailData.adAge || 'NONE';
+                        this.configForm.adLocationType = detailData.adLocationType;
+                        this.configForm.adSelectAge = detailData.adAge.split(',');
                         this.configForm.adRetargetingTagsInclude = detailData.adRetargetingTagsInclude;
                         this.configForm.adSuperiorPopularityType = detailData.adSuperiorPopularityType;
                         this.configForm.adPlatform = detailData.adPlatform;
@@ -1155,6 +1428,9 @@ export default {
                                 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);
@@ -1292,7 +1568,8 @@ export default {
             reader.readAsDataURL(img);
         },
         beforeUpload(info) {
-            const isZip = info.type.includes('png') || info.type.includes('jpg');
+            console.log(info, '----info----');
+            const isZip = info.type.includes('png') || info.type.includes('jpeg');
             const fileOvesize = info.size > (1024 * 1024);
             if (!isZip) {
                 this.$message.error('请上传正确类型的图片');
@@ -1396,6 +1673,12 @@ export default {
         },
         handleRelaxSure() {
             let paramsFormData = this.configForm;
+            if (this.configForm.adDistrict === 'CITY') {
+                if (!this.configForm.adSelectCity.length) {
+                    this.$message.error('请选择省市');
+                    return;
+                }
+            }
             if (!this.urlResult) {
                 this.$message.error('请上传图片');
                 return;
@@ -1440,12 +1723,14 @@ export default {
             else if (paramsFormData.launchTimeInterval === 'a') {
                 paramsFormData.adScheduleTime = paramsFormData.scheduleTimeData;
             }
-            if (paramsFormData.adAndroidVersion = 'a') {
+            if (paramsFormData.adAndroidVersion === 'a') {
                 paramsFormData.adAndroidOsv = paramsFormData.androidChangeValue;
             }
-            else if (paramsFormData.adAndroidVersion = 'NONE') {
+            else {
                 paramsFormData.adAndroidOsv = 'NONE';
             }
+            paramsFormData.adCity = paramsFormData.adSelectCity.join(',');
+            paramsFormData.adAge = paramsFormData.adSelectAge.join(',');
             paramsFormData.productSellingPoints = this.configForm.defaultFormList && this.configForm.defaultFormList.map(item => item.value);
             paramsFormData.creativeThirdIndustryId = paramsFormData.creativeThirdIndustryIds[2];
             paramsFormData.creativeProductImageCode = this.md5Result;

+ 64 - 0
src/views/modules/account-config/components/directional-logic/directional-logic.less

@@ -0,0 +1,64 @@
+.directional-logic-content {
+    .input-search {
+        width: 240px;
+        margin: 10px 0 10px 0;
+    }
+    .tree-select-class {
+        display: flex;
+        justify-content: space-between;
+        .class-left-header {
+            height: 50px;
+            line-height: 50px;
+            background-color: #fafafa;
+            border-bottom: 1px solid #eee;
+            text-indent: 10px;
+        }
+        .no-data-class {
+            height: 340px;
+            line-height: 340px;
+            text-align: center;
+        }
+        .select-class-left {
+            width: 68%;
+            height: 400px;
+            border: 1px solid #eee;
+            .class-left-content {
+                overflow-y: auto;
+                height: 340px;
+            }
+            .example {
+                text-align: center;
+                line-height: 200px;
+            }
+        }
+        .select-class-right {
+            width: 28%;
+            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;
+                    }
+                }
+            }
+        }
+    }
+}

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

@@ -0,0 +1,129 @@
+<template>
+    <div class="directional-logic-content">
+        <div>
+            <a-input-search class="input-search" placeholder="请输入账户名或ID" @change="handleSearchPack" />
+            <div class="tree-select-class">
+                <div class="select-class-left">
+                    <a-table
+                        :columns="columns"
+                        :data-source="tableData"
+                        :row-selection="{onChange: handleRowSelection, selectedRowKeys: tableSelectIds}"
+                        :scroll="{y: 300}"
+                        :pagination="false"
+                    >
+                    </a-table>
+                </div>
+                <div class="select-class-right">
+                    <div class="class-left-header">
+                        已选({{ packtype === 'directional' ? '定向' : '排除'}})
+                    </div>
+                    <div v-if="selectRightData.length" class="class-left-content">
+                        <div class="apply-right-tree" v-for="item in selectRightData" :key="item.key">
+                            <p class="left-content-p">
+                                <a-tooltip placement="left">
+                                    <template slot="title">
+                                        <span>{{ item.name }}</span>
+                                    </template>
+                                    {{ item.name }}
+                                </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>
+    </div>
+</template>
+<script>
+export default {
+    name: 'directional-logic',
+    props: {
+        packtype: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            selectRightData: [],
+            tableSelectIds: [],
+            columns: [
+                {
+                    title: '人群包',
+                    dataIndex: 'name',
+                    key: 'name',
+                    ellipsis: true
+                },
+                {
+                    title: '属性',
+                    dataIndex: 'age',
+                    key: 'age',
+                    width: '30%',
+                    ellipsis: true
+                },
+                {
+                    title: '创建时间',
+                    dataIndex: 'address',
+                    width: '30%',
+                    key: 'address',
+                    ellipsis: true
+                }
+            ],
+            tableData: [
+                {
+                    key: 1,
+                    name: '行业内人群包1234567',
+                    age: '系统推荐',
+                    address: '2020-12-12'
+                },
+                {
+                    key: 2,
+                    name: '行业内人群包98990890',
+                    age: '系统推荐',
+                    address: '2020-12-12'
+                }
+            ],
+            updateTreeData: [
+                {
+                    key: 1,
+                    name: '行业内人群包1234567',
+                    age: '系统推荐',
+                    address: '2020-12-12'
+                },
+                {
+                    key: 2,
+                    name: '行业内人群包98990890',
+                    age: '系统推荐',
+                    address: '2020-12-12'
+                }
+            ]
+        };
+    },
+    methods: {
+        handleSearchPack(e) {
+            const value = e.target.value;
+            let defaultList = [];
+            this.updateTreeData.forEach(item => {
+                if (item.name && item.name.indexOf(value) !== -1) {
+                    defaultList.push(item);
+                }
+            });
+            this.tableData = defaultList;
+        },
+        handleRowSelection(selectedRowKeys, selectedRows) {
+            this.tableSelectIds = selectedRows.length ? selectedRows.map(item => item.key) : [];
+            this.selectRightData = selectedRows;
+        },
+        handleDelTree(list) {
+            let formData = this.selectRightData;
+            this.selectRightData = formData.filter(item => list.key !== item.key);
+            this.tableSelectIds = this.selectRightData.map(item => item.key);
+        }
+    }
+}
+</script>
+<style lang="less" scoped>
+    @import 'directional-logic';
+</style>

+ 4 - 0
src/views/modules/creative-copywrit/creative-copywrit.vue

@@ -1993,6 +1993,10 @@ export default {
             this.keyWordRec = '';
         },
         handleRecommendSure() {
+            if (!this.applyTypeOption.length) {
+                this.$message.error('请选择标题');
+                return;
+            }
             this.recommendVisible = false;
             this.keyWordRec = '';
             let formData = this.defaultFormList;