Browse Source

Merge branch 'work-materialUpdate'

朱鑫波 3 năm trước cách đây
mục cha
commit
6dcafb3a11

+ 19 - 15
src/components/uploadFile.vue

@@ -156,17 +156,17 @@ export default {
                 }
               })
             } else {
-              if (n == '') {
+              if (n === '') {
                 this.fileList = []
               } else {
-                this.fileList = [
-                  {
-                    uid: 1,
-                    name: 1,
-                    status: 'done',
-                    url: n,
-                  },
-                ]
+                this.fileList = []
+                var data = {
+                  uid: 1,
+                  name: '回显',
+                  status: 'done',
+                  url: n,
+                }
+                this.fileList.push(data)
               }
             }
           } else {
@@ -303,12 +303,16 @@ export default {
             that.$emit('overUpload', that.fileList)
 
             if (that.multiple) {
-              that.$emit(
-                'update:value',
-                that.fileList.map((item) => {
-                  return item.url
-                })
-              )
+              let urlList =  that.fileList.map((item) => {
+                return item.url
+              })
+             
+                that.$emit(
+                  'update:value',urlList
+                 
+                )
+    
+              
             } else {
               that.$emit(
                 'update:value',

+ 405 - 0
src/mixins/videoMaterialMixin.js

@@ -0,0 +1,405 @@
+/**
+ * 新增修改完成调用 modalFormOk方法 编辑弹框组件ref定义为modalForm
+ * 高级查询按钮调用 superQuery方法  高级查询组件ref定义为superQueryModal
+ * data中url定义 list为查询列表  delete为删除单条记录  deleteBatch为批量删除
+ */
+ import {filterObj} from '@/utils/util';
+ import moment from 'moment'
+ import {deleteAction, getAction, downFile} from '@/api/manage'
+ import Vue from 'vue'
+ import {ACCESS_TOKEN} from "@/store/mutation-types"
+ import { transformTozTreeFormat } from '@/utils/util.js'
+ export const JeecgListMixin = {
+   data() {
+     return {
+       spinning:true,
+       //token header
+       tokenHeader: {'X-Access-Token': Vue.ls.get(ACCESS_TOKEN)},
+       /* 查询条件-请不要在queryParam中声明非字符串值的属性 */
+       queryParam: {},
+       /* 数据源 */
+       dataSource: [],
+       innerData:[],
+       /* 分页参数 */
+       ipagination: {
+         current: 1,
+         pageSize: 10,
+         pageSizeOptions: ['8', '16', '32'],
+         showTotal: (total, range) => {
+           return range[0] + "-" + range[1] + " 共" + total + "条"
+         },
+         showQuickJumper: true,
+         // showSizeChanger: true,
+         total: 0
+       },
+       /* 排序参数 */
+       isorter: {
+         column: 'createTime',
+         order: 'desc',
+       },
+       /* 筛选参数 */
+       filters: {},
+       /* table加载状态 */
+       loading: false,
+       /* table选中keys*/
+       selectedRowKeys: [],
+       /* table选中records*/
+       selectionRows: [],
+       /* 查询折叠 */
+       toggleSearchStatus: false,
+       /* 高级查询条件生效状态 */
+       superQueryFlag: false,
+       /* 高级查询条件 */
+       superQueryParams: ""
+     }
+   },
+   mounted() {
+     if(this.startList){
+ 
+     }else{
+        this.loadData();
+     }
+     //初始化字典配置 在自己页面定义
+     this.initDictConfig();
+   },
+   methods: {
+     // 二级树
+     expand(expanded,record){
+         if(this.url.listTwo){
+             var param = {}
+             param.field = this.getQueryField();
+             param.pageNo = this.ipagination.current;
+             param.pageSize = this.ipagination.pageSize;
+             param.parentId = record.id
+             if(expanded){
+                 getAction(this.url.listTwo, filterObj(param)).then((res) => {
+                     if (res.success) {
+                         record.innerData=res.result.records.map((item,index)=>{
+                             return {
+                                 ...item,
+                                 key:index
+                             }
+                         })
+                         // console.log(record.innerData)
+                         record.innerData = transformTozTreeFormat( record.innerData)
+                     }
+                     if (res.code === 510) {
+                       this.$message.warning(res.message)
+                     }
+                     this.loading = false;
+                 })
+             }else{
+                 record.innerData = []
+             }
+         }
+     },
+     async loadData(arg) {
+       this.spinning= true
+       this.dataSource = []
+       if (!this.url.list) {
+         this.$message.error("请设置url.list属性!")
+         return
+       }
+       //加载数据 若传入参数1则加载第一页的内容
+       if (arg === 1) {
+         this.ipagination.current = 1;
+       }
+       var params = this.getQueryParams();//查询条件
+       if(params.createTime&&params.createTime.length>0){
+         // params.createTime = moment(params.createTime).format('YYYY-MM-DD')
+         params.startDate = moment(params.createTime[0]).format('YYYY-MM-DD')
+         params.endDate = moment(params.createTime[1]).format('YYYY-MM-DD')
+         params.createTime = null
+       }
+       if(params.stateDate){
+         params.stateDate = moment(params.stateDate).format('YYYY-MM-DD')
+       }
+       // if(params.endDate){
+       //   params.endDate = moment(params.endDate).format('YYYY-MM-DD')
+       // }
+ 
+       this.loading = true;
+       await getAction(this.url.list, params).then((res) => {
+         if (res.success) {
+           this.loading = false;
+           if(res.result){
+             if(res.result.records){
+               this.dataSource = res.result.records.map(item=>{
+                 return {
+                     ...item,
+                     innerData:[],
+                     showVideo:false
+                 }
+               })
+               this.ipagination.total = res.result.total;
+             }else if(res.result.list){
+               this.dataSource = res.result.list.map(item=>{
+                 return {
+                     ...item,
+                     innerData:[],
+                     showVideo:false
+                 }
+               })
+               this.ipagination.total = res.result.total;
+             }else{
+               this.dataSource = res.result.map(item=>{
+                 return {
+                     ...item,
+                     innerData:[],
+                     showVideo:false
+                 }
+               })
+               // this.ipagination = null;
+               this.ipagination.pageSize=res.result.length
+             }
+           }else if(res.data){
+             if(res.data.list){
+               this.dataSource = res.data.list.map(item=>{
+                 return {
+                     ...item,
+                     innerData:[],
+                     showVideo:false
+                 }
+               })
+               this.ipagination.total = res.data.total;
+             }
+           }
+           
+           this.spinning= false
+         }
+         if (res.code === 510) {
+           this.$message.warning(res.message)
+         }
+         this.loading = false;
+         this.spinning= false
+       })
+     },
+     initDictConfig() {
+     //   console.log("--这是一个假的方法!")
+     },
+     handleSuperQuery(arg) {
+       //高级查询方法
+       if (!arg) {
+         this.superQueryParams = ''
+         this.superQueryFlag = false
+       } else {
+         this.superQueryFlag = true
+         this.superQueryParams = JSON.stringify(arg)
+       }
+       this.loadData()
+     },
+     editDate(value) {
+       let date = new Date(value)
+       let y = date.getFullYear()
+       let MM = date.getMonth() + 1
+       MM = MM < 10 ? '0' + MM : MM
+       let d = date.getDate()
+       d = d < 10 ? '0' + d : d
+       return y + '-' + MM + '-' + d
+     },
+     getQueryParams() {
+       //获取查询条件
+       let sqp = {}
+       if (this.superQueryParams) {
+         sqp['superQueryParams'] = encodeURI(this.superQueryParams)
+       }
+       // console.log(this.queryParam)
+       var param = {...this.queryParam,...this.isorter, ...this.filters}
+       param.pageNo = this.ipagination.current;
+       param.pageSize = this.ipagination.pageSize;
+       return param
+     },
+     getQueryField() {
+       //TODO 字段权限控制
+       var str = "id,";
+       this.columns.forEach(function (value) {
+         str += "," + value.dataIndex;
+       });
+       return str;
+     },
+ 
+     onSelectChange(selectedRowKeys, selectionRows) {
+       this.selectedRowKeys = selectedRowKeys;
+       this.selectionRows = selectionRows;
+     },
+     onClearSelected() {
+       this.selectedRowKeys = [];
+       this.selectionRows = [];
+     },
+     searchQuery() {
+       this.loadData(1);
+     },
+     superQuery() {
+       this.$refs.superQueryModal.show();
+     },
+     searchReset() {
+       this.queryParam = {}
+       this.loadData(1);
+     },
+     batchDel: function () {
+       if (!this.url.deleteBatch) {
+         this.$message.error("请设置url.deleteBatch属性!")
+         return
+       }
+       if (this.selectedRowKeys.length <= 0) {
+         this.$message.warning('请选择一条记录!');
+         return;
+       } else {
+         var ids = "";
+         for (var a = 0; a < this.selectedRowKeys.length; a++) {
+           ids += this.selectedRowKeys[a] + ",";
+         }
+         var that = this;
+         this.$confirm({
+           title: "确认删除",
+           content: "是否删除选中数据?",
+           onOk: function () {
+             deleteAction(that.url.deleteBatch, {ids: ids}).then((res) => {
+               if (res.success) {
+                 that.$message.success(res.message);
+                 that.loadData();
+                 that.onClearSelected();
+               } else {
+                 that.$message.warning(res.message);
+               }
+             });
+           }
+         });
+       }
+     },
+     handleDelete: function (id) {
+       if (!this.url.delete) {
+         this.$message.error("请设置url.delete属性!")
+         return
+       }
+       var that = this;
+       deleteAction(that.url.delete, {id: id}).then((res) => {
+         if (res.success) {
+           that.$message.success(res.message);
+           that.loadData();
+         } else {
+           that.$message.warning(res.message);
+         }
+       });
+     },
+     handleEdit: function (record,sign) {
+         // console.log(record,sign)
+       this.$refs.modalForm.edit(record,sign);
+       this.$refs.modalForm.title = "编辑";
+       this.$refs.modalForm.disableSubmit = false;
+       if(sign == 'preview'){
+         this.$refs.modalForm.title = "预览";
+       }
+     },
+     handleImagePreview: function (record) {
+         this.$refs.modalForm.imagePreview(record);
+         this.$refs.modalForm.title = "预览";
+         this.$refs.modalForm.disableSubmit = false;
+     },
+     handleAdd: function (sign) {
+       this.$refs.modalForm.add(sign);
+       this.$refs.modalForm.title = "新增";
+       this.$refs.modalForm.disableSubmit = false;
+     },
+     handleOpen: function () {
+       this.$refs.userForm.open();
+       this.$refs.userForm.title = "选择";
+       this.$refs.userForm.disableSubmit = false;
+     },
+     handleTableChange(pagination, filters, sorter) {
+       //分页、排序、筛选变化时触发
+       //TODO 筛选
+       if (Object.keys(sorter).length > 0) {
+         this.isorter.column = sorter.field;
+         this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
+       }
+       this.ipagination = pagination;
+       this.loadData();
+     },
+     handleToggleSearch() {
+       this.toggleSearchStatus = !this.toggleSearchStatus;
+     },
+     modalFormOk() {
+       // 新增/修改 成功时,重载列表
+       this.loadData(this.ipagination.current);
+     },
+     handleDetail: function (record) {
+       this.$nextTick(()=>{
+         this.$refs.modalForm.edit(record);
+         this.$refs.modalForm.title = "详情";
+         this.$refs.modalForm.disableSubmit = true;
+       })
+       
+     },
+     /* 导出 */
+     handleExportXls2() {
+       let paramsStr = encodeURI(JSON.stringify(this.getQueryParams()));
+       let url = `${window._CONFIG['domianURL']}/${this.url.exportXlsUrl}?paramsStr=${paramsStr}`;
+       window.location.href = url;
+     },
+     handleExportXls(fileName) {
+       if (!fileName || typeof fileName != "string") {
+         fileName = "导出文件"
+       }
+       let param = {...this.queryParam};
+       if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
+         param['selections'] = this.selectedRowKeys.join(",")
+       }
+       // console.log("导出参数", param)
+       downFile(this.url.exportXlsUrl, param).then((data) => {
+         if (!data) {
+           this.$message.warning("文件下载失败")
+           return
+         }
+         if (typeof window.navigator.msSaveBlob !== 'undefined') {
+           window.navigator.msSaveBlob(new Blob([data]), fileName + '.xls')
+         } else {
+           let url = window.URL.createObjectURL(new Blob([data]))
+           let link = document.createElement('a')
+           link.style.display = 'none'
+           link.href = url
+           link.setAttribute('download', fileName + '.xls')
+           document.body.appendChild(link)
+           link.click()
+           document.body.removeChild(link); //下载完成移除元素
+           window.URL.revokeObjectURL(url); //释放掉blob对象
+         }
+       })
+     },
+     /* 导入 */
+     handleImportExcel(info) {
+       if (info.file.status !== 'uploading') {
+         // console.log(info.file, info.fileList);
+       }
+       if (info.file.status === 'done') {
+         if (info.file.response.success) {
+           this.$message.success(`${info.file.name} 文件上传成功`);
+           this.loadData();
+         } else {
+           this.$message.error(`${info.file.name} ${info.file.response.message}.`);
+         }
+       } else if (info.file.status === 'error') {
+         this.$message.error(`文件上传失败: ${info.file.msg} `);
+       }
+     },
+     /* 图片预览 */
+     getImgView(text) {
+       if (text && text.indexOf(",") > 0) {
+         text = text.substring(0, text.indexOf(","))
+       }
+       return window._CONFIG['imgDomainURL'] + "/" + text
+     },
+     /* 文件下载 */
+     uploadFile(text) {
+       if (!text) {
+         this.$message.warning("未知的文件")
+         return;
+       }
+       if (text.indexOf(",") > 0) {
+         text = text.substring(0, text.indexOf(","))
+       }
+       window.open(window._CONFIG['domianURL'] + "/sys/common/download/" + text);
+     },
+   }
+ 
+ }

+ 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'; // 生产环境
 	
 }
 const service = axios.create({

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

@@ -419,6 +419,11 @@ a {
               </a-select>
             </a-form-item>
           </a-col>
+           <a-col :md="8" :sm="8">
+            <a-form-item label="设计负责人">
+              <a-input placeholder="请输入设计负责人" v-model="queryParam.leaderName"></a-input>
+            </a-form-item>
+          </a-col>
 
           <a-col :md="8" :sm="8">
             <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
@@ -447,6 +452,12 @@ a {
         >新增</a-button
       >
       <a-button
+        @click="batchUploadVisible=true"
+        type="primary"
+        icon="plus"
+        >批量新增</a-button
+      >
+      <a-button
         @click="onCheckAllChange"
         v-if="
           queryParam.productId &&
@@ -798,6 +809,9 @@ a {
                         <a-menu-item key="5">
                           <a href="javascript:;" style="margin-right: 20px" @click="editTagList(items)">修改标签</a>
                         </a-menu-item>
+                        <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>
                     </a-dropdown>
                     <a-checkbox :value="items.id" style="float: right" v-show="active == '1'"></a-checkbox>
@@ -814,10 +828,13 @@ a {
               style="float: right"
               v-if="dataSource.length > 0"
               showQuickJumper
+              showSizeChanger
               :pageSize.sync="ipagination.pageSize"
               :total="ipagination.total"
               v-model="ipagination.current"
+              :pageSizeOptions="ipagination.pageSizeOptions"
               @change="getDataSource"
+              @showSizeChange="getDataSourceSize"
             />
           </div>
           <div v-else style="width: 100%; height: 400px; display: flex; justify-content: center; align-items: center">
@@ -831,6 +848,25 @@ a {
         </a-spin>
       </a-tab-pane>
     </a-tabs>
+    <a-modal title="修改素材名称" @cancel="editMaterialVisible=false" v-if="editMaterialVisible" v-model="editMaterialVisible">
+      <template slot="footer">
+        <a-button key="back" @click="editMaterialVisible=false">取消</a-button>
+        <a-button type="primary" @click="handleOkEditMaterialName" :loading="loadingEdit">确定</a-button>
+      </template>
+      <a-form :form="editMaterialform">
+        <a-form-model-item
+          label="素材名称"
+        >
+          <a-input placeholder="请填写素材名称" 
+          v-decorator="[
+              'name',
+              {
+                  rules: [{ required: true, message: '素材名称不能为空' }]
+              }
+          ]" />
+        </a-form-model-item>
+      </a-form>
+    </a-modal>
     <a-modal title="封面上传" @cancel="closeImage" @afterClose="closeImage" v-model="addImageVisible">
       <template slot="footer">
         <a-button key="back" @click="closeImage">取消</a-button>
@@ -906,6 +942,238 @@ a {
       </div>
     </a-modal>
 
+     <a-modal
+      title="批量上传素材"
+      v-model="batchUploadVisible"
+      v-if="batchUploadVisible"
+      :maskClosable="false"
+      :width="1200"
+    >
+      <template slot="footer">
+        <a-button type="primary" @click="handleOkBatch" :loading="loadingBatch">确定</a-button>
+      </template>
+      <a-form-model
+        ref="ruleForm"
+        :model="ruleForm"
+        :label-col="{ span: 4 }"
+        :wrapper-col="{ span: 14 }"
+      >
+       
+        <a-form-model-item ref="name" label="项目选择" prop="projectId" :rules="{
+          required: true,
+          message: '项目不能为空',
+          trigger: 'blur',
+        }">
+          <a-select
+            v-model="ruleForm.projectId"
+            @change="getProjectId"
+            @focus="getParticipateList"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="filterOption"
+            @search="getParticipateList"
+            :disabled="!add"
+          >
+            <a-select-option :value="item.projectId" v-for="item of dataElse" :key="item.id">
+              {{ item.projectName }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{
+                item.mediaId == '1'
+                  ? '头条'
+                  : item.mediaId == '2'
+                  ? '快手'
+                  : item.mediaId == '3'
+                  ? '头条内广'
+                  : '快手内广'
+              }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ item.advertiserName }}
+            </a-select-option>
+          </a-select>
+        </a-form-model-item>
+        <a-form-model-item label="视频上传" prop="videoList"  v-if="ruleForm.projectId!=''">
+          <uploadFile
+            :checkFile="ruleFormFile"
+            :value.sync="ruleForm.urlList"
+            @overUpload="ruleFormOverUpload"
+            @removeUpload="ruleFormRemoveUpload"
+            :fileCount="10"
+            :sizeCheck="true"
+            uploadType="video"
+            :multiple="true"
+            v-if="batchUploadVisible"
+          />
+          <!-- <uploadFile
+            :checkFile="file"
+            :value.sync="urlList.url"
+            @overUpload="overUpload"
+            @removeUpload="removeUpload"
+            :fileCount="2"
+            uploadType="video"
+            :multiple="true"
+          /> -->
+        </a-form-model-item>
+
+        <a-form-model-item :wrapper-col="{ span: 14 , offset:4}">
+          <el-collapse v-model="activeCollapse" accordion v-if="ruleForm.urlList.length>0">
+            <el-collapse-item :title="'视频'+(index+1)" :name="index" v-for="(items,index) of ruleForm.urlListData" :key="index">
+              <a-form-model-item label="视频" :label-col="{ span: 4 }"
+              :wrapper-col="{ span: 14 }">
+                <video :src="items.url" style="width:150px"></video>
+              </a-form-model-item>
+              <a-form-model-item label="素材名称"  
+                :key="index"
+                :prop="'urlListData.'+index+'.materialName'" 
+                :label-col="{ span: 4 }" 
+                :wrapper-col="{ span: 14 }"
+                :rules="{
+                  required: true,
+                  message: '素材名称必填',
+                  trigger: 'blur',
+                }"
+              >
+                <a-input placeholder="请输入素材名称" v-model="items.materialName"></a-input>
+              </a-form-model-item>
+              
+              <a-form-model-item label="剪辑"  
+              :key="index"
+              :prop="'urlListData.'+index+'.clipId'" 
+              :label-col="{ span: 4 }" 
+              :wrapper-col="{ span: 14 }"
+              :rules="{
+                required: true,
+                message: '剪辑必选',
+                trigger: 'blur',
+              }">
+                  <a-select
+                  v-model="items.clipId"
+                  showSearch
+                  optionFilterProp="children"
+                  :filterOption="filterOption"
+                >
+                  <a-select-option :value="item.userId" v-for="item of ascription.clipId" :key="item.userId">{{
+                    item.userName
+                  }}</a-select-option>
+                </a-select>
+              </a-form-model-item>
+              <a-form-model-item label="策划" 
+              :prop="'urlListData.' + index  + '.planId'"  
+              :label-col="{ span: 4 }" 
+              :wrapper-col="{ span: 14 }"
+              :rules="{
+                required: true,
+                message: '策划必选',
+                trigger: 'blur',
+              }">
+                <a-select
+                  v-model="items.planId"
+                  showSearch
+                  optionFilterProp="children"
+                  :filterOption="filterOption"
+                >
+                  <a-select-option :value="item.userId" v-for="item of ascription.planId" :key="item.userId">{{
+                    item.userName
+                  }}</a-select-option>
+                </a-select>
+                
+              </a-form-model-item>
+              <a-form-model-item label="拍摄" 
+              :prop="'urlListData.'+index+'.shotId'"  
+              :label-col="{ span: 4 }" 
+              :wrapper-col="{ span: 14 }">
+                  <a-select
+                  v-model="items.shotId"
+                  showSearch
+                  optionFilterProp="children"
+                  :filterOption="filterOption"
+                >
+                  <a-select-option :value="item.userId" v-for="item of ascription.shotId" :key="item.userId">{{
+                    item.userName
+                  }}</a-select-option>
+                </a-select>
+              </a-form-model-item>
+
+              <a-form-model-item label="形式标签" 
+              :prop="'urlListData.'+index+'.modalityTagList'"  
+              :label-col="{ span: 4 }" 
+              :wrapper-col="{ span: 14 }"
+              :rules="{
+                required: true,
+                message: '形式标签必选',
+                trigger: 'blur',
+              }">
+                  <el-cascader
+                    placeholder="搜索你想要的形式标签"
+                    :options="departTreeModality"
+                    v-model="items.modalityTagList"
+                    :props="{
+                      multiple: true,
+                      value: 'id',
+                      label: 'tagName',
+                      emitPath: false,
+                      checkStrictly: true,
+                      expandTrigger: 'hover',
+                    }"
+                    filterable
+                    style="width: 100%"
+                  ></el-cascader>
+              </a-form-model-item>
+              <a-form-model-item label="场景标签" 
+              :prop="'urlListData.'+index+'.senceTagList'"  
+              :label-col="{ span: 4 }" 
+              :wrapper-col="{ span: 14 }"
+                :rules="{
+                required: true,
+                message: '场景标签必选',
+                trigger: 'blur',
+              }">
+                <el-cascader
+                  placeholder="搜索你想要的场景标签"
+                  :options="departTreeSence"
+                  v-model="items.senceTagList"
+                  :props="{
+                    multiple: true,
+                    value: 'id',
+                    label: 'tagName',
+                    emitPath: false,
+                    checkStrictly: true,
+                    expandTrigger: 'hover',
+                  }"
+                  filterable
+                  style="width: 100%"
+                ></el-cascader>
+              </a-form-model-item>
+              <a-form-model-item label="基调标签" 
+              :prop="'urlListData.'+index+'.modTagList'"  
+              :label-col="{ span: 4 }" 
+              :wrapper-col="{ span: 14 }"
+                :rules="{
+                required: true,
+                message: '基调标签必选',
+                trigger: 'blur',
+              }">
+                 <el-cascader
+                  placeholder="搜索你想要的基调标签"
+                  :options="departTreeMod"
+                  v-model="items.modTagList"
+                  :props="{
+                    multiple: true,
+                    value: 'id',
+                    label: 'tagName',
+                    emitPath: false,
+                    checkStrictly: true,
+                    expandTrigger: 'hover',
+                  }"
+                  filterable
+                  style="width: 100%"
+                ></el-cascader>
+              </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>
+            </el-collapse-item>
+          </el-collapse>
+        </a-form-model-item>
+      </a-form-model>
+    </a-modal>
+
+
     <a-modal
       :title="add ? '添加素材' : '修改素材'"
       v-model="visible"
@@ -1808,7 +2076,7 @@ a {
 <script>
 import changeFace from '@/views/modules/Statistics/change-face/change-face';
 import PermissionModal from './modules/DepartModal'
-import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import { JeecgListMixin } from '@/mixins/videoMaterialMixin'
 import JEllipsis from '@/components/jeecg/JEllipsis'
 import UploadToAli from '@femessage/upload-to-ali'
 import { fileCheck, fileCheckImage, fileEdit, fileEditAll, fileInsertV2 } from '@/api/actor'
@@ -1824,6 +2092,7 @@ import uploadFile from '@/components/uploadFile.vue'
 import { closeAllVideoFun, stopOtherVideo } from '@/utils/videoControl'
 import accountCheck from './accountCheck'
 import accountCheckBytedance from './accountCheckBytedance'
+let md5Arr = []
 export default {
   name: 'video-material',
   mixins: [JeecgListMixin],
@@ -1841,6 +2110,13 @@ export default {
 
   data() {
     return {
+      ruleForm:{
+        projectId:'',
+        urlList:[],
+        urlListData:[]
+      },
+      loadingBatch:false,
+      batchUploadVisible:false,
       controlLoading: false,
       defaultCurrent: 1,
       settlementColumns: [
@@ -1935,7 +2211,9 @@ export default {
           },
         },
       ],
-
+      editMaterialVisible:false,
+      editMaterialId:'',
+      loadingEdit:false,
       addImageVisible: false,
       addImageData: null,
       projectId: '',
@@ -2017,6 +2295,7 @@ export default {
       detail: false,
       form: this.$form.createForm(this),
       formPerson: this.$form.createForm(this),
+      editMaterialform: this.$form.createForm(this),
       tags: [],
       refuseFile: [],
       refuseReason: '',
@@ -2065,7 +2344,8 @@ export default {
       allDetailData: null,
       dataAllList: [],
       dataSourceFace: [],
-      totalAll: 0
+      totalAll: 0,
+      activeCollapse: 0
     }
   },
   filters: {
@@ -2181,8 +2461,158 @@ export default {
         // this.loadData()
       },
     },
+    batchUploadVisible:function(n,o){
+      if(!n){
+        md5Arr = []
+        this. ruleForm={
+          projectId:'',
+          urlList:[],
+          urlListData:[]
+        }
+      }
+    }
   },
   methods: {
+            //     :checkFile="ruleFormFile"
+            // :value.sync="ruleForm.urlList"
+            // @overUpload="ruleFormOverUpload"
+            // @removeUpload="ruleFormRemoveUpload"
+    ruleFormFile(file){
+      var bmf = new BMF()
+      var that = this
+      return new Promise(function (resolve, reject) {
+        bmf.md5(file, (err, md5) => {
+          let videoInfo = {name:file.name,md5:md5}
+          if(md5Arr.findIndex(item=>item==md5)>-1){
+            reject()
+            that.$message.error('素材'+file.name+'已经上传')
+            return
+          }else{
+            md5Arr.push(md5)
+          }
+          
+          // that.ruleForm.urlList = []
+          fileCheck({
+            code: md5,
+            projectId: that.ruleForm.projectId,
+          }).then((res) => {
+            if (res.code == 0) {
+              that.$message.error('素材'+file.name+'已经上传')
+
+              reject()
+            } else {
+              resolve()
+              //   reject()
+            }
+          })
+        })
+      })
+    },
+    ruleFormOverUpload(urlAll){
+      this.ruleForm.urlListData = urlAll.map(item=>{
+        return {
+          url:item.url,
+          planId:undefined,
+          clipId:undefined,
+          shotId:undefined,
+          modTagList:[],
+          modalityTagList:[],
+          senceTagList:[],
+          materialName:''
+        }
+      })
+    },
+    ruleFormRemoveUpload(file){
+      //media-1301855440.cos.ap-chongqing.myqcloud.com/video/2021-08-16/03-1629102879421.mp4
+      let index = this.ruleForm.urlListData.findIndex(item=>item.url==file.url)
+      md5Arr = []
+      if(index>-1){
+
+        this.ruleForm.urlListData.splice(index,1)
+
+      }
+    },
+    handleOkBatch(){
+      this.$refs.ruleForm.validate(valid => {
+        if(valid){
+          if(this.ruleForm.urlListData.length == 0){
+            this.$message.error('请上传视频素材')
+            return
+          }
+          this.loadingBatch = true
+          let params = {}
+          params.projectId = this.ruleForm.projectId
+          params.videoArray = this.ruleForm.urlListData.map(item=>{
+            return {
+              ...item,
+              ascription:{
+                planId:item.planId,
+                clipId:item.clipId,
+                shotId:item.shotId,
+              }
+            }
+          })
+          postAction('/insertV3',params).then(res=>{
+            this.loadingBatch = false
+            if(res.success){
+              md5Arr = []
+              this.$message.success('上传成功')
+              this.batchUploadVisible = false
+              this.loadData(1)
+            }else{
+               this.$message.error(res.message)
+            }
+          })
+        }else{
+          this.$message.error('有必填项未填')
+        }
+
+      })
+    },
+    syncDesign(){
+      let clipId = this.ruleForm.urlListData[0].clipId
+      let planId = this.ruleForm.urlListData[0].planId
+      let shotId = this.ruleForm.urlListData[0].shotId
+      this.ruleForm.urlListData = this.ruleForm.urlListData.map(item=>{
+        return {
+          ...item,
+          clipId,
+          planId,
+          shotId
+        }
+      })
+    },
+    editMaterialName(item) {
+      this.editMaterialVisible = true
+      this.editMaterialId = item.id
+      this.$nextTick(()=>{
+        this.editMaterialform.setFieldsValue({name:item.materialName})
+      })
+
+    },
+    handleOkEditMaterialName(){
+      this.editMaterialform.validateFieldsAndScroll((err, values) => {
+        if (err) {
+          // 这里做逻辑处理
+        } else {
+          this.loadingEdit = true
+          let params={}
+          params.id = this.editMaterialId
+          params.name = values.name
+          postAction('/ctop/materialInfo/editName', params).then(res=>{
+            this.loadingEdit = false
+            if(res.success){
+              this.$message.success('修改成功')
+              this.editMaterialVisible = false
+              this.editMaterialform.resetFields()
+            }else{
+              this.$message.error(res.message)
+            }
+
+          })
+        }
+      })
+    },
     // TODO 推送操作
     handlePushData(list) {
       const paramsData = {
@@ -3443,6 +3873,14 @@ export default {
     },
     getDataSource(page, pageSize) {
       this.ipagination.current = page
+      this.ipagination.pageSize = pageSize
+      this.checkArr = []
+      this.checkAll = false
+      this.loadData()
+    },
+    getDataSourceSize(page, pageSize) {
+      this.ipagination.current = 1
+      this.ipagination.pageSize = pageSize
       this.checkArr = []
       this.checkAll = false
       this.loadData()