zhuxinbo преди 5 години
родител
ревизия
1388269c95

BIN
dist.zip


+ 3 - 0
src/views/modules/Statistics/components/timeCheck.vue

@@ -146,6 +146,9 @@ export default {
     },
     getAdd(checked) {
       this.active = checked
+      if(checked!=9){
+          this.startValue = []
+      }
       active = checked
       this.$emit('update:startValue', this.startValue)
       this.$emit('getAdd', checked)

+ 539 - 0
src/views/modules/Statistics/toutiaoAccount.vue

@@ -0,0 +1,539 @@
+<style lang="scss" scoped>
+  .search-bar {
+    display: flex;
+    align-items: center;
+  }
+
+  .search-box p {
+    display: inline-block;
+    border: 1px solid #f2f2f2;
+    border-radius: 5px;
+    margin-right: 10px;
+    padding: 5px 10px;
+    cursor: pointer;
+  }
+</style>
+<style>
+  .search-box .ant-card-body {
+    padding: 5px 15px;
+  }
+
+  .ant-modal-wrap .yincang .ant-modal-content .ant-modal-footer {
+    display: none !important;
+  }
+
+  .yincang .ant-col-6 p {
+    text-align: left;
+    color: red;
+    font-size: 16px;
+    font-weight: 500;
+  }
+
+  .ant-table-thead div {
+    font-weight: 700;
+  }
+
+  .tool-tip {
+    position: absolute;
+    top: 65px;
+    right: 10px;
+  }
+
+  th div {
+    white-space: nowrap;
+  }
+</style>
+<template>
+  <div class="data-account-statistics">
+    <a-row class="image-list-heading vm-panel">
+      <div class="panel-heading" style="display:flex;justify-content: space-between;">
+        {{ title }}
+        <a-button @click="dianji">进入素材报表</a-button>
+      </div>
+      <a-row type="flex" align="middle" justify="space-between" class="panel-body">
+        <div class="search-bar" style="width:100%">
+          <span>账户选择:</span>
+          <treeselect :appId.sync="appId" />
+          <a-button type="primary" style="margin:10px" @click="addUser">搜索</a-button>
+          <a-button type="primary" icon="reload" @click="getDataReset"
+            style="background-color:#67c23a;border-color:#67c23a">刷新</a-button>
+          <a-button type="primary" style="margin:10px" @click="getDataResetAll">重置</a-button>
+        </div>
+      </a-row>
+      <a-row>
+        <a-col :span="24">
+          <a-card :bordered="false" class="search-box">
+            <time-check @getAdd="getAdd" :startValue.sync="startValue" :timeList="timeList" ref="timeCheck">
+            </time-check>
+          </a-card>
+        </a-col>
+      </a-row>
+    </a-row>
+    <a-row :gutter="10" style="margin-top:10px">
+      <a-col :span="24">
+        <a-card style="width:100%;">
+          <a-table :columns="columns" :dataSource="data" bordered id="outTable" :pagination="ipagination" size="middle"
+            :customRow="rowClick" :loading="loading" :scroll="{ x: true }">
+            <div slot="url" slot-scope="url">
+              <video class="video" :src="url" controls="controls" style="height:200px;width:112.5px">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <!-- <span slot="photoClickRatio" slot-scope="photoClickRatio">{{ photoClickRatio | getBo }}</span>
+            <span slot="actionRatio" slot-scope="actionRatio">{{ actionRatio | getBo }}</span>
+            <span slot="impression1kCost" slot-scope="impression1kCost">{{ impression1kCost | toFixtwo }}</span>
+            <span slot="photoClickCost" slot-scope="photoClickCost">{{ photoClickCost | toFixtwo }}</span>
+            <span slot="actionCost" slot-scope="actionCost">{{ actionCost | toFixtwo }}</span>
+            <span slot="conversionPrice" slot-scope="conversionPrice">{{ conversionPrice | toFixtwo }}</span> -->
+          </a-table>
+        </a-card>
+      </a-col>
+    </a-row>
+    <ratio-modal ref="ratio" />
+  </div>
+</template>
+
+<script>
+  import ARow from 'ant-design-vue/es/grid/Row'
+  import ACol from 'ant-design-vue/es/grid/Col'
+  import countTo from 'vue-count-to'
+  import moment from 'moment'
+  import {
+    getMaterialReportByAccount
+  } from '@api/statistics'
+  import {
+    getAction,
+    postAction,
+    postFile,
+    downFile,
+    downFilePost,
+    deleteAction
+  } from '@/api/manage'
+  import axios from 'axios'
+  import lifting from './components/lifting'
+  import timeCheck from './components/timeCheck'
+  import ratioModal from './components/ratioModal'
+  import {
+    mapGetters
+  } from 'vuex'
+
+  import {
+    JeecgListMixin
+  } from '@/mixins/ipagination'
+
+  // import the component
+  import Treeselect from './components/Treeselect.vue'
+
+  // 引入基本模板
+  let echarts = require('echarts/lib/echarts')
+  // 引入柱状图组件
+  require('echarts/lib/chart/bar')
+  require('echarts/lib/chart/pie')
+  require('echarts/lib/chart/line')
+  // 引入提示框和title组件
+  require('echarts/lib/component/tooltip')
+  require('echarts/lib/component/title')
+  require('echarts/lib/component/graphic')
+  require('echarts/lib/component/toolbox')
+  require('echarts/lib/component/legend')
+  var length = 0
+  var active = 1
+
+  const columns = [{
+      title: '视频',
+      dataIndex: 'videoUrl',
+      key: 'videoUrl',
+      align: 'center',
+      scopedSlots: {
+        customRender: 'videoUrl'
+      }
+    },
+    {
+      title: '花费',
+      dataIndex: 'cost',
+      key: 'cost',
+      align: 'center',
+      sorter: (a, b) => a.cost - b.cost
+    },
+    {
+      title: '展示量',
+      dataIndex: 'showNum',
+      key: 'showNum',
+      align: 'center',
+      sorter: (a, b) => a.showNum - b.showNum
+    },
+    {
+      title: '点击量',
+      dataIndex: 'click',
+      key: 'click',
+      align: 'center',
+      sorter: (a, b) => a.click - b.click
+    },
+    {
+      title: '转化量',
+      dataIndex: 'convertNum',
+      key: 'convertNum',
+      align: 'center',
+      sorter: (a, b) => a.convertNum - b.convertNum
+    },
+    {
+      title: '应用下载-激活',
+      dataIndex: 'active',
+      key: 'active',
+      align: 'center',
+      sorter: (a, b) => a.active - b.active
+    },
+    {
+      title: '应用下载-安卓下载完成',
+      dataIndex: 'downloadFinish',
+      key: 'downloadFinish',
+      align: 'center',
+      sorter: (a, b) => a.downloadFinish - b.downloadFinish
+    },
+    {
+      title: '应用下载-点击安装数',
+      dataIndex: 'clickInstall',
+      key: 'clickInstall',
+      align: 'center',
+      sorter: (a, b) => a.clickInstall - b.clickInstall
+    },
+    {
+      title: '应用下载-付费',
+      dataIndex: 'inAppPay',
+      key: 'inAppPay',
+      align: 'center',
+      sorter: (a, b) => a.inAppPay - b.inAppPay
+    },
+    {
+      title: '总播放',
+      dataIndex: 'totalPlay',
+      key: 'totalPlay',
+      align: 'center',
+      sorter: (a, b) => a.totalPlay - b.totalPlay
+    },
+    {
+      title: '有效播放',
+      dataIndex: 'validPlay',
+      key: 'validPlay',
+      align: 'center',
+      sorter: (a, b) => a.validPlay - b.validPlay
+    },
+    {
+      title: 'wifi播放',
+      dataIndex: 'wifiPlay',
+      key: 'wifiPlay',
+      align: 'center',
+      sorter: (a, b) => a.wifiPlay - b.wifiPlay
+    },
+    {
+      title: '播放100%进度总数',
+      dataIndex: 'play100FeedBreak',
+      key: 'play100FeedBreak',
+      align: 'center',
+      sorter: (a, b) => a.play100FeedBreak - b.play100FeedBreak
+    },
+    {
+      title: '播放75%进度总数',
+      dataIndex: 'play75FeedBreak',
+      key: 'play75FeedBreak',
+      align: 'center',
+      sorter: (a, b) => a.play75FeedBreak - b.play75FeedBreak
+    },
+    {
+      title: '评论数',
+      dataIndex: 'comment',
+      key: 'comment',
+      align: 'center',
+      sorter: (a, b) => a.comment - b.comment
+    },
+    {
+      title: '平均次留数',
+      dataIndex: 'nextDayOpen',
+      key: 'nextDayOpen',
+      align: 'center',
+      sorter: (a, b) => a.nextDayOpen - b.nextDayOpen
+    },
+    {
+      title: '平均次留率(%)',
+      dataIndex: 'nextDayOpenRate',
+      key: 'nextDayOpenRate',
+      align: 'center',
+      sorter: (a, b) => a.nextDayOpenRate - b.nextDayOpenRate
+    },
+    {
+      title: '平均次留成本(元)',
+      dataIndex: 'nextDayOpenCost',
+      key: 'nextDayOpenCost',
+      align: 'center',
+      sorter: (a, b) => a.nextDayOpenCost - b.nextDayOpenCost
+    }
+  ]
+  const columnsDetail = [{
+      title: '日期',
+      dataIndex: 'statDate',
+      key: 'statDate',
+      align: 'center'
+    },
+    {
+      title: '花费',
+      dataIndex: 'cost',
+      key: 'cost',
+      align: 'center'
+    },
+    {
+      title: '封面曝光数',
+      dataIndex: 'photoShow',
+      key: 'photoShow',
+      align: 'center'
+    },
+    {
+      title: '封面点击数',
+      dataIndex: 'photoClick',
+      key: 'photoClick',
+      align: 'center'
+    },
+    {
+      title: '素材曝光数',
+      dataIndex: 'aclick',
+      key: 'aclick',
+      align: 'center'
+    },
+    {
+      title: '行为数',
+      dataIndex: 'bclick',
+      key: 'bclick',
+      align: 'center'
+    },
+    {
+      title: '封面点击率',
+      dataIndex: 'photoClickRatio',
+      key: 'photoClickRatio',
+      align: 'center',
+      scopedSlots: {
+        customRender: 'photoClickRatio'
+      }
+    },
+    {
+      title: '行为率',
+      dataIndex: 'actionRatio',
+      key: 'actionRatio',
+      align: 'center',
+      scopedSlots: {
+        customRender: 'actionRatio'
+      }
+    },
+
+    {
+      title: '均千次封面曝光花费(元)',
+      dataIndex: 'impression1kCost',
+      key: 'impression1kCost',
+      scopedSlots: {
+        customRender: 'impression1kCost'
+      },
+      align: 'center'
+    },
+    {
+      title: '平均封面点击单价(元)',
+      dataIndex: 'photoClickCost',
+      key: 'photoClickCost',
+      scopedSlots: {
+        customRender: 'photoClickCost'
+      },
+      align: 'center'
+    },
+    {
+      title: '平均行为单价(元)',
+      dataIndex: 'actionCost',
+      key: 'actionCost',
+      scopedSlots: {
+        customRender: 'actionCost'
+      },
+      align: 'center'
+    },
+    {
+      title: '转化数',
+      dataIndex: 'conversions',
+      key: 'conversions',
+      align: 'center'
+    },
+    {
+      title: '转化单价(元)',
+      dataIndex: 'conversionPrice',
+      key: 'conversionPrice',
+      scopedSlots: {
+        customRender: 'conversionPrice'
+      },
+      align: 'center'
+    }
+  ]
+  export default {
+    name: 'data-display-statistics',
+    components: {
+      ACol,
+      ARow,
+      countTo,
+      lifting,
+      timeCheck,
+      ratioModal,
+      Treeselect
+    },
+    mixins: [JeecgListMixin],
+    data: function () {
+      return {
+        title: '头条账户素材报表',
+        show: true,
+        timeList: [],
+        active: 1,
+        data: [],
+        columns,
+        columnsDetail,
+        list: [],
+        appId: [],
+        startValue: [],
+        allValue: [],
+        loading: false,
+        rowClick: record => ({
+          // 事件
+          on: {
+            click: () => {
+              // 点击改行时要做的事情
+              // this.detail = record
+              // this.visible = true
+              // this.getMineList(record.signature)
+              this.$refs.ratio.getMineList(record, this.active)
+            }
+          }
+        })
+      }
+    },
+    filters: {
+      formatDate: function (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
+        let h = date.getHours()
+        h = h < 10 ? '0' + h : h
+        let m = date.getMinutes()
+        m = m < 10 ? '0' + m : m
+        let s = date.getSeconds()
+        s = s < 10 ? '0' + s : s
+        return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s
+      },
+      toFixtwo: function (value) {
+        if (value) {
+          return value.toFixed(2)
+        } else {
+          return 0.0
+        }
+      },
+      getBo: function (value) {
+        if (value) {
+          return (value * 100).toFixed(2) + '%'
+        } else {
+          return '0.00%'
+        }
+      }
+    },
+    methods: {
+      moment,
+      ...mapGetters(['nickname', 'avatar', 'userInfo']),
+      disabledDate(current) {
+        return current && current > moment().endOf('day')
+      },
+      handleChange(value) {
+        console.log(value)
+        //   this.appId = value
+      },
+      getElseData(value) {
+        this.getStatistics()
+      },
+      handleBlur() {
+        console.log('blur')
+      },
+      getDataReset() {
+        this.active = 1
+        this.allValue = []
+        this.addUser()
+      },
+      getDataResetAll() {
+        this.active = 1
+        this.$refs.timeCheck.getAdd(1)
+        this.allValue = []
+        this.appId = []
+        this.data = []
+      },
+      addUser() {
+        this.loading = true
+        var that = this
+        if (this.appId.length > 0) {
+          var params = {}
+          params.accountIds = JSON.stringify(that.appId)
+          params.type = that.active
+          if (that.active == 9) {
+            params.startDate = this.allValue[0]
+            params.endDate = this.allValue[1]
+            getAction('/ctop/bytedanceCreativeDailyReport/bytedanceCreativeDailyReportList', params).then(res => {
+              if (res.success) {
+                if (res.result.length > 0) {
+                  this.data = res.result
+                  this.ipagination.total = res.result.length
+                } else {
+                  this.$message.error('选择的账户无数据')
+                }
+                this.loading = false
+              } else {
+                this.$message.error(res.message)
+                this.loading = false
+              }
+            })
+          }else{
+             this.$message.error('请选择时间段') 
+          }
+        } else {
+          this.$message.error('请选择账户以及时间')
+          return
+        }
+
+      },
+      getStatistics() {
+        var params = {}
+        params.accountIds = JSON.stringify(this.appId)
+        params.type = this.active
+        params.statHour = this.statHour
+        params.discount = this.discount
+        if (this.active == 9) {
+          params.startDate = this.allValue[0]
+          params.endDate = this.allValue[1]
+        }
+        this.data = []
+      },
+      getAdd(checked) {
+        if (checked == 9) {
+          if (this.startValue.length > 0 && this.startValue[0]) {
+            this.allValue[0] = moment(this.startValue[0]._d).format('YYYY-MM-DD')
+            this.allValue[1] = moment(this.startValue[1]._d).format('YYYY-MM-DD')
+          }
+        } else {
+          this.startValue = []
+          this.allValue = []
+        }
+        this.active = checked
+        active = checked
+        this.ipagination.current = 1
+      },
+      dianji() {
+        this.$router.replace({
+          path: '/Statistics/toutiaoMaterialStatistics'
+        })
+      }
+    },
+    watch: {},
+    distoryed() {},
+    mounted: function () {
+      this.$nextTick(() => {})
+    }
+  }
+</script>

+ 535 - 0
src/views/modules/Statistics/toutiaoMaterialStatistics.vue

@@ -0,0 +1,535 @@
+<style lang="scss" scoped>
+  .search-bar {
+    display: flex;
+    align-items: center;
+  }
+
+  .search-box p {
+    display: inline-block;
+    border: 1px solid #f2f2f2;
+    border-radius: 5px;
+    margin-right: 10px;
+    padding: 5px 10px;
+    cursor: pointer;
+  }
+</style>
+<style>
+  /* .data-display-statistics .ant-card-body {
+  padding: 0 15px;
+} */
+  .toutiao-material-statistics .search-box .ant-card-body {
+    display: flex;
+  }
+
+  .data-display-statistics .ant-col-6 {
+    margin: 10px 0;
+  }
+
+  .data-display-statistics .ant-col-6 .ant-card-body {
+    display: flex;
+    justify-content: center;
+  }
+
+  .data-display-statistics .ant-col-6 p,
+  .data-display-statistics .ant-col-6 span {
+    text-align: center;
+    line-height: 40px;
+    font-size: 30px;
+    font-weight: 600;
+    color: red;
+    margin: 0;
+  }
+
+  .search-box .ant-card-body {
+    padding: 5px 15px;
+  }
+
+  .data-display-statistics .ant-col-6 .ant-card-body .styleElse {
+    line-height: 60px;
+    height: 40px;
+    font-size: 16px;
+    font-weight: 400;
+    margin-left: 10px;
+  }
+
+  .ant-modal-wrap .yincang .ant-modal-content .ant-modal-footer {
+    display: none !important;
+  }
+
+  .yincang .ant-col-6 p {
+    text-align: left;
+    color: red;
+    font-size: 16px;
+    font-weight: 500;
+  }
+
+  .ant-table-thead div {
+    font-weight: 700;
+  }
+
+  .tool-tip {
+    position: absolute;
+    top: 65px;
+    right: 10px;
+  }
+
+  .ant-table-thead tr th {
+    background: none;
+  }
+
+  /* th div {
+  white-space: nowrap;
+} */
+</style>
+<template>
+  <div class="toutiao-material-statistics">
+    <a-row class="image-list-heading vm-panel">
+      <div class="panel-heading" style="display:flex;justify-content: space-between;">
+        {{ title }}
+        <a-button @click="dianji">进入账户报表</a-button>
+      </div>
+      <a-row>
+        <a-col :span="24">
+          <a-card :bordered="false" class="search-box" style="display:flex">
+            <time-check @getAdd="getAdd" :startValue.sync="startValue" :timeList="timeList" ref="timeCheck">
+            </time-check>
+            <a-button type="primary" style="margin-left:10px" @click="getList">搜索</a-button>
+            <a-button type="primary" style="margin-left:10px" @click="getDataResetAll">重置</a-button>
+          </a-card>
+        </a-col>
+      </a-row>
+    </a-row>
+    <a-row :gutter="10" style="margin-top:10px">
+      <a-col :span="24">
+        <a-card style="width:100%;">
+          <a-table :columns="columns" :dataSource="data" bordered id="outTable" :pagination="ipagination" size="middle"
+            :customRow="rowClick" :loading="loading" :scroll="{ x: 1900 }">
+            <div slot="videoUrl" slot-scope="videoUrl">
+              <video @click.stop class="video" :src="videoUrl" controls="controls" style="height:200px;width:112.5px">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div>
+            <!-- <span slot="photoClickRatio" slot-scope="photoClickRatio">{{ photoClickRatio | getBo }}</span>
+            <span slot="actionRatio" slot-scope="actionRatio">{{ actionRatio | getBo }}</span>
+            <span slot="impression1kCost" slot-scope="impression1kCost">{{ impression1kCost | toFixtwo }}</span>
+            <span slot="photoClickCost" slot-scope="photoClickCost">{{ photoClickCost | toFixtwo }}</span>
+            <span slot="actionCost" slot-scope="actionCost">{{ actionCost | toFixtwo }}</span>
+            <span slot="conversionPrice" slot-scope="conversionPrice">{{ conversionPrice | toFixtwo }}</span> -->
+          </a-table>
+        </a-card>
+      </a-col>
+    </a-row>
+
+    <ratio-modal ref="ratio" />
+  </div>
+</template>
+
+<script>
+  import ARow from 'ant-design-vue/es/grid/Row'
+  import ACol from 'ant-design-vue/es/grid/Col'
+  import moment from 'moment'
+  import {
+    getKuaiShouMaterialMarket,
+    getKuaiShouChainRatio
+  } from '@api/statistics'
+
+  import {
+    getAction,
+    postAction,
+    postFile,
+    downFile,
+    downFilePost,
+    deleteAction
+  } from '@/api/manage'
+  import axios from 'axios'
+  import {
+    mapGetters
+  } from 'vuex'
+  import {
+    stopOtherVideo,
+    closeAllVideoFun
+  } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
+
+  import timeCheck from './components/timeCheck'
+  import ratioModal from './components/ratioModal'
+
+  import {
+    JeecgListMixin
+  } from '@/mixins/ipagination'
+
+  var length = 0
+  var active = 1
+  const columns = [{
+      title: '视频',
+      dataIndex: 'videoUrl',
+      key: 'videoUrl',
+      align: 'center',
+      scopedSlots: {
+        customRender: 'videoUrl'
+      }
+    },
+    {
+      title: '花费',
+      dataIndex: 'cost',
+      key: 'cost',
+      align: 'center',
+      sorter: (a, b) => a.cost - b.cost
+    },
+    {
+      title: '展示量',
+      dataIndex: 'showNum',
+      key: 'showNum',
+      align: 'center',
+      sorter: (a, b) => a.showNum - b.showNum
+    },
+    {
+      title: '点击量',
+      dataIndex: 'click',
+      key: 'click',
+      align: 'center',
+      sorter: (a, b) => a.click - b.click
+    },
+    {
+      title: '转化量',
+      dataIndex: 'convertNum',
+      key: 'convertNum',
+      align: 'center',
+      sorter: (a, b) => a.convertNum - b.convertNum
+    },
+    {
+      title: '应用下载-激活',
+      dataIndex: 'active',
+      key: 'active',
+      align: 'center',
+      sorter: (a, b) => a.active - b.active
+    },
+    {
+      title: '应用下载-安卓下载完成',
+      dataIndex: 'downloadFinish',
+      key: 'downloadFinish',
+      align: 'center',
+      sorter: (a, b) => a.downloadFinish - b.downloadFinish
+    },
+    {
+      title: '应用下载-点击安装数',
+      dataIndex: 'clickInstall',
+      key: 'clickInstall',
+      align: 'center',
+      sorter: (a, b) => a.clickInstall - b.clickInstall
+    },
+    {
+      title: '应用下载-付费',
+      dataIndex: 'inAppPay',
+      key: 'inAppPay',
+      align: 'center',
+      sorter: (a, b) => a.inAppPay - b.inAppPay
+    },
+    {
+      title: '总播放',
+      dataIndex: 'totalPlay',
+      key: 'totalPlay',
+      align: 'center',
+      sorter: (a, b) => a.totalPlay - b.totalPlay
+    },
+    {
+      title: '有效播放',
+      dataIndex: 'validPlay',
+      key: 'validPlay',
+      align: 'center',
+      sorter: (a, b) => a.validPlay - b.validPlay
+    },
+    {
+      title: 'wifi播放',
+      dataIndex: 'wifiPlay',
+      key: 'wifiPlay',
+      align: 'center',
+      sorter: (a, b) => a.wifiPlay - b.wifiPlay
+    },
+    {
+      title: '播放100%进度总数',
+      dataIndex: 'play100FeedBreak',
+      key: 'play100FeedBreak',
+      align: 'center',
+      sorter: (a, b) => a.play100FeedBreak - b.play100FeedBreak
+    },
+    {
+      title: '播放75%进度总数',
+      dataIndex: 'play75FeedBreak',
+      key: 'play75FeedBreak',
+      align: 'center',
+      sorter: (a, b) => a.play75FeedBreak - b.play75FeedBreak
+    },
+    {
+      title: '评论数',
+      dataIndex: 'comment',
+      key: 'comment',
+      align: 'center',
+      sorter: (a, b) => a.comment - b.comment
+    },
+    {
+      title: '平均次留数',
+      dataIndex: 'nextDayOpen',
+      key: 'nextDayOpen',
+      align: 'center',
+      sorter: (a, b) => a.nextDayOpen - b.nextDayOpen
+    },
+    {
+      title: '平均次留率(%)',
+      dataIndex: 'nextDayOpenRate',
+      key: 'nextDayOpenRate',
+      align: 'center',
+      sorter: (a, b) => a.nextDayOpenRate - b.nextDayOpenRate
+    },
+    {
+      title: '平均次留成本(元)',
+      dataIndex: 'nextDayOpenCost',
+      key: 'nextDayOpenCost',
+      align: 'center',
+      sorter: (a, b) => a.nextDayOpenCost - b.nextDayOpenCost
+    }
+  ]
+  const columnsDetail = [{
+      title: '日期',
+      dataIndex: 'statDate',
+      key: 'statDate',
+      align: 'center'
+    },
+    {
+      title: '花费',
+      dataIndex: 'cost',
+      key: 'cost',
+      align: 'center'
+    },
+    {
+      title: '封面曝光数',
+      dataIndex: 'photoShow',
+      key: 'photoShow',
+      align: 'center'
+    },
+    {
+      title: '封面点击数',
+      dataIndex: 'photoClick',
+      key: 'photoClick',
+      align: 'center'
+    },
+    {
+      title: '素材曝光数',
+      dataIndex: 'aclick',
+      key: 'aclick',
+      align: 'center'
+    },
+    {
+      title: '行为数',
+      dataIndex: 'bclick',
+      key: 'bclick',
+      align: 'center'
+    },
+    {
+      title: '封面点击率',
+      dataIndex: 'photoClickRatio',
+      key: 'photoClickRatio',
+      align: 'center',
+      scopedSlots: {
+        customRender: 'photoClickRatio'
+      }
+    },
+    {
+      title: '行为率',
+      dataIndex: 'actionRatio',
+      key: 'actionRatio',
+      align: 'center',
+      scopedSlots: {
+        customRender: 'actionRatio'
+      }
+    },
+
+    {
+      title: '均千次封面曝光花费(元)',
+      dataIndex: 'impression1kCost',
+      key: 'impression1kCost',
+      scopedSlots: {
+        customRender: 'impression1kCost'
+      },
+      align: 'center'
+    },
+    {
+      title: '平均封面点击单价(元)',
+      dataIndex: 'photoClickCost',
+      key: 'photoClickCost',
+      scopedSlots: {
+        customRender: 'photoClickCost'
+      },
+      align: 'center'
+    },
+    {
+      title: '平均行为单价(元)',
+      dataIndex: 'actionCost',
+      key: 'actionCost',
+      scopedSlots: {
+        customRender: 'actionCost'
+      },
+      align: 'center'
+    },
+    {
+      title: '转化数',
+      dataIndex: 'conversions',
+      key: 'conversions',
+      align: 'center'
+    },
+    {
+      title: '转化单价(元)',
+      dataIndex: 'conversionPrice',
+      key: 'conversionPrice',
+      scopedSlots: {
+        customRender: 'conversionPrice'
+      },
+      align: 'center'
+    }
+  ]
+  export default {
+    name: 'data-display-statistics',
+    components: {
+      ACol,
+      ARow,
+      timeCheck,
+      ratioModal
+    },
+    mixins: [JeecgListMixin],
+    data: function () {
+      return {
+        title: '头条素材大盘报表',
+        columns,
+        columnsDetail,
+        timeList: [],
+        data: [],
+        active: 1,
+        pagin: 1,
+        allValue: [],
+        startValue: [],
+        visible: false,
+        showVideo: false,
+        detail: null,
+        dataDetail: [],
+        dataYestodayDetail: [],
+        dataChainRatio: [],
+        loading: false,
+        rowClick: record => ({
+          // 事件
+          on: {
+            click: () => {
+              // 点击改行时要做的事情
+              // this.detail = record
+              // this.visible = true
+              // this.getMineList(record.signature)
+              this.$refs.ratio.getMineList(record, this.active)
+            }
+          }
+        })
+      }
+    },
+    filters: {
+      formatDate: function (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
+        let h = date.getHours()
+        h = h < 10 ? '0' + h : h
+        let m = date.getMinutes()
+        m = m < 10 ? '0' + m : m
+        let s = date.getSeconds()
+        s = s < 10 ? '0' + s : s
+        return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s
+      },
+      toFixtwo: function (value) {
+        if (value) {
+          return value.toFixed(2)
+        } else {
+          return 0.0
+        }
+      },
+      getBo: function (value) {
+        if (value) {
+          return (value * 100).toFixed(2) + '%'
+        } else {
+          return '0.00%'
+        }
+      }
+    },
+    methods: {
+      handleOk() {
+        this.visible = false
+      },
+      ...mapGetters(['nickname', 'avatar', 'userInfo']),
+      moment,
+      disabledDate(current) {
+        return current && current > moment().endOf('day')
+      },
+      getAdd(checked) {
+        if (checked == 9) {
+          if (this.startValue.length > 0 && this.startValue[0]) {
+            this.allValue[1] = moment(this.startValue[1]._d).format('YYYY-MM-DD')
+            this.allValue[0] = moment(this.startValue[0]._d).format('YYYY-MM-DD')
+          }
+        } else {
+          this.startValue = []
+          this.allValue = []
+        }
+        this.active = checked
+        active = checked
+        this.ipagination.current = 1
+        // this.getList()
+      },
+      getDataResetAll() {
+        this.startValue = []
+        this.allValue = []
+        this.$refs.timeCheck.getAdd(1)
+        this.data = []
+      },
+      getList() {
+        if (this.startValue.length > 0 && this.startValue[0]) {
+          this.data = []
+          this.loading = true
+          var params = {}
+          if (this.active == 9) {
+            params.startDate = this.allValue[0]
+            params.endDate = this.allValue[1]
+          }
+          getAction('/ctop/bytedanceCreativeDailyReport/bytedanceCreativeDailyReportList', params).then(res => {
+            if (res.success) {
+              this.data = res.result.map((item, index) => {
+                return {
+                  key: index,
+                  ...item
+                }
+              })
+              this.loading = false
+              this.ipagination.total = res.result.length
+            } else {
+              this.$message.error(res.message)
+              this.loading = false
+            }
+          })
+        } else {
+          this.$message.error('请选择时间段')
+        }
+
+      },
+      dianji() {
+        this.$router.replace({
+          path: '/Statistics/toutiaoAccountMaterStatistics'
+        })
+      }
+    },
+    watch: {},
+    distoryed() {},
+    updated() {
+      stopOtherVideo()
+    },
+    mounted: function () {
+      this.$nextTick(() => {})
+    }
+  }
+</script>

+ 27 - 1
src/views/ureport/UReportFileList.vue

@@ -18,7 +18,13 @@
         </a-row>
       </a-form>
     </div>
-
+    <a-row :gutter="24" style="margin-bottom:10px">
+        <a-col :md="6" :sm="8">
+        <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+            <a-button type="primary" @click="addData">新增</a-button>
+        </span>
+        </a-col>
+    </a-row>
     <!-- table区域-begin -->
     <div>
       <a-table
@@ -37,6 +43,8 @@
 
           <a-divider type="vertical" />
           <a @click="deleteParams(record)">解绑</a>
+          <a-divider type="vertical" />
+          <a @click="editData(record)">修改</a>
         </span>
       </a-table>
     </div>
@@ -178,6 +186,24 @@ export default {
       this.fileId = item.id
       this.getMemberList(item.id)
     },
+    editData(item) {
+      var url = ''
+      if (process.env.NODE_ENV === 'development') {
+        url = 'http://39.97.120.42:8080/jeecg-boot/ureport/designer?_u=mysql:' + item.name
+      } else if (process.env.NODE_ENV === 'production') {
+        url = 'http://39.97.120.42:8080/jeecg-boot/ureport/designer?_u=mysql:' + item.name
+      }
+      window.open(url, '_blank')
+    },
+    addData(){
+      var url = ''
+      if (process.env.NODE_ENV === 'development') {
+        url = 'http://39.97.120.42:8080/jeecg-boot/ureport/designer'
+      } else if (process.env.NODE_ENV === 'production') {
+        url = 'http://39.97.120.42:8080/jeecg-boot/ureport/designer'
+      }
+      window.open(url, '_blank')
+    },
     getMemberList(id) {
       this.memberList = []
       httpAction('/ctop/uReportFileBindUser/userList', { fileId: id }, 'post').then(res => {

+ 2 - 2
vue.config.js

@@ -65,9 +65,9 @@ module.exports = {
        },*/
       '/jeecg-boot': {
         // target: 'http://39.97.120.42:8080', //请求本地 需要jeecg-boot后台项目  生产环境
-        // target: 'http://39.106.184.70:8080', //请求本地 需要jeecg-boot后台项目
+        target: 'http://39.106.184.70:8080', //请求本地 需要jeecg-boot后台项目
         // target: 'http://192.168.2.143:8080', //请求本地 需要jeecg-boot后台项目  蒙蒙
-        target: 'http://192.168.2.118:8080', //请求本地 需要jeecg-boot后台项目  英豪
+        // target: 'http://192.168.2.118:8080', //请求本地 需要jeecg-boot后台项目  英豪
         // target: 'http://192.168.2.132:8080', //请求本地 需要jeecg-boot后台项目
         // target: 'http://192.168.2.115:8080', //请求本地 需要jeecg-boot后台项目  祚云
         // target: 'http://192.168.2.132:8080', //请求本地 需要jeecg-boot后台项目  孙震