Browse Source

Merge branch 'gn3.0' into debug

shanbinzhang 1 month ago
parent
commit
3d4a0bea97

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

@@ -400,6 +400,20 @@ export const getEdbBaseInfo = params => {
 	return http.get('/datamanage/excel_info/base_edb_info',params)
 }
 
+/**
+ * 各模块应用层 保存行列
+ * @param {*} params 
+ * UniqueCode 表格code
+ * ReferencedId 关联报告/pptid
+ * FromScene	2:研报 3英文研报 4ppt 5英文ppt
+ * Uuid 应用时生成唯一id
+ * WidthList 列宽数组
+ * HeightList 行高数组
+ */
+export const sheetUseSceneSaveWid = params => {
+	return http.post('/datamanage/excel_info/reference/save',params)
+}
+
 /* =====自定义分析==== */
 
 export const sheetAnalysisInterface = {

+ 11 - 3
src/views/datasheet_manage/components/BalanceTable.vue

@@ -578,7 +578,9 @@ export default {
       cacheKey:'',
       cacheCellDom:{},
       //规则列表
-      excelRuleList:[]
+      excelRuleList:[],
+      
+      isColChange: false,//列变化存储
     };
   },
   watch:{
@@ -881,6 +883,8 @@ export default {
       this.getChartList()
       
       type==='refresh' && this.$message.success(this.$t('OnlineExcelPage.table_data_update_msg') )
+
+      this.isColChange = false;
     },
 
     // 新增子表
@@ -948,7 +952,8 @@ export default {
         ExcelImage:'',
         Source: 5,
         ParentId:Number(this.$route.query.id),
-        TableData: this.getSaveParams()
+        TableData: this.getSaveParams(),
+        IsColChange: this.isColChange
       }
       const res = await sheetInterface.sheetEdit(params)
       if(res.Ret !==200) return false
@@ -1676,6 +1681,7 @@ export default {
         if(!(index < this.config.data[0].length)){
           resetStyle()
         }
+        this.isColChange = true;
       } else if (cindex === '-1') { //删除行
         console.log('删除行', rindex)
 
@@ -1785,7 +1791,7 @@ export default {
           }:null
         })
       })
-
+      this.isColChange = true;
     },
 
     /* 插入行 */
@@ -2404,6 +2410,8 @@ export default {
         this.selectCell && this.unmergeCellFun(this.selectCell)
       }
       this.hasMergedCell=false
+      this.isColChange = true;
+      
       // 取消合并后,调整选区(有的话)
       if((this.mergeSelectionStart.row || this.mergeSelectionStart.row==0) 
       && (this.mergeSelectionEnd.row || this.mergeSelectionEnd.row==0)

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

@@ -436,7 +436,9 @@ export default {
       cacheKey:'',
       cacheCellDom:{},
       //规则列表
-      excelRuleList:[]
+      excelRuleList:[],
+
+      isColChange: false,//列变化存储
     };
   },
   mounted() {
@@ -1128,6 +1130,8 @@ export default {
         if(!(index < this.config.data[0].length)){
           resetStyle()
         }
+
+        this.isColChange = true;
       }else if(cindex === '-1') { //删除行
         console.log('删除行',rindex)
 
@@ -1236,6 +1240,8 @@ export default {
           }:null
         })
       })
+
+      this.isColChange = true;
     },
 
     /* 插入行 */
@@ -1854,6 +1860,8 @@ export default {
         this.selectCell && this.unmergeCellFun(this.selectCell)
       }
       this.hasMergedCell=false
+      this.isColChange = true;
+      
       // 取消合并后,调整选区(有的话)
       if((this.selectionStart.row || this.selectionStart.row==0) 
       && (this.selectionEnd.row || this.selectionEnd.row==0)

+ 70 - 5
src/views/datasheet_manage/components/toolBarSection.vue

@@ -18,6 +18,7 @@
         </div>
 
         <template v-if="tool.type==='select'">
+          <!-- 单元格类型 -->
           <el-select 
             v-model="option.nt" 
             style="width: 90px" 
@@ -33,6 +34,24 @@
             >
             </el-option>
           </el-select>
+
+          <!-- 字号 -->
+          <el-select 
+            v-model="option.fontSize" 
+            style="width: 90px" 
+            size="small" 
+            :placeholder="tool.title"
+            v-else-if="tool.key==='font-size'"
+            @change="changeFontSize"
+          >
+            <el-option
+              v-for="item in sizeOptions"
+              :key="item.val"
+              :value="item.val"
+              :label="item.label"
+            >
+            </el-option>
+          </el-select>
         </template>
           
         <template v-if="tool.type==='color'">
@@ -78,7 +97,7 @@ export default {
     */
     tools:{
       type:'String',
-      default:'cell-point-type,cell-merge,font-color,condition-format,cell-decimal,cell-align',
+      default:'cell-point-type,cell-merge,font-color,condition-format,cell-decimal,cell-align,font-size',
     },
     // 回显参数
     echoParameter:{
@@ -93,9 +112,11 @@ export default {
         handler(nval) {
         if(nval) {
           console.log(nval)
-          this.cellArray = Array.isArray(nval)?nval:[nval]
-          this.option = this.cellArray.length&&this.cellArray[0].ShowStyle?{
-            ...JSON.parse(this.cellArray[0].ShowStyle)
+          this.cellArray = Array.isArray(nval)?nval:[nval];
+          let styleObj = JSON.parse(this.cellArray[0].ShowStyle);
+          this.option = this.cellArray.length&&styleObj?{
+            ...styleObj,
+            fontSize: styleObj["font-size"]
           }:{
             nt: "",//numberType
             pn: 0,//ponitNum
@@ -117,7 +138,8 @@ export default {
       option: {
         nt: "",//numberType  number percent
         pn: 0,//ponitNum
-        decimal:undefined
+        decimal:undefined,
+        fontSize:''
       },
       cellArray:[],
       colorObject:{
@@ -140,6 +162,31 @@ export default {
         'hsla(209, 100%, 56%, 0.73)',
         '#c7158577'
       ],
+
+      sizeOptions: [
+        { label:'5px',val:'5' },
+        { label:'6px',val:'6' },
+        { label:'7px',val:'7' },
+        { label:'8px',val:'8' },
+        { label:'9px',val:'9' },
+        { label:'10px',val:'10' },
+        { label:'11px',val:'11' },
+        { label:'12px',val:'12' },
+        { label:'13px',val:'13' },
+        { label:'14px',val:'14' },
+        { label:'15px',val:'15' },
+        { label:'16px',val:'16' },
+        { label:'17px',val:'17' },
+        { label:'18px',val:'18' },
+        { label:'19px',val:'19' },
+        { label:'20px',val:'20' },
+        { label:'22px',val:'22' },
+        { label:'24px',val:'24' },
+        { label:'28px',val:'28' },
+        { label:'32px',val:'32' },
+        { label:'36px',val:'36' },
+        { label:'40px',val:'40' },
+      ],
     };
   },
   computed:{
@@ -205,6 +252,13 @@ export default {
           title:this.echoParameter.hasMergedCell?this.$t('ETable.Btn.unmerge'):this.$t('ETable.Btn.merge_cell'),
           tool:'cell-merge'
         },
+        {
+          icon: '',
+          key:'font-size',
+          type:"select",
+          title: '字号' ,
+          tool:'font-size'
+        },
         { 
           icon: `<svg width="23" height="23" viewBox="0 0 20 20"  xmlns="http://www.w3.org/2000/svg">
             <path d="M8.875 1.25H11.125L16.25 13.75H14.125L12.875 10.5H7.125L5.875 13.75H3.75L8.875 1.25ZM7.75 9H12.25L10 3.375H9.875L7.75 9Z" fill="#333333"/>
@@ -374,6 +428,17 @@ export default {
         }
       })
     },
+
+    changeFontSize(val) {
+      this.cellArray.forEach(item =>{
+        if(!item.merData || item.merData.type=='merge'){
+          let newStyle = { 'font-size': val }
+          let showSytle = item.ShowStyle?JSON.parse(item.ShowStyle):{};
+          item.ShowStyle = JSON.stringify({...showSytle,...newStyle})
+        }
+      })
+    },
+    
     /* 处理单个单元格 */
     chooseCellColor(type,color,cell) {
       let colorObj=type==='font'?{'color':`${color}`}:{'background-color':`${color}`}

+ 7 - 2
src/views/datasheet_manage/mixedSheetEdit.vue

@@ -232,7 +232,8 @@ export default {
         ExcelImage:'',
         Source: 3,
         TableData: this.$refs.mixedTableRef.getSaveParams(),
-        SourcesFrom:this.sheetForm.SourcesFrom
+        SourcesFrom:this.sheetForm.SourcesFrom,
+        IsColChange: this.$refs.mixedTableRef.isColChange,
       };
       console.log("自动保存");
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
@@ -281,7 +282,11 @@ export default {
 
       let isAdd = this.sheetId?false:true
       const res = this.sheetId
-      ? await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
+      ? await sheetInterface.sheetEdit({ 
+          ExcelInfoId: Number(this.sheetId),
+          IsColChange: this.$refs.mixedTableRef.isColChange,
+          ...params 
+        })
       : await sheetInterface.sheetAdd(params)
 
       if(res.Ret !==200) return

+ 1 - 0
src/views/datasheet_manage/mixins/conditionTableMixin.js

@@ -647,6 +647,7 @@ export default {
                 'text-align': styleCss.align ? styleCss.align : 'center',
                 'width': styleCss.width ? styleCss.width + 'px' : '140px',
                 'height': styleCss.height ? styleCss.height + 'px' : '35px',
+                'font-size': styleCss["font-size"] ? styleCss["font-size"] + 'px' : '14px',
             }
             if (type == 'header') {
                 obj = {

+ 2 - 2
src/views/ppt_manage/mixins/pptEditorMixins.js

@@ -342,7 +342,7 @@ export default{
       let pages = []
       list.forEach(page=>{
         page.id = createRandomCode()
-        page.elements = checkPPTpageElemant(page)
+        page.elements = checkPPTpageElemant(page,'insert')
         page.titleDetail = this.titleSetting?this.titleSetting:null
         pages.push(page)
       })
@@ -581,7 +581,7 @@ export default{
       const arr = _.cloneDeep(this.savePagesArr)
       arr.forEach(page=>{
         page.id = createRandomCode()
-        page.elements = checkPPTpageElemant(page)
+        page.elements = checkPPTpageElemant(page,'paste')
         pages.push(page)
       })
       const coefficient = type.includes('Before')?0:1

+ 41 - 4
src/views/ppt_manage/mixins/pptMixins.js

@@ -286,7 +286,8 @@ export default {
             CoverContent,
             TitleSetting:legalTitleSetting,
             AdminId,
-            ReportSource
+            ReportSource,
+            pptId: res.Data.PptId
         }
       }else{
         this.result = {status:'',content:'获取ppt数据失败!'}
@@ -707,17 +708,38 @@ export default {
       
     },
     async getsheetData(id){
+      let Uuid = '';
+      let FromScene = ['/pptlist','/ppteditor','/pptpublish','/pptpresent'].includes(this.$route.path) ? 4 : 5;
+      let SheetDomID = '';
+
+      if(this.result.content) {
+        let sheetList = this.result.content.flatMap(_ => {
+          return _.elements.filter(_ =>_.type==='sheet'&&_.uid);
+        });
+        console.log(sheetList)
+        Uuid = sheetList.find(_ => _.sheetId===id)
+          ? sheetList.find(_ => _.sheetId===id).uid 
+          : '';
+
+        SheetDomID = this.getSheetDomId(id);
+      }
+
       const res = await sheetInterface.getSheetData({
-				UniqueCode: id
+				UniqueCode: id,
+        ReferencedId: Number(this.result.pptId),
+        FromScene,
+        Uuid
 			})
       if(res.Ret !== 200) return 0
-      const {TableInfo,SourcesFrom,ExcelSource} = res.Data
+      const {TableInfo,SourcesFrom,ExcelSource,ReferencedExcelConfig} = res.Data
       //console.log('get')
       this.sheetDataMap[id] ={
         list:_.cloneDeep(TableInfo.TableDataList),
         otherParams:{
           SourcesFrom:SourcesFrom?SourcesFrom:
-                      ExcelSource?this.setDefaultSource(ExcelSource):''
+                      ExcelSource?this.setDefaultSource(ExcelSource):'',
+          ReferencedExcelConfig,
+          SheetDomID
         }
       }
       return 1
@@ -1294,6 +1316,21 @@ export default {
           color,
         })
       }
+    },
+
+     /* 拼接sheet domid存起来 sheet_${pageIndex}_${position}*/
+    getSheetDomId(id) {
+      let name = ''
+      for(let i in this.result.content) {
+        for(let element of this.result.content[i].elements) {
+          if(element.sheetId===id) {
+            name = `sheet_${i}_${element.position}`;
+            break;
+          }
+        }
+        if(name) break;
+      }
+      return name;
     }
   },
   mounted(){

+ 218 - 0
src/views/ppt_manage/mixins/sheetResizeMixins.js

@@ -0,0 +1,218 @@
+/* 表格可拖拽行列 */
+import * as sheetInterface from "@/api/modules/sheetApi.js";
+const minThresholdColWid = 20,
+    minThresholdColH = 30,
+    moveToDistance=5;
+export default {
+  data() {
+    return {
+        columnsWArr: [],
+        rowsHArr: [],
+        dragging: false,
+        dragState: {},
+        dragStateHeight: {} 
+    }
+  },
+
+  computed: {
+    isCanDragSheetWid() {
+      let authRoutes = ['/ppteditor','/ppteneditor'];
+      return authRoutes.includes(this.$route.path) && this.item.uid
+    }
+  },
+
+  methods: {
+    handleMouseMove: _.throttle(function(e,rIndex,cIndex) {
+  
+      // if(rIndex!==0 && cIndex!==0) return
+  
+      let target = e.target
+      if (!this.dragging) {
+          let rect = target.getBoundingClientRect();
+          
+          if (rect.width > 10 && rect.right - e.pageX < moveToDistance /* && rIndex===0 */) {
+              e.target.style.cursor = 'col-resize'
+          }else if (rect.height > 10 && rect.bottom - e.pageY < moveToDistance /* && cIndex===0 */) {
+              e.target.style.cursor = 'row-resize'
+          } else if (!this.dragging) {
+              e.target.style.cursor = ''
+          }
+      }
+    },20),
+  
+  
+    handleMouseDown: _.throttle(function(e,rIndex,cIndex) {
+  
+      document.onselectstart = function() { return false; };//解决拖动会选中文字的问题
+  
+      if(e.button!=0){
+        return
+      }
+  
+      let rect = e.target.getBoundingClientRect();
+  
+      if (rect.width > 10 && rect.right - e.pageX < moveToDistance /* && rIndex===0 */) {
+        // 开始拖拽
+        // 当前拖拽的列所在的表格
+        // 当前所在列(单元格)
+        let thEL = e.target
+        this.dragging = true
+  
+        thEL.classList.add('noclick')
+        this.dragState = {
+            startMouseLeft: e.clientX, // 鼠标开始的地方
+            columnWidth: rect.width, // th开始拖拽的宽度
+        }
+  
+        document.onselectstart = function () {
+            return false
+        }
+        document.ondragstart = function () {
+            return false
+        }
+  
+        const endResize = (event) => {
+          if(this.dragging){
+              // 拖拽完毕
+            const { startMouseLeft, columnWidth } = this.dragState;
+            const columnWidthDiff = event.clientX - startMouseLeft;
+            let newWid = Math.max(minThresholdColWid,columnWidthDiff + columnWidth);
+            this.$set(this.columnsWArr,cIndex,newWid)
+  
+            e.target.style.width = this.columnsWArr[cIndex]
+  
+            let widthTotal=0
+            this.columnsWArr.forEach((item)=>{
+              widthTotal+=item
+            })
+            // console.log(widthTotal)
+            //多出来的宽度
+            let otherWidth=this.$refs.tableRef.offsetWidth-widthTotal;
+  
+            this.columnsWArr.forEach((item,colIndex)=>{
+              if(colIndex!=cIndex){
+                // this.columnsWArr[colIndex]= Number(parseFloat(item + otherWidth/this.columnsWArr.length-1).toFixed(2))
+                let colWid= Number(parseFloat(item + otherWidth/this.columnsWArr.length-1).toFixed(2))
+                this.$set(this.columnsWArr,colIndex,colWid)
+              }
+            })
+  
+            setTimeout(()=>{
+              this.initTableCellsWid('change')
+            },500)
+  
+            // event.target.style.cursor = ''
+  
+            this.dragging = false
+            this.dragState = {}
+          }
+          document.removeEventListener('mouseup', endResize);
+          document.onselectstart = null
+          document.ondragstart = null
+          thEL.classList.remove('noclick')
+        }
+  
+        document.addEventListener('mouseup', endResize);
+      }
+  
+  
+      if (rect.height > 10 && rect.bottom - e.pageY < moveToDistance /* && cIndex===0 */) {
+        let thEL = e.target
+        this.dragging = true
+  
+        thEL.classList.add('noclick')
+        this.dragStateHeight = {
+            startMouseTop: e.clientY,
+            columnHeight: rect.height, 
+        }
+        document.onselectstart = function () {
+            return false
+        }
+        document.ondragstart = function () {
+            return false
+        }
+    
+        const endResize = (event) => {
+          if(this.dragging){
+            // 拖拽完毕
+            const { startMouseTop, columnHeight } = this.dragStateHeight;
+            const columnHeightDiff = event.clientY - startMouseTop;
+            let newH = Math.max(minThresholdColH,columnHeightDiff + columnHeight);
+            this.$set(this.rowsHArr,rIndex,newH)
+  
+            setTimeout(()=>{
+              this.initTableCellsWid('change')
+            },500)
+  
+            event.target.style.cursor = ''
+            this.dragging = false
+            this.dragStateHeight = {}
+          }
+          document.removeEventListener('mouseup', endResize);
+          document.onselectstart = null
+          document.ondragstart = null
+          setTimeout(function () {
+              thEL.classList.remove('noclick')
+          }, 0)
+        }
+          document.addEventListener('mouseup', endResize);
+      }
+    },20),
+  
+  
+    initTableCellsWid(type='init') {
+      if(type=='init'){
+        this.$nextTick(()=>{
+          if(this.sheetSceneConfig && this.sheetSceneConfig.WidthList && this.sheetSceneConfig.HeightList) {
+            this.columnsWArr = this.sheetSceneConfig.WidthList.split(',').map(_ =>Number(_));
+            this.rowsHArr = this.sheetSceneConfig.HeightList.split(',').map(_ =>Number(_));
+            return
+          }
+
+          const table = this.$refs.tableRef;
+          if (table&&table.rows&&table.rows.length) {
+            const rows=table.rows;
+            const cells = table.rows[0].cells;
+            let widthArr= Array.from(cells).map(cell => cell.offsetWidth);
+            console.log(widthArr)
+    
+            let heightArr=Array.from(rows).map(row => row.offsetHeight);
+            console.log(heightArr)
+          
+            this.columnsWArr=widthArr
+            this.rowsHArr=heightArr
+    
+          }
+        })
+      }else if(type === 'change') {
+        this.changeTableCellWidSave();
+      }
+    },
+  
+    getSize(index,type) {
+      if(type==='width'){
+        return this.columnsWArr[index]?`${this.columnsWArr[index]}px`:''
+      }else{
+        return this.rowsHArr[index]?`${this.rowsHArr[index]}px`:'20px'
+      }
+    },
+
+    /* 保存行高配置 */
+    async changeTableCellWidSave(){
+      if((!this.$route.query.id) || !this.item.uid) return
+
+      let ReferencedId =  Number(this.$route.query.id || '')
+      let FromScene = this.$route.path === '/ppteditor' ? 4 : 5;
+      let parmas = {
+        UniqueCode: this.item.sheetId,
+        ReferencedId,
+        FromScene,
+        Uuid: this.item.uid,
+        WidthList: this.columnsWArr.join(','),
+        HeightList: this.rowsHArr.join(',')
+      }
+      // console.log(parmas)
+      await sheetInterface.sheetUseSceneSaveWid(parmas);
+    },
+  }
+}

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

@@ -369,6 +369,7 @@ export default {
           InheritPptId: 0,
           CollaborateUserIds: this.pptInfo.cooperationUsers.map(_ => _.NodeId),
           Abstract,
+          MergePptIdList: this.choosedIdArr
         })
       
       if(res.Ret===200){

+ 13 - 4
src/views/ppt_manage/newVersion/components/formatEl/SheetEl.vue

@@ -6,9 +6,9 @@
     :id="`${$parent.isPreview?'preview_':''}sheet_${index}_${position}`"
     style="overflow:hidden"
   >
-    <table :key="tableKey" :style="`font-size:${$parent.$parent.pptSheetSize}px`" cellpadding="0" cellspacing="0">
+    <table :key="tableKey" :style="`font-size:${$parent.$parent.pptSheetSize}px`" cellpadding="0" cellspacing="0" ref="tableRef">
       <tbody>
-        <tr v-for="(row,rowIndex) in tableData" :key="rowIndex">
+        <tr v-for="(row,rowIndex) in tableData" :key="rowIndex" :style="`height:${getSize(rowIndex,'height')}`">
           <td v-for="(col,colIndex) in row" 
               :key="colIndex"
               :rowspan="col.mc.rs===0?1:col.mc.rs"
@@ -19,7 +19,11 @@
                 font-style: ${col.it ? 'italic' : 'normal'};
                 background: ${col.bg||'transparent'};
                 text-align: ${HtObj[col.HorizontalType]};
+                font-size: ${col.fs||$parent.$parent.pptSheetSize}px;
+                width:${rowIndex===0?getSize(colIndex,'width'):'auto'}
               `"
+              @mousemove="e =>isCanDragSheetWid && handleMouseMove(e,rowIndex,colIndex)"
+              @mousedown="e =>isCanDragSheetWid && handleMouseDown(e,rowIndex,colIndex)"
           >
             <!-- 单元格拆分 -->
             <div class="split-word" v-if="col.ct.s">
@@ -68,8 +72,9 @@
 
 <script>
 import mixin from "./formatEl";
+import sheetResizeMixin from '../../../mixins/sheetResizeMixins'
 export default {
-  mixins:[mixin],
+  mixins:[mixin,sheetResizeMixin],
   props:{
     item:{
       type:Object
@@ -85,7 +90,8 @@ export default {
       tableData:[],
       type:'sheet',
       tableKey:0,
-      sheetSourceFrom:{}
+      sheetSourceFrom:{},
+      sheetSceneConfig:null,
     };
   },
   methods:{
@@ -94,6 +100,9 @@ export default {
       if(value){
         this.tableData = value.list
         this.sheetSourceFrom=(value.otherParams && value.otherParams.SourcesFrom) ? JSON.parse(value.otherParams.SourcesFrom):''
+        this.sheetSceneConfig = (value.otherParams&&value.otherParams.ReferencedExcelConfig) ? value.otherParams.ReferencedExcelConfig : null;
+
+        this.initTableCellsWid('init')
       }
 
     }

+ 21 - 1
src/views/ppt_manage/newVersion/pptEditor.vue

@@ -1171,7 +1171,8 @@ export default {
         temp={
           type:'sheet',
           position:positions[0],
-          sheetId:UniqueCode
+          sheetId:UniqueCode,
+          uid: UniqueCode+new Date().getTime(),//表格插入时在ppt中的唯一id 用来保存表格调整的行列宽
         }
       }
       el.push(temp);
@@ -1236,6 +1237,19 @@ export default {
       }
     },
     async addPPT(FirstPage,Content){
+      let sheetList = this.pageList.flatMap(_ => {
+        return _.elements.filter(_ =>_.type==='sheet'&&_.uid);
+      });
+      //关联表格和唯一id
+      let ExcelReferences = sheetList.length
+        ? sheetList.map(_ => ({
+            UniqueCode: _.sheetId,
+            ReferencedId: 0,
+            FromScene:4,
+            Uuid: _.uid
+          }))
+        : []
+
       await pptInterface.addppt({
         FirstPage:FirstPage,
         Content:Content,
@@ -1244,6 +1258,7 @@ export default {
         TitleSetting:JSON.stringify(this.titleSetting),
         Abstract:this.baseInfo.Abstract || '',
         CollaborateUsers:this.baseInfo.CollaborateUsers || '',
+        ExcelReferences
       }).then(res=>{
         this.isSaved = false
         if(res.Ret===200){
@@ -1251,6 +1266,11 @@ export default {
           this.isSave = true
           this.pptId = res.Data.PptId
           sessionStorage.removeItem('selectedCatalog')
+
+           //添加后跳转下,保证表格的sourceid存在
+					!this.$route.query.id && this.$router.replace({ path: `/ppteditor`,query: {
+						id: this.pptId
+					} });
           //开启自动保存
           this.autoSave()
         }

+ 12 - 5
src/views/ppt_manage/newVersion/pptPublish.vue

@@ -70,7 +70,7 @@
 import Cover from './components/Cover.vue';
 import CustomCover from './components/CustomCover.vue';
 import TransReport from './components/catalog/transReport.vue';
-import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,svgData2Base64,getImgRealSize,calcScale,countStrSize,getShapeOptions,createRandomCode,getTableData,getChartInfo,pptInit,rgbaToHex } from './utils/untils';
+import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,svgData2Base64,getImgRealSize,calcScale,countStrSize,getShapeOptions,createRandomCode,getTableData,getChartInfo,pptInit,rgbaToHex,transSheetColWid } from './utils/untils';
 import {marginTop,modelConfig,pptSlideMaster} from './utils/config';
 import pptmixin from '../mixins/pptMixins';
 import mixins from '../mixins/mixins';
@@ -344,7 +344,7 @@ export default {
           }else if (elements[j].type==='sheet'){
             console.log('table...')
             const sheetId = elements[j].sheetId
-            sheetData.list = getTableData(this.sheetDataMap[sheetId].list)
+            sheetData.list = getTableData(this.sheetDataMap[sheetId].list,this.pptSheetSize)
             sheetData.otherParams = this.sheetDataMap[sheetId].otherParams
           }
           const { x, y, width, height } = this.getPosition(
@@ -391,9 +391,16 @@ export default {
               size:{type:"contain"}
             })
           }else if(sheetData.list){
-            slide.addTable(sheetData.list,{
-              x:x,y:y,w:width,h:height,border:{type:'solid',pt:1},fontSize:this.pptSheetSize
-            })
+            let sheetOptions = {
+              x,y,w:width,h:height,border:{type:'solid',pt:1},fontSize:this.pptSheetSize
+            }
+
+            sheetOptions = {
+              ...sheetOptions,
+              colW: transSheetColWid(sheetData.otherParams.SheetDomID,width)
+            }
+
+            slide.addTable(sheetData.list,sheetOptions)
             //追加生成表格底部文字
             this.transBottomInfo(slide,{x,y,width,height},sheetData.otherParams)
           } 

+ 43 - 5
src/views/ppt_manage/newVersion/utils/untils.js

@@ -635,7 +635,7 @@ export const getShapeOptions = (el,position,scale)=>{
   return options
 }
 //转换table的数据格式,写入ppt
-export const getTableData = (data)=>{
+export const getTableData = (data,fontSize=10)=>{
   //data:[{m:'表格数据',mc:{rs:2,cs:1}}] -> [{text:'表格数据',options:{rowspan:2,colspan:1}}]
   const tableData = []
   let alignMap = {
@@ -664,7 +664,8 @@ export const getTableData = (data)=>{
         bold: cell.bl ? true : false,
         italic: cell.it ? true : false,
         align: alignMap[cell.HorizontalType] || alignMap[cell.ht] || 'center',
-        valign: 'center'
+        valign: 'center',
+        fontSize: cell.fs || fontSize
       }
         _row.push({
           text:cell.m,
@@ -684,12 +685,18 @@ export const formatPPTDate = (lang,date)=>{
   return str
 }
 
-//检查pptPage.elements的格式,返回所有合法的elements
-export const checkPPTpageElemant = (page) =>{
+//检查pptPage.elements的格式,返回所有合法的elements  插入粘贴页将表格的唯一uid重新生成
+export const checkPPTpageElemant = (page,type='') =>{
   const {elements} = page
   let legalElements = []
   elements.forEach(el=>{
-    checkAttribute(el)&&legalElements.push(el)
+    let newModelInfo = (['paste','insert'].includes(type) && el.type==='sheet')
+      ? {
+          ...el,
+          uid: `${type}${el.sheetId}${new Date().getTime()}`
+        }
+      : el
+    checkAttribute(el)&&legalElements.push(newModelInfo)
   })
   return legalElements
 }
@@ -762,3 +769,34 @@ export const getPlainText = (richText='')=>{
     let plainText = tempDiv.textContent || tempDiv.innerText || "";
     return plainText.trim(); // 使用trim()移除可能的前后空格
 }
+
+
+/* 把表格的列宽px转成写入ppt的colw的int  占宽100%按10算 */
+/* 下载时取dom手动算一下列宽比例 */
+export function transSheetColWid(domId='',w) {
+  let dec = Number(w.replace(/%/g,''))
+  const totalW = 10*dec/100;
+  console.log(totalW)
+
+
+  let colsIntArr = [];
+  let tableDom = document.querySelector(`#${domId} table`);
+  // console.log(tableDom)
+  if(tableDom) {
+    let tableWid = tableDom.offsetWidth;
+
+    let maxColRow = Array.from(tableDom.rows).reduce((a,b) => {
+      return b.cells.length>a.cells.length ? b : a;
+    })
+    // console.log(maxColRow)
+    let widthArr= Array.from(maxColRow.cells).map(cell => cell.offsetWidth);
+    colsIntArr = widthArr.map(_ => parseFloat(((_/tableWid)*totalW).toFixed(2)));
+  }
+  // else {
+  //   const totalPxW = colsWArr.reduce((a,b) => a+b);
+  //   colsIntArr = colsWArr.map(_ => parseFloat(((_/totalPxW)*totalW).toFixed(2)));
+  // }
+  console.log(colsIntArr)
+  return colsIntArr;
+
+}

+ 2 - 2
src/views/report_manage/reportV2/normalReport/editReport.vue

@@ -200,13 +200,13 @@ export default {
 			}, 6000);
 		}
 
-		window.addEventListener('message',this.reInitIframe)
+		window.addEventListener('message',this.getIframeMessage)
 	},
 	updated() {
 		this.setFroalaFontSize(16);
 	},
 	destroyed() {
-		window.removeEventListener('message',this.reInitIframe)
+		window.removeEventListener('message',this.getIframeMessage)
 		if (this.timer) {
 			clearInterval(this.timer);
 		}

+ 34 - 5
src/views/report_manage/reportV2/normalReport/mixins/reportMixin.js

@@ -332,14 +332,17 @@ export default {
     insertSheet(item) {
       const LINK_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/sheetshow';
 
+      let sourceId = this.$route.query.id||'';//报告id
+      let uid = item.UniqueCode+new Date().getTime(); //唯一id
+
       this.$nextTick(() => {
         this.editor.html.insert(
           `<p style='text-align:left; margin-top:10px;'>
             <span style='font-size:17px;padding-left:10px;'>${item.ExcelName}</span>
             <iframe 
-              src='${LINK_URL}?code=${item.UniqueCode}&fromScene=2' 
+              src='${LINK_URL}?code=${item.UniqueCode}&fromScene=2&sourceId=${sourceId}&uid=${uid}' 
               width='100%' 
-              class='iframe${item.UniqueCode}' 
+              class='iframe${uid||item.UniqueCode}' 
               style='border-width:0px;'
               />
               </p>`
@@ -347,13 +350,39 @@ export default {
       });
     },
 
+    /* 接受iframe post过来的参数 */
+    getIframeMessage(e) {
+      if(e.data.type&&e.data.type==='changeCol') { //改变行列宽
+        this.handleSaveIframeSheetWid(e)
+      }else { //init高度
+        this.reInitIframe(e)
+      }
+    },
+
+    /* 保存表格行列宽 */
+    async handleSaveIframeSheetWid(e) {
+      const { code,columnsWArr,rowsHArr,uid } = e.data;
+      let parmas = {
+        UniqueCode: code,
+        ReferencedId: Number(this.$route.query.id),
+        FromScene: 2,
+        Uuid: uid,
+        WidthList: columnsWArr.join(','),
+        HeightList: rowsHArr.join(',')
+      }
+      // console.log(parmas)
+
+      await sheetInterface.sheetUseSceneSaveWid(parmas);
+    },
+
     /* 适配iframe高度 */
     reInitIframe(e) {
-      const { height, code } = e.data;
-      let iframeDom = document.getElementsByClassName(`iframe${code}`);
+      const { height, code, uid } = e.data;
+      let iframeDom = document.getElementsByClassName(`iframe${uid||code}`);
       iframeDom.forEach((ele) => {
-        ele.height = `${height}px`;
+        ele.height = `${height+2}px`;
       });
+      this.ischange = true;
     },
 
     //批量插入我的图表

+ 1 - 1
src/views/report_manage/reportV2/smartReport/components/SheetComp.vue

@@ -35,7 +35,7 @@ export default {
                 // console.log(this.compData.content);
                 let params = GetQueryString(this.compData.content)
                 // console.log(params);
-                return `iframe${params.code}`
+                return `iframe${params.uid?params.uid:params.code}`
             }
             return ''
         },

+ 58 - 14
src/views/report_manage/reportV2/smartReport/editReport.vue

@@ -555,9 +555,10 @@ export default {
                         child: _.child.map(subCom => {
                             if(subCom.compId===4) {
                                 let params = GetQueryString(subCom.content);
-                                let titleText = ($(`.title_iframe${params.code}`)
-                                &&$(`.title_iframe${params.code}`)[0])
-                                    ?$(`.title_iframe${params.code}`)[0].innerText
+                                let codeSuffix = params.uid?params.uid:params.code;
+                                let titleText = ($(`.title_iframe${codeSuffix}`)
+                                &&$(`.title_iframe${codeSuffix}`)[0])
+                                    ?$(`.title_iframe${codeSuffix}`)[0].innerText
                                     :'';
                                     
                                 return {
@@ -572,9 +573,10 @@ export default {
                 }else { //一行单个
                     if(_.compId===4) {
                         let params = GetQueryString(_.content);
-                        let titleText = ($(`.title_iframe${params.code}`)
-                        &&$(`.title_iframe${params.code}`)[0])
-                            ?$(`.title_iframe${params.code}`)[0].innerText
+                        let codeSuffix = params.uid?params.uid:params.code;
+                        let titleText = ($(`.title_iframe${codeSuffix}`)
+                        &&$(`.title_iframe${codeSuffix}`)[0])
+                            ?$(`.title_iframe${codeSuffix}`)[0].innerText
                             :'';
                             
                         return {
@@ -761,15 +763,40 @@ export default {
             
         },
 
+        /* 接受iframe post过来的参数 */
+        getIframeMessage(e) {
+            if(e.data.type&&e.data.type==='changeCol') { //改变行列宽
+                this.handleSaveIframeSheetWid(e)
+            }else { //init高度
+                this.setSheetIframeStyle(e)
+            }
+        },
+
+        /* 保存表格行列宽 */
+        async handleSaveIframeSheetWid(e) {
+            const { code,columnsWArr,rowsHArr,uid } = e.data;
+            let parmas = {
+                UniqueCode: code,
+                ReferencedId: Number(this.$route.query.id),
+                FromScene: 2,
+                Uuid: uid,
+                WidthList: columnsWArr.join(','),
+                HeightList: rowsHArr.join(',')
+            }
+            // console.log(parmas)
+            await sheetInterface.sheetUseSceneSaveWid(parmas);
+        },
+
         // 设置sheet iframe 样式
         setSheetIframeStyle(e){
-            const { height, code } = e.data;
+            const { height, code,uid } = e.data;
             // console.log(e.data);
-            let iframeDom = document.getElementsByClassName(`iframe${code}`);
+            let iframeDom = document.getElementsByClassName(`iframe${uid||code}`);
             // console.log(iframeDom);
             iframeDom.forEach((ele) => {
-                ele.height = `${height}px`;
+                ele.height = `${height+2}px`;
             });
+            this.contentChange = true;
         },
 
         async handleParentAdd(e){
@@ -790,11 +817,14 @@ export default {
 
             // 要添加的元素数据
             const compData=JSON.parse(item.getAttribute('comp-data'))
+
+            //可拖拽表格需药后缀
+            let content = compData.compType==='sheet' ? this.getLinkSuffixParams(compData) : (compData.content||'')
             const tempCompData={
                 compId:compData.compId,
                 compType:compData.compType,
                 id:this.getCompId(compData.compType),
-                content:compData.content||'',
+                content,
                 titleText: compData.compId===4?compData.title:'',
                 style:compData.compType==='chart'?'height:350px':'',
                 child:[]
@@ -838,6 +868,9 @@ export default {
 
                 if(obj.child&&obj.child.length===1&&obj.id){
                     if(compData){
+                        //可拖拽表格需药后缀
+                        let content = compData.compType==='sheet' ? this.getLinkSuffixParams(compData) : (compData.content||'')
+
                         obj={
                             child:[
                                 {
@@ -852,7 +885,7 @@ export default {
                                 {
                                     compId:compData.compId,
                                     compType:compData.compType,
-                                    content:compData.content||'',
+                                    content,
                                     id:this.getCompId(compData.compType),
                                     titleText: compData.compId===4?compData.title:'',
                                     style:compData.compType==='chart'?'height:350px':'',
@@ -892,10 +925,12 @@ export default {
                     
                 }else{
                     if(compData){//如果是从内容区域拖入的没有compData
+                        let content = compData.compType==='sheet' ? this.getLinkSuffixParams(compData) : (compData.content||'')
+
                         obj.child.splice(newDraggableIndex,1,{
                             compId:compData.compId,
                             compType:compData.compType,
-                            content:compData.content||'',
+                            content,
                             id:this.getCompId(compData.compType),
                             titleText: compData.compId===4?compData.title:'',
                             style:compData.compType==='chart'?'height:350px':'',
@@ -913,6 +948,15 @@ export default {
             
         },
 
+        /* 表格要拖拽拼接额外参数 */
+        getLinkSuffixParams(compData) {
+            let linkParams  = GetQueryString(compData.content);
+            let sourceId = this.$route.query.id||'';//报告id
+            let uid = linkParams.code+new Date().getTime(); //唯一id
+            
+            return `${compData.content}&sourceId=${sourceId}&uid=${uid}`
+        },
+
         // 移除事件 
         handleChildRemove(e,arr){
             console.log('child-remove操作------------------->');
@@ -1456,7 +1500,7 @@ export default {
         this.reportCoopType===1 && this.getReportDetail()
     },
     mounted () {
-        window.addEventListener('message',this.setSheetIframeStyle)
+        window.addEventListener('message',this.getIframeMessage)
         if(this.reportCoopType===1) {
             this.timer = setInterval(() => {
                 this.handleSaveContent({isAutoSave:true,IsManualSave:false});
@@ -1464,7 +1508,7 @@ export default {
         }
     },
     destroyed() {
-		window.removeEventListener('message',this.setSheetIframeStyle)
+		window.removeEventListener('message',this.getIframeMessage)
         if (this.timer) {
 			clearInterval(this.timer);
 		}