Browse Source

feat: 文案分配

zhengxy 7 months ago
parent
commit
1d043ee6f6

+ 2 - 0
src/components/businessMoudle/batchGdt3/configArea/index.vue

329
   copywriterInfoData: {//创意文案
329
   copywriterInfoData: {//创意文案
330
     multiCopyTesting: 0,
330
     multiCopyTesting: 0,
331
     data: [],
331
     data: [],
332
+    allData: [],
332
     allocation_type: '',//分配形式 1自动分配 2程序化相乘分配
333
     allocation_type: '',//分配形式 1自动分配 2程序化相乘分配
333
     writerShareRadioList: '1',// 分配方式 1按广告 2按创意
334
     writerShareRadioList: '1',// 分配方式 1按广告 2按创意
334
     writerRuleRadioList: '1', // 分配规则 1自动分配 2程序化分配
335
     writerRuleRadioList: '1', // 分配规则 1自动分配 2程序化分配
597
 const writerCallBack = (obj) => {
598
 const writerCallBack = (obj) => {
598
   pageInfo.copywriterInfoData.multiCopyTesting = obj.multiCopyTesting;
599
   pageInfo.copywriterInfoData.multiCopyTesting = obj.multiCopyTesting;
599
   pageInfo.copywriterInfoData.data = obj.writer;
600
   pageInfo.copywriterInfoData.data = obj.writer;
601
+  pageInfo.copywriterInfoData.allData = obj.writer
600
   pageInfo.copywriterInfoData.allocation_type = obj.allocation_type;
602
   pageInfo.copywriterInfoData.allocation_type = obj.allocation_type;
601
   pageInfo.copywriterInfoData.writerShareRadioList = obj.writerShareRadioList;
603
   pageInfo.copywriterInfoData.writerShareRadioList = obj.writerShareRadioList;
602
   pageInfo.copywriterInfoData.writerRuleRadioList = obj.writerRuleRadioList;
604
   pageInfo.copywriterInfoData.writerRuleRadioList = obj.writerRuleRadioList;

+ 4 - 4
src/components/businessMoudle/batchGdt3/configArea/landPage/accMinprogram.vue

1
 <template>
1
 <template>
2
 <div class="tabelListBox">
2
 <div class="tabelListBox">
3
     <div class="num_pre" v-if="acc_select_count">
3
     <div class="num_pre" v-if="acc_select_count">
4
-      <span>账户数:</span><span class="num">{{ acc_select_count[accId].accNum || 0 }}</span>
5
-      <span>计划数:</span><span class="num">{{ acc_select_count[accId].planNum || 0 }},</span>
6
-      <span>广告数:</span><span class="num">{{ acc_select_count[accId].adNum || 0 }};</span>
4
+      <span>账户数:</span><span class="num">{{ acc_select_count[accId].accNum || 0 }}</span>
5
+      <!-- <span>计划数:</span><span class="num">{{ acc_select_count[accId].planNum || 0 }},</span> -->
6
+      <!-- <span>广告数:</span><span class="num">{{ acc_select_count[accId].adNum || 0 }};</span> -->
7
     </div>
7
     </div>
8
     <div class="ids">
8
     <div class="ids">
9
       <div class="accItem" v-for="(item, idx) in accIdsList" :key="item.id" :class="item.id == accId ? 'active' : ''"
9
       <div class="accItem" v-for="(item, idx) in accIdsList" :key="item.id" :class="item.id == accId ? 'active' : ''"
61
 })
61
 })
62
 /**点击媒体账户 */
62
 /**点击媒体账户 */
63
 const accItemEvent = (item) => {
63
 const accItemEvent = (item) => {
64
-  copyCallDataInfo.value = (callDataInfo[item?.id] && JSON.parse(JSON.stringify(callDataInfo[item?.id]))) || [] 
64
+  copyCallDataInfo.value = (callDataInfo[item?.id] && JSON.parse(JSON.stringify(callDataInfo[item?.id]))) || []
65
   accId.value = item?.id;
65
   accId.value = item?.id;
66
   select_count.value = accCountInfo[accId.value]?.count || -1;
66
   select_count.value = accCountInfo[accId.value]?.count || -1;
67
 }
67
 }

+ 2 - 2
src/components/businessMoudle/batchGdt3/configArea/landPage/landPageDialog.vue

25
             </el-icon></span>
25
             </el-icon></span>
26
         </el-tooltip>
26
         </el-tooltip>
27
         <div class="num_pre" v-if="multiCopyTesting == 0">
27
         <div class="num_pre" v-if="multiCopyTesting == 0">
28
-          <span>账户数:</span><span class="num">{{ count_info?.accNum || 0 }}</span>
28
+          <span>账户数:</span><span class="num">{{ count_info?.accNum || 0 }}</span>
29
           <!-- <span>计划数:</span><span class="num">{{ count_info?.planNum || 0 }},</span> -->
29
           <!-- <span>计划数:</span><span class="num">{{ count_info?.planNum || 0 }},</span> -->
30
-          <span>广告数:</span><span class="num">{{ count_info?.adNum || 0 }};</span>
30
+          <!-- <span>广告数:</span><span class="num">{{ count_info?.adNum || 0 }};</span> -->
31
         </div>
31
         </div>
32
       </div>
32
       </div>
33
       <div class="flex marT15" v-if="allocation == 2 && multiCopyTesting == 0">
33
       <div class="flex marT15" v-if="allocation == 2 && multiCopyTesting == 0">

+ 8 - 0
src/components/businessMoudle/batchGdt3/configArea/ts/preview.ts

101
     };
101
     };
102
     //创意文案
102
     //创意文案
103
     if (pageInfo.copywriterInfoData.data && pageInfo.copywriterInfoData.data.length > 0) {
103
     if (pageInfo.copywriterInfoData.data && pageInfo.copywriterInfoData.data.length > 0) {
104
+      console.log('pageInfo.copywriterInfoData => ', pageInfo.copywriterInfoData)
105
+      const {writerRuleRadioList: writerRule, writerShareRadioList: writerShare} = pageInfo.copywriterInfoData
106
+      if (writerShare == 1 || (writerShare == 2 && writerRule == 1) || (writerShare == 2 && writerRule == 2) ) { // 按广告分配 || 按创意自动分配 || 按创意程序化相乘
107
+        // 模拟用1条文案确认广告创意数 确认创意数后 再跟进分配方式 将选择的完整的文案列表分配到创意中
108
+        pageInfo.copywriterInfoData.data = [pageInfo.copywriterInfoData.data[0]]
109
+        console.log('pageInfo.copywriterInfoData.data => ', pageInfo.copywriterInfoData.data)
110
+      }
111
+
104
       let writer_num = 0;
112
       let writer_num = 0;
105
       ad_show_list.forEach((main_1) => {
113
       ad_show_list.forEach((main_1) => {
106
         for (let i = 0; i < main_1.chooseList.length; i++) {
114
         for (let i = 0; i < main_1.chooseList.length; i++) {

+ 33 - 52
src/components/businessMoudle/batchGdt3/previewArea/index.vue

882
       writerShare: infoObj.copyInfo.pageInfo.copywriterInfoData.writerShareRadioList,
882
       writerShare: infoObj.copyInfo.pageInfo.copywriterInfoData.writerShareRadioList,
883
       writerRule: infoObj.copyInfo.pageInfo.copywriterInfoData.writerRuleRadioList,
883
       writerRule: infoObj.copyInfo.pageInfo.copywriterInfoData.writerRuleRadioList,
884
       writerList: infoObj.copyInfo.pageInfo.copywriterInfoData.data,
884
       writerList: infoObj.copyInfo.pageInfo.copywriterInfoData.data,
885
+      writerListAll: infoObj.copyInfo.pageInfo.copywriterInfoData.allData,
885
     })
886
     })
886
 
887
 
887
     accItemEvent(pageInfo.accList[0].id)
888
     accItemEvent(pageInfo.accList[0].id)
1005
   }
1006
   }
1006
 }
1007
 }
1007
 
1008
 
1008
-const handleSetWriterRule = ({writerShare, writerRule, writerList = []}) => {
1009
+const handleSetWriterRule = ({writerShare, writerRule, writerList = [], writerListAll = []}) => {
1009
   console.log('writerShare => ', writerShare)
1010
   console.log('writerShare => ', writerShare)
1010
   console.log('writerRule => ', writerRule)
1011
   console.log('writerRule => ', writerRule)
1011
   console.log('writerList => ', writerList)
1012
   console.log('writerList => ', writerList)
1013
+  console.log('writerListAll => ', writerListAll)
1012
   console.log('pageInfo.campaign_list => ', JSON.parse(JSON.stringify(pageInfo.campaign_list)))
1014
   console.log('pageInfo.campaign_list => ', JSON.parse(JSON.stringify(pageInfo.campaign_list)))
1013
-
1014
-  if (writerShare == 1) { // 所选文案按广告(定向包)平均分配 删除重复素材
1015
+  // 模拟用1条文案确认广告创意数 确认创意数后 再跟进分配方式 将writerList分配到创意中
1016
+  if (writerShare == 1) { // 所选文案按广告(定向包)平均分配
1015
     const _campaign_list = _.cloneDeep(pageInfo.campaign_list)
1017
     const _campaign_list = _.cloneDeep(pageInfo.campaign_list)
1016
 
1018
 
1017
     let _writerList = []
1019
     let _writerList = []
1018
-    for (let i = 0; i < 99; i++) {
1019
-      _writerList = [..._writerList, ...writerList]
1020
+    for (let i = 0; i < 500; i++) {
1021
+      _writerList = [..._writerList, ...writerListAll]
1020
     }
1022
     }
1021
 
1023
 
1022
     let adIds: any = []
1024
     let adIds: any = []
1030
       })
1032
       })
1031
     })
1033
     })
1032
     adIds = _.uniq(adIds)
1034
     adIds = _.uniq(adIds)
1033
-    console.log('adIds => ', adIds)
1034
-    console.log('_writerList => ', _writerList)
1035
-    console.log('_campaign_list => ', _campaign_list)
1036
 
1035
 
1037
-    let total:any = writerList.length
1036
+    let total:any = writerListAll.length
1038
     let count:any = adIds.length;
1037
     let count:any = adIds.length;
1039
     let base:any = Math.floor(total / count);
1038
     let base:any = Math.floor(total / count);
1040
     let rest:any = total % count;
1039
     let rest:any = total % count;
1043
       let idx = base + (i<rest?1:0)
1042
       let idx = base + (i<rest?1:0)
1044
       arr.push(idx)
1043
       arr.push(idx)
1045
     }
1044
     }
1046
-    console.log('arr => ', arr)
1047
 
1045
 
1048
     adIds = adIds.map(adId => ({
1046
     adIds = adIds.map(adId => ({
1049
       adId: adId,
1047
       adId: adId,
1050
-      writerList: [],
1048
+      writerList: '',
1051
     }))
1049
     }))
1052
 
1050
 
1053
     let startIdx = 0
1051
     let startIdx = 0
1054
     arr.forEach((length, idx) => {
1052
     arr.forEach((length, idx) => {
1055
       let _length = length || 1
1053
       let _length = length || 1
1056
-      adIds[idx].writerList = _writerList.slice(startIdx, startIdx+_length)
1054
+      adIds[idx].writerList = _writerList.slice(startIdx, startIdx+_length)[0]
1057
       startIdx = startIdx + _length
1055
       startIdx = startIdx + _length
1058
     })
1056
     })
1059
 
1057
 
1060
-    console.log('adIds => ', adIds)
1061
-
1062
     _campaign_list.forEach((campaign) => {
1058
     _campaign_list.forEach((campaign) => {
1063
       campaign.chooseList.forEach((choose) => {
1059
       campaign.chooseList.forEach((choose) => {
1064
         choose.ad_list.forEach(ad => {
1060
         choose.ad_list.forEach(ad => {
1065
           const crtAdId = ad.adId
1061
           const crtAdId = ad.adId
1066
-          const res = adIds.find(ad => ad.adId === crtAdId)
1067
-          if (res && !res.writerList.includes(ad.adcreatives_info.adcreative_elements.description)) {
1068
-            ad.delFlag = true
1069
-          }
1062
+          const res = adIds.find(a => a.adId === crtAdId)
1063
+          ad.adcreatives_info.adcreative_elements.description = res.writerList
1070
         })
1064
         })
1071
-        choose.ad_list = choose.ad_list.filter(ad => !ad.delFlag)
1072
       })
1065
       })
1073
     })
1066
     })
1074
     pageInfo.campaign_list = _.cloneDeep(_campaign_list)
1067
     pageInfo.campaign_list = _.cloneDeep(_campaign_list)
1075
-  } else if (writerShare == 2 && writerRule == 1) { // 所选文案按创意平均分配 删除重复素材
1068
+
1069
+  } else if (writerShare == 2 && writerRule == 1) { // 所选文案按创意平均分配
1076
     const _campaign_list = _.cloneDeep(pageInfo.campaign_list)
1070
     const _campaign_list = _.cloneDeep(pageInfo.campaign_list)
1071
+
1077
     let _writerList = []
1072
     let _writerList = []
1078
-    for (let i = 0; i < 99; i++) {
1079
-      _writerList = [..._writerList, ...writerList]
1073
+    for (let i = 0; i < 500; i++) {
1074
+      _writerList = [..._writerList, ...writerListAll]
1080
     }
1075
     }
1081
-    let adIds: any = []
1076
+
1077
+    let idx = 0
1082
     _campaign_list.forEach((campaign) => {
1078
     _campaign_list.forEach((campaign) => {
1083
       campaign.chooseList.forEach((choose) => {
1079
       campaign.chooseList.forEach((choose) => {
1084
         choose.ad_list.forEach(ad => {
1080
         choose.ad_list.forEach(ad => {
1085
-          ad.account_id = choose.account_id
1086
-          ad.adId = `${choose.account_id}&&&${ad.targeting_id}`
1087
-          adIds.push(ad.adId)
1081
+          ad.adcreatives_info.adcreative_elements.description = _writerList[idx]
1082
+          idx++
1088
         })
1083
         })
1089
       })
1084
       })
1090
     })
1085
     })
1091
-    adIds = _.uniq(adIds)
1092
-    let total:any = writerList.length
1093
-    let count:any = adIds.length;
1094
-    let base:any = Math.floor(total / count);
1095
-    let rest:any = total % count;
1096
-    let arr:any = []; // 记录每个账号分多少个素材
1097
-    for(let i=0; i<count; i++) {
1098
-      let idx = base + (i<rest?1:0)
1099
-      arr.push(idx)
1100
-    }
1101
-    adIds = adIds.map(adId => ({
1102
-      adId: adId,
1103
-      writerList: [],
1104
-    }))
1105
-    let startIdx = 0
1106
-    arr.forEach((length, idx) => {
1107
-      let _length = length || 1
1108
-      adIds[idx].writerList = _writerList.slice(startIdx, startIdx+_length)
1109
-      startIdx = startIdx + _length
1110
-    })
1086
+
1087
+    pageInfo.campaign_list = _.cloneDeep(_campaign_list)
1088
+  } else if (writerShare == 2 && writerRule == 2) { // 所选文案按创意交叉相乘
1089
+    const _campaign_list = _.cloneDeep(pageInfo.campaign_list)
1111
     _campaign_list.forEach((campaign) => {
1090
     _campaign_list.forEach((campaign) => {
1112
       campaign.chooseList.forEach((choose) => {
1091
       campaign.chooseList.forEach((choose) => {
1092
+        let ad_list: any = []
1113
         choose.ad_list.forEach(ad => {
1093
         choose.ad_list.forEach(ad => {
1114
-          const crtAdId = ad.adId
1115
-          const res = adIds.find(ad => ad.adId === crtAdId)
1116
-          if (res && !res.writerList.includes(ad.adcreatives_info.adcreative_elements.description)) {
1117
-            ad.delFlag = true
1118
-          }
1094
+          writerListAll.forEach(writer => {
1095
+            let adObj = _.cloneDeep(ad)
1096
+            adObj.adcreatives_info.adcreative_elements.description = writer
1097
+            ad_list.push(adObj)
1098
+          })
1119
         })
1099
         })
1120
-        choose.ad_list = choose.ad_list.filter(ad => !ad.delFlag)
1100
+        choose.ad_list = ad_list
1121
       })
1101
       })
1122
     })
1102
     })
1103
+
1123
     pageInfo.campaign_list = _.cloneDeep(_campaign_list)
1104
     pageInfo.campaign_list = _.cloneDeep(_campaign_list)
1124
   }
1105
   }
1125
 }
1106
 }