Ver código fonte

Merge branch 'master' into ETA1.8.5

jwyu 1 ano atrás
pai
commit
ed9363adc7
34 arquivos alterados com 494 adições e 140 exclusões
  1. 58 10
      src/api/http.js
  2. 7 2
      src/api/modules/chartApi.js
  3. 4 6
      src/api/modules/sheetApi.js
  4. 1 0
      src/components/edbDetailPopover.vue
  5. 2 0
      src/lang/modules/Slides/commonLang.js
  6. 2 0
      src/lang/modules/Slides/pptList.js
  7. 4 0
      src/lang/modules/Slides/pptPresent.js
  8. 4 2
      src/lang/modules/systemManage/BaseConfig.js
  9. 4 0
      src/lang/modules/systemManage/ChartSet.js
  10. 10 0
      src/styles/element-ui.scss
  11. 1 0
      src/utils/buttonConfig.js
  12. 1 0
      src/views/dataEntry_manage/addChart.vue
  13. 2 6
      src/views/dataEntry_manage/databaseComponents/edbDetailData.vue
  14. 1 1
      src/views/dataEntry_manage/databaseList.vue
  15. 1 0
      src/views/dataEntry_manage/editChart.vue
  16. 14 4
      src/views/dataEntry_manage/mixins/addOreditMixin.js
  17. 56 13
      src/views/datasheet_manage/customAnalysis/list.vue
  18. 175 31
      src/views/ppt_manage/mixins/pptEditorMixins.js
  19. 9 9
      src/views/ppt_manage/newVersion/pptCatalog.vue
  20. 4 1
      src/views/ppt_manage/newVersion/pptEditor.vue
  21. 11 6
      src/views/ppt_manage/newVersion/pptEnCatalog.vue
  22. 3 0
      src/views/ppt_manage/newVersion/pptEnEditor.vue
  23. 3 3
      src/views/predictEdb_manage/predictEdb.vue
  24. 8 6
      src/views/report_manage/mixins/messagePush.js
  25. 5 3
      src/views/report_manage/reportdtl.vue
  26. 9 9
      src/views/smartReport/editReport.vue
  27. 5 9
      src/views/smartReport/reportDetail.vue
  28. 62 6
      src/views/system_manage/chartTheme/index.vue
  29. 6 4
      src/views/system_manage/components/addUserDialog.vue
  30. 9 4
      src/views/system_manage/components/smartReportImgSet.vue
  31. 2 1
      src/views/system_manage/departManage.vue
  32. 1 1
      src/views/system_manage/roleManage.vue
  33. 1 1
      src/vuex/index.js
  34. 9 2
      src/vuex/mutations.js

+ 58 - 10
src/api/http.js

@@ -1,6 +1,16 @@
 "use strict";
 import axios from "axios";
 import bus from "./bus.js";
+let store=null
+// 异步加载store模块 不异步加载的话,@/api/modules/oldApi.js的导入导出写法会有问题
+import('@/vuex/index.js')
+.then(module => {
+  store=module.default
+})
+.catch(err => {
+  console.error(err,'vuex加载错误');
+});
+
 axios.defaults.withCredentials = true;
 axios.defaults.timeout = 0;
 axios.interceptors.request.use(
@@ -43,16 +53,29 @@ function getData(val, url) {
   return val;
 }
 
-function checkStatus(response) {
+function errorMsgShow(closableErrMsg,msg){
+  if(closableErrMsg){
+    let messageHint = bus.$message.error({
+      message:msg,
+      duration:0,
+      showClose:true
+    })
+    store.mutations.PUSH_CLOSABLE_HINT(store.state,messageHint)
+  }else{
+    bus.$message.error(msg);
+  }
+}
+
+function checkStatus(response,closableErrMsg) {
   //处理响应数据
   if (response && response.status === 200) {
     // loading,如果http状态码正常,则直接返回数据
     let res = bus.$parseData(response);
     if (!res) {
-      bus.$message.error("服务器开了个小差");
+      errorMsgShow(closableErrMsg,'服务器开了个小差')
       return false;
     } else if (res.Ret == 403) {
-      bus.$message.error(res.Msg);
+      errorMsgShow(closableErrMsg,res.Msg)
     } else if (res.Ret === 408) {
       localStorage.setItem("auth", "")
       localStorage.setItem("loginTime", "")
@@ -66,14 +89,19 @@ function checkStatus(response) {
     }
     return res;
   } else {
-    bus.$message.error("网络异常");
+    errorMsgShow(closableErrMsg,'网络异常')
     return false;
   }
 }
 
-function checkCode(res) {
-  bus.$message.error("网络异常");
+function checkCode(res,closableErrMsg) {
+  errorMsgShow(closableErrMsg,'网络异常')
 }
+
+function isFormData(obj) {
+  return typeof obj === 'object' && obj instanceof FormData;
+}
+
 // 请求时间需要过长,取消限制
 const cancelTimeoutUrlPost = ["/cloud_disk/resource/upload"];
 
@@ -81,6 +109,16 @@ export default {
   post(url, data) {
     //post请求方式
     let timeout = cancelTimeoutUrlPost.includes(url) ? 0 : 600000;
+    // 自定义参数
+    /**
+     * closableErrMsg123 -- 错误提示需要时可关闭类型的
+     */
+    let closableErrMsg=false
+    if(data){
+      // 区分formData格式
+      closableErrMsg = isFormData(data)?!!data.get('closableErrMsg123'):!!data.closableErrMsg123
+      isFormData(data)?data.delete('closableErrMsg123'):(data.closableErrMsg123=undefined)
+    }
     return axios({
       method: "post",
       url: url,
@@ -90,13 +128,23 @@ export default {
       headers: { "Content-Type": "application/json; charset=utf-8" },
     })
       .then((response) => {
-        return checkStatus(response);
+        return checkStatus(response,closableErrMsg);
       })
       .catch((res) => {
-        return checkCode(res);
+        return checkCode(res,closableErrMsg);
       });
   },
   get(url, data, responseType = "json") {
+    // 自定义参数
+    /**
+     * closableErrMsg123 -- 错误提示需要时可关闭类型的
+     */
+    let closableErrMsg=false
+    if(data){
+      closableErrMsg = !!data.closableErrMsg123
+      data.closableErrMsg123=undefined
+    }
+
     //get请求方式
     return axios({
       method: "get",
@@ -123,10 +171,10 @@ export default {
         if(responseType==='blob'){
           return response
         }
-        return checkStatus(response);
+        return checkStatus(response,closableErrMsg);
       })
       .catch((res) => {
-        return checkCode(res);
+        return checkCode(res,closableErrMsg);
       });
   },
   Base64,

+ 7 - 2
src/api/modules/chartApi.js

@@ -679,7 +679,10 @@ const dataBaseInterface = {
 		},
 		/**
 		 * 多图表一键刷新
-		 * @param {ChartInfoCode} params 
+		 * @param {Object} params
+		 * @param {Array} params.ChartInfoCode
+		 * @param {String} params.Source 来源,枚举值:report、english_report、smart_report、ppt、en_ppt
+		 * @param {Number} params.PrimaryId 报告id/pptId
 		 * @returns 
 		 */
 		reportRefresh: params => {
@@ -962,7 +965,9 @@ const dataBaseInterface = {
 
 	/** 
 	 * 获取图表批量刷新结果
-	 *   Source ReportId ReportChapterId
+	 * @param {Object} params
+	 * @param {String} params.Source 来源,枚举值:report、english_report、smart_report、ppt、en_ppt
+	 * @param {Number} params.PrimaryId 报告id/pptId
 	 * 
 	 */
 	getReportrefreshStatus: params => {

+ 4 - 6
src/api/modules/sheetApi.js

@@ -352,9 +352,8 @@ export const getMixedCalculateData = params => {
  * 表格一键刷新
  * @param {Object} params
  * @param {Array} params.ExcelCodes 表格唯一编码
- * @param {String} params.Source 来源,枚举值:report、english_report、smart_report
- * @param {Number} params.ReportId 报告id
- * @param {Number} params.ReportChapterId 章节id 非章节传0
+ * @param {String} params.Source 来源,枚举值:report、english_report、smart_report、ppt、en_ppt
+ * @param {Number} params.PrimaryId 报告id/pptId
  */
 export const refreshSheet = (params)=>{
     return http.post('/datamanage/excel_info/table/batch_refresh',params)
@@ -362,9 +361,8 @@ export const refreshSheet = (params)=>{
 /**
  * 获取表格刷新结果
  * @param {Object} params
- * @param {String} params.Source 来源,枚举值:report、english_report、smart_report
- * @param {Number} params.ReportId 报告id
- * @param {Number} params.ReportChapterId 章节id 非章节传0
+ * @param {String} params.Source 来源,枚举值:report、english_report、smart_report、ppt、en_ppt
+ * @param {Number} params.PrimaryId 报告id/pptId
  */
 export const getRefreshResult = (params)=>{
     return http.post('/datamanage/excel_info/table/batch_refresh/result',params)

+ 1 - 0
src/components/edbDetailPopover.vue

@@ -5,6 +5,7 @@
     width="350"
     offset="100"
     trigger="hover"
+    :disabled="!info.HaveOperaAuth"
   >
     <ul class="edb-info-cont">
       <li v-for="key in keysArr" :key="key">

+ 2 - 0
src/lang/modules/Slides/commonLang.js

@@ -18,6 +18,7 @@ export const operationsEn = {
   operations_presentation: "Presentation",
   go_to_publish: "Go to publish",
   operations_save: "Save",
+  operations_refresh:"Refresh",
   operations_insert: "Insert PPT",
   operations_switch: "Switch template",
   paste_before_slide: "Paste before this slide",
@@ -49,6 +50,7 @@ export const operationsZh = {
   operations_presentation: "演示",
   go_to_publish: "去发布",
   operations_save: "保存",
+  operations_refresh:"一键刷新",
   operations_insert: "插入PPT",
   operations_switch: "切换模板",
   paste_before_slide: "粘贴到此页前",

+ 2 - 0
src/lang/modules/Slides/pptList.js

@@ -14,6 +14,7 @@ export const listEn = {
   select_user_btn: "Select user",
   add_my_directory: "Add My Directory",
   creation_time: "Creation time",
+  update_time: "Update time",
   author_info: "Author",
   time_info: "Time",
   operation_info: "Operation",
@@ -136,6 +137,7 @@ export const listZh = {
   select_user_btn: "选择用户",
   add_my_directory: "添加我的目录",
   creation_time: "创建时间",
+  update_time: "更新时间",
   author_info: "作者",
   time_info: "时间",
   operation_info: "操作",

+ 4 - 0
src/lang/modules/Slides/pptPresent.js

@@ -35,6 +35,8 @@ export const presentEn = {
   text_element: "Text settings",
   batch_deletion_successful: "Batch deletion successfu",
   retrieving_ppt_data: "Retrieving PPT data",
+  refresh_ppt_el:"Refreshing the charts and tables in the PPT...",
+  refresh_ppt_hint:"Charts and tables have not been added and cannot be refreshed",
   loading_urgently: "Loading urgently",
   convert_to_report_dlg: "PPT convert to report",
   report_type_select: "Report type",
@@ -126,6 +128,8 @@ export const presentZh = {
   text_element: "文本设置",
   batch_deletion_successful: "批量删除成功",
   retrieving_ppt_data: "正在获取ppt数据",
+  refresh_ppt_el:"正在刷新PPT内图表和表格...",
+  refresh_ppt_hint:"还未添加图表和表格,无法刷新",
   loading_urgently: "拼命加载中",
   convert_to_report_dlg: "PPT转报告",
   report_type_select: "报告类型",

+ 4 - 2
src/lang/modules/systemManage/BaseConfig.js

@@ -67,7 +67,8 @@ export const BaseConfigEn = {
     resource_label02:'Image Type',
     report_title:"Report Title",
     report_author:"Report Author",
-    report_creation_time:"Creation Time",
+    // report_creation_time:"Creation Time",
+    report_release_time:"Release Time",
     select_layout:"Select Layout",
     edit_layout:"Edit Layout",
     completed_step:"Completed Step",
@@ -169,7 +170,8 @@ export const BaseConfigZh = {
     resource_label02:'图片类型',
     report_title:"研报标题",
     report_author:"研报作者",
-    report_creation_time:"创建时间",
+    // report_creation_time:"创建时间",
+    report_release_time:"发布时间",
     select_layout:"选择版图",
     edit_layout:"编辑版图",
     completed_step:"已完成步骤",

+ 4 - 0
src/lang/modules/systemManage/ChartSet.js

@@ -4,6 +4,8 @@
 
 /* 英文 */
 export const ChartSetEn = {
+    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.',
     label01:'Chart Types',
     label02:'Chart Library Default Theme',
     add_btn:'Add Custom Theme',
@@ -44,6 +46,8 @@ export const ChartSetEn = {
   
 /* 中文 */
 export const ChartSetZh = {
+    label00:'图表的数据来源',
+    label00_hint:'开启状态表示新建图表时,数据来源展示开关默认开启,可手动切换,关闭状态同理,仅对新增图表生效,历史图表不处理',
     label01:'图表类型',
     label02:'图库默认主题',
     add_btn:'添加自定义主题',

+ 10 - 0
src/styles/element-ui.scss

@@ -64,3 +64,13 @@ $--font-path: '~element-ui/lib/theme-chalk/fonts';
   max-height: 100vh;
   overflow-y: auto;
 }
+.el-message--error{
+  .el-message__closeBtn{
+    color: $danger-btn-color;
+  }
+}
+.el-message--success{
+  .el-message__closeBtn{
+    color: $--color-success;
+  }
+}

+ 1 - 0
src/utils/buttonConfig.js

@@ -772,6 +772,7 @@ export const chartThemePermission = {
     chartTheme_add:'chartTheme:add',//添加
     chartTheme_edit:'chartTheme:edit',//编辑
     chartTheme_del:'chartTheme:del',//删除
+    chartTheme_chartsource:'chartTheme:chartsource',//图表的数据来源
 }
 
 

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

@@ -934,6 +934,7 @@ export default {
 	},
   mounted() {
 		this.getMenu();
+		this.getChartBaseSetting()
 		this.getThemeList('init');
 		window.addEventListener('resize', this.reloadRightWid);
 	},

+ 2 - 6
src/views/dataEntry_manage/databaseComponents/edbDetailData.vue

@@ -14,14 +14,10 @@
 					<span>{{item.label}}</span>
 				</template>	
 				<template slot-scope="scope">
-					<template v-if="$i18nt.locale==='zh'">
-						<span>{{ currentLang==='en'?scope.row[item.enKey||item.key] || scope.row[item.key]:scope.row[item.key] }}</span> 
-					</template>
-					<template v-else>
+
 						<span v-if="item.key==='Frequency'">{{ getFrequencyTrans(scope.row.Frequency||'null') }}</span>
 						<span v-else-if="item.key==='Unit'">{{ getUnitTrans(scope.row.Unit) }}</span>
-						<span v-else>{{ scope.row[item.key] }}</span>
-					</template>
+						<span v-else>{{ currentLang==='en'?scope.row[item.enKey||item.key]:scope.row[item.key] }}</span>
 					
 				</template>
 			</el-table-column>

+ 1 - 1
src/views/dataEntry_manage/databaseList.vue

@@ -369,7 +369,7 @@
 						<div class="list" v-show="activeTab==='Data'">
 							<edb-detail-data 
 								ref="edb_detail_data"
-								:current-lang="currentLang"
+								:currentLang="currentLang"
 								:table-data="tableData"
 								:table-colums-one="tableColumsOne"
 								:table-colums-two="tableColumsTwo"

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

@@ -1033,6 +1033,7 @@ export default {
 	},
   mounted() {
 		this.getMenu();
+		this.getChartBaseSetting()
 		this.getChartInfo();
 		this.reloadRightWid();
 		window.addEventListener('resize', this.reloadRightWid);

+ 14 - 4
src/views/dataEntry_manage/mixins/addOreditMixin.js

@@ -1,6 +1,7 @@
 import { dataBaseInterface } from '@/api/api.js';
 import * as preDictEdbInterface from '@/api/modules/predictEdbApi.js';
 import * as chartThemeInterface from '@/api/modules/chartThemeApi';
+import {etaBaseConfigInterence} from '@/api/modules/etaBaseConfigApi.js';
 import { defaultOpts } from '@/utils/defaultOptions';
 import { mapState } from 'vuex';
 
@@ -703,9 +704,11 @@ export default {
 			this.updateData.splice(index, 1)
 			this.$message.success(this.$t('MsgPrompt.delete_msg'))
 			//删除指标时,检测上下限,修改上下限
-			this.isModifyEdb = true
-			if(this.updateLimit){
-				this.EdbAxisChange()
+			if(![7,10,11].includes(this.chartInfo.ChartType)){
+				this.isModifyEdb = true
+				if(this.updateLimit){
+					this.EdbAxisChange()
+				}
 			}
 			//添加图表时重置默认样式
 			this.$route.path==='/addchart' && this.resetChartEdbDefault();
@@ -1073,7 +1076,14 @@ export default {
 				? chartTypeMap[this.chartInfo.ChartType]() 
 				: this.setChartOptionHandle(this.tableData);
 		},
-
+		//获取图表全局设置
+		async getChartBaseSetting(){
+			//目前是用基本配置的接口,后续有多个配置再改
+			const res = await etaBaseConfigInterence.getBaseConfig()
+			if(res.Ret!==200) return 
+			const {ChartSourceDisplay} = res.Data||{}
+			this.chartInfo.SourcesFromVisable = ChartSourceDisplay==='true'?true:false
+		},
 		/* 数据来源显示隐藏 */
 		changeSourceVisable() {
 			this.chartInfo.SourcesFrom = JSON.stringify({

+ 56 - 13
src/views/datasheet_manage/customAnalysis/list.vue

@@ -245,6 +245,7 @@
                 ref="sheetRef"
                 v-if="sheetConfigOpt.data"
                 :option="sheetConfigOpt"
+                @updated="hasChange=true"
               />
             </div>
           </template>
@@ -427,6 +428,8 @@ export default {
       saveTime:"",
 
       isEdbReFreshLoading: false,//指标刷新
+      // 内容是否更新
+      hasChange:false,
     };
   },
   watch: {
@@ -443,6 +446,7 @@ export default {
       this.sheetAllcellData = [],//全部单元格数据 分页push
       this.dataToalPage = 0;
       this.sheetConfigOpt.data = null;
+      this.hasChange=false
       newval && this.getDetailHandle();
     },
 
@@ -677,7 +681,10 @@ export default {
       this.handleDownloadResource(url,filename)
     },
     /* 保存表格 */
-    saveHandle: _.debounce(async function () {
+    saveHandle: _.debounce(function () {
+      this.saveApi()
+    }, 300),
+    async saveApi(){
       luckysheet.exitEditMode();
       let data = luckysheet.getAllSheets();
 
@@ -692,6 +699,7 @@ export default {
       let img = getSheetImage(data[0]);
       const form = new FormData();
       form.append("Image", img);
+      form.append("closableErrMsg123", true);
       const { Data } = await sheetInterface.uploadImg(form);
 
       data.luckysheet_select_save = [];
@@ -703,14 +711,16 @@ export default {
         ExcelClassifyId,
         ExcelImage: Data.ResourceUrl,
         Content: JSON.stringify(data),
+        closableErrMsg123:true
       });
       this.loading.close();
-      if (res.Ret !== 200) return;
+      if (res.Ret !== 200) return false;
+      this.hasChange=false
       this.saveTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
-      this.$message.success(this.$t('MsgPrompt.saved_msg'));
+      this.shouldClosedHintshow(this.$t('MsgPrompt.saved_msg'))
       this.getTreeData();
-    }, 300),
-
+      return true
+    },
     /* 获取表格列表 */
     getPublicList() {
       sheetInterface
@@ -854,15 +864,31 @@ export default {
     },
 
     /* 刷新表格 */
-    refreshSheet: _.debounce(async function() {
+    refreshSheet: _.debounce(function() {
       if(this.isEdbReFreshLoading) return
-      
-      this.isEdbReFreshLoading = true;
-      let res = await sheetInterface.sheetAnalysisInterface.sheetRefresh({ExcelInfoId: this.sheetDetailInfo.ExcelInfoId})
+      //退出编辑模式,让文本框失焦 
+      luckysheet.exitEditMode();
+      // 保存逻辑延后 让hasChange取得正确的值
+      setTimeout(async()=>{
+        this.isEdbReFreshLoading = true;
+        let res={}
+        // 内容有改变 刷新前需要先保存
+        if(this.hasChange){
+          let saveSuccess = await this.saveApi()
+          if(!saveSuccess){
+            // 没保存成功
+            this.isEdbReFreshLoading = false;
+            return
+          }
+          res = await sheetInterface.sheetAnalysisInterface.sheetRefresh({ExcelInfoId: this.sheetDetailInfo.ExcelInfoId,closableErrMsg123:true})
+        }else{
+          res = await sheetInterface.sheetAnalysisInterface.sheetRefresh({ExcelInfoId: this.sheetDetailInfo.ExcelInfoId,closableErrMsg123:true})
+        }
 
-      this.isEdbReFreshLoading = false;
-      if(res.Ret !== 200) return 
-      this.$message.success(res.Msg)
+        this.isEdbReFreshLoading = false;
+        if(res.Ret !== 200) return 
+        this.shouldClosedHintshow(res.Msg)
+      })
     },300),
 
     /* 重绘右侧区域宽度 */
@@ -899,7 +925,22 @@ export default {
         code: this.sheetDetailInfo.UniqueCode 
       }});
     },
-
+    shouldClosedHintshow(msg){
+      let messageHint=this.$message.success({
+        message:msg,
+        duration:0,
+        showClose:true
+      })
+      this.$store.commit('PUSH_CLOSABLE_HINT',messageHint)
+    },
+    closeHint(){
+      // console.log(this.$store.state.closableHints,'closableHints');
+      if(!(this.$store.state.closableHints && this.$store.state.closableHints.length>0)) return 
+      this.$store.state.closableHints.map(hint =>{
+        hint.close()
+      })
+      this.$store.commit('CLEAR_CLOSABLE_HINT')
+    }
   },
   mounted() {
     if (this.$route.query.code) {
@@ -913,9 +954,11 @@ export default {
     }
 
     window.addEventListener("resize", this.reloadRightWid);
+    document.addEventListener("click", this.closeHint);
   },
   destroyed() {
     window.removeEventListener("resize", this.reloadRightWid);
+    document.removeEventListener("click", this.closeHint);
   },
 };
 </script>

+ 175 - 31
src/views/ppt_manage/mixins/pptEditorMixins.js

@@ -4,6 +4,8 @@
  */
 //lodash
 import _ from "lodash";
+import {dataBaseInterface} from "@/api/api.js"
+import * as sheetInterface from '@/api/modules/sheetApi.js';
 import {createRandomCode,checkPPTpageElemant,getChartInfo} from '../newVersion/utils/untils';
 import {modelInfo,defaultPosition} from '../newVersion/utils/config';
 export default{
@@ -20,6 +22,9 @@ export default{
       showLastSaveTime:false,//是否展示自动保存时间
       lastSaveTime:'',//自动保存时间
       isSaved:false,//是否已点击了保存/发布
+
+      refreshLoading:null,//一键刷新的loading
+      refreshBtnLoading:false,//一键刷新的按钮loading
     }
   },
   directives: {
@@ -253,37 +258,73 @@ export default{
     },
     //更新页面图表
     async updatePage(page){
-      page.isUpdating = true
-      const index = this.pageList.findIndex(i=>i.id===page.id)
-      this.pageList.splice(index,1,page)
-      const chartElements = page.elements.filter((item) => {
-        return item.type === "chart";
-      });
-      //刷新图表
-      //暂停自动保存
-      this.loopTimer&&clearInterval(this.loopTimer)
-      this.loopTimer=null
-      for(let i=0;i<chartElements.length;i++){
-        await this.getRefreshChart(chartElements[i].chartId);
-      }
-      //重新获取图表数据
-      for(let i=0;i<chartElements.length;i++){
-        await this.getchartData(chartElements[i].chartId);
-      }
-      //更新vuex里的图表信息
-      let chartInfoMap = _.cloneDeep(this.$store.state.ppt.chartInfoMap)
-      for(let i=0;i<chartElements.length;i++){     
-        let temp = getChartInfo(this.optionMap[chartElements[i].chartId])
-        chartInfoMap[chartElements[i].chartId] = temp
-      }
-      this.$store.commit('SET_CHART_INFO_MAP',chartInfoMap)
-      //渲染图表
-      await this.initCharts(chartElements, page);
-      page.isUpdating = false
-      this.$message.success(this.$t('MsgPrompt.refresh_success_msg'))
-      this.pageList.splice(index,1,page)
-      //开启自动保存
-      this.autoSave()
+        page.isUpdating = true
+        const index = this.pageList.findIndex(i=>i.id===page.id)
+        this.pageList.splice(index,1,page)
+        const chartElements = page.elements.filter((item) => {
+            return item.type === "chart";
+        });
+        const SheetElements = page.elements.filter((item) => {
+            return item.type === "sheet";
+        });
+        //刷新图表
+        //暂停自动保存
+        this.loopTimer&&clearInterval(this.loopTimer)
+        this.loopTimer=null
+        /* for(let i=0;i<chartElements.length;i++){
+            await this.getRefreshChart(chartElements[i].chartId);
+        }
+        //重新获取图表数据
+        for(let i=0;i<chartElements.length;i++){
+            await this.getchartData(chartElements[i].chartId);
+        }
+        //更新vuex里的图表信息
+        let chartInfoMap = _.cloneDeep(this.$store.state.ppt.chartInfoMap)
+        for(let i=0;i<chartElements.length;i++){     
+            let temp = getChartInfo(this.optionMap[chartElements[i].chartId])
+            chartInfoMap[chartElements[i].chartId] = temp
+        }
+        this.$store.commit('SET_CHART_INFO_MAP',chartInfoMap)
+        //渲染图表
+        await this.initCharts(chartElements, page); */
+
+        chartElements.length&&await this.refreshPageChart(chartElements,page)
+        SheetElements.length&&await this.refreshPageSheet(SheetElements,page)
+        page.isUpdating = false
+        //this.$message.success(this.$t('MsgPrompt.refresh_success_msg'))
+        this.pageList.splice(index,1,page)
+        //开启自动保存
+        this.autoSave()
+    },
+    //更新图表
+    async refreshPageChart(chartElements,page){
+        const codeArr = [...new Set (chartElements.map(i=>i.chartId))]
+        //改成批量刷新图表的接口
+        await this.refreshCharts(codeArr,'',Date.now().toString().slice(-6))
+        //重新获取图表数据
+        for(let i=0;i<chartElements.length;i++){
+            await this.getchartData(chartElements[i].chartId);
+        }
+        //更新vuex里的图表信息
+        let chartInfoMap = _.cloneDeep(this.$store.state.ppt.chartInfoMap)
+        for(let i=0;i<chartElements.length;i++){     
+            let temp = getChartInfo(this.optionMap[chartElements[i].chartId])
+            chartInfoMap[chartElements[i].chartId] = temp
+        }
+        this.$store.commit('SET_CHART_INFO_MAP',chartInfoMap)
+        //渲染图表
+        await this.initCharts(chartElements, page);
+    },
+    //更新表格
+    async refreshPageSheet(sheetElements,page){
+        const codeArr = [...new Set (sheetElements.map(i=>i.sheetId))]
+        await this.refreshSheets(codeArr,'',Date.now().toString().slice(-6))
+        //重新获取表格数据
+        for(let i=0;i<sheetElements.length;i++){
+            await this.getsheetData(sheetElements[i].sheetId);
+        }
+        //渲染表格
+        await this.initSheets(sheetElements,page)
     },
     //设置ctrl按键的状态
     handlePasteKey(e){
@@ -394,6 +435,109 @@ export default{
         this.CoverContent = content
         this.isShowChooseCover = false
     },
+    //一键刷新 图表/表格
+    async refleshFormatEl(){
+        //全局遮罩,按钮禁用
+        this.refreshBtnLoading = true
+        this.refreshLoading = this.$loading({
+            lock: true,
+            text: `${this.$t('Slides.refresh_ppt_el')}...`,
+            spinner: 'el-icon-loading',
+            customClass:'loading',
+            target:document.querySelector('.page-wrap'),
+            background: 'rgba(255, 255, 255, 0.8)'
+        });
+        //刷新图表
+        let chartArr = this.getPPTElIds('chart','chartId')
+        chartArr.length&&await this.refreshCharts(chartArr,this.$route.query.id,Date.now().toString().slice(-6))
+        //刷新表格
+        let sheetArr = this.getPPTElIds('sheet','sheetId')
+        sheetArr.length&&await this.refreshSheets(sheetArr,this.$route.query.id,Date.now().toString().slice(-6))
+        this.refreshLoading&&this.refreshLoading.close()
+        if(!chartArr.length&&!sheetArr.length){
+            this.refreshBtnLoading = false
+            return this.$message.warning(this.$t('Slides.refresh_ppt_hint'))
+        }
+        this.refreshLoading = this.$loading({
+            lock: true,
+            text: `${this.$t('Slides.retrieving_ppt_data')}...`,
+            spinner: 'el-icon-loading',
+            customClass:'loading',
+            target:document.querySelector('.page-wrap'),
+            background: 'rgba(255, 255, 255, 0.8)'
+        });
+        /**
+         * 刷新完成后:
+         * 清空chartInfoMap(store)
+         * 清空optionMap(data)
+         * 清空sheetDataMap(data)
+         */
+        this.$store.commit('SET_CHART_INFO_MAP',{})
+        this.optionMap = {}
+        this.sheetDataMap = {}
+
+        //重新加载所有PPT页
+        //获取数据
+        await this.initPPTAllPage(this.pageList)
+        //渲染元素
+        for(let i=0;i<this.pageList.length;i++){
+            await this.initPageElements(this.pageList[i])
+        }
+        //获取已加载图表的信息
+        let chartInfoMap = {}
+        for(let i=0;i<this.pageList.length;i++){
+            this.pageList[i].elements.forEach(item=>{
+                if(item.type==='chart'){
+                    let temp = getChartInfo(this.optionMap[item.chartId])
+                    chartInfoMap[item.chartId] = temp
+                }
+            })
+        }
+        this.$store.commit('SET_CHART_INFO_MAP',chartInfoMap)
+        //移除遮罩,按钮启用
+        this.refreshLoading&&this.refreshLoading.close()
+        this.refreshBtnLoading = false
+    },
+    getPPTElIds(type,typeKey){
+        let code_arr = []
+        for(let i=0;i<this.pageList.length;i++){
+            this.pageList[i].elements.forEach(item=>{
+                if(item.type===type){
+                    code_arr.push(item[typeKey])
+                }
+            })
+        }
+        return [...new Set(code_arr)]
+    },
+    async refreshCharts(code_arr,id,replaceId){
+        //获取所有图表code
+        let res = await dataBaseInterface.getReportrefreshStatus({
+            Source:this.currentLang==='en'?'en_ppt':'ppt',
+            PrimaryId: Number(id||replaceId),
+        })
+        if(!res.Data.RefreshResult) return this.$message.warning(this.$t('ReportManage.ReportList.chart_refreshed_msg'))
+        const { Ret, Msg } = await dataBaseInterface.reportRefresh({
+            ChartInfoCode: code_arr,
+            Source:this.currentLang==='en'?'en_ppt':'ppt',
+            PrimaryId: Number(id||replaceId)
+        })
+        if(Ret!==200) return 
+        this.$message.success(Msg)
+    },
+    async refreshSheets(code_arr,id,replaceId){
+        let res = await sheetInterface.getRefreshResult({
+            Source:this.currentLang==='en'?'en_ppt':'ppt',
+            PrimaryId: Number(id||replaceId)
+        });
+        if(!res.Data.RefreshResult) return this.$message.warning(this.$t('ReportManage.ReportList.chart_refreshed_msg'))
+        const { Ret,Msg } = await sheetInterface.refreshSheet({
+            ExcelCodes: code_arr,
+            Source:this.currentLang==='en'?'en_ppt':'ppt',
+            PrimaryId: Number(id||replaceId)
+        })
+        if(Ret!==200) return 
+        this.$message.success(Msg)
+    }
   },
   mounted(){
     document.addEventListener("keydown",this.handlePasteKey)

+ 9 - 9
src/views/ppt_manage/newVersion/pptCatalog.vue

@@ -227,7 +227,7 @@
               :style="item.BackgroundImg?{background: `no-repeat top/cover url('${item.BackgroundImg}')`}:{}">
                 <span>{{item.Title}}</span>
               </div>
-              <span style="font-size:14px;">{{$t('Slides.creation_time')}}:{{$moment(item.PptCreateTime).format('YYYY-MM-DD')}}</span>
+              <span style="font-size:14px;">{{$t('Slides.creation_time')}}:{{$moment(item.PptModifyTime).format('YYYY-MM-DD')}}</span>
             </div> -->
             <div class="list-item" 
                 v-for="item in catalogPPTList" :key="item.PptId"
@@ -242,12 +242,10 @@
                     </span>
                 </div>
                 <div class="item-foot" style="margin-bottom:0;">
-                    <span style="font-size:14px;">{{$t('Slides.creation_time')}}:{{$moment(item.PptCreateTime).format('YYYY-MM-DD')}}</span>
-                    <img
-                        v-if="treeName==='private'&&selectNode"
-                        src="~@/assets/img/ppt_m/move_ico2.png"
-                        style="width: 14px; height: 14px; margin-right: 8px"
-                    />
+                  <el-tooltip :content="$t('Slides.update_time')" placement='top' :enterable="false">
+                    <span class="item-update-item">{{$moment(item.PptModifyTime).format('YYYY-MM-DD HH:mm:ss')}}</span>
+                  </el-tooltip>
+                  <span>{{ $i18n.locale == 'zh'?`${item.PptPage}页`:`P${item.PptPage}` }}</span>
                 </div>
             </div>
           </draggable>
@@ -1596,9 +1594,11 @@ export default {
             margin-bottom: 10px;
             font-size: 16px;
             span{
-              flex:1;
-              overflow: hidden;
+              font-size:14px;
               white-space: nowrap;
+            }
+            .item-update-item{
+              overflow: hidden;
               text-overflow: ellipsis;
             }
             img{

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

@@ -94,7 +94,7 @@
                         <!-- 页码 -->
                         <span class="page-num"> {{$i18n.locale == 'zh' ?`第${index+1}页`:` Slide${index+1}`}}</span>
                         <!-- 更新图表 -->
-                        <span class="update-btn" v-show="item.modelId!==6&&item.elements.find((i)=>i.type==='chart')" @click.stop="updatePage(item)"><span class="update-ico"></span> {{$t('Slides.update_chart_btn')}}</span>
+                        <span class="update-btn" v-show="item.modelId!==6&&item.elements.find((i)=>i.type==='chart'||i.type==='sheet')" @click.stop="updatePage(item)"><span class="update-ico"></span> {{$t('Slides.update_chart_btn')}}</span>
                     </div>
                     <AddFormat v-if="index===pageList.length-1" @addPage="addPage($event,index+1)" :chooseModalId="chooseModalId"/>
                 </div> 
@@ -113,6 +113,7 @@
                 style="color: #666; margin-bottom: 15px"
             >{{$t('Slides.last_save_time')}}:{{lastSaveTime}}</div>
             <div class="tool-btn">
+                <el-button type="primary" :loading="refreshBtnLoading" @click="refleshFormatEl">{{$t('Slides.operations_refresh')}}</el-button>
                 <el-button v-permission="permissionBtn.pptPermission.ppt_publish"
                  type="primary" @click="handlePublish">{{$t('Slides.go_to_publish')}}</el-button>
                 <el-button @click="handleSave('save')">{{$t('Slides.operations_save')}}</el-button>
@@ -1092,6 +1093,8 @@ export default {
       if(this.loopTimer) return 
       if(!this.$route.query.id&&!this.pptId) return
       this.loopTimer = setInterval(()=>{
+        //如果当前在刷新图表,则不进行自动保存
+        if(this.refreshBtnLoading) return
         const ppt_id = this.$route.query.id||this.pptId
         const {Title,ReportType,PptDate,BackgroundImg,BackIndex} = this.firstPage
         const FirstPage = {

+ 11 - 6
src/views/ppt_manage/newVersion/pptEnCatalog.vue

@@ -222,7 +222,7 @@
               :style="item.BackgroundImg?{background: `no-repeat top/cover url('${item.BackgroundImg}')`}:{}">
                 <span>{{item.Title}}</span>
               </div>
-              <span style="font-size:14px;">{{$t('Slides.creation_time')}}:{{$moment(item.PptCreateTime).format('YYYY-MM-DD')}}</span>
+              <span style="font-size:14px;">{{$t('Slides.creation_time')}}:{{$moment(item.PptModifyTime).format('YYYY-MM-DD')}}</span>
             </div> -->
             <div class="list-item" 
                 v-for="item in catalogPPTList" :key="item.PptId"
@@ -237,12 +237,15 @@
                     </span>
                 </div>
                 <div class="item-foot" style="margin-bottom:0;">
-                    <span style="font-size:14px;">{{$t('Slides.creation_time')}}:{{$moment(item.PptCreateTime).format('YYYY-MM-DD')}}</span>
-                    <img
+                    <el-tooltip :content="$t('Slides.update_time')" placement='top' :enterable="false">
+                      <span class="item-update-item">{{$moment(item.PptModifyTime).format('YYYY-MM-DD HH:mm:ss')}}</span>
+                    </el-tooltip>
+                    <span>{{ $i18n.locale == 'zh'?`${item.PptPage}页`:`P${item.PptPage}` }}</span>
+                    <!-- <img
                         v-if="treeName==='private'&&selectNode"
                         src="~@/assets/img/ppt_m/move_ico2.png"
                         style="width: 14px; height: 14px; margin-right: 8px"
-                    />
+                    /> -->
                 </div>
             </div>
           </draggable>
@@ -1484,9 +1487,11 @@ export default {
             margin-bottom: 10px;
             font-size: 16px;
             span{
-              flex:1;
-              overflow: hidden;
+              font-size:14px;
               white-space: nowrap;
+            }
+            .item-update-item{
+              overflow: hidden;
               text-overflow: ellipsis;
             }
             img{

+ 3 - 0
src/views/ppt_manage/newVersion/pptEnEditor.vue

@@ -110,6 +110,7 @@
                 style="color: #666; margin-bottom: 15px"
             >{{$t('Slides.last_save_time')}}:{{lastSaveTime}}</div>
             <div class="tool-btn">
+                <el-button type="primary" :loading="refreshBtnLoading" @click="refleshFormatEl">{{$t('Slides.operations_refresh')}}</el-button>
                 <el-button v-permission="permissionBtn.enPPTPermission.pptEn_publish"
                  type="primary" @click="handlePublish">{{$t('Slides.go_to_publish')}}</el-button>
                 <el-button @click="handleSave('save')">{{$t('Slides.operations_save')}}</el-button>
@@ -1078,6 +1079,8 @@ export default {
       if(this.loopTimer) return 
       if(!this.$route.query.id&&!this.pptId) return
       this.loopTimer = setInterval(()=>{
+        //如果当前在刷新图表,则不进行自动保存
+        if(this.refreshBtnLoading) return
         const ppt_id = this.$route.query.id||this.pptId
         const {Title,ReportType,PptDate,BackgroundImg,BackIndex} = this.firstPage
         const FirstPage = {

+ 3 - 3
src/views/predictEdb_manage/predictEdb.vue

@@ -1527,9 +1527,9 @@ export default {
 	mounted() {
 		const obj=sessionStorage.getItem('predictEdbTreeData')
 		if(obj||this.$route.query.code){
-			let code=obj?this.$route.query.code:JSON.parse(obj).code
-			let id=obj?this.$route.query.id:JSON.parse(obj).id
-			let classifyId=obj?this.$route.query.classifyId:JSON.parse(obj).classifyId
+			let code=this.$route.query.code?this.$route.query.code:JSON.parse(obj).code
+			let id=this.$route.query.code?this.$route.query.id:JSON.parse(obj).id
+			let classifyId=this.$route.query.code?this.$route.query.classifyId:JSON.parse(obj).classifyId
 			this.getTreeData({code: code,id: Number(id),classifyId:Number(classifyId)})
 		}else{
 			this.getTreeData()

+ 8 - 6
src/views/report_manage/mixins/messagePush.js

@@ -106,13 +106,14 @@ export default {
       if(this.$route.query.id&&code_arr.length) {
         let res = await dataBaseInterface.getReportrefreshStatus({
           Source: fromPage,
-          ReportId: Number(this.$route.query.id),
-          ReportChapterId: 0
+          PrimaryId: Number(this.$route.query.id||Date.now().toString().slice(-6)),
         });
         
         if(!res.Data.RefreshResult) return this.$message.warning(this.$t('ReportManage.ReportList.chart_refreshed_msg'))
         const { Ret,Msg } = await dataBaseInterface.reportRefresh({
-            ChartInfoCode: code_arr
+            ChartInfoCode: code_arr,
+            Source: fromPage,
+            PrimaryId: Number(this.$route.query.id||Date.now().toString().slice(-6)),
           })
           
           if(Ret === 200) {
@@ -130,12 +131,13 @@ export default {
         //获取刷新结果
         let res = await sheetInterface.getRefreshResult({
             Source: fromPage,
-            ReportId: Number(this.$route.query.id),
-            ReportChapterId: 0
+            PrimaryId: Number(this.$route.query.id||Date.now().toString().slice(-6)),
           });
         if(!res.Data.RefreshResult) return this.$message.warning(this.$t('ReportManage.ReportList.chart_refreshed_msg'))
         const { Ret,Msg } = await sheetInterface.refreshSheet({
-            ExcelCodes: sheet_code_arr
+            ExcelCodes: sheet_code_arr,
+            Source: fromPage,
+            PrimaryId: Number(this.$route.query.id||Date.now().toString().slice(-6)),
           })
           
           if(Ret === 200) {

+ 5 - 3
src/views/report_manage/reportdtl.vue

@@ -3,7 +3,8 @@
 		<header>{{reportInfo.Title}}</header>
 		<div style="padding:0 35px 0; box-sizing:border-box; color:#666; font-size:24px; overflow:hidden;">
 		  <span>{{$route.query.fromPage=='strategyReport'?'Horizon Insights FICC Team':reportInfo.Author}}</span>
-		  <span style="float:right;">{{reportInfo.PublishTime}}</span>
+			<!-- 已发布、已通过展示发布时间 -->
+		  <span style="float:right;" v-if="[2,6].includes(reportInfo.State)">{{reportInfo.PublishTime}}</span>
 		</div>
 		
 		<!-- 英文版摘要+overview -->
@@ -87,9 +88,10 @@
 					}
 					
 					if(this.$route.query.fromPage == 'en'){
-						str=`${baseUrl}/reportshare_crm_report_en?code=${this.$route.query.code}&flag=${waterMarkStr}`
+						// 加 & 是防止影响到上一个参数
+						str=`${baseUrl}/reportshare_crm_report_en?code=${this.$route.query.code}&flag=${waterMarkStr}& ${this.reportInfo.Title}`
 					}else{
-						str=`${baseUrl}/reportshare_crm_report?code=${this.$route.query.code}&flag=${waterMarkStr}`
+						str=`${baseUrl}/reportshare_crm_report?code=${this.$route.query.code}&flag=${waterMarkStr}& ${this.reportInfo.Title}`
 					}
 				}
 				

+ 9 - 9
src/views/smartReport/editReport.vue

@@ -371,7 +371,7 @@ export default {
             layoutBaseInfo:{
                 研报标题:'',
                 研报作者:'',
-                创建时间:''
+                创建时间:'', //一开始定义的是创建时间,后改为发布时间
             }
         }
     },
@@ -802,7 +802,6 @@ export default {
                     this.reportInfo.Title=params.Title
                     this.layoutBaseInfo['研报标题']=params.Title
                     this.layoutBaseInfo['研报作者']=params.Author
-                    this.layoutBaseInfo['创建时间']=params.CreateTime
                     this.showReportBaseInfo=false
                 }
             })
@@ -842,7 +841,6 @@ export default {
                     this.bgColor=res.Data.CanvasColor
                     this.layoutBaseInfo['研报标题']=res.Data.Title
                     this.layoutBaseInfo['研报作者']=res.Data.Author
-                    this.layoutBaseInfo['创建时间']=res.Data.CreateTime
                     this.$nextTick(()=>{
                         this.contentChange=false
                     })
@@ -874,14 +872,15 @@ export default {
             if(this.$route.query.id&&code_arr.length) {
                 let res = await dataBaseInterface.getReportrefreshStatus({
                 Source: 'smart_report',
-                ReportId: Number(this.$route.query.id),
-                ReportChapterId: 0
+                PrimaryId: Number(this.$route.query.id||Date.now().toString().slice(-6)),
                 });
                 
                 if(!res.Data.RefreshResult) return this.$message.warning(this.$t('ReportManage.ReportList.chart_refreshed_msg'))
 
                 const { Ret,Msg } = await dataBaseInterface.reportRefresh({
-                    ChartInfoCode: code_arr
+                    ChartInfoCode: code_arr,
+                    Source: 'smart_report',
+                    PrimaryId: Number(this.$route.query.id||Date.now().toString().slice(-6)),
                 })
                 
                 if(Ret === 200) {
@@ -898,12 +897,13 @@ export default {
                 //获取刷新结果
                 let res = await sheetInterface.getRefreshResult({
                     Source: 'smart_report',
-                    ReportId: Number(this.$route.query.id),
-                    ReportChapterId: 0
+                    PrimaryId: Number(this.$route.query.id||Date.now().toString().slice(-6)),
                 });
                 if(!res.Data.RefreshResult) return this.$message.warning('表格正在刷新中,请勿重复操作')
                 const { Ret,Msg } = await sheetInterface.refreshSheet({
-                    ExcelCodes: sheet_code_arr
+                    ExcelCodes: sheet_code_arr,
+                    PrimaryId:Number(this.$route.query.id||Date.now().toString().slice(-6)),
+                    Source: 'smart_report',
                 })
                 
                 if(Ret === 200) {

+ 5 - 9
src/views/smartReport/reportDetail.vue

@@ -22,7 +22,7 @@
                 <header>{{reportInfo.Title}}</header>
                 <div style=" box-sizing:border-box; color:#666; font-size:24px; overflow:hidden;">
                     <span>{{ reportInfo.Author}}</span>
-                    <span style="float:right;">{{reportInfo.CreateTime}}</span>
+                    <span style="float:right;" v-if="[2,6].includes(reportInfo.State)">{{reportInfo.PublishTime}}</span>
                 </div>
             </div>
             <div class="abstract" v-if="reportInfo && !!reportInfo.NeedSplice">
@@ -90,7 +90,8 @@ export default {
 			let str=''
 			const baseUrl= localStorage.getItem('dynamicOutLinks') ? JSON.parse(localStorage.getItem('dynamicOutLinks')).ReportViewUrl : '';
 			if(this.$route.query.code){
-				str=`${baseUrl}/reportshare_smart_report?code=${this.$route.query.code}`
+                // 加 & 是防止影响到上一个参数
+				str=`${baseUrl}/reportshare_smart_report?code=${this.$route.query.code}& ${this.reportInfo && this.reportInfo.Title}`
 			}
 			return str
 		},
@@ -143,16 +144,11 @@ export default {
                 if(res.Ret===200){
                     this.reportInfo=res.Data || {}
                     this.headImgStyle=this.reportInfo.HeadStyle?JSON.parse(this.reportInfo.HeadStyle):[]
-                    this.headImgStyle.map(st =>{
-                        st.value=st.value || st.label
-                    })
                     this.endImgStyle=this.reportInfo.EndStyle?JSON.parse(this.reportInfo.EndStyle):[]
-                    this.endImgStyle.map(st =>{
-                        st.value=st.value || st.label
-                    })
                     this.layoutBaseInfo['研报标题']=this.reportInfo.Title
                     this.layoutBaseInfo['研报作者']=this.reportInfo.Author
-                    this.layoutBaseInfo['创建时间']=this.reportInfo.CreateTime
+                    // 已发布已通过的报告才显示发布时间
+                    this.layoutBaseInfo['创建时间']=[2,6].includes(this.reportInfo.State)?this.reportInfo.PublishTime:''
                     if(this.$route.query.type==='preview'){
                        this.content=sessionStorage.getItem('smartReportContent')
                        this.bgColor=sessionStorage.getItem('smartReportContentBg')

+ 62 - 6
src/views/system_manage/chartTheme/index.vue

@@ -1,5 +1,22 @@
 <template>
   <div class="chartTheme-page">
+    <!-- 全局配置 -->
+    <div class="setting-box" v-if="permissionBtn.isShowBtn('chartThemePermission','chartTheme_chartsource')">
+        <div class="setting-item">
+            <span>
+                {{$t('SystemManage.ChartSet.label00')}}
+                <el-tooltip class="item" effect="dark" :content="$t('SystemManage.ChartSet.label00_hint')" placement="top">
+                    <i class="el-icon-warning"></i>
+                </el-tooltip>
+            </span>
+            <el-switch 
+                @change="saveSetting"
+                v-model="ChartSourceDisplay" 
+                active-value="true" 
+                inactive-value="false"/>
+        </div>
+    </div>
+
     <div class="header">
       <div style="display: flex;gap:20px;">
         <div class="select-item">
@@ -30,7 +47,9 @@
 
       <el-button type="primary" v-permission="permissionBtn.chartThemePermission.chartTheme_edit" @click="setConfigTheme">{{$t('Dialog.confirm_save_btn')}}</el-button>
     </div>
-
+    <div class="gap-box">
+        <span style="flex:1;background-color: #C8CDD9;"></span>
+    </div>
     <!-- 主题列表 -->
     <div class="main">
       <ul class="list-wrap">
@@ -61,7 +80,6 @@
 
     </div>
 
-
    <!-- 弹窗 -->
     <m-dialog 
       :title="`${addThemeForm.id?$t('SystemManage.ChartSet.edit_btn'):$t('SystemManage.ChartSet.edit_btn')}`" 
@@ -94,6 +112,7 @@
 </template>
 <script>
 import * as chartThemeInterface from '@/api/modules/chartThemeApi';
+import {etaBaseConfigInterence} from '@/api/modules/etaBaseConfigApi.js';
 import mDialog from '@/components/mDialog.vue';
 export default {
   components: { mDialog },
@@ -110,10 +129,13 @@ export default {
       isOpenThemeDia: false,
       addThemeForm: {
         themeName: '',
-      }
+      },
+      ChartSourceDisplay:'true',
+      baseConfig:{}
     };
   },
   mounted() {
+    this.getChartBaseSetting()
     this.getChartType()
   },
   methods: {
@@ -197,6 +219,23 @@ export default {
       this.isOpenThemeDia = false;
 
       this.getThemeList()
+    },
+    async getChartBaseSetting(){
+        //目前是用基本配置的接口,后续有多个配置再改
+        const res = await etaBaseConfigInterence.getBaseConfig()
+        if(res.Ret!==200) return 
+        const {ChartSourceDisplay} = res.Data||{}
+        this.baseConfig = res.Data
+        this.ChartSourceDisplay = ChartSourceDisplay||'true'
+    },
+    async saveSetting(){
+        etaBaseConfigInterence.saveBaseConfig({
+            ...this.baseConfig,
+            ChartSourceDisplay:this.ChartSourceDisplay
+        }).then(res=>{
+            if(res.Ret!==200) return 
+            this.$message.success(this.$t('MsgPrompt.saved_msg'))
+        })
     }
   },
 };
@@ -210,22 +249,36 @@ export default {
     display: flex;
     align-items: center;
   }
-  .header,.main {
+  .header,.main,.setting-box {
     padding: 20px 30px;
     background: #fff;
     position: relative;
     border: 1px solid #ececec;
     border-radius: 4px;
-    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+    /* box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05); */
   }
   .header {
     display: flex;
     justify-content: space-between;
-    margin-bottom: 30px;
+    /* margin-bottom: 30px; */
     gap: 20px;
+    border-bottom: none;
+    border-bottom-left-radius: 0;
+    border-bottom-right-radius: 0;
+  }
+  .gap-box{
+    border-left: 1px solid #ececec;
+    border-right: 1px solid #ececec;
+    height:1px;
+    background-color: white;
+    display: flex;
+    padding:0 30px;
   }
   .main {
      min-height: calc(100vh - 240px);
+     border-top: none;
+     border-top-right-radius: 0;
+     border-top-left-radius: 0;
   }
   .list-wrap {
     display: flex;
@@ -274,6 +327,9 @@ export default {
       }
     }
   }
+  .setting-box{
+    margin-bottom: 30px;
+  }
 }
 </style>
 <style lang="scss">

+ 6 - 4
src/views/system_manage/components/addUserDialog.vue

@@ -9,7 +9,8 @@
         <el-form @submit.native.prevent :model="userForm" :rules="userRule" ref="userForm" label-width="160px"
             class="demo-ruleForm" style="marginTop:15px;">
             <el-form-item :label="$t('SystemManage.DepartManage.user_login_accout')" prop="account">
-                <el-input v-model="userForm.account" :placeholder="$t('SystemManage.DepartManage.user_add_placeholder01')" :disabled="userForm.disabledForm" clearable>
+                <el-input v-model="userForm.account" :placeholder="$t('SystemManage.DepartManage.user_add_placeholder01')" 
+                :disabled="userForm.disabledForm || userForm.isAdminEdit" clearable>
                 </el-input>
             </el-form-item>
             <el-form-item :label="$t('SystemManage.DepartManage.user_login_pwd')" prop="pwd" v-if="userForm.title == $t('SystemManage.DepartManage.user_add_btn')">
@@ -17,7 +18,8 @@
                     :type="userForm.title == $t('SystemManage.DepartManage.user_add_btn') ? 'text' : 'password' " clearable></el-input>
             </el-form-item>
             <el-form-item :label="$t('SystemManage.DepartManage.user_table_name')" prop="name">
-                <el-input v-model="userForm.name" :placeholder="$t('SystemManage.DepartManage.user_add_placeholder03')"  clearable>
+                <el-input v-model="userForm.name" :placeholder="$t('SystemManage.DepartManage.user_add_placeholder03')"  clearable
+                :disabled="userForm.isAdminEdit">
                 </el-input>
             </el-form-item>
             <el-form-item :label="$t('SystemManage.DepartManage.user_table_mobile')" prop="mobile" class="mobile-input-item">
@@ -46,7 +48,7 @@
                 <el-input :disabled="hasEmployeeNo" v-model="userForm.employeeNumber" :placeholder="$t('SystemManage.DepartManage.user_add_placeholder07')"></el-input>
             </el-form-item>
             <el-form-item :label="$t('SystemManage.DepartManage.user_role')" prop="role">
-                <el-select v-model="userForm.role" :placeholder="$t('SystemManage.DepartManage.user_role')" :disabled="userForm.disabledForm" @change="roleChange">
+                <el-select v-model="userForm.role" :placeholder="$t('SystemManage.DepartManage.user_role')" :disabled="userForm.disabledForm || userForm.isAdminEdit" @change="roleChange">
                     <el-option v-for="item in roleArr" :key="item.RoleId" :label="item.RoleName" :value="item.RoleId">
                     </el-option>
                 </el-select>
@@ -66,7 +68,7 @@
                         :cityInfo="userForm.city"
                         @selected="selectRegion"/>
             </el-form-item>
-            <el-form-item :label="$t('SystemManage.DepartManage.user_table_status')" prop="status">
+            <el-form-item :label="$t('SystemManage.DepartManage.user_table_status')" prop="status" v-if="!userForm.isAdminEdit">
                 <el-radio-group v-model="userForm.status" :disabled="userForm.disabledStatus">
                     <el-radio :label="1">{{$t('SystemManage.DepartManage.user_table_status_open')}}</el-radio>
                     <el-radio :label="0">{{$t('SystemManage.DepartManage.user_table_status_ban')}}</el-radio>

+ 9 - 4
src/views/system_manage/components/smartReportImgSet.vue

@@ -215,9 +215,13 @@ export default {
             },
             step:1,
             steps:[this.$t('SystemManage.BaseConfig.select_layout'),this.$t('SystemManage.BaseConfig.edit_layout')],
+            /**
+             * value不能变 
+             * 一开始定义为创建时间,后面改为发布时间
+             */
             layoutOptions:[{value:'研报标题',label:this.$t('SystemManage.BaseConfig.report_title')},//研报标题
                             {value:'研报作者',label:this.$t('SystemManage.BaseConfig.report_author')},//研报作者
-                            {value:'创建时间',label:this.$t('SystemManage.BaseConfig.report_creation_time')}],//创建时间
+                            {value:'创建时间',label:this.$t('SystemManage.BaseConfig.report_release_time')}],//发布时间
             layoutItems:[],
             // currentLayout:{},
             layoutFont:{
@@ -479,8 +483,8 @@ export default {
                 try {
                     this.layoutItems=this.formData.layout?JSON.parse(this.formData.layout).map(it =>{
                         return {
-                            value:it.value || it.label,
-                            label:this.convertLabel(it.value || it.label),
+                            value:it.value,
+                            label:this.convertLabel(it.value),
                             x:this.percent2Number(it.left,backgroundWidth),
                             y:this.percent2Number(it.top,backgroundGHeight),
                             z:1,
@@ -782,7 +786,8 @@ export default {
         }
     }
     .layout-background{
-        background-color: #D9D9D9;
+        // background-color: #D9D9D9;
+        border: solid 1px #D9D9D9;
         margin-left: 43px;
         width: 400px;
         text-align: center;

+ 2 - 1
src/views/system_manage/departManage.vue

@@ -124,7 +124,7 @@
 								<span v-permission="permissionBtn.sysDepartPermission.sysDepart_moveGroup"
 									class="editsty" @click.stop="moveDepart(scope.row)">{{$t('SystemManage.DepartManage.user_table_move_group')}}</span>
 								<span v-permission="permissionBtn.sysDepartPermission.sysDepart_enable"
-									class="editsty" 
+									class="editsty" v-if="scope.row.AdminName != 'admin'"
 									@click.stop="handleChangeStatus(scope.row)"
 								>{{scope.row.Enabled===0?$t('SystemManage.DepartManage.user_table_status_open'):$t('SystemManage.DepartManage.user_table_status_ban')}}</span>
 								<!-- <span v-permission="permissionBtn.sysDepartPermission.sysDepart_del"
@@ -1245,6 +1245,7 @@ export default {
 				title:this.$t('SystemManage.DepartManage.user_edit_btn'),
 				admin_id:item.AdminId,
 				account:item.AdminName,
+				isAdminEdit:item.AdminName=="admin",
 				pwd:item.Password,
 				employeeNumber:item.EmployeeId,
 				// oldPwd:item.Password,

+ 1 - 1
src/views/system_manage/roleManage.vue

@@ -42,7 +42,7 @@
 					<template slot-scope="scope"> <span>{{scope.row.RoleType}}</span> </template>
 				</el-table-column>
 				<el-table-column :label="$t('Table.column_operations')" align="center">
-					<template slot-scope="scope">
+					<template slot-scope="scope" v-if="scope.row.RoleName!='admin'">
 						<div style="color:#4099ef; font-size:24px;">
 							<!-- <span v-permission="permissionBtn.sysDepartPermission.sysRole_settingAuth"
 								class="editsty" @click.stop="getAuthDetail(scope.row)" style="marginRight:20px;">查看权限</span> -->

+ 1 - 1
src/vuex/index.js

@@ -34,8 +34,8 @@ const state = {
   hasTrialUserPermisson:false,
   permissionRoute:[], //用于需要验证是否有某个菜单的权限
   baseInfo:{},
-
   lang: localStorage.getItem('i18n') || 'zh',//全局语言版本 zh en
+  closableHints:[], //可关闭的信息提示
 };
 
 export default {

+ 9 - 2
src/vuex/mutations.js

@@ -81,10 +81,17 @@ const mutations = {
   SET_BASE_INFO(state,obj) {
     state.baseInfo={...state.baseInfo,...obj};
   },
-
   SET_LANG(state,lang) {
     state.lang = lang;
-  }
+  },
+  //添加可关闭的信息提示
+  PUSH_CLOSABLE_HINT(state,hintObj) {
+    state.closableHints.push(hintObj)
+  },
+  //清空可关闭的信息提示
+  CLEAR_CLOSABLE_HINT(state) {
+    state.closableHints=[]
+  },
 };
 
 export default mutations;