Ver Fonte

Merge branch 'master' into ETA1.9.5

jwyu há 1 ano atrás
pai
commit
fe0cd39605
62 ficheiros alterados com 1637 adições e 523 exclusões
  1. 9 0
      src/api/modules/sheetApi.js
  2. 8 4
      src/components/selectUnit.vue
  3. 4 0
      src/lang/commonLang.js
  4. 10 0
      src/lang/modules/ETATables/commonLang.js
  5. 1 1
      src/lang/modules/EtaBase/En.js
  6. 1 1
      src/lang/modules/EtaBase/Zh.js
  7. 21 1
      src/lang/modules/EtaBase/commonLang.js
  8. 8 2
      src/lang/modules/Slides/pptPresent.js
  9. 32 2
      src/lang/modules/systemManage/ChartSet.js
  10. 8 2
      src/routes/modules/dataRoutes.js
  11. 0 1
      src/views/chartRelevance_manage/crossVarietyAnalysis/list.vue
  12. 0 1
      src/views/chartRelevance_manage/fittingEquation/fittingEquationList.vue
  13. 0 7
      src/views/chartRelevance_manage/relevance/list.vue
  14. 0 1
      src/views/chartRelevance_manage/statistic/statisticFeatureList.vue
  15. 0 1
      src/views/dataEntry_manage/chartSetting.vue
  16. 3 2
      src/views/dataEntry_manage/codecount/index.vue
  17. 3 1
      src/views/dataEntry_manage/components/barOptionSection.vue
  18. 1 1
      src/views/dataEntry_manage/components/chartSourceEditDialog.vue
  19. 82 0
      src/views/dataEntry_manage/components/edbHasUsedDia.vue
  20. 25 1
      src/views/dataEntry_manage/databaseComponents/dataAssociateChart.vue
  21. 11 0
      src/views/dataEntry_manage/databaseComponents/dataAssociateComputeData.vue
  22. 1 1
      src/views/dataEntry_manage/databaseComponents/edbDetailData.vue
  23. 4 3
      src/views/dataEntry_manage/databaseComponents/fittingResidueDia.vue
  24. 85 18
      src/views/dataEntry_manage/databaseList.vue
  25. 5 5
      src/views/dataEntry_manage/mixins/addOreditMixin.js
  26. 45 31
      src/views/dataEntry_manage/mixins/chartPublic.js
  27. 22 5
      src/views/datasheet_manage/components/MixedTable.vue
  28. 12 4
      src/views/datasheet_manage/components/calculateEdbDia.vue
  29. 18 3
      src/views/datasheet_manage/components/insertDateDia.vue
  30. 12 3
      src/views/datasheet_manage/components/selectTargetValueDia.vue
  31. 81 11
      src/views/datasheet_manage/customSheetEdit.vue
  32. 76 8
      src/views/datasheet_manage/mixedSheetEdit.vue
  33. 24 2
      src/views/datasheet_manage/sheetList.vue
  34. 0 1
      src/views/futures_manage/commodityChartBase.vue
  35. 0 1
      src/views/mychart_manage/components/chartDetailDia.vue
  36. 0 1
      src/views/mychart_manage/index.vue
  37. 41 25
      src/views/ppt_manage/mixins/mixins.js
  38. 103 8
      src/views/ppt_manage/mixins/pptEditorMixins.js
  39. 63 14
      src/views/ppt_manage/mixins/pptMixins.js
  40. 17 6
      src/views/ppt_manage/newVersion/components/catalog/pptContent.vue
  41. 17 6
      src/views/ppt_manage/newVersion/components/catalog/pptContentEn.vue
  42. 132 41
      src/views/ppt_manage/newVersion/components/editor/TitleEditorTool.vue
  43. 21 2
      src/views/ppt_manage/newVersion/components/formatEl/SheetEl.vue
  44. 4 1
      src/views/ppt_manage/newVersion/components/formatPage/mixins.js
  45. 22 2
      src/views/ppt_manage/newVersion/css/common.scss
  46. 15 15
      src/views/ppt_manage/newVersion/css/format.scss
  47. 64 16
      src/views/ppt_manage/newVersion/pptEditor.vue
  48. 36 10
      src/views/ppt_manage/newVersion/pptEnEditor.vue
  49. 28 14
      src/views/ppt_manage/newVersion/pptEnPresent.vue
  50. 26 13
      src/views/ppt_manage/newVersion/pptEnPublish.vue
  51. 28 12
      src/views/ppt_manage/newVersion/pptPresent.vue
  52. 25 11
      src/views/ppt_manage/newVersion/pptPublish.vue
  53. 4 4
      src/views/ppt_manage/newVersion/utils/config.js
  54. 83 2
      src/views/ppt_manage/newVersion/utils/tinymceSetting.js
  55. 24 9
      src/views/predictEdb_manage/predictEdb.vue
  56. 21 2
      src/views/sandbox_manage/index_new_version.vue
  57. 33 16
      src/views/sandbox_manage/sandFlowNew/index.vue
  58. 0 84
      src/views/sandbox_manage/sandFlowNew/popover.vue
  59. 26 0
      src/views/system_manage/chartTheme/common/config.js
  60. 112 62
      src/views/system_manage/chartTheme/components/optionsSection.vue
  61. 2 1
      src/views/system_manage/chartTheme/index.vue
  62. 78 21
      src/views/system_manage/chartTheme/themeSetting.vue

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

@@ -280,6 +280,15 @@ export const refreshCustomSheet = params => {
 	return http.get('/datamanage/excel_info/table/refresh',params)
 	return http.get('/datamanage/excel_info/table/refresh',params)
 }
 }
 
 
+/**
+ * 表格 获取原始指标来源
+ * @param {*} params  EdbInfoId
+ * @returns  
+ */
+export const getEdbBaseSource = params => {
+	return http.get('/datamanage/excel_info/get_edb_source',params)
+}
+
 /**
 /**
  * 下载excel
  * 下载excel
  * @param {*} params ExcelInfoId authorization
  * @param {*} params ExcelInfoId authorization

+ 8 - 4
src/components/selectUnit.vue

@@ -50,10 +50,14 @@ export default {
         }
         }
     },
     },
     watch:{
     watch:{
-        value(){
-            if(this.value){
-                this.unit = this.getUnitTrans(this.value)
-            }
+        value:{
+            handler(){
+                if(this.value){
+                    console.log('value',this.value)
+                    this.unit = this.getUnitTrans(this.value)
+                }
+            },
+            immediate:true
         }
         }
     },
     },
     data() {
     data() {

+ 4 - 0
src/lang/commonLang.js

@@ -338,6 +338,10 @@ export default {
       en:'Add',
       en:'Add',
       zh:'新增'
       zh:'新增'
     },
     },
+    edit_btn:{
+      en:'Edit',
+      zh:'编辑'
+    },
     to: {
     to: {
       en: ' To ',
       en: ' To ',
       zh:'至'
       zh:'至'

+ 10 - 0
src/lang/modules/ETATables/commonLang.js

@@ -240,6 +240,16 @@ export default {
       zh: "更新时间 ",
       zh: "更新时间 ",
       en: "Updating Time",
       en: "Updating Time",
     }
     }
+  },
+  Common:{
+    data_source:{
+      zh: "数据来源",
+      en: "Source",
+    },
+    source:{
+      zh: "来源",
+      en: "Source",
+    }
   }
   }
 };
 };
 
 

+ 1 - 1
src/lang/modules/EtaBase/En.js

@@ -62,7 +62,7 @@ export default {
     origin_edb: 'Original Indicator',
     origin_edb: 'Original Indicator',
     replace: 'Replace to',
     replace: 'Replace to',
     replace_all: 'Replace all',
     replace_all: 'Replace all',
-    replace_tip: 'Tip: After the replacement, charts and calculated indicators that refer to the original indicator will be replaced by the replacement indicator.',
+    replace_tip: 'Note: After replacement, all references to the original metric in charts, tables, calculated metrics, and logic diagrams will be substituted with the replacement metric.',
     replace_success_msg: 'This replacement will last for a longer period of time, confirm the replacement?',
     replace_success_msg: 'This replacement will last for a longer period of time, confirm the replacement?',
     replace_ing_msg: 'The replacement is currently in progress, please be patient',
     replace_ing_msg: 'The replacement is currently in progress, please be patient',
     input_origin_vaild: 'Original Indicator can not be empty',
     input_origin_vaild: 'Original Indicator can not be empty',

+ 1 - 1
src/lang/modules/EtaBase/Zh.js

@@ -62,7 +62,7 @@ export default {
     origin_edb: '原指标',
     origin_edb: '原指标',
     replace: '替换为',
     replace: '替换为',
     replace_all: '全部替换',
     replace_all: '全部替换',
-    replace_tip: '提示:替换后,图表和计算指标引用到原指标的会全部由替换指标替代',
+    replace_tip: '提示:替换后,图、表、计算指标和逻辑图引用到原指标的会全部由替换指标替代',
     replace_success_msg: '本次替换将持续较长时间,是否确认替换?',
     replace_success_msg: '本次替换将持续较长时间,是否确认替换?',
     replace_ing_msg: '当前正在替换中,请耐心等待',
     replace_ing_msg: '当前正在替换中,请耐心等待',
     input_origin_vaild: '原指标不能为空',
     input_origin_vaild: '原指标不能为空',

+ 21 - 1
src/lang/modules/EtaBase/commonLang.js

@@ -48,6 +48,22 @@ export default {
     zh:'查看数据',
     zh:'查看数据',
     en:'View indicators'
     en:'View indicators'
   },
   },
+  detail_formula_btn: {
+    zh:'查看公式',
+    en:'Formula'
+  },
+  detail_related_charts_btn: {
+    zh:'关联图',
+    en:'Related Charts'
+  },
+  detail_related_metrics_btn: {
+    zh:'关联指标',
+    en:'Related Metrics'
+  },
+  detail_return_btn:{
+    zh:'返回',
+    en:'Return'
+  },
   detail_del_btn:{
   detail_del_btn:{
     zh:'删除',
     zh:'删除',
     en:'Delete'
     en:'Delete'
@@ -1213,7 +1229,11 @@ export default {
     },
     },
     del_edb_use_chart: {
     del_edb_use_chart: {
       zh: '当前指标已用作画图,不可删除',
       zh: '当前指标已用作画图,不可删除',
-      en: 'The current indicator is being used for drawing and cannot be deleted.'
+      en: 'The current metric is in use for charting and cannot be deleted.'
+    },
+    del_edb_use_table: {
+      zh: '当前指标已被表格引用,不可删除',
+      en: 'The current metric is referenced by a table and cannot be deleted.'
     },
     },
     del_menu_confirm: {
     del_menu_confirm: {
       zh: '确定删除当前目录吗?',
       zh: '确定删除当前目录吗?',

+ 8 - 2
src/lang/modules/Slides/pptPresent.js

@@ -100,7 +100,10 @@ export const presentEn = {
   title_size_width:'width',
   title_size_width:'width',
   title_size_height:'height',
   title_size_height:'height',
   title_content_settings:'Content Settings',
   title_content_settings:'Content Settings',
-  apply_to_the_entire:'Apply to the entire PPT'
+  apply_to_the_entire:'Apply to the entire PPT',
+  title_style_fontfamily:"Font Family",
+  title_style_fontsize:'Font Size',
+  title_style_color:'Font Color'
 };
 };
 
 
 /* 中文 */
 /* 中文 */
@@ -201,7 +204,10 @@ export const presentZh = {
   title_size_width:'宽度',
   title_size_width:'宽度',
   title_size_height:'高度',
   title_size_height:'高度',
   title_content_settings:'内容设置',
   title_content_settings:'内容设置',
-  apply_to_the_entire:'应用至整个PPT'
+  apply_to_the_entire:'应用至整个PPT',
+  title_style_fontfamily:"字体设置",
+  title_style_fontsize:'字号设置',
+  title_style_color:'字体颜色'
 };
 };
 
 
 /**
 /**

+ 32 - 2
src/lang/modules/systemManage/ChartSet.js

@@ -5,11 +5,13 @@
 /* 英文 */
 /* 英文 */
 export const ChartSetEn = {
 export const ChartSetEn = {
     label00:'Chart Data Source Setting',
     label00:'Chart Data Source Setting',
-    label00_hint:'Enabling the switch means data source visibility is on by default for new charts and can be toggled manually. Conversely, if disabled, it applies to new charts only, not historical ones.',
+    label00_hint:`<p>The state of "enabled" indicates that when creating a new chart or table, the data source switch is set to "on" by default, and can be manually switched on or off. The "disabled" state works in the same way. </p>
+                <p style="margin-top:10px">Note: This only applies to newly created charts and tables; it does not affect historical charts.</p>`,
     label01:'Chart Types',
     label01:'Chart Types',
     label02:'Chart Library Default Theme',
     label02:'Chart Library Default Theme',
     add_btn:'Add Custom Theme',
     add_btn:'Add Custom Theme',
     edit_btn:'Edit Custom Theme',
     edit_btn:'Edit Custom Theme',
+    rename:'Rename',
     theme_name:'Theme Name',
     theme_name:'Theme Name',
     theme_name_placeholder:'Please enter theme name',
     theme_name_placeholder:'Please enter theme name',
     alert_msg:'After deletion, all charts using this theme will adopt the ETA theme. Are you sure you want to proceed with the deletion?',
     alert_msg:'After deletion, all charts using this theme will adopt the ETA theme. Are you sure you want to proceed with the deletion?',
@@ -35,23 +37,38 @@ export const ChartSetEn = {
     config_opt08:'Font Size',
     config_opt08:'Font Size',
     config_opt09:'Alignment Method',
     config_opt09:'Alignment Method',
     config_opt10:'Background Color',
     config_opt10:'Background Color',
+    config_opt11:'数据标记',
+    config_opt12:'标记类型',
+    config_opt13:'标记大小',
+    config_opt14:'标记颜色',
+
+    square:'Square',
+    circle:'Circle',
+    // diamond-砖石 highcharts里面菱形标记的值,所以这边用diamond
+    diamond:'Rhomboid',
+    triangle:'Triangle',
+    triangle_down:'Inverted Triangle',
 
 
     unit01:'st Line',
     unit01:'st Line',
     unit02:'st Bar',
     unit02:'st Bar',
     unit03:'st Series',
     unit03:'st Series',
     config_opt05_yes:'Yes',
     config_opt05_yes:'Yes',
     config_opt05_no:'No',
     config_opt05_no:'No',
+    config_opt11_none:'无',
+    config_opt11_inside:'内置',
     set_hint:'The default theme is set successfully',
     set_hint:'The default theme is set successfully',
 };
 };
   
   
 /* 中文 */
 /* 中文 */
 export const ChartSetZh = {
 export const ChartSetZh = {
     label00:'图表的数据来源',
     label00:'图表的数据来源',
-    label00_hint:'开启状态表示新建图表时,数据来源展示开关默认开启,可手动切换,关闭状态同理,仅对新增图表生效,历史图表不处理',
+    label00_hint:`<p>开启状态表示新建图表或表格时,数据来源开关默认开启,可手动切换,关闭状态同理。</p>
+                <p style="margin-top:10px">注:仅对新增图表、表格生效,历史图表不处理。</p>`,
     label01:'图表类型',
     label01:'图表类型',
     label02:'图库默认主题',
     label02:'图库默认主题',
     add_btn:'添加自定义主题',
     add_btn:'添加自定义主题',
     edit_btn:'编辑自定义主题',
     edit_btn:'编辑自定义主题',
+    rename:'重命名',
     theme_name:'主题名称',
     theme_name:'主题名称',
     theme_name_placeholder:'请输入主题名称',
     theme_name_placeholder:'请输入主题名称',
     alert_msg:'删除后,所有采用该主题的图表,将采用ETA主题,是否确定删除?',
     alert_msg:'删除后,所有采用该主题的图表,将采用ETA主题,是否确定删除?',
@@ -77,12 +94,25 @@ export const ChartSetZh = {
     config_opt08:'字号',
     config_opt08:'字号',
     config_opt09:'对齐方式',
     config_opt09:'对齐方式',
     config_opt10:'背景色',
     config_opt10:'背景色',
+    config_opt11:'数据标记',
+    config_opt12:'标记类型',
+    config_opt13:'标记大小',
+    config_opt14:'标记颜色',
+
+    square:'正方形',
+    circle:'圆形',
+    // diamond-砖石 highcharts里面菱形标记的值,所以这边用diamond
+    diamond:'菱形',
+    triangle:'三角形',
+    triangle_down:'倒三角形',
 
 
     unit01:'条',
     unit01:'条',
     unit02:'根',
     unit02:'根',
     unit03:'系列',
     unit03:'系列',
     config_opt05_yes:'是',
     config_opt05_yes:'是',
     config_opt05_no:'否',
     config_opt05_no:'否',
+    config_opt11_none:'无',
+    config_opt11_inside:'内置',
     set_hint:'默认主题设置成功',
     set_hint:'默认主题设置成功',
 };
 };
   
   

+ 8 - 2
src/routes/modules/dataRoutes.js

@@ -310,13 +310,19 @@ export default [
         path: 'selfData',
         path: 'selfData',
         component: () => import("@/views/dataEntry_manage/thirdBase/selfDataBase.vue"),
         component: () => import("@/views/dataEntry_manage/thirdBase/selfDataBase.vue"),
         name: "自有数据",
         name: "自有数据",
-        hidden: false
+        hidden: false,
+        meta:{
+          name_en:"Proprietary Data"
+        }
       },  
       },  
       {
       {
         path: "bloomberg",
         path: "bloomberg",
         component: () => import("@/views/dataEntry_manage/thirdBase/bloombergSource.vue"),
         component: () => import("@/views/dataEntry_manage/thirdBase/bloombergSource.vue"),
         name: "Bloomberg",
         name: "Bloomberg",
-        hidden: false
+        hidden: false,
+        meta:{
+          name_en:"Bloomberg"
+        }
       },
       },
       {
       {
         path: "zczx",
         path: "zczx",

+ 0 - 1
src/views/chartRelevance_manage/crossVarietyAnalysis/list.vue

@@ -132,7 +132,6 @@
                 :span="21"
                 :span="21"
                 style="padding: 20px 0;"
                 style="padding: 20px 0;"
               >
               >
-                <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: 0;left: 0;">En</div>
                 <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                 <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                   <div class="chartWrapper" id="chartWrapper">
                   <div class="chartWrapper" id="chartWrapper">
                     <h2 class="chart-title">{{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}</h2>
                     <h2 class="chart-title">{{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}</h2>

+ 0 - 1
src/views/chartRelevance_manage/fittingEquation/fittingEquationList.vue

@@ -156,7 +156,6 @@
                 :span="21"
                 :span="21"
                 style="padding: 20px 0;"
                 style="padding: 20px 0;"
               >
               >
-                <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: 0;left: 0;">En</div>
                 <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                 <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                   <div class="chartWrapper" id="chartWrapper">
                   <div class="chartWrapper" id="chartWrapper">
                     <h2 class="chart-title">{{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}</h2>
                     <h2 class="chart-title">{{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}</h2>

+ 0 - 7
src/views/chartRelevance_manage/relevance/list.vue

@@ -154,13 +154,6 @@
         <div class="chart-detail-wrapper" v-if="chartInfo.ChartInfoId">
         <div class="chart-detail-wrapper" v-if="chartInfo.ChartInfoId">
           <el-row class="bottom-min">
           <el-row class="bottom-min">
             <el-col :span="21" style="padding: 20px 0">
             <el-col :span="21" style="padding: 20px 0">
-              <div
-                class="chartEn-mark"
-                v-show="chartInfo.IsEnChart"
-                style="top: 0; left: 0"
-              >
-                En
-              </div>
               <div class="chart-show-cont" v-if="!chartInfo.WarnMsg">
               <div class="chart-show-cont" v-if="!chartInfo.WarnMsg">
                 <div class="chartWrapper" id="chartWrapper">
                 <div class="chartWrapper" id="chartWrapper">
                   <h2 class="chart-title">
                   <h2 class="chart-title">

+ 0 - 1
src/views/chartRelevance_manage/statistic/statisticFeatureList.vue

@@ -142,7 +142,6 @@
                 :span="21"
                 :span="21"
                 style="padding: 20px 0;"
                 style="padding: 20px 0;"
               >
               >
-                <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: 0;left: 0;">En</div>
                 <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                 <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                   <div class="chartWrapper" id="chartWrapper">
                   <div class="chartWrapper" id="chartWrapper">
                     <h2 class="chart-title">{{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}</h2>
                     <h2 class="chart-title">{{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}</h2>

+ 0 - 1
src/views/dataEntry_manage/chartSetting.vue

@@ -391,7 +391,6 @@
                   style="padding-bottom: 30px;"
                   style="padding-bottom: 30px;"
                 >
                 >
                 
                 
-                  <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: 0;left: 0;">En</div>
                   <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                   <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                     <div class="chartWrapper" id="chartWrapper">
                     <div class="chartWrapper" id="chartWrapper">
                       <h2 
                       <h2 

+ 3 - 2
src/views/dataEntry_manage/codecount/index.vue

@@ -67,7 +67,8 @@
 									label: 'ClassifyName',
 									label: 'ClassifyName',
 									value: 'ClassifyId',
 									value: 'ClassifyId',
 									children: 'Children',
 									children: 'Children',
-									checkStrictly: true
+									checkStrictly: true,
+									emitPath: false,
 								}"
 								}"
 								@change="menuChange"
 								@change="menuChange"
 								clearable
 								clearable
@@ -359,7 +360,7 @@ export default {
 				EdbName: edb_name,
 				EdbName: edb_name,
 				Frequency: frequency,
 				Frequency: frequency,
 				Unit: unit,
 				Unit: unit,
-				ClassifyId: menu&&menu[menu.length-1]
+				ClassifyId: menu
 			}
 			}
 			
 			
 			const { Ret,Data } = this.$route.query.edbid ? await dataBaseInterface.editCountCode({ ...params,EdbInfoId: Number(this.$route.query.edbid) }) : await dataBaseInterface.addCountCode(params);
 			const { Ret,Data } = this.$route.query.edbid ? await dataBaseInterface.editCountCode({ ...params,EdbInfoId: Number(this.$route.query.edbid) }) : await dataBaseInterface.addCountCode(params);

+ 3 - 1
src/views/dataEntry_manage/components/barOptionSection.vue

@@ -259,8 +259,10 @@ export default {
         this.dateList.push(date_item)
         this.dateList.push(date_item)
         
         
         let themeOpt = this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
         let themeOpt = this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+        // 看colorsOptions返不返回再说
+        console.log(themeOpt,'themeOpt');
         this.dateList.forEach((item,index) => {
         this.dateList.forEach((item,index) => {
-          item.Color = item.Color || (themeOpt&&themeOpt.colorsOptions[index]||defaultOpts.colors[index]);
+          item.Color = item.Color || (themeOpt &&themeOpt.lineOptionList[index].color || defaultOpts.colors[index]);
         })
         })
       }
       }
       this.cancelDialog()
       this.cancelDialog()

+ 1 - 1
src/views/dataEntry_manage/components/chartSourceEditDialog.vue

@@ -20,7 +20,7 @@
         <el-form-item :label="$t('Edb.Detail.source')">
         <el-form-item :label="$t('Edb.Detail.source')">
           <el-input
           <el-input
             v-model="chartSourceForm.text"
             v-model="chartSourceForm.text"
-            :placeholder="$t('Chart.Detail.input_content')"
+            :placeholder="$t('Chart.InputHolderAll.input_content')"
           />
           />
         </el-form-item>
         </el-form-item>
         <el-form-item :label="$t('Chart.Detail.color')" style="margin-bottom:8px;">
         <el-form-item :label="$t('Chart.Detail.color')" style="margin-bottom:8px;">

+ 82 - 0
src/views/dataEntry_manage/components/edbHasUsedDia.vue

@@ -0,0 +1,82 @@
+<template>
+  <el-dialog
+  :modal-append-to-body='false'
+  :title="$t('Edb.MsgPrompt.del_failed')" 
+  :visible.sync="show"
+  :close-on-click-modal="false"
+  @close="cancelHandle"
+  custom-class="dateDialog"
+  width="650px">
+    <div class="dialog-main">
+      <div class="main-title">
+        <i class="el-icon-error"  style="color: #F56C6C;"></i>
+        <span>{{ $t('Edb.MsgPrompt.del_edb_use_table') }}</span>
+      </div>
+      <div class="main-list">
+        <div class="used-item" v-for="(data,index) in dataList" :key="data.id">
+          <span>{{ index+1 }}、</span><span @click="navigateTo(data.routeUrl)">{{ data.ExcelName }}</span>
+        </div>
+      </div>
+    </div>
+    <div class="dia-bot">
+      <el-button @click="cancelHandle" type="primary" style="width: 120px;"><!-- 知道了 -->{{$t('Dialog.known')}}</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+  export default {
+    name:"",
+    props:{
+      show:{
+        type:Boolean,
+        default:false
+      },
+      dataList:{
+        type:Array,
+        default:()=>[]
+      }
+    },
+    methods:{
+      navigateTo(url){
+        console.log(url);
+        if(!url) return
+        window.open(url, '_blank'); 
+      },
+      cancelHandle(){
+        this.$emit('update:show',false)
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+.main-title{
+  display: flex;
+  align-items: center;
+  font-size: 15px;
+  i{
+    font-size: 20px;
+    margin-right: 10px
+  }
+}
+.main-list{
+  margin: 20px 0 0 30px;
+  max-height: 420px;
+  overflow: auto;
+  .used-item{
+    span{
+      color:#333333 ;
+      cursor: pointer;
+      &:hover{
+        text-decoration: underline
+      }
+    }
+  }
+
+}
+.dia-bot{
+  display: flex;
+  justify-content: flex-end
+}
+</style>

+ 25 - 1
src/views/dataEntry_manage/databaseComponents/dataAssociateChart.vue

@@ -1,10 +1,14 @@
 <template>
 <template>
     <div class="associate-chart">
     <div class="associate-chart">
         <div v-if="list.length===0&&finished" style="text-align:center;display:block" class="empty-list">
         <div v-if="list.length===0&&finished" style="text-align:center;display:block" class="empty-list">
+            <span class="return-btn" @click="()=>{$emit('returnHandle')}">{{$t('Edb.detail_return_btn')}}</span>
             <tableNoData :text="$t('EtaBasePage.no_quote_chart')"/>
             <tableNoData :text="$t('EtaBasePage.no_quote_chart')"/>
         </div>
         </div>
         <template v-else>
         <template v-else>
-        <p style="position:relative;font-size:16px">{{$t('Chart.total_chart_show',{limit: chartTotal})}}</p>
+        <p class="associate-chart-title">
+            <span>{{$t('Chart.total_chart_show',{limit: chartTotal})}}</span>
+            <span class="return-btn-tow" @click="()=>{$emit('returnHandle')}">{{$t('Edb.detail_return_btn')}}</span>
+        </p>
         <div
         <div
             class="chart-public-list"
             class="chart-public-list"
             v-infinite-scroll="load"
             v-infinite-scroll="load"
@@ -203,11 +207,31 @@ export default {
     display: flex;
     display: flex;
     flex-direction: column;
     flex-direction: column;
 }
 }
+.associate-chart-title{
+    position:relative;
+    font-size:16px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    .return-btn-tow{
+        color: #409eff;
+        font-size: 14px;
+        cursor: pointer;
+    }
+}
 .empty-list{
 .empty-list{
     min-height: calc(100vh - 300px);
     min-height: calc(100vh - 300px);
     background-color: #fff;
     background-color: #fff;
     margin-top: -30px;
     margin-top: -30px;
     padding-top: 100px;
     padding-top: 100px;
+    position: relative;
+    .return-btn{
+        position: absolute;
+        top: 32px;
+        right: 2px;
+        cursor: pointer;
+        color: #409eff;
+    }
 }
 }
 .chart-public-list{
 .chart-public-list{
     flex: 1;
     flex: 1;

+ 11 - 0
src/views/dataEntry_manage/databaseComponents/dataAssociateComputeData.vue

@@ -1,10 +1,12 @@
 <template>
 <template>
     <div class="main-box">
     <div class="main-box">
+        <p class="return-btn" @click="()=>{$emit('returnHandle')}">{{$t('Edb.detail_return_btn')}}</p>
         <el-table 
         <el-table 
             :data="list" 
             :data="list" 
             ref="tableRef" 
             ref="tableRef" 
             highlight-current-row 
             highlight-current-row 
             border
             border
+            style="margin-top: 18px;"
         >
         >
             <el-table-column
             <el-table-column
                 v-for="item in tableColums"
                 v-for="item in tableColums"
@@ -134,5 +136,14 @@ export default {
     padding: 30px;
     padding: 30px;
     height: 100%;
     height: 100%;
     overflow-y: auto;
     overflow-y: auto;
+    position: relative;
+    .return-btn{
+        color: #409eff;
+        font-size: 14px;
+        cursor: pointer;
+        position: absolute;
+        right: 16px;
+        top: 12px;
+    }
 }
 }
 </style>
 </style>

+ 1 - 1
src/views/dataEntry_manage/databaseComponents/edbDetailData.vue

@@ -10,7 +10,7 @@
 				:min-width="item.minwidthsty"
 				:min-width="item.minwidthsty"
 				align="center">
 				align="center">
 				<template slot="header" slot-scope="scope">
 				<template slot="header" slot-scope="scope">
-					<div class="chartEn-mark" style="top: -10px;" v-show="scope.$index ==0 && tableData[0] && tableData[0].IsEnEdb" >En</div>
+					<!-- <div class="chartEn-mark" style="top: -10px;" v-show="scope.$index ==0 && tableData[0] && tableData[0].IsEnEdb" >En</div> -->
 					<span>{{item.label}}</span>
 					<span>{{item.label}}</span>
 				</template>	
 				</template>	
 				<template slot-scope="scope">
 				<template slot-scope="scope">

+ 4 - 3
src/views/dataEntry_manage/databaseComponents/fittingResidueDia.vue

@@ -228,7 +228,7 @@ export default {
 				this.formData = {
 				this.formData = {
 					date: backData.date.split(','),
 					date: backData.date.split(','),
 					edb_name: backData.targetName,
 					edb_name: backData.targetName,
-					menu: backData.menu,
+					menu: backData.menu[backData.menu.length-1],
 					frequency: backData.frequency,
 					frequency: backData.frequency,
 					unit: backData.unit,
 					unit: backData.unit,
 					self_variate: backData.from_arr[0].FromEdbInfoId,
 					self_variate: backData.from_arr[0].FromEdbInfoId,
@@ -278,7 +278,8 @@ export default {
 				label: 'ClassifyName',
 				label: 'ClassifyName',
 				value: 'ClassifyId',
 				value: 'ClassifyId',
 				children: 'Children',
 				children: 'Children',
-				checkStrictly: true
+				checkStrictly: true,
+				emitPath: false,
 			},
 			},
 			/* frequencyArr, */
 			/* frequencyArr, */
 			fre_options: ['天','周','月','季','年'],
 			fre_options: ['天','周','月','季','年'],
@@ -534,7 +535,7 @@ export default {
 					Source: this.type,
 					Source: this.type,
 					EdbName: edb_name,
 					EdbName: edb_name,
 					Unit: unit,
 					Unit: unit,
-					ClassifyId: menu[menu.length - 1],
+					ClassifyId: menu,
 					Frequency: frequency,
 					Frequency: frequency,
 					Formula: date.join(','),
 					Formula: date.join(','),
 					EdbInfoIdArr: [
 					EdbInfoIdArr: [

+ 85 - 18
src/views/dataEntry_manage/databaseList.vue

@@ -143,12 +143,12 @@
 								style="display: flex; align-items: center"
 								style="display: flex; align-items: center"
 								v-if="select_node===data.UniqueCode&&data.HaveOperaAuth"
 								v-if="select_node===data.UniqueCode&&data.HaveOperaAuth"
 							>
 							>
-								<img
+								<!-- <img
 									src="~@/assets/img/data_m/move_ico.png"
 									src="~@/assets/img/data_m/move_ico.png"
 									alt=""
 									alt=""
 									style="width: 14px; height: 14px; margin-right: 8px"
 									style="width: 14px; height: 14px; margin-right: 8px"
 									v-if="data.Button.MoveButton&&isEdbBtnShow('moveCatalog')"
 									v-if="data.Button.MoveButton&&isEdbBtnShow('moveCatalog')"
-								/>
+								/> -->
 								<!-- 添加子项 -->
 								<!-- 添加子项 -->
 								<img
 								<img
 									src="~@/assets/img/set_m/add.png"
 									src="~@/assets/img/set_m/add.png"
@@ -175,25 +175,25 @@
 									v-if="!data.EdbCode&&(data.Button.DeleteButton)&&isEdbBtnShow('deleteCatalog')"
 									v-if="!data.EdbCode&&(data.Button.DeleteButton)&&isEdbBtnShow('deleteCatalog')"
 								/>
 								/>
 								<!-- 查看计算指标 -->
 								<!-- 查看计算指标 -->
-								<i class="el-icon-view" 
+								<!-- <i class="el-icon-view" 
 									v-if="data.EdbType===2&&![58,59,67,68,74].includes(data.Source)&&isEdbBtnShow('checkCalcChart')" 
 									v-if="data.EdbType===2&&![58,59,67,68,74].includes(data.Source)&&isEdbBtnShow('checkCalcChart')" 
-									@click.stop="viewNode(node,data)"></i>
+									@click.stop="viewNode(node,data)"></i> -->
 								<!-- 查看关联图表 -->
 								<!-- 查看关联图表 -->
-								<img 
+								<!-- <img 
 									v-if="data.Button.ShowChartRelation&&isEdbBtnShow('checkRelatedChart')" 
 									v-if="data.Button.ShowChartRelation&&isEdbBtnShow('checkRelatedChart')" 
 									@click.stop="showAssociateChart=true,showAssociateComputeData=false"
 									@click.stop="showAssociateChart=true,showAssociateComputeData=false"
 									src="~@/assets/img/icons/associate_chart.png" 
 									src="~@/assets/img/icons/associate_chart.png" 
 									style="width: 14px; height: 14px;margin-left: 8px"
 									style="width: 14px; height: 14px;margin-left: 8px"
 									alt=""
 									alt=""
-								/>
+								/> -->
 								<!-- 查看关联指标 -->
 								<!-- 查看关联指标 -->
-								<img 
+								<!-- <img 
 									v-if="data.Button.ShowEdbRelation&&isEdbBtnShow('checkRelatedEdb')" 
 									v-if="data.Button.ShowEdbRelation&&isEdbBtnShow('checkRelatedEdb')" 
 									@click.stop="showAssociateComputeData=true,showAssociateChart=false"
 									@click.stop="showAssociateComputeData=true,showAssociateChart=false"
 									src="~@/assets/img/icons/associate_data.png" 
 									src="~@/assets/img/icons/associate_data.png" 
 									style="width: 14px; height: 14px;margin-left: 8px"
 									style="width: 14px; height: 14px;margin-left: 8px"
 									alt=""
 									alt=""
-								/>
+								/> -->
 							</span>
 							</span>
 						</span>
 						</span>
 					</el-tree>
 					</el-tree>
@@ -219,10 +219,10 @@
 			</div>
 			</div>
 			<!-- 指标关联图模块 -->
 			<!-- 指标关联图模块 -->
 			<div class="main-right right" id="right" style="background:transparent;border:none;box-shadow:none" v-if="showAssociateChart">
 			<div class="main-right right" id="right" style="background:transparent;border:none;box-shadow:none" v-if="showAssociateChart">
-				<dataAssociateChart :edbInfoId="selected_edbid"></dataAssociateChart>
+				<dataAssociateChart :edbInfoId="selected_edbid" @returnHandle="showAssociateChart=false,showAssociateComputeData=false"></dataAssociateChart>
 			</div>
 			</div>
 			<div class="main-right right" id="right" style="background:transparent;border:none;box-shadow:none;padding-top: 30px;box-sizing: border-box;" v-if="showAssociateComputeData">
 			<div class="main-right right" id="right" style="background:transparent;border:none;box-shadow:none;padding-top: 30px;box-sizing: border-box;" v-if="showAssociateComputeData">
-				<dataAssociateComputeData :edbInfoId="selected_edbid"></dataAssociateComputeData>
+				<dataAssociateComputeData :edbInfoId="selected_edbid" @returnHandle="showAssociateChart=false,showAssociateComputeData=false"></dataAssociateComputeData>
 			</div>
 			</div>
 			<!-- 指标图表列表 -->
 			<!-- 指标图表列表 -->
 			<div class="main-right right list" id="right" v-show="isShowList">
 			<div class="main-right right list" id="right" v-show="isShowList">
@@ -316,6 +316,21 @@
 										type="text" 
 										type="text" 
 										@click="copyCode"
 										@click="copyCode"
 									>{{$t('Edb.detail_copydata_btn')}}<!-- 复制数据 --></el-button>
 									>{{$t('Edb.detail_copydata_btn')}}<!-- 复制数据 --></el-button>
+									<el-button 
+									v-if="EdbData.EdbType===2&&![58,59,67,68,74].includes(EdbData.Source)&&isEdbBtnShow('checkCalcChart')" 
+										type="text" 
+										@click.stop="viewNode"
+									>{{$t('Edb.detail_formula_btn')}}<!-- 查看公式 --></el-button>
+									<el-button 
+										v-if="EdbData.Button.ShowChartRelation&&isEdbBtnShow('checkRelatedChart')"
+										type="text" 
+										@click="showAssociateChart=true,showAssociateComputeData=false" 
+									>{{$t('Edb.detail_related_charts_btn')}}<!-- 关联图 --></el-button>
+									<el-button 
+										v-if="EdbData.Button.ShowEdbRelation&&isEdbBtnShow('checkRelatedEdb')" 
+										type="text"
+										@click="showAssociateComputeData=true,showAssociateChart=false"
+									>{{$t('Edb.detail_related_metrics_btn')}}<!-- 关联指标 --></el-button>
 									<el-button 
 									<el-button 
 										v-if="EdbData.Button.DeleteButton&&isEdbBtnShow('deleteEdb')"
 										v-if="EdbData.Button.DeleteButton&&isEdbBtnShow('deleteEdb')"
 										type="text" 
 										type="text" 
@@ -567,6 +582,10 @@
 			@updateLang="updateLang"
 			@updateLang="updateLang"
 			cType="ebd" 
 			cType="ebd" 
 		/>
 		/>
+
+		<!-- 指标已经被引用 -->
+		<edbHasUsedDia :show.sync="edbHasUsedDiaShow" :dataList="hasUsedList"/>
+
 	</div>
 	</div>
 </template>
 </template>
 
 
@@ -597,6 +616,7 @@ import edbDetailData from './databaseComponents/edbDetailData.vue';
 import SmoothEdbDialog from './databaseComponents/smoothEdbDialog.vue';
 import SmoothEdbDialog from './databaseComponents/smoothEdbDialog.vue';
 import batchComputedV2 from './databaseComponents/batchComputedV2.vue';
 import batchComputedV2 from './databaseComponents/batchComputedV2.vue';
 import setLangInfoDia from './components/setLangInfo.vue'
 import setLangInfoDia from './components/setLangInfo.vue'
+import edbHasUsedDia from './components/edbHasUsedDia.vue';
 export default {
 export default {
 	name: '',
 	name: '',
 	components: {
 	components: {
@@ -622,7 +642,8 @@ export default {
 		edbDetailData,
 		edbDetailData,
 		SmoothEdbDialog,
 		SmoothEdbDialog,
 		batchComputedV2,
 		batchComputedV2,
-		setLangInfoDia
+		setLangInfoDia,
+		edbHasUsedDia
 	},
 	},
 	directives: {
 	directives: {
 		drag(el, bindings,vnode) {
 		drag(el, bindings,vnode) {
@@ -757,7 +778,10 @@ export default {
 			showBatchComputedPop:false,
 			showBatchComputedPop:false,
 
 
 			/* 修改对应版本信息弹窗  替换原有设置英文*/
 			/* 修改对应版本信息弹窗  替换原有设置英文*/
-			isLangInfoDia: false
+			isLangInfoDia: false,
+
+			edbHasUsedDiaShow:false,
+			hasUsedList:[]
 		};
 		};
 	},
 	},
 	watch: {
 	watch: {
@@ -1492,15 +1516,23 @@ export default {
 					 * 0 可删除
 					 * 0 可删除
 					 * 1 关联指标
 					 * 1 关联指标
 					 * 2 有子目录无指标
 					 * 2 有子目录无指标
+					 * 4 当前指标已用作指标运算,不可删除
+					 * 5 当前指标已用作预测指标,不可删除
+					 * 6 当前指标已被表格引用,不可删除
+					 * 7 当前指标已添加到跨品种分析,不可删除
 					*/
 					*/
 					const deleteLabelMap = {
 					const deleteLabelMap = {
 						1: /* '该目录关联指标不可删除' */this.$t('Edb.MsgPrompt.del_not_relate_edb'),
 						1: /* '该目录关联指标不可删除' */this.$t('Edb.MsgPrompt.del_not_relate_edb'),
 						2: /* '确认删除当前目录及包含的子目录吗?' */this.$t('Edb.MsgPrompt.del_confirm_menu_or_children'),
 						2: /* '确认删除当前目录及包含的子目录吗?' */this.$t('Edb.MsgPrompt.del_confirm_menu_or_children'),
 						3: /* '当前指标已用作画图,不可删除' */this.$t('Edb.MsgPrompt.del_edb_use_chart'),
 						3: /* '当前指标已用作画图,不可删除' */this.$t('Edb.MsgPrompt.del_edb_use_chart'),
-						4: res.Data.TipsMsg
+						4: res.Data.TipsMsg,
+						5: res.Data.TipsMsg,
+						6: res.Data.TipsMsg,
+						7: res.Data.TipsMsg,
 					}
 					}
 
 
-					if([1,3,4].includes(res.Data.DeleteStatus)) this.$confirm(
+					if([1,3,4,5,7].includes(res.Data.DeleteStatus)){
+						this.$confirm(
 							deleteLabelMap[res.Data.DeleteStatus],
 							deleteLabelMap[res.Data.DeleteStatus],
 							/* '删除失败' */this.$t('Edb.MsgPrompt.del_failed'),
 							/* '删除失败' */this.$t('Edb.MsgPrompt.del_failed'),
 							{
 							{
@@ -1508,7 +1540,12 @@ export default {
 							showCancelButton:false,
 							showCancelButton:false,
 							type: 'error'
 							type: 'error'
 						})
 						})
-					else if([0,2].includes(res.Data.DeleteStatus)) this.$confirm(
+					}else if(res.Data.DeleteStatus == 6){
+						this.edbHasUsedDiaShow=true
+						this.hasUsedList=res.Data.TableList.map(it =>{
+							return {...it,routeUrl:this.getRouteUrl(it)}
+						})
+					}else if([0,2].includes(res.Data.DeleteStatus)) this.$confirm(
 							res.Data.DeleteStatus === 2 
 							res.Data.DeleteStatus === 2 
 							? deleteLabelMap[res.Data.DeleteStatus]
 							? deleteLabelMap[res.Data.DeleteStatus]
 							: data.EdbCode? this.$t('Edb.MsgPrompt.del_edb_confirm')/* '删除后指标和指标值均不可使用,确认删除吗?' */:/* '确定删除当前目录吗?' */this.$t('Edb.MsgPrompt.del_menu_confirm'), 
 							: data.EdbCode? this.$t('Edb.MsgPrompt.del_edb_confirm')/* '删除后指标和指标值均不可使用,确认删除吗?' */:/* '确定删除当前目录吗?' */this.$t('Edb.MsgPrompt.del_menu_confirm'), 
@@ -1525,6 +1562,36 @@ export default {
 			})
 			})
 
 
 		},
 		},
+		getRouteUrl(table){
+			/**
+			 	1 // 自定义excel
+				2 // 时间序列表格
+				3 // 混合表格
+				4 // 自定义分析表格
+				5 // 平衡表
+			 */
+			let url=''
+			switch (table.Source) {
+				case 1:
+					url = this.$router.resolve({ path: '/sheetAnalysisList',query:{code:table.UniqueCode,id:table.ExcelInfoId}}).href;
+					break;
+				case 2:
+					url = this.$router.resolve({ path: '/sheetTimeList',query:{code:table.UniqueCode,id:table.ExcelInfoId}}).href;
+					break;
+				case 3:
+					url = this.$router.resolve({ path: '/sheetMixedList',query:{code:table.UniqueCode,id:table.ExcelInfoId}}).href;
+					break;
+				case 4:
+					url = this.$router.resolve({ path: '/sheetList',query:{code:table.UniqueCode,id:table.ExcelInfoId}}).href;
+					break;
+				case 5:
+					url = this.$router.resolve({ path: '/viewBalanceSheet',query:{id:table.ExcelInfoId}}).href;
+					break;
+				default:
+					break;
+			}
+			return url
+		},
 		/* 删除方法 */
 		/* 删除方法 */
 		delHandle(ClassifyId,EdbInfoId) {
 		delHandle(ClassifyId,EdbInfoId) {
 			dataBaseInterface.nodeDelete({
 			dataBaseInterface.nodeDelete({
@@ -1785,7 +1852,7 @@ export default {
 
 
 		/* 查看计算公式 打开弹窗 */
 		/* 查看计算公式 打开弹窗 */
 		viewNode(node,data) {
 		viewNode(node,data) {
-			const { EdbInfoId,Source } = data;
+			const { EdbInfoId,Source } = this.EdbData;
 
 
 			//代码运算指标
 			//代码运算指标
 			if( Source === 27 ) return this.$router.push({
 			if( Source === 27 ) return this.$router.push({
@@ -1801,7 +1868,7 @@ export default {
 			}).then(res => {
 			}).then(res => {
 				if(res.Ret !== 200) return
 				if(res.Ret !== 200) return
 				this.setComputedDialogForm(Source,res.Data,true);
 				this.setComputedDialogForm(Source,res.Data,true);
-				switch (data.Source) {
+				switch (this.EdbData.Source) {
 					case 23: 
 					case 23: 
 					case 24: 
 					case 24: 
 						this.computed_type = 'joint';
 						this.computed_type = 'joint';
@@ -1811,7 +1878,7 @@ export default {
 						this.computed_type = 'alpha';
 						this.computed_type = 'alpha';
 						break
 						break
 					default:
 					default:
-						this.computed_type = data.Source;
+						this.computed_type = this.EdbData.Source;
 						break
 						break
 				}
 				}
 			})
 			})

+ 5 - 5
src/views/dataEntry_manage/mixins/addOreditMixin.js

@@ -632,14 +632,14 @@ export default {
 		setAddChartDefault() {
 		setAddChartDefault() {
 
 
 			let themeOpt = this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
 			let themeOpt = this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
-
+			console.log(themeOpt,'themeOpt');
 			this.tableData.forEach((item,index) => {
 			this.tableData.forEach((item,index) => {
 				item.ChartColor = item.ChartColor || (themeOpt&&themeOpt.colorsOptions[index]||defaultOpts.colors[index]);
 				item.ChartColor = item.ChartColor || (themeOpt&&themeOpt.colorsOptions[index]||defaultOpts.colors[index]);
 				item.PredictChartColor = item.PredictChartColor || (themeOpt&&themeOpt.colorsOptions[index]||defaultOpts.colors[index]);
 				item.PredictChartColor = item.PredictChartColor || (themeOpt&&themeOpt.colorsOptions[index]||defaultOpts.colors[index]);
-				item.ChartStyle = item.ChartStyle || (themeOpt&&themeOpt.lineOptions.lineType||'spline');
+				item.ChartStyle = item.ChartStyle || (themeOpt&&themeOpt.lineOptionList[index].lineType||'spline');
 				
 				
 				let configLineWid = index===0?3:1;//兼容预测指标绘图无主题配置
 				let configLineWid = index===0?3:1;//兼容预测指标绘图无主题配置
-				this.tableData[index].ChartWidth = this.tableData[index].ChartWidth || (themeOpt&&themeOpt.lineOptions.lineWidth||configLineWid);
+				this.tableData[index].ChartWidth = this.tableData[index].ChartWidth || (themeOpt&&themeOpt.lineOptionList[index].lineWidth||configLineWid);
 			})
 			})
 		},
 		},
 
 
@@ -971,10 +971,10 @@ export default {
 			this.tableData.forEach((item,index) => {
 			this.tableData.forEach((item,index) => {
 				item.ChartColor = themeOpt.colorsOptions[index];
 				item.ChartColor = themeOpt.colorsOptions[index];
 				item.PredictChartColor = themeOpt.colorsOptions[index];
 				item.PredictChartColor = themeOpt.colorsOptions[index];
-				item.ChartStyle = themeOpt.lineOptions.lineType||'spline';
+				item.ChartStyle = themeOpt.lineOptionList[index].lineType||'spline';
 				item.isAxis = item.isAxis||1;
 				item.isAxis = item.isAxis||1;
 
 
-				this.tableData[index].ChartWidth = themeOpt.lineOptions.lineWidth;
+				this.tableData[index].ChartWidth = themeOpt.lineOptionList[index].lineWidth;
 			})
 			})
 
 
 		},
 		},

+ 45 - 31
src/views/dataEntry_manage/mixins/chartPublic.js

@@ -731,7 +731,6 @@ export const chartSetMixin = {
 
 
       /* 主题样式*/
       /* 主题样式*/
       const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
       const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
-
       //拼接标题 数据列
       //拼接标题 数据列
       let data = [];
       let data = [];
       let ydata = [];
       let ydata = [];
@@ -824,8 +823,8 @@ export const chartSetMixin = {
         //数据列
         //数据列
         let obj = {
         let obj = {
           data: [],
           data: [],
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'spline',
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'spline',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: sameSideIndex,
           yAxis: sameSideIndex,
           name:
           name:
             dynamic_arr.length > 1
             dynamic_arr.length > 1
@@ -836,7 +835,13 @@ export const chartSetMixin = {
           : `${item.EdbAliasName||item.EdbName}${dynamic_tag}`,
           : `${item.EdbAliasName||item.EdbName}${dynamic_tag}`,
           nameEn:item.EdbNameEn?`${item.EdbNameEn}${dynamic_tag_en}`:`${item.EdbAliasName||item.EdbName}${dynamic_tag}`,
           nameEn:item.EdbNameEn?`${item.EdbNameEn}${dynamic_tag_en}`:`${item.EdbAliasName||item.EdbName}${dynamic_tag}`,
           color: item.ChartColor,
           color: item.ChartColor,
-          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptions.lineWidth),
+          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptionList[index].lineWidth),
+          marker: chartTheme && chartTheme.lineOptionList[index].dataMark && chartTheme.lineOptionList[index].dataMark!='none'?{
+            enabled:true,
+            symbol: chartTheme.lineOptionList[index].markType || 'circle',
+            fillColor:chartTheme.lineOptionList[index].markColor,
+            radius: chartTheme.lineOptionList[index].markSize
+          }:{},
           ...predict_params
           ...predict_params
         };
         };
         item.DataList = item.DataList || [];
         item.DataList = item.DataList || [];
@@ -1034,7 +1039,7 @@ export const chartSetMixin = {
           : `${item.EdbAliasName||item.EdbName}${dynamic_tag}`,
           : `${item.EdbAliasName||item.EdbName}${dynamic_tag}`,
           nameEn:item.EdbNameEn?`${item.EdbNameEn}${dynamic_tag_en}`:`${item.EdbAliasName||item.EdbName}${dynamic_tag}`,
           nameEn:item.EdbNameEn?`${item.EdbNameEn}${dynamic_tag_en}`:`${item.EdbAliasName||item.EdbName}${dynamic_tag}`,
           color: item.ChartColor,
           color: item.ChartColor,
-          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptions.lineWidth),
+          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptionList[index].lineWidth),
           fillColor: (this.chartInfo.ChartType === 3 || (this.chartInfo.ChartType === 6 && item.ChartStyle === 'areaspline')) ? item.ChartColor : undefined,
           fillColor: (this.chartInfo.ChartType === 3 || (this.chartInfo.ChartType === 6 && item.ChartStyle === 'areaspline')) ? item.ChartColor : undefined,
           borderWidth: 1,
           borderWidth: 1,
           borderColor: item.ChartColor,
           borderColor: item.ChartColor,
@@ -1091,9 +1096,10 @@ export const chartSetMixin = {
                             this.isPredictorChart?chartData.DataList.List.filter((item, index) => index > 0):
                             this.isPredictorChart?chartData.DataList.List.filter((item, index) => index > 0):
                             chartData.DataList.filter((item, index) => index > 0):
                             chartData.DataList.filter((item, index) => index > 0):
                             chartData.DataList||[]
                             chartData.DataList||[]
-       /* 主题样式*/
-       const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
-
+      /* 主题样式*/
+      const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+      // 跟颜色对应
+      chartTheme.lineOptionList=chartTheme.lineOptionList.reverse().slice(-chartDataHandle.length)
       let seasonYdata = [],
       let seasonYdata = [],
         seasonData = [];
         seasonData = [];
 
 
@@ -1110,17 +1116,25 @@ export const chartSetMixin = {
         }
         }
 
 
       //数据列
       //数据列
-      for (let j of chartDataHandle) {
+      for (let index in chartDataHandle) {
+        let j = chartDataHandle[index]
+        // console.log(j,index);
         //预测指标配置
         //预测指标配置
         let predict_params =  chartData.EdbInfoCategoryType === 1 ? this.getSeasonPredictParams(j.CuttingDataTimestamp) : {};
         let predict_params =  chartData.EdbInfoCategoryType === 1 ? this.getSeasonPredictParams(j.CuttingDataTimestamp) : {};
-        
+
         let serie_item = {
         let serie_item = {
           data: [],
           data: [],
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || chartData.ChartStyle,
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || chartData.ChartStyle,
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: 0,
           yAxis: 0,
           name: this.isPredictorChart?j.Year:j.ChartLegend,
           name: this.isPredictorChart?j.Year:j.ChartLegend,
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 1,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth) || 1,
+          marker: chartTheme && chartTheme.lineOptionList[index].dataMark && chartTheme.lineOptionList[index].dataMark!='none'?{
+            enabled:true,
+            symbol: chartTheme.lineOptionList[index].markType || 'circle',
+            fillColor:chartTheme.lineOptionList[index].markColor,
+            radius: chartTheme.lineOptionList[index].markSize
+          }:{},
           ...predict_params
           ...predict_params
         };
         };
         const data_array = this.calendar_type === '农历' && this.isPredictorChart?_.cloneDeep(j.Items):_.cloneDeep(j.DataList);
         const data_array = this.calendar_type === '农历' && this.isPredictorChart?_.cloneDeep(j.Items):_.cloneDeep(j.DataList);
@@ -1415,7 +1429,7 @@ export const chartSetMixin = {
         color: ChartColor,
         color: ChartColor,
         chartType: 'linear',
         chartType: 'linear',
         marker: {
         marker: {
-          radius: (chartTheme&&chartTheme.lineOptions.radius)||5,
+          radius: (chartTheme&&chartTheme.lineOptionList[0].radius)||5,
         },
         },
       }
       }
       real_data.forEach(_ => {
       real_data.forEach(_ => {
@@ -1586,22 +1600,22 @@ export const chartSetMixin = {
       }
       }
 
 
       //数据列
       //数据列
-      data.forEach(item => {
+      data.forEach((item,index) => {
         //处理首或/尾全是无效数据的以null填充
         //处理首或/尾全是无效数据的以null填充
         let filterData = this.filterInvalidData(item)
         let filterData = this.filterInvalidData(item)
         // console.log(filterData)
         // console.log(filterData)
       
       
         let serie_item = {
         let serie_item = {
           data: filterData,
           data: filterData,
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'spline',
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'spline',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: 0,
           yAxis: 0,
           name: item.Name,
           name: item.Name,
           nameCh: item.Name,
           nameCh: item.Name,
           nameEn: item.NameEn,
           nameEn: item.NameEn,
           color: item.Color,
           color: item.Color,
           chartType: 'linear',
           chartType: 'linear',
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 3,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth) || 3,
           marker: {
           marker: {
             enabled: false
             enabled: false
           }
           }
@@ -1826,18 +1840,18 @@ export const chartSetMixin = {
 
 
       //处理series
       //处理series
       let seriesData=[]
       let seriesData=[]
-      this.relevanceChartData.YDataList.forEach(item=>{
+      this.relevanceChartData.YDataList.forEach((item,index)=>{
         let serie_item = {
         let serie_item = {
           data: item.Value,
           data: item.Value,
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'spline',
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'spline',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: 0,
           yAxis: 0,
           name: item.Name,
           name: item.Name,
           nameCh: item.Name,
           nameCh: item.Name,
           nameEn: item.NameEn,
           nameEn: item.NameEn,
           color: item.Color,
           color: item.Color,
           chartType: 'linear',
           chartType: 'linear',
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 3,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth) || 3,
           marker: {
           marker: {
             enabled: false
             enabled: false
           }
           }
@@ -1951,7 +1965,7 @@ export const chartSetMixin = {
 
 
       //数据列
       //数据列
       let series = [];
       let series = [];
-      DataList.forEach(item => {
+      DataList.forEach((item,index) => {
         //数据列
         //数据列
         let series_item = {
         let series_item = {
           data: [],
           data: [],
@@ -1963,7 +1977,7 @@ export const chartSetMixin = {
           chartType: 'linear',
           chartType: 'linear',
           zIndex:1,
           zIndex:1,
           marker: {
           marker: {
-            radius: (chartTheme&&chartTheme.lineOptions.radius)||5,
+            radius: (chartTheme&&chartTheme.lineOptionList[index].radius)||5,
           },
           },
         }
         }
         item.EdbInfoList.forEach(_ => {
         item.EdbInfoList.forEach(_ => {
@@ -2157,18 +2171,18 @@ export const chartSetMixin = {
 
 
       //系列
       //系列
       let series = [];
       let series = [];
-      YDataList.forEach(item => {
+      YDataList.forEach((item,index) => {
         let serie_item = {
         let serie_item = {
           data: item.Value,
           data: item.Value,
           pointPlacement: 'on',
           pointPlacement: 'on',
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'line',
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'line',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: 0,
           yAxis: 0,
           name: item.Name || item.Date,
           name: item.Name || item.Date,
           nameCh: item.Name || item.Date,
           nameCh: item.Name || item.Date,
           nameEn: item.Date,
           nameEn: item.Date,
           color: item.Color,
           color: item.Color,
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 1,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth) || 1,
           chartType: 'linear'
           chartType: 'linear'
         };
         };
         series.push(serie_item)
         series.push(serie_item)
@@ -2246,14 +2260,14 @@ export const chartSetMixin = {
 
 
         let series_item = {
         let series_item = {
           data: item.Value.map(_ =>[_.X,_.Y]),
           data: item.Value.map(_ =>[_.X,_.Y]),
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'spline',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'spline',
           yAxis: index,
           yAxis: index,
           name: item.Name,
           name: item.Name,
           nameCh: item.Name,
           nameCh: item.Name,
           nameEn: item.NameEn||item.Name,
           nameEn: item.NameEn||item.Name,
           color: item.Color,
           color: item.Color,
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth)||3,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth)||3,
           chartType: 'linear',
           chartType: 'linear',
           zIndex:1
           zIndex:1
         }
         }

+ 22 - 5
src/views/datasheet_manage/components/MixedTable.vue

@@ -255,6 +255,12 @@ export default {
     disabled: { //是否只预览
     disabled: { //是否只预览
       type: Boolean,
       type: Boolean,
       default: false,
       default: false,
+    },
+    sourceFrom:{
+      type: Object,
+      default: ()=>{
+        return {}
+      },
     }
     }
   },
   },
   components: { 
   components: { 
@@ -892,7 +898,7 @@ export default {
     },
     },
 
 
     /* 插入选择指标的值 */
     /* 插入选择指标的值 */
-    insertSelectData({ edbId,value,relationDate,relationUid,str }) {
+    insertSelectData({ edbId,value,relationDate,relationUid,str,sourceName }) {
 
 
       this.insertTargetCell.DataType = 5;
       this.insertTargetCell.DataType = 5;
       this.insertTargetCell.ShowValue = value;
       this.insertTargetCell.ShowValue = value;
@@ -903,6 +909,7 @@ export default {
 
 
       value ? this.$message.success(this.$t('ETable.Msg.insertion_success_msg')) : this.$message.warning(this.$t('ETable.Msg.date_no_data'))
       value ? this.$message.success(this.$t('ETable.Msg.insertion_success_msg')) : this.$message.warning(this.$t('ETable.Msg.date_no_data'))
 
 
+      this.updateSourceFrom(sourceName)
       //如果有关联表格日期就建立新的关联关系
       //如果有关联表格日期就建立新的关联关系
       if(relationDate&&relationUid) {
       if(relationDate&&relationUid) {
         let relation = {
         let relation = {
@@ -1075,7 +1082,9 @@ export default {
     },
     },
 
 
     /* 插入系统/指标日期 */
     /* 插入系统/指标日期 */
-    insertDatehandle({insertValue,dataTimeType,str}) {
+    insertDatehandle({insertValue,dataTimeType,str,sourceName}) {
+
+      this.updateSourceFrom(sourceName)
 
 
       this.insertTargetCell.DataType = 1;
       this.insertTargetCell.DataType = 1;
       this.insertTargetCell.DataTimeType = dataTimeType;
       this.insertTargetCell.DataTimeType = dataTimeType;
@@ -1115,7 +1124,7 @@ export default {
     /* 导入指标计算值 */
     /* 导入指标计算值 */
     insertCalculateData(item) {
     insertCalculateData(item) {
       // console.log(item)
       // console.log(item)
-      const { InsertValue,EdbInfoId,Str,relationDate,relationUid } = item;
+      const { InsertValue,EdbInfoId,Str,relationDate,relationUid,sourceName } = item;
       this.insertTargetCell.DataType = 7;
       this.insertTargetCell.DataType = 7;
       this.insertTargetCell.ShowValue = InsertValue;
       this.insertTargetCell.ShowValue = InsertValue;
       this.insertTargetCell.Value = Str;
       this.insertTargetCell.Value = Str;
@@ -1125,6 +1134,8 @@ export default {
 
 
       InsertValue ? this.$message.success(this.$t('ETable.Msg.insertion_success_msg')) : this.$message.warning(this.$t('ETable.Msg.date_no_data'))
       InsertValue ? this.$message.success(this.$t('ETable.Msg.insertion_success_msg')) : this.$message.warning(this.$t('ETable.Msg.date_no_data'))
 
 
+      this.updateSourceFrom(sourceName)
+
       //如果有关联表格日期就建立新的关联关系
       //如果有关联表格日期就建立新的关联关系
       if(relationDate&&relationUid) {
       if(relationDate&&relationUid) {
         let relation = {
         let relation = {
@@ -1175,14 +1186,12 @@ export default {
 
 
     /* 初始化8行5列 */
     /* 初始化8行5列 */
     initData(initData=null) {
     initData(initData=null) {
-      console.log('initData');
       this.hasInit=false
       this.hasInit=false
       if(initData) {
       if(initData) {
         const { CellRelation,Data } = initData;
         const { CellRelation,Data } = initData;
         this.config.data = Data;
         this.config.data = Data;
         this.insertRelationArr = JSON.parse(CellRelation);
         this.insertRelationArr = JSON.parse(CellRelation);
       }else {
       }else {
-
         this.config.data = new Array(8).fill("").map((_,_rindex) => {
         this.config.data = new Array(8).fill("").map((_,_rindex) => {
           return new Array(5).fill("").map((cell,_cindex) => ({
           return new Array(5).fill("").map((cell,_cindex) => ({
             ShowValue: "",
             ShowValue: "",
@@ -1294,6 +1303,14 @@ export default {
       
       
       this.$set(this.selectCell,'ShowStyle',ShowStyle)
       this.$set(this.selectCell,'ShowStyle',ShowStyle)
       this.$set(this.selectCell,'ShowFormatValue',ShowFormatValue)
       this.$set(this.selectCell,'ShowFormatValue',ShowFormatValue)
+    },
+    // 更新数据来源
+    updateSourceFrom(source){
+      if(!source) return
+      let concatSourceArr = this.sourceFrom.text?`${this.sourceFrom.text},${source}`.split(','):[source];
+      let sourceStr = Array.from(new Set(concatSourceArr)).join(',');
+      this.sourceFrom.text=sourceStr
+      this.$emit('updateSourceName')
     }
     }
   },
   },
 };
 };

+ 12 - 4
src/views/datasheet_manage/components/calculateEdbDia.vue

@@ -368,7 +368,7 @@ export default {
         MoveForward: 0,
         MoveForward: 0,
         relationDate: '',//关联的表格日期
         relationDate: '',//关联的表格日期
         relationUid: '',//关联格子的uid
         relationUid: '',//关联格子的uid
-      }
+      },
     }
     }
   },
   },
   mounted(){
   mounted(){
@@ -452,6 +452,13 @@ export default {
       const res = await sheetInterface.getMixedCalculateData(params)
       const res = await sheetInterface.getMixedCalculateData(params)
       if(res.Ret!==200) return 
       if(res.Ret!==200) return 
 
 
+      let baseSourceName=''
+      await sheetInterface.getEdbBaseSource({EdbInfoId:this.selectEdbInfo.EdbInfoId}).then(res=>{
+        if(res.Ret == 200){
+          // 获取原始指标的来源
+          baseSourceName = res.Data.ExcelSource || ''
+        }
+      })
       this.showResult = true;
       this.showResult = true;
       
       
       this.chooseItem = {
       this.chooseItem = {
@@ -459,7 +466,8 @@ export default {
         relationUid: this.dateSelectForm.Type===2 ? this.dateSelectForm.relationUid : '',
         relationUid: this.dateSelectForm.Type===2 ? this.dateSelectForm.relationUid : '',
         EdbInfoId: this.selectEdbInfo.EdbInfoId,
         EdbInfoId: this.selectEdbInfo.EdbInfoId,
         InsertValue: res.Data.ShowValue||"",
         InsertValue: res.Data.ShowValue||"",
-        Str: JSON.stringify(params)
+        Str: JSON.stringify(params),
+        sourceName:baseSourceName||''
       }
       }
 
 
       // if(!this.calculateShowData.length) return this.$message.warning('该日期无数据')
       // if(!this.calculateShowData.length) return this.$message.warning('该日期无数据')
@@ -482,8 +490,9 @@ export default {
         : await dataBaseInterface.targetList({EdbInfoId:e.EdbInfoId,CurrentIndex: 1})
         : await dataBaseInterface.targetList({EdbInfoId:e.EdbInfoId,CurrentIndex: 1})
 
 
       if(res.Ret !== 200) return
       if(res.Ret !== 200) return
+      
+      const { EdbInfoId,EdbCode,EdbName,Frequency,Unit,StartDate,ModifyTime,PredictDataList,DataList,HaveOperaAuth } = res.Data.Item;
 
 
-      const { EdbInfoId,EdbCode,EdbName,Frequency,Unit,StartDate,ModifyTime,SourceName,PredictDataList,DataList,HaveOperaAuth } = res.Data.Item;
       this.selectEdbInfo = {
       this.selectEdbInfo = {
         EdbCode,
         EdbCode,
         EdbName,
         EdbName,
@@ -491,7 +500,6 @@ export default {
         Unit,
         Unit,
         StartDate,
         StartDate,
         ModifyTime,
         ModifyTime,
-        SourceName,
         EdbInfoId,
         EdbInfoId,
         HaveOperaAuth,
         HaveOperaAuth,
         DataList: PredictDataList ? [...PredictDataList,...DataList].slice(0,5) : DataList.slice(0,5)
         DataList: PredictDataList ? [...PredictDataList,...DataList].slice(0,5) : DataList.slice(0,5)

+ 18 - 3
src/views/datasheet_manage/components/insertDateDia.vue

@@ -151,22 +151,37 @@ export default {
       let backData = {}
       let backData = {}
       //插入系统日期
       //插入系统日期
       // if(this.info.key==='insert-sys-date') {
       // if(this.info.key==='insert-sys-date') {
-
+        // console.log(this.selectEdbInfo,'this.selectEdbInfo');
+        // return 
         let valueParam = {
         let valueParam = {
           EdbInfoId: this.selectEdbInfo.EdbInfoId||0,
           EdbInfoId: this.selectEdbInfo.EdbInfoId||0,
           MoveForward: this.formData.MoveForward,
           MoveForward: this.formData.MoveForward,
           DateChange: this.$refs.dateMoveWayRef.dateChangeArr
           DateChange: this.$refs.dateMoveWayRef.dateChangeArr
         }
         }
-
         let { Data } = await sheetInterface.getSystemDate({
         let { Data } = await sheetInterface.getSystemDate({
           DataTimeType: this.dateChangeSelect,
           DataTimeType: this.dateChangeSelect,
           Value: JSON.stringify(valueParam)
           Value: JSON.stringify(valueParam)
         })
         })
         
         
+        // 获取原始指标来源
+        let baseSourceName=''
+        if(this.dateChangeSelect==2){
+          // 获取指标日期的指标的原始来源
+          await sheetInterface.getEdbBaseSource({
+            EdbInfoId:this.selectEdbInfo.EdbInfoId
+          }).then(res=>{
+            if(res.Ret == 200){
+              baseSourceName = res.Data.ExcelSource || ''
+            }
+          })
+        }
+
+
         backData = {
         backData = {
           insertValue: Data.Date,
           insertValue: Data.Date,
           dataTimeType: this.dateChangeSelect,
           dataTimeType: this.dateChangeSelect,
-          str: JSON.stringify(valueParam)
+          str: JSON.stringify(valueParam),
+          sourceName:baseSourceName||''
         }
         }
       // }else { //指标日期
       // }else { //指标日期
       //   backData = {
       //   backData = {

+ 12 - 3
src/views/datasheet_manage/components/selectTargetValueDia.vue

@@ -166,7 +166,6 @@ export default {
     //插入值的时候再去计算结果
     //插入值的时候再去计算结果
     async insertData() {
     async insertData() {
       if(!this.edbInfo) return this.$message.warning(this.$t('ETableChildren.select_metric_first_msg') )
       if(!this.edbInfo) return this.$message.warning(this.$t('ETableChildren.select_metric_first_msg') )
-
       let Date='';
       let Date='';
       if(this.dateSelectForm.Type===2) { //选框为表格日期再去取Date
       if(this.dateSelectForm.Type===2) { //选框为表格日期再去取Date
         Date = this.dateSelectForm.relationDate;
         Date = this.dateSelectForm.relationDate;
@@ -181,11 +180,20 @@ export default {
       if(res.Ret !== 200) return
       if(res.Ret !== 200) return
 
 
       this.result = res.Data;
       this.result = res.Data;
-
       let value = (this.result.List&&this.result.List.length)
       let value = (this.result.List&&this.result.List.length)
         ? this.result.List.find(_ => _.DataTime===this.result.Date) ? this.result.List.find(_ => _.DataTime===this.result.Date).Value.toString() : ''
         ? this.result.List.find(_ => _.DataTime===this.result.Date) ? this.result.List.find(_ => _.DataTime===this.result.Date).Value.toString() : ''
         : ''
         : ''
 
 
+      let baseSourceName=''
+      // 获取指标日期的指标的原始来源
+      await sheetInterface.getEdbBaseSource({
+        EdbInfoId:this.edbInfo.EdbInfoId
+      }).then(res=>{
+        if(res.Ret == 200){
+          baseSourceName = res.Data.ExcelSource || ''
+        }
+      })
+
       this.chooseItem = {
       this.chooseItem = {
         relationDate: Date,
         relationDate: Date,
         relationUid: this.dateSelectForm.Type===2 ? this.dateSelectForm.relationUid : '',
         relationUid: this.dateSelectForm.Type===2 ? this.dateSelectForm.relationUid : '',
@@ -194,7 +202,8 @@ export default {
         str: JSON.stringify({
         str: JSON.stringify({
           MoveForward: this.dateSelectForm.MoveForward,
           MoveForward: this.dateSelectForm.MoveForward,
           DateChange: this.$refs.dateMoveWayRef.dateChangeArr
           DateChange: this.$refs.dateMoveWayRef.dateChangeArr
-        })
+        }),
+        sourceName:baseSourceName||''
       }
       }
 
 
       this.$emit('insert',this.chooseItem)
       this.$emit('insert',this.chooseItem)

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

@@ -91,17 +91,45 @@
       ref="customTableRef"
       ref="customTableRef"
       @autoSave="autoSaveFun"
       @autoSave="autoSaveFun"
     />
     />
+    <div class="chart-source">
+      <span
+        v-if="sheetSourceFrom"
+        :style="`
+        color: ${sheetSourceFrom.isShow ? sheetSourceFrom.color : '#999'};
+        font-size: ${ sheetSourceFrom.fontSize }px;
+      `"
+      ><!-- 数据来源 -->{{$t('ETable.Common.data_source')}}:{{ sheetSourceFrom.text}}</span>
+      <el-switch
+        v-if="sheetSourceFrom"
+        v-model="sheetSourceFrom.isShow"
+        :active-value="true"
+        :inactive-value="false"
+        style="margin:0 15px;"
+        @change="(e) => {sheetSourceFrom.isShow=e,sheetForm.SourcesFrom=JSON.stringify(sheetSourceFrom)}"
+      />
+      <span class="editsty" @click="isShowSourceDialog=true"><!-- 编辑 -->{{$t('Common.edit_btn')}}</span>
+    </div>
+
+    <!-- 数据来源编辑弹窗 -->
+		<chartSourceEditDia
+			:isShow.sync="isShowSourceDialog"
+			:chartInfo="sheetForm"
+			@update="updateSheetSource"
+		/>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
 import * as sheetInterface from '@/api/modules/sheetApi.js';
 import * as sheetInterface from '@/api/modules/sheetApi.js';
 import { dataBaseInterface } from 'api/api.js';
 import { dataBaseInterface } from 'api/api.js';
+import {etaBaseConfigInterence} from '@/api/modules/etaBaseConfigApi.js';
 import selectTarget from '@/views/chartRelevance_manage/components/selectTarget.vue';
 import selectTarget from '@/views/chartRelevance_manage/components/selectTarget.vue';
 import CustomTable from './components/CustomTable.vue'
 import CustomTable from './components/CustomTable.vue'
 import html2canvas from 'html2canvas';
 import html2canvas from 'html2canvas';
+import chartSourceEditDia from '@/views/dataEntry_manage/components/chartSourceEditDialog.vue';
+
 export default {
 export default {
-  components: { selectTarget,CustomTable },
+  components: { selectTarget,CustomTable,chartSourceEditDia},
   beforeRouteEnter(to, from, next) {
   beforeRouteEnter(to, from, next) {
     if(to.query.id){
     if(to.query.id){
       to.matched[1].name=`编辑表格`
       to.matched[1].name=`编辑表格`
@@ -157,7 +185,10 @@ export default {
       isCanEdit:false,
       isCanEdit:false,
       sheetButton:'',
       sheetButton:'',
       // 取消自动保存,比如返回的时候
       // 取消自动保存,比如返回的时候
-      cancelAutoSave:false
+      cancelAutoSave:false,
+      sheetSourceFrom:null,
+      isShowSourceDialog:false,
+      showSourceFrom:true
     }
     }
   },
   },
   methods: {
   methods: {
@@ -169,7 +200,16 @@ export default {
 
 
     /* 获取表格详情 */
     /* 获取表格详情 */
     async getDetail() {
     async getDetail() {
-      if(!this.sheetId) return
+      if(!this.sheetId){
+        const res = await etaBaseConfigInterence.getBaseConfig()
+        if(res.Ret==200){
+          const Data = res.Data||{}
+          this.showSourceFrom = Data.ChartSourceDisplay==='true'?true:false
+        } 
+        this.sheetForm.SourcesFrom = this.setDefaultSource()
+        this.sheetSourceFrom = JSON.parse(this.sheetForm.SourcesFrom)
+        return
+      } 
 
 
       const res = await sheetInterface.sheetDetail({
       const res = await sheetInterface.sheetDetail({
 				ExcelInfoId: Number(this.sheetId)
 				ExcelInfoId: Number(this.sheetId)
@@ -184,13 +224,16 @@ export default {
         },1000)
         },1000)
         return 
         return 
       }
       }
-      const { ExcelName,ExcelClassifyId,ExcelType,TableData,ModifyTime,Button} = res.Data;
+      const { ExcelName,ExcelClassifyId,ExcelType,TableData,ModifyTime,Button,SourcesFrom,ExcelSource} = res.Data;
       this.sheetButton=Button
       this.sheetButton=Button
       this.sheetForm = {
       this.sheetForm = {
         name: ExcelName,
         name: ExcelName,
         classify: ExcelClassifyId,
         classify: ExcelClassifyId,
-        sheetType: ExcelType
+        sheetType: ExcelType,
+        SourcesFrom:SourcesFrom || this.setDefaultSource(ExcelSource)
       }
       }
+
+      this.sheetSourceFrom = JSON.parse(this.sheetForm.SourcesFrom)
       this.saveTime =  this.$moment(ModifyTime).format('YYYY-MM-DD HH:mm:ss')
       this.saveTime =  this.$moment(ModifyTime).format('YYYY-MM-DD HH:mm:ss')
 
 
       this.$nextTick(()=>{
       this.$nextTick(()=>{
@@ -198,11 +241,17 @@ export default {
       })
       })
       this.$refs.customTableRef.initSheetData(TableData);
       this.$refs.customTableRef.initSheetData(TableData);
     },
     },
-
+    setDefaultSource(sourceText){
+      return JSON.stringify({
+        isShow: this.showSourceFrom,
+        text: sourceText,
+        color: "#606266",
+        fontSize: 9
+      })
+    },
     /* 选择指标push指标数组 */
     /* 选择指标push指标数组 */
     async handleSelectTarget(e) {
     async handleSelectTarget(e) {
       if(!e) return
       if(!e) return
-
       const { EdbName,EdbNameEn,UnitEn,EdbInfoId,Unit,Frequency } = e;
       const { EdbName,EdbNameEn,UnitEn,EdbInfoId,Unit,Frequency } = e;
       if(this.$refs.customTableRef.config.data.find(_ => _.EdbInfoId===EdbInfoId)) return this.$message.warning(this.$t('OnlineExcelPage.already_exists_msg') )
       if(this.$refs.customTableRef.config.data.find(_ => _.EdbInfoId===EdbInfoId)) return this.$message.warning(this.$t('OnlineExcelPage.already_exists_msg') )
       
       
@@ -217,7 +266,7 @@ export default {
         SortType: this.$refs.customTableRef.config.order===1 ? 'desc' : 'asc',
         SortType: this.$refs.customTableRef.config.order===1 ? 'desc' : 'asc',
         Num: 12
         Num: 12
       })
       })
-      
+      this.updateSourceFrom(Data.ExcelSource)
       this.$refs.customTableRef.updateEdbData({
       this.$refs.customTableRef.updateEdbData({
         Data: Data.Data.map(_ => ({..._,DataTimeType: 1,})),
         Data: Data.Data.map(_ => ({..._,DataTimeType: 1,})),
         EdbAliasName: '',
         EdbAliasName: '',
@@ -253,7 +302,8 @@ export default {
         ExcelClassifyId: classify,
         ExcelClassifyId: classify,
         ExcelImage:'',
         ExcelImage:'',
         Source: 3,
         Source: 3,
-        TableData: this.$refs.customTableRef.getSaveParams()
+        TableData: this.$refs.customTableRef.getSaveParams(),
+        SourcesFrom:this.sheetForm.SourcesFrom
       };
       };
       // console.log("自动保存");
       // console.log("自动保存");
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
@@ -295,7 +345,8 @@ export default {
         ExcelClassifyId: classify,
         ExcelClassifyId: classify,
         ExcelImage: Data.ResourceUrl,
         ExcelImage: Data.ResourceUrl,
         Source: 2,
         Source: 2,
-        TableData: this.$refs.customTableRef.getSaveParams()
+        TableData: this.$refs.customTableRef.getSaveParams(),
+        SourcesFrom:this.sheetForm.SourcesFrom
       };
       };
 
 
       let isAdd = this.sheetId?false:true
       let isAdd = this.sheetId?false:true
@@ -331,7 +382,20 @@ export default {
     //   sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
     //   sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
     //     if(res.Ret != 200) return 
     //     if(res.Ret != 200) return 
     //   })
     //   })
-    // }
+    // },
+    updateSheetSource(value){
+      if(value){
+        this.sheetSourceFrom={...this.sheetSourceFrom,...value}
+        this.sheetForm.SourcesFrom=JSON.stringify(this.sheetSourceFrom)
+      }
+    },
+    updateSourceFrom(source){
+      if(!source) return
+      let concatSourceArr = this.sheetSourceFrom.text?`${this.sheetSourceFrom.text},${source}`.split(','):[source];
+      let sourceStr = Array.from(new Set(concatSourceArr)).join(',');
+      this.$set(this.sheetSourceFrom,'text',sourceStr)
+      this.sheetForm.SourcesFrom=JSON.stringify(this.sheetSourceFrom)
+    }
   },
   },
   created() {
   created() {
     this.getClassify();
     this.getClassify();
@@ -350,6 +414,8 @@ export default {
 .customSheet-wrap {
 .customSheet-wrap {
   min-height: calc(100vh - 120px);
   min-height: calc(100vh - 120px);
   min-width: 1020px;
   min-width: 1020px;
+  position: relative;
+  padding-bottom: 30px;
   .wrap-top {
   .wrap-top {
     // display: flex;
     // display: flex;
     // justify-content: space-between;
     // justify-content: space-between;
@@ -391,6 +457,10 @@ export default {
     }
     }
 
 
   }
   }
+  .chart-source{
+    position: absolute;
+    bottom: 0;
+  }
 }
 }
 </style>
 </style>
 <style lang="scss">
 <style lang="scss">

+ 76 - 8
src/views/datasheet_manage/mixedSheetEdit.vue

@@ -48,20 +48,49 @@
       </div>
       </div>
     </div>
     </div>
     
     
-    <MixedTable @autoSave="autoSaveFun"
+    <MixedTable @autoSave="autoSaveFun" @updateSourceName="updateSourceFromTable" :sourceFrom="sheetSourceFrom"
       ref="mixedTableRef"
       ref="mixedTableRef"
     />
     />
+    <div class="chart-source">
+      <span
+        v-if="sheetSourceFrom"
+        :style="`
+        color: ${sheetSourceFrom.isShow ? sheetSourceFrom.color : '#999'};
+        font-size: ${ sheetSourceFrom.fontSize }px;
+      `"
+      ><!-- 数据来源 -->{{$t('ETable.Common.data_source')}}:{{ sheetSourceFrom.text}}</span>
+      <el-switch
+        v-if="sheetSourceFrom"
+        v-model="sheetSourceFrom.isShow"
+        :active-value="true"
+        :inactive-value="false"
+        style="margin:0 15px;"
+        @change="(e) => {sheetSourceFrom.isShow=e,sheetForm.SourcesFrom=JSON.stringify(sheetSourceFrom)}"
+      />
+      <span class="editsty" @click="isShowSourceDialog=true"><!-- 编辑 -->{{$t('Common.edit_btn')}}</span>
+    </div>
+
+    <!-- 数据来源编辑弹窗 -->
+		<chartSourceEditDia
+			:isShow.sync="isShowSourceDialog"
+			:chartInfo="sheetForm"
+			@update="updateSheetSource"
+		/>
+
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
 import * as sheetInterface from '@/api/modules/sheetApi.js';
 import * as sheetInterface from '@/api/modules/sheetApi.js';
 import { dataBaseInterface } from 'api/api.js';
 import { dataBaseInterface } from 'api/api.js';
+import {etaBaseConfigInterence} from '@/api/modules/etaBaseConfigApi.js';
 import selectTarget from '@/views/chartRelevance_manage/components/selectTarget.vue';
 import selectTarget from '@/views/chartRelevance_manage/components/selectTarget.vue';
 import MixedTable from './components/MixedTable.vue'
 import MixedTable from './components/MixedTable.vue'
 import html2canvas from 'html2canvas';
 import html2canvas from 'html2canvas';
+import chartSourceEditDia from '@/views/dataEntry_manage/components/chartSourceEditDialog.vue';
+
 export default {
 export default {
-  components: { selectTarget,MixedTable },
+  components: { selectTarget,MixedTable,chartSourceEditDia },
   beforeRouteEnter(to, from, next) {
   beforeRouteEnter(to, from, next) {
     if(to.query.id){
     if(to.query.id){
       to.matched[1].name=`编辑表格`
       to.matched[1].name=`编辑表格`
@@ -120,6 +149,9 @@ export default {
       cancelAutoSave:false,
       cancelAutoSave:false,
 
 
       updating:false,//更新状态
       updating:false,//更新状态
+      sheetSourceFrom:null,
+      isShowSourceDialog:false,
+      showSourceFrom:true
     }
     }
   },
   },
   methods: {
   methods: {
@@ -131,7 +163,16 @@ export default {
 
 
     /* 获取表格详情 */
     /* 获取表格详情 */
     async getDetail(type='init') {
     async getDetail(type='init') {
-      if(!this.sheetId) return
+      if(!this.sheetId){
+        const res = await etaBaseConfigInterence.getBaseConfig()
+        if(res.Ret==200){
+          const Data = res.Data||{}
+          this.showSourceFrom = Data.ChartSourceDisplay==='true'?true:false
+        } 
+        this.sheetForm.SourcesFrom = this.setDefaultSource()
+        this.sheetSourceFrom = JSON.parse(this.sheetForm.SourcesFrom)
+        return
+      } 
 
 
       const res = await sheetInterface.sheetDetail({
       const res = await sheetInterface.sheetDetail({
 				ExcelInfoId: Number(this.sheetId)
 				ExcelInfoId: Number(this.sheetId)
@@ -150,12 +191,14 @@ export default {
         return 
         return 
       }
       }
 
 
-      const { ExcelName,ExcelClassifyId,TableData,ModifyTime,Button } = res.Data;
+      const { ExcelName,ExcelClassifyId,TableData,ModifyTime,Button,SourcesFrom,ExcelSource } = res.Data;
       this.sheetButton=Button
       this.sheetButton=Button
       this.sheetForm = {
       this.sheetForm = {
         name: ExcelName,
         name: ExcelName,
-        classify: ExcelClassifyId
+        classify: ExcelClassifyId,
+        SourcesFrom:SourcesFrom || this.setDefaultSource(ExcelSource)
       }
       }
+      this.sheetSourceFrom = this.sheetForm.SourcesFrom?JSON.parse(this.sheetForm.SourcesFrom):null
       this.$nextTick(()=>{
       this.$nextTick(()=>{
         this.sheetInit=true
         this.sheetInit=true
       })
       })
@@ -165,7 +208,14 @@ export default {
       
       
       type==='refresh' && this.$message.success(this.$t('OnlineExcelPage.table_data_update_msg') )
       type==='refresh' && this.$message.success(this.$t('OnlineExcelPage.table_data_update_msg') )
     },
     },
-
+    setDefaultSource(sourceText){
+      return JSON.stringify({
+        isShow: this.showSourceFrom,
+        text: sourceText,
+        color: "#606266",
+        fontSize: 9
+      })
+    },
     /* 获取分类 */
     /* 获取分类 */
     getClassify() {
     getClassify() {
       sheetInterface.excelClassifyOne({Source: 3}).then(res => {
       sheetInterface.excelClassifyOne({Source: 3}).then(res => {
@@ -187,7 +237,8 @@ export default {
         ExcelClassifyId: classify,
         ExcelClassifyId: classify,
         ExcelImage:'',
         ExcelImage:'',
         Source: 3,
         Source: 3,
-        TableData: this.$refs.mixedTableRef.getSaveParams()
+        TableData: this.$refs.mixedTableRef.getSaveParams(),
+        SourcesFrom:this.sheetForm.SourcesFrom
       };
       };
       console.log("自动保存");
       console.log("自动保存");
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
@@ -230,8 +281,10 @@ export default {
         ExcelClassifyId: classify,
         ExcelClassifyId: classify,
         ExcelImage: Data.ResourceUrl,
         ExcelImage: Data.ResourceUrl,
         Source: 3,
         Source: 3,
-        TableData: this.$refs.mixedTableRef.getSaveParams()
+        TableData: this.$refs.mixedTableRef.getSaveParams(),
+        SourcesFrom:this.sheetForm.SourcesFrom
       };
       };
+
       let isAdd = this.sheetId?false:true
       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 })
@@ -267,6 +320,15 @@ export default {
     //     if(res.Ret != 200) return 
     //     if(res.Ret != 200) return 
     //   })
     //   })
     // }
     // }
+    updateSheetSource(value){
+      if(value){
+        this.sheetSourceFrom={...this.sheetSourceFrom,...value}
+        this.sheetForm.SourcesFrom=JSON.stringify(this.sheetSourceFrom)
+      }
+    },
+    updateSourceFromTable(){
+      this.sheetForm.SourcesFrom=JSON.stringify(this.sheetSourceFrom)
+    }
   },
   },
   created() {
   created() {
     this.getClassify();
     this.getClassify();
@@ -285,6 +347,8 @@ export default {
 .customSheet-wrap {
 .customSheet-wrap {
   min-width: 1070px;
   min-width: 1070px;
   min-height: calc(100vh - 120px);
   min-height: calc(100vh - 120px);
+  position: relative;
+  padding-bottom: 30px;
   .wrap-top {
   .wrap-top {
     display: flex;
     display: flex;
     justify-content: space-between;
     justify-content: space-between;
@@ -309,5 +373,9 @@ export default {
       }
       }
     }
     }
   }
   }
+  .chart-source{
+    position: absolute;
+    bottom: 0;
+  }
 }
 }
 </style>
 </style>

+ 24 - 2
src/views/datasheet_manage/sheetList.vue

@@ -306,6 +306,15 @@
                 :disabled="true"
                 :disabled="true"
                 ref="mixedTableRef"
                 ref="mixedTableRef"
               />
               />
+              <div class="chart-source">
+                <span
+                  v-if="[2,3].includes(sheetDetailInfo.Source) && sheetDetailInfo.SourcesFrom && JSON.parse(sheetDetailInfo.SourcesFrom).isShow"
+                  :style="`
+                  color: ${JSON.parse(sheetDetailInfo.SourcesFrom).color};
+                  font-size: ${ JSON.parse(sheetDetailInfo.SourcesFrom).fontSize }px;
+                `"
+                ><!-- 数据来源 -->{{$t('ETable.Common.source')}}:{{ JSON.parse(sheetDetailInfo.SourcesFrom).text}}</span>
+              </div>
             </div>
             </div>
           </template>
           </template>
 
 
@@ -1062,7 +1071,10 @@ export default {
           this.sheetDetailInfo = res.Data;
           this.sheetDetailInfo = res.Data;
           this.saveTime = this.$moment(this.sheetDetailInfo.ModifyTime).format('YYYY-MM-DD HH:mm:ss')||''
           this.saveTime = this.$moment(this.sheetDetailInfo.ModifyTime).format('YYYY-MM-DD HH:mm:ss')||''
           this.editButtonText = this.sheetDetailInfo.CanEdit?'':`${this.sheetDetailInfo.Editor}${this.$t('OnlineExcelPage.editing_msg')}`
           this.editButtonText = this.sheetDetailInfo.CanEdit?'':`${this.sheetDetailInfo.Editor}${this.$t('OnlineExcelPage.editing_msg')}`
-
+          if(!this.sheetDetailInfo.SourcesFrom){
+            this.sheetDetailInfo.SourcesFrom = this.setDefaultSource(this.sheetDetailInfo.ExcelSource)
+          }
+          
           this.$nextTick(() => {
           this.$nextTick(() => {
             //sheet组件Mounted已经init一次,再次调用会导致工具栏样式错乱
             //sheet组件Mounted已经init一次,再次调用会导致工具栏样式错乱
             //this.sheetDetailInfo.Source === 1 && this.$refs.sheetRef.init();
             //this.sheetDetailInfo.Source === 1 && this.$refs.sheetRef.init();
@@ -1075,7 +1087,14 @@ export default {
           });
           });
         });
         });
     },
     },
-
+    setDefaultSource(sourceText){
+      return JSON.stringify({
+        isShow: true,
+        text: sourceText,
+        color: "#606266",
+        fontSize: 9
+      })
+    },
     /* 删除表格 */
     /* 删除表格 */
     delSheetHandle({cell, type = ""}) {
     delSheetHandle({cell, type = ""}) {
       const { ExcelClassifyId, ExcelInfoId  } = cell;
       const { ExcelClassifyId, ExcelInfoId  } = cell;
@@ -1419,6 +1438,9 @@ $normal-font: 14px;
           box-sizing: border-box;
           box-sizing: border-box;
           padding: 15px;
           padding: 15px;
           overflow-y: auto;
           overflow-y: auto;
+          display: flex;
+          flex-direction: column;
+          justify-content: space-between;
           /* min-height: 500px; */
           /* min-height: 500px; */
         }
         }
       }
       }

+ 0 - 1
src/views/futures_manage/commodityChartBase.vue

@@ -146,7 +146,6 @@
                 :span="21"
                 :span="21"
                 style="padding: 20px 0;"
                 style="padding: 20px 0;"
               >
               >
-                <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: 0;left: 0;">En</div>
                 <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                 <div class="chart-show-cont"  v-if="!chartInfo.WarnMsg">
                   <div class="chartWrapper" id="chartWrapper">
                   <div class="chartWrapper" id="chartWrapper">
                     <h2 class="chart-title">{{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}</h2>
                     <h2 class="chart-title">{{ currentLang==='en'?(chartInfo.ChartNameEn||chartInfo.ChartName):chartInfo.ChartName }}</h2>

+ 0 - 1
src/views/mychart_manage/components/chartDetailDia.vue

@@ -220,7 +220,6 @@
           </div>
           </div>
           <div class="cont-bottom" v-loading="refreshLoading">
           <div class="cont-bottom" v-loading="refreshLoading">
 
 
-            <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: unset;left:unset;">En</div>
             <div class="chart-show-cont">
             <div class="chart-show-cont">
               <div class="chartWrapper" id="chartWrapper">
               <div class="chartWrapper" id="chartWrapper">
                 <template v-if="!chartInfo.WarnMsg">
                 <template v-if="!chartInfo.WarnMsg">

+ 0 - 1
src/views/mychart_manage/index.vue

@@ -198,7 +198,6 @@
             >
             >
               <el-card class="public-chart-item">
               <el-card class="public-chart-item">
                 <div slot="header" class="item-top">
                 <div slot="header" class="item-top">
-                  <div class="chartEn-mark" v-show="chart.IsEnChart" style="top: -10px;left: -10px;">En</div>
                   <span class="text_oneLine" :style="{'padding-left':chart.IsEnChart?'24px':''}">{{ chart_lang === 'en' ? (chart.ChartNameEn||chart.ChartName) : chart.ChartName }}</span>
                   <span class="text_oneLine" :style="{'padding-left':chart.IsEnChart?'24px':''}">{{ chart_lang === 'en' ? (chart.ChartNameEn||chart.ChartName) : chart.ChartName }}</span>
                   <img
                   <img
                     v-if="ispublic === 0"
                     v-if="ispublic === 0"

+ 41 - 25
src/views/ppt_manage/mixins/mixins.js

@@ -204,14 +204,20 @@ export default {
         //数据列
         //数据列
         let obj = {
         let obj = {
           data: [],
           data: [],
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'spline',
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'spline',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: sameSideIndex,
           yAxis: sameSideIndex,
           name:nameCh,
           name:nameCh,
           nameCh:nameCh,
           nameCh:nameCh,
           nameEn:nameEn,
           nameEn:nameEn,
           color: item.ChartColor,
           color: item.ChartColor,
-          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptions.lineWidth),
+          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptionList[index].lineWidth),
+          marker: chartTheme && chartTheme.lineOptionList[index].dataMark && chartTheme.lineOptionList[index].dataMark!='none'?{
+            enabled:true,
+            symbol: chartTheme.lineOptionList[index].markType || 'circle',
+            fillColor:chartTheme.lineOptionList[index].markColor,
+            radius: chartTheme.lineOptionList[index].markSize
+          }:{},
           ...predict_params
           ...predict_params
         };
         };
         item.DataList = item.DataList || [];
         item.DataList = item.DataList || [];
@@ -437,12 +443,15 @@ export default {
        /* 主题样式*/
        /* 主题样式*/
       const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
       const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
 
 
-
       // 农历数据需要去除第一项 在ETA1.0.5之后,除了这里 农历和公历处理逻辑一样
       // 农历数据需要去除第一项 在ETA1.0.5之后,除了这里 农历和公历处理逻辑一样
       const temChartDataList=chartData.DataList||[]
       const temChartDataList=chartData.DataList||[]
       const chartDataHandle=this.calendar_type === '农历'?
       const chartDataHandle=this.calendar_type === '农历'?
       temChartDataList.filter((item, index) => index > 0):
       temChartDataList.filter((item, index) => index > 0):
       temChartDataList
       temChartDataList
+
+      // 跟颜色对应
+      chartTheme.lineOptionList=chartTheme.lineOptionList.reverse().slice(-chartDataHandle.length)
+
       let seasonYdata = [],
       let seasonYdata = [],
         seasonData = []
         seasonData = []
 
 
@@ -451,17 +460,24 @@ export default {
         minLimit = this.chartLimit.min||0
         minLimit = this.chartLimit.min||0
         maxLimit = this.chartLimit.max||0
         maxLimit = this.chartLimit.max||0
       //数据列
       //数据列
-      for (let j of chartDataHandle) {
+      for (let index in chartDataHandle) {
+        let j = chartDataHandle[index]
           //预测指标配置
           //预测指标配置
         let predict_params =  chartData.EdbInfoCategoryType === 1 ? this.getSeasonPredictParams(j.CuttingDataTimestamp) : {};
         let predict_params =  chartData.EdbInfoCategoryType === 1 ? this.getSeasonPredictParams(j.CuttingDataTimestamp) : {};
 
 
         let serie_item = {
         let serie_item = {
           data: [],
           data: [],
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || chartData.ChartStyle,
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || chartData.ChartStyle,
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: 0,
           yAxis: 0,
           name: j.ChartLegend,
           name: j.ChartLegend,
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 1,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth) || 1,
+          marker: chartTheme && chartTheme.lineOptionList[index].dataMark && chartTheme.lineOptionList[index].dataMark!='none'?{
+            enabled:true,
+            symbol: chartTheme.lineOptionList[index].markType || 'circle',
+            fillColor:chartTheme.lineOptionList[index].markColor,
+            radius: chartTheme.lineOptionList[index].markSize
+          }:{},
           ...predict_params
           ...predict_params
         };
         };
         const data_array = _.cloneDeep(j.DataList);
         const data_array = _.cloneDeep(j.DataList);
@@ -673,7 +689,7 @@ export default {
         chartType: 'linear',
         chartType: 'linear',
         color: ChartColor,
         color: ChartColor,
         marker: {
         marker: {
-          radius: (chartTheme&&chartTheme.lineOptions.radius)||5,
+          radius: (chartTheme&&chartTheme.lineOptionList[0].radius)||5,
         },
         },
       }
       }
       real_data.forEach(_ => {
       real_data.forEach(_ => {
@@ -882,21 +898,21 @@ export default {
       }
       }
 
 
       //数据列
       //数据列
-      data.forEach(item => {
+      data.forEach((item,index) => {
         //处理首或/尾全是无效数据的以null填充
         //处理首或/尾全是无效数据的以null填充
         let filterData = this.filterInvalidData(item)
         let filterData = this.filterInvalidData(item)
 
 
         let serie_item = {
         let serie_item = {
           data: filterData,
           data: filterData,
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'spline',
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'spline',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: 0,
           yAxis: 0,
           name: item.Name,
           name: item.Name,
           nameCh: item.Name,
           nameCh: item.Name,
           nameEn: item.NameEn,
           nameEn: item.NameEn,
           color: item.Color,
           color: item.Color,
           chartType: 'linear',
           chartType: 'linear',
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 3,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth) || 3,
           marker: {
           marker: {
             enabled: false
             enabled: false
           }
           }
@@ -1100,18 +1116,18 @@ export default {
 
 
       //处理series
       //处理series
       let seriesData=[]
       let seriesData=[]
-      this.relevanceChartData.YDataList.forEach(item=>{
+      this.relevanceChartData.YDataList.forEach((item,index)=>{
         let serie_item = {
         let serie_item = {
           data: item.Value,
           data: item.Value,
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'spline',
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'spline',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: 0,
           yAxis: 0,
           name: item.Name,
           name: item.Name,
           nameCh: item.Name,
           nameCh: item.Name,
           nameEn: item.NameEn,
           nameEn: item.NameEn,
           color: item.Color,
           color: item.Color,
           chartType: 'linear',
           chartType: 'linear',
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 3,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth) || 3,
           marker: {
           marker: {
             enabled: false
             enabled: false
           }
           }
@@ -1237,7 +1253,7 @@ export default {
           chartType: 'linear',
           chartType: 'linear',
           zIndex:1,
           zIndex:1,
           marker: {
           marker: {
-            radius: (chartTheme&&chartTheme.lineOptions.radius)||5,
+            radius: (chartTheme&&chartTheme.lineOptionList.radius)||5,
           },
           },
         }
         }
         item.EdbInfoList.forEach(_ => {
         item.EdbInfoList.forEach(_ => {
@@ -1403,14 +1419,14 @@ export default {
 
 
         let series_item = {
         let series_item = {
           data: item.Value.map(_ =>[_.X,_.Y]),
           data: item.Value.map(_ =>[_.X,_.Y]),
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'spline',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'spline',
           yAxis: index,
           yAxis: index,
           name: item.Name,
           name: item.Name,
           nameCh: item.Name,
           nameCh: item.Name,
           nameEn: item.NameEn||item.Name,
           nameEn: item.NameEn||item.Name,
           color: item.Color,
           color: item.Color,
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth)||3,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth)||3,
           chartType: 'linear',
           chartType: 'linear',
           zIndex:1
           zIndex:1
         }
         }
@@ -1665,18 +1681,18 @@ export default {
 
 
       //系列
       //系列
       let series = [];
       let series = [];
-      YDataList.forEach(item => {
+      YDataList.forEach((item,index) => {
         let serie_item = {
         let serie_item = {
           data: item.Value,
           data: item.Value,
           pointPlacement: 'on',
           pointPlacement: 'on',
-          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'line',
-          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          type: (chartTheme&&chartTheme.lineOptionList[index].lineType) || 'line',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[index].dashStyle)||'Solid',
           yAxis: 0,
           yAxis: 0,
           name: item.Name || item.Date,
           name: item.Name || item.Date,
           nameCh: item.Name || item.Date,
           nameCh: item.Name || item.Date,
           nameEn: item.Date,
           nameEn: item.Date,
           color: item.Color,
           color: item.Color,
-          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 1,
+          lineWidth: (chartTheme&&chartTheme.lineOptionList[index].lineWidth) || 1,
           chartType: 'linear'
           chartType: 'linear'
         };
         };
         series.push(serie_item)
         series.push(serie_item)

+ 103 - 8
src/views/ppt_manage/mixins/pptEditorMixins.js

@@ -8,6 +8,23 @@ import {dataBaseInterface} from "@/api/api.js"
 import * as sheetInterface from '@/api/modules/sheetApi.js';
 import * as sheetInterface from '@/api/modules/sheetApi.js';
 import {createRandomCode,checkPPTpageElemant,getChartInfo} from '../newVersion/utils/untils';
 import {createRandomCode,checkPPTpageElemant,getChartInfo} from '../newVersion/utils/untils';
 import {modelInfo,defaultPosition} from '../newVersion/utils/config';
 import {modelInfo,defaultPosition} from '../newVersion/utils/config';
+import {titleDefault} from '../newVersion/utils/tinymceSetting';
+function getAllParentNodes(event) {
+    let parentNodes = [];
+    let currentNode = event;
+
+    while (currentNode) {
+        parentNodes.push(currentNode);
+        currentNode = currentNode.parentNode;
+    }
+
+    return parentNodes;
+}
+function NodeCheck(dom,className){
+    const classList = getAllParentNodes(dom).map(d=>d.className)
+    return classList.includes(className)
+}
+let __click__title__outside = null
 export default{
 export default{
   data(){
   data(){
     return {
     return {
@@ -26,7 +43,9 @@ export default{
       refreshLoading:null,//一键刷新的loading
       refreshLoading:null,//一键刷新的loading
       refreshBtnLoading:false,//一键刷新的按钮loading
       refreshBtnLoading:false,//一键刷新的按钮loading
 
 
-      isEditTitle:false,
+      isEditTitle:false,//是否是标题编辑模式
+      titleSetting:null,//存储应用整个PPT的值
+
     }
     }
   },
   },
   directives: {
   directives: {
@@ -48,16 +67,66 @@ export default{
         document.removeEventListener('click',el.__click__outside)
         document.removeEventListener('click',el.__click__outside)
       }
       }
     },
     },
+    'click-title-outside':{
+        bind(el,binding,vnode){
+            const clickHandle = (e)=>{
+                //点击标题区域和标题设置之外的地方,退出标题编辑模式
+                if(!vnode.context.isEditTitle) return
+                if(NodeCheck(e.target,'title-edit-box')||NodeCheck(e.target,'title-editor')){
+                  return false
+                }
+                if(binding.value && typeof binding.value === 'function'){
+                  binding.value(e)
+                }
+              }
+              __click__title__outside = clickHandle
+              document.addEventListener('click',clickHandle)
+        },
+        unbind(el,binding,vnode){
+            document.removeEventListener('click',__click__title__outside)
+        }
+    }
   },
   },
   methods:{
   methods:{
+    testInput(e,item){
+        const text = e.target.innerHTML
+        item.title = text
+    },
+    exitEditTitle(e){
+        this.isEditTitle = false
+    },
     //切换标题编辑模式
     //切换标题编辑模式
-    handleEditTitle(){
+    handleEditTitle(item){
         //判断当前ppt是否添加了页面
         //判断当前ppt是否添加了页面
         if(this.pageList.length===0){
         if(this.pageList.length===0){
-        this.$message.warning(this.$t('Slides.msg_page_at_least_one'))
-        return
+            this.$message.warning(this.$t('Slides.msg_page_at_least_one'))
+            return
+        }
+        //如果点击的页不是当前页,将点击页切换至当前页
+        if(this.currentItem.id!==item.id){
+            //this.changeCurrentItem(item,'change')
+            const {id} = item
+            this.isEditLayer = false
+            this.activeLayerEl = {}
+            this.isEditTitle = false
+            
+            this.pageList.map((item,index)=>{
+                if(item.id===id){
+                    this.currentItem = item
+                    this.currentIndex = index
+                }
+            })
+            let height = $('.ppt-editor-item')[0].offsetHeight
+            const index = this.currentIndex
+            //pptEditor的滚动条动画
+            this.$refs.pptEditor.scrollTo({
+                top:height*index,
+                left:0,
+                behavior: 'smooth'
+            })
         }
         }
-        this.isEditTitle = !this.isEditTitle
+        //this.isEditTitle = !this.isEditTitle
+        this.isEditTitle = true
         if(this.isEditTitle){
         if(this.isEditTitle){
             //进入标题编辑模式,需要退出其他模式
             //进入标题编辑模式,需要退出其他模式
             this.isEditLayer = false
             this.isEditLayer = false
@@ -65,7 +134,7 @@ export default{
             
             
             //初始化该页标题的数据
             //初始化该页标题的数据
             if(!this.currentItem.titleDetail){
             if(!this.currentItem.titleDetail){
-                this.currentItem.titleDetail = {top:5.5,left:10,width:68,height:7}
+                this.currentItem.titleDetail = this.titleSetting?_.cloneDeep(this.titleSetting):_.cloneDeep(titleDefault)
                 this.$set(this.pageList,this.currentIndex,this.currentItem) 
                 this.$set(this.pageList,this.currentIndex,this.currentItem) 
             }
             }
             
             
@@ -81,7 +150,7 @@ export default{
         this.$set(this.pageList,this.currentIndex,this.currentItem) 
         this.$set(this.pageList,this.currentIndex,this.currentItem) 
     },
     },
     //获取标题样式 需要存一份px单位
     //获取标题样式 需要存一份px单位
-    handleTitelStyleChange({top,left,width,height}){
+    handleTitelStyleChange({top,left,width,height,color,fontSize,fontFamily}){
         const baseWidth = 900
         const baseWidth = 900
         const baseHeight = 630
         const baseHeight = 630
         this.currentItem.titleDetail = {
         this.currentItem.titleDetail = {
@@ -89,9 +158,11 @@ export default{
             baseTop:baseHeight*top/100,//px单位,基准为编辑页的ppt大小
             baseTop:baseHeight*top/100,//px单位,基准为编辑页的ppt大小
             baseLeft:baseWidth*left/100,
             baseLeft:baseWidth*left/100,
             baseWidth:baseWidth*width/100,
             baseWidth:baseWidth*width/100,
-            baseHeight:baseHeight*height/100
+            baseHeight:baseHeight*height/100,
+            fontFamily,fontSize,color
         }
         }
         this.$set(this.pageList,this.currentIndex,this.currentItem) 
         this.$set(this.pageList,this.currentIndex,this.currentItem) 
+
     },
     },
     //全局改变标题位置
     //全局改变标题位置
     changePositionAll({left,top}){
     changePositionAll({left,top}){
@@ -137,8 +208,30 @@ export default{
                 baseLeft:baseLeft||defaultWidth*left/100,
                 baseLeft:baseLeft||defaultWidth*left/100,
             }
             }
         })
         })
+        //this.$message.success(this.$t('MsgPrompt.set_success_msg'))
+    },
+    //全局改变标题设置,并存储本次设置
+    changeSettingAll(detail){
+        this.titleSetting = detail
+        this.settingAllPage()
         this.$message.success(this.$t('MsgPrompt.set_success_msg'))
         this.$message.success(this.$t('MsgPrompt.set_success_msg'))
     },
     },
+    settingAllPage(){
+        const baseWidth = 900
+        const baseHeight = 630
+        this.pageList.forEach((page,index)=>{
+            const {top=6.6,left=10,width=68,height=5,color='#333',fontFamily='helvetica',fontSize=22} = this.titleSetting
+            page.titleDetail = {
+                top,left,width,height,
+                baseTop:baseHeight*top/100,//px单位,基准为编辑页的ppt大小
+                baseLeft:baseWidth*left/100,
+                baseWidth:baseWidth*width/100,
+                baseHeight:baseHeight*height/100,
+                color,fontFamily,fontSize
+            }
+            this.$set(this.pageList,index,page)
+        })
+    },
     //显示切换模板弹窗
     //显示切换模板弹窗
     handleChangeFormat(item){
     handleChangeFormat(item){
       this.choosedItem = item
       this.choosedItem = item
@@ -204,6 +297,7 @@ export default{
         modelId: modelId,
         modelId: modelId,
         title:this.choosedItem.title,
         title:this.choosedItem.title,
         elements: elements,
         elements: elements,
+        titleDetail:this.titleSetting?this.titleSetting:null
       }
       }
       //把这页删掉,添加新的一页
       //把这页删掉,添加新的一页
       const index = this.pageList.findIndex((i) => i.id === this.choosedItem.id); 
       const index = this.pageList.findIndex((i) => i.id === this.choosedItem.id); 
@@ -234,6 +328,7 @@ export default{
       list.forEach(page=>{
       list.forEach(page=>{
         page.id = createRandomCode()
         page.id = createRandomCode()
         page.elements = checkPPTpageElemant(page)
         page.elements = checkPPTpageElemant(page)
+        page.titleDetail = this.titleSetting?this.titleSetting:null
         pages.push(page)
         pages.push(page)
       })
       })
       //当前PPT没有页
       //当前PPT没有页

+ 63 - 14
src/views/ppt_manage/mixins/pptMixins.js

@@ -83,13 +83,24 @@ export default {
     }
     }
   },
   },
   methods: {
   methods: {
+    getBasePosition(titleDetail){
+        const {top=6.6,left=10,width=68,height=5} = titleDetail
+        const baseWidth = 900
+        const baseHeight = 630
+        return {
+            baseTop:baseHeight*top/100,
+            baseLeft:baseWidth*left/100,
+            baseWidth:baseWidth*width/100,
+            baseHeight:baseHeight*height/100,
+        }
+    },
     //配置自定义标题内容
     //配置自定义标题内容
     setPPTTitle(slide,page){
     setPPTTitle(slide,page){
         const {titleDetail,title} = page
         const {titleDetail,title} = page
         //兼容之前的ppt
         //兼容之前的ppt
         if(!titleDetail){
         if(!titleDetail){
             slide.addText(title, {
             slide.addText(title, {
-                placeholder:"slideTitle",
+                /* placeholder:"slideTitle", */
                 x:'10%',
                 x:'10%',
                 y:'5.5%',
                 y:'5.5%',
                 w:'68%',
                 w:'68%',
@@ -97,16 +108,19 @@ export default {
                 color:'333333'
                 color:'333333'
               });
               });
         }else{
         }else{
-            const {left,top,width,height} = titleDetail
+            const {left,top,width,height,color='#333',fontSize=24,fontFamily} = titleDetail
             const text = toTextProps(toJson(title))
             const text = toTextProps(toJson(title))
+            const colorObj = color.includes('#')?{color:'333333',transparency:0}:rgbaToHex(color)
             slide.addText(text,{
             slide.addText(text,{
-                /* placeholder:"slideTitle", */ //加上后会走母版slideTitle的设置
+                /* placeholder:"slideTitle", //加上后会走母版slideTitle的设置 */
                 x:left+'%',
                 x:left+'%',
                 y:top+'%',
                 y:top+'%',
                 w:width+'%',
                 w:width+'%',
                 h:height+'%',
                 h:height+'%',
-                color:'333333',
-                fontSize:12
+                color:colorObj.color,
+                transparency:colorObj.transparency,
+                fontSize:fontSize*0.7,
+                fontFace:fontFamily,
             })
             })
         }
         }
         return slide
         return slide
@@ -201,7 +215,8 @@ export default {
             ModifyTime,
             ModifyTime,
             PublishTime,
             PublishTime,
             Editor,
             Editor,
-            CoverContent
+            CoverContent,
+            TitleSetting
         } = res.Data
         } = res.Data
         const pptDate = formatPPTDate(this.currentLang, PptDate)
         const pptDate = formatPPTDate(this.currentLang, PptDate)
         let legalContent = JSON.parse(Content)
         let legalContent = JSON.parse(Content)
@@ -209,6 +224,14 @@ export default {
             page.elements = checkPPTpageElemant(page)
             page.elements = checkPPTpageElemant(page)
             return page
             return page
         })
         })
+        let legalTitleSetting = null
+        try{
+            legalTitleSetting = JSON.parse(TitleSetting)
+        }catch(e){
+            console.log(e)
+            legalTitleSetting = null
+        }
+        
         this.pptCoverContent = CoverContent
         this.pptCoverContent = CoverContent
         this.result = {
         this.result = {
             status: 200,
             status: 200,
@@ -224,7 +247,8 @@ export default {
             ModifyTime,
             ModifyTime,
             PublishTime,
             PublishTime,
             Editor,
             Editor,
-            CoverContent
+            CoverContent,
+            TitleSetting:legalTitleSetting
         }
         }
       }else{
       }else{
         this.result = {status:'',content:'获取ppt数据失败!'}
         this.result = {status:'',content:'获取ppt数据失败!'}
@@ -513,6 +537,7 @@ export default {
       const sheetElements = page.elements.filter((item)=>{
       const sheetElements = page.elements.filter((item)=>{
         return item.type === 'sheet'
         return item.type === 'sheet'
       })
       })
+      this.initPageTitle(page)
       if(type==='edit'){
       if(type==='edit'){
         this.initTexts(textElements,page)
         this.initTexts(textElements,page)
       }
       }
@@ -522,6 +547,16 @@ export default {
       await this.listHandle(chartElements);
       await this.listHandle(chartElements);
       this.initCharts(chartElements, page);
       this.initCharts(chartElements, page);
     },
     },
+    //初始化内页标题
+    initPageTitle(page){
+        const index = this.pageList.findIndex((i) => i.id === page.id)
+        this.$nextTick(()=>{
+            const dom = document.getElementById(`page_title__${index}`)
+            if(dom){
+                dom.innerHTML = page.title
+            }
+        })
+    },
     //图表,表格数据统一加载,不按照页
     //图表,表格数据统一加载,不按照页
     async initPPTAllPage(pageList){
     async initPPTAllPage(pageList){
         let chartElements = []
         let chartElements = []
@@ -583,7 +618,8 @@ export default {
     async sheetListHandle(sheetElements){
     async sheetListHandle(sheetElements){
       let needGetDataArr = []
       let needGetDataArr = []
       for(let i=0;i<sheetElements.length;i++){
       for(let i=0;i<sheetElements.length;i++){
-        if(!this.sheetDataMap[sheetElements[i].sheetId]&&!needGetDataArr.includes(sheetElements[i].sheetId)){
+        if( (!this.sheetDataMap[sheetElements[i].sheetId] || !this.sheetDataMap[sheetElements[i].sheetId].list) 
+          && !needGetDataArr.includes(sheetElements[i].sheetId)){
             needGetDataArr.push(sheetElements[i].sheetId)
             needGetDataArr.push(sheetElements[i].sheetId)
         }
         }
       }
       }
@@ -615,13 +651,26 @@ export default {
 				UniqueCode: id
 				UniqueCode: id
 			})
 			})
       if(res.Ret !== 200) return 0
       if(res.Ret !== 200) return 0
-      const {TableInfo} = res.Data
+      const {TableInfo,SourcesFrom,ExcelSource} = res.Data
       //console.log('get')
       //console.log('get')
-      this.sheetDataMap[id] = _.cloneDeep(TableInfo.TableDataList)
+      this.sheetDataMap[id] ={
+        list:_.cloneDeep(TableInfo.TableDataList),
+        otherParams:{
+          SourcesFrom:SourcesFrom?SourcesFrom:
+                      ExcelSource?this.setDefaultSource(ExcelSource):''
+        }
+      }
       return 1
       return 1
     },
     },
+    setDefaultSource(sourceText){
+      return JSON.stringify({
+        isShow: true,
+        text: sourceText,
+        color: "#606266",
+        fontSize: 9
+      })
+    },
     initCharts(elements, page) {
     initCharts(elements, page) {
-        console.log('initCharts')
       const index = this.pageList.findIndex((i) => i.id === page.id)
       const index = this.pageList.findIndex((i) => i.id === page.id)
       if(index===-1) return
       if(index===-1) return
       elements.forEach((item) => {
       elements.forEach((item) => {
@@ -1135,8 +1184,8 @@ export default {
 			this.setEnName = false
 			this.setEnName = false
 		},
 		},
 
 
-    /* 生成ppt时图表追加底部文字 来源/说明 */
-    transChartBottomInfo(slide,{x,y,width,height},data) {
+    /* 生成ppt时 图表、表格 追加底部文字 来源/说明 */
+    transBottomInfo(slide,{x,y,width,height},data) {
       let chartData = data;
       let chartData = data;
       let yPercent = Number(Math.ceil(height.replace(/%/,''))+Math.ceil(y.replace(/%/,'')))+'%';
       let yPercent = Number(Math.ceil(height.replace(/%/,''))+Math.ceil(y.replace(/%/,'')))+'%';
       // console.log(yPercent)
       // console.log(yPercent)
@@ -1149,7 +1198,7 @@ export default {
                     ? sourceObj.color.substring(1).length<6 
                     ? sourceObj.color.substring(1).length<6 
                     ? '000000':sourceObj.color.substring(1)
                     ? '000000':sourceObj.color.substring(1)
                     : '666666'
                     : '666666'
-        slide.addText(`来源:${sourceObj.text}`,{
+        slide.addText(`${this.$t('ETable.Common.source')}:${sourceObj.text}`,{
           x:x,
           x:x,
           y: yPercent,
           y: yPercent,
           w: width,
           w: width,

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

@@ -23,14 +23,19 @@
               <!-- 自定义标题 -->
               <!-- 自定义标题 -->
               <div class="custom-title-wrap editor-content" 
               <div class="custom-title-wrap editor-content" 
                     :style="item.titleDetail?{
                     :style="item.titleDetail?{
-                        left:item.titleDetail.baseLeft+'px',
-                        top:item.titleDetail.baseTop+'px',
-                        width:item.titleDetail.baseWidth+'px',
-                        height:item.titleDetail.baseHeight+'px',
+                        left:(item.titleDetail.baseLeft||90)*contentScale+'px',
+                        top:(item.titleDetail.baseTop||40.9)*contentScale+'px',
+                        width:(item.titleDetail.baseWidth||612)+'px',
+                        height:(item.titleDetail.baseHeight||30.9)+'px',
                     }:{
                     }:{
-                        left:'90px',top:'34.65px',width:'612px',height:'44.1px'
+                        left:90*contentScale+'px',top:40.9*contentScale+'px',width:'612px',height:'30.9px'
                     }">
                     }">
-                    <div class="title" v-html="item.title"></div>
+                    <div class="title" v-html="item.title"
+                    :style="item.titleDetail?{
+                        color:item.titleDetail.color||'#333',
+                        fontSize:(item.titleDetail.fontSize||22)+'px',
+                        fontFamily:item.titleDetail.fontFamily||'helvetica'
+                    }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"></div>
                 </div>
                 </div>
               <component  :is="getComponentName(item.modelId)"
               <component  :is="getComponentName(item.modelId)"
                           :ref="`pptPage_${index-1}`"
                           :ref="`pptPage_${index-1}`"
@@ -156,6 +161,12 @@ export default {
       await this.initPPTAllPage(this.pageList)
       await this.initPPTAllPage(this.pageList)
       for(let i=0;i<this.pageList.length;i++){
       for(let i=0;i<this.pageList.length;i++){
         if(this.interruptLoad) return
         if(this.interruptLoad) return
+        if(this.pageList[i].titleDetail){
+            this.pageList[i].titleDetail = {
+                ...this.pageList[i].titleDetail,
+                ...this.getBasePosition(this.pageList[i].titleDetail)
+            }
+        }
         this.loadArr.push(this.pageList[i])
         this.loadArr.push(this.pageList[i])
         await this.initPageElements(this.pageList[i],'show')
         await this.initPageElements(this.pageList[i],'show')
       } 
       } 

+ 17 - 6
src/views/ppt_manage/newVersion/components/catalog/pptContentEn.vue

@@ -22,14 +22,19 @@
               <!-- 自定义标题 -->
               <!-- 自定义标题 -->
               <div class="custom-title-wrap editor-content" 
               <div class="custom-title-wrap editor-content" 
                     :style="item.titleDetail?{
                     :style="item.titleDetail?{
-                        left:item.titleDetail.baseLeft+'px',
-                        top:item.titleDetail.baseTop+'px',
-                        width:item.titleDetail.baseWidth+'px',
-                        height:item.titleDetail.baseHeight+'px',
+                        left:(item.titleDetail.baseLeft||90)*contentScale+'px',
+                        top:(item.titleDetail.baseTop||40.9)*contentScale+'px',
+                        width:(item.titleDetail.baseWidth||612)+'px',
+                        height:(item.titleDetail.baseHeight||30.9)+'px',
                     }:{
                     }:{
-                        left:'90px',top:'34.65px',width:'612px',height:'44.1px'
+                        left:90*contentScale+'px',top:40.9*contentScale+'px',width:'612px',height:'30.9px'
                     }">
                     }">
-                    <div class="title" v-html="item.title"></div>
+                    <div class="title" v-html="item.title"
+                    :style="item.titleDetail?{
+                        color:item.titleDetail.color||'#333',
+                        fontSize:(item.titleDetail.fontSize||22)+'px',
+                        fontFamily:item.titleDetail.fontFamily||'helvetica'
+                    }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"></div>
                 </div>
                 </div>
               <component  :is="getComponentName(item.modelId)"
               <component  :is="getComponentName(item.modelId)"
                           :ref="`pptPage_${index-1}`"
                           :ref="`pptPage_${index-1}`"
@@ -151,6 +156,12 @@ export default {
       await this.initPPTAllPage(this.pageList)
       await this.initPPTAllPage(this.pageList)
       for(let i=0;i<this.pageList.length;i++){
       for(let i=0;i<this.pageList.length;i++){
         if(this.interruptLoad) return
         if(this.interruptLoad) return
+        if(this.pageList[i].titleDetail){
+            this.pageList[i].titleDetail = {
+                ...this.pageList[i].titleDetail,
+                ...this.getBasePosition(this.pageList[i].titleDetail)
+            }
+        }
         this.loadArr.push(this.pageList[i])
         this.loadArr.push(this.pageList[i])
         await this.initPageElements(this.pageList[i],'show')
         await this.initPageElements(this.pageList[i],'show')
       }
       }

+ 132 - 41
src/views/ppt_manage/newVersion/components/editor/TitleEditorTool.vue

@@ -1,44 +1,79 @@
 <template>
 <template>
     <div class="title-editor-tool-wrap">
     <div class="title-editor-tool-wrap">
-        <el-collapse v-model="activeNames" class="tool-list">
-            <!-- 位置设置 -->
-            <el-collapse-item :title="$t('Slides.title_location_settings')" name="position">
-                <div>
-                    <!-- 上下 -->
-                    <span class="demonstration">{{$t('Slides.title_location_up_down')}}(%)</span>
-                    <el-slider v-model="detail.top" :max="12"></el-slider>
+        <div class="scroll-box">
+            <el-collapse v-model="activeNames" class="tool-list">
+                <!-- 位置设置 -->
+                <el-collapse-item :title="$t('Slides.title_location_settings')" name="position">
+                    <div>
+                        <!-- 上下 -->
+                        <span class="demonstration">{{$t('Slides.title_location_up_down')}}(%)</span>
+                        <el-slider v-model="detail.top" :max="12" :step="0.1"></el-slider>
+                    </div>
+                    <div>
+                        <!-- 左右 -->
+                        <span class="demonstration">{{$t('Slides.title_location_left_right')}}(%)</span>
+                        <el-slider v-model="detail.left" :step="0.1"></el-slider>
+                    </div>
+                    <!-- <el-button type="text" @click="changePosition">应用至整个PPT</el-button> -->
+                </el-collapse-item>
+                <!-- 大小设置 -->
+                <el-collapse-item :title="$t('Slides.title_size_settings')" name="size">
+                    <div>
+                        <!-- 宽度 -->
+                        <span class="demonstration">{{$t('Slides.title_size_width')}}(%)</span>
+                        <el-slider v-model="detail.width" :max="100 - detail.left" :step="0.1"></el-slider>
+                    </div>
+                    <div>
+                        <!-- 高度 -->
+                        <span class="demonstration">{{$t('Slides.title_size_height')}}(%)</span>
+                        <el-slider v-model="detail.height" :max="14-detail.top" :step="0.1"></el-slider>
+                    </div>
+                </el-collapse-item>
+                <!-- <el-collapse-item :title="$t('Slides.title_content_settings')" name="content">
+                    <div class="editor-tool"></div>
+                    <div class="editor" id="editorDom">
+                        <Editor v-model="content" 
+                            :init="setting" 
+                            ref="editor"/>
+                    </div>
+                </el-collapse-item> -->
+            </el-collapse>
+            <div class="other-setting">
+                <div class="setting-item">
+                    <!-- 字体设置 -->
+                    <span>{{$t('Slides.title_style_fontfamily')}}</span>
+                    <el-select v-model="detail.fontFamily">
+                        <el-option v-for="item in fontFamily" :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                        />
+                    </el-select>
                 </div>
                 </div>
-                <div>
-                    <!-- 左右 -->
-                    <span class="demonstration">{{$t('Slides.title_location_left_right')}}(%)</span>
-                    <el-slider v-model="detail.left"></el-slider>
+                <div class="setting-item">
+                    <!-- 字号设置 -->
+                    <span>{{$t('Slides.title_style_fontsize')}}</span>
+                    <el-select v-model="detail.fontSize">
+                        <el-option v-for="item in fontSizeList" :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                        />
+                    </el-select>
                 </div>
                 </div>
-                <!-- <el-button type="text" @click="changePosition">应用至整个PPT</el-button> -->
-            </el-collapse-item>
-            <!-- 大小设置 -->
-            <el-collapse-item :title="$t('Slides.title_size_settings')" name="size">
-                <div>
-                    <!-- 宽度 -->
-                    <span class="demonstration">{{$t('Slides.title_size_width')}}(%)</span>
-                    <el-slider v-model="detail.width" :max="100 - detail.left"></el-slider>
+                <div class="setting-item">
+                    <!-- 字体颜色 -->
+                    <span>{{$t('Slides.title_style_color')}}</span>
+                    <el-color-picker
+                        v-model="detail.color"
+                        size="mini"
+                        show-alpha
+                        :predefine="['#333']"
+                    />
+                    </el-tooltip>
                 </div>
                 </div>
-                <div>
-                    <!-- 高度 -->
-                    <span class="demonstration">{{$t('Slides.title_size_height')}}(%)</span>
-                    <el-slider v-model="detail.height" :max="14-detail.top"></el-slider>
-                </div>
-                <!-- 应用至整个PPT -->
-                <el-button type="text" @click="changeSize">{{$t('Slides.apply_to_the_entire')}}</el-button>
-            </el-collapse-item>
-            <el-collapse-item :title="$t('Slides.title_content_settings')" name="content">
-                <div class="editor-tool"></div>
-                <div class="editor" id="editorDom">
-                    <Editor v-model="content" 
-                        :init="setting" 
-                        ref="editor"/>
-                </div>
-            </el-collapse-item>
-        </el-collapse>
+            </div>
+        </div>
+        <!-- 应用至整个PPT -->
+        <el-button type="primary" @click="applyToAll">{{$t('Slides.apply_to_the_entire')}}</el-button>
     </div>
     </div>
 </template>
 </template>
 
 
@@ -51,7 +86,7 @@ import "tinymce/plugins/quickbars"; //快速栏插件
 import "tinymce/plugins/fullscreen"; //全屏插件
 import "tinymce/plugins/fullscreen"; //全屏插件
 import "tinymce/plugins/paste"; //黏贴插件
 import "tinymce/plugins/paste"; //黏贴插件
 import "tinymce/icons/default/icons";
 import "tinymce/icons/default/icons";
-import {setting} from '../../utils/tinymceSetting'
+import {setting,fontSizeList,fontFamily} from '../../utils/tinymceSetting'
 export default {
 export default {
     components:{Editor},
     components:{Editor},
     props:{
     props:{
@@ -65,6 +100,7 @@ export default {
             content:'&*^%', //若设置为空,则init时没有标题就不会触发watch,随便设置几个字符即可
             content:'&*^%', //若设置为空,则init时没有标题就不会触发watch,随便设置几个字符即可
             detail:{
             detail:{
                 left:0,top:0,width:0,height:0,
                 left:0,top:0,width:0,height:0,
+                color:'#333',fontSize:22,fontFamily:'helvetica'
             },
             },
             initFlag:false,
             initFlag:false,
             setting:{
             setting:{
@@ -76,9 +112,13 @@ export default {
                 toolbar_persist:true,//是否一直显示toolbar
                 toolbar_persist:true,//是否一直显示toolbar
                 placeholder:this.$t('Slides.click_input_text_content'),
                 placeholder:this.$t('Slides.click_input_text_content'),
             },
             },
+            fontSizeList:fontSizeList,
+            fontFamily:fontFamily,
+
         };
         };
     },
     },
     watch:{
     watch:{
+        //不用富文本用不到
         content(con){
         content(con){
             if(this.initFlag){
             if(this.initFlag){
                 this.initFlag = false
                 this.initFlag = false
@@ -92,7 +132,10 @@ export default {
         detail:{
         detail:{
             handler(newval){
             handler(newval){
                 //若init还未执行完成,不派发事件
                 //若init还未执行完成,不派发事件
-                if(this.initFlag) return
+                if(this.initFlag){
+                    this.initFlag = false
+                    return 
+                }
                 this.$emit("styleChange",newval)
                 this.$emit("styleChange",newval)
             },
             },
             deep:true
             deep:true
@@ -100,9 +143,9 @@ export default {
     },
     },
     methods: {
     methods: {
         initTitleEditor(){
         initTitleEditor(){
-            const {left,top,width,height} = this.currentItem.titleDetail
-            this.detail = {left,top,width,height}
-            this.content = this.currentItem.title
+            const {left,top,width,height,fontFamily='helvetica',fontSize=22,color='#333'} = this.currentItem.titleDetail
+            this.detail = {left,top,width,height,fontFamily,fontSize,color}
+            //this.content = this.currentItem.title
         },
         },
         changePosition(){
         changePosition(){
             const {left,top} = this.detail
             const {left,top} = this.detail
@@ -112,6 +155,9 @@ export default {
             this.changePosition()
             this.changePosition()
             const {width,height} = this.detail
             const {width,height} = this.detail
             this.$emit('changeSizeAll',{width,height})
             this.$emit('changeSizeAll',{width,height})
+        },
+        applyToAll(){
+            this.$emit('applyToAll',this.detail)
         }
         }
     },
     },
 };
 };
@@ -119,10 +165,55 @@ export default {
 
 
 <style scoped lang="scss">
 <style scoped lang="scss">
 .title-editor-tool-wrap{
 .title-editor-tool-wrap{
+    flex:1;
+    display:flex;
+    flex-direction: column;
+    overflow-y:hidden;
     #editorDom{
     #editorDom{
         min-height: 200px;
         min-height: 200px;
         border:1px solid #ccc;
         border:1px solid #ccc;
         border-top: none;
         border-top: none;
     }
     }
+    .scroll-box{
+        flex:1;
+        overflow-y:auto;
+        overflow-x:hidden;
+        margin-bottom:20px;
+        padding-right:5px;
+        .el-collapse{
+            .el-slider{
+                padding:0 10px;
+            }
+        }
+        .other-setting{
+            margin-top:15px;
+            .setting-item{
+                display:flex;
+                justify-content:space-between;
+                /* align-items:center; */
+                margin-bottom:10px;
+                font-weight: bold;
+                .el-select{
+                    width:100px;
+                }
+            }
+        }
+    }
+}
+</style>
+<style lang="scss">
+.title-editor-tool-wrap{
+    .el-color-picker {
+      display: block;
+      &.el-color-picker--mini {
+        height: 30px;
+      }
+      .el-color-picker__trigger {
+        width: 60px;
+        height: 30px;
+        padding: 0;
+        border: 0;
+      }
+    }
 }
 }
 </style>
 </style>

+ 21 - 2
src/views/ppt_manage/newVersion/components/formatEl/SheetEl.vue

@@ -52,6 +52,15 @@
       @click.stop="delChart(position)"
       @click.stop="delChart(position)"
       v-if="isBtnShow"
       v-if="isBtnShow"
     ></div>
     ></div>
+  <div class="chart-source">
+    <span
+      v-if="sheetSourceFrom && sheetSourceFrom.isShow"
+      :style="`
+      color: ${sheetSourceFrom.isShow ? sheetSourceFrom.color : '#999'};
+      font-size: ${ sheetSourceFrom.fontSize }px;
+    `"
+    ><!-- 来源 -->{{$t('ETable.Common.source')}}:{{ sheetSourceFrom.text}}</span>
+  </div>
 </div>
 </div>
   
   
 </template>
 </template>
@@ -69,13 +78,18 @@ export default {
     return {
     return {
       tableData:[],
       tableData:[],
       type:'sheet',
       type:'sheet',
-      tableKey:0
+      tableKey:0,
+      sheetSourceFrom:{}
     };
     };
   },
   },
   methods:{
   methods:{
     getSheetData(id,value){
     getSheetData(id,value){
       this.tableKey++
       this.tableKey++
-      this.tableData = value
+      if(value){
+        this.tableData = value.list
+        this.sheetSourceFrom=(value.otherParams && value.otherParams.SourcesFrom) ? JSON.parse(value.otherParams.SourcesFrom):''
+      }
+
     }
     }
   },
   },
   mounted(){
   mounted(){
@@ -104,4 +118,9 @@ export default {
 			}
 			}
   }
   }
 }
 }
+.chart-source{
+  width: 95%;
+  position: absolute;
+  left: 2%;
+}
 </style>
 </style>

+ 4 - 1
src/views/ppt_manage/newVersion/components/formatPage/mixins.js

@@ -105,7 +105,7 @@ export default {
         //判断遮罩layers是否显示
         //判断遮罩layers是否显示
         isLayerShow(){
         isLayerShow(){
           //在图层编辑模式/标题编辑模式+是当前ppt+是编辑模式
           //在图层编辑模式/标题编辑模式+是当前ppt+是编辑模式
-          return (this.isEditLayer||this.isEditTitle)&&this.type==='edit'&&this.choosedId===this.pageItem.id
+          return (this.isEditLayer/* ||this.isEditTitle */)&&this.type==='edit'&&this.choosedId===this.pageItem.id
         },
         },
         //判断该渲染哪个图层组件
         //判断该渲染哪个图层组件
         getLayerElName(item){
         getLayerElName(item){
@@ -155,6 +155,7 @@ export default {
         },
         },
         //删除这张图表
         //删除这张图表
         delChart(position) {
         delChart(position) {
+            this.$parent.isEditTitle = false
             this.$emit('delChart', position)
             this.$emit('delChart', position)
         },
         },
         //自主黏贴事件:ctrl+v
         //自主黏贴事件:ctrl+v
@@ -247,6 +248,7 @@ export default {
             return
             return
           } */
           } */
           if(this.choosedId!==this.pageItem.id) return
           if(this.choosedId!==this.pageItem.id) return
+          this.$parent.isEditTitle = false
           this.dragElement = e.currentTarget
           this.dragElement = e.currentTarget
           if(dragInfo.type!=='text'){
           if(dragInfo.type!=='text'){
             //设置拖拽反馈图像
             //设置拖拽反馈图像
@@ -298,6 +300,7 @@ export default {
           }catch(err){
           }catch(err){
             this.$message.error(/*'复制失败'*/this.$t('MsgPrompt.copy_fail_msg'))
             this.$message.error(/*'复制失败'*/this.$t('MsgPrompt.copy_fail_msg'))
           }
           }
+          this.$parent.isEditTitle = false
         },
         },
         addChart(position){
         addChart(position){
           const {chartId} = this.pageItem.elements.find(i=>i.position===position)
           const {chartId} = this.pageItem.elements.find(i=>i.position===position)

+ 22 - 2
src/views/ppt_manage/newVersion/css/common.scss

@@ -74,7 +74,7 @@ $titleColor:#333333;
             align-items: center;
             align-items: center;
             transform-origin: 0 0;
             transform-origin: 0 0;
             word-break: break-word;
             word-break: break-word;
-            input{
+            input,textarea{
                 font-size: 24px;
                 font-size: 24px;
                 color:$titleColor;
                 color:$titleColor;
                 background: transparent;
                 background: transparent;
@@ -97,7 +97,7 @@ $titleColor:#333333;
         position: absolute;
         position: absolute;
         transform-origin: 0 0;
         transform-origin: 0 0;
         &.editor-model{
         &.editor-model{
-            background-color: #99999946;
+            //background-color: #99999946;
         }
         }
         &.ppt-editor-title{
         &.ppt-editor-title{
             border:1px dashed #999;
             border:1px dashed #999;
@@ -106,6 +106,7 @@ $titleColor:#333333;
             width:100%;
             width:100%;
             height:100%;
             height:100%;
             font-size: 16px;
             font-size: 16px;
+            word-break: break-all;
             ul{
             ul{
                 margin-left: 1em;
                 margin-left: 1em;
                 list-style-type: disc;
                 list-style-type: disc;
@@ -115,6 +116,24 @@ $titleColor:#333333;
                 list-style-type: decimal;
                 list-style-type: decimal;
               }
               }
         }
         }
+        textarea{
+            font-size: 24px;
+            color:$titleColor;
+            background: transparent;
+            border: none;
+            width:100%;
+            height:auto;
+            /* overflow-y: hidden; */
+            resize: none;
+            &.el-textarea__inner{
+                padding:0;
+                line-height: 1;
+                /* height:auto !important; */
+                color:var(--titleColor);
+                font-size:var(--fontSize);
+                font-family: var(--fontFamily);
+            }
+        }
         .normal-title{
         .normal-title{
             font-size: 16px;
             font-size: 16px;
             word-break: break-all;
             word-break: break-all;
@@ -131,6 +150,7 @@ $titleColor:#333333;
             }
             }
             .el-collapse-item__header{
             .el-collapse-item__header{
               margin-bottom: 0;
               margin-bottom: 0;
+              height: 40px;
             }
             }
             .el-collapse-item__wrap{
             .el-collapse-item__wrap{
               overflow: visible;
               overflow: visible;

+ 15 - 15
src/views/ppt_manage/newVersion/css/format.scss

@@ -144,7 +144,7 @@ $marginTop:14%;
       width: 100%;
       width: 100%;
       height: calc(100% - #{$marginTop});
       height: calc(100% - #{$marginTop});
       display: flex;
       display: flex;
-      .chart-bottom-insruction-info{
+      .chart-bottom-insruction-info,.chart-source{
             margin-top: 0 !important;
             margin-top: 0 !important;
         }
         }
     }
     }
@@ -172,7 +172,7 @@ $marginTop:14%;
             top:0;
             top:0;
             right:calc(5% - 10px);
             right:calc(5% - 10px);
         }
         }
-        .chart-bottom-insruction-info{
+        .chart-bottom-insruction-info,.chart-source{
             bottom:4%;
             bottom:4%;
         }
         }
     }
     }
@@ -196,7 +196,7 @@ $marginTop:14%;
             top:calc(10% - 10px);
             top:calc(10% - 10px);
             right:calc(5% - 10px);
             right:calc(5% - 10px);
         }
         }
-        .chart-bottom-insruction-info{
+        .chart-bottom-insruction-info,.chart-source{
             top:89%;
             top:89%;
         }
         }
     }
     }
@@ -217,7 +217,7 @@ $marginTop:14%;
           width: 100%;
           width: 100%;
           height: 80%;
           height: 80%;
         }
         }
-        .chart-bottom-insruction-info{
+        .chart-bottom-insruction-info,.chart-source{
             top:89%;
             top:89%;
         }
         }
     }
     }
@@ -242,7 +242,7 @@ $marginTop:14%;
                     top:calc(4% - 10px);
                     top:calc(4% - 10px);
                     right:2.5%;
                     right:2.5%;
                 }
                 }
-                .chart-bottom-insruction-info{
+                .chart-bottom-insruction-info,.chart-source{
                     top:89%;
                     top:89%;
                 }
                 }
             }
             }
@@ -267,7 +267,7 @@ $marginTop:14%;
                     top:0;
                     top:0;
                     right:2.5%;
                     right:2.5%;
                 }
                 }
-                .chart-bottom-insruction-info{
+                .chart-bottom-insruction-info,.chart-source{
                     top:84%;
                     top:84%;
                 }
                 }
             }
             }
@@ -284,7 +284,7 @@ $marginTop:14%;
             top:calc(10% - 10px);
             top:calc(10% - 10px);
             right:calc(5% - 10px);
             right:calc(5% - 10px);
         }
         }
-        .chart-bottom-insruction-info{
+        .chart-bottom-insruction-info,.chart-source{
             top:90%;
             top:90%;
         }
         }
     }
     }
@@ -308,7 +308,7 @@ $marginTop:14%;
                   top:calc(4% - 10px);
                   top:calc(4% - 10px);
                   right:2.5%;
                   right:2.5%;
                 }
                 }
-                .chart-bottom-insruction-info{
+                .chart-bottom-insruction-info,.chart-source{
                     top:89%;
                     top:89%;
                 }
                 }
             }
             }
@@ -334,7 +334,7 @@ $marginTop:14%;
                     top:0;
                     top:0;
                     right:2.5%;
                     right:2.5%;
                 }
                 }
-                .chart-bottom-insruction-info{
+                .chart-bottom-insruction-info,.chart-source{
                     top:84%;
                     top:84%;
                 }
                 }
             }
             }
@@ -351,7 +351,7 @@ $marginTop:14%;
             top:calc(10% - 10px);
             top:calc(10% - 10px);
             right:calc(5% - 10px);
             right:calc(5% - 10px);
         }
         }
-        .chart-bottom-insruction-info{
+        .chart-bottom-insruction-info,.chart-source{
             top:90%;
             top:90%;
         }
         }
     }
     }
@@ -366,13 +366,13 @@ $marginTop:14%;
       }
       }
       &.top-70{
       &.top-70{
         height:70%;
         height:70%;
-        .chart-bottom-insruction-info{
+        .chart-bottom-insruction-info,.chart-source{
             top:93%;
             top:93%;
         }
         }
       }
       }
       &.bottom-30{
       &.bottom-30{
         height: 30%;
         height: 30%;
-        .chart-bottom-insruction-info{
+        .chart-bottom-insruction-info,.chart-source{
             top:85%;
             top:85%;
         }
         }
       }
       }
@@ -425,7 +425,7 @@ $marginTop:14%;
       }
       }
     }
     }
     .format-nine{
     .format-nine{
-        .chart-bottom-insruction-info{
+        .chart-bottom-insruction-info,.chart-source{
             top:93%;
             top:93%;
         }
         }
     }
     }
@@ -552,7 +552,7 @@ $marginTop:14%;
                     width:90%;
                     width:90%;
                     height:90%
                     height:90%
                 }
                 }
-                .chart-bottom-insruction-info{
+                .chart-bottom-insruction-info,.chart-source{
                     top:92%;
                     top:92%;
                 }
                 }
             }
             }
@@ -564,7 +564,7 @@ $marginTop:14%;
         }
         }
         .bottom-15{
         .bottom-15{
             height: 18%;
             height: 18%;
-            .chart-bottom-insruction-info{
+            .chart-bottom-insruction-info,.chart-source{
                 top:80%;
                 top:80%;
             }
             }
         }
         }

+ 64 - 16
src/views/ppt_manage/newVersion/pptEditor.vue

@@ -46,7 +46,7 @@
         </div>
         </div>
     </div>
     </div>
     <div class="ppt-editor-wrap ppt-page-wrap" v-loading="isChartLoading" :element-loading-text="chartLoadingText">
     <div class="ppt-editor-wrap ppt-page-wrap" v-loading="isChartLoading" :element-loading-text="chartLoadingText">
-        <div class="ppt-editor" ref="pptEditor" @paste="handlePasteOutSide">
+        <div class="ppt-editor" id="pptEditor" ref="pptEditor" @paste="handlePasteOutSide">
             <!-- 显示全部ppt -->
             <!-- 显示全部ppt -->
             <template v-if="pageList.length">
             <template v-if="pageList.length">
                 <!-- <transition-group name="flip-list"> -->
                 <!-- <transition-group name="flip-list"> -->
@@ -54,13 +54,13 @@
                     <AddFormat @addPage="addPage($event,index)" :chooseModalId="chooseModalId"/>
                     <AddFormat @addPage="addPage($event,index)" :chooseModalId="chooseModalId"/>
                     <div class="ppt-item" :class="{'choose':currentItem.id===item.id}" 
                     <div class="ppt-item" :class="{'choose':currentItem.id===item.id}" 
                         v-loading="item.isUpdating" :element-loading-text="$t('Slides.updating_chart_loading')"
                         v-loading="item.isUpdating" :element-loading-text="$t('Slides.updating_chart_loading')"
-                        @click="changeCurrentItem(item)">
+                        @click.stop="changeCurrentItem(item)">
                         <!-- 标题 -->
                         <!-- 标题 -->
                         <!-- <div class="title-wrap" style="background-color: #999999;">
                         <!-- <div class="title-wrap" style="background-color: #999999;">
                             <input type="text" placeholder="单击输入标题" v-model="item.title"/> 
                             <input type="text" placeholder="单击输入标题" v-model="item.title"/> 
                         </div> -->
                         </div> -->
                         <!-- 自定义标题 -->
                         <!-- 自定义标题 -->
-                        <div @click.stop="handleEditTitle"
+                        <div @click.stop
                             :class="[
                             :class="[
                                 'ppt-editor-title',
                                 'ppt-editor-title',
                                 'custom-title-wrap',
                                 'custom-title-wrap',
@@ -72,9 +72,34 @@
                                 width:item.titleDetail.width+'%',
                                 width:item.titleDetail.width+'%',
                                 height:item.titleDetail.height+'%',
                                 height:item.titleDetail.height+'%',
                             }:{
                             }:{
-                                left:'10%',top:'5.5%',width:'68%',height:'7%'
+                                left:'10%',top:'6.6%',width:'68%',height:'5%',
                             }">
                             }">
-                            <div class="title" v-html="item.title"></div>
+                            <!-- <div class="title" v-html="item.title"></div> -->
+                            <!-- <el-input type="textarea" placeholder="单击输入标题" v-model="item.title" 
+                                autosize resize="none"
+                                spellcheck="false"
+                                :style="item.titleDetail?{
+                                    color:item.titleDetail.color,
+                                    fontSize:item.titleDetail.fontSize+'px',
+                                    fontFamily:item.titleDetail.fontFamily,
+                                    '--titleColor':item.titleDetail.color,
+                                    '--fontSize':item.titleDetail.fontSize,
+                                    '--fontFamily':item.titleDetail.fontFamily,
+                                }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"
+                                @focus="handleEditTitle(item)"
+                                v-click-title-outside="exitEditTitle"></el-input>  -->
+                                <div contenteditable="true" spellcheck="false" 
+                                :id="`page_title__${index}`"
+                                class="title-editor"
+                                :style="item.titleDetail?{
+                                    color:item.titleDetail.color||'#333',
+                                    fontSize:(item.titleDetail.fontSize||22)+'px',
+                                    fontFamily:(item.titleDetail.fontFamily||'helvetica'),
+                                    outline:0,
+                                }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica',outline:0}"
+                                    v-click-title-outside="exitEditTitle"
+                                    @click.stop="handleEditTitle(item)"
+                                    @input="(e)=>testInput(e,item)"></div>
                         </div>
                         </div>
                         <!-- 内容 -->
                         <!-- 内容 -->
                         <component  :is="getComponentName(item.modelId)"
                         <component  :is="getComponentName(item.modelId)"
@@ -246,14 +271,17 @@
             </div>
             </div>
             <!-- 标题编辑 -->
             <!-- 标题编辑 -->
             <div class="title-edit-box" v-if="isEditTitle">
             <div class="title-edit-box" v-if="isEditTitle">
-                <p>{{$t('Slides.page_title_style_setting')}}</p>
+                <p>
+                    {{$t('Slides.page_title_style_setting')}}
+                </p>
                 <TitleEditorTool 
                 <TitleEditorTool 
                     ref="titleEditor"
                     ref="titleEditor"
                     :currentItem="currentItem"
                     :currentItem="currentItem"
                     @changeSizeAll="changeSizeAll"
                     @changeSizeAll="changeSizeAll"
                     @changePositionAll="changePositionAll"
                     @changePositionAll="changePositionAll"
                     @styleChange="handleTitelStyleChange"
                     @styleChange="handleTitelStyleChange"
-                    @textChange="handleTextChange"/>
+                    @textChange="handleTextChange"
+                    @applyToAll="changeSettingAll"/>
             </div>
             </div>
           </div>
           </div>
     </div>
     </div>
@@ -309,7 +337,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import {countComponentName,checkClipboardItems,createRandomCode,checkPPTpageElemant,getChartInfo} from './utils/untils';
+import {countComponentName,checkClipboardItems,createRandomCode,checkPPTpageElemant,getChartInfo,getPlainText} from './utils/untils';
 import {modelInfo,defaultPosition} from './utils/config'
 import {modelInfo,defaultPosition} from './utils/config'
 import http from '@/api/http.js';
 import http from '@/api/http.js';
 import { dataBaseInterface ,sandInterface } from "@/api/api.js";
 import { dataBaseInterface ,sandInterface } from "@/api/api.js";
@@ -494,7 +522,7 @@ export default {
       //防止自动保存时,有某一页处于更新图表的状态,其isUpdating为true
       //防止自动保存时,有某一页处于更新图表的状态,其isUpdating为true
       this.pageList.forEach(i=>{
       this.pageList.forEach(i=>{
         i.isUpdating = false
         i.isUpdating = false
-      })     
+      })
       this.dataLoading.close();
       this.dataLoading.close();
       $('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
       $('.ppt-item').css('background-image',`url(${this.pptBgImage})`);
       //开启自动保存
       //开启自动保存
@@ -506,13 +534,14 @@ export default {
         await this.getpptDataById(id)
         await this.getpptDataById(id)
         const {status} = this.result
         const {status} = this.result
         if(status===200){
         if(status===200){
-          const {content,FirstPage,ReportId} = this.result
+          const {content,FirstPage,ReportId,TitleSetting} = this.result
           this.pageList = content
           this.pageList = content
           this.firstPage = FirstPage
           this.firstPage = FirstPage
           this.firstPage.BackIndex = FirstPage.TemplateType-1
           this.firstPage.BackIndex = FirstPage.TemplateType-1
           this.currentItem = this.pageList[0]
           this.currentItem = this.pageList[0]
           this.ReportId=ReportId
           this.ReportId=ReportId
           this.CoverContent = this.result.CoverContent
           this.CoverContent = this.result.CoverContent
+          this.titleSetting = TitleSetting||null
           /* //开启自动保存
           /* //开启自动保存
           this.autoSave() */
           this.autoSave() */
         }else{
         }else{
@@ -549,6 +578,7 @@ export default {
             modelId: modelId,
             modelId: modelId,
             title:'',
             title:'',
             elements: [],
             elements: [],
+            titleDetail:this.titleSetting?this.titleSetting:null
         }
         }
         //限制取消
         //限制取消
         /* if(this.pageList.length>=this.maxPageNum){
         /* if(this.pageList.length>=this.maxPageNum){
@@ -775,6 +805,11 @@ export default {
           
           
           this.isEditTitle = false
           this.isEditTitle = false
         }
         }
+        //点击当前页时,退出标题编辑模式
+        if(this.currentItem&&this.currentItem.id===id){
+            this.isEditTitle = false
+            return 
+        }
         this.pageList.map((item,index)=>{
         this.pageList.map((item,index)=>{
           if(item.id===id){
           if(item.id===id){
             this.currentItem = item
             this.currentItem = item
@@ -783,9 +818,16 @@ export default {
         })
         })
         this.$nextTick(()=>{
         this.$nextTick(()=>{
           let height = $('.ppt-editor-item')[0].offsetHeight
           let height = $('.ppt-editor-item')[0].offsetHeight
+          const index = this.currentIndex
           //pptEditor的滚动条动画
           //pptEditor的滚动条动画
-          this.$refs.pptEditor.scrollTo({
-              top:height*this.currentIndex,
+          /* this.$refs.pptEditor.scrollTo({
+              top:height*index,
+              left:0,
+              behavior: 'smooth'
+          }) */
+          const pptEditorDom = document.getElementById('pptEditor')
+          pptEditorDom.scrollTo({
+            top:height*index,
               left:0,
               left:0,
               behavior: 'smooth'
               behavior: 'smooth'
           })
           })
@@ -1081,7 +1123,8 @@ export default {
         FirstPage:FirstPage,
         FirstPage:FirstPage,
         Content:Content,
         Content:Content,
         GroupId:this.catalogId,
         GroupId:this.catalogId,
-        CoverContent:this.CoverContent
+        CoverContent:this.CoverContent,
+        TitleSetting:JSON.stringify(this.titleSetting)
       }).then(res=>{
       }).then(res=>{
         this.isSaved = false
         this.isSaved = false
         if(res.Ret===200){
         if(res.Ret===200){
@@ -1102,7 +1145,8 @@ export default {
         PptId:parseInt(ppt_id),
         PptId:parseInt(ppt_id),
         FirstPage:FirstPage,
         FirstPage:FirstPage,
         Content:Content,
         Content:Content,
-        CoverContent:this.CoverContent
+        CoverContent:this.CoverContent,
+        TitleSetting:JSON.stringify(this.titleSetting)
       }).then(res=>{
       }).then(res=>{
         this.isSaved = false
         this.isSaved = false
         if(res.Ret===200){
         if(res.Ret===200){
@@ -1140,11 +1184,13 @@ export default {
           return i
           return i
         })
         })
         let Content = JSON.stringify(pageList) 
         let Content = JSON.stringify(pageList) 
+        let TitleSetting = JSON.stringify(this.titleSetting)
         pptInterface.saveLog({
         pptInterface.saveLog({
           PptId:parseInt(ppt_id),
           PptId:parseInt(ppt_id),
           FirstPage:FirstPage,
           FirstPage:FirstPage,
           Content:Content,
           Content:Content,
-          CoverContent:this.CoverContent
+          CoverContent:this.CoverContent,
+          TitleSetting,
         }).then((res)=>{
         }).then((res)=>{
             if(res.Ret!==200) return 
             if(res.Ret!==200) return 
             this.showLastSaveTime = true
             this.showLastSaveTime = true
@@ -1632,10 +1678,12 @@ $titleColor:#333333;
               }
               }
             }
             }
             .title-edit-box{
             .title-edit-box{
+                display:flex;
+                flex-direction: column;
+                padding:20px;
                 p{
                 p{
                     font-size: 16px;
                     font-size: 16px;
                     font-weight: bold;
                     font-weight: bold;
-                    margin-top:16px;
                 }
                 }
             }
             }
        }
        }

+ 36 - 10
src/views/ppt_manage/newVersion/pptEnEditor.vue

@@ -52,13 +52,13 @@
                 <AddFormat @addPage="addPage($event,index)" :chooseModalId="chooseModalId"/>
                 <AddFormat @addPage="addPage($event,index)" :chooseModalId="chooseModalId"/>
                 <div class="ppt-item" :class="{'choose':currentItem.id===item.id}" 
                 <div class="ppt-item" :class="{'choose':currentItem.id===item.id}" 
                   v-loading="item.isUpdating" :element-loading-text="$t('Slides.updating_chart_loading')"
                   v-loading="item.isUpdating" :element-loading-text="$t('Slides.updating_chart_loading')"
-                  @click="changeCurrentItem(item)">
+                  @click.stop="changeCurrentItem(item)">
                     <!-- 标题 -->
                     <!-- 标题 -->
                     <!-- <div class="title-wrap" style="left:8%;width:62%;">
                     <!-- <div class="title-wrap" style="left:8%;width:62%;">
                         <input type="text" :placeholder="$t('Slides.click_to_input_title')" v-model="item.title"/> 
                         <input type="text" :placeholder="$t('Slides.click_to_input_title')" v-model="item.title"/> 
                     </div> -->
                     </div> -->
                     <!-- 自定义标题 -->
                     <!-- 自定义标题 -->
-                    <div @click.stop="handleEditTitle"
+                    <div @click.stop="handleEditTitle(item)"
                             :class="[
                             :class="[
                                 'ppt-editor-title',
                                 'ppt-editor-title',
                                 'custom-title-wrap',
                                 'custom-title-wrap',
@@ -70,10 +70,22 @@
                                 width:item.titleDetail.width+'%',
                                 width:item.titleDetail.width+'%',
                                 height:item.titleDetail.height+'%',
                                 height:item.titleDetail.height+'%',
                             }:{
                             }:{
-                                left:'10%',top:'5.5%',width:'68%',height:'7%'
+                                left:'10%',top:'6.6%',width:'68%',height:'5%'
                             }">
                             }">
-                            <div class="title" v-html="item.title"></div>
+                            <!-- <div class="title" v-html="item.title"></div> -->
                             <!-- <div v-else class="normal-title">{{item.title}}</div> -->
                             <!-- <div v-else class="normal-title">{{item.title}}</div> -->
+                            <div contenteditable="true" spellcheck="false" 
+                                :id="`page_title__${index}`"
+                                class="title-editor"
+                                :style="item.titleDetail?{
+                                    color:item.titleDetail.color||'#333',
+                                    fontSize:(item.titleDetail.fontSize||22)+'px',
+                                    fontFamily:(item.titleDetail.fontFamily||'helvetica'),
+                                    outline:0,
+                                }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica',outline:0}"
+                                    v-click-title-outside="exitEditTitle"
+                                    @click.stop="handleEditTitle(item)"
+                                    @input="(e)=>testInput(e,item)"></div>
                         </div>
                         </div>
                     <!-- 内容 -->
                     <!-- 内容 -->
                     <component  :is="getComponentName(item.modelId)"
                     <component  :is="getComponentName(item.modelId)"
@@ -254,7 +266,8 @@
                     @changeSizeAll="changeSizeAll"
                     @changeSizeAll="changeSizeAll"
                     @changePositionAll="changePositionAll"
                     @changePositionAll="changePositionAll"
                     @styleChange="handleTitelStyleChange"
                     @styleChange="handleTitelStyleChange"
-                    @textChange="handleTextChange"/>
+                    @textChange="handleTextChange"
+                    @applyToAll="changeSettingAll"/>
             </div>
             </div>
           </div>
           </div>
     </div>
     </div>
@@ -527,13 +540,14 @@ export default {
         await this.getpptDataById(id)
         await this.getpptDataById(id)
         const {status} = this.result
         const {status} = this.result
         if(status===200){
         if(status===200){
-          const {content,FirstPage,ReportId} = this.result
+          const {content,FirstPage,ReportId,TitleSetting} = this.result
           this.pageList = content
           this.pageList = content
           this.firstPage = FirstPage
           this.firstPage = FirstPage
           this.firstPage.BackIndex = FirstPage.TemplateType-1
           this.firstPage.BackIndex = FirstPage.TemplateType-1
           this.currentItem = this.pageList[0]
           this.currentItem = this.pageList[0]
           this.ReportId=ReportId
           this.ReportId=ReportId
           this.CoverContent = this.result.CoverContent
           this.CoverContent = this.result.CoverContent
+          this.titleSetting = TitleSetting||null
           /* //开启自动保存
           /* //开启自动保存
           this.autoSave() */
           this.autoSave() */
         }else{
         }else{
@@ -570,6 +584,7 @@ export default {
             modelId: modelId,
             modelId: modelId,
             title:'',
             title:'',
             elements: [],
             elements: [],
+            titleDetail:this.titleSetting?this.titleSetting:null
         }
         }
         this.pageList.splice(index,0,page)
         this.pageList.splice(index,0,page)
         this.changeCurrentItem(page)
         this.changeCurrentItem(page)
@@ -780,6 +795,11 @@ export default {
 
 
           this.isEditTitle = false
           this.isEditTitle = false
         }
         }
+        //点击当前页时,退出标题编辑模式
+        if(this.currentItem&&this.currentItem.id===id){
+            this.isEditTitle = false
+            return 
+        }
         this.pageList.map((item,index)=>{
         this.pageList.map((item,index)=>{
           if(item.id===id){
           if(item.id===id){
             this.currentItem = item
             this.currentItem = item
@@ -1077,7 +1097,8 @@ export default {
         FirstPage:FirstPage,
         FirstPage:FirstPage,
         Content:Content,
         Content:Content,
         GroupId:this.catalogId,
         GroupId:this.catalogId,
-        CoverContent:this.CoverContent
+        CoverContent:this.CoverContent,
+        TitleSetting:JSON.stringify(this.titleSetting)
       }).then(res=>{
       }).then(res=>{
         this.isSaved = false
         this.isSaved = false
         if(res.Ret===200){
         if(res.Ret===200){
@@ -1096,7 +1117,8 @@ export default {
         PptId:parseInt(ppt_id),
         PptId:parseInt(ppt_id),
         FirstPage:FirstPage,
         FirstPage:FirstPage,
         Content:Content,
         Content:Content,
-        CoverContent:this.CoverContent
+        CoverContent:this.CoverContent,
+        TitleSetting:JSON.stringify(this.titleSetting)
       }).then(res=>{
       }).then(res=>{
         this.isSaved = false
         this.isSaved = false
         if(res.Ret===200){
         if(res.Ret===200){
@@ -1128,11 +1150,13 @@ export default {
           return i
           return i
         })
         })
         let Content = JSON.stringify(pageList) 
         let Content = JSON.stringify(pageList) 
+        let TitleSetting = JSON.stringify(this.titleSetting)
         pptEnInterface.saveLog({
         pptEnInterface.saveLog({
           PptId:parseInt(ppt_id),
           PptId:parseInt(ppt_id),
           FirstPage:FirstPage,
           FirstPage:FirstPage,
           Content:Content,
           Content:Content,
-          CoverContent:this.CoverContent
+          CoverContent:this.CoverContent,
+          TitleSetting,
         }).then((res)=>{
         }).then((res)=>{
             if(res.Ret!==200) return 
             if(res.Ret!==200) return 
             this.showLastSaveTime = true
             this.showLastSaveTime = true
@@ -1634,10 +1658,12 @@ $titleColor:#333333;
               }
               }
             }
             }
             .title-edit-box{
             .title-edit-box{
+                display:flex;
+                flex-direction: column;
+                padding:20px;
                 p{
                 p{
                     font-size: 16px;
                     font-size: 16px;
                     font-weight: bold;
                     font-weight: bold;
-                    margin-top:16px;
                 }
                 }
             }
             }
        }
        }

+ 28 - 14
src/views/ppt_manage/newVersion/pptEnPresent.vue

@@ -61,15 +61,19 @@
                  <!-- 自定义标题 -->
                  <!-- 自定义标题 -->
                  <div class="custom-title-wrap editor-content" 
                  <div class="custom-title-wrap editor-content" 
                     :style="currentItem.titleDetail?{
                     :style="currentItem.titleDetail?{
-                        left:currentItem.titleDetail.baseLeft+'px',
-                        top:currentItem.titleDetail.baseTop+'px',
-                        width:currentItem.titleDetail.baseWidth+'px',
-                        height:currentItem.titleDetail.baseHeight+'px',
+                        left:(currentItem.titleDetail.baseLeft||90)*contentScale+'px',
+                        top:(currentItem.titleDetail.baseTop||40.9)*contentScale+'px',
+                        width:(currentItem.titleDetail.baseWidth||612)+'px',
+                        height:(currentItem.titleDetail.baseHeight||30.9)+'px',
                     }:{
                     }:{
-                        left:'90px',top:'34.65px',width:'612px',height:'44.1px'
+                        left:90*contentScale+'px',top:40.9*contentScale+'px',width:'612px',height:'30.9px'
                     }">
                     }">
-                    <div class="title" v-html="currentItem.title"></div>
-                    <!-- <div v-else class="normal-title">{{currentItem.title}}</div> -->
+                        <div class="title" v-html="currentItem.title"
+                        :style="currentItem.titleDetail?{
+                            color:currentItem.titleDetail.color||'#333',
+                            fontSize:(currentItem.titleDetail.fontSize||22)+'px',
+                            fontFamily:currentItem.titleDetail.fontFamily||'helvetica'
+                        }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"></div>
                 </div>
                 </div>
                 <component
                 <component
                   :ref="`pptPage_${currentIndex-1}`" 
                   :ref="`pptPage_${currentIndex-1}`" 
@@ -133,15 +137,19 @@
                 <!-- 自定义标题 -->
                 <!-- 自定义标题 -->
                 <div class="custom-title-wrap editor-content" 
                 <div class="custom-title-wrap editor-content" 
                     :style="currentItem.titleDetail?{
                     :style="currentItem.titleDetail?{
-                        left:currentItem.titleDetail.baseLeft+'px',
-                        top:currentItem.titleDetail.baseTop+'px',
-                        width:currentItem.titleDetail.baseWidth+'px',
-                        height:currentItem.titleDetail.baseHeight+'px',
+                        left:(currentItem.titleDetail.baseLeft||90)*contentScale+'px',
+                        top:(currentItem.titleDetail.baseTop||43.39)*contentScale+'px',
+                        width:(currentItem.titleDetail.baseWidth||612)+'px',
+                        height:(currentItem.titleDetail.baseHeight||30.9)+'px',
                     }:{
                     }:{
-                        left:'90px',top:'34.65px',width:'612px',height:'44.1px'
+                        left:90*contentScale+'px',top:43.39*contentScale+'px',width:'612px',height:'30.9px'
                     }">
                     }">
-                    <div class="title" v-html="currentItem.title"></div>
-                    <!-- <div v-else class="normal-title">{{currentItem.title}}</div> -->
+                        <div class="title" v-html="currentItem.title"
+                        :style="currentItem.titleDetail?{
+                            color:currentItem.titleDetail.color||'#333',
+                            fontSize:(currentItem.titleDetail.fontSize||22)+'px',
+                            fontFamily:currentItem.titleDetail.fontFamily||'helvetica'
+                        }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"></div>
                 </div>
                 </div>
                 <component
                 <component
                   :ref="`pptPage_${currentIndex-1}`" 
                   :ref="`pptPage_${currentIndex-1}`" 
@@ -333,6 +341,12 @@ export default {
         const sheetElements = this.pageList[i].elements.filter((item)=>{
         const sheetElements = this.pageList[i].elements.filter((item)=>{
           return item.type === 'sheet'
           return item.type === 'sheet'
         })
         })
+        if(this.pageList[i].titleDetail){
+            this.pageList[i].titleDetail = {
+                ...this.pageList[i].titleDetail,
+                ...this.getBasePosition(this.pageList[i].titleDetail)
+            }
+        }
         this.listHandle(chartElements,'present');
         this.listHandle(chartElements,'present');
         this.sheetListHandle(sheetElements);
         this.sheetListHandle(sheetElements);
       }
       }

+ 26 - 13
src/views/ppt_manage/newVersion/pptEnPublish.vue

@@ -39,17 +39,21 @@
               {{item.title}} 
               {{item.title}} 
             </div> -->
             </div> -->
             <!-- 自定义标题 -->
             <!-- 自定义标题 -->
-            <div class="custom-title-wrap editor-content" 
+            <div class="custom-title-wrap content" 
                 :style="item.titleDetail?{
                 :style="item.titleDetail?{
-                    left:item.titleDetail.baseLeft+'px',
-                    top:item.titleDetail.baseTop+'px',
-                    width:item.titleDetail.baseWidth+'px',
-                    height:item.titleDetail.baseHeight+'px',
+                    left:(item.titleDetail.baseLeft||90)*contentScale+'px',
+                    top:(item.titleDetail.baseTop||40.9)*contentScale+'px',
+                    width:(item.titleDetail.baseWidth||612)+'px',
+                    height:(item.titleDetail.baseHeight||30.9)+'px',
                 }:{
                 }:{
-                    left:'90px',top:'34.65px',width:'612px',height:'44.1px'
+                    left:90*contentScale+'px',top:40.9*contentScale+'px',width:'612px',height:'30.9px'
                 }">
                 }">
-                <div class="title" v-html="item.title"></div>
-                <!-- <div v-else class="normal-title">{{item.title}}</div> -->
+                <div class="title" v-html="item.title"
+                :style="item.titleDetail?{
+                    color:item.titleDetail.color||'#333',
+                    fontSize:(item.titleDetail.fontSize||22)+'px',
+                    fontFamily:item.titleDetail.fontFamily||'helvetica'
+                }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"></div>
             </div>
             </div>
             <component
             <component
               :is="getComponentName(item.modelId)"
               :is="getComponentName(item.modelId)"
@@ -195,6 +199,12 @@ export default {
         //获取已加载图表的信息
         //获取已加载图表的信息
         let chartInfoMap = {}
         let chartInfoMap = {}
         for(let i=0;i<this.pageList.length;i++){
         for(let i=0;i<this.pageList.length;i++){
+            if(this.pageList[i].titleDetail){
+                this.pageList[i].titleDetail = {
+                    ...this.pageList[i].titleDetail,
+                    ...this.getBasePosition(this.pageList[i].titleDetail)
+                }
+            }
           this.pageList[i].elements.forEach(item=>{
           this.pageList[i].elements.forEach(item=>{
             if(item.type==='chart'){
             if(item.type==='chart'){
               let temp = getChartInfo(this.optionMap[item.chartId])
               let temp = getChartInfo(this.optionMap[item.chartId])
@@ -304,7 +314,7 @@ export default {
         const elements = this.pageList[i].elements;
         const elements = this.pageList[i].elements;
         const elLength = elements.length;
         const elLength = elements.length;
         for (let j = 0; j < elLength; j++) {
         for (let j = 0; j < elLength; j++) {
-          let imgData = null,textData = null,imgData2 = null,imgData2Obj=null,sheetData=null
+          let imgData = null,textData = null,imgData2 = null,imgData2Obj=null,sheetData={list:null,otherParams:null}
           if (elements[j].type === "chart") {
           if (elements[j].type === "chart") {
             console.log("img/chart...");
             console.log("img/chart...");
             let svgData = this.optionMap[this.pageList[i].elements[j].chartId] instanceof Object
             let svgData = this.optionMap[this.pageList[i].elements[j].chartId] instanceof Object
@@ -329,7 +339,8 @@ export default {
           }else if (elements[j].type==='sheet'){
           }else if (elements[j].type==='sheet'){
             console.log('table...')
             console.log('table...')
             const sheetId = elements[j].sheetId
             const sheetId = elements[j].sheetId
-            sheetData = getTableData(this.sheetDataMap[sheetId])
+            sheetData.list = getTableData(this.sheetDataMap[sheetId].list)
+            sheetData.otherParams = this.sheetDataMap[sheetId].otherParams
           }
           }
           const { x, y, width, height } = this.getPosition(
           const { x, y, width, height } = this.getPosition(
             this.pageList[i].modelId,
             this.pageList[i].modelId,
@@ -346,7 +357,7 @@ export default {
               });
               });
 
 
             //追加生成图表底部文字
             //追加生成图表底部文字
-            this.transChartBottomInfo(slide,{x,y,width,height},this.optionMap[this.pageList[i].elements[j].chartId])
+            this.transBottomInfo(slide,{x,y,width,height},this.optionMap[this.pageList[i].elements[j].chartId])
             
             
           }else if (textData){
           }else if (textData){
             slide.addText(textData,{
             slide.addText(textData,{
@@ -374,10 +385,12 @@ export default {
               h:offsetY===0?height:(realSize.height/imgData2Obj.imgHeight*percentHeight)+'%',
               h:offsetY===0?height:(realSize.height/imgData2Obj.imgHeight*percentHeight)+'%',
               size:{type:"contain"}
               size:{type:"contain"}
             })
             })
-          }else if(sheetData){
-            slide.addTable(sheetData,{
+          }else if(sheetData.list){
+            slide.addTable(sheetData.list,{
               x:x,y:y,w:width,h:height,border:{type:'solid',pt:1}
               x:x,y:y,w:width,h:height,border:{type:'solid',pt:1}
             })
             })
+            //追加生成表格底部文字
+            this.transBottomInfo(slide,{x,y,width,height},sheetData.otherParams)
           } 
           } 
         }
         }
         //在添加完版式后,添加图层元素
         //在添加完版式后,添加图层元素

+ 28 - 12
src/views/ppt_manage/newVersion/pptPresent.vue

@@ -61,14 +61,19 @@
                 <!-- 自定义标题 -->
                 <!-- 自定义标题 -->
                 <div class="custom-title-wrap editor-content" 
                 <div class="custom-title-wrap editor-content" 
                     :style="currentItem.titleDetail?{
                     :style="currentItem.titleDetail?{
-                        left:currentItem.titleDetail.baseLeft+'px',
-                        top:currentItem.titleDetail.baseTop+'px',
-                        width:currentItem.titleDetail.baseWidth+'px',
-                        height:currentItem.titleDetail.baseHeight+'px',
+                        left:(currentItem.titleDetail.baseLeft||90)*contentScale+'px',
+                        top:(currentItem.titleDetail.baseTop||40.9)*contentScale+'px',
+                        width:(currentItem.titleDetail.baseWidth||612)+'px',
+                        height:(currentItem.titleDetail.baseHeight||30.9)+'px',
                     }:{
                     }:{
-                        left:'90px',top:'34.65px',width:'612px',height:'44.1px'
+                        left:90*contentScale+'px',top:40.9*contentScale+'px',width:'612px',height:'30.9px'
                     }">
                     }">
-                    <div class="title" v-html="currentItem.title"></div>
+                        <div class="title" v-html="currentItem.title"
+                        :style="currentItem.titleDetail?{
+                            color:currentItem.titleDetail.color||'#333',
+                            fontSize:(currentItem.titleDetail.fontSize||22)+'px',
+                            fontFamily:currentItem.titleDetail.fontFamily||'helvetica'
+                        }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"></div>
                 </div>
                 </div>
                 <component
                 <component
                   :ref="`pptPage_${currentIndex-1}`" 
                   :ref="`pptPage_${currentIndex-1}`" 
@@ -132,14 +137,19 @@
                 <!-- 自定义标题 -->
                 <!-- 自定义标题 -->
                 <div class="custom-title-wrap editor-content" 
                 <div class="custom-title-wrap editor-content" 
                     :style="currentItem.titleDetail?{
                     :style="currentItem.titleDetail?{
-                        left:currentItem.titleDetail.baseLeft+'px',
-                        top:currentItem.titleDetail.baseTop+'px',
-                        width:currentItem.titleDetail.baseWidth+'px',
-                        height:currentItem.titleDetail.baseHeight+'px',
+                        left:(currentItem.titleDetail.baseLeft||90)*contentScale+'px',
+                        top:(currentItem.titleDetail.baseTop||40.9)*contentScale+'px',
+                        width:(currentItem.titleDetail.baseWidth||612)+'px',
+                        height:(currentItem.titleDetail.baseHeight||30.9)+'px',
                     }:{
                     }:{
-                        left:'90px',top:'34.65px',width:'612px',height:'44.1px'
+                        left:90*contentScale+'px',top:40.9*contentScale+'px',width:'612px',height:'30.9px'
                     }">
                     }">
-                    <div class="title" v-html="currentItem.title"></div>
+                        <div class="title" v-html="currentItem.title"
+                        :style="currentItem.titleDetail?{
+                            color:currentItem.titleDetail.color||'#333',
+                            fontSize:(currentItem.titleDetail.fontSize||22)+'px',
+                            fontFamily:currentItem.titleDetail.fontFamily||'helvetica'
+                        }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"></div>
                 </div>
                 </div>
                 <component
                 <component
                   :ref="`pptPage_${currentIndex-1}`" 
                   :ref="`pptPage_${currentIndex-1}`" 
@@ -331,6 +341,12 @@ export default {
         const sheetElements = this.pageList[i].elements.filter((item)=>{
         const sheetElements = this.pageList[i].elements.filter((item)=>{
           return item.type === 'sheet'
           return item.type === 'sheet'
         })
         })
+        if(this.pageList[i].titleDetail){
+            this.pageList[i].titleDetail = {
+                ...this.pageList[i].titleDetail,
+                ...this.getBasePosition(this.pageList[i].titleDetail)
+            }
+        }
         this.listHandle(chartElements,'present');
         this.listHandle(chartElements,'present');
         this.sheetListHandle(sheetElements);
         this.sheetListHandle(sheetElements);
       }
       }

+ 25 - 11
src/views/ppt_manage/newVersion/pptPublish.vue

@@ -45,16 +45,21 @@
               {{item.title}} 
               {{item.title}} 
             </div> -->
             </div> -->
             <!-- 自定义标题 -->
             <!-- 自定义标题 -->
-            <div class="custom-title-wrap editor-content" 
+            <div class="custom-title-wrap content" 
                 :style="item.titleDetail?{
                 :style="item.titleDetail?{
-                    left:item.titleDetail.baseLeft+'px',
-                    top:item.titleDetail.baseTop+'px',
-                    width:item.titleDetail.baseWidth+'px',
-                    height:item.titleDetail.baseHeight+'px',
+                    left:(item.titleDetail.baseLeft||90)*contentScale+'px',
+                    top:(item.titleDetail.baseTop||40.9)*contentScale+'px',
+                    width:(item.titleDetail.baseWidth||612)+'px',
+                    height:(item.titleDetail.baseHeight||30.9)+'px',
                 }:{
                 }:{
-                    left:'90px',top:'34.65px',width:'612px',height:'44.1px'
+                    left:90*contentScale+'px',top:40.9*contentScale+'px',width:'612px',height:'30.9px'
                 }">
                 }">
-                <div class="title" v-html="item.title"></div>
+                <div class="title" v-html="item.title"
+                :style="item.titleDetail?{
+                    color:item.titleDetail.color||'#333',
+                    fontSize:(item.titleDetail.fontSize||22)+'px',
+                    fontFamily:item.titleDetail.fontFamily||'helvetica'
+                }:{ color:'#333',fontSize:'22px',fontFamily:'helvetica' }"></div>
             </div>
             </div>
             <component
             <component
               :is="getComponentName(item.modelId)"
               :is="getComponentName(item.modelId)"
@@ -215,6 +220,12 @@ export default {
          //获取已加载图表的信息
          //获取已加载图表的信息
         let chartInfoMap = {}
         let chartInfoMap = {}
         for(let i=0;i<this.pageList.length;i++){
         for(let i=0;i<this.pageList.length;i++){
+            if(this.pageList[i].titleDetail){
+                this.pageList[i].titleDetail = {
+                    ...this.pageList[i].titleDetail,
+                    ...this.getBasePosition(this.pageList[i].titleDetail)
+                }
+            }
           this.pageList[i].elements.forEach(item=>{
           this.pageList[i].elements.forEach(item=>{
             if(item.type==='chart'){
             if(item.type==='chart'){
               let temp = getChartInfo(this.optionMap[item.chartId])
               let temp = getChartInfo(this.optionMap[item.chartId])
@@ -323,7 +334,7 @@ export default {
         const elements = this.pageList[i].elements;
         const elements = this.pageList[i].elements;
         const elLength = elements.length;
         const elLength = elements.length;
         for (let j = 0; j < elLength; j++) {
         for (let j = 0; j < elLength; j++) {
-          let imgData = null,textData = null,imgData2 = null,imgData2Obj=null,sheetData=null
+          let imgData = null,textData = null,imgData2 = null,imgData2Obj=null,sheetData={list:null,otherParams:null}
           if (elements[j].type === "chart") {
           if (elements[j].type === "chart") {
             console.log("img/chart...");
             console.log("img/chart...");
             let svgData = this.optionMap[this.pageList[i].elements[j].chartId] instanceof Object
             let svgData = this.optionMap[this.pageList[i].elements[j].chartId] instanceof Object
@@ -353,7 +364,8 @@ export default {
           }else if (elements[j].type==='sheet'){
           }else if (elements[j].type==='sheet'){
             console.log('table...')
             console.log('table...')
             const sheetId = elements[j].sheetId
             const sheetId = elements[j].sheetId
-            sheetData = getTableData(this.sheetDataMap[sheetId])
+            sheetData.list = getTableData(this.sheetDataMap[sheetId].list)
+            sheetData.otherParams = this.sheetDataMap[sheetId].otherParams
           }
           }
           const { x, y, width, height } = this.getPosition(
           const { x, y, width, height } = this.getPosition(
             this.pageList[i].modelId,
             this.pageList[i].modelId,
@@ -370,7 +382,7 @@ export default {
               });
               });
 
 
             //追加生成图表底部文字
             //追加生成图表底部文字
-            this.transChartBottomInfo(slide,{x,y,width,height},this.optionMap[this.pageList[i].elements[j].chartId])
+            this.transBottomInfo(slide,{x,y,width,height},this.optionMap[this.pageList[i].elements[j].chartId])
           }else if (textData){
           }else if (textData){
             slide.addText(textData,{
             slide.addText(textData,{
               x:x,
               x:x,
@@ -399,9 +411,11 @@ export default {
               size:{type:"contain"}
               size:{type:"contain"}
             })
             })
           }else if(sheetData){
           }else if(sheetData){
-            slide.addTable(sheetData,{
+            slide.addTable(sheetData.list,{
               x:x,y:y,w:width,h:height,border:{type:'solid',pt:1}
               x:x,y:y,w:width,h:height,border:{type:'solid',pt:1}
             })
             })
+            //追加生成表格底部文字
+            this.transBottomInfo(slide,{x,y,width,height},sheetData.otherParams)
           } 
           } 
         }
         }
         //在添加完版式后,添加图层元素
         //在添加完版式后,添加图层元素

+ 4 - 4
src/views/ppt_manage/newVersion/utils/config.js

@@ -546,7 +546,7 @@ export const pptSlideMaster = {
 	title: "幻灯片母版",
 	title: "幻灯片母版",
 	objects: [
 	objects: [
 		{
 		{
-			placeholder: {
+			/* placeholder: {
 				options: {
 				options: {
 					name: "slideTitle",
 					name: "slideTitle",
 					type: "title",
 					type: "title",
@@ -559,7 +559,7 @@ export const pptSlideMaster = {
                     valign:'middle',
                     valign:'middle',
 					fontSize:24*0.75,
 					fontSize:24*0.75,
 				},
 				},
-			},
+			}, */
 		},
 		},
 		{
 		{
 			image: {
 			image: {
@@ -578,7 +578,7 @@ export const pptSlideMasterEn = {
   title: "幻灯片母版",
   title: "幻灯片母版",
 	objects: [
 	objects: [
 		{
 		{
-			placeholder: {
+			/* placeholder: {
 				options: {
 				options: {
 					name: "slideTitle",
 					name: "slideTitle",
 					type: "title",
 					type: "title",
@@ -591,7 +591,7 @@ export const pptSlideMasterEn = {
                     valign:'middle',
                     valign:'middle',
 					fontSize:24*0.75,
 					fontSize:24*0.75,
 				},
 				},
-			},
+			}, */
 		},
 		},
 		{
 		{
 			image: {
 			image: {

+ 83 - 2
src/views/ppt_manage/newVersion/utils/tinymceSetting.js

@@ -56,10 +56,91 @@ export const setting = {
         editor.on('input',function(){
         editor.on('input',function(){
             let content = editor.getContent()
             let content = editor.getContent()
             if(content){
             if(content){
-                editor.getBody().classList.add('.placeholder-hidden')
+                editor.getBody().classList.add('placeholder-hidden')
             }else{
             }else{
-                editor.getBody().classList.remove('.placeholder-hidden')
+                editor.getBody().classList.remove('placeholder-hidden')
             }
             }
         })
         })
     }
     }
+}
+
+export const fontSizeList = [
+    {
+        label:'14px',
+        value:14,
+    },{
+        label:'16px',
+        value:16,
+    },
+    {
+        label:'18px',
+        value:18,
+    },
+    {
+        label:'20px',
+        value:20,
+    },{
+        label:'22px',
+        value:22,
+    },{
+        label:'24px',
+        value:24,
+    },
+    {
+        label:'26px',
+        value:26,
+    },{
+        label:'28px',
+        value:28,
+    },
+    {
+        label:'36px',
+        value:36,
+    },
+    {
+        label:'48px',
+        value:48,
+    },
+]
+export const fontFamily = [
+    {
+        label:'Helvetica',
+        value:'helvetica',
+    },
+    {
+        label:'Arial',
+        value:'arial,helvetica,sans-serif',
+    },
+    {
+        label:'Georgia',
+        value:'Georgia,serif',
+    },
+    {
+        label:'Impact',
+        value:'impact,chicago',
+    },
+    {
+        label:'Tahoma',
+        value:'Tahoma,Geneva,sans-serif',
+    },
+    {
+        label:'Times New Roman',
+        value:"Times New Roman',Times,serif",
+    },
+    {
+        label:'Verdana',
+        value:'Verdana,Geneva,sans-serif',
+    },
+    {
+        label:'思源宋体',
+        value:'思源宋体'
+    },
+    {
+        label:'思源黑体',
+        value:'思源黑体'
+    }
+]
+export const titleDefault = {
+    top:6.6,left:10,width:68,height:5,
+    color:'#333',fontFamily:'helvetica',fontSize:22,
 }
 }

+ 24 - 9
src/views/predictEdb_manage/predictEdb.vue

@@ -115,12 +115,12 @@
 								style="display: flex; align-items: center"
 								style="display: flex; align-items: center"
 								v-if="select_node===data.UniqueCode&&data.HaveOperaAuth"
 								v-if="select_node===data.UniqueCode&&data.HaveOperaAuth"
 							>
 							>
-								<img
+								<!-- <img
 									src="~@/assets/img/data_m/move_ico.png"
 									src="~@/assets/img/data_m/move_ico.png"
 									alt=""
 									alt=""
 									style="width: 14px; height: 14px; margin-right: 8px"
 									style="width: 14px; height: 14px; margin-right: 8px"
 									v-if="data.Button.MoveButton"
 									v-if="data.Button.MoveButton"
-								/>
+								/> -->
 								<!-- 添加子项 -->
 								<!-- 添加子项 -->
 								<img
 								<img
 									src="~@/assets/img/set_m/add.png"
 									src="~@/assets/img/set_m/add.png"
@@ -147,23 +147,23 @@
 									v-if="data.Button.DeleteButton&&!data.EdbInfoId&&isEdbBtnShow('edbPreData_classifyOpt_delete')"
 									v-if="data.Button.DeleteButton&&!data.EdbInfoId&&isEdbBtnShow('edbPreData_classifyOpt_delete')"
 								/>
 								/>
 								<!-- 查看预测规则 -->
 								<!-- 查看预测规则 -->
-								<i class="el-icon-view" v-if="data.EdbInfoId&&isEdbBtnShow('edbPreData_checkPreRule')" @click.stop="viewNode(node,data)"></i>
+								<!-- <i class="el-icon-view" v-if="data.EdbInfoId&&isEdbBtnShow('edbPreData_checkPreRule')" @click.stop="viewNode(node,data)"></i> -->
 								<!-- 查看关联图表 -->
 								<!-- 查看关联图表 -->
-								<img 
+								<!-- <img 
 									v-if="data.Button.ShowChartRelation&&isEdbBtnShow('edbPreData_checkRelatedChart')" 
 									v-if="data.Button.ShowChartRelation&&isEdbBtnShow('edbPreData_checkRelatedChart')" 
 									@click.stop="showAssociateChart=true,showAssociateComputeData=false"
 									@click.stop="showAssociateChart=true,showAssociateComputeData=false"
 									src="~@/assets/img/icons/associate_chart.png" 
 									src="~@/assets/img/icons/associate_chart.png" 
 									style="width: 14px; height: 14px;margin-left: 8px"
 									style="width: 14px; height: 14px;margin-left: 8px"
 									alt=""
 									alt=""
-								/>
+								/> -->
 								<!-- 查看关联指标 -->
 								<!-- 查看关联指标 -->
-								<img 
+								<!-- <img 
 									v-if="data.Button.ShowEdbRelation&&isEdbBtnShow('edbPreData_checkRelatedEdb')" 
 									v-if="data.Button.ShowEdbRelation&&isEdbBtnShow('edbPreData_checkRelatedEdb')" 
 									@click.stop="showAssociateComputeData=true,showAssociateChart=false"
 									@click.stop="showAssociateComputeData=true,showAssociateChart=false"
 									src="~@/assets/img/icons/associate_data.png" 
 									src="~@/assets/img/icons/associate_data.png" 
 									style="width: 14px; height: 14px;margin-left: 8px"
 									style="width: 14px; height: 14px;margin-left: 8px"
 									alt=""
 									alt=""
-								/>
+								/> -->
 							</span>
 							</span>
 						</span>
 						</span>
 					</el-tree>
 					</el-tree>
@@ -248,6 +248,21 @@
 										type="text" 
 										type="text" 
 										@click="updateEdbHandle"
 										@click="updateEdbHandle"
 									>{{$t('Edb.detail_recalculate_btn')}}<!-- 重新计算 --></el-button>
 									>{{$t('Edb.detail_recalculate_btn')}}<!-- 重新计算 --></el-button>
+									<el-button 
+										v-if="isEdbBtnShow('edbPreData_checkPreRule')"
+										type="text" 
+										@click.stop="viewNode"
+									>{{$t('Edb.detail_formula_btn')}}<!-- 查看公式 --></el-button>
+									<el-button 
+										v-if="edbButton.ShowChartRelation&&isEdbBtnShow('edbPreData_checkRelatedChart')"
+										type="text" 
+										@click="showAssociateChart=true,showAssociateComputeData=false" 
+									>{{$t('Edb.detail_related_charts_btn')}}<!-- 关联图 --></el-button>
+									<el-button 
+										v-if="edbButton.ShowEdbRelation&&isEdbBtnShow('edbPreData_checkRelatedEdb')"
+										type="text"
+										@click="showAssociateComputeData=true,showAssociateChart=false"
+									>{{$t('Edb.detail_related_metrics_btn')}}<!-- 关联指标 --></el-button>
 									<el-button 
 									<el-button 
 										class="deletesty" 
 										class="deletesty" 
 										@click="delEdbHandle" 
 										@click="delEdbHandle" 
@@ -318,10 +333,10 @@
 
 
 				<!-- 指标关联图模块 -->
 				<!-- 指标关联图模块 -->
 				<div class="edb-detail-wrapper" style="padding: 30px 20px;" v-if="showAssociateChart&&select_id">
 				<div class="edb-detail-wrapper" style="padding: 30px 20px;" v-if="showAssociateChart&&select_id">
-					<dataAssociateChart :edbInfoId="select_id"></dataAssociateChart>
+					<dataAssociateChart :edbInfoId="select_id" @returnHandle="showAssociateChart=false,showAssociateComputeData=false"></dataAssociateChart>
 				</div>
 				</div>
 				<div class="edb-detail-wrapper" style="padding: 30px 20px;" v-if="showAssociateComputeData&&select_id">
 				<div class="edb-detail-wrapper" style="padding: 30px 20px;" v-if="showAssociateComputeData&&select_id">
-					<dataAssociateComputeData :edbInfoId="select_id"></dataAssociateComputeData>
+					<dataAssociateComputeData :edbInfoId="select_id" @returnHandle="showAssociateChart=false,showAssociateComputeData=false"></dataAssociateComputeData>
 				</div>
 				</div>
 			</div>
 			</div>
 		</div>
 		</div>

+ 21 - 2
src/views/sandbox_manage/index_new_version.vue

@@ -1143,9 +1143,28 @@ import {reportVarietyInterence} from '@/api/modules/reportVariety'
                 let EdbInfoIdList = res.Data.EdbInfoIdList || []
                 let EdbInfoIdList = res.Data.EdbInfoIdList || []
                 let ChartInfoIdList = res.Data.ChartInfoIdList || []
                 let ChartInfoIdList = res.Data.ChartInfoIdList || []
                 let ReportIdList = res.Data.ReportIdList || []
                 let ReportIdList = res.Data.ReportIdList || []
-                this.checkedLinkList = currentLinks.filter(link =>{
-                  return EdbInfoIdList.includes(link.Id) || ChartInfoIdList.includes(link.Id) || ReportIdList.includes(link.Id)
+                this.checkedLinkList=[]
+                // detailParams的参数改从后端取 
+                EdbInfoIdList.map(edbIt=>{
+                  let item = currentLinks.find(it=>it.Id == edbIt.Id)
+                  if(item){
+                    this.checkedLinkList.push({...item,detailParams:{classifyId:edbIt.ClassifyId,code:edbIt.UniqueCode,id:edbIt.Id}})
+                  }
+                })
+                ChartInfoIdList.map(chartIt=>{
+                  let item = currentLinks.find(it=>it.Id == chartIt.Id)
+                  if(item){
+                    this.checkedLinkList.push({...item,detailParams:{classifyId:chartIt.ClassifyId,code:chartIt.UniqueCode,id:chartIt.Id}})
+                  }
+                })
+                ReportIdList.map(reportIt=>{
+                  let item = currentLinks.find(it=>it.Id == reportIt.Id)
+                  if(item){
+                    this.checkedLinkList.push({...item,detailParams:{code:reportIt.UniqueCode,id:reportIt.Id}})
+                  }
                 })
                 })
+                // 绑定的链接是否 被删除光了
+                if(!(this.checkedLinkList && this.checkedLinkList.length>0)) return 
                 let clinetPositon=graph.localToClient(node.position())
                 let clinetPositon=graph.localToClient(node.position())
                 let size=node.size()
                 let size=node.size()
                 this.popoverTriggerDom.style.left = clinetPositon.x+size.width/2 + 'px';
                 this.popoverTriggerDom.style.left = clinetPositon.x+size.width/2 + 'px';

+ 33 - 16
src/views/sandbox_manage/sandFlowNew/index.vue

@@ -657,6 +657,7 @@ import addLInkDia from './components/addLInkDia.vue';
           this.linkNode = node
           this.linkNode = node
           let isMindmap = node.shape.indexOf('mindmap')!=-1
           let isMindmap = node.shape.indexOf('mindmap')!=-1
           this.contextMenuOption.map(item =>{
           this.contextMenuOption.map(item =>{
+            // 思维导图里面的节点不得复制
             if(item.key=='copy'){
             if(item.key=='copy'){
               item.show=!isMindmap
               item.show=!isMindmap
             }
             }
@@ -678,29 +679,45 @@ import addLInkDia from './components/addLInkDia.vue';
                 let EdbInfoIdList = res.Data.EdbInfoIdList || []
                 let EdbInfoIdList = res.Data.EdbInfoIdList || []
                 let ChartInfoIdList = res.Data.ChartInfoIdList || []
                 let ChartInfoIdList = res.Data.ChartInfoIdList || []
                 let ReportIdList = res.Data.ReportIdList || []
                 let ReportIdList = res.Data.ReportIdList || []
-                this.linkList = currentLinks.filter(link =>{
-                  return EdbInfoIdList.includes(link.Id) || ChartInfoIdList.includes(link.Id) || ReportIdList.includes(link.Id)
+                this.linkList=[]
+                // detailParams的参数改从后端取更新 
+                EdbInfoIdList.map(edbIt=>{
+                  let item = currentLinks.find(it=>it.Id == edbIt.Id)
+                  if(item){
+                    this.linkList.push({...item,detailParams:{classifyId:edbIt.ClassifyId,code:edbIt.UniqueCode,id:edbIt.Id}})
+                  }
+                })
+                ChartInfoIdList.map(chartIt=>{
+                  let item = currentLinks.find(it=>it.Id == chartIt.Id)
+                  if(item){
+                    this.linkList.push({...item,detailParams:{classifyId:chartIt.ClassifyId,code:chartIt.UniqueCode,id:chartIt.Id}})
+                  }
+                })
+                ReportIdList.map(reportIt=>{
+                  let item = currentLinks.find(it=>it.Id == reportIt.Id)
+                  if(item){
+                    this.linkList.push({...item,detailParams:{code:reportIt.UniqueCode,id:reportIt.Id}})
+                  }
+                })
+
+                // check过滤后的,回传
+                data.linkData=this.linkList
+
+                this.contextMenuOption.map(item =>{
+                  if(item.key=='addLink'){
+                    item.label=(this.linkList && this.linkList.length>0)?this.$t('SandboxManage.SandFlow.edit_link'):this.$t('SandboxManage.SandFlow.add_link')
+                  }else if(item.key=='deleteLink'){
+                    item.show=(this.linkList && this.linkList.length>0)
+                  }
                 })
                 })
+                // 绑定的链接是否 被删除光了
+                if(!(this.linkList && this.linkList.length>0)) return 
                 let clinetPositon=this.graph.localToClient(node.position())
                 let clinetPositon=this.graph.localToClient(node.position())
                 let size=node.size()
                 let size=node.size()
                 this.popoverTriggerDom.style.left = clinetPositon.x+size.width/2 + 'px';
                 this.popoverTriggerDom.style.left = clinetPositon.x+size.width/2 + 'px';
                 this.popoverTriggerDom.style.top = clinetPositon.y + 'px';
                 this.popoverTriggerDom.style.top = clinetPositon.y + 'px';
                 this.popoverVisible=true
                 this.popoverVisible=true
-                if(!(this.linkList.length>0)){
-                  if(item.key=='addLink'){
-                    item.label=this.$t('SandboxManage.SandFlow.add_link')
-                  }else if(item.key=='deleteLink'){
-                    item.show=false
-                  }
-                }
               }
               }
-              this.contextMenuOption.map(item =>{
-                if(item.key=='addLink'){
-                  item.label=this.$t('SandboxManage.SandFlow.edit_link')
-                }else if(item.key=='deleteLink'){
-                  item.show=true
-                }
-              })
             })
             })
           }else{
           }else{
             this.contextMenuOption.map(item =>{
             this.contextMenuOption.map(item =>{

+ 0 - 84
src/views/sandbox_manage/sandFlowNew/popover.vue

@@ -1,84 +0,0 @@
-<!-- "@antv/x6-vue-shape": "1.5.4", "@vue/composition-api": "^1.5.0", -->
-<template>
-  <el-popover
-    placement="top"
-    trigger="manual"
-    v-model="popoverVisible">
-    <div id="link-popover" :style="{height:popoverFlod?'20px':'unset'}">
-      <div class="link-box">
-        <div v-for="item in checkedLinkList" :key="item.RId" class="link-item">
-          {{ item.Name }}
-        </div>
-      </div>
-      <img src="~@/assets/img/sand_new/arrow_black_down.png" class="link-fold" 
-      :style="{transform:popoverFlod?'':'rotate(180deg)'}" v-show="checkedLinkList.length>1"
-      @click="foldLink"/>
-    </div>
-    <div id="link-reference" slot="reference">不可拖拽</div>
-  </el-popover>
-</template>
-
-<script>
-  export default {
-    name:'linkPopover',
-    inject: ["getGraph", "getNode"],
-    data() {
-      return {
-        checkedLinkList:[],
-        popoverFlod:true,
-        node:null,
-        popoverVisible:false
-      }
-    },
-    mounted(){
-      const self = this;
-      this.node = this.getNode();
-      const graph = this.getGraph()
-      console.log(this.node,'this.node');
-      graph.on("node:mouseenter", ({ node, e }) => {
-        console.log(node, e);
-        this.popoverVisible=true
-        if(node.data){
-          this.checkedLinkList = node.data.linkData || []
-        }
-        console.log(this.checkedLinkList);
-      });
-    },
-    methods:{
-      foldLink(){
-        this.popoverFlod=!this.popoverFlod 
-        if(this.node.data){
-          this.node.data.linkFold = this.popoverFlod
-        }
-        this.popoverVisible=false
-        this.$nextTick(()=>{
-          this.popoverVisible=true
-        })
-      },
-    }
-  }
-</script>
-
-<style lang="scss" scoped>
-  #link-popover{
-    display: flex;
-    justify-content: space-between;
-    transition: all 0.3s ease;
-    overflow: hidden;
-    .link-box{
-      .link-item{
-        &:hover{
-          text-decoration: underline;
-          color: #0052D9;
-          cursor: pointer;
-        }
-      }
-    }
-    .link-fold{
-      transition: all 0.3s ease;
-      height: 16px;
-      width: 16px;
-      cursor: pointer;
-    }
-  }
-</style>

+ 26 - 0
src/views/system_manage/chartTheme/common/config.js

@@ -82,15 +82,41 @@ export const alignPositions = [
   { value: 'right',svg:`<path d="M96 128h832v96H96zM96 576h832v96H96zM352 352h576v96H352zM352 800h576v96H352z" p-id="5963"></path>` },
   { value: 'right',svg:`<path d="M96 128h832v96H96zM96 576h832v96H96zM352 352h576v96H352zM352 800h576v96H352z" p-id="5963"></path>` },
 ]
 ]
 
 
+//可选数据标识样式
+export const markTypesOpts = [
+  { value: 'square',svg:`<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <rect width="20" height="20" fill="#D9D9D9"/>
+    </svg>` },
+  { value: 'circle',svg:`<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <circle cx="10" cy="10" r="10" fill="#D9D9D9"/>
+    </svg>` },
+  { value: 'diamond',svg:`<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <rect y="10.1421" width="14" height="14" transform="rotate(-45 0 10.1421)" fill="#D9D9D9"/>
+    </svg>` },
+  { value: 'triangle',svg:`<svg width="20" height="17" viewBox="0 0 20 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10 0L19.5263 16.5H0.473721L10 0Z" fill="#D9D9D9"/>
+    </svg>` },
+  { value: 'triangle-down',svg:`<svg width="20" height="17" viewBox="0 0 20 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10 17L0.473721 0.5L19.5263 0.5L10 17Z" fill="#D9D9D9"/>
+    </svg>` },
+]
+
 /* 当做标准化结构  eta默认值 几种类型图样式还区分开...*/
 /* 当做标准化结构  eta默认值 几种类型图样式还区分开...*/
 export const defaultETAOptions = {
 export const defaultETAOptions = {
   colorsOptions: defaultOpts.colors.slice(0,10),
   colorsOptions: defaultOpts.colors.slice(0,10),
+  // 需要将 lineOptions 里面的属性变成 10条线条的独立属性,即长度为10的数组传给后端
   lineOptions: { 
   lineOptions: { 
     dashStyle: 'Solid',
     dashStyle: 'Solid',
+    // color:'#ff0000', //线条颜色
     lineWidth: 1,
     lineWidth: 1,
     lineType: 'spline',
     lineType: 'spline',
     radius: 5,
     radius: 5,
+    dataMark:'none',// none:无 built-in:内置
+    markType:"square",
+    markSize:5,
+    // markColor:'#ff0000' //默认同 线条颜色一致
   },
   },
+  // lineOptionList:[{}],
   legendOptions: {
   legendOptions: {
     verticalAlign: 'top',
     verticalAlign: 'top',
     itemStyle: {
     itemStyle: {

+ 112 - 62
src/views/system_manage/chartTheme/components/optionsSection.vue

@@ -2,29 +2,20 @@
   <div class="charTheme-setting-option">
   <div class="charTheme-setting-option">
     <ul class="options-wrapper">
     <ul class="options-wrapper">
       <li v-for="key in Object.keys(themeOptions)" :key="key">
       <li v-for="key in Object.keys(themeOptions)" :key="key">
-        <label class="option-title">{{ key ==='lineOptions'?typeLabelMap[chartType].label:labelMap.get(key)}}</label>
+        <label class="option-title">{{ key ==='lineOptionList'?typeLabelMap[chartType].label:labelMap.get(key)}}</label>
         
         
           <ul class="option-list">
           <ul class="option-list">
              <!-- 线条设置 -->
              <!-- 线条设置 -->
-            <template v-if="key==='lineOptions'">
-                <li class="option-item">
-                  <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt01')}}</label>
-                  <el-color-picker
-                    v-model="themeOptions[key].colors[themeOptions[key].colorIndex]"
-                    show-alpha
-                    :predefine="predefineColors"
-                    style="width: 90px"
-                    @change="changeLineColor"
-                  />
-                </li>
+            <template v-if="key==='lineOptionList'">
+              <!-- 顺序 -->
                 <li class="option-item">
                 <li class="option-item">
                   <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt02')}}</label>
                   <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt02')}}</label>
                   <el-select 
                   <el-select 
-                    v-model="themeOptions[key].colorIndex"
+                    v-model="lineIndex"
                     style="width: 90px"
                     style="width: 90px"
                   >
                   >
                     <el-option 
                     <el-option 
-                      v-for="(item,index) in themeOptions[key].colors" 
+                      v-for="(item,index) in themeOptions[key]" 
                       :key="index"
                       :key="index"
                       :label="`${$i18n.locale == 'zh'?'第':''}${index+1}${typeLabelMap[chartType].lineLabel}`"
                       :label="`${$i18n.locale == 'zh'?'第':''}${index+1}${typeLabelMap[chartType].lineLabel}`"
                       :value="index"
                       :value="index"
@@ -32,12 +23,22 @@
                   </el-select>
                   </el-select>
                 </li>
                 </li>
 
 
+                <li class="option-item">
+                  <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt01')}}</label>
+                  <el-color-picker
+                    v-model="themeOptions[key][lineIndex].color"
+                    show-alpha
+                    :predefine="predefineColors"
+                    style="width: 90px"
+                  />
+                </li>
+
                 <!-- 曲线额外配置 雷达 -->
                 <!-- 曲线额外配置 雷达 -->
                 <template v-if="[1,2,11].includes(chartType)">
                 <template v-if="[1,2,11].includes(chartType)">
                   <li class="option-item">
                   <li class="option-item">
                     <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt03')}}</label>
                     <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt03')}}</label>
                     <el-select 
                     <el-select 
-                      v-model="themeOptions[key].dashStyle"
+                      v-model="themeOptions[key][lineIndex].dashStyle"
                       style="width: 90px"
                       style="width: 90px"
                     >
                     >
                       <el-option 
                       <el-option 
@@ -54,17 +55,17 @@
                   <li class="option-item">
                   <li class="option-item">
                     <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt04')}}</label>
                     <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt04')}}</label>
                     <el-input
                     <el-input
-                      v-model="themeOptions[key].lineWidth"
+                      v-model="themeOptions[key][lineIndex].lineWidth"
                       style="width: 90px"
                       style="width: 90px"
                       type="number"
                       type="number"
                       :min="1"
                       :min="1"
-                      @change="val => { themeOptions[key].lineWidth=Number(val)}"
+                      @change="val => { themeOptions[key][lineIndex].lineWidth=Number(val)}"
                     />
                     />
                   </li>
                   </li>
                   <li class="option-item">
                   <li class="option-item">
                     <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt05')}}</label>
                     <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt05')}}</label>
                     <el-select 
                     <el-select 
-                      v-model="themeOptions[key].lineType"
+                      v-model="themeOptions[key][lineIndex].lineType"
                       style="width: 90px"
                       style="width: 90px"
                     >
                     >
                       <el-option :label="$t('SystemManage.ChartSet.config_opt05_yes')" value="spline"/>
                       <el-option :label="$t('SystemManage.ChartSet.config_opt05_yes')" value="spline"/>
@@ -72,17 +73,68 @@
                     </el-select>
                     </el-select>
                   </li>
                   </li>
                 </template>
                 </template>
-                
+                <!-- 曲线、季节性图额外配置- 数据标志-->
+                <template v-if="[1,2].includes(chartType)">
+                  <li class="option-item">
+                    <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt11')}}</label>
+                    <el-select 
+                      v-model="themeOptions[key][lineIndex].dataMark"
+                      style="width: 90px"
+                    >
+                      <el-option :label="$t('SystemManage.ChartSet.config_opt11_none')" value="none"/>
+                      <el-option :label="$t('SystemManage.ChartSet.config_opt11_inside')" value="built-in"/>
+                    </el-select>
+                  </li>
+                  <template v-if="themeOptions[key][lineIndex].dataMark =='built-in'">
+                    <li class="option-item">
+                      <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt12')}}</label>
+                      <el-select 
+                        v-model="themeOptions[key][lineIndex].markType"
+                        style="width: 90px"
+                      >
+                        <el-option 
+                          v-for="item in markTypesOpts" 
+                          :key="item.value"
+                          :value="item.value"
+                          :label="$t('SystemManage.ChartSet.'+(item.value.replace('-','_')))" 
+                        >
+                          <div style="display: flex;align-items: center;justify-content: center;height: 100%;" v-html="item.svg">
+                          </div>
+
+                        </el-option>
+                      </el-select>
+                    </li>
+                    <li class="option-item">
+                      <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt13')}}</label>
+                      <el-input
+                        v-model="themeOptions[key][lineIndex].markSize"
+                        style="width: 90px"
+                        type="number"
+                        :min="1"
+                        @change="val => { themeOptions[key][lineIndex].markSize=Number(val)}"
+                      />
+                    </li>
+                    <li class="option-item">
+                      <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt14')}}</label>
+                      <el-color-picker
+                        v-model="themeOptions[key][lineIndex].markColor"
+                        show-alpha
+                        :predefine="predefineColors"
+                        style="width: 90px"
+                      />
+                    </li>
+                  </template>
+                </template>
                 <!-- 散点额外配置 -->
                 <!-- 散点额外配置 -->
                 <template v-else-if="[5,10].includes(chartType)">
                 <template v-else-if="[5,10].includes(chartType)">
                   <li class="option-item">
                   <li class="option-item">
                     <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt06')}}</label>
                     <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt06')}}</label>
                     <el-input
                     <el-input
-                      v-model="themeOptions[key].radius"
+                      v-model="themeOptions[key][lineIndex].radius"
                       style="width: 90px"
                       style="width: 90px"
                       type="number"
                       type="number"
                       :min="3"
                       :min="3"
-                      @change="val => { themeOptions[key].radius=Number(val)}"
+                      @change="val => { themeOptions[key][lineIndex].radius=Number(val)}"
                     />
                     />
                   </li>
                   </li>
                 </template>
                 </template>
@@ -202,7 +254,9 @@
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
-import { defaultETAOptions,verticalPositions,predefineColors,lineStylesOpts,alignPositions } from '../common/config'
+import { defaultETAOptions,verticalPositions,predefineColors,lineStylesOpts,alignPositions,
+  markTypesOpts
+ } from '../common/config'
 import { seasonOptions } from '@/utils/defaultOptions';
 import { seasonOptions } from '@/utils/defaultOptions';
 export default {
 export default {
   props: {
   props: {
@@ -217,7 +271,7 @@ export default {
   computed:{
   computed:{
     labelMap(){
     labelMap(){
       return new Map([
       return new Map([
-        ['lineOptions',this.$t('SystemManage.ChartSet.opt_label01')],
+        ['lineOptionList',this.$t('SystemManage.ChartSet.opt_label01')],
         ['scatterOptions',this.$t('SystemManage.ChartSet.opt_label02')],
         ['scatterOptions',this.$t('SystemManage.ChartSet.opt_label02')],
         ['legendOptions',this.$t('SystemManage.ChartSet.opt_label03')],
         ['legendOptions',this.$t('SystemManage.ChartSet.opt_label03')],
         ['titleOptions',this.$t('SystemManage.ChartSet.opt_label04')],
         ['titleOptions',this.$t('SystemManage.ChartSet.opt_label04')],
@@ -245,17 +299,31 @@ export default {
       predefineColors,
       predefineColors,
       lineStylesOpts,
       lineStylesOpts,
       alignPositions,
       alignPositions,
+      markTypesOpts,
      /* 可配置options*/
      /* 可配置options*/
       themeOptions: {
       themeOptions: {
-        lineOptions: {
-          dashStyle: defaultETAOptions.lineOptions.dashStyle,
-          colors: this.chartType===2?seasonOptions.colors:defaultETAOptions.colorsOptions,
-          color: defaultETAOptions.colorsOptions[0],
-          colorIndex:0,
-          lineWidth: defaultETAOptions.lineOptions.lineWidth,
-          lineType: defaultETAOptions.lineOptions.lineType,
-          radius: defaultETAOptions.lineOptions.radius,
-        },
+        // lineOptions: {
+        //   dashStyle: defaultETAOptions.lineOptions.dashStyle,
+        //   colors: this.chartType===2?seasonOptions.colors:defaultETAOptions.colorsOptions,
+        //   color: defaultETAOptions.colorsOptions[0],
+        //   colorIndex:0,
+        //   lineWidth: defaultETAOptions.lineOptions.lineWidth,
+        //   lineType: defaultETAOptions.lineOptions.lineType,
+        //   radius: defaultETAOptions.lineOptions.radius,
+        // },
+        lineOptionList: new Array(10).fill(1).map((item,index)=>{
+          return {
+            dashStyle: defaultETAOptions.lineOptions.dashStyle,
+            color: this.chartType===2?seasonOptions.colors[index]:defaultETAOptions.colorsOptions[index],
+            lineWidth: defaultETAOptions.lineOptions.lineWidth,
+            lineType: defaultETAOptions.lineOptions.lineType,
+            radius: defaultETAOptions.lineOptions.radius,
+            dataMark: defaultETAOptions.lineOptions.dataMark,
+            markType: defaultETAOptions.lineOptions.markType,
+            markSize: defaultETAOptions.lineOptions.markSize,
+            markColor: this.chartType===2?seasonOptions.colors[index]:defaultETAOptions.colorsOptions[index],
+          }
+        }),
         legendOptions: defaultETAOptions.legendOptions,
         legendOptions: defaultETAOptions.legendOptions,
         titleOptions: defaultETAOptions.titleOptions,
         titleOptions: defaultETAOptions.titleOptions,
         markerOptions: defaultETAOptions.markerOptions,
         markerOptions: defaultETAOptions.markerOptions,
@@ -263,27 +331,9 @@ export default {
         yAxisOptions: defaultETAOptions.yAxisOptions,
         yAxisOptions: defaultETAOptions.yAxisOptions,
         drawOption: defaultETAOptions.drawOption
         drawOption: defaultETAOptions.drawOption
       },
       },
+      colorsOptions:this.chartType===2?seasonOptions.colors:defaultETAOptions.colorsOptions,
+      lineIndex:0,
       lengendPositions: verticalPositions.filter(_ => _.value!=='middle'),
       lengendPositions: verticalPositions.filter(_ => _.value!=='middle'),
-      // typeLabelMap: {
-      //   1: {label:'线条设置',lineLabel: '条'},
-      //   2: {label:'线条设置',lineLabel: '条'},
-      //   4: {label:'柱形设置',lineLabel: '根'},
-      //   5: {label:'散点设置',lineLabel: '系列'},
-      //   6: {label:'线条、柱形设置',lineLabel: '系列'},
-      //   7: {label:'柱形设置',lineLabel: '根'},
-      //   10: {label:'散点设置',lineLabel: '系列'},
-      //   11: {label:'线条设置',lineLabel: '条'},
-      // },
-      // labelMap: new Map([
-      //   ['lineOptions','线条设置'],
-      //   ['scatterOptions','散点设置'],
-      //   ['legendOptions','图例设置'],
-      //   ['titleOptions','标题设置'],
-      //   ['markerOptions','标记文字设置(来源,标识)'],
-      //   ['xAxisOptions','横轴设置'],
-      //   ['yAxisOptions','纵轴设置'],
-      //   ['drawOption','绘图区设置'],
-      // ]),
       configOptions: []
       configOptions: []
     }
     }
   },
   },
@@ -300,17 +350,17 @@ export default {
           spinner: 'el-icon-loading',
           spinner: 'el-icon-loading',
           background: 'rgba(255, 255, 255, 0.8)'
           background: 'rgba(255, 255, 255, 0.8)'
       });
       });
-
       this.themeOptions = {
       this.themeOptions = {
-        lineOptions: {
-          dashStyle: options.lineOptions.dashStyle,
-          colors: options.colorsOptions,
-          color: options.colorsOptions[0],
-          colorIndex:0,
-          lineWidth: options.lineOptions.lineWidth,
-          lineType: options.lineOptions.lineType,
-          radius: options.lineOptions.radius,
-        },
+        // lineOptions: {
+        //   dashStyle: options.lineOptions.dashStyle,
+        //   colors: options.colorsOptions,
+        //   color: options.colorsOptions[0],
+        //   colorIndex:0,
+        //   lineWidth: options.lineOptions.lineWidth,
+        //   lineType: options.lineOptions.lineType,
+        //   radius: options.lineOptions.radius,
+        // },
+        lineOptionList: options.lineOptionList,
         legendOptions: options.legendOptions,
         legendOptions: options.legendOptions,
         titleOptions: options.titleOptions,
         titleOptions: options.titleOptions,
         markerOptions: options.markerOptions,
         markerOptions: options.markerOptions,

+ 2 - 1
src/views/system_manage/chartTheme/index.vue

@@ -5,7 +5,8 @@
         <div class="setting-item">
         <div class="setting-item">
             <span>
             <span>
                 {{$t('SystemManage.ChartSet.label00')}}
                 {{$t('SystemManage.ChartSet.label00')}}
-                <el-tooltip class="item" effect="dark" :content="$t('SystemManage.ChartSet.label00_hint')" placement="top">
+                <el-tooltip class="item" effect="dark" placement="top">
+                  <div slot="content" v-html="$t('SystemManage.ChartSet.label00_hint')"></div>
                     <i class="el-icon-warning"></i>
                     <i class="el-icon-warning"></i>
                 </el-tooltip>
                 </el-tooltip>
             </span>
             </span>

+ 78 - 21
src/views/system_manage/chartTheme/themeSetting.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="themeSet-page">
   <div class="themeSet-page">
     <div class="header">
     <div class="header">
-      <div>
+      <div class="header-option">
         <el-select v-model="formData.chartType" @change="getThemeList('init');">
         <el-select v-model="formData.chartType" @change="getThemeList('init');">
             <el-option
             <el-option
               v-for="item in chartTypeOpts"
               v-for="item in chartTypeOpts"
@@ -19,10 +19,14 @@
             :value="item.ChartThemeId"
             :value="item.ChartThemeId"
           />
           />
         </el-select>
         </el-select>
+        <span class="rename-item" @click="renameThemeOpen">
+          <img src="~@/assets/img/icons/edit_blue_new.png"/>
+          <span>重命名</span>
+        </span>
       </div>
       </div>
       <div>
       <div>
         <el-button type="primary" plain @click="$router.go(-1)">{{$t('Dialog.cancel_btn')}}</el-button>
         <el-button type="primary" plain @click="$router.go(-1)">{{$t('Dialog.cancel_btn')}}</el-button>
-        <el-button type="primary" @click="setThemeOptions">{{$t('Dialog.confirm_save_btn')}}</el-button>
+        <el-button type="primary" @click="setThemeOptions(null)">{{$t('Dialog.confirm_save_btn')}}</el-button>
       </div>
       </div>
     </div> 
     </div> 
 
 
@@ -48,7 +52,33 @@
         <Chart :options="options" :chartInfo="chartInfo" ref="chartRef" height="400px" minHeight="350px"/>
         <Chart :options="options" :chartInfo="chartInfo" ref="chartRef" height="400px" minHeight="350px"/>
       </div>
       </div>
     </div>
     </div>
-    
+    <!-- 重命名弹窗 -->
+    <m-dialog 
+      :title="$t('SystemManage.ChartSet.rename')" 
+      :show.sync="isOpenThemeDia" 
+      width="650px"
+    >
+      <div style="padding:30px 60px">
+        <div>
+          <label class="el-form-item__label">{{$t('SystemManage.ChartSet.theme_name')}}</label>
+          <el-input 
+            v-model="formData.themeName" 
+            :placeholder="$t('SystemManage.ChartSet.theme_name_placeholder')"
+          />
+        </div>
+      </div>
+      <div slot="footer" style="margin: 20px 0;">
+        <el-button
+          @click="saveThemeName"
+          type="primary"
+          style="width: 132px; height: 40px"
+          >{{$t('Dialog.confirm_save_btn')}}</el-button>
+        <el-button
+        @click="isOpenThemeDia=false"
+        style="width: 132px; height: 40px"
+        >{{$t('Dialog.cancel_btn')}}</el-button>
+      </div>
+    </m-dialog>
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
@@ -56,19 +86,22 @@ import * as chartThemeInterface from '@/api/modules/chartThemeApi';
 import { dataBaseInterface } from '@/api/api.js';
 import { dataBaseInterface } from '@/api/api.js';
 import { chartSetMixin } from '@/views/dataEntry_manage/mixins/chartPublic';
 import { chartSetMixin } from '@/views/dataEntry_manage/mixins/chartPublic';
 import Chart from '@/views/dataEntry_manage/components/chart.vue';
 import Chart from '@/views/dataEntry_manage/components/chart.vue';
-import optionsSection from './components/optionsSection.vue'
+import optionsSection from './components/optionsSection.vue';
+import mDialog from '@/components/mDialog.vue';
 export default {
 export default {
-  components: { optionsSection,Chart },
+  components: { optionsSection,Chart,mDialog },
   mixins: [ chartSetMixin ],
   mixins: [ chartSetMixin ],
   data() {
   data() {
     return {
     return {
       formData: {
       formData: {
         chartType: Number(this.$route.query.type),
         chartType: Number(this.$route.query.type),
-        theme: Number(this.$route.query.themeId)
+        theme: Number(this.$route.query.themeId),
+        themeName:''
       },
       },
       chartTypeOpts: [],
       chartTypeOpts: [],
       themeOpts: [],
       themeOpts: [],
-      chartInfo: {}
+      chartInfo: {},
+      isOpenThemeDia:false
     }
     }
   },
   },
   mounted(){
   mounted(){
@@ -128,17 +161,12 @@ export default {
     },
     },
 
 
     /* 保存配置 处理成标准化结构 */
     /* 保存配置 处理成标准化结构 */
-    async setThemeOptions() {
-      const { lineOptions,legendOptions,titleOptions,markerOptions,xAxisOptions,yAxisOptions,drawOption } = this.$refs.optionsSectionRef.themeOptions;
+    async setThemeOptions(themeName) {
+      const { legendOptions,titleOptions,markerOptions,xAxisOptions,yAxisOptions,drawOption,lineOptionList } = this.$refs.optionsSectionRef.themeOptions;
       
       
       let options = {
       let options = {
-        colorsOptions: lineOptions.colors,
-        lineOptions: { 
-          dashStyle: lineOptions.dashStyle,
-          lineWidth: lineOptions.lineWidth,
-          lineType: lineOptions.lineType,
-          radius: lineOptions.radius,
-        },
+        colorsOptions: lineOptionList.map(it => it.color),
+        lineOptionList,
         legendOptions,
         legendOptions,
         titleOptions,
         titleOptions,
         markerOptions,
         markerOptions,
@@ -146,20 +174,20 @@ export default {
         yAxisOptions,
         yAxisOptions,
         drawOption
         drawOption
       }
       }
-
       const { theme } = this.formData;
       const { theme } = this.formData;
-
       let ChartImage = await this.setChartImage();
       let ChartImage = await this.setChartImage();
-
       let res= await chartThemeInterface.saveTheme({
       let res= await chartThemeInterface.saveTheme({
-        ChartThemeName: this.themeOpts.find(_ => _.ChartThemeId===this.formData.theme).ChartThemeName,
+        ChartThemeName: themeName || this.themeOpts.find(_ => _.ChartThemeId===this.formData.theme).ChartThemeName,
         ChartThemeId: theme,
         ChartThemeId: theme,
         ChartImage,
         ChartImage,
         Config: JSON.stringify(options)
         Config: JSON.stringify(options)
       })
       })
 
 
       if(res.Ret !==200) return
       if(res.Ret !==200) return
+
       this.getThemeList()
       this.getThemeList()
+      // 重命名弹窗
+      this.isOpenThemeDia=false
       this.$message.success(this.$t('MsgPrompt.saved_msg'))
       this.$message.success(this.$t('MsgPrompt.saved_msg'))
     },
     },
 
 
@@ -177,6 +205,17 @@ export default {
       let { Data } = await dataBaseInterface.uploadImgSvg(form);
       let { Data } = await dataBaseInterface.uploadImgSvg(form);
       return Data.ResourceUrl;
       return Data.ResourceUrl;
     },
     },
+    // 重命名
+    renameThemeOpen(){
+      let themeItem = this.themeOpts.find(_ => _.ChartThemeId===this.formData.theme)
+      this.formData.themeName = themeItem && themeItem.ChartThemeName;
+      this.isOpenThemeDia=true
+    },
+    async saveThemeName(){
+      if(!this.formData.themeName) return this.$message.warning(this.$t('SystemManage.ChartSet.theme_name_placeholder'))
+      // 重命名 用保存的接口,走一遍保存的逻辑
+      this.setThemeOptions(this.formData.themeName)
+    }
   },
   },
 }
 }
 </script>
 </script>
@@ -197,6 +236,24 @@ export default {
     display: flex;
     display: flex;
     justify-content: space-between;
     justify-content: space-between;
     margin-bottom: 30px;
     margin-bottom: 30px;
+    .header-option{
+      display: flex;
+      align-items: center;
+      .rename-item{
+        font-size: 14px;
+        color: #0052D9;
+        font-weight: 400;
+        cursor: pointer;
+        display: flex;
+        align-items: center;
+        margin-left: 10px;
+        img{
+          width: 16px;
+          height: 16px;
+          margin-right: 4px;
+        }
+      }
+    }
   }
   }
   .main {
   .main {
     min-height: calc(100vh - 230px);
     min-height: calc(100vh - 230px);
@@ -205,7 +262,7 @@ export default {
       padding: 10px;
       padding: 10px;
       border: 1px solid #C8CDD9;
       border: 1px solid #C8CDD9;
       border-radius: 6px;
       border-radius: 6px;
-      margin-left: auto;
+      margin: 0 auto;
       .title {
       .title {
         margin-bottom: 10px;
         margin-bottom: 10px;
       }
       }