Ver Fonte

Merge branch 'master' of http://git.tjyourong.com.cn/ctop/adsp-vue

魏志佳 há 4 anos atrás
pai
commit
6ca2b5bb01

+ 21 - 21
src/components/music-list/music-list.vue

@@ -169,27 +169,27 @@ export default {
     deleteItem(item, index) {
       // this.$emit('del', index) // 触发删除事件
       // console.log(item, index)
-      // let downloadElement = document.createElement('a')
-      // downloadElement.href = musicUrl + '?id=' + item.id + '.mp3'
-      // downloadElement.download = item.name
-      // downloadElement.target = '_blank'
-      // document.body.appendChild(downloadElement)
-      // downloadElement.click()
-      // document.body.removeChild(downloadElement)
-
-      downFilePost('/ctop/bytedanceMusicInfo/netEaseDownLoad', {
-        musicName: item.name,
-        musicUrl: musicUrl + '?id=' + item.id + '.mp3',
-      }).then((res) => {
-        const blob = new Blob([res], { type: 'audio/mpeg' })
-        const a = document.createElement('a')
-        const url = window.URL.createObjectURL(blob)
-        const filename = item.musicInfo.name
-        a.href = url
-        a.download = filename
-        a.click()
-        window.URL.revokeObjectURL(url)
-      })
+      let downloadElement = document.createElement('a')
+      downloadElement.href = musicUrl + '?id=' + item.id + '.mp3'
+      downloadElement.download = item.name
+      downloadElement.target = '_blank'
+      document.body.appendChild(downloadElement)
+      downloadElement.click()
+      document.body.removeChild(downloadElement)
+
+      // downFilePost('/ctop/bytedanceMusicInfo/netEaseDownLoad', {
+      //   musicName: item.name,
+      //   musicUrl: musicUrl + '?id=' + item.id + '.mp3',
+      // }).then((res) => {
+      //   const blob = new Blob([res], { type: 'audio/mpeg' })
+      //   const a = document.createElement('a')
+      //   const url = window.URL.createObjectURL(blob)
+      //   const filename = item.musicInfo.name
+      //   a.href = url
+      //   a.download = filename
+      //   a.click()
+      //   window.URL.revokeObjectURL(url)
+      // })
     },
     ...mapMutations({
       setPlaying: 'SET_PLAYING',

+ 335 - 25
src/views/modules/kuaishouapp/crossAccount/createUnit.vue

@@ -34,7 +34,7 @@
   <div class="create-unit">
     <a-card :body-style="{ padding: '24px 32px' }" :bordered="false">
       <a-form-model ref="unitCreate" :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
-        <a-tabs type="card" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-tabs type="card" :label-col="labelCol" :wrapper-col="wrapperCol" @change="changeAccount">
           <a-tab-pane
             :key="item.account.accountId"
             :tab="'账户:' + item.account.accountName"
@@ -49,7 +49,7 @@
             <a-form-model-item label="计划下组数量" prop="unitCount">
               <a-input-number v-model="item.account.unitCount" :min="1" :max="10" @change="changeCreateTotal(item)" />
             </a-form-model-item>
-            <!-- <a-form-model-item label="计划名称" prop="campaign"> -->
+
             <a-tabs type="card" v-if="item.account.campaignAgreement == 1">
               <a-tab-pane
                 :key="campaign.campaignId"
@@ -97,32 +97,76 @@
                         style="width: 60%; margin-right: 8px"
                       />
                     </a-form-model-item>
+                    <a-form-model-item label="目标应用" ref="appId" prop="appId" v-if="item.account.campaignType == 2">
+                      <a-select
+                        v-model="unitName.appId"
+                        showSearch
+                        allowClear
+                        placeholder="选择应用目标"
+                        optionFilterProp="children"
+                        style="width: 500px"
+                        @focus="handleFocus"
+                        @blur="handleBlur"
+                        @change="handleChange"
+                        :filterOption="filterOption"
+                      >
+                        <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 }}
+                        </a-select-option>
+                      </a-select>
+                    </a-form-model-item>
                   </a-tab-pane>
                 </a-tabs>
                 <div v-else>
                   <a-form-model-item
                     label="组名称"
-                    :prop="'accountArr.' + index + '.account.campaignList.' + campaignIndex + '.unitIdentical.unitName'"
+                    :prop="
+                      'accountArr.' +
+                      index +
+                      '.account.campaignList.' +
+                      campaignIndex +
+                      '.unitIdentical.unitName.' +
+                      unitIndex +
+                      '.name'
+                    "
                     :rules="{
                       required: true,
                       message: '组名称必填',
                       trigger: 'blur',
                     }"
+                    v-for="(unitCount, unitIndex) in campaign.unitIdentical.unitName"
+                    :key="unitIndex"
+                    :label="unitIndex == 0 ? '组名称' : ''"
+                    v-bind="unitIndex !== 0 ? formItemLayout : {}"
                   >
                     <a-input
-                      v-model="campaign.unitIdentical.unitName"
+                      v-model="unitCount.name"
                       placeholder="请输入组名称"
                       style="width: 60%; margin-right: 8px"
                     />
                   </a-form-model-item>
+                  <a-form-model-item label="目标应用" ref="appId" prop="appId" v-if="item.account.campaignType == 2">
+                    <a-select
+                      v-model="campaign.unitIdentical.appId"
+                      showSearch
+                      allowClear
+                      placeholder="选择应用目标"
+                      optionFilterProp="children"
+                      style="width: 500px"
+                      @focus="handleFocus"
+                      @blur="handleBlur"
+                      @change="handleChange"
+                      :filterOption="filterOption"
+                    >
+                      <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
+                        }}
+                      </a-select-option>
+                    </a-select>
+                  </a-form-model-item>
                 </div>
-
-                <!-- <a-form-model-item label="渠道包是否相同">
-                  <a-radio-group buttonStyle="solid" v-model="campaign.channel">
-                    <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 label="投放范围">
                   <a-radio-group buttonStyle="solid" v-model="campaign.unitIdentical.allianceAccount">
                     <a-radio-button value="1">默认</a-radio-button>
@@ -146,15 +190,154 @@
                 }"
                 ><a-input v-model="unitName.value" placeholder="请输入组名称" style="width: 60%; margin-right: 8px" />
               </a-form-model-item>
+
+              <a-form-model-item label="目标应用" ref="appId" prop="appId" v-if="item.account.campaignType == 2">
+                <a-select
+                  v-model="item.account.campaignOne.appId"
+                  showSearch
+                  allowClear
+                  placeholder="选择应用目标"
+                  optionFilterProp="children"
+                  style="width: 500px"
+                  @focus="handleFocus"
+                  @blur="handleBlur"
+                  @change="handleChange"
+                  :filterOption="filterOption"
+                >
+                  <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
+                    }}
+                  </a-select-option>
+                </a-select>
+              </a-form-model-item>
+              <a-form-model-item label="转化类型" ref="urlType" prop="urlType" v-if="item.account.campaignType == 3">
+                <a-radio-group buttonStyle="solid" v-model="item.account.campaignOne.urlType">
+                  <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
+                :label="item.account.campaignType == 3 ? ' ' : '链接'"
+                v-if="item.account.campaignType != 2"
+                :rules="{
+                  required: true,
+                  message: '链接不能为空',
+                  trigger: 'blur',
+                }"
+              >
+                <a-input placeholder="请填写链接" v-model="item.account.campaignOne.url" />
+              </a-form-model-item>
               <a-form-model-item label="投放范围" v-if="item.account.allianceAccount">
                 <a-radio-group buttonStyle="solid" v-model="item.account.campaignOne.allianceAccount">
                   <a-radio-button value="1">默认</a-radio-button>
                   <a-radio-button value="2">联盟广告</a-radio-button>
                 </a-radio-group>
               </a-form-model-item>
-            </div>
 
-            <!-- </a-form-model-item> -->
+              <a-form-model-item label="单日预算">
+                <a-radio-group buttonStyle="solid" v-model="item.account.campaignOne.dayBudgetType">
+                  <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=""
+                v-bind="item.account.campaignOne.dayBudgetType == '1' ? formItemLayout : {}"
+                v-if="item.account.campaignOne.dayBudgetType == '1'"
+                :prop="'accountArr.' + index + '.account.campaignOne.dayBudget'"
+                :rules="{
+                  required: true,
+                  message: '预算不能为空',
+                  trigger: 'blur',
+                }"
+              >
+                <a-input
+                  placeholder="不小于100,不超过100000000,仅支持输入自然数"
+                  style="width: 60%"
+                  v-model="item.account.campaignOne.dayBudget"
+                />
+              </a-form-model-item>
+              <a-form-model-item label="投放方式">
+                <a-radio-group buttonStyle="solid" v-model="item.account.campaignOne.speed">
+                  <a-radio-button value="1">正常投放</a-radio-button>
+                  <a-radio-button value="2">平滑投放</a-radio-button>
+                </a-radio-group>
+                <br />
+                <span>
+                  {{ item.account.campaignOne.speed == '2' ? '平滑匀速投放' : '尽快展示广告消耗预算' }}
+                </span>
+              </a-form-model-item>
+
+              <a-form-model-item label="排期">
+                <!-- v-decorator="['speed', { initialValue: '1' }]" -->
+                <a-radio-group
+                  buttonStyle="solid"
+                  v-model="item.account.campaignOne.time"
+                  @change="setTime(item.account.campaignOne)"
+                >
+                  <a-radio-button value="1">从今天开始长期投放</a-radio-button>
+                  <a-radio-button value="2">设置开始和结束日期</a-radio-button>
+                </a-radio-group>
+                <br />
+                <a-range-picker
+                  v-if="item.account.campaignOne.time == '2'"
+                  v-model="item.account.campaignOne.timeRange"
+                  format="YYYY-MM-DD"
+                  style="margin-top: 15px"
+                  :allowClear="false"
+                />
+              </a-form-model-item>
+              <a-form-model-item label="投放时段">
+                <a-radio-group
+                  buttonStyle="solid"
+                  v-model="item.account.campaignOne.scheduleTimeData"
+                  @change="setTimeAll(item.account.campaignOne)"
+                >
+                  <a-radio-button value="1">全天</a-radio-button>
+                  <a-radio-button value="2">特定时间</a-radio-button>
+                </a-radio-group>
+                <br />
+                <selectCheckAll
+                  style="width: 60%; margin-top: 15px"
+                  v-if="item.account.campaignOne.scheduleTimeData == '2'"
+                  :scheduleTime.sync="item.account.campaignOne.scheduleTime"
+                  ref="selectCheck"
+                />
+              </a-form-model-item>
+              <a-form-model-item label="创意展现方式" prop="campaign">
+                <a-radio-group buttonStyle="solid" v-model="item.account.campaignOne.showMode">
+                  <a-radio-button value="2">智能优选</a-radio-button>
+                  <a-radio-button value="1">随机轮播</a-radio-button>
+                </a-radio-group>
+                <br />
+                <span>
+                  {{
+                    item.account.campaignOne.showMode == '1'
+                      ? '广告组包含的广告创意将随机展现'
+                      : '每一次展现的时候,系统会进行CTR预估,预估CTR高的会得到展现机会'
+                  }}
+                </span>
+              </a-form-model-item>
+              <a-form-model-item label="场景广告位">
+                <!-- v-decorator="['speed', { initialValue: '1' }]" -->
+                <!-- <a-radio-group buttonStyle="solid" v-decorator="['sceneId', { initialValue: '1' }]">
+                  <a-radio-button value="1">优选广告位</a-radio-button>
+                  <a-radio-button value="2">按场景选择广告位</a-radio-button>
+                </a-radio-group> -->
+                <checkBoxGroup
+                  :options="[
+                    { label: '优选广告位', value: 1 },
+                    { label: '信息流广告', value: 7 },
+                    { label: '上下滑大屏广告', value: 6 },
+                    { label: '视频播放页广告', value: 3 },
+                  ]"
+                  v-model="item.account.campaignOne.sceneId"
+                  @change="changeData"
+                />
+              </a-form-model-item>
+              <!-- {{ item.account.campaignOne.sceneId }} -->
+            </div>
           </a-tab-pane>
         </a-tabs>
         <a-form-model-item
@@ -177,6 +360,7 @@
             required: true,
             message: '组名称必填',
             trigger: 'blur',
+            
           }"
           ><a-input v-model="domain.value" placeholder="请输入组名称" style="width: 60%; margin-right: 8px" />
         </a-form-model-item> -->
@@ -190,13 +374,18 @@ import { deleteAction, postAction, getAction } from '@/api/manage'
 import moment from 'moment'
 import { mapActions, mapGetters } from 'vuex'
 import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
+import selectCheckAll from '../account/stepForm/stepModule/test'
+import checkBoxGroup from '@/components/formComponents/checkBoxGroup'
 export default {
   name: 'create-unit',
   components: {
     Treeselect,
+    selectCheckAll,
+    checkBoxGroup,
   },
   data() {
     return {
+      appList: [],
       labelCol: { span: 7 },
       wrapperCol: { span: 17 },
       formItemLayout: {
@@ -224,11 +413,48 @@ export default {
                   campaignId: 1231231,
                   campaignName: '测试',
                   check: '1',
-                  unit: [{ name: '', directional: '', allianceAccount: '1' }],
-                  unitIdentical: { unitName: '', directional: '', allianceAccount: '1' },
+                  unit: [
+                    {
+                      name: '',
+                      directional: '',
+                      allianceAccount: '1',
+                      appId: '',
+                      urlType: '1',
+                      url: '',
+                      dayBudget: null,
+                      dayBudgetType: '0',
+                    },
+                  ],
+                  unitIdentical: {
+                    unitName: [{ name: '' }],
+                    directional: '',
+                    allianceAccount: '1',
+                    appId: '',
+                    urlType: '1',
+                    url: '',
+                    dayBudget: null,
+                    dayBudgetType: '0',
+                  },
                 },
               ],
-              campaignOne: { unitNames: [{ value: '' }], directional: '', allianceAccount: '1' },
+              campaignOne: {
+                unitNames: [{ value: '' }],
+                directional: '',
+                allianceAccount: '1',
+                appId: '',
+                urlType: '1',
+                url: '',
+                dayBudget: null,
+                dayBudgetType: '0',
+                speed: '1',
+                time: '1',
+                timeRange: [],
+                scheduleTimeData: '1',
+                scheduleTime:
+                  '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
+                showMode: '2',
+                sceneId: [1],
+              },
             },
           },
         ],
@@ -292,12 +518,69 @@ export default {
     }
   },
   methods: {
+    changeData(data) {
+      if (data.length > 1 && data.findIndex((item) => item == 1) == 0) {
+        data.splice(
+          data.findIndex((item) => item == 1),
+          1
+        )
+      } else if (data.length > 1 && data.findIndex((item) => item == 1) == data.length - 1) {
+        data.splice(0, data.length - 1)
+      } else if (data.length == 0) {
+        data.push(1)
+      }
+    },
+    setTime(item) {
+      console.log(item)
+      this.$nextTick(() => {
+        if (item.time == '2') {
+          item.timeRange = []
+          item.timeRange[0] = moment().startOf('day')
+          item.timeRange[1] = moment().add(1, 'months')
+        } else {
+          item.timeRange = []
+        }
+      })
+    },
+    setTimeAll(item) {
+      //   console.log(moment('2019-12-27'))
+      if (item.scheduleTimeData == '2') {
+      } else {
+        item.scheduleTime =
+          '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
+      }
+    },
+    changeAccount(data) {
+      this.getAppList(data)
+    },
+    getAppList(accountId) {
+      this.appList = []
+      let params = {}
+      params.accountId = accountId
+      getAction('/kuaishou/batch/getAppList', params).then((res) => {
+        if (res.success) {
+          this.appList = res.result.map((item, index) => {
+            return {
+              ...item,
+              key: index,
+            }
+          })
+        }
+      })
+    },
     submitForm(formName) {
       this.$refs[formName].validate((valid) => {
         if (valid) {
           alert('submit!')
           console.log(this.tabList)
+          console.log(this.form)
         } else {
+          setTimeout(() => {
+            var isError = document.getElementsByClassName('has-error')
+            console.log(isError)
+            isError[0].querySelector('input').focus()
+          }, 1)
+
           console.log('error submit!!')
           return false
         }
@@ -324,14 +607,19 @@ export default {
         // if()
         console.log(item)
         var arr = []
+        var arrUnitName = []
         for (let i = 0; i < item.account.unitCount; i++) {
           arr.push({ name: '', directional: '', allianceAccount: '1' })
+          arrUnitName.push({ name: '' })
         }
         item.account.campaignOne.unitNames = JSON.parse(JSON.stringify(arr))
         item.account.campaignList.forEach((element) => {
           if (element.check == '1') {
-            element.unitIdentical = JSON.parse(JSON.stringify({ unitName: '', directional: '', allianceAccount: '1' }))
+            element.unitIdentical = JSON.parse(
+              JSON.stringify({ unitName: arrUnitName, directional: '', allianceAccount: '1' })
+            )
           } else {
+            element.unit = []
             element.unit = JSON.parse(JSON.stringify(arr))
           }
         })
@@ -348,15 +636,15 @@ export default {
     nameTypeChange(item, accountData) {
       console.log(item)
       if (item.unitName == '1') {
-        item.unit = [{ value: '' }]
+        // item.unit = [{ value: '' }]
       } else {
-        this.$nextTick(() => {
-          var arr = []
-          for (let i = 0; i < accountData.unitCount; i++) {
-            arr.push({ value: '' })
-          }
-          item.unit = JSON.parse(JSON.stringify(arr))
-        })
+        // this.$nextTick(() => {
+        //   var arr = []
+        //   for (let i = 0; i < accountData.unitCount; i++) {
+        //     arr.push({ name: '', directional: '', allianceAccount: '1' })
+        //   }
+        //   item.unit = JSON.parse(JSON.stringify(arr))
+        // })
       }
     },
     getChangeAll(name, indexBest, index, items) {
@@ -577,10 +865,32 @@ export default {
       })
     },
   },
+  filters: {
+    getDate(value) {
+      let date = new Date(value)
+      let y = date.getFullYear()
+      let MM = date.getMonth() + 1
+      MM = MM < 10 ? '0' + MM : MM
+      let d = date.getDate()
+      d = d < 10 ? '0' + d : d
+      return y + '-' + MM + '-' + d
+    },
+    platform(str) {
+      var data = {
+        1: 'Android应用下载',
+        2: 'Android网页游戏',
+        3: 'iOS应用下载',
+        4: 'iOS网页游戏',
+      }
+      return data[str]
+    },
+  },
   mounted: function () {
     this.$nextTick(() => {
       // this.changeCreateTotal()
       this.activeIndex = this.tabList.findIndex((item) => this.key == item.key)
+
+      this.getAppList(this.form.accountArr[0].account.accountId)
     })
   },
 }