zhuxinbo 4 gadi atpakaļ
vecāks
revīzija
fe9682e97e
60 mainītis faili ar 8240 papildinājumiem un 1080 dzēšanām
  1. 1 0
      package.json
  2. 1 1
      public/color.less
  3. 1 0
      public/index.html
  4. 69 7
      src/components/layouts/TabLayout.vue
  5. 3 3
      src/components/setting/SettingDrawer.vue
  6. 16 1
      src/components/uploadFile.vue
  7. 8 0
      src/main.js
  8. 1 1
      src/utils/request.js
  9. 93 66
      src/views/activiti/applyHome.vue
  10. 96 23
      src/views/modules/BatchCreate/TouTiaoBatch.vue
  11. 1 1
      src/views/modules/BatchCreate/components/Treeselect.vue
  12. 65 36
      src/views/modules/BatchCreate/components/material.vue
  13. 1 1
      src/views/modules/BatchCreate/directedPackage.vue
  14. 11 0
      src/views/modules/BatchCreate/editableCell.vue
  15. 122 31
      src/views/modules/BatchCreate/newCreate.vue
  16. 4 4
      src/views/modules/BatchCreate/newDirectedPackage.vue
  17. 16 2
      src/views/modules/BatchCreate/newGroup.vue
  18. 25 18
      src/views/modules/BatchCreate/newPlan.vue
  19. 2 0
      src/views/modules/BatchCreate/singleLayerSelecte.vue
  20. 1535 0
      src/views/modules/Statistics/KSAccountReport.vue
  21. 40 1
      src/views/modules/Statistics/accountMaterStatistics.vue
  22. 29 24
      src/views/modules/Statistics/accountReport.vue
  23. 89 41
      src/views/modules/Statistics/companyDetail.vue
  24. 25 12
      src/views/modules/Statistics/companyStatistics.vue
  25. 24 4
      src/views/modules/Statistics/components/customColumn.vue
  26. 28 8
      src/views/modules/Statistics/components/selectComponent.vue
  27. 240 0
      src/views/modules/Statistics/components/selectComponentKS.vue
  28. 70 13
      src/views/modules/Statistics/dataDisplayStatistics.vue
  29. 74 7
      src/views/modules/Statistics/materialRank.vue
  30. 36 2
      src/views/modules/Statistics/materialStatistics.vue
  31. 709 609
      src/views/modules/Statistics/mediaReport.vue
  32. 53 37
      src/views/modules/Statistics/refuseDataCreat.vue
  33. 632 0
      src/views/modules/Statistics/refuseDataCreatNew.vue
  34. 29 3
      src/views/modules/Statistics/videoStatics/vDay.vue
  35. 26 9
      src/views/modules/Statistics/videoStatics/vMonth.vue
  36. 31 5
      src/views/modules/Statistics/videoStatics/vSummary.vue
  37. 27 11
      src/views/modules/Statistics/videoStatics/vWeek.vue
  38. 355 0
      src/views/modules/advertiser/modules/productModal.vue
  39. 346 0
      src/views/modules/advertiser/productList.vue
  40. 1 1
      src/views/modules/agent/KuaishouReportDailyAgentList.vue
  41. 432 2
      src/views/modules/columnConst/accountConst.js
  42. 608 0
      src/views/modules/dataChecked/taskList.vue
  43. 229 0
      src/views/modules/dataChecked/taskLog.vue
  44. 58 20
      src/views/modules/kuaishouapp/account/accountIndex.vue
  45. 108 20
      src/views/modules/kuaishouapp/account/advertisingGroup.vue
  46. 14 9
      src/views/modules/kuaishouapp/account/copyGroup.vue
  47. 40 11
      src/views/modules/kuaishouapp/account/editGroup.vue
  48. 38 10
      src/views/modules/kuaishouapp/account/editGroupNew.vue
  49. 4 4
      src/views/modules/kuaishouapp/account/originality.vue
  50. 2 2
      src/views/modules/kuaishouapp/account/stepForm/Step2.vue
  51. 36 7
      src/views/modules/kuaishouapp/account/stepForm/Step3.vue
  52. 657 0
      src/views/modules/material/labelMaterial.vue
  53. 188 0
      src/views/modules/material/modules/DepartAuthModal.vue
  54. 116 0
      src/views/modules/material/modules/DepartDataruleModal.vue
  55. 223 0
      src/views/modules/material/modules/DepartModal.vue
  56. 11 3
      src/views/modules/material/videoMaterial.vue
  57. 288 0
      src/views/playerPart/playerData.js
  58. 238 0
      src/views/playerPart/playerList.vue
  59. 5 5
      src/views/user/Login.vue
  60. 10 5
      vue.config.js

+ 1 - 0
package.json

@@ -32,6 +32,7 @@
       "iview": "2.0.0-rc.17",
       "jquery": "^3.4.1",
       "js-cookie": "^2.2.0",
+      "k-form-design": "^3.6.1",
       "lodash.get": "^4.4.2",
       "lodash.pick": "^4.4.0",
       "mcanvas": "^1.3.9",

+ 1 - 1
public/color.less

@@ -1,4 +1,4 @@
-@primary-color: #1890ff;
+@primary-color: #1890ff !important;
 /* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
 /* stylelint-disable no-duplicate-selectors */
 /* stylelint-disable */

+ 1 - 0
public/index.html

@@ -8,6 +8,7 @@
   <meta name="viewport" content="width=device-width,initial-scale=1.0">
   <title>智能投放平台</title>
   <link rel="icon" href="<%= BASE_URL %>logo.png">
+  <link href="<%= BASE_URL %>color.less">
   <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.2.5/polyfill.js"></script>
   <script src="<%= BASE_URL %>web-office-sdk-v1.1.1.umd.js"></script>
   <style>

+ 69 - 7
src/components/layouts/TabLayout.vue

@@ -137,9 +137,9 @@
           this.linkList.push(newRoute.fullPath)
           this.pageList.push(Object.assign({}, newRoute))
           // update-begin-author:sunjianlei date:20200103 for: 如果新增的页面配置了缓存路由,那么就强制刷新一遍
-          if (newRoute.meta.keepAlive) {
-            this.routeReload()
-          }
+          //   if (newRoute.meta.keepAlive) {
+          //     this.routeReload()
+          //   }
           // update-end-author:sunjianlei date:20200103 for: 如果新增的页面配置了缓存路由,那么就强制刷新一遍
         } else if (this.linkList.indexOf(newRoute.fullPath) >= 0) {
           let oldIndex = this.linkList.indexOf(newRoute.fullPath)
@@ -168,7 +168,7 @@
         let index = this.linkList.lastIndexOf(key)
         let waitRouter = this.pageList[index]
         this.$router.push(Object.assign({}, waitRouter));
-        this.changeTitle(waitRouter.meta.title)
+        // this.changeTitle(waitRouter.meta.title)
       },
       'multipage': function (newVal) {
         if (this.reloadFlag) {
@@ -242,8 +242,13 @@
         // index = index >= this.linkList.length ? this.linkList.length - 1 : index
         // this.activePage = this.linkList[index]
         if (key == "/account/advertisingGroup") {
-          localStorage.removeItem("advertisingGroup")
-          localStorage.removeItem("advertisingGroupKey")
+          if (this.linkList.includes("/account/stepForm") || this.linkList.includes("/account/originality")) {
+            this.$message.error('已开启创意或创建页面,不可关闭组页面')
+            return
+          } else {
+            localStorage.removeItem("advertisingGroup")
+            localStorage.removeItem("advertisingGroupKey")
+          }
         }
         if (key == "/account/stepForm") {
           localStorage.removeItem("step")
@@ -257,11 +262,68 @@
         if (key == "/modules/material/materialList") {
           localStorage.removeItem("key")
         }
+        if (key == "/account/accountIndex") {
+          if (this.linkList.includes("/account/stepForm") || this.linkList.includes("/account/originality") || this
+            .linkList.includes("/account/advertisingGroup")) {
+            this.$message.error('正在操作,不可关闭计划列表')
+            return
+          } else {
+            this.routeReload()
+          }
+        }
+
+        if (key == '/modules/BatchCreate/TouTiaoBatch' && !(this.linkList.includes('/modules/BatchCreate/newCreate') ||
+            this.linkList.includes('/modules/BatchCreate/newPlan') || this.linkList.includes(
+              '/modules/BatchCreate/newGroup'))) {
+          localStorage.setItem('accountInfo', '')
+          localStorage.setItem("groupInfo", '')
+          localStorage.setItem("planInfo", '')
+        }
+        // if(!this.linkList.includes('/modules/BatchCreate/newGroup')&&!this.linkList.includes('/modules/BatchCreate/newPlan')&&!this.linkList.includes('/modules/BatchCreate/newCreate')){
+        //   localStorage.setItem("planInfo",'')
+        //   localStorage.setItem("groupInfo",'')
+
+        // }
+        if (key == '/modules/BatchCreate/newGroup' && !(this.linkList.includes('/modules/BatchCreate/newCreate') || this
+            .linkList.includes('/modules/BatchCreate/newPlan') || this.linkList.includes(
+              '/modules/BatchCreate/TouTiaoBatch'))) {
+          console.log('newGroup')
+          localStorage.setItem('accountInfo', '')
+          localStorage.setItem("groupInfo", '')
+        }
+        if (key == '/modules/BatchCreate/newPlan' && !(this.linkList.includes('/modules/BatchCreate/newCreate') || this
+            .linkList.includes('/modules/BatchCreate/newGroup') || this.linkList.includes(
+              '/modules/BatchCreate/TouTiaoBatch'))) {
+          console.log('newPlan')
+          localStorage.setItem('accountInfo', '')
+          localStorage.setItem("groupInfo", '')
+          localStorage.setItem("planInfo", '')
+        }
+        if (key == '/modules/BatchCreate/newCreate' && !(this.linkList.includes('/modules/BatchCreate/TouTiaoBatch') ||
+            this.linkList.includes('/modules/BatchCreate/newPlan') || this.linkList.includes(
+              '/modules/BatchCreate/newGroup'))) {
+          console.log('newCreate')
+          localStorage.setItem('accountInfo', '')
+          localStorage.setItem("groupInfo", '')
+          localStorage.setItem("planInfo", '')
+        }
+        // this.pageList = this.pageList.filter(item => item.fullPath !== key)
+        // let index = this.linkList.indexOf(key)
+        // this.linkList = this.linkList.filter(item => item !== key)
+        // index = index >= this.linkList.length ? this.linkList.length - 1 : index
+        // this.activePage = this.linkList[index]
+
+
         this.pageList = this.pageList.filter(item => item.fullPath !== key)
         let index = this.linkList.indexOf(key)
         this.linkList = this.linkList.filter(item => item !== key)
         index = index >= this.linkList.length ? this.linkList.length - 1 : index
-        this.activePage = this.linkList[index]
+        if (index != -1) {
+          this.activePage = this.linkList[index]
+        } else {
+          this.activePage = this.$route.fullPath
+        }
+
       },
       onContextmenu(e) {
         const pagekey = this.getPageKey(e.target)

+ 3 - 3
src/components/setting/SettingDrawer.vue

@@ -192,9 +192,9 @@
         vm.visible = false
       }, 16)
       // 当主题色不是默认色时,才进行主题编译
-      if (this.primaryColor !== config.primaryColor) {
-        updateTheme(this.primaryColor)
-      }
+    //   if (this.primaryColor !== config.primaryColor) {
+    //     updateTheme(this.primaryColor)
+    //   }
       if (this.colorWeak !== config.colorWeak) {
         updateColorWeak(this.colorWeak)
       }

+ 16 - 1
src/components/uploadFile.vue

@@ -227,12 +227,27 @@
         let d = date.getDate()
         d = d < 10 ? '0' + d : d
         var timeElse = new Date().getTime()
+        var arr = file.name.split('.')
+
+        var str = ''
+        for (let i = 0; i < arr.length; i++) {
+          if (i == arr.length - 1) {} else {
+            if (i == arr.length - 2) {
+              str += arr[i]
+            } else {
+              str += (arr[i] + '.')
+            }
+          }
+
+        }
+        console.log(str + '-' + timeElse + '.' + arr[arr.length - 1])
         cos.putObject({
           Bucket: 'media-1301855440',
           /* 必须 */
           Region: 'ap-thirdpart',
           /* 存储桶所在地域,必须字段 */
-          Key: that.uploadType + '/' + y + '-' + MM + '-' + d + '/' + timeElse + '-' + file.name,
+          Key: that.uploadType + '/' + y + '-' + MM + '-' + d + '/' + str + '-' + timeElse + '.' + arr[arr
+            .length - 1],
           /* 必须 */
           StorageClass: 'STANDARD',
           Body: file, // 上传文件对象

+ 8 - 0
src/main.js

@@ -30,6 +30,14 @@ import promiseFinally from 'promise.prototype.finally';
 promiseFinally.shim();
 
 import md5 from 'blueimp-md5';
+
+// import KFormDesign from 'k-form-design'
+import KFormDesign from 'k-form-design/lib/k-form-design-mini.umd.min'
+import 'k-form-design/styles/k-form-design.less'
+// import 'k-form-design/lib/k-form-design.css'
+Vue.use(KFormDesign)
+import 'ant-design-vue/dist/antd.less';
+
 Vue.prototype.$md5 = md5;
 import {
   ACCESS_TOKEN,

+ 1 - 1
src/utils/request.js

@@ -14,7 +14,7 @@ else if (process.env.NODE_ENV == 'debug') {
 } 
 else if (process.env.NODE_ENV == 'production') { 
     // axios.defaults.baseURL = 'http://192.168.1.251/jeecg-boot';
-axios.defaults.baseURL = 'http://api.tjyourong.com.cn/jeecg-boot';
+axios.defaults.baseURL = 'http://api.shyouteng.com.cn/jeecg-boot';
 }
 const service = axios.create({
 //   baseURL: '/jeecg-boot', // api base_url

+ 93 - 66
src/views/activiti/applyHome.vue

@@ -2,80 +2,99 @@
   <a-card :bordered="false">
     <!--流程申请选择-->
     <a-input-search style="margin-bottom: 10px;margin-right:10px;width: 200px" v-model="searchProcessKey"
-                    placeholder="输入流程名称" @search="onSearchProcess" />
+      placeholder="输入流程名称" @search="onSearchProcess" />
     <a-button @click="onSearchProcess(searchProcessKey)" type="primary">查询</a-button>
     <a-button @click="onSearchProcess('')">重置</a-button>
     <a-button @click="handleToApplyList" type="primary" style="float: right;">前往我的申请列表</a-button>
-      <a-empty description="无流程可供选择" v-if="activeKeyAll.length==0" />
-      <div v-else>
-        <a-collapse v-model="activeKey">
-          <a-collapse-panel v-for="(value, index)  in activeKeyAll" :header="filterDictText(dictOptions,value)||'未分类'" :key="value">
-            <a-list :grid="{ gutter: 10,column:4}" :dataSource="processDataMap[value]">
-              <a-list-item slot="renderItem" slot-scope="item">
-                <a-card>
-                  <div slot="title">
-                    <a-row>
-                      <a-col span="12" :title="item.name">{{item.name}} </a-col>
-                      <a-col span="12" style="text-align: right;">
-                        <a href="javascript:void (0)" @click="chooseProcess(item)">发起申请</a>
-                      </a-col>
-                    </a-row>
-                  </div>
-                  <b>版本:</b>v.{{item.version}}
-                  <br/>
-                  <b>说明:</b>{{item.description}}
-                </a-card>
-              </a-list-item>
-            </a-list>
-          </a-collapse-panel>
-        </a-collapse>
-      </div>
+    <a-empty description="无流程可供选择" v-if="activeKeyAll.length==0" />
+    <div v-else>
+      <a-collapse v-model="activeKey">
+        <a-collapse-panel v-for="(value, index)  in activeKeyAll" :header="filterDictText(dictOptions,value)||'未分类'"
+          :key="value">
+          <a-list :grid="{ gutter: 10,column:4}" :dataSource="processDataMap[value]">
+            <a-list-item slot="renderItem" slot-scope="item">
+              <a-card>
+                <div slot="title">
+                  <a-row>
+                    <a-col span="12" :title="item.name">{{item.name}} </a-col>
+                    <a-col span="12" style="text-align: right;">
+                      <a href="javascript:void (0)" @click="chooseProcess(item)">发起申请</a>
+                    </a-col>
+                  </a-row>
+                </div>
+                <b>版本:</b>v.{{item.version}}
+                <br />
+                <b>说明:</b>{{item.description}}
+              </a-card>
+            </a-list-item>
+          </a-list>
+        </a-collapse-panel>
+      </a-collapse>
+      <k-form-design style="border:2px solid #ccc" :fields="typeList" :toolbars="['save', 'preview', 'reset', 'close' ]"
+        :showHead="false" toolbarsTop showToolbarsText @save="saveJson" />
+    </div>
     <!--流程表单-->
     <a-modal :title="lcModa.title" v-model="lcModa.visible" :footer="null" :maskClosable="false" width="80%">
       <component :disabled="lcModa.disabled" v-if="lcModa.visible" :is="lcModa.formComponent"
-                 :processData="lcModa.processData" :isNew = "lcModa.isNew"
-                 @afterSubmit="afterSub" @close="lcModa.visible=false,lcModa.disabled = false"></component>
+        :processData="lcModa.processData" :isNew="lcModa.isNew" @afterSubmit="afterSub"
+        @close="lcModa.visible=false,lcModa.disabled = false"></component>
     </a-modal>
   </a-card>
 
 </template>
 
 <script>
-  import { activitiMixin } from '@/views/activiti/mixins/activitiMixin'
+  import {
+    activitiMixin
+  } from '@/views/activiti/mixins/activitiMixin'
   import JEllipsis from '@/components/jeecg/JEllipsis'
   import JTreeSelect from '@/components/jeecg/JTreeSelect'
-  import {initDictOptions, filterDictText} from '@/components/dict/JDictSelectUtil'
+  import {
+    initDictOptions,
+    filterDictText
+  } from '@/components/dict/JDictSelectUtil'
   import historicDetail from '@/views/activiti/historicDetail'
   export default {
     name: "applyHome",
-    mixins:[activitiMixin],
+    mixins: [activitiMixin],
     components: {
-      JEllipsis
-      ,JTreeSelect
-      ,historicDetail
+      JEllipsis,
+      JTreeSelect,
+      historicDetail
     },
-    data () {
+    data() {
       return {
+        typeList: ["input", "textarea", "number", "select", "checkbox", "radio", "date", "time", "rate", "slider",
+          "uploadFile", "uploadImg", "switch", "button",  "text",  "card", "grid", "table"
+        ],//"alert","html", "divider",
         description: '所有',
-        dictOptions:[],
+        dictOptions: [],
         url: {
           getProcessDataList: "/activiti_process/listData",
-          getFirstNode:'/actProcessIns/getFirstNode',
-          applyBusiness:'/actBusiness/apply',
+          getFirstNode: '/actProcessIns/getFirstNode',
+          applyBusiness: '/actBusiness/apply',
         },
         // 查询条件
         queryParam: {
-          createTimeRange:[],
-          keyWord:'',
+          createTimeRange: [],
+          keyWord: '',
         },
         // 表头
         labelCol: {
-          xs: { span: 4 },
-          sm: { span: 4 },
+          xs: {
+            span: 4
+          },
+          sm: {
+            span: 4
+          },
         },
         wrapperCol: {
-          xs: { span: 20 },
-          sm: { span: 20 },
+          xs: {
+            span: 20
+          },
+          sm: {
+            span: 20
+          },
         },
         processModalVisible: null,
         activeKeyAll: [],
@@ -84,22 +103,23 @@
         searchProcessKey: null,
         addApplyLoading: false,
         lcModa: {
-          title:'',
-          disabled:false,
-          visible:false,
-          formComponent : null,
-          isNew : false
+          title: '',
+          disabled: false,
+          visible: false,
+          formComponent: null,
+          isNew: false
         },
       }
     },
-    computed:{
-    },
+    computed: {},
     mounted() {
       this.initDictConfig()
       this.getProcessList()
     },
     methods: {
-
+      saveJson(json) {
+        console.log(json)
+      },
       initDictConfig() {
         //初始化字典 - 流程分类
         initDictOptions('bpm_process_type').then((res) => {
@@ -116,31 +136,36 @@
             }
           }
         }
-        return text||text=='null'?'':text
+        return text || text == 'null' ? '' : text
       },
       /*加载流程列表*/
       getProcessList() {
         this.addApplyLoading = true;
-        this.getAction(this.url.getProcessDataList,{status:1,roles:true}).then(res => {
+        this.getAction(this.url.getProcessDataList, {
+          status: 1,
+          roles: true
+        }).then(res => {
           this.activeKeyAll = [];
           if (res.success) {
-            var result = res.result||[];
-            if (result.length>0){
+            var result = res.result || [];
+            if (result.length > 0) {
               let searchProcessKey = this.searchProcessKey;
-              if (searchProcessKey){ //过滤条件
-                result = _.filter(result, function(o) { return o.name.indexOf(searchProcessKey)>-1; });
+              if (searchProcessKey) { //过滤条件
+                result = _.filter(result, function (o) {
+                  return o.name.indexOf(searchProcessKey) > -1;
+                });
               }
-              this.processDataMap = _.groupBy(result,'categoryId');
+              this.processDataMap = _.groupBy(result, 'categoryId');
               for (const categoryId in this.processDataMap) {
                 this.activeKeyAll.push(categoryId)
               }
               this.activeKey = this.activeKeyAll;
             }
             this.processModalVisible = true;
-          }else {
+          } else {
             this.$message.warning(res.message)
           }
-        }).finally(()=>this.addApplyLoading = false);
+        }).finally(() => this.addApplyLoading = false);
       },
       onSearchProcess(value) {
         this.searchProcessKey = value;
@@ -154,20 +179,22 @@
           return;
         }
         this.lcModa.formComponent = this.getFormComponent(v.routeName).component;
-        this.lcModa.title = '发起流程:'+v.name;
+        this.lcModa.title = '发起流程:' + v.name;
         this.lcModa.isNew = true;
         this.lcModa.processData = v;
         this.lcModa.visible = true;
-        console.log("发起",v)
+        console.log("发起", v)
       },
       /*提交成功申请后*/
-      afterSub(formData){
-          this.lcModa.visible = false;
-          this.$message("请前往我的申请列表提交审批!")
+      afterSub(formData) {
+        this.lcModa.visible = false;
+        this.$message("请前往我的申请列表提交审批!")
       },
       /*前往我的申请页面*/
       handleToApplyList() {
-        this.$router.push({path:'/activiti/applyList'})
+        this.$router.push({
+          path: '/activiti/applyList'
+        })
       }
     }
   }

+ 96 - 23
src/views/modules/BatchCreate/TouTiaoBatch.vue

@@ -2,7 +2,7 @@
     <div class="toutiaoBatch">
         <!-- <a-spin :spinning="spinning"> -->
 
-        <keep-alive>
+        
         <div class="tabs">
             <a-tabs v-model="tabkey" @change="callback">
                 <a-tab-pane key="group" tab="广告组">
@@ -18,10 +18,10 @@
                         {{currentPlan.name }}	 <a-icon type="close" @click="clearPlan" />
                     </a-tag>
                 </a-tab-pane>
-                <a-button type='primary'  slot="tabBarExtraContent" @click="goBatch" >
+                <!-- <a-button type='primary'  slot="tabBarExtraContent" @click="goBatch" >
                    + 头条批量创建
-                </a-button>
-                <!-- <a-button type='primary'  slot="tabBarExtraContent" @click="goBatch" v-if="tabkey=='group'">
+                </a-button> -->
+                <a-button type='primary'  slot="tabBarExtraContent" @click="goBatch" v-if="tabkey=='group'">
                    + 头条批量创建
                 </a-button>
                 <a-button type='primary'  slot="tabBarExtraContent" @click="createPlan" v-if="tabkey=='plan'">
@@ -29,11 +29,11 @@
                 </a-button>
                 <a-button type='primary'  slot="tabBarExtraContent" @click="createIdea" v-if="tabkey=='idea'">
                    + 新建创意
-                </a-button> -->
+                </a-button>
 
             </a-tabs>
         </div>
-        </keep-alive>
+       
         <div class="topOptions">
             <span class="OptinItem topOpt">
                 <!-- <Treeselect :appId.sync="accountID" :multiple="false" request="2,4" reqUrl='/ctop/projectMember/getProjectAccountByUserId' ref="treeSelect" style="margin-bottom:8px " /> -->
@@ -152,6 +152,7 @@
                     :pagination="ipagination"
                     :loading="loading"
                     @change="sort"
+                    
                 >
                     <template slot="name" slot-scope="text,record">
                         <a href="javascript:;" @click="goNextPage(record)">
@@ -161,9 +162,13 @@
                     <span slot="budget" slot-scope="text,record">
                        <editableCell :text="text" slotName='budget' @change="onCellChange(record.key, 'budget', $event)" />
                     </span>
-                    <span slot="bid" slot-scope="text,record">
+                    <span slot="bid" slot-scope="text,record" >
                        <editableCell :text="text" slotName='bid' @change="onCellChange(record.key, 'bid', $event)" />
                     </span>
+                    <span slot="cpaBid" slot-scope="text,record">
+                       <editableCell :text="text" slotName='cpaBid' @change="onCellChange(record.key, 'cpaBid', $event)" />
+                       <!-- {{text}} -->
+                    </span>
 
                     <span slot="campaignStatus" slot-scope="text,record">
                         <a-spin :spinning="record.spin" size="small" >
@@ -228,6 +233,7 @@
                 </a-table>
             </div>
         </div>
+        
         <!-- 出价的模态框 -->
         <div class="batchModal" >
             <a-modal v-model="offerPriceVisiable" :title="'批量修改'+ModalTitle" @ok="modifyChangeOk" width='55%' id="batchModal" >
@@ -305,7 +311,7 @@
 <script>
 import moment from 'moment';
 import { getAction, postAction, downFile, downFilePost } from '@/api/manage';
-import { JeecgListMixin } from '@/mixins/ipagination'
+// import { JeecgListMixin } from '@/mixins/ipagination'
 import editableCell from './editableCell'
 import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
 import qs from 'qs'
@@ -447,6 +453,15 @@ const planColumns = [
     scopedSlots: { customRender: 'bid' }
   },
   {
+    title: '目标转化出价(元)',
+
+    dataIndex: 'cpaBid',
+    key: 'cpaBid',
+    align: 'center',
+    width:150,
+    scopedSlots: { customRender: 'cpaBid' }
+  },
+  {
     title: '投放方式',
     dataIndex: 'flowControlMode',
     key: 'flowControlMode',
@@ -566,9 +581,27 @@ export default {
         editableCell,
         Treeselect,
     },
-    mixins: [JeecgListMixin],
+    // mixins: [JeecgListMixin],
     data() {
         return {
+            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;
+                }
+            },
             currentGroup:{},
             currentPlan:{},           
 
@@ -667,6 +700,7 @@ export default {
                     startDate:this.dateString[0],
                     endDate:this.dateString[1],
                     pageNo:this.ipagination.current,
+                    pageSize:this.ipagination.pageSize,
                     campaignId:item.id
                 })
 
@@ -686,7 +720,8 @@ export default {
                     status:this.statusValue,
                     startDate:this.dateString[0],
                     endDate:this.dateString[1],
-                    pageNo:this.ipagination.current
+                    pageNo:this.ipagination.current,
+                    pageSize:this.ipagination.pageSize,
                 })
                 let planInfo=JSON.stringify([item])
                 localStorage.setItem('planInfo',planInfo)
@@ -704,6 +739,7 @@ export default {
                 startDate:this.dateString[0],
                 endDate:this.dateString[1],
                 pageNo:this.ipagination.current,
+                pageSize:this.ipagination.pageSize,
                 campaignId:this.currentGroup.id
             })
         },
@@ -718,6 +754,7 @@ export default {
                 startDate:this.dateString[0],
                 endDate:this.dateString[1],
                 pageNo:this.ipagination.current,
+                pageSize:this.ipagination.pageSize,
                 planId:this.currentPlan.id,
             })
         },
@@ -735,15 +772,16 @@ export default {
                 this.accountID=undefined;
                 this.openID=val
             }
+            
+            this.search();
             this.treeData.forEach((item)=>{
                 item.children.forEach(ele=>{
-                    if(ele.value==val){
+                    if(ele.value==this.accountID){
                         let accountInfo=JSON.stringify(ele)
                         localStorage.setItem('accountInfo',accountInfo)
                     }
                 })
             })
-            this.search();
         },
 
         filterOption(input, option){
@@ -778,6 +816,7 @@ export default {
                         startDate:this.dateString[0],
                         endDate:this.dateString[1],
                         pageNo:this.ipagination.current,
+                        pageSize:this.ipagination.pageSize,
                         
                     });
                 }else if(key=='plan'){
@@ -788,6 +827,7 @@ export default {
                         startDate:this.dateString[0],
                         endDate:this.dateString[1],
                         pageNo:this.ipagination.current,
+                        pageSize:this.ipagination.pageSize,
                         campaignId:this.currentGroup.id
                     })
 
@@ -800,7 +840,8 @@ export default {
                         status:this.statusValue,
                         startDate:this.dateString[0],
                         endDate:this.dateString[1],
-                        pageNo:this.ipagination.current
+                        pageNo:this.ipagination.current,
+                        pageSize:this.ipagination.pageSize,
                       });
                 }
             }
@@ -808,8 +849,10 @@ export default {
         },
         //跳转到批量页面
         goBatch(){
+            
             this.$router.push('/modules/BatchCreate/newGroup')
             
+            
         },
         createPlan(){
             if(this.currentGroup.name){
@@ -824,12 +867,14 @@ export default {
         createIdea(){
             if(this.accountID){
                 if(this.currentPlan.name){
-                    console.log(this.currentPlan)
-                    this.$router.push('/modules/BatchCreate/newCreate');
-                    let planInfo=JSON.stringify(this.currentGroup);
+                    // console.log(this.currentPlan)                  
+                    let groupInfo=JSON.stringify(this.currentGroup);
                     localStorage.setItem('groupInfo',groupInfo)
+                    let planInfo=JSON.stringify([this.currentPlan]);
+                    localStorage.setItem('planInfo',planInfo)
+                    this.$router.push('/modules/BatchCreate/newCreate');
                 }else if(!this.currentPlan.name){
-                    console.log('hhhh    去新建或者选择已有');
+                    // console.log('hhhh    去新建或者选择已有');
                     this.$router.push('/modules/BatchCreate/selectPlanList');
                 }
             }else {
@@ -868,7 +913,8 @@ export default {
                         status:this.statusValue,
                         startDate:this.dateString[0],
                         endDate:this.dateString[1],
-                        pageNo:this.ipagination.current
+                        pageNo:this.ipagination.current,
+                        pageSize:this.ipagination.pageSize,
                     })
                 }else if(this.tabkey=='plan'){
                     this.columns=planColumns;
@@ -879,6 +925,7 @@ export default {
                         startDate:this.dateString[0],
                         endDate:this.dateString[1],
                         pageNo:this.ipagination.current,
+                        pageSize:this.ipagination.pageSize,
                         campaignId:this.currentGroup.id
                     })
                 }else if(this.tabkey=='idea'){
@@ -890,6 +937,7 @@ export default {
                         startDate:this.dateString[0],
                         endDate:this.dateString[1],
                         pageNo:this.ipagination.current,
+                        pageSize:this.ipagination.pageSize,
                         planId:this.currentPlan.id,
                     })
                 }
@@ -908,6 +956,8 @@ export default {
         sort(pagination, filters, sorter, { currentDataSource }){
             
             this.ipagination.current=pagination.current;
+
+            this.ipagination.pageSize=pagination.pageSize;
             this.search()
         },
         //重置按钮事件
@@ -938,7 +988,9 @@ export default {
                                 status:this.statusValue,
                                 startDate:this.dateString[0],
                                 endDate:this.dateString[1],
-                                pageNo:this.ipagination.current
+                                pageNo:this.ipagination.current,
+                                pageSize:this.ipagination.pageSize,
+                                
                             })
                             this.$message.success(res.message)
                     }else{
@@ -974,6 +1026,7 @@ export default {
                                 startDate:this.dateString[0],
                                 endDate:this.dateString[1],
                                 pageNo:this.ipagination.current,
+                                pageSize:this.ipagination.pageSize,
                                 planId:this.currentPlan.id,
                                 
                             })
@@ -1031,7 +1084,8 @@ export default {
                         status:this.statusValue,
                         startDate:this.dateString[0],
                         endDate:this.dateString[1],
-                        pageNo:this.ipagination.current
+                        pageNo:this.ipagination.current,
+                        pageSize:this.ipagination.pageSize,
                     })
                 }else{
                     this.loading=false
@@ -1245,6 +1299,7 @@ export default {
                             startDate:this.dateString[0],
                             endDate:this.dateString[1],
                             pageNo:this.ipagination.current,
+                            pageSize:this.ipagination.pageSize,
                             campaignId:this.currentGroup.id
                         })
                     }
@@ -1268,6 +1323,7 @@ export default {
                         startDate:this.dateString[0],
                         endDate:this.dateString[1],
                         pageNo:this.ipagination.current,
+                        pageSize:this.ipagination.pageSize,
                         campaignId:this.currentGroup.id
                     })
                     this.$message.error(res.message)
@@ -1320,7 +1376,8 @@ export default {
                                         status:this.statusValue,
                                         startDate:this.dateString[0],
                                         endDate:this.dateString[1],
-                                        pageNo:this.ipagination.current
+                                        pageNo:this.ipagination.current,
+                                        pageSize:this.ipagination.pageSize,
                                     })
                                 }
                             })
@@ -1362,6 +1419,7 @@ export default {
                                     startDate:this.dateString[0],
                                     endDate:this.dateString[1],
                                     pageNo:this.ipagination.current,
+                                    pageSize:this.ipagination.pageSize,
                                     campaignId:this.currentGroup.id
                                 })
                             }
@@ -1468,7 +1526,7 @@ export default {
         accountHttp(){
             this.treeData=[];
             this.accountID=undefined;
-            getAction('/ctop/projectMember/getProjectAccountByUserId', {}).then(res => {
+            getAction('/ctop/projectMember/getProjectAccountByUserId?mediaType=1', {}).then(res => {
             if(res.success){
                     // console.log(res);
                     if(res.result){
@@ -1500,9 +1558,24 @@ export default {
         },
     },
     mounted() {
-
         this.accountHttp()
     },
+    
+    activated() {
+        // this.accountHttp()
+    },
+    beforeDestroy() {
+        this.treeData.forEach((item)=>{
+            item.children.forEach(ele=>{
+                if(ele.value==this.accountID){
+                    let accountInfo=JSON.stringify(ele)
+                    localStorage.setItem('accountInfo',accountInfo)
+                }
+            })
+        })
+       
+
+    },
     filters: {
         toPercentage(val) {
             if(val){

+ 1 - 1
src/views/modules/BatchCreate/components/Treeselect.vue

@@ -178,7 +178,7 @@
         // })
         this.options=[];
         this.accountID=undefined;
-            getAction('/ctop/projectMember/getProjectAccountByUserId', {}).then(res => {
+            getAction('/ctop/projectMember/getProjectAccountByUserId?mediaType=1', {}).then(res => {
                 if(res.success){
                     // console.log(res);
                     if(res.result){

+ 65 - 36
src/views/modules/BatchCreate/components/material.vue

@@ -62,19 +62,24 @@
                       <!-- <upload-to-ali v-model="item.imageUrl" :customDomain="customDomain" preview :region="region"
                         :bucket="bucket" :accept="acceptImage" :size="102400" :accessKeyId="accessKeyId"
                         :accessKeySecret="accessKeySecret"></upload-to-ali> -->
-                      <a @click="getImageList(item)" v-if="item.imageUrl==''">选择图片</a>
-                      <img :src="item.imageUrl" alt="" v-else style="width:120px">
+                      
+                      
+                      <a @click="getImageList(item)" >{{item.imageUrl==''?'选择图片':'更改图片'}}</a>
+                      <br />
+                      <img :src="item.imageUrl" alt="图片加载失败!"  style="width:120px" v-if="item.imageUrl">
                     </a-form-item>
 
                     <a-form-item label="创意标题" :labelCol="labelCol" :wrapperCol="wrapperCol"
                       v-if="creativeType == 'customCreativity'">
-                      <a-input v-model="item.text" style="width:400px" class="rending" @change="judge(item)"></a-input>
+                      <a-input v-model="item.title " style="width:400px" class="rending" @change="judge($event,item)"></a-input>
                     </a-form-item>
                     <a-form-item label="动态词包" :labelCol="labelCol" :wrapperCol="wrapperCol"
                       v-if="creativeType == 'customCreativity'">
-                      <a-tag v-for="(itemTag,indexTag) of tags" :key="indexTag" v-show="indexTag<item.many"
+                      <!-- {{tags}} -->
+                      <!-- v-show="indexTag<item.many" -->
+                      <a-tag v-for="(itemTag,indexTag) of tags" :key="indexTag"  v-show="indexTag<item.many"
                         @click="getChange(item,itemTag,index)">{{itemTag.name}}</a-tag>
-                      <span @click="showElseClick(item)">{{item.showElse?"更多":"收起"}}</span>
+                      <span @click="showElseClick(item)" class="moreTags">{{item.showElse?"更多":""}}</span>
                     </a-form-item>
 
                   </div>
@@ -91,7 +96,7 @@
       <a-button @click="addTitle" class="row-item">添加创意标题</a-button>
       <br />
       <div v-for="(item,index) of titleData" :key="index">
-        <a-input style="width:55%;margin-bottom:20px" v-model="item.text" class="rending-all" @change="judge(item)">
+        <a-input style="width:55%;margin-bottom:20px" v-model="item.title" class="rending-all" @change="judge($event,item)">
         </a-input>
         <a-icon type="delete" style="margin-left:20px;cursor: pointer;" v-show="titleData.length>1"
           @click="tetleDetele(index)" />
@@ -321,6 +326,7 @@
           }
         },
         isImg:false,
+        accountInfo:{},
       }
     },
     methods: {
@@ -328,7 +334,7 @@
         console.log(this.isImg)
         this.ipagination.current = page
         var params = {}
-        params.accountId = "1649600126891015"
+        params.accountId = this.accountInfo.value
         params.pageSize = this.ipagination.pageSize
         params.pageNo = page
         if (this.time.length > 0) {
@@ -338,13 +344,18 @@
         if ((this.materialType == 'CREATIVE_IMAGE_MODE_VIDEO' || this.materialType ==
           'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL')&&!this.isImg) {
           if (this.materialType == 'CREATIVE_IMAGE_MODE_VIDEO') {
-            params.type = 2
-          } else {
             params.type = 1
+          } else {
+            params.type = 2
           }
           this.showVideoList('/bytedance/batch/getVideoList', params)
         } else if(this.isImg){
           console.log(this.isImg)
+          if (this.materialType == 'CREATIVE_IMAGE_MODE_VIDEO') {
+            params.type = 1
+          } else {
+            params.type = 2
+          }
           this.showVideoList('/bytedance/batch/getImageList', params)
         }
       },
@@ -357,14 +368,22 @@
 
         this.isImg=true;
         var params = {}
-        params.accountId = '1649600126891015'
+        params.accountId = this.accountInfo.value
         params.pageSize = this.ipagination.pageSize
         params.pageNo = this.ipagination.current
         if (this.time.length > 0) {
           params.startDate = moment(this.time[0]).format('YYYY-MM-DD')
           params.endDate = moment(this.time[1]).format('YYYY-MM-DD')
         }
-        this.showVideoList('/bytedance/batch/getImageList', params)
+
+          if (this.materialType == 'CREATIVE_IMAGE_MODE_VIDEO') {
+            params.type = 1
+          } else {
+            params.type = 2
+          }
+          this.showVideoList('/bytedance/batch/getImageList', params)
+      
+        
       },
       onChangeVideo() {
         if (this.checkVideo.length > 1) {
@@ -399,7 +418,7 @@
         this.isImg=false
         this.ipagination.current = 1
         var params = {}
-        params.accountId = '1649600126891015'
+        params.accountId = this.accountInfo.value
         params.pageSize = this.ipagination.pageSize
         params.pageNo = this.ipagination.current
         if (this.time.length > 0) {
@@ -409,9 +428,9 @@
         if (this.materialType == 'CREATIVE_IMAGE_MODE_VIDEO' || this.materialType ==
           'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL') {
           if (this.materialType == 'CREATIVE_IMAGE_MODE_VIDEO') {
-            params.type = 2
-          } else {
             params.type = 1
+          } else {
+            params.type = 2
           }
 
           this.showVideoList('/bytedance/batch/getVideoList', params)
@@ -435,18 +454,20 @@
         })
       },
       judge(item) {
+        // console.log(item)
         var re = /{(.*?)}/g
         var array = []
         var temp
-        while ((temp = re.exec(item.text))) {
+        while ((temp = re.exec(item.title))) {
           array.push(temp[1])
         }
-        console.log(array)
-        item.countTag = array.length
+        // console.log(array)
+        item.countTag = array.length;
+        // console.log(item.countTag )
       },
       getChange(item, tag, index) {
         this.judge(item)
-        if (item.text == '') {
+        if (item.title == '') {
           item.countTag = 0
         }
         if (item.countTag >= 2) {
@@ -473,7 +494,7 @@
           if (restoreTop > 0) {
             node.scrollTop = restoreTop
           }
-          item.text = node.value
+          item.title = node.value
           item.creativeWordIds.push(tag.creative_word_id)
           node.focus()
           node.selectionStart = startPos + v.length
@@ -482,13 +503,13 @@
           //OTHER
           node.value += v
           item.creativeWordIds.push(tag.creative_word_id)
-          item.text = node.value
+          item.title = node.value
           node.focus()
         }
       },
       getChangeAllTitle(item, tag, index) {
         this.judge(item)
-        if (item.text == '') {
+        if (item.title == '') {
           item.countTag = 0
         }
         if (item.countTag >= 2) {
@@ -514,23 +535,24 @@
           if (restoreTop > 0) {
             node.scrollTop = restoreTop
           }
-          item.text = node.value
+          item.title = node.value
           node.focus()
           node.selectionStart = startPos + v.length
           node.selectionEnd = startPos + v.length
         } else {
           //OTHER
           node.value += v
-          item.text = node.value
+          item.title = node.value
           node.focus()
         }
       },
       showElseClick(item) {
+        console.log(item)
         item.showElse = !item.showElse
         if (!item.showElse) {
           item.many = this.tags.length
         } else {
-          item.many = 3
+          item.many = 5
         }
       },
       materialTypeChange() {
@@ -598,20 +620,22 @@
       },
       //   创建大图横图创意
       addCreative() {
+      
         let type = this.materialType
+        console.log(type)
         this.getTags()
         if (type === 'CREATIVE_IMAGE_MODE_SMALL') {
           this.HorizontalLargeImageListSmall.push({
             ImageMode: type,
             imageUrl: '',
             imageId: '',
-            text: '',
+            title: '',
             creativeWordIds: [],
             vadioUrl: '',
             videoId: '',
             multiple: [],
             countTag: 0,
-            many: 3,
+            many: 5,
             showElse: true
           })
           this.HorizontalLargeImageList = this.HorizontalLargeImageListSmall
@@ -621,7 +645,7 @@
             imageMode: type,
             imageUrl: '',
             imageId: '',
-            text: '',
+            title: '',
             creativeWordIds: [],
             vadioUrl: '',
             videoId: '',
@@ -638,7 +662,7 @@
             imageMode: type,
             imageUrl: '',
             imageId: '',
-            text: '',
+            title: '',
             creativeWordIds: [],
             vadioUrl: '',
             videoId: '',
@@ -655,7 +679,7 @@
             imageMode: type,
             imageUrl: '',
             imageId: '',
-            text: '',
+            title: '',
             creativeWordIds: [],
             vadioUrl: '',
             videoId: '',
@@ -672,7 +696,7 @@
             imageMode: type,
             imageUrl: '',
             imageId: '',
-            text: '',
+            title: '',
             creativeWordIds: [],
             vadioUrl: '',
             videoId: '',
@@ -689,7 +713,7 @@
             imageMode: type,
             imageUrl: '',
             imageId: '',
-            text: '',
+            title: '',
             creativeWordIds: [],
             vadioUrl: '',
             videoId: '',
@@ -707,12 +731,15 @@
         this.HorizontalLargeImageList.splice(index, 1)
       },
       getTags() {
-        // let accountInfo = localStorage.getItem('accountInfo')
+        let accountInfo = localStorage.getItem('accountInfo')
         // console.log(groupInfo)
 
+        this.accountInfo=JSON.parse(accountInfo)
+
         getAction('/bytedance/batch/creative/words/get', {
-          accountId: '1649600126891015'
+          accountId: this.accountInfo.value
         }).then(res => {
+          console.log(res)
           if (res.code == '0') {
             this.tags = res.creative_word
           } else {
@@ -760,7 +787,7 @@
         console.log(n)
         if (n.length > 0) {
           var params = {}
-          params.accountId = "1649600126891015"
+          params.accountId = this.accountInfo.value
           params.pageSize = this.ipagination.pageSize
           params.pageNo = 1
           params.startDate = moment(n[0]).format('YYYY-MM-DD')
@@ -768,7 +795,7 @@
           this.showVideoList('/bytedance/batch/getVideoList', params)
         } else {
           var params = {}
-          params.accountId = "1649600126891015"
+          params.accountId = this.accountInfo.value
           params.pageSize = this.ipagination.pageSize
           params.pageNo = 1
           this.ipagination.current = 1
@@ -864,7 +891,9 @@
     margin: 0;
     padding: 0;
   }
-
+  .moreTags{
+    cursor: pointer;
+  }
   .moduler {
     background: #fff;
     margin-bottom: 16px;

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

@@ -167,7 +167,7 @@ export default {
         accountHttp(){
             this.treeData=[];
             this.accountID=undefined;
-            getAction('/ctop/projectMember/getProjectAccountByUserId', {}).then(res => {
+            getAction('/ctop/projectMember/getProjectAccountByUserId?mediaType=1', {}).then(res => {
             if(res.success){
                     // console.log(res);
                 if(res.result){

+ 11 - 0
src/views/modules/BatchCreate/editableCell.vue

@@ -11,6 +11,7 @@
         <div v-else class="editable-cell-text-wrapper">
           <span v-if="slotName=='budget'">{{ value*1? `日预算:${value*1}` :value }}</span>
           <span v-if="slotName=='bid'">{{ value*1? `${value*1}` :value }}</span>
+          <span v-if="slotName=='cpaBid'">{{ value*1? `${value*1}` :value }}</span>
           <span v-if="slotName=='name'">{{value}}</span>
           <a-icon type="edit" class="editable-cell-icon" @click.stop="edit" />
         </div>
@@ -60,6 +61,16 @@
                 }else{
                   this.value='不限'
                 }   
+              }else if(this.slotName=='cpaBid'){
+                if(this.value*1){
+                  if(value*1 && value*1>0.1 &&value*1<10000){
+                    this.value = value;
+                  }else{
+                    this.$message.error('请输入0.1-10000的数')
+                  }
+                }else{
+                  this.value='不限'
+                }   
               }
               
             },

+ 122 - 31
src/views/modules/BatchCreate/newCreate.vue

@@ -10,7 +10,7 @@
           </div>
         </div>
       </div>
-
+      
       <!-- 设置投放位置 -->
       <div class="moduler">
         <div class="moduler-title">设置投放位置</div>
@@ -51,7 +51,7 @@
                   </a-radio-group>
                 </div>
               </div>
-            </div>
+            </div><div class=""></div>
           </div>
 
         </div>
@@ -69,8 +69,8 @@
             <div class="input-item">
               <a-form-item>
                 <a-radio-group v-decorator="['creativeWay', { initialValue:'customCreativity' }]">
-                  <a-radio-button value="proceduralCreativity">程序化创意</a-radio-button>
-                  <a-radio-button value="customCreativity">自定义创意</a-radio-button>
+                  <a-radio-button value="proceduralCreativity" :disabled="creativeWayDisable">程序化创意</a-radio-button>
+                  <a-radio-button value="customCreativity" :disabled="creativeWayDisable">自定义创意</a-radio-button>
                 </a-radio-group>
               </a-form-item>
             </div>
@@ -84,11 +84,11 @@
             </div>
             <div class="input-item">
               <a-form-item>
-                <a-radio-group v-decorator="['creativeWay', { initialValue:'DEFAULT' }]">
-                  <a-radio-button value="proceduralCreativity">自定义上传</a-radio-button>
+                <a-radio-group v-decorator="['materialAddType', { initialValue:'customUpload' }]">
+                  <a-radio-button value="customUpload">自定义上传</a-radio-button>
                   <a-tooltip>
                     <template slot="title">暂未开启该功能</template>
-                    <a-radio-button value="customCreativity" :disabled="true">选择程序化创意包</a-radio-button>
+                    <a-radio-button value="chooseProgramCreativePackage" :disabled="true">选择程序化创意包</a-radio-button>
                   </a-tooltip>
                 </a-radio-group>
               </a-form-item>
@@ -160,7 +160,7 @@
               <a-form-item>
                 <a-select v-decorator="[
                 'actionText', // 给表单赋值或拉取表单时,该input对应的key
-                { rules: [{ required: true, message: '请选择剪辑!' }] }
+                { rules: [{ required: true, message: '该选项必须填写' }] }
               ]" showSearch style="width: 480px">
                   <a-select-option :value="item" v-for="(item,i) in actionTextList" :key="i">
                     {{item}}
@@ -238,8 +238,7 @@
             </div>
             <div class="input-item">
               <a-form-item>
-                <a-cascader :options="createOptions" :fieldNames="fieldNames"
-                  placeholder="请选择创意分类" @change="createChange" />
+                <a-cascader :options="createOptions" v-model="thirdIndustryIds" :fieldNames="fieldNames"  placeholder="请选择创意分类" @change="createChange" />
               </a-form-item>
             </div>
           </div>
@@ -459,12 +458,16 @@
           children: 'children'
         },
         thirdIndustryId:undefined,
+        thirdIndustryIds:undefined,
         adposition:'smartInventorys',
         sceneInventory:'VIDEO_SCENE',
 
         errorInfo:[],
         visible:false,
         loading:false,
+
+        creativeWayDisable:false,//创意方式是否禁用
+        currentCreateData:{}, //   编辑当前的创意的数据
       }
     },
     components: {
@@ -527,11 +530,7 @@
       createChange(value){
         console.log(value);
         this.thirdIndustryId=value[2]
-        //  this.form.getFieldDecorator('thirdIndustryId')
-         
-        //  this.form.setFieldsValue({
-        //    thirdIndustryId:value[2]
-        // });
+       
         console.log(this.form.getFieldsValue())
       },
       // //获取表单的某一个属性值
@@ -593,6 +592,9 @@
       },
       goBack() {
         this.$router.replace('/modules/BatchCreate/TouTiaoBatch')
+        localStorage.removeItem('groupInfo');
+        localStorage.removeItem('planInfo');
+        localStorage.removeItem('accountInfo');
         this.$bus.$emit('remove', '/modules/BatchCreate/newCreate')
       },
       goSave() {
@@ -638,10 +640,18 @@
                 values.adKeywords=this.createTipList;
 
                 let adIds=[];
-                this.planInfo.forEach(item=>{
+               
+                let postUrl=''
+                if(this.currentCreateData.adId){
+                    postUrl='/ctop/byteDanceCreative/updateCreative'
+                    adIds[0]=this.planInfo[0].id
+                }else{
+                  postUrl='/bytedance/batch/create/creative';
+                   this.planInfo.forEach(item=>{
                     adIds.push(item.id)
-                })
-                postAction('/bytedance/batch/create/creative', {
+                  })
+                }
+                postAction(postUrl, {
                   accountId:this.accountInfo.value,
                   adIds,
                   ...values,
@@ -669,15 +679,9 @@
         })
       },
       
-      // 回显数据专用
-      echoData(){
-        postAction('',{
-
-        }).then(res=>{
-          console.log(res)
-        })
-      },
+     
     },
+   
     mounted() {
       this.initFormValue();
 
@@ -685,23 +689,22 @@
         this.createOptions = res.data
 
       })
-
       this.$bus.$emit('remove', '/modules/BatchCreate/newPlan')
       let planInfo = localStorage.getItem('planInfo')
      
-      if (planInfo) {
+      if (planInfo!='') {
         this.planInfo = JSON.parse(planInfo)
       }
       
       console.log(this.planInfo)
       let groupInfo = localStorage.getItem('groupInfo')
    
-      if (groupInfo) {
+      if (groupInfo!=null) {
         this.groupInfo = JSON.parse(groupInfo)
       }
       let accountInfo = localStorage.getItem('accountInfo')
  
-      if (accountInfo) {
+      if (accountInfo!=null) {
         this.accountInfo = JSON.parse(accountInfo)
       }
 
@@ -716,6 +719,95 @@
         }
 
       })
+      this.$nextTick(()=>{
+
+        if(this.accountInfo.value&&this.planInfo[0].id){
+            postAction('/ctop/byteDanceCreative/detail',qs.stringify({
+              planId:this.planInfo[0].id,
+              accountId:this.accountInfo.value
+            })).then(res=>{
+              console.log(res);
+              if(res.success){
+                if(res.data!=null){
+                  this.creativeWayDisable=true;
+                  // 编辑当前的创意的数据
+                  this.currentCreateData=res.data
+                    this.form.setFieldsValue({
+                      ...res.data
+                    })
+                    this.sceneInventory=res.data.sceneInventory;
+                    if(res.data.smartInventory){
+                      this.adposition='smartInventorys'
+                    }else if(res.data.sceneInventory){
+                      this.adposition='sceneInventorys';
+                      this.sceneInventory=res.data.sceneInventory
+                    }else if(res.data.inventoryType.length>0){
+                      this.adposition='inventoryTypes';
+                      this.checkedList=res.data.inventoryType;
+                      this.onChange(this.checkedList)
+                    }
+
+                    this.createTipList=res.data.adKeywords;
+                    let thirdIndustryArr=[];
+                    thirdIndustryArr[0]=(res.data.thirdIndustryId+'').substring(0,4);
+                    thirdIndustryArr[1]=(res.data.thirdIndustryId+'').substring(0,6);
+                    thirdIndustryArr[2]=(res.data.thirdIndustryId+'').substring(0,8);
+
+                   
+                    thirdIndustryArr=thirdIndustryArr.map(item=>{
+                      return item*1
+                    })
+                     console.log(thirdIndustryArr)
+                    this.thirdIndustryId=res.data.thirdIndustryId;
+                    this.thirdIndustryIds=thirdIndustryArr;
+
+                    if(res.data.title_list){
+                      this.form.setFieldsValue({
+                        creativeWay:'proceduralCreativity'
+                      })
+                      this.$refs.material.titleData=res.data.title_list
+                    }else{
+                      this.form.setFieldsValue({
+                        creativeWay:'customCreativity'
+                      })
+
+                    }
+
+                     var dataCreatives = this.$refs.material.HorizontalLargeImageListBig.concat(
+                      this.$refs.material.HorizontalLargeImageListHeng,
+                      this.$refs.material.HorizontalLargeImageListShu,
+                      this.$refs.material.HorizontalLargeImageListZu,
+                      this.$refs.material.HorizontalLargeImageListSmall,
+                      this.$refs.material.HorizontalLargeImageListBigShu
+                    )
+                    res.data.creatives.forEach(item=>{
+                      if(item.imageMode=="CREATIVE_IMAGE_MODE_VIDEO_VERTICAL"){
+                          item.showElse=true;
+                          item.many=5
+                          this.$refs.material.HorizontalLargeImageListHeng.push(item)
+                      }else if(item.imageMode=="CREATIVE_IMAGE_MODE_VIDEO"){    
+                          item.showElse=true;
+                          item.many=5                  
+                          this.$refs.material.HorizontalLargeImageListShu.push(item)
+                      }
+                    })
+                    if(this.$refs.material.HorizontalLargeImageListShu.length>0){
+                      this.$refs.material.HorizontalLargeImageList=this.$refs.material.HorizontalLargeImageListShu;
+                      this.$refs.material.materialType='CREATIVE_IMAGE_MODE_VIDEO'
+                    }else if(this.$refs.material.HorizontalLargeImageListHeng.length>0){
+                      this.$refs.material.HorizontalLargeImageList=this.$refs.material.HorizontalLargeImageListHeng;
+                      this.$refs.material.materialType='CREATIVE_IMAGE_MODE_VIDEO_VERTICAL'
+                    }
+                    
+
+                   
+                    console.log(this.$refs.material, this.$refs.material.titleData)
+                }
+              }          
+            })
+        }
+              
+      })
     },
   }
 </script>
@@ -737,7 +829,6 @@
   .ant-tooltip-inner {
     span {
       display: block;
-
     }
   }
 

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

@@ -1793,9 +1793,10 @@ export default {
                 })
             }
         })
-        let accountInfo = localStorage.getItem('accountInfo')
+        let accountInfo = localStorage.getItem('accountInfo');
+        let groupInfo = localStorage.getItem('planInfo')
         // console.log(accountInfo)
-        if (accountInfo!=null) {
+        if (accountInfo!='' && groupInfo!='') {
             this.accountInfo = JSON.parse(accountInfo)
             if(this.accountInfo.value){
                 getAction('/ctop/audience/list',{
@@ -1830,8 +1831,7 @@ export default {
                     name:res.result.name,
                     landingType:res.result.landingType,
                     deliveryRange:res.result.deliveryRange,
-                    gender:res.result.gender,
-                    
+                    gender:res.result.gender,                   
                     filterConvertedUsers:res.result.filterConvertedUsers,
                 })
                 if(res.result.landingType=='APP_ANDROID'){

+ 16 - 2
src/views/modules/BatchCreate/newGroup.vue

@@ -174,7 +174,7 @@ export default {
         accountHttp(){
             this.treeData=[];
             this.accountID=undefined;
-            getAction('/ctop/projectMember/getProjectAccountByUserId', {}).then(res => {
+            getAction('/ctop/projectMember/getProjectAccountByUserId?mediaType=1', {}).then(res => {
             if(res.success){
                     // console.log(res);
                     if(res.result){
@@ -199,7 +199,7 @@ export default {
                         }      
                         });
                         // console.log(this.treeData)
-                        
+                        // this.accountID=this.accountInfo.value
                     }
             }
             })
@@ -291,6 +291,9 @@ export default {
         goback(){
             this.$router.push('/modules/BatchCreate/TouTiaoBatch')
             this.$bus.$emit('remove', '/modules/BatchCreate/newGroup')
+            localStorage.setItem('groupInfo','');
+            localStorage.setItem('planInfo','');
+            localStorage.setItem('accountInfo','');
         },
 
         selectedCampaign(e){
@@ -329,6 +332,11 @@ export default {
                             })).then(res=>{
                                 console.log(res)
                                 if(res.success){
+
+                                    localStorage.setItem('groupInfo','');
+                                    localStorage.setItem('planInfo','');
+                                    localStorage.setItem('accountInfo','');
+
                                     this.nextLoading=false;
                                     this.$message.success('广告组创建成功,即将返回批量页面');
                                     values.id=res.campaign_id;
@@ -365,6 +373,12 @@ export default {
             this.form.setFieldsValue({
                 campaignName:`销售线索收集_${moment().format('MM_DD_HH:SS')}`
             })
+        };
+
+        let accountInfo=localStorage.getItem('accountInfo');
+        if(accountInfo!=null){
+            this.accountInfo=JSON.parse(accountInfo);
+
         }
     },
     // beforeCreate() {

+ 25 - 18
src/views/modules/BatchCreate/newPlan.vue

@@ -274,11 +274,11 @@
                   v-if="convertType=='AD_CONVERT_SOURCE_TYPE_NORMAL_APP_DOWNLOAD'"
                   @change="externalActionsChange"
                 > 
-                  <a-radio-button v-for="item in currentConvertType.external_actions" :key="item.external_action" :value="item.external_action">
+                  <a-radio-button v-for="item in currentConvertType.external_actions" :key="item.convertId" :value="item.convertId">
                     {{item.external_name}}</a-radio-button>
                 </a-radio-group>
-                <a-select  style="width: 335px" v-if="convertType=='AD_CONVERT_SOURCE_TYPE_APP_DOWNLOAD'"  @change="APIChange">
-                  <a-select-option v-for="item in currentConvertType.external_actions" :key="item.convert_id" :value='item.convert_id'>
+                <a-select  style="width: 335px" v-if="convertType!='AD_CONVERT_SOURCE_TYPE_NORMAL_APP_DOWNLOAD'"  @change="APIChange">
+                  <a-select-option v-for="item in currentConvertType.external_actions" :key="item.convertId" :value='item.convertId'>
                     {{item.external_name}}
                   </a-select-option>
                 </a-select>
@@ -319,7 +319,7 @@
                     {{item.external_name}}</a-radio-button>
                 </a-radio-group> -->
                 <a-select  style="width: 335px" v-if="convertType=='AD_CONVERT_SOURCE_TYPE_INTERNAL'&&currentConvertType.external_actions.length>0"  @change="APIChange" placeholder="请选择转化目标">
-                  <a-select-option v-for="item in currentConvertType.external_actions"   :key="item.convert_id" :value='item.convert_id'>
+                  <a-select-option v-for="item in currentConvertType.external_actions"  :key="item.convertId" :value='item.convertId'>
                     {{item.external_name}}
                   </a-select-option>
                 </a-select>
@@ -718,9 +718,9 @@
                 <a-radio-group
                   v-decorator="['deepBidType', { initialValue:'DEEP_BID_PACING' }]"
                 >
-                  <a-radio-button value="DEEP_BID_PACING" v-if="currentDeepConvert.deep_external_action=='AD_CONVERT_TYPE_NEXT_DAY_OPEN'">自动优化</a-radio-button>
-                  <a-radio-button value="DEEP_BID_MIN" v-if="currentDeepConvert.deep_external_action=='AD_CONVERT_TYPE_NEXT_DAY_OPEN'">自定义双出价</a-radio-button>
-                  <a-radio-button value="ROI_COEFFICIENT" v-if="currentDeepConvert.deep_external_action=='AD_CONVERT_TYPE_LT_ROI'">ROI系数</a-radio-button>
+                  <a-radio-button value="DEEP_BID_PACING" v-if="currentDeepConvert=='AD_CONVERT_TYPE_NEXT_DAY_OPEN'">自动优化</a-radio-button>
+                  <a-radio-button value="DEEP_BID_MIN" v-if="currentDeepConvert=='AD_CONVERT_TYPE_NEXT_DAY_OPEN'">自定义双出价</a-radio-button>
+                  <a-radio-button value="ROI_COEFFICIENT" v-if="currentDeepConvert=='AD_CONVERT_TYPE_LT_ROI'">ROI系数</a-radio-button>
                  
                 </a-radio-group>
               </a-form-item>
@@ -924,11 +924,7 @@ export default {
     //普通下载
     externalActionsChange(val){
       console.log(val,this.currentConvertType);
-      this.currentConvertType.external_actions.forEach(item=>{
-        if(item.external_action==val.target.value){
-          this.convertId=item.convert_id         
-        }
-      });
+      this.convertId=val.target.value 
       this.externalAction=val.target.value
 
     },
@@ -946,16 +942,16 @@ export default {
       console.log(val,this.currentConvertType);
       this.convertId=val
       this.currentConvertType.external_actions.forEach(item=>{
-        if(item.convert_id==val){
-          console.log(item)
+        if(item.convertId==val){
+          // console.log(item)
           this.externalAction=item.external_action;
-          this.currentDeepConvert=item.deep_external_actions[0];
-          if(item.deep_external_actions[0].deep_external_action=='AD_CONVERT_TYPE_LT_ROI'){
+          this.currentDeepConvert=item.deep_external_action;
+          if(item.deep_external_action=='AD_CONVERT_TYPE_LT_ROI'){
             this.form.getFieldDecorator('deepBidType')
             this.form.setFieldsValue({
               deepBidType:'ROI_COEFFICIENT'
             })
-          }else if(item.deep_external_actions[0].deep_external_action=='AD_CONVERT_TYPE_NEXT_DAY_OPEN'){
+          }else if(item.deep_external_action=='AD_CONVERT_TYPE_NEXT_DAY_OPEN'){
             this.form.getFieldDecorator('deepBidType')
             this.form.setFieldsValue({
               deepBidType:'DEEP_BID_PACING'
@@ -988,7 +984,7 @@ export default {
             if(res.success){
              
               this.convertList=[];
-              this.convertList=res.result.data.list;
+              this.convertList=res.result.data;
               this.isShowConversionTarget = true
               
             }
@@ -1122,6 +1118,10 @@ export default {
     goBack() {
       this.$router.replace('/modules/BatchCreate/TouTiaoBatch')
       this.$bus.$emit('remove', '/modules/BatchCreate/newPlan')
+      localStorage.setItem('groupInfo','');
+      localStorage.setItem('planInfo','');
+      localStorage.setItem('accountInfo','');
+
     },
     // 保存并关闭
     goPlanShow() {
@@ -1157,7 +1157,13 @@ export default {
                 ...this.directPackageValue
               }).then((res) => {
                 console.log(res)
+
                 if (res.success) {
+
+                  localStorage.setItem('groupInfo','');
+                  localStorage.setItem('planInfo','');
+                  localStorage.setItem('accountInfo','');
+
                   this.goPlanShowloading=false;
                   if(res.code==0){
                      this.$message.success('广告计划创建成功,2s后将跳转到头条批量页面')
@@ -1204,6 +1210,7 @@ export default {
               // console.log(this.names)
               this.goNextloading=true;
               values.accountId = this.groupInfo.accountId
+              values.convertId = this.convertId
               values.campaignId = this.groupInfo.id;
               values.convertId = this.convertId;
               values.appType=this.getFormData('appType')

+ 2 - 0
src/views/modules/BatchCreate/singleLayerSelecte.vue

@@ -122,6 +122,8 @@ export default {
     },
     onCheckAllChange(e) {
     // console.log(e.target.checked,this.valueOptions)
+      this.checkedList=[];
+      this.checkedShowList=[];
       Object.assign(this, {
         checkedList: e.target.checked ? this.valueOptions : [],
         indeterminate: false,

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1535 - 0
src/views/modules/Statistics/KSAccountReport.vue


+ 40 - 1
src/views/modules/Statistics/accountMaterStatistics.vue

@@ -98,11 +98,24 @@ th div {
             <span slot="photoClickCost" slot-scope="photoClickCost">{{ photoClickCost | toFixtwo }}</span>
             <span slot="actionCost" slot-scope="actionCost">{{ actionCost | toFixtwo }}</span>
             <span slot="conversionPrice" slot-scope="conversionPrice">{{ conversionPrice | toFixtwo }}</span>
+            <span slot="operation" slot-scope="text,record">
+                <a href="javascript:;" @click.stop="showRelevantPeople(record)">查看相关人员</a>
+            </span>
+            
           </a-table>
         </a-card>
       </a-col>
     </a-row>
+  
+    <div class="relevantPeople">
+      <a-modal v-model="relevantPeopleVisible" title="相关人员" :footer="null" :centered='true'>
+        <p>编导:{{relevantPeopleData.planName || '暂无数据'}}</p>
+        <p>剪辑:{{relevantPeopleData.clipName || '暂无数据'}}</p>
+        <p>拍摄:{{relevantPeopleData.shotName || '暂无数据'}}</p>
+      </a-modal>
+    </div>
     <ratio-modal ref="ratio" />
+    
   </div>
 </template>
 
@@ -122,6 +135,7 @@ import { JeecgListMixin } from '@/mixins/ipagination'
 
 // import the component
 import Treeselect from './components/Treeselect.vue'
+import { getAction } from '../../../api/manage'
 
 // 引入基本模板
 let echarts = require('echarts/lib/echarts')
@@ -255,6 +269,14 @@ const columns = [
     scopedSlots: { customRender: 'conversionPrice' },
     align: 'center',
     sorter: (a, b) => a.conversionPrice - b.conversionPrice
+  },
+  {
+    title:'相关人员',
+    dataIndex:'operation',
+    key:'operation',
+    scopedSlots: { customRender: 'operation' },
+    align: 'center',
+    width:120,
   }
 ]
 const columnsDetail = [
@@ -358,6 +380,8 @@ export default {
   mixins: [JeecgListMixin],
   data: function() {
     return {
+      relevantPeopleVisible:false,
+      relevantPeopleData:{},
       title: '账户素材报表',
 
       show: true,
@@ -389,7 +413,8 @@ export default {
             this.$refs.ratio.getMineList(record, this.active)
           }
         }
-      })
+      }),
+      
     }
   },
   filters: {
@@ -426,6 +451,20 @@ export default {
   methods: {
     moment,
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
+    // 查看相关人员
+    showRelevantPeople(record){
+      this.relevantPeopleVisible=true;
+      console.log(record)
+      getAction('/ctop/materialAscription/getDetail',{
+        code:record.signature
+      }).then(res=>{
+        console.log(res);
+         if(res.result&&res.success){
+          this.relevantPeopleData=res.result
+        }
+      })
+    },
+
     disabledDate(current) {
       return current && current > moment().endOf('day')
     },

+ 29 - 24
src/views/modules/Statistics/accountReport.vue

@@ -253,7 +253,7 @@
                 
             </a-table>
      </div>
-      <customColumn :visible='visible'  :listNum='listNum' :fiexColumn='columnsFixd'  @closeCustomColumn='closeCustomColumn' @changeColumn='changeColumn' />
+      <customColumn :visible='visible'  :listNum='listNum' :fiexColumn='columnsFixd' :mediaType='1'  @closeCustomColumn='closeCustomColumn' @changeColumn='changeColumn' />
   </div>
 </template>
 
@@ -347,6 +347,8 @@ const columnsFixd = [
     scopedSlots: { customRender: 'date' },
     align: 'center',
     key:'date',
+    width:150,
+    fixed:'left',
     // customRender: (value, row, index) => {
     //   const obj = {
     //     children: value,
@@ -368,16 +370,18 @@ const columnsFixd = [
     dataIndex: 'accountId',
     align: 'center',
     width: 150,
+    fixed:'left',
     scopedSlots: { customRender: 'accountId' }
   },
   {
     title: '账户昵称',
     dataIndex: 'authName',
     align: 'center',
-   
+    width: 250,
+    fixed:'left',
   },
   {
-    title: '消耗',
+    title: '消耗(元)',
     dataIndex: 'cost',
     scopedSlots: { customRender: 'cost' },
     align: 'center',
@@ -408,21 +412,21 @@ const columnsFixd = [
     sorter: (a,b)=>{}
   },
   {
-        title: '平均千次展现费用(元)',
-        dataIndex: 'cpm',
-        tip: '广告平均每一千次展现所付出的费用,计算公式是:总花费/展示数*1000',
-        align: 'center',
-      
-        scopedSlots: { customRender: 'cpm' },
-        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)=>{}
+    title: '平均点击单价(元)',
+    dataIndex: 'cpc',
+    tip: '广告主为每次点击付出的费用成本,计算公式是:总花费/点击数',
+    align: 'center',   
+    scopedSlots: { customRender: 'cpc' },
+    sorter: (a,b)=>{}
   }
 ]
 
@@ -836,7 +840,7 @@ export default {
    accountHttp(){
      this.treeData=[];
      this.treeValue=[];
-     getAction('/ctop/projectMember/getProjectAccountByUserId', {}).then(res => {
+     getAction('/ctop/projectMember/getProjectAccountByUserId?mediaType=1', {}).then(res => {
        if(res.success){
             // console.log(res);
             if(res.result){
@@ -1166,7 +1170,7 @@ export default {
     changeColumn(val){
         this.columns=[...val];
         if(this.columns.length> this.columnsFixd.length){
-              this.scrollX=200*(this.columns.length-this.columnsFixd.length)
+              this.scrollX=2000+200*(this.columns.length-this.columnsFixd.length)
         }else{
           this.scrollX=0
         }
@@ -1176,8 +1180,8 @@ export default {
         //   console.log(this.listNum.length, this.columns)
 
         if (this.listNum.length >= 9 || this.columns.length >= 9) {
-          this.tableWidth = 120
-          this.scrollX = this.columns.length * 120
+          this.tableWidth = 160
+          this.scrollX = this.columns.length * 160
           // console.log(this.scrollX)
         } else {
           this.scrollX = 0
@@ -1346,7 +1350,8 @@ export default {
     padding: 15px  15px;
     position: relative;
     
-    margin: 20px 15px 15px;
+    // margin: 20px 15px 15px;
+    margin-bottom: 15px;
     
     background-color: #fff;
     // border: 1px solid #ccc;
@@ -1378,7 +1383,7 @@ export default {
     width: 100%;
     display: flex;
     justify-content: space-between;
-    padding: 0px 15px;
+    // padding: 0px 15px;
     box-sizing: border-box;
 
     .showBox {
@@ -1439,12 +1444,12 @@ export default {
   }
   .chartBox{
     background-color: #fff;
-    margin: 15px 15px;
+    margin: 15px 0px;
     padding: 2px 10px 30px;
   }
   .tableBox{
     background-color: #fff;
-    margin: 15px 15px;
+    margin: 15px 0px;
     padding: 15px 10px;
     .tableTop{
       position: relative;

+ 89 - 41
src/views/modules/Statistics/companyDetail.vue

@@ -29,11 +29,15 @@
             bordered
             :loading="loading"
             size="middle"
-            :scroll="{ x: 2300 }"
+            :scroll="{ x: 2500 }"
+            :pagination="ipagination"
+            @change="pageChange"
           >
             <!-- <span slot="isHasData" slot-scope="text">{{ text == 0 ? '否' : '是' }}</span> -->
-            <span slot="fengmianClickRate" slot-scope="text">{{ text | getBo }}</span>
-            <span slot="convertClickRate" slot-scope="text">{{ text | getBo }}</span>
+            <!-- <span slot="fengmianClickRate" slot-scope="text">{{ text | getBo }}</span>
+            <span slot="convertClickRate" slot-scope="text">{{ text | getBo }}</span> -->
+            <span slot="industry" slot-scope="text">{{ text ?text:'暂无数据' }}</span>
+            <span slot="secondIndustry" slot-scope="text">{{  text ?text:'暂无数据'  }}</span>
           </a-table>
         </a-card>
       </a-col>
@@ -59,7 +63,7 @@ import { getAction, postAction, downFilePost } from '@/api/manage'
 import { mapGetters } from 'vuex'
 
 import qs from 'qs'
-
+import { JeecgListMixin } from '@/mixins/ipagination'
 const barData = []
 for (let i = 0; i < 12; i += 1) {
   barData.push({
@@ -106,9 +110,15 @@ const columns = [
     align: 'center'
   },
   {
-    title: '广告主创建时间',
-    dataIndex: 'advertiserCreateTime',
-    key: 'advertiserCreateTime',
+    title: '广告主id',
+    dataIndex: 'accountId',
+    key: 'accountId',
+    align: 'center'
+  },
+  {
+    title: '账户名称',
+    dataIndex: 'accountName',
+    key: 'accountName',
     align: 'center'
   },
   {
@@ -116,84 +126,91 @@ const columns = [
     dataIndex: 'costCampaignCount',
     key: 'costCampaignCount',
     align: 'center',
-    sorter: (a, b) => a.costCampaignCount - b.costCampaignCount
+    // sorter: (a, b) => a.costCampaignCount - b.costCampaignCount
   },
   {
     title: '总余额',
     dataIndex: 'balance',
     key: 'balance',
     align: 'center',
-    sorter: (a, b) => a.balance - b.balance
+    // sorter: (a, b) => a.balance - b.balance
   },
   {
     title: '总消耗',
     dataIndex: 'cost',
     key: 'cost',
     align: 'center',
-    sorter: (a, b) => a.cost - b.cost
+    // sorter: (a, b) => a.cost - b.cost
+  },
+  {
+    title: '消耗环比',
+    dataIndex: 'chargeDayOnDayPercent',
+    key: 'chargeDayOnDayPercent',
+    align: 'center',
+    // sorter: (a, b) => a.cost - b.cost
   },
   {
     title: '现金消耗',
     dataIndex: 'xianjinCost',
     key: 'xianjinCost',
     align: 'center',
-    sorter: (a, b) => a.xianjinCost - b.xianjinCost
+    // sorter: (a, b) => a.xianjinCost - b.xianjinCost
   },
   {
-    title: '返消耗',
+    title: '返消耗',
     dataIndex: 'fandianCost',
     key: 'fandianCost',
     align: 'center',
-    sorter: (a, b) => a.fandianCost - b.fandianCost
+    // sorter: (a, b) => a.fandianCost - b.fandianCost
   },
   {
     title: '框返消耗',
     dataIndex: 'kuangfanCost',
     key: 'kuangfanCost',
     align: 'center',
-    sorter: (a, b) => a.kuangfanCost - b.kuangfanCost
+    // sorter: (a, b) => a.kuangfanCost - b.kuangfanCost
   },
   {
-    title: '激励账户消耗',
+    title: '激励消耗',
     dataIndex: 'jiliCost',
     key: 'jiliCost',
     align: 'center',
-    sorter: (a, b) => a.jiliCost - b.jiliCost
+    // sorter: (a, b) => a.jiliCost - b.jiliCost
   },
   {
-    title: '信⽤账户消耗',
+    title: '信⽤消耗',
     dataIndex: 'xinyongCost',
     key: 'xinyongCost',
     align: 'center',
-    sorter: (a, b) => a.xinyongCost - b.xinyongCostxinyongCost
+    // sorter: (a, b) => a.xinyongCost - b.xinyongCostxinyongCost
   },
   {
     title: '封⾯曝光数',
     dataIndex: 'fengmianShowCount',
     key: 'fengmianShowCount',
     align: 'center',
-    sorter: (a, b) => a.fengmianShowCount - b.fengmianShowCount
+    // sorter: (a, b) => a.fengmianShowCount - b.fengmianShowCount
   },
   {
     title: '封⾯点击数',
     dataIndex: 'fengmianClickCount',
     key: 'fengmianClickCount',
     align: 'center',
-    sorter: (a, b) => a.fengmianClickCount - b.fengmianClickCount
+    // sorter: (a, b) => a.fengmianClickCount - b.fengmianClickCount
   },
   {
     title: '素材曝光数',
     dataIndex: 'sucaiShowCount',
     key: 'sucaiShowCount',
     align: 'center',
-    sorter: (a, b) => a.sucaiShowCount - b.sucaiShowCount
+    // sorter: (a, b) => a.sucaiShowCount - b.sucaiShowCount
   },
   {
     title: '行为数',
     dataIndex: 'convertCount',
     key: 'convertCount',
     align: 'center',
-    sorter: (a, b) => a.convertCount - b.convertCount
+    // sorter: (a, b) => a.convertCount - b.convertCount
   },
   {
     title: '封⾯点击率',
@@ -201,7 +218,7 @@ const columns = [
     key: 'fengmianClickRate',
     scopedSlots: { customRender: 'fengmianClickRate' },
     align: 'center',
-    sorter: (a, b) => a.fengmianClickRate - b.fengmianClickRate
+    // sorter: (a, b) => a.fengmianClickRate - b.fengmianClickRate
   },
   {
     title: '转化点击率',
@@ -209,7 +226,23 @@ const columns = [
     key: 'convertClickRate',
     scopedSlots: { customRender: 'convertClickRate' },
     align: 'center',
-    sorter: (a, b) => a.convertClickRate - b.convertClickRate
+    // sorter: (a, b) => a.convertClickRate - b.convertClickRate
+  },
+  {
+    title: '一级行业',
+    dataIndex: 'industry',
+    key: 'industry',
+    scopedSlots: { customRender: 'industry' },
+    align: 'center',
+ 
+  },
+  {
+    title: '二级行业',
+    dataIndex: 'secondIndustry',
+    key: 'secondIndustry',
+    scopedSlots: { customRender: 'secondIndustry' },
+    align: 'center',
+    
   }
 ]
 export default {
@@ -218,7 +251,7 @@ export default {
     ATooltip,
     ACol
   },
-
+  mixins: [JeecgListMixin],
   data: function() {
     return {
       isHasData: '1',
@@ -244,13 +277,14 @@ export default {
   methods: {
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
     onChageLogin(e) {
-      if (e.target.value == 1) {
-        this.dataList = this.dataListAll
-      } else {
-        this.dataList = this.dataListAll.filter(item => {
-          return item.isHasData == 1
-        })
-      }
+      // if (e.target.value == 1) {
+      //   this.dataList = this.dataListAll
+      // } else {
+      //   this.dataList = this.dataListAll.filter(item => {
+      //     return item.isHasData == 1
+      //   })
+      // }
+      this.searchQuery();
     },
     backStatistics() {
       this.$router.replace({
@@ -262,7 +296,7 @@ export default {
       var params = {}
       params.date = weekDate
       params.isExportNullData = this.isHasData
-      downFilePost('/report/kuaishouReportDailyAgentSum/companyReportAccountDetailListExportExcel', params).then(
+      downFilePost('/agent/kuaiShouDailyAgent/companyReportAccountDetailListExportExcel', params).then(
         res => {
           let blob = new Blob([res], {
             type: 'application/vnd.ms-excel'
@@ -287,37 +321,51 @@ export default {
       var weekDate = localStorage.getItem('companyDate')
       this.columns = columns
       this.loading = true
-      postAction('/report/kuaishouReportDailyAgentSum/companyReportAccountDetailList', {
+      postAction('/agent/kuaiShouDailyAgent/companyReportAccountDetailList', {
         date: weekDate,
-        advertiserName: this.advertiserName
+        advertiserName: this.advertiserName,
+        page:this.ipagination.current,
+        pageSize:10,
+        isExportNullData:this.isHasData
       }).then(res => {
         this.loading = false
         if (res.success) {
-          this.dataListAll = this.dataList = res.result.map((item, index) => {
+          this.dataListAll = this.dataList = res.result.list.map((item, index) => {
             return {
               ...item,
               key: index
             }
-          })
+          });
+          this.ipagination.total=res.result.total
         } else {
           this.$message.error(res.message)
         }
       })
-    }
+    },
+    pageChange(pagination, filters, sorter, { currentDataSource }){            
+        this.ipagination.current=pagination.current;
+        this.searchQuery()
+    },
   },
-  created() {
+  mounted() {
     var weekDate = localStorage.getItem('companyDate')
     this.columns = columns
     this.loading = true
-    postAction('/report/kuaishouReportDailyAgentSum/companyReportAccountDetailList', { date: weekDate }).then(res => {
+    postAction('/agent/kuaiShouDailyAgent/companyReportAccountDetailList', { 
+      date: weekDate, 
+      page:this.ipagination.current,
+      pageSize:10,
+      isExportNullData:this.isHasData
+    }).then(res => {
       this.loading = false
       if (res.success) {
-        this.dataListAll = this.dataList = res.result.map((item, index) => {
+        this.dataListAll = this.dataList = res.result.list.map((item, index) => {
           return {
             ...item,
             key: index
           }
         })
+         this.ipagination.total=res.result.total
       } else {
         this.$message.error(res.message)
       }

+ 25 - 12
src/views/modules/Statistics/companyStatistics.vue

@@ -126,6 +126,8 @@ th div {
             size="middle"
             :scroll="{ x: 1900 }"
             :loading="loading"
+            :pagination="ipagination"
+            @change="pageChange"
           >
             <span slot="fengmianClickRate" slot-scope="text">{{ text | getBo }}</span>
             <span slot="convertClickRate" slot-scope="text">{{ text | getBo }}</span>
@@ -148,10 +150,11 @@ import axios from 'axios'
 import lifting from './components/lifting'
 import timeCheck from './components/timeCheck'
 import Treeselect from './components/Treeselect.vue'
-
+import { JeecgListMixin } from '@/mixins/ipagination'
 import { getAction, postAction, postFile, downFilePost } from '@/api/manage'
 import { mapGetters } from 'vuex'
 
+
 var length = 0
 var active = 1
 
@@ -193,7 +196,7 @@ const columns = [
     sorter: (a, b) => a.xianjinCost - b.xianjinCost
   },
   {
-    title: '返消耗',
+    title: '返消耗',
     dataIndex: 'fandianCost',
     key: 'fandianCost',
     align: 'center',
@@ -207,14 +210,14 @@ const columns = [
     sorter: (a, b) => a.kuangfanCost - b.kuangfanCost
   },
   {
-    title: '激励账户消耗',
+    title: '激励消耗',
     dataIndex: 'jiliCost',
     key: 'jiliCost',
     align: 'center',
     sorter: (a, b) => a.jiliCost - b.jiliCost
   },
   {
-    title: '信⽤账户消耗',
+    title: '信⽤消耗',
     dataIndex: 'xinyongCost',
     key: 'xinyongCost',
     align: 'center',
@@ -313,6 +316,7 @@ export default {
     timeCheck,
     Treeselect
   },
+  mixins: [JeecgListMixin],
   data: function() {
     return {
       loading: false,
@@ -381,7 +385,7 @@ export default {
       return current && current > moment().endOf('day')
     },
     exportExcel() {
-      downFilePost('/report/kuaishouReportDailyAgentSum/companyReportExportExcel', this.params).then(res => {
+      downFilePost('/agent/kuaiShouDailyAgent/companyReportExportExcel', this.params).then(res => {
         let blob = new Blob([res], {
           type: 'application/vnd.ms-excel'
         })
@@ -438,21 +442,25 @@ export default {
           params.endDate = moment(this.startValue[1]._d).format('YYYY-MM-DD')
           break
       }
+      params.page=this.ipagination.current;
+      params.pageSize=10;
       this.params = params
-      postAction('/report/kuaishouReportDailyAgentSum/companyReport', params).then(res => {
+      postAction('/agent/kuaiShouDailyAgent/companyReport', params).then(res => {
         this.loading = false
         if (res.success) {
-          this.dataTable = res.result.map((item, index) => {
+          this.dataTable = res.result.list.map((item, index) => {
             return {
               ...item,
               key: index
             }
-          })
+          });
+          this.ipagination.total=res.result.total;
+
         } else {
           this.$message.error(res.message)
         }
       })
-      postAction('/report/kuaishouReportDailyAgentSum/companyReportSum', params).then(res => {
+      postAction('/agent/kuaiShouDailyAgent/companyReportSum', params).then(res => {
         if (res.result) {
           this.allData = [
             { value: res.result.costCampaignCount, label: '有消费计划数' },
@@ -466,8 +474,8 @@ export default {
             { value: res.result.fengmianClickCount, label: '封⾯点击数' },
             { value: res.result.sucaiShowCount, label: '素材曝光数' },
             { value: res.result.convertCount, label: '⾏为数' },
-            { value: res.result.fengmianClickRate.toFixed(2) + '%', label: '封⾯点击率' },
-            { value: res.result.convertClickRate.toFixed(2) + '%', label: '转化点击率' }
+            { value: (res.result.fengmianClickRate*100).toFixed(2) + '%', label: '封⾯点击率' },
+            { value: (res.result.convertClickRate*100).toFixed(2) + '%', label: '转化点击率' }
           ]
           //   {
           //     costCampaignCount: 0, // 有消费计划数
@@ -516,7 +524,12 @@ export default {
       this.$router.replace({
         path: '/Statistics/companyDetail'
       })
-    }
+    },
+    pageChange(pagination, filters, sorter, { currentDataSource }){            
+        this.ipagination.current=pagination.current;
+        this.getCompanyReport(this.active)
+    },
+    
   },
   watch: {},
   distoryed() {},

+ 24 - 4
src/views/modules/Statistics/components/customColumn.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="customColumn">
+  <div class="customColumnKS">
     <a-modal v-model="visibleOk" title="自定义列" on-ok="handleOk" @cancel="handleCancel" width="65%">
       <template slot="footer">
         <a-button key="back" @click="handleCancel">取消</a-button>
@@ -11,11 +11,25 @@
           <p>可添加的列</p>
           <div class="selectionList">
             <!--  v-for="(item,index) in addColumns" :key="index" -->
-            <selectComponent
+            <!-- <div v-if="mediaType==1"> -->
+              <selectComponent
               :showCol="mylistNum"
               @getshowlist="getshowlist"
               :fixedCol="fiexColumn"
+              :mediaType='mediaType'
+              
+              />
+            <!-- </div> -->
+            <!-- <div v-if="mediaType==2">
+              <selectComponentKS
+              :showCol="mylistNum"
+              @getshowlist="getshowlist"
+              :fixedCol="fiexColumn"
+              :mediaType='mediaType'
+              
             />
+            </div> -->
+            
           </div>
         </div>
         <div class="listNum">
@@ -52,11 +66,13 @@
 
 <script>
 import selectComponent from './selectComponent'
+import selectComponentKS from './selectComponentKS'
 export default {
   components: {
-    selectComponent
+    selectComponent,
+    selectComponentKS,
   },
-  props: ['visible', 'listNum', 'fiexColumn'],
+  props: ['visible', 'listNum', 'fiexColumn','mediaType'],
 
   data() {
     return {
@@ -74,6 +90,7 @@ export default {
     },
     listNum: {
       handler(newValue, oldValue) {
+        console.log(newValue, oldValue)
         this.mylistNum = newValue
       },
       immediate: true
@@ -184,6 +201,8 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+
+
 .addlist {
   float: left;
   width: 70%;
@@ -271,4 +290,5 @@ export default {
     }
   }
 }
+
 </style>

+ 28 - 8
src/views/modules/Statistics/components/selectComponent.vue

@@ -14,7 +14,8 @@
         <!-- {{item.form}} -->
         <a-checkbox-group v-model="item.form" >
           <span class="jutixiang" v-for="(zhi,num) in item.specificFields " :key="num">
-            <a-checkbox :value="zhi.dataIndex" name="type" @change="checkboxClick(zhi)">
+
+            <a-checkbox :value="zhi.dataIndex" :disabled="zhi.disabled"  name="type" @change="checkboxClick(zhi)">
               <a-tooltip
                 class="select-component"
                 placement="top"
@@ -30,14 +31,14 @@
 </template>
 
 <script>
-import  customFields  from '../../columnConst/accountConst'
+import  {TTcustomFields ,KScustomFields}  from '../../columnConst/accountConst'
 // let customFields=customFields
 export default {
-  props: ['showCol','fixedCol'],
+  props: ['showCol','fixedCol','mediaType'],
   data() {
     return {
         // customFields,
-      customFields:[...customFields],
+      customFields:[],
       quanxuanflag: [],
       hovered: false,
       tooltipShow: 'tooltipShow',
@@ -47,7 +48,7 @@ export default {
   watch: {
     
     showCol(n) {
-      console.log(n)
+      // console.log(n)
       //
       if (this.showCol.length == this.fixedCol.length) {
 
@@ -84,10 +85,18 @@ export default {
         })
       }
       // console.log(this.form)
-    }
+    },
+  
   },
   mounted() {
-    for (let i = 0; i < customFields.length; i++) {
+    if(this.mediaType==1){
+      //头条自定义列
+      this.customFields=TTcustomFields
+    }else if(this.mediaType==2){
+      //快手自定义列
+      this.customFields=KScustomFields
+    }
+    for (let i = 0; i < this.customFields.length; i++) {
       this.customFields[i].form=[]
     }
     // console.log(1)
@@ -100,8 +109,19 @@ export default {
         })
       })
     })
+    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)
+    // console.log(this.customFields);
+    
   },
   methods: {
     hide() {

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

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

+ 70 - 13
src/views/modules/Statistics/dataDisplayStatistics.vue

@@ -11,6 +11,19 @@
   padding: 5px 10px;
   cursor: pointer;
 }
+.tableTop{
+  position: relative;
+  padding-bottom: 15px;
+  border-bottom: 1px solid #e0e0e0;
+  .selectTime{
+    margin-right: 20px;
+  }
+  .add{
+      position: absolute;
+      top: 0;
+      right: 0;
+  }
+}
 </style>
 <style>
 /* .data-display-statistics .ant-card-body {
@@ -165,7 +178,7 @@ th div {
     <a-row :gutter="10" style="margin-top:10px">
       <a-col :span="24">
         <a-card style="width:100%;">
-          <div
+          <div class="tableTop"
             style="display:flex;margin-bottom:15px"
             v-show="
               role.roleCode == 'operator' ||
@@ -174,7 +187,7 @@ th div {
                 role.roleCode == 'operationAssistant' ||
                 role.roleCode == 'touTiaoOperationManager'
             "
-          >
+            >
             <a-select
               style="width: 120px"
               v-model="statHour"
@@ -184,7 +197,8 @@ th div {
             >
               <a-select-option v-for="item of 24" :key="item - 1" :value="item - 1">{{ item - 1 }}</a-select-option>
             </a-select>
-            <a-button type="primary" @click="exportExcel" style="margin-left:15px">导出</a-button>
+            <a-button type="primary" @click="exportExcel" style="margin-left:15px">导出报表</a-button>
+            <!-- <a-button type='primary' class="add" @click="customColumns" >自定义列</a-button> -->
           </div>
           <a-table
             :columns="columns"
@@ -192,8 +206,9 @@ th div {
             bordered
             id="outTable"
             :pagination="false"
-            :scroll="{ x: 1900 }"
+            :scroll="{ x: 2500 }"
           ></a-table>
+          <!-- <customColumn :visible='visible'  :listNum='listNum' :fiexColumn='columnsFixd'  @closeCustomColumn='closeCustomColumn' @changeColumn='changeColumn' /> -->
         </a-card>
       </a-col>
     </a-row>
@@ -201,6 +216,7 @@ th div {
 </template>
 
 <script>
+
 import ARow from 'ant-design-vue/es/grid/Row'
 import ACol from 'ant-design-vue/es/grid/Col'
 import countTo from 'vue-count-to'
@@ -213,7 +229,7 @@ import Treeselect from './components/Treeselect.vue'
 
 import { getAction, postAction, postFile } from '@/api/manage'
 import { mapGetters } from 'vuex'
-
+import customColumn from './components/customColumn.vue'
 // 引入基本模板
 let echarts = require('echarts/lib/echarts')
 // 引入柱状图组件
@@ -234,6 +250,7 @@ const columns = [
     dataIndex: 'date',
     align: 'center',
     width: 150,
+    fixed:'left',
     customRender: function(text, record, index) {
       const obj = {
         children: text,
@@ -255,7 +272,8 @@ const columns = [
     title: '账户Id',
     dataIndex: 'accountId',
     align: 'center',
-    width: 150,
+    width: 250,
+    fixed:'left',
     customRender: function(text, record, index) {
       const obj = {
         children: text,
@@ -282,7 +300,8 @@ const columns = [
     dataIndex: 'accountName',
     scopedSlots: { customRender: 'cost' },
     align: 'center',
-    width: 150,
+    width: 250,
+    fixed:'left',
     customRender: function(text, record, index) {
       const obj = {
         children: text,
@@ -418,6 +437,7 @@ const columnsWu = [
     dataIndex: 'date',
     align: 'center',
     width: 150,
+     fixed:'left',
     customRender: function(text, record, index) {
       const obj = {
         children: text,
@@ -439,7 +459,8 @@ const columnsWu = [
     title: '账户Id',
     dataIndex: 'accountId',
     align: 'center',
-    width: 150,
+    width: 200,
+    fixed:'left',
     customRender: function(text, record, index) {
       const obj = {
         children: text,
@@ -466,7 +487,8 @@ const columnsWu = [
     dataIndex: 'accountName',
     scopedSlots: { customRender: 'cost' },
     align: 'center',
-    width: 150,
+    width: 200,
+    fixed:'left',
     customRender: function(text, record, index) {
       const obj = {
         children: text,
@@ -591,7 +613,8 @@ export default {
     countTo,
     lifting,
     timeCheck,
-    Treeselect
+    Treeselect,
+    customColumn,
   },
 
   data: function() {
@@ -658,7 +681,10 @@ export default {
       ],
       noTitleKey: 'cost',
       role: { roleCode: '' },
-      statDate: ''
+      statDate: '',
+      visible:false,//自定义页面的打开
+       listNum:[],
+       scrollX:0,
     }
   },
   filters: {
@@ -679,8 +705,39 @@ export default {
     }
   },
   methods: {
+     ...mapGetters(['nickname', 'avatar', 'userInfo']),
     moment,
-    ...mapGetters(['nickname', 'avatar', 'userInfo']),
+     //弹出框打开,自定义列
+    customColumns() {
+        this.visible = true
+        this.listNum = [...this.columns]
+    },
+    closeCustomColumn(){
+      this.visible=false;
+    },
+    //自定义之后修改父元素表头
+    changeColumn(val){
+        this.columns=[...val];
+        if(this.columns.length> this.columnsFixd.length){
+              this.scrollX=200*(this.columns.length-this.columnsFixd.length)
+        }else{
+          this.scrollX=0
+        }
+    },
+    tableHandle() {
+        // this.listNum = [...this.columns]
+        //   console.log(this.listNum.length, this.columns)
+
+        if (this.listNum.length >= 9 || this.columns.length >= 9) {
+          this.tableWidth = 120
+          this.scrollX = this.columns.length * 120
+          // console.log(this.scrollX)
+        } else {
+          this.scrollX = 0
+        }
+    },
+
+   
     disabledDate(current) {
       return current && current > moment().endOf('day')
     },
@@ -1382,4 +1439,4 @@ export default {
     })
   }
 }
-</script>
+</script>

+ 74 - 7
src/views/modules/Statistics/materialRank.vue

@@ -24,14 +24,20 @@
       </a-radio-group>
       <div class="btn">
         <a-button type='primary' @click="getData">查询</a-button>
+        <a-button type='primary' @click="exportExcel" style="margin-left:20px">导出报表</a-button>
+
       </div>
     </div>
-    <a-table :columns="columns" :data-source="dataSource" tableLayout='auto' bordered :pagination='false' :loading='loading'>
+    <div class="tableBody">
+      <a-table :columns="columns" :data-source="dataSource" tableLayout='auto' bordered :pagination='false' :loading='loading'>
       <div slot="videoU" slot-scope="test,records">
         <img :src="records.coverUrl" alt="" style="width:140px"
           @click="openVideo(records.url)">
       </div>
       <span slot="convertRate" slot-scope="convertRate">{{ convertRate | toPercentage }}</span>
+        <span slot="operation" slot-scope="text,record">
+            <a href="javascript:;" @click.stop="showRelevantPeople(record)">查看相关人员</a>
+        </span>
     </a-table>
     <div class="fenye" :v-show="pageShow">
       <a-pagination showQuickJumper :default-current="pageNo" :total="total" size="small" style="float:right"
@@ -40,10 +46,19 @@
         showQuickJumper :pageSize.sync="ipagination.pageSize" :total="ipagination.total" v-model="ipagination.current"
         @change="getDataSource" /> -->
     </div>
+    </div>
+    
     <a-modal v-model="Videovisible" title="视频详情" @ok="videoOk" :footer="null" width='50%'>
       <video @click.stop class="video" :src="videoUrl" controls="controls" style="height:600px;width:100%">您的浏览器不支持
         video 标签。</video>
     </a-modal>
+   
+    <a-modal v-model="relevantPeopleVisible" title="相关人员" :footer="null" :centered='true'>
+      <p>编导:{{relevantPeopleData.planName || '暂无数据'}}</p>
+      <p>剪辑:{{relevantPeopleData.clipName || '暂无数据'}}</p>
+      <p>拍摄:{{relevantPeopleData.shotName || '暂无数据'}}</p>
+    </a-modal>
+  
   </div>
 </template>
 
@@ -56,7 +71,8 @@
     downFile,
     downFilePost
   } from '@/api/manage'
-  let columns = [{
+  let columns = [
+    {
       title: '视频',
       dataIndex: 'videoU',
       align: 'center',
@@ -157,11 +173,20 @@
       },
       align: 'center',
     },
+    {
+      title:'相关人员',
+      dataIndex:'operation',
+      key:'operation',
+      scopedSlots: { customRender: 'operation' },
+      align: 'center',         
+    }
   ]
   export default {
     data() {
       return {
         columns,
+        relevantPeopleVisible:false,
+        relevantPeopleData:{},
         dataSource: [],
         ipagination: {
           current: 1,
@@ -199,6 +224,45 @@
     },
     methods: {
       moment,
+        //导出报表
+        exportExcel() {
+           
+            var name =`${this.dateStr[0]}~${this.dateStr[1]}素材排行榜`;
+            
+          downFilePost(`/ctop/material/top//excel?target=${this.target}&order=${this.order}`, {
+            startDate: this.dateStr[0],
+            endDate: this.dateStr[1],
+
+          }).then(res => {
+                // console.log(res)
+                let blob = new Blob([res], {
+                    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+                })
+                // console.log(blob)
+                let downloadElement = document.createElement('a')
+                let href = window.URL.createObjectURL(blob) //创建下载的链接
+                downloadElement.href = href
+                downloadElement.download = name+'.xlsx'    //下载后文件名
+                document.body.appendChild(downloadElement)
+                downloadElement.click() //点击下载
+                document.body.removeChild(downloadElement) //下载完成移除元素
+                window.URL.revokeObjectURL(href) //释放掉blob对象
+            })
+        },
+
+      // 查看相关人员
+      showRelevantPeople(record){
+        this.relevantPeopleVisible=true;
+        console.log(record)
+        getAction('/ctop/materialAscription/getDetail',{
+          code:record.code
+        }).then(res=>{
+          console.log(res);
+          if(res.result&&res.success){
+            this.relevantPeopleData=res.result
+          }
+        })
+      },
       getDataSource(page, pageSize) {
 
         this.pageNo = page
@@ -288,17 +352,17 @@
   .materialRank {
     width: 100%;
     height: 100%;
-    background: #fff;
-    padding: 10px 15px;
+    
+    // padding: 10px 15px;
   }
 
   .optionLine {
     padding: 30px 5px;
     position: relative;
     margin-top: 20px;
-    ;
+    background: #fff;
     margin-bottom: 15px;
-    border: 1px solid #ccc;
+    // border: 1px solid #ccc;
 
     span {
       display: inline-block;
@@ -317,7 +381,10 @@
       top: 30px;
     }
   }
-
+  .tableBody{
+    background: #fff;
+    padding: 20px 15px;
+  }
   .fenye {
     margin: 30px 15px 10px;
     overflow: hidden;

+ 36 - 2
src/views/modules/Statistics/materialStatistics.vue

@@ -106,11 +106,20 @@
             <span slot="photoClickCost" slot-scope="photoClickCost">{{ photoClickCost | toFixtwo }}</span>
             <span slot="actionCost" slot-scope="actionCost">{{ actionCost | toFixtwo }}</span>
             <span slot="conversionPrice" slot-scope="conversionPrice">{{ conversionPrice | toFixtwo }}</span>
+            <span slot="operation" slot-scope="text,record">
+                <a href="javascript:;" @click.stop="showRelevantPeople(record)">查看相关人员</a>
+            </span>
           </a-table>
         </a-card>
       </a-col>
     </a-row>
-
+    
+     
+      <a-modal v-model="relevantPeopleVisible" title="相关人员" :footer="null" :centered='true'>
+        <p>编导:{{relevantPeopleData.planName || '暂无数据'}}</p>
+        <p>剪辑:{{relevantPeopleData.clipName || '暂无数据'}}</p>
+        <p>拍摄:{{relevantPeopleData.shotName || '暂无数据'}}</p>
+      </a-modal>
     <ratio-modal ref="ratio" />
   </div>
 </template>
@@ -123,7 +132,7 @@ import { getKuaiShouMaterialMarket, getKuaiShouChainRatio } from '@api/statistic
 import axios from 'axios'
 import { mapGetters } from 'vuex'
 import { stopOtherVideo, closeAllVideoFun } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
-
+import { getAction } from '../../../api/manage'
 import timeCheck from './components/timeCheck'
 import ratioModal from './components/ratioModal'
 
@@ -237,6 +246,14 @@ const columns = [
     scopedSlots: { customRender: 'conversionPrice' },
     align: 'center',
     sorter: (a, b) => a.conversionPrice - b.conversionPrice
+  },
+  {
+    title:'相关人员',
+    dataIndex:'operation',
+    key:'operation',
+    scopedSlots: { customRender: 'operation' },
+    align: 'center',
+    
   }
 ]
 const columnsDetail = [
@@ -328,6 +345,7 @@ const columnsDetail = [
 ]
 export default {
   name: 'data-display-statistics',
+ 
   components: {
     ACol,
     ARow,
@@ -337,6 +355,8 @@ export default {
   mixins: [JeecgListMixin],
   data: function() {
     return {
+       relevantPeopleVisible:false,
+      relevantPeopleData:{},
       title: '素材大盘报表',
       columns,
       columnsDetail,
@@ -406,6 +426,20 @@ export default {
     }
   },
   methods: {
+    // 查看相关人员
+    showRelevantPeople(record){
+      this.relevantPeopleVisible=true;
+      console.log(record)
+      getAction('/ctop/materialAscription/getDetail',{
+        code:record.signature
+      }).then(res=>{
+        console.log(res);
+        if(res.result&&res.success){
+          this.relevantPeopleData=res.result
+        }
+        
+      })
+    },
     handleOk() {
       this.visible = false
     },

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 709 - 609
src/views/modules/Statistics/mediaReport.vue


+ 53 - 37
src/views/modules/Statistics/refuseDataCreat.vue

@@ -59,9 +59,9 @@
       <a-textarea v-model="editWord" autosize />
     </a-modal>
     <a-modal title="一键重提" @cancel="handleClose" :visible="visibleAgain" @ok="handleOkAgain"
-      :confirmLoading="againLoading">
+      :confirmLoading="againLoading" :width="650">
       <a-form :form="form">
-        <a-form-item label="是否修改" :labelCol="{ lg: { span: 6 }, sm: { span: 6 } }"
+        <a-form-item label="是否修改" :labelCol="{ lg: { span: 4 }, sm: { span: 6 } }"
           :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }">
           <a-radio-group buttonStyle="solid" v-decorator="[
           'type',
@@ -70,15 +70,13 @@
             <a-radio-button :value="1">是</a-radio-button>
           </a-radio-group>
         </a-form-item>
-        <a-form-item label="广告语" :labelCol="{ lg: { span: 6 }, sm: { span: 6 } }"
+        <a-form-item label="广告语" :labelCol="{ lg: { span: 4 }, sm: { span: 6 } }"
           :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }" v-if="getData('type')==1">
-          <a-input v-decorator="[
-          'updateDescription'
-        ]" :max="10" :min="1" style="width:100%">
+          <a-input v-model="updateDescription" :max="10" :min="1" style="width:100%" @change="DescriptionChange">
           </a-input>
           <a @click="showTitle()">推荐标题</a><a style="margin-left:10px" @click="showCunTitle()">标题收藏</a>
         </a-form-item>
-        <a-form-item label="行动号召" :labelCol="{ lg: { span: 6 }, sm: { span: 6 } }"
+        <a-form-item label="行动号召" :labelCol="{ lg: { span: 4 }, sm: { span: 6 } }"
           :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }" v-if="getData('type')==1">
           <a-select v-decorator="['updateActionBarText']" showSearch allowClear placeholder="选择行动号召按钮文案"
             optionFilterProp="children" :filterOption="filterOption">
@@ -303,7 +301,8 @@
         cunTitleList: [],
         title: [],
         dataOne: [],
-        value: ''
+        value: '',
+        updateDescription:'',//重提的广告语
       }
     },
     filters: {
@@ -357,6 +356,16 @@
       }
     },
     methods: {
+      // 广告语改变
+      DescriptionChange(e){
+        console.log(e.target.value);
+         if(e.target.value.length>30){
+          
+          // this.updateDescription=e.target.value.substr(0,30);
+          // console.log(this.updateDescription)
+          this.$message.error('广告语最多30字!')
+        }
+      },
       filter(inputValue, path) {
         return path.some(option => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1)
       },
@@ -368,17 +377,19 @@
       },
       okTitleCun(item) {
         console.log(item)
-        this.form.setFieldsValue({
-          updateDescription: item.title
-        })
+        // this.form.setFieldsValue({
+        //   updateDescription: item.title
+        // })
+        this.updateDescription=item.title;
         this.cunTitleVisible = false;
         this.cunTitleList = []
       },
 
       okTitle(item) {
-        this.form.setFieldsValue({
-          updateDescription: item
-        })
+        // this.form.setFieldsValue({
+        //   updateDescription: item
+        // })
+        this.updateDescription=item;
         this.titleVisible = false;
         this.dataOne = []
         this.value = ""
@@ -513,31 +524,36 @@
         //    this.selectedRowKeysValue.length > 0 ? this.selectedRowKeysValue :
       },
       handleOkAgain(e) {
-        this.againLoading = true
-        this.form.validateFields((err, values) => {
-          if (!err) {
-            var params = {
+        if(this.updateDescription.length>30&&this.getData('type')==1){
+          this.$message.error('广告语最多30个字,请修正后再次提交!')
+        }else{
+          this.againLoading = true
+          this.form.validateFields((err, values) => {
+            if (!err) {
+              values.updateDescription=this.updateDescription;
+              var params = {
 
-              ...values,
-              accountId: localStorage.getItem('accountIdCreatNow'),
-              creativeArr: this.selectedRowKeysValue
-            }
-            postAction('/MaterialRefuse/batchUpdateCreative', params).then(res => {
-              if (res.success) {
-                // this.visibleFail = true
-                this.visibleAgain = false
-                this.selectedRowKeys = []
-                this.selectedRowKeysValue = []
-                this.addUser()
-                this.againLoading = false
-                this.$message.success(res.message)
-              } else {
-                this.againLoading = false
-                this.$message.error(res.message)
+                ...values,
+                accountId: localStorage.getItem('accountIdCreatNow'),
+                creativeArr: this.selectedRowKeysValue
               }
-            })
-          }
-        })
+              postAction('/MaterialRefuse/batchUpdateCreative', params).then(res => {
+                if (res.success) {
+                  // this.visibleFail = true
+                  this.visibleAgain = false
+                  this.selectedRowKeys = []
+                  this.selectedRowKeysValue = []
+                  this.addUser()
+                  this.againLoading = false
+                  this.$message.success(res.message)
+                } else {
+                  this.againLoading = false
+                  this.$message.error(res.message)
+                }
+              })
+            }
+          })
+        }
       },
       handleOk(e) {
         this.confirmLoading = true

+ 632 - 0
src/views/modules/Statistics/refuseDataCreatNew.vue

@@ -0,0 +1,632 @@
+<style></style>
+<template>
+  <div class="data-refuse-statistics">
+    <a-row class="image-list-heading vm-panel">
+      <a-row type="flex" align="middle" justify="space-between" class="panel-body">
+        <div class="search-bar" style="width:100%;display:flex">
+          <span style="line-height:35px;margin-left:15px">账户选择:</span>
+          <treeselect :appId.sync="appId" :multiple="false" />
+          <a-button type="primary" style="margin-left:10px" @click="(ipagination.current=1);addUser()">搜索</a-button>
+        </div>
+      </a-row>
+    </a-row>
+    <a-row :gutter="10" style="margin-top:10px">
+      <a-col :span="24">
+        <a-card style="width:100%;">
+          <div style="display:flex;margin:0 0 20px 0;position:relative">
+            <a-input placeholder="请输出要查找的创意名称" style="width:300px;" v-model="keyWord" />
+            <a-button type="primary" style="margin-left:10px" @click="addUserKey">搜索</a-button>
+            <a-button type="primary" style="margin-left:10px" @click="reset()">刷新列表</a-button>
+            <a-button type="primary" style="margin-left:10px" @click="clickAgain" v-if="selectedRowKeys.length>0"
+              :loading="loadingList">一键重提
+            </a-button>
+            <a-button type="primary" style="position:absolute;right:0" @click="syncCreative"
+              :loading="loadingSyncCreative">
+              同步创意
+            </a-button>
+          </div>
+          <!-- /MaterialRefuse/syncCreative -->
+          <a-table :columns="columns" :dataSource="dataList" bordered :loading="loading" size="middle"
+            :pagination="ipagination" :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
+            <!-- <div slot="videoUrl" slot-scope="videoUrl">
+              <video class="video" :src="videoUrl" controls="controls" style="height:200px;width:112.5px">
+                您的浏览器不支持 video 标签。
+              </video>
+            </div> -->
+
+
+            <div slot="coverUrl" slot-scope="coverUrl">
+              <img :src="coverUrl" controls="controls" style="height:200px;width:112.5px" />
+            </div>
+            <template slot="creativeName" slot-scope="text, record">
+              <div>
+                {{ text }}
+                <a-icon type="edit" style="cursor: pointer;" @click="onCellChange(record, 'creativeName')" />
+              </div>
+            </template>
+            <template slot="description" slot-scope="text, record">
+              <div>
+                {{ text }}
+                <a-icon type="edit" style="cursor: pointer;" @click="onCellChange(record, 'description')" />
+              </div>
+            </template>
+          </a-table>
+        </a-card>
+      </a-col>
+    </a-row>
+    <a-modal :title="editTitle" :visible="visible" @ok="handleOk" :confirmLoading="confirmLoading"
+      @cancel="handleCancel">
+      <a-textarea v-model="editWord" autosize />
+    </a-modal>
+    <a-modal title="一键重提" @cancel="handleClose" :visible="visibleAgain" @ok="handleOkAgain"
+      :confirmLoading="againLoading" :width="650" >
+      <a-form :form="form">
+        <a-form-item label="是否修改" :labelCol="{ lg: { span: 4 }, sm: { span: 6 } }"
+          :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }">
+          <a-radio-group buttonStyle="solid" v-decorator="[
+          'type',
+           { initialValue: 0} ]">
+            <a-radio-button :value="0">否</a-radio-button>
+            <a-radio-button :value="1">是</a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item label="广告语" :labelCol="{ lg: { span: 4 }, sm: { span: 6 } }"
+          :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }" v-if="getData('type')==1">
+          <a-input v-model="updateDescription" :max="10" :min="1" style="width:100%" @change="DescriptionChange">
+          </a-input>
+          <a @click="showTitle()">推荐标题</a><a style="margin-left:10px" @click="showCunTitle()">标题收藏</a>
+        </a-form-item>
+        <!-- <a-form-item label="行动号召" :labelCol="{ lg: { span: 6 }, sm: { span: 6 } }"
+          :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }" v-if="getData('type')==1">
+          <a-select v-decorator="['updateActionBarText']" showSearch allowClear placeholder="选择行动号召按钮文案"
+            optionFilterProp="children" :filterOption="filterOption">
+            <a-select-option v-for="appModel in appList" :key="appModel.id" :value="appModel.actionBarText">
+              {{ appModel.actionBarText }}
+            </a-select-option>
+          </a-select>
+        </a-form-item> -->
+      </a-form>
+    </a-modal>
+    <a-modal v-model="visibleFail" title="重提信息" :footer="null">
+      <div v-if="fail">
+        修改成功条数:{{ fail.successCount }} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;失败条数:{{
+              fail.failCount
+            }}
+        <div style="margin-top:20px">
+          <p v-for="(item, index) of fail.failInfo" :key="index">
+            <span>名称:{{ item.campaignName?item.campaignName:item.unitName }}</span><br />
+            <span>错误信息:{{ item.message }}</span>
+          </p>
+        </div>
+      </div>
+    </a-modal>
+    <a-modal title="推荐标题" v-model="titleVisible" :width="1000" :footer="null">
+      <a-row :gutter="10">
+        <a-col :sm="10" style="margin-bottom: 20px;z-index: 10">
+          <a-card class="search-box" style="min-height:500px">
+            <div style="margin-bottom:30px">
+              <span style="display:inline-block;width:80px">行业</span>
+              <a-cascader style="margin-top: 1rem;width:300px" v-model="dataOne" :options="options"
+                :showSearch="{ filter }" expandTrigger="hover" @change="onChangeTitle" placeholder="请选择行业">
+                <a-icon type="smile" slot="suffixIcon" class="test" />
+              </a-cascader>
+            </div>
+            <div style="margin-bottom:30px">
+              <span style="display:inline-block;width:80px">关键词</span>
+              <a-input placeholder="请输入关键词" v-model="value" style="width: 300px" />
+            </div>
+            <span style="display:inline-block;width:80px;float:left"></span>
+            <a-button type="primary" @click="searchQuery" :disabled="value == ''">生成</a-button>
+          </a-card>
+        </a-col>
+        <a-col :sm="14" style="margin-bottom: 20px;z-index: 10">
+          <a-card class="search-box" style="over-flow:auto">
+            <a-list size="large" bordered :dataSource="title">
+              <a-list-item slot="renderItem" slot-scope="item">
+                <a slot="actions" @click="okTitle(item)">选择</a>
+
+
+                {{ item }}
+              </a-list-item>
+            </a-list>
+          </a-card>
+        </a-col>
+      </a-row>
+    </a-modal>
+    <a-modal title="收藏标题" v-model="cunTitleVisible" :width="1000" :footer="null">
+      <a-row :gutter="10">
+        <a-col :sm="24" style="margin-bottom: 20px;z-index: 10">
+          <a-card class="search-box" style="over-flow:auto">
+            <a-list size="large" bordered :dataSource="cunTitleList">
+              <a-list-item slot="renderItem" slot-scope="item">
+
+                <div slot="actions">
+                  <a @click="okTitleCun(item)">选择</a>
+                  <!-- <a-divider type="vertical" />
+                  <a @click="removeTitleCun(item)">删除</a> -->
+                </div>
+                {{ item.title }}
+              </a-list-item>
+            </a-list>
+          </a-card>
+        </a-col>
+      </a-row>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+  import moment from 'moment'
+  import {
+    getRefuseCreative,
+    updateCreative,
+    selectByCreateName
+  } from '@api/statistics'
+  import axios from 'axios'
+  import EditableCell from './components/EditableCell'
+  import {
+    mapGetters
+  } from 'vuex'
+  import {
+    deleteAction,
+    getAction,
+    postAction
+  } from '@/api/manage'
+  import Treeselect from './components/Treeselect.vue'
+
+  import {
+    stopOtherVideo,
+    closeAllVideoFun
+  } from '@/utils/videoControl' // 停止除当前外的其他视频播放,及停止所有视频播放的方法
+  const columns = [{
+      title: '账号Id',
+      dataIndex: 'accountId',
+      key: 'accountId',
+      align: 'center'
+    },
+    {
+      title: '计划Id',
+      dataIndex: 'campaignId',
+      key: 'campaignId',
+      align: 'center'
+    },
+    {
+      title: '广告组id',
+      dataIndex: 'unitId',
+      key: 'unitId',
+      align: 'center'
+    },
+    {
+      title: '创意id',
+      dataIndex: 'creativeId',
+      key: 'photoClick',
+      align: 'center'
+    },
+    {
+      title: '创意名称',
+      dataIndex: 'creativeName',
+      key: 'creativeName',
+      align: 'left',
+      scopedSlots: {
+        customRender: 'creativeName'
+      }
+    },
+    // {
+    //   title: '视频',
+    //   dataIndex: 'videoUrl',
+    //   key: 'videoUrl',
+    //   align: 'center',
+    //   scopedSlots: {
+    //     customRender: 'videoUrl'
+    //   }
+    // },
+    {
+      title: '封面',
+      dataIndex: 'coverUrl',
+      key: 'coverUrl',
+      align: 'center',
+      scopedSlots: {
+        customRender: 'coverUrl'
+      }
+    },
+    {
+      title: '拒绝原因',
+      dataIndex: 'reviewDetail',
+      key: 'reviewDetail',
+      align: 'left'
+    },
+
+    {
+      title: '广告语',
+      dataIndex: 'description',
+      key: 'description',
+      align: 'left',
+      scopedSlots: {
+        customRender: 'description'
+      }
+    }
+  ]
+
+  export default {
+    name: 'refuse-data',
+    components: {
+      EditableCell,
+      Treeselect
+    },
+
+    data: function () {
+      return {
+        title: '被拒创意列表',
+        visibleFail: false,
+        visibleAgain: false,
+        againLoading: false,
+        fail: null,
+        appId: null,
+        loading: false,
+        columns,
+        dataList: [],
+        titleVisible: false,
+        cunTitleVisible: false,
+        keyWord: '',
+        editTitle: '',
+        confirmLoading: false,
+        visible: false,
+        editWord: '',
+        nowData: null,
+        selectedRowKeys: [],
+        selectedRowKeysValue: [],
+        loadingList: false,
+        loadingSyncCreative: false,
+        ipagination: {
+          current: 1,
+          pageSize: 50,
+          showTotal: (total, range) => {
+            return range[0] + '-' + range[1] + ' 共' + total + '条'
+          },
+          showQuickJumper: true,
+          //   showSizeChanger: true,
+          total: 0,
+          onChange: current => {
+            // 切换分页时的回调,
+            // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+            this.ipagination.current = current
+            this.selectedRowKeys = []
+            this.selectedRowKeysValue = []
+            this.addUser()
+          }
+        },
+        form: this.$form.createForm(this),
+        appList: [],
+        options: [],
+        cunTitleList: [],
+        title: [],
+        dataOne: [],
+        value: '',
+
+        updateDescription:'',//广告语的字符
+      }
+    },
+    filters: {
+      typeStatus(type) {
+        // 2 - 提升应用安装;
+        // 3 - 获取电商下单;
+        // 4 - 推广品牌活动;
+        // 5 - 收集销售线索;
+        var data = ['', '', '提升应用安装', '获取电商下单', '推广品牌活动', '收集销售线索']
+        return data[type]
+      },
+      status(sta) {
+        var data = {
+          '-1': '不限',
+          1: '已暂停',
+          3: '计划超预算',
+          4: '有效',
+          6: '余额不足'
+        }
+        return data[sta]
+      },
+      putStatus(sta) {
+        var data = {
+          1: '投放中',
+          2: '暂停'
+        }
+        return data[sta]
+      },
+      createChannel(sta) {
+        var data = {
+          0: '投放后台',
+          1: '汇创助手'
+        }
+        return data[sta]
+      }
+    },
+    watch: {
+      appId(n, o) {
+        console.log(n, o)
+        if (n != o) {
+          this.ipagination.current = 1
+        }
+      },
+      visibleFail(n, o) {
+        if (!n) {
+          this.visibleAgain = false
+          this.selectedRowKeys = []
+          this.selectedRowKeysValue = []
+          this.addUser()
+        }
+      }
+    },
+    methods: {
+      // 广告语改变
+      DescriptionChange(e){
+        console.log(e.target.value);
+        if(e.target.value.length>30){
+          
+          // this.updateDescription=e.target.value.substr(0,30);
+          // console.log(this.updateDescription)
+          this.$message.error('广告语最多30字!')
+        }
+      },
+      filter(inputValue, path) {
+        return path.some(option => option.label.toLowerCase().indexOf(inputValue.toLowerCase()) > -1)
+      },
+      onChangeTitle(value, selectedOptions) {
+        console.log(value, selectedOptions)
+        this.dataOne = value
+        this.value = ''
+        this.title = []
+      },
+      okTitleCun(item) {
+        console.log(item)
+        // this.form.setFieldsValue({
+        //   updateDescription: item.title
+        // })
+        this.updateDescription=item.title;
+        this.cunTitleVisible = false;
+        this.cunTitleList = []
+      },
+
+      okTitle(item) {
+        // this.form.setFieldsValue({
+        //   updateDescription: item
+        // })
+        this.updateDescription=item;
+        this.titleVisible = false;
+        this.dataOne = []
+        this.value = ""
+        this.title = []
+      },
+      searchQuery() {
+        // /ctop/creativeTitle/titleSuggestion
+        console.log(this.value)
+        getAction('/ctop/creativeTitle/titleSearch', {
+          firstCategory: this.dataOne[0],
+          secondCategory: this.dataOne[1],
+          keywords: this.value
+        }).then(res => {
+          console.log(res)
+          this.title = res.result ? res.result : []
+        })
+        // firstCategory,secondCategory,keywords
+      },
+      filterOption(input, option) {
+        return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      },
+      getData(className) {
+        return this.form.getFieldValue(className)
+      },
+      syncCreative() {
+
+        this.loadingSyncCreative = true
+        var params = {}
+        //  localStorage.setItem('accountIdCreat', record.campaignId)
+        // localStorage.setItem('accountIdCreatNow', this.appId)
+        params.accountId = this.appId
+        getAction('/MaterialRefuse/syncCreative', params).then(res => {
+          if (res.success) {
+            this.loadingSyncCreative = false
+            this.$message.success("同步成功")
+            this.reset()
+          } else {
+            this.loadingSyncCreative = false
+            this.$message.error(res.message)
+          }
+        })
+      },
+      clickAgain() {
+        // this.loadingList = true
+        this.visibleAgain = true
+        // getAction('/MaterialRefuse/getAllActionBarText').then(res => {
+        //   if (res.success) {
+        //     this.appList = res.result
+        //   }
+        // })
+        // var params = {}
+        // params.accountId = this.appId + ''
+        // params.creativeArr = this.selectedRowKeysValue
+        // postAction('/MaterialRefuse/batchUpdateCreative', params).then(res => {
+        //   if (res.success) {
+        //     this.loadingList = false
+        //     this.selectedRowKeysValue = []
+        //     this.selectedRowKeys = []
+        //     this.visibleFail = true
+        //     this.fail = res.result
+        //     this.addUser()
+        //   } else {
+        //     this.loadingList = false
+        //     this.visibleFail = true
+        //     this.fail = res.result
+        //     this.$message.error(res.message)
+        //   }
+        // })
+      },
+      showTitle() {
+        this.titleVisible = true;
+        this.getHangye()
+      },
+      showCunTitle() {
+        this.cunTitleVisible = true
+        this.getCunTitle()
+      },
+      getCunTitle() {
+        var params = {}
+        params.accountId = this.appId
+        params.userId = this.userInfo().id
+        params.pageNo = 1
+        params.pageSize = 500
+        getAction('/kuaishou/kuaiShouTitleCollection/list', params).then(res => {
+          if (res.success) {
+            console.log(res.result)
+            this.cunTitleList = res.result.records
+          }
+        })
+      },
+      getHangye() {
+        getAction('/ctop/creativeTitle/getTitleLabel', '').then(res => {
+          console.log(res)
+          if (res.success) {
+            this.options = res.result.map(item => {
+              return {
+                label: item.label,
+                value: item.value,
+                children: item.children.length > 0 ? [{
+                  label: '不限',
+                  value: 0
+                }].concat(item.children) : [{
+                  label: '不限',
+                  value: 0
+                }]
+              }
+            })
+            this.options = [{
+              label: '不限',
+              value: 0
+            }].concat(this.options)
+            if (this.dataOne.length > 0) {
+              return
+            } else {
+              this.dataOne = [0]
+            }
+
+          }
+        })
+      },
+      onSelectChange(selectedRowKeys, selectionRows) {
+        this.selectedRowKeys = selectedRowKeys
+        this.selectedRowKeysValue = selectionRows.map(item => {
+          return {
+            description: item.description,
+            creativeId: item.creativeId
+          }
+        })
+        //    this.selectedRowKeysValue.length > 0 ? this.selectedRowKeysValue :
+      },
+      handleOkAgain(e) {
+        if(this.updateDescription.length>30&&this.getData('type')==1){
+          this.$message.error('广告语最多30个字,请修正后再次提交!')
+        }else{
+          this.againLoading = true
+          this.form.validateFields((err, values) => {
+            if (!err) {
+              values.updateDescription=this.updateDescription;
+              var params = {
+
+                ...values,
+                accountId: this.appId,
+                creativeArr: this.selectedRowKeysValue
+              }
+              postAction('/MaterialRefuse/batchUpdateCreative', params).then(res => {
+                if (res.success) {
+                  // this.visibleFail = true
+                  this.visibleAgain = false
+                  this.selectedRowKeys = []
+                  this.selectedRowKeysValue = []
+                  this.addUser()
+                  this.againLoading = false
+                  this.$message.success(res.message)
+                } else {
+                  this.againLoading = false
+                  this.$message.error(res.message)
+                }
+              })
+            }
+          })
+        }
+      },
+      handleOk(e) {
+        this.confirmLoading = true
+        var params = {}
+        params.accountId = this.nowData.accountId
+        params.campaignId = this.nowData.campaignId
+        params.unitId = this.nowData.unitId
+        params.creativeId = this.nowData.creativeId
+        params.creativeName = this.editTitle == '创意名称修改' ? this.editWord : this.nowData.creativeName
+        params.description = this.editTitle == '广告语修改' ? this.editWord : this.nowData.description
+        updateCreative(params).then(res => {
+          if (res.code == 0) {
+            this.addUser()
+            this.visible = false
+            this.confirmLoading = false
+          } else {
+            this.$message.error(res.message)
+            this.visible = false
+            this.confirmLoading = false
+          }
+        })
+      },
+      handleCancel(e) {
+        this.visible = false
+      },
+      handleClose(e) {
+        this.visibleAgain = false
+        this.form.resetFields()
+      },
+      onCellChange(item, dataIndex) {
+        this.editWord = item[dataIndex]
+        this.editTitle = dataIndex == 'creativeName' ? '创意名称修改' : '广告语修改'
+        this.nowData = item
+        this.visible = true
+      },
+      moment,
+      ...mapGetters(['nickname', 'avatar', 'userInfo']),
+      addUser() {
+        this.loading = true
+        var params = {}
+        //  localStorage.setItem('accountIdCreat', record.campaignId)
+        // localStorage.setItem('accountIdCreatNow', this.appId)
+        params.accountId = this.appId
+        // params.campaignId = localStorage.getItem('accountIdCreat')
+        params.pageSize = this.ipagination.pageSize
+        params.pageNo = this.ipagination.current
+        getAction('/MaterialRefuse/getRefuseCreative', params).then(res => {
+          if (res.code == 0) {
+            this.dataList = res.result.records.map((v, index) => {
+              return {
+                ...v,
+                key: index
+              }
+            })
+            this.list = this.dataList
+            this.loading = false
+            this.ipagination.total = res.result.total
+          }
+        })
+      },
+      addUserKey() {
+        this.dataList = this.list.filter(item => {
+          return item.creativeName.toLowerCase().indexOf(this.keyWord.toLowerCase()) > -1
+        })
+      },
+      reset() {
+        this.addUser()
+      }
+    },
+    distoryed() {},
+    updated() {
+      stopOtherVideo()
+    },
+    mounted: function () {
+      this.$nextTick(() => {})
+    }
+  }
+</script>

+ 29 - 3
src/views/modules/Statistics/videoStatics/vDay.vue

@@ -130,7 +130,15 @@
       <span slot="downloadStartCost" slot-scope="downloadStartCost">{{ downloadStartCost | tofixed }}</span>
       <span slot="installFinishCost" slot-scope="installFinishCost">{{ installFinishCost | tofixed }}</span>
       <span slot="convertCost" slot-scope="convertCost">{{ convertCost | tofixed }}</span>
+      <span slot="operation" slot-scope="text,record">
+          <a href="javascript:;" @click.stop="showRelevantPeople(record)">查看相关人员</a>
+      </span>
     </a-table>
+     <a-modal v-model="relevantPeopleVisible" title="相关人员" :footer="null" :centered='true'>
+        <p>编导:{{relevantPeopleData.planName || '暂无数据'}}</p>
+        <p>剪辑:{{relevantPeopleData.clipName || '暂无数据'}}</p>
+        <p>拍摄:{{relevantPeopleData.shotName || '暂无数据'}}</p>
+      </a-modal>
     <a-modal v-model="Videovisible" title="视频详情" @ok="videoOk" :footer="null" width='50%'>
         <video
           @click.stop
@@ -189,10 +197,12 @@ const columnsFixd = [
 //   },
 
   {
-    title: '视频描述',
-    dataIndex: 'materialDesc',
+    title:'相关人员',
+    dataIndex:'operation',
+    key:'operation',
+    scopedSlots: { customRender: 'operation' },
     align: 'center',
-    width: 100,
+    width:100,
     fixed: 'left'
   }
 ]
@@ -272,6 +282,8 @@ let show = 0
 export default {
   data() {
     return {
+        relevantPeopleVisible:false,
+      relevantPeopleData:{},
         roleCode: localStorage.getItem('roleCode'),
       //下拉选择框的数据
       projectArr:[],
@@ -329,6 +341,20 @@ export default {
   },
   mixins: [JeecgListMixin],
   methods: {
+     // 查看相关人员
+    showRelevantPeople(record){
+      this.relevantPeopleVisible=true;
+      console.log(record)
+      getAction('/ctop/materialAscription/getDetail',{
+        code:record.signature
+      }).then(res=>{
+        console.log(res);
+        if(res.result&&res.success){
+          this.relevantPeopleData=res.result
+        }
+        
+      })
+    },
       sort(pagination, filters, sorter, { currentDataSource }){
          if(sorter.order == 'ascend'){
               this.HttpPost(sorter.columnKey+'+')

+ 26 - 9
src/views/modules/Statistics/videoStatics/vMonth.vue

@@ -89,7 +89,9 @@
      
 
       <span slot="operation" slot-scope="text, record">
-        <a href="javascript:;" @click="opendetail(text, record)">查看明细</a>
+        <a href="javascript:;" @click="opendetail(text, record)" style="margin-right:5px">查看明细</a>
+        |
+        <a href="javascript:;" @click.stop="showRelevantPeople(record)" style="margin-left:5px">查看相关人员</a>
       </span>
 
       <div slot="videoU" slot-scope="test,records">
@@ -140,6 +142,11 @@
       <span slot="installFinishCost" slot-scope="installFinishCost">{{ installFinishCost | tofixed }}</span>
       <span slot="convertCost" slot-scope="convertCost">{{ convertCost | tofixed }}</span>
     </a-table>
+    <a-modal v-model="relevantPeopleVisible" title="相关人员" :footer="null" :centered='true'>
+        <p>编导:{{relevantPeopleData.planName || '暂无数据'}}</p>
+        <p>剪辑:{{relevantPeopleData.clipName || '暂无数据'}}</p>
+        <p>拍摄:{{relevantPeopleData.shotName || '暂无数据'}}</p>
+      </a-modal>
     <!-- 明细表 -->
 
     <a-modal v-model="visibleDetail" title="详细信息" width="60%" :footer="null" >
@@ -215,19 +222,13 @@ const columnsFixd = [
 //     fixed: 'left'
 //   },
 
-  {
-    title: '视频描述',
-    dataIndex: 'materialDesc',
-    align: 'center',
-    width: 100,
-    fixed: 'left'
-  },
+ 
   {
     title: '操作',
     dataIndex: 'operation',
     align: 'center',
     scopedSlots: { customRender: 'operation' },
-    width: 80,
+    width: 180,
     fixed: 'left'
   }
 ]
@@ -365,6 +366,8 @@ let detailConsum = [
 export default {
   data() {
     return {
+       relevantPeopleVisible:false,
+      relevantPeopleData:{},
         roleCode: localStorage.getItem('roleCode'),
        //下拉选择框的数据
       projectArr:[],
@@ -433,6 +436,20 @@ export default {
       }
   },
   methods: {
+    // 查看相关人员
+    showRelevantPeople(record){
+      this.relevantPeopleVisible=true;
+      console.log(record)
+      getAction('/ctop/materialAscription/getDetail',{
+        code:record.signature
+      }).then(res=>{
+        console.log(res);
+        if(res.result&&res.success){
+          this.relevantPeopleData=res.result
+        }
+        
+      })
+    },
       sort(pagination, filters, sorter, { currentDataSource }){
           console.log(pagination, filters, sorter)
           if(sorter.order == 'ascend'){

+ 31 - 5
src/views/modules/Statistics/videoStatics/vSummary.vue

@@ -161,8 +161,16 @@
       <span slot="nextDayOpenRate" slot-scope="nextDayOpenRate">{{ nextDayOpenRate | toPercentage }}</span>
       <span slot="cpm" slot-scope="cpm">{{ cpm | tofixed }}</span>
       <span slot="statDatetime" slot-scope>{{ timedata[0]+'~'+timedata[1]}}</span>
-    </a-table>
+        <span slot="operation" slot-scope="text,record">
+           <a href="javascript:;" @click.stop="showRelevantPeople(record)">查看相关人员</a>
+       </span>
 
+    </a-table>
+    <a-modal v-model="relevantPeopleVisible" title="相关人员" :footer="null" :centered='true'>
+        <p>编导:{{relevantPeopleData.planName || '暂无数据'}}</p>
+        <p>剪辑:{{relevantPeopleData.clipName || '暂无数据'}}</p>
+        <p>拍摄:{{relevantPeopleData.shotName || '暂无数据'}}</p>
+      </a-modal>
     <a-modal v-model="Videovisible" title="视频详情" @ok="videoOk" :footer="null" width="50%">
       <video
         @click.stop
@@ -205,11 +213,13 @@ const columnsFixd = [
     width: 100,
     fixed: 'left'
   },
-  {
-    title: '视频描述',
-    dataIndex: 'materialDesc',
+    {
+    title:'相关人员',
+    dataIndex:'operation',
+    key:'operation',
+    scopedSlots: { customRender: 'operation' },
     align: 'center',
-    width: 100,
+    width:100,
     fixed: 'left'
   }
 ]
@@ -294,6 +304,8 @@ let show = 0
 export default {
   data() {
     return {
+        relevantPeopleVisible:false,
+      relevantPeopleData:{},
       roleCode: localStorage.getItem('roleCode'),
        //下拉选择框的数据
       projectArr:[],
@@ -339,6 +351,20 @@ export default {
     Treeselect
   },
   methods: {
+    // 查看相关人员
+    showRelevantPeople(record){
+      this.relevantPeopleVisible=true;
+      console.log(record)
+      getAction('/ctop/materialAscription/getDetail',{
+        code:record.signature
+      }).then(res=>{
+        console.log(res);
+        if(res.result&&res.success){
+          this.relevantPeopleData=res.result
+        }
+        
+      })
+    },
       sort(pagination, filters, sorter, { currentDataSource }){
           console.log(pagination, filters, sorter)
           if(sorter.order == 'ascend'){

+ 27 - 11
src/views/modules/Statistics/videoStatics/vWeek.vue

@@ -87,9 +87,10 @@
       @change="sort"
     >
      
-
       <span slot="operation" slot-scope="text, record">
-        <a href="javascript:;" @click="opendetail(text, record)">查看明细</a>
+        <a href="javascript:;" @click="opendetail(text, record)" style="margin-right:5px">查看明细</a>
+        |
+        <a href="javascript:;" @click.stop="showRelevantPeople(record)" style="margin-left:5px">查看相关人员</a>
       </span>
 
       <div slot="videoU" slot-scope="test,records">
@@ -139,7 +140,13 @@
       <span slot="downloadStartCost" slot-scope="downloadStartCost">{{ downloadStartCost | tofixed }}</span>
       <span slot="installFinishCost" slot-scope="installFinishCost">{{ installFinishCost | tofixed }}</span>
       <span slot="convertCost" slot-scope="convertCost">{{ convertCost | tofixed }}</span>
+      
     </a-table>
+     <a-modal v-model="relevantPeopleVisible" title="相关人员" :footer="null" :centered='true'>
+        <p>编导:{{relevantPeopleData.planName || '暂无数据'}}</p>
+        <p>剪辑:{{relevantPeopleData.clipName || '暂无数据'}}</p>
+        <p>拍摄:{{relevantPeopleData.shotName || '暂无数据'}}</p>
+      </a-modal>
     <!-- 明细表 -->
 
     <a-modal v-model="visibleDetail" title="详细信息" width="60%" :footer="null" >
@@ -214,20 +221,13 @@ const columnsFixd = [
 //     width: 150,
 //     fixed: 'left'
 //   },
-
-  {
-    title: '视频描述',
-    dataIndex: 'materialDesc',
-    align: 'center',
-    width: 100,
-    fixed: 'left'
-  },
+  
   {
     title: '操作',
     dataIndex: 'operation',
     align: 'center',
     scopedSlots: { customRender: 'operation' },
-    width: 80,
+    width: 180,
     fixed: 'left'
   }
 ]
@@ -361,6 +361,8 @@ let show = 0
 export default {
   data() {
     return {
+      relevantPeopleVisible:false,
+      relevantPeopleData:{},
         roleCode: localStorage.getItem('roleCode'),
        //下拉选择框的数据
       projectArr:[],
@@ -426,6 +428,20 @@ export default {
   },
   mixins: [JeecgListMixin],
   methods: {
+     // 查看相关人员
+    showRelevantPeople(record){
+      this.relevantPeopleVisible=true;
+      console.log(record)
+      getAction('/ctop/materialAscription/getDetail',{
+        code:record.signature
+      }).then(res=>{
+        console.log(res);
+        if(res.result&&res.success){
+          this.relevantPeopleData=res.result
+        }
+        
+      })
+    },
       sort(pagination, filters, sorter, { currentDataSource }){
           console.log(pagination, filters, sorter)
           if(sorter.order == 'ascend'){

+ 355 - 0
src/views/modules/advertiser/modules/productModal.vue

@@ -0,0 +1,355 @@
+<template>
+  <a-modal :title="title" :width="800" :visible="visible" :confirmLoading="confirmLoading" @ok="handleOk"
+    @cancel="handleCancel" cancelText="关闭">
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="媒体类型">
+          <a-radio-group @change="onChange" v-model="model.mediaId">
+            <a-radio-button value="1">头条</a-radio-button>
+            <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-group>
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="广告主名称">
+          <a-select @change="handleChangeAd" labelInValue optionFilterProp="children" showSearch
+            :filterOption="filterOption" v-decorator="['advertiserId', validatorRules.advertiserId]" :disabled="addDis">
+            <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-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="产品名称">
+          <a-input placeholder="请输入产品名称" v-decorator.trim="['productName', validatorRules.projectName]"
+            @keyup="form.setFieldsValue({'productName':getFormFieldValue('productName')?getFormFieldValue('productName').replace(/\s+/g,''):''})" />
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="项目列表">
+          <a-select optionFilterProp="children" showSearch :filterOption="filterOption" mode="multiple"
+            v-decorator="['projectIds', validatorRules.supplierCode]" @blur="getPerson" :disabled="addDis">
+            <a-select-option :value="item.id" v-for="(item, index) of supplierList" :key="index">
+              {{
+              item.projectName
+            }}({{
+              item.mediaId=='1'?'头条':'快手'
+            }})
+
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="运营"
+          v-if="getFormFieldValue('projectIds')&&getFormFieldValue('projectIds').length>0&&optionsElse.length>0">
+
+          <span v-for="(item,index) in optionsElse" :key="index">
+            {{item.userName?item.userName:item.realname}}{{index==(optionsElse.length-1)?'':','}}</span>
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="销售"
+          v-if="getFormFieldValue('projectIds')&&getFormFieldValue('projectIds').length>0&&options.length>0">
+          <span v-for="(item,index) in options"
+            :key="index">{{item.saleName}}{{index==(options.length-1)?'':','}}</span>
+        </a-form-item>
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import {
+    httpAction,
+    getAction,
+    postAction
+  } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from 'moment'
+  import JSelectDepart from '@/components/jeecgbiz/JSelectDepart'
+  import JSelectUserByDep from '@/components/jeecgbiz/JSelectUserByDep'
+  import JTreeSelect from '@/components/jeecg/JTreeSelect'
+  import {
+    mapGetters
+  } from 'vuex'
+  export default {
+    name: 'ProjectModal',
+    components: {
+      JSelectUserByDep,
+      JSelectDepart,
+      JTreeSelect
+    },
+    data() {
+      return {
+        title: '操作',
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: {
+            span: 24
+          },
+          sm: {
+            span: 5
+          }
+        },
+        wrapperCol: {
+          xs: {
+            span: 24
+          },
+          sm: {
+            span: 16
+          }
+        },
+        industryId: '',
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules: {
+          projectName: {
+            rules: [{
+              required: true,
+              message: '请输入产品名称!'
+            }]
+          },
+          industryId: {
+            rules: [{
+              required: true,
+              message: '请选择行业!'
+            }]
+          },
+          advertiserId: {
+            rules: [{
+              required: true,
+              message: '请选择广告主!'
+            }]
+          },
+          supplierCode: {
+            rules: [{
+              required: true,
+              message: '请选择项目!'
+            }],
+          },
+          responsibleName: {
+            rules: [{
+              required: true,
+              message: '请选择负责人!'
+            }]
+          },
+          maxBid: {
+            rules: [{
+              required: true,
+              message: '请输入最高出价!'
+            }, {
+              validator: this.validateInputCode
+            }]
+          },
+        },
+        url: {
+          add: '/ctop/product/insertOrUpdateProduct',
+          edit: '/ctop/product/insertOrUpdateProduct',
+          getList: '/ctop/product/advertiserList'
+
+        },
+        list: [],
+        resId: '',
+        shejiId: '',
+        options: [],
+        optionsElse: [],
+        supplierList: [],
+        addDis: true
+      }
+    },
+    created() {
+      //   this.getSupplierList()
+    },
+    methods: {
+      validateInputCode(rule, value, callback) {
+        if (!value || value > 0) {
+          callback()
+        } else {
+          callback('请输入大于0的最高报价!')
+        }
+      },
+      ...mapGetters(['nickname', 'avatar', 'userInfo']),
+      onChange(e) {
+        console.log(`checked = ${e.target.value}`)
+      },
+      handleChange() {},
+      handleChangeAd(value) {
+        console.log(value)
+        this.form.setFieldsValue({
+          'projectIds': []
+        })
+        postAction('/ctop/product/getProjectListByAdvertiserId', {
+          "advertiserId": value.key
+        }).then(res => {
+          if (res.success) {
+            this.supplierList = res.result
+          }
+        })
+      },
+      getPerson() {
+        if (this.getFormFieldValue('projectIds')) {
+          postAction('/ctop/product/getSaleAndYunyingListByProjectIds', {
+            "projectIds": this.getFormFieldValue('projectIds')
+          }).then(res => {
+            if (res.success) {
+              this.options = res.result.saleList
+              this.optionsElse = res.result.yunyingList
+            }
+          })
+        }
+
+      },
+      handleBlur() {
+        console.log('blur')
+      },
+      handleFocus() {
+        console.log('focus')
+      },
+      filterOption(input, option) {
+        return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      },
+      getList() {
+        var params = {}
+        params.userId = this.userInfo().id
+        console.log(params)
+        getAction(this.url.getList)
+          .then(res => {
+            if (res.success) {
+              console.log(res)
+              this.list = res.result
+
+            } else {
+              this.$message.warning(res.message)
+            }
+          })
+          .finally(() => {})
+      },
+      getSupplierList() {
+        var params = {}
+        getAction('/ctop/supplierList/list').then(res => {
+          if (res.success) {
+            this.supplierList = res.result.records
+          } else {
+            this.$message.warning(res.message)
+          }
+        })
+      },
+      add() {
+        this.addDis = false
+        this.edit({
+          mediaId: '2'
+        })
+      },
+      edit(record) {
+        // this.getSupplierList()
+        this.getList()
+        this.supplierList = []
+        var params = {
+          ...record
+        }
+        if (params.advertiserId) {
+          this.addDis = true
+          this.options = params.saleList
+          this.optionsElse = params.yunyingList
+          params.advertiserId = {
+            key: params.advertiserId,
+            label: params.advertiserName
+          }
+          postAction('/ctop/product/getProjectListByAdvertiserId', {
+            "advertiserId": params.advertiserId.key
+          }).then(res => {
+            if (res.success) {
+              this.supplierList = res.result
+            }
+          })
+
+        }
+        //   if (params.industryId) {
+        //     params.industryId = { key: params.industryId, label: params.industryId_dictText }
+        //   }
+        console.log(record)
+        this.form.resetFields()
+        this.model = Object.assign({}, params)
+        this.visible = true
+        this.$nextTick(() => {
+          console.log(this.model)
+          this.form.setFieldsValue(
+            pick(
+              this.model,
+              'productName',
+              'advertiserId',
+              'projectIds'
+            )
+          )
+          // this.resId = record.responsibleId
+          // this.shejiId = record.designResponsibleId
+          //   getAction('/sys/user/getAllUserList', '').then(res => {
+          //     console.log(res)
+          //     if (res.success) {
+          //       this.options = res.result
+          //     }
+          //   })
+          //   getAction('/sys/user/getAllSaleList', '').then(res => {
+          //     console.log(res)
+          //     if (res.success) {
+          //       this.optionsElse = res.result
+          //     }
+          //   })
+          //时间格式化
+        })
+      },
+      close() {
+        this.$emit('close')
+        this.visible = false
+      },
+      handleOk() {
+        const that = this
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true
+            let httpurl = ''
+            let method = ''
+            if (!this.model.id) {
+              httpurl += this.url.add
+              method = 'post'
+            } else {
+              httpurl += this.url.edit
+              method = 'post'
+            }
+            var data = values.advertiserId
+            let formData = Object.assign(this.model, values)
+
+            //   if(this.model.mediaId)
+            //时间格式化
+            formData.advertiserId = data.key
+            formData.advertiserName = data.label
+            if (formData.id) {
+              formData.productId = formData.id
+            }
+            httpAction(httpurl, formData, method)
+              .then(res => {
+                if (res.success) {
+                  that.$message.success(res.message)
+                  that.$emit('ok')
+                } else {
+                  that.$message.warning(res.message)
+                }
+              })
+              .finally(() => {
+                that.confirmLoading = false
+                that.close()
+              })
+          }
+        })
+      },
+      handleCancel() {
+        this.close()
+      },
+      getFormFieldValue(field) {
+        return this.form.getFieldValue(field)
+      },
+      get(valueName, key) {
+        console.log(valueName, key)
+        this.resId = key
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped></style>

+ 346 - 0
src/views/modules/advertiser/productList.vue

@@ -0,0 +1,346 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+          <a-col :md="6" :sm="8">
+            <a-form-item label="产品名称">
+              <a-input placeholder="请输入产品名称" v-model="productName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="广告主名称">
+              <a-input placeholder="请输入广告主名称" v-model="advertiserName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <!-- <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a> -->
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <!-- 供应商 -->
+    <div>
+
+      <a-table ref="table" size="middle" bordered rowKey="id" :columns="columns" :dataSource="dataSource"
+        :pagination="ipagination" :loading="loading" @change="handleTableChange"
+        style="word-break: break-all;font-size:16px;font-weight:600">
+        <span slot="mediaId"
+          slot-scope="mediaId">{{ mediaId == 1 ? '头条' :mediaId == 2? '快手':mediaId == 3?'头条内广':'快手内广' }}</span>
+        <span slot="projectList" slot-scope="text">
+          <span v-for="(item,index) in text"
+            :key="index">{{index+1}}.{{item.projectName}}{{index==(text.length-1)?'':';'}}</span>
+        </span>
+        <span slot="yunyingList" slot-scope="text">
+          <span v-for="(item,index) in text" :key="index">{{item.realname}}{{index==(text.length-1)?'':','}}</span>
+        </span>
+        <span slot="saleList" slot-scope="text">
+          <span v-for="(item,index) in text" :key="index">{{item.saleName}}{{index==(text.length-1)?'':','}}</span>
+        </span>
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleAddList(record)">绑定项目</a>
+
+          <a-divider type="vertical" />
+
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+      </a-table>
+    </div>
+    <project-modal ref="modalForm" @ok="modalFormOk"></project-modal>
+    <a-modal title="项目展示" :width="800" :visible="visible" :footer="null" @cancel="handleCancel" destroyOnClose
+      cancelText="关闭">
+      <a-button @click="handleProjectAdd" type="primary" icon="plus" style="margin:20px 0">新增</a-button>
+      <a-list bordered :data-source="dataList">
+        <a-list-item slot="renderItem" slot-scope="item, index">
+          {{ item.projectName }}
+          <div slot="actions">
+            <a @click="removeTitleCun(item,index)">删除</a>
+          </div>
+        </a-list-item>
+
+        <!-- <div slot="header">
+          Header
+        </div>
+        <div slot="footer">
+          Footer
+        </div> -->
+      </a-list>
+    </a-modal>
+    <a-modal title="新增项目" :width="800" :visible="visibleAdd" :confirmLoading="confirmLoading" @ok="handleOk"
+      destroyOnClose cancelText="关闭" @cancel="handleCancelAdd">
+      <a-select optionFilterProp="children" showSearch :filterOption="filterOption" mode="multiple" v-model="projectIds"
+        style="width:100%">
+        <a-select-option :value="item.id" v-for="(item, index) of supplierList" :key="index">{{
+              item.projectName
+            }}</a-select-option>
+      </a-select>
+    </a-modal>
+  </a-card>
+</template>
+
+<script>
+  import ProjectModal from './modules/productModal'
+  import JTreeSelect from '@/components/jeecg/JTreeSelect'
+  import {
+    httpAction,
+    getAction,
+    postAction,
+    deleteAction
+  } from '@/api/manage'
+  import {
+    JeecgListMixin
+  } from '@/mixins/ipagination'
+
+  export default {
+    name: 'ProjectList',
+    mixins: [JeecgListMixin],
+    components: {
+      ProjectModal,
+      JTreeSelect
+    },
+    data() {
+      return {
+        description: '产品管理页面',
+        loading: false,
+        visible: false,
+        visibleAdd: false,
+        dataList: [],
+        productIdDelete: null,
+        confirmLoading: false,
+        projectIds: [],
+        supplierList: [],
+        advertiserId: null,
+        // 表头
+        columns: [
+
+          {
+            title: '媒体',
+            align: 'center',
+            dataIndex: 'mediaId',
+            scopedSlots: {
+              customRender: 'mediaId'
+            },
+            width: 100
+          }, {
+            title: '产品名称',
+            align: 'center',
+            dataIndex: 'productName',
+            width: 200
+          },
+          {
+            title: '广告主名称',
+            align: 'center',
+            dataIndex: 'advertiserName',
+            width: 200
+          },
+          {
+            title: '项目名称',
+            align: 'center',
+            dataIndex: 'projectList',
+            scopedSlots: {
+              customRender: 'projectList'
+            },
+          },
+          {
+            title: '运营',
+            align: 'center',
+            dataIndex: 'yunyingList',
+            scopedSlots: {
+              customRender: 'yunyingList'
+            },
+            width: 120,
+
+          },
+          {
+            title: '销售',
+            align: 'center',
+            dataIndex: 'saleList',
+            scopedSlots: {
+              customRender: 'saleList'
+            },
+            width: 120
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: 'center',
+            scopedSlots: {
+              customRender: 'action'
+            },
+            width: 300
+          }
+        ],
+        dataSource: [],
+        url: {
+          list: '/ctop/product/getProductList',
+          delete: '/ctop/product/deleteProduct',
+          deleteBatch: '/ctop/project/deleteBatch',
+          exportXlsUrl: 'ctop/project/exportXls',
+          importExcelUrl: 'ctop/project/importExcel'
+        },
+        options: [],
+        advertiserName: null,
+        productName: null,
+      }
+    },
+    computed: {},
+    watch: {
+      'ipagination.current': function (n, o) {
+        console.log(n, o)
+        if (n != o) {
+          this.tableHttp()
+        }
+
+      }
+    },
+    methods: {
+      searchQuery() {
+        this.tableHttp()
+      },
+      searchReset() {
+        this.advertiserName = null
+        this.productName = null
+        this.tableHttp()
+      },
+      handleTableChange() {
+
+      },
+      handleDelete: function (id) {
+        if (!this.url.delete) {
+          this.$message.error("请设置url.delete属性!")
+          return
+        }
+        var that = this;
+        postAction(that.url.delete, {
+          productId: id
+        }).then((res) => {
+          if (res.success) {
+            that.$message.success(res.message);
+            this.ipagination.current = 1
+            this.tableHttp()
+          } else {
+            that.$message.warning(res.message);
+          }
+        });
+      },
+      handleProjectAdd() {
+        this.visibleAdd = true
+        // this.supplierList = 
+        postAction('/ctop/product/getProjectListByAdvertiserId', {
+          "advertiserId": this.advertiserId
+        }).then(res => {
+          if (res.success) {
+            this.supplierList = res.result
+            this.projectIds = this.dataList.map(item => {
+              return item.projectId
+            })
+          }
+        })
+      },
+      handleCancelAdd() {
+        this.visibleAdd = false
+      },
+      handleOk() {
+        this.confirmLoading = true
+        postAction('/ctop/product/insertProductProjectMap', {
+          "productId": this.productIdDelete,
+          "projectIds": this.projectIds
+        }).then(res => {
+          if (res.success) {
+            this.confirmLoading = false
+            this.visibleAdd = false
+            this.handleCancel()
+          } else {
+            this.confirmLoading = false
+            this.$message.error(res.message)
+          }
+        })
+      },
+      removeTitleCun(item, index) {
+        postAction('/ctop/product/deleteByProjectIdAndProductId', {
+          "projectId": item.projectId,
+          "productId": this.productIdDelete
+        }).then(res => {
+          if (res.success) {
+            this.dataList.splice(index, 1)
+            this.tableHttp()
+          }
+        })
+      },
+      handleCancel() {
+        this.visible = false
+        this.tableHttp()
+      },
+
+      handleAddList(record) {
+        this.visible = true
+        this.dataList = record.projectList
+        this.productIdDelete = record.id
+        this.advertiserId = record.advertiserId
+      },
+      handleEdit: function (record) {
+        console.log(record)
+        this.$refs.modalForm.edit(record);
+        this.$refs.modalForm.title = "编辑";
+        this.$refs.modalForm.disableSubmit = false;
+      },
+      handleAdd: function () {
+        this.$refs.modalForm.add();
+        this.$refs.modalForm.title = "新增";
+        this.$refs.modalForm.disableSubmit = false;
+      },
+      modalFormOk() {
+        this.ipagination.current = 1
+        this.tableHttp()
+      },
+      filterOption(input, option) {
+        return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      },
+      tableHttp() {
+        this.loading = true;
+        this.dataSource = []
+        var params = {}
+        params.pageNum = this.ipagination.current
+        params.pageSize = this.ipagination.pageSize
+        params.advertiserName = this.advertiserName
+        params.productName = this.productName
+        // {"pageNum":1,"pageSize":10,"advertiserName":"","productName":""}
+        postAction('/ctop/product/getProductList', params).then(res => {
+          if (res.success) {
+            // console.log(res)
+            this.loading = false;
+            this.ipagination.total = res.result.total
+            this.dataSource = res.result.list
+          }
+        })
+      },
+    },
+    mounted() {
+      this.tableHttp()
+    },
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 1 - 1
src/views/modules/agent/KuaishouReportDailyAgentList.vue

@@ -200,7 +200,7 @@
     }
   },
     methods: {
-     
+        
     }
   }
 </script>

+ 432 - 2
src/views/modules/columnConst/accountConst.js

@@ -1,4 +1,7 @@
-let customFields=  [
+
+
+
+export const TTcustomFields= [
     {
       id: 0,
       title: '展现数据',
@@ -886,8 +889,435 @@ let customFields=  [
         // }
       ]
     }
+  ];
+
+export const KScustomFields= [
+    {
+      id: 0,
+      title: '展现数据',
+      checkall: false,
+      form:[],
+      specificFields: [
+        {
+          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: 'aClick',
+          tip: '用户进入视频播放页观看的次数(数据会进行反作弊去重)',
+          align: 'center',
+       
+          scopedSlots: { customRender: 'aClick' },
+          sorter:() => {}
+        },
+        {
+          title: '行为数',
+          dataIndex: 'bClick',
+          tip: '用户在视频播放页单击转化按钮的次数/展示数*100%',
+          align: 'center',
+        
+          scopedSlots: { customRender: 'bClick' },
+          sorter:() => {}
+        },
+        {
+          title: '封面点击率',
+          dataIndex: 'clickRate',
+          tip: '封面点击数占封面展示数百分比',
+          align: 'center',    
+          scopedSlots: { customRender: 'clickRate' },
+          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:() => {}
+        },
+      ]
+    },
+    {
+      id: 1,
+      title: '应用下载数据',
+      checkall: false,
+      form:[],
+      specificFields: [
+        {
+          title: '安卓下载开始数',
+          dataIndex: 'downloadStart',
+          width:150,
+          tip: '安卓端调起下载器并开始下载的次数',
+          align: 'center',
+          scopedSlots: { customRender: 'downloadStart' },
+          sorter: () => {}
+        },
+        {
+          title: '安卓下载开始率',
+          dataIndex: 'downloadStartRate',
+          tip: '安卓下载开始数/行为数',
+          align: 'center',       
+          scopedSlots: { customRender: 'downloadStartRate' },
+          sorter:() => {}
+        },
+        {
+          title: '安卓下载开始单价(元)',
+          dataIndex: 'downloadStartCost',
+          tip: '花费/安卓下载开始数',
+          align: 'center',
+        
+          scopedSlots: { customRender: 'downloadStartCost' },
+          sorter: () => {}
+        },
+        {
+          title: '安卓下载完成数',
+          dataIndex: 'downloadFinish',
+          tip: '安卓端调起下载器并完成下载的次数',
+          align: 'center',
+       
+          scopedSlots: { customRender: 'downloadFinish' },
+          sorter:() => {}
+        },
+        {
+          title: '安卓下载完成率',
+          dataIndex: 'downloadFinishRate',
+          tip: '安卓下载完成数/安卓下载开始数',
+          align: 'center',
+        
+          scopedSlots: { customRender: 'downloadFinishRate' },
+          sorter:() => {}
+        },
+        {
+          title: '安卓下载完成单价(元)',
+          dataIndex: 'downloadFinishCost',
+          tip: '花费/安卓下载完成数',
+          align: 'center',    
+          scopedSlots: { customRender: 'downloadFinishCost' },
+          sorter:() => {}
+        },
+        {
+          title: '激活数',
+          dataIndex: 'active',
+          tip: '广告主回传的应用激活次数',
+          align: 'center',    
+          scopedSlots: { customRender: 'active' },
+          sorter:() => {}
+        },
+        {
+          title: '激活单价',
+          dataIndex: 'activeCost',
+          tip: '花费/激活数',
+          align: 'center',    
+          scopedSlots: { customRender: 'activeCost' },
+          sorter:() => {}
+        },
+        {
+          title: '下载完成激活率',
+          dataIndex: 'activeRate',
+          tip: '激活数/安卓下载完成数',
+          align: 'center',    
+          scopedSlots: { customRender: 'activeRate' },
+          sorter:() => {}
+        },
+        {
+          title: '首日付费次数',
+          dataIndex: 'firstDayPay',
+          tip: '当日激活的用户在当天产生的付费行为次数',
+          align: 'center',    
+          scopedSlots: { customRender: 'firstDayPay' },
+          sorter:() => {}
+        },
+        {
+          title: '首日付费金额',
+          dataIndex: 'firstDayPayAmount',
+          tip: '当日激活的用户在当天产生的付费行为所带来的付费金额',
+          align: 'center',    
+          scopedSlots: { customRender: 'firstDayPayAmount' },
+          sorter:() => {}
+        },
+        {
+          title: '首日付费成本',
+          dataIndex: 'firstDayPayCost',
+          tip: '消耗/首日付费次数',
+          align: 'center',    
+          scopedSlots: { customRender: 'firstDayPayCost' },
+          sorter:() => {}
+        },
+        {
+          title: '首日ROI',
+          dataIndex: 'firstDayPayROI',
+          tip: '首日付费金额/当日消耗',
+          align: 'center',    
+          scopedSlots: { customRender: 'firstDayPayROI' },
+          sorter:() => {}
+        },
+        {
+          title: '付费次数',
+          dataIndex: 'eventPay',
+          tip: '当日回传的付费行为次数',
+          align: 'center',    
+          scopedSlots: { customRender: 'eventPay' },
+          sorter:() => {}
+        },
+        {
+          title: '付费金额',
+          dataIndex: 'eventPayPurchaseAmount',
+          tip: '当日回传的付费行为所带来的付费金额',
+          align: 'center',    
+          scopedSlots: { customRender: 'eventPayPurchaseAmount' },
+          sorter:() => {}
+        },
+        {
+          title: '付费次数成本',
+          dataIndex: 'eventPayCost',
+          tip: '消耗/付费次数',
+          align: 'center',    
+          scopedSlots: { customRender: 'eventPayCost' },
+          sorter:() => {}
+        },
+        {
+          title: 'ROI',
+          dataIndex: 'ROI',
+          tip: '付费金额/当日消耗',
+          align: 'center',    
+          scopedSlots: { customRender: 'ROI' },
+          sorter:() => {}
+        },
+        {
+          title: '注册数',
+          dataIndex: 'register',
+          tip: '付费金额/当日消耗',
+          align: 'center',    
+          scopedSlots: { customRender: 'register' },
+          sorter:() => {}
+        },
+        {
+          title: '注册成本',
+          dataIndex: 'activeRegisterCost',
+          tip: '当日消耗/当日回传注册数',
+          align: 'center',    
+          scopedSlots: { customRender: 'activeRegisterCost' },
+          sorter:() => {}
+        },
+        {
+          title: '注册率',
+          dataIndex: 'activeRegisterRate',
+          tip: '当日回传注册数/当日激活数',
+          align: 'center',    
+          scopedSlots: { customRender: 'activeRegisterRate' },
+          sorter:() => {}
+        },
+          // {
+          //   title: '次留数',
+          //   dataIndex: 'nextDayOpen',
+          //   tip: '前一日激活用户在次日继续访问的PV',
+          //   align: 'center',    
+          //   scopedSlots: { customRender: 'nextDayOpen' },
+          //   sorter:() => {}
+          // },
+          // {
+          //   title: '次留成本',
+          //   dataIndex: 'nextDayOpenCost',
+          //   tip: '消耗/次日留存PV',
+          //   align: 'center',    
+          //   scopedSlots: { customRender: 'nextDayOpenCost' },
+          //   sorter:() => {}
+          // },
+          // {
+          //   title: '次留率',
+          //   dataIndex: 'nextDayOpenRate',
+          //   tip: '前一日激活用户在次日继续访问的PV/前一日激活数',
+          //   align: 'center',    
+          //   scopedSlots: { customRender: 'nextDayOpenRate' },
+          //   sorter:() => {}
+          // },
+        {
+          title: '完件数',
+          dataIndex: 'eventJinJianApp',
+          tip: '当日回传完件数',
+          align: 'center',    
+          scopedSlots: { customRender: 'eventJinJianApp' },
+          sorter:() => {}
+        },
+        {
+          title: '完件成本',
+          dataIndex: 'eventJinJianAppCost',
+          tip: '当日消耗/当日回传完件数',
+          align: 'center',    
+          scopedSlots: { customRender: 'eventJinJianAppCost' },
+          sorter:() => {}
+        },
+        {
+          title: '授信数',
+          dataIndex: 'eventCreditGrantApp',
+          tip: '当日回传授信数',
+          align: 'center',    
+          scopedSlots: { customRender: 'eventCreditGrantApp' },
+          sorter:() => {}
+        },
+        {
+          title: '授信成本',
+          dataIndex: 'eventCreditGrantAppCost',
+          tip: '当日消耗/当日回传授信数',
+          align: 'center',    
+          scopedSlots: { customRender: 'eventCreditGrantAppCost' },
+          sorter:() => {}
+        },
+        {
+          title: '授信率',
+          dataIndex: 'eventCreditGrantAppRate',
+          tip: '当日回传授信数/当日回传的完件数',
+          align: 'center',    
+          scopedSlots: { customRender: 'eventCreditGrantAppRate' },
+          sorter:() => {}
+        },
+      ]
+    },
+    {
+      id: 2,
+      title: '落地页数据',
+      checkall: false,
+      form:[],
+      specificFields: [
+        {
+          title: '表单提交数',
+          dataIndex: 'formCount',
+          tip: '当日回传表单数',
+          align: 'center',
+          scopedSlots: { customRender: 'formCount' },
+          sorter: () => {}
+        },
+        {
+          title: '表单提交点击率',
+          dataIndex: 'formCountRate',         
+          tip: '当日回传表单数/当日行为数',
+          align: 'center',
+          scopedSlots: { customRender: 'formCountRate' },
+          sorter: () => {}
+        },
+        {
+          title: '表单提交单价',
+          dataIndex: 'formCountCost',         
+          tip: '当日消耗/当日回传表单数',
+          align: 'center',
+          scopedSlots: { customRender: 'formCountCost' },
+          sorter: () => {}
+        },
+        {
+          title: '落地页完件数',
+          dataIndex: 'eventJinJianLandingPage',         
+          tip: '当日回传完件数',
+          align: 'center',
+          scopedSlots: { customRender: 'eventJinJianLandingPage' },
+          sorter: () => {}
+        },
+        {
+          title: '落地页完件成本',
+          dataIndex: 'eventJinJianLandingPageCost',         
+          tip: '当日消耗/当日回传完件数',
+          align: 'center',
+          scopedSlots: { customRender: 'eventJinJianLandingPageCost' },
+          sorter: () => {}
+        },
+        {
+          title: '落地页授信数',
+          dataIndex: 'eventCreditGrantLandingPage',         
+          tip: '当日回传授信数',
+          align: 'center',
+          scopedSlots: { customRender: 'eventCreditGrantLandingPage' },
+          sorter: () => {}
+        },
+        {
+          title: '落地页授信成本',
+          dataIndex: 'eventCreditGrantLandingPageCost',         
+          tip: '当日消耗/当日回传授信数',
+          align: 'center',
+          scopedSlots: { customRender: 'eventCreditGrantLandingPageCost' },
+          sorter: () => {}
+        },
+        {
+          title: '落地页授信率',
+          dataIndex: 'eventCreditGrantLandingPageRate',         
+          tip: '当日回传授信数/当日回传的完件数',
+          align: 'center',
+          scopedSlots: { customRender: 'eventCreditGrantLandingPageRate' },
+          sorter: () => {}
+        },
+        {
+          title: '按钮点击数',
+          dataIndex: 'submit',         
+          tip: '用户当日点击按钮的次数',
+          align: 'center',
+          scopedSlots: { customRender: 'submit' },
+          sorter: () => {}
+        },
+        {
+          title: '按钮点击率',
+          dataIndex: 'submitRate',         
+          tip: '当日按钮点击数 / 当日行为数',
+          align: 'center',
+          scopedSlots: { customRender: 'submitRate' },
+          sorter: () => {}
+        },
+        {
+          title: '按钮点击成本',
+          dataIndex: 'submitCost',         
+          tip: '当日消耗 / 当日按钮点击数',
+          align: 'center',
+          scopedSlots: { customRender: 'submitCost' },
+          sorter: () => {}
+        },
+      ]
+    }
   ]
 
 
 
- export default customFields
+//  export default { TTcustomFields, KScustomFields }

+ 608 - 0
src/views/modules/dataChecked/taskList.vue

@@ -0,0 +1,608 @@
+<template>
+  <div class="tasklist">
+    
+    <!-- 执行列表 -->
+       <div class="moduler">
+         <span>任务执行状态:</span>
+          <a-select  style="width: 200px" v-model="exeState" @change="exeStateChange" placeholder="执行状态">
+              <a-select-option value="" >
+                  不限
+              </a-select-option>
+              <a-select-option :value="1" >
+                  开始
+              </a-select-option>
+              <a-select-option :value="0" >
+                  暂停
+              </a-select-option>
+          </a-select>    
+          
+      </div>
+
+      <div class="moduler">
+        <!--  :rowSelection="{selectedRowKeys: selectedRowKeys,...rowSelection}" -->
+        <div class="tableOpt">
+          <a-button type='primary' @click="addTask">新增任务</a-button>
+        </div>
+          <div class="table">
+                <a-table
+                    :columns="columns"
+                    :data-source="tableData"                 
+                    bordered
+                    :pagination="ipagination"
+                    :loading="loading"
+                    @change="sort"
+                    size='middle'
+                >
+
+                    <span slot="options" slot-scope="text,record">
+                        <a href="javascript:;" style="margin-right:10px" @click="editItem(record)">编辑</a>
+                        <a-popconfirm
+                          title="确定删除该任务?"
+                          ok-text="确定"
+                          cancel-text="取消"
+                          @confirm="deleteItem(record)"
+                         
+                        >
+                          <a href="javascript:;">删除</a>
+                        </a-popconfirm>
+                        
+                    </span>
+                   
+                     <span slot="exeState" slot-scope="text,record">
+                         <a-spin :spinning="record.spin" size="small" >
+                            <div class="spin-content">
+                                <a-switch size="default" :checked=text  @change="switchChange(text,record)"/>
+                            </div>
+                        </a-spin>
+                        <!-- <a-switch size="default" :checked=text  @change="switchChange(text,record)"/> -->
+                    </span>
+                    <span slot="mediaType" slot-scope='text'>
+                        <span v-if="text==1">头条</span>
+                        <span v-if="text==2">快手</span>
+                    </span>
+                </a-table>
+            </div>
+      </div>
+     
+
+      <!-- 新建任务的模态框 -->
+      <a-modal  v-model="visible" :title="modalTitle" @ok="handleOk" width='1200px' :maskClosable='false' :keyboard='false' :confirm-loading="confirmLoading">
+        <div class="newTask">
+          <a-form :form="form">
+          <div class="moduler">          
+              <div class="row-item">
+                <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-input  v-decorator="['name', {rules:validationRules.name}]" />
+                  </a-form-item>  
+                </div>
+              </div>
+              <div class="row-item">
+                <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-input  v-decorator="['comment', {rules:validationRules.name}]" />
+                  </a-form-item>  
+                </div>
+              </div>
+              <div class="row-item">
+                <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-decorator="['mediaType', { initialValue:1}]">
+                  <a-radio-button :value="1">头条</a-radio-button>
+                  <a-radio-button :value="2">快手</a-radio-button>
+                  </a-radio-group>
+                  </a-form-item>  
+                </div>
+              </div>
+              <div class="row-item">
+                <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-input  v-decorator="['jobName', {rules:validationRules.name}]" />
+                   </a-form-item>
+                </div>
+              </div>
+              <div class="row-item">
+                <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-input  v-decorator="['packageName', {rules:validationRules.name}]" />
+                  </a-form-item>
+                </div>
+              </div>
+              <div class="row-item">
+                <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-input  v-decorator="['mail', {rules:validationRules.name}]" />
+                  </a-form-item>
+                </div>
+              </div>
+              <div class="row-item">
+                <div class="hint-item"></div>
+                <div class="label-item">
+                  <div class="text-item">API_Name</div>
+                  <div class="required-item"></div>
+                </div>
+                <div class="input-item">
+                  <a-form-item > 
+                  <a-input  v-decorator="['apiName', {rules:validationRules.name}]" />
+                  </a-form-item>
+                </div>
+              </div>
+              <div class="row-item">
+                <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-decorator="['exeState', { initialValue:1 }]">
+                    <a-radio-button :value="1">开启</a-radio-button>
+                    <a-radio-button :value="0">暂停</a-radio-button>
+                  </a-radio-group>
+                  </a-form-item>
+                </div>
+              </div>
+              <div class="row-item">
+                <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-textarea
+                    v-decorator="['script', {rules:validationRules.name}]"
+                    placeholder="请输入执行代码"
+                    :autoSize="{ minRows: 10}"
+                  />
+                   </a-form-item>
+                </div>
+              </div>
+          </div>
+          </a-form>    
+        </div>
+      </a-modal>
+  </div>
+</template>
+
+<script>
+import moment from 'moment';
+import { getAction, postAction, downFile, downFilePost } from '@/api/manage';
+import { JeecgListMixin } from '@/mixins/ipagination'
+import qs from 'qs'
+const columns = [
+  {
+    title: '任务状态',
+    dataIndex: 'exeState',
+    key: 'exeState',
+    align: 'center',
+    scopedSlots: { customRender: 'exeState' }
+  },
+  {
+    title: '名字',
+    dataIndex: 'name',
+    key: 'name',
+    align: 'center',
+    scopedSlots: { customRender: 'name' }
+  },
+  {
+    title: 'API_Name',
+    dataIndex: 'apiName',
+    key: 'apiName',
+    align: 'center',
+    scopedSlots: { customRender: 'apiName' }
+  },
+    // {
+    //   title: '任务id',
+    //   dataIndex: 'id',
+    //   key: 'id',
+    //   align: 'center',
+    // },
+  {
+    title: '包名',
+    dataIndex: 'packageName',
+    key: 'packageName',
+    align: 'center',
+  },
+  
+  
+  {
+    title: '邮箱',
+    dataIndex: 'mail',
+    key: 'mail',
+    align: 'center',
+    
+  },
+  {
+    title: '媒体类型',
+    dataIndex: 'mediaType',
+    key: 'mediaType',
+    align: 'center',
+    scopedSlots: { customRender: 'mediaType' }
+  },
+  {
+    title: '任务组名称',
+    dataIndex: 'jobName',
+    key: 'jobName',
+    align: 'center',
+    scopedSlots: { customRender: 'jobName' }
+  },
+ 
+  {
+    title: '操作',
+    dataIndex: 'options',
+    key: 'options',
+    align: 'center',
+    scopedSlots: { customRender: 'options' }
+  },
+];
+  export default {
+    mixins: [JeecgListMixin],
+    data() {
+      return {
+        form: this.$form.createForm(this),
+        exeState:undefined,
+        columns,
+        tableData:[],
+        loading:false,
+        visible:false,
+        confirmLoading: false,
+        modalTitle:'',
+        validationRules: {
+          url: [   
+            {          
+              required: true,
+              validator: this.validateURL,
+            },
+          ],
+          name:[{
+            required: true,
+             message:'此字段必须填写',
+          }],
+          bid:[{
+            required: true,
+            message:'出价信息必须填写',
+            // validator: this.validateBid,
+          }],
+          roi:[{
+            required: true,
+            message:'ROI系数必须填写',
+            // validator: this.validateBid,
+          }],
+        },
+        currentRecord:{},
+      }
+    },
+    methods: {
+      // 编辑
+      editItem(record){
+        console.log(record)
+        this.currentRecord=record
+        let recordData=JSON.parse(JSON.stringify(record))
+        this.modalTitle='编辑任务'
+         this.visible = true;
+         getAction('/ctop/checkTaskList/queryById',recordData).then(res=>{
+           console.log(res)
+           if(res.success){
+              res.result.exeState=res.result.exeState?1:0;
+              this.form.setFieldsValue({
+                ...res.result
+              })
+           }
+         })
+      },
+      // shanchu
+      deleteItem(record){
+        postAction('/ctop/checkTaskList/delete',qs.stringify({
+          id:record.id
+        })).then(res=>{
+          console.log(res)
+          if(res.success){
+            this.$message.success(res.message);
+            this.tableHttp()
+          }
+        })
+      },
+      // 任务的执行状态
+      exeStateChange(e){
+        console.log(e);
+        this.tableHttp();
+      },
+      //点击分页
+      sort(pagination, filters, sorter, { currentDataSource }){
+          
+          this.ipagination.current=pagination.current;
+          // this.search()
+          this.tableHttp()
+      },
+      // 任务状态改变
+      switchChange(text,record){
+        console.log(text,record);
+        record.spin=true;
+        let recordData=JSON.parse(JSON.stringify(record))
+        recordData.exeState=!text;
+        postAction('/ctop/checkTaskList/edit',recordData).then(res=>{
+          console.log(res);
+          record.spin=false;
+          if(res.success){
+            this.$message.success(res.message)
+            this.tableHttp()
+          }else{
+            this.$message.error(res.message)
+          }
+        })
+      },
+
+      addTask(){
+         this.visible = true;
+         this.modalTitle='新增任务';
+         this.form=this.$form.createForm(this)
+      },
+      handleOk(e) {
+        // console.log(e,'---------');
+        this.confirmLoading = true;
+        this.form.validateFields((err, values) => {
+            if (!err) {
+              
+              console.log('Received values of form: ', values)
+              if(this.modalTitle=='新增任务'){
+                postAction('/ctop/checkTaskList/add', {                 
+                  ...values,
+                }).then((res) => {
+                  console.log(res)
+                  this.visible = false;
+                   this.confirmLoading = false;
+                  if (res.success) {                   
+                    this.$message.success('创建成功');
+                    this.tableHttp();
+                  } else {    
+                    this.$message.error('创建失败')  
+
+                  }
+                })
+              }else{
+                postAction('/ctop/checkTaskList/edit', { 
+                  id:this.currentRecord.id,                
+                  ...values,
+                }).then((res) => {
+                  console.log(res)
+                  this.visible = false;
+                   this.confirmLoading = false;
+                  if (res.success) {                   
+                    this.$message.success('修改成功')
+                     this.tableHttp();
+                  } else {    
+                    this.$message.error('修改失败')               
+                  }
+                })
+              }
+                
+            } else {
+                 this.confirmLoading = false;
+              // console.log(err)
+              this.$message.error('请正确填写必填项目')
+            }
+          })
+
+
+      },
+      // 获取展示列的table
+      tableHttp(){
+        this.loading=true;
+        getAction(`/ctop/checkTaskList/list?pageNo=${this.ipagination.current}`,{
+  
+          exeState:this.exeState
+        }).then(res=>{
+          console.log(res);
+          this.loading=false
+          if(res.success){
+            this.tableData=res.result.records.map(item=>{
+                return {
+                    ...item,
+                    spin:false
+                }
+            });
+            this.ipagination.total=res.result.total
+          }
+          
+        })
+      },
+    },
+    mounted() {
+      this.tableHttp();
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+.tasklist{
+  font-family: PingFangSC-Regular, tahoma, arial, 'Hiragino Sans GB', 'Microsoft yahei', sans-serif;
+  color: #333;
+  ul,
+  li {
+    margin: 0;
+    padding: 0;
+  }
+  .moduler {
+    background: #fff;
+    margin-bottom: 16px;
+    position: relative;
+    padding: 32px 24px 48px 32px;
+    border-radius: 4px;
+    box-shadow: 0px 1px 6px 0px rgba(0, 0, 0, 0.05);
+    .moduler-title {
+      display: flex;
+      align-items: center;
+      font-size: 22px;
+      margin-bottom: 20px;
+    }
+    .row-item {
+      display: flex;
+      justify-content: flex-start;
+      align-items: center;
+      margin-bottom: 32px;
+    }
+    .row-item:last-of-type {
+      margin-bottom: 0;
+    }
+    .row-item .hint-item {
+      width: 24px;
+      min-width: 24px;
+      align-self: flex-start;
+      line-height: 20px;
+      height: 20px;
+      margin-top: 5px;
+    }
+    .row-item .label-item {
+      position: relative;
+      align-items: flex-start;
+      align-self: flex-start;
+      line-height: 20px;
+      height: 20px;
+      margin-top: 7px;
+      width: 80px;
+      min-width: 80px;
+      .text-item {
+        font-size: 14px;
+        width: 60px;
+      }
+    }
+    .row-item .required-item {
+      width: 4px;
+      height: 4px;
+      border-radius: 2px;
+      background: #f45858;
+      position: absolute;
+      right: 10px;
+      top: 50%;
+      transform: translateY(-50%);
+    }
+    .row-item .input-item {
+      min-width: 480px;
+      position: relative;
+      // height: 35px;
+      .tip {
+        font-size: 12px;
+        color: tomato;
+      }
+    }
+  }
+  .tableOpt{
+    margin-bottom: 20px;
+  }
+}
+
+</style>
+<style lang="scss">
+  .newTask{
+    .moduler {
+    background: #fff;
+    margin-bottom: 16px;
+    position: relative;
+    padding: 32px 24px 48px 32px;
+    border-radius: 4px;
+    // box-shadow: 0px 1px 6px 0px rgba(0, 0, 0, 0.05);
+    .moduler-title {
+      display: flex;
+      align-items: center;
+      font-size: 22px;
+      margin-bottom: 20px;
+    }
+    .row-item {
+      display: flex;
+      justify-content: flex-start;
+      align-items: center;
+      margin-bottom: 32px;
+    }
+    .row-item:last-of-type {
+      margin-bottom: 0;
+    }
+    .row-item .hint-item {
+      width: 24px;
+      min-width: 24px;
+      align-self: flex-start;
+      line-height: 20px;
+      height: 20px;
+      margin-top: 5px;
+    }
+    .row-item .label-item {
+      position: relative;
+      align-items: flex-start;
+      align-self: flex-start;
+      line-height: 20px;
+      height: 20px;
+      margin-top: 7px;
+      width: 120px;
+      min-width: 80px;
+      .text-item {
+        font-size: 14px;
+        width: 80px;
+      }
+    }
+    .row-item .required-item {
+      width: 4px;
+      height: 4px;
+      border-radius: 2px;
+      background: #f45858;
+      position: absolute;
+      right: 10px;
+      top: 50%;
+      transform: translateY(-50%);
+    }
+    .row-item .input-item {
+      min-width: 950px;
+      position: relative;
+      // height: 35px;
+      .tip {
+        font-size: 12px;
+        color: tomato;
+      }
+    }
+  }
+  
+    .ant-form-item {
+      -webkit-box-sizing: border-box;
+      box-sizing: border-box;
+      margin: 0;
+      padding: 0;
+      color: rgba(0, 0, 0, 0.65);
+      font-size: 14px;
+      font-variant: tabular-nums;
+      line-height: 1.5;
+      list-style: none;
+      -webkit-font-feature-settings: 'tnum';
+      font-feature-settings: 'tnum';
+      vertical-align: top;
+    }
+  }
+</style>

+ 229 - 0
src/views/modules/dataChecked/taskLog.vue

@@ -0,0 +1,229 @@
+<template>
+  <div class="taskLog">
+      <div class="moduler">
+        <!--  :rowSelection="{selectedRowKeys: selectedRowKeys,...rowSelection}" -->
+        <div class="tableOpt">
+          <!-- <a-button type='primary' @click="addTask">新增任务</a-button> -->
+        </div>
+          <div class="table">
+                <a-table
+                    :columns="columns"
+                    :data-source="tableData"                 
+                    bordered
+                    :pagination="ipagination"
+                    :loading="loading"
+                    @change="sort"
+                    size='middle'
+                >
+
+                    <span slot="options" slot-scope="text,record">
+                        <a href="javascript:;" style="margin-right:10px" @click="editItem(record)">编辑</a>
+                        <a-popconfirm
+                          title="确定删除该任务?"
+                          ok-text="确定"
+                          cancel-text="取消"
+                          @confirm="deleteItem(record)"
+                         
+                        >
+                          <a href="javascript:;">删除</a>
+                        </a-popconfirm>
+                        
+                    </span>
+                   
+                    
+                    <span slot="exeResult" slot-scope="text">
+                        {{text?'已执行':'未执行'}}
+                    </span>
+                    <span slot="notifyState" slot-scope="text">
+                        {{text?'已通知':'未通知'}}
+                    </span>
+                </a-table>
+            </div>
+      </div>
+  </div>
+</template>
+
+<script>
+import moment from 'moment';
+import { getAction, postAction, downFile, downFilePost } from '@/api/manage';
+import { JeecgListMixin } from '@/mixins/ipagination'
+import qs from 'qs'
+const columns = [
+  {
+    title: '任务ID',
+    dataIndex: 'checkTaskId',
+    key: 'checkTaskId',
+    align: 'center',
+    scopedSlots: { customRender: 'checkTaskId' }
+  },
+  {
+    title: '任务名',
+    dataIndex: 'checkTaskId_dictText',
+    key: 'checkTaskId_dictText',
+    align: 'center',
+    scopedSlots: { customRender: 'checkTaskId_dictText' }
+  },
+  
+ 
+
+  {
+    title: '执行时间秒数',
+    dataIndex: 'exeTime',
+    key: 'exeTime',
+    align: 'exeTime',
+     align: 'center',
+    
+  },
+  {
+    title: '执行结果',
+    dataIndex: 'exeResult',
+    key: 'exeResult',
+    align: 'center',
+    scopedSlots: { customRender: 'exeResult' }
+  },
+  {
+    title: '通知状态',
+    dataIndex: 'notifyState',
+    key: 'notifyState',
+    align: 'center',
+    scopedSlots: { customRender: 'notifyState' }
+  },
+  {
+    title: '创建时间',
+    dataIndex: 'createTime',
+    key: 'createTime',
+    align: 'center',
+    scopedSlots: { customRender: 'createTime' }
+  },
+ 
+    // {
+    //   title: '操作',
+    //   dataIndex: 'options',
+    //   key: 'options',
+    //   align: 'center',
+    //   scopedSlots: { customRender: 'options' }
+    // },
+];
+  export default {
+    mixins: [JeecgListMixin],
+    data() {
+      return {
+        columns,
+        tableData:[],
+        loading:false,
+
+      }
+    },
+    methods: {
+       //点击分页
+      sort(pagination, filters, sorter, { currentDataSource }){
+          
+          this.ipagination.current=pagination.current;
+          // this.search();
+          this.tableHttp()
+      },
+      // 获取展示列的table
+      tableHttp(){
+        this.loading=true;
+        getAction('/ctop/checkTaskExecuteLog/list',{
+          pageNo:this.ipagination.current,
+        }).then(res=>{
+          console.log(res);
+          this.loading=false
+          if(res.success){
+            this.tableData=res.result.records.map(item=>{
+                return {
+                    ...item,
+                   key:item.id
+                }
+            });
+            this.ipagination.total=res.result.total
+          }
+          
+        })
+      },
+    },
+    mounted() {
+      this.tableHttp()
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+.taskLog{
+   font-family: PingFangSC-Regular, tahoma, arial, 'Hiragino Sans GB', 'Microsoft yahei', sans-serif;
+  color: #333;
+  ul,
+  li {
+    margin: 0;
+    padding: 0;
+  }
+  .moduler {
+    background: #fff;
+    margin-bottom: 16px;
+    position: relative;
+    padding: 32px 24px 48px 32px;
+    border-radius: 4px;
+    box-shadow: 0px 1px 6px 0px rgba(0, 0, 0, 0.05);
+    .moduler-title {
+      display: flex;
+      align-items: center;
+      font-size: 22px;
+      margin-bottom: 20px;
+    }
+    .row-item {
+      display: flex;
+      justify-content: flex-start;
+      align-items: center;
+      margin-bottom: 32px;
+    }
+    .row-item:last-of-type {
+      margin-bottom: 0;
+    }
+    .row-item .hint-item {
+      width: 24px;
+      min-width: 24px;
+      align-self: flex-start;
+      line-height: 20px;
+      height: 20px;
+      margin-top: 5px;
+    }
+    .row-item .label-item {
+      position: relative;
+      align-items: flex-start;
+      align-self: flex-start;
+      line-height: 20px;
+      height: 20px;
+      margin-top: 7px;
+      width: 80px;
+      min-width: 80px;
+      .text-item {
+        font-size: 14px;
+        width: 60px;
+      }
+    }
+    .row-item .required-item {
+      width: 4px;
+      height: 4px;
+      border-radius: 2px;
+      background: #f45858;
+      position: absolute;
+      right: 10px;
+      top: 50%;
+      transform: translateY(-50%);
+    }
+    .row-item .input-item {
+      min-width: 480px;
+      position: relative;
+      // height: 35px;
+      .tip {
+        font-size: 12px;
+        color: tomato;
+      }
+    }
+  }
+  .tableOpt{
+    margin-bottom: 20px;
+  }
+}
+</style>

+ 58 - 20
src/views/modules/kuaishouapp/account/accountIndex.vue

@@ -1,13 +1,13 @@
 <style>
   .account-index .ant-card-body .count {
     display: inline-block;
-    height: 32px;
-    line-height: 32px;
+    /* height: 32px; */
+    /* line-height: 32px; */
   }
 
-  .account-index .ant-table td {
+  /* .account-index .ant-table td {
     white-space: nowrap;
-  }
+  } */
 </style>
 <template>
   <div class="account-index">
@@ -62,7 +62,7 @@
           <a-input-number :min="0" :step="0.01" v-model="allMoney" style="width:150px" @fouse.stop v-else />
 
           <!-- <a-input-number :min="0" :step="0.01" v-model="allMoney" style="width:150px" @fouse.stop /> -->
-          <a-button @click="editMoney" style="margin:0 15px 15px 15px" type="primary">修改</a-button>
+          <a-button @click="editMoney" style="margin:0 15px 15px 15px" type="primary" :loading="loadingMoney">修改</a-button>
 
           批量操作:
           <a-select style="width: 120px" v-model="allType">
@@ -70,7 +70,7 @@
             <a-select-option value="2">暂停</a-select-option>
             <a-select-option value="3">删除</a-select-option>
           </a-select>
-          <a-button @click="editStatus" style="margin:0 0 15px 15px" type="primary">确认</a-button>
+          <a-button @click="editStatus" style="margin:0 0 15px 15px" type="primary" :loading="loadingState">确认</a-button>
         </div>
         <a-modal v-model="visible" title="错误信息" onOk="handleOk" :footer="null">
           <div v-if="visibleData">
@@ -86,7 +86,7 @@
           </div>
         </a-modal>
         <a-table size="middle" :loading="loadingList" :columns="columns" :dataSource="dataList" bordered
-          :scroll="{ x: 2000 }" :customRow="rowClick" :pagination="ipagination"
+          :scroll="{ x: 2000 }" :customRow="rowClick" :pagination="ipagination" @change="sort"
           :rowSelection="{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange }">
           <template slot="campaignName" slot-scope="text, record">
             <div style="display:flex;justify-content: center;">
@@ -308,6 +308,8 @@
     },
     data: function () {
       return {
+        loadingMoney:false,
+        loadingState:false,
         nameEdit: false,
         campaignIdSearch: '',
         loadingList: false,
@@ -344,25 +346,31 @@
         ipagination: {
           current: 1,
           pageSize: 10,
+          //   pageSizeOptions: ['10', '20', '30'],
           showTotal: (total, range) => {
-            return range[0] + '-' + range[1] + ' 共' + total + '条'
+              return range[0] + "-" + range[1] + " 共" + total + "条"
           },
           showQuickJumper: true,
-          onChange: current => {
+          showSizeChanger:true,
+          pageSizeOptions: ['10', '30', '50'],
+          total: 0,
+          onChange: (current, pageSize) => {
+            console.log(current, pageSize)
             // 切换分页时的回调,
             // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
             this.ipagination.current = current
-            if (this.campaignId == '' && this.campaignName == '') {
-              this.addUser()
-            } else {
-              var params = {}
-              params.accountId = this.appId + ''
-              params.pageNo = current
-              params.pageSize = this.ipagination.pageSize
-              params.campaignId = this.campaignId
-              params.campaignName = this.campaignName
-              this.getCampaignList(params)
-            }
+            this.ipagination.pageSize= pageSize
+            // if (this.campaignId == '' && this.campaignName == '') {
+            //   this.addUser()
+            // } else {
+            //   var params = {}
+            //   params.accountId = this.appId + ''
+            //   params.pageNo = this.ipagination.current
+            //   params.pageSize = this.ipagination.pageSize
+            //   params.campaignId = this.campaignId
+            //   params.campaignName = this.campaignName
+            //   this.getCampaignList(params)
+            // }
 
           },
           total: 0
@@ -413,6 +421,24 @@
       }
     },
     methods: {
+       sort(pagination, filters, sorter, { currentDataSource }){
+            
+            this.ipagination.current=pagination.current;
+
+            this.ipagination.pageSize=pagination.pageSize;
+            // this.search()
+            if (this.campaignId == '' && this.campaignName == '') {
+              this.addUser()
+            } else {
+              var params = {}
+              params.accountId = this.appId + ''
+              params.pageNo = this.ipagination.current
+              params.pageSize = this.ipagination.pageSize
+              params.campaignId = this.campaignId
+              params.campaignName = this.campaignName
+              this.getCampaignList(params)
+            }
+      },
       failInfoShow(item) {
         if (item) {
           this.visible = true
@@ -542,6 +568,7 @@
       searchRe() {
         this.campaignIdSearch = ''
         this.campaignName = ''
+        this.ipagination.current = 1
         this.searchLabel()
       },
       addUser() {
@@ -566,6 +593,7 @@
         //    this.selectedRowKeysValue.length > 0 ? this.selectedRowKeysValue :
       },
       editStatus() {
+        this.loadingState = true
         var params = {}
         params.accountId = this.appId + ''
         params.putStatus = this.allType
@@ -577,10 +605,14 @@
             this.addUser()
             this.selectedRowKeysValue = []
             this.selectedRowKeys = []
+            this.loadingState =false
+          }else{
+            this.loadingState =false
           }
         })
       },
       editMoney() {
+         this.loadingMoney = true 
         if (this.allPrice == '1') {
           var params = {}
           params.accountId = this.appId + ''
@@ -594,13 +626,16 @@
                 this.visible = true
                 this.visibleData = res.result
                 this.addUser()
+                this.loadingMoney = false
               } else {
                 this.addUser()
                 this.selectedRowKeysValue = []
                 this.selectedRowKeys = []
+                this.loadingMoney = false
               }
             } else {
               this.$message.error(res.message)
+              this.loadingMoney = false
             }
           })
         } else if (this.allPrice == '2') {
@@ -616,13 +651,16 @@
                 this.visible = true
                 this.visibleData = res.result
                 this.addUser()
+                this.loadingMoney = false
               } else {
                 this.addUser()
                 this.selectedRowKeysValue = []
                 this.selectedRowKeys = []
+                this.loadingMoney = false
               }
             } else {
               this.$message.error(res.message)
+              this.loadingMoney = false
             }
           })
         }

+ 108 - 20
src/views/modules/kuaishouapp/account/advertisingGroup.vue

@@ -1,17 +1,17 @@
 <style>
   .advertising-group .ant-card-body .count {
     display: inline-block;
-    height: 32px;
-    line-height: 32px;
+    /* height: 32px;
+    line-height: 32px; */
   }
 
   .checked .ant-checkbox-wrapper {
     width: 140px;
   }
 
-  .advertising-group .ant-table td {
+  /* .advertising-group .ant-table td {
     white-space: nowrap;
-  }
+  } */
 
   .ant-tabs {
     overflow: visible;
@@ -53,7 +53,8 @@
             <div v-show="selectedRowKeys.length > 0">
               批量修改预算:
               <a-input-number :min="-1" :step="0.1" v-model="allMoney" style="width:150px" @fouse.stop />
-              <a-button @click="editMoney" style="margin:0 15px 15px 15px" type="primary">修改</a-button>
+              <a-button @click="editMoney" style="margin:0 15px 15px 15px" type="primary" :loading="loadingMoney">修改
+              </a-button>
 
               批量修改出价:
               <a-select style="width: 120px" v-model="allPrice" @change="changePrice">
@@ -71,7 +72,8 @@
                   {{allMoneyBid&&deepConversionBid?((allMoneyBid/deepConversionBid)*100).toFixed(2)+'%':''}}</span>
               </div>
 
-              <a-button @click="editMoneyBid" style="margin:0 15px 15px 15px" type="primary">修改</a-button>
+              <a-button @click="editMoneyBid" style="margin:0 15px 15px 15px" type="primary" :loading="loadingAllMoney">
+                修改</a-button>
 
               批量操作:
               <a-select style="width: 120px" v-model="allType">
@@ -81,7 +83,8 @@
                 <a-select-option value="4">修改</a-select-option>
                 <a-select-option value="5">复制</a-select-option>
               </a-select>
-              <a-button @click="editStatus" style="margin:0 0 15px 15px" type="primary">确认</a-button>
+              <a-button @click="editStatus" style="margin:0 0 15px 15px" type="primary" :loading="loadingState">确认
+              </a-button>
             </div>
             <a-modal title="列表项筛选" v-model="showEdit" @ok="handleOk">
               <a-checkbox :indeterminate="indeterminate" @change="onCheckAllChange" :checked="checkAll">全选</a-checkbox>
@@ -92,12 +95,11 @@
               :pagination="ipagination" :scroll="{ x: 2500 }" :rowSelection="{
                 selectedRowKeys: selectedRowKeys,
                 onChange: onSelectChange
-              }" style="margin-top:30px" :loading="loadingList">
+              }" @change="sort" style="margin-top:30px" :loading="loadingList">
               <!-- getCheckboxProps: getCheckboxProps -->
               <span slot="unitName" slot-scope="text, record" :title="text">
                 <div style="display:flex;justify-content: center;">
-                  <a :title="text" @click="toDetail(record)"
-                    style="display:block;overflow: hidden;text-overflow:ellipsis;white-space: nowrap;">
+                  <a :title="text" @click="toDetail(record)">
                     {{ text }}</a>
                   <a-icon type="edit" @click.stop="editShowName(record)" style="margin-left:10px" class="count" />
                 </div>
@@ -105,7 +107,7 @@
               <span slot="action" slot-scope="text, record">
                 <a-switch v-model="record.showSwich" @change="onChangeSwitch(record)" />
               </span>
-              <span slot="deepConversionType" slot-scope="text,record">{{text|deepConversionType}}</span>
+              <span slot="deepConversionType" slot-scope="text">{{text|deepConversionType}}</span>
               <span slot="actionTwo" slot-scope="text, record">
                 <a @click="editDetail(record)">编辑</a>
                 <a-divider type="vertical" />
@@ -213,6 +215,17 @@
           }}</a-select-option>
           </a-select>
         </a-form-item>
+        <a-form-item label="修改监测链接" :labelCol="{ lg: { span: 6 }, sm: { span: 6 } }"
+          :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }">
+          <a-radio-group buttonStyle="solid" v-decorator="['isUpdateTrackUrl',{initialValue: false}]">
+            <a-radio-button :value="false">否</a-radio-button>
+            <a-radio-button :value="true">是</a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item label="监测链接" :labelCol="{ lg: { span: 6 }, sm: { span: 6 } }"
+          :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }" v-if="getData('isUpdateTrackUrl')">
+          <a-input v-model="clickTrackUrl" />
+        </a-form-item>
         <a-form-item label="迭代次数" :labelCol="{ lg: { span: 6 }, sm: { span: 6 } }"
           :wrapperCol="{ lg: { span: 18 }, sm: { span: 18 } }">
           <a-input-number v-decorator="[
@@ -253,7 +266,19 @@
         </a-form-item>
       </a-form>
       <template slot="footer">
-        <a-button key="submit" type="primary" @click="handleSubmitCopy" :loading='loading'>
+        <a-button key="submit" type="primary" @click="handleSubmitCopy"
+          :disabled="getData('isUpdateTrackUrl')?clickTrackUrl==''?true:false:false" :loading='loading'>
+          确定
+        </a-button>
+      </template>
+    </a-modal>
+    <a-modal v-model="nameEdit" title="广告组名称修改" :width="900" :maskClosable="false">
+      <a-form-item label="广告组名称" :labelCol="{ lg: { span: 4 }, sm: { span: 7 } }"
+        :wrapperCol="{ lg: { span: 17 }, sm: { span: 17 } }">
+        <a-input placeholder="请输入" v-model="unitNameEdit" style="display: inline-block;" />
+      </a-form-item>
+      <template slot="footer">
+        <a-button key="submit" type="primary" @click="unitEdit" :loading="loadingUnit">
           确定
         </a-button>
       </template>
@@ -557,6 +582,10 @@
 
     data: function () {
       return {
+        clickTrackUrl: "",
+        loadingMoney: false,
+        loadingState: false,
+        loadingAllMoney: false,
         unitName: '',
         unitNameInit: '',
         unitId: '',
@@ -593,18 +622,20 @@
         }),
         ipagination: {
           current: 1,
-          pageSize: 50,
+          pageSize: 10,
           //   pageSizeOptions: ['10', '20', '30'],
           showTotal: (total, range) => {
-            return range[0] + '-' + range[1] + ' 共' + total + '条'
+            return range[0] + "-" + range[1] + " 共" + total + "条"
           },
           showQuickJumper: true,
-          //   showSizeChanger: true,
+          showSizeChanger: true,
+          pageSizeOptions: ['10', '30', '50'],
           total: 0,
-          onChange: current => {
+          onChange: (current, pageSize) => {
             // 切换分页时的回调,
             // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
             this.ipagination.current = current
+            this.ipagination.pageSize = pageSize;
             this.getDataList(this.titleKey)
           }
         },
@@ -737,6 +768,15 @@
       }
     },
     methods: {
+      sort(pagination, filters, sorter, {
+        currentDataSource
+      }) {
+
+        this.ipagination.current = pagination.current;
+
+        this.ipagination.pageSize = pagination.pageSize;
+        this.getDataList(this.titleKey)
+      },
       // getCheckboxProps(record) {
       //   return {
       //     props: {
@@ -814,6 +854,7 @@
       },
       copyDetail(item) {
         this.visibleCopy = true
+        this.clickTrackUrl = ''
         this.campaignId = localStorage.getItem('advertisingGroupKey')
         this.form.resetFields()
         this.getCampaignList()
@@ -897,6 +938,8 @@
                 this.$message.error(
                   '广告组:' + res.result.failInfo[0].unitName + '          ' + '错误:' + res.result.failInfo[0].message
                 )
+                this.visibleData = res.result
+                this.visible = true
               }
             })
           }
@@ -920,6 +963,8 @@
             postAction('/kuaishou/batch/batchUpdateUnitBudget', params).then(res => {
               console.log(res)
               if (res.result.failCount > 0) {
+                this.visibleData = res.result
+                this.visible = true
                 this.$message.error(
                   '广告计划:' +
                   res.result.failInfo[0].unitName +
@@ -935,12 +980,15 @@
         }
       },
       editStatus() {
+        this.loadingState = true
         if (this.allType == '4') {
+          this.loadingState = false
           this.visibleEditAll = true
         } else if (this.allType == '5') {
           this.getCampaignList()
           this.campaignId = localStorage.getItem('advertisingGroupKey')
           this.visibleBatch = true
+          this.loadingState = false
         } else {
 
           var params = {}
@@ -952,18 +1000,21 @@
             if (res.result.failCount > 0) {
               this.visible = true
               this.visibleData = res.result
+              this.loadingState = false
             } else {
               this.getDataList(localStorage.getItem('advertisingGroupKey'))
               this.$message.success('批量修改成功')
               this.allType = '1'
               this.selectedRowKeysValue = []
               this.selectedRowKeys = []
+              this.loadingState = false
             }
 
           })
         }
       },
       editMoney() {
+        this.loadingMoney = true
         var params = {}
         params.accountId = localStorage.getItem('accountId')
         params.proportion = this.allMoney
@@ -972,6 +1023,7 @@
         postAction('/kuaishou/batch/batchUpdateUnitBudgetByProportion', params).then(res => {
           console.log(res)
           if (res.success) {
+            this.loadingMoney = false
             if (res.result.failCount > 0) {
               this.visible = true
               this.visibleData = res.result
@@ -984,6 +1036,7 @@
               this.selectedRowKeys = []
             }
           } else {
+            this.loadingMoney = false
             this.$message.error(res.message)
           }
         })
@@ -1014,11 +1067,13 @@
         }
       },
       editMoneyBid() {
+        this.loadingAllMoney = true
         if (this.allPrice == '2') {
 
 
           if (this.allMoneyBid < 1 || this.allMoneyBid > this.maxBid) {
             this.$message.error('不得低于1元,不得高于项目最高出价' + this.maxBid + '元')
+            this.loadingAllMoney = false
             return
           }
           var params = {}
@@ -1033,15 +1088,18 @@
                 this.visible = true
                 this.visibleData = res.result
                 this.getDataList(localStorage.getItem('advertisingGroupKey'))
+                this.loadingAllMoney = false
               } else {
                 this.allMoneyBid = null
                 this.$message.success('批量修改成功')
                 this.getDataList(localStorage.getItem('advertisingGroupKey'))
                 this.selectedRowKeysValue = []
                 this.selectedRowKeys = []
+                this.loadingAllMoney = false
               }
             } else {
               this.$message.error(res.message)
+              this.loadingAllMoney = false
             }
           })
         } else if (this.allPrice == '1') {
@@ -1056,15 +1114,18 @@
                 this.visible = true
                 this.visibleData = res.result
                 this.getDataList(localStorage.getItem('advertisingGroupKey'))
+                this.loadingAllMoney = false
               } else {
                 this.allMoneyBidProportion = 1.2
                 this.$message.success('批量修改成功')
                 this.getDataList(localStorage.getItem('advertisingGroupKey'))
                 this.selectedRowKeysValue = []
                 this.selectedRowKeys = []
+                this.loadingAllMoney = false
               }
             } else {
               this.$message.error(res.message)
+              this.loadingAllMoney = false
             }
           })
         }
@@ -1205,7 +1266,8 @@
           this.form.validateFields((err, values) => {
             if (!err) {
               this.visibleCopy = false
-              this.$refs.editGroup.handleOk(this.copyData, 'copy', this.getData('campaignId'), values.unitName)
+              this.$refs.editGroup.handleOk(this.copyData, 'copy', this.getData('campaignId'), values.unitName, this
+                .getData('isUpdateTrackUrl'), this.clickTrackUrl)
             }
           })
 
@@ -1224,6 +1286,18 @@
                 createType: this.getData('createType'),
                 accountId: this.copyData.accountId
               }
+              if (this.getData('isUpdateTrackUrl')) {
+                params.otherJson = {
+                  isUpdateTrackUrl: true,
+                  clickTrackUrl: this.clickTrackUrl,
+                  isUpdate: false
+                }
+              } else {
+                params.otherJson = {
+                  isUpdateTrackUrl: false,
+                  isUpdate: false
+                }
+              }
               postAction('/kuaishou/batch/copyUnit', params).then(res => {
                 if (res.success) {
                   //   visibleData
@@ -1259,6 +1333,18 @@
                   return item.unitName
                 })
               }
+              if (this.getData('isUpdateTrackUrl')) {
+                params.otherJson = {
+                  isUpdateTrackUrl: true,
+                  clickTrackUrl: this.clickTrackUrl,
+                  isUpdate: false
+                }
+              } else {
+                params.otherJson = {
+                  isUpdateTrackUrl: false,
+                  isUpdate: false
+                }
+              }
               postAction('/kuaishou/batch/copyUnit', params).then(res => {
                 if (res.success) {
                   if (res.result.failCount > 0) {
@@ -1284,7 +1370,8 @@
             this.visibleCopy = false
             if (this.getData('createType') == '1') {
               this.$refs.editGroupNew.handleOk(this.copyData, 'typeOne', this.getData('campaignId'), [], this.getData(
-                'createCount'))
+                  'createCount'), this
+                .getData('isUpdateTrackUrl'), this.clickTrackUrl)
 
             } else if (this.getData('createType') == '2') {
               this.unitNameList.map(item => {
@@ -1293,7 +1380,8 @@
                 }
               })
               this.$refs.editGroupNew.handleOk(this.copyData, 'typeTwo', this.getData('campaignId'), this.unitNameList,
-                this.getData('createCount'))
+                this.getData('createCount'), this
+                .getData('isUpdateTrackUrl'), this.clickTrackUrl)
 
             }
           }
@@ -1361,7 +1449,7 @@
       },
     },
     computed: {},
-    mounted() {
+    activated() {
       var data = JSON.parse(localStorage.getItem('advertisingGroup'))
       this.titleKey = localStorage.getItem('advertisingGroupKey')
       this.title = data.map(item => {

+ 14 - 9
src/views/modules/kuaishouapp/account/copyGroup.vue

@@ -162,16 +162,16 @@
     <a-form-item label="场景广告位" :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
       :wrapperCol="{ lg: { span: 17 }, sm: { span: 17 } }">
       <!-- v-decorator="['speed', { initialValue: '1' }]" -->
-      <a-radio-group buttonStyle="solid" v-decorator="['sceneId', { initialValue: '1' }]">
-        <a-radio-button value="1">优选广告位</a-radio-button>
-        <a-radio-button value="2">按场景选择广告位</a-radio-button>
+      <a-radio-group buttonStyle="solid" v-model="allForm.sceneIdAll">
+        <a-radio-button :value="1">优选广告位</a-radio-button>
+        <a-radio-button :value="2">按场景选择广告位</a-radio-button>
       </a-radio-group>
       <!-- getData('speed') == '2' -->
       <br>
 
     </a-form-item>
     <a-form-item label=" " :labelCol="{ lg: { span: 7 }, sm: { span: 7 } }"
-      :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }" class="else-label" v-if="getData('sceneId') == '2'">
+      :wrapperCol="{ lg: { span: 10 }, sm: { span: 17 } }" class="else-label" v-if="allForm.sceneIdAll == 2">
       <a-checkbox-group :defaultValue="[7]" v-model="allForm.sceneId">
         <a-checkbox :value="7">信息流广告</a-checkbox>
         <a-checkbox :value="6">上下滑大屏广告</a-checkbox>
@@ -220,7 +220,7 @@
                   <a-form-item label="计费方式" :labelCol="{ lg: { span: 6 }, sm: { span: 7 } }"
                     :wrapperCol="{ lg: { span: 18 }, sm: { span: 17 } }">
                     <a-radio-group :defaultValue="1">
-                      <a-radio :value="1">点击计费</a-radio>
+                      <a-radio :value="1">{{item.bidType == 1?"点击计费":"展示计费(oCPM)"}}</a-radio>
                     </a-radio-group>
                   </a-form-item>
                   <a-form-item label="出价" :labelCol="{ lg: { span: 6 }, sm: { span: 7 } }"
@@ -342,6 +342,7 @@
           fail: [],
           success: [],
           sceneId: [7],
+          sceneIdAll: 1,
           useAppMarket: false
         },
         dataList: [],
@@ -575,7 +576,11 @@
                 ...res.result.appInfo,
                 ...res.result.target
               }
-              dataJson.sceneId = JSON.parse(dataJson.sceneId)[0] == '1' ? '1' : '2'
+            //   dataJson.sceneId = JSON.parse(dataJson.sceneId)[0] == '1' ? '1' : '2'
+              this.allForm.sceneIdAll = JSON.parse(dataJson.sceneId).filter(item => item == 1).length > 0 ? 1 : 2
+              this.allForm.sceneId = this.allForm.sceneIdAll == 1 ? [7] : JSON.parse(res.result.baseInfo
+              .sceneId)
+              
               dataJson.dayBudget = dataJson.dayBudget / 1000
               this.allForm.dayBudget = dataJson.dayBudget == 0 ? '0' : '1'
               this.allForm.useAppMarket = dataJson.useAppMarket ? (dataJson.useAppMarket == 0 ? false : true) :
@@ -644,7 +649,7 @@
               console.log(this.populationData.allForm, dataJson.agesRange)
               this.$nextTick(() => {
                 this.form.setFieldsValue(pick(dataJson, ['appId', 'urlType', 'url', 'dayBudget', 'speed',
-                  'showMode', 'sceneId'
+                  'showMode'
                 ]))
               })
             }
@@ -669,13 +674,13 @@
                 bid: item.bid != '' ? item.bid * 1000 : '',
                 deepConversionBid: item.deepConversionBid != '' ? item.deepConversionBid * 1000 : '',
                 ocpxActionType: item.bidType,
-                bidType: item.bidType == 1 ? 2 : 6
+                bidType: item.bidType == 1 ? 2 : 10
               }
             })
             var json = {
               ...values,
               //   sceneId: [values.sceneId],
-              sceneId: values.sceneId == 1 ? [values.sceneId] : this.allForm.sceneId,
+              sceneId: this.allForm.sceneIdAll == 1 ? [this.allForm.sceneIdAll] : this.allForm.sceneId,
               dayBudget: values.dayBudget * 1000
             }
             var params = {

+ 40 - 11
src/views/modules/kuaishouapp/account/editGroup.vue

@@ -239,7 +239,7 @@
                     <a-form-item label="计费方式" :labelCol="{ lg: { span: 6 }, sm: { span: 7 } }"
                       :wrapperCol="{ lg: { span: 18 }, sm: { span: 17 } }">
                       <a-radio-group :defaultValue="1">
-                        <a-radio :value="1">点击计费</a-radio>
+                        <a-radio :value="1">{{item.bidType == 1?"点击计费":"展示计费(oCPM)"}}</a-radio>
                       </a-radio-group>
                     </a-form-item>
                     <a-form-item label="出价" :labelCol="{ lg: { span: 6 }, sm: { span: 7 } }"
@@ -392,7 +392,9 @@
         copyCampaignId: '',
         showSite: false,
         siteId: "",
-        siteList: []
+        siteList: [],
+        isUpdateTrackUrl: false,
+        clickTrackUrl: ""
       }
     },
     computed: {},
@@ -577,9 +579,11 @@
       addApplication() {
         this.$refs.application.showApplication()
       },
-      handleOk(item, type, campaignId, unitNameCopy) {
+      handleOk(item, type, campaignId, unitNameCopy, isUpdateTrackUrl, clickTrackUrl) {
         this.visible = true
         this.showSite = false
+        this.isUpdateTrackUrl = isUpdateTrackUrl
+        this.clickTrackUrl = clickTrackUrl
         //   /kuaishou/batch/getUnitDetail
         this.typeCopy = type
         if (campaignId) {
@@ -717,7 +721,7 @@
                 bid: item.bid != '' ? item.bid * 1000 : '',
                 deepConversionBid: item.deepConversionBid != '' ? item.deepConversionBid * 1000 : '',
                 ocpxActionType: item.bidType,
-                bidType: item.bidType == 1 ? 2 : 6
+                bidType: item.bidType == 1 ? 2 : 10
               }
             })[0]
             var json = {
@@ -743,13 +747,38 @@
                 params.appStore = this.allForm.appStore
               }
             }
-            if (this.showSite && (this.getPlatForm(this.getData('appId')) == '1' || this.getPlatForm(this.getData(
-                'appId')) == '2')) {
-              params.appJson = {
-                isUpdate: true,
-                siteId: this.siteId
+            if (this.isUpdateTrackUrl) {
+              if (this.showSite && (this.getPlatForm(this.getData('appId')) == '1' || this.getPlatForm(this.getData(
+                  'appId')) == '2')) {
+                params.otherJson = {
+                  isUpdate: true,
+                  siteId: this.siteId,
+                  isUpdateTrackUrl: true,
+                  clickTrackUrl: this.clickTrackUrl
+                }
+              } else {
+                params.otherJson = {
+                  isUpdateTrackUrl: true,
+                  clickTrackUrl: this.clickTrackUrl,
+                  isUpdate: false
+                }
+              }
+            } else {
+              if (this.showSite && (this.getPlatForm(this.getData('appId')) == '1' || this.getPlatForm(this.getData(
+                  'appId')) == '2')) {
+                params.otherJson = {
+                  isUpdate: true,
+                  siteId: this.siteId,
+                  isUpdateTrackUrl: false,
+                }
+              } else {
+                params.otherJson = {
+                  isUpdate: false,
+                  isUpdateTrackUrl: false,
+                }
               }
             }
+
             if (this.checkedTrue) {
               var data = this.populationData
               postAction('/kuaishou/batch/addDirectionalTemplate', {
@@ -770,7 +799,7 @@
                   this.loading = false
                 } else {
                   this.loading = false
-                  this.$message.error(res.message)
+                  this.$message.error(res.result.message)
                 }
               })
             } else if (this.typeCopy == 'copy') {
@@ -904,7 +933,7 @@
         })
       },
     },
-    mounted: function () {
+    activated: function () {
       this.getAppList()
       this.getCampaignList()
       this.getMould()

+ 38 - 10
src/views/modules/kuaishouapp/account/editGroupNew.vue

@@ -241,7 +241,7 @@
                     <a-form-item label="计费方式" :labelCol="{ lg: { span: 6 }, sm: { span: 7 } }"
                       :wrapperCol="{ lg: { span: 18 }, sm: { span: 17 } }">
                       <a-radio-group :defaultValue="1">
-                        <a-radio :value="1">点击计费</a-radio>
+                        <a-radio :value="1">{{item.bidType == 1?"点击计费":"展示计费(oCPM)"}}</a-radio>
                       </a-radio-group>
                     </a-form-item>
                     <a-form-item label="出价" :labelCol="{ lg: { span: 6 }, sm: { span: 7 } }"
@@ -404,7 +404,9 @@
         countAll: 0,
         showSite: false,
         siteId: "",
-        siteList: []
+        siteList: [],
+        isUpdateTrackUrl: false,
+        clickTrackUrl: ""
       }
     },
     computed: {},
@@ -595,9 +597,11 @@
       addApplication() {
         this.$refs.application.showApplication()
       },
-      handleOk(item, type, campaignId, unitNameCopy, count) {
+      handleOk(item, type, campaignId, unitNameCopy, count, isUpdateTrackUrl, clickTrackUrl) {
         this.visible = true
         this.showSite = false
+        this.isUpdateTrackUrl = isUpdateTrackUrl
+        this.clickTrackUrl = clickTrackUrl
         //   /kuaishou/batch/getUnitDetail
         this.typeCopy = type
         this.countAll = count
@@ -734,11 +738,35 @@
                 params.appStore = this.allForm.appStore
               }
             }
-            if (this.showSite && (this.getPlatForm(this.getData('appId')) == '1' || this.getPlatForm(this.getData(
-                'appId')) == '2')) {
-              params.appJson = {
-                isUpdate: true,
-                siteId: this.siteId
+            if (this.isUpdateTrackUrl) {
+              if (this.showSite && (this.getPlatForm(this.getData('appId')) == '1' || this.getPlatForm(this.getData(
+                  'appId')) == '2')) {
+                params.otherJson = {
+                  isUpdate: true,
+                  siteId: this.siteId,
+                  isUpdateTrackUrl: true,
+                  clickTrackUrl: this.clickTrackUrl
+                }
+              } else {
+                params.otherJson = {
+                  isUpdateTrackUrl: true,
+                  clickTrackUrl: this.clickTrackUrl,
+                  isUpdate: false
+                }
+              }
+            } else {
+              if (this.showSite && (this.getPlatForm(this.getData('appId')) == '1' || this.getPlatForm(this.getData(
+                  'appId')) == '2')) {
+                params.otherJson = {
+                  isUpdate: true,
+                  siteId: this.siteId,
+                  isUpdateTrackUrl: false,
+                }
+              } else {
+                params.otherJson = {
+                  isUpdate: false,
+                  isUpdateTrackUrl: false,
+                }
               }
             }
             if (this.checkedTrue) {
@@ -758,7 +786,7 @@
                   bid: item.bid != '' ? item.bid * 1000 : '',
                   deepConversionBid: item.deepConversionBid != '' ? item.deepConversionBid * 1000 : '',
                   ocpxActionType: item.bidType,
-                  bidType: item.bidType == 1 ? 2 : 6
+                  bidType: item.bidType == 1 ? 2 : 10
                 }
               })[0]
               var param = {
@@ -942,7 +970,7 @@
         })
       },
     },
-    mounted: function () {
+    activated: function () {
       this.getAppList()
       this.getCampaignList()
       this.getMould()

+ 4 - 4
src/views/modules/kuaishouapp/account/originality.vue

@@ -1,13 +1,13 @@
 <style>
   .account-statistics .ant-card-body .count {
     display: inline-block;
-    height: 32px;
-    line-height: 32px;
+    /* height: 32px;
+    line-height: 32px; */
   }
 
-  .creative-name .ant-table td {
+  /* .creative-name .ant-table td {
     white-space: nowrap;
-  }
+  } */
 
   .else-label .ant-form-item-label label::after {
     content: '';

+ 2 - 2
src/views/modules/kuaishouapp/account/stepForm/Step2.vue

@@ -273,7 +273,7 @@
                     <a-form-item label="计费方式" :labelCol="{ lg: { span: 6 }, sm: { span: 7 } }"
                       :wrapperCol="{ lg: { span: 18 }, sm: { span: 17 } }">
                       <a-radio-group defaultValue="1">
-                        <a-radio value="1">点击计费</a-radio>
+                        <a-radio value="1">{{item.bidType == 1?"点击计费":"展示计费(oCPM)"}}</a-radio>
                       </a-radio-group>
                     </a-form-item>
                     <a-form-item label="出价" :labelCol="{ lg: { span: 6 }, sm: { span: 7 } }"
@@ -832,7 +832,7 @@
                 bid: item.bid != '' ? item.bid * 1000 : '',
                 deepConversionBid: item.deepConversionBid != '' ? item.deepConversionBid * 1000 : '',
                 ocpxActionType: item.bidType,
-                bidType: item.bidType == 1 ? 2 : 6
+                bidType: item.bidType == 1 ? 2 : 10
               }
             })
             var json = {

+ 36 - 7
src/views/modules/kuaishouapp/account/stepForm/Step3.vue

@@ -322,7 +322,7 @@
         <span v-if="messageTip" style="color:red">{{messageTip}}</span>
       </a-form-item>
     </a-modal>
-    <a-modal :maskClosable="false" title="抽帧展示" v-model="chouzhen" width="60%">
+    <a-modal :maskClosable="false" title="抽帧展示" v-model="chouzhen" :width="1000">
       <template slot="footer">
         <a-button key="back" @click="chouzhen=false">关闭</a-button>
         <a-button key="submit" type="primary" @click="handleOkChouzhen">
@@ -336,22 +336,24 @@
       <ul v-if="chouzhenList.length>0" style="height:600px;overflow:auto;padding-left:0" class="step3-modal">
 
         <a-checkbox-group v-model="checkList" @change="onChange" style="width:100%;">
-          <li v-for="(item,index) of chouzhenList" :key="index" class="chouzhen" style="height:355px"
+          <li v-for="(item,index) of chouzhenList" :key="index" class="chouzhen" style="height:320px"
             :class="{'first':index == 0}">
-
-
             <a-checkbox :value="item.signature"
               style="position:absolute;z-index: 100;width:100%;height:100%;right:0;top:0;float:right">
               <img :src="item.url" alt="" style="width:100%">
 
             </a-checkbox>
-
+            <a style="position:absolute;bottom:0;width:100%;text-align:center;margin-left: -10px;z-index: 100;"
+              @click.stop="(showImageStr=item.url);(showImageChouzhen=true)">查看封面</a>
           </li>
         </a-checkbox-group>
       </ul>
 
     </a-modal>
+    <a-modal title="抽帧详情" v-model="showImageChouzhen" :width="400" :footer="null">
 
+      <img :src="showImageStr" style="width:100%" />
+    </a-modal>
 
     <a-modal :maskClosable="false" title="选择素材" v-model="visibleMatemal" @ok="handleOkShow" :width="1000">
       <a-tabs type="card" @change="callback" v-model="active" class="check-video">
@@ -399,7 +401,7 @@
           @change="getDataSource" />
       </div>
     </a-modal>
-    <a-modal title="查看视频" v-model="visibleVideo" :width="300" :footer="null">
+    <a-modal title="查看视频" v-model="visibleVideo" :width="400" :footer="null">
       <video class="video" :src="videoUrlShow" controls="controls" style="width:100%">
         您的浏览器不支持 video 标签。
       </video>
@@ -471,6 +473,9 @@
       <a-row :gutter="10" class="onlny-click-track">
         <a-col :sm="24" style="margin-bottom: 20px;z-index: 10">
           <a-card class="search-box" style="over-flow:auto">
+            <!-- <a-input v-model="trackName"></a-input> -->
+            <a-input-search placeholder="请输入监测链接名称" enter-button="Search" size="large" @search="onSearch"
+              style="width:40%;margin-bottom:20px" v-model="trackName" />
             <a-list size="large" bordered :dataSource="trackUrlList">
               <a-list-item slot="renderItem" slot-scope="item" :title="item.trackUrl" style="line-height:50px">
 
@@ -482,7 +487,7 @@
 
 
                 {{ item.trackName }}
-                <a-input v-model="item.trackUrl" readOnly style="margin:10px"></a-input>
+                <a-input v-model="item.trackUrl" readOnly style="margin:10px;width:70%"></a-input>
               </a-list-item>
             </a-list>
           </a-card>
@@ -525,6 +530,9 @@
     },
     data() {
       return {
+        trackName: '',
+        showImageChouzhen: false,
+        showImageStr: null,
         tongbuLoading: false,
         showTrackUrlNameElse: true,
         clickTrackUrlShow: false,
@@ -655,6 +663,22 @@
     },
     methods: {
       ...mapGetters(["nickname", "avatar", "userInfo"]),
+      onSearch(value) {
+        console.log(value, this.trackName);
+        var params = {}
+        params.accountId = localStorage.getItem('accountId')
+        params.userId = this.userInfo().id
+        params.pageNo = 1
+        params.pageSize = 500
+        params.trackName = value
+        getAction('/kuaishou/kuaiShouTrackUrlCollection/list', params).then(res => {
+          if (res.success) {
+            this.trackUrlList = res.result.records
+          } else {
+            this.$message.error(res.message)
+          }
+        })
+      },
       changeTrackUrlName() {
         var params = {}
         params.accountId = localStorage.getItem('accountId')
@@ -1675,6 +1699,11 @@
         if (!n) {
           closeAllVideoFun()
         }
+      },
+      clickTrackUrlList(n, o) {
+        if (!n) {
+          this.trackName = ''
+        }
       }
     },
     mounted: function () {

+ 657 - 0
src/views/modules/material/labelMaterial.vue

@@ -0,0 +1,657 @@
+<template xmlns:background-color="http://www.w3.org/1999/xhtml">
+  <a-row :gutter="10">
+    <a-col :md="12" :sm="24">
+      <a-card :bordered="false">
+
+        <!-- 按钮操作区域 -->
+        <a-row style="margin-left: 14px">
+          <a-button @click="handleAdd(1)" type="primary">添加部门</a-button>
+          <a-button @click="handleAdd(2)" type="primary">添加下级</a-button>
+          <a-button type="primary" icon="download" @click="handleExportXls('部门信息')">导出</a-button>
+          <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+            <a-button type="primary" icon="import">导入</a-button>
+          </a-upload>
+          <a-button title="删除多条数据" @click="batchDel" type="default">批量删除</a-button>
+          <!--<a-button @click="refresh" type="default" icon="reload" :loading="loading">刷新</a-button>-->
+        </a-row>
+        <div style="background: #fff;padding-left:16px;height: 100%; margin-top: 5px">
+          <a-alert type="info" :showIcon="true">
+            <div slot="message">
+              当前选择:<span v-if="this.currSelected.title">{{ getCurrSelectedTitle() }}</span>
+              <a v-if="this.currSelected.title" style="margin-left: 10px" @click="onClearSelected">取消选择</a>
+            </div>
+          </a-alert>
+          <a-input-search @search="onSearch" style="width:100%;margin-top: 10px" placeholder="请输入部门名称"/>
+          <!-- 树-->
+          <a-col :md="10" :sm="24">
+            <template>
+              <a-dropdown :trigger="[this.dropTrigger]" @visibleChange="dropStatus">
+               <span>
+            <a-tree
+              checkable
+              multiple
+              @select="onSelect"
+              @check="onCheck"
+              @rightClick="rightHandle"
+              :selectedKeys="selectedKeys"
+              :checkedKeys="checkedKeys"
+              :treeData="departTree"
+              :checkStrictly="checkStrictly"
+              :expandedKeys="iExpandedKeys"
+              :autoExpandParent="autoExpandParent"
+              @expand="onExpand"/>
+                </span>
+                <!--新增右键点击事件,和增加添加和删除功能-->
+                <a-menu slot="overlay">
+                  <a-menu-item @click="handleAdd(3)" key="1">添加</a-menu-item>
+                  <a-menu-item @click="handleDelete" key="2">删除</a-menu-item>
+                  <a-menu-item @click="closeDrop" key="3">取消</a-menu-item>
+                </a-menu>
+              </a-dropdown>
+            </template>
+          </a-col>
+        </div>
+      </a-card>
+      <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+      <div class="drawer-bootom-button">
+        <a-dropdown :trigger="['click']" placement="topCenter">
+          <a-menu slot="overlay">
+            <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
+            <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
+            <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item>
+            <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item>
+            <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item>
+            <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item>
+          </a-menu>
+          <a-button>
+            树操作 <a-icon type="up" />
+          </a-button>
+        </a-dropdown>
+      </div>
+      <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+    </a-col>
+    <a-col :md="12" :sm="24">
+      <a-tabs defaultActiveKey="1">
+        <a-tab-pane tab="基本信息" key="1" >
+          <a-card :bordered="false" v-if="selectedKeys.length>0">
+            <a-form :form="form">
+              <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="机构名称">
+                <a-input placeholder="请输入机构/部门名称" v-decorator="['departName', validatorRules.departName ]"/>
+              </a-form-item>
+              <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上级部门">
+                <a-tree-select
+                  style="width:100%"
+                  :dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
+                  :treeData="treeData"
+                  :disabled="disable"
+                  v-model="model.parentId"
+                  placeholder="无">
+                </a-tree-select>
+              </a-form-item>
+              <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="机构编码">
+                <a-input disabled placeholder="请输入机构编码" v-decorator="['orgCode', validatorRules.orgCode ]"/>
+              </a-form-item>
+              <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="机构类型">
+                <template v-if="orgCategoryDisabled">
+                  <a-radio-group v-decorator="['orgCategory',validatorRules.orgCategory]" placeholder="请选择机构类型">
+                    <a-radio value="1">
+                      公司
+                    </a-radio>
+                  </a-radio-group>
+                </template>
+                <template v-else>
+                  <a-radio-group v-decorator="['orgCategory',validatorRules.orgCategory]" placeholder="请选择机构类型">
+                    <a-radio value="2">
+                      部门
+                    </a-radio>
+                    <a-radio value="3">
+                      岗位
+                    </a-radio>
+                  </a-radio-group>
+                </template>
+              </a-form-item>
+              <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="排序">
+                <a-input-number v-decorator="[ 'departOrder',{'initialValue':0}]"/>
+              </a-form-item>
+              <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="手机号">
+                <a-input placeholder="请输入手机号" v-decorator="['mobile', {'initialValue':''}]"/>
+              </a-form-item>
+              <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="地址">
+                <a-input placeholder="请输入地址" v-decorator="['address', {'initialValue':''}]"/>
+              </a-form-item>
+              <a-form-item
+                :labelCol="labelCol"
+                :wrapperCol="wrapperCol"
+                label="备注">
+                <a-textarea placeholder="请输入备注" v-decorator="['memo', {'initialValue':''}]"/>
+              </a-form-item>
+            </a-form>
+            <div class="anty-form-btn">
+              <a-button @click="emptyCurrForm" type="default" htmlType="button" icon="sync">重置</a-button>
+              <a-button @click="submitCurrForm" type="primary" htmlType="button" icon="form">保存</a-button>
+            </div>
+          </a-card>
+          <a-card v-else >
+            <a-empty>
+              <span slot="description"> 请先选择一个部门! </span>
+            </a-empty>
+          </a-card>
+        </a-tab-pane>
+        <a-tab-pane tab="部门权限" key="2" forceRender>
+          <depart-auth-modal ref="departAuth"/>
+        </a-tab-pane>
+      </a-tabs>
+
+    </a-col>
+    <depart-modal ref="departModal" @ok="loadTree"></depart-modal>
+  </a-row>
+</template>
+<script>
+  import DepartModal from './modules/DepartModal'
+  import pick from 'lodash.pick'
+  import {queryDepartTreeList, searchByKeywords, deleteByDepartId} from '@/api/api'
+  import {httpAction, deleteAction} from '@/api/manage'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import DepartAuthModal from './modules/DepartAuthModal'
+  // 表头
+  const columns = [
+    {
+      title: '机构名称',
+      dataIndex: 'departName'
+    },
+    {
+      title: '机构类型',
+      align: 'center',
+      dataIndex: 'orgType'
+    },
+    {
+      title: '机构编码',
+      dataIndex: 'orgCode',
+    },
+    {
+      title: '手机号',
+      dataIndex: 'mobile'
+    },
+    {
+      title: '传真',
+      dataIndex: 'fax'
+    },
+    {
+      title: '地址',
+      dataIndex: 'address'
+    },
+    {
+      title: '排序',
+      align: 'center',
+      dataIndex: 'departOrder'
+    },
+    {
+      title: '操作',
+      align: 'center',
+      dataIndex: 'action',
+      scopedSlots: {customRender: 'action'}
+    }
+  ]
+  export default {
+    name: 'DepartList',
+    mixins: [JeecgListMixin],
+    components: {
+      DepartAuthModal,
+      DepartModal
+    },
+    data() {
+      return {
+        iExpandedKeys: [],
+        loading: false,
+        autoExpandParent: true,
+        currFlowId: '',
+        currFlowName: '',
+        disable: true,
+        treeData: [],
+        visible: false,
+        departTree: [],
+        rightClickSelectedKey: '',
+        rightClickSelectedOrgCode: '',
+        hiding: true,
+        model: {},
+        dropTrigger: '',
+        depart: {},
+        columns: columns,
+        disableSubmit: false,
+        checkedKeys: [],
+        selectedKeys: [],
+        autoIncr: 1,
+        currSelected: {},
+
+        allTreeKeys:[],
+        checkStrictly: true,
+
+        form: this.$form.createForm(this),
+        labelCol: {
+          xs: {span: 24},
+          sm: {span: 5}
+        },
+        wrapperCol: {
+          xs: {span: 24},
+          sm: {span: 16}
+        },
+        graphDatasource: {
+          nodes: [],
+          edges: []
+        },
+        validatorRules: {
+          departName: {rules: [{required: true, message: '请输入机构/部门名称!'}]},
+          orgCode: {rules: [{required: true, message: '请输入机构编码!'}]},
+          orgCategory: {rules: [{required: true, message: '请输入机构类型!'}]},
+          mobile: {rules: [{validator: this.validateMobile}]}
+        },
+        url: {
+          delete: '/sys/sysDepart/delete',
+          edit: '/sys/sysDepart/edit',
+          deleteBatch: '/sys/sysDepart/deleteBatch',
+          exportXlsUrl: "sys/sysDepart/exportXls",
+          importExcelUrl: "sys/sysDepart/importExcel",
+        },
+        orgCategoryDisabled:false,
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      loadData() {
+        this.refresh();
+      },
+      loadTree() {
+        var that = this
+        that.treeData = []
+        that.departTree = []
+        queryDepartTreeList().then((res) => {
+          if (res.success) {
+            //部门全选后,再添加部门,选中数量增多
+            this.allTreeKeys = [];
+            for (let i = 0; i < res.result.length; i++) {
+              let temp = res.result[i]
+              that.treeData.push(temp)
+              that.departTree.push(temp)
+              that.setThisExpandedKeys(temp)
+              that.getAllKeys(temp);
+              // console.log(temp.id)
+            }
+            this.loading = false
+          }
+        })
+      },
+      setThisExpandedKeys(node) {
+        if (node.children && node.children.length > 0) {
+          this.iExpandedKeys.push(node.key)
+          for (let a = 0; a < node.children.length; a++) {
+            this.setThisExpandedKeys(node.children[a])
+          }
+        }
+      },
+      refresh() {
+        this.loading = true
+        this.loadTree()
+      },
+      // 右键操作方法
+      rightHandle(node) {
+        this.dropTrigger = 'contextmenu'
+        console.log(node.node.eventKey)
+        this.rightClickSelectedKey = node.node.eventKey
+        this.rightClickSelectedOrgCode = node.node.dataRef.orgCode
+      },
+      onExpand(expandedKeys) {
+        console.log('onExpand', expandedKeys)
+        // if not set autoExpandParent to false, if children expanded, parent can not collapse.
+        // or, you can remove all expanded children keys.
+        this.iExpandedKeys = expandedKeys
+        this.autoExpandParent = false
+      },
+      backFlowList() {
+        this.$router.back(-1)
+      },
+      // 右键点击下拉框改变事件
+      dropStatus(visible) {
+        if (visible == false) {
+          this.dropTrigger = ''
+        }
+      },
+      // 右键店家下拉关闭下拉框
+      closeDrop() {
+        this.dropTrigger = ''
+      },
+      addRootNode() {
+        this.$refs.nodeModal.add(this.currFlowId, '')
+      },
+      batchDel: function () {
+        console.log(this.checkedKeys)
+        if (this.checkedKeys.length <= 0) {
+          this.$message.warning('请选择一条记录!')
+        } else {
+          var ids = ''
+          for (var a = 0; a < this.checkedKeys.length; a++) {
+            ids += this.checkedKeys[a] + ','
+          }
+          var that = this
+          this.$confirm({
+            title: '确认删除',
+            content: '确定要删除所选中的 ' + this.checkedKeys.length + ' 条数据,以及子节点数据吗?',
+            onOk: function () {
+              deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
+                if (res.success) {
+                  that.$message.success(res.message)
+                  that.loadTree()
+                  that.onClearSelected()
+                } else {
+                  that.$message.warning(res.message)
+                }
+              })
+            }
+          })
+        }
+      },
+      onSearch(value) {
+        let that = this
+        if (value) {
+          searchByKeywords({keyWord: value}).then((res) => {
+            if (res.success) {
+              that.departTree = []
+              for (let i = 0; i < res.result.length; i++) {
+                let temp = res.result[i]
+                that.departTree.push(temp)
+              }
+            } else {
+              that.$message.warning(res.message)
+            }
+          })
+        } else {
+          that.loadTree()
+        }
+
+      },
+      nodeModalOk() {
+        this.loadTree()
+      },
+      nodeModalClose() {
+      },
+      hide() {
+        console.log(111)
+        this.visible = false
+      },
+      onCheck(checkedKeys, info) {
+        console.log('onCheck', checkedKeys, info)
+        this.hiding = false
+        //this.checkedKeys = checkedKeys.checked
+        // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+        if(this.checkStrictly){
+          this.checkedKeys = checkedKeys.checked;
+        }else{
+          this.checkedKeys = checkedKeys
+        }
+        // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+      },
+      onSelect(selectedKeys, e) {
+        console.log('selected', selectedKeys, e)
+        this.hiding = false
+        let record = e.node.dataRef
+        console.log('onSelect-record', record)
+        this.currSelected = Object.assign({}, record)
+        this.model = this.currSelected
+        this.selectedKeys = [record.key]
+        this.model.parentId = record.parentId
+        this.setValuesToForm(record)
+        this.$refs.departAuth.show(record.id);
+
+      },
+      // 触发onSelect事件时,为部门树右侧的form表单赋值
+      setValuesToForm(record) {
+        if(record.orgCategory == '1'){
+          this.orgCategoryDisabled = true;
+        }else{
+          this.orgCategoryDisabled = false;
+        }
+        this.$nextTick(() => {
+          this.form.getFieldDecorator('fax', {initialValue: ''})
+          this.form.setFieldsValue(pick(record, 'departName','orgCategory', 'orgCode', 'departOrder', 'mobile', 'fax', 'address', 'memo'))
+        })
+      },
+      getCurrSelectedTitle() {
+        return !this.currSelected.title ? '' : this.currSelected.title
+      },
+      onClearSelected() {
+        this.hiding = true
+        this.checkedKeys = []
+        this.currSelected = {}
+        this.form.resetFields()
+        this.selectedKeys = []
+        this.$refs.departAuth.departId = ''
+      },
+      handleNodeTypeChange(val) {
+        this.currSelected.nodeType = val
+      },
+      notifyTriggerTypeChange(value) {
+        this.currSelected.notifyTriggerType = value
+      },
+      receiptTriggerTypeChange(value) {
+        this.currSelected.receiptTriggerType = value
+      },
+      submitCurrForm() {
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            if (!this.currSelected.id) {
+              this.$message.warning('请点击选择要修改部门!')
+              return
+            }
+
+            let formData = Object.assign(this.currSelected, values)
+            console.log('Received values of form: ', formData)
+            httpAction(this.url.edit, formData, 'put').then((res) => {
+              if (res.success) {
+                this.$message.success('保存成功!')
+                this.loadTree()
+              } else {
+                this.$message.error(res.message)
+              }
+            })
+          }
+        })
+      },
+      emptyCurrForm() {
+        this.form.resetFields()
+      },
+      nodeSettingFormSubmit() {
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            console.log('Received values of form: ', values)
+          }
+        })
+      },
+      openSelect() {
+        this.$refs.sysDirectiveModal.show()
+      },
+      handleAdd(num) {
+        if (num == 1) {
+          this.$refs.departModal.add()
+          this.$refs.departModal.title = '新增'
+        } else if (num == 2) {
+          let key = this.currSelected.key
+          if (!key) {
+            this.$message.warning('请先点击选中上级部门!')
+            return false
+          }
+          this.$refs.departModal.add(this.selectedKeys)
+          this.$refs.departModal.title = '新增'
+        } else {
+          this.$refs.departModal.add(this.rightClickSelectedKey)
+          this.$refs.departModal.title = '新增'
+        }
+      },
+      handleDelete() {
+        var that = this
+        this.$confirm({
+          title: '确认删除',
+          content: '确定要删除此部门以及子节点数据吗?',
+          onOk: function () {
+            deleteByDepartId({id: that.rightClickSelectedKey}).then((resp) => {
+              if (resp.success) {
+                //删除成功后,去除已选中中的数据
+                that.checkedKeys.splice(that.checkedKeys.findIndex(key => key === that.rightClickSelectedKey), 1);
+                that.$message.success('删除成功!')
+                that.loadTree()
+                //删除后同步清空右侧基本信息内容
+                let orgCode=that.form.getFieldValue("orgCode");
+                if(orgCode && orgCode === that.rightClickSelectedOrgCode){
+                  that.onClearSelected()
+                }
+              } else {
+                that.$message.warning('删除失败!')
+              }
+            })
+          }
+        })
+      },
+      selectDirectiveOk(record) {
+        console.log('选中指令数据', record)
+        this.nodeSettingForm.setFieldsValue({directiveCode: record.directiveCode})
+        this.currSelected.sysCode = record.sysCode
+      },
+      getFlowGraphData(node) {
+        this.graphDatasource.nodes.push({
+          id: node.id,
+          text: node.flowNodeName
+        })
+        if (node.children.length > 0) {
+          for (let a = 0; a < node.children.length; a++) {
+            let temp = node.children[a]
+            this.graphDatasource.edges.push({
+              source: node.id,
+              target: temp.id
+            })
+            this.getFlowGraphData(temp)
+          }
+        }
+      },
+     // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+      expandAll () {
+        this.iExpandedKeys = this.allTreeKeys
+      },
+      closeAll () {
+        this.iExpandedKeys = []
+      },
+      checkALL () {
+        this.checkStriccheckStrictlytly = false
+        this.checkedKeys = this.allTreeKeys
+      },
+      cancelCheckALL () {
+        //this.checkedKeys = this.defaultCheckedKeys
+        this.checkedKeys = []
+      },
+      switchCheckStrictly (v) {
+        if(v==1){
+          this.checkStrictly = false
+        }else if(v==2){
+          this.checkStrictly = true
+        }
+      },
+      getAllKeys(node) {
+        // console.log('node',node);
+        this.allTreeKeys.push(node.key)
+        if (node.children && node.children.length > 0) {
+          for (let a = 0; a < node.children.length; a++) {
+            this.getAllKeys(node.children[a])
+          }
+        }
+      }
+      // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
+      
+    },
+    created() {
+      this.currFlowId = this.$route.params.id
+      this.currFlowName = this.$route.params.name
+      // this.loadTree()
+    },
+
+  }
+</script>
+<style scoped>
+  .ant-card-body .table-operator {
+    margin: 15px;
+  }
+
+  .anty-form-btn {
+    width: 100%;
+    text-align: center;
+  }
+
+  .anty-form-btn button {
+    margin: 0 5px;
+  }
+
+  .anty-node-layout .ant-layout-header {
+    padding-right: 0
+  }
+
+  .header {
+    padding: 0 8px;
+  }
+
+  .header button {
+    margin: 0 3px
+  }
+
+  .ant-modal-cust-warp {
+    height: 100%
+  }
+
+  .ant-modal-cust-warp .ant-modal-body {
+    height: calc(100% - 110px) !important;
+    overflow-y: auto
+  }
+
+  .ant-modal-cust-warp .ant-modal-content {
+    height: 90% !important;
+    overflow-y: hidden
+  }
+
+  #app .desktop {
+    height: auto !important;
+  }
+
+  /** Button按钮间距 */
+  .ant-btn {
+    margin-left: 3px
+  }
+
+  .drawer-bootom-button {
+    /*position: absolute;*/
+    bottom: 0;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: left;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 188 - 0
src/views/modules/material/modules/DepartAuthModal.vue

@@ -0,0 +1,188 @@
+<template>
+  <a-card :bordered="false">
+    <template v-if="this.departId">
+      <a-form>
+        <a-form-item label='所拥有的权限'>
+          <a-tree
+            checkable
+            @check="onCheck"
+            :checkedKeys="checkedKeys"
+            :treeData="treeData"
+            @expand="onExpand"
+            @select="onTreeNodeSelect"
+            :selectedKeys="selectedKeys"
+            :expandedKeys="expandedKeysss"
+            :checkStrictly="checkStrictly"
+            style="height:500px;overflow: auto;">
+            <span slot="hasDatarule" slot-scope="{slotTitle,ruleFlag}">
+              {{ slotTitle }}
+              <a-icon v-if="ruleFlag" type="align-left" style="margin-left:5px;color: red;"></a-icon>
+            </span>
+          </a-tree>
+        </a-form-item>
+      </a-form>
+      <div class="anty-form-btn">
+        <a-dropdown style="float: left" :trigger="['click']" placement="topCenter">
+          <a-menu slot="overlay">
+            <!-- 简化Tree逻辑,使用默认checkStrictly为false的行为,即默认父子关联
+            <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
+            <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
+            -->
+            <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item>
+            <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item>
+            <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item>
+            <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item>
+          </a-menu>
+          <a-button>
+            树操作 <a-icon type="up" />
+          </a-button>
+        </a-dropdown>
+        <a-button style="float: right" @click="handleSubmit" type="primary" htmlType="button" icon="form">保存</a-button>
+      </div>
+    </template>
+    <a-card v-else :bordered="false" style="height:200px">
+      <a-empty>
+        <span slot="description"> 请先选择一个部门! </span>
+      </a-empty>
+    </a-card>
+    <depart-datarule-modal ref="datarule"/>
+  </a-card>
+</template>
+
+<script>
+  import {queryTreeListForRole,queryDepartPermission,saveDepartPermission} from '@/api/api'
+  import DepartDataruleModal from './DepartDataruleModal'
+
+  export default {
+    name: 'DepartAuthModal',
+    components: { DepartDataruleModal },
+    data(){
+      return {
+        departId:"",
+        treeData: [],
+        defaultCheckedKeys:[],
+        checkedKeys:[],
+        halfCheckedKeys:[],
+        expandedKeysss:[],
+        allTreeKeys:[],
+        autoExpandParent: true,
+        checkStrictly: false,
+        title:"部门权限配置",
+        visible: false,
+        loading: false,
+        selectedKeys:[]
+      }
+    },
+    methods: {
+      onTreeNodeSelect(id){
+        if(id && id.length>0){
+          this.selectedKeys = id
+        }
+        this.$refs.datarule.show(this.selectedKeys[0],this.departId)
+      },
+      onCheck (checkedKeys, { halfCheckedKeys }) {
+        // 保存选中的和半选中的,后面保存的时候合并提交
+        this.checkedKeys = checkedKeys
+        this.halfCheckedKeys = halfCheckedKeys
+      },
+      show(departId){
+        this.departId=departId
+        this.loadData();
+      },
+      close () {
+        this.reset()
+        this.$emit('close');
+        this.visible = false;
+      },
+      onExpand(expandedKeys){
+        this.expandedKeysss = expandedKeys;
+        this.autoExpandParent = false
+      },
+      reset () {
+        this.expandedKeysss = []
+        this.checkedKeys = []
+        this.defaultCheckedKeys = []
+        this.loading = false
+      },
+      expandAll () {
+        this.expandedKeysss = this.allTreeKeys
+      },
+      closeAll () {
+        this.expandedKeysss = []
+      },
+      checkALL () {
+        this.checkedKeys = this.allTreeKeys
+      },
+      cancelCheckALL () {
+        this.checkedKeys = []
+      },
+      handleCancel () {
+        this.close()
+      },
+      handleSubmit() {
+        let that = this;
+        if(!that.departId){
+          this.$message.warning('请点击选择一个部门!')
+        }
+        let checkedKeys = [...that.checkedKeys, ...that.halfCheckedKeys]
+        const permissionIds = checkedKeys.join(",")
+        let params =  {
+          departId:that.departId,
+          permissionIds,
+          lastpermissionIds:that.defaultCheckedKeys.join(","),
+        };
+        that.loading = true;
+        saveDepartPermission(params).then((res)=>{
+          if(res.success){
+            that.$message.success(res.message);
+            that.loading = false;
+            that.loadData();
+          }else {
+            that.$message.error(res.message);
+            that.loading = false;
+          }
+        })
+      },
+      convertTreeListToKeyLeafPairs(treeList, keyLeafPair = []) {
+        for(const {key, isLeaf, children} of treeList) {
+          keyLeafPair.push({key, isLeaf})
+          if(children && children.length > 0) {
+            this.convertTreeListToKeyLeafPairs(children, keyLeafPair)
+          }
+        }
+        return keyLeafPair;
+      },
+      emptyCurrForm() {
+        this.form.resetFields()
+      },
+      loadData(){
+        queryTreeListForRole().then((res) => {
+          this.treeData = res.result.treeList
+          this.allTreeKeys = res.result.ids
+          const keyLeafPairs = this.convertTreeListToKeyLeafPairs(this.treeData)
+          queryDepartPermission({departId:this.departId}).then((res)=>{
+            // 过滤出 leaf node 即可,即选中的
+            // Tree组件中checkStrictly默认为false的时候,选中子节点,父节点会自动设置选中或半选中
+            // 保存 checkedKeys 以及 halfCheckedKeys 以便于未做任何操作时提交表单数据
+            const checkedKeys = [...res.result].filter(key => {
+              const keyLeafPair = keyLeafPairs.filter(item => item.key === key)[0]
+              return keyLeafPair && keyLeafPair.isLeaf
+            })
+            const halfCheckedKeys = [...res.result].filter(key => {
+              const keyLeafPair = keyLeafPairs.filter(item => item.key === key)[0]
+              return keyLeafPair && !keyLeafPair.isLeaf
+            })
+            this.checkedKeys = [...checkedKeys];
+            this.halfCheckedKeys = [...halfCheckedKeys]
+            this.defaultCheckedKeys = [...halfCheckedKeys, ...checkedKeys];
+            this.expandedKeysss = this.allTreeKeys;
+          })
+        })
+      }
+    },
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 116 - 0
src/views/modules/material/modules/DepartDataruleModal.vue

@@ -0,0 +1,116 @@
+<template>
+  <a-drawer
+    title="数据规则/按钮权限配置"
+    width="365"
+    :closable="false"
+    @close="onClose"
+    :visible="visible"
+  >
+    <a-tabs defaultActiveKey="1">
+      <a-tab-pane tab="数据规则" key="1">
+
+        <a-checkbox-group v-model="dataruleChecked" v-if="dataruleList.length>0">
+          <a-row>
+            <a-col :span="24" v-for="(item,index) in dataruleList" :key=" 'dr'+index ">
+              <a-checkbox :value="item.id">{{ item.ruleName }}</a-checkbox>
+            </a-col>
+
+            <a-col :span="24">
+              <div style="width: 100%;margin-top: 15px">
+                <a-button @click="saveDataruleForRole" type="primary" size="small" icon="save">点击保存</a-button>
+              </div>
+            </a-col>
+          </a-row>
+        </a-checkbox-group>
+        <div v-else><h3>无配置信息!</h3></div>
+
+      </a-tab-pane>
+    </a-tabs>
+
+  </a-drawer>
+</template>
+
+<script>
+  import ARow from 'ant-design-vue/es/grid/Row'
+  import ACol from 'ant-design-vue/es/grid/Col'
+  import { getAction,postAction } from '@/api/manage'
+
+  export default {
+    name: 'DepartDataruleModal',
+    components: { ACol, ARow },
+    data(){
+      return {
+        functionId:'',
+        departId:'',
+        visible:false,
+        tabList: [{
+          key: '1',
+          tab: '数据规则',
+        }, {
+          key: '2',
+          tab: '按钮权限',
+        }],
+        activeTabKey: '1',
+        url:{
+          datarule:"/sys/sysDepartPermission/datarule",
+        },
+        dataruleList:[],
+        dataruleChecked:[]
+      }
+    },
+    methods:{
+      loadData(){
+        getAction(`${this.url.datarule}/${this.functionId}/${this.departId}`).then(res=>{
+          if(res.success){
+            this.dataruleList = res.result.datarule
+            let drChecked = res.result.drChecked
+            if(drChecked){
+              this.dataruleChecked = drChecked.split(",")
+            }
+          }
+        })
+      },
+      saveDataruleForRole(){
+        if(!this.dataruleChecked || this.dataruleChecked.length==0){
+          this.$message.warning("请注意,现未勾选任何数据权限!")
+        }
+        let params = {
+          permissionId:this.functionId,
+          departId:this.departId,
+          dataRuleIds:this.dataruleChecked.join(",")
+        }
+        postAction(this.url.datarule,params).then(res=>{
+          if(res.success){
+            this.$message.success(res.message)
+          }else{
+            this.$message.error(res.message)
+          }
+        })
+      },
+      show(functionId,departId){
+        this.onReset()
+        this.functionId = functionId
+        this.departId = departId
+        this.visible=true
+        this.loadData()
+      },
+      onClose(){
+        this.visible=false
+        this.onReset()
+      },
+      onTabChange (key) {
+        this.activeTabKey = key
+      },
+      onReset(){
+        this.functionId=''
+        this.departId=''
+        this.dataruleList=[]
+        this.dataruleChecked=[]
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 223 - 0
src/views/modules/material/modules/DepartModal.vue

@@ -0,0 +1,223 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :ok=false
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    :okButtonProps="{ props: {disabled: disableSubmit} }"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="机构名称"
+          :hidden="false"
+          hasFeedback >
+          <a-input id="departName" placeholder="请输入机构/部门名称" v-decorator="['departName', validatorRules.departName ]"/>
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :hidden="seen" label="上级部门" hasFeedback>
+        <a-tree-select
+          style="width:100%"
+          :dropdownStyle="{maxHeight:'200px',overflow:'auto'}"
+          :treeData="departTree"
+          v-model="model.parentId"
+          placeholder="请选择上级部门"
+          :disabled="condition">
+        </a-tree-select>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="机构类型">
+          <template v-if="seen">
+          <a-radio-group v-decorator="['orgCategory',validatorRules.orgCategory]" placeholder="请选择机构类型">
+            <a-radio value="1">
+              公司
+            </a-radio>
+          </a-radio-group>
+          </template>
+          <template v-else>
+            <a-radio-group v-decorator="['orgCategory',validatorRules.orgCategory]" placeholder="请选择机构类型">
+              <a-radio value="2">
+                部门
+              </a-radio>
+              <a-radio value="3">
+                岗位
+              </a-radio>
+            </a-radio-group>
+          </template>
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="电话">
+          <a-input placeholder="请输入电话" v-decorator="['mobile',validatorRules.mobile]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="传真">
+          <a-input placeholder="请输入传真" v-decorator="['fax', {}]"  />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="地址">
+          <a-input placeholder="请输入地址" v-decorator="['address', {}]"  />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="排序">
+          <a-input-number v-decorator="[ 'departOrder',{'initialValue':0}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-textarea placeholder="请输入备注" v-decorator="['memo', {}]"  />
+        </a-form-item>
+
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import { queryIdTree } from '@/api/api'
+  import pick from 'lodash.pick'
+  import ATextarea from 'ant-design-vue/es/input/TextArea'
+  export default {
+    name: "SysDepartModal",
+    components: { ATextarea },
+    data () {
+      return {
+        departTree:[],
+        orgTypeData:[],
+        phoneWarning:'',
+        departName:"",
+        title:"操作",
+        seen:false,
+        visible: false,
+        condition:true,
+        disableSubmit:false,
+        model: {},
+        menuhidden:false,
+        menuusing:true,
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        departName:{rules: [{ required: true, message: '请输入机构/部门名称!' }]},
+        orgCode:{rules: [{ required: true, message: '请输入机构编码!' }]},
+         mobile:{rules: [{validator:this.validateMobile}]}
+        },
+        url: {
+          add: "/sys/sysDepart/add",
+        },
+        dictDisabled:true,
+      }
+    },
+    created () {
+    },
+    methods: {
+      loadTreeData(){
+        var that = this;
+        queryIdTree().then((res)=>{
+          if(res.success){
+            that.departTree = [];
+            for (let i = 0; i < res.result.length; i++) {
+              let temp = res.result[i];
+              that.departTree.push(temp);
+            }
+          }
+
+        })
+      },
+      add (depart) {
+        if(depart){
+          this.seen = false;
+          this.dictDisabled = false;
+        }else{
+          this.seen = true;
+          this.dictDisabled = true;
+        }
+        this.edit(depart);
+      },
+      edit (record) {
+          this.form.resetFields();
+          this.model = Object.assign({}, {});
+          this.visible = true;
+          this.loadTreeData();
+          this.model.parentId = record!=null?record.toString():null;
+          if(this.seen){
+            this.model.orgCategory = '1';
+          }else{
+            this.model.orgCategory = '2';
+          }
+          this.$nextTick(() => {
+            this.form.setFieldsValue(pick(this.model,'orgCategory','departName','departNameEn','departNameAbbr','departOrder','description','orgType','orgCode','mobile','fax','address','memo','status','delFlag'))
+          });
+      },
+      close () {
+        this.$emit('close');
+        this.disableSubmit = false;
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            console.log(formData)
+            httpAction(this.url.add,formData,"post").then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.loadTreeData();
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+      validateMobile(rule,value,callback){
+        if (!value || new RegExp(/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/).test(value)){
+          callback();
+        }else{
+          callback("您的手机号码格式不正确!");
+        }
+
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 11 - 3
src/views/modules/material/videoMaterial.vue

@@ -1082,7 +1082,7 @@
                     }}
                   </a-select-option>
                 </a-select>
-                <a-button type="primary" @click="getWater">生成</a-button>
+                <a-button type="primary" @click="getWater" :loading="waterLoading">生成</a-button>
               </a-form-item>
             </div>
             <div>
@@ -1291,11 +1291,14 @@
       </template>
       <ul v-if="chouzhenList.length>0" style="height:600px;overflow:auto">
         <li v-for="(item,index) of chouzhenList" :key="index" class="chouzhen" :class="{'first':index == 0}">
-          <img :src="item.url" alt="" style="width:100%">
+          <img :src="item.url" alt="" style="width:100%" @click="(showImageStr=item.url);(showImageChouzhen=true)">
         </li>
 
       </ul>
       <div style="clear:both"></div>
+      <a-modal title="图片预览" v-model="showImageChouzhen" :footer="null">
+        <img :src="showImageStr"  style="width:100%"/>
+      </a-modal>
     </a-modal>
 
     <account-check ref="check" @synchro="implement"></account-check>
@@ -1332,6 +1335,8 @@
 
     data() {
       return {
+        showImageChouzhen:false,
+        showImageStr:null,
         coverPreviewVisible: false,
         chouzhen: false,
         chouzhenList: [],
@@ -1477,7 +1482,8 @@
         kuaishouData: null,
         douyinData: null,
         bohui: "",
-        bohuiShow: false
+        bohuiShow: false,
+        waterLoading:false
       }
     },
     filters: {
@@ -1822,6 +1828,7 @@
         })
       },
       getWater() {
+        this.waterLoading = true
         var params = qs.stringify({
           id: this.id,
           watermarkTemplateId: this.size
@@ -1837,6 +1844,7 @@
             this.refuseReason = ''
             closeAllVideoFun()
             this.loadData()
+            this.waterLoading = false
           }
         })
       },

+ 288 - 0
src/views/playerPart/playerData.js

@@ -0,0 +1,288 @@
+function randomNum(min = 0, max = 100, len = 0) {
+    return Number((min + (max - min) * Math.random()).toFixed(len));
+  }
+  
+function randomStr(len = 8) {
+    let str = '';
+    let list = '0123456789abcdefghijklmnopqrstuvwxyz';
+    for (let i = 0; i < len; i++) {
+      let index = randomNum(0, 35);
+      let word = list[index];
+      if (isNaN(word) && randomNum() < 50) {
+        word = word.toUpperCase();
+      }
+      str += word;
+    }
+    return str;
+}
+
+const  playerList=[
+  
+    {
+        id:randomStr(),
+        product:'抖音lite',
+        type:'猜成语',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/0e4ab8d296885208fd562ef15b64c64d/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'强激励-翻红包',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/df60d1df986b2e38090aa9237dbc036f/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'强激励-签到',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/b815e2bb8ba711f822da8d210d1a646e/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'懂车帝',
+        type:'直播-选车',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/b466f2be9c1ffc3977dfaa0c83c4da07/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'抖音',
+        type:'短视频-美女',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/d934006f4aaec71fc1c09bcac6afb7b9/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'抖音lite',
+        type:'短视频-转盘',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/37fe2c1dddfa98774292be433011cfc3/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'懂车帝',
+        type:'强激励',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/010e64e1c6e52e6fc5cd2980bbe32996/index.html',       
+    },
+  
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'短视频-美女',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/693ac6b150f7a3c4400274b079c68a13/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'抖音',
+        type:'短视频-美女',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/9339b3b53ad03a134f1fd29b1b6b2f64/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'抖音lite',
+        type:'接物-睡觉赚钱',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/4174bb9d9914843b668d9af99b69e927/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'抖音lite',
+        type:'短视频-抖唱',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/68c2c388464c0396633ff62403e1caf4/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'抖音lite',
+        type:'强激励-转盘',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/09787e79d77e6318c5bb622c0e055a36/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'强激励-猪仔',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/5d70f6d3549f87159bc1bc3a6141bf1a/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'单本小说',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/c72b132308dace1a2c9a7616c51b778a/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'强激励-转账',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/cee43d0c7f208479cc7bff7e5bb14b34/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'强激励-拆红包',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/59cf5cda79e71d44611414cf2099153e/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'强激励-拆红包',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/71092deeddaa54ce5deebde81db6463c/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'抖音',
+        type:'短视频-美女换装',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/e8ea0ae1d96007cf4e704467737a36ae/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'抖音',
+        type:'游戏',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/2a24bdb7bc4f221f64d1b0b08da13de4/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'微信收款',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/fe76a6ccce7438c3489b6da50847bb23/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'西瓜视频',
+        type:'转盘',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/f2cc3bae27b4db38b0324ef04f23c3e8/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'强奖励',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/876bc48b9dfb5c5e924b9d471b7589db/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'强奖励',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/24390c99e97ee80ad501c5e3641077b1/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'强奖励',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/b597427b9e3f4b939ecaeb22407dd79c/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'游戏奖励',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/6cc2ddf7629c427bf9a5e7a0111d680a/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'积分',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/595160ea59b1457ccedc738f268de690/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'游戏奖励',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/e4e89a1bc7a50c0ebf809eaafb84c538/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'西瓜视频',
+        type:'剧情',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/d0c3da1f2076e3bf5c2909359bd49a9f/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'九宫格抽奖',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/c4db98206e409fa244d869e38394fb6c/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'接物',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/56f695aef1666d23c60fe48af9fe5460/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'接物',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/a2ddffa0349bd7086f7b082a479e8883/index.html',       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'刮刮卡',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/6d96c265cf4d965ffa96559e8ca8814a/index.html?aadvid=1657505911879694',
+        
+    },
+    {
+        id:randomStr(),
+        product:'外部',
+        type:'选择引导',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/b44ceda568774a8a9428ffd17b7d2199/index.html',
+        
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'红包雨',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/ddd5d478af24d31a3d8a2ff0abe79b0e/index.html?aadvid=1657505911879694',
+        
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'转盘抽奖',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/3d4b8f3a129bef2869bc258f44feed13/index.html',
+        
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'阅读对话',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/e780ae0b80b9159adc4b2f03862929d0/index.html',
+        
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'红包雨',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/6a47987724428b958e804d0141013a7e/index.html',
+       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'选择引导',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/089759a2bab2c98527d0b9cffd0011a3/index.html',
+       
+    },
+    {
+        id:randomStr(),
+        product:'番茄小说',
+        type:'章节阅读',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/d7d4e10c079d59e69522618f18d82ff5/index.html',
+       
+    },
+    {
+        id:randomStr(),
+        product:'火山lite',
+        type:'直播',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/50c345da57d94261d0ce058b3f17bc59/index.html',
+        
+    },
+    {
+        id:randomStr(),
+        product:'交友',
+        type:'左右滑动',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/2a8e9aadcc424c1403566c892a37690b/index.html',
+        
+    },
+    {
+        id:randomStr(),
+        product:'交友',
+        type:'拖拽',
+        link:'https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/playable/4e27c032be3d828dbfe9e2dd1c469c4d/index.html',
+        
+    },
+    
+]
+
+export default playerList

+ 238 - 0
src/views/playerPart/playerList.vue

@@ -0,0 +1,238 @@
+<template>
+    <div class="playerList">
+        <div class="top">
+            <div class="playBody">
+                <div class="box">
+                    <div class="byted-card byted-card-inner-line byted-card-bordered css-deu8f5" v-for="(item) in playerList" :key="item.id">
+                        <div class="byted-card-body">
+                            <div class="media">
+                                <div class="main_img">
+                                    <img src="https://sf3-ttcdn-tos.pstatp.com/obj/union-fe/tmpl/file/2020082420341062812025.png" alt="图片加载失败">
+                                </div>
+                                <div class="hoverBody">
+                                    <div class="blackBG">
+                                        <a-button type="primary" @click="preview(item)">弹窗预览</a-button>
+                                    </div>
+                                </div>
+                            </div>
+                            <div >
+                                <h5 class="css-1lrzuem">
+                                    <span class="tip">{{item.product}}</span>
+                                    {{item.type}}
+                                </h5>
+                                <div class="css-vfnok7"></div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="previewBody" v-show="previewBody">
+            <div class="content">
+                <div class="content-inner">
+                    <div class="phone">
+                        <iframe :src="playerSrc" width="274" height="487" frameborder="0"></iframe>
+                    </div>
+                    <a-button type='default' @click="closePreview" size='large' class="closePreviewBtn">关闭预览</a-button>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import playerList from './playerData'; 
+
+console.log(playerList)
+
+export default {
+    data() {
+        return {
+            playerList,
+            previewBody:false,
+            playerSrc:'',
+        }
+    },
+    methods:{
+        preview(item){
+            console.log(item);
+            this.previewBody=true;
+            this.playerSrc=item.link
+        },
+        closePreview(){
+            this.previewBody=false;
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.playerList{
+    
+    position: relative;
+    .top{
+        width: calc(100% - 160px);
+        margin: 0px auto;
+    }
+    .playBody{
+        width: 100%;
+        padding: 20px;
+        .box{
+            width: 100%;
+            height: 100%;
+            display: flex;
+            flex-wrap: wrap;
+            -webkit-box-pack: center;
+            justify-content: flex-start;
+            .css-deu8f5 {
+                width: 224px;
+                margin: 10px !important;
+            }
+            .byted-card-inner-line {
+                padding: 0;
+            }
+            .byted-card-bordered {
+                border: 1px solid #e0e0e0;
+                box-shadow: none;
+            }
+            .byted-card {
+                font-size: 14px;
+                line-height: 22px;
+                position: relative;
+                color: #333;
+                background: #fff;
+                box-sizing: border-box;
+                border-radius: 4px;
+                box-shadow: 0 1px 6px 0 rgba(0,0,0,.05);
+                border: 1px solid transparent;
+            }
+            .byted-card > .byted-card-body {
+                box-shadow: rgb(204, 204, 204) 0px 0px 10px;
+                padding: 0px !important;
+            }
+            .byted-card > .byted-card-body .media {
+                height: 392px;
+                width: 100%;
+                position: relative;
+                cursor: pointer;
+                overflow: hidden;
+                border-bottom: 1px solid rgb(204, 204, 204);
+            }
+            .byted-card > .byted-card-body .media .main_img {
+                width: 100%;
+                height: 100%;
+                display: flex;
+                -webkit-box-align: center;
+                align-items: center;
+                position: absolute;
+            }
+            .byted-card > .byted-card-body .media .main_img img:last-child {
+                width: 100%;
+                position: absolute;
+            }
+            .byted-card > .byted-card-body .media .main_img img:first-child {
+                width: 100%;
+                height: 100%;
+                // filter: blur(10px);
+                position: absolute;
+            }
+            .css-1lrzuem {
+                display: flex;
+                -webkit-box-align: center;
+                align-items: center;
+                font-size: 14px;
+                font-weight: 600;
+                color: rgb(51, 51, 51);
+                line-height: 20px;
+                text-shadow: rgba(0, 0, 0, 0.08) 0px 2px 8px;
+                word-break: keep-all;
+                text-overflow: ellipsis;
+                white-space: nowrap;
+                margin: 16px 16px 0px;
+                overflow: hidden;
+            }
+            .css-vfnok7 {
+                height: 40px;
+                display: flex;
+                flex-direction: row-reverse;
+                -webkit-box-align: center;
+                align-items: center;
+            }
+            .hoverBody{
+                display: none;
+                position: absolute;
+                top: 0px;
+                left: 0px;
+                width: 100%;
+                height: 100%;
+               
+            }
+            .blackBG{
+                position: absolute;
+                top: 0px;
+                left: 0px;
+                width: 100%;
+                height: 100%;
+                display: flex;
+                -webkit-box-align: center;
+                align-items: center;
+                -webkit-box-pack: center;
+                justify-content: center;
+                background-color: rgba(0, 0, 0, 0.5);
+
+            }
+            .byted-card:hover {
+                box-shadow: rgb(153, 153, 153) 0px 0px 20px;
+            }
+            .byted-card:hover .hoverBody{
+                display: block;
+            }
+            .tip{
+                display: inline-block;
+                margin-right: 15px;
+                background: #FF6633;
+                width: 80px;
+                padding: 2px 10px;
+                text-align: center;
+                border-radius: 10px;
+            }
+        }
+    }
+    .previewBody{
+        background: rgba(0,0,0,.5);
+        position: absolute;
+        top: 0;
+        left: 0;
+        padding: 20px 80px;
+        width: 100%;
+        height: 100%;
+        .content{
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            height: 100%;
+        }
+        .content-inner{
+            font-size: 14px;
+            line-height: 22px;
+            padding: 0 24px 8px;
+            color: #666;
+            text-align: center;
+            position: fixed;
+            top: 200px;
+        }
+        .phone {
+            background-color: rgb(255, 255, 255);
+            position: relative;
+            padding: 9px 8px 7px;
+            border-radius: 24px;
+        }
+        .phone iframe {
+            border-radius: 18px;
+        }
+        .closePreviewBtn{
+            margin-top: 30px;
+        }
+    }
+}
+</style>

+ 5 - 5
src/views/user/Login.vue

@@ -8,14 +8,14 @@
     <a-form :form="form" class="user-layout-login" ref="formLogin" id="formLogin">
       <a-tabs :activeKey="customActiveKey" :tabBarStyle="{ textAlign: 'center', borderBottom: 'unset' }"
         @change="handleTabClick">
-        <a-tab-pane key="tab1" tab="企业微信扫码登录">
+        <!-- <a-tab-pane key="tab1" tab="企业微信扫码登录">
           <a-form-item>
             <div id="wx_reg" style="display:flex;justify-content: center;"></div>
             <div style="display:flex;justify-content: center;color:red;font-size:16px;">
               需先用企业微信开通过账号,方可使用企业微信登录
             </div>
           </a-form-item>
-        </a-tab-pane>
+        </a-tab-pane> -->
         <a-tab-pane key="tab2" tab="账号密码登陆">
           <a-form-item>
             <a-input size="large"
@@ -65,13 +65,13 @@
           @click.stop.prevent="handleSubmit" :disabled="loginBtn">确定
         </a-button>
       </a-form-item>
-      <div class="otherLogin" v-if="customActiveKey != 'tab1'"><span class="titleTip">其他登录方式</span></div>
+      <!-- <div class="otherLogin" v-if="customActiveKey != 'tab1'"><span class="titleTip">其他登录方式</span></div>
       <div class="feishu" @click="FSlogin" v-if="customActiveKey != 'tab1'">
         <span class="FSicon">
           <img src="@/assets/feishu.png" alt="">
         </span>
         <span class="FSinfo">使用飞书快捷登录</span>
-      </div>
+      </div> -->
       <!-- <div class="user-login-other">
         <span>其他登陆方式</span>
         <a><a-icon class="item-icon" type="alipay-circle"></a-icon></a>
@@ -148,7 +148,7 @@
     },
     data() {
       return {
-        customActiveKey: 'tab1',
+        customActiveKey: 'tab2',
         loginBtn: false,
         // login type: 0 email, 1 username, 2 telephone
         loginType: 0,

+ 10 - 5
vue.config.js

@@ -34,7 +34,6 @@ module.exports = {
       .set('@layout', resolve('src/layout'))
       .set('@static', resolve('src/static'))
   },
-
   css: {
     loaderOptions: {
       less: {
@@ -53,7 +52,10 @@ module.exports = {
   },
 
   devServer: {
+    hot:true,
+    // inline: true,
     port: 3000,
+    open : true,
     proxy: {
       '/jeecg-boot': {
         // target: 'http://192.168.1.90:8080', //请求本地 需要jeecg-boot后台项目  蒙蒙
@@ -62,14 +64,17 @@ module.exports = {
         // target: 'http://192.168.2.115:8080', //请求本地 需要jeecg-boot后台项目  祚云
         // target: 'http://192.168.1.94:8088', //请求本地 需要jeecg-boot后台项目  孙震
         // target: 'http://192.168.0.230:8088', //请求本地 需要jeecg-boot后台项目  孙震
-        // target: 'http://192.168.1.51:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
-        // target: 'http://192.168.1.165:8848', //请求本地 需要jeecg-boot后台项目  毕洁泉
-        // target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目 
+        // target: 'http://192.168.1.51:8080', //请求本地 需要jeecg-boot后台项目  毕洁泉
+
+        // target: 'http://192.168.1.51:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        // target: 'http://192.168.0.252:8098', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        // target: 'http://192.168.0.170:8088', //请求本地 需要jeecg-boot后台项目  毕洁泉
+        target: 'http://api.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目 
         // target: 'https://trac.tjyourong.com.cn', //请求本地 需要jeecg-boot后台项目 
         // target: 'http://39.106.184.70:8088/', //请求本地 需要jeecg-boot后台项目 
         // 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://118.24.244.213:8804',
 
 
         ws: false,