Ver código fonte

政策列表提测

朱鑫波 3 anos atrás
pai
commit
2a7f61549c
33 arquivos alterados com 7779 adições e 603 exclusões
  1. 3 1
      .env
  2. 8 0
      .env.development
  3. 7 0
      .env.production
  4. 16 1
      src/App.vue
  5. 245 0
      src/components/formComponents/selectAccount.vue
  6. 27 0
      src/mixins/JeecgListMixin.js
  7. 26 1
      src/mixins/videoMaterialMixin.js
  8. 8 1
      src/permission.js
  9. 2 2
      src/utils/request.js
  10. 1 1
      src/views/modules/Statistics/KSAccountReport.vue
  11. 1 2
      src/views/modules/Statistics/components/selectPagination.vue
  12. 1714 0
      src/views/modules/Statistics/kuaishouReport/accountReport.vue
  13. 1298 0
      src/views/modules/Statistics/kuaishouReport/components/selectComponent.vue
  14. 222 0
      src/views/modules/Statistics/kuaishouReport/kuaishouReport-service.js
  15. 265 0
      src/views/modules/Statistics/kuaishouReport/kuaishouReport.less
  16. 1330 0
      src/views/modules/Statistics/kuaishouReport/videoReport.vue
  17. 645 257
      src/views/modules/Statistics/materialReport/marterialDetail.vue
  18. 177 120
      src/views/modules/Statistics/materialReport/materialReport.vue
  19. 2 2
      src/views/modules/account-config/account-config-server.js
  20. 26 15
      src/views/modules/autoLaunch/channelManage/createChannel.vue
  21. 3 3
      src/views/modules/autoLaunch/configLaunchInfo.vue
  22. 188 6
      src/views/modules/creative-copywrit/creative-copywrit.vue
  23. 426 0
      src/views/modules/earlyWarningRules/configurationList.vue
  24. 276 0
      src/views/modules/earlyWarningRules/whitelist.vue
  25. 4 1
      src/views/modules/material/accountCheck.vue
  26. 22 9
      src/views/modules/material/accountCheckBytedance.vue
  27. 1 2
      src/views/modules/material/comment/selectTable.vue
  28. 436 157
      src/views/modules/material/videoMaterial.vue
  29. 2 2
      src/views/modules/policy-management/policy-management-server.js
  30. 13 2
      src/views/modules/policy-management/policy-management.less
  31. 321 16
      src/views/modules/policy-management/policy-management.vue
  32. 62 0
      src/warterMark.js
  33. 2 2
      vue.config.js

+ 3 - 1
.env

@@ -1 +1,3 @@
-VUE_APP_BASE_API_URL = http://118.24.244.213:3030
+#音乐调用接口地址
+VUE_APP_BASE_API_URL = http://118.24.244.213:3030
+

+ 8 - 0
.env.development

@@ -0,0 +1,8 @@
+#音乐调用接口地址
+VUE_APP_BASE_API_URL = http://118.24.244.213:3030
+
+#账户报表/素材报表接口地址
+VUE_APP_BASE_REPORT_URL = http://api.tjyourong.com.cn/reportModule
+# 测试地址 http://gateway.tjyourong.com.cn
+# 线上地址 http://api.tjyourong.com.cn
+# 宋英豪 http://192.168.1.67:9999

+ 7 - 0
.env.production

@@ -0,0 +1,7 @@
+#音乐调用接口地址
+VUE_APP_BASE_API_URL = http://118.24.244.213:3030
+
+#账户报表/素材报表接口地址
+VUE_APP_BASE_REPORT_URL = http://api.tjyourong.com.cn/reportModule
+# 测试地址 http://gateway.tjyourong.com.cn
+# 线上地址 http://api.tjyourong.com.cn

+ 16 - 1
src/App.vue

@@ -1,7 +1,7 @@
 <template>
   <a-locale-provider :locale="locale">
     <div id="app">
-      <router-view />
+      <router-view v-if="isRouterAlive"/>
       <audio ref="mmPlayer"></audio>
     </div>
   </a-locale-provider>
@@ -10,10 +10,17 @@
 import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
 import enquireScreen from '@/utils/device'
 import { mapGetters, mapMutations, mapActions } from 'vuex'
+
 export default {
+  provide(){
+    return {
+      reload:this.reload
+    }
+  },
   data() {
     return {
       locale: zhCN,
+      isRouterAlive:true
     }
   },
   created() {
@@ -36,6 +43,7 @@ export default {
 
     this.$nextTick(() => {
       this.setAudioele(this.$refs.mmPlayer)
+
     })
   },
   methods: {
@@ -45,6 +53,13 @@ export default {
       setCurrentIndex: 'SET_CURRENTINDEX',
       setAudioele: 'SET_AUDIOELE',
     }),
+    ...mapGetters(['userInfo']),
+    reload(){
+      this.isRouterAlive = false
+      this.$nextTick(()=>{
+        this.isRouterAlive = true
+      })
+    }
   },
 }
 </script>

+ 245 - 0
src/components/formComponents/selectAccount.vue

@@ -0,0 +1,245 @@
+<style lang="scss" scoped>
+.select-project {
+    width: 50%;
+}
+::v-deep.vue-treeselect__control {
+    line-height: 20px !important;
+}
+</style>
+<template>
+    <div class="select-project">
+        <treeselect
+            :multiple="multiple"
+            :disable-branch-nodes="!multiple"
+            :disable-fuzzy-matching="true"
+            :options="options"
+            :load-options="loadOptions"
+            placeholder="请选择项目以及账户"
+            v-model="selectedVal"
+            :value-consists-of="valueConsistsOf"
+            :auto-load-root-options="false"
+            @select="update"
+            @deselect="unUpdate"
+            @input="emitValue"
+            :limit="limit"
+            :default-options="true"
+            :disabled="disabled"
+            :limitText="
+                count => {
+                    return '隐藏' + count + '条'
+                }
+            "
+            noChildrenText="该项目下暂无账号"
+            :noOptionsText="showLoading"
+        />
+    </div>
+</template>
+
+<script>
+import Treeselect from '@riophae/vue-treeselect' // 引用树组件
+import '@riophae/vue-treeselect/dist/vue-treeselect.css' //树组件样式
+import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' //树组件参数
+import { mapGetters } from 'vuex'
+// We just use `setTimeout()` here to simulate an async operation
+// instead of requesting a real API server for demo purpose.
+export default {
+    data: () => ({
+        valueConsistsOf: 'LEAF_PRIORITY',
+        options: [],
+        showLoading: 'loading...',
+        selectRightData: []
+    }),
+    props: {
+        value: {
+            type: [Number, Array, String],
+            default() {
+                return undefined
+            }
+        },
+        //是否展示一个默认值
+        oneData: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        //是否多选
+        multiple: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        //判断媒体类型  kuaishou/bytedance
+        type: {
+            type: String,
+            default() {
+                return 'kuaishou'
+            }
+        },
+        //请求接口  process.env.VUE_APP_BASE_REPORT_URL为配置的全局变量
+        reqUrl: {
+            type: String,
+            default() {
+                return process.env.VUE_APP_BASE_REPORT_URL + '/material/report/getProjectAccountByUserId'
+            }
+        },
+        // 展示条数
+        limit: {
+            type: Number,
+            default() {
+                return 2
+            }
+        },
+        //是否禁用
+        disabled: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        }
+    },
+    components: {
+        Treeselect
+    },
+    computed: {
+        selectedVal: {
+            get: function() {
+                return this.value
+            },
+            set: function(val) {
+                this.$nextTick(() => {
+                    this.$emit('input', val)
+                    this.$emit('change', val)
+                    this.$emit('value')
+                })
+            }
+        }
+    },
+    watch: {},
+    methods: {
+        ...mapGetters(['userInfo']),
+        update(node, id) {
+            if (node.id == 'all') {
+                this.node(this.options)
+                this.$nextTick(() => {
+                    this.selectedVal = this.selectRightData.map(item => {
+                        return item.id
+                    })
+                })
+            }
+        },
+        unUpdate(node, id) {
+            if (node.id == 'all') {
+                this.$nextTick(() => {
+                    this.selectedVal = []
+                    this.selectRightData = []
+                })
+            } else {
+                let index = this.selectedVal.findIndex(item => item == 'all')
+                this.$nextTick(() => {
+                    this.selectedVal.splice(index, 1)
+                })
+            }
+        },
+        node(data) {
+            data.forEach(item => {
+                if (item.children) {
+                    this.node(item.children)
+                } else {
+                    if (this.selectRightData.findIndex(i => i.id == item.id) == -1) {
+                        this.selectRightData.push(item)
+                    }
+                }
+            })
+        },
+        emitValue() {},
+        loadOptions({ action, parentNode, callback }) {
+            // Typically, do the AJAX stuff here.
+            // Once the server has responded,
+            // assign children options to the parent node & call the callback.
+            if (action === LOAD_CHILDREN_OPTIONS) {
+            }
+        },
+        //获取数据
+        getParticipateList() {
+            //   toutiaoParticipateList
+            var params = {}
+            params.userId = this.userInfo().id
+            params.type = this.type
+            this.postDataAction(this.reqUrl, params).then(res => {
+                if (res.success) {
+                    this.options = res.data
+                        ? res.data.map(item => {
+                              return {
+                                  id: item.projectId + 'projectId',
+                                  label: item.projectName,
+                                  children: item.accountList
+                                      ? item.accountList.map(c => {
+                                            return {
+                                                id: c.accountId,
+                                                label:
+                                                    (c.userName && c.userName.length == 2
+                                                        ? c.userName + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'
+                                                        : c.userName && c.userName.length == 3
+                                                        ? c.userName + '\xa0\xa0\xa0\xa0'
+                                                        : c.userName) +
+                                                    '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                                                    c.accountId +
+                                                    '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                                                    c.authName
+                                            }
+                                        })
+                                      : []
+                              }
+                          })
+                        : res.result.map(item => {
+                              return {
+                                  id: item.projectId + 'projectId',
+                                  label: item.projectName,
+                                  children: item.accountList
+                                      ? item.accountList.map(c => {
+                                            return {
+                                                id: c.accountId,
+                                                label:
+                                                    (c.userName && c.userName.length == 2
+                                                        ? c.userName + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'
+                                                        : c.userName && c.userName.length == 3
+                                                        ? c.userName + '\xa0\xa0\xa0\xa0'
+                                                        : c.userName) +
+                                                    '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                                                    c.accountId +
+                                                    '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0' +
+                                                    c.authName
+                                            }
+                                        })
+                                      : []
+                              }
+                          })
+                    if (this.multiple) {
+                        this.options.unshift({ id: 'all', label: '全选' })
+                    }
+
+                    if (this.oneData) {
+                        this.$nextTick(() => {
+                            if (this.multiple) {
+                                this.selectedVal.push(this.options[0].children[0].id)
+                            } else {
+                                this.selectedVal = this.options[0].children[0].id
+                            }
+                        })
+
+                        // this.value = this.options[0].children[0].id
+                        // this.$emit('input', this.options[0].children[0].id)
+                        // this.$emit('change', this.options[0].children[0].id)
+                    }
+                }
+            })
+        }
+    },
+
+    created() {
+        this.getParticipateList()
+    }
+}
+</script>

+ 27 - 0
src/mixins/JeecgListMixin.js

@@ -94,6 +94,7 @@ export const JeecgListMixin = {
         }
     },
     async loadData(arg) {
+      this.cancel()
       this.spinning= true
       this.dataSource = []
       if (!this.url.list) {
@@ -114,6 +115,32 @@ export const JeecgListMixin = {
       if(params.stateDate){
         params.stateDate = moment(params.stateDate).format('YYYY-MM-DD')
       }
+
+      if(params.videoStatus == 0){
+        params.syncKuaishou = null
+        params.syncBytedance = null
+      }else if(params.videoStatus == 1){
+        params.syncKuaishou = 1
+        params.syncBytedance = 1
+      }else if(params.videoStatus == '2'){
+        params.syncKuaishou = 1
+        params.syncBytedance = null
+      }else if(params.videoStatus == 3){
+        params.syncKuaishou = null
+        params.syncBytedance = 1
+      }else if(params.videoStatus == 4){
+        params.syncKuaishou = 2
+        params.syncBytedance = null
+      }else if(params.videoStatus == 5){
+        params.syncKuaishou = null
+        params.syncBytedance = 2
+      }else if(params.videoStatus == 6){
+        params.syncKuaishou = 2
+        params.syncBytedance = 2
+      }else{
+        params.syncKuaishou = null
+        params.syncBytedance = null
+      }
       // if(params.endDate){
       //   params.endDate = moment(params.endDate).format('YYYY-MM-DD')
       // }

+ 26 - 1
src/mixins/videoMaterialMixin.js

@@ -94,6 +94,7 @@
          }
      },
      async loadData(arg) {
+       this.cancel()
        this.spinning= true
        this.dataSource = []
        if (!this.url.list) {
@@ -117,7 +118,31 @@
        // if(params.endDate){
        //   params.endDate = moment(params.endDate).format('YYYY-MM-DD')
        // }
- 
+       if(params.videoStatus == 0){
+        params.syncKuaishou = null
+        params.syncBytedance = null
+      }else if(params.videoStatus == 1){
+        params.syncKuaishou = 1
+        params.syncBytedance = 1
+      }else if(params.videoStatus == '2'){
+        params.syncKuaishou = 1
+        params.syncBytedance = null
+      }else if(params.videoStatus == 3){
+        params.syncKuaishou = null
+        params.syncBytedance = 1
+      }else if(params.videoStatus == 4){
+        params.syncKuaishou = 2
+        params.syncBytedance = null
+      }else if(params.videoStatus == 5){
+        params.syncKuaishou = null
+        params.syncBytedance = 2
+      }else if(params.videoStatus == 6){
+        params.syncKuaishou = 2
+        params.syncBytedance = 2
+      }else{
+        params.syncKuaishou = null
+        params.syncBytedance = null
+      }
        this.loading = true;
        await getAction(this.url.list, params).then((res) => {
          if (res.success) {

+ 8 - 1
src/permission.js

@@ -6,7 +6,8 @@ import 'nprogress/nprogress.css' // progress bar style
 import notification from 'ant-design-vue/es/notification'
 import { ACCESS_TOKEN } from '@/store/mutation-types'
 import { generateIndexRouter } from "@/utils/util"
-
+import warterMark from './warterMark'
+import { mapGetters, mapMutations, mapActions } from 'vuex'
 NProgress.configure({ showSpinner: false }) // NProgress Configuration
 
 
@@ -22,9 +23,11 @@ router.beforeEach((to, from, next) => {
     /* has token */
 
     if (to.path === '/user/login') {
+      warterMark.out()
       next({ path: '/dashboard/workplace' })
       NProgress.done()
     } else {
+      // warterMark.set(store.getters.userInfo.roleName)
       if (store.getters.permissionList.length === 0) {
         store.dispatch('GetPermissionList').then(res => {
           const menuData = res.result.menu;
@@ -54,19 +57,23 @@ router.beforeEach((to, from, next) => {
                message: '系统提示',
                description: '请求用户信息失败,请重试!'
              })*/
+            warterMark.out()
             store.dispatch('Logout').then(() => {
               next({ path: '/user/login', query: { redirect: to.fullPath } })
             })
           })
       } else {
+        warterMark.set(store.getters.userInfo.realname)
         next()
       }
     }
   } else {
     if (whiteList.indexOf(to.path) !== -1) {
       // 在免登录白名单,直接进入
+      // warterMark.set(store.getters.userInfo.roleName)
       next()
     } else {
+      warterMark.out()
       next({ path: '/user/login', query: { redirect: to.fullPath } })
       NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
     }

+ 2 - 2
src/utils/request.js

@@ -20,8 +20,8 @@ else if (process.env.NODE_ENV === 'debug') {
 }
 else if (process.env.NODE_ENV === 'production') {
 	// axios.defaults.baseURL = 'http://apipre.tjyourong.com.cn/jeecg-boot'; // 预生产
-	// axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot';//测试
-	axios.defaults.baseURL = 'http://api.tjyourong.com.cn/jeecg-boot'; // 生产环境
+	axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot';//测试
+	// axios.defaults.baseURL = 'http://api.tjyourong.com.cn/jeecg-boot'; // 生产环境
 	// axios.defaults.baseURL = 'http://gateway.tjyourong.com.cn/jeecg-boot'; // 生产环境
 
 }

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

@@ -151,7 +151,7 @@
                   日期选择具体某一天之后,这里可以查看具体的时间段数据哦~
                 </template>
                 <!-- v-show="dateValue[0].format('YYYY-MM-DD')==dateValue[1].format('YYYY-MM-DD')" -->
-                  <a-select  placeholder="请选择具体时间段" style="width: 160px" @change="timeChange"  v-model='timeDefaultValue'  label-in-value class="selectTime" v-show="dateValue[1].format('YYYY-MM-DD')==moment().format('YYYY-MM-DD')" :disabled='accountId.length==0'>
+                  <a-select  placeholder="请选择具体时间段" style="width: 160px" @change="timeChange"  v-model='timeDefaultValue'  label-in-value class="selectTime" v-show="dateValue[1].format('YYYY-MM-DD')==moment().format('YYYY-MM-DD')">
                     <a-select-option v-for="(i,index) in 24 " :key="index" :value="index" >{{index>=10 ? `00:00-${index}:59` :`00:00-0${index}:59`}}</a-select-option>
                   </a-select>
               </a-tooltip>

+ 1 - 2
src/views/modules/Statistics/components/selectPagination.vue

@@ -47,7 +47,7 @@
   >
     <a-input
       placeholder="请选择项目名称"
-      @focus="topMiddle = true"
+      @focus="topMiddle = true;getData(productId)"
       v-model="keyValue"
       @change="getData(productId)"
       :disabled="disabled"
@@ -285,7 +285,6 @@ export default {
       this.topMiddle = false
       if(!!!this.projectId){
         this.keyValue = ''
-        this.getData(this.productId)
       }
     },
     // allData() {

Diferenças do arquivo suprimidas por serem muito extensas
+ 1714 - 0
src/views/modules/Statistics/kuaishouReport/accountReport.vue


Diferenças do arquivo suprimidas por serem muito extensas
+ 1298 - 0
src/views/modules/Statistics/kuaishouReport/components/selectComponent.vue


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

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

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

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

Diferenças do arquivo suprimidas por serem muito extensas
+ 1330 - 0
src/views/modules/Statistics/kuaishouReport/videoReport.vue


Diferenças do arquivo suprimidas por serem muito extensas
+ 645 - 257
src/views/modules/Statistics/materialReport/marterialDetail.vue


+ 177 - 120
src/views/modules/Statistics/materialReport/materialReport.vue

@@ -239,9 +239,21 @@
 					</a-card>
 				</a-col>
 			</a-row>
+		</a-spin>
+		<a-spin :spinning="spinningChart">
 			<a-row :gutter="24" style="margin-top: 20px" id="getWidth">
 				<a-col :xl="18">
 					<a-card title="数据趋势" style="width: 100%" :bordered="false">
+						<a-tabs v-model="active" @change="callback">
+							<a-tab-pane key="cost" tab="消耗">
+							</a-tab-pane>
+							<a-tab-pane key="active" tab="激活数">
+							</a-tab-pane>
+							<a-tab-pane key="aclick" tab="曝光数">
+							</a-tab-pane>
+							<!-- <a-tab-pane key="play_duration_3s" tab="3S播放率">
+							</a-tab-pane> -->
+						</a-tabs>
 						<div class="echart">
 							<div class="echartBody">
 								<div
@@ -261,6 +273,16 @@
 				</a-col>
 				<a-col :xl="6">
 					<a-card title="标签占比" style="width: 100%" :bordered="false">
+						<a-tabs v-model="active" @change="callback" style="visibility:hidden;">
+							<a-tab-pane key="cost" tab="消耗">
+							</a-tab-pane>
+							<a-tab-pane key="active" tab="激活数">
+							</a-tab-pane>
+							<a-tab-pane key="aclick" tab="曝光数">
+							</a-tab-pane>
+							<a-tab-pane key="play_duration_3s" tab="3S播放率">
+							</a-tab-pane>
+						</a-tabs>
 						<div class="echart">
 							<div class="echartBody">
 								<a-empty style="height: 350px; position: relative" />
@@ -276,118 +298,119 @@
 					</a-card>
 				</a-col>
 			</a-row>
-			<a-row :gutter="24" style="margin-top: 20px">
-				<a-col :xl="12">
-					<a-card title="top素材排行榜" style="width: 100%; min-height: 700px" :bordered="false">
-						<a-radio-group
-							v-if="mediaDimension === 'b'"
-							v-model="materialRankValue"
-							style="margin-bottom: 15px;"
-							@change="handleMaterialRanking"
-						>
-							<a-radio-button :value="0">内部</a-radio-button>
-							<a-radio-button :value="1">素造</a-radio-button>
-						</a-radio-group>
-						<a slot="extra" @click="getMoreVideoList">查看更多</a>
-						<div v-if="!signatureStatus && videoList.length > 0">
-							<ul class="top-ul-style">
-								<li v-for="(item, index) in videoList" :key="item.signature">
-									<div style="display: flex; position: relative; width: 80%; cursor: pointer">
-										<span style="position: absolute; top: 50%; width: 40px; height: 40px; margin-top: -20px">
-											<img :src="require('./image/' + (index + 1) + '.png')" alt="" style="width: 25px; height: auto"/>
-										</span>
+		</a-spin>
+		<a-row :gutter="24" style="margin-top: 20px">
+			<a-col :xl="12">
+				<a-card title="top素材排行榜" style="width: 100%; min-height: 700px" :bordered="false">
+					<a-radio-group
+						v-if="mediaDimension === 'b'"
+						v-model="materialRankValue"
+						style="margin-bottom: 15px;"
+						@change="handleMaterialRanking"
+					>
+						<a-radio-button :value="0">内部</a-radio-button>
+						<a-radio-button :value="1">素造</a-radio-button>
+					</a-radio-group>
+					<a slot="extra" @click="getMoreVideoList">查看更多</a>
+					<div v-if="!signatureStatus && videoList.length > 0">
+						<ul class="top-ul-style">
+							<li v-for="(item, index) in videoList" :key="item.signature">
+								<div style="display: flex; position: relative; width: 80%; cursor: pointer">
+									<span style="position: absolute; top: 50%; width: 40px; height: 40px; margin-top: -20px">
+										<img :src="require('./image/' + (index + 1) + '.png')" alt="" style="width: 25px; height: auto"/>
+									</span>
+									<div
+										style="
+										width: 25%;
+										height: 100%;
+										text-align: center;
+										background: #f2f2f2;
+										margin-left: 40px;
+										border-radius: 5px;
+										position: relative;
+										"
+									>
 										<div
-											style="
-											width: 25%;
-											height: 100%;
-											text-align: center;
-											background: #f2f2f2;
-											margin-left: 40px;
-											border-radius: 5px;
-											position: relative;
+											:style="{
+												backgroundImage: 'url(' + (item.coverUrl || noImg) + ')',
+												backgroundSize: 'cover',
+												backgroundRepeat: 'no-repeat',
+												backgroundPosition: 'center center',
+												overflow: 'hidden',
+												position: 'absolute',
+												top: '0',
+												zIndex: '0',
+											}"
+											class="showShare bg"
+											@click="
+												visibleVideo = true
+												videoUrlShow = item.url
 											"
 										>
-											<div
-												:style="{
-													backgroundImage: 'url(' + (item.coverUrl || noImg) + ')',
-													backgroundSize: 'cover',
-													backgroundRepeat: 'no-repeat',
-													backgroundPosition: 'center center',
-													overflow: 'hidden',
-													position: 'absolute',
-													top: '0',
-													zIndex: '0',
-												}"
-												class="showShare bg"
-												@click="
-													visibleVideo = true
-													videoUrlShow = item.url
-												"
-											>
-											</div>
-											<img
-												:src="item.coverUrl || noImg"
-												style="width: auto; height: 100%; max-width: 100%; position: relative; z-index: 2"
-												srcset=""
-												@click="
-													visibleVideo = true
-													videoUrlShow = item.url
-												"
-											/>
-										</div>
-										<div
-											style="display: flex; flex-flow: column; justify-content: space-between; width: 60%"
-											@click.stop="toDetail(item.signature)"
-										>
-											<p style="margin-left: 10px; color: #1890ff">
-												{{ item.materialName ? item.materialName : '无素材名称' }}
-											</p>
-											<p v-if="item.tag" style="margin-left: 10px; margin-bottom: 0">
-												<a-tag
-													v-for="(items, val) in item.tag.split(',')"
-													:key="val + 1"
-													style="margin-right: 5px"
-													v-if="val <= 3"
-												>
-													{{ items }}
-												</a-tag>
-											</p>
 										</div>
+										<img
+											:src="item.coverUrl || noImg"
+											style="width: auto; height: 100%; max-width: 100%; position: relative; z-index: 2"
+											srcset=""
+											@click="
+												visibleVideo = true
+												videoUrlShow = item.url
+											"
+										/>
 									</div>
-									<div class="li-cost">
-										<span>消耗</span>
-										<span>{{ (item.charge ? item.charge : item.cost) | decimalsHandle }}</span>
+									<div
+										style="display: flex; flex-flow: column; justify-content: space-between; width: 60%"
+										@click.stop="toDetail(item.signature)"
+									>
+										<p style="margin-left: 10px; color: #1890ff">
+											{{ item.materialName ? item.materialName : '无素材名称' }}
+										</p>
+										<p v-if="item.tag" style="margin-left: 10px; margin-bottom: 0">
+											<a-tag
+												v-for="(items, val) in item.tag.split(',')"
+												:key="val + 1"
+												style="margin-right: 5px"
+												v-if="val <= 3"
+											>
+												{{ items }}
+											</a-tag>
+										</p>
 									</div>
-								</li>
-							</ul>
-						</div>
-						<a-empty v-else-if="!signatureStatus && videoList.length === 0" style="margin-top: 20%"/>
-						<div v-else style="height: 200px;line-height: 200px;text-align: center;">
-							<a-spin/>
-						</div>
-					</a-card>
-				</a-col>
-				<a-col :xl="12">
-					<a-card title="top设计排行榜" style="width: 100%; min-height: 700px" :bordered="false">
-						<a-radio-group v-model="designRankingValue" style="margin-bottom: 15px;" @change="handleDesignRanking">
-							<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-group>
-						<a-table
-							:columns="columns"
-							:data-source="designTopList"
-							:loading="designTopLoading"
-							:pagination="false"
-							bordered
-							size="middle"
-						>
-							<span slot="cost" slot-scope="text, records">{{ text | decimalsHandle }}</span>
-						</a-table>
-					</a-card>
-				</a-col>
-			</a-row>
-		</a-spin>
+								</div>
+								<div class="li-cost">
+									<span>消耗</span>
+									<span>{{ (item.charge ? item.charge : item.cost) | decimalsHandle }}</span>
+								</div>
+							</li>
+						</ul>
+					</div>
+					<a-empty v-else-if="!signatureStatus && videoList.length === 0" style="margin-top: 20%"/>
+					<div v-else style="height: 200px;line-height: 200px;text-align: center;">
+						<a-spin/>
+					</div>
+				</a-card>
+			</a-col>
+			<a-col :xl="12">
+				<a-card title="top设计排行榜" style="width: 100%; min-height: 700px" :bordered="false">
+					<a-radio-group v-model="designRankingValue" style="margin-bottom: 15px;" @change="handleDesignRanking">
+						<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-group>
+					<a-table
+						:columns="columns"
+						:data-source="designTopList"
+						:loading="designTopLoading"
+						:pagination="false"
+						bordered
+						size="middle"
+					>
+						<span slot="cost" slot-scope="text, records">{{ text | decimalsHandle }}</span>
+					</a-table>
+				</a-card>
+			</a-col>
+		</a-row>
+
 		<a-modal title="查看视频" v-model="visibleVideo" :width="400" :footer="null">
 			<video class="video" :src="videoUrlShow" controls="controls" style="width: 100%">
 				您的浏览器不支持 video 标签。
@@ -439,6 +462,7 @@ export default {
 	},
 	data() {
 		return {
+			active:'cost',
 			timeShowEchartsStatus: true,
 			signatureStatus: false,
 			materialReportCardList: {},
@@ -452,6 +476,7 @@ export default {
 			videoUrlShow: '',
 			cost: '0',
 			spinning: false,
+			spinningChart:false,
 			loading: false,
 			chartList: [],
 			videoList: [],
@@ -699,13 +724,16 @@ export default {
 		},
 		getData() {
 			this.spinning = true
+			this.spinningChart = true
+			this.active = 'cost'
+			this.getAccountIndexData()
+			this.getPopularVideoData()
+			this.getChartDataList()
+			this.getVideoTopList()
+			this.getDesignTopList()
 			Promise.all([
 				this.getSumData(),
-				this.getAccountIndexData(),
-				this.getPopularVideoData(),
-				this.getChartDataList(),
-				this.getVideoTopList(),
-				this.getDesignTopList()
+			
 			]).then(res => {
 				this.spinning = false;
 				this.resetLoading = false;
@@ -714,10 +742,10 @@ export default {
 				this.spinning = false;
 				this.resetLoading = false;
 				this.searchLoading = false;
-				this.$error({
-					title: '页面数据加载出错',
-					content: '请刷新重试或联系管理员查询'
-				});
+				// this.$error({
+				// 	title: '页面数据加载出错',
+				// 	content: '请刷新重试或联系管理员查询'
+				// });
 			});
 		},
 		getProjectList() {
@@ -862,6 +890,9 @@ export default {
 				});
 			});
 		},
+		callback(){
+			this.initEchart('echart', this.handlerEchartOption(this.chartList, this.active));
+		},
 		getChartDataList() {
 			return new Promise((resolve, reject) => {
 				this.postDataAction('/overView/chartData', {
@@ -870,6 +901,7 @@ export default {
 					endDate: this.dateValue.length == 2 ? moment(this.dateValue[1]).format('YYYY-MM-DD') : null,
 					projects: this.dataDimensionValue
 				}).then(res => {
+					this.spinningChart = false
 					if (res.success) {
 						this.chartList = res.result;
 						if (res.result.length == 0) {
@@ -877,7 +909,7 @@ export default {
 							myChart.dispose();
 						}
 						else {
-							this.initEchart('echart', this.handlerEchartOption(res.result));
+							this.initEchart('echart', this.handlerEchartOption(res.result, 'cost'));
 						}
 						resolve(res.result);
 					} else {
@@ -947,6 +979,9 @@ export default {
 				if (res.success) {
 					this.designTopLoading = false;
 					this.designTopList = res.result;
+				}else{
+					this.designTopLoading = false;
+					this.$message.error(this.message)
 				}
 			});
 		},
@@ -996,7 +1031,7 @@ export default {
 				});
 			}
 		},
-		handlerEchartOption(data) {
+		handlerEchartOption(data, typeShow) {
 			let option = {
 				noDataLoadingOption: {
 					text: '暂无数据',
@@ -1008,7 +1043,15 @@ export default {
 					}
 				},
 				tooltip: {
-					trigger: 'axis'
+					trigger: 'axis',
+					// formatter: function(params) {
+					// 	if(typeShow == 'play_duration_3s'){
+					// 		return `${params[0].marker}${params[0].name}<br/>${params[0].seriesName}:${params[0].value}%`
+					// 	}else{
+					// 		return `${params[0].marker}${params[0].name}<br/>${params[0].seriesName}:${params[0].value}`
+					// 	}
+					
+					// },
 				},
 				grid: {
 					left: '3%',
@@ -1066,11 +1109,25 @@ export default {
 				series: [
 					{
 						smooth: true,
-						name: '消耗',
+						name: typeShow == 'cost'?'消耗':typeShow == 'aclick'?'曝光数':typeShow == 'active'?'激活数':'3S播放率',
 						type: 'line',
 						stack: '总量',
 						data: data.map(item => {
-							return item.cost.toFixed(3);
+							switch (typeShow) {
+								case 'cost':
+									return item.cost.toFixed(3);
+									break;
+								case 'aclick':
+									return item.aclick
+									break;
+								case 'active':
+									return item.active
+									break;           
+								case 'play_duration_3s':
+									return item.play_duration_3s.slice(0,item.play_duration_3s.length-1)
+									break;
+							}
+							
 						}),
 						symbol: 'circle',
 						symbolSize: 6,

+ 2 - 2
src/views/modules/account-config/account-config-server.js

@@ -3,8 +3,8 @@
  * @author jiayufei
  */
 
-// export const urlAcount = 'http://118.24.244.213:8808'; // 线上
+export const urlAcount = 'http://118.24.244.213:8808'; // 线上
 // export const urlAcount = 'http://apipre.tjyourong.com.cn'; // 预生产
 // export const urlAcount = 'http://192.168.1.43:8808'; // 子安
-export const urlAcount = 'http://139.186.165.84:8808'; // 测试
+// export const urlAcount = 'http://139.186.165.84:8808'; // 测试
 // export const urlAcount = 'http://192.168.1.8:8080'; // 学超

+ 26 - 15
src/views/modules/autoLaunch/channelManage/createChannel.vue

@@ -330,7 +330,17 @@ li.chouzhen.first:before {
                                                 ]"
                                                 :precision="0"
                                                 :min="1"
-                                                :max="100"
+                                                :max="
+                                                    getFormData('numberLength') == 0
+                                                        ? 999999
+                                                        : getFormData('numberLength') == 3
+                                                        ? 999
+                                                        : getFormData('numberLength') == 4
+                                                        ? 9999
+                                                        : getFormData('numberLength') == 5
+                                                        ? 99999
+                                                        : 999999
+                                                "
                                             />
                                             ~
                                             <a-input-number
@@ -349,7 +359,17 @@ li.chouzhen.first:before {
                                                 @blur="numberMaxCheck"
                                                 :precision="0"
                                                 :min="1"
-                                                :max="100"
+                                                :max="
+                                                    getFormData('numberLength') == 0
+                                                        ? 999999
+                                                        : getFormData('numberLength') == 3
+                                                        ? 999
+                                                        : getFormData('numberLength') == 4
+                                                        ? 9999
+                                                        : getFormData('numberLength') == 5
+                                                        ? 99999
+                                                        : 999999
+                                                "
                                             />
                                         </a-form-item>
                                     </a-col>
@@ -420,16 +440,7 @@ li.chouzhen.first:before {
                                 <a-row :gutter="16">
                                     <a-col :span="16">
                                         <a-form-item label="调起链接">
-                                            <a-input
-                                                v-decorator="[
-                                                    'schemaUri',
-                                                    {
-                                                        rules: [{ validator: handleConfirmValueOkUndefind }]
-                                                    }
-                                                ]"
-                                                allow-clear
-                                                id="schemaUri"
-                                            />
+                                            <a-input v-decorator="['schemaUri']" allow-clear id="schemaUri" />
                                         </a-form-item>
                                         <a-form-item
                                             v-bind="tailFormItemLayout"
@@ -736,12 +747,12 @@ export default {
         getChangeAll(type, form, field) {
             var node = document.getElementById(field)
             var v = ''
-            if (field == 'channelName'||field == 'channelCode') {
+            if (field == 'channelName' || field == 'channelCode') {
                 v = '-{{' + type + '}}-'
-            }else{
+            } else {
                 v = '{{' + type + '}}'
             }
-            
+
             if (document.selection) {
                 //IE
                 node.focus()

+ 3 - 3
src/views/modules/autoLaunch/configLaunchInfo.vue

@@ -404,7 +404,7 @@
                                                 label="素材关键字"
                                                 v-bind="formItemLayout"
                                             >
-                                                {{item.itemName}}
+                                                {{item.keyword}}
                                             </a-form-item>
                                         </a-collapse-panel>
                                     </template>
@@ -3807,7 +3807,9 @@ export default {
         },
     },
     created() {
+        //  this.postDataAction(process.env.VUE_APP_BASE_REPORT_URL+'/account/report/getProjectAccountByUserId',{type:'bytedance',userId:this.userInfo().id}).then(res=>{
 
+        // })
         if(this.$route){
             let editRecordId=this.$route.query.id;
             if(editRecordId){
@@ -3828,8 +3830,6 @@ export default {
         
         this.strategyName ='[预设]_'+ strategyNamepart+'_' + moment().format('MM_DD_hh:mm') ;
         this.getActionBarText()
-        
-        
     },
 
     filters: {

+ 188 - 6
src/views/modules/creative-copywrit/creative-copywrit.vue

@@ -383,6 +383,7 @@
                             </a-select>
                         </a-form-item>
                     </a-col>
+                    
                     <a-col :md="8" :sm="8">
                         <a-form-item label="编导">
                             <a-select
@@ -401,6 +402,33 @@
                             </a-select>
                         </a-form-item>
                     </a-col>
+                    <a-col :md="8" :sm="8" v-if="active == '1'">
+                        <a-form-item label="状态">
+                            <a-select v-model="queryParam.videoStatus">
+                                <a-select-option :value="0">
+                                    不限
+                                </a-select-option>
+                                <a-select-option :value="1">
+                                    未推送
+                                </a-select-option>
+                                <a-select-option :value="2">
+                                    未推送到快手
+                                </a-select-option>
+                                <a-select-option :value="3">
+                                    未推送到头条 
+                                </a-select-option>
+                                <a-select-option :value="4">
+                                    推送到快手
+                                </a-select-option>
+                                <a-select-option :value="5">
+                                    推送到头条
+                                </a-select-option>
+                                <a-select-option :value="6">
+                                    已推送到快手&头条 
+                                </a-select-option>
+                            </a-select>
+                        </a-form-item>
+                    </a-col>
                     <a-col :md="8" :sm="8">
                         <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
                             <a-button type="primary" @click="handleSubmit" icon="search">查询</a-button>
@@ -411,7 +439,7 @@
             </a-form>
         </div>
         <div class="table-operator" style="position: relative; z-index: 100">
-            <a-button
+            <!-- <a-button
                 @click="
                     visible = true
                     confirmLoading = false
@@ -421,7 +449,7 @@
                 icon="plus"
             >
                 新增
-            </a-button>
+            </a-button> -->
             <a-button
                 @click="onCheckAllChange"
                 v-if="
@@ -535,7 +563,7 @@
                                     </template>
                                     <img
                                         style="width: 30px; height: 30px"
-                                        v-if="items.kuaishouVideoIsUp == 1"
+                                        v-if="items.syncKuaishou == 2"
                                         :style="{ filter: items.kuaishouEffiType == 1 ? 'grayscale(0%)' : 'grayscale(100%)' }"
                                         src="@/views/modules/material/kuaishou.jpg"
                                     />
@@ -545,13 +573,13 @@
                                     <span>{{ items.toutiaoEffiType == 1 ? '抖音有效视频' : '已经同步到抖音平台' }}</span>
                                     </template>
                                     <img
-                                        v-if="items.toutiaoVideoIsUp == 1 && items.toutiaoEffiType == 1"
+                                        v-if="items.syncBytedance == 2 && items.toutiaoEffiType == 1"
                                         style="width: 30px; height: 30px; margin-left: 5px"
                                         src="@/views/modules/material/douyin.jpg"
                                         alt
                                     />
                                     <img
-                                        v-else-if="items.toutiaoVideoIsUp == 1 && items.toutiaoEffiType == 0"
+                                        v-else-if="items.syncBytedance == 2 && items.toutiaoEffiType == 0"
                                         style="width: 30px; height: 30px; margin-left: 5px"
                                         src="@/views/modules/material/douyinhui.jpg"
                                         alt
@@ -678,6 +706,7 @@
                                         </a-menu-item>
                                     </a-menu>
                                 </a-dropdown>
+                                <a v-show="active === '1'" style="margin-right: 20px" @click="handleRecord(items)">同步记录</a>
                                 <a-checkbox :value="items.id" style="float: right" v-show="active == '0' || active == '1'"></a-checkbox>
                                 <br />
                                 {{ items.createTime }}
@@ -1714,6 +1743,42 @@
                 </div>
             </div>
         </a-modal>
+        <a-modal v-model="showDataListVisible" title="信息" :footer="null">
+            <div v-if="showDataList">
+                <p v-for="(item, index) in showDataList" :key="index">
+                    素材:{{item.materialName}},{{item.message}};
+                    <br/>
+                    同步账户:{{item.ids.join()}}
+                </p>
+            </div>
+            
+        </a-modal>
+        <a-modal
+        v-if="recordDetailVisible"
+        title="素材同步记录"
+        :width="750"
+        :visible="recordDetailVisible"
+        dialog-class="usage-details-modal change-face-modal change-list-modal-show"
+        :footer="null"
+        @cancel="handleRecordCancel"
+        >
+            <div style="overflow: hidden;">	
+                <a-table
+                class="face-right-table"
+                ref="table"
+                size="middle"
+                bordered
+                :columns="recordColumns"
+                :dataSource="recordData"
+                :pagination="recordIpagination"
+                :loading="toutiaoMateriaLoading"
+                >
+                    <span slot="createTime" slot-scope="text">
+                        {{text}}
+                    </span>
+                </a-table>
+            </div>
+        </a-modal>
     </a-card>
 </template>
 <script>
@@ -1912,6 +1977,8 @@ export default {
             checkArr: [],
             checkAll: false,
             checkArrImage: [],
+            showDataList:[],
+            showDataListVisible: false,
             checkAllImage: false,
             showUrl: '',
             showUrlWater: '',
@@ -1942,7 +2009,81 @@ export default {
             waterLoading: false,
             videoTag: [],
             videoVisibleChange: '',
-            modalShowBatchList: []
+            modalShowBatchList: [],
+            recordDetailVisible:false,
+            recordSignature: null,
+            toutiaoMateriaLoading:false,
+            recordColumns:[
+                {
+                        title: '项目',
+                        align: 'center',
+                        dataIndex: 'projectName'
+                    },
+                    {
+                        title: '账户Id',
+                        align: 'center',
+                        dataIndex: 'userId',
+                customRender: function (text, records) {
+                if(records.mediaId == '1' || records.mediaId == '3') {
+                    return records.accountId
+                }else if(records.mediaId == '2' || records.mediaId == '4') {
+                    return records.userId
+                }else {
+                    return text
+                }
+                }
+                    },
+                    {
+                        title: '媒体',
+                        align: 'center',
+                        dataIndex: 'mediaId',
+                        customRender: function (text) {
+                if (text == '1' || text == '3') {
+                    return '头条'
+                } else if (text == '2' || text == '4') {
+                    return '快手'
+                } else {
+                    return text
+                }
+                }
+                    },
+                    {
+                        title: '同步人',
+                        align: 'center',
+                        dataIndex: 'userName'
+                    },
+            {
+                        title: '同步时间',
+                        align: 'center',
+                        dataIndex: 'createTime',
+                scopedSlots: { customRender: 'createTime' },
+                    },
+                    {
+                        title: '结果',
+                        align: 'center',
+                        dataIndex: 'remarks'
+                    }
+            ],
+            recordData:[],
+            recordIpagination: {
+            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.recordIpagination.current = current;
+                this.recordIpagination.pageSize= pageSize;
+                this.handleGetRecordDetail(this.recordSignature)
+            }
+            },
         };
     },
     filters: {
@@ -2086,6 +2227,39 @@ export default {
     },
     methods: {
         ...mapGetters(['nickname', 'avatar', 'userInfo']),
+        handleRecordCancel(){
+            this.recordDetailVisible = false;
+        },
+        handleRecord(data){
+            this.handleGetRecordDetail(data.code);
+            this.recordSignature = data.code;
+            this.recordDetailVisible = true;
+            this.toutiaoMateriaLoading = true;
+            this.kuaishouMateriaLoading = true;
+        },
+        handleGetRecordDetail(id) {
+            // 测试code '7b676546bfb50f1b992d44bd479a1536'
+            var params = {}
+            params.signature = id
+            params.pageNo = this.recordIpagination.current
+            params.pageSize = this.recordIpagination.pageSize
+            getAction('/ctop/materialUpload/uploadDetail', params).then(result => {
+                if (result.success) {
+                
+                    // 头条处理数据
+                    this.recordData = result.result.list || []
+                    this.recordIpagination.total = result.result.total || 0
+                }
+                else {
+                    this.$message.error(result.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            }).finally(() => {
+                this.toutiaoMateriaLoading = false;
+                this.kuaishouMateriaLoading = false;
+            });
+        },
         handleBudgetCancel() {
             this.defaultSolganTitle = 'test';
             this.defaultSolganStatus = 'input';
@@ -3085,10 +3259,18 @@ export default {
             params.mediaId = this.mediaId;
             params.materialArray = JSON.stringify(this.checkArr);
             params.accountArray = JSON.stringify(data);
+            params.loginId = this.userInfo().id
+            params.userName = this.userInfo().realname
             postAction('/ctop/materialUpload/uploadAccount', params).then(res => {
                 if (res.code === 0) {
                     this.checkArr = [];
                     this.checkAll = false;
+                    if(res.data){
+                        this.showDataList = res.data
+                        this.showDataListVisible = true
+                    }else{
+                        this.$message.success(res.message)
+                    }
                 }
             });
         },

+ 426 - 0
src/views/modules/earlyWarningRules/configurationList.vue

@@ -0,0 +1,426 @@
+<style lang="scss" scoped>
+.tableBox {
+    background-color: #fff;
+    margin: 15px 0px;
+    padding: 15px 10px;
+    .tableTop {
+        position: relative;
+        padding-bottom: 15px;
+        border-bottom: 1px solid #e0e0e0;
+        .selectTime {
+            margin-right: 20px;
+        }
+        .add {
+            position: absolute;
+            top: 0;
+            right: 0;
+        }
+    }
+}
+</style>
+<template>
+    <div class="video-report">
+        <!-- 报表区域 -->
+
+        <div class="tableBox">
+            <div style="display:flex">
+                <selectTreeAccount
+                    v-model="searchAccountId"
+                    style="display: inline-block;position: relative;margin-left: 0px;width:30%;margin-bottom:15px"
+                    reqUrl="/monitor/projectMonitorWhiteList/getProjectAndAccountIds"
+                />
+                <a-button type="primary" @click="search" style="position:relative;top:2px">搜索</a-button>
+            </div>
+
+            <div class="tableTop" style="display:flex;justify-content: flex-end;">
+                <a-button type="primary" @click="addWhite">添加</a-button>
+            </div>
+            <a-table
+                size="middle"
+                :columns="columns"
+                :dataSource="data"
+                bordered
+                id="outTable"
+                :pagination="ipagination"
+                :loading="loading"
+                ref="accountTable"
+            >
+                <a slot="action" slot-scope="text, records" @click="editConfiguration(records)">
+                    编辑
+                </a>
+                <span slot="status" slot-scope="text, record">
+                    <a-switch :checked="text == 0" @change="handleSwitchChang($event, record)" />
+                </span>
+            </a-table>
+        </div>
+        <a-modal
+            v-model="whiteVisible"
+            title="添加配置"
+            @ok="whiteListOk"
+            @cancel="handleCancel"
+            :width="1000"
+            :confirmLoading="confirmLoading"
+        >
+            <a-form layout="horizontal" :form="form" hide-required-mark :selfUpdate="true" v-bind="formItemLayout">
+                <a-row :gutter="24">
+                    <a-col :md="24" :sm="24" :xxl="24">
+                        <a-form-item label="选择账户">
+                            <selectTreeAccount
+                                v-if="whiteVisible"
+                                v-model="accountId"
+                                style="display: inline-block;position: relative;margin-left: 0px;width:100%;margin-bottom:15px"
+                                reqUrl="/monitor/projectMonitorWhiteList/getProjectAndAccountIds"
+                            />
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+                <a-row :gutter="24">
+                    <a-col :md="24" :sm="24" :xxl="24">
+                        <a-form-item label="第三方点击监测链接">
+                            <a-input
+                                v-decorator="[
+                                    'clickTrackUrl',
+                                    {
+                                        rules: [
+                                            { required: true, message: '请填写第三方点击监测链接' },
+                                            { validator: handleConfirmValue }
+                                        ]
+                                    }
+                                ]"
+                                allow-clear
+                            />
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+                <a-row :gutter="24">
+                    <a-col :md="24" :sm="24" :xxl="24">
+                        <a-form-item label="第三方点击按钮监测链接(ab监测)">
+                            <a-input
+                                v-decorator="[
+                                    'actionbarClickUrl',
+                                    {
+                                        rules: [{ validator: handleConfirmValueOkUndefind }]
+                                    }
+                                ]"
+                                allow-clear
+                            />
+                            <span style="color:red">需媒体加白使用</span>
+                        </a-form-item>
+                    </a-col>
+                </a-row>
+            </a-form>
+        </a-modal>
+    </div>
+</template>
+
+<script>
+import moment from 'moment'
+import { JeecgListMixin } from '@/mixins/ipagination'
+import { getAction, postAction, downFile, downFilePost, deleteAction } from '@/api/manage'
+import { mapGetters } from 'vuex'
+import selectTreeAccount from '@/components/formComponents/selectAccount.vue'
+import pick from 'lodash.pick'
+const columnsFixd = [
+    {
+        title: '监测状态',
+        dataIndex: 'status',
+        align: 'center',
+        key: 'status',
+        scopedSlots: { customRender: 'status' }
+    },
+    {
+        title: '项目名称',
+        dataIndex: 'projectName',
+        align: 'center',
+        key: 'projectName',
+        scopedSlots: { customRender: 'projectName' }
+    },
+    {
+        title: '账户ID',
+        dataIndex: 'accountId',
+        align: 'center',
+        key: 'accountId',
+        scopedSlots: { customRender: 'accountId' }
+    },
+    {
+        title: '账户名称',
+        dataIndex: 'accountName',
+        align: 'center',
+        key: 'accountName',
+        scopedSlots: { customRender: 'accountName' }
+    },
+
+    {
+        title: '三方点击监测链接',
+        dataIndex: 'clickTrackUrl',
+        align: 'center',
+        width: 350,
+        key: 'clickTrackUrl',
+        scopedSlots: { customRender: 'clickTrackUrl' }
+    },
+    {
+        title: '三方点击按钮监测链接(ab监测)',
+        dataIndex: 'actionbarClickUrl',
+        align: 'center',
+        width: 350,
+        key: 'actionbarClickUrl',
+        scopedSlots: { customRender: 'actionbarClickUrl' }
+    },
+    {
+        title: '配置人',
+        dataIndex: 'userName',
+        align: 'center',
+        key: 'userName',
+        scopedSlots: { customRender: 'userName' }
+    },
+    {
+        title: '账户状态',
+        dataIndex: 'accountStatus',
+        align: 'center',
+        key: 'accountStatus',
+        customRender: function(t, r, index) {
+            if (t == 0 || t == '0') {
+                return '投放中'
+            } else if (t == 1 || t == '1') {
+                return '暂停'
+            }
+        }
+    },
+    {
+        title: '操作',
+        align: 'center',
+        dataIndex: 'action',
+        scopedSlots: { customRender: 'action' }
+    }
+]
+const columnsWhite = [
+    {
+        title: '项目名称',
+        dataIndex: 'projectName',
+        align: 'center',
+        key: 'projectName',
+        scopedSlots: { customRender: 'projectName' }
+    },
+    {
+        title: '运营负责人',
+        align: 'center',
+        dataIndex: 'responsibleId_dictText'
+    },
+    {
+        title: '设计负责人',
+        align: 'center',
+        dataIndex: 'designResponsibleId_dictText'
+    },
+    {
+        title: '操作',
+        align: 'center',
+        dataIndex: 'action',
+        scopedSlots: { customRender: 'action' }
+    }
+]
+
+export default {
+    data() {
+        return {
+            columns: [...columnsFixd], //table的表头
+            columnsWhite: columnsWhite,
+            whiteVisible: false,
+            loading: false,
+            whiteLoading: false,
+            confirmLoading: false,
+            addColumns: [],
+            data: [],
+            dataWhiteList: [],
+            accountId: undefined,
+            searchAccountId: undefined,
+            form: this.$form.createForm(this),
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+
+                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
+                    this.handleGetTableList()
+                }
+            },
+            ipaginationWhite: {
+                current: 1,
+                pageSize: 10,
+
+                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.ipaginationWhite.current = current
+                    this.ipaginationWhite.pageSize = pageSize
+                    this.getWhiteList()
+                }
+            },
+            projectName: '',
+            whiteListRul: '/monitor/trackMonitorConfigure/list',
+            formItemLayout: {
+                labelCol: { span: 6 },
+                wrapperCol: { span: 16 }
+            },
+            type: 'add',
+            editId: undefined
+            // '/monitor/projectMonitorWhiteList/getProjectAndAccountIds'
+        }
+    },
+    watch: {},
+    components: {
+        selectTreeAccount
+    },
+    methods: {
+        ...mapGetters(['userInfo']),
+        handleConfirmValue(rule, value, callback) {
+            if (/(http|https):\/\/([\w.]+\/?)\S*/.test(value) && value != '') {
+                callback()
+            } else {
+                callback('链接不能为空且开头为http://或https://')
+            }
+        },
+        handleConfirmValueOkUndefind(rule, value, callback) {
+            if (!!!value) {
+                callback()
+            } else if (/(http|https):\/\/([\w.]+\/?)\S*/.test(value)) {
+                callback()
+            } else {
+                callback('链接开头为http://或https://')
+            }
+        },
+        handleSwitchChang(checked, data) {
+            const paramsData = {
+                id: data.id,
+                status: checked ? 0 : 1
+            }
+            postAction('/monitor/trackMonitorConfigure/edit', paramsData)
+                .then(result => {
+                    if (result.code === 200) {
+                        this.handleGetTableList()
+                    } else {
+                        this.$message.error(result.message)
+                    }
+                })
+                .catch(error => {
+                    console.log(error, 'eeee')
+                })
+        },
+        editConfiguration(item) {
+            this.whiteVisible = true
+            this.$nextTick(() => {
+                this.type = 'edit'
+                setTimeout(() => {
+                    this.accountId = item.accountId
+                }, 100)
+                // this.accountId = item.accountId
+                this.editId = item.id
+                this.form.setFieldsValue(pick(item, 'clickTrackUrl', 'actionbarClickUrl'))
+                //时间格式化
+            })
+        },
+        handleGetTableList() {
+            this.loading = true
+            const params = {
+                pageSize: this.ipagination.pageSize,
+                pageNo: this.ipagination.current,
+                userId: this.userInfo().id,
+                accountId: this.searchAccountId
+            }
+            getAction(this.whiteListRul, params).then(res => {
+                this.loading = false
+                if (res.success) {
+                    // let result = res.result
+                    // this.data.push({ ...result, key: 1 })
+                    // result.map((item, index) => {
+                    //   item.key = index
+                    // })
+                    this.data = res.result.records.map((item, index) => {
+                        return {
+                            ...item,
+                            key: index
+                        }
+                    })
+                    this.ipagination.total = res.result.total
+                } else {
+                    this.$message.error(res.message)
+                    this.loading = false
+                }
+            })
+        },
+        addWhite() {
+            this.whiteVisible = true
+        },
+        search() {
+            this.ipaginationWhite.current = 1
+            this.handleGetTableList()
+        },
+        handleCancel() {
+            this.form.resetFields()
+            this.accountId = ''
+            this.whiteVisible = false
+        },
+        whiteListOk() {
+            this.form.validateFields((err, values) => {
+                if (!err) {
+                    if (this.accountId) {
+                        this.confirmLoading = true
+                        var params = { ...values }
+                        params.accountId = this.accountId
+                        params.userId = this.userInfo().id
+                        if (this.type == ' add') {
+                        } else {
+                            params.id = this.editId
+                        }
+                        var url =
+                            this.type == 'add'
+                                ? '/monitor/trackMonitorConfigure/add'
+                                : '/monitor/trackMonitorConfigure/edit'
+                        postAction(url, params).then(res => {
+                            this.confirmLoading = false
+                            if (res.success) {
+                                this.handleCancel()
+                                this.handleGetTableList()
+                            } else {
+                                this.$message.error(res.message)
+                            }
+                        })
+                    }
+                }
+            })
+        },
+        deleteWhite(id) {
+            deleteAction('/monitor/projectMonitorWhiteList/delete', { id: id }).then(res => {
+                if (res.success) {
+                    this.handleGetTableList()
+                } else {
+                    this.$message.error(res.message)
+                }
+            })
+        },
+        filterOption(input, option) {
+            return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+        }
+    },
+
+    mounted() {
+        this.handleGetTableList()
+    }
+}
+</script>

+ 276 - 0
src/views/modules/earlyWarningRules/whitelist.vue

@@ -0,0 +1,276 @@
+<style lang="scss" scoped>
+.tableBox {
+    background-color: #fff;
+    margin: 15px 0px;
+    padding: 15px 10px;
+    .tableTop {
+        position: relative;
+        padding-bottom: 15px;
+        border-bottom: 1px solid #e0e0e0;
+        .selectTime {
+            margin-right: 20px;
+        }
+        .add {
+            position: absolute;
+            top: 0;
+            right: 0;
+        }
+    }
+}
+</style>
+<template>
+    <div class="video-report">
+        <!-- 报表区域 -->
+
+        <div class="tableBox">
+            <div class="tableTop" style="display:flex;    justify-content: flex-end;">
+                <a-button type="primary" @click="addWhite">添加白名单</a-button>
+            </div>
+            <a-table
+                size="middle"
+                :columns="columns"
+                :dataSource="data"
+                bordered
+                id="outTable"
+                :pagination="ipagination"
+                :loading="loading"
+                ref="accountTable"
+            >
+                <a slot="action" slot-scope="text, records" @click="deleteWhite(records.id)">
+                    删除
+                </a>
+            </a-table>
+        </div>
+        <a-modal
+            v-model="whiteVisible"
+            title="添加白名单"
+            @ok="whiteListOk"
+            @cancel="
+                whiteVisible = false
+                projectName = ''
+            "
+            :footer="null"
+            width="50%"
+        >
+            <div class="tableTop" style="margin-bottom:10px;width:300px">
+                <a-input-search
+                    placeholder="请输入项目名称"
+                    v-model="projectName"
+                    enter-button
+                    @search="getWhiteListSearch"
+                />
+            </div>
+            <a-table
+                size="middle"
+                :columns="columnsWhite"
+                :dataSource="dataWhiteList"
+                bordered
+                :loading="whiteLoading"
+                :pagination="ipaginationWhite"
+            >
+                <a slot="action" slot-scope="text, records" @click="addWhiteOk(records)">
+                    添加
+                </a>
+            </a-table>
+        </a-modal>
+    </div>
+</template>
+
+<script>
+import moment from 'moment'
+import { JeecgListMixin } from '@/mixins/ipagination'
+import { getAction, postAction, downFile, downFilePost, deleteAction } from '@/api/manage'
+import { mapGetters } from 'vuex'
+const columnsFixd = [
+    {
+        title: '项目名称',
+        dataIndex: 'projectName',
+        align: 'center',
+        key: 'projectName',
+        scopedSlots: { customRender: 'projectName' }
+    },
+    {
+        title: '操作人',
+        align: 'center',
+        dataIndex: 'userName'
+    },
+    {
+        title: '操作',
+        align: 'center',
+        dataIndex: 'action',
+        scopedSlots: { customRender: 'action' }
+    }
+]
+const columnsWhite = [
+    {
+        title: '项目名称',
+        dataIndex: 'projectName',
+        align: 'center',
+        key: 'projectName',
+        scopedSlots: { customRender: 'projectName' }
+    },
+    {
+        title: '运营负责人',
+        align: 'center',
+        dataIndex: 'responsibleId_dictText'
+    },
+    {
+        title: '设计负责人',
+        align: 'center',
+        dataIndex: 'designResponsibleId_dictText'
+    },
+    {
+        title: '操作',
+        align: 'center',
+        dataIndex: 'action',
+        scopedSlots: { customRender: 'action' }
+    }
+]
+
+export default {
+    data() {
+        return {
+            columns: [...columnsFixd], //table的表头
+            columnsWhite: columnsWhite,
+            whiteVisible: false,
+            loading: false,
+            whiteLoading: false,
+            addColumns: [],
+            data: [],
+            dataWhiteList: [],
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+
+                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
+                    this.handleGetTableList()
+                }
+            },
+            ipaginationWhite: {
+                current: 1,
+                pageSize: 10,
+
+                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.ipaginationWhite.current = current
+                    this.ipaginationWhite.pageSize = pageSize
+                    this.getWhiteList()
+                }
+            },
+            projectName: '',
+            whiteListRul: '/monitor/projectMonitorWhiteList/list'
+        }
+    },
+    watch: {},
+    methods: {
+        ...mapGetters(['userInfo']),
+        handleGetTableList() {
+            this.loading = true
+            const params = {
+                pageSize: this.ipagination.pageSize,
+                pageNo: this.ipagination.current
+            }
+            getAction(this.whiteListRul, params).then(res => {
+                this.loading = false
+                if (res.success) {
+                    // let result = res.result
+                    // this.data.push({ ...result, key: 1 })
+                    // result.map((item, index) => {
+                    //   item.key = index
+                    // })
+                    this.data = res.result.records.map((item, index) => {
+                        return {
+                            ...item,
+                            key: index
+                        }
+                    })
+                    this.ipagination.total = res.result.total
+                } else {
+                    this.$message.error(res.message)
+                    this.loading = false
+                }
+            })
+        },
+        addWhiteOk(item) {
+            postAction('/monitor/projectMonitorWhiteList/add', { projectId: item.id, userId: this.userInfo().id }).then(
+                res => {
+                    if (res.success) {
+                        this.whiteVisible = false
+                        this.projectName = ''
+                        this.handleGetTableList()
+                    } else {
+                        this.$message.error(res.message)
+                    }
+                }
+            )
+        },
+        addWhite() {
+            this.whiteVisible = true
+            this.ipaginationWhite.current = 1
+            this.getWhiteList()
+        },
+        getWhiteListSearch() {
+            this.ipaginationWhite.current = 1
+            this.getWhiteList()
+        },
+        getWhiteList() {
+            const params = {
+                pageNo: this.ipaginationWhite.current,
+                pageSize: this.ipaginationWhite.pageSize,
+                projectName: this.projectName
+            }
+            this.whiteLoading = true
+            getAction('/ctop/project/getProjectList', params).then(res => {
+                this.whiteLoading = false
+                if (res.success) {
+                    this.dataWhiteList = res.result.records.map((item, index) => {
+                        return {
+                            ...item,
+                            key: index
+                        }
+                    })
+                    this.ipaginationWhite.total = res.result.total
+                } else {
+                    this.$message.error(res.message)
+                }
+            })
+        },
+        whiteListOk() {},
+        deleteWhite(id) {
+            deleteAction('/monitor/projectMonitorWhiteList/delete', { id: id }).then(res => {
+                if (res.success) {
+                    this.handleGetTableList()
+                } else {
+                    this.$message.error(res.message)
+                }
+            })
+        },
+        filterOption(input, option) {
+            return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+        }
+    },
+
+    mounted() {
+        this.handleGetTableList()
+    }
+}
+</script>

+ 4 - 1
src/views/modules/material/accountCheck.vue

@@ -12,7 +12,7 @@
 </style>
 <template>
   <div>
-    <a-modal title="账户选择" v-model="showEdit" @ok="handleOk" @cancel="close" width="80%">
+    <a-modal title="账户选择" v-model="showEdit" @ok="handleOk" @cancel="close" width="80%" :confirm-loading="confirmLoading">
       <!-- <a-checkbox :indeterminate="indeterminate" @change="onCheckAllChange" :checked="checkAll">全选</a-checkbox>
       <br />
       <a-checkbox-group :options="showList" v-model="dataValue" class="checked-account" @change="onChange" /> -->
@@ -51,6 +51,7 @@ export default {
       autoExpandParent: true,
       selectedKeys: [],
       treeData:[],
+      confirmLoading:false,
     }
   },
   watch: {
@@ -73,6 +74,7 @@ export default {
       this.selectedKeys = selectedKeys
     },
     handleOk(e) {
+      this.confirmLoading = true
 	  let defaultData = this.checkedKeys.filter(item => item.toString().indexOf('-') === -1);
       this.showEdit = false
       this.$emit('synchro', defaultData)
@@ -101,6 +103,7 @@ export default {
       this.checkAll = this.dataValue.length === this.showList.length
     },
     getData(url, item) {
+       this.confirmLoading = false
       this.showEdit = true
       this.dataList = []
       this.showList = null

+ 22 - 9
src/views/modules/material/accountCheckBytedance.vue

@@ -82,7 +82,7 @@
 </style>
 <template>
   <div class="select-project">
-    <a-modal title="账户选择" v-model="showEdit" @ok="handleOk" @cancel="close" width="80%">
+    <a-modal title="账户选择" v-model="showEdit" @ok="handleOk" @cancel="close" width="80%" :confirm-loading="confirmLoading">
       <!-- <span style="margin-bottom:15px">是否同步快手主页</span> -->
       <div class="row-item">
         <div class="hint-item"></div>
@@ -90,7 +90,7 @@
           <div class="text-item">是否同步快手主页</div>
           <!-- <div class="required-item"></div> -->
         </div>
-        <div class="input-item">
+        <div class="input-item" v-if="showEdit">
           <a-form-item>
             <a-switch v-model="shieldBackwardSwitch" />
           </a-form-item>
@@ -156,12 +156,13 @@ export default {
       label: 'label',
       id: 'id',
     },
-    shieldBackwardSwitch: true,
+    shieldBackwardSwitch: false,
     showEdit: false,
     value: null,
     valueConsistsOf: 'LEAF_PRIORITY',
     options: [],
     showLoading: 'loading...',
+    confirmLoading:false
   }),
   props: {
     //是否多选
@@ -210,12 +211,22 @@ export default {
       console.log(this.$refs.tree.getCheckedKeys())
     },
     handleOk(e) {
-      console.log(e)
+      this.confirmLoading = true
       var data = this.$refs.tree.getCheckedKeys()
+      var dataArr = data.map(item=>{
+        return {
+          accountId:item.split('@')[0],
+          userName:item.split('@')[2],
+          userId:item.split('@')[1],
+        }
+      })
+      // console.log(dataArr)
       this.showEdit = false
-      this.$emit('synchro', {treeData:data,shieldBackwardSwitch:this.shieldBackwardSwitch})
+      this.$emit('synchro', {treeData:dataArr,shieldBackwardSwitch:this.shieldBackwardSwitch})
     },
     close() {
+      // this.$refs.tree.setCheckedKeys([])
+      this.shieldBackwardSwitch = false
       this.showEdit = false
     },
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
@@ -251,7 +262,7 @@ export default {
       console.log(node)
       var data = []
       if (node.level == 1) {
-        var id = node.label
+        var id = node.key.split('@')[1]
 
         getAction('/ctop/userAllocation/getAccountIdListByUserId', {
           userId: id,
@@ -289,19 +300,21 @@ export default {
         resolve(data)
       }
     },
-    getParticipateList(productId) {
+    getParticipateList(productId) {d:
       //我参与的
       //   toutiaoParticipateList
+      this.confirmLoading = false
       this.showEdit = true
       getAction('/ctop/userAllocation/getUserIdListByProductId', {
         productId: productId,
+        userId: this.userInfo().id
       }).then((res) => {
         if (res.code == 0) {
           console.log(res)
           this.options = res.result.map((item) => {
             return {
-              id: item.accountId,
-              label: item.userId,
+              id: item.accountId+'@'+item.userId+'@'+item.userName,
+              label: item.userId+'-'+item.projectName,
               children: [],
             }
           })

+ 1 - 2
src/views/modules/material/comment/selectTable.vue

@@ -47,7 +47,7 @@
   >
     <a-input
       placeholder="请选择产品名称"
-      @focus="topMiddle = true"
+      @focus="topMiddle = true;getData()"
       v-model="keyValue"
       @change="getData"
       :disabled="disabled"
@@ -283,7 +283,6 @@ export default {
       this.topMiddle = false
       if(!!!this.projectId){
         this.keyValue = ''
-        this.getData()
       }
     },
     // allData() {

+ 436 - 157
src/views/modules/material/videoMaterial.vue

@@ -429,6 +429,46 @@ a {
           </a-col>
 
           <a-col :md="8" :sm="8">
+            <a-form-item label="是否创新视频">
+              <a-select v-model="queryParam.materialInnovate" allowClear>
+                <a-select-option :value="1">
+                    否
+                </a-select-option>
+                <a-select-option :value="2">
+                    是
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="8" :sm="8" v-if="active == '1'">
+            <a-form-item label="状态">
+              <a-select v-model="queryParam.videoStatus">
+                <a-select-option :value="0">
+                    不限
+                </a-select-option>
+                <a-select-option :value="1">
+                    未推送
+                </a-select-option>
+                <a-select-option :value="2">
+                    未推送到快手
+                </a-select-option>
+                <a-select-option :value="3">
+                    未推送到头条 
+                </a-select-option>
+                <a-select-option :value="4">
+                    推送到快手
+                </a-select-option>
+                <a-select-option :value="5">
+                    推送到头条
+                </a-select-option>
+                <a-select-option :value="6">
+                    已推送到快手&头条 
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="8" :sm="8">
             <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
               <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
               <a-button type="primary" @click="searchRe" icon="reload" style="margin-left: 8px">重置</a-button>
@@ -590,7 +630,7 @@ a {
                     <a-icon
                       type="close-circle"
                       @click="deleteData(items.id)"
-                      v-show="active == '0'"
+                      v-show="active == '0'||active == '2'"
                       v-if="items.userId == userInfo().id"
                     />
                   </a-badge>
@@ -607,7 +647,7 @@ a {
                         </template>
                         <img
                           style="width: 30px; height: 30px"
-                          v-if="items.kuaishouVideoIsUp == 1"
+                          v-if="items.syncKuaishou == 2"
                           :style="{ filter: items.kuaishouEffiType == 1 ? 'grayscale(0%)' : 'grayscale(100%)' }"
                           src="./kuaishou.jpg"
                         />
@@ -617,13 +657,13 @@ a {
                           <span>{{ items.toutiaoEffiType == 1 ? '抖音有效视频' : '已经同步到抖音平台' }}</span>
                         </template>
                         <img
-                          v-if="items.toutiaoVideoIsUp == 1 && items.toutiaoEffiType == 1"
+                          v-if="items.syncBytedance == 2 && items.toutiaoEffiType == 1"
                           style="width: 30px; height: 30px; margin-left: 5px"
                           src="./douyin.jpg"
                           alt
                         />
                         <img
-                          v-else-if="items.toutiaoVideoIsUp == 1 && items.toutiaoEffiType == 0"
+                          v-else-if="items.syncBytedance == 2 && items.toutiaoEffiType == 0"
                           style="width: 30px; height: 30px; margin-left: 5px"
                           src="./douyinhui.jpg"
                           alt
@@ -645,6 +685,7 @@ a {
                         <!-- {{ videoTag.join(',') }} -->
                         <!-- <br v-if="index%3"/> -->
                         <a-tag v-for="(item, index) of videoTag" :key="index" style="margin: 5px">{{ item }}</a-tag>
+                        <a-tag>{{ items.materialInnovate == 2? '创新素材' : '非创新素材'  }}</a-tag>
                       </template>
                       <template slot="content" v-else>
                         <div style="width: 100%; text-align: center">加载中。。。</div>
@@ -815,9 +856,12 @@ a {
                         <a-menu-item key="6"  v-show="active !== '1'"  v-if="items.userId == userInfo().id">
                           <a href="javascript:;" style="margin-right: 20px" @click="editMaterialName(items)">修改素材名称</a>
                         </a-menu-item>
+                        <a-menu-item key="7" v-show="active === '0' || active === '1'">
+                          <a href="javascript:;" @click="handleUsageDetails(items)">使用详情</a>
+                        </a-menu-item>
                       </a-menu>
                     </a-dropdown>
-					<a v-show="active === '0' || active === '1'" style="margin-right: 20px" @click="handleUsageDetails(items)">使用详情</a>
+					          <a v-show="active === '1'" style="margin-right: 20px" @click="handleRecord(items)">同步记录</a>
                     <a-checkbox :value="items.id" style="float: right" v-show="active == '1'"></a-checkbox>
                     <br />
                     {{ items.createTime }}
@@ -1125,7 +1169,13 @@ a {
                 required: true,
                 message: '场景标签必选',
                 trigger: 'blur',
-              }">
+              }"
+              v-if="!items.modalityTagList.includes(60158)
+              && !items.modalityTagList.includes(60159)
+              && !items.modalityTagList.includes(101)
+              && !items.modalityTagList.includes(104)
+              && !items.modalityTagList.includes(112)"
+              >
                 <el-cascader
                   placeholder="搜索你想要的场景标签"
                   :options="departTreeSence"
@@ -1167,6 +1217,17 @@ a {
                   style="width: 100%"
                 ></el-cascader>
               </a-form-model-item>
+              <a-form-model-item label="创新素材" 
+              :prop="'urlListData.'+index+'.materialInnovate'"  
+              :label-col="{ span: 4 }" 
+              :wrapper-col="{ span: 14 }"
+                :rules="{
+                required: true,
+                message: '创新素材必选',
+                trigger: 'change',
+              }">
+                  <a-switch v-model="items.materialInnovate"/>
+              </a-form-model-item>
               <a-form-model-item :wrapper-col="{ span: 14,offset:4 }" v-if="index == 0">
                   <a-button type="primary" @click="syncDesign">剩余素材同步设计人员</a-button>
               </a-form-model-item>
@@ -1367,7 +1428,7 @@ a {
             :options="departTreeModality"
             v-decorator="[
               'modalityTagList', // 给表单赋值或拉取表单时,该input对应的key
-              { rules: [{ required: true, message: '请选择形式标签!' }] },
+              { rules: [{ required: true, message: '请选择形式标签!' }],initialValue:[] },
             ]"
             :props="{
               multiple: true,
@@ -1417,7 +1478,11 @@ a {
             sm: { span: 12 },
           }"
           label="场景标签"
-          v-if="add && visible"
+          v-if="add && visible && (!getData('modalityTagList')||(!getData('modalityTagList').includes(60158)
+          && !getData('modalityTagList').includes(60159)
+          && !getData('modalityTagList').includes(101)
+          && !getData('modalityTagList').includes(104)
+          && !getData('modalityTagList').includes(112)))"
         >
           <el-cascader
             placeholder="搜索你想要的场景标签"
@@ -1470,6 +1535,20 @@ a {
           :label-col="labelCol"
           :wrapper-col="{
             xs: { span: 24 },
+            sm: { span: 12 },
+          }"
+          label="创新素材"
+          v-if="add && visible"
+        >
+         <a-switch v-decorator="[
+              'materialInnovate', // 给表单赋值或拉取表单时,该input对应的key
+              { rules: [{ required: true, message: '' }],initialValue:false },
+            ]"/>
+        </a-form-item>
+        <a-form-item
+          :label-col="labelCol"
+          :wrapper-col="{
+            xs: { span: 24 },
             sm: { span: 18 },
           }"
           label="其他"
@@ -1910,6 +1989,7 @@ a {
           placeholder="搜索你想要的形式标签"
           :options="departTreeModality"
           v-model="departValueInfoModality"
+          @change="clearChangjing"
           :props="{
             multiple: true,
             value: 'id',
@@ -1946,6 +2026,11 @@ a {
           sm: { span: 12 },
         }"
         label="场景"
+        v-if="!departValueInfoModality.includes(60158)
+              && !departValueInfoModality.includes(60159)
+              && !departValueInfoModality.includes(101)
+              && !departValueInfoModality.includes(104)
+              && !departValueInfoModality.includes(112)"
       >
         <el-cascader
           placeholder="搜索你想要的场景标签"
@@ -1987,6 +2072,16 @@ a {
           style="width: 100%"
         ></el-cascader>
       </a-form-item>
+      <a-form-item
+          :label-col="labelCol"
+          :wrapper-col="{
+            xs: { span: 24 },
+            sm: { span: 12 },
+          }"
+          label="创新素材"
+        >
+         <a-switch v-model="materialInnovate"/>
+        </a-form-item>
     </a-modal>
     <a-modal title="推荐封面" v-model="chouzhen" width="60%">
       <template slot="footer">
@@ -2015,13 +2110,13 @@ a {
     <accountCheckBytedance ref="accountCheckBytedance" @synchro="implement" />
     <permission-modal ref="modalForm" @ok="modalFormOkElse"></permission-modal>
     <!-- 换脸模块 -->
-	<change-face
-		:status="faceTypeStatus"
-		:defaultList="faceChangeList"
-		@closeface="handleFaceCloseModal"
-		@sureface="handleFaceSureModal"
-	>
-	</change-face>
+    <change-face
+      :status="faceTypeStatus"
+      :defaultList="faceChangeList"
+      @closeface="handleFaceCloseModal"
+      @sureface="handleFaceSureModal"
+    >
+    </change-face>
     <a-modal
         v-if="faceShowStatus"
         title="换脸操作"
@@ -2073,90 +2168,128 @@ a {
           @showSizeChange="onShowSizeChange"
       />
     </a-modal>
-	<a-modal
-        v-if="usageDetailsStatus"
-        title="使用详情"
-		:width="750"
-        :visible="usageDetailsStatus"
-        dialog-class="usage-details-modal change-face-modal change-list-modal-show"
-		:footer="null"
-		@cancel="handleProfitModalnCancel"
-    >
-		<div style="overflow: hidden;">	
-			<a-tabs v-model="materiaModalType" @change="handleMateriaTabsChange">
-				<a-tab-pane key="1" tab="头条">
-					<a-table
-						class="face-right-table"
-						ref="table"
-						size="middle"
-						bordered
-						:columns="materiaColumnsToutiao"
-						:dataSource="materiaDataToutiao"
-						:pagination="false"
-						:loading="toutiaoMateriaLoading"
-					>
-						<span slot="accountStatus" slot-scope="text">
-							<span>{{ text === 0 ? '投放中' : '已暂停' }}</span>
-						</span>
-					</a-table>
-					<a-pagination
-						class="pagin-table-class"
-						:total="materiaDataTotalToutiao"
-						:show-total="total => `共 ${materiaDataTotalToutiao} 条`"
-						size="small"
-						:current="defaultCurrentToutiao"
-						:defaultPageSize="10"
-						@change="materiaDataSizeChange"
-						@showSizeChange="materiaDataSizeChange"
-					/>
-				</a-tab-pane>
-				<a-tab-pane key="2" tab="快手">
-					<a-table
-						class="face-right-table"
-						ref="table"
-						size="middle"
-						bordered
-						:columns="materiaColumnsKuaishou"
-						:dataSource="materiaDataKuaishou"
-						:pagination="false"
-						:loading="kuaishouMateriaLoading"
-					>
-						<span slot="accountStatus" slot-scope="text">
-							<span>{{ text === 0 ? '投放中' : '已暂停' }}</span>
-						</span>
-						<span slot="refuseCount" slot-scope="text, record">
-							<span>{{ record.refuseInfo.refuseCount }}</span>
-						</span>
-						<span slot="refuseDetail" slot-scope="text, record">
-							<a :disabled="!record.refuseInfo.refuseDetail" @click="handleRejectReason(record)">拒绝原因</a>
-						</span>
-					</a-table>
-					<a-pagination
-						class="pagin-table-class"
-						:total="materiaDataTotalKuaishou"
-						:show-total="total => `共 ${materiaDataTotalKuaishou} 条`"
-						size="small"
-						:current="defaultCurrentKuaishou"
-						:defaultPageSize="10"
-						@change="materiaDataSizeChangeKuaishou"
-						@showSizeChange="materiaDataSizeChangeKuaishou"
-					/>
-				</a-tab-pane>
-			</a-tabs>
-		</div>
+    <a-modal
+          v-if="usageDetailsStatus"
+          title="使用详情"
+      :width="750"
+          :visible="usageDetailsStatus"
+          dialog-class="usage-details-modal change-face-modal change-list-modal-show"
+      :footer="null"
+      @cancel="handleProfitModalnCancel"
+      >
+      <div style="overflow: hidden;">	
+        <a-tabs v-model="materiaModalType" @change="handleMateriaTabsChange">
+          <a-tab-pane key="1" tab="头条">
+            <a-table
+              class="face-right-table"
+              ref="table"
+              size="middle"
+              bordered
+              :columns="materiaColumnsToutiao"
+              :dataSource="materiaDataToutiao"
+              :pagination="false"
+              :loading="toutiaoMateriaLoading"
+            >
+              <span slot="accountStatus" slot-scope="text">
+                <span>{{ text === 0 ? '投放中' : '已暂停' }}</span>
+              </span>
+            </a-table>
+            <a-pagination
+              class="pagin-table-class"
+              :total="materiaDataTotalToutiao"
+              :show-total="total => `共 ${materiaDataTotalToutiao} 条`"
+              size="small"
+              :current="defaultCurrentToutiao"
+              :defaultPageSize="10"
+              @change="materiaDataSizeChange"
+              @showSizeChange="materiaDataSizeChange"
+            />
+          </a-tab-pane>
+          <a-tab-pane key="2" tab="快手">
+            <a-table
+              class="face-right-table"
+              ref="table"
+              size="middle"
+              bordered
+              :columns="materiaColumnsKuaishou"
+              :dataSource="materiaDataKuaishou"
+              :pagination="false"
+              :loading="kuaishouMateriaLoading"
+            >
+              <span slot="accountStatus" slot-scope="text">
+                <span>{{ text === 0 ? '投放中' : '已暂停' }}</span>
+              </span>
+              <span slot="refuseCount" slot-scope="text, record">
+                <span>{{ record.refuseInfo.refuseCount }}</span>
+              </span>
+              <span slot="refuseDetail" slot-scope="text, record">
+                <a :disabled="!record.refuseInfo.refuseDetail" @click="handleRejectReason(record)">拒绝原因</a>
+              </span>
+            </a-table>
+            <a-pagination
+              class="pagin-table-class"
+              :total="materiaDataTotalKuaishou"
+              :show-total="total => `共 ${materiaDataTotalKuaishou} 条`"
+              size="small"
+              :current="defaultCurrentKuaishou"
+              :defaultPageSize="10"
+              @change="materiaDataSizeChangeKuaishou"
+              @showSizeChange="materiaDataSizeChangeKuaishou"
+            />
+          </a-tab-pane>
+        </a-tabs>
+      </div>
     </a-modal>
-	<a-modal
-        v-if="rejectReasonStatus"
-        title="审核拒绝原因"
-		:width="750"
-        :visible="rejectReasonStatus"
-		:footer="null"
-		@cancel="handleRejectReasonCancel"
-    >
-		<div>
-			<p v-for="(item, index) in rejectReasonList" :key="index + 1">{{ index + 1 }}:{{ item }}</p>
-		</div>
-	</a-modal>
+    <a-modal
+      v-if="recordDetailVisible"
+      title="素材同步记录"
+      :width="750"
+      :visible="recordDetailVisible"
+      dialog-class="usage-details-modal change-face-modal change-list-modal-show"
+      :footer="null"
+      @cancel="handleRecordCancel"
+      >
+      <div style="overflow: hidden;">	
+        <a-table
+          class="face-right-table"
+          ref="table"
+          size="middle"
+          bordered
+          :columns="recordColumns"
+          :dataSource="recordData"
+          :pagination="recordIpagination"
+          :loading="toutiaoMateriaLoading"
+        >
+          <span slot="createTime" slot-scope="text">
+            {{text}}
+          </span>
+        </a-table>
+      </div>
+    </a-modal>
+    
+    <a-modal
+          v-if="rejectReasonStatus"
+          title="审核拒绝原因"
+      :width="750"
+          :visible="rejectReasonStatus"
+      :footer="null"
+      @cancel="handleRejectReasonCancel"
+      >
+      <div>
+        <p v-for="(item, index) in rejectReasonList" :key="index + 1">{{ index + 1 }}:{{ item }}</p>
+      </div>
+    </a-modal>
+    <a-modal v-model="showDataListVisible" title="信息" :footer="null">
+      <div v-if="showDataList">
+        <p v-for="(item, index) in showDataList" :key="index">
+            素材:{{item.materialName}},{{item.message}};
+            <br/>
+            同步账户:{{item.ids.join()}}
+        </p>
+      </div>
+       
+    </a-modal>
+
   </a-card>
 </template>
 
@@ -2276,7 +2409,80 @@ export default {
 		materiaModalType: '2',
 		materialUseDetailList: {},
 		usageDetailsStatus: false,
-      ruleForm:{
+    recordDetailVisible:false,
+    recordSignature: null,
+    recordColumns:[
+      	{
+				title: '项目',
+				align: 'center',
+				dataIndex: 'projectName'
+			},
+			{
+				title: '账户Id',
+				align: 'center',
+				dataIndex: 'userId',
+        customRender: function (text, records) {
+          if(records.mediaId == '1' || records.mediaId == '3') {
+            return records.accountId
+          }else if(records.mediaId == '2' || records.mediaId == '4') {
+            return records.userId
+          }else {
+            return text
+          }
+        }
+			},
+			{
+				title: '媒体',
+				align: 'center',
+				dataIndex: 'mediaId',
+				customRender: function (text) {
+          if (text == '1' || text == '3') {
+            return '头条'
+          } else if (text == '2' || text == '4') {
+            return '快手'
+          } else {
+            return text
+          }
+        }
+			},
+			{
+				title: '同步人',
+				align: 'center',
+				dataIndex: 'userName'
+			},
+      {
+				title: '同步时间',
+				align: 'center',
+				dataIndex: 'createTime',
+        scopedSlots: { customRender: 'createTime' },
+			},
+			{
+				title: '结果',
+				align: 'center',
+				dataIndex: 'remarks'
+			}
+    ],
+    recordData:[],
+    recordIpagination: {
+      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.recordIpagination.current = current;
+          this.recordIpagination.pageSize= pageSize;
+          this.handleGetRecordDetail(this.recordSignature)
+      }
+    },
+    ruleForm:{
         projectId:'',
         urlList:[],
         urlListData:[]
@@ -2341,6 +2547,7 @@ export default {
       departTreeMod: [],
       departValue: [],
       departValueInfo: [],
+      materialInnovate:false,
       departValueInfoModality: [],
       departValueInfoContent: [],
       departValueInfoSence: [],
@@ -2474,6 +2681,8 @@ export default {
       acceptImage: 'image/jpeg,image/jpg,image/png',
       accessKeyId: 'LTAIbNbqWzSOklQV',
       accessKeySecret: '1rkPz7JNoXk8sJevPaeYHWqfkQXBGh',
+      showDataList:null,
+      showDataListVisible:false,
       checkArr: [],
       checkAll: false,
       checkArrImage: [],
@@ -2653,58 +2862,91 @@ export default {
 		  this.rejectReasonList = data.refuseInfo.refuseDetail.split('@#');
 		  this.rejectReasonStatus = true;
 	  },
-	materiaDataSizeChange(current, pageSize) {
-		this.materiaDataToutiao = [];
-        this.defaultCurrentToutiao = current;
-        const defaultData = this.materialUseDetailList['byteDance'];
-        this.materiaDataToutiao = [...defaultData.slice(10 * current - 10, 10 * current)];
-	},
-	materiaDataSizeChangeKuaishou(current, pageSize) {
-		this.materiaDataKuaishou = [];
-        this.defaultCurrentKuaishou = current;
-        const defaultData = this.materialUseDetailList['kuaishou'];
-        this.materiaDataKuaishou = [...defaultData.slice(10 * current - 10, 10 * current)];
-	},
-	handleProfitModalnCancel() {
-		this.materialUseDetailList = {};
-		this.materiaDataToutiao = [];
-		this.materiaDataTotalToutiao = 0;
-		this.defaultCurrentToutiao = 1;
-		this.materiaDataKuaishou = [];
-		this.materiaDataTotalKuaishou = 0;
-		this.defaultCurrentKuaishou = 1;
-		this.materiaModalType = '2';
-		this.usageDetailsStatus = false;
-	},
-	handleUsageDetails(data) {
-		this.handleGetMaterialUseDetail(data.code);
-		this.usageDetailsStatus = true;
-		this.toutiaoMateriaLoading = true;
-		this.kuaishouMateriaLoading = true;
-	},
-	handleGetMaterialUseDetail(id) {
-		// 测试code '7b676546bfb50f1b992d44bd479a1536'
-		getAction('/materialUse/getMaterialUseDetail', {code: id}).then(result => {
-			if (result.success) {
-				const defaultData = result.result;
-				this.materialUseDetailList = defaultData;
-				// 头条处理数据
-				this.materiaDataToutiao = defaultData['byteDance'] ? defaultData['byteDance'].slice(0, 10) : [];
-				this.materiaDataTotalToutiao = defaultData['byteDance'] ? defaultData['byteDance'].length : 0;
-				// 快手处理数据 
-				this.materiaDataKuaishou = defaultData['kuaishou'] ? defaultData['kuaishou'].slice(0, 10) : [];
-				this.materiaDataTotalKuaishou = defaultData['kuaishou'] ? defaultData['kuaishou'].length : 0;
-			}
-			else {
-				this.$message.error(result.message);
-			}
-		}).catch(error => {
-			console.log(error, 'eeee');
-		}).finally(() => {
-			this.toutiaoMateriaLoading = false;
-			this.kuaishouMateriaLoading = false;
-		});
-	},
+    materiaDataSizeChange(current, pageSize) {
+      this.materiaDataToutiao = [];
+          this.defaultCurrentToutiao = current;
+          const defaultData = this.materialUseDetailList['byteDance'];
+          this.materiaDataToutiao = [...defaultData.slice(10 * current - 10, 10 * current)];
+    },
+    materiaDataSizeChangeKuaishou(current, pageSize) {
+      this.materiaDataKuaishou = [];
+          this.defaultCurrentKuaishou = current;
+          const defaultData = this.materialUseDetailList['kuaishou'];
+          this.materiaDataKuaishou = [...defaultData.slice(10 * current - 10, 10 * current)];
+    },
+    handleProfitModalnCancel() {
+      this.materialUseDetailList = {};
+      this.materiaDataToutiao = [];
+      this.materiaDataTotalToutiao = 0;
+      this.defaultCurrentToutiao = 1;
+      this.materiaDataKuaishou = [];
+      this.materiaDataTotalKuaishou = 0;
+      this.defaultCurrentKuaishou = 1;
+      this.materiaModalType = '2';
+      this.usageDetailsStatus = false;
+    },
+    handleRecordCancel(){
+      this.recordDetailVisible = false;
+    },
+    handleRecord(data){
+      this.handleGetRecordDetail(data.code);
+      this.recordSignature = data.code;
+      this.recordDetailVisible = true;
+      this.toutiaoMateriaLoading = true;
+      this.kuaishouMateriaLoading = true;
+    },
+    handleGetRecordDetail(id) {
+      // 测试code '7b676546bfb50f1b992d44bd479a1536'
+      var params = {}
+      params.signature = id
+      params.pageNo = this.recordIpagination.current
+      params.pageSize = this.recordIpagination.pageSize
+      getAction('/ctop/materialUpload/uploadDetail', params).then(result => {
+        if (result.success) {
+        
+          // 头条处理数据
+          this.recordData = result.result.list || []
+          this.recordIpagination.total = result.result.total || 0
+        }
+        else {
+          this.$message.error(result.message);
+        }
+      }).catch(error => {
+        console.log(error, 'eeee');
+      }).finally(() => {
+        this.toutiaoMateriaLoading = false;
+        this.kuaishouMateriaLoading = false;
+      });
+    },
+    handleUsageDetails(data) {
+      this.handleGetMaterialUseDetail(data.code);
+      this.usageDetailsStatus = true;
+      this.toutiaoMateriaLoading = true;
+      this.kuaishouMateriaLoading = true;
+    },
+    handleGetMaterialUseDetail(id) {
+      // 测试code '7b676546bfb50f1b992d44bd479a1536'
+      getAction('/materialUse/getMaterialUseDetail', {code: id}).then(result => {
+        if (result.success) {
+          const defaultData = result.result;
+          this.materialUseDetailList = defaultData;
+          // 头条处理数据
+          this.materiaDataToutiao = defaultData['byteDance'] ? defaultData['byteDance'].slice(0, 10) : [];
+          this.materiaDataTotalToutiao = defaultData['byteDance'] ? defaultData['byteDance'].length : 0;
+          // 快手处理数据 
+          this.materiaDataKuaishou = defaultData['kuaishou'] ? defaultData['kuaishou'].slice(0, 10) : [];
+          this.materiaDataTotalKuaishou = defaultData['kuaishou'] ? defaultData['kuaishou'].length : 0;
+        }
+        else {
+          this.$message.error(result.message);
+        }
+      }).catch(error => {
+        console.log(error, 'eeee');
+      }).finally(() => {
+        this.toutiaoMateriaLoading = false;
+        this.kuaishouMateriaLoading = false;
+      });
+    },
     ruleFormFile(file){
       var bmf = new BMF()
       var that = this
@@ -2746,7 +2988,8 @@ export default {
           modTagList:[],
           modalityTagList:[],
           senceTagList:[],
-          materialName:''
+          materialName:'',
+          materialInnovate:false
         }
       })
     },
@@ -2777,7 +3020,8 @@ export default {
                 planId:item.planId,
                 clipId:item.clipId,
                 shotId:item.shotId,
-              }
+              },
+              materialInnovate:item.materialInnovate?2:1
             }
           })
           postAction('/insertV3',params).then(res=>{
@@ -2971,26 +3215,51 @@ export default {
     modalFormOkElse() {
       this.getTagListAll()
     },
+    clearChangjing(data){
+      if(data.includes(60158)
+      || data.includes(60159)
+      || data.includes(101)
+      || data.includes(104)
+      || data.includes(112)){
+        this.departValueInfoSence = []
+      }
+    },
     handleOkTag(e) {
       this.loadingTag = true
+      if(this.departValueInfoModality.includes(60158)
+      || this.departValueInfoModality.includes(60159)
+      || this.departValueInfoModality.includes(101)
+      || this.departValueInfoModality.includes(104)
+      || this.departValueInfoModality.includes(112)){
+        this.departValueInfoSence = []
+      }
       var data = [
         ...this.departValueInfoModality,
         ...this.departValueInfoMod,
         ...this.departValueInfoContent,
         ...this.departValueInfoSence,
       ]
+      var params = {}
+      params.id = this.id
+      params.materialInnovate = this.materialInnovate?2:1
+      fileEdit({
+        ...params
+      }).then((res) => {
+
+      })
       postAction('/ctop/materialTagInfo/mark', {
         code: this.tagCode,
-        tagList: data,
+        tagList: data
       }).then((res) => {
-        console.log(res)
         if (res.success) {
           this.departValueInfoModality = []
           this.departValueInfoMod = []
           this.departValueInfoContent = []
           this.departValueInfoSence = []
+          this.materialInnovate = false
           this.loadingTag = false
           this.tagInfoListVisible = false
+          this.loadData()
         } else {
           this.loadingTag = false
           this.$message.error(res.message)
@@ -2999,8 +3268,10 @@ export default {
     },
     editTagList(item) {
       this.tagInfoListVisible = true
+      this.materialInnovate = item.materialInnovate == 1?false:true
       this.getTagListInfo(item.code)
       this.tagCode = item.code
+      this.id = item.id
     },
     getTagListAll() {
       this.departTree = []
@@ -3198,14 +3469,21 @@ export default {
       params.mediaId = this.mediaId
       params.materialArray = JSON.stringify(this.checkArr)
       params.accountArray = data.treeData ? JSON.stringify(data.treeData) : JSON.stringify(data)
+      params.loginId = this.userInfo().id
+      params.userName = this.userInfo().realname
       if (this.mediaId == '2') {
-        params.shieldBackwardSwitch = data.shieldBackwardSwitch
+        params.shieldBackwardSwitch = data.shieldBackwardSwitch?1:2
       }
-
       postAction('/ctop/materialUpload/uploadAccount', params).then((res) => {
         if (res.code == 0) {
           this.checkArr = []
           this.checkAll = false
+          if(res.data){
+            this.showDataList = res.data
+            this.showDataListVisible = true
+          }else{
+            this.$message.success(res.message)
+          }
         }
       })
       //   /ctop/materialUpload/uploadAccount
@@ -3666,6 +3944,7 @@ export default {
                 }
           params.tag = this.tags
           params.imageArr = this.imageArrList
+          params.materialInnovate = values.materialInnovate?2:1
           if (this.add) {
             fileInsertV2(params).then((res) => {
               if (res.success) {

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

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

+ 13 - 2
src/views/modules/policy-management/policy-management.less

@@ -3,7 +3,13 @@
     height: calc(100vh - 137px);
     padding: 20px;
     overflow-y: auto;
-
+    .line-table-width {
+        display: inline-block;
+        width: 100%;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+    }
     .control-con-title {
         height: 50px;
         display: flex;
@@ -146,7 +152,6 @@
     .policy-line-quen {
         display: flex;
         height: 345px;
-        overflow-y: auto;
 
         .line-quen-left,
         .line-quen-right {
@@ -170,6 +175,12 @@
                     white-space: nowrap;
                     text-overflow: ellipsis;
                 }
+                .line-right-spn-else {
+                    display: inline-block;
+                    width: 280px;
+                    max-height: 100px;
+                    overflow: auto;
+                }
 
             }
 

+ 321 - 16
src/views/modules/policy-management/policy-management.vue

@@ -5,6 +5,9 @@
                 <span class="policy-export-btn">销售政策列表</span>
             </div>
             <div>
+                <span v-if="userInfo().roleName == '管理员'||userInfo().roleName == '销售总监'" class="add-acount-policy-btn">
+                    <a-button @click="handleAddSale">销售对应人员</a-button>
+                </span>
                 <span v-if="userInfo().roleName !== '财务'" class="add-acount-policy-btn">
                     <a-button type="primary" @click="handleAddAccountPolicy">新增政策</a-button>
                 </span>
@@ -185,18 +188,25 @@
                     <span>{{ text }} 至 {{ record.policyEndDate }}</span>
                 </span>
                 <span slot="remarks" slot-scope="text">
-                    <span>{{ text ? text : '-' }}</span>
+                     <a-tooltip>
+                        <template slot="title" v-if="text">
+                        {{text}}
+                        </template>
+                        <span class="line-table-width">{{ text ? text : '-' }}</span>
+                    </a-tooltip>
+                    
                 </span>
                 <span slot="action" slot-scope="text, record">
-                    <a v-if="record.updateOperation.includes('查看')" @click="handleDetail(record)">查看</a>
+                    <a v-if="record.updateOperation.includes('查看')" @click="handleDetail(record)">操作</a>
                     <a-divider v-if="record.updateOperation.includes('提交审核')" type="vertical"/>
                     <a v-if="record.updateOperation.includes('提交审核')" @click="handleSubmitReview(record)">提交审核</a>
                     <a-divider v-if="record.updateOperation.includes('编辑')" type="vertical"/>
                     <a v-if="record.updateOperation.includes('编辑')" @click="handleEditTable(record)">编辑</a>
+                    <!-- 
                     <a-divider v-if="record.updateOperation.includes('审核通过')" type="vertical"/>
                     <a v-if="record.updateOperation.includes('审核通过')" @click="handleAuditSure(record)">审核通过</a>
                     <a-divider v-if="record.updateOperation.includes('审核拒绝')" type="vertical"/>
-                    <a v-if="record.updateOperation.includes('审核拒绝')" @click="handleAuditCancel(record)">审核拒绝</a>
+                    <a v-if="record.updateOperation.includes('审核拒绝')" @click="handleAuditCancel(record)">审核拒绝</a> -->
                 </span>
                 <span slot="reason" slot-scope="text, record">
                     <a @click="handleRejectionReason(record)" :disabled="record.approvedStatus !== 4">被拒原因</a>
@@ -331,7 +341,7 @@
                         </div>
                         <div class="policy-line-right">
                             <span class="line-left-spn">备注:</span>
-                            <span class="line-right-spn">{{ queryByIdList.remarks || '-' }}</span>
+                            <span class="line-right-spn-else">{{ queryByIdList.remarks || '-' }}</span>
                         </div>
                     </div>
                 </div>
@@ -448,6 +458,8 @@
                             >
                                 <a-select-option :value="1">头条</a-select-option>
                                 <a-select-option :value="2">快手</a-select-option>
+                                <a-select-option :value="3">千川</a-select-option>
+                                <a-select-option :value="4">UD</a-select-option>
                             </a-select>
                         </a-form-model-item>
                         <a-form-model-item label="销售" prop="createUserId">
@@ -457,18 +469,20 @@
                                 show-search
                                 allow-clear
                                 :filter-option="handleFilterOption"
+                                @change="showAreaInfo"
                             >
                                 <a-select-option
                                     v-for="item in saleShowOption"
-                                    :key="item.userId"
-                                    :value="item.userId"
+                                    :key="item.saleId"
+                                    :value="item.saleId"
+                                   
                                 >
-                                    {{ item.userName }}
+                                    {{ item.saleName }}
                                 </a-select-option>
                             </a-select>
                         </a-form-model-item>
-                        <a-form-model-item label="区域" prop="areaInfo">
-                            <a-select
+                        <a-form-model-item label="区域" prop="areaInfo" v-if="policyOperationForm.areaInfo">
+                            <!-- <a-select
                                 v-model="policyOperationForm.areaInfo"
                                 placeholder="请选择区域"
                                 allow-clear
@@ -480,7 +494,8 @@
                                 >
                                     {{ item }}
                                 </a-select-option>
-                            </a-select>
+                            </a-select> -->
+                            {{policyOperationForm.areaInfo}}
                         </a-form-model-item>
                         <a-form-model-item label="我司主体" prop="companySubjectName">
                             <a-select
@@ -549,9 +564,16 @@
                                 <a-select-option :value="0">返现</a-select-option>
                                 <a-select-option :value="1">返货</a-select-option>
                                 <a-select-option :value="2">返现+返货</a-select-option>
+                                <a-select-option :value="3">服务费</a-select-option>
                             </a-select>
                         </a-form-model-item>
-                        <a-form-model-item label="返点比例" prop="rebateRate">
+                        <a-form-model-item :label="policyOperationForm.rebateType == 3?'服务费':'返点比例'" prop="rebateRate"
+                        :rules="{
+                            required: true,
+                            message: policyOperationForm.rebateType == 3?'请输入服务费比例':'请输入返点比例',
+                            trigger: 'blur',
+                        }"
+                        >
                             <a-input-number
                                 v-model="policyOperationForm.rebateRate"
                                 :step="0.01"
@@ -608,11 +630,83 @@
                                 @change="handleRemarksChange"
                             />
                         </a-form-model-item>
-                        <div v-if="remarksStatus" style="color: #f00;margin-left: 140px">只能输入100个汉字</div>
+                        <div v-if="remarksStatus" style="color: #f00;margin-left: 140px">只能输入200个汉字</div>
                     </a-row>
                 </a-form-model>
             </div>
         </a-modal>
+
+        <!-- 销售对应人员 -->
+        <a-modal
+            v-if="saleVisible"
+            title="销售对应人员"
+            :visible="saleVisible"
+            @cancel="handleSaleCancel"
+            :width="1000"
+            :footer="null"
+        >
+            <a-button type="default" style="margin-bottom:10px" id="mybtn" @click="addSaleInfo">新增</a-button>
+            <br>
+            设定对应关系后,该销售助理可以查看、创建对应销售的政策以及下载该销售负责账户的结算单
+            <a-table
+            :columns="saleInfoColumns"
+            :data-source="saleInfoList"
+            bordered
+            tableLayout="auto"
+            :pagination="ipagination"
+            :loading='saleLoading'
+            style="word-break: break-all;"
+            >
+                <div slot="saleName" slot-scope="text, records">
+                    <span v-if="!records.edit">{{ text }}</span>
+                    <a-select
+                        v-else
+                        show-search
+                        v-model="records.saleIdContent"
+                        placeholder="请选择销售"
+                        option-filter-prop="children"
+                        style="width: 200px"
+                        :filter-option="filterOption"
+                        :labelInValue="true"
+                    >
+                        <a-select-option v-for="(item, index) in salePersonList" :key="index" :value="item.key" :disabled="records.assistantIdContent?records.assistantIdContent.key == item.key:false">
+                            {{item.label}}
+                        </a-select-option>
+                    </a-select>
+                </div>
+                <div slot="assistantName" slot-scope="text, records">
+                    <span v-if="!records.edit">{{ text }}</span>
+                    <a-select
+                        v-else
+                        show-search
+                        v-model="records.assistantIdContent"
+                        placeholder="请选择销售助理"
+                        option-filter-prop="children"
+                        style="width: 200px"
+                        :filter-option="filterOption"
+                        :labelInValue="true"
+                    >
+                        <a-select-option v-for="(item, index) in salePersonList" :key="index" :value="item.key" :disabled="records.saleIdContent?records.saleIdContent.key == item.key:false">
+                            {{item.label}}
+                        </a-select-option>
+                    </a-select>
+                </div>
+                <div slot="action" slot-scope="text, records">
+                    <div v-if="!records.edit">
+                        <a @click="handleEdit(records)">编辑</a>
+                        <a-divider type="vertical"/>
+                        <a-popconfirm title="是否确认删除?" @confirm="() => handleDelete(records.id)">
+                            <a>删除</a>
+                        </a-popconfirm>
+                    </div>
+                    <div v-else>
+                        <a-button type="primary" @click="handleSale(records)">保存</a-button>
+                        <a-button style="margin-left: 8px" @click="handleSaleCancelOne(records)">取消</a-button>
+                    </div>
+                </div>
+
+            </a-table>
+        </a-modal>
     </div>
 </template>
 <script>
@@ -647,6 +741,14 @@ export default {
                 {
                     id: 2,
                     name: '快手'
+                },
+                {
+                    id: 3,
+                    name: '千川'
+                },
+                {
+                    id: 4,
+                    name: 'UD'
                 }
             ],
             creativeRebateOptions: [
@@ -665,6 +767,10 @@ export default {
                 {
                     id: 2,
                     name: '返现+返货'
+                },
+                {
+                    id: 3,
+                    name: '服务费'
                 }
             ],
             searchStatusOptions: [
@@ -746,6 +852,7 @@ export default {
                 areaInfo: [{required: true, message: '请选择区域', trigger: 'change'}],
                 companySubjectName: [{required: true, message: '请选择我司主体', trigger: 'change'}],
                 rebateRate: [{required: true, message: '请输入返点比例', trigger: 'blur'}],
+                rebateRateElse: [{required: true, message: '请输入请输入服务费比例', trigger: 'blur'}],
                 accountingPeriod: [{required: true, message: '请输入账期', trigger: 'blur'}],
                 dianPayCompanyName: [
                     {required: true, message: '请输入垫付公司', trigger: 'blur'},
@@ -897,7 +1004,7 @@ export default {
                 creativeAdvance: undefined,
                 creativeSale: undefined,
                 creativeOperate: 'no',
-                time: [moment().subtract(6, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')],
+                time: [moment().subtract(30, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')],
                 searchStatus: 'no'
             },
             tablePag: {
@@ -908,7 +1015,51 @@ export default {
             saleShowOption: [],
             addSubjectList: [],
             rejectionReasonList: {},
-            tableOnlyId: ''
+            tableOnlyId: '',
+            saleVisible: false,
+            saleInfoList: [],
+            salePersonList: [],
+            saleLoading:false,
+            saleInfoColumns: [
+                {
+                    title: '销售名称',
+                    dataIndex: 'saleName',
+                    align: 'center',
+                    key: 'saleName',
+                    scopedSlots: { customRender: 'saleName' }
+                },
+                {
+                    title: '销售助理名称',
+                    dataIndex: 'assistantName',
+                    align: 'center',
+                    scopedSlots: { customRender: 'assistantName' }
+                },
+                {
+                    title: '操作',
+                    dataIndex: 'action',
+                    align: 'center',
+                    scopedSlots: { customRender: 'action' }
+                },
+            ],
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                
+                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;
+                    this.getSaleList()
+                }
+            },
         };
     },
     created() {
@@ -922,6 +1073,131 @@ export default {
     methods: {
         ...mapGetters(['userInfo']),
         moment,
+        //新建销售对应人员
+        handleAddSale(){
+            this.saleVisible = true
+            this.getSaleList()
+            this.getSalePersonList()
+        },
+        getSalePersonList(){
+            let params = {}
+            params.userId = this.userInfo().id
+            
+            this.getAction(urlAcount + '/finance/cwjsSaleAssistantInfo/getSaleListByUserDepart', params).then(result => {
+                if(result.code === 0) {
+                    this.salePersonList = result.result.map(item => {
+                        return {
+                            key: item.saleId,
+                            label: item.saleName
+                        }
+                    })
+                }
+                else {
+                    this.$message.error(result.message)
+                }
+            }).catch(() => {
+
+            })
+        },
+        //新增
+        addSaleInfo(){
+            this.saleInfoList.push( {
+                saleId:undefined,
+                assistantId:undefined,
+                edit: true,
+                saleIdContent: undefined,
+                assistantIdContent: undefined
+            }) 
+        },
+        //获取销售对应列表
+        getSaleList(){
+            let params = {}
+            params.userId = this.userInfo().id
+            params.pageNo = this.ipagination.current
+            params.pageSize = this.ipagination.pageSize
+            this.saleLoading = true
+            this.getAction(urlAcount + '/finance/cwjsSaleAssistantInfo/list', params).then(result => {
+                this.saleLoading = false
+                if(result.code === 0) {
+                    this.saleInfoList = result.result.records.map(item => {
+                        return {
+                            ...item,
+                            edit: false,
+                            saleIdContent: undefined,
+                            assistantIdContent: undefined
+                        }
+                    }) || []
+                    this.ipagination.total = result.result.total || 0
+                }
+                else {
+                    this.$message.error(result.message)
+                }
+            }).catch(() => {
+
+            })
+        },
+        //编辑销售对应人员按钮
+        handleEdit(item){
+            item.edit = true
+            item.saleIdContent = {key: item.saleId, label: item.saleName}
+            item.assistantIdContent = {key: item.assistantId, label: item.assistantName}
+        },
+        //删除销售对应人员按钮
+        handleDelete(id){
+            let params = {}
+            params.id = id
+            this.getAction(urlAcount + '/finance/cwjsSaleAssistantInfo/delete', params).then(result => {
+                if(result.success) {
+                    this.getSaleList()
+                }
+            })
+        },
+        //销售对应人员确定按钮
+        handleSale(item){
+            let params = {}
+            params.id = item.id?item.id:null
+            params.saleId = item.saleIdContent.key
+            params.saleName = item.saleIdContent.label.replace(/[\r\n]/g, "").trim();
+            params.assistantId = item.assistantIdContent.key
+            params.assistantName = item.assistantIdContent.label.replace(/[\r\n]/g, "").trim();
+            params.createUserId = this.userInfo().id
+            if(item.id) {
+                this.postDataAction(urlAcount + '/finance/cwjsSaleAssistantInfo/edit', params).then(result => {
+                    if(result.success) {
+                        this.getSaleList()
+                    }
+                    else{
+                        this.$message.error(result.message)
+                    }
+                })
+            }
+            else {
+                this.postDataAction(urlAcount + '/finance/cwjsSaleAssistantInfo/add', params).then(result => {
+                    if(result.success) {
+                        this.getSaleList()
+                    }
+                    else{
+                        this.$message.error(result.message)
+                    }
+                })
+            }
+            
+        },
+        //销售对应人员取消确定按钮
+        handleSaleCancelOne(item){
+            
+            if(item.id){
+                item.edit = false
+            }
+            else{
+                this.saleInfoList.pop()
+            }
+        },
+        //销售对应人员取消按钮
+        handleSaleCancel(){
+            this.saleVisible = false
+        },
+
         calculationScope(data) {
             let defaultScope = '';
             switch (data) {
@@ -942,9 +1218,24 @@ export default {
         handleFilterOption(input, option) {
             return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0;
         },
+        filterOption(input, option) {
+            return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0;
+        },
         handleAddTimesChange(date, dateString) {
             this.policyOperationForm.addTimes = dateString;
         },
+        showAreaInfo(data){
+            if(data){
+                var dataShow = this.saleShowOption.filter(item=>{
+                    return item.saleId == data
+                })
+                this.policyOperationForm.areaInfo = dataShow[0].nickName
+            }
+            else {
+                this.policyOperationForm.areaInfo = undefined
+            }
+           
+        },
         handleAddGetArea(data) {
             const paramsData = {
                 userId: this.userInfo().id
@@ -952,7 +1243,7 @@ export default {
             getAction(urlAcount + '/finance/cwjsPolicyInfo/queryAeraByUserId', paramsData).then(result => {
                 if (result.code === 0) {
                     const defaultList = result.result[0].UserCompany;
-                    this.saleShowOption = defaultList;
+                    // this.saleShowOption = defaultList;
                     this.addAreaList = defaultList[0].nickName.split(',');
                     this.addSubjectList = result.result[0].companySubjects;
                 }
@@ -962,6 +1253,17 @@ export default {
             }).catch(error => {
                 console.log(error, 'eeee');
             });
+            getAction(urlAcount + '/finance/cwjsSaleAssistantInfo/getCwSaleAndAssistantList', paramsData).then(result => {
+                if (result.code === 0) {
+                    this.saleShowOption = result.result
+                }
+                else {
+                    this.$message.error(result.message);
+                }
+            }).catch(error => {
+                console.log(error, 'eeee');
+            });
+            
         },
         handleExamineAll(data) {
             const paramsData = {
@@ -1021,7 +1323,9 @@ export default {
             };
             getAction(urlAcount + '/finance/cwjsPolicyInfo/list', paramsData).then(result => {
                 if (result.code === 0) {
+                    
                     let defaultList = result.result.list;
+                    
                     defaultList.forEach(item => {
                         item.updatePolicyProductName = item.policyProductName.join(',');
                         item.updateOperation = item.operation.split('|');
@@ -1031,6 +1335,7 @@ export default {
                     });
                     this.dataSource = defaultList;
                     this.totalAll = result.result.total;
+                    
                 }
                 else {
                     this.dataSource = [];
@@ -1373,7 +1678,7 @@ export default {
                 creativeAdvance: undefined,
                 creativeSale: undefined,
                 creativeOperate: 'no',
-                time: [moment().subtract(6, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')],
+                time: [moment().subtract(30, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')],
                 searchStatus: 'no'
             };
             this.tablePag = {

+ 62 - 0
src/warterMark.js

@@ -0,0 +1,62 @@
+
+let watermark = {}
+ 
+let setWatermark = (str) => {
+  let id = '1.23452384164.123412415'
+ 
+  if (document.getElementById(id) !== null) {
+    document.body.removeChild(document.getElementById(id))
+  }
+ 
+  let can = document.createElement('canvas')
+  can.width = 300
+  can.height = 300
+ 
+  let cans = can.getContext('2d')
+  cans.rotate(-20 * Math.PI / 180)
+  cans.font = '20px Vedana'
+  cans.fillStyle = 'rgba(200, 200, 200, 0.40)'
+  cans.textAlign = 'left'
+  cans.textBaseline = 'Middle'
+  cans.fillText(str, can.width / 3, can.height / 2)
+ 
+  let div = document.createElement('div')
+  div.id = id
+  div.style.pointerEvents = 'none'
+  div.style.top = '70px'
+  div.style.left = '100px'
+  div.style.position = 'fixed'
+  div.style.zIndex = '100000'
+  div.style.width = document.documentElement.clientWidth - 100 + 'px'
+  div.style.height = document.documentElement.clientHeight - 100 + 'px'
+  div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'
+  document.body.appendChild(div)
+  return id
+}
+ 
+// 该方法只允许调用一次
+watermark.set = (str) => {
+  let id = setWatermark(str)
+  setInterval(() => {
+    if (document.getElementById(id) === null) {
+      id = setWatermark(str)
+    }
+  }, 500)
+  window.onresize = () => {
+    setWatermark(str)
+  }
+}
+
+const outWatermark = (id) => {
+  if (document.getElementById(id) !== null) {
+    const div = document.getElementById(id)
+    div.style.display = 'none'
+  }
+}
+
+watermark.out = () => {
+  const str = '7.432756475.689573874'
+  outWatermark(str)
+}
+ 
+export default watermark

+ 2 - 2
vue.config.js

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