猎羽广告

echoIndex.vue 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <template>
  2. <div v-if="showFlag">
  3. <div class="f-wei-600 bMar10">使用方式: {{pageInfo.directContent?.type == '1' ? '使用定向包' : '使用定向包内容'}}</div>
  4. <template v-for="(dir,dirIdx) in pageInfo.directContent.chooseList" :key="dir.id">
  5. <div>
  6. <div class="bMar8">{{dir.name|| '-'}}</div>
  7. <template v-for="(subDir,subIdx) in dir.chooseList" :key="subDir.id">
  8. <el-tooltip effect="light" placement="right">
  9. <template #content>
  10. <PreviewInfo :propInfo="{list:subDir.jsonInfo}"></PreviewInfo>
  11. </template>
  12. <div class="subDirItem" >
  13. <span>{{subDir.targeting_name || '-'}}</span>
  14. <el-icon :size="14" color="#bfc4d0" class="pointer lMarauto" @click="deleDirectEvent(dir.id,subIdx)"><i-ep-Close /></el-icon>
  15. </div>
  16. </el-tooltip>
  17. </template>
  18. </div>
  19. </template>
  20. </div>
  21. <!-- 定向包配置 -->
  22. <DirectPacket ref="DirectPacketRef"
  23. @assignEvent="DirectPacketAssignEvent"
  24. :propInfo="pageInfo.directContent"
  25. :echoType="pageInfo.directContent?.type"></DirectPacket>
  26. </template>
  27. <script setup lang="ts">
  28. import {computed, getCurrentInstance, nextTick, onMounted, provide, reactive, readonly, ref, toRef, watch,} from "vue";
  29. import PreviewInfo from '@/components/businessMoudle/batchGdt/configArea/directPacket/common/previewInfo.vue'
  30. import DirectPacket from '@/components/businessMoudle/batchGdt/configArea/directPacket/index.vue'
  31. import {reactiveTableAndAny} from "@/api/ApiModel";
  32. import _ from "lodash";
  33. import {directDetialPreviewTs} from "@/components/businessMoudle/batchGdt/configArea/directPacket/ts/directDetialPreview";
  34. const { proxy } = getCurrentInstance() as any;
  35. // 全局方法定义
  36. const NumberHandle = proxy.$NumberHandle
  37. const emit = defineEmits<{
  38. (event: "updateHaveContent", id:number,chooseNum?:number,minusFlag?:boolean,clearFlag?:boolean, type?:string): void;
  39. }>();
  40. const props = withDefaults(defineProps<{
  41. showFlag?: boolean,
  42. }>(), {
  43. showFlag: false,
  44. })
  45. const pageInfo = reactive<reactiveTableAndAny>({
  46. directContent:{},
  47. directContent_interim:{},
  48. echoAcId:'',//定向包回显给子页面的账号id
  49. updateKey_DirectPacket:1,
  50. })
  51. watch(()=>pageInfo.updateKey_DirectPacket,()=>{
  52. nextTick(async ()=>{
  53. directContentChange()
  54. })
  55. })
  56. const directContentChange = (type?) => {
  57. pageInfo.directContent = _.cloneDeep(pageInfo.directContent_interim)
  58. //计算选的个数
  59. let chooseNum:number = 0
  60. pageInfo.directContent.chooseList.forEach(sub=>{
  61. if(sub.chooseList&&sub.chooseList.length){
  62. chooseNum+=sub.chooseList&&sub.chooseList.length
  63. }
  64. })
  65. if(type == 'feedback'){//回显
  66. emit('updateHaveContent',3,chooseNum, false, false, 'feedback')
  67. }else{
  68. emit('updateHaveContent',3,chooseNum)
  69. }
  70. }
  71. //删除某一项定向包
  72. const deleDirectEvent = (dirId:number,subIdx:number) => {
  73. pageInfo.directContent.chooseList.forEach(dir=>{
  74. if(dir.id == dirId){
  75. dir.chooseList.splice(subIdx,1)
  76. }
  77. })
  78. emit('updateHaveContent',3,-1,true)
  79. }
  80. const DirectPacketRef = ref<{switchShow:(val:boolean)=>void}>()
  81. //弹框点击确认后,此页面定向包需要的操作
  82. const DirectPacketAssignEvent = (val) => {
  83. pageInfo.directContent_interim = _.cloneDeep(val)
  84. pageInfo.updateKey_DirectPacket++
  85. }
  86. //获取定向包的第一个账号值
  87. const get_echoAcId = () => {
  88. let arr:any = pageInfo.directContent.chooseList
  89. if(arr){
  90. for(var dir =0;dir<arr.length;dir++){
  91. if(arr[dir]?.chooseList&&arr[dir]?.chooseList?.length>0){
  92. pageInfo.echoAcId = arr[dir].id
  93. break
  94. }
  95. }
  96. }
  97. }
  98. //打开定向包弹框
  99. const showDirectPacket = () => {
  100. DirectPacketRef.value!.switchShow(true)
  101. get_behavior_list()
  102. get_user_os_list()
  103. get_location_list()
  104. }
  105. //清空值
  106. const clearDirectContent = () => {
  107. pageInfo.directContent = {}
  108. pageInfo.directContent_interim = {}
  109. emit('updateHaveContent',3,0,false,true)
  110. }
  111. //添加一些账号
  112. // const addAcEvent = (arr:any) => {
  113. // if(arr&&arr.length>0 && pageInfo.directContent&&pageInfo.directContent.chooseList&&pageInfo.directContent.chooseList.length>0){
  114. // arr.forEach(obj=>{
  115. // pageInfo.directContent.chooseList.forEach(dir=>{
  116. // if(dir.id == obj.id){}else{
  117. // pageInfo.directContent.chooseList.push(obj)
  118. // }
  119. // })
  120. // })
  121. // }
  122. // }
  123. // //删除一些账号
  124. // const deleAcEvent = (arr:any) => {
  125. // //arr空 就清空数据
  126. // if(arr&&arr.length>0){
  127. // arr.forEach(obj=>{
  128. // if(pageInfo.directContent.chooseList&&pageInfo.directContent.chooseList.length>0){
  129. // pageInfo.directContent.chooseList.forEach((dir,dirIdx)=>{
  130. // if(dir.id == obj.id){}else{
  131. // pageInfo.directContent.chooseList.splice(dirIdx,1)
  132. // }
  133. // })
  134. // }
  135. // })
  136. // }else{
  137. // clearDirectContent()
  138. // }
  139. // }
  140. //账号change arr为变化后的账号
  141. const AcChangeEvent = (arr:any) => {
  142. if(arr&&arr.length>0){
  143. let new_ac = pageInfo?.directContent?.chooseList?.map((v)=>{return v.id}) || []
  144. arr.forEach((a_item) => {//添加账号
  145. if(!new_ac.includes(a_item.id)){
  146. pageInfo?.directContent?.chooseList?.push(a_item)
  147. }
  148. });
  149. if(pageInfo?.directContent?.chooseList){//删除不存在账号
  150. let arr_ac = arr.map((v)=>{return v.id}) || [];
  151. let brr:any = []
  152. let cp_chooseList = _.cloneDeep(pageInfo?.directContent?.chooseList)
  153. cp_chooseList.forEach((item) => {
  154. if(arr_ac.includes(item.id)){
  155. brr.push(_.cloneDeep(item))
  156. }
  157. });
  158. pageInfo.directContent.chooseList = brr;
  159. }
  160. }else{
  161. clearDirectContent()
  162. }
  163. }
  164. //抛出obj
  165. const getObjValue = () => {
  166. return pageInfo.directContent
  167. }
  168. //回显
  169. const feedbackEvent = (obj) => {
  170. if(obj){
  171. pageInfo.directContent_interim = _.cloneDeep(obj)
  172. console.log('pageInfo.directContent_interim', pageInfo.directContent_interim)
  173. directContentChange('feedback')
  174. }
  175. }
  176. // 父组件共享值
  177. defineExpose({
  178. get_echoAcId,
  179. showDirectPacket,
  180. clearDirectContent,
  181. getObjValue,
  182. // addAcEvent,
  183. // deleAcEvent,
  184. AcChangeEvent,
  185. feedbackEvent
  186. });
  187. const {get_behavior_list,get_user_os_list,get_location_list,pageInfoTs} = directDetialPreviewTs()
  188. provide('userOsList',toRef(pageInfoTs,'user_os_list'))
  189. provide('behaviorList',toRef(pageInfoTs,'transformation_behavior_list'))
  190. provide('location_list',toRef(pageInfoTs,'location_ca_list'))
  191. //传值
  192. provide('echoAcId',toRef(pageInfo,'echoAcId'))
  193. </script>
  194. <style lang="scss" scoped>
  195. .subDirItem{
  196. display: flex;
  197. align-items: center;
  198. padding: 8px;
  199. margin-bottom: 8px;
  200. color: #666;
  201. background-color: #fafafa;
  202. border-radius: 2px;
  203. }
  204. </style>