Browse Source

Merge branch 'master' of http://8.136.199.33:3000/eta_front/eta_front

jwyu 1 year ago
parent
commit
4225d4c6e4
36 changed files with 1268 additions and 344 deletions
  1. 10 0
      src/api/modules/sheetApi.js
  2. BIN
      src/assets/img/icons/back_arrow_blue_new.png
  3. BIN
      src/assets/img/icons/choose_bluebg_new.png
  4. BIN
      src/assets/img/icons/download_blue.png
  5. BIN
      src/assets/img/icons/edit_blue_new.png
  6. BIN
      src/assets/img/icons/refresh_blue_new.png
  7. BIN
      src/assets/img/icons/save_as_blue_new.png
  8. BIN
      src/assets/img/icons/save_blue_new.png
  9. BIN
      src/assets/img/ppt_m/add_first.png
  10. 24 3
      src/routes/modules/chartRoutes.js
  11. 5 1
      src/utils/buttonConfig.js
  12. 1 1
      src/views/chartRelevance_manage/components/selectTarget.vue
  13. 156 23
      src/views/datasheet_manage/addSheet.vue
  14. 40 4
      src/views/datasheet_manage/common/option.js
  15. 57 3
      src/views/datasheet_manage/components/CustomTable.vue
  16. 25 1
      src/views/datasheet_manage/components/MixedTable.vue
  17. 29 3
      src/views/datasheet_manage/components/SheetExcel.vue
  18. 1 1
      src/views/datasheet_manage/customAnalysis/addAnalysisSheet.vue
  19. 292 0
      src/views/datasheet_manage/customAnalysis/edit.vue
  20. 150 93
      src/views/datasheet_manage/customAnalysis/list.vue
  21. 196 81
      src/views/datasheet_manage/customSheetEdit.vue
  22. 88 16
      src/views/datasheet_manage/mixedSheetEdit.vue
  23. 3 1
      src/views/datasheet_manage/mixins/classifyMixin.js
  24. 126 81
      src/views/datasheet_manage/sheetList.vue
  25. 2 2
      src/views/ppt_manage/newVersion/components/Cover.vue
  26. 2 2
      src/views/ppt_manage/newVersion/components/CoverEn.vue
  27. 1 1
      src/views/ppt_manage/newVersion/components/catalog/pptContent.vue
  28. 2 2
      src/views/ppt_manage/newVersion/pptEditor.vue
  29. 2 2
      src/views/ppt_manage/newVersion/pptEnEditor.vue
  30. 6 4
      src/views/ppt_manage/newVersion/pptEnPresent.vue
  31. 4 4
      src/views/ppt_manage/newVersion/pptEnPublish.vue
  32. 6 4
      src/views/ppt_manage/newVersion/pptPresent.vue
  33. 4 4
      src/views/ppt_manage/newVersion/pptPublish.vue
  34. 2 1
      src/views/sandbox_manage/index.vue
  35. 33 6
      src/views/system_manage/newAuthManage.vue
  36. 1 0
      src/vuex/modules/permissionButton.js

+ 10 - 0
src/api/modules/sheetApi.js

@@ -98,6 +98,16 @@ export const sheetEdit = params => {
 	return http.post('/datamanage/excel_info/edit',params)
 	return http.post('/datamanage/excel_info/edit',params)
 }
 }
 
 
+/**
+ * 标记表格的编辑状态 
+ * @param {*} params ExcelInfoId 
+ * @param {*} params Status  1:编辑中,2:编辑完成
+ * @returns 
+ */
+export const markSheetEditStatus = params => {
+	return http.post('/datamanage/excel_info/mark',params)
+}
+
 /**
 /**
  * 获取表格详情
  * 获取表格详情
  * @param {*} params ExcelInfoId 
  * @param {*} params ExcelInfoId 

BIN
src/assets/img/icons/back_arrow_blue_new.png


BIN
src/assets/img/icons/choose_bluebg_new.png


BIN
src/assets/img/icons/download_blue.png


BIN
src/assets/img/icons/edit_blue_new.png


BIN
src/assets/img/icons/refresh_blue_new.png


BIN
src/assets/img/icons/save_as_blue_new.png


BIN
src/assets/img/icons/save_blue_new.png


BIN
src/assets/img/ppt_m/add_first.png


+ 24 - 3
src/routes/modules/chartRoutes.js

@@ -118,17 +118,38 @@ export default [
 			{
 			{
 				path:"addSheet",
 				path:"addSheet",
 				name:"添加表格",
 				name:"添加表格",
-				component:()=>import('@/views/datasheet_manage/addSheet.vue')
+				component:()=>import('@/views/datasheet_manage/addSheet.vue'),
+				meta: { 
+					pathFrom: "sheetList",
+					pathName: "在线Excel",
+				}
 			},
 			},
 			{
 			{
 				path:"addCustomSheet",
 				path:"addCustomSheet",
 				name:"添加数据表格",
 				name:"添加数据表格",
-				component:()=>import('@/views/datasheet_manage/customSheetEdit.vue')
+				component:()=>import('@/views/datasheet_manage/customSheetEdit.vue'),
+				meta: { 
+					pathFrom: "sheetTimeList",
+					pathName: "时间序列表格",
+				}
 			},
 			},
 			{
 			{
 				path:"addMixedSheet",
 				path:"addMixedSheet",
 				name:"添加混合表格",
 				name:"添加混合表格",
-				component:()=>import('@/views/datasheet_manage/mixedSheetEdit.vue')
+				component:()=>import('@/views/datasheet_manage/mixedSheetEdit.vue'),
+				meta: { 
+					pathFrom: "sheetMixedList",
+					pathName: "混合表格",
+				}
+			},
+			{
+				path:"editSheetAnalysis",
+				name:"编辑表格",
+				component:()=>import('@/views/datasheet_manage/customAnalysis/edit.vue'),
+				meta: { 
+					pathFrom: "sheetAnalysisList",
+					pathName: "自定义分析",
+				}
 			},
 			},
 			{
 			{
 				path:"sheetAnalysisList",
 				path:"sheetAnalysisList",

+ 5 - 1
src/utils/buttonConfig.js

@@ -385,6 +385,7 @@ export const etaTablePermission = {
     etaTable_customize_mix_refresh:'etaTable:customize:mix:refresh',//刷新
     etaTable_customize_mix_refresh:'etaTable:customize:mix:refresh',//刷新
     etaTable_customize_mix_otherSave:'etaTable:customize:mix:otherSave',//另存为
     etaTable_customize_mix_otherSave:'etaTable:customize:mix:otherSave',//另存为
     etaTable_customize_mix_download:'etaTable:customize:mix:download',//下载
     etaTable_customize_mix_download:'etaTable:customize:mix:download',//下载
+    etaTable_customize_mix_save:'etaTable:customize:mix:save',//保存
     etaTable_customize_mix_del:'etaTable:customize:mix:del',//删除
     etaTable_customize_mix_del:'etaTable:customize:mix:del',//删除
 
 
     //数据表格页面
     //数据表格页面
@@ -396,6 +397,7 @@ export const etaTablePermission = {
     etaTable_customize_data_otherSave:'etaTable:customize:data:otherSave',//另存为
     etaTable_customize_data_otherSave:'etaTable:customize:data:otherSave',//另存为
     etaTable_customize_data_download:'etaTable:customize:data:download',//下载
     etaTable_customize_data_download:'etaTable:customize:data:download',//下载
     etaTable_customize_data_del:'etaTable:customize:data:del',//删除
     etaTable_customize_data_del:'etaTable:customize:data:del',//删除
+    etaTable_customize_data_save:'etaTable:customize:data:save',//保存
 
 
     /*-----------excel表格页面--------- */
     /*-----------excel表格页面--------- */
     etaTable_excel:'etaTable:excel',//添加Excel表格这个按钮显示不显示
     etaTable_excel:'etaTable:excel',//添加Excel表格这个按钮显示不显示
@@ -403,7 +405,8 @@ export const etaTablePermission = {
     etaTable_excel_classifyOpt_delete:'etaTable:excel:classifyOpt:delete',//删除表格
     etaTable_excel_classifyOpt_delete:'etaTable:excel:classifyOpt:delete',//删除表格
     etaTable_excel_del:'etaTable:excel:del',
     etaTable_excel_del:'etaTable:excel:del',
     etaTable_excel_download:'etaTable:excel:download',
     etaTable_excel_download:'etaTable:excel:download',
-    etaTable_excel_save:'etaTable:excel:save',
+    etaTable_excel_save:'etaTable:excel:save',//保存
+    etaTable_excel_edit:'etaTable:excel:edit',
 
 
     //自定义分析表格页面
     //自定义分析表格页面
     // etaTable_analysis_sheetAdd: 'etaTable:analysis:sheetAdd',//添加数据表格按钮
     // etaTable_analysis_sheetAdd: 'etaTable:analysis:sheetAdd',//添加数据表格按钮
@@ -416,6 +419,7 @@ export const etaTablePermission = {
     etaTable_analysis_download:'etaTable:analysis:download',//下载
     etaTable_analysis_download:'etaTable:analysis:download',//下载
     etaTable_analysis_del:'etaTable:analysis:del',//删除
     etaTable_analysis_del:'etaTable:analysis:del',//删除
     etaTable_analysis_save:'etaTable:analysis:save',//保存
     etaTable_analysis_save:'etaTable:analysis:save',//保存
+    etaTable_analysis_edit:'etaTable:analysis:edit',//编辑
 }
 }
 /*
 /*
  * --------------------------------------------------------------------------ETA逻辑------------------------------------------------
  * --------------------------------------------------------------------------ETA逻辑------------------------------------------------

+ 1 - 1
src/views/chartRelevance_manage/components/selectTarget.vue

@@ -15,7 +15,7 @@
       />
       />
     </el-select>
     </el-select>
 
 
-    <div v-else-if="selectStyleType===2">
+    <div v-else-if="selectStyleType===2" class="database-choose">
       <label>选择指标:</label>
       <label>选择指标:</label>
       <el-radio-group v-model="targetType" @change="targetTypeChange">
       <el-radio-group v-model="targetType" @change="targetTypeChange">
         <el-radio  
         <el-radio  

+ 156 - 23
src/views/datasheet_manage/addSheet.vue

@@ -3,20 +3,18 @@
     <div class="wrap-top">
     <div class="wrap-top">
       <ul class="form-ul">
       <ul class="form-ul">
         <li style="margin-right:30px;">
         <li style="margin-right:30px;">
-          表格名称:
           <el-input
           <el-input
             v-model="sheetForm.name"
             v-model="sheetForm.name"
             placeholder="请输入表格名称"
             placeholder="请输入表格名称"
             clearable
             clearable
-            style="width:300px">
+            style="width:240px">
           </el-input>
           </el-input>
         </li>
         </li>
-        <li>
-          表格分类
-          
+        <li>          
           <el-select 
           <el-select 
             v-model="sheetForm.classify" 
             v-model="sheetForm.classify" 
             placeholder="请选择表格分类"
             placeholder="请选择表格分类"
+            style="width:240px"
             clearable
             clearable
           >
           >
 							<el-option
 							<el-option
@@ -28,14 +26,21 @@
 						</el-select>
 						</el-select>
         </li>
         </li>
       </ul>
       </ul>
+      <div v-if="updateTime" style="color:#999999;margin-right: 30px;">最近保存时间:{{ updateTime }}</div>
       <div>
       <div>
-        <el-button type="primary" size="medium" @click="saveSheetHandle">保存</el-button>
+        <el-button type="primary" size="medium" @click="saveSheetHandle" v-if="hasPermission">保存</el-button>
         <el-button type="primary" size="medium" plain @click="backHandle">返回</el-button>
         <el-button type="primary" size="medium" plain @click="backHandle">返回</el-button>
       </div>
       </div>
     </div>
     </div>
     
     
     <div class="main">
     <div class="main">
-      <Sheet ref="sheetRef"/>
+      <Sheet ref="sheetRef" :limit="{disabled:false}" :option="this.option" v-if="sheetInit" @updated="autoSaveFun"
+      :sheetInfo="{
+        ExcelInfoId: sheetForm.infoId,
+        ExcelName: sheetForm.name,
+        ExcelClassifyId: sheetForm.classify,
+        Source: sheetForm.source
+      }" />
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
@@ -48,14 +53,56 @@ export default {
   components: { Sheet },
   components: { Sheet },
   data() {
   data() {
     return {
     return {
+      sheetId: this.$route.query.id || '',
+      isCanEdit:false,
       sheetForm: {},
       sheetForm: {},
-      classifyArr: []
+      classifyArr: [],
+      sheetInit:false,
+      option:{},
+      updateTime:'',
+      sheetButton:'',
+      cancelAutoSave:false
+    }
+  },
+  beforeRouteEnter(to, from, next) {
+    if(to.query.id){
+      to.matched[1].name=`编辑表格`
+    }else{
+      to.matched[1].name='添加表格'
+    }
+    next()
+  },
+  beforeRouteLeave(to,from,next){
+    if(to.path!='/addsheet'){
+      this.markFinishStatus()
+    }
+    next()
+  },
+  watch:{
+    sheetForm:{
+      handler(newVal){
+        console.log(this.sheetInit,this.sheetId);
+        if(this.sheetId && this.sheetInit) this.autoSaveFun()
+      },
+      deep:true
+    }
+  },
+  computed:{
+    hasPermission(){
+      // console.log(this.sheetButton,'sheetButton');
+      return this.sheetButton?
+            this.permissionBtn.isShowBtn('etaTablePermission','etaTable_excel_save')&&this.sheetButton.OpButton:
+            this.permissionBtn.isShowBtn('etaTablePermission','etaTable_excel_save')
     }
     }
   },
   },
   methods: {
   methods: {
 
 
     backHandle() {
     backHandle() {
-      window.close();
+      // if(this.sheetId){
+      //   this.$router.back()
+      // }else{
+        window.close();
+      // }
     },
     },
 
 
     /* 获取分类 */
     /* 获取分类 */
@@ -67,10 +114,73 @@ export default {
       })
       })
     },
     },
 
 
+    /* 获取表格详情 */
+    async getDetail() {
+      if(!this.sheetId){
+        this.sheetInit=true
+        return
+      }
+
+      const res = await sheetInterface.sheetDetail({
+				ExcelInfoId: Number(this.sheetId)
+			})
+
+      if(res.Ret !== 200)  return
+
+      this.isCanEdit = res.Data.CanEdit
+      if(!res.Data.CanEdit){
+        this.$message.warning(`${res.Data.Editor}正在编辑中`)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
+      const { ExcelInfoId,ExcelName,ExcelClassifyId,ExcelType,ModifyTime,Content,Source} = res.Data;
+      this.sheetForm = {
+        infoId:ExcelInfoId,
+        name: ExcelName,
+        classify: ExcelClassifyId,
+        sheetType: ExcelType,
+        source:Source
+      }
+      this.updateTime =  this.$moment(ModifyTime).format('YYYY-MM-DD HH:mm:ss')
+
+      this.option={
+        data: [{
+          ...JSON.parse(Content),
+          scrollTop: 0,
+          scrollLeft: 0
+        }]
+      }
+
+      this.$nextTick(()=>{
+        this.sheetInit=true
+      })
+
+    },
+    autoSaveFun:_.debounce(async function(){
+      if(!this.sheetId && this.sheetInit || this.cancelAutoSave) return
+      const { name,classify,infoId } = this.sheetForm;
+      luckysheet.exitEditMode()
+      let data = luckysheet.getAllSheets()[0];
+      if(!name || !classify) return this.$message.warning(name ? '请选择表格分类' : '请输入表格名称')
+      if(!data.celldata.length) return this.$message.warning('请输入表格内容');
+      let params={
+        ExcelInfoId:infoId,
+        ExcelName: name,
+        ExcelClassifyId: classify,
+        ExcelImage: "",
+        Content: JSON.stringify(data)
+      }
+      const res = await sheetInterface.sheetEdit(params)
+      if(res.Ret !==200) return
+      this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
 
 
+      // console.log("自动保存");
+    },1500),
     /* 保存表格 */
     /* 保存表格 */
     saveSheetHandle: _.debounce(async function() {
     saveSheetHandle: _.debounce(async function() {
-      const { name,classify } = this.sheetForm;
+      const { name,classify} = this.sheetForm;
       luckysheet.exitEditMode()
       luckysheet.exitEditMode()
       //结构类型乱飘 强制定义下
       //结构类型乱飘 强制定义下
       let data = {...luckysheet.getAllSheets()[0],status:Number(luckysheet.getAllSheets()[0].status)}
       let data = {...luckysheet.getAllSheets()[0],status:Number(luckysheet.getAllSheets()[0].status)}
@@ -90,31 +200,53 @@ export default {
 			const { Data } = await sheetInterface.uploadImg(form)
 			const { Data } = await sheetInterface.uploadImg(form)
 
 
       data.luckysheet_select_save = [];
       data.luckysheet_select_save = [];
-      const res = await sheetInterface.sheetAdd({
+      let params={
         ExcelName: name,
         ExcelName: name,
         ExcelClassifyId: classify,
         ExcelClassifyId: classify,
         ExcelImage: Data.ResourceUrl,
         ExcelImage: Data.ResourceUrl,
         Content: JSON.stringify(data)
         Content: JSON.stringify(data)
-      })
-      this.loading.close()
-      if(res.Ret !== 200) return
+      }
+      let isAdd = this.sheetId?false:true
+      const res = this.sheetId
+      ? await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
+      : await sheetInterface.sheetAdd(params)
 
 
+      this.loading.close()
+      if(res.Ret !==200) return
+      this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
+      
+      this.sheetId = this.sheetId || res.Data.ExcelInfoId;
       this.$message.success(res.Msg);
       this.$message.success(res.Msg);
+      if(isAdd){
+        this.$router.replace({path:'/addsheet',query:{id:this.sheetId}})
+        this.cancelAutoSave=true
+      }
 
 
-      const { ExcelInfoId, UniqueCode } = res.Data;
+
+      // const { ExcelInfoId, UniqueCode } = res.Data;
       
       
-      this.$router.replace({
-        path: '/sheetList',
-        query: {
-          code: UniqueCode,
-          id: ExcelInfoId
-        }
-      })
+      // this.$router.replace({
+      //   path: '/sheetList',
+      //   query: {
+      //     code: UniqueCode,
+      //     id: ExcelInfoId
+      //   }
+      // })
     },300),
     },300),
-    
+    markFinishStatus(){
+      if((!this.sheetId) || (!this.isCanEdit)) return
+      sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
+        if(res.Ret != 200) return 
+      })
+    }
   },
   },
   mounted() {
   mounted() {
+    this.getDetail()
     this.getClassify();
     this.getClassify();
+    window.addEventListener('beforeunload',this.markFinishStatus)
+  },
+  beforeDestroy(){
+    window.removeEventListener('beforeunload',this.markFinishStatus)
   }
   }
 }
 }
 </script>
 </script>
@@ -122,6 +254,7 @@ export default {
 *{ box-sizing: border-box; }
 *{ box-sizing: border-box; }
 .addSheet-wrap {
 .addSheet-wrap {
   min-height: calc(100vh - 120px);
   min-height: calc(100vh - 120px);
+  min-width: 1000px;
   .wrap-top {
   .wrap-top {
     display: flex;
     display: flex;
     justify-content: space-between;
     justify-content: space-between;

+ 40 - 4
src/views/datasheet_manage/common/option.js

@@ -2,9 +2,13 @@
 /*  初始化  
 /*  初始化  
   options 其他配置 包括初始化数据 data:[{ celldata:[] }]
   options 其他配置 包括初始化数据 data:[{ celldata:[] }]
   sheetInfo 表格id相关信息 用来内容hooks变化时保存草稿
   sheetInfo 表格id相关信息 用来内容hooks变化时保存草稿
+  limit 限制性数据
+  callbackItems 回调函数组成的对象
 */
 */
 import * as sheetInterface from '@/api/modules/sheetApi.js';
 import * as sheetInterface from '@/api/modules/sheetApi.js';
-export function initSheet(container,options={},sheetInfo={}) {
+import { Message } from 'element-ui';
+
+export function initSheet(container,options={},sheetInfo={},limit,callbackItems) {
   const configOpt = {
   const configOpt = {
     container,
     container,
     lang: 'zh', // 设定表格语言
     lang: 'zh', // 设定表格语言
@@ -17,13 +21,45 @@ export function initSheet(container,options={},sheetInfo={}) {
       postil:  false, //'批注'
       postil:  false, //'批注'
 		},
 		},
     cellRightClickConfig: {
     cellRightClickConfig: {
+      copy:!limit.disabled,
+      copyAs:!limit.disabled,
       chart: false, // 图表生成
       chart: false, // 图表生成
       image: false, // 插入图片
       image: false, // 插入图片
       link: false, // 插入链接
       link: false, // 插入链接
     },
     },
+    allowCopy:!limit.disabled,//没效果
     hook: {
     hook: {
+      cellEditBefore:(range)=>{
+        if(limit.disabled){
+          Message.warning("当前不可编辑")
+          setTimeout(()=>{
+            luckysheet.exitEditMode();
+          },0)
+        }
+      },
+      cellUpdateBefore:()=>{
+        if(limit.disabled){
+          // 不可编辑
+          return false
+        }
+      },
+      // rangeCopyBefore:(range,data)=>{
+      //   // 不触发
+      //   console.log(range,data,'range,data','rangeCopyBefore');
+      // },
+      // rangeCopyAfter:(range,data)=>{
+      //   // 不触发
+      //   console.log(range,data,'range,data','rangeCopyAfter');
+      // },
       updated: (a,b,c,d,e)=> {
       updated: (a,b,c,d,e)=> {
-
+        if(limit.disabled){
+          Message.warning("当前不可编辑")
+          luckysheet.undo()
+          return 
+        }
+        // console.log(callbackItems);
+        callbackItems.updated()
+        //草稿
         if(sheetInfo.Source&&sheetInfo.Source===1) {
         if(sheetInfo.Source&&sheetInfo.Source===1) {
           let data = luckysheet.getAllSheets()[0];
           let data = luckysheet.getAllSheets()[0];
           data.luckysheet_select_save = [];
           data.luckysheet_select_save = [];
@@ -35,9 +71,9 @@ export function initSheet(container,options={},sheetInfo={}) {
             Content: JSON.stringify(data)
             Content: JSON.stringify(data)
           })
           })
         }
         }
-      }
+      },
     },
     },
-    ...options
+    ...options,
   }
   }
 
 
   luckysheet.create(configOpt)
   luckysheet.create(configOpt)

+ 57 - 3
src/views/datasheet_manage/components/CustomTable.vue

@@ -418,6 +418,31 @@ export default {
       this.$nextTick(() => {
       this.$nextTick(() => {
         resetStyle();
         resetStyle();
       })
       })
+    },
+    // 'config.data':{
+    //   handler(value){
+    //     console.log(value,'valuevaluevalue');
+    //     if(!this.disabled && this.hasInit){
+    //       this.$emit("autoSave")
+    //     }
+    //   },
+    //   deep:true
+    // },
+    'config.textRowData':{
+      handler(value){
+        if(!this.disabled && this.hasInit){
+          this.$emit("autoSave")
+        }
+
+      },
+      deep:true
+    },
+    'config.order':{
+      handler(value){
+        if(!this.disabled && this.hasInit){
+          this.$emit("autoSave")
+        }
+      }
     }
     }
   },
   },
   components: {addDateCellDia,mDialog},
   components: {addDateCellDia,mDialog},
@@ -467,7 +492,9 @@ export default {
 
 
       //指标别名弹窗
       //指标别名弹窗
       isEditEdbAliasDialog: false,
       isEditEdbAliasDialog: false,
-      editEdb: {}
+      editEdb: {},
+
+      hasInit:false
     };
     };
   },
   },
   methods: {
   methods: {
@@ -493,6 +520,9 @@ export default {
             
             
         })
         })
       }
       }
+      if(!this.disabled && this.hasInit){
+        this.$emit("autoSave")
+      }
     },
     },
 
 
     /* 改变排序 */
     /* 改变排序 */
@@ -505,6 +535,9 @@ export default {
           ? edb.Data.sort((x,y) => new Date(y.DataTime)-new Date(x.DataTime))
           ? edb.Data.sort((x,y) => new Date(y.DataTime)-new Date(x.DataTime))
           : edb.Data.sort((x,y) => new Date(x.DataTime)-new Date(y.DataTime))
           : edb.Data.sort((x,y) => new Date(x.DataTime)-new Date(y.DataTime))
       })
       })
+      if(!this.disabled && this.hasInit){
+        this.$emit("autoSave")
+      }
     },
     },
 
 
     // 单击指标名称修改别名
     // 单击指标名称修改别名
@@ -522,6 +555,9 @@ export default {
     /* 保存别名 */
     /* 保存别名 */
     saveEdbAlias() {
     saveEdbAlias() {
       this.config.data.find(_ =>_.EdbInfoId === this.editEdb.EdbInfoId).EdbAliasName = this.editEdb.EdbAliasName;
       this.config.data.find(_ =>_.EdbInfoId === this.editEdb.EdbInfoId).EdbAliasName = this.editEdb.EdbAliasName;
+      if(!this.disabled && this.hasInit){
+        this.$emit("autoSave")
+      }
       this.isEditEdbAliasDialog = false;
       this.isEditEdbAliasDialog = false;
     },
     },
 
 
@@ -578,6 +614,9 @@ export default {
           ? [...edb.Data,...edb_concat_data].sort((x,y) => new Date(y.DataTime)-new Date(x.DataTime))
           ? [...edb.Data,...edb_concat_data].sort((x,y) => new Date(y.DataTime)-new Date(x.DataTime))
           : [...edb.Data,...edb_concat_data].sort((x,y) => new Date(x.DataTime)-new Date(y.DataTime))
           : [...edb.Data,...edb_concat_data].sort((x,y) => new Date(x.DataTime)-new Date(y.DataTime))
       })
       })
+      if(!this.disabled && this.hasInit){
+        this.$emit("autoSave")
+      }
     },
     },
 
 
     /* 输入框失焦 存值或公式计算 val,行标 列标 指标信息 */
     /* 输入框失焦 存值或公式计算 val,行标 列标 指标信息 */
@@ -588,6 +627,9 @@ export default {
       if(!value){
       if(!value){
         cell.DataType = 3;
         cell.DataType = 3;
         cell.ShowValue = '';
         cell.ShowValue = '';
+        if(!this.disabled && this.hasInit){
+          this.$emit("autoSave")
+        }
         return
         return
       }
       }
 
 
@@ -601,7 +643,10 @@ export default {
         cell.ShowValue = value
         cell.ShowValue = value
       }
       }
       this.$set(cell,'CanEdit',false)
       this.$set(cell,'CanEdit',false)
-      
+
+      if(!this.disabled && this.hasInit){
+        this.$emit("autoSave")
+      }
     },
     },
 
 
     /* 输入公式的计算值 */
     /* 输入公式的计算值 */
@@ -694,7 +739,9 @@ export default {
 
 
         
         
       }
       }
-
+      if(!this.disabled && this.hasInit){
+        this.$emit("autoSave")
+      }
       this.hideContextMenu()
       this.hideContextMenu()
     },
     },
 
 
@@ -745,6 +792,7 @@ export default {
 
 
     /* 详情initData */
     /* 详情initData */
     initSheetData(initData) {
     initSheetData(initData) {
+      this.hasInit=false
       if(initData.Data) {
       if(initData.Data) {
         const { Data,Sort,TextRowData } = initData;
         const { Data,Sort,TextRowData } = initData;
 
 
@@ -752,6 +800,9 @@ export default {
         this.config.data = Data;
         this.config.data = Data;
         this.config.textRowData = TextRowData;
         this.config.textRowData = TextRowData;
       }
       }
+      this.$nextTick(()=>{
+        this.hasInit=true
+      })
     },
     },
 
 
     /* 跳转到指标库 */
     /* 跳转到指标库 */
@@ -774,6 +825,9 @@ export default {
     /* 清空所有数据 */
     /* 清空所有数据 */
     reset() {
     reset() {
       this.config.data = [];
       this.config.data = [];
+      if(!this.disabled && this.hasInit){
+        this.$emit("autoSave")
+      }
       this.config.textRowData = [];
       this.config.textRowData = [];
     },
     },
 
 

+ 25 - 1
src/views/datasheet_manage/components/MixedTable.vue

@@ -171,6 +171,24 @@ export default {
       return getRowHeaderCode(total_length);
       return getRowHeaderCode(total_length);
     },
     },
   },
   },
+  watch:{
+    'config.data':{
+      handler(newVal){
+        if(!this.disabled && this.hasInit){
+          this.$emit("autoSave")
+        }
+      },
+      deep:true
+    },
+    insertRelationArr:{
+      handler(newVal){
+        if(!this.disabled && this.hasInit){
+          this.$emit("autoSave")
+        }
+      },
+      deep:true
+    },
+  },
   data() {
   data() {
     return {
     return {
       config: {
       config: {
@@ -188,7 +206,8 @@ export default {
 
 
       isSelectTargetValueDialog: false,
       isSelectTargetValueDialog: false,
 
 
-      cellrelationEdbInfo: {}
+      cellrelationEdbInfo: {},
+      hasInit:false,
     };
     };
   },
   },
   mounted() {
   mounted() {
@@ -685,6 +704,8 @@ export default {
 
 
     /* 初始化8行5列 */
     /* 初始化8行5列 */
     initData(initData=null) {
     initData(initData=null) {
+      console.log('initData');
+      this.hasInit=false
       if(initData) {
       if(initData) {
         const { CellRelation,Data } = initData;
         const { CellRelation,Data } = initData;
         this.config.data = Data;
         this.config.data = Data;
@@ -702,6 +723,9 @@ export default {
           }));
           }));
         });
         });
       }
       }
+      this.$nextTick(()=>{
+        this.hasInit=true
+      })
     },
     },
   },
   },
 };
 };

+ 29 - 3
src/views/datasheet_manage/components/SheetExcel.vue

@@ -14,7 +14,13 @@ export default {
     sheetInfo: {
     sheetInfo: {
       type: Object,
       type: Object,
       default: ()=>{}
       default: ()=>{}
-    }
+    },
+    limit: {
+      type: Boolean,
+      default: ()=>{
+        return {disabled:false}
+      }
+    },
   },
   },
   data() {
   data() {
     return {
     return {
@@ -24,8 +30,20 @@ export default {
   methods: {
   methods: {
     init() {
     init() {
       let optionData = this.option ? this.option : {};
       let optionData = this.option ? this.option : {};
-
-      initSheet('sheet-container',optionData,this.sheetInfo)
+      let callbackItems={updated:this.updateEmit}
+      initSheet('sheet-container',optionData,this.sheetInfo,this.limit,callbackItems)
+    },
+    copyDisable(e){
+      // 变向的禁止复制
+      // console.log(e.target.value && e.target.value.indexOf('lucksheet'));
+      if(e.target.value && e.target.value.indexOf('lucksheet')){
+        luckysheet.enterEditMode();
+        // luckysheet.exitEditMode();
+        return false
+      }
+    },
+    updateEmit(){
+      this.$emit("updated")
     }
     }
   },
   },
   destroyed() {
   destroyed() {
@@ -33,7 +51,15 @@ export default {
   },
   },
   mounted() {
   mounted() {
     this.init();
     this.init();
+    if(this.limit.disabled){
+      document.addEventListener('copy',this.copyDisable)
+    }
   },
   },
+  beforeDestroy(){
+    if(this.limit.disabled){
+      document.removeEventListener('copy',this.copyDisable)
+    }
+  }
 }
 }
 </script>
 </script>
 <style scoped lang="scss">
 <style scoped lang="scss">

+ 1 - 1
src/views/datasheet_manage/customAnalysis/addAnalysisSheet.vue

@@ -22,7 +22,7 @@
           />
           />
         </el-tabs>
         </el-tabs>
         <div class="sheet-wrapper">
         <div class="sheet-wrapper">
-          <Sheet ref="sheetRef" :option="sheetConfig" v-if="sheetConfig.data"/>
+          <Sheet ref="sheetRef" :option="sheetConfig" v-if="sheetConfig.data" :limit="{disabled:false}"/>
 
 
           <dataLoading :loading="isLoading"/>
           <dataLoading :loading="isLoading"/>
         </div>
         </div>

+ 292 - 0
src/views/datasheet_manage/customAnalysis/edit.vue

@@ -0,0 +1,292 @@
+<template>
+  <div class="sheet-detail-wrapper" >
+    <div class="detail-top">
+      <el-input
+        ref="sheetEditTitRef"
+        style="width: 400px"
+        placeholder="请输入表格名称"
+        class="label-input"
+        v-model="sheet_title"
+        v-if="sheetDetailInfo.isEditTit"
+        @blur="changeValue(sheetDetailInfo, 'edit-tit')"
+      />
+      <span
+        class="sheet-name"
+        @click="editNodeLabel(sheetDetailInfo, 'edit-tit')"
+        v-else
+      >
+        {{ sheetDetailInfo.ExcelName }}
+        <i class="el-icon-edit"/>
+      </span>
+      <div class="sheet-anothor-info">
+        <span class="author">作者:{{ sheetDetailInfo.SysUserRealName }}</span>
+        <ul class="action-ul" v-if="sheetDetailInfo.Button">
+          <div v-if="updateTime" style="color:#999999;">最近保存时间:{{ updateTime }}</div>
+          <el-tooltip effect="dark" content="在当前表格选择日期列和数据列生成指标" placement="top-start">
+              <li class="editsty" @click="HandleToPath" v-if="isSheetBtnShow('createedb')&&sheetDetailInfo.Button.OpEdbButton">
+                <img src="~@/assets/img/icons/choose_bluebg_new.png"/>
+                <span>生成指标</span>
+              </li>
+          </el-tooltip>
+
+          <el-tooltip effect="dark" content="根据表格保存的最新内容,更新当前表格生成的所有指标" placement="top-start">
+              <li class="editsty" @click="refreshSheet" v-if="isSheetBtnShow('refresh')&&sheetDetailInfo.Button.RefreshEdbButton">
+                <img src="~@/assets/img/icons/refresh_blue_new.png"/>
+                <span>刷新指标</span>
+              </li>
+          </el-tooltip>
+          <li class="editsty" @click="saveHandle" v-if="isSheetBtnShow('save')&&sheetDetailInfo.Button.OpButton">
+            <img src="~@/assets/img/icons/save_blue_new.png"/>
+            <span>保存</span>
+          </li>
+          <li class="editsty" @click="backHandle">
+            <img src="~@/assets/img/icons/back_arrow_blue_new.png"/>
+            <span>返回</span>
+          </li>
+        </ul>
+      </div>
+    </div>
+
+    <dataLoading :loading="isSheetLoading"/>
+
+    <!-- 表格 -->
+    <div class="sheet-wrap">
+      <Sheet
+        ref="sheetRef"
+        v-if="sheetConfigOpt.data"
+        :option="sheetConfigOpt"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import * as sheetInterface from "@/api/modules/sheetApi.js";
+import Sheet from "../components/SheetExcel.vue";
+import leftMixin from "../mixins/classifyMixin";
+import { getSheetImage } from "../common/option";
+
+  export default {
+    components:{Sheet},
+    mixins: [leftMixin],
+    data() {
+      return {
+        sheetDataPage: 2,
+        sheetAllcellData:[],//全部单元格数据 分页push
+        dataToalPage: 0,
+        isSheetLoading: false,
+        code:'',
+        sheetConfigOpt: {
+          showsheetbar: true,
+          data: null
+        },
+        sheet_title: "", //表格标题 双击标题修改时来存储最新值
+        sheetDetailInfo:{},
+        isCanEdit:false,
+        sheetId:'',
+        loading:null,
+        updateTime:''
+      }
+    },
+    beforeRouteLeave(to,from,next){
+      if(to.path!='/editSheetAnalysis'){
+        this.markFinishStatus()
+      }
+      next()
+    },
+    created(){
+      // console.log(this.$route.query.code);
+      if(!this.$route.query.code){
+        this.$message.warning("参数丢失")
+        this.backHandle()
+      }else{
+        this.code = this.$route.query.code
+        this.getDetailHandle()
+      }
+    },
+    mounted() {
+      window.addEventListener('beforeunload',this.markFinishStatus)
+    },
+    beforeDestroy(){
+      window.removeEventListener('beforeunload',this.markFinishStatus)
+    },
+    methods:{
+      /* 获取表格详情 */
+      getDetailHandle() {
+
+        this.isSheetLoading = true;
+        sheetInterface.sheetAnalysisInterface.getExcelDetail({
+          UniqueCode:this.code,
+        }).then((res) => {
+          if (res.Ret !== 200) return;
+          this.isCanEdit = res.Data.ExcelInfo.CanEdit
+          if(!this.isCanEdit){
+            this.$message.warning(`${res.Data.ExcelInfo.Editor}正在编辑中`)
+            setTimeout(()=>{
+              this.backHandle()
+            },1000)
+            return 
+          }
+          this.sheetDetailInfo = res.Data.ExcelInfo;
+          this.updateTime = this.$moment(this.sheetDetailInfo.ModifyTime).format('YYYY-MM-DD HH:mm:ss')||''
+          this.sheetId = this.sheetId || res.Data.ExcelInfo.ExcelInfoId;
+          this.dataToalPage =  Math.max(...res.Data.SheetList.map(_ => _.PageNum));
+          this.sheetAllcellData = res.Data.SheetList.map(_ => _.Data ? JSON.parse(_.Data.Data) : []);
+
+          this.getCellData(res.Data.SheetList)
+        });
+      },
+      //分页获取表格数据
+      async getCellData(sheets) {
+
+        let res = await sheetInterface.sheetAnalysisInterface.getExcelDataByPage({
+          UniqueCode: this.code,
+          Page: this.sheetDataPage
+        })
+
+        if(res.Ret !== 200) return
+        console.log(this.sheetAllcellData)
+
+        for(let i = 0;i<this.sheetAllcellData.length;i++) {
+          if(res.Data[i].Data) {
+            this.sheetAllcellData[i] = [...this.sheetAllcellData[i],...JSON.parse(res.Data[i].Data.Data)]
+          }
+
+          continue
+        }
+        
+        //数据继续加载或渲染表格.
+        if(this.sheetDataPage < this.dataToalPage) {
+          this.sheetDataPage++;
+          this.getCellData(sheets)
+        }else {
+          this.sheetConfigOpt.data = sheets.map((_,index) => ({
+            index: _.Index, //工作表id
+            order: _.Sort, //工作表的下标
+            name: _.SheetName,
+            calcChain: _.CalcChain?JSON.parse(_.CalcChain):[],
+            config: JSON.parse(_.Config),
+            celldata: this.sheetAllcellData[index],
+          }))
+
+          console.log(this.sheetConfigOpt)
+
+          this.isSheetLoading = false;
+        }
+      },
+      backHandle(){
+        let params={
+          code:this.sheetDetailInfo.UniqueCode,
+          id:this.sheetDetailInfo.ExcelInfoId
+        }
+        sessionStorage.setItem('editSheetAnalysisBack',JSON.stringify(params))
+        this.$router.back()
+      },
+      //跳转生成指标
+      HandleToPath() {
+        this.$router.push({ path: '/createTaregtBySheet',query: {
+          code: this.sheetDetailInfo.UniqueCode 
+        }});
+      },
+      /* 刷新表格 */
+      refreshSheet: _.debounce(async function() {
+        let res = await sheetInterface.sheetAnalysisInterface.sheetRefresh({ExcelInfoId: this.sheetDetailInfo.ExcelInfoId})
+
+        if(res.Ret !== 200) return 
+        this.$message.success(res.Msg)
+      },300),
+      /* 保存表格 */
+      saveHandle: _.debounce(async function () {
+        luckysheet.exitEditMode();
+        let data = luckysheet.getAllSheets();
+
+        this.loading = this.$loading({
+          target: ".sheet-detail-wrapper",
+          lock: true,
+          text: "保存中...",
+          spinner: "el-icon-loading",
+          background: "rgba(255, 255, 255, 0.6)",
+        });
+
+        let img = getSheetImage(data[0]);
+        const form = new FormData();
+        form.append("Image", img);
+        const { Data } = await sheetInterface.uploadImg(form);
+
+        data.luckysheet_select_save = [];
+        const { ExcelInfoId, ExcelName, ExcelClassifyId } = this.sheetDetailInfo;
+        const res = await sheetInterface.sheetAnalysisInterface.sheetEdit({
+          ExcelInfoId,
+          ExcelName,
+          ExcelClassifyId,
+          ExcelImage: Data.ResourceUrl,
+          Content: JSON.stringify(data),
+        });
+        this.loading.close();
+        if (res.Ret !== 200) return;
+        this.$message.success("保存成功");
+        this.$router.back()
+      }, 300),
+      markFinishStatus(){
+        if((!this.sheetId) || (!this.isCanEdit)) return
+        sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
+          if(res.Ret != 200) return 
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .sheet-detail-wrapper {
+    height: 100%;
+    border: 1px solid #ececec;
+    border-radius: 4px;
+    box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
+    overflow: auto;
+    background: #fff;
+    .detail-top {
+      padding: 20px;
+      // display: flex;
+      // justify-content: space-between;
+      // align-items: center;
+      border-bottom: 1px solid #ececec;
+      .sheet-name {
+        font-size: 18px;
+        color: #333333;
+        margin-bottom: 6px;
+        cursor: pointer;
+        max-width: 450px;
+        &:hover {
+          text-decoration: underline;
+        }
+      }
+      .sheet-anothor-info{
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        .author{
+          color: #666666;
+          font-size: 16px;
+        }
+        .action-ul {
+          display: flex;
+          li {
+            margin: 0 10px;
+            display: flex;
+            align-items: center;
+            img{
+              height: 16px;
+              width: 16px;
+              margin-right: 4px;
+            }
+          }
+        }
+      }
+    }
+    .sheet-wrap {
+      position: relative;
+      height: calc(100vh - 210px);
+    }
+  }
+</style>

+ 150 - 93
src/views/datasheet_manage/customAnalysis/list.vue

@@ -142,10 +142,7 @@
         <!-- 表格详情 -->
         <!-- 表格详情 -->
         <div class="sheet-detail-wrapper" v-if="select_id" >
         <div class="sheet-detail-wrapper" v-if="select_id" >
           <div class="detail-top">
           <div class="detail-top">
-            <span class="author"
-              >作者:{{ sheetDetailInfo.SysUserRealName }}</span
-            >
-            <el-input
+            <!-- <el-input
               ref="sheetEditTitRef"
               ref="sheetEditTitRef"
               style="width: 400px"
               style="width: 400px"
               placeholder="请输入表格名称"
               placeholder="请输入表格名称"
@@ -153,44 +150,61 @@
               v-model="sheet_title"
               v-model="sheet_title"
               v-if="sheetDetailInfo.isEditTit"
               v-if="sheetDetailInfo.isEditTit"
               @blur="changeValue(sheetDetailInfo, 'edit-tit')"
               @blur="changeValue(sheetDetailInfo, 'edit-tit')"
-            />
-            <span
-              class="sheet-name"
-              @click="editNodeLabel(sheetDetailInfo, 'edit-tit')"
-              v-else
-            >
+            /> -->
+            <div class="sheet-name">
               {{ sheetDetailInfo.ExcelName }}
               {{ sheetDetailInfo.ExcelName }}
-              <i class="el-icon-edit"/>
-            </span>
-            <ul class="action-ul" v-if="sheetDetailInfo.Button">
-
-              <el-tooltip effect="dark" content="在当前表格选择日期列和数据列生成指标" placement="top-start">
-                  <li class="editsty" @click="HandleToPath" v-if="isSheetBtnShow('createedb')&&sheetDetailInfo.Button.OpEdbButton">生成指标</li>
-              </el-tooltip>
-
-              <el-tooltip effect="dark" content="根据表格保存的最新内容,更新当前表格生成的所有指标" placement="top-start">
-                  <li class="editsty" @click="refreshSheet" v-if="isSheetBtnShow('refresh')&&sheetDetailInfo.Button.RefreshEdbButton">刷新指标</li>
-              </el-tooltip>
-              <li class="editsty" @click="saveHandle" v-if="isSheetBtnShow('save')&&sheetDetailInfo.Button.OpButton">保存</li>
-              <li
-                class="editsty"
-                @click="saveOtherHandle"
-                v-if="isSheetBtnShow('otherSave')&&sheetDetailInfo.Button.CopyButton"
-              >
-                另存为
-              </li>
-              <li class="editsty" @click="downloadExcel
-              (sheetDetailInfo)" v-if="isSheetBtnShow('download')&&sheetDetailInfo.Button.DownloadButton">
-                下载
-              </li>
-              <li
-                class="deletesty"
-                v-if="isSheetBtnShow('del')&&sheetDetailInfo.Button.DeleteButton"
-                @click="delSheetHandle({cell:sheetDetailInfo, type:'del'})"
-              >
-                删除
-              </li>
-            </ul>
+              <!-- <i class="el-icon-edit"/> -->
+            </div>
+            <div class="sheet-anothor-info">
+              <span class="author">作者:{{ sheetDetailInfo.SysUserRealName }}</span>
+              <ul class="action-ul" v-if="sheetDetailInfo.Button">
+                <li style="color:#999999 ;">最近保存时间:{{ saveTime }}</li>
+                <el-tooltip effect="dark" content="在当前表格选择日期列和数据列生成指标" placement="top-start">
+                    <li class="editsty" @click="HandleToPath" v-if="isSheetBtnShow('createedb')&&sheetDetailInfo.Button.OpEdbButton">
+                      <img src="~@/assets/img/icons/choose_bluebg_new.png"/>
+                      <span>生成指标</span>
+                    </li>
+                </el-tooltip>
+
+                <el-tooltip effect="dark" content="根据表格保存的最新内容,更新当前表格生成的所有指标" placement="top-start">
+                    <li class="editsty" @click="refreshSheet" v-if="isSheetBtnShow('refresh')&&sheetDetailInfo.Button.RefreshEdbButton">
+                      <img src="~@/assets/img/icons/refresh_blue_new.png"/>
+                      <span>刷新指标</span>
+                    </li>
+                </el-tooltip>
+                <!-- <li class="editsty" @click="saveHandle" v-if="isSheetBtnShow('save')&&sheetDetailInfo.Button.OpButton">保存</li> -->
+                <li
+                  class="editsty"
+                  @click="goEdit"
+                  v-if="isCreator || 
+                  (sheetDetailInfo.Button && sheetDetailInfo.Button.OpButton&&isSheetBtnShow('edit'))"
+                >
+                  <img src="~@/assets/img/icons/edit_blue_new.png" v-if="!editButtonText"/>
+                  <span>{{ editButtonText?editButtonText:'编辑' }}</span> 
+                </li>
+                <li
+                  class="editsty"
+                  @click="saveOtherHandle"
+                  v-if="isSheetBtnShow('otherSave')&&sheetDetailInfo.Button.CopyButton"
+                >
+                  <img src="~@/assets/img/icons/save_as_blue_new.png"/>
+                  <span>另存为</span>
+                </li>
+                <li class="editsty" @click="downloadExcel
+                (sheetDetailInfo)" v-if="isSheetBtnShow('download')&&sheetDetailInfo.Button.DownloadButton">
+                  <img src="~@/assets/img/icons/download_blue.png"/>
+                  <span>下载</span>
+                </li>
+                <li
+                  class="deletesty"
+                  v-if="isCreator || (isSheetBtnShow('del')&&sheetDetailInfo.Button&&sheetDetailInfo.Button.DeleteButton)"
+                  @click="delSheetHandle({cell:sheetDetailInfo, type:'del'})"
+                >
+                  <img src="~@/assets/img/icons/delete-red.png"/>
+                  <span>删除</span>
+                </li>
+              </ul>
+            </div>
           </div>
           </div>
 
 
           <!-- <dataLoading :loading="isSheetLoading"/> -->
           <!-- <dataLoading :loading="isSheetLoading"/> -->
@@ -201,12 +215,7 @@
               ref="sheetRef"
               ref="sheetRef"
               v-if="sheetConfigOpt.data"
               v-if="sheetConfigOpt.data"
               :option="sheetConfigOpt"
               :option="sheetConfigOpt"
-              :sheetInfo="{
-                ExcelInfoId: sheetDetailInfo.ExcelInfoId,
-                ExcelName: sheetDetailInfo.ExcelName,
-                ExcelClassifyId: sheetDetailInfo.ExcelClassifyId,
-                Source: sheetDetailInfo.Source
-              }"
+              :limit="{disabled:true}"
             />
             />
           </div>
           </div>
         </div>
         </div>
@@ -317,6 +326,9 @@ export default {
 
 
       return options;
       return options;
     },
     },
+    isCreator(){
+      return this.adminId==this.excelAdminId
+    }
   },
   },
   data() {
   data() {
     return {
     return {
@@ -380,6 +392,10 @@ export default {
       sourceMap: {
       sourceMap: {
         '/sheetAnalysisList': 4,
         '/sheetAnalysisList': 4,
       },
       },
+      saveTime:"",
+      editButtonText:'',
+      adminId:localStorage.getItem("AdminId") || '0',
+      excelAdminId:""
     };
     };
   },
   },
   watch: {
   watch: {
@@ -600,39 +616,54 @@ export default {
       };
       };
       request.send();
       request.send();
     },
     },
+    goEdit(){
+      sheetInterface.markSheetEditStatus({ExcelInfoId: this.select_id,Status:1}).then(res=>{
+        if(res.Ret != 200) return 
+        if(res.Data.Status==0){
+          this.$router.push({
+            path: '/editSheetAnalysis',
+            query: { code: this.sheetDetailInfo.UniqueCode },
+          });
 
 
+        }else if(res.Data.Status==1){
+          this.editButtonText = `${res.Data.Editor}编辑中`
+          this.$message.warning('当前'+this.editButtonText)
+        }
+      })
+    },
     /* 保存表格 */
     /* 保存表格 */
-    saveHandle: _.debounce(async function () {
-      luckysheet.exitEditMode();
-      let data = luckysheet.getAllSheets();
-
-      this.loading = this.$loading({
-        target: ".dataSheet-container",
-        lock: true,
-        text: "保存中...",
-        spinner: "el-icon-loading",
-        background: "rgba(255, 255, 255, 0.6)",
-      });
-
-      let img = getSheetImage(data[0]);
-      const form = new FormData();
-      form.append("Image", img);
-      const { Data } = await sheetInterface.uploadImg(form);
-
-      data.luckysheet_select_save = [];
-      const { ExcelInfoId, ExcelName, ExcelClassifyId } = this.sheetDetailInfo;
-      const res = await sheetInterface.sheetAnalysisInterface.sheetEdit({
-        ExcelInfoId,
-        ExcelName,
-        ExcelClassifyId,
-        ExcelImage: Data.ResourceUrl,
-        Content: JSON.stringify(data),
-      });
-      this.loading.close();
-      if (res.Ret !== 200) return;
-      this.$message.success("保存成功");
-      this.getTreeData();
-    }, 300),
+    // saveHandle: _.debounce(async function () {
+    //   luckysheet.exitEditMode();
+    //   let data = luckysheet.getAllSheets();
+
+    //   this.loading = this.$loading({
+    //     target: ".dataSheet-container",
+    //     lock: true,
+    //     text: "保存中...",
+    //     spinner: "el-icon-loading",
+    //     background: "rgba(255, 255, 255, 0.6)",
+    //   });
+
+    //   let img = getSheetImage(data[0]);
+    //   const form = new FormData();
+    //   form.append("Image", img);
+    //   const { Data } = await sheetInterface.uploadImg(form);
+
+    //   data.luckysheet_select_save = [];
+    //   const { ExcelInfoId, ExcelName, ExcelClassifyId } = this.sheetDetailInfo;
+
+    //   const res = await sheetInterface.sheetAnalysisInterface.sheetEdit({
+    //     ExcelInfoId,
+    //     ExcelName,
+    //     ExcelClassifyId,
+    //     ExcelImage: Data.ResourceUrl,
+    //     Content: JSON.stringify(data),
+    //   });
+    //   this.loading.close();
+    //   if (res.Ret !== 200) return;
+    //   this.$message.success("保存成功");
+    //   this.getTreeData();
+    // }, 300),
 
 
     /* 获取表格列表 */
     /* 获取表格列表 */
     getPublicList() {
     getPublicList() {
@@ -682,6 +713,9 @@ export default {
         if (res.Ret !== 200) return;
         if (res.Ret !== 200) return;
 
 
         this.sheetDetailInfo = res.Data.ExcelInfo;
         this.sheetDetailInfo = res.Data.ExcelInfo;
+        this.saveTime = this.$moment(this.sheetDetailInfo.ModifyTime).format('YYYY-MM-DD HH:mm:ss')||''
+        this.excelAdminId = this.sheetDetailInfo.SysUserId
+        this.editButtonText = this.sheetDetailInfo.CanEdit?'':`${this.sheetDetailInfo.Editor}编辑中`
         this.dataToalPage =  Math.max(...res.Data.SheetList.map(_ => _.PageNum));
         this.dataToalPage =  Math.max(...res.Data.SheetList.map(_ => _.PageNum));
         this.sheetAllcellData = res.Data.SheetList.map(_ => _.Data ? JSON.parse(_.Data.Data) : []);
         this.sheetAllcellData = res.Data.SheetList.map(_ => _.Data ? JSON.parse(_.Data.Data) : []);
 
 
@@ -825,7 +859,11 @@ export default {
         code: this.$route.query.code,
         code: this.$route.query.code,
         id: Number(this.$route.query.id),
         id: Number(this.$route.query.id),
       });
       });
-    } else {
+    } else if(sessionStorage.getItem('editSheetAnalysisBack')){
+      let params=JSON.parse(sessionStorage.getItem('editSheetAnalysisBack'))
+      this.getTreeData(params);
+      sessionStorage.removeItem('editSheetAnalysisBack')
+    }else {
       this.getTreeData();
       this.getTreeData();
       this.getPublicList();
       this.getPublicList();
     }
     }
@@ -870,7 +908,7 @@ $normal-font: 14px;
 
 
     .main-left {
     .main-left {
       width: 400px;
       width: 400px;
-      min-width: 350px;
+      min-width: 300px;
       background: #fff;
       background: #fff;
       margin-right: 20px;
       margin-right: 20px;
       border: 1px solid #ececec;
       border: 1px solid #ececec;
@@ -940,6 +978,7 @@ $normal-font: 14px;
 
 
     .main-right {
     .main-right {
       width: 80%;
       width: 80%;
+      min-width: 900px;
       position: relative;
       position: relative;
       .sheet-detail-wrapper {
       .sheet-detail-wrapper {
         height: 100%;
         height: 100%;
@@ -950,28 +989,46 @@ $normal-font: 14px;
         background: #fff;
         background: #fff;
         .detail-top {
         .detail-top {
           padding: 20px;
           padding: 20px;
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
+          // display: flex;
+          // justify-content: space-between;
+          // align-items: center;
           border-bottom: 1px solid #ececec;
           border-bottom: 1px solid #ececec;
           .sheet-name {
           .sheet-name {
-            font-size: 17px;
-            cursor: pointer;
-            max-width: 450px;
-            &:hover {
-              text-decoration: underline;
-            }
+            font-size: 18px;
+            color: #333333;
+            margin-bottom: 6px;
+            // cursor: pointer;
+            // max-width: 450px;
+            // &:hover {
+            //   text-decoration: underline;
+            // }
           }
           }
-          .action-ul {
+          .sheet-anothor-info{
             display: flex;
             display: flex;
-            li {
-              margin: 0 10px;
+            justify-content: space-between;
+            align-items: center;
+            .author{
+              color: #666666;
+              font-size: 16px;
+            }
+            .action-ul {
+              display: flex;
+              li {
+                margin: 0 10px;
+                display: flex;
+                align-items: center;
+                img{
+                  height: 16px;
+                  width: 16px;
+                  margin-right: 4px;
+                }
+              }
             }
             }
           }
           }
         }
         }
         .sheet-wrap {
         .sheet-wrap {
           position: relative;
           position: relative;
-          height: calc(100vh - 190px);
+          height: calc(100vh - 210px);
           padding: 15px;
           padding: 15px;
           /* min-height: 500px; */
           /* min-height: 500px; */
         }
         }

+ 196 - 81
src/views/datasheet_manage/customSheetEdit.vue

@@ -1,75 +1,79 @@
 <template>
 <template>
   <div class="customSheet-wrap">
   <div class="customSheet-wrap">
     <div class="wrap-top">
     <div class="wrap-top">
-      <ul class="form-ul">
-        <li>
-          <selectTarget
-            ref="selectRef"
-            @select="handleSelectTarget"
-            :selectStyleType="2"
-          />
-        </li>
-        <li>
-          表格名称
-          <el-input
-            v-model="sheetForm.name"
-            placeholder="请输入表格名称"
-            style="width:200px"
-            clearable>
-          </el-input>
-        </li>
-        <li>
-          表格分类
-          <el-select 
-            v-model="sheetForm.classify" 
-            placeholder="请选择表格分类"
-            clearable
-          >
-							<el-option
-								v-for="item in classifyArr"
-								:key="item.ExcelClassifyId"
-								:label="item.ExcelClassifyName"
-								:value="item.ExcelClassifyId"
-              />
-						</el-select>
-        </li>
-        <li>
-          表格类型
-          <el-select 
-            v-model="sheetForm.sheetType"
-            style="width:150px;"
-          >
-							<el-option
-								v-for="item in sheetTypeOption"
-								:key="item.key"
-								:label="item.label"
-								:value="item.key"
-              />
-						</el-select>
-        </li>
-        <li>
-          表格说明
-          <el-tooltip
-            effect="dark"
-          >
-            <div
-              slot="content"
-              v-html="rules"
-              style="line-height: 20px;width:350px"
-            ></div>
-            <i class="el-icon-question" />
-          </el-tooltip>
-        </li>
-      </ul>
-      <div>
-        <el-button type="primary" size="medium" @click="saveSheetHandle">保存</el-button>
-        <el-button type="primary" size="medium" plain @click="backHandle">返回</el-button>
+      <div class="database-select">
+        <selectTarget
+          ref="selectRef"
+          @select="handleSelectTarget"
+          :selectStyleType="2"
+        />
+        <div>
+          <div v-if="saveTime" style="color:#999999;margin-right:30px ;">
+            最近保存时间:{{ saveTime }}
+          </div>
+          <el-button type="primary" size="medium" @click="saveSheetHandle" v-if="hasPermission">保存</el-button>
+          <el-button type="primary" size="medium" plain @click="backHandle">返回</el-button>
+        </div>
+      </div>
+      <div class="wrap-top-bottom">
+        <ul class="form-ul">
+          <li>
+            <el-input
+              v-model="sheetForm.name"
+              placeholder="请输入表格名称"
+              style="width:240px"
+              clearable>
+            </el-input>
+          </li>
+          <li>
+            <el-select 
+              v-model="sheetForm.classify" 
+              placeholder="请选择表格分类"
+              style="width:240px;"
+              clearable
+            >
+                <el-option
+                  v-for="item in classifyArr"
+                  :key="item.ExcelClassifyId"
+                  :label="item.ExcelClassifyName"
+                  :value="item.ExcelClassifyId"
+                />
+              </el-select>
+          </li>
+          <li>
+            <el-select 
+              v-model="sheetForm.sheetType"
+              style="width:240px;"
+            >
+                <el-option
+                  v-for="item in sheetTypeOption"
+                  :key="item.key"
+                  :label="item.label"
+                  :value="item.key"
+                />
+              </el-select>
+          </li>
+          <li>
+            表格说明
+            <el-tooltip
+              effect="dark"
+            >
+              <div
+                slot="content"
+                v-html="rules"
+                style="line-height: 20px;width:350px"
+              ></div>
+              <i class="el-icon-question" />
+            </el-tooltip>
+          </li>
+        </ul>
       </div>
       </div>
     </div>
     </div>
     
     
     <CustomTable
     <CustomTable
       :sheetType="sheetForm.sheetType"
       :sheetType="sheetForm.sheetType"
       ref="customTableRef"
       ref="customTableRef"
+      @autoSave="autoSaveFun"
     />
     />
   </div>
   </div>
 </template>
 </template>
@@ -90,6 +94,30 @@ export default {
     }
     }
     next()
     next()
   },
   },
+  watch:{
+    sheetForm:{
+      handler(newVal){
+        console.log(newVal,'newVal','newVal');
+        if(this.sheetInit && this.sheetId) this.autoSaveFun()
+        
+      },
+      deep:true
+    }
+  },
+  computed:{
+    hasPermission(){
+      // console.log(this.sheetButton,'sheetButton');
+      return this.sheetButton?
+            this.permissionBtn.isShowBtn('etaTablePermission','etaTable_customize_data_save')&&this.sheetButton.OpButton:
+            this.permissionBtn.isShowBtn('etaTablePermission','etaTable_customize_data_save')
+    }
+  },
+  beforeRouteLeave(to,from,next){
+    if(to.path!='/addMixedSheet'){
+      this.markFinishStatus()
+    }
+    next()
+  },
   data() {
   data() {
     return {
     return {
       sheetId: this.$route.query.id || '',
       sheetId: this.$route.query.id || '',
@@ -103,13 +131,19 @@ export default {
         { key: 1,label: '指标列+日期行' },
         { key: 1,label: '指标列+日期行' },
         { key: 2,label: '指标行+日期列' },
         { key: 2,label: '指标行+日期列' },
       ],
       ],
-
+      saveTime:"",
+      sheetInit:false,
+      isCanEdit:false,
+      sheetButton:'',
+      // 取消自动保存,比如返回的时候
+      cancelAutoSave:false
     }
     }
   },
   },
   methods: {
   methods: {
 
 
     backHandle() {
     backHandle() {
-      this.$router.go(-1)
+      this.$router.back()
+      this.cancelAutoSave=true
     },
     },
 
 
     /* 获取表格详情 */
     /* 获取表格详情 */
@@ -121,14 +155,26 @@ export default {
 			})
 			})
 
 
       if(res.Ret !== 200)  return
       if(res.Ret !== 200)  return
-      const { ExcelName,ExcelClassifyId,ExcelType,TableData } = res.Data;
-      
+      this.isCanEdit = res.Data.CanEdit
+      if(!res.Data.CanEdit){
+        this.$message.warning(`${res.Data.Editor}正在编辑中`)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
+      const { ExcelName,ExcelClassifyId,ExcelType,TableData,ModifyTime,Button} = res.Data;
+      this.sheetButton=Button
       this.sheetForm = {
       this.sheetForm = {
         name: ExcelName,
         name: ExcelName,
         classify: ExcelClassifyId,
         classify: ExcelClassifyId,
         sheetType: ExcelType
         sheetType: ExcelType
       }
       }
+      this.saveTime =  this.$moment(ModifyTime).format('YYYY-MM-DD HH:mm:ss')
 
 
+      this.$nextTick(()=>{
+        this.sheetInit=true
+      })
       this.$refs.customTableRef.initSheetData(TableData);
       this.$refs.customTableRef.initSheetData(TableData);
     },
     },
 
 
@@ -172,7 +218,25 @@ export default {
       })
       })
     },
     },
 
 
-
+    autoSaveFun:_.debounce(async function(){
+      // console.log("触发自动",this.cancelAutoSave);
+      if(!this.sheetId || this.cancelAutoSave) return 
+      const { name,classify,sheetType } = this.sheetForm;
+      if(!name || !classify) return this.$message.warning(name ? '请选择表格分类' : '请输入表格名称')
+      if(!document.getElementsByClassName('table')[0]) return this.$message.warning('请添加表格')
+      let params = {
+        ExcelName: name,
+        ExcelType: sheetType,
+        ExcelClassifyId: classify,
+        ExcelImage:'',
+        Source: 3,
+        TableData: this.$refs.customTableRef.getSaveParams()
+      };
+      console.log("自动保存");
+      const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
+      if(res.Ret !==200) return
+      this.saveTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
+    },1500),
     /* 保存表格 */
     /* 保存表格 */
     saveSheetHandle: _.debounce(async function() {
     saveSheetHandle: _.debounce(async function() {
       const { name,classify,sheetType } = this.sheetForm;
       const { name,classify,sheetType } = this.sheetForm;
@@ -203,15 +267,20 @@ export default {
         TableData: this.$refs.customTableRef.getSaveParams()
         TableData: this.$refs.customTableRef.getSaveParams()
       };
       };
 
 
+      let isAdd = this.sheetId?false:true
+
       const res = this.sheetId
       const res = this.sheetId
       ? await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       ? await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       : await sheetInterface.sheetAdd(params)
       : await sheetInterface.sheetAdd(params)
 
 
       if(res.Ret !==200) return
       if(res.Ret !==200) return
-      
+
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;
       this.$message.success('保存成功')
       this.$message.success('保存成功')
+      this.saveTime =  this.$moment().format('YYYY-MM-DD HH:mm:ss')
       
       
+      isAdd && this.$router.replace({path:'/addCustomSheet',query:{id:this.sheetId}})
+
       // this.$router.replace({
       // this.$router.replace({
       //   path: '/sheetList',
       //   path: '/sheetList',
       //   query: {
       //   query: {
@@ -220,11 +289,22 @@ export default {
       //   }
       //   }
       // })
       // })
     },300),
     },300),
-    
+    markFinishStatus(){
+      if((!this.sheetId) || (!this.isCanEdit)) return
+      sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
+        if(res.Ret != 200) return 
+      })
+    }
   },
   },
   created() {
   created() {
     this.getClassify();
     this.getClassify();
     this.getDetail();
     this.getDetail();
+  },
+  mounted(){
+    window.addEventListener('beforeunload',this.markFinishStatus)
+  },
+  beforeDestroy(){
+    window.removeEventListener('beforeunload',this.markFinishStatus)
   }
   }
 }
 }
 </script>
 </script>
@@ -232,30 +312,65 @@ export default {
 *{ box-sizing: border-box; }
 *{ box-sizing: border-box; }
 .customSheet-wrap {
 .customSheet-wrap {
   min-height: calc(100vh - 120px);
   min-height: calc(100vh - 120px);
+  min-width: 1020px;
   .wrap-top {
   .wrap-top {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
+    // display: flex;
+    // justify-content: space-between;
+    // align-items: center;
     margin-bottom: 20px;
     margin-bottom: 20px;
     padding: 20px;
     padding: 20px;
     background: #fff;
     background: #fff;
     border: 1px solid #ececec;
     border: 1px solid #ececec;
     border-radius: 4px;
     border-radius: 4px;
     box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
     box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
-    display: flex;
+    // display: flex;
     z-index: 1;
     z-index: 1;
-    .form-ul {
-      flex: 1;
+    .database-select{
       display: flex;
       display: flex;
       align-items: center;
       align-items: center;
-      li {
-        margin: 0 10px;
-        padding-top: 40px;
-        &:first-child {
-          padding-top: 0;
+      margin-bottom: 16px;
+      div{
+        display: flex;
+        align-items: center;
+      }
+    }
+    .wrap-top-bottom{
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      .form-ul {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        li {
+          margin: 0 10px;
+          // padding-top: 40px;
+          &:first-child {
+            padding-top: 0;
+            margin:0
+          }
         }
         }
       }
       }
     }
     }
+
   }
   }
 }
 }
+</style>
+<style lang="scss">
+  .database-select{
+    .el-select{
+      margin-top: 0!important;
+      margin-left: 20px;
+      .el-input{
+        width: 240px;
+      }
+    }
+    .database-choose{
+      display: flex;
+      align-items: center;
+      label,div{
+        white-space: nowrap;
+      }
+    }
+  }
 </style>
 </style>

+ 88 - 16
src/views/datasheet_manage/mixedSheetEdit.vue

@@ -3,20 +3,19 @@
     <div class="wrap-top">
     <div class="wrap-top">
       <ul class="form-ul">
       <ul class="form-ul">
         <li>
         <li>
-          表格名称
           <el-input
           <el-input
             v-model="sheetForm.name"
             v-model="sheetForm.name"
             placeholder="请输入表格名称"
             placeholder="请输入表格名称"
-            style="width:200px"
+            style="width:240px"
             clearable>
             clearable>
           </el-input>
           </el-input>
         </li>
         </li>
         <li>
         <li>
-          表格分类
           <el-select 
           <el-select 
             v-model="sheetForm.classify" 
             v-model="sheetForm.classify" 
             placeholder="请选择表格分类"
             placeholder="请选择表格分类"
             clearable
             clearable
+            style="min-width:240px"
           >
           >
 							<el-option
 							<el-option
 								v-for="item in classifyArr"
 								v-for="item in classifyArr"
@@ -41,13 +40,13 @@
         </li>
         </li>
       </ul>
       </ul>
       <div>
       <div>
-        <span v-if="updateTime">上次保存时间:{{updateTime}}</span>
-        <el-button type="primary" size="medium" @click="saveSheetHandle" style="margin-left:10px">保存</el-button>
+        <span v-if="updateTime" style="color:#999999 ;">最近保存时间:{{updateTime}}</span>
+        <el-button type="primary" size="medium" @click="saveSheetHandle" style="margin-left:10px" v-if="hasPermission">保存</el-button>
         <el-button type="primary" size="medium" plain @click="backHandle">返回</el-button>
         <el-button type="primary" size="medium" plain @click="backHandle">返回</el-button>
       </div>
       </div>
     </div>
     </div>
     
     
-    <MixedTable
+    <MixedTable @autoSave="autoSaveFun"
       ref="mixedTableRef"
       ref="mixedTableRef"
     />
     />
   </div>
   </div>
@@ -69,6 +68,30 @@ export default {
     }
     }
     next()
     next()
   },
   },
+  watch:{
+    sheetForm:{
+      handler(newVal){
+        // console.log(newVal,'newVal','newVal');
+        if(this.sheetInit && this.sheetId) this.autoSaveFun()
+        
+      },
+      deep:true
+    }
+  },
+  computed:{
+    hasPermission(){
+      // console.log(this.sheetButton,'sheetButton');
+      return this.sheetButton?
+              this.permissionBtn.isShowBtn('etaTablePermission','etaTable_customize_mix_save')&&this.sheetButton.OpButton:
+              this.permissionBtn.isShowBtn('etaTablePermission','etaTable_customize_mix_save')
+    }
+  },
+  beforeRouteLeave(to,from,next){
+    if(to.path!='/addMixedSheet'){
+      this.markFinishStatus()
+    }
+    next()
+  },
   data() {
   data() {
     return {
     return {
       sheetId: this.$route.query.id || '',
       sheetId: this.$route.query.id || '',
@@ -80,19 +103,24 @@ export default {
       sheetForm: {
       sheetForm: {
         sheetType: 1
         sheetType: 1
       },
       },
+      sheetButton:'',
+      sheetInit:false,
       sheetTypeOption: [
       sheetTypeOption: [
         { key: 1,label: '指标列+日期行' },
         { key: 1,label: '指标列+日期行' },
         { key: 2,label: '指标行+日期列' },
         { key: 2,label: '指标行+日期列' },
       ],
       ],
 
 
-      updateTime: ''
-
+      updateTime: '',
+      isCanEdit:false,
+      // 取消自动保存,比如返回的时候
+      cancelAutoSave:false
     }
     }
   },
   },
   methods: {
   methods: {
 
 
     backHandle() {
     backHandle() {
-      this.$router.go(-1)
+      this.cancelAutoSave=true
+      this.$router.back()
     },
     },
 
 
     /* 获取表格详情 */
     /* 获取表格详情 */
@@ -104,12 +132,24 @@ export default {
 			})
 			})
 
 
       if(res.Ret !== 200)  return
       if(res.Ret !== 200)  return
-      const { ExcelName,ExcelClassifyId,TableData,ModifyTime } = res.Data;
-      
+      this.isCanEdit = res.Data.CanEdit
+      if(!res.Data.CanEdit){
+        this.$message.warning(`${res.Data.Editor}正在编辑中`)
+        setTimeout(()=>{
+          this.backHandle()
+        },2000)
+        return 
+      }
+
+      const { ExcelName,ExcelClassifyId,TableData,ModifyTime,Button } = res.Data;
+      this.sheetButton=Button
       this.sheetForm = {
       this.sheetForm = {
         name: ExcelName,
         name: ExcelName,
         classify: ExcelClassifyId
         classify: ExcelClassifyId
       }
       }
+      this.$nextTick(()=>{
+        this.sheetInit=true
+      })
       this.updateTime =  this.$moment(ModifyTime).format('YYYY-MM-DD HH:mm:ss')
       this.updateTime =  this.$moment(ModifyTime).format('YYYY-MM-DD HH:mm:ss')
 
 
       this.$refs.mixedTableRef.initData(TableData);
       this.$refs.mixedTableRef.initData(TableData);
@@ -123,8 +163,28 @@ export default {
         this.classifyArr = res.Data.AllNodes || [];
         this.classifyArr = res.Data.AllNodes || [];
       })
       })
     },
     },
-
-
+    autoSaveFun:_.debounce(async function(){
+      if(!this.sheetId || this.cancelAutoSave) return 
+      const { name,classify,sheetType } = this.sheetForm;
+      if(!name || !classify) return this.$message.warning(name ? '请选择表格分类' : '请输入表格名称')
+      let checkAllEmpty = this.$refs.mixedTableRef.config.data.flat(1).some(_ => _.ShowValue);
+      if(!checkAllEmpty) return this.$message.warning('请输入表格内容')
+      let params = {
+        ExcelName: name,
+        ExcelType: 1,
+        ExcelClassifyId: classify,
+        ExcelImage:'',
+        Source: 3,
+        TableData: {
+          CellRelation: JSON.stringify(this.$refs.mixedTableRef.insertRelationArr),
+          Data: this.$refs.mixedTableRef.config.data
+        }
+      };
+      console.log("自动保存");
+      const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
+      if(res.Ret !==200) return
+      this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
+    },1500),
     /* 保存表格 */
     /* 保存表格 */
     saveSheetHandle: _.debounce(async function() {
     saveSheetHandle: _.debounce(async function() {
 
 
@@ -158,7 +218,7 @@ export default {
           Data: this.$refs.mixedTableRef.config.data
           Data: this.$refs.mixedTableRef.config.data
         }
         }
       };
       };
-
+      let isAdd = this.sheetId?false:true
       const res = this.sheetId
       const res = this.sheetId
       ? await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       ? await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       : await sheetInterface.sheetAdd(params)
       : await sheetInterface.sheetAdd(params)
@@ -168,19 +228,31 @@ export default {
       
       
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;
       this.$message.success('保存成功')
       this.$message.success('保存成功')
-
+      isAdd && this.$router.replace({path:'/addMixedSheet',query:{id:this.sheetId}})
     },300),
     },300),
-    
+    markFinishStatus(){
+      if((!this.sheetId) || (!this.isCanEdit)) return
+      sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
+        if(res.Ret != 200) return 
+      })
+    }
   },
   },
   created() {
   created() {
     this.getClassify();
     this.getClassify();
     this.getDetail();
     this.getDetail();
+  },
+  mounted(){
+    window.addEventListener('beforeunload',this.markFinishStatus)
+  },
+  beforeDestroy(){
+    window.removeEventListener('beforeunload',this.markFinishStatus)
   }
   }
 }
 }
 </script>
 </script>
 <style scoped lang="scss">
 <style scoped lang="scss">
 *{ box-sizing: border-box; }
 *{ box-sizing: border-box; }
 .customSheet-wrap {
 .customSheet-wrap {
+  min-width: 1070px;
   min-height: calc(100vh - 120px);
   min-height: calc(100vh - 120px);
   .wrap-top {
   .wrap-top {
     display: flex;
     display: flex;

+ 3 - 1
src/views/datasheet_manage/mixins/classifyMixin.js

@@ -110,6 +110,7 @@ export default {
         if(!this.sheet_title) return this.$message.warning('表格名称不能为空');
         if(!this.sheet_title) return this.$message.warning('表格名称不能为空');
         data.isEditTit = false;
         data.isEditTit = false;
         data.ExcelName = this.sheet_title;
         data.ExcelName = this.sheet_title;
+        console.log(data,'data');
       }else {
       }else {
         if(!this.new_label) return this.$message.warning('名称不能为空');
         if(!this.new_label) return this.$message.warning('名称不能为空');
         this.$set(data,'isEdit',false)
         this.$set(data,'isEdit',false)
@@ -318,7 +319,8 @@ export default {
         '/sheetList': 'etaTable_excel',
         '/sheetList': 'etaTable_excel',
         '/sheetTimeList': 'etaTable_customize_data',
         '/sheetTimeList': 'etaTable_customize_data',
         '/sheetMixedList': 'etaTable_customize_mix',
         '/sheetMixedList': 'etaTable_customize_mix',
-        '/sheetAnalysisList': 'etaTable_analysis'
+        '/sheetAnalysisList': 'etaTable_analysis',
+        '/editSheetAnalysis': 'etaTable_analysis'
       }
       }
       return this.permissionBtn.isShowBtn('etaTablePermission',`${sheetType[this.$route.path]}_${type}`)
       return this.permissionBtn.isShowBtn('etaTablePermission',`${sheetType[this.$route.path]}_${type}`)
     }
     }

+ 126 - 81
src/views/datasheet_manage/sheetList.vue

@@ -136,10 +136,7 @@
         <!-- 表格详情 -->
         <!-- 表格详情 -->
         <div class="sheet-detail-wrapper" v-if="select_id">
         <div class="sheet-detail-wrapper" v-if="select_id">
           <div class="detail-top">
           <div class="detail-top">
-            <span class="author"
-              >作者:{{ sheetDetailInfo.SysUserRealName }}</span
-            >
-            <el-input
+            <!-- <el-input
               ref="sheetEditTitRef"
               ref="sheetEditTitRef"
               style="width: 400px"
               style="width: 400px"
               placeholder="请输入表格名称"
               placeholder="请输入表格名称"
@@ -147,64 +144,68 @@
               v-model="sheet_title"
               v-model="sheet_title"
               v-if="sheetDetailInfo.isEditTit"
               v-if="sheetDetailInfo.isEditTit"
               @blur="changeValue(sheetDetailInfo, 'edit-tit')"
               @blur="changeValue(sheetDetailInfo, 'edit-tit')"
-            />
-            <span
+            /> -->
+            <!-- <span
               class="sheet-name"
               class="sheet-name"
               @click="editNodeLabel(sheetDetailInfo, 'edit-tit')"
               @click="editNodeLabel(sheetDetailInfo, 'edit-tit')"
               v-else
               v-else
             >
             >
               {{ sheetDetailInfo.ExcelName }}
               {{ sheetDetailInfo.ExcelName }}
               <i class="el-icon-edit" v-if="sheetDetailInfo.Source === 1" />
               <i class="el-icon-edit" v-if="sheetDetailInfo.Source === 1" />
-            </span>
-            <ul class="action-ul">
-              <li
-                class="editsty"
-                @click="saveHandle"
-                v-if="
-                  sheetDetailInfo.Source === 1 &&
-                  sheetDetailInfo.Button.OpButton&&isSheetBtnShow('save')
-                "
-              >
-                保存
-              </li>
-              <template v-if="[2, 3].includes(sheetDetailInfo.Source)">
+            </span> -->
+            <div class="sheet-name">
+              {{ sheetDetailInfo.ExcelName }}
+            </div>
+            <div class="sheet-anothor-info">
+              <span class="author">作者:{{ sheetDetailInfo.SysUserRealName }}</span>
+              <ul class="action-ul">
+                <li style="color:#999999 ;">最近保存时间:{{ saveTime }}</li>
                 <li
                 <li
                   class="editsty"
                   class="editsty"
                   @click="goEditHandle"
                   @click="goEditHandle"
-                  v-if="sheetDetailInfo.Button.OpButton&&isSheetBtnShow('edit')"
+                  v-if="isCreator || 
+                  (sheetDetailInfo.Button && sheetDetailInfo.Button.OpButton&&isSheetBtnShow('edit'))"
                 >
                 >
-                  编辑
+                  <img src="~@/assets/img/icons/edit_blue_new.png" v-if="!editButtonText"/>
+                  <span>{{ editButtonText?editButtonText:'编辑' }}</span> 
                 </li>
                 </li>
-                <li
-                  class="editsty"
-                  @click="refreshSheetEdb"
-                  v-if="sheetDetailInfo.Button.RefreshButton&&isSheetBtnShow('refresh')"
-                >
-                  刷新
+                <template v-if="[2, 3].includes(sheetDetailInfo.Source)">
+                  <li
+                    class="editsty"
+                    @click="refreshSheetEdb"
+                    v-if="sheetDetailInfo.Button.RefreshButton&&isSheetBtnShow('refresh')"
+                  >
+                  <img src="~@/assets/img/icons/refresh_blue_new.png"/>
+                    <span>刷新</span>
+                  </li>
+                  <li
+                    class="editsty"
+                    @click="saveOtherHandle"
+                    v-if="sheetDetailInfo.Button.CopyButton&&isSheetBtnShow('otherSave')"
+                  >
+                    <img src="~@/assets/img/icons/save_as_blue_new.png"/>
+                    <span>另存为</span>
+                  </li>
+                </template>
+                <li v-if="isDownLoadShow(sheetDetailInfo)"
+                  class="editsty" @click="downloadExcel(sheetDetailInfo)">
+                  <img src="~@/assets/img/icons/download_blue.png"/>
+                  <span>下载</span>
                 </li>
                 </li>
                 <li
                 <li
-                  class="editsty"
-                  @click="saveOtherHandle"
-                  v-if="sheetDetailInfo.Button.CopyButton&&isSheetBtnShow('otherSave')"
+                  class="deletesty"
+                  v-if="
+                    isCreator || (sheetDetailInfo.Button && sheetDetailInfo.Button.DeleteButton
+                    &&isDeleteShow(sheetDetailInfo))
+                  "
+                  @click="delSheetHandle({cell:sheetDetailInfo, type:'del'})"
                 >
                 >
-                  另存为
+                  <img src="~@/assets/img/icons/delete-red.png"/>
+                  <span>删除</span>
                 </li>
                 </li>
-              </template>
-              <li v-if="isDownLoadShow(sheetDetailInfo)"
-                class="editsty" @click="downloadExcel(sheetDetailInfo)">
-                下载
-              </li>
-              <li
-                class="deletesty"
-                v-if="
-                  sheetDetailInfo.Button && sheetDetailInfo.Button.DeleteButton
-                  &&isDeleteShow(sheetDetailInfo)
-                "
-                @click="delSheetHandle({cell:sheetDetailInfo, type:'del'})"
-              >
-                删除
-              </li>
-            </ul>
+              </ul>
+            </div>
+
           </div>
           </div>
 
 
           <!-- 表格 -->
           <!-- 表格 -->
@@ -219,12 +220,7 @@
                   scrollLeft: 0
                   scrollLeft: 0
                 }]
                 }]
               }"
               }"
-              :sheetInfo="{
-                ExcelInfoId: sheetDetailInfo.ExcelInfoId,
-                ExcelName: sheetDetailInfo.ExcelName,
-                ExcelClassifyId: sheetDetailInfo.ExcelClassifyId,
-                Source: sheetDetailInfo.Source
-              }"
+              :limit="{disabled:true}"
             />
             />
 
 
             <!-- 自定义表格  -->
             <!-- 自定义表格  -->
@@ -360,6 +356,10 @@ export default {
         const cell = {Source:3}
         const cell = {Source:3}
         return this.isSheetBtnShow(cell,'edit')||this.isSheetBtnShow(cell,'refresh')||this.isSheetBtnShow(cell,'otherSave')
         return this.isSheetBtnShow(cell,'edit')||this.isSheetBtnShow(cell,'refresh')||this.isSheetBtnShow(cell,'otherSave')
             || this.isSheetBtnShow(cell,'download')||this.isSheetBtnShow(cell,'del')
             || this.isSheetBtnShow(cell,'download')||this.isSheetBtnShow(cell,'del')
+    },
+
+    isCreator(){
+      return this.adminId==this.excelAdminId
     }
     }
   },
   },
   data() {
   data() {
@@ -410,12 +410,15 @@ export default {
           { required: true, message: "表格分类不能为空", trigger: "blur" },
           { required: true, message: "表格分类不能为空", trigger: "blur" },
         ],
         ],
       },
       },
-
       sourceMap: {
       sourceMap: {
         '/sheetList': 1,
         '/sheetList': 1,
         '/sheetTimeList': 2,
         '/sheetTimeList': 2,
         '/sheetMixedList': 3,
         '/sheetMixedList': 3,
-      }
+      },
+      saveTime:"",
+      editButtonText:"",
+      adminId:localStorage.getItem("AdminId") || '0',
+      excelAdminId:""
     };
     };
   },
   },
   watch: {
   watch: {
@@ -513,6 +516,7 @@ export default {
 
 
     /* 选中分类变化时 */
     /* 选中分类变化时 */
     nodeChange({ UniqueCode, ExcelInfoId, ExcelClassifyId }, node) {
     nodeChange({ UniqueCode, ExcelInfoId, ExcelClassifyId }, node) {
+      console.log(this.select_id,ExcelInfoId,'UniqueCode');
       this.search_txt = "";
       this.search_txt = "";
       this.select_node = UniqueCode;
       this.select_node = UniqueCode;
       this.select_classify = !ExcelInfoId ? ExcelClassifyId : 0;
       this.select_classify = !ExcelInfoId ? ExcelClassifyId : 0;
@@ -738,17 +742,22 @@ export default {
 
 
     /* 获取表格详情 */
     /* 获取表格详情 */
     getDetailHandle() {
     getDetailHandle() {
-      sheetInterface
-        .sheetDetail({
+      sheetInterface.sheetDetail({
           ExcelInfoId: this.select_id,
           ExcelInfoId: this.select_id,
         })
         })
         .then((res) => {
         .then((res) => {
           if (res.Ret !== 200) return;
           if (res.Ret !== 200) return;
 
 
           this.sheetDetailInfo = res.Data;
           this.sheetDetailInfo = res.Data;
+          this.saveTime = this.$moment(this.sheetDetailInfo.ModifyTime).format('YYYY-MM-DD HH:mm:ss')||''
+          this.excelAdminId = this.sheetDetailInfo.SysUserId
+          this.editButtonText = this.sheetDetailInfo.CanEdit?'':`${this.sheetDetailInfo.Editor}编辑中`
+          //从nextTick里面拉出来 更多功能按钮 才显示的出来
+          this.sheetDetailInfo.Source === 1 && this.$refs.sheetRef && this.$refs.sheetRef.init();
 
 
           this.$nextTick(() => {
           this.$nextTick(() => {
-            this.sheetDetailInfo.Source === 1 && this.$refs.sheetRef.init();
+
+            // this.sheetDetailInfo.Source === 1 && this.$refs.sheetRef.init();
 
 
             this.sheetDetailInfo.Source === 2 &&
             this.sheetDetailInfo.Source === 2 &&
               this.$refs.customTableRef.initSheetData(res.Data.TableData);
               this.$refs.customTableRef.initSheetData(res.Data.TableData);
@@ -772,17 +781,33 @@ export default {
         })
         })
         .catch(() => {});
         .catch(() => {});
     },
     },
-
     /* 编辑 */
     /* 编辑 */
     goEditHandle() {
     goEditHandle() {
-      let path = {
-        2: "/addCustomSheet",
-        3: "addMixedSheet",
-      };
-      this.$router.push({
-        path: path[this.sheetDetailInfo.Source],
-        query: { id: this.sheetDetailInfo.ExcelInfoId },
-      });
+      // 标记
+      sheetInterface.markSheetEditStatus({ExcelInfoId: this.select_id,Status:1}).then(res=>{
+        if(res.Ret != 200) return 
+        if(res.Data.Status==0){
+          let path = {
+            1:"/addsheet",
+            2: "/addCustomSheet",
+            3: "/addMixedSheet",
+          };
+          if(this.sheetDetailInfo.Source === 1) {
+            const { href } = this.$router.resolve({ path: path[this.sheetDetailInfo.Source],query: { id: this.sheetDetailInfo.ExcelInfoId } });
+            window.open(href, "_blank");
+          }else {
+            this.$router.push({
+              path: path[this.sheetDetailInfo.Source],
+              query: { id: this.sheetDetailInfo.ExcelInfoId },
+            });
+          }
+
+        }else if(res.Data.Status==1){
+          this.editButtonText = `${res.Data.Editor}编辑中`
+          this.$message.warning('当前'+this.editButtonText)
+        }
+      })
+
     },
     },
 
 
     /* 刷新表格 */
     /* 刷新表格 */
@@ -887,7 +912,7 @@ $normal-font: 14px;
 
 
     .main-left {
     .main-left {
       width: 400px;
       width: 400px;
-      min-width: 350px;
+      min-width: 300px;
       background: #fff;
       background: #fff;
       margin-right: 20px;
       margin-right: 20px;
       border: 1px solid #ececec;
       border: 1px solid #ececec;
@@ -957,6 +982,7 @@ $normal-font: 14px;
 
 
     .main-right {
     .main-right {
       width: 80%;
       width: 80%;
+      min-width: 800px;
       .sheet-detail-wrapper {
       .sheet-detail-wrapper {
         height: 100%;
         height: 100%;
         border: 1px solid #ececec;
         border: 1px solid #ececec;
@@ -966,28 +992,47 @@ $normal-font: 14px;
         background: #fff;
         background: #fff;
         .detail-top {
         .detail-top {
           padding: 20px;
           padding: 20px;
-          display: flex;
-          justify-content: space-between;
-          align-items: center;
+          // display: flex;
+          // justify-content: space-between;
+          // align-items: center;
           border-bottom: 1px solid #ececec;
           border-bottom: 1px solid #ececec;
           .sheet-name {
           .sheet-name {
-            font-size: 17px;
-            cursor: pointer;
-            max-width: 450px;
-            &:hover {
-              text-decoration: underline;
-            }
+            font-size: 18px;
+            color: #333333;
+            margin-bottom: 6px;
+            // cursor: pointer;
+            // max-width: 450px;
+            // &:hover {
+            //   text-decoration: underline;
+            // }
           }
           }
-          .action-ul {
+          .sheet-anothor-info{
             display: flex;
             display: flex;
-            li {
-              margin: 0 10px;
+            justify-content: space-between;
+            align-items: center;
+            .author{
+              color: #666666;
+              font-size: 16px;
+            }
+            .action-ul {
+              display: flex;
+              li {
+                margin: 0 10px;
+                display: flex;
+                align-items: center;
+                img{
+                  height: 16px;
+                  width: 16px;
+                  margin-right: 4px;
+                }
+              }
             }
             }
           }
           }
+
         }
         }
         .sheet-wrap {
         .sheet-wrap {
           position: relative;
           position: relative;
-          height: calc(100vh - 190px);
+          height: calc(100vh - 210px);
           padding: 15px;
           padding: 15px;
           /* min-height: 500px; */
           /* min-height: 500px; */
         }
         }

+ 2 - 2
src/views/ppt_manage/newVersion/components/Cover.vue

@@ -1,8 +1,8 @@
 <template>
 <template>
-    <div class="flex-column cover" :style="`width:100%;color: ${$parent.pptCoverTextColor||'#fff'};`" v-if="pageInfo">
+    <div class="flex-column cover" :style="`width:100%;height:100%;color: ${$parent.pptCoverTextColor||'#fff'};`" v-if="pageInfo">
         <!-- <img :src="pageInfo.BackgroundImg" class="pptbg" /> -->
         <!-- <img :src="pageInfo.BackgroundImg" class="pptbg" /> -->
         <!-- <img :src="base64Url" class="pptbg" /> -->
         <!-- <img :src="base64Url" class="pptbg" /> -->
-        <img :src="pageInfo.BackgroundImg" class="pptbg"  style="width:100%"/>
+        <img :src="pageInfo.BackgroundImg" class="pptbg"  style="width:100%;height:100%;object-fit: fill !important;"/>
         <div
         <div
         style="width:62%; font-size:16px; text-align:center; line-height:1.6;  position:absolute; right:20px; top:50%;zIndex:20;">
         style="width:62%; font-size:16px; text-align:center; line-height:1.6;  position:absolute; right:20px; top:50%;zIndex:20;">
         <p :style="`height:5px; marginBottom:21px;`"></p>
         <p :style="`height:5px; marginBottom:21px;`"></p>

+ 2 - 2
src/views/ppt_manage/newVersion/components/CoverEn.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
-    <div class="flex-column cover" style="width:100%;" v-if="pageInfo">
-        <img :src="pageInfo.BackgroundImg" class="pptbg"  style="width:100%"/>
+    <div class="flex-column cover" style="width:100%;height:100%;" v-if="pageInfo">
+        <img :src="pageInfo.BackgroundImg" class="pptbg"  style="width:100%;height:100%;object-fit: fill !important;"/>
         <div
         <div
         :style="`width:62%; font-size:16px; text-align:center; line-height:1.6; color:${$parent.pptCoverTextColor||'#fff'}; position:absolute; right:20px; top:50%;zIndex:20;`">
         :style="`width:62%; font-size:16px; text-align:center; line-height:1.6; color:${$parent.pptCoverTextColor||'#fff'}; position:absolute; right:20px; top:50%;zIndex:20;`">
         <p :style="`height:5px;marginBottom:21px;`"></p>
         <p :style="`height:5px;marginBottom:21px;`"></p>

+ 1 - 1
src/views/ppt_manage/newVersion/components/catalog/pptContent.vue

@@ -320,7 +320,7 @@ export default {
       position:relative;
       position:relative;
       width:100%;
       width:100%;
       background: url('~@/assets/img/pptnextimg.png') no-repeat center;
       background: url('~@/assets/img/pptnextimg.png') no-repeat center;
-      background-size: cover;
+      background-size: 100%;
       margin-bottom: 20px;
       margin-bottom: 20px;
       border: 4px solid transparent;
       border: 4px solid transparent;
       .ppt-info{
       .ppt-info{

+ 2 - 2
src/views/ppt_manage/newVersion/pptEditor.vue

@@ -2,7 +2,7 @@
   <div class="page-wrap">
   <div class="page-wrap">
     <div class="index-wrap ppt-page-wrap flex-column">
     <div class="index-wrap ppt-page-wrap flex-column">
         <div class="cover-wrap" @click="openChooseCover">
         <div class="cover-wrap" @click="openChooseCover">
-            <div class="cover" :style="'background: no-repeat center/cover url('+firstPage.BackgroundImg+')'">
+            <div class="cover" :style="'background: no-repeat center/cover url('+firstPage.BackgroundImg+');background-color:#F2F6FA;'">
                 <img src="~@/assets/img/ppt_m/add_first.png" />
                 <img src="~@/assets/img/ppt_m/add_first.png" />
             </div>
             </div>
             <p class="hint-text">选择封面页</p>
             <p class="hint-text">选择封面页</p>
@@ -313,7 +313,7 @@ export default {
         firstPage:{
         firstPage:{
             Title:'',
             Title:'',
             ReportType:'',
             ReportType:'',
-            BackgroundImg:'https://hzstatic.hzinsights.com/ppt/bg3.jpg',
+            BackgroundImg:'',
             PptDate:(new Date().getFullYear())+'年'+(new Date().getMonth()+1)+'月',
             PptDate:(new Date().getFullYear())+'年'+(new Date().getMonth()+1)+'月',
             BackIndex:0,
             BackIndex:0,
             TemplateType:1
             TemplateType:1

+ 2 - 2
src/views/ppt_manage/newVersion/pptEnEditor.vue

@@ -2,7 +2,7 @@
   <div class="page-wrap">
   <div class="page-wrap">
     <div class="index-wrap ppt-page-wrap flex-column">
     <div class="index-wrap ppt-page-wrap flex-column">
         <div class="cover-wrap" @click="openChooseCover">
         <div class="cover-wrap" @click="openChooseCover">
-            <div class="cover" :style="'background: no-repeat center/cover url('+firstPage.BackgroundImg+')'">
+            <div class="cover" :style="'background: no-repeat center/cover url('+firstPage.BackgroundImg+');background-color:#F2F6FA;'">
                 <img src="~@/assets/img/ppt_m/add_first.png" />
                 <img src="~@/assets/img/ppt_m/add_first.png" />
             </div>
             </div>
             <p class="hint-text">选择封面页</p>
             <p class="hint-text">选择封面页</p>
@@ -336,7 +336,7 @@ export default {
         firstPage:{
         firstPage:{
             Title:'',
             Title:'',
             ReportType:'',
             ReportType:'',
-            BackgroundImg:'https://hzstatic.hzinsights.com/ppt/bg3.jpg',
+            BackgroundImg:'',
             PptDate:(new Date().getFullYear())+'.'+(new Date().getMonth()+1),
             PptDate:(new Date().getFullYear())+'.'+(new Date().getMonth()+1),
             BackIndex:0,
             BackIndex:0,
             TemplateType:1
             TemplateType:1

+ 6 - 4
src/views/ppt_manage/newVersion/pptEnPresent.vue

@@ -39,11 +39,11 @@
           <!-- <div class="image-move" v-if="dragShow" @mousedown.stop="handleMoveStart" ></div> -->
           <!-- <div class="image-move" v-if="dragShow" @mousedown.stop="handleMoveStart" ></div> -->
           <div class="ppt-wrap" @wheel.stop="normalMouseWheel">
           <div class="ppt-wrap" @wheel.stop="normalMouseWheel">
             <!-- 封面 -->
             <!-- 封面 -->
-            <div class="ppt-item" id="cover" v-if="currentIndex===0">
+            <div class="ppt-item" id="cover" v-if="currentIndex===0" style="background-size:20%;">
               <Cover :pageInfo="coverInfo.page" v-show="coverInfo.page"></Cover>
               <Cover :pageInfo="coverInfo.page" v-show="coverInfo.page"></Cover>
             </div>
             </div>
             <!-- 封底 -->
             <!-- 封底 -->
-            <div class="ppt-item" id="back" v-else-if="currentIndex===pageList.length+1">
+            <div class="ppt-item" id="back" v-else-if="currentIndex===pageList.length+1" style="background-size:20%;">
               <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
               <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
             </div>
             </div>
             <!-- PPT内容 -->
             <!-- PPT内容 -->
@@ -97,11 +97,11 @@
         @mousedown.stop="(e)=>{handleMouse('down',e)}" @mouseup="(e)=>{handleMouse('up',e)}" @wheel.stop="normalMouseWheel" @contextmenu="handleContextMenu">
         @mousedown.stop="(e)=>{handleMouse('down',e)}" @mouseup="(e)=>{handleMouse('up',e)}" @wheel.stop="normalMouseWheel" @contextmenu="handleContextMenu">
           <div class="ppt-wrap">
           <div class="ppt-wrap">
             <!-- 封面 -->
             <!-- 封面 -->
-            <div class="ppt-item" id="cover" v-if="currentIndex===0">
+            <div class="ppt-item" id="cover" v-if="currentIndex===0" style="background-size:20%;">
               <Cover :pageInfo="coverInfo.page" v-show="coverInfo.page"></Cover>
               <Cover :pageInfo="coverInfo.page" v-show="coverInfo.page"></Cover>
             </div>
             </div>
             <!-- 封底 -->
             <!-- 封底 -->
-            <div class="ppt-item" id="back" v-else-if="currentIndex===pageList.length+1">
+            <div class="ppt-item" id="back" v-else-if="currentIndex===pageList.length+1" style="background-size:20%;">
               <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
               <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
             </div>
             </div>
             <!-- PPT内容 -->
             <!-- PPT内容 -->
@@ -302,6 +302,7 @@ export default {
         this.sheetListHandle(sheetElements);
         this.sheetListHandle(sheetElements);
       }
       }
       this.currentKey = 1
       this.currentKey = 1
+      this.pptBgImage&&$('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
       this.dataLoading.close();
       this.dataLoading.close();
     },
     },
     //根据id获取ppt数据
     //根据id获取ppt数据
@@ -559,6 +560,7 @@ export default {
           $('.fullscreen .ppt-wrap').css('width','1100px')
           $('.fullscreen .ppt-wrap').css('width','1100px')
           $('.ppt-item').css('transform',`scale(1)`)
           $('.ppt-item').css('transform',`scale(1)`)
           this.changeCurrentItem(this.currentItem)
           this.changeCurrentItem(this.currentItem)
+          $('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
         })
         })
       }else{
       }else{
         this.$nextTick(()=>{
         this.$nextTick(()=>{

+ 4 - 4
src/views/ppt_manage/newVersion/pptEnPublish.vue

@@ -19,7 +19,7 @@
       <template v-if="loadingAll">
       <template v-if="loadingAll">
         <div class="ppt-wrap flex-center">
         <div class="ppt-wrap flex-center">
           <!-- 封面 -->
           <!-- 封面 -->
-          <div class="ppt-item" id="cover">
+          <div class="ppt-item" id="cover" style="background-size:20%;">
             <Cover :pageInfo="coverInfo.page"></Cover>
             <Cover :pageInfo="coverInfo.page"></Cover>
           </div>
           </div>
           <!-- 内容 -->
           <!-- 内容 -->
@@ -37,7 +37,7 @@
             </component>
             </component>
           </div>
           </div>
           <!-- 封底 -->
           <!-- 封底 -->
-          <div class="ppt-item" id="back" v-if="pptBackImage.length">
+          <div class="ppt-item" id="back" v-if="pptBackImage.length" style="background-size:20%;">
             <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
             <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
           </div>
           </div>
         </div>
         </div>
@@ -394,14 +394,14 @@ export default {
       })
       })
       //生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
       //生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
       const coverInfo = [
       const coverInfo = [
-        {text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
+        //{text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
         {text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
         {text:`\n${this.pptCoverCompenyName||'ETA'}`,
         {text:`\n${this.pptCoverCompenyName||'ETA'}`,
          options:{fontSize:16*0.75,breakLine:true}},
          options:{fontSize:16*0.75,breakLine:true}},
         {text:`\n — ${this.coverInfo.page.ReportType} —`,options:{fontSize:16*0.75,breakLine:true}}, 
         {text:`\n — ${this.coverInfo.page.ReportType} —`,options:{fontSize:16*0.75,breakLine:true}}, 
         {text:`\n${this.pptCoverDepartName||'Research Department'}`,options:{fontSize:16*0.75,breakLine:true}},
         {text:`\n${this.pptCoverDepartName||'Research Department'}`,options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
-        {text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
+        //{text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
       ]
       ]
       cover.addText(coverInfo,{
       cover.addText(coverInfo,{
         x:'38%',
         x:'38%',

+ 6 - 4
src/views/ppt_manage/newVersion/pptPresent.vue

@@ -39,11 +39,11 @@
           <!-- <div class="image-move" v-if="dragShow" @mousedown.stop="handleMoveStart" ></div> -->
           <!-- <div class="image-move" v-if="dragShow" @mousedown.stop="handleMoveStart" ></div> -->
           <div class="ppt-wrap" @wheel.stop="normalMouseWheel">
           <div class="ppt-wrap" @wheel.stop="normalMouseWheel">
             <!-- 封面 -->
             <!-- 封面 -->
-            <div class="ppt-item" id="cover" v-if="currentIndex===0">
+            <div class="ppt-item" id="cover" v-if="currentIndex===0" style="background-size:20%;">
               <Cover :pageInfo="coverInfo.page" v-show="coverInfo.page"></Cover>
               <Cover :pageInfo="coverInfo.page" v-show="coverInfo.page"></Cover>
             </div>
             </div>
             <!-- 封底 -->
             <!-- 封底 -->
-            <div class="ppt-item" id="back" v-else-if="currentIndex===pageList.length+1">
+            <div class="ppt-item" id="back" v-else-if="currentIndex===pageList.length+1" style="background-size:20%;">
               <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
               <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
             </div>
             </div>
             <!-- PPT内容 -->
             <!-- PPT内容 -->
@@ -97,11 +97,11 @@
         @mousedown.stop="(e)=>{handleMouse('down',e)}" @mouseup="(e)=>{handleMouse('up',e)}" @wheel.stop="normalMouseWheel" @contextmenu="handleContextMenu" >
         @mousedown.stop="(e)=>{handleMouse('down',e)}" @mouseup="(e)=>{handleMouse('up',e)}" @wheel.stop="normalMouseWheel" @contextmenu="handleContextMenu" >
           <div class="ppt-wrap">
           <div class="ppt-wrap">
             <!-- 封面 -->
             <!-- 封面 -->
-            <div class="ppt-item" id="cover" v-if="currentIndex===0">
+            <div class="ppt-item" id="cover" v-if="currentIndex===0" style="background-size:20%;">
               <Cover :pageInfo="coverInfo.page" v-show="coverInfo.page"></Cover>
               <Cover :pageInfo="coverInfo.page" v-show="coverInfo.page"></Cover>
             </div>
             </div>
             <!-- 封底 -->
             <!-- 封底 -->
-            <div class="ppt-item" id="back" v-else-if="currentIndex===pageList.length+1">
+            <div class="ppt-item" id="back" v-else-if="currentIndex===pageList.length+1" style="background-size:20%;">
               <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
               <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
             </div>
             </div>
             <!-- PPT内容 -->
             <!-- PPT内容 -->
@@ -300,6 +300,7 @@ export default {
         this.sheetListHandle(sheetElements);
         this.sheetListHandle(sheetElements);
       }
       }
       this.currentKey = 1
       this.currentKey = 1
+      this.pptBgImage&&$('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
       this.dataLoading.close();
       this.dataLoading.close();
     },
     },
     //根据id获取ppt数据
     //根据id获取ppt数据
@@ -557,6 +558,7 @@ export default {
           $('.fullscreen .ppt-wrap').css('width','1100px')
           $('.fullscreen .ppt-wrap').css('width','1100px')
           $('.ppt-item').css('transform',`scale(1)`)
           $('.ppt-item').css('transform',`scale(1)`)
           this.changeCurrentItem(this.currentItem)
           this.changeCurrentItem(this.currentItem)
+          $('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
         })
         })
       }else{
       }else{
         this.$nextTick(()=>{
         this.$nextTick(()=>{

+ 4 - 4
src/views/ppt_manage/newVersion/pptPublish.vue

@@ -20,7 +20,7 @@
       <template v-if="loadingAll">
       <template v-if="loadingAll">
         <div class="ppt-wrap flex-center">
         <div class="ppt-wrap flex-center">
           <!-- 封面 -->
           <!-- 封面 -->
-          <div class="ppt-item" id="cover">
+          <div class="ppt-item" id="cover" style="background-size:20%;">
             <Cover :pageInfo="coverInfo.page"></Cover>
             <Cover :pageInfo="coverInfo.page"></Cover>
           </div>
           </div>
           <!-- 内容 -->
           <!-- 内容 -->
@@ -38,7 +38,7 @@
             </component>
             </component>
           </div>
           </div>
           <!-- 封底 -->
           <!-- 封底 -->
-          <div class="ppt-item" id="back" v-if="pptBackImage.length">
+          <div class="ppt-item" id="back" v-if="pptBackImage.length" style="background-size:20%;">
             <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
             <img :src="pptBackImage" class="pptbg" style="width:100%;height:100%;object-fit: fill !important;"/>
           </div>
           </div>
         </div>
         </div>
@@ -474,13 +474,13 @@ export default {
       })
       })
       //生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
       //生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
       const coverInfo = [
       const coverInfo = [
-        {text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
+        //{text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
         {text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
         {text:`\n— ${this.pptCoverCompenyName||'ETA'} ● ${this.coverInfo.page.ReportType} —`,
         {text:`\n— ${this.pptCoverCompenyName||'ETA'} ● ${this.coverInfo.page.ReportType} —`,
          options:{fontSize:16*0.75,breakLine:false}},
          options:{fontSize:16*0.75,breakLine:false}},
         {text:`\n${this.pptCoverDepartName||'投研部'}`,options:{fontSize:16*0.75,breakLine:true}},
         {text:`\n${this.pptCoverDepartName||'投研部'}`,options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
         {text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
-        {text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
+        //{text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
       ]
       ]
       cover.addText(coverInfo,{
       cover.addText(coverInfo,{
         x:'38%',
         x:'38%',

+ 2 - 1
src/views/sandbox_manage/index.vue

@@ -404,7 +404,8 @@ export default {
     },
     },
 
 
     editChildSand(item) {
     editChildSand(item) {
-      ({SandboxId,VersionCode,type} = item)
+      // ({SandboxId,VersionCode,type} = item)
+      let {SandboxId,VersionCode,type} = item
        // 编辑前校验
        // 编辑前校验
       sandInterface
       sandInterface
         .mark({
         .mark({

+ 33 - 6
src/views/system_manage/newAuthManage.vue

@@ -42,6 +42,7 @@ export default {
             loading: null, //loading
             loading: null, //loading
             isLook: false, //是否仅查看
             isLook: false, //是否仅查看
             Role:{},//角色
             Role:{},//角色
+            checkList:[],//角色应勾选的list
         };
         };
     },
     },
     watch: {
     watch: {
@@ -84,12 +85,17 @@ export default {
                     HalfChoiceList = []
                     HalfChoiceList = []
                 } = res.Data
                 } = res.Data
                 this.authList = List || []
                 this.authList = List || []
-                this.defaultCheckedKeys = ChoiceList.filter((item) => !HalfChoiceList.some((halfItem) =>
-                    item === halfItem))
+                this.checkList = ChoiceList
+                /* this.defaultCheckedKeys = ChoiceList.filter((item) => !HalfChoiceList.some((halfItem) =>
+                    item === halfItem)) */
                 const type = this.isLook?'all':''
                 const type = this.isLook?'all':''
-                this.authList.forEach(l=>{
-                    this.formatTree(l,type)
+                this.$nextTick(()=>{
+                    this.authList.forEach(l=>{
+                        this.formatTree(l,type)
+                        })
+                    this.defaultCheckedKeys=this.checkList
                 })
                 })
+                
             })
             })
         },
         },
         // 保存
         // 保存
@@ -113,17 +119,38 @@ export default {
         },
         },
         formatTree(data,type){
         formatTree(data,type){
             if(/* data.MenuType===2|| */type==='all'){
             if(/* data.MenuType===2|| */type==='all'){
-                //同时存一下ParentId
-                //监听check事件,如果是ParentId的check,就把子项从defaultCheckedKeys中删除
                 data.Disabled = true
                 data.Disabled = true
             }
             }
+            //非叶子节点递归
             if(data.Children && data.Children.length){
             if(data.Children && data.Children.length){
                 data.Children = data.Children.map(i=>{
                 data.Children = data.Children.map(i=>{
                     return this.formatTree(i,type)
                     return this.formatTree(i,type)
                 })
                 })
             }
             }
+            if(!data.Children||data.Children&&data.Children.length===0){
+                //叶子节点向上检查MenuId
+                this.checkDataList(data)
+            }
             return data
             return data
         },
         },
+        //根据MenuId找到对应节点
+        findTreeNode(MenuId){
+            return this.$refs.checkboxTree.getNode(MenuId)
+        },
+        checkDataList(data){
+            //获取data的MenuId 和 checkList对比 
+            //如果MenuId不在checkList里,检查data.ParentId在不在checkList里,若在,则从checkList里去除
+            if(!this.checkList.includes(data.MenuId)&&this.checkList.includes(data.ParentId)){
+                const index = this.checkList.indexOf(data.ParentId)
+                index!==-1&&this.checkList.splice(index,1)
+                console.log('应该去除的节点',data.ParentId)
+            }
+            //向上检查MenuId
+            const parentNode = this.findTreeNode(data.ParentId)
+            if(parentNode){
+                this.checkDataList(parentNode.data)
+            }
+        }
     },
     },
     created() {
     created() {
         if (this.$route.query.id) {
         if (this.$route.query.id) {

+ 1 - 0
src/vuex/modules/permissionButton.js

@@ -16,6 +16,7 @@ const permissionButtons = {
             return new Promise((resolve,reject)=>{
             return new Promise((resolve,reject)=>{
                 departInterence.getRoleBtnAuth().then(res=>{
                 departInterence.getRoleBtnAuth().then(res=>{
                     const buttons = res.Data || []
                     const buttons = res.Data || []
+                    // console.log(buttons.find(it => it.ButtonCode=="etaTable:excel:save"),'buttons');
                     commit('SET_PERMISSION_BUTTONS',buttons)
                     commit('SET_PERMISSION_BUTTONS',buttons)
                     
                     
                     let trialUserPermisson = !!buttons.find(item => item.ButtonCode =="trialUserAction")
                     let trialUserPermisson = !!buttons.find(item => item.ButtonCode =="trialUserAction")