Ver Fonte

Merge branch 'master' into jiaoyang

朱鑫波 há 4 anos atrás
pai
commit
f0165749b5
60 ficheiros alterados com 8047 adições e 1413 exclusões
  1. 3 0
      package.json
  2. 93 58
      src/components/ChartCard.vue
  3. 39 3
      src/filters.js
  4. 1 1
      src/views/modules/BatchCreate/TouTiaoBatch.vue
  5. 1 1
      src/views/modules/BatchCreate/newCreate.vue
  6. 1 1
      src/views/modules/BatchCreate/newDirectedPackage.vue
  7. 0 1
      src/views/modules/BatchCreate/newPlan.vue
  8. 0 1
      src/views/modules/LaunchHousekeeper/newProject.vue
  9. 0 1
      src/views/modules/LaunchHousekeeper/setProjectBudget.vue
  10. 0 1
      src/views/modules/LaunchHousekeeper/setProjectConvert.vue
  11. 0 1
      src/views/modules/LaunchHousekeeper/setProjectCreate.vue
  12. 0 1
      src/views/modules/LaunchHousekeeper/setProjectDirectional.vue
  13. 1 1
      src/views/modules/Statistics/KSAccountReport.vue
  14. 1 1
      src/views/modules/Statistics/accountReport.vue
  15. 1 0
      src/views/modules/Statistics/components/Treeselect.vue
  16. BIN
      src/views/modules/Statistics/materialReport/image/1.png
  17. BIN
      src/views/modules/Statistics/materialReport/image/2.png
  18. BIN
      src/views/modules/Statistics/materialReport/image/3.png
  19. BIN
      src/views/modules/Statistics/materialReport/image/4.png
  20. BIN
      src/views/modules/Statistics/materialReport/image/5.png
  21. 801 0
      src/views/modules/Statistics/materialReport/marterialDetail.vue
  22. 758 0
      src/views/modules/Statistics/materialReport/marterialList.vue
  23. 706 0
      src/views/modules/Statistics/materialReport/marterialTtList.vue
  24. 923 458
      src/views/modules/Statistics/materialReport/materialReport.vue
  25. 0 1
      src/views/modules/Statistics/mediaReport.vue
  26. 6 1
      src/views/modules/Statistics/refuseDataCreatNew.vue
  27. 1 1
      src/views/modules/advertiser/ProjectMemberList.vue
  28. 1 2
      src/views/modules/advertiser/UserAllocationList.vue
  29. 14 4
      src/views/modules/advertiser/modules/ProjectModal.vue
  30. 0 154
      src/views/modules/advertiser/modules/Treeselect.vue
  31. 759 0
      src/views/modules/autoLaunch/accelerateExplorationList.vue
  32. 1 1
      src/views/modules/autoLaunch/appIdList.vue
  33. 1 1
      src/views/modules/autoLaunch/autoLaunchReport.vue
  34. 168 68
      src/views/modules/autoLaunch/configLaunchInfo.vue
  35. 32 2
      src/views/modules/autoLaunch/configLaunchList.vue
  36. 0 1
      src/views/modules/autoLaunch/createStrategy.vue
  37. 1 1
      src/views/modules/autoLaunch/groupList.vue
  38. 1 1
      src/views/modules/autoLaunch/materialAndBid.vue
  39. 0 1
      src/views/modules/autoLaunch/newAppId.vue
  40. 1 1
      src/views/modules/autoLaunch/planList.vue
  41. 0 1
      src/views/modules/autoLaunch/setDirectional.vue
  42. 1 1
      src/views/modules/autoLaunch/strategyList.vue
  43. 1569 0
      src/views/modules/columnConst/stockWatch.js
  44. 21 39
      src/views/modules/earlyWarningRules/pushTreeSelect.vue
  45. 1 1
      src/views/modules/kuaishouapp/account/accountIndex.vue
  46. 39 34
      src/views/modules/kuaishouapp/account/editGroup.vue
  47. 39 35
      src/views/modules/kuaishouapp/account/editGroupNew.vue
  48. 1 1
      src/views/modules/kuaishouapp/batchCreation/campaignList.vue
  49. 590 0
      src/views/modules/kuaishouapp/newBatch/result.vue
  50. 0 1
      src/views/modules/kuaishouapp/populationAnalysis/index.vue
  51. 1 1
      src/views/modules/material/musicTab.vue
  52. 1293 478
      src/views/modules/stockWatch/accountPage.vue
  53. 9 4
      src/views/modules/stockWatch/modules/customColumn.vue
  54. 58 4
      src/views/modules/stockWatch/modules/selectComponent.vue
  55. 1 1
      src/views/modules/workBench/designLeader/index.vue
  56. 2 9
      src/views/modules/workBench/designLeader/platForm.vue
  57. 85 22
      src/views/modules/workBench/orderDetail.vue
  58. 3 3
      src/views/modules/workBench/placeOrder.vue
  59. 17 6
      src/views/system/modules/UserModal.vue
  60. 2 2
      vue.config.js

+ 3 - 0
package.json

@@ -12,17 +12,20 @@
   "dependencies": {
     "@antv/data-set": "^0.10.2",
     "@femessage/upload-to-ali": "^1.8.1",
+    "@jeecg/antd-online-beta220": "^1.0.1",
     "@riophae/vue-treeselect": "^0.4.0",
     "@tinymce/tinymce-vue": "^2.0.0",
     "ali-oss": "^6.1.1",
     "ant-design-vue": "^1.3.9",
     "apexcharts": "^3.6.5",
+    "area-data": "^5.0.6",
     "axios": "^0.18.0",
     "babel-loader": "^8.0.6",
     "blueimp-md5": "^2.11.0",
     "browser-md5-file": "^1.1.1",
     "clipboard": "^2.0.4",
     "codemirror": "^5.46.0",
+    "core-js": "^2.6.12",
     "cos-js-sdk-v5": "^0.5.26",
     "dayjs": "^1.8.0",
     "echarts": "^4.9.0",

+ 93 - 58
src/components/ChartCard.vue

@@ -7,7 +7,12 @@
           <slot name="action"></slot>
         </span>
       </div>
-      <div class="total"><span>{{ total }}</span></div>
+      <div class="total" style="display: flex; justify-content: space-between">
+        <span>{{ total }}</span>
+        <span>
+          <slot name="percentage"></slot>
+        </span>
+      </div>
     </div>
     <div class="chart-card-content">
       <div class="content-fix">
@@ -23,79 +28,93 @@
 </template>
 
 <script>
-  export default {
-    name: "ChartCard",
-    props: {
-      title: {
-        type: String,
-        default: ''
-      },
-      total: {
-        type: String,
-        default: ''
-      },
-      loading: {
-        type: Boolean,
-        default: false
-      }
-    }
-  }
+export default {
+  name: 'ChartCard',
+  props: {
+    title: {
+      type: String,
+      default: '',
+    },
+    total: {
+      type: String,
+      default: '',
+    },
+    loading: {
+      type: Boolean,
+      default: false,
+    },
+  },
+}
 </script>
 
 <style lang="scss" scoped>
-  .chart-card-header {
+.chart-card-header {
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+
+  .meta {
     position: relative;
     overflow: hidden;
     width: 100%;
-
-    .meta {
-      position: relative;
-      overflow: hidden;
-      width: 100%;
-      color: rgba(0, 0, 0, .45);
-      font-size: 14px;
-      line-height: 22px;
-    }
+    color: rgba(0, 0, 0, 0.45);
+    font-size: 14px;
+    line-height: 22px;
   }
+}
 
-  .chart-card-action {
-    cursor: pointer;
-    position: absolute;
-    top: 0;
-    right: 0;
-  }
+.chart-card-action {
+  cursor: pointer;
+  position: absolute;
+  top: 0;
+  right: 0;
+}
 
-  .chart-card-footer {
-    border-top: 1px solid #e8e8e8;
-    padding-top: 9px;
-    margin-top: 8px;
+.chart-card-footer {
+  border-top: 1px solid #e8e8e8;
+  padding-top: 9px;
+  margin-top: 8px;
 
-    > * {
-      position: relative;
-    }
+  > * {
+    position: relative;
+  }
 
-    .field {
-      white-space: nowrap;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      margin: 0;
-    }
+  .field {
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    margin: 0;
   }
+}
 
-  .chart-card-content {
-    margin-bottom: 12px;
-    position: relative;
-    height: 46px;
-    width: 100%;
+.chart-card-content {
+  margin-bottom: 12px;
+  position: relative;
+  height: 46px;
+  width: 100%;
 
-    .content-fix {
-      position: absolute;
-      left: 0;
-      bottom: 0;
-      width: 100%;
-    }
+  .content-fix {
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 100%;
   }
+}
+
+.total {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  word-break: break-all;
+  white-space: nowrap;
+  color: #000;
+  margin-top: 4px;
+  margin-bottom: 0;
+  font-size: 30px;
+  line-height: 38px;
+  height: 38px;
+}
 
+@media (min-width: 1600px) {
   .total {
     overflow: hidden;
     text-overflow: ellipsis;
@@ -108,4 +127,20 @@
     line-height: 38px;
     height: 38px;
   }
+}
+
+@media (max-width: 1599px) {
+  .total {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    word-break: break-all;
+    white-space: nowrap;
+    color: #000;
+    margin-top: 4px;
+    margin-bottom: 0;
+    font-size: 18px;
+    line-height: 38px;
+    height: 38px;
+  }
+}
 </style>

+ 39 - 3
src/filters.js

@@ -76,6 +76,42 @@ const filters = {
         s = s < 10 ? '0' + s : s
         return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s
     },
+    //时间秒转化为时间格式
+    formatS: function (s) {
+        var sTime = parseInt(s);// 秒
+        var mTime = 0;// 分
+        var hTime = 0;// 时
+        if (sTime > 60) {//如果秒数大于60,将秒数转换成整数
+            //获取分钟,除以60取整数,得到整数分钟
+            mTime = parseInt(sTime / 60);
+            //获取秒数,秒数取佘,得到整数秒数
+            sTime = parseInt(sTime % 60);
+            //如果分钟大于60,将分钟转换成小时
+            if (mTime > 60) {
+                //获取小时,获取分钟除以60,得到整数小时
+                hTime = parseInt(mTime / 60);
+                //获取小时后取佘的分,获取分钟除以60取佘的分
+                mTime = parseInt(mTime % 60);
+            }
+        }
+        var result = '';
+        if (sTime >= 0 && sTime < 10) {
+            result = "0" + parseInt(sTime) + "";
+        } else {
+            result = "" + parseInt(sTime) + "";
+        }
+        if (mTime >= 0 && mTime < 10) {
+            result = "0" + parseInt(mTime) + ":" + result;
+        } else {
+            result = "" + parseInt(mTime) + ":" + result;
+        }
+        if (hTime >= 0 && hTime < 10) {
+            result = "0" + parseInt(hTime) + ":" + result;
+        } else {
+            result = "" + parseInt(hTime) + ":" + result;
+        }
+        return result;
+    },
     //bidType类型
     bidType(sta) {
         var data = {
@@ -107,9 +143,9 @@ const filters = {
             324: '唤起应用',
             715: '微信复制优化目标',
             716: '多转化事件',
-            396:'注册优化目标',
-            731:'广告观看5次',
-            732:'广告观看10次',
+            396: '注册优化目标',
+            731: '广告观看5次',
+            732: '广告观看10次',
         }
         return data[sta]
     },

+ 1 - 1
src/views/modules/BatchCreate/TouTiaoBatch.vue

@@ -1675,7 +1675,7 @@ export default {
 
     }
     
-    .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+    .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 1 - 1
src/views/modules/BatchCreate/newCreate.vue

@@ -825,7 +825,7 @@
 }
 
   .ant-tooltip-inner,
-  .ant-tooltip,
+
   .ant-tooltip-arrow::before {
     background-color: #fff;
     color: #333;

+ 1 - 1
src/views/modules/BatchCreate/newDirectedPackage.vue

@@ -362,7 +362,7 @@
             }
         }
     }
-    .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+    .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #666;
         font-size: 12px;

+ 0 - 1
src/views/modules/BatchCreate/newPlan.vue

@@ -1335,7 +1335,6 @@ export default {
 
 
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 0 - 1
src/views/modules/LaunchHousekeeper/newProject.vue

@@ -547,7 +547,6 @@ export default {
 
 
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 0 - 1
src/views/modules/LaunchHousekeeper/setProjectBudget.vue

@@ -555,7 +555,6 @@ export default {
 
 
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 0 - 1
src/views/modules/LaunchHousekeeper/setProjectConvert.vue

@@ -585,7 +585,6 @@ export default {
 
 
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 0 - 1
src/views/modules/LaunchHousekeeper/setProjectCreate.vue

@@ -1292,7 +1292,6 @@ let MonitoringTypeColumns=[
 }
 
   .ant-tooltip-inner,
-  .ant-tooltip,
   .ant-tooltip-arrow::before {
     background-color: #fff;
     color: #333;

+ 0 - 1
src/views/modules/LaunchHousekeeper/setProjectDirectional.vue

@@ -857,7 +857,6 @@ export default {
 
 
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 1 - 1
src/views/modules/Statistics/KSAccountReport.vue

@@ -1424,7 +1424,7 @@ export default {
 }
 </script>
 <style lang="scss">
-     .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+     .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 1 - 1
src/views/modules/Statistics/accountReport.vue

@@ -1350,7 +1350,7 @@ export default {
 }
 </script>
 <style lang="scss">
-     .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+     .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 1 - 0
src/views/modules/Statistics/components/Treeselect.vue

@@ -117,6 +117,7 @@ export default {
         }
       },
       deep: true,
+      immediate:true
     },
   },
   methods: {

BIN
src/views/modules/Statistics/materialReport/image/1.png


BIN
src/views/modules/Statistics/materialReport/image/2.png


BIN
src/views/modules/Statistics/materialReport/image/3.png


BIN
src/views/modules/Statistics/materialReport/image/4.png


BIN
src/views/modules/Statistics/materialReport/image/5.png


+ 801 - 0
src/views/modules/Statistics/materialReport/marterialDetail.vue

@@ -0,0 +1,801 @@
+<style lang="scss" scoped>
+#office-iframe {
+  height: 800px;
+}
+</style>
+<style>
+.info-detail .ant-descriptions-item-content {
+  font-weight: bold;
+}
+.info-detail .ant-descriptions-item-label {
+  color: darkgray;
+  min-width: 80px;
+}
+.info-detail table tr td {
+  border: 0;
+}
+.show-data p {
+  color: black;
+  font-weight: 600;
+}
+.show-data p span {
+  display: inline-block;
+  width: 85px;
+  color: slategrey;
+  font-weight: 500;
+}
+</style>
+<template>
+  <a-row :gutter="10">
+    <a-spin :spinning="spinning">
+      <a-col :sm="6" style="margin-bottom: 20px; z-index: 10">
+        <a-card
+          style="min-height: 100px"
+          :style="{
+            width: (clientWidth / 24) * 6 - 10 + 'px',
+          }"
+        >
+          <video class="video" :src="materialInfo.url" controls="controls" style="width: 100%" v-if="materialInfo">
+            您的浏览器不支持 video 标签。
+          </video>
+          <img :src="noImg" alt="" v-else style="width: 100%" />
+        </a-card>
+      </a-col>
+      <a-col :sm="18" style="margin-bottom: 20px; z-index: 10">
+        <a-card class="info-detail" style="min-height: 300px">
+          <a-descriptions title="视频信息" v-if="materialInfo">
+            <a-descriptions-item label="素材标题" :span="3">
+              {{ materialInfo.materialName ? materialInfo.materialName : '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="素材ID">
+              {{ materialInfo.materialId ? materialInfo.materialId : '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="上线时间">
+              {{ materialInfo.createTime ? materialInfo.createTime.split(' ')[0] : '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="素材类型">
+              {{
+                materialInfo.materialType ? (materialInfo.materialType == '' ? '无' : materialInfo.materialType) : '-'
+              }}
+            </a-descriptions-item>
+            <a-descriptions-item label="视频时长">
+              <span v-if="materialInfo.second">
+                {{ materialInfo.second | formatS }}
+              </span>
+              <span v-else>-</span>
+            </a-descriptions-item>
+            <a-descriptions-item label="视频大小">
+              {{ materialInfo.size ? materialInfo.size : '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="视频尺寸">
+              {{ materialInfo.width ? materialInfo.width + '*' + materialInfo.height : '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="投放媒体">
+              {{ materialInfo.madia || '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="素材渠道">
+              {{ materialInfo.channelType || '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="供应商">
+              {{ materialInfo.supplier || '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="关联项目">
+              {{ materialInfo.projectName || '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="唯一编码" :span="2">
+              {{ materialInfo.code || '-' }}
+            </a-descriptions-item>
+
+            <a-descriptions-item label="设计组长" :span="3" style="margin-top: 10px">
+              {{ materialInfo.leaderName || '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="编导">
+              {{ materialInfo.planName ? (materialInfo.planName == '' ? '无' : materialInfo.planName) : '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="拍摄">
+              {{ materialInfo.shotName ? (materialInfo.shotName == '' ? '无' : materialInfo.shotName) : '-' }}
+            </a-descriptions-item>
+            <a-descriptions-item label="剪辑">
+              {{ materialInfo.clipName ? (materialInfo.clipName == '' ? '无' : materialInfo.clipName) : '-' }}
+            </a-descriptions-item>
+          </a-descriptions>
+        </a-card>
+        <a-card style="min-height: 300px; margin: 10px 0" v-if="dataView && mediaId == 2">
+          <div
+            style="
+              margin-bottom: 20px;
+              color: rgba(0, 0, 0, 0.85);
+              font-weight: bold;
+              font-size: 16px;
+              line-height: 1.5;
+            "
+          >
+            数据概览
+          </div>
+          <a-row :gutter="15">
+            <a-col :xl="6" class="show-data">
+              <h3>素材消耗</h3>
+              <p
+                :style="{ color: dataView.charge[0].charge >= dataView.charge[2].charge ? '#F66C6D' : '#67C239' }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.charge[0].charge | decimalsHandle }}
+              </p>
+              <p><span>项目top</span>{{ dataView.charge[1].charge | decimalsHandle }}</p>
+              <p><span>素材库均值</span>{{ dataView.charge[2].charge | decimalsHandle }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>封面曝光数</h3>
+              <p
+                :style="{
+                  color: dataView.photoShow[0].photoShow >= dataView.photoShow[2].photoShow ? '#F66C6D' : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.photoShow[0].photoShow }}
+              </p>
+              <p><span>项目top</span>{{ dataView.photoShow[1].photoShow }}</p>
+              <p><span>素材库均值</span>{{ dataView.photoShow[2].photoShow }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>封面点击数</h3>
+              <p
+                :style="{
+                  color: dataView.photoClick[0].photoClick >= dataView.photoClick[2].photoClick ? '#F66C6D' : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.photoClick[0].photoClick }}
+              </p>
+              <p><span>项目top</span>{{ dataView.photoClick[1].photoClick }}</p>
+              <p><span>素材库均值</span>{{ dataView.photoClick[2].photoClick }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>素材曝光数</h3>
+              <p
+                :style="{ color: dataView.aclick[0].aclick >= dataView.aclick[2].aclick ? '#F66C6D' : '#67C239' }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.aclick[0].aclick }}
+              </p>
+              <p><span>项目top</span>{{ dataView.aclick[1].aclick }}</p>
+              <p><span>素材库均值</span>{{ dataView.aclick[2].aclick }}</p>
+            </a-col>
+          </a-row>
+          <a-row :gutter="15" style="margin-top: 20px">
+            <a-col :xl="6" class="show-data">
+              <h3>行为数</h3>
+              <p
+                :style="{ color: dataView.bclick[0].bclick >= dataView.bclick[2].bclick ? '#F66C6D' : '#67C239' }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.bclick[0].bclick }}
+              </p>
+              <p><span>项目top</span>{{ dataView.bclick[1].bclick }}</p>
+              <p><span>素材库均值</span>{{ dataView.bclick[2].bclick }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>激活数</h3>
+              <p
+                :style="{
+                  color: dataView.activation[0].activation >= dataView.activation[2].activation ? '#F66C6D' : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.activation[0].activation }}
+              </p>
+              <p><span>项目top</span>{{ dataView.activation[1].activation }}</p>
+              <p><span>素材库均值</span>{{ dataView.activation[2].activation }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>3s播放率</h3>
+              <p
+                :style="{
+                  color: dataView.play3sRate[0].play3sRate >= dataView.play3sRate[2].play3sRate ? '#F66C6D' : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ (dataView.play3sRate[0].play3sRate * 100).toFixed(2) + '%' }}
+              </p>
+              <p><span>项目top</span>{{ (dataView.play3sRate[1].play3sRate * 100).toFixed(2) + '%' }}</p>
+              <p><span>素材库均值</span>{{ (dataView.play3sRate[2].play3sRate * 100).toFixed(2) + '%' }}</p>
+            </a-col>
+          </a-row>
+        </a-card>
+        <a-card style="min-height: 300px; margin: 10px 0" v-if="dataView && mediaId == 1">
+          <div
+            style="
+              margin-bottom: 20px;
+              color: rgba(0, 0, 0, 0.85);
+              font-weight: bold;
+              font-size: 16px;
+              line-height: 1.5;
+            "
+          >
+            数据概览
+          </div>
+          <a-row :gutter="15">
+            <a-col :xl="6" class="show-data">
+              <h3>素材消耗</h3>
+              <p
+                :style="{ color: dataView.cost[0].cost >= dataView.cost[2].cost ? '#F66C6D' : '#67C239' }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.cost[0].cost | decimalsHandle }}
+              </p>
+              <p><span>项目top</span>{{ dataView.cost[1].cost | decimalsHandle }}</p>
+              <p><span>素材库均值</span>{{ dataView.cost[2].cost | decimalsHandle }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>点击数</h3>
+              <p
+                :style="{
+                  color: dataView.click[0].click >= dataView.click[2].click ? '#F66C6D' : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.click[0].click }}
+              </p>
+              <p><span>项目top</span>{{ dataView.click[1].click }}</p>
+              <p><span>素材库均值</span>{{ dataView.click[2].click }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>曝光数</h3>
+              <p
+                :style="{
+                  color:
+                    dataView.materialShow[0].materialShow >= dataView.materialShow[2].materialShow
+                      ? '#F66C6D'
+                      : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.materialShow[0].materialShow }}
+              </p>
+              <p><span>项目top</span>{{ dataView.materialShow[1].materialShow }}</p>
+              <p><span>素材库均值</span>{{ dataView.materialShow[2].materialShow }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>完播率</h3>
+              <p
+                :style="{
+                  color:
+                    dataView.play100Rate[0].play100Rate >= dataView.play100Rate[2].play100Rate ? '#F66C6D' : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ (dataView.play100Rate[0].play100Rate * 100).toFixed(2) + '%' }}
+              </p>
+              <p><span>项目top</span>{{ (dataView.play100Rate[1].play100Rate * 100).toFixed(2) + '%' }}</p>
+              <p><span>素材库均值</span>{{ (dataView.play100Rate[2].play100Rate * 100).toFixed(2) + '%' }}</p>
+            </a-col>
+          </a-row>
+          <a-row :gutter="15" style="margin-top: 20px">
+            <a-col :xl="6" class="show-data">
+              <h3>点赞数</h3>
+              <p
+                :style="{
+                  color:
+                    dataView.likeMaterial[0].likeMaterial >= dataView.likeMaterial[2].likeMaterial
+                      ? '#F66C6D'
+                      : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.likeMaterial[0].likeMaterial }}
+              </p>
+              <p><span>项目top</span>{{ dataView.likeMaterial[1].likeMaterial }}</p>
+              <p><span>素材库均值</span>{{ dataView.likeMaterial[2].likeMaterial }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>评论数</h3>
+              <p
+                :style="{
+                  color:
+                    dataView.commentMaterial[0].commentMaterial >= dataView.commentMaterial[2].commentMaterial
+                      ? '#F66C6D'
+                      : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.commentMaterial[0].commentMaterial }}
+              </p>
+              <p><span>项目top</span>{{ dataView.commentMaterial[1].commentMaterial }}</p>
+              <p><span>素材库均值</span>{{ dataView.commentMaterial[2].commentMaterial }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>转发数</h3>
+              <p
+                :style="{
+                  color:
+                    dataView.shareMaterial[0].shareMaterial >= dataView.shareMaterial[2].shareMaterial
+                      ? '#F66C6D'
+                      : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.shareMaterial[0].shareMaterial }}
+              </p>
+              <p><span>项目top</span>{{ dataView.shareMaterial[1].shareMaterial }}</p>
+              <p><span>素材库均值</span>{{ dataView.shareMaterial[2].shareMaterial }}</p>
+            </a-col>
+            <a-col :xl="6" class="show-data">
+              <h3>关注数</h3>
+              <p
+                :style="{
+                  color: dataView.follow[0].follow >= dataView.follow[2].follow ? '#F66C6D' : '#67C239',
+                }"
+                style="font-size: 18px; font-weight: 700"
+              >
+                {{ dataView.follow[0].follow }}
+              </p>
+              <p><span>项目top</span>{{ dataView.follow[1].follow }}</p>
+              <p><span>素材库均值</span>{{ dataView.follow[2].follow }}</p>
+            </a-col>
+          </a-row>
+        </a-card>
+        <a-card style="min-height: 300px">
+          <div
+            style="
+              margin-bottom: 20px;
+              color: rgba(0, 0, 0, 0.85);
+              font-weight: bold;
+              font-size: 16px;
+              line-height: 1.5;
+            "
+          >
+            数据消耗趋势
+          </div>
+          <div
+            id="echartCircular"
+            ref="echartCircular"
+            style="height: 350px"
+            :style="{ width: (clientWidth / 24) * 18 - 48 - 24 + 'px' }"
+          ></div
+        ></a-card>
+        <!-- <a-card class="search-box" style="min-height: 300px; margin: 20px 0"> </a-card> -->
+      </a-col>
+    </a-spin>
+  </a-row>
+</template>
+
+<script>
+import { getAction, postAction } from '@/api/manage'
+import moment from 'moment'
+import $ from 'jquery'
+import qs from 'qs'
+import UploadToAli from '@femessage/upload-to-ali'
+import uploadFile from '@/components/uploadFile.vue'
+import { mapActions, mapGetters, mapState } from 'vuex'
+var echarts = require('echarts')
+export default {
+  name: 'online-training-list',
+  data() {
+    return {
+      noImg: require('@/assets/noImg.png'),
+      materialInfo: null,
+      dataView: null,
+      clientWidth: 1920,
+      spinning: false,
+      scrollTopAll: 0,
+      scrollTop: 124,
+      mediaId: 0,
+    }
+  },
+  components: {
+    UploadToAli,
+    uploadFile,
+  },
+  watch: {
+    $route: function (n, o) {
+      if (n.query.md5 != o.query.md5 || n.path != o.path) {
+        this.getMaterialInfo()
+      }
+    },
+  },
+  methods: {
+    handlerEchartOption(data) {
+      var option = {
+        noDataLoadingOption: {
+          text: '暂无数据',
+          effect: 'bubble',
+          effectOption: {
+            effect: {
+              n: 0,
+            },
+          },
+        },
+        // title: {
+        //     text: '折线图堆叠'
+        // },
+        tooltip: {
+          trigger: 'axis',
+        },
+        // legend: {
+        //     data: ['邮件营销', '联盟广告', ]
+        // },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {
+          icon: 'circle',
+          top: '5%',
+          right: '5%',
+          itemWidth: 6,
+          itemGap: 20,
+          textStyle: {
+            color: '#556677',
+          },
+        },
+        toolbox: {
+          // feature: {
+          //     saveAsImage: {}
+          // }
+        },
+        xAxis: {
+          type: 'category',
+          data: data.map((item) => {
+            return item.statDate
+          }),
+          boundaryGap: false,
+          // 坐标轴线
+          axisLine: {
+            show: false,
+            lineStyle: {
+              color: '#999',
+            },
+          },
+          // 分割线
+          splitLine: {
+            show: true,
+            lineStyle: {
+              type: 'dashed',
+              color: '#e5e5e5',
+            },
+          },
+        },
+        yAxis: {
+          type: 'value',
+          axisLine: {
+            show: false,
+            lineStyle: {
+              color: '#999',
+            },
+          },
+          splitLine: {
+            lineStyle: {
+              type: 'dashed',
+              color: '#e5e5e5',
+            },
+          },
+        },
+        series: [
+          {
+            smooth: true,
+            name: '消耗',
+            type: 'line',
+            stack: '总量',
+            data: data.map((item) => {
+              return item.cost.toFixed(3)
+            }),
+            symbol: 'circle',
+            symbolSize: 6,
+            lineStyle: {
+              normal: {
+                width: 2,
+                // color: '#0bcd74'
+              },
+            },
+            itemStyle: {
+              borderColor: '#ffffff',
+              borderWidth: 0,
+            },
+          },
+        ],
+      }
+
+      return option
+    },
+    initEchart(idName, optionName) {
+      var that = this
+      const chart = this.$refs[idName]
+      //   console.log(chart)
+      if (chart) {
+        const myChart = echarts.init(document.getElementById(idName))
+        // myChart.showLoading({
+        //     text: "图表数据正在努力加载..."
+        // });
+
+        myChart.setOption(optionName)
+        window.addEventListener('resize', function () {
+          that.clientWidth = document.documentElement.clientWidth - 224
+          myChart.resize()
+        })
+      }
+    },
+    getKuaishou() {
+      var data = JSON.parse(localStorage.getItem('videoInfo'))
+      var params = {
+        mediaId: data.mediaId,
+        md5: data.md5,
+      }
+      var that = this
+      var getProjectIdByMd5 = new Promise(function (resolve, reject) {
+        that.postDataAction('/overView/getProjectIdByMd5', params).then((res) => {
+          if (res.success) {
+            var materialDetailCharge = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailCharge', { md5: data.md5, projectId: res.result })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailPhotoShow = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailPhotoShow', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailPhotoClick = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailPhotoClick', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailAClick = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailAClick', { md5: data.md5, projectId: res.result })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailBClick = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailBClick', { md5: data.md5, projectId: res.result })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailActivation = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailActivation', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailPlay3sRate = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailPlay3sRate', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            Promise.all([
+              materialDetailPlay3sRate,
+              materialDetailCharge,
+              materialDetailPhotoShow,
+              materialDetailPhotoClick,
+              materialDetailAClick,
+              materialDetailBClick,
+              materialDetailActivation,
+            ]).then((item) => {
+              // dataView
+              that.spinning = false
+              that.dataView = {}
+              for (let i = 0; i < item.length; i++) {
+                for (const key in item[i]) {
+                  that.dataView[key] = item[i][key]
+                }
+              }
+            })
+          }
+        })
+      })
+    },
+    getToutiao() {
+      var data = JSON.parse(localStorage.getItem('videoInfo'))
+      var params = {
+        mediaId: data.mediaId,
+        md5: data.md5,
+      }
+      var that = this
+      var getProjectIdByMd5 = new Promise(function (resolve, reject) {
+        that.postDataAction('/overView/getProjectIdByMd5', params).then((res) => {
+          if (res.success) {
+            var materialDetailMaterialShow = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailMaterialShow', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailCost = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailCost', { md5: data.md5, projectId: res.result })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailClick = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailClick', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailPlay100Rate = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailPlay100Rate', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailLikeMaterial = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailLikeMaterial', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailCommentMaterial = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailCommentMaterial', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailShareMaterial = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailShareMaterial', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            var materialDetailFollow = new Promise(function (resolve, reject) {
+              that
+                .postDataAction('/overView/materialDetailFollow', {
+                  md5: data.md5,
+                  projectId: res.result,
+                })
+                .then((res) => {
+                  if (res.success) {
+                    resolve(res.result)
+                  }
+                })
+            })
+            Promise.all([
+              materialDetailCost,
+              materialDetailClick,
+              materialDetailMaterialShow,
+              materialDetailPlay100Rate,
+              materialDetailLikeMaterial,
+              materialDetailCommentMaterial,
+              materialDetailShareMaterial,
+              materialDetailFollow,
+            ]).then((item) => {
+              // dataView
+              console.log(item)
+              that.spinning = false
+              that.dataView = {}
+              for (let i = 0; i < item.length; i++) {
+                for (const key in item[i]) {
+                  that.dataView[key] = item[i][key]
+                }
+              }
+            })
+          }
+        })
+      })
+    },
+    getMaterialInfo() {
+      var data = JSON.parse(localStorage.getItem('videoInfo'))
+      this.spinning = true
+      var params = {
+        mediaId: data.mediaId,
+        md5: data.md5,
+      }
+      this.postDataAction('/overView/materialDetailInfo', params).then((res) => {
+        if (res.success) {
+          if (res.result) {
+            this.materialInfo = res.result
+          } else {
+            // this.$error({
+            //   title: '页面数据加载出错',
+            //   content: '该视频未上传公司素材库,请重新上传之后,可展示视频信息',
+            // })
+          }
+        }
+      })
+      if (data.mediaId == 1) {
+        this.getToutiao()
+      } else if (data.mediaId == 2) {
+        this.getKuaishou()
+      }
+
+      this.postDataAction('/overView/materialDetailChat', params).then((res) => {
+        if (res.success) {
+          this.initEchart('echartCircular', this.handlerEchartOption(res.result))
+        }
+      })
+    },
+    handleScroll() {
+      var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
+      this.scrollTop = scrollTop
+    },
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.mediaId = JSON.parse(localStorage.getItem('videoInfo')).mediaId
+      window.addEventListener('scroll', this.handleScroll)
+      this.clientWidth = document.documentElement.clientWidth - 224
+      //   this.$route.query.mediaId
+      //   this.$route.query.md5
+      this.getMaterialInfo()
+    })
+  },
+  created() {},
+}
+</script>

+ 758 - 0
src/views/modules/Statistics/materialReport/marterialList.vue

@@ -0,0 +1,758 @@
+<style>
+.materialReport .chart-card-content {
+  display: none !important;
+}
+</style>
+<style scoped>
+.top-ul-style {
+  width: 100%;
+  padding-left: 0;
+}
+.top-ul-style li {
+  height: 100px;
+  border: 1px solid #f2f2f2;
+  margin-bottom: 5px;
+  padding: 10px;
+  display: flex;
+  justify-content: space-between;
+}
+.li-cost {
+  display: flex;
+  flex-flow: column;
+  justify-content: center;
+  align-content: flex-end;
+}
+.li-cost span {
+  font-size: 16px;
+  font-weight: 500;
+  min-width: 50px;
+  text-align: right;
+}
+</style>
+<template>
+  <div class="materialReport">
+    <div class="card-container">
+      <div class="option" style="justify-content: space-between">
+        <div class="option" style="padding: 0">
+          <div class="item">
+            <span>唯一编码</span>
+            <a-input style="width: 300px" v-model="md5"></a-input>
+          </div>
+        </div>
+
+        <div class="item" style="float: right">
+          <a-button @click="handleSubmit" type="primary" :loading="videoloading">搜索</a-button>
+          <a-button @click="resetSubmit" style="margin-left: 15px" :loading="resetLoading">重置</a-button>
+        </div>
+      </div>
+    </div>
+    <a-row :gutter="24" style="margin-top: 20px">
+      <a-col :xl="24">
+        <a-card title="数据列表" style="width: 100%; min-height: 700px" :bordered="false">
+          <div class="tableTop" style="text-align: end; margin: 0 0 15px 0">
+            <a-button
+              type="primary"
+              class="export"
+              @click="exportExcel"
+              style="margin-right: 10px"
+              :loading="excelLoading"
+              >导出报表</a-button
+            >
+            <a-button type="primary" class="add" @click="customColumns">自定义列</a-button>
+          </div>
+          <a-table
+            size="middle"
+            :columns="columns"
+            :dataSource="tableData"
+            bordered
+            id="outTable"
+            :pagination="ipagination"
+            :scroll="{ x: scrollX }"
+            :loading="loading"
+            ref="accountTable"
+            :customRow="rowClick"
+            :width="tableWidth"
+            @change="sort"
+            style="word-break: break-all; font-size: 16px; font-weight: 600"
+          >
+            <span slot="coverUrl" slot-scope="text, records">
+              <img
+                :src="text || noImg"
+                alt=""
+                style="width: 100%; height: auto"
+                @click.stop="
+                  visibleVideo = true
+                  videoUrlShow = records.url
+                "
+              />
+            </span>
+            <span slot="ctr" slot-scope="ctr">{{ ctr | toPercentage }}</span>
+            <span slot="cost" slot-scope="cost">{{ cost | decimalsHandle }}</span>
+            <span slot="clickMaterial" slot-scope="clickMaterial">{{ clickMaterial | formatCurrency }}</span>
+            <span slot="showMaterial" slot-scope="showMaterial">{{ showMaterial | formatCurrency }}</span>
+            <span slot="convertMaterial" slot-scope="convertMaterial">{{ convertMaterial | formatCurrency }}</span>
+            <span slot="play25FeedBreak" slot-scope="play25FeedBreak">{{ play25FeedBreak | formatCurrency }}</span>
+            <span slot="play50FeedBreak" slot-scope="play50FeedBreak">{{ play50FeedBreak | formatCurrency }}</span>
+            <span slot="play75FeedBreak" slot-scope="play75FeedBreak">{{ play75FeedBreak | formatCurrency }}</span>
+            <span slot="play100FeedBreak" slot-scope="play100FeedBreak">{{ play100FeedBreak | formatCurrency }}</span>
+            <span slot="nextDayOpen" slot-scope="nextDayOpen">{{ nextDayOpen | formatCurrency }}</span>
+            <span slot="downloadFinish" slot-scope="downloadFinish">{{ downloadFinish | formatCurrency }}</span>
+            <span slot="downloadStart" slot-scope="downloadStart">{{ downloadStart | formatCurrency }}</span>
+            <span slot="likeMaterial" slot-scope="likeMaterial">{{ likeMaterial | formatCurrency }}</span>
+            <span slot="shareMaterial" slot-scope="shareMaterial">{{ shareMaterial | formatCurrency }}</span>
+            <span slot="register" slot-scope="register">{{ register | formatCurrency }}</span>
+            <span slot="follow" slot-scope="follow">{{ follow | formatCurrency }}</span>
+            <span slot="formCount" slot-scope="formCount">{{ formCount | formatCurrency }}</span>
+            <span slot="formCountCost" slot-scope="formCountCost">{{ formCountCost | decimalsHandle }}</span>
+            <span slot="aClick" slot-scope="aClick">{{ aClick | formatCurrency }}</span>
+            <span slot="photoShow" slot-scope="photoShow">{{ photoShow | formatCurrency }}</span>
+            <span slot="photoClick" slot-scope="photoClick">{{ photoClick | formatCurrency }}</span>
+            <span slot="bClick" slot-scope="bClick">{{ bClick | formatCurrency }}</span>
+            <span slot="active" slot-scope="active">{{ active | formatCurrency }}</span>
+            <span slot="submit" slot-scope="submit">{{ submit | formatCurrency }}</span>
+            <span slot="nextDayOpen" slot-scope="nextDayOpen">{{ nextDayOpen | formatCurrency }}</span>
+            <span slot="eventCreditGrantLandingPage" slot-scope="eventCreditGrantLandingPage">{{
+              eventCreditGrantLandingPage | formatCurrency
+            }}</span>
+            <span slot="submitCost" slot-scope="submitCost">{{ submitCost | decimalsHandle }}</span>
+            <span slot="eventCreditGrantLandingPageCost" slot-scope="eventCreditGrantLandingPageCost">{{
+              eventCreditGrantLandingPageCost | decimalsHandle
+            }}</span>
+            <span slot="submitRate" slot-scope="submitRate">{{ submitRate | toPercentage }}</span>
+            <span slot="eventCreditGrantLandingPageRate" slot-scope="eventCreditGrantLandingPageRate">{{
+              eventCreditGrantLandingPageRate | toPercentage
+            }}</span>
+            <span slot="play25FeedBreakRate" slot-scope="play25FeedBreakRate">{{
+              play25FeedBreakRate | toPercentage
+            }}</span>
+            <span slot="playOverRate" slot-scope="playOverRate">{{ playOverRate | toPercentage }}</span>
+            <!-- 新加数据 -->
+
+            <span slot="convertRate" slot-scope="convertRate">{{ convertRate | toPercentage }}</span>
+            <span slot="nextDayOpenRate" slot-scope="nextDayOpenRate">{{ nextDayOpenRate | toPercentage }}</span>
+            <span slot="ctr" slot-scope="ctr">{{ ctr | toPercentage }}</span>
+            <span slot="cpc" slot-scope="cpc">{{ cpc | decimalsHandle }}</span>
+            <span slot="cpm" slot-scope="cpm">{{ cpm | decimalsHandle }}</span>
+            <span slot="activeRate" slot-scope="activeRate">{{ activeRate | toPercentage }}</span>
+            <span slot="installFinishRate" slot-scope="installFinishRate">{{ installFinishRate | toPercentage }}</span>
+            <span slot="validPlayRate" slot-scope="validPlayRate">{{ validPlayRate | toPercentage }}</span>
+            <span slot="activePayCost" slot-scope="activePayCost">{{ activePayCost | decimalsHandle }}</span>
+            <span slot="nextDayOpenCost" slot-scope="nextDayOpenCost">{{ nextDayOpenCost | decimalsHandle }}</span>
+            <span slot="validPlayCost" slot-scope="validPlayCost">{{ validPlayCost | decimalsHandle }}</span>
+            <span slot="activeCost" slot-scope="activeCost">{{ activeCost | decimalsHandle }}</span>
+            <span slot="nextDayOpenCost" slot-scope="nextDayOpenCost">{{ nextDayOpenCost | decimalsHandle }}</span>
+            <span slot="gameAddictionCost" slot-scope="gameAddictionCost">{{
+              gameAddictionCost | decimalsHandle
+            }}</span>
+            <span slot="downloadFinishCost" slot-scope="downloadFinishCost">{{
+              downloadFinishCost | decimalsHandle
+            }}</span>
+            <span slot="downloadStartCost" slot-scope="downloadStartCost">{{
+              downloadStartCost | decimalsHandle
+            }}</span>
+            <span slot="installFinishCost" slot-scope="installFinishCost">{{
+              installFinishCost | decimalsHandle
+            }}</span>
+            <span slot="convertCost" slot-scope="convertCost">{{ convertCost | decimalsHandle }}</span>
+
+            <!--  -->
+            <span slot="downloadStartRate" slot-scope="downloadStartRate">{{ downloadStartRate | toPercentage }}</span>
+            <span slot="downloadFinishRate" slot-scope="downloadFinishRate">{{
+              downloadFinishRate | toPercentage
+            }}</span>
+            <span slot="activeRate" slot-scope="activeRate">{{ activeRate | toPercentage }}</span>
+            <span slot="activeRegisterRate" slot-scope="activeRegisterRate">{{
+              activeRegisterRate | toPercentage
+            }}</span>
+            <span slot="gameAddictionRate" slot-scope="gameAddictionRate">{{ gameAddictionRate | toPercentage }}</span>
+            <span slot="nextDayOpenRate" slot-scope="nextDayOpenRate">{{ nextDayOpenRate | toPercentage }}</span>
+            <!-- <span slot="nextDayOpenRate" slot-scope="nextDayOpenRate">{{ nextDayOpenRate | toPercentage }}</span> -->
+          </a-table>
+        </a-card>
+      </a-col>
+    </a-row>
+    <a-modal title="查看视频" v-model="visibleVideo" :width="400" :footer="null">
+      <video class="video" :src="videoUrlShow" controls="controls" style="width: 100%">
+        您的浏览器不支持 video 标签。
+      </video>
+    </a-modal>
+    <customColumn
+      :visible="visible"
+      :listNum="listNum"
+      :fiexColumn="columnsFixd"
+      :mediaType="2"
+      @closeCustomColumn="closeCustomColumn"
+      @changeColumn="changeColumn"
+    />
+  </div>
+</template>
+
+<script>
+import moment from 'moment'
+import { getAction, postAction, downFile, downFilePost } from '@/api/manage'
+import YoutTable from '@/components/youtTable/YoutTable'
+import ChartCard from '@/components/ChartCard'
+import Trend from '@/components/Trend'
+import { mapGetters } from 'vuex'
+import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
+import customColumn from '../components/customColumn.vue'
+var echarts = require('echarts')
+
+const columnsFixd = [
+  {
+    title: '素材',
+    dataIndex: 'coverUrl',
+    scopedSlots: { customRender: 'coverUrl' },
+    align: 'center',
+    key: 'date',
+    width: 100,
+    fixed: 'left',
+  },
+  {
+    title: '唯一编码',
+    dataIndex: 'signature',
+    align: 'center',
+    width: 100,
+    fixed: 'left',
+  },
+  {
+    title: '素材名称',
+    dataIndex: 'materialName',
+    align: 'center',
+    width: 100,
+    fixed: 'left',
+    customRender: function (text) {
+      if (text) {
+        return text
+      } else {
+        return '-'
+      }
+    },
+  },
+  {
+    title: '所属项目',
+    dataIndex: 'projectName',
+    align: 'center',
+    width: 100,
+    fixed: 'left',
+  },
+  {
+    title: '消耗(元)',
+    dataIndex: 'cost',
+    width: 150,
+    tip: '广告在投放期间的花费总额',
+    align: 'center',
+    scopedSlots: { customRender: 'cost' },
+    sorter: () => {},
+  },
+]
+
+const initVariableColimns = [
+  // {
+  //     title: '折后消耗(元)',
+  //     dataIndex: 'discountCost',
+  //     width:150,
+  //     tip: '广告在投放期间的花费总额',
+  //     align: 'center',
+  //     scopedSlots: { customRender: 'discountCost' },
+  //     sorter: () => {}
+  // },
+  {
+    title: '封面曝光数',
+    dataIndex: 'photoShow',
+    tip: '广告在瀑布流被观看次数',
+    align: 'center',
+    scopedSlots: { customRender: 'photoShow' },
+    sorter: () => {},
+  },
+  {
+    title: '封面点击数',
+    dataIndex: 'photoClick',
+    tip: '用户点击封面进入视频播放页的次数(数据会进行反作弊去重)',
+    align: 'center',
+
+    scopedSlots: { customRender: 'photoClick' },
+    sorter: () => {},
+  },
+  {
+    title: '封面点击率',
+    dataIndex: 'clickRate',
+    tip: '封面点击数占封面展示数百分比',
+    align: 'center',
+    scopedSlots: { customRender: 'clickRate' },
+    sorter: () => {},
+  },
+  {
+    title: '素材曝光数',
+    dataIndex: 'aClick',
+    tip: '用户进入视频播放页观看的次数(数据会进行反作弊去重)',
+    align: 'center',
+
+    scopedSlots: { customRender: 'aClick' },
+    sorter: () => {},
+  },
+  {
+    title: '行为数',
+    dataIndex: 'bClick',
+    tip: '用户在视频播放页单击转化按钮的次数/展示数*100%',
+    align: 'center',
+
+    scopedSlots: { customRender: 'bClick' },
+    sorter: () => {},
+  },
+
+  {
+    title: '行为率',
+    dataIndex: 'bClickRate',
+    tip: '行为数占素材曝光数百分比',
+    align: 'center',
+    scopedSlots: { customRender: 'bClickRate' },
+    sorter: () => {},
+  },
+  {
+    title: '平均千次封面曝光花费(元)',
+    dataIndex: 'cpm',
+    tip: '花费/封面曝光数*1000',
+    align: 'center',
+    scopedSlots: { customRender: 'cpm' },
+    sorter: () => {},
+  },
+  {
+    title: '平均封面点击单价(元)',
+    dataIndex: 'cpc',
+    tip: '花费/封面点击数',
+    align: 'center',
+    scopedSlots: { customRender: 'cpc' },
+    sorter: () => {},
+  },
+  {
+    title: '平均行为单价(元)',
+    dataIndex: 'cpb',
+    tip: '总花费/行为数',
+    align: 'center',
+    scopedSlots: { customRender: 'cpb' },
+    sorter: () => {},
+  },
+]
+export default {
+  components: {
+    YoutTable,
+    ChartCard,
+    Trend,
+    customColumn,
+  },
+  data() {
+    return {
+      excelLoading: false,
+      tableData: [],
+      designTopLoading: false,
+      noImg: require('@/assets/noImg.png'),
+      visibleVideo: false,
+      videoUrlShow: '',
+      cost: '0',
+      costLink: 0,
+      videoTotal: '0',
+      newVideo: 0,
+      hotTotal: '0',
+      xiaoTotal: '0',
+      spinning: false,
+      loading: false,
+      chartList: [],
+      videoList: [],
+      designTopList: [],
+      columns: [...columnsFixd, ...initVariableColimns], //table的表头
+      columnsFixd,
+      ipagination: {
+        current: 1,
+        pageSize: 10,
+        //   pageSizeOptions: ['10', '20', '30'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 共' + total + '条'
+        },
+        showQuickJumper: true,
+        // showSizeChanger: true,
+        // pageSizeOptions: ['10', '30', '50'],
+        total: 0,
+        onChange: (current, pageSize) => {
+          // 切换分页时的回调,
+          // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+          this.ipagination.current = current
+          this.ipagination.pageSize = pageSize
+        },
+      },
+
+      dateRanges: {
+        今天: [moment(), moment()],
+        昨天: [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
+        近一周: [moment().subtract(7, 'days'), moment()],
+        近一月: [moment().subtract(1, 'months'), moment()],
+        近半年: [moment().subtract(6, 'months'), moment()],
+        近一年: [moment().subtract(12, 'months'), moment()],
+      },
+      dateValue: [moment().subtract(7, 'days'), moment()],
+      dataDimension: 'a',
+      mediaDimension: 'b',
+      dataDimensionValue: [],
+      dataDimensionList: [],
+      specificLoading: false,
+      order: null,
+      target: null,
+      materialData: null,
+      md5: '',
+      visible: false,
+      listNum: [],
+      scrollX: 1500,
+      tableWidth: '', //设置表格的列宽
+      resetLoading: false,
+      videoloading: false,
+    }
+  },
+  watch: {
+    visibleVideo(n, o) {
+      if (!n) {
+        stopOtherVideo()
+        closeAllVideoFun()
+      }
+    },
+    'ipagination.current': function (n, o) {
+      if (n != o) {
+        this.getMoreVideoList({
+          ...this.materialData,
+        })
+      }
+    },
+  },
+  methods: {
+    rowClick(record, index) {
+      return {
+        on: {
+          click: (e) => {
+            var params = { md5: record.signature, mediaId: 2 }
+            localStorage.setItem('videoInfo', JSON.stringify(params))
+            this.$router.push({
+              path: '/materialReport/marterialDetail',
+            })
+          },
+        },
+      }
+    },
+    moment,
+    closeCustomColumn() {
+      this.visible = false
+    },
+    changeColumn(val) {
+      this.columns = [...val]
+      if (this.columns.length > this.columnsFixd.length && this.columns.length < 8) {
+        this.columns.forEach((element, index) => {
+          if (index < this.columns.length - 1) {
+            if (element.dataIndex == 'coverUrl') {
+              element.width = 100
+              element.fixed = false
+            } else {
+              element.width = 'auto'
+              element.fixed = false
+            }
+          }
+        })
+
+        // this.scrollX=2000+200*(this.columns.length-this.columnsFixd.length)
+      } else if (this.columns.length >= 8) {
+        this.columns.forEach((element, index) => {
+          if (index < this.columnsFixd.length) {
+            element.width = 100
+            element.fixed = 'left'
+          }
+        })
+
+        this.scrollX = 1000 + 200 * (this.columns.length - this.columnsFixd.length)
+      } else {
+        this.scrollX = 0
+        this.columns.forEach((element) => {
+          console.log(element)
+          if (element.dataIndex == 'coverUrl') {
+            element.width = 100
+            element.fixed = false
+          } else {
+            element.width = 'auto'
+            element.fixed = false
+          }
+        })
+      }
+
+      let arr = JSON.stringify(this.columns)
+      this.postDataAction('/toutiao/videoReportDaily/saveOrUpdateColumnJson', {
+        json: arr,
+        columnType: 12,
+      }).then((res) => {
+        // console.log(res)
+      })
+    },
+    customColumns() {
+      this.visible = true
+      this.listNum = [...this.columns]
+    },
+    ...mapGetters(['userInfo']),
+    filterOption(input, option) {
+      return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+    },
+    sort(pagination, filters, sorter, { currentDataSource }) {
+      // console.log(pagination, filters, sorter)
+      this.ipagination.current = pagination.current
+      this.ipagination.pageSize = pagination.pageSize
+      if (sorter.order) {
+        this.order = sorter.order ? sorter.order : 'descend'
+        this.target = sorter.columnKey
+        this.getMoreVideoList({
+          ...this.materialData,
+          target: sorter.columnKey,
+          order: sorter.order ? sorter.order : 'descend',
+        })
+      } else {
+        this.order = null
+        this.target = null
+      }
+    },
+    getData() {
+      var data = { ...this.materialData, md5: this.md5 }
+      this.getMoreVideoList(data)
+    },
+
+    getMoreVideoList(data) {
+      this.loading = true
+      var params = { ...data }
+      params.channelType = null
+
+      if (data.target) {
+        params.target = data.target
+        if (data.order == 'descend') {
+          params.order = 'desc'
+        } else {
+          params.order = 'asc'
+        }
+      } else {
+        params.target = this.target
+        params.order = this.order == 'descend' ? 'desc' : this.order == null ? null : 'asc'
+      }
+
+      params.pageSize = this.ipagination.pageSize
+      params.pageNo = this.ipagination.current
+      this.postDataAction('/overView/materialTopViewMore', params).then((res) => {
+        this.loading = false
+        this.resetLoading = false
+        this.videoloading = false
+        if (res.success) {
+          this.tableData = res.result.list
+          this.ipagination.total = res.result.total
+        }
+      })
+    },
+    getDesignTopList(data) {
+      this.designTopLoading = true
+      return new Promise((resolve, reject) => {
+        var params = {
+          // startDate: this.dateValue.length == 2 ? moment(this.dateValue[0]).format('YYYY-MM-DD') : null,
+          // endDate: this.dateValue.length == 2 ? moment(this.dateValue[1]).format('YYYY-MM-DD') : null,
+          // userId: this.userInfo().id,
+          // pageSize: this.ipagination.pageSize,
+          // pageNo: this.ipagination.current,
+          // target: 'cost',
+          // order: 'desc',
+        }
+        params.startDate = this.dateValue.length == 2 ? moment(this.dateValue[0]).format('YYYY-MM-DD') : null
+        params.endDate = this.dateValue.length == 2 ? moment(this.dateValue[1]).format('YYYY-MM-DD') : null
+        params.userId = this.userInfo().id
+        params.pageSize = this.ipagination.pageSize
+        params.pageNo = this.ipagination.current
+
+        if (data) {
+          params.target = data.target
+          if (data.order == 'descend') {
+            params.order = 'desc'
+          } else {
+            params.order = 'asc'
+          }
+        } else {
+          params.target = this.params.order = this.order == 'descend' ? 'desc' : 'asc'
+        }
+        this.postDataAction('/overView/designTop', params).then((res) => {
+          this.designTopLoading = false
+          if (res.success) {
+            this.designTopList = res.result.list
+            this.ipagination.total = res.result.total
+            resolve(res.result)
+          } else {
+            reject(res.message)
+          }
+        })
+      })
+    },
+
+    handleSubmit() {
+      this.videoloading = true
+      this.ipagination.current = 1
+      this.getData()
+    },
+    resetSubmit() {
+      this.ipagination.current = 1
+      this.resetLoading = true
+      this.md5 = ''
+      this.getData()
+    },
+    //导出报表
+    exportExcel() {
+      this.excelLoading = true
+      let column = this.columns.map((item, index) => {
+        return item.dataIndex
+      })
+      let columns = column.splice(4)
+      // "mediaId":"",
+      // "projects":[],
+      // "columns":"",
+      // "startDate":"",
+      // "endDate":"",
+      // "channelType":"",
+      // "md5":"",
+      // "target":"",
+      // "order":""
+      downFilePost('/overView/excel', {
+        ...this.materialData,
+        columns,
+        target: this.target,
+        order: this.order == 'descend' ? 'desc' : 'asc',
+        md5: this.md5,
+      }).then((res) => {
+        let blob = new Blob([res], {
+          type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+        })
+        let downloadElement = document.createElement('a')
+        let href = window.URL.createObjectURL(blob) //创建下载的链接
+        downloadElement.href = href
+        downloadElement.download = this.materialData.startDate + '~' + this.materialData.endDate + '素材报表.xlsx' //下载后文件名
+        document.body.appendChild(downloadElement)
+        downloadElement.click() //点击下载
+        document.body.removeChild(downloadElement) //下载完成移除元素
+        window.URL.revokeObjectURL(href) //释放掉blob对象
+        this.excelLoading = false
+      })
+    },
+    tableChange(data) {
+      console.log(data)
+    },
+    //获取echart的值
+    initEchart(idName, optionName) {
+      const chart = this.$refs[idName]
+      //   console.log(chart)
+      if (chart) {
+        const myChart = echarts.init(document.getElementById(idName))
+        // myChart.showLoading({
+        //     text: "图表数据正在努力加载..."
+        // });
+
+        myChart.setOption(optionName)
+        window.addEventListener('resize', function () {
+          myChart.resize()
+        })
+      }
+    },
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.postDataAction('/toutiao/videoReportDaily/getColumnJson', {
+        columnType: 12,
+      }).then((res) => {
+        // console.log(res)
+        if (res.success) {
+          // console.log(JSON.parse(res.result))
+          if (res.result) {
+            let columns = JSON.parse(res.result)
+            if (columns.length) {
+              if (columns.length >= columnsFixd.length) {
+                columns.map((item, index) => {
+                  if (index > columnsFixd.length - 1) {
+                    item.sorter = function (a, b) {}
+                  }
+                })
+                columns = columns.slice(columnsFixd.length)
+                this.columns = [...columnsFixd, ...columns]
+
+                // this.tableHandle()
+              }
+
+              // console.log(this.columns)
+            }
+          }
+
+          this.changeColumn(this.columns)
+        }
+      })
+
+      this.materialData = JSON.parse(localStorage.getItem('materialParams'))
+      this.getMoreVideoList(this.materialData)
+    })
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.materialReport {
+  .option {
+    background: white;
+    padding: 20px;
+    display: flex;
+    justify-content: flex-start;
+    flex-wrap: wrap;
+    .item {
+      margin-right: 15px;
+      margin-bottom: 15px;
+      height: 32px;
+      line-height: 32px;
+      flex-shrink: 0;
+      span {
+        margin-right: 10px;
+      }
+    }
+  }
+  .echart {
+    margin-top: 20px;
+    padding: 0 20px 20px;
+    background: white;
+    .echart-header {
+      padding: 20px 0;
+      font-size: 15px;
+      font-weight: 600;
+    }
+  }
+  .tableBody {
+    margin-top: 20px;
+  }
+}
+</style>
+<style>
+.card-container {
+  overflow: hidden;
+  /* padding: 24px; */
+}
+.card-container > .ant-tabs-card > .ant-tabs-content {
+  /* height: 120px; */
+  margin-top: -16px;
+}
+
+.card-container > .ant-tabs-card > .ant-tabs-content > .ant-tabs-tabpane {
+  background: #fff;
+  /* padding: 16px; */
+}
+
+.card-container > .ant-tabs-card > .ant-tabs-bar {
+  border-color: #fff;
+}
+
+.card-container > .ant-tabs-card > .ant-tabs-bar .ant-tabs-tab {
+  border-color: transparent;
+  background: transparent !important;
+}
+
+.card-container > .ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active {
+  border-color: #fff;
+  background: #fff !important;
+}
+</style>

+ 706 - 0
src/views/modules/Statistics/materialReport/marterialTtList.vue

@@ -0,0 +1,706 @@
+<style>
+.materialReport .chart-card-content {
+  display: none !important;
+}
+</style>
+<style scoped>
+.top-ul-style {
+  width: 100%;
+  padding-left: 0;
+}
+.top-ul-style li {
+  height: 100px;
+  border: 1px solid #f2f2f2;
+  margin-bottom: 5px;
+  padding: 10px;
+  display: flex;
+  justify-content: space-between;
+}
+.li-cost {
+  display: flex;
+  flex-flow: column;
+  justify-content: center;
+  align-content: flex-end;
+}
+.li-cost span {
+  font-size: 16px;
+  font-weight: 500;
+  min-width: 50px;
+  text-align: right;
+}
+</style>
+<template>
+  <div class="materialReport">
+    <div class="card-container">
+      <div class="option" style="justify-content: space-between">
+        <div class="option" style="padding: 0">
+          <div class="item">
+            <span>唯一编码</span>
+            <a-input style="width: 300px" v-model="md5"></a-input>
+          </div>
+        </div>
+
+        <div class="item" style="float: right">
+          <a-button @click="handleSubmit" type="primary" :loading="videoLoading">搜索</a-button>
+          <a-button @click="resetSubmit" style="margin-left: 15px" :loading="resetLoading">重置</a-button>
+        </div>
+      </div>
+    </div>
+    <a-row :gutter="24" style="margin-top: 20px">
+      <a-col :xl="24">
+        <a-card title="数据列表" style="width: 100%; min-height: 700px" :bordered="false">
+          <div class="tableTop" style="text-align: end; margin: 0 0 15px 0">
+            <a-button type="primary" class="export" @click="exportExcel" style="margin-right: 10px">导出报表</a-button>
+            <a-button type="primary" class="add" @click="customColumns">自定义列</a-button>
+          </div>
+          <a-table
+            size="middle"
+            :columns="columns"
+            :dataSource="tableData"
+            bordered
+            id="outTable"
+            :pagination="ipagination"
+            :scroll="{ x: scrollX }"
+            :loading="loading"
+            ref="accountTable"
+            :width="tableWidth"
+            :customRow="rowClick"
+            @change="sort"
+            style="word-break: break-all; font-size: 16px; font-weight: 600"
+          >
+            <span slot="coverUrl" slot-scope="text, records">
+              <img
+                :src="text || noImg"
+                alt=""
+                style="width: 100%; height: auto"
+                @click.stop="
+                  visibleVideo = true
+                  videoUrlShow = records.url
+                "
+              />
+            </span>
+            <span slot="ctr" slot-scope="ctr">{{ ctr | toPercentage }}</span>
+            <span slot="cost" slot-scope="cost">{{ cost | decimalsHandle }}</span>
+            <span slot="clickMaterial" slot-scope="clickMaterial">{{ clickMaterial | formatCurrency }}</span>
+            <span slot="showMaterial" slot-scope="showMaterial">{{ showMaterial | formatCurrency }}</span>
+            <span slot="convertMaterial" slot-scope="convertMaterial">{{ convertMaterial | formatCurrency }}</span>
+            <span slot="play25FeedBreak" slot-scope="play25FeedBreak">{{ play25FeedBreak | formatCurrency }}</span>
+            <span slot="play50FeedBreak" slot-scope="play50FeedBreak">{{ play50FeedBreak | formatCurrency }}</span>
+            <span slot="play75FeedBreak" slot-scope="play75FeedBreak">{{ play75FeedBreak | formatCurrency }}</span>
+            <span slot="play100FeedBreak" slot-scope="play100FeedBreak">{{ play100FeedBreak | formatCurrency }}</span>
+            <span slot="nextDayOpen" slot-scope="nextDayOpen">{{ nextDayOpen | formatCurrency }}</span>
+            <span slot="downloadFinish" slot-scope="downloadFinish">{{ downloadFinish | formatCurrency }}</span>
+            <span slot="downloadStart" slot-scope="downloadStart">{{ downloadStart | formatCurrency }}</span>
+            <span slot="likeMaterial" slot-scope="likeMaterial">{{ likeMaterial | formatCurrency }}</span>
+            <span slot="shareMaterial" slot-scope="shareMaterial">{{ shareMaterial | formatCurrency }}</span>
+            <span slot="register" slot-scope="register">{{ register | formatCurrency }}</span>
+            <span slot="follow" slot-scope="follow">{{ follow | formatCurrency }}</span>
+            <span slot="formCount" slot-scope="formCount">{{ formCount | formatCurrency }}</span>
+            <span slot="formCountCost" slot-scope="formCountCost">{{ formCountCost | decimalsHandle }}</span>
+            <span slot="aClick" slot-scope="aClick">{{ aClick | formatCurrency }}</span>
+            <span slot="photoShow" slot-scope="photoShow">{{ photoShow | formatCurrency }}</span>
+            <span slot="photoClick" slot-scope="photoClick">{{ photoClick | formatCurrency }}</span>
+            <span slot="bClick" slot-scope="bClick">{{ bClick | formatCurrency }}</span>
+            <span slot="active" slot-scope="active">{{ active | formatCurrency }}</span>
+            <span slot="submit" slot-scope="submit">{{ submit | formatCurrency }}</span>
+            <span slot="nextDayOpen" slot-scope="nextDayOpen">{{ nextDayOpen | formatCurrency }}</span>
+            <span slot="eventCreditGrantLandingPage" slot-scope="eventCreditGrantLandingPage">{{
+              eventCreditGrantLandingPage | formatCurrency
+            }}</span>
+            <span slot="submitCost" slot-scope="submitCost">{{ submitCost | decimalsHandle }}</span>
+            <span slot="eventCreditGrantLandingPageCost" slot-scope="eventCreditGrantLandingPageCost">{{
+              eventCreditGrantLandingPageCost | decimalsHandle
+            }}</span>
+            <span slot="submitRate" slot-scope="submitRate">{{ submitRate | toPercentage }}</span>
+            <span slot="eventCreditGrantLandingPageRate" slot-scope="eventCreditGrantLandingPageRate">{{
+              eventCreditGrantLandingPageRate | toPercentage
+            }}</span>
+            <span slot="play25FeedBreakRate" slot-scope="play25FeedBreakRate">{{
+              play25FeedBreakRate | toPercentage
+            }}</span>
+            <span slot="playOverRate" slot-scope="playOverRate">{{ playOverRate | toPercentage }}</span>
+            <!-- 新加数据 -->
+
+            <span slot="convertRate" slot-scope="convertRate">{{ convertRate | toPercentage }}</span>
+            <span slot="nextDayOpenRate" slot-scope="nextDayOpenRate">{{ nextDayOpenRate | toPercentage }}</span>
+            <span slot="ctr" slot-scope="ctr">{{ ctr | toPercentage }}</span>
+            <span slot="cpc" slot-scope="cpc">{{ cpc | decimalsHandle }}</span>
+            <span slot="cpm" slot-scope="cpm">{{ cpm | decimalsHandle }}</span>
+            <span slot="activeRate" slot-scope="activeRate">{{ activeRate | toPercentage }}</span>
+            <span slot="installFinishRate" slot-scope="installFinishRate">{{ installFinishRate | toPercentage }}</span>
+            <span slot="validPlayRate" slot-scope="validPlayRate">{{ validPlayRate | toPercentage }}</span>
+            <span slot="activePayCost" slot-scope="activePayCost">{{ activePayCost | decimalsHandle }}</span>
+            <span slot="nextDayOpenCost" slot-scope="nextDayOpenCost">{{ nextDayOpenCost | decimalsHandle }}</span>
+            <span slot="validPlayCost" slot-scope="validPlayCost">{{ validPlayCost | decimalsHandle }}</span>
+            <span slot="activeCost" slot-scope="activeCost">{{ activeCost | decimalsHandle }}</span>
+            <span slot="nextDayOpenCost" slot-scope="nextDayOpenCost">{{ nextDayOpenCost | decimalsHandle }}</span>
+            <span slot="gameAddictionCost" slot-scope="gameAddictionCost">{{
+              gameAddictionCost | decimalsHandle
+            }}</span>
+            <span slot="downloadFinishCost" slot-scope="downloadFinishCost">{{
+              downloadFinishCost | decimalsHandle
+            }}</span>
+            <span slot="downloadStartCost" slot-scope="downloadStartCost">{{
+              downloadStartCost | decimalsHandle
+            }}</span>
+            <span slot="installFinishCost" slot-scope="installFinishCost">{{
+              installFinishCost | decimalsHandle
+            }}</span>
+            <span slot="convertCost" slot-scope="convertCost">{{ convertCost | decimalsHandle }}</span>
+
+            <!--  -->
+            <span slot="downloadStartRate" slot-scope="downloadStartRate">{{ downloadStartRate | toPercentage }}</span>
+            <span slot="downloadFinishRate" slot-scope="downloadFinishRate">{{
+              downloadFinishRate | toPercentage
+            }}</span>
+            <span slot="activeRate" slot-scope="activeRate">{{ activeRate | toPercentage }}</span>
+            <span slot="activeRegisterRate" slot-scope="activeRegisterRate">{{
+              activeRegisterRate | toPercentage
+            }}</span>
+            <span slot="gameAddictionRate" slot-scope="gameAddictionRate">{{ gameAddictionRate | toPercentage }}</span>
+            <span slot="nextDayOpenRate" slot-scope="nextDayOpenRate">{{ nextDayOpenRate | toPercentage }}</span>
+            <!-- <span slot="nextDayOpenRate" slot-scope="nextDayOpenRate">{{ nextDayOpenRate | toPercentage }}</span> -->
+          </a-table>
+        </a-card>
+      </a-col>
+    </a-row>
+    <a-modal title="查看视频" v-model="visibleVideo" :width="400" :footer="null">
+      <video class="video" :src="videoUrlShow" controls="controls" style="width: 100%">
+        您的浏览器不支持 video 标签。
+      </video>
+    </a-modal>
+    <customColumn
+      :visible="visible"
+      :listNum="listNum"
+      :fiexColumn="columnsFixd"
+      :mediaType="1"
+      @closeCustomColumn="closeCustomColumn"
+      @changeColumn="changeColumn"
+    />
+  </div>
+</template>
+
+<script>
+import moment from 'moment'
+import { getAction, postAction, downFile, downFilePost } from '@/api/manage'
+import YoutTable from '@/components/youtTable/YoutTable'
+import ChartCard from '@/components/ChartCard'
+import Trend from '@/components/Trend'
+import { mapGetters } from 'vuex'
+import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
+import customColumn from '../components/customColumn.vue'
+var echarts = require('echarts')
+
+const columnsFixd = [
+  {
+    title: '素材',
+    dataIndex: 'coverUrl',
+    scopedSlots: { customRender: 'coverUrl' },
+    align: 'center',
+    key: 'date',
+    width: 100,
+    fixed: 'left',
+  },
+  {
+    title: '唯一编码',
+    dataIndex: 'signature',
+    align: 'center',
+    width: 100,
+    fixed: 'left',
+  },
+  {
+    title: '素材名称',
+    dataIndex: 'materialName',
+    align: 'center',
+    width: 100,
+    fixed: 'left',
+    customRender: function (text) {
+      if (text) {
+        return text
+      } else {
+        return '-'
+      }
+    },
+  },
+  {
+    title: '所属项目',
+    dataIndex: 'projectName',
+    align: 'center',
+    width: 100,
+    fixed: 'left',
+  },
+  {
+    title: '消耗(元)',
+    dataIndex: 'cost',
+    scopedSlots: { customRender: 'cost' },
+    align: 'center',
+    sorter: (a, b) => {},
+  },
+]
+
+const initVariableColimns = [
+  {
+    title: '点击数',
+    dataIndex: 'clickMaterial',
+    align: 'center',
+    scopedSlots: { customRender: 'clickMaterial' },
+    sorter: (a, b) => {},
+    // (a, b) => a.clickMaterial - b.clickMaterial
+  },
+  {
+    title: '点击率',
+    dataIndex: 'ctr',
+    align: 'center',
+    scopedSlots: { customRender: 'ctr' },
+    sorter: (a, b) => {},
+  },
+
+  {
+    title: '展示数',
+    dataIndex: 'showMaterial',
+    align: 'center',
+
+    scopedSlots: { customRender: 'showMaterial' },
+    sorter: (a, b) => {},
+  },
+  {
+    title: '平均千次展现费用(元)',
+    dataIndex: 'cpm',
+    tip: '广告平均每一千次展现所付出的费用,计算公式是:总花费/展示数*1000',
+    align: 'center',
+
+    scopedSlots: { customRender: 'cpm' },
+    sorter: (a, b) => {},
+  },
+  {
+    title: '平均点击单价(元)',
+    dataIndex: 'cpc',
+    tip: '广告主为每次点击付出的费用成本,计算公式是:总花费/点击数',
+    align: 'center',
+    scopedSlots: { customRender: 'cpc' },
+    sorter: (a, b) => {},
+  },
+]
+export default {
+  components: {
+    YoutTable,
+    ChartCard,
+    Trend,
+    customColumn,
+  },
+  data() {
+    return {
+      tableData: [],
+      designTopLoading: false,
+      resetLoading: false,
+      videoLoading: false,
+      noImg: require('@/assets/noImg.png'),
+      visibleVideo: false,
+      videoUrlShow: '',
+      cost: '0',
+      costLink: 0,
+      videoTotal: '0',
+      newVideo: 0,
+      hotTotal: '0',
+      xiaoTotal: '0',
+      spinning: false,
+      loading: false,
+      chartList: [],
+      videoList: [],
+      designTopList: [],
+      columns: [...columnsFixd, ...initVariableColimns], //table的表头
+      columnsFixd,
+      ipagination: {
+        current: 1,
+        pageSize: 10,
+        //   pageSizeOptions: ['10', '20', '30'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 共' + total + '条'
+        },
+        showQuickJumper: true,
+        // showSizeChanger: true,
+        // pageSizeOptions: ['10', '30', '50'],
+        total: 0,
+        onChange: (current, pageSize) => {
+          // 切换分页时的回调,
+          // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+          this.ipagination.current = current
+          this.ipagination.pageSize = pageSize
+        },
+      },
+
+      dateRanges: {
+        今天: [moment(), moment()],
+        昨天: [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
+        近一周: [moment().subtract(7, 'days'), moment()],
+        近一月: [moment().subtract(1, 'months'), moment()],
+        近半年: [moment().subtract(6, 'months'), moment()],
+        近一年: [moment().subtract(12, 'months'), moment()],
+      },
+      dateValue: [moment().subtract(6, 'days'), moment()],
+      dataDimension: 'a',
+      mediaDimension: 'b',
+      dataDimensionValue: [],
+      dataDimensionList: [],
+      specificLoading: false,
+      order: null,
+      target: null,
+      materialData: null,
+      md5: '',
+      visible: false,
+      listNum: [],
+      scrollX: 1500,
+      tableWidth: '', //设置表格的列宽
+    }
+  },
+  watch: {
+    visibleVideo(n, o) {
+      if (!n) {
+        stopOtherVideo()
+        closeAllVideoFun()
+      }
+    },
+    'ipagination.current': function (n, o) {
+      if (n != o) {
+        this.getMoreVideoList({
+          ...this.materialData,
+        })
+      }
+    },
+  },
+  methods: {
+    rowClick(record, index) {
+      return {
+        on: {
+          click: (e) => {
+            var params = { md5: record.signature, mediaId: 1 }
+            localStorage.setItem('videoInfo', JSON.stringify(params))
+            this.$router.push({
+              path: '/materialReport/marterialDetail',
+            })
+          },
+        },
+      }
+    },
+
+    moment,
+    closeCustomColumn() {
+      this.visible = false
+    },
+    changeColumn(val) {
+      this.columns = [...val]
+
+      if (this.columns.length > this.columnsFixd.length && this.columns.length < 8) {
+        this.columns.forEach((element, index) => {
+          if (index < this.columns.length - 1) {
+            if (element.dataIndex == 'coverUrl') {
+              element.width = 100
+              element.fixed = false
+            } else {
+              element.width = 'auto'
+              element.fixed = false
+            }
+          }
+        })
+
+        // this.scrollX=2000+200*(this.columns.length-this.columnsFixd.length)
+      } else if (this.columns.length >= 8) {
+        this.columns.forEach((element, index) => {
+          if (index < this.columnsFixd.length) {
+            element.width = 100
+            element.fixed = 'left'
+          }
+        })
+
+        this.scrollX = 1000 + 200 * (this.columns.length - this.columnsFixd.length)
+      } else {
+        this.scrollX = 0
+
+        this.columns.forEach((element) => {
+          if (element.dataIndex == 'coverUrl') {
+            element.width = 100
+            element.fixed = false
+          } else {
+            element.width = 'auto'
+            element.fixed = false
+          }
+        })
+      }
+      let arr = JSON.stringify(this.columns)
+      this.postDataAction('/toutiao/videoReportDaily/saveOrUpdateColumnJson', {
+        json: arr,
+        columnType: 11,
+      }).then((res) => {
+        // console.log(res)
+      })
+    },
+    customColumns() {
+      this.visible = true
+      this.listNum = [...this.columns]
+    },
+    ...mapGetters(['userInfo']),
+    filterOption(input, option) {
+      return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+    },
+    sort(pagination, filters, sorter, { currentDataSource }) {
+      // console.log(pagination, filters, sorter)
+      this.ipagination.current = pagination.current
+      this.ipagination.pageSize = pagination.pageSize
+      if (sorter.order) {
+        this.order = sorter.order ? sorter.order : 'descend'
+        this.target = sorter.columnKey
+        this.getMoreVideoList({
+          ...this.materialData,
+          target: sorter.columnKey,
+          order: sorter.order ? sorter.order : 'descend',
+        })
+      } else {
+        this.order = null
+        this.target = null
+      }
+    },
+    getData() {
+      var data = { ...this.materialData, md5: this.md5 }
+      this.getMoreVideoList(data)
+    },
+
+    getMoreVideoList(data) {
+      this.loading = true
+      var params = { ...data }
+      params.channelType = null
+
+      if (data.target) {
+        params.target = data.target
+        if (data.order == 'descend') {
+          params.order = 'desc'
+        } else {
+          params.order = 'asc'
+        }
+      } else {
+        params.target = this.target
+        params.order = this.order == 'descend' ? 'desc' : this.order == null ? null : 'asc'
+      }
+
+      params.pageSize = this.ipagination.pageSize
+      params.pageNo = this.ipagination.current
+      this.postDataAction('/overView/materialTopViewMore', params).then((res) => {
+        this.loading = false
+        this.resetLoading = false
+        this.videoLoading = false
+        if (res.success) {
+          this.tableData = res.result.list
+          this.ipagination.total = res.result.total
+        }
+      })
+    },
+    getDesignTopList(data) {
+      this.designTopLoading = true
+      return new Promise((resolve, reject) => {
+        var params = {
+          // startDate: this.dateValue.length == 2 ? moment(this.dateValue[0]).format('YYYY-MM-DD') : null,
+          // endDate: this.dateValue.length == 2 ? moment(this.dateValue[1]).format('YYYY-MM-DD') : null,
+          // userId: this.userInfo().id,
+          // pageSize: this.ipagination.pageSize,
+          // pageNo: this.ipagination.current,
+          // target: 'cost',
+          // order: 'desc',
+        }
+        params.startDate = this.dateValue.length == 2 ? moment(this.dateValue[0]).format('YYYY-MM-DD') : null
+        params.endDate = this.dateValue.length == 2 ? moment(this.dateValue[1]).format('YYYY-MM-DD') : null
+        params.userId = this.userInfo().id
+        params.pageSize = this.ipagination.pageSize
+        params.pageNo = this.ipagination.current
+
+        if (data) {
+          params.target = data.target
+          if (data.order == 'descend') {
+            params.order = 'desc'
+          } else {
+            params.order = 'asc'
+          }
+        } else {
+          params.target = this.target
+          params.order = this.order == 'descend' ? 'desc' : 'asc'
+        }
+        this.postDataAction('/overView/designTop', params).then((res) => {
+          this.designTopLoading = false
+          if (res.success) {
+            this.designTopList = res.result.list
+            this.ipagination.total = res.result.total
+            resolve(res.result)
+          } else {
+            reject(res.message)
+          }
+        })
+      })
+    },
+
+    handleSubmit() {
+      this.videoLoading = true
+      this.ipagination.current = 1
+      this.getData()
+    },
+    resetSubmit() {
+      this.resetLoading = true
+      this.ipagination.current = 1
+      this.md5 = ''
+      this.getData()
+    },
+    //导出报表
+    exportExcel() {
+      this.excelLoading = true
+      let column = this.columns.map((item, index) => {
+        return item.dataIndex
+      })
+      let columns = column.splice(4)
+      // "mediaId":"",
+      // "projects":[],
+      // "columns":"",
+      // "startDate":"",
+      // "endDate":"",
+      // "channelType":"",
+      // "md5":"",
+      // "target":"",
+      // "order":""
+      downFilePost('/overView/excel', {
+        ...this.materialData,
+        columns,
+        target: this.target,
+        order: this.order == 'descend' ? 'desc' : 'asc',
+        md5: this.md5,
+      }).then((res) => {
+        let blob = new Blob([res], {
+          type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+        })
+        let downloadElement = document.createElement('a')
+        let href = window.URL.createObjectURL(blob) //创建下载的链接
+        downloadElement.href = href
+        downloadElement.download = this.materialData.startDate + '~' + this.materialData.endDate + '素材报表.xlsx' //下载后文件名
+        document.body.appendChild(downloadElement)
+        downloadElement.click() //点击下载
+        document.body.removeChild(downloadElement) //下载完成移除元素
+        window.URL.revokeObjectURL(href) //释放掉blob对象
+        this.excelLoading = false
+      })
+    },
+    tableChange(data) {
+      console.log(data)
+    },
+    //获取echart的值
+    initEchart(idName, optionName) {
+      const chart = this.$refs[idName]
+      //   console.log(chart)
+      if (chart) {
+        const myChart = echarts.init(document.getElementById(idName))
+        // myChart.showLoading({
+        //     text: "图表数据正在努力加载..."
+        // });
+
+        myChart.setOption(optionName)
+        window.addEventListener('resize', function () {
+          myChart.resize()
+        })
+      }
+    },
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.postDataAction('/toutiao/videoReportDaily/getColumnJson', {
+        columnType: 11,
+      }).then((res) => {
+        // console.log(res)
+        if (res.success) {
+          // console.log(JSON.parse(res.result))
+          if (res.result) {
+            let columns = JSON.parse(res.result)
+            if (columns.length) {
+              if (columns.length >= columnsFixd.length) {
+                columns.map((item, index) => {
+                  if (index > columnsFixd.length - 1) {
+                    item.sorter = function (a, b) {}
+                  }
+                })
+                columns = columns.slice(columnsFixd.length)
+                this.columns = [...columnsFixd, ...columns]
+
+                // this.tableHandle()
+              }
+
+              // console.log(this.columns)
+            }
+          }
+
+          this.changeColumn(this.columns)
+        }
+      })
+
+      this.materialData = JSON.parse(localStorage.getItem('TtmaterialParams'))
+      this.getMoreVideoList(this.materialData)
+    })
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.materialReport {
+  .option {
+    background: white;
+    padding: 20px;
+    display: flex;
+    justify-content: flex-start;
+    flex-wrap: wrap;
+    .item {
+      margin-right: 15px;
+      margin-bottom: 15px;
+      height: 32px;
+      line-height: 32px;
+      flex-shrink: 0;
+      span {
+        margin-right: 10px;
+      }
+    }
+  }
+  .echart {
+    margin-top: 20px;
+    padding: 0 20px 20px;
+    background: white;
+    .echart-header {
+      padding: 20px 0;
+      font-size: 15px;
+      font-weight: 600;
+    }
+  }
+  .tableBody {
+    margin-top: 20px;
+  }
+}
+</style>
+<style>
+.card-container {
+  overflow: hidden;
+  /* padding: 24px; */
+}
+.card-container > .ant-tabs-card > .ant-tabs-content {
+  /* height: 120px; */
+  margin-top: -16px;
+}
+
+.card-container > .ant-tabs-card > .ant-tabs-content > .ant-tabs-tabpane {
+  background: #fff;
+  /* padding: 16px; */
+}
+
+.card-container > .ant-tabs-card > .ant-tabs-bar {
+  border-color: #fff;
+}
+
+.card-container > .ant-tabs-card > .ant-tabs-bar .ant-tabs-tab {
+  border-color: transparent;
+  background: transparent !important;
+}
+
+.card-container > .ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active {
+  border-color: #fff;
+  background: #fff !important;
+}
+</style>

Diff do ficheiro suprimidas por serem muito extensas
+ 923 - 458
src/views/modules/Statistics/materialReport/materialReport.vue


+ 0 - 1
src/views/modules/Statistics/mediaReport.vue

@@ -742,7 +742,6 @@
 </style>
 <style lang="scss">
   .ant-tooltip-inner,
-  .ant-tooltip,
   .ant-tooltip-arrow::before {
     background-color: #fff;
     color: #666;

+ 6 - 1
src/views/modules/Statistics/refuseDataCreatNew.vue

@@ -672,7 +672,12 @@
       stopOtherVideo()
     },
     mounted: function () {
-      this.$nextTick(() => {})
+      this.$nextTick(() => {});
+      // console.log(this.$route);
+      if(this.$route.query){
+          this.appId=this.$route.query.accountId;
+          this.addUserKey()
+      }
     }
   }
 </script>

+ 1 - 1
src/views/modules/advertiser/ProjectMemberList.vue

@@ -70,7 +70,7 @@
             <a
               @click="projectLook(record)"
               v-if="noTitleKey == 'myProject'"
-              :disabled="record.needExamine == 0"
+              :disabled="record.needExamine == 0||record.needExamine == null"
             >待办事项</a>
           </a-badge>
         </span>

+ 1 - 2
src/views/modules/advertiser/UserAllocationList.vue

@@ -300,7 +300,7 @@ import { JeecgListMixin } from '@/mixins/JeecgListMixin'
 import { mapGetters } from 'vuex'
 import { httpAction, getAction, deleteAction } from '@/api/manage'
 
-import treeSelect from './modules/Treeselect'
+
 import moment from 'moment'
 import { postAction } from '../../../api/manage'
 import qs from 'qs'
@@ -309,7 +309,6 @@ export default {
   mixins: [JeecgListMixin],
   components: {
     UserAllocationModal,
-    treeSelect,
   },
   data() {
     return {

+ 14 - 4
src/views/modules/advertiser/modules/ProjectModal.vue

@@ -79,7 +79,7 @@
         <div v-if="model.mediaId == '2' || model.mediaId == '4'">
           <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="优化目标">
             <a-select
-              v-decorator="['bidType', { rules: [{ required: true, message: '请输入表单名称' }], initialValue: 2 }]"
+              v-decorator="['bidType', { rules: [{ required: true, message: '请选择优化目标' }], initialValue: 2 }]"
               mode="multiple"
             >
               <a-select-option :value="2">点击数</a-select-option>
@@ -92,13 +92,20 @@
               label="转化目标"
               :labelCol="labelCol"
               :wrapperCol="wrapperCol"
-              v-show="
+              v-if="
                 getFormFieldValue('bidType').findIndex((item) => item == 10) > -1 ||
                 getFormFieldValue('bidType').findIndex((item) => item == 6) > -1
               "
             >
-              <a-select v-model="model.ocpxActionType" mode="multiple">
-                <a-select-option :value="2">行为数</a-select-option>
+              <!-- v-model="model.ocpxActionType" -->
+              <a-select
+                v-decorator="[
+                  'ocpxActionType',
+                  { rules: [{ required: true, message: '请选择转化目标' }], initialValue: 2 },
+                ]"
+                mode="multiple"
+              >
+                <!-- <a-select-option :value="2">行为数</a-select-option> -->
                 <a-select-option :value="item.ocpxActionType" v-for="(item, index) in ocpxList" :key="index">{{
                   item.ocpxActionName
                 }}</a-select-option>
@@ -379,6 +386,9 @@ export default {
           }
         })
         //时间格式化
+        setTimeout(() => {
+          this.form.setFieldsValue(pick(this.model, 'ocpxActionType'))
+        })
       })
     },
     close() {

+ 0 - 154
src/views/modules/advertiser/modules/Treeselect.vue

@@ -1,154 +0,0 @@
-<style lang="scss" scoped>
-.select-project {
-  width: 50%;
-}
-</style>
-<template>
-  <div class="select-project">
-    <treeselect
-      :multiple="multiple"
-      :disable-branch-nodes="!multiple"
-      :disable-fuzzy-matching="true"
-      :options="options"
-      :load-options="loadOptions"
-      placeholder="请选择项目"
-      v-model="value"
-      :value-consists-of="valueConsistsOf"
-      @select="update"
-      @input="emitValue"
-      :limit="2"
-      :limitText="
-        count => {
-          return '隐藏' + count + '条'
-        }
-      "
-      noChildrenText="该广告主下暂无项目"
-      noOptionsText="暂无项目"
-    />
-  </div>
-</template>
-
-<script>
-// import the component
-import Treeselect from '@riophae/vue-treeselect'
-// import the styles
-import '@riophae/vue-treeselect/dist/vue-treeselect.css'
-import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect'
-
-import { getAction, postAction } from '@/api/manage'
-import { mapGetters } from 'vuex'
-// We just use `setTimeout()` here to simulate an async operation
-// instead of requesting a real API server for demo purpose.
-
-export default {
-  data: () => ({
-    value: null,
-    valueConsistsOf: 'LEAF_PRIORITY',
-    options: [],
-    mediaId: ''
-  }),
-  props: {
-    multiple: {
-      type: Boolean,
-      default() {
-        return true
-      }
-    },
-    appId: {}
-  },
-  components: { Treeselect },
-  watch: {
-    $route(n, o) {},
-    appId: {
-      handler(n, o) {
-        console.log(n)
-        if (n.length == 0) {
-          if (this.multiple) {
-            this.value = []
-          } else {
-            this.value = ''
-          }
-        }
-      },
-      deep: true
-    }
-  },
-  methods: {
-    ...mapGetters(['nickname', 'avatar', 'userInfo']),
-    update(node, id) {
-      console.log(node, id)
-
-      getAction('/ctop/project/getProjectByAdvertiserAndMediaId', {
-        advertiserId: node.id,
-        mediaId: this.mediaId
-      }).then(res => {
-        console.log(res)
-        if (res.code == 0) {
-          if (res.result.length > 0) {
-            node.children = res.result.map(item => {
-              return {
-                id: item.id,
-                label: item.projectName
-              }
-            })
-          } else {
-          }
-        } else {
-          new Error('Failed to load options: network error.')
-        }
-      })
-    },
-    emitValue() {
-      this.$emit('update:appId', this.value)
-    },
-    getChildren() {},
-    loadOptions({ action, parentNode, callback }) {
-      // Typically, do the AJAX stuff here.
-      // Once the server has responded,
-      // assign children options to the parent node & call the callback.
-      if (action === LOAD_CHILDREN_OPTIONS) {
-        getAction('/ctop/project/getProjectByAdvertiserAndMediaId', {
-          advertiserId: parentNode.id,
-          mediaId: this.mediaId
-        }).then(res => {
-          console.log(res)
-          if (res.code == 0) {
-            if (res.result.length > 0) {
-              parentNode.children = res.result.map(item => {
-                return {
-                  id: item.id,
-                  label: item.projectName
-                }
-              })
-              callback()
-            } else {
-              parentNode.children = []
-              callback()
-            }
-          } else {
-            callback(new Error('Failed to load options: network error.'))
-          }
-        })
-      }
-    },
-    getParticipateList(mediaId) {
-      this.mediaId = mediaId
-      this.value = null
-      getAction('/ctop/advertiser/getAdvertiserByCompany', { userId: this.userInfo().id }).then(res => {
-        console.log(res)
-        if (res.code == 0) {
-          this.options = res.result.map(item => {
-            return {
-              id: item.id,
-              label: item.name,
-              children: null
-            }
-          })
-        }
-      })
-    }
-  },
-
-  mounted() {}
-}
-</script>

+ 759 - 0
src/views/modules/autoLaunch/accelerateExplorationList.vue

@@ -0,0 +1,759 @@
+<template>
+    <div class="toutiaoBatch">
+        
+        
+        <div class="toolbox-automate-rules-create-content_title">
+            <h3>加速探索列表</h3>
+            <!-- <a-button type='primary' @click="goNewConfigInfo" class="goNewConfigInfo">新建配置信息</a-button> -->
+        </div>
+        
+        <div class="topOptions">
+            <div >
+                <Treeselect :appId.sync="accountId" :multiple="false"  request="2,4"   ref="treeSelect" style="margin-bottom:8px;width:600px " />               
+            </div>
+            <span class="optionBtn">
+                <a-button type='primary' @click="search" class="searchBtn">查询</a-button>
+            </span>
+        </div>
+        <div class="tableArea">
+            <!-- <div class="tableOption" v-if="selectedRowKeys.length">
+                
+                
+               :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }"
+            </div> -->
+            <div class="table">
+                <a-table
+                    :columns="columns"
+                    :data-source="data"
+                    bordered
+                    :pagination="ipagination"
+                    :loading="loading"
+                    @change="sort"
+                    :scroll="{'x':scrollX}"
+                    
+                >
+                    <span slot="status" slot-scope="text,record">
+                        <a-spin :spinning="record.spin" size="small" >
+                            <div class="spin-content">
+                                <a-switch size="default" :checked='text==1'  @change="switchChange(text,record)"/>
+                            </div>
+                        </a-spin>    
+                        
+                    </span>
+                    <span slot="openProgramCreate" slot-scope="text,record">
+                        <a-spin :spinning="record.openProgramCreateSpin" size="small" >
+                            <div class="spin-content">
+                                <a-switch size="default" :checked='text==1'  @change="openProgramCreateSwitchChange(text,record)"/>
+                            </div>
+                        </a-spin>    
+                        
+                    </span>
+                    <span slot="cpaBid" slot-scope="text">
+                        {{text/1000}}
+                    </span>
+                    <span slot="authName" slot-scope="text">
+                        <!-- <a href="javascript:;" >{{text}}</a> -->
+                        {{text || '-'}}
+                    </span>
+                    <span slot="time" slot-scope="text,record">
+                        {{record.startTime}}至{{record.endTime}}
+                    </span>
+                    <span slot="operator" slot-scope="text,record">
+                        <a href="javascript:;"  @click="goPlanList(record)">编辑</a>
+                        <a-divider type="vertical" />
+                        <a href="javascript:;"  @click="deleteRecord(record)">删除</a>
+                        <a-divider type="vertical" />
+                        <a-popover v-model="record.show" trigger="click" placement="topRight" @visibleChange='visibleChange'>
+                            <div slot="content">
+                                    <span style='font-weight:700;margin-right:15px;font-size:15px'>修改后重提</span>
+                                    <a-radio-group v-model="examineAgainType" >
+                                        <a-radio :value="1">修改广告语</a-radio>
+                                        <a-radio :value="0">修改封面</a-radio>
+                                    </a-radio-group>
+                                    <a-button type='default' @click="examineAgainCancel(record)" size='small' style='margin-right:10px'>取消</a-button>
+                                    <a-button type='primary' @click="examineAgainOk(record)" size='small'  class="ok">重提</a-button>
+                            </div>
+                            <a href="javascript:;"  type='primary' @click="()=>{record.show=true}">一键重提</a>
+                            
+                        </a-popover>
+                        <a-divider type="vertical" />
+                        <a-popover v-model="record.visible" trigger="click" placement="topLeft" @visibleChange='visibleChange'>
+                            <span slot="title">出价</span>
+                            <template  slot="content" style="width:300px;">
+                                <div style="margin:5px 0 0">
+                                    <span ><a-input-number :min="0" v-model="newBid" :step="0.1" placeholder="请输入出价" size="small" style='margin-right:20px;width:120px' /></span>
+                                    <p style="color:red;font-size:12px;height:16px;padding:5px 0">{{bidErrorMessage}}</p>
+                                </div>
+                                
+                                <div>
+                                    <a-button type='default' @click="bidChangeCancel(record)" size='small' style='margin-right:10px'>取消</a-button>
+                                    <a-button type='primary' @click="bidChangeOk(record)" size='small' class="ok">修改</a-button>
+                                </div>
+                                
+                            </template>
+                            <a href="javascript:;"  type='primary' @click="()=>{record.visible=true}">修改出价</a>
+                        </a-popover>
+                    </span>
+
+                </a-table>
+            </div>
+        </div>
+        
+       
+              
+    <!-- </a-spin> -->
+    </div>
+</template>
+
+<script>
+import moment from 'moment';
+import { getAction, postAction, downFile, downFilePost,deleteAction } from '@/api/manage';
+// import { JeecgListMixin } from '@/mixins/ipagination'
+// import editableCell from './editableCell'
+import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
+import qs from 'qs'
+let typeValue='预算'
+
+
+const strategyColumns = [
+  
+  {
+    title: '广告组名称',
+    dataIndex: 'name',
+    key: 'name',
+    align: 'center',
+    scopedSlots: { customRender: 'name' },
+    width:200,
+    fixed: 'left'
+  },
+   {
+    title: '广告组ID',
+    dataIndex: 'authName',
+    key: 'authName',
+    align: 'center',
+    scopedSlots: { customRender: 'authName' }, 
+    width:150,
+    fixed: 'left'  
+  },
+  {
+    title: '所属广告账户',
+    dataIndex: 'accountId',
+    key: 'accountId',
+    align: 'center',
+    scopedSlots: { customRender: 'accountId' },   
+    width:200,
+    fixed: 'left' 
+  },
+  
+  {
+    title: '所属项目',
+    dataIndex: 'createTime',
+    key: 'createTime',
+    align: 'center',
+    scopedSlots: { customRender: 'createTime' },
+    width:150,
+    fixed: 'left' 
+  },
+  {
+    title: '探索状态',
+    dataIndex: 'createTsime',
+    key: 'createTime',
+    align: 'center',
+    scopedSlots: { customRender: 'createTime' },
+
+  },
+  {
+    title: '探索预算',
+    dataIndex: 'createTimes',
+    key: 'createTime',
+    align: 'center',
+    scopedSlots: { customRender: 'createTime' },
+    
+  },
+  {
+        title: '优化目标',
+        dataIndex: 'cpaBid',
+        align: 'center',    
+        scopedSlots: { customRender: 'cpaBid' },
+        // sorter:() => {}
+    },
+ 
+    {
+          title: '消耗(元)',
+          dataIndex: 'cost',
+          width:150,
+          tip: '广告在投放期间的花费总额',
+          align: 'center',
+          scopedSlots: { customRender: 'cost' },
+        //   sorter: () => {}
+        },
+        {
+          title: '封面曝光数',
+          dataIndex: 'photoShow',
+          tip: '广告在瀑布流被观看次数',
+          align: 'center',       
+          scopedSlots: { customRender: 'photoShow' },
+        //   sorter:() => {}
+        },
+        {
+          title: '封面点击数',
+          dataIndex: 'photoClick',
+          tip: '用户点击封面进入视频播放页的次数(数据会进行反作弊去重)',
+          align: 'center',
+        
+          scopedSlots: { customRender: 'photoClick' },
+        //   sorter: () => {}
+        },
+        {
+          title: '封面点击率',
+          dataIndex: 'clickRate',
+          tip: '封面点击数占封面展示数百分比',
+          align: 'center',    
+          scopedSlots: { customRender: 'clickRate' },
+        //   sorter:() => {}
+        },
+        {
+          title: '封面点击单价',
+          dataIndex: 'clickCost',
+          tip: '封面点击数占封面展示数百分比',
+          align: 'center',    
+          scopedSlots: { customRender: 'clickCost' },
+        //   sorter:() => {}
+        },
+        {
+          title: '转化数',
+          dataIndex: 'aclick',
+          tip: '用户进入视频播放页观看的次数(数据会进行反作弊去重)',
+          align: 'center',
+       
+          scopedSlots: { customRender: 'aClick' },
+        //   sorter:() => {}
+        },
+        {
+          title: '转化成本',
+          dataIndex: 'bclick',
+          tip: '用户在视频播放页单击转化按钮的次数/展示数*100%',
+          align: 'center',
+        
+          scopedSlots: { customRender: 'bClick' },
+        //   sorter:() => {}
+        },
+        
+        {
+          title: '转化率',
+          dataIndex: 'bClickRate',
+          tip: '行为数占素材曝光数百分比',
+          align: 'center',    
+          scopedSlots: { customRender: 'bClickRate' },
+        //   sorter:() => {}
+        },
+ {
+    title: '操作',
+    dataIndex: 'status',
+    key: 'status',
+    align: 'center',
+    scopedSlots: { customRender: 'status' },
+    width:150,
+    fixed:'right'
+  },
+
+];
+
+const publicColumns = [    
+    
+]
+
+export default {
+    name:'strategy-list',
+    components: {
+        // editableCell,
+        Treeselect,
+    },
+    // mixins: [JeecgListMixin],
+    data() {
+        return {
+            selectedRecord:{},
+            bidErrorMessage:'',
+            examineAgainType:1,
+            newBid:undefined,
+            examineAgain:false,
+            accountId:[],
+            accountList:[],
+            strategyState:undefined,
+            strategyName:'',
+            strategyId:undefined,
+            accountId:[],
+            scrollX:2500,
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                //   pageSizeOptions: ['10', '20', '30'],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条"
+                },
+                showQuickJumper: true,
+                showSizeChanger:true,
+                pageSizeOptions: ['10', '30', '50'],
+                total: 0,
+                onChange: (current, pageSize) => {
+                    // 切换分页时的回调,
+                    // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+                    this.ipagination.current = current;
+                    this.ipagination.pageSize= pageSize;
+                }
+            },
+           
+            spinning:false,
+            moment,
+           
+            optionId:'',//input输入的id或关键词
+          
+           
+            selectDisable:true,
+            optValue:undefined,//操作设置的值 删除 暂停 开启
+            visible: false,//出价里的弹出框
+
+            //主页的表格
+            data:[],
+            columns:[...strategyColumns,...publicColumns],
+            selectedRowKeys:[],
+            
+            loading:false,
+            editID:0,
+
+            url: {               
+                list:'/ctop/aiKuaishouAdvertiserStrategy/list',
+                delete:'/ctop/aiKuaishouAdvertiserStrategy/delete',
+            },
+
+
+            xiugaiData:[],//存分别修改时候的数组
+        }
+    },
+    computed: {
+        hasSelected() {
+        return this.selectedRowKeys.length > 0;
+        },
+    },
+    methods: {
+        // 加速探索OK事件
+        targethandleOk(e){
+            this.targetVisible=true
+        },
+        //状态改变
+        switchChange(text,record){
+            // this.spinning=true;
+            console.log(text,record)
+            record.spin=true;
+            
+            
+            let status=text==1?0:1;
+            getAction(`/ctop/aiKuaishouAdvertiserStrategy/oprateStatus`,{
+                id:record.id,
+                status
+            }).then((res)=>{
+                
+                    record.spin=false;
+                if(res.success){
+                    this.getStrategyList()
+                    this.$message.success(res.message)
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+           
+
+        },
+        //是否开启程序化创意状态改变
+        openProgramCreateSwitchChange(text,record){
+            // this.spinning=true;
+            console.log(text,record)
+            record.openProgramCreateSpin=true;
+            
+            
+            let status=text==1?0:1;
+            getAction(`/ctop/aiKuaishouAdvertiserStrategy/oprateCreativeStatus`,{
+                id:record.id,
+                status
+            }).then((res)=>{
+                
+                    record.openProgramCreateSpin=false;
+                if(res.success){
+                    this.getStrategyList()
+                    this.$message.success(res.message)
+                }else{
+                    this.$message.error(res.message)
+                }
+            })
+           
+
+        },
+        examineAgainMethod(record){
+            console.log(record)
+            this.examineAgain=true;
+            this.selectedRecord=record
+        },
+        visibleChange(){
+            this.bidErrorMessage='';
+            this.examineAgainType=1;
+            this.newBid=undefined;
+            
+        },
+        bidChangeCancel(record){
+            record.visible=false;
+            this.newBid=undefined;
+            this.bidErrorMessage=''
+        },
+        bidChangeOk(record){
+            if(this.newBid){
+                record.visible=false;
+                postAction('/ai/batchUpdate/updateGroupBid',{
+                    accountId:record.accountId,
+                    bid:this.newBid*1000
+                }).then(res=>{
+                    console.log(res)
+                    if(res.code==0){
+                        this.$message.success(res.message)
+                        this.newBid=undefined;
+                        this.getStrategyList()
+                    }
+                    
+                })
+            }else{
+                this.bidErrorMessage='请正确填写出价'
+                // this.$message.error('请正确填写出价')
+            }
+            
+        },
+
+        examineAgainCancel(record){
+            record.show=false;
+            this.examineAgainType=1
+        },
+        examineAgainOk(record){
+            record.show=false;
+            postAction('/kuaishou/creative/again',{
+                accountId:record.accountId,
+                updateType:this.examineAgainType
+            }).then(res=>{
+                console.log(res);
+                if(res.code==0){
+                    this.$message.success('正在重提中,您可稍后查看结果')
+                }else{
+                    this.$message.success(res.message)
+                }
+                this.examineAgainType=1
+            })
+            
+        },
+        onSelectChange(selectedRowKeys) {
+            console.log('selectedRowKeys changed: ', selectedRowKeys);
+            this.selectedRowKeys = selectedRowKeys;
+        },
+        goNewConfigInfo(){
+            this.$router.push('/autoLaunch/configLaunchInfo')
+        },
+        goPlanList(record){
+            console.log(record)
+            this.$parent.currentStrategyId=record.id;
+            this.$router.push(`/autoLaunch/configLaunchInfo?id=${record.id}`)
+        },
+        deleteRecord(record){
+            this.loading=true
+            deleteAction(this.url.delete,{
+                id:record.id
+            }).then(res=>{
+                this.loading=false
+                if(res.success){
+                    this.$message.success(res.message);
+                    this.getStrategyList()
+                }else{
+                    this.$message.success(res.message);
+                }
+            })
+        },
+        filterOption(input, option) {
+            return (
+                option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            );
+        },
+        
+        //查询按钮事件
+        search(){
+            this.ipagination.current=1;
+            this.getStrategyList()            
+        },
+        //点击分页
+        sort(pagination, filters, sorter, { currentDataSource }){
+            console.log(pagination)
+            this.ipagination.current=pagination.current;
+
+            this.ipagination.pageSize=pagination.pageSize;
+            this.getStrategyList()
+        },
+
+        getStrategyList(){
+            this.loading = true
+            console.log(this.accountId)
+            getAction(this.url.list,{
+                strategyId:this.strategyId==undefined?null:this.strategyId,
+                accountId:this.accountId,
+                pageNo:this.ipagination.current,
+                pageSize:this.ipagination.pageSize
+            }).then((res)=>{
+                this.data=[]
+                console.log(res)
+                this.loading = false
+                if(res.success){
+
+                    this.ipagination.total = res.result.total
+                    
+                    res.result.records.forEach((item)=>{
+                        item.key=item.id;
+                        item.show=false;
+                        item.visible=false;
+                        item.spin=false;
+                        item.openProgramCreateSpin=false;
+                    })
+
+                    this.data = res.result.records;
+                    this.selectedRowKeys=[];
+                }
+            })
+        },
+      
+    },
+    mounted() {
+       
+        this.getStrategyList()
+    },
+    
+    activated() {
+        this.getStrategyList()
+    },
+    beforeDestroy() {
+
+    },
+    filters: {
+        toPercentage(val) {
+            if(val){
+                if(typeof val != 'string'){
+                    return (val * 100).toFixed(2) + '%'
+                }else{
+                    return val
+                }
+            }else if(typeof val =='string'){
+                    return val
+                }
+            else{
+                return 0
+            }
+        },
+        //保留两位小数并且变成货币格式
+        decimalsHandle(val){
+
+            if(val && typeof val !='string'){
+                if(val>=0){
+                    val=parseFloat(val).toFixed(2);
+                    let numberStr = val.toString()
+                    let str = numberStr.split('.')
+
+                    let str0=str[0].split('').reverse();
+                    for (let i = 0; i < str0.length; i++) {
+                        if ((i + 1) % 4 === 0) {
+                            str0.splice(i, 0, ',')
+                        }
+                    }
+                    str0.reverse()
+                    let handleResult = ''
+                    for (let j = 0; j < str0.length; j++) {
+                        handleResult += str0[j]
+                    }
+
+                    return handleResult+'.'+str[1]
+                }else{
+                    val=parseFloat(val).toFixed(2);
+                    let numberStr = val.toString()
+                    let str = numberStr.split('.')
+
+                    let str0=str[0].substr(1).split('').reverse();
+                    for (let i = 0; i < str0.length; i++) {
+                        if ((i + 1) % 4 === 0) {
+                            str0.splice(i, 0, ',')
+                        }
+                    }
+                    str0.reverse()
+                    let handleResult = ''
+                    for (let j = 0; j < str0.length; j++) {
+                        handleResult += str0[j]
+                    }
+
+                    return '-'+handleResult+'.'+str[1]
+                }
+
+            }else if(typeof val =='string'){
+                return val
+            }
+            else{
+                return 0
+            }
+        },
+        //变成货币格式
+        formatCurrency(val){
+            if((val||val==0)&& typeof val !='string'){
+                let numberStr = val.toString()
+                let str = numberStr.split('').reverse()
+                for (let i = 0; i < str.length; i++) {
+                    if ((i + 1) % 4 === 0) {
+                    str.splice(i, 0, ',')
+                    }
+                }
+                str.reverse()
+                let handleResult = ''
+                for (let j = 0; j < str.length; j++) {
+                    handleResult += str[j]
+                }
+                return handleResult
+            }else if(typeof val =='string'){
+                    return val
+            }
+            else{
+                return '-'
+            }
+
+        },
+        
+        
+    }
+}
+</script>
+<style lang="scss">
+    #closeIcon{
+         color: #0E74D2;
+    }
+    .toutiaoBatch{
+        .ant-tag .anticon-close {      
+            color: #1890ff;        
+        }
+        .ant-tag .anticon-close:hover{      
+            color: rgba(0, 0, 0, 0.85);    
+        }
+
+    }
+    
+    .ant-tooltip-inner,.ant-tooltip-arrow::before{
+        background-color: #fff;
+        color: #333;
+    }
+    #batchModal{
+        .rules,.totalPrice{
+            font-weight: 600;
+        }
+
+        .selectePlan{
+            font-size: 14px;
+            font-weight: 700;
+            color: #333;
+            padding: 20px 0;
+        }
+        .totalPrice{
+            margin-left: 20px;
+        }
+        .modifyTable{
+            margin-top: 20px;
+            width: 100%;
+            height: 400px;
+            overflow: auto;
+            font-weight: 600;
+        }
+    }
+    #copyModal{
+        .ant-modal-header{
+            text-align: center;
+        }
+        .copyTip{
+            font-size: 12px;
+            color: #999;
+        }
+        .copyName{
+            width: 118px;
+            display: inline-block;
+            text-align: right;
+            .copyKeyStart{
+                color: red;
+            }
+        }
+        // font-weight: 600;
+    }
+</style>
+<style lang="scss" scoped>
+.toutiaoBatch{
+    .breadcrumb{
+            height: 22px;
+            font-size: 12px;
+            font-family: PingFangSC-Regular, PingFang SC;
+            font-weight: 400;
+            color: #000000;
+            line-height: 22px;
+        }
+    background-color: #fff;
+    padding: 10px 20px;
+    position: relative;
+    width: 100%;
+    .OptinItem{
+        display: inline-block;
+        margin-right: 15px;
+        margin-top: 15px;
+        .ok{
+            margin-right: 15px;
+        }
+    }
+    .OptinItem:first-child{
+        margin-right: 10px;
+    }
+    .topOptions{
+        padding: 15px 0;
+        display: flex;
+        justify-content: space-between;
+        .topOpt{
+            width: 100%;
+            margin-bottom: 10px;
+        }
+    }
+    .optionBtn{
+        // display: inline-block;
+        float: right;
+        // .searchBtn{
+            // margin-right: 10px;
+        // }
+    }
+    .tableArea{
+        .tableOption{
+            padding: 20px 0;
+        }
+    }
+    .toolbox-automate-rules-create-content_title {
+        background-color: #fff;
+        display: flex;
+        flex-flow: row nowrap;
+        justify-content: flex-start;
+        align-items: center;
+        margin-bottom: 28px;
+        position: relative;
+        h3 {
+            font-size: 22px;
+            margin: 0;
+            font-weight: 400;
+            height: 30px;
+            line-height: 30px;
+        }
+        .goNewConfigInfo{
+            position: absolute;
+            right: 0;
+            top: 4px;
+        }
+    }
+
+}
+
+</style>

+ 1 - 1
src/views/modules/autoLaunch/appIdList.vue

@@ -529,7 +529,7 @@ export default {
 
     }
     
-    .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+    .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 1 - 1
src/views/modules/autoLaunch/autoLaunchReport.vue

@@ -1987,7 +1987,7 @@ const publicColumns = [
 .autoLaunchReport{
 
 
-     .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+     .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 168 - 68
src/views/modules/autoLaunch/configLaunchInfo.vue

@@ -35,10 +35,10 @@
                     <a-form-item >
                         <a-radio-group   v-decorator="['campaignType',{initialValue:2 }]" @change="campaignTypeChange">
                             <a-radio-button :value="2">提升应用安装</a-radio-button>
-                            <a-radio-button :value="3">获取电商下单</a-radio-button>                                   
-                            <a-radio-button :value="4">推广品牌活动</a-radio-button>                                   
-                            <a-radio-button :value="5">收集销售线索</a-radio-button>                                   
-                            <a-radio-button :value="7">提高应用活跃</a-radio-button>                                   
+                            <a-radio-button :value="3" :disabled='true'>获取电商下单</a-radio-button>                                   
+                            <a-radio-button :value="4" :disabled='true'>推广品牌活动</a-radio-button>                                   
+                            <a-radio-button :value="5" :disabled='true'>收集销售线索</a-radio-button>                                   
+                            <a-radio-button :value="7" :disabled='true'>提高应用活跃</a-radio-button>                                   
                         </a-radio-group>
                     </a-form-item>
                 </div>
@@ -296,14 +296,79 @@
                         </div>
                         <div class="input-item">
                             <a-form-item>
-                                 <a-radio-group  v-decorator="['platformOs', {initialValue:1 }]" >
+                                 <a-radio-group  v-decorator="['platformOs', {initialValue:1 }]" @change="platformOsChange">
                                     <a-radio-button :value="0">不限</a-radio-button>
                                     <a-radio-button :value="1">Android</a-radio-button>
                                     <a-radio-button :value="2">IOS</a-radio-button>
                                 </a-radio-group>
                             </a-form-item>
+
+                            <!-- <div style="margin-top:24px"  v-if="getFormData('platformOs')!=0">
+                                <div v-if="getFormData('platformOs')==1">
+                                    <a-form-item>
+                                    <a-radio-group v-decorator="['androidOsv',{initialValue: 3,}]">
+                                        <a-radio :value="3">不限</a-radio>
+                                        <a-radio :value="4">4X+</a-radio>
+                                        <a-radio :value="5">5x+</a-radio>
+                                        <a-radio :value="6">6x+</a-radio>
+                                        <a-radio :value="7">7x+</a-radio>
+                                    </a-radio-group>
+                                    </a-form-item>
+                                </div>
+                                <div v-if="getFormData('platformOs')==2">
+                                    <a-form-item>
+                                    <a-radio-group  v-decorator="['iosOsv',{initialValue: 6,}]">
+                                        <a-radio :value="6">不限</a-radio>
+                                        <a-radio :value="7">7X+</a-radio>
+                                        <a-radio :value="8">8x+</a-radio>
+                                        <a-radio :value="9">9x+</a-radio>
+                                        <a-radio :value="10">10x+</a-radio>
+                                    </a-radio-group>
+                                    </a-form-item>
+                                </div>
+                                
+                            </div> -->
                         </div>
                     </div>
+                    <!-- <div class="row-item" v-if="getFormData('platformOs')!=2">
+                        <div class="hint-item"></div>
+                        <div class="label-item">
+                        <div class="text-item">设备品牌</div>
+                        <div class="required-item"></div>
+                        </div>
+                        <div class="input-item">
+                        <a-form-item>
+                            <a-radio-group v-model="deviceBrand">
+                                <a-radio-button :value="0">不限</a-radio-button>
+                                <a-radio-button :value="1">选择品牌</a-radio-button>                      
+                            </a-radio-group>
+                        </a-form-item>
+                        <div style="width: 400px; margin-top: 24px;" class="inventoryTypes" v-if="deviceBrand==1">
+                            <div class="inventory-tags-lists-header" style="padding-left:15px">
+                                
+                            <div class="inventory-tags-lists-name"><strong>品牌名称</strong></div>
+                            </div>
+                            <div class="inventory-tags-lists-container" >
+                                <a-checkbox-group
+                                    v-decorator="['deviceBrand', { rules: [{ required: true, message: '请选择设备品牌' }] }]"
+                                >
+                                <a-checkbox :value="1" style="margin-bottom: 8px">OPPO</a-checkbox>
+                                <a-checkbox :value="2" style="margin-bottom: 8px">VIVO</a-checkbox>
+                                <a-checkbox :value="3" style="margin-bottom: 8px">华为</a-checkbox>
+                                <a-checkbox :value="4" style="margin-bottom: 8px">小米</a-checkbox>
+                                <a-checkbox :value="5" style="margin-bottom: 8px">荣耀</a-checkbox>
+                                <a-checkbox :value="6" style="margin-bottom: 8px">三星</a-checkbox>
+                                <a-checkbox :value="7" style="margin-bottom: 8px">金立</a-checkbox>
+                                <a-checkbox :value="8" style="margin: 0 0 8px 0">魅族</a-checkbox>
+                                <a-checkbox :value="9" style="margin-bottom: 8px">乐视</a-checkbox>
+                                <a-checkbox :value="10" style="margin-bottom: 8px">其他</a-checkbox>
+                                <a-checkbox :value="11" v-if="getFormData('platformOs') == 0" style="margin-bottom: 8px">苹果</a-checkbox>
+                                </a-checkbox-group>
+                            </div>
+                        </div>                  
+                        
+                        </div>
+                    </div> -->
                     <div class="row-item">
                         <div class="hint-item"></div>
                             <div class="label-item">
@@ -830,7 +895,8 @@
                         </div>
                         <div class="input-item">
                         <a-form-item>
-                            <a-input v-decorator="['clickTrackUrl']" />
+                            <a-input v-decorator="['clickTrackUrl']"  @focus="clickTrackUrlFocus"  @blur="clickTrackUrlBlur"/>
+                            <span v-show="clickTrackUrlTip" style="font-size:14px;color:red;">填写点击检测连接的话,开始播放链接必须填写</span>
                         </a-form-item>
                         </div>
                     </div>
@@ -1231,6 +1297,8 @@ export default {
     },
     data() {
         return {
+            clickTrackUrlTip:false,
+            // deviceBrand:0,
             tongbuLoading:false,
             refreshPopulationLoading:false,
             noAreaBreak:false,
@@ -1403,7 +1471,7 @@ export default {
                     accountId:this.accountId,
                 }).then((res) => {
                     if (res.success) {
-                        console.log(res)
+                        //console.log(res)
                         this.createOptions = res.result
                     }
                 })
@@ -1424,7 +1492,7 @@ export default {
                 return {
                     // selectedRowKeys: this.incluedSelectedRowKeys,
                     onChange: (selectedRowKeys, selectedRows) => {
-                        console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
+                        //console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
                         this.incluedSelectedRowKeys = selectedRowKeys;
                         this.incluedSelectedKeys=selectedRows
                     },
@@ -1441,7 +1509,7 @@ export default {
                 return {
                     // selectedRowKeys: this.excludeSelectedRowKeys,
                     onChange: (selectedRowKeys, selectedRows) => {
-                        // console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
+                        // //console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
                         // this.selectedRowKeys = selectedRowKeys;
                         this.excludeSelectedRowKeys = selectedRowKeys;
                         this.excludeSelectedKeys=selectedRows
@@ -1457,6 +1525,12 @@ export default {
             },
     },
     methods: {
+        platformOsChange(e){
+            //console.log(e);
+            // this.deviceBrand=0;
+            this.sysType=e.target.value;
+            this.sysTypeChange(e)
+        },
         refreshPopulation(){
             if(this.accountId){
                 this.refreshPopulationLoading = true
@@ -1518,10 +1592,10 @@ export default {
         },
         selectAllAppId(){
            
-            console.log(this.getFormData('appId'))
+            //console.log(this.getFormData('appId'))
         },
         singleAppidChange(e){
-            // console.log(e.target.value,this.getFormData('appId'));
+            // //console.log(e.target.value,this.getFormData('appId'));
             this.form.setFieldsValue({
                 appId:undefined
             })
@@ -1535,7 +1609,7 @@ export default {
             return this.form.getFieldValue(className)
         },
         dateChange(date, dateString) {
-        // console.log(date,dateString)
+        // //console.log(date,dateString)
             this.form.getFieldDecorator('startTime')
             this.form.getFieldDecorator('endTime')
             this.form.setFieldsValue({
@@ -1546,7 +1620,7 @@ export default {
     
         //推广目的改变
         campaignTypeChange(e){
-            console.log(e.target)
+            //console.log(e.target)
             let strategyNamepart=this.campaignTypeHandle(e.target.value);
             this.strategyName ='[策略]_'+ strategyNamepart+'_' + moment().format('MM_DD_hh:mm') ;
             this.getActionBarText()
@@ -1568,7 +1642,7 @@ export default {
             this.accountIds=[];
             getAction('/ctop/projectMember/getProjectAccountByUserId?mediaType=2', {}).then(res => {
             if(res.success){
-                    // console.log(res);
+                    // //console.log(res);
                     if(res.result){
                         res.result.forEach((element,index) => {
                         if(element){                  
@@ -1590,7 +1664,7 @@ export default {
                             }                           
                         }      
                         });
-                        // console.log(this.treeData)
+                        // //console.log(this.treeData)
                         
                     }
             }
@@ -1626,25 +1700,25 @@ export default {
 
 
         creativeTagValid(rule, value, callback) {
-            console.log(rule, value, callback)
+            //console.log(rule, value, callback)
             if(value.length == 0 || value==undefined){
-                // console.log(1)
+                // //console.log(1)
                    callback('创意标签必须填写') 
                 
             }else if (value.length > 10) {
                 callback('创意标签最多填写10个,请删减')
             }else{
-                // console.log(2)
+                // //console.log(2)
                 callback()
             }
         },
         directionalChange(checkedList) {
-            // console.log(checkedList)
+            // //console.log(checkedList)
             this.indeterminateDirectional = !!checkedList.length && checkedList.length < this.directionalList.length;
             this.checkAllDirectional = checkedList.length === this.directionalList.length;
         },
         onCheckAllDirectionalChange(e) {
-            console.log(e)
+            //console.log(e)
             let valueOption=[];
             valueOption=this.directionalList.map(item=>{
                 return item.id
@@ -1659,7 +1733,7 @@ export default {
             this.useDirectionalVisible=false 
         },
         useDirectionalChange(e){
-            console.log(e);
+            //console.log(e);
             if(e.target.value==0){
                 // this.useDirectionalVisible=true;
                 this.getUserDirectional()
@@ -1670,12 +1744,12 @@ export default {
             getAction('/kuaishou/batch/getDirectionalTemplate',{
                 accountId:this.accountId
             }).then(res=>{
-                console.log(res);
+                //console.log(res);
                 this.directionalList=res.result
             })
         },
         appIdChange(val){
-            console.log(val)
+            //console.log(val)
             this.siteList=[]
             
             // this.getPageList(val)
@@ -1717,18 +1791,18 @@ export default {
             return current && current < moment().subtract(1, 'day')
         },
         bidTypeChange(e){
-            console.log(e);
+            //console.log(e);
             this.chargeMethods=e.target.value==10?"OCPM":'CPC'
         },
         getData(className) {
             return this.form.getFieldValue(className)
         },
         handleChange(val){
-            console.log(val)
+            //console.log(val)
         },
         // 投放日期改变
         scheduleTypeChange(val){
-            console.log(val)
+            //console.log(val)
             if(val=='SCHEDULE_FROM_NOW'){
                 this.dateRange=[moment(),moment().add(10,'years')]
                 
@@ -1768,7 +1842,7 @@ export default {
 
 
             customCrowdChange(e){
-                console.log(e);
+                //console.log(e);
                 if(e.target.value=='1' || e.target.value=='2'){
                     this.retargetTabChange();
                     this.tabKey=e.target.value
@@ -1780,14 +1854,14 @@ export default {
 
             // 自定义人群的--同时定向排除tab切换事件
             retargetTabChange(){
-                console.log()
+                //console.log()
                 this.retargetDataAll=[];
                 this.loading=true;
                 
                     getAction('/kuaishou/batch/getPopulationList',{
                         accountId:this.accountId
                     }).then((res)=>{
-                        // console.log(res)
+                        // //console.log(res)
                         this.loading=false;
                         if(res.success){
                             res.result.forEach((ele)=>{
@@ -1804,29 +1878,29 @@ export default {
                     })
             },
             onSelectChange(selectedRowKeys) {
-                // console.log('selectedRowKeys changed: ', selectedRowKeys);
+                // //console.log('selectedRowKeys changed: ', selectedRowKeys);
                 this.selectedRowKeys = selectedRowKeys;
             },
             // 自定义人群的改变
             retargetTableChange(pagination, filters, sorter){
-                // console.log(pagination);
+                // //console.log(pagination);
             },
 
             //获取选中的城市
             getSelectedCityArr(val){
-                console.log(val);
+                //console.log(val);
                 this.region=[];
                 this.region=val;
             },
             // 获取选中的区县
             getSelectedCountyArr(val){
-                // console.log(val)
+                // //console.log(val)
                 this.region=[];
                 this.region=val;
             },
             //获取选中的年龄段
             getAgeSelect(val){
-                // console.log(val)
+                // //console.log(val)
                 if(val.length==1&&val[0]==""){
                     this.agesRange=[]
                 }else{
@@ -1836,12 +1910,12 @@ export default {
             },
             //获取智能放量定向的值
             getAutoExtendEnabled(val){
-                // console.log(val)
+                // //console.log(val)
                 this.autoExtendTargets=[];
                 this.autoExtendTargets.push(...val)
             },
             callback(val) {
-                console.log(val);
+                //console.log(val);
             },
 
         
@@ -1866,7 +1940,7 @@ export default {
             return this.form.getFieldValue(className)
         },
         dateChange(date, dateString) {
-        // console.log(date,dateString)
+        // //console.log(date,dateString)
             this.form.getFieldDecorator('beginTime')
             this.form.getFieldDecorator('endTime')
             this.form.setFieldsValue({
@@ -1883,7 +1957,7 @@ export default {
         //   var strRegex = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/|www\.)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/
             var strRegex = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+(.+[A-Za-z0-9-~\/])+$/
             var re = new RegExp(strRegex)
-            // console.log(re.test(res))
+            // //console.log(re.test(res))
             if (re.test(res)) {
                 return true
             } else {
@@ -1891,7 +1965,7 @@ export default {
             }
         },
         validateURL(rule, value, callback) {
-            // console.log(rule, value, callback);
+            // //console.log(rule, value, callback);
 
             if (this.IsURL(value)) {
                 callback()
@@ -1902,7 +1976,7 @@ export default {
             }
         },
         validateName(rule, value, callback){
-        // console.log(rule, value, callback);
+        // //console.log(rule, value, callback);
 
             if (value) {
             callback()
@@ -1911,7 +1985,7 @@ export default {
             }
         },
         validateBid(rule, value, callback){
-        // console.log(rule, value, callback);
+        // //console.log(rule, value, callback);
             if (value) {
             callback()
             } else {
@@ -1929,13 +2003,13 @@ export default {
         this.$nextTick(()=>{
   
             this.form.validateFields((err, values) => {
-                console.log(values) 
+                //console.log(values) 
                 if (!err) {                   
                     this.goNextloading=true;
                     if(this.district!='NONE'){
                         values.district=this.district
                     }
-                    console.log(this.excludeSelectedKeys,this.incluedSelectedKeys)
+                    // //console.log(this.excludeSelectedKeys,this.incluedSelectedKeys)
                     
                     // 设置广告位值
                     if(this.adposition!='inventoryTypes'){
@@ -1967,14 +2041,21 @@ export default {
                     
                     values.convertId=this.convertId==''?undefined:this.convertId;
 
-                    let excludePopulation=this.excludeSelectedKeys.map(item=>{
-                        return item.id
-                    })
-                    let population=this.incluedSelectedKeys.map(item=>{
-                        return item.id
-                    })
-                    values.excludePopulation=excludePopulation.length>0?JSON.stringify(excludePopulation):undefined;
-                    values.population=population.length>0?JSON.stringify(population):undefined;
+                    // let excludePopulation=this.excludeSelectedKeys.map(item=>{
+                    //     return item.id
+                    // })
+                    // //console.log(this.excludeSelectedKeys)
+                    // let population=this.incluedSelectedKeys.map(item=>{
+                    //     return item.id
+                    // })
+                    if(values.customCrowd==0){
+                        values.excludePopulation='[]';
+                        values.population='[]';
+                    }else{
+                        values.excludePopulation=this.excludeSelectedRowKeys.length>0?JSON.stringify(this.excludeSelectedRowKeys):'[]';
+                        values.population=this.incluedSelectedRowKeys.length>0?JSON.stringify(this.incluedSelectedRowKeys):'[]';
+                    }
+                    
                     
                     
                     values.useAppMarket=values.useAppMarket?'1':'0'
@@ -2002,6 +2083,10 @@ export default {
                          values.creativeCategory=undefined
                     }
                     
+                    // if(this.deviceBrand==0){
+                        
+                    // }
+                    // values.deviceBrand=this.deviceBrand==0?'[0]':JSON.stringify(values.deviceBrand)
                     values.accountId = this.accountId
                    
                     values.creativeTag=values.creativeTag?JSON.stringify(values.creativeTag):undefined
@@ -2010,7 +2095,7 @@ export default {
                     values.noGenderBreak=this.noGenderBreak?1:0
                     values.noAgeBreak=this.noAgeBreak?1:0
 
-                    console.log('Received values of form: ', values)
+                    //console.log('Received values of form: ', values)
                     let url=''
                     if(this.editRecordId){
                         url='/ctop/aiKuaishouAdvertiserStrategy/edit';
@@ -2019,7 +2104,7 @@ export default {
                         url='/ctop/aiKuaishouAdvertiserStrategy/add'
                     }
                     postAction(url,values).then(res=>{
-                        console.log(res)
+                        //console.log(res)
                         this.goNextloading=false
                         if(res.success){                            
                             
@@ -2044,7 +2129,7 @@ export default {
                     //     dataType:'json',
                     //     success:(res)=>{
                     //         this.goNextloading=false
-                    //         console.log(res)
+                    //         //console.log(res)
                     //         let result=JSON.parse(res)
                     //         if(result.code==0){                            
                     //             this.$router.replace('/autoLaunch/configLaunchList')
@@ -2056,7 +2141,7 @@ export default {
                     //         }
                     //     },
                     //     error:(res)=>{
-                    //         console.log(res)
+                    //         //console.log(res)
                     //     }
                     // })
 
@@ -2105,7 +2190,7 @@ export default {
             params.accountId = this.accountId
             params.type = this.convertType
             getAction('/kuaishou/batch/getConvertList', params).then(res => {
-            console.log(res)
+            //console.log(res)
             if (res.success) {
                 this.convertList = res.result.map(item => {
                 return {
@@ -2117,7 +2202,7 @@ export default {
             })
         },
         sysTypeChange(e){
-            console.log(e.target.value);
+            //console.log(e.target.value);
             this.form.setFieldsValue({
                 appId:undefined,
                 platformOs:e.target.value
@@ -2202,7 +2287,7 @@ export default {
                 accountId: this.accountId,
             }).then((res) => {
                 if (res.success) {
-                    // console.log(res)
+                    // //console.log(res)
                     if (res.result) {
                         this.whiteList=res.result
                     }
@@ -2216,7 +2301,7 @@ export default {
                 getAction('/ctop/aiKuaishouAdvertiserStrategy/queryById',{
                     id:this.editRecordId
                 }).then(res=>{
-                    console.log(res);
+                    //console.log(res);
                     
                     this.accountId=res.result.accountId;
                     this.description=res.result.description
@@ -2267,6 +2352,11 @@ export default {
                             res.result.creativeCategory=res.result.creativeCategory?[res.result.creativeCategory]:[];
                         }
                     }
+                    
+                    // if(res.result.deviceBrand){
+                        
+                    //     this.deviceBrand=res.result.deviceBrand.indexOf(0)>-1?0:1;
+                    // }
                     setTimeout(()=>{                       
                         this.form.setFieldsValue({
                              ...res.result,
@@ -2274,11 +2364,12 @@ export default {
                             useAppMarket:res.result.useAppMarket==1?true:false,
                             isOpen:res.result.isOpen?res.result.isOpen:0,
                             cpaBid:res.result.cpaBid/1000,
-                            appId:res.singleAppid?JSON.parse(res.result.appIdArray)[0]:JSON.parse(res.result.appIdArray)
+                            appId:res.singleAppid?JSON.parse(res.result.appIdArray)[0]:JSON.parse(res.result.appIdArray),
+                            // deviceBrand:res.result.deviceBrand?JSON.parse(res.result.deviceBrand):[],
                         })
                     },0)
                     if((res.result.ocpxActionType == 180 || res.result.ocpxActionType == 53) && this.groupTypeData.deepConversionTypes&&this.groupTypeData.deepConversionTypes.length > 0){
-                        // console.log(1)
+                        // //console.log(1)
                         setTimeout(()=>{
                         this.form.setFieldsValue({
                             deepConversionType:res.result.deepConversionType,
@@ -2291,7 +2382,7 @@ export default {
                     },0)
                     }
                     
-                    // console.log(this.getFormData('deepConversionBid'))
+                    // //console.log(this.getFormData('deepConversionBid'))
                     this.noAreaBreak=res.result.noAreaBreak?true:false
                     this.noGenderBreak=res.result.noGenderBreak?true:false
                     this.noAgeBreak=res.result.noAgeBreak?true:false
@@ -2317,16 +2408,17 @@ export default {
                         this.checkedList=sceneId
                     }
                     
-                    
-                    if(res.result.population&&res.result.excludePopulation){
+                    let population=res.result.population?JSON.parse(res.result.population):[]
+                    let excludePopulation=res.result.excludePopulation?JSON.parse(res.result.excludePopulation):[]
+                    if(population.length&&excludePopulation.length){
                         this.form.setFieldsValue({
                             customCrowd:'3'
                         })
-                    }else if(res.result.population&&!res.result.excludePopulation){
+                    }else if(population.length&&!excludePopulation.length){
                         this.form.setFieldsValue({
                             customCrowd:'1'
                         })
-                    }else if(!res.result.population&&!res.result.excludePopulation){
+                    }else if(!population.length&&!excludePopulation.length){
                         this.form.setFieldsValue({
                             customCrowd:'0'
                         })
@@ -2372,7 +2464,7 @@ export default {
             getAction('/kuaishou/batch/getPopulationList',{
                 accountId:this.accountId
             }).then((res)=>{
-                // console.log(res)
+                // //console.log(res)
                 this.loading=false;
                 if(res.success){
                     res.result.forEach((ele)=>{
@@ -2388,6 +2480,15 @@ export default {
                     
                 }
             })
+        },
+
+        clickTrackUrlFocus(){
+            // //console.log('focus')
+            this.clickTrackUrlTip=true;
+        },
+        clickTrackUrlBlur(){
+            // //console.log('blur')
+            this.clickTrackUrlTip=false;
         }
     },
     created() {
@@ -2509,7 +2610,6 @@ export default {
 
 
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 32 - 2
src/views/modules/autoLaunch/configLaunchList.vue

@@ -99,7 +99,36 @@
             </div>
         </div>
         
-       
+       <!-- 加速坍缩 -->
+        <!-- <a-modal v-model="targetVisible" title="加速探索" @ok="targethandleOk">
+            <div class="linkBody">
+                <a-row>
+                    <a-col :span="4">
+                        <p style="text-align:right">加速探索预算:</p>
+                    </a-col>
+                    <a-col :span="18">
+                        <a-input-number :min="100"  :step="0.01"  />
+                    </a-col>
+                </a-row>
+                <p></p>
+                <a-row>
+                    <a-col :span="4">
+                        <p style="text-align:right">最多探索量:
+                            <a-tooltip>
+                                <template slot="title">
+                                该广告账户中加速探索的广告组数量的最大值
+                                </template>
+                                <a-icon type="question-circle" />
+                            </a-tooltip>
+                        </p>
+                    </a-col>
+                    <a-col :span="18">
+                        <a-input-number :min="1" :max="10" :step="1"  />
+                    </a-col>
+                </a-row>
+                
+            </div>
+        </a-modal> -->
               
     <!-- </a-spin> -->
     </div>
@@ -190,6 +219,7 @@ export default {
     // mixins: [JeecgListMixin],
     data() {
         return {
+            targetVisible:false,
             selectedRecord:{},
             bidErrorMessage:'',
             examineAgainType:1,
@@ -555,7 +585,7 @@ export default {
 
     }
     
-    .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+    .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 0 - 1
src/views/modules/autoLaunch/createStrategy.vue

@@ -367,7 +367,6 @@ export default {
 
 
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 1 - 1
src/views/modules/autoLaunch/groupList.vue

@@ -977,7 +977,7 @@ export default {
 
     }
     
-    .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+    .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 1 - 1
src/views/modules/autoLaunch/materialAndBid.vue

@@ -1982,7 +1982,7 @@ const publicColumns = [
 .autoLaunchReport{
 
 
-     .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+     .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 0 - 1
src/views/modules/autoLaunch/newAppId.vue

@@ -375,7 +375,6 @@ export default {
 
 
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 1 - 1
src/views/modules/autoLaunch/planList.vue

@@ -986,7 +986,7 @@ export default {
 
     }
     
-    .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+    .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

+ 0 - 1
src/views/modules/autoLaunch/setDirectional.vue

@@ -1775,7 +1775,6 @@ export default {
     //     line-height: 32px;
     // }
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 1 - 1
src/views/modules/autoLaunch/strategyList.vue

@@ -974,7 +974,7 @@ export default {
 
     }
     
-    .ant-tooltip-inner,.ant-tooltip,.ant-tooltip-arrow::before{
+    .ant-tooltip-inner,.ant-tooltip-arrow::before{
         background-color: #fff;
         color: #333;
     }

Diff do ficheiro suprimidas por serem muito extensas
+ 1569 - 0
src/views/modules/columnConst/stockWatch.js


+ 21 - 39
src/views/modules/earlyWarningRules/pushTreeSelect.vue

@@ -81,7 +81,7 @@ export default {
   },
   methods: {
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
-  
+
     emitValue() {
       this.$emit('update:appId', this.value)
     },
@@ -90,52 +90,34 @@ export default {
       // Typically, do the AJAX stuff here.
       // Once the server has responded,
       // assign children options to the parent node & call the callback.
-      if (action === LOAD_CHILDREN_OPTIONS) {
-        getAction('/ctop/userAllocation/getAccountList', { projectId: parentNode.id, userId: this.userInfo().id }).then(
-          (res) => {
-            console.log(res)
-            if (res.code == 0) {
-              if (res.result.length > 0) {
-                parentNode.children = res.result.map((i) => {
-                  return {
-                    id: i.accountId,
-                    label:
-                      (i.userName.length == 2
-                        ? i.userName + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'
-                        : i.userName.length == 3
-                        ? i.userName + '\xa0\xa0\xa0\xa0'
-                        : i.userName) +
-                      '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
-                      i.accountId +
-                      '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
-                      i.authName,
-                  }
-                })
-                callback()
-              } else {
-                parentNode.children = []
-                callback()
-              }
-            } else {
-              callback(new Error('Failed to load options: network error.'))
-            }
-          }
-        )
-      }
     },
     getParticipateList() {
       //我参与的
-      getAction('/ctop/projectMember/participateListV2', {
+      this.postDataAction('/ctop/projectMember/participateListByMediaId', {
         userId: this.userInfo().id,
-        pageSize: 1000000,
-        pageNo: 1,
       }).then((res) => {
         if (res.code == 0) {
-          this.options = res.result.records.map((item) => {
+          this.options = res.result.map((item) => {
             return {
-              id: item.projectId,
+              id: item.projectId + 'projectId',
               label: item.projectName + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' + item.advertiserName,
-              children: null,
+              children: item.accountList
+                ? item.accountList.map((i) => {
+                    return {
+                      id: i.accountId,
+                      label:
+                        (i.userName.length == 2
+                          ? i.userName + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'
+                          : i.userName.length == 3
+                          ? i.userName + '\xa0\xa0\xa0\xa0'
+                          : i.userName) +
+                        '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                        i.accountId +
+                        '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                        i.authName,
+                    }
+                  })
+                : [],
             }
           })
         }

+ 1 - 1
src/views/modules/kuaishouapp/account/accountIndex.vue

@@ -1222,7 +1222,7 @@ export default {
   computed: {},
   activated() {
     this.manyTwo = this.many
-    this.$refs.treeSelect.getParticipateList()
+    // this.$refs.treeSelect.getParticipateList()
     if (this.appId == '') {
       return
     } else {

+ 39 - 34
src/views/modules/kuaishouapp/account/editGroup.vue

@@ -623,6 +623,45 @@
         this.$refs.application.showApplication()
       },
       handleOk(item, type, campaignId, unitNameCopy, isUpdateTrackUrl, clickTrackUrl) {
+        this.getAppList()
+        this.getCampaignList()
+        this.getMould()
+        getAction('/kuaishou/batch/getIsActivate', {
+          accountId: localStorage.getItem('accountId')
+        }).then(res => {
+          if (res.success) {
+            this.allForm.groupTypeData = res.result
+          }
+        })
+
+        getAction('/kuaishou/batch/getWhiteList',{
+          accountId:localStorage.getItem('accountId')
+        }).then(res=>{
+          if(res.success){
+            console.log(res)
+            if(res.result){
+              if(res.result.alliance_account == 1){
+                this.allianceAccount = true
+              }else{
+                this.allianceAccount = false
+              }
+            }else{
+              this.allianceAccount = false
+            }
+          }
+        })
+
+        getAction('/kuaishou/batch/getProjectMaxBid', {
+          accountId: localStorage.getItem('accountId')
+        }).then(res => {
+          if (res.success) {
+            this.maxBid = res.result / 1000
+          }
+        })
+
+
+
+
         this.checkedTrue = false
         this.nameValue = ''
         this.visible = true
@@ -991,41 +1030,7 @@
       },
     },
     activated: function () {
-      this.getAppList()
-      this.getCampaignList()
-      this.getMould()
-      getAction('/kuaishou/batch/getIsActivate', {
-        accountId: localStorage.getItem('accountId')
-      }).then(res => {
-        if (res.success) {
-          this.allForm.groupTypeData = res.result
-        }
-      })
 
-      getAction('/kuaishou/batch/getWhiteList',{
-        accountId:localStorage.getItem('accountId')
-      }).then(res=>{
-        if(res.success){
-          console.log(res)
-          if(res.result){
-            if(res.result.alliance_account == 1){
-              this.allianceAccount = true
-            }else{
-              this.allianceAccount = false
-            }
-          }else{
-            this.allianceAccount = false
-          }
-        }
-      })
-
-      getAction('/kuaishou/batch/getProjectMaxBid', {
-        accountId: localStorage.getItem('accountId')
-      }).then(res => {
-        if (res.success) {
-          this.maxBid = res.result / 1000
-        }
-      })
     }
   }
 </script>

+ 39 - 35
src/views/modules/kuaishouapp/account/editGroupNew.vue

@@ -636,6 +636,44 @@
         this.$refs.application.showApplication()
       },
       handleOk(item, type, campaignId, unitNameCopy, count, isUpdateTrackUrl, clickTrackUrl) {
+        this.getAppList()
+        this.getCampaignList()
+        this.getMould()
+        getAction('/kuaishou/batch/getIsActivate', {
+          accountId: localStorage.getItem('accountId')
+        }).then(res => {
+          if (res.success) {
+            this.allForm.groupTypeData = res.result
+          }
+        })
+
+        getAction('/kuaishou/batch/getWhiteList',{
+          accountId:localStorage.getItem('accountId')
+        }).then(res=>{
+          if(res.success){
+            console.log(res)
+            if(res.result){
+              if(res.result.alliance_account == 1){
+                this.allianceAccount = true
+              }else{
+                this.allianceAccount = false
+              }
+            }else{
+              this.allianceAccount = false
+            }
+          }
+        })
+
+        getAction('/kuaishou/batch/getProjectMaxBid', {
+          accountId: localStorage.getItem('accountId')
+        }).then(res => {
+          if (res.success) {
+            this.maxBid = res.result / 1000
+          }
+        })
+
+
+
         this.checkedTrue = false
         this.nameValue = ''
         this.visible = true
@@ -1024,41 +1062,7 @@
       },
     },
     activated: function () {
-      this.getAppList()
-      this.getCampaignList()
-      this.getMould()
-      getAction('/kuaishou/batch/getIsActivate', {
-        accountId: localStorage.getItem('accountId')
-      }).then(res => {
-        if (res.success) {
-          this.allForm.groupTypeData = res.result
-        }
-      })
-
-      getAction('/kuaishou/batch/getWhiteList',{
-        accountId:localStorage.getItem('accountId')
-      }).then(res=>{
-        if(res.success){
-          console.log(res)
-          if(res.result){
-            if(res.result.alliance_account == 1){
-              this.allianceAccount = true
-            }else{
-              this.allianceAccount = false
-            }
-          }else{
-            this.allianceAccount = false
-          }
-        }
-      })
-
-      getAction('/kuaishou/batch/getProjectMaxBid', {
-        accountId: localStorage.getItem('accountId')
-      }).then(res => {
-        if (res.success) {
-          this.maxBid = res.result / 1000
-        }
-      })
+     
     }
   }
 </script>

+ 1 - 1
src/views/modules/kuaishouapp/batchCreation/campaignList.vue

@@ -1095,7 +1095,7 @@ export default {
   computed: {},
   activated() {
     this.manyTwo = this.many
-    this.$refs.treeSelect.getParticipateList()
+    // this.$refs.treeSelect.getParticipateList()
     if (this.appId == '') {
       return
     } else {

+ 590 - 0
src/views/modules/kuaishouapp/newBatch/result.vue

@@ -0,0 +1,590 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+          <a-col :md="8" :sm="8">
+            <a-form-item label="广告主开户主体名称">
+              <!-- <a-input placeholder="请输入广告主开户主体名称" v-model="queryParam.name"></a-input> -->
+              <a-select
+                labelInValue
+                v-model="allIdUser"
+                placeholder="请选择广告主开户主体名称"
+                @keyup.enter.native="searchQueryOne"
+                @focus="getList"
+                showSearch
+                optionFilterProp="children"
+                :filterOption="filterOption"
+                @search="getList"
+              >
+                <a-select-option :value="item.id" v-for="(item, index) of list" :key="index">
+                  {{ item.name }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="8" :sm="8">
+            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQueryOne" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchRe" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 操作按钮区域 -->
+    <!-- <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+    </div>-->
+    <a-tabs @change="callbackTwo" v-model="active">
+      <a-tab-pane key="advertiser" tab="广告主列表"></a-tab-pane>
+      <a-tab-pane key="product" tab="产品列表">
+        <a-tag
+          color="blue"
+          style="height: 30px; line-height: 30px; font-size: 14px; margin-bottom: 20px"
+          v-if="queryParam.advertiserId"
+        >
+          {{ advertiserName }}
+          <a-icon type="close" @click="clear('advertiserId')" />
+        </a-tag>
+        <a-row :gutter="24" style="margin-bottom: 20px">
+          <a-col :md="8" :sm="8">
+            <a-input placeholder="请输入产品名称" v-model="queryParam.productName"></a-input>
+          </a-col>
+          <a-col :md="8" :sm="8">
+            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQueryOne" icon="search">查询</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-tab-pane>
+      <a-tab-pane key="project" tab="项目列表">
+        <a-tag
+          color="blue"
+          style="height: 30px; line-height: 30px; font-size: 14px; margin-bottom: 20px"
+          v-if="queryParam.productId"
+        >
+          {{ advertiserName ? advertiserName + ' / ' + productName : productName }}
+          <a-icon type="close" @click="clear('productId')" />
+        </a-tag>
+        <a-row :gutter="24" style="margin-bottom: 20px">
+          <a-col :md="8" :sm="8">
+            <a-input placeholder="请输入项目名称" v-model="queryParam.projectName"></a-input>
+          </a-col>
+          <a-col :md="8" :sm="8">
+            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQueryOne" icon="search">查询</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-tab-pane>
+      <a-button type="primary" slot="tabBarExtraContent" @click="addNew">新增</a-button>
+    </a-tabs>
+
+    <div>
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        @change="handleTableChange"
+      >
+        <span slot="ocpxActionType" slot-scope="text">
+          <div v-if="text">
+            <span v-for="(item, index) of JSON.parse(text)" :key="index"
+              >{{ item | ocpxActionType }}{{ index == JSON.parse(text).length - 1 ? '' : ',' }}</span
+            >
+          </div>
+          <div v-else>-</div>
+
+          <!-- {{ text | ocpxActionType }} -->
+        </span>
+        <span slot="bidType" slot-scope="text">
+          <div v-if="text && JSON.parse(text).length > 0">
+            <span v-for="(item, index) of JSON.parse(text)" :key="index"
+              >{{ item | bidType }}{{ index == JSON.parse(text).length - 1 ? '' : ',' }}</span
+            >
+          </div>
+          <div v-else>-</div>
+        </span>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+        <span slot="actionProduct" slot-scope="text, record">
+          <a @click="handleEditElse(record, 'product')">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+        <span slot="actionProject" slot-scope="text, record">
+          <a @click="handleEditElse(record, 'project')">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+        <span slot="maxBid" slot-scope="text">{{ text / 1000 }}</span>
+        <span slot="maxDeepCpaBid" slot-scope="text">{{ text / 1000 }}</span>
+        <a slot="name" slot-scope="text, record" @click="toProduct(record, 'product')">{{ text }}</a>
+        <a slot="productName" slot-scope="text, record" @click="toProduct(record, 'project')">{{ text }}</a>
+      </a-table>
+    </div>
+    <!-- table区域-begin -->
+
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <j-select-user ref="userForm" @ok="modalFormOk"></j-select-user>
+  </a-card>
+</template>
+
+<script>
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import JTreeSelect from '@/components/jeecg/JTreeSelect'
+import AFormItem from 'ant-design-vue/es/form/FormItem'
+import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
+import JSelectUserByDep from '@/components/jeecgbiz/JSelectUserByDep'
+import JSelectUser from '@/components/jeecgbiz/JSelectUser'
+import { postAction, getAction } from '@/api/manage'
+import { mapActions, mapGetters } from 'vuex'
+
+const advertiserColumns = [
+  {
+    title: '广告主开户主体名称',
+    align: 'center',
+    dataIndex: 'name',
+    scopedSlots: { customRender: 'name' },
+  },
+  {
+    title: '联系人姓名',
+    align: 'center',
+    dataIndex: 'contact',
+  },
+  {
+    title: '联系人手机',
+    align: 'center',
+    dataIndex: 'mobile',
+  },
+  {
+    title: '联系人邮箱',
+    align: 'center',
+    dataIndex: 'email',
+  },
+  {
+    title: '操作',
+    dataIndex: 'action',
+    align: 'center',
+    scopedSlots: { customRender: 'action' },
+  },
+]
+const productColumns = [
+  {
+    title: '产品名',
+    align: 'center',
+    dataIndex: 'productName',
+    scopedSlots: { customRender: 'productName' },
+  },
+  {
+    title: '广告主名称',
+    align: 'center',
+    dataIndex: 'advertiserId_dictText',
+  },
+  {
+    title: '创建人',
+    align: 'center',
+    dataIndex: 'userId_dictText',
+  },
+  {
+    title: '行业',
+    align: 'center',
+    dataIndex: 'industryId_dictText',
+  },
+  {
+    title: '状态',
+    align: 'center',
+    dataIndex: 'productStatus',
+    customRender: function (text) {
+      if (text == 0) {
+        return '启动'
+      } else if (text == 1) {
+        return '暂停'
+      } else if (text == 2) {
+        return '删除'
+      }
+    },
+  },
+  {
+    title: '操作',
+    dataIndex: 'actionProduct',
+    align: 'center',
+    scopedSlots: { customRender: 'actionProduct' },
+  },
+]
+const projectColumns = [
+  {
+    title: '项目名称',
+    align: 'center',
+    dataIndex: 'projectName',
+  },
+  {
+    title: '产品名',
+    align: 'center',
+    dataIndex: 'productId_dictText',
+  },
+  {
+    title: '广告主名称',
+    align: 'center',
+    dataIndex: 'advertiserId_dictText',
+  },
+  {
+    title: '最高出价',
+    align: 'center',
+    dataIndex: 'maxBid',
+    scopedSlots: {
+      customRender: 'maxBid',
+    },
+  },
+  {
+    title: '最高转化出价',
+    align: 'center',
+    dataIndex: 'maxDeepCpaBid',
+    scopedSlots: {
+      customRender: 'maxDeepCpaBid',
+    },
+  },
+  {
+    title: '优化目标',
+    align: 'center',
+    dataIndex: 'bidType',
+    scopedSlots: {
+      customRender: 'bidType',
+    },
+  },
+  {
+    title: '转化目标',
+    align: 'center',
+    dataIndex: 'ocpxActionType',
+    scopedSlots: {
+      customRender: 'ocpxActionType',
+    },
+  },
+  {
+    title: '供应商',
+    align: 'center',
+    dataIndex: 'supplierCode_dictText',
+  },
+  {
+    title: '销售',
+    align: 'center',
+    dataIndex: 'saleId_dictText',
+  },
+  {
+    title: '运营负责人',
+    align: 'center',
+    dataIndex: 'responsibleId_dictText',
+  },
+  {
+    title: '设计负责人',
+    align: 'center',
+    dataIndex: 'designResponsibleId_dictText',
+  },
+  {
+    title: '操作',
+    dataIndex: 'actionProject',
+    align: 'center',
+    scopedSlots: {
+      customRender: 'actionProject',
+    },
+  },
+]
+export default {
+  name: 'AdvertiserList',
+  mixins: [JeecgListMixin],
+  components: {
+    AFormItem,
+    JTreeSelect,
+    JSelectUserByDep,
+    JSelectDepart,
+    JSelectUser,
+  },
+  data() {
+    return {
+      list: [],
+      allIdUser: {},
+      departDisabled: false, //是否是我的部门调用该页面
+      users: this.userInfo().realname, //用户名称
+      departmentId: this.userInfo().departId, //部门id
+      description: '广告主信息表管理页面',
+      visible: false,
+      accountName: '',
+      password: '',
+      mode: 'login',
+      showLogin: true,
+      showAuthorization: false,
+      authorizationType: 'kuaishou',
+      loginType: 'kuaishou',
+      form: this.$form.createForm(this),
+      active: 'advertiser',
+      advertiserName: '',
+      advertiserId: '',
+      productName: '',
+      examinelList: [
+        {
+          value: '0',
+          tab: '广告主列表',
+        },
+        {
+          value: '1',
+          tab: '产品列表',
+        },
+        {
+          value: '2',
+          tab: '项目列表',
+        },
+      ],
+      // 表头
+      columns: advertiserColumns,
+      url: {
+        list: '/ctop/advertiser/list',
+        delete: '/ctop/advertiser/delete',
+        deleteBatch: '/ctop/advertiser/deleteBatch',
+        exportXlsUrl: 'ctop/advertiser/exportXls',
+        importExcelUrl: 'ctop/advertiser/importExcel',
+        bindAccountLoginUrl: '/ctop/bindAccountLogin/login',
+        bindAuthorizationUrl: '/ctop/bindAccountAuth/authorization',
+        getLoginInfo: '/ctop/bindAccount/getLoginInfo',
+        userId: '/sys/user/generateUserId', // 引入生成添加用户情况下的url
+        userWithDepart: '/sys/user/userDepartList', // 引入为指定用户查看部门信息需要的url
+      },
+    }
+  },
+  computed: {
+    importExcelUrl: function () {
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
+    },
+  },
+  created() {
+    // this.queryParam.userId = this.userInfo().id
+    this.getList(null)
+  },
+  methods: {
+    filterOption(input, option) {
+      return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+    },
+    getList(value) {
+      var params = {}
+      // params.userId = this.userInfo().id
+      params.pageSize = 50
+      params.pageNo = 1
+      params.name = value
+      console.log(params)
+      getAction('/ctop/advertiser/list', params)
+        .then((res) => {
+          if (res.success) {
+            console.log(res)
+            this.list = res.result.records
+          } else {
+            this.$message.warning(res.message)
+          }
+        })
+        .finally(() => {})
+    },
+    handleEditElse(item, type) {
+      if (type == 'product') {
+        this.$refs.modalFormTwo.edit(item)
+        this.$refs.modalFormTwo.title = '编辑'
+        this.$refs.modalFormTwo.disableSubmit = false
+      } else if (type == 'project') {
+        this.$refs.modalFormThree.edit(item)
+        this.$refs.modalFormThree.title = '编辑'
+        this.$refs.modalFormThree.disableSubmit = false
+      }
+    },
+    clear(type) {
+      this.queryParam.name = null
+      this.queryParam.advertiserId = null
+      this.queryParam.productId = null
+      this.queryParam.id = null
+      this.queryParam.productName = null
+      this.queryParam.projectName = null
+      this.allIdUser = {}
+      this.loadData(1)
+    },
+    addNew() {
+      if (this.active == 'advertiser') {
+        this.$refs.modalForm.add()
+        this.$refs.modalForm.title = '新增'
+        this.$refs.modalForm.disableSubmit = false
+      } else if (this.active == 'product') {
+        if (this.queryParam.advertiserId) {
+          this.$refs.modalFormTwo.add({ advertiserId: this.queryParam.advertiserId })
+        } else {
+          this.$refs.modalFormTwo.add()
+        }
+        this.$refs.modalFormTwo.title = '新增'
+        this.$refs.modalFormTwo.disableSubmit = false
+      } else if (this.active == 'project') {
+        this.$refs.modalFormThree.add({
+          advertiserId: this.queryParam.advertiserId
+            ? this.queryParam.advertiserId
+            : this.advertiserId
+            ? this.advertiserId
+            : undefined,
+          productId: this.queryParam.productId ? this.queryParam.productId : undefined,
+        })
+        this.$refs.modalFormThree.title = '新增'
+        this.$refs.modalFormThree.disableSubmit = false
+      }
+    },
+    toProduct(item, key) {
+      if (key == 'product') {
+        this.queryParam.advertiserId = item.id
+        this.advertiserName = item.name
+        this.queryParam.productId = null
+        this.productName = null
+        this.queryParam.productName = null
+        this.callbackTwo('product')
+      } else if (key == 'project') {
+        this.queryParam.productId = item.id
+        this.productName = item.productName
+        this.advertiserId = item.advertiserId
+        this.queryParam.projectName = null
+        this.callbackTwo('project')
+      }
+    },
+    callbackTwo(key) {
+      this.active = key
+      if (key == 'advertiser') {
+        this.columns = advertiserColumns
+        this.url.list = '/ctop/advertiser/list'
+        this.url.delete = '/ctop/advertiser/delete'
+      } else if (key == 'product') {
+        this.columns = productColumns
+        this.url.list = '/ctop/product/list'
+        this.url.delete = '/ctop/product/delete'
+      } else if (key == 'project') {
+        this.columns = projectColumns
+        this.url.list = '/ctop/project/list'
+        this.url.delete = '/ctop/project/delete'
+      }
+      this.searchQueryOne()
+    },
+    ...mapGetters(['nickname', 'avatar', 'userInfo']),
+    searchRe() {
+      this.queryParam.name = null
+      this.queryParam.advertiserId = null
+      this.queryParam.productId = null
+      this.queryParam.id = null
+      this.queryParam.productName = null
+      this.queryParam.projectName = null
+      this.allIdUser = {}
+      this.callbackTwo('advertiser')
+    },
+    searchQueryOne() {
+      console.log(this.allIdUser)
+      if (this.allIdUser.key) {
+        if (this.active == 'advertiser') {
+          this.queryParam.advertiserId = null
+          this.queryParam.id = this.allIdUser.key
+        } else {
+          this.queryParam.id = null
+          this.queryParam.advertiserId = this.allIdUser.key
+        }
+        this.advertiserName = this.allIdUser.label
+      } else {
+        // this.queryParam.advertiserId = null
+        // this.queryParam.productId = null
+        // this.queryParam.id = null
+      }
+      this.searchQuery()
+    },
+    handleSubmit() {
+      let params = {}
+      params.advertiserId = this.record.id
+      params.advertiser_name = this.record.name
+      params.userId = this.userInfo().id
+      params.userName = this.userInfo().realname
+      params.projectId = this.record.projectId
+      params.projectName = this.record.projectName
+
+      // 触发表单验证
+      this.form.validateFields((err) => {
+        if (!err) {
+          if (this.mode == 'login') {
+            params.accountName = this.accountName
+            params.password = this.password
+            params.loginType = this.loginType
+            if (this.loginType == 'kuaishou') {
+              params.mediaId = 2
+            } else if (this.loginType == 'bytedance') {
+              params.mediaId = 1
+            }
+            postAction(this.url.bindAccountLoginUrl, params).then((res) => {
+              if (res.success) {
+                alert('绑定成功')
+                this.accountName = ''
+                this.password = ''
+                this.loginType = ''
+              } else {
+                alert(res.message)
+              }
+            })
+          }
+          // 授权登录
+          if (this.mode == 'authorization') {
+            params.authorizationType = this.authorizationType
+            if (this.authorizationType == 'kuaishou') {
+              params.mediaId = 2
+            } else if (this.authorizationType == 'bytedance') {
+              params.mediaId = 1
+            }
+            postAction(this.url.bindAuthorizationUrl, params).then((res) => {
+              if (res.success) {
+                window.open(res.message, '_blank')
+              } else {
+                alert('绑定失败')
+              }
+            })
+          }
+        }
+      })
+    },
+
+    onChageLogin() {
+      console.log(this.mode)
+      if (this.mode == 'login') {
+        this.showLogin = true
+        this.showAuthorization = false
+      } else {
+        this.showLogin = false
+        this.showAuthorization = true
+      }
+    },
+    showModal(record) {
+      this.record = record
+      this.visible = true
+    },
+
+    handleCancel() {
+      this.close()
+    },
+  },
+}
+</script>
+<style scoped>
+@import '~@assets/less/common.less';
+</style>

+ 0 - 1
src/views/modules/kuaishouapp/populationAnalysis/index.vue

@@ -1287,7 +1287,6 @@ export default {
 
 <style lang="scss">
 .ant-tooltip-inner,
-.ant-tooltip,
 .ant-tooltip-arrow::before {
   background-color: #fff;
   color: #333;

+ 1 - 1
src/views/modules/material/musicTab.vue

@@ -172,7 +172,7 @@ export default {
 }
 </style>
 <style lang="less">
-.ant-tabs-bar {
+.music-tab .ant-tabs-bar {
   margin: 0 0 12px 0;
   /* height: 55px; */
   border-bottom: 1px solid #e8e8e8;

Diff do ficheiro suprimidas por serem muito extensas
+ 1293 - 478
src/views/modules/stockWatch/accountPage.vue


+ 9 - 4
src/views/modules/stockWatch/modules/customColumn.vue

@@ -130,10 +130,15 @@ export default {
     },
     //弹出框确定
     handleOk(e) {
-      this.loading = false
-      this.visibleOk = false
-      this.$emit('closeCustomColumn', false)
-      this.$emit('changeColumn', this.mylistNum)
+      if(this.mylistNum.length<5){
+        this.$message.error('此处自定义列必须选择五项数据')
+      }else{
+        this.loading = false
+        this.visibleOk = false
+        this.$emit('closeCustomColumn', false)
+        this.$emit('changeColumn', this.mylistNum)
+      }
+      
     },
     //取消按钮
     handleCancel() {

+ 58 - 4
src/views/modules/stockWatch/modules/selectComponent.vue

@@ -31,7 +31,7 @@
 </template>
 
 <script>
-import  {TTcustomFields ,KScustomFields}  from '../../columnConst/accountConst'
+import  {TTcustomFields ,KScustomFields}  from '../../columnConst/stockWatch.js'
 // let customFields=customFields
 export default {
   props: ['showCol','fixedCol','mediaType'],
@@ -48,7 +48,34 @@ export default {
   watch: {
     
     showCol(n) {
-      // console.log(n)
+      console.log(n)
+      if(n.length>=5){
+        this.customFields.map((it, ind) => {
+          it.specificFields.map((i, d) => {
+            // if (i.dataIndex === item.dataIndex) {
+              i.disabled=true;
+            // }
+          })
+        })
+        
+      }else{
+        this.customFields.map((it, ind) => {
+          it.specificFields.map((i, d) => {
+            // if (i.dataIndex === item.dataIndex) {
+              i.disabled=false;
+            // }
+          })
+        })
+        this.fixedCol.map((item, index) => {
+          this.customFields.map((it, ind) => {
+            it.specificFields.map((i, d) => {
+              if (i.dataIndex === item.dataIndex) {
+                i.disabled=true;
+              }
+            })
+          })
+        })
+      }
       //
       if (this.showCol.length == this.fixedCol.length) {
 
@@ -109,6 +136,7 @@ export default {
         })
       })
     })
+    
     this.fixedCol.map((item, index) => {
       this.customFields.map((it, ind) => {
         it.specificFields.map((i, d) => {
@@ -119,7 +147,33 @@ export default {
       })
     })
 
-
+    if(this.showCol.length>=5){
+        this.customFields.map((it, ind) => {
+          it.specificFields.map((i, d) => {
+            // if (i.dataIndex === item.dataIndex) {
+              i.disabled=true;
+            // }
+          })
+        })
+        
+      }else{
+        this.customFields.map((it, ind) => {
+          it.specificFields.map((i, d) => {
+            // if (i.dataIndex === item.dataIndex) {
+              i.disabled=false;
+            // }
+          })
+        })
+        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);
     
   },
@@ -139,7 +193,7 @@ export default {
     //全选框   判断是否全选
     isSelectAll(e, val) {
       //像父元素传递
-      console.log(e, val)
+      // console.log(e, val)
       let arr=JSON.parse(JSON.stringify(this.customFields[val].specificFields))
       let valArr={
         flag:true,

+ 1 - 1
src/views/modules/workBench/designLeader/index.vue

@@ -20,7 +20,7 @@ export default {
 
     data() {
         return {
-            currentTabComponent:'designleaderPlatform',
+            currentTabComponent:'designleaderPlatform',//当前加载的组件名称
             orderStatus:undefined,//跳转到订单详情时需要里面的参数  status订单参数 role 当前角色
             role:'designLeader',
             materialStatus:undefined,

+ 2 - 9
src/views/modules/workBench/designLeader/platForm.vue

@@ -208,13 +208,12 @@ export default {
     },
     methods: {
         orderDetail(item){
-            console.log(item)
+            
             this.$parent.currentTabComponent='orderDetail';
             this.$parent.orderId=item.id
         },
         goOrderList(val){
-            console.log(val);
-            // console.log(this.$parent)
+            
             this.$parent.currentTabComponent='orderList';
             this.$parent.orderStatus=val
             
@@ -242,7 +241,6 @@ export default {
                 pageSize:8,
             }
             getAction('/platform/order/listByCreatorOrDesignLeader',params).then(res=>{
-                console.log(res);
                 this.loading=false;
                 this.orderProgressSpinning=false;
                 if(res.success){
@@ -256,14 +254,12 @@ export default {
         getOperationRecord(){
             this.spinning=true;
             getAction('/platform/operateRecord/createDesc').then(res=>{
-                console.log(res)
                  this.spinning=false;
                 if(res.success){
                     this.operateRecordList=res.result.list.map((item,index)=>{
                        
                             let time='';
                             let startTime=moment(item.createTime)
-                            console.log() 
                             if(moment().diff(startTime,'hours')>24){
                                 time=item.createTime.split(/[ ]+/)[0]
                                 return {
@@ -299,7 +295,6 @@ export default {
         },
         
         scrollRecord(){
-            console.log(this.$refs.scrollRecord);
             this.TimerObj=setInterval(()=>{
                 this.getOperationRecord()
 
@@ -309,7 +304,6 @@ export default {
         // 获取工作台内容
         getPlantformInfo(){
             getAction('/platform/query/jobContent').then(res=>{
-                console.log(res)
                 if(res.success){
                     if(this.$parent.role=='operator'){
                         this.countInfo=res.result.operatorJobContent
@@ -350,7 +344,6 @@ export default {
 
         getidentity(){
             getAction('/platform/query/identity',{}).then(res=>{
-                console.log(res);
                 if(res.success){
                     this.roleInfo=res.result
                 }

+ 85 - 22
src/views/modules/workBench/orderDetail.vue

@@ -507,15 +507,23 @@
                         
                     
                     <div class="section-box">
+
+                        <a-tabs v-model="activeType" @change="callback">
+                            <a-tab-pane key="1" tab="真人"></a-tab-pane>
+                            <a-tab-pane key="2" tab="剪辑" force-render></a-tab-pane>
+                        </a-tabs>
+                        <a-button type="primary" @click="getTemplate"  :disabled="selectedRowKeys.length==0"> 批量指派</a-button>
                          <a-table
                             size="middle"
                             :columns="columns"
                             :dataSource="data"
                             id="outTable"
+                            rowKey="id"
                             :pagination="ipagination"
                             :loading="loading"
                             @change="sort"
                             style="word-break: break-all;"
+                            :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange,getCheckboxProps:getCheckboxProps }"
                             >
                             <div slot="materialStatus" slot-scope="text" >
                                 <!-- <a-spin :spinning="record.spin" size="small" >
@@ -966,7 +974,7 @@
                                 </a-select>
                             </a-form-model-item>
                             <!-- {{currentMaterial.materialType==1?true:false}} -->
-                            <a-form-model-item  label="拍摄"  ref="shot"  prop="shot" :rules='[{ required: currentMaterial.materialType==1, message: "拍摄人员必须指派" ,trigger: "change" }]'>
+                            <a-form-model-item  label="拍摄"  ref="shot"  prop="shot" :rules="[{ required: currentMaterial.materialType==1||activeType=='1', message: '拍摄人员必须指派' ,trigger: 'change' }]">
                                 <a-select                                   
                                     v-model="formPerson.shot"
                                     showSearch
@@ -1142,6 +1150,7 @@ export default {
     },
     data() {
         return {
+            activeType:'1',
             descriptionlength:'',
             viewImgUrl:'',
             viewImgVisiable:false,
@@ -1191,7 +1200,8 @@ export default {
             userInfo:{},
             roleCode:'',
             tabKey:1,
-
+            selectedRowKeys:[],
+            selectionRows:[],
             columns:[...realColumns],
             data:[],
             loading:false,
@@ -1317,9 +1327,39 @@ export default {
 
             },
             imageinfo:[],
+            batch:false
         }
     },
     methods: {
+        getTemplate(){
+            this.batch = true
+            this.assignVisible=true;
+            this.formPerson={
+                plan:'',
+                shot:'',
+                clip:'',
+            }
+            this.currentMaterial={}
+            this.getProjectId(this.selectionRows[0].projectId)
+        },
+        onSelectChange(selectedRowKeys, selectionRows) {
+            this.selectedRowKeys = selectedRowKeys
+            this.selectionRows = selectionRows
+        },
+        getCheckboxProps(record) {
+        return {
+            props: {
+                disabled: record.materialStatus==2||record.materialStatus==3||record.materialStatus==4||record.materialStatus==5||record.materialStatus==6||record.materialStatus==7
+            },
+        }
+        },
+        //切换页签
+        callback(key) {
+            this.ipagination.current = 1
+            this.selectedRowKeys = []
+            this.selectionRows = []
+            this.materialHttp()
+        },
         //获取表单的某一个属性值
         getFormData(className) {
             return this.form.getFieldValue(className)
@@ -1451,25 +1491,47 @@ export default {
                     console.log(this.formPerson)
                     this.loadingElse=true;
                     if(this.currentMaterial.clip&&this.currentMaterial.plan&&this.currentMaterial.shot){
-                        postAction('/platform/designer/assignAgain',{
-                            id:this.currentMaterial.id,
-                            ...this.formPerson
-                        }).then(res=>{
-                            this.loadingElse=false;
-                            this.assignVisible = false;
-                            this.$message.success(res.message);
-                            this.materialHttp(this.activeKey)
-                        })
+                        
+                            postAction('/platform/designer/assignAgain',{
+                                id:this.currentMaterial.id,
+                                ...this.formPerson
+                            }).then(res=>{
+                                this.loadingElse=false;
+                                this.assignVisible = false;
+                                this.selectedRowKeys=[]
+                                this.selectionRows=[]
+                                this.$message.success(res.message);
+                                this.materialHttp(this.activeKey)
+                            })
+         
+                       
                     }else{
-                        postAction(this.url.assgin,{
-                            id:this.currentMaterial.id,
-                            ...this.formPerson
-                        }).then(res=>{
-                            this.loadingElse=false;
-                            this.assignVisible = false;
-                            this.$message.success(res.message);
-                            this.materialHttp(this.activeKey)
-                        })
+                        if(!this.batch){
+                            postAction(this.url.assgin,{
+                                id:this.currentMaterial.id,
+                                ...this.formPerson
+                            }).then(res=>{
+                                this.loadingElse=false;
+                                this.assignVisible = false;
+                                this.selectedRowKeys=[]
+                                this.selectionRows=[]
+                                this.$message.success(res.message);
+                                this.materialHttp(this.activeKey)
+                            })
+                        }else{
+                            postAction('/platform/designer/batchAssign',{
+                                id:this.selectedRowKeys,
+                                ...this.formPerson
+                            }).then(res=>{
+                                this.loadingElse=false;
+                                this.assignVisible = false;
+                                this.batch = false
+                                this.$message.success(res.message);
+                                this.materialHttp(this.activeKey)
+                                this.selectedRowKeys = []
+                                this.selectionRows = []
+                            })
+                        }
                     }
                    
                 } else {
@@ -1640,12 +1702,13 @@ export default {
             getAction(this.url.materialList,{
                 orderCode:this.currentOrderInfo.orderCode,
                 pageNo:this.ipagination.current,
-                pageSize:this.ipagination.pageSize
+                pageSize:this.ipagination.pageSize,
+                materialType:this.activeType
             }).then(res=>{
                 console.log(res);
                 this.data=[]
                 if(res.success){
-                    this.data=res.result.list;
+                    this.data=res.result.list
                     // this.data=res.result.list.filter(item=>item.materialType==this.tabKey);
                     this.ipagination.total=res.result.total
                     // this.ipagination.total=this.data.length

+ 3 - 3
src/views/modules/workBench/placeOrder.vue

@@ -294,7 +294,7 @@
                         </div>
                         <div class="input-item"> 
                             <a-form-model-item ref="materialAmount"  prop="materialAmount">
-                                <a-input-number :min="1" :max="500"  @change="materialAmountChange" v-model="form.materialAmount" />
+                                <a-input-number :min="1" :max="99"  @change="materialAmountChange" v-model="form.materialAmount" />
                             </a-form-model-item>
                         </div>
                     </div>
@@ -335,7 +335,7 @@
                         </div>
                         <div class="input-item"> 
                             <a-form-model-item ref="realAmount"  prop="realAmount">
-                                 <a-input-number :min="1" :max="500"  @change="realAmountChange" v-model="form.realAmount" />
+                                 <a-input-number :min="1" :max="99"  @change="realAmountChange" v-model="form.realAmount" />
                             </a-form-model-item>
                         </div>
                     </div>
@@ -347,7 +347,7 @@
                         </div>
                         <div class="input-item"> 
                             <a-form-model-item ref="cutAmount"  prop="cutAmount">
-                                 <a-input-number :min="1" :max="500"  @change="cutAmountChange" v-model="form.cutAmount" />
+                                 <a-input-number :min="1" :max="99"  @change="cutAmountChange" v-model="form.cutAmount" />
                             </a-form-model-item>
                         </div>
                     </div>

+ 17 - 6
src/views/system/modules/UserModal.vue

@@ -312,6 +312,13 @@ export default {
       this.userId = ''
     },
     add() {
+      this.disableSubmit = false
+      this.selectedRole = ''
+      this.userDepartModel = { userId: '', departIdList: [] }
+      this.checkedDepartNames = []
+      this.checkedDepartNameString = ''
+      this.checkedDepartKeys = []
+      this.selectedDepartKeys = []
       this.picUrl = ''
       this.refresh()
       this.edit({ activitiSync: '1' })
@@ -377,10 +384,11 @@ export default {
     moment,
     handleSubmit() {
       const that = this
+      that.confirmLoading = true
       // 触发表单验证
       this.form.validateFields((err, values) => {
         if (!err) {
-          that.confirmLoading = true
+          
           let avatar = that.model.avatar
           if (!values.birthday) {
             values.birthday = ''
@@ -408,17 +416,20 @@ export default {
               if (res.success) {
                 that.$message.success(res.message)
                 that.$emit('ok')
-                that.close()
+                // that.close()
+                that.visible = false
+                that.confirmLoading = false
               } else {
                 that.$message.warning(res.message)
               }
             })
             .finally(() => {
-              that.confirmLoading = false
-              that.checkedDepartNames = []
-              that.userDepartModel.departIdList = { userId: '', departIdList: [] }
-              that.close()
+              
+             
+              
             })
+        }else{
+          that.confirmLoading = false
         }
       })
     },

+ 2 - 2
vue.config.js

@@ -75,7 +75,7 @@ module.exports = {
         // target: 'http://192.168.2.115:8080', //请求本地 需要jeecg-boot后台项目  祚云
         // target: 'http://192.168.1.43:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.1.43:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
-        // target: 'http://192.168.1.43:8087', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        // target: 'http://192.168.1.43:8806', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.0.252:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
         // target: 'http://192.168.1.219:8080', //请求本地 需要jeecg-boot后台项目  赵西安
         // target: 'http://192.168.1.193:8080', //请求本地 需要jeecg-boot后台项目  李煜一
@@ -86,7 +86,7 @@ module.exports = {
         //  target: 'http://adsp.tjyourong.com.cn/', //请求本地 需要jeecg-boot后台项目
         // target: 'http://192.168.1.251/', //请求本地 需要jeecg-boot后台项目
         // target:'http://118.24.244.213:8804',
-      //  target:'http://139.186.151.174:8804', //测试
+      //  target:'http://139.186.165.84:8806', //测试