浏览代码

头条视频、账户报表

朱鑫波 3 年之前
父节点
当前提交
c49f9bebc3

+ 3 - 2
.env.development

@@ -2,7 +2,8 @@
 VUE_APP_BASE_API_URL = http://118.24.244.213:3030
 VUE_APP_BASE_API_URL = http://118.24.244.213:3030
 
 
 #账户报表/素材报表接口地址
 #账户报表/素材报表接口地址
-VUE_APP_BASE_REPORT_URL = http://api.tjyourong.com.cn/reportModule
+VUE_APP_BASE_REPORT_URL = http://192.168.1.134:9999/reportModule
 # 测试地址 http://gateway.tjyourong.com.cn
 # 测试地址 http://gateway.tjyourong.com.cn
 # 线上地址 http://api.tjyourong.com.cn
 # 线上地址 http://api.tjyourong.com.cn
-# 宋英豪 http://192.168.1.67:9999
+# 宋英豪 http://192.168.1.67:9999
+# 周泽宇 http://192.168.1.134:7006

+ 1 - 1
src/utils/columnConst/accountConst.js

@@ -218,7 +218,7 @@ export const TTcustomFields= [
         {
         {
           title: '安卓下载完成率',
           title: '安卓下载完成率',
           dataIndex: 'downloadFinishRate',
           dataIndex: 'downloadFinishRate',
-          tip: '计算方式:安卓安装完成数/安卓下载完成数',
+          tip: '计算方式:安卓下载完成数/安卓下载开始数',
           align: 'center',
           align: 'center',
           scopedSlots: { customRender: 'downloadFinishRate' },
           scopedSlots: { customRender: 'downloadFinishRate' },
           sorter: () => {}
           sorter: () => {}

+ 1 - 1
src/views/modules/Statistics/kuaishouReport/components/selectComponent.vue

@@ -255,7 +255,7 @@ const customFields = [
       {
       {
         title: '安卓下载完成率',
         title: '安卓下载完成率',
         dataIndex: 'downloadFinishRate',
         dataIndex: 'downloadFinishRate',
-        tip: '计算方式:安卓安装完成数/安卓下载完成数',
+        tip: '计算方式:安卓下载完成数/安卓下载开始数',
         align: 'center',
         align: 'center',
         scopedSlots: { customRender: 'downloadFinishRate' },
         scopedSlots: { customRender: 'downloadFinishRate' },
         sorter: (a, b) => a.downloadFinishRate - b.downloadFinishRate
         sorter: (a, b) => a.downloadFinishRate - b.downloadFinishRate

文件差异内容过多而无法显示
+ 1394 - 0
src/views/modules/Statistics/toutiaoReport/accountReport.vue


文件差异内容过多而无法显示
+ 1331 - 0
src/views/modules/Statistics/toutiaoReport/components/accountConst.js


+ 298 - 0
src/views/modules/Statistics/toutiaoReport/components/customColumn.vue

@@ -0,0 +1,298 @@
+<template>
+  <div class="customColumnKS">
+    <a-modal v-model="visibleOk" title="自定义列" on-ok="handleOk" @cancel="handleCancel" width="65%">
+      <template slot="footer">
+        <a-button key="back" @click="handleCancel">取消</a-button>
+        <a-button key="submit" type="primary" :loading="loading" @click="handleOk">应用</a-button>
+      </template>
+      <!-- <a-input-search placeholder="输入要添加的列的名称" style="width: 40%" enter-button @search="onSearch" /> -->
+      <div class="zhuti">
+        <div class="addlist">
+          <p>可添加的列</p>
+          <div class="selectionList">
+            <!--  v-for="(item,index) in addColumns" :key="index" -->
+            <!-- <div v-if="mediaType==1"> -->
+              <selectComponent
+              :showCol="mylistNum"
+              @getshowlist="getshowlist"
+              :fixedCol="fiexColumn"
+              :mediaType='mediaType'
+              
+              />
+            <!-- </div> -->
+            <!-- <div v-if="mediaType==2">
+              <selectComponentKS
+              :showCol="mylistNum"
+              @getshowlist="getshowlist"
+              :fixedCol="fiexColumn"
+              :mediaType='mediaType'
+              
+            />
+            </div> -->
+            
+          </div>
+        </div>
+        <div class="listNum">
+          <p>已选{{mylistNum.length}}列</p>
+          <a-button id="btn" type="link" @click="clearAllList">清空全部</a-button>
+          <ul class="selectlist">
+                <!-- draggable="true"
+                  @dragstart="handleDragStart($event, item.dataIndex)"
+                  @dragover.prevent="handleDragOver($event, item.dataIndex)"
+                  @dragenter="handleDragEnter($event, item.dataIndex)"
+                  @dragend="handleDragEnd($event, item.dataIndex)" -->
+            <li v-for="(item,index) in mylistNum" :key="index">
+              <span v-if=" index < fiexColumn.length">
+                <a-icon type="lock" />
+                <span class="listText">{{item.title}}</span>
+              </span>
+              <span v-else-if=" index >=fiexColumn.length"  >
+                <a-icon type="menu" style="color:#ccc" />
+                <span class="listText">{{item.title}}</span>
+                <a-icon
+                  type="close"
+                  @click="deleteCol(item,index)"
+                  id="closeStyle"
+                  style="fontSize:12px;"
+                />
+              </span>
+            </li>
+          </ul>
+        </div>
+      </div>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import selectComponent from './selectComponent'
+import selectComponentKS from './selectComponentKS'
+export default {
+  components: {
+    selectComponent,
+    selectComponentKS,
+  },
+  props: ['visible', 'listNum', 'fiexColumn','mediaType'],
+
+  data() {
+    return {
+      dragging: null,
+      dataKey: 0,
+      visibleOk: false,
+      mylistNum: [],
+      loading: false
+    }
+  },
+  watch: {
+    visible(n, o) {
+      // console.log(n,o)
+      this.visibleOk = this.visible
+    },
+    listNum: {
+      handler(newValue, oldValue) {
+        this.mylistNum = newValue
+      },
+      immediate: true
+      // deep: true
+    }
+  },
+  methods: {
+     //li展示里的关闭按钮 删除当前被选中的这一个列
+    deleteCol(item, index) {
+      this.mylistNum = this.mylistNum.filter((item1, num) => {
+        return num != index
+      })
+    },
+    handleDragStart(e, item) {
+      this.dragging = item
+    },
+    handleDragEnd(e, item) {
+      this.dragging = null
+    },
+    //首先把div变成可以放置的元素,即重写dragenter/dragover
+    handleDragOver(e) {
+      e.dataTransfer.dropEffect = 'move' // e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
+    },
+    handleDragEnter(e, item) {
+      e.dataTransfer.effectAllowed = 'move' //为需要移动的元素设置dragstart事件
+      if (item === this.dragging) {
+        return
+      }
+      const newItems = [...this.mylistNum]
+      const src = newItems.findIndex(v => v.dataIndex === this.dragging)
+      const dst = newItems.findIndex(v => v.dataIndex === item)
+
+      newItems.splice(dst, 0, ...newItems.splice(src, 1))
+
+      this.mylistNum = newItems
+    },
+    //弹出框确定
+    handleOk(e) {
+      this.loading = false
+      this.visibleOk = false
+      this.$emit('closeCustomColumn', false)
+      this.$emit('changeColumn', this.mylistNum)
+    },
+    //取消按钮
+    handleCancel() {
+      this.visibleOk = false
+      this.$emit('closeCustomColumn', false)
+    },
+    //清空全部
+    clearAllList() {
+      this.mylistNum = [...this.fiexColumn]
+    },
+    //从自定义列拿选择的项
+    getshowlist(val) {
+      var arr = []
+
+      // console.log(val)
+      if (val.length) {
+        if (val.flag) {
+          let newArr = val.arr
+          newVal.map((item, index) => {
+            // if(JSON.stringify(this.listNum).indexOf(JSON.stringify(item))==-1){
+            //  this.listNum.push(item); // 进行动态的操作
+            // }
+            var result = this.listNum.some(items => {
+              if (items.dataIndex == item.dataIndex) {
+                return true
+              }
+            })
+
+            // console.log(result)
+            if (result) {
+              newArr.splice(index, 1)
+            }
+          })
+
+          this.mylistNum = [...this.mylistNum, ...newArr]
+        } else {
+          //取消全选  清楚listNum中的val里的值
+          val.arr.map((item, index) => {
+            var result = this.mylistNum.some(items => {
+              if (items.dataIndex == item.dataIndex) {
+                return true
+              }
+            })
+            // console.log(result)
+            if (result) {
+              this.mylistNum.splice(index, 1)
+            }
+          })
+        }
+      } else {
+        arr = this.mylistNum.filter((item, index) => {
+          return item.dataIndex == val.dataIndex
+        })
+      }
+      if (arr.length) {
+        var index
+        this.mylistNum.map((item, ind) => {
+          if (item.dataIndex == val.dataIndex) {
+            index = ind
+          }
+        })
+        this.mylistNum.splice(index, 1)
+      } else {
+        this.mylistNum.push(val)
+      }
+    }
+  },
+  mounted() {
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+
+.addlist {
+  float: left;
+  width: 70%;
+  border: 1px solid #eee;
+  .selectionList {
+    padding: 10px 15px;
+    height: 450px;
+    overflow: auto;
+    .leibie {
+      .leiName {
+        font-size: 26px;
+        text-align: left;
+      }
+    }
+    .jutixiang {
+      display: inline-block;
+      width: 32%;
+      box-sizing: border-box;
+      padding: 10px 3px;
+    }
+  }
+}
+.listNum {
+  float: right;
+  width: 28%;
+  border: 1px solid #eee;
+  position: relative;
+}
+.zhuti {
+  margin-top: 15px;
+  overflow: hidden;
+
+  p {
+    height: 40px;
+    line-height: 20px;
+    padding: 10px 15px;
+
+    background: rgb(249, 250, 253);
+    border-bottom: 1px solid #eee;
+  }
+  #btn {
+    position: absolute;
+    right: 0;
+    top: 5px;
+  }
+  .selectlist {
+    width: 100%;
+    list-style: none;
+    margin: 0;
+    height: 450px;
+    padding: 0 15px 10px;
+    overflow: auto;
+
+    li {
+      width: 100%;
+      padding: 5px 8px;
+      margin: 6px 0;
+      border-radius: 10px;
+      background: rgb(248, 248, 248);
+      height: 32px;
+      position: relative;
+      span {
+        width: 80%;
+        height: 100%;
+        display: inline-block;
+        margin: 0 10px;
+        // overflow:hidden;
+        // text-overflow:ellipsis;
+        // white-space: nowrap;
+      }
+      .listText {
+        position: absolute;
+        top: 2;
+        left: 10;
+        width: 60%;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+      }
+      #closeStyle {
+        position: absolute;
+        top: 9px;
+        right: 7px;
+      }
+    }
+  }
+}
+
+</style>

+ 240 - 0
src/views/modules/Statistics/toutiaoReport/components/selectComponent.vue

@@ -0,0 +1,240 @@
+<template>
+  <div>
+    <div v-for="(item,index) in customFields" :key="index">
+      <div class="leibie">
+        <p class="leiName">{{item.title}}</p>
+        <!-- <span class="jutixiang">
+          <a-checkbox
+            :value="index"
+            name="type"
+            @change="isSelectAll($event,index)"
+            :checked="item.checkall"
+          >全选</a-checkbox>
+        </span> -->
+        <!-- {{item.form}} -->
+        <a-checkbox-group v-model="item.form" >
+          <span class="jutixiang" v-for="(zhi,num) in item.specificFields " :key="num">
+
+            <a-checkbox :value="zhi.dataIndex" :disabled="zhi.disabled"  name="type" @change="checkboxClick(zhi)">
+              <a-tooltip
+                class="select-component"
+                placement="top"
+                :title="zhi.tip"
+                :overlayClassName="tooltipShow"
+              >{{zhi.title}}</a-tooltip>
+            </a-checkbox>
+          </span>
+        </a-checkbox-group>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import  {TTcustomFields ,KScustomFields}  from './accountConst'
+// let customFields=customFields
+export default {
+  props: ['showCol','fixedCol','mediaType'],
+  data() {
+    return {
+        // customFields,
+      customFields:[],
+      quanxuanflag: [],
+      hovered: false,
+      tooltipShow: 'tooltipShow',
+      toParentArr: []
+    }
+  },
+  watch: {
+    
+    showCol(n) {
+      // console.log(n)
+      //
+      if (this.showCol.length == this.fixedCol.length) {
+
+        for (let i = 0; i < this.customFields.length; i++) {
+          this.customFields[i].form=[]          
+        }
+        this.showCol.map((item, index) => {
+          this.customFields.map((it, ind) => {
+            it.specificFields.map((i, d) => {
+              if (i.dataIndex === item.dataIndex) {
+                it.form.push(item.dataIndex)
+              }else{
+
+              }
+            })
+          })
+        })
+      } else {
+        
+       for (let i = 0; i < this.customFields.length; i++) {
+          this.customFields[i].form=[]
+          
+        }
+        n.map((item, index) => {
+          this.customFields.map((it, ind) => {
+            it.specificFields.map((i, d) => {
+              if (i.dataIndex === item.dataIndex) {
+                it.form.push(item.dataIndex)
+              }else{
+
+              }
+            })
+          })
+        })
+      }
+      // console.log(this.form)
+    },
+  
+  },
+  mounted() {
+    if(this.mediaType==1){
+      //头条自定义列
+      this.customFields=TTcustomFields
+    }else if(this.mediaType==2){
+      //快手自定义列
+      this.customFields=KScustomFields
+    }
+    for (let i = 0; i < this.customFields.length; i++) {
+      this.customFields[i].form=[]
+    }
+    // console.log(1)
+    this.showCol.map((item, index) => {
+      this.customFields.map((it, ind) => {
+        it.specificFields.map((i, d) => {
+          if (i.dataIndex === item.dataIndex) {
+            it.form.push(item.dataIndex)
+          }
+        })
+      })
+    })
+    this.fixedCol.map((item, index) => {
+      this.customFields.map((it, ind) => {
+        it.specificFields.map((i, d) => {
+          if (i.dataIndex === item.dataIndex) {
+            i.disabled=true;
+          }
+        })
+      })
+    })
+
+
+    console.log(this.customFields, 'customFields-customFields');
+    
+  },
+  methods: {
+    hide() {
+      this.clicked = false
+      this.hovered = false
+    },
+    handleHoverChange(visible) {
+      this.clicked = false
+      this.hovered = visible
+    },
+    getPopupContainer() {
+      console.log(this)
+    },
+
+    //全选框   判断是否全选
+    isSelectAll(e, val) {
+      //像父元素传递
+      console.log(e, val)
+      let arr=JSON.parse(JSON.stringify(this.customFields[val].specificFields))
+      let valArr={
+        flag:true,
+        arr
+      }
+      this.customFields[val].checkall = e.target.checked
+      console.log(this.customFields[val].checkall)
+
+      if (this.customFields[val].checkall) {
+       
+        this.customFields[val].form=[]
+ 
+        this.customFields[val].specificFields.map((item, index) => {
+
+          this.customFields[val].form.push(item.dataIndex)
+
+        })
+        valArr.flag=true;
+        this.$emit('getshowlist', valArr)
+      } else {
+        console.log(this.customFields[val])
+        this.customFields[val].form=[];
+        valArr.flag=false;
+        console.log(this.customFields[val].form=[])
+        this.$emit('getshowlist', valArr)
+      }
+
+      console.log(this.form[val])
+    },
+
+    onChange(){
+        
+    },
+
+    //复选框的点击事件
+    checkboxClick(val) {
+      // console.log(val)
+    //   this.$emit('update:count',)
+      this.$emit('getshowlist', val)
+      // console.log(val,this.customFields[0].form)
+      // this.customFields[val].checkall=!this.customFields[val].checkall
+      // for (let i = 0; i < this.customFields.length; i++) {
+      //   // console.log(this.customFields[0].form,this.customFields[i].specificFields.length)
+      //   if(this.customFields[i].form.length==this.customFields[i].specificFields.length-1){
+      //       this.customFields[i].checkall=true;
+      //   }else{
+      //     this.customFields[i].checkall=false;
+      //   }
+          
+      //   }
+    }
+  }
+}
+</script>
+<style>
+.tooltipShow {
+  max-width: 30%;
+}
+.tooltipShow .ant-tooltip-content .ant-tooltip-inner {
+  background: white;
+  font-size: 10px;
+  color: #333;
+}
+.ant-tooltip-content .ant-tooltip-arrow::before {
+  background-color: white;
+}
+</style>
+<style lang="scss" scoped>
+.leibie {
+  width: 100%;
+  margin-bottom: 10px;
+  .leiName {
+    font-size: 20px;
+    text-align: left;
+    margin-bottom: 5px;
+    margin-top: 0px;
+  }
+}
+.jutixiang {
+  display: inline-block;
+  width: 32%;
+  box-sizing: border-box;
+  padding: 8px 3px;
+  height: 30px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.ant-tooltip-content .tooltipShow {
+  background: #eee;
+  font-size: 10px;
+  color: #333;
+}
+
+.ant-checkbox-group {
+  width: 100%;
+}
+</style>

+ 240 - 0
src/views/modules/Statistics/toutiaoReport/components/selectComponentKS.vue

@@ -0,0 +1,240 @@
+<template>
+  <div>
+    <div v-for="(item,index) in customFields" :key="index">
+      <div class="leibie">
+        <p class="leiName">{{item.title}}</p>
+        <!-- <span class="jutixiang">
+          <a-checkbox
+            :value="index"
+            name="type"
+            @change="isSelectAll($event,index)"
+            :checked="item.checkall"
+          >全选</a-checkbox>
+        </span> -->
+        <!-- {{item.form}} -->
+        <a-checkbox-group v-model="item.form" >
+          <span class="jutixiang" v-for="(zhi,num) in item.specificFields " :key="num">
+
+            <a-checkbox :value="zhi.dataIndex" :disabled="zhi.disabled"  name="type" @change="checkboxClick(zhi)">
+              <a-tooltip
+                class="select-component"
+                placement="top"
+                :title="zhi.tip"
+                :overlayClassName="tooltipShow"
+              >{{zhi.title}}</a-tooltip>
+            </a-checkbox>
+          </span>
+        </a-checkbox-group>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import  {TTcustomFields ,KScustomFields}  from './accountConst'
+// let customFields=customFields
+export default {
+  props: ['showCol','fixedCol','mediaType'],
+  data() {
+    return {
+        // customFields,
+      customFields:[],
+      quanxuanflag: [],
+      hovered: false,
+      tooltipShow: 'tooltipShow',
+      toParentArr: []
+    }
+  },
+  watch: {
+    
+    showCol(n) {
+      // console.log(n)
+      //
+      if (this.showCol.length == this.fixedCol.length) {
+
+        for (let i = 0; i < this.customFields.length; i++) {
+          this.customFields[i].form=[]          
+        }
+        this.showCol.map((item, index) => {
+          this.customFields.map((it, ind) => {
+            it.specificFields.map((i, d) => {
+              if (i.dataIndex === item.dataIndex) {
+                it.form.push(item.dataIndex)
+              }else{
+
+              }
+            })
+          })
+        })
+      } else {
+        
+       for (let i = 0; i < this.customFields.length; i++) {
+          this.customFields[i].form=[]
+          
+        }
+        n.map((item, index) => {
+          this.customFields.map((it, ind) => {
+            it.specificFields.map((i, d) => {
+              if (i.dataIndex === item.dataIndex) {
+                it.form.push(item.dataIndex)
+              }else{
+
+              }
+            })
+          })
+        })
+      }
+      // console.log(this.form)
+    },
+  
+  },
+  mounted() {
+    if(this.mediaType==1){
+      //头条自定义列
+      this.customFields=TTcustomFields
+    }else if(this.mediaType==2){
+      //快手自定义列
+      this.customFields=KScustomFields
+    }
+    for (let i = 0; i < this.customFields.length; i++) {
+      this.customFields[i].form=[]
+    }
+    // console.log(1)
+    this.showCol.map((item, index) => {
+      this.customFields.map((it, ind) => {
+        it.specificFields.map((i, d) => {
+          if (i.dataIndex === item.dataIndex) {
+            it.form.push(item.dataIndex)
+          }
+        })
+      })
+    })
+    this.fixedCol.map((item, index) => {
+      this.customFields.map((it, ind) => {
+        it.specificFields.map((i, d) => {
+          if (i.dataIndex === item.dataIndex) {
+            i.disabled=true;
+          }
+        })
+      })
+    })
+
+
+    // console.log(this.customFields);
+    
+  },
+  methods: {
+    hide() {
+      this.clicked = false
+      this.hovered = false
+    },
+    handleHoverChange(visible) {
+      this.clicked = false
+      this.hovered = visible
+    },
+    getPopupContainer() {
+      console.log(this)
+    },
+
+    //全选框   判断是否全选
+    isSelectAll(e, val) {
+      //像父元素传递
+      console.log(e, val)
+      let arr=JSON.parse(JSON.stringify(this.customFields[val].specificFields))
+      let valArr={
+        flag:true,
+        arr
+      }
+      this.customFields[val].checkall = e.target.checked
+      console.log(this.customFields[val].checkall)
+
+      if (this.customFields[val].checkall) {
+       
+        this.customFields[val].form=[]
+ 
+        this.customFields[val].specificFields.map((item, index) => {
+
+          this.customFields[val].form.push(item.dataIndex)
+
+        })
+        valArr.flag=true;
+        this.$emit('getshowlist', valArr)
+      } else {
+        console.log(this.customFields[val])
+        this.customFields[val].form=[];
+        valArr.flag=false;
+        console.log(this.customFields[val].form=[])
+        this.$emit('getshowlist', valArr)
+      }
+
+      console.log(this.form[val])
+    },
+
+    onChange(){
+        
+    },
+
+    //复选框的点击事件
+    checkboxClick(val) {
+      // console.log(val)
+    //   this.$emit('update:count',)
+      this.$emit('getshowlist', val)
+      // console.log(val,this.customFields[0].form)
+      // this.customFields[val].checkall=!this.customFields[val].checkall
+      // for (let i = 0; i < this.customFields.length; i++) {
+      //   // console.log(this.customFields[0].form,this.customFields[i].specificFields.length)
+      //   if(this.customFields[i].form.length==this.customFields[i].specificFields.length-1){
+      //       this.customFields[i].checkall=true;
+      //   }else{
+      //     this.customFields[i].checkall=false;
+      //   }
+          
+      //   }
+    }
+  }
+}
+</script>
+<style>
+.tooltipShow {
+  max-width: 30%;
+}
+.tooltipShow .ant-tooltip-content .ant-tooltip-inner {
+  background: white;
+  font-size: 10px;
+  color: #333;
+}
+.ant-tooltip-content .ant-tooltip-arrow::before {
+  background-color: white;
+}
+</style>
+<style lang="scss" scoped>
+.leibie {
+  width: 100%;
+  margin-bottom: 10px;
+  .leiName {
+    font-size: 20px;
+    text-align: left;
+    margin-bottom: 5px;
+    margin-top: 0px;
+  }
+}
+.jutixiang {
+  display: inline-block;
+  width: 32%;
+  box-sizing: border-box;
+  padding: 8px 3px;
+  height: 30px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.ant-tooltip-content .tooltipShow {
+  background: #eee;
+  font-size: 10px;
+  color: #333;
+}
+
+.ant-checkbox-group {
+  width: 100%;
+}
+</style>

+ 222 - 0
src/views/modules/Statistics/toutiaoReport/kuaishouReport-service.js

@@ -0,0 +1,222 @@
+/**
+ * @file 人群包管理基础服务
+ * @author jiayufei(jiayufei@c-top.com.cn)
+ */
+
+ class AppMarketService {
+    constructor() {}
+
+    // 相关账户的table列表
+    setAcountColumns() {
+        return [
+            {
+                title: '账户名称',
+                dataIndex: 'authName',
+                width: '50%',
+                align: 'center'
+            },
+           
+            {
+                title: '应用数量',
+                dataIndex: 'appCount',
+                width: '50%',
+                align: 'center'
+            },
+        ]
+            
+    }
+
+    // 原因的table列表
+    setCauseColumns() {
+        return [
+            {
+                title: '账户名称',
+                dataIndex: 'authName',
+                width: '25%',
+                align: 'center'
+            },
+            {
+                title: '推送结果',
+                dataIndex: 'result',
+                width: '25%',
+                align: 'center'
+            },
+            {
+                title: '失败原因',
+                dataIndex: 'message',
+                width: '25%',
+                align: 'center',
+                customRender(t) {
+                    if(t === 'OK') {
+                        return '-';
+                    }
+                    else {
+                        return t;
+                    }
+                }
+            },
+            {
+                title: '操作',
+                dataIndex: 'action',
+                scopedSlots: {customRender: 'action'},
+                width: '25%',
+                align: 'center'
+            }
+        ]
+    }
+
+    // 相关项目的table列表
+    setDepColumns() {
+        return [
+            {
+                title: '广告组名称',
+                dataIndex: 'unitName',
+                width: '50%',
+                align: 'center'
+            },
+            {
+                title: '所属账户',
+                dataIndex: 'authName',
+                width: '50%',
+                align: 'center'
+            }
+        ]
+    }
+
+    // 状态枚举
+    setPlatform() {
+        return [
+            {
+                label: '',
+                value: '不限'
+            },
+            {
+                label: 1,
+                value: 'Android 应用下载'
+            },
+            {
+                label: 2,
+                value: 'Android 网页游戏'
+            },
+            {
+                label: 3,
+                value: 'iOS 应用下载'
+            },
+            {
+                label: 4,
+                value: 'iOS 网页游戏'
+            }
+        ]
+    }
+
+    // 上传人去报的校验规则
+    setPersonRules() {
+        return {
+            name: [
+                {required: true, message: '人群包名称不能为空', trigger: 'blur'},
+                {min: 1, max: 20, message: '人群包名称不能超过20个字符', trigger: 'blur'}
+            ],
+            resource: [
+                {required: true, message: '请选择匹配类型', trigger: 'change'}
+            ]
+        }
+    }
+
+    // 人群包类型枚举值
+    setPopulationTypeTasks() {
+        return [
+            {
+                label: 1,
+                value: '上传人群'
+            }, {
+                label: 2,
+                value: '广告人群'
+            }, {
+                label: 3,
+                value: '主题专区'
+            }, {
+                label: 4,
+                value: '逻辑规则'
+            }, {
+                label: 5,
+                value: '人群扩展'
+            }, {
+                label: 6,
+                value: '平台制定'
+            }, {
+                label: 7,
+                value: '定制付费'
+            }, {
+                label: 8,
+                value: '网红粉丝类别'
+            }, {
+                label: 9,
+                value: '内容付费行为'
+            }, {
+                label: 10,
+                value: '移动应用安装'
+            }, {
+                label: 11,
+                value: '快手使用活跃度'
+            }, {
+                label: 12,
+                value: '行业分类'
+            }, {
+                label: 13,
+                value: '商业兴趣'
+            }, {
+                label: 14,
+                value: '固话标签'
+            }, {
+                label: 15,
+                value: '行业偏好'
+            }, {
+                label: 16,
+                value: '第三方标签'
+            }, {
+                label: 17,
+                value: '产品关键词'
+            }, {
+                label: 19,
+                value: '应用渗透率'
+            }, {
+                label: 22,
+                value: '指定网红'
+            }, {
+                label: 23,
+                value: '行业分类'
+            }
+        ]
+    }
+
+    // 匹配类型枚举值
+    setMateTypeTasks() {
+        return [
+            {
+                label: 1,
+                value: 'IMEI'
+            }, {
+                label: 2,
+                value: 'IDFA'
+            }, {
+                label: 3,
+                value: 'IMEI_MD5'
+            }, {
+                label: 4,
+                value: 'IDFA_MD5'
+            }, {
+                label: 5,
+                value: '手机号-MD5'
+            }, {
+                label: 7,
+                value: 'OAID'
+            }, {
+                label: 8,
+                value: 'OAID_MD5'
+            }
+        ]
+    }
+
+}
+
+export default new AppMarketService();

+ 265 - 0
src/views/modules/Statistics/toutiaoReport/kuaishouReport.less

@@ -0,0 +1,265 @@
+.account-report {
+    .directional-content {
+        background: #fff;
+        // height: calc(100vh - 137px);
+        padding: 20px;
+        margin-bottom: 15px;
+        ::v-deep.table-page-search-wrapper {
+            ::v-deep.ant-form-inline {
+                .ant-form-item {
+                    display: flex;
+                    margin-bottom: 24px;
+                    margin-right: 0;
+
+                    .ant-form-item-control-wrapper {
+                        flex: 1 1;
+                        display: inline-block;
+                        vertical-align: middle;
+                    }
+
+                    > .ant-form-item-label {
+                        line-height: 32px;
+                        padding-right: 8px;
+                        width: auto;
+                    }
+
+                    ::v-deep.ant-form-item-control {
+                        height: auto;
+                        line-height: 32px;
+                    }
+                }
+            }
+
+            .table-page-search-submitButtons {
+                display: block;
+                margin-bottom: 24px;
+                white-space: nowrap;
+            }
+        }
+
+        .middle-button {
+            margin: 0 8px;
+        }
+        .control-con-header {
+            margin-bottom: 20px;
+            position: relative;
+            ::v-deep .ant-form-inline .ant-form-item > .ant-form-item-control-wrapper,
+            .ant-form-inline .ant-form-item > .ant-form-item-label {
+                width: 200px !important;
+            }
+            .reset-class {
+                margin-right: 10px !important;
+            }
+            .upload-person {
+                position: absolute;
+                right: 10px;
+                top: 0;
+            }
+        }
+        .cause-text-class {
+            cursor: pointer;
+        }
+        .pagin-table-class {
+            display: flex;
+            justify-content: flex-end;
+            margin-top: 20px;
+        }
+        .acount-search-class {
+            width: 200% !important;
+        }
+        .grid-form-type {
+            margin-left: 210px;
+        }
+    }
+    .show {
+        // background-color: #fff;
+        width: 100%;
+        display: flex;
+        justify-content: space-between;
+        // padding: 0px 15px;
+        box-sizing: border-box;
+        margin-bottom: 15px;
+
+        .showBox {
+            width: 19%;
+            box-sizing: border-box;
+            padding: 15px 15px;
+            background-color: #fff;
+
+            .title {
+                color: #999;
+                font-size: 16px;
+                position: relative;
+                text-align: center;
+                .infotitle {
+                    padding: 8px 0;
+                }
+
+                span {
+                    font-size: 1rem;
+                    // color: #1890ff;
+                    position: absolute;
+                    top: 0;
+                    right: 0;
+                    cursor: pointer;
+                }
+            }
+            .infoNum {
+                padding: 10px 0;
+                text-align: center;
+                font-weight: 600;
+                font-size: 20px;
+                span {
+                    font-weight: 600;
+                    font-size: 16px;
+                }
+                .red {
+                    font-size: 20px;
+                    font-weight: 600;
+                    color: red;
+                }
+                .green {
+                    display: block;
+                    text-align: center;
+                    margin-left: 0.2rem;
+                    font-size: 14px;
+                    font-weight: 700;
+                    color: #32cd32;
+                    .huanbi {
+                        // color:#999;
+                        font-weight: 400;
+                        font-size: 14px;
+                    }
+                }
+            }
+        }
+    }
+    .chartBox {
+        background-color: #fff;
+        margin: 15px 0px;
+        padding: 2px 10px 30px;
+    }
+    .tableBox {
+        background-color: #fff;
+        margin: 15px 0px;
+        padding: 15px 10px;
+        .tableTop {
+            position: relative;
+            padding-bottom: 15px;
+            border-bottom: 1px solid #e0e0e0;
+            .selectTime {
+                margin-right: 20px;
+            }
+            .add {
+                position: absolute;
+                top: 0;
+                right: 0;
+            }
+        }
+    }
+    ::v-deep .push-modal {
+        width: 600px !important;
+        .acount-title {
+            display: flex;
+            font-size: 14px;
+            height: 40px;
+            line-height: 40px;
+            .acount-title-left {
+                margin-right: 20px;
+                width: 100px;
+            }
+        }
+        .push-plate {
+            margin-bottom: 20px;
+        }
+    }
+    .person-modal {
+        width: 500px;
+        ::v-deep .ant-form-item {
+            display: flex;
+        }
+        ::v-deep .ant-form-item-label {
+            width: 20%;
+        }
+        ::v-deep .ant-form-item-control-wrapper {
+            width: 80%;
+        }
+        .acount-search-class {
+            width: 100% !important;
+        }
+        .upload-txt-rules {
+            margin-top: 10px;
+            margin-bottom: 10px;
+            line-height: 1.5;
+        }
+        ::v-deep .ant-radio-group {
+            line-height: 30px;
+        }
+    }
+    ::v-deep .cause-modal {
+        width: 600px !important;
+        .cause-modal-table-class {
+            height: 500px;
+            overflow-y: auto;
+        }
+        .pagin-table-class {
+            display: flex;
+            justify-content: flex-end;
+            margin-top: 20px;
+        }
+    }
+    ::v-deep .relax-modal {
+        width: 600px !important;
+        .acount-title {
+            display: flex;
+            font-size: 14px;
+            height: 40px;
+            line-height: 40px;
+            .acount-title-left {
+                width: 80px;
+            }
+            .acount-title-left::after {
+                content: ' : ';
+            }
+        }
+        .push-plate {
+            margin-bottom: 20px;
+        }
+    }
+
+    .grid-form-item-account {
+        ::v-deep .ant-form-item-control {
+            line-height: inherit;
+        }
+    }
+}
+
+.video-report {
+    .directional-content {
+        background: #fff;
+        // height: calc(100vh - 137px);
+        padding: 20px;
+        margin-bottom: 15px;
+        .middle-button {
+            margin: 0 8px;
+        }
+    }
+    .tableBox {
+        background-color: #fff;
+        margin: 15px 0px;
+        padding: 15px 10px;
+        .tableTop {
+            position: relative;
+            padding-bottom: 15px;
+            border-bottom: 1px solid #e0e0e0;
+            .selectTime {
+                margin-right: 20px;
+            }
+            .add {
+                position: absolute;
+                top: 0;
+                right: 0;
+            }
+        }
+    }
+}

文件差异内容过多而无法显示
+ 1207 - 0
src/views/modules/Statistics/toutiaoReport/videoReport.vue


+ 1 - 1
src/views/modules/Statistics/videoStatics/selectComponent.vue

@@ -255,7 +255,7 @@ const customFields = [
       {
       {
         title: '安卓下载完成率',
         title: '安卓下载完成率',
         dataIndex: 'downloadFinishRate',
         dataIndex: 'downloadFinishRate',
-        tip: '计算方式:安卓安装完成数/安卓下载完成数',
+        tip: '计算方式:安卓下载完成数/安卓下载开始数',
         align: 'center',
         align: 'center',
         scopedSlots: { customRender: 'downloadFinishRate' },
         scopedSlots: { customRender: 'downloadFinishRate' },
         sorter: (a, b) => a.downloadFinishRate - b.downloadFinishRate
         sorter: (a, b) => a.downloadFinishRate - b.downloadFinishRate

+ 1 - 1
src/views/modules/columnConst/accountConst.js

@@ -218,7 +218,7 @@ export const TTcustomFields= [
         {
         {
           title: '安卓下载完成率',
           title: '安卓下载完成率',
           dataIndex: 'downloadFinishRate',
           dataIndex: 'downloadFinishRate',
-          tip: '计算方式:安卓安装完成数/安卓下载完成数',
+          tip: '计算方式:安卓下载完成数/安卓下载开始数',
           align: 'center',
           align: 'center',
           scopedSlots: { customRender: 'downloadFinishRate' },
           scopedSlots: { customRender: 'downloadFinishRate' },
           sorter: () => {}
           sorter: () => {}

+ 1 - 1
src/views/modules/columnConst/stockWatch.js

@@ -218,7 +218,7 @@ export const TTcustomFields= [
         {
         {
           title: '安卓下载完成率',
           title: '安卓下载完成率',
           dataIndex: 'downloadFinishRate',
           dataIndex: 'downloadFinishRate',
-          tip: '计算方式:安卓安装完成数/安卓下载完成数',
+          tip: '计算方式:安卓下载完成数/安卓下载开始数',
           align: 'center',
           align: 'center',
           scopedSlots: { customRender: 'downloadFinishRate' },
           scopedSlots: { customRender: 'downloadFinishRate' },
           sorter: () => {}
           sorter: () => {}

+ 2 - 2
src/views/modules/policy-management/policy-management-server.js

@@ -3,9 +3,9 @@
  * @author jiayufei
  * @author jiayufei
  */
  */
 
 
- export const urlAcount = 'http://api.tjyourong.com.cn'; // 线上
+//  export const urlAcount = 'http://api.tjyourong.com.cn'; // 线上
 //  export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
 //  export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
-//  export const urlAcount = 'http://192.168.1.43:9999'; // 子安
+ export const urlAcount = 'http://192.168.1.43:9999'; // 子安
 //  export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
 //  export const urlAcount = 'http://gateway.tjyourong.com.cn'; // 测试
 //  export const urlAcount = 'http://192.168.1.8:9999'; // 学超
 //  export const urlAcount = 'http://192.168.1.8:9999'; // 学超
  
  

+ 2 - 2
vue.config.js

@@ -108,7 +108,7 @@ module.exports = {
         // target: 'http://192.168.1.59:7001', //请求本地 需要jeecg-boot后台项目  赵西安
         // target: 'http://192.168.1.59:7001', //请求本地 需要jeecg-boot后台项目  赵西安
         // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
         // target: 'http://192.168.1.193:31012', //请求本地 需要jeecg-boot后台项目  李煜一
-        target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
+        // target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
         // target: 'https://trac.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
         // target: 'https://trac.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目
         // target: 'http://39.106.184.70:8088/', //请求本地 需要jeecg-boot后台项目
         // target: 'http://39.106.184.70:8088/', //请求本地 需要jeecg-boot后台项目
         //  target: 'http://adsp.tjyourong.com.cn/', //请求本地 需要jeecg-boot后台项目
         //  target: 'http://adsp.tjyourong.com.cn/', //请求本地 需要jeecg-boot后台项目
@@ -118,7 +118,7 @@ module.exports = {
         // target: 'http://192.168.1.8:9999', // 学超
         // target: 'http://192.168.1.8:9999', // 学超
         // target:'http://gateway.tjyourong.com.cn', //测试
         // target:'http://gateway.tjyourong.com.cn', //测试
         // target:'http://apipre.tjyourong.com.cn', //预生产
         // target:'http://apipre.tjyourong.com.cn', //预生产
-        // target: 'http://192.168.1.134:7001', //请求本地 需要jeecg-boot后台项目  周泽宇
+        target: 'http://192.168.1.134:7001', //请求本地 需要jeecg-boot后台项目  周泽宇
 
 
         // target:'http://gateway.tjyourong.com.cn/',//测试
         // target:'http://gateway.tjyourong.com.cn/',//测试