bding 11 månader sedan
förälder
incheckning
b44c6cb284
79 ändrade filer med 3074 tillägg och 690 borttagningar
  1. 81 0
      src/api/modules/toolBoxApi.js
  2. BIN
      src/assets/img/icons/edb-icon.png
  3. BIN
      src/assets/img/ppt_m/list_bg.png
  4. BIN
      src/assets/img/ppt_m/move_ico2.png
  5. 47 18
      src/components/lzTable.vue
  6. 24 0
      src/lang/modules/EtaBase/commonLang.js
  7. 18 1
      src/lang/modules/EtaChart/En.js
  8. 16 1
      src/lang/modules/EtaChart/Zh.js
  9. 1 1
      src/lang/modules/MainApp/En.js
  10. 56 1
      src/lang/modules/ReportManagement/CategoryList.js
  11. 47 1
      src/lang/modules/ReportManagement/CommodityConfiguration.js
  12. 216 0
      src/lang/modules/SemanticsManage/ASRpage.js
  13. 2 0
      src/lang/modules/SemanticsManage/indexEn.js
  14. 2 0
      src/lang/modules/SemanticsManage/indexZh.js
  15. 12 0
      src/lang/modules/Slides/pptList.js
  16. 10 2
      src/lang/modules/ToolBox/AIQuestion.js
  17. 3 1
      src/lang/modules/ToolBox/IndexEn.js
  18. 3 1
      src/lang/modules/ToolBox/IndexZh.js
  19. 4 0
      src/lang/modules/ToolBox/PositionAnalysis.js
  20. 41 0
      src/lang/modules/ToolBox/calendar/ForexCalendar.js
  21. 64 0
      src/lang/modules/ToolBox/calendar/commonLang.js
  22. 4 0
      src/lang/modules/systemManage/OutLinkConfig.js
  23. 11 2
      src/main.js
  24. 9 1
      src/routes/modules/approveRoutes.js
  25. 151 16
      src/routes/modules/chartRoutes.js
  26. 63 2
      src/routes/modules/dataRoutes.js
  27. 6 0
      src/routes/modules/dataSource.js
  28. 92 1
      src/routes/modules/oldRoutes.js
  29. 14 4
      src/routes/modules/pptRoutes.js
  30. 27 4
      src/routes/modules/semanticsRoutes.js
  31. 11 2
      src/routes/modules/supplyRoutes.js
  32. 10 1
      src/utils/buttonConfig.js
  33. 33 0
      src/utils/defaultOptions.js
  34. 5 4
      src/views/Home.vue
  35. 5 5
      src/views/chartRelevance_manage/components/saveEdbToBaseDia.vue
  36. 36 19
      src/views/classify_manage/chapterSettingV2.vue
  37. 49 30
      src/views/classify_manage/classifyEnlistV2.vue
  38. 62 31
      src/views/classify_manage/classifylistV2.vue
  39. 17 11
      src/views/dataEntry_manage/addChart.vue
  40. 53 2
      src/views/dataEntry_manage/coal/index.vue
  41. 14 7
      src/views/dataEntry_manage/dataEntry.vue
  42. 2 2
      src/views/dataEntry_manage/databaseComponents/updateNewestDia.vue
  43. 17 11
      src/views/dataEntry_manage/editChart.vue
  44. 4 2
      src/views/dataEntry_manage/mixins/addOreditMixin.js
  45. 1 0
      src/views/dataEntry_manage/mixins/chartPublic.js
  46. 91 37
      src/views/dataEntry_manage/onlineExcelCopy.vue
  47. 10 7
      src/views/dataEntry_manage/thirdBase/BAIINFOTargetbase.vue
  48. 1 1
      src/views/dataEntry_manage/thirdBase/SCITargetbase.vue
  49. 40 6
      src/views/dataEntry_manage/thirdBase/YyzxData.vue
  50. 14 1
      src/views/dataEntry_manage/thirdBase/coalWord.vue
  51. 12 2
      src/views/dataEntry_manage/thirdBase/lzTargetbase.vue
  52. 15 0
      src/views/dataEntry_manage/thirdBase/mixins/leftMixin.js
  53. 7 4
      src/views/dataEntry_manage/thirdBase/ysTargetBase.vue
  54. 1 1
      src/views/datasheet_manage/common/customTable.js
  55. 15 1
      src/views/datasheet_manage/components/insertDateDia.vue
  56. 3 3
      src/views/operation_manage/AIQA/AIQA.vue
  57. 4 3
      src/views/positionAnalysis_manage/components/chartBox.vue
  58. 12 9
      src/views/positionAnalysis_manage/detail.vue
  59. 42 8
      src/views/ppt_manage/mixins/pptMixins.js
  60. 89 7
      src/views/ppt_manage/newVersion/pptCatalog.vue
  61. 85 4
      src/views/ppt_manage/newVersion/pptEnCatalog.vue
  62. 62 86
      src/views/ppt_manage/newVersion/pptEnPublish.vue
  63. 84 93
      src/views/ppt_manage/newVersion/pptPublish.vue
  64. 4 1
      src/views/ppt_manage/newVersion/utils/untils.js
  65. 8 5
      src/views/predictEdb_manage/components/operationDialog.vue
  66. 43 20
      src/views/report_manage/reportVarietyV2.vue
  67. 37 14
      src/views/sandbox_manage/sandFlowNew/components/addLInkDia.vue
  68. 117 69
      src/views/semantics_manage/asr/ASR.vue
  69. 49 21
      src/views/semantics_manage/asr/components/catalogueDia.vue
  70. 33 21
      src/views/semantics_manage/asr/components/editTag.vue
  71. 30 22
      src/views/semantics_manage/asr/components/exportDia.vue
  72. 26 14
      src/views/semantics_manage/asr/components/fileRename.vue
  73. 54 39
      src/views/semantics_manage/asr/components/makeTags.vue
  74. 2 1
      src/views/semantics_manage/asr/components/mediaCom.vue
  75. 10 5
      src/views/supply_manage/components/createTargetDia.vue
  76. 5 1
      src/views/system_manage/outlinkListConfig.vue
  77. 227 0
      src/views/toolBox_manage/ForexCalendar.vue
  78. 155 0
      src/views/toolBox_manage/components/BaseCalendar.vue
  79. 344 0
      src/views/toolBox_manage/components/addEventDialog.vue

+ 81 - 0
src/api/modules/toolBoxApi.js

@@ -11,4 +11,85 @@ export const ToolBoxInterface = {
     getSheetDetail:(params)=>{
         return http.get('/meeting_probabilities/detail',params)
     }
+}
+
+//外汇日历表
+export const ForexCalendarInterface = {
+    /**
+     * 获取品种列表
+     * @param {*} params 
+     * @returns [{ChartPermissionId,ChartPermissionName }]
+     */
+    getPermissionList:(params)=>{
+        return http.get("/fe_calendar/permission/list",params)
+    },
+    /**
+     * 获取日期范围内事项列表
+     * @param {*} params 
+     * @param {Number} params.ChartPermissionId 品种ID
+     * @param {String} params.StartDate 起始时间
+     * @param {String} params.EndDate 终止时间
+     * @returns [{
+     *      Date:"2024-03-28",//事项日期
+     *      Matters:[],//事项详情
+     * }]
+     */
+    getCalendarEventList:(params)=>{
+        return http.get("/fe_calendar/matter/list?",params)
+    },
+    /**
+     * 获取指定日期事项列表
+     * @param {Object} params 
+     * @param {Number} params.ChartPermissionId 品种ID
+     * @param {String} params.MatterDate "2024-03-29" 指定日期
+     * @returns [{ //事项详情
+     *      "FeCalendarMatterId": 2, //事项ID
+            "ChartPermissionId": 3, //品种ID
+            "ChartPermissionName": "原油", //品种名称
+            "MatterDate": "2024-03-29", //事项日期
+            "Title": "指标B0002", //事项标题
+            "MatterType": 2, //事项类型:1-自定义事项;2-基础指标;3-预测指标
+            "EdbInfoId": 104507, //指标ID
+            "EdbUniqueCode": "c7959050a204e7479c392d11d1b3b88e", //指标唯一编码
+            "EdbCode": "C2403297186", //指标编码
+            "FontColor": "#000fff", //字体颜色
+            "FillingColor": "#f28500", /填充颜色
+            "FontBold": 1, //字体加粗:0-否;1-是
+            "Sort": 1 //排序
+     * }]
+     */
+    getDailyEventList:(params)=>{
+        return http.get("/fe_calendar/matter/detail",params)
+    },
+    /**
+     * 保存指定日期的事项
+     * @param {Object} params //品种ID
+     * @param {Number} params.ChartPermissionId //事项日期
+     * @param {String} params.MatterDate //事项列表
+     * @param {Object[]} params.Matters
+     * @param {Number} params.Matters.FeCalendarMatterId //事项ID,大于0为更新
+     * @param {String} params.Matters.Title //事项标题
+     * @param {Number} params.Matters.MatterType //事项类型:1-自定义事项;2-基础指标;3-预测指标
+     * @param {Number} params.Matters.EdbInfoId //指标ID,类型为2/3时必填
+     * @param {String} params.Matters.EdbUniqueCode //指标唯一编码,类型为2/3时必填
+     * @param {String} params.Matters.EdbCode //指标编码,类型为2/3时必填
+     * @param {String} params.Matters.FontColor //字体颜色
+     * @param {String} params.Matters.FillingColor //填充颜色
+     * @param {Number} params.Matters.FontBold //字体加粗:0-否;1-是
+     * @param {Number} params.Matters.Sort //排序
+     * @returns 
+     */
+    saveDailyEvents:(params)=>{
+        return http.post("/fe_calendar/matter/save",params)
+    },
+    /**
+     * 搜索指标/预测指标库
+     * @param {*} params 
+     * @param {String} params.KeyWord
+     * @param {Number} params.CurrentIndex
+     * @returns 
+     */
+    searchEdbInfo:(params)=>{
+        return http.get("/datamanage/edb_info/filter_by_es/all",params)
+    }
 }

BIN
src/assets/img/icons/edb-icon.png


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


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


+ 47 - 18
src/components/lzTable.vue

@@ -9,24 +9,30 @@
 			>
 				<th>{{ labelArr.get(item) }}</th>
 				<td v-for="(data, sub_index) in tableOption" :key="sub_index">
-          <template v-if="source!=='baiinfo'">
-            {{ (item === 'Frequency' && source === 'lz') ? frequencyType.get(data[item]) : data[item] }}
-          </template>
+					<template v-if="source!=='baiinfo'">
+						{{
+							(['FrequencyName','Frequency'].includes(item)) 
+							? (source === 'lz')
+								? frequencyType.get(data[item])
+								: frequencyMap.get(data[item])
+							: data[item] 
+						}}
+					</template>
 					<!-- 百川盈孚数据源 频度和单位需要可编辑 -->
 					<template v-else>
-            <span>
-              {{data[item]}}
-              <span v-if="data['IndexCode']&&(item==='Frequency'||item==='Unit')">
-                <img
-                  v-permission="permissionBtn.dataSourcePermission.bcyfData_edit"
-                  src="~@/assets/img/set_m/edit.png"
-                  alt="edit"
-                  style="width: 14px; height: 14px; margin-left: 5px;cursor:pointer;"
-                  @click.stop="editTarget(data)"
-                />
-              </span>
-            </span>
-          </template>
+						<span>
+							{{ item==='Frequency'?frequencyMap.get(data[item]):data[item] }}
+							<span v-if="data['IndexCode']&&(item==='Frequency'||item==='Unit')">
+								<img
+									v-permission="permissionBtn.dataSourcePermission.bcyfData_edit"
+									src="~@/assets/img/set_m/edit.png"
+									alt="edit"
+									style="width: 14px; height: 14px; margin-left: 5px;cursor:pointer;"
+									@click.stop="editTarget(data)"
+								/>
+							</span>
+						</span>
+					</template>
 				</td>
 			</tr>
 		</template>
@@ -118,6 +124,29 @@ export default {
 			}
 
 			return key
+		},
+		//隆众原始数据库,返回频度不是string是number,分开写
+		frequencyType(){
+			return new Map([
+				[1, /* 日度 */ this.$t('Edb.FreAll.day')],
+				[2, /*周度*/ this.$t('Edb.FreAll.week')],
+				[3, /*月度*/ this.$t('Edb.FreAll.month')],
+				[4, /*季度*/ this.$t('Edb.FreAll.quarter')],
+				[5, /*年度*/ this.$t('Edb.FreAll.year')],
+				[99, /*无固定频率*/ this.$t('Edb.FreAll.unfixed')],
+			])
+		},
+		//其他数据源
+		frequencyMap(){
+			return new Map([
+				['日度',this.$t('Edb.FreAll.day')],
+				['周度',this.$t('Edb.FreAll.week')],
+				['月度',this.$t('Edb.FreAll.month')],
+				['旬度',this.$t('Edb.FreAll.dekad')],
+				['季度',this.$t('Edb.FreAll.quarter')],
+				['半年度',this.$t('Edb.FreAll.half_year')],
+				['年度',this.$t('Edb.FreAll.year')]
+			])
 		}
 	},
 	data() {
@@ -133,14 +162,14 @@ export default {
     //   : this.source==='baiinfo'
     //   ? ['IndexName','IndexCode','Frequency','Unit','ModifyTime']
 	// 		:['QuotaName','LzCode','Frequency','UnitName','ModifyTime'],
-			frequencyType:new Map([
+			/* frequencyType:new Map([
 				[1,'日度'],
 				[2,'周度'],
 				[3,'月度'],
 				[4,'季度'],
 				[5,'年度'],
 				[99,'无固定频率'],
-			]),
+			]), */
 			// labelArr: this.source === 'gl' ? new Map([
 			// 	['IndexName', '指标名称'],
 			// 	['IndexCode', '指标ID'],

+ 24 - 0
src/lang/modules/EtaBase/commonLang.js

@@ -108,6 +108,10 @@ export default {
     zh:'计算中...',
     en:'Calculating...'
   },
+  save_ing: {
+    zh:'保存中,请稍后······',
+    en:'Saving, please wait...'
+  },
   time_len_set: {
     zh:'时间长度设置',
     en:'Time Duration Setting'
@@ -355,6 +359,14 @@ export default {
       zh:'天',
       en:'day'
     },
+    unfixed: {
+      zh:'无固定频率',
+      en:'Unfixed frequency'
+    },
+    total:{
+      zh:'全部',
+      en:'All'
+    }
   },
 
   /* 计算方式 */
@@ -663,6 +675,10 @@ export default {
       zh: '请输入单位',
       en: 'Please input unit'
     },
+    select_unit: {
+      zh: '请选择单位',
+      en: 'Please select a unit'
+    },
     input_fre: {
       zh: '请选择频度',
       en: 'Please input frequency'
@@ -706,6 +722,14 @@ export default {
     input_n_value: {
       zh: '请输入N数值',
       en: 'Enter N Value'
+    },
+    input_keyword: {
+      zh: '请输入关键词',
+      en: 'Please enter a keyword'
+    },
+    input_value: {
+      zh: '请输入值',
+      en: 'Please input a value'
     }
     
   },

+ 18 - 1
src/lang/modules/EtaChart/En.js

@@ -82,6 +82,23 @@ export default {
     label_replace_edb: 'Replace Indicator',
     label_replace_to:'Replace with',
     label_add_moreserie:'More series configurations',
-    label_date_unit:'Day'
+    label_date_unit:'Day',
+
+
+
+    //图表单位转换
+    data_transformation: "Data Transformation",
+    divide_by: "Divide by",
+    multiply_by: "Multiply by",
+    logarithm: "Logarithm",
+    /**
+     * 单位:Edb.Detail.e_unit
+     * 保存:Dialog.confirm_save_btn
+     */
+    chart_set_radio: "Set to chart unit",
+    data_transformation_hint: "Invalid data conversion, please check the value",
+    data_transformation_hint2: "The indicator data contains negative numbers or zeros and cannot be logarithmically calculated",
+    data_transformation_list_hint: "Invalid data conversion, please check the value",
+    data_transformation_list_hint2: "The indicator data contains negative numbers or zeros and cannot be logarithmically calculated"
   }
 }

+ 16 - 1
src/lang/modules/EtaChart/Zh.js

@@ -82,6 +82,21 @@ export default {
     label_replace_edb: '指标替换',
     label_replace_to:'替换为',
     label_add_moreserie:'更多系列配置',
-    label_date_unit:'天'
+    label_date_unit:'天',
+
+    //图表单位转换
+    data_transformation: "数据转换",
+    divide_by: "除以",
+    multiply_by: "乘以",
+    logarithm: "对数",
+    /**
+     * 单位:Edb.Detail.e_unit,e_en_unit
+     * 保存:Dialog.confirm_save_btn
+     */
+    chart_set_radio: "设置为图表单位",
+    data_transformation_hint: "数据转换不合法,请检查数值",
+    data_transformation_hint2: "指标数据含有负数或0,无法进行对数运算",
+    data_transformation_list_hint: "第{num}个数据转换不合法,请检查数值",
+    data_transformation_list_hint2: "第{num}个指标数据含有负数或0,无法进行对数运算"
   }
 }

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

@@ -43,7 +43,7 @@ export default {
     ph_mobile: 'Please enter your mobile number',
     ph_email:'Please enter your email address',
     ph_img_code: 'Please enter the graphic verification code',
-    ph_msg_code: 'Please enter the verification code',
+    ph_msg_code: 'Enter verification code',
     ver_code_msg:'Get verification code',
     recode_ing_msg:'Retrieve Again({count})seconds',
     recode_msg:'Retrieve Again',

+ 56 - 1
src/lang/modules/ReportManagement/CategoryList.js

@@ -6,7 +6,7 @@
 export const CategoryListEn = {
   chinese_tabs: "Chinese Classification",
   english_tabs: "English research reports",
-  add_category_btn: "Add category",
+  add_category_btn: "Add Category",
   edit_category_btn: "Edit Category",
   category_name_ipt: "Category Name",
   one_category_table: "First-level category",
@@ -92,6 +92,31 @@ export const CategoryListEn = {
   check_permissions: "Please check the following permissions",
   Permission_success_msg: "Permission configuration successful",
   is_delete_chapter: "Are you sure to delete this chapter?",
+
+
+    /* 新版 */
+    add_category: "Add Category",
+    edit_category: "Edit Category",
+    //弹窗内容
+    category_name: "Category Name",
+    category_name_hint: "Enter Category Name",
+    category_name_check_hint: "Category Name: {name} Already Exists",
+    section_settings: "Section Settings",
+    add_section: "Add Section",
+    edit_section: "Edit Section",
+    section_name: "Section Name",
+    section_name_hint: "Enter Section Name",
+    parent_category: "Parent Category",
+    parent_none: "none",
+    related_variety: "Related Variety",
+    related_variety_inputhint: "Please Select",
+    related_variety_hint: "Control Report Reading Permission",
+    addition_successful: "Addition Successful",
+    modification_successful: "Modification Successful",
+    move_successful: "Move Successful",
+    add_section_successful: "Add Section Successful",
+    edit_section_successful: "Edit Section Successful",
+    setup_successful: "Setup Successful"
 };
 
 /* 中文 */
@@ -184,4 +209,34 @@ export const CategoryListZh = {
   check_permissions: "请勾选以下权限配置",
   Permission_success_msg: "权限配置成功",
   is_delete_chapter: "确认删除这个章节吗?",
+
+
+
+    /* 新版 */
+    add_category: "添加分类",
+    edit_category:"编辑分类",
+    /**
+     * 保存 取消:Dialog.confirm_save_btn,cancel_btn
+     * 启用 禁用: Common.enable,disable
+     */
+    category_name: "分类名称",
+    category_name_hint: "请输入分类名称",
+    category_name_check_hint: "分类名称: {name} 已存在",
+    section_settings: "章节设置",
+    add_section: "添加章节",
+    edit_section: "编辑章节",
+    section_name: "章节名称",
+    section_name_hint: "请输入章节名称",
+    parent_category: "上级分类",
+    parent_none:'无',
+    related_variety: "关联品种",
+    related_variety_inputhint: "请选择",
+    related_variety_hint: "控制报告阅读权限",
+    addition_successful: "新增成功",
+    modification_successful: "修改成功",
+    move_successful: "移动成功",
+    add_section_successful: "添加章节成功",
+    edit_section_successful: "编辑章节成功",
+    setup_successful: "设置成功" 
 };
+

+ 47 - 1
src/lang/modules/ReportManagement/CommodityConfiguration.js

@@ -1,5 +1,5 @@
 /**
- * 研报管理--品种配置
+ * 研报管理--品种管理
  */
 
 /* 英文 */
@@ -19,6 +19,27 @@ export const CommodityConfigurationEn = {
   delete_info_msg: "Are you sure you want to delete this file?",
   delete_success_msg: "Delete sucessful",
   delete_error_msg: "Please delete associated product under this category first",
+
+
+  /* 新版 */
+  chinese_tabs: "Chinese Variety",
+  english_tabs: "English Variety",
+  add_variety: "Add Variety",
+  edit_variety: "Variety Settings",
+  variety_name: "Variety Name",
+  parent_variety: "Parent Variety",
+  active_status: "Active Status",
+  set_root_hint:"The default value is private. Select and save the Settings to public",
+  set_root_text:"Public permission Settings",
+  variety_name_hint: "Enter Variety Name",
+  variety_name_check_hint: "Please Fill in Variety Name",
+  variety_name_check_hint2: "Variety Name Exists",
+  variety_add_succ_msg: "Addition Successful",
+  variety_edit_succ_msg: "Edit Successful",
+  variety_public:"Public",
+  variety_private:"Private",
+
+
 };
 
 /* 中文 */
@@ -38,6 +59,31 @@ export const CommodityConfigurationZh = {
   delete_info_msg: "确认删除吗?",
   delete_success_msg: "删除成功",
   delete_error_msg: "请先删除该品种下关联品种",
+
+
+
+  /* 新版 */
+  chinese_tabs: "中文品种",
+  english_tabs: "英文品种",
+  add_variety: "添加品种",
+  edit_variety: "品种设置",
+  variety_name: "品种名称",
+  parent_variety: "上级品种",
+  active_status: "启动状态",
+  set_root_hint:"默认为私有,勾选并保存设置为公有",
+  set_root_text:"公有权限设置",
+  variety_name_hint: "请输入品种名称",
+  variety_name_check_hint: "请填写品种名称",
+  variety_name_check_hint2: "品种名称已存在",
+  variety_add_succ_msg: "新增成功",
+  variety_edit_succ_msg: "编辑成功",
+  variety_public:"公有",
+  variety_private:"私有",
+  /**
+   * 全选 Common.all_select
+   * 确定,取消 Dialog.confirm_btn,cancel_btn
+   * 设置成功 ReportManage.CategoryList.setup_successful
+   */
 };
 
 /*

+ 216 - 0
src/lang/modules/SemanticsManage/ASRpage.js

@@ -0,0 +1,216 @@
+/**
+ * 语义分析 -- 语音识别
+ * $t('SemanticsManage.ASRpage')
+ */
+
+export const ASRPageEn = {
+
+    //新建编辑弹窗
+    create_new:"Create New",
+    belonging_directory:"Belonging Directory",
+    belonging_directory_placeholder:"Please Select Belonging Directory",
+    belonging_directory_hint:"Belonging Directory Required",
+    file_count:"File Count",
+    file_name:"File Name",
+    file_size:"Size",
+    audio_video:"Audio/Video",
+    start_upload_hint:"Click/Drag and Drop Local Audio/Video Files",
+    uploading_hint:"Uploading, Please Do Not Close the Popup Window",
+    continue_adding:"Continue Adding",
+    file_check_hint:"The same file name already exists!",
+    faile_upload_hint:"Upload failed, please refresh and try again!",
+    success_upload_hint:"Upload complete, please check the transcription list.",
+    supported_audio_formats:"Supported Audio Formats",
+    supported_video_formats:"Supported Video Formats",
+    upload_description:"Single file up to 5 hours long, maximum 1GB, up to 50 files per upload.",
+
+    //搜索,筛选
+    search_placeholder:"Please Enter File Name",
+    filter_text:"Filter",
+    filter_options:"Filter Options",
+    clear_btn:"Clear",
+    start_text:"Start",
+    end_text:"End",
+    creator_text:"Creator",
+    tag_text:"Tag",
+    directory_text:"Directory",
+
+    //添加,编辑目录
+    add_directory_category:"Add Directory Category",
+    add_directory_text:"Add Directory",
+    edit_directory_text:"Edit Directory",
+    add_tag_category:"Add Tag Category",
+    edit_tag_category:"Edit Tag Category",
+    edit_tag_text:"Edit Tag",
+    add_tag_text:"Add Tag",
+    directory_name:"Directory Name",
+    tag_name:"Tag Name",
+    tag_name_placeholder:"Please Enter the Tag Name",
+    belonging_directory:"Belonging Directory",
+    parent_directory:"Parent Directory",
+    first_directory:"First-Level Directory",
+    second_directory:"Second-Level Directory",
+    directory_name_required:"Directory Name Required",
+    required_field:"Required Field",
+    tag_name_required:"Tag Name Required",
+    belonging_directory_required:"Belonging Directory Required",
+    addition_directory_successful:"Directory Added Successfully",
+    edition_directory_successful:"Directory Edited Successfully",
+    addition_tag_successful:"New Tag Added Successfully",
+    editition_tag_successful:"Tag Edited Successfully",
+    //删除校验
+    prompt_text:"Prompt",
+    failed_text:"Deletion Failed",
+    failed_btn:"Understood",
+    check_text:"Are you sure you want to delete the current category?",
+    check_text2:"Are you sure you want to delete the current category and its subcategories?",
+    check_text3:"Are you sure you want to delete the current tag?",
+    failed_delete_text:"The category is associated with tags, deletion failed!",
+    failed_delete_text2:"The category is associated with transcription files, deletion failed!",
+    failed_delete_text3:"The tag is associated with transcription files, deletion failed!",
+    deletion_successful:"Deletion Successful",
+    //卡片列表
+    no_directory_available:"No Directory Available",
+    total_files:"A total of {num} files",
+    //列表操作
+    rename_text:"Rename",
+    //file_name,
+    //search_placeholder,
+    file_name_required:"File Name Required",
+    rename_successful:"Rename Successful",
+
+    tagging_text:"Tagging",
+    select_all_text:"Select All",
+    //tag_name_placeholder,
+    //add_tag_text,
+    tag_directory_placeholder:"Please Select a Tag Directory",
+    //tag_name_required,
+    tag_directory_required:"Tag Directory Required",
+    //addition_tag_successful
+    tagging_successful:"Tagging Successful",
+
+    export_text:"Export",
+    export_content:"Export Content",
+    file_format:"File Format",
+    display_information:"Display Information",
+    display_information_placeholder:"Select Display Information",
+    timestamps_text:"Timestamp",
+
+    delete_text:"Delete",
+    delete_file_check:"Are you sure you want to delete the selected records?",
+
+    //详情
+    please_enter_keywords:"Please Enter Keywords",
+    save_successful:"Save Successful",
+    delete_audio_check:"Are you sure you want to delete this audio? (Deleting will not affect the display of the original text.)",
+    delete_video_check:"Are you sure you want to delete this video? (Deleting will not affect the display of the original text.)",
+    original_text:"Original Text",
+    hide_timestamps:"Hide Timestamps",
+    show_timestamps:"Show Timestamps",
+    copy_text:"Copy",
+    speed_text:"Speed",
+
+
+
+
+
+
+
+}
+export const ASRPageZh = {
+    create_new:"新建",
+    belonging_directory_placeholder:"请选择所属目录",
+    belonging_directory:"所属目录必填",
+    file_count:"文件数量",
+    file_name:"文件名",
+    file_size:"大小",
+    audio_video:"音/视频",
+    /**
+     * 操作,删除 Table.column_operations,delete_btn
+     * 取消,确认/确定 Dialog.confirm_btn,cancel_btn
+     * 保存confirm_save_btn
+     */
+    start_upload_hint:"点击/拖拽本地音视频文件",
+    uploading_hint:"上传中,请勿关闭弹窗",
+    continue_adding:"继续添加",
+    file_check_hint:"相同文件名称已存在!",
+    faile_upload_hint:"上传失败,请刷新重试",
+    success_upload_hint:"上传完成,请检查转写列表",
+    supported_audio_formats:"支持音频格式",
+    supported_video_formats:"支持视频格式",
+    upload_description:"单个文件最长5小时,最大1GB,单次上传支持上传50个",
+
+    search_placeholder:"请输入文件名称",
+    filter_text:"筛选",
+    filter_options:"筛选项",
+    clear_btn:"清空",
+    start_text:"开始",
+    end_text:"结束",
+    creator_text:"创建人",
+    tag_text:"标签",
+    directory_text:"目录",
+
+    add_directory_category:"添加目录分类",
+    add_directory_text:"添加目录",
+    edit_directory_text:"编辑目录",
+    add_tag_category:"添加标签分类",
+    edit_tag_category:"编辑标签分类",
+    edit_tag_text:"编辑标签",
+    add_tag_text:"添加标签",
+    directory_name:"目录名称",
+    tag_name:"标签名称",
+    tag_name_placeholder:"请输入标签名称",
+    belonging_directory:"所属目录",
+    //belonging_directory_placeholder
+    parent_directory:"上级目录",
+    first_directory:"一级目录",
+    second_directory:"二级目录",
+    directory_name_required:"目录名称必填",
+    required_field:"必填项",
+    tag_name_required:"标签名称必填",
+    belonging_directory_required:"所属目录必填",
+    addition_directory_successful:"添加目录成功",
+    edition_directory_successful:"编辑目录成功",
+    addition_tag_successful:"添加标签成功",
+    editition_tag_successful:"编辑标签成功",
+
+    prompt_text:"提示",
+    failed_text:"删除失败",
+    failed_btn:"知道了",
+    check_text:"确定删除当前分类吗?",
+    check_text2:"确定删除当前分类及包含的子分类吗?",
+    check_text3:"确定删除该标签吗?",
+    failed_delete_text:"该分类关联标签,删除失败!",
+    failed_delete_text2:"该分类关联转写文件,删除失败!",
+    failed_delete_text3:"标签关联转写文件,删除失败!",
+    deletion_successful:"删除成功",
+
+    no_directory_available:"暂无目录",
+    total_files:"共{num}个文件",
+    rename_text:"重命名",
+    file_name_required:"文件名称必填",
+    rename_successful:"重命名成功",
+    tagging_text:"打标签",
+    select_all_text:"全选",
+    tag_directory_placeholder:"请选择标签目录",
+    tag_directory_required:"标签目录必填",
+    tagging_successful:"打标签成功",
+    export_text:"导出",
+    export_content:"导出成功",
+    file_format:"文件格式",
+    display_information:"显示信息",
+    display_information_placeholder:"请选择显示信息",
+    timestamps_text:"时间戳",
+    delete_text:"删除",
+    delete_file_check:"确定删除选中记录吗?",
+
+    please_enter_keywords:"请输入关键词",
+    save_successful:"保存成功",
+    delete_audio_check:"确定删除该音频吗?(删除后不影响原文显示)",
+    delete_video_check:"确定删除该视频吗?(删除后不影响原文显示)",
+    original_text:"原文",
+    hide_timestamps:"隐藏时间戳",
+    show_timestamps:"显示时间戳",
+    copy_text:"复制",
+    speed_text:"倍速",
+}

+ 2 - 0
src/lang/modules/SemanticsManage/indexEn.js

@@ -3,11 +3,13 @@
 import { DocumentComparisonEn } from "./DocumentComparison";
 import { DocumentManagementEn } from "./DocumentManagement";
 import { TagManagementEn } from "./TagManagement";
+import { ASRPageEn } from "./ASRpage";
 
 export default {
   SemanticsManage: {
     DocumentComparison: DocumentComparisonEn,
     DocumentManagement: DocumentManagementEn,
     TagManagement: TagManagementEn,
+    ASRpage:ASRPageEn,
   },
 };

+ 2 - 0
src/lang/modules/SemanticsManage/indexZh.js

@@ -1,6 +1,7 @@
 import { DocumentComparisonZh } from "./DocumentComparison";
 import { DocumentManagementZh } from "./DocumentManagement";
 import { TagManagementZh } from "./TagManagement";
+import {ASRPageZh} from "./ASRpage";
 
 export default {
   // 语义分析----模块
@@ -8,5 +9,6 @@ export default {
     DocumentComparison: DocumentComparisonZh,
     DocumentManagement: DocumentManagementZh,
     TagManagement: TagManagementZh,
+    ASRpage:ASRPageZh,
   },
 };

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

@@ -116,6 +116,12 @@ export const listEn = {
   preview_report_btn: "Preview report.",
   last_save_time: "Last save time",
 
+
+  //列表页操作栏
+  list_ppt_item_publish:'Publish',
+  list_ppt_item_preview:'Demo',
+  list_ppt_item_download:'Download',
+  list_ppt_item_edit:'Edit'
 };
 
 /* 中文 */
@@ -233,4 +239,10 @@ export const listZh = {
   add_least_one: "请至少添加一张",
   preview_report_btn: "预览报告",
   last_save_time: "最近保存时间",
+
+  //列表页操作栏
+  list_ppt_item_publish:'预览发布',
+  list_ppt_item_preview:'演示',
+  list_ppt_item_download:'下载',
+  list_ppt_item_edit:'编辑'
 };

+ 10 - 2
src/lang/modules/ToolBox/AIQuestion.js

@@ -12,7 +12,11 @@ export const AIQuestionEn = {
     send_btn:'Send',
     use_intro_title:'Instructions',
     use_intro01:'Maximum 500 Q&A per account per day.',
-    use_intro02:'History Q&A default named with the first question in the dialogue window, can be modified.'
+    use_intro02:'History Q&A default named with the first question in the dialogue window, can be modified.',
+    support_formats:'Supported Formats',
+    max_file_text:'maximum 50MB.',
+    inter_check:'Please enter a question',
+    add_new_window_hint:'Query Window Opened, Enter Query',
 
 };
   
@@ -26,7 +30,11 @@ export const AIQuestionZh = {
     send_btn:'发送',
     use_intro_title:'使用说明',
     use_intro01:'每账号每天最高500次问答。',
-    use_intro02:'历史问答默认用该对话窗口内第一个提问命名,可修改。'
+    use_intro02:'历史问答默认用该对话窗口内第一个提问命名,可修改。',
+    support_formats:'支持格式',
+    max_file_text:'大小不超过50MB',
+    inter_check:'请输入提问',
+    add_new_window_hint:'您已建立对话窗口,请输入提问',
 };
   
 /**

+ 3 - 1
src/lang/modules/ToolBox/IndexEn.js

@@ -1,6 +1,7 @@
 import { AIQuestionEn } from "./AIQuestion";
 import { CommodityPriceChartEn } from "./CommodityPriceChart";
 import { PositionAnalysisEn } from "./PositionAnalysis";
+import { ForexCalendarEn } from "./calendar/ForexCalendar";
 
 
 export default {
@@ -8,6 +9,7 @@ export default {
     ToolBox: {
         AIQuestion:AIQuestionEn,
         CommodityPriceChart:CommodityPriceChartEn,
-        PositionAnalysis:PositionAnalysisEn
+        PositionAnalysis:PositionAnalysisEn,
+        ForexCalendar:ForexCalendarEn,
     },
 };

+ 3 - 1
src/lang/modules/ToolBox/IndexZh.js

@@ -1,6 +1,7 @@
 import { AIQuestionZh } from "./AIQuestion";
 import { CommodityPriceChartZh } from "./CommodityPriceChart";
 import { PositionAnalysisZh } from "./PositionAnalysis";
+import { ForexCalendarZh } from "./calendar/ForexCalendar";
 
 
 export default {
@@ -8,6 +9,7 @@ export default {
     ToolBox: {
         AIQuestion:AIQuestionZh,
         CommodityPriceChart:CommodityPriceChartZh,
-        PositionAnalysis:PositionAnalysisZh
+        PositionAnalysis:PositionAnalysisZh,
+        ForexCalendar:ForexCalendarZh,
     },
 };

+ 4 - 0
src/lang/modules/ToolBox/PositionAnalysis.js

@@ -26,6 +26,8 @@ export const PositionAnalysisEn = {
     net_long_position_num:'Number of Net Long Position',
     net_short_position_num:'Number of Net Short Position',
     held:"Held",
+    top_held_long_position:"Top {num} Net Long Positions",
+    proportion:"Proportion",
 };
   
 /* 中文 */
@@ -52,6 +54,8 @@ export const PositionAnalysisZh = {
     net_long_position_num:'净多单量',
     net_short_position_num:'净空单量',
     held:"持",
+    top_held_long_position:"前{num}名持净多单",
+    proportion:"占比",
 };
   
 /**

+ 41 - 0
src/lang/modules/ToolBox/calendar/ForexCalendar.js

@@ -0,0 +1,41 @@
+export const ForexCalendarEn={
+    header_title:'{month} {year} Calendar',
+    mark_date:'{month} {year}',
+    add_item:'Add Item',
+    select_date:'Select Date',
+    select_type:'Select Variety',
+    select_type_hint:'Select Variety First',
+    link_edb:'Linked Indicators',
+    link_item:'Custom Items',
+    edb_input:'Enter Index ID/Name',
+    item_input_limit:'Max 15 chars Please re-edit',
+    item_btn_text:'expand',
+    item_btn_text_pickup:'pick up',
+    item_input:'Enter Item Content',
+    link_hint:'Items linked to indicators default to their names, editable, max 15 chars per item.',
+    font_color:'Font Color',
+    fill_color:'Fill Color',
+    font_bold:'Bold',
+    save_success:'Save Successful'
+
+}
+export const ForexCalendarZh={
+    header_title:'{year}年{month}月日历表',
+    mark_date:'{year}年{month}月',
+    add_item:'添加事项',
+    select_date:'请选择日期',
+    select_type:'请选择品种',
+    select_type_hint:'请选择品种',
+    link_edb:'关联指标',
+    link_item:'自定义事项',
+    edb_input:'请输入指标ID/指标名称',
+    item_input:'请输入事项内容',
+    item_input_limit:'超出15个字,请重新编辑',
+    item_btn_text:'展开',
+    item_btn_text_pickup:'收起',
+    link_hint:'添加关联指标的事项默认以指标名称命名,可修改,每个事项最多15个字',
+    font_color:'字体颜色',
+    fill_color:'填充颜色',
+    font_bold:'加粗',
+    save_success:'保存成功'
+}

+ 64 - 0
src/lang/modules/ToolBox/calendar/commonLang.js

@@ -0,0 +1,64 @@
+export default{
+    Month:{//月份
+        1:{
+            en:'January',
+            enSort:'Jan.',
+            zh:'一月',
+        },
+        2:{
+            en:'February',
+            enSort:'Feb.',
+            zh:'二月',
+        },
+        3:{
+            en:'March',
+            enSort:'Mar.',
+            zh:'三月',
+        },
+        4:{
+            en:'April',
+            enSort:'Apr.',
+            zh:'四月',
+        },
+        5:{
+            en:'May',
+            enSort:'May.',
+            zh:'五月',
+        },
+        6:{
+            en:'June',
+            enSort:'Jun.',
+            zh:'六月',
+        },
+        7:{
+            en:'July',
+            enSort:'Jul.',
+            zh:'七月',
+        },
+        8:{
+            en:'August',
+            enSort:'Aug.',
+            zh:'八月',
+        },
+        9:{
+            en:'September',
+            enSort:'Sep.',
+            zh:'九月',
+        },
+        10:{
+            en:'October',
+            enSort:'Oct.',
+            zh:'十月',
+        },
+        11:{
+            en:'November',
+            enSort:'Nov.',
+            zh:'十一月',
+        },
+        12:{
+            en:'December',
+            enSort:'Dec.',
+            zh:'十二月',
+        },
+    }
+}

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

@@ -14,6 +14,8 @@ export const OutLinkConfigEn = {
     del_success_msg:'Delete menu successfully',
     tips_msg01:'Menu name cannot be empty',
     tips_msg02:'URL cannot be empty',
+    add_successful:'Menu Added Successfully',
+    edit_successful:'Menu Edited Successfully',
 };
   
 /* 中文 */
@@ -28,6 +30,8 @@ export const OutLinkConfigZh = {
     del_success_msg:'删除菜单成功',
     tips_msg01:'菜单名称不能为空',
     tips_msg02:'URL不能为空',
+    add_successful:'添加菜单成功',
+    edit_successful:'编辑菜单成功',
 };
   
 /**

+ 11 - 2
src/main.js

@@ -208,10 +208,14 @@ router.beforeEach(async(to, from, next) => {
   /* 沙盘详情name添加 */
   if (to.path === "/sandflow") {
     to.matched[1].name = to.query.SandboxId? "编辑逻辑": "添加逻辑";
+    //支持英文
+    to.matched[1].meta.name_en = to.query.SandboxId? "Edit Logic": "Add Logic";
   }
 
   if (to.path === "/analyseVariety") {
     to.matched[1].name = to.query.type === "look" ? "查看品种" : "分析品种";
+    //支持英文
+    to.matched[1].meta.name_en = to.query.type === "look" ? "View Variety" : "Analyse Variety";
   }
 
   if (to.path) {
@@ -231,10 +235,15 @@ router.beforeEach(async(to, from, next) => {
 
 
 router.afterEach((to, from, next) => {
-  // 改变页面标题
+  /* // 改变页面标题
   document.title = to.matched[to.matched.length - 1].name
   ? `${to.matched[to.matched.length - 1].name}`
-  : setting.name;
+  : setting.name; */
+  //改变页面标题-中英文
+  const titleZh = to.matched[to.matched.length - 1].name||''
+  const titleEn = to.matched[to.matched.length - 1].meta.name_en||''
+  const title = i18n.locale==='zh'?titleZh:titleEn
+  document.title = title||setting.name
 
   window.scrollTo(0, 0);
   if(stores.state.hasTrialUserPermisson){

+ 9 - 1
src/routes/modules/approveRoutes.js

@@ -6,19 +6,27 @@ export default [
         name:'审批管理',
         hidden:false,
         icon_path: require('@/assets/img/home/data_ic.png'),
+        meta:{
+            name_en:'ApprMgmt',
+        },
         children:[{
             path:'approveList',
             name:'审批列表',
             component:()=>import('@/views/approve_manage/approveList.vue'),
-            hidden:false
+            hidden:false,
+            meta:{
+                name_en:'Approval List'
+            }
         },{
             path:'approveDetail',
             name:'审批详情',
             component:()=>import('@/views/approve_manage/approveDetail.vue'),
             hidden:false,
             meta: {
+                name_en:'Approval Detail',
                 pathFrom: "approveList",
                 pathName: "审批列表",
+                pathName_en:"Approval List",
                 keepAlive: false,
               },
         }

+ 151 - 16
src/routes/modules/chartRoutes.js

@@ -8,23 +8,35 @@ export default [
 		name: 'ETA图库',
 		hidden: false,
 		icon_path: require('@/assets/img/home/data_ic.png'),
+		meta:{
+			name_en:'Charts'
+		},
 		children: [{
 				path: 'chartsetting',
 				component: () => import('@/views/dataEntry_manage/chartSetting.vue'),
 				name: 'ETA图库',
 				hidden: false,
+				meta:{
+					name_en:'Charts'
+				},
 			},
 			{
 				path: 'addchart',
 				component: () => import('@/views/dataEntry_manage/addChart.vue'),
 				name: '添加图表',
 				hidden: true,
+				meta:{
+					name_en:'Add Chart'
+				},
 			},
 			{
 				path: 'editchart',
 				component: () => import('@/views/dataEntry_manage/editChart.vue'),
 				name: '编辑图表',
 				hidden: true,
+				meta:{
+					name_en:'Edit Chart'
+				},
 			},
 		]
 	},
@@ -36,24 +48,36 @@ export default [
 		name: 'ETA指标库',
 		hidden: false,
 		icon_path: require('@/assets/img/home/data_ic.png'),
+		meta:{
+			name_en:'Indics'
+		},
 		children: [
 			{
 				path: 'database',
 				component: () => import('@/views/dataEntry_manage/databaseList.vue'),
 				name: 'ETA指标库',
 				hidden: false,
+				meta:{
+					name_en:'ETA Indics'
+				},
 			},
 			{
 				path: 'codecount',
 				component: () => import('@/views/dataEntry_manage/codecount/index.vue'),
 				name: '代码运算',
 				hidden: true,
+				meta:{
+					name_en:'Code Count'
+				},
 			},
 			{
 				path: 'adjustdata',
 				component: () => import('@/views/dataEntry_manage/adjustdata/adjustData.vue'),
 				name: '数据调整',
 				hidden: true,
+				meta:{
+					name_en:'Adjust Data'
+				},
 			},
 		]
 	},
@@ -65,30 +89,45 @@ export default [
 		name: 'My ETA',
 		hidden: false,
 		icon_path: require('@/assets/img/home/data_ic.png'),
+		meta:{
+			name_en:'My Investment Research'
+		},
 		children: [
 			{
 				path: 'mychart',
 				name: 'My ETA',
 				component: () => import('@/views/mychart_manage/index.vue'),
 				hidden: false,
+				meta:{
+					name_en:'My Gallery'
+				},
 			},
 			{
 				path: 'chartframe',
 				name: '图库框架',
 				component: () => import('@/views/chartFrame_manage/index.vue'),
 				hidden: false,
+				meta:{
+					name_en:'Gallery Frame'
+				},
 			},
 			{
 				path: 'addframe',
 				name: '添加框架',
 				component: () => import('@/views/chartFrame_manage/frameEditor.vue'),
 				hidden: false,
+				meta:{
+					name_en:'Add Gallery Frame'
+				},
 			},
 			{
 				path: 'editframe',
 				name: '编辑框架',
 				component: () => import('@/views/chartFrame_manage/frameEditor.vue'),
 				hidden: false,
+				meta:{
+					name_en:'Edit Gallery Frame'
+				},
 			},
 		]
 	},
@@ -99,29 +138,43 @@ export default [
 		component: home,
 		name: 'ETA表格',
 		hidden: false,
+		meta:{
+			name_en:'ETA Tables'
+		},
 		children:[
 			{
 				path:"sheetList",
 				name:"共享表格",
-				component:()=>import('@/views/datasheet_manage/sheetList.vue')
+				component:()=>import('@/views/datasheet_manage/sheetList.vue'),
+				meta:{
+					name_en:'Shared Table'
+				},
 			},
 			{
 				path:"sheetTimeList",
 				name:"时间序列表格",
-				component:()=>import('@/views/datasheet_manage/sheetList.vue')
+				component:()=>import('@/views/datasheet_manage/sheetList.vue'),
+				meta:{
+					name_en:'Timeline table'
+				},
 			},
 			{
 				path:"sheetMixedList",
 				name:"混合表格",
-				component:()=>import('@/views/datasheet_manage/sheetList.vue')
+				component:()=>import('@/views/datasheet_manage/sheetList.vue'),
+				meta:{
+					name_en:'Mixed Table'
+				},
 			},
 			{
 				path:"addSheet",
 				name:"添加表格",
 				component:()=>import('@/views/datasheet_manage/addSheet.vue'),
 				meta: { 
+					name_en:'Add Shared Table',
 					pathFrom: "sheetList",
 					pathName: "共享表格",
+					pathName_en:"Shared Table"
 				}
 			},
 			{
@@ -129,8 +182,10 @@ export default [
 				name:"添加数据表格",
 				component:()=>import('@/views/datasheet_manage/customSheetEdit.vue'),
 				meta: { 
+					name_en:'Add Timeline Table',
 					pathFrom: "sheetTimeList",
 					pathName: "时间序列表格",
+					pathName_en:'Timeline table'
 				}
 			},
 			{
@@ -138,24 +193,35 @@ export default [
 				name:"添加混合表格",
 				component:()=>import('@/views/datasheet_manage/mixedSheetEdit.vue'),
 				meta: { 
+					name_en:"Add Mixed Table",
 					pathFrom: "sheetMixedList",
 					pathName: "混合表格",
+					pathName_en:"Mixed Table",
 				}
 			},
 			{
 				path:"sheetAnalysisList",
 				name:"自定义分析",
-				component:()=>import('@/views/datasheet_manage/customAnalysis/list.vue')
+				component:()=>import('@/views/datasheet_manage/customAnalysis/list.vue'),
+				meta:{
+					name_en:"Custom analysis"
+				}
 			},
 			{
 				path:"addAnalysisSheet",
 				name:"上传文件",
-				component:()=>import('@/views/datasheet_manage/customAnalysis/addAnalysisSheet.vue')
+				component:()=>import('@/views/datasheet_manage/customAnalysis/addAnalysisSheet.vue'),
+				meta:{
+					name_en:"Upload Sheet"
+				}
 			},
 			{
 				path:"createTaregtBySheet",
 				name:"生成指标",
-				component:()=>import('@/views/datasheet_manage/customAnalysis/addAnalysisSheet.vue')
+				component:()=>import('@/views/datasheet_manage/customAnalysis/addAnalysisSheet.vue'),
+				meta:{
+					name_en:"Generated pointer"
+				}
 			},
 		]
 	},
@@ -166,6 +232,9 @@ export default [
 		component: home,
 		name: 'ETA逻辑',
 		hidden: false,
+		meta:{
+			name_en:"Logic Diagram"
+		},
 		children: [
 			// {
 			// 	path: "sandlist", // 旧版本
@@ -179,6 +248,9 @@ export default [
 				name: 'ETA逻辑',
 				component: () => import('@/views/sandbox_manage/index_new_version.vue'),
 				hidden: false,
+				meta:{
+					name_en:"ETA Logic"
+				},
 			},
 			// {
 			// 	path: "sandflow", // 旧版本
@@ -190,6 +262,9 @@ export default [
 				name: '添加逻辑',
 				component: () => import('@/views/sandbox_manage/sandFlowNew/index.vue'),
 				hidden: true,
+				meta:{
+					name_en:"Add Logic"
+				},
 			}
 		]
 	},
@@ -200,21 +275,33 @@ export default [
 		component: home,
 		name: 'ETA预测指标',
 		hidden:  false,
+		meta:{
+			name_en:"Pred Inds"
+		},
 		children: [
 			{
 				path: 'predictEdb',
 				name: 'ETA预测指标',
-				component:()=>import('@/views/predictEdb_manage/predictEdb.vue')
+				component:()=>import('@/views/predictEdb_manage/predictEdb.vue'),
+				meta:{
+					name_en:"Pred Inds"
+				},
 			},
 			{
 				path: 'addpredictEdb',
 				name: '添加指标',
 				component:()=>import('@/views/predictEdb_manage/addPredicEdb.vue'),
+				meta:{
+					name_en:"Add Pred Ind"
+				},
 			},
 			{
 				path: 'editpredictEdb',
 				name: '编辑指标',
 				component:()=>import('@/views/predictEdb_manage/addPredicEdb.vue'),
+				meta:{
+					name_en:"Edit Pred Ind"
+				},
 			}
 		]
 	},
@@ -225,61 +312,84 @@ export default [
 		component: home,
 		name: '统计分析',
 		hidden:  false,
+		meta:{
+			name_en:"Stat Analysis"
+		},
 		children: [
 			{
 				path: 'chartrelevance',
 				name: '相关性分析',
-				component:()=>import('@/views/chartRelevance_manage/relevance/list.vue')
+				component:()=>import('@/views/chartRelevance_manage/relevance/list.vue'),
+				meta:{
+					name_en:"Correlation analysis"
+				},
 			},
 			{
 				path: 'fittingEquationList',
 				name: '拟合方程曲线',
-				component:()=>import('@/views/chartRelevance_manage/fittingEquation/fittingEquationList.vue')
+				component:()=>import('@/views/chartRelevance_manage/fittingEquation/fittingEquationList.vue'),
+				meta:{
+					name_en:"Fit Eq Curve"
+				},
 			},
 			{
 				path: 'fittingEquationChartEditor',
 				name: '添加图表',
 				component: () => import('@/views/chartRelevance_manage/fittingEquation/fittingEquationChartEditor.vue'),
 				meta: { 
+					name_en:"add Fit Eq Curve",
 					pathFrom: "fittingEquationList",
           			pathName: "拟合方程曲线",
+					pathName_en:"Fit Eq Curve"
 				}
 			},
 			{
 				path: 'relevancechartEditor',
 				name: '编辑图表',
 				component:()=>import('@/views/chartRelevance_manage/relevance/relevanceChartEditor.vue'),
-				meta: { 
+				meta: {
+					name_en:"edit Correlation analysis",
 					pathFrom: "chartrelevance",
           			pathName: "相关性图表",
+					pathName_en:"Correlation analysis"
 				}
 			},
 			{
 				path: 'statisticFeatureList',
 				name: '统计特征',
-				component: () => import('@/views/chartRelevance_manage/statistic/statisticFeatureList.vue')
+				component: () => import('@/views/chartRelevance_manage/statistic/statisticFeatureList.vue'),
+				meta:{
+					name_en:"Stat Charact'ristics"
+				},
 			},
 			{
 				path: 'statisticFeatureChartEditor',
 				name: '编辑图表',
 				component:()=>import('@/views/chartRelevance_manage/statistic/statisticFeatureChartEditor.vue'),
 				meta: { 
+					name_en:"Edit Stat Charact'ristics",
 					pathFrom: "statisticFeatureList",
           			pathName: "统计特征",
+					pathName_en:"Stat Charact'ristics"
 				}
 			},
 			{
 				path: 'crossVarietyChartList',
 				name: '跨品种分析',
-				component: () => import('@/views/chartRelevance_manage/crossVarietyAnalysis/list.vue')
+				component: () => import('@/views/chartRelevance_manage/crossVarietyAnalysis/list.vue'),
+				meta:{
+					name_en:"Cross-Variety Analy"
+				},
 			},
 			{
 				path: 'crossVarietyChartEditor',
 				name: '编辑图表',
 				component:()=>import('@/views/chartRelevance_manage/crossVarietyAnalysis/chartEditor.vue'),
 				meta: { 
+					name_en:"edit Cross-Variety Analy",
 					pathFrom: "crossVarietyChartList",
-          pathName: "跨品种分析",
+					pathName: "跨品种分析",
+					pathName_en:"Cross-Variety Analy"
 				}
 			},
 		]
@@ -311,6 +421,9 @@ export default [
 		component:home,
 		name:'工具箱',
 		hidden:false,
+		meta:{
+			name_en:'Toolbox'
+		},
 		children:[
 			/* {
 				path: 'positionAnalysisList',
@@ -320,31 +433,53 @@ export default [
 			{//不要列表页了,但是改path需要动ETA菜单很麻烦,先这样
 				path: 'positionAnalysisList',
 				name: '持仓详情',
-				component:()=>import('@/views/positionAnalysis_manage/detail.vue')
+				component:()=>import('@/views/positionAnalysis_manage/detail.vue'),
+				meta:{
+					name_en:'Position Analysis'
+				},
 			},
 			{
 				path: 'positionAnalysisDetail',
 				name: '持仓详情',
 				component:()=>import('@/views/positionAnalysis_manage/detail.vue'),
+				meta:{
+					name_en:'Position Analysis'
+				},
 			},
 			{
 				path:'federalReserveWatch',
 				name:'联储观察',
-				component:()=>import('@/views/toolBox_manage/FederalReserveWatch.vue')
+				component:()=>import('@/views/toolBox_manage/FederalReserveWatch.vue'),
+				meta:{
+					name_en:'FedWatch'
+				},
 			},{
 				path: "commordityChartBase",
 				name: "商品价格曲线",
-				component: () => import('@/views/futures_manage/commodityChartBase.vue')
+				component: () => import('@/views/futures_manage/commodityChartBase.vue'),
+				meta:{
+					name_en:'Comm Price Curve'
+				},
 			},
 			{
 				path: "addCommodityChart",
 				name: "编辑图表",
 				component: () => import('@/views/futures_manage/chartEditor.vue'),
 				meta: { 
+					name_en:'Edit Comm Price Curve',
 					pathFrom: "commordityChartBase",
 					pathName: "商品价格曲线",
+					pathName_en:'Comm Price Curve'
 				}
 			},
+			{
+				path:"forexCalendar",
+				name:"事件日历",
+				component:()=>import('@/views/toolBox_manage/ForexCalendar.vue'),
+				meta:{
+					name_en:'ForexCalendar'
+				},
+			},
 		]
 	}
 ]

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

@@ -9,6 +9,9 @@ export default [
     name: "数据源",
     hidden: false,
     icon_path: require("@/assets/img/home/data_ic.png"),
+    meta:{
+        name_en:'Data Sources'
+    },
     children: [
       {
         path: "targetList",
@@ -16,6 +19,7 @@ export default [
         name: "手工指标列表",
         hidden: false,
         meta: {
+          name_en:'Manual Inds List',
           keepAlive: false,
         },
       },
@@ -26,6 +30,7 @@ export default [
         name: "隆众原始数据库",
         hidden: false,
         meta: {
+          name_en:'Oilchem Orig DB',
           keepAlive: false,
         },
       },
@@ -36,6 +41,7 @@ export default [
         name: "钢联原始数据库",
         hidden: false,
         meta: {
+          name_en:'Mysteel Orig DB',
           keepAlive: false,
         },
       },
@@ -45,6 +51,7 @@ export default [
         name: "手工数据录入",
         hidden: false,
         meta: {
+          name_en:'Manual data entry',
           keepAlive: false,
         },
       },
@@ -53,8 +60,10 @@ export default [
         component: () => import("@/views/dataEntry_manage/onlineExcelCopy.vue"),
         name: "复制excel数据",
         meta: {
+          name_en:'Online Excel Copy',
           pathFrom: "dataList",
           pathName: "手工数据录入",
+          pathName_en:'Manual data entry',
         },
         hidden: true,
       },
@@ -66,6 +75,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:'SMM Orig Database',
         },
       },
       {
@@ -73,18 +83,27 @@ export default [
         component: () => import("@/views/dataEntry_manage/gasbase/index.vue"),
         name: "天然气",
         hidden: false,
+        meta:{
+            name_en:'Natural Gas',
+        }
       },
       {
         path: "gasHistory",
         component: () => import("@/views/dataEntry_manage/gasbase/history.vue"),
         name: "天然气历史数据",
         hidden: true,
+        meta:{
+            name_en:'Natural Gas History',
+        }
       },
       {
         path: "ICPIconsumption",
         component: () => import("@/views/dataEntry_manage/thirdBase/icpiConsumption.vue"),
         name: "ICPI消费价格指数",
         hidden: false,
+        meta:{
+            name_en:'ICPI Price Index',
+        }
       },
       {
         path: "zhengzhoushop",
@@ -94,6 +113,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"Zhengzhou ComEx",
         },
       },
       {
@@ -104,6 +124,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"Dalian ComEx",
         },
       },
       {
@@ -114,6 +135,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"SH Intl Energy Ex",
         },
       },
       {
@@ -126,6 +148,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"China Fin Futures Ex",
         },
       },
       {
@@ -136,6 +159,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"SH Energy Ex",
         },
       },
       {
@@ -143,13 +167,19 @@ export default [
         component: () =>
           import("@/views/dataEntry_manage/thirdBase/gqExchangeData.vue"),
         name: "广期所",
-        hidden: false
+        hidden: false,
+        meta:{
+            name_en:"GZ Futures Ex"
+        }
       },
       {
         path: "chineseCoal",
         component: () => import("@/views/dataEntry_manage/coal/index.vue"),
         name: "中国煤炭市场网",
         hidden: false,
+        meta:{
+            name_en:"China Coal Market"
+        }
       },
       {
         path: "googleTravel",
@@ -157,6 +187,9 @@ export default [
           import("@/views/dataEntry_manage/googleTravel/index.vue"),
         name: "谷歌出行指数",
         hidden: false,
+        meta:{
+            name_en:"Google Travel Index"
+        }
       },
       {
         path: "steelChemical",
@@ -164,6 +197,9 @@ export default [
           import("@/views/dataEntry_manage/thirdBase/steelChemicalbase.vue"),
         name: "钢联化工数据库",
         hidden: false,
+        meta:{
+            name_en:"Mysteel Data"
+        }
       },
       {
         path: "steobase",
@@ -171,6 +207,9 @@ export default [
           import("@/views/dataEntry_manage/thirdBase/elaSteoBase.vue"),
         name: "EIA  STEO报告",
         hidden: false,
+        meta:{
+            name_en:"EIA STEO Report"
+        }
       },
       {
         path: "UNdata",
@@ -178,6 +217,9 @@ export default [
           import("@/views/dataEntry_manage/thirdBase/UNdata.vue"),
         name: "UN",
         hidden: false,
+        meta:{
+            name_en:"UN"
+        }
       },
       {
         path: "SCIdata",
@@ -185,6 +227,9 @@ export default [
           import("@/views/dataEntry_manage/thirdBase/SCITargetbase.vue"),
         name: "卓创数据(红桃3)",
         hidden: false,
+        meta:{
+            name_en:"SCI"
+        }
       },
       {
         path: "BAIINFOdata",
@@ -192,6 +237,9 @@ export default [
           import("@/views/dataEntry_manage/thirdBase/BAIINFOTargetbase.vue"),
         name: "百川盈孚",
         hidden: false,
+        meta:{
+            name_en:"BAIINFO"
+        }
       },
       {
         path: "NationalData",
@@ -199,11 +247,17 @@ export default [
           import("@/views/dataEntry_manage/thirdBase/NationalDataBase.vue"),
         name: "国家统计局",
         hidden: false,
+        meta:{
+            name_en:"Nat Bureau of Stats"
+        }
       },
       {
         path: "futuresbase",
         name: "期货数据库",
         component: () => import("@/views/futures_manage/futuresBase.vue"),
+        meta:{
+            name_en:"Futures Database"
+        }
       },
       {
         path: "databankBase",
@@ -212,6 +266,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"Chinadatapay"
         },
       },
       {
@@ -221,6 +276,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"Yongyizixun"
         },
       },
       {
@@ -229,6 +285,9 @@ export default [
           import("@/views/dataEntry_manage/thirdBase/ysTargetBase.vue"),
         name: "有色原始数据库",
         hidden: false,
+        meta: {
+            name_en:"API Orig Database"
+          },
       },
       {
         path: "fwmtData",
@@ -237,13 +296,15 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"SXcoal"
         },
       },
       {
         path: "coalWord",
         component: () => import("@/views/dataEntry_manage/thirdBase/coalWord.vue"),
         name: "煤炭江湖",
-        hidden: false
+        hidden: false,
+        name_en:"Meitanjianghu"
       },
     ],
   },

+ 6 - 0
src/routes/modules/dataSource.js

@@ -8,11 +8,17 @@ export default [
         name: "数据报表管理",
         hidden: false,
         icon_path: require("@/assets/img/home/data_ic.png"),
+        meta:{
+            name_en:"DataRptMg"
+        },
         children: [
             {
                 path: "dataSourceGL",
                 name: "数据源管理",
                 component: () => import("@/views/dataSource_manage/dataSourceListGL.vue"),
+                meta:{
+                    name_en:"Mysteel Chem Stats"
+                },
             },
         ]
     }

+ 92 - 1
src/routes/modules/oldRoutes.js

@@ -79,6 +79,7 @@ export default [
         hidden: true,
         meta: {
           keepAlive: false,
+          name_en:"Reset PassWord"
         },
       },
       {
@@ -88,6 +89,7 @@ export default [
         hidden: true,
         meta: {
           keepAlive: false,
+          name_en:"Indicator Traceability"
         },
       },
     ],
@@ -100,6 +102,9 @@ export default [
     name: "研报管理",
     icon_path: require("@/assets/img/home/report_ic.png"),
     hidden: false,
+    meta:{
+        name_en:"RepMgmt"
+    },
     children: [
       {
         path: "reportlist",
@@ -108,6 +113,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"Report list"
         },
       },
       {
@@ -117,6 +123,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"Category list"
         },
       },
       {
@@ -125,8 +132,10 @@ export default [
         name: "章节设置",
         hidden: true,
         meta: {
+          name_en:"Chapter Setting",
           pathFrom: "classifylist",
           pathName: "分类列表",
+          pathName_en:"Category list"
         },
       },
       {
@@ -136,6 +145,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"EveryDay",
         },
       },
       {
@@ -147,6 +157,8 @@ export default [
           pathFrom: "reportlist",
           pathName: "研报列表",
           keepAlive: false,
+          name_en:"Add Report",
+          pathName_en:"Report list"
         },
       },
       {
@@ -158,6 +170,8 @@ export default [
           pathFrom: "reportlist",
           pathName: "研报列表",
           keepAlive: false,
+          name_en:"Edit Report",
+          pathName_en:"Report list"
         },
       },
       {
@@ -169,6 +183,8 @@ export default [
           pathFrom: "reportlist",
           pathName: "研报列表",
           keepAlive: false,
+          name_en:"Add/Edit Day or Week Report",
+          pathName_en:"Report list"
         },
       },
       {
@@ -180,6 +196,8 @@ export default [
           keepAlive: false,
           pathFrom: "dayorweek",
           pathName: "晨报/周报",
+          name_en:"Day or Week Report",
+          pathName_en:"Add/Edit Day or Week Report"
         },
       },
       // {
@@ -203,6 +221,9 @@ export default [
           import("@/views/report_manage/reportEn/reportlist.vue"),
         name: "英文研报",
         hidden: false,
+        meta:{
+            name_en:"English Report"
+        }
       },
       {
         path: "reportEnEditor",
@@ -210,12 +231,18 @@ export default [
           import("@/views/report_manage/reportEn/reportEditor.vue"),
         name: "添加英文研报",
         hidden: false,
+        meta:{
+            name_en:"Add English Report"
+        }
       },
       {
         path: "emaiList",
         component: () => import("@/views/report_manage/emailList.vue"),
         name: "邮箱管理",
         hidden: false,
+        meta:{
+            name_en:"Email List"
+        }
       },
       // {
       // 	path: 'classifyEnlist',
@@ -228,6 +255,9 @@ export default [
         component: () => import("@/views/report_manage/reportAuthor.vue"),
         name: "研报作者管理",
         hidden: false,
+        meta:{
+            name_en:"Author Mgmt"
+        }
       },
       {
         path: "sendlog",
@@ -235,16 +265,25 @@ export default [
           import("@/views/report_manage/reportEn/sendMsgLog.vue"),
         name: "群发日志",
         hidden: true,
+        meta:{
+            name_en:"Send Log"
+        }
       },
       {
         path: "strategyReport",
         name: "策略报告",
         component: () => import("@/views/report_manage/strategyReport.vue"),
+        meta:{
+            name_en:"Strategy Report"
+        }
       },
       {
         path: "cloudDisk",
         name: "云盘",
         component: () => import("@/views/report_manage/cloudDisk.vue"),
+        meta:{
+            name_en:"Cloud"
+        }
       },
       // {
       //   path: "pdfList",
@@ -255,11 +294,17 @@ export default [
         path: "reportvariety",
         name: "品种管理",
         component: () => import("@/views/report_manage/reportVarietyV2.vue"),
+        meta:{
+            name_en:"Variety Mgmt"
+        }
       },
       {
         path: "smartReportList",
         name: "智能研报",
         component: () => import("@/views/smartReport/reportList.vue"),
+        meta:{
+            name_en:"Smart Report"
+        }
       },
     ],
   },
@@ -271,6 +316,9 @@ export default [
     name: "系统设置",
     hidden: false,
     icon_path: require("@/assets/img/home/set_ico.png"),
+    meta:{
+        name_en:"Sys Settings"
+    },
     children: [
       {
         path: "Sysdepart",
@@ -279,6 +327,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"Dept Management"
         },
       },
       {
@@ -288,6 +337,7 @@ export default [
         hidden: false,
         meta: {
           keepAlive: false,
+          name_en:"Role Management"
         },
       },
       {
@@ -300,6 +350,8 @@ export default [
           pathFrom: "Sysrole",
           pathName: "角色管理",
           keepAlive: false,
+          name_en:"Set Role Auth",
+          pathName_en:"Role Management"
         },
       },
       {
@@ -307,48 +359,72 @@ export default [
         component: () => import("@/views/system_manage/dataAuthManage.vue"),
         name: "手工数据权限",
         hidden: false,
+        meta:{
+            name_en:"Manual Data Perms"
+        },
       },
       {
         path: "operateAuth",
         component: () => import("@/views/system_manage/dataOperaAuth.vue"),
         name: "数据操作权限",
         hidden: false,
+        meta:{
+            name_en:"Data Op Perms"
+        },
       },
       {
         path: "enAuthManage",
         component: () => import("@/views/system_manage/enAuthManage.vue"),
         name: "英文权限配置",
         hidden: false,
+        meta:{
+            name_en:"Eng Perm Setting"
+        },
       },
       {
         path: "etaBaseConfig",
         component: () => import("@/views/system_manage/etaBaseConfig.vue"),
         name: "基本配置",
         hidden: true,
+        meta:{
+            name_en:"Basic Setting"
+        },
       },
       {
         path: "outlinkListConfig",
         component: () => import("@/views/system_manage/outlinkListConfig.vue"),
         name: "外部链接配置",
         hidden: true,
+        meta:{
+            name_en:"Ext Link Config"
+        },
       },
       {
         path: "approveSetting",
         component: () => import("@/views/approve_manage/approveSetting.vue"),
         name: "审批流配置",
         hidden: true,
+        meta:{
+            name_en:"Approv WF Config"
+        },
       },
       {
         path: "approveEdit",
         component: () => import("@/views/approve_manage/approveEdit.vue"),
         name: "编辑审批流",
         hidden:true,
+        meta:{
+            name_en:"Edit Approv WF"
+        },
       },
       {
         path: "chartThemeIndex",
         component: () => import("@/views/system_manage/chartTheme/index.vue"),
         name: "图表配置",
         hidden:false,
+        meta:{
+            name_en:"Chart Configuration"
+        },
       },
       {
         path: "chartThemeSet",
@@ -357,7 +433,10 @@ export default [
         hidden:true,
         meta: {
           pathFrom: "chartThemeIndex",
-          pathName: "图表配置"
+          pathName: "图表配置",
+          pathName_en:'Chart Configuration',
+          name_en:"Chart Theme Configuration",
+
         },
       },  
       {
@@ -365,12 +444,18 @@ export default [
         component: () => import("@/views/dataSource_manage/accountList.vue"),
         name: "数据源终端管理",
         hidden: true,
+        meta:{
+            name_en:"Data Src Term Mgmt"
+        },
       },
       {
         path: "dataRefreshSetting",
         component: () => import("@/views/system_manage/dataRefreshSetting.vue"),
         name: "数据刷新设置",
         hidden: true,
+        meta:{
+            name_en:"Data Refresh Settg"
+        },
       },
     ],
   },
@@ -381,12 +466,18 @@ export default [
     name: "外部链接",
     hidden: false,
     icon_path: require("@/assets/img/home/set_ico.png"),
+    meta:{
+        name_en:"External Links"
+    },
     children: [
       {
         path: "outlinkList",
         component: () => import("@/views/system_manage/outlinkList.vue"),
         name: "外部链接",
         hidden: true,
+        meta:{
+            name_en:"External Links"
+        },
       },
     ]
   }

+ 14 - 4
src/routes/modules/pptRoutes.js

@@ -41,6 +41,9 @@ export default [
 		name: '智能PPT',
 		icon_path: require('@/assets/img/home/ppt_ic.png'),
 		hidden: false,
+		meta:{
+			name_en:"PPT Slides"
+		},
 		children: [
       //旧版ppt
       {
@@ -67,7 +70,8 @@ export default [
 				name: 'ppt编辑',
 				hidden: true,
 				meta: {
-					keepAlive: false
+					keepAlive: false,
+					name_en:"PPT Editor"
 				}
 			},{
 				path: 'pptlist',
@@ -75,7 +79,8 @@ export default [
 				name: 'PPT列表',
 				hidden: true,
 				meta: {
-					keepAlive: false
+					keepAlive: false,
+					name_en:"PPT Slides"
 				}
 			}
 		]
@@ -88,6 +93,9 @@ export default [
     name:'英文PPT',
     icon_path: require('@/assets/img/home/ppt_ic.png'),
     hidden:false,
+    meta:{
+        name_en:"English PPT Slides"
+    },
     children:[
       {
         path: 'ppteneditor',
@@ -95,7 +103,8 @@ export default [
         name: 'ppt编辑',
         hidden: true,
         meta: {
-          keepAlive: false
+          keepAlive: false,
+          name_en:"English PPT Editor"
         }
       },{
         path: 'pptenlist',
@@ -103,7 +112,8 @@ export default [
         name: 'PPT列表',
         hidden: true,
         meta: {
-          keepAlive: false
+          keepAlive: false,
+          name_en:"English PPT Slides"
         }
       },
     ]

+ 27 - 4
src/routes/modules/semanticsRoutes.js

@@ -5,23 +5,34 @@ export default [{
   component: () => import('@/views/Home.vue'),
   name: '语义分析',
   hidden: false,
+  meta:{
+    name_en:"Text Analysis"
+  },
   children: [{
       path: "tagPage",
       name: "标签管理",
-      component: () => import('@/views/semantics_manage/tagPage.vue')
+      component: () => import('@/views/semantics_manage/tagPage.vue'),
+      meta:{
+        name_en:"Tag Management"
+      },
     },
     {
       path: "documentPage",
       name: "文档管理",
-      component: () => import('@/views/semantics_manage/documentPage.vue')
+      component: () => import('@/views/semantics_manage/documentPage.vue'),
+      meta:{
+        name_en:"Doc Management"
+      },
     },
     {
       path: "addDocument",
       name: "添加文档",
       component: () => import('@/views/semantics_manage/document/documentEditPage.vue'),
       meta: {
+            name_en:'Add Document',
             pathFrom:'documentPage',
             pathName:'文档管理',
+            pathName_en:'Doc Management',
             keepAlive: false
         }
     },
@@ -30,23 +41,30 @@ export default [{
       name: "编辑文档",
       component: () => import('@/views/semantics_manage/document/documentEditPage.vue'),
       meta: {
+            name_en:'Edit Document',
             pathFrom:'documentPage',
             pathName:'文档管理',
+            pathName_en:'Doc Management',
             keepAlive: false
         }
     },
     {
       path: "semanticsPage",
       name: "文档对比",
-      component: () => import('@/views/semantics_manage/semanticsPage.vue')
+      component: () => import('@/views/semantics_manage/semanticsPage.vue'),
+      meta:{
+        name_en:"Doc Comparison"
+      },
     },
     {
       path: "addSemantics",
       name: "添加文档对比",
       component: () => import('@/views/semantics_manage/semantics/semanticsEditPage.vue'),
       meta: {
+            name_en:"Add Doc Comparison",
             pathFrom:'semanticsPage',
             pathName:'文档对比',
+            pathName_en:"Doc Comparison",
             keepAlive: false
         }
     },
@@ -55,15 +73,20 @@ export default [{
       name: "编辑文档对比",
       component: () => import('@/views/semantics_manage/semantics/semanticsEditPage.vue'),
       meta: {
+            name_en:"Edit Doc Comparison",
             pathFrom:'semanticsPage',
             pathName:'文档对比',
+            pathName_en:"Doc Comparison",
             keepAlive: false
         }
     },
     {
       path: "ASR",
       name: "语音识别",
-      component: () => import('@/views/semantics_manage/asr/ASR.vue')
+      component: () => import('@/views/semantics_manage/asr/ASR.vue'),
+      meta:{
+        name_en:"ASR"
+      },
     }
   ]
 }]

+ 11 - 2
src/routes/modules/supplyRoutes.js

@@ -6,16 +6,25 @@ export default [
 		component: () => import('@/views/Home.vue'),
 		name: '供应分析',
 		hidden: false,
+		meta:{
+			name_en:"Supply Analy"
+		},
 		children: [
       {
 				path: "stockplant",
 				name: "装置检修",
-				component: () => import('@/views/supply_manage/stockPlant.vue')
+				component: () => import('@/views/supply_manage/stockPlant.vue'),
+				meta:{
+					name_en:"Equip Maintenance"
+				},
 			},
       {
 				path: "analyseVariety",
 				name: "分析品种",
-				component: () => import('@/views/supply_manage/analyseVariety.vue')
+				component: () => import('@/views/supply_manage/analyseVariety.vue'),
+				meta:{
+					name_en:"Analyse Variety"
+				},
 			},
     ]
   },

+ 10 - 1
src/utils/buttonConfig.js

@@ -619,6 +619,14 @@ export const productPricePermission = {
     goodsPrice_priceLine_addMyChart:'goodsPrice:priceLine:addMyChart',
     goodsPrice_priceLine_share:'goodsPrice:priceLine:share',
 }
+/**
+ * --------------------------------------------------------------------------工具箱-----------------------------------------------------
+ */
+export const toolBoxPermission = {
+    forexCalendar_view:'forexCalendar:view',//查看日历
+    forexCalendar_save:'forexCalendar:save',//添加/编辑事项
+
+}
 /*
  * --------------------------------------------------------------------------系统设置------------------------------------------------
 */
@@ -753,7 +761,8 @@ const btnMap  = {
     outlinkConfigPermission,approveFlowPermission,
     approvePermission,
     outlinkConfigPermission,
-    chartThemePermission
+    chartThemePermission,
+    toolBoxPermission
 }
 
 /**

+ 33 - 0
src/utils/defaultOptions.js

@@ -164,6 +164,39 @@ export const unitArr = [
 	'美分/加仑',
 	'手'
 ]
+//频度筛选框,支持中英文
+export const frequencySelectList = ()=>{
+    return [
+        {
+            value:'日度',
+            label:bus.$i18nt.t('Edb.FreAll.day')
+        },
+        {
+            value:'周度',
+            label:bus.$i18nt.t('Edb.FreAll.week')
+        },
+        {
+            value:'旬度',
+            label:bus.$i18nt.t('Edb.FreAll.dekad')
+        },
+        {
+            value:'月度',
+            label:bus.$i18nt.t('Edb.FreAll.month')
+        },
+        {
+            value:'季度',
+            label:bus.$i18nt.t('Edb.FreAll.quarter')
+        },
+        {
+            value:'半年度',
+            label:bus.$i18nt.t('Edb.FreAll.half_year')
+        },
+        {
+            value:'年度',
+            label:bus.$i18nt.t('Edb.FreAll.year')
+        }
+    ]
+}
 
 /* 季节性图配置 */
 export const seasonOptions = {

+ 5 - 4
src/views/Home.vue

@@ -141,7 +141,7 @@
                       @click.stop="handleClickBread(item)"
                       :style="`cursor: pointer; color: ${$setting.theme_color}`"
                     >
-                      {{ item.meta.pathName }}
+                    {{ $i18nt.locale==='zh'?item.meta.pathName:item.meta.pathName_en }}
                     </span>
                     <span
                       v-if="item.meta.pathFrom"
@@ -158,13 +158,14 @@
                       @click.stop="routeClick(item)"
                     >
                       <template v-if="$route.path==='/positionAnalysisDetail'">
-                        {{breadSelfName||'持仓详情'}}
+                        <!-- {{breadSelfName||'持仓详情'}} -->
+                        {{$i18nt.locale==='zh'?'持仓详情':'Position Analysis'}}
                       </template>
                       <template v-else>
-                        {{ item.name }}
+                        {{ $i18nt.locale==='zh'?item.name:item.meta.name_en }}
                       </template>
                     </span>
-                    <span v-else>{{ item.name }}</span>
+                    <span v-else>{{ $i18nt.locale==='zh'?item.name:item.meta.name_en }}</span>
                   </el-breadcrumb-item>
                 </template>
                 <template v-else>

+ 5 - 5
src/views/chartRelevance_manage/components/saveEdbToBaseDia.vue

@@ -42,9 +42,9 @@
 						clearable>
 							<el-option
 								v-for="item in frequencyArr"
-								:key="item"
-								:label="item"
-								:value="item">
+								:key="item.value"
+								:label="item.label"
+								:value="item.value">
 							</el-option>
 						</el-select>
 					</el-form-item>
@@ -69,7 +69,7 @@
 import { dataBaseInterface } from '@/api/api.js';
 import * as preDictEdbInterface from '@/api/modules/predictEdbApi.js';
 import chartRelevanceApi,{ statisticFeatureInterface } from '@/api/modules/chartRelevanceApi.js';
-import { unitArr } from '@/utils/defaultOptions';
+import { unitArr,frequencySelectList } from '@/utils/defaultOptions';
 import selectUnit from '@/components/selectUnit.vue';
 export default {
 	components: { selectUnit },
@@ -128,7 +128,7 @@ export default {
 				emitPath: false,
 				checkStrictly: true
 			},
-			frequencyArr:['日度','周度','旬度','月度','季度','年度'],
+			frequencyArr:frequencySelectList(),
 		};
 	},
 	methods: {

+ 36 - 19
src/views/classify_manage/chapterSettingV2.vue

@@ -4,7 +4,7 @@
             <el-button 
                 type="primary"
                 @click="addChapter"
-            >添加章节</el-button>
+            >{{ $t('ReportManage.CategoryList.add_section') }}</el-button>
         </div>
         <div class="content-box">
             <el-tree
@@ -15,7 +15,7 @@
                     children: 'Child'
                 }"
 				check-strictly
-				empty-text="暂无数据"
+				:empty-text="$t('Common.no_classify_msg')"
                 draggable
                 :allow-drop="canDropHandle"
                 @node-drop="dropOverHandle"
@@ -25,7 +25,11 @@
 					slot-scope="{ data }"
 				>
                     <div>
-                        <span :class="['tag', data.Enabled==1?'open':'close']" @click.stop="handleEnableSet(data)">{{data.Enabled==1?'启用':'禁用'}}</span>
+                        <span 
+                            :class="['tag', data.Enabled==1?'open':'close']" 
+                            @click.stop="handleEnableSet(data)">
+                            {{data.Enabled==1?$t('Common.enable'):$t('Common.disable')}}
+                        </span>
                         <span>{{data.ReportChapterTypeName}}</span>
                     </div>
 					
@@ -39,6 +43,7 @@
 
         <!-- 添加/编辑 章节 -->
     <el-dialog 
+        v-if="addDialogShow"
         :title="dialogTitle" 
         :modal-append-to-body='false' 
         :visible.sync="addDialogShow" 
@@ -49,18 +54,26 @@
         @close="addDialogClose"
     >
         <div style="display: flex;align-items: center;justify-content: center;">
-            <el-form :model="addForm" label-width="95px" :rules="addFormRules" ref="addForm">
-                <el-form-item label="章节名称" prop="ReportChapterTypeName">
-                    <el-input v-model="addForm.ReportChapterTypeName" style="width: 317px;" placeholder="请输入章节名称"></el-input>
+            <el-form :model="addForm" label-width="auto" :rules="addFormRules" ref="addForm">
+                <!-- 章节名称 -->
+                <el-form-item :label="$t('ReportManage.CategoryList.section_name')" prop="ReportChapterTypeName">
+                    <el-input 
+                        v-model="addForm.ReportChapterTypeName" 
+                        style="width: 317px;" 
+                        :placeholder="$t('ReportManage.CategoryList.section_name_hint')">
+                    </el-input>
                 </el-form-item>
-                <el-form-item label="上级分类">
-                    <el-input  disabled :value="researchType=='day'?'晨报':'周报'" style="width: 317px;" placeholder="请输入章节名称"></el-input>
+                <!-- 上级分类 -->
+                <el-form-item :label="$t('ReportManage.CategoryList.parent_category')">
+                    <el-input  disabled :value="researchType=='day'?'晨报':'周报'" style="width: 317px;" 
+                    :placeholder="$t('ReportManage.CategoryList.related_variety_inputhint')"></el-input>
                 </el-form-item>
-                <el-form-item prop="variety" label="关联品种">
+                <!-- 关联品种 -->
+                <el-form-item prop="variety" :label="$t('ReportManage.CategoryList.related_variety')">
                     <template slot="label">
-                        <el-tooltip class="item" effect="dark" content="控制报告阅读权限">
+                        <el-tooltip class="item" effect="dark" :content="$t('ReportManage.CategoryList.related_variety_hint')">
                             <div>
-                                <span>关联品种</span>
+                                <span>{{ $t('ReportManage.CategoryList.related_variety') }}</span>
                                 <i class="el-icon-info"></i>
                             </div>
                         </el-tooltip>
@@ -68,7 +81,7 @@
                     <el-cascader
                         :options="reportVarietyList" 
                         v-model="addForm.ChartPermissionIdList" 
-                        placeholder="请选择"
+                        :placeholder="$t('ReportManage.CategoryList.related_variety_inputhint')"
                         collapse-tags
                         :props="{value:'PermissionId',label:'PermissionName',children:'Child',multiple: true,emitPath:false}" 
                         style="width:317px;"
@@ -77,8 +90,8 @@
             </el-form>
         </div>
         <div solt="footer" style="padding: 20px 0;text-align: center;">
-            <el-button size="medium" style="width:130px;" @click="addDialogShow=false">取消</el-button>
-            <el-button type="primary" size="medium" style="margin-left: 16px;width:130px ;" @click="addChapterSave">保存</el-button>
+            <el-button size="medium" style="width:130px;" @click="addDialogShow=false">{{ $t('Dialog.cancel_btn') }}</el-button>
+            <el-button type="primary" size="medium" style="margin-left: 16px;width:130px ;" @click="addChapterSave">{{ $t('Dialog.confirm_save_btn') }}</el-button>
       </div>
     </el-dialog>
         
@@ -134,7 +147,7 @@ export default {
         },
 
         addChapter(){
-            this.dialogTitle="添加章节"
+            this.dialogTitle=this.$t('ReportManage.CategoryList.add_section')
             this.addDialogShow=true
             this.addForm.ReportChapterTypeName=''
             this.addForm.ChartPermissionIdList=''
@@ -149,7 +162,7 @@ export default {
                 ReportChapterTypeId:row.ReportChapterTypeId,
                 ChartPermissionIdList:row.ChartPermissionIdList||''
             }
-            this.dialogTitle="编辑章节"
+            this.dialogTitle=this.$t('ReportManage.CategoryList.edit_section')
             this.addDialogShow=true
         },
 
@@ -171,7 +184,11 @@ export default {
             }
             requestMethod(params).then(res=>{
               if(res.Ret == 200){
-                this.$message.success(`${this.dialogTitle}成功`)
+                this.$message.success(
+                    params.ReportChapterTypeId
+                    ?this.$t('ReportManage.CategoryList.edit_section_successful')
+                    :this.$t('ReportManage.CategoryList.add_section_successful')
+                )
                 this.addDialogShow=false
                 this.getList()
               }
@@ -196,7 +213,7 @@ export default {
                 Enabled:item.Enabled==1?0:1
             }).then(res=>{
                 if(res.Ret===200){
-                    this.$message.success('设置成功')
+                    this.$message.success(this.$t('ReportManage.CategoryList.setup_successful'))
                     this.getList()
                 }
             })
@@ -225,7 +242,7 @@ export default {
             console.log(params);
             setChapterSort(params).then(res=>{
                 if(res.Ret===200){
-                    this.$message.success('移动成功')
+                    this.$message.success(this.$t('ReportManage.CategoryList.move_successful'))
                 }else{
                     this.getList()
                 }

+ 49 - 30
src/views/classify_manage/classifyEnlistV2.vue

@@ -2,18 +2,25 @@
     <div class="classify-page">
         <div class="top-wrap">
             <div class="type-box">
-                <div class="item" @click="$emit('typeChange','1')">中文分类</div>
-                <div class="item active">英文分类</div>
+                <!-- 中文分类 -->
+                <div class="item" @click="$emit('typeChange','1')">
+                    {{ $t('ReportManage.CategoryList.chinese_tabs') }}
+                </div>
+                <!-- 英文分类 -->
+                <div class="item active">{{ $t('ReportManage.CategoryList.english_tabs') }}</div>
             </div>
             <div style="display:flex;padding:10px;gap:10px">
-            <el-button 
-                type="primary"
-                @click="addClassify"
-                v-permission="permissionBtn.enClassifyBtn.classifyList_enClassify_add"
-            >添加分类</el-button>
-            <el-input placeholder="分类名称" v-model="searchVal" style="max-width: 262px;" @change="getList" clearable>
-                <i slot="prefix" class="el-input__icon el-icon-search"></i>
-            </el-input>
+                <!-- 添加分类 -->
+                <el-button 
+                    type="primary"
+                    @click="addClassify"
+                    v-permission="permissionBtn.enClassifyBtn.classifyList_enClassify_add"
+                >
+                    {{$t('ReportManage.CategoryList.add_category')}}
+                </el-button>
+                <el-input :placeholder="$t('ReportManage.CategoryList.category_name')" v-model="searchVal" style="max-width: 262px;" @change="getList" clearable>
+                    <i slot="prefix" class="el-input__icon el-icon-search"></i>
+                </el-input>
             </div>
         </div>
         <div class="content-box">
@@ -25,7 +32,7 @@
                     children: 'Child'
                 }"
 				check-strictly
-				empty-text="暂无数据"
+				:empty-text="$t('Common.no_classify_msg')"
                 draggable
                 indent='76'
                 :allow-drop="canDropHandle"
@@ -36,7 +43,10 @@
 					slot-scope="{ node, data }"
 				>
                     <div>
-                        <span :class="['tag', data.Enabled==1?'open':'close']" @click.stop="handleEnableSet(data)">{{data.Enabled==1?'启用':'禁用'}}</span>
+                        <span 
+                            :class="['tag', data.Enabled==1?'open':'close']" 
+                            @click.stop="handleEnableSet(data)">
+                            {{data.Enabled==1?$t('Common.enable'):$t('Common.disable')}}</span>
                         <span>{{data.ClassifyName}}</span>
                     </div>
 					
@@ -50,8 +60,9 @@
 
         <!-- 分类弹窗 -->
         <m-dialog 
-            :title="classifyForm.classify_id?'编辑分类':'新增分类'" 
+        :title="classifyForm.classify_id?$t('ReportManage.CategoryList.edit_category'):$t('ReportManage.CategoryList.add_category')" 
             :show.sync="classifyForm.show" 
+            v-if="classifyForm.show"
             width="650px"
         >
             <div style="padding-left: 50px">
@@ -59,26 +70,29 @@
                     :model="classifyForm" 
                     :rules="formRules" 
                     ref="formRef" 
-                    label-position="left"
                     hide-required-asterisk
-                    label-width="90px">
-                    <el-form-item prop="classify_name" label="分类名称">
+                    label-width="auto">
+                    <!-- 分类名称 -->
+                    <el-form-item prop="classify_name" :label="$t('ReportManage.CategoryList.category_name')">
                         <el-input 
                             type="text" 
                             v-model="classifyForm.classify_name" 
-                            placeholder="请输入分类名称"
+                            :placeholder="$t('ReportManage.CategoryList.category_name_hint')"
                             style="width:400px;"
                         />
                     </el-form-item>
-                    <el-form-item prop="parent_id" label="上级分类">
-                        <el-cascader :options="classifyparentArr" v-model="classifyForm.parent_id" placeholder="请选择"
+                    <!-- 上级分类 -->
+                    <el-form-item prop="parent_id" :label="$t('ReportManage.CategoryList.parent_category')">
+                        <el-cascader :options="classifyparentArr" v-model="classifyForm.parent_id"
+                        :placeholder="$t('ReportManage.CategoryList.related_variety_inputhint')"
                         :props="{value:'Id',label:'ClassifyName',children:'Child',checkStrictly:true,emitPath:false}" style="min-width:400px;"></el-cascader>
                     </el-form-item>
-                    <el-form-item prop="variety" label="关联品种" v-if="classifyForm.level==3&&permissionBtn.enClassifyBtn.classifyList_enClassify_connect_variety">
+                    <!-- 关联品种 -->
+                    <el-form-item prop="variety" :label="$t('ReportManage.CategoryList.related_variety')" v-if="classifyForm.level==3&&permissionBtn.enClassifyBtn.classifyList_enClassify_connect_variety">
                         <template slot="label">
-                            <el-tooltip class="item" effect="dark" content="控制报告阅读权限">
+                            <el-tooltip class="item" effect="dark" :content="$t('ReportManage.CategoryList.related_variety_hint')">
                                 <div>
-                                    <span>关联品种</span>
+                                    <span>{{ $t('ReportManage.CategoryList.related_variety') }}</span>
                                     <i class="el-icon-info"></i>
                                 </div>
                             </el-tooltip>
@@ -86,7 +100,7 @@
                         <el-cascader
                             :options="reportVarietyList" 
                             v-model="classifyForm.variety" 
-                            placeholder="请选择"
+                            :placeholder="$t('ReportManage.CategoryList.related_variety_inputhint')"
                             collapse-tags
                             :props="{value:'PermissionId',label:'PermissionName',children:'Child',multiple: true,emitPath:false}" 
                             style="min-width:400px;"
@@ -98,12 +112,12 @@
                 <el-button
                 @click="cancelClassify"
                 style="width: 132px; height: 40px"
-                >取消</el-button>
+                >{{ $t('Dialog.cancel_btn') }}</el-button>
                 <el-button
                 @click="setClassifyHandle"
                 type="primary"
                 style="width: 132px; height: 40px"
-                >保存</el-button>
+                >{{ $t('Dialog.confirm_save_btn') }}</el-button>
             </div>
         </m-dialog>
     </div>
@@ -131,7 +145,7 @@ export default {
                 level:1
             },
             formRules: {
-                classify_name: [{ required:true,message:'请输入分类名称',trigger:'blur'}]
+                classify_name: [{ required:true,message:this.$t('ReportManage.CategoryList.category_name_hint'),trigger:'blur'}]
             },
             classifyparentArr:[],
 
@@ -159,7 +173,7 @@ export default {
                             ...item
                         }
                     })
-                    this.classifyparentArr.unshift({Id:'0',ClassifyName:'无',Child:null})
+                    this.classifyparentArr.unshift({Id:'0',ClassifyName:this.$t('ReportManage.CategoryList.parent_none'),Child:null})
                 }
             }
         },
@@ -176,7 +190,7 @@ export default {
                 Enabled:item.Enabled==1?0:1
             }).then(res=>{
                 if(res.Ret===200){
-                    this.$message.success('设置成功')
+                    this.$message.success(this.$t('ReportManage.CategoryList.setup_successful'))
                     this.getList('init')
                 }
             })
@@ -216,7 +230,12 @@ export default {
                 : await classifyEnInterface.classifyAdd(params)
 
             if(Ret !== 200) return
-            this.$message.success(Msg)
+            //this.$message.success(Msg)
+            this.$message.success(
+                classify_id
+                ?this.$t('ReportManage.CategoryList.modification_successful')
+                :this.$t('ReportManage.CategoryList.addition_successful')
+            )
             this.cancelClassify();
             this.getList('init');
         },
@@ -269,7 +288,7 @@ export default {
             console.log(params);
             classifyEnInterface.moveSort(params).then(res=>{
                 if(res.Ret===200){
-                    this.$message.success('移动成功')
+                    this.$message.success(this.$t('ReportManage.CategoryList.move_successful'))
                 }else{
                     this.getList()
                 }

+ 62 - 31
src/views/classify_manage/classifylistV2.vue

@@ -2,18 +2,29 @@
     <div class="classify-page">
         <div class="top-wrap">
             <div class="type-box">
-                <div class="item active" v-permission="permissionBtn.classifyBtn.classifyList_cnClassify">中文分类</div>
-                <div class="item" @click="$emit('typeChange','2')" v-permission="permissionBtn.enClassifyBtn.classifyList_enClassify">英文分类</div>
+                <!-- 中文分类 -->
+                <div class="item active" 
+                    v-permission="permissionBtn.classifyBtn.classifyList_cnClassify">
+                    {{ $t('ReportManage.CategoryList.chinese_tabs') }}
+                </div>
+                <!-- 英文分类 -->
+                <div class="item" @click="$emit('typeChange','2')" 
+                    v-permission="permissionBtn.enClassifyBtn.classifyList_enClassify">
+                    {{ $t('ReportManage.CategoryList.english_tabs') }}
+                </div>
             </div>
             <div style="display:flex;padding:10px;gap:10px">
-            <el-button 
-                type="primary"
-                @click="addClassify"
-                v-permission="permissionBtn.classifyBtn.classifyList_cnClassify_classifyAdd"
-            >添加分类</el-button>
-            <el-input placeholder="分类名称" v-model="searchVal" style="max-width: 262px;" @change="getList" clearable>
-                <i slot="prefix" class="el-input__icon el-icon-search"></i>
-            </el-input>
+                <!-- 添加分类 -->
+                <el-button 
+                    type="primary"
+                    @click="addClassify"
+                    v-permission="permissionBtn.classifyBtn.classifyList_cnClassify_classifyAdd"
+                >
+                    {{$t('ReportManage.CategoryList.add_category')}}
+                </el-button>
+                <el-input :placeholder="$t('ReportManage.CategoryList.category_name')" v-model="searchVal" style="max-width: 262px;" @change="getList" clearable>
+                    <i slot="prefix" class="el-input__icon el-icon-search"></i>
+                </el-input>
             </div>
         </div>
         <div class="content-box">
@@ -25,7 +36,7 @@
                     children: 'Child'
                 }"
 				check-strictly
-				empty-text="暂无数据"
+				:empty-text="$t('Common.no_classify_msg')"
                 draggable
                 indent='76'
                 :allow-drop="canDropHandle"
@@ -36,12 +47,22 @@
 					slot-scope="{ data }"
 				>
                     <div>
-                        <span :class="['tag', data.Enabled==1?'open':'close']" @click.stop="handleEnableSet(data)">{{data.Enabled==1?'启用':'禁用'}}</span>
+                        <span 
+                            :class="['tag', data.Enabled==1?'open':'close']" 
+                            @click.stop="handleEnableSet(data)">
+                            {{data.Enabled==1?$t('Common.enable'):$t('Common.disable')}}
+                        </span>
                         <span>{{data.ClassifyName}}</span>
                     </div>
 					
                     <div class="opt-box">
-                        <span class="editsty" v-if="['晨报','周报'].includes(data.ClassifyName)" @click="chapterSetting(data)" v-permission="permissionBtn.classifyBtn.classifyList_cnClassify_chapterSetting">章节设置</span>
+                        <!-- 章节设置 -->
+                        <span class="editsty" 
+                            v-if="['晨报','周报'].includes(data.ClassifyName)" 
+                            @click="chapterSetting(data)" 
+                            v-permission="permissionBtn.classifyBtn.classifyList_cnClassify_chapterSetting">
+                            {{ $t('ReportManage.CategoryList.section_settings') }}
+                        </span>
                         <img class="icon-drag" src="~@/assets/img/data_m/move_ico2.png" alt="">
                         <img class="icon-set" src="~@/assets/img/icons/variety_set.png" alt="" @click.stop="handleEdit(data)" v-permission="permissionBtn.classifyBtn.classifyList_cnClassify_classifyEdit">
                     </div>
@@ -51,8 +72,9 @@
 
         <!-- 分类弹窗 -->
         <m-dialog 
-            :title="classifyForm.classify_id?'编辑分类':'新增分类'" 
+            :title="classifyForm.classify_id?$t('ReportManage.CategoryList.edit_category'):$t('ReportManage.CategoryList.add_category')" 
             :show.sync="classifyForm.show" 
+            v-if="classifyForm.show"
             width="650px"
         >
             <div style="padding-left: 50px">
@@ -60,28 +82,31 @@
                     :model="classifyForm" 
                     :rules="formRules" 
                     ref="formRef" 
-                    label-position="left"
                     hide-required-asterisk
-                    label-width="100px">
-                    <el-form-item prop="classify_name" label="分类名称">
+                    label-width="auto">
+                    <!-- 分类名称 -->
+                    <el-form-item prop="classify_name" :label="$t('ReportManage.CategoryList.category_name')">
                         <el-input 
                             type="text" 
                             v-model="classifyForm.classify_name" 
-                            placeholder="请输入分类名称"
+                            :placeholder="$t('ReportManage.CategoryList.category_name_hint')"
                             style="width:400px;"
                         />
                     </el-form-item>
-                    <el-form-item prop="parent_id" label="上级分类">
-                        <el-select v-model="classifyForm.parent_id" placeholder="请选择" style="width:400px;">
-                            <el-option label="无" :value="0"></el-option>
+                    <!-- 上级分类 -->
+                    <el-form-item prop="parent_id" :label="$t('ReportManage.CategoryList.parent_category')">
+                        <el-select v-model="classifyForm.parent_id" 
+                            :placeholder="$t('ReportManage.CategoryList.related_variety_inputhint')" style="width:400px;">
+                            <el-option :label="$t('ReportManage.CategoryList.parent_none')" :value="0"></el-option>
                             <el-option v-for="(item,index) in classifyparentArr" :key="index" :label="item.ClassifyName" :value="item.Id"></el-option>
                         </el-select>
                     </el-form-item>
-                    <el-form-item prop="variety" label="关联品种" v-if="classifyForm.parent_id&&permissionBtn.classifyBtn.classifyList_cnClassify_connect_variety">
+                    <!-- 关联品种 -->
+                    <el-form-item prop="variety" :label="$t('ReportManage.CategoryList.related_variety')" v-if="classifyForm.parent_id&&permissionBtn.classifyBtn.classifyList_cnClassify_connect_variety">
                         <template slot="label">
-                            <el-tooltip class="item" effect="dark" content="控制报告阅读权限">
+                            <el-tooltip class="item" effect="dark" :content="$t('ReportManage.CategoryList.related_variety_hint')">
                                 <div>
-                                    <span>关联品种</span>
+                                    <span>{{ $t('ReportManage.CategoryList.related_variety') }}</span>
                                     <i class="el-icon-info"></i>
                                 </div>
                             </el-tooltip>
@@ -89,7 +114,7 @@
                         <el-cascader
                             :options="reportVarietyList" 
                             v-model="classifyForm.variety" 
-                            placeholder="请选择"
+                            :placeholder="$t('ReportManage.CategoryList.related_variety_inputhint')"
                             collapse-tags
                             :props="{value:'PermissionId',label:'PermissionName',children:'Child',multiple: true,emitPath:false}" 
                             style="min-width:400px;"
@@ -101,12 +126,12 @@
                 <el-button
                 @click="cancelClassify"
                 style="width: 132px; height: 40px"
-                >取消</el-button>
+                >{{ $t('Dialog.cancel_btn') }}</el-button>
                 <el-button
                 @click="setClassifyHandle"
                 type="primary"
                 style="width: 132px; height: 40px"
-                >保存</el-button>
+                >{{ $t('Dialog.confirm_save_btn') }}</el-button>
             </div>
         </m-dialog>
     </div>
@@ -133,7 +158,7 @@ export default {
                 variety:'',//关联的品种
             },
             formRules: {
-                classify_name: [{ required:true,message:'请输入分类名称',trigger:'blur'}]
+                classify_name: [{ required:true,message:this.$t('ReportManage.CategoryList.category_name_hint'),trigger:'blur'}]
             },
             classifyparentArr:[],
 
@@ -211,7 +236,12 @@ export default {
                 : await classifyadd(params)
 
             if(Ret !== 200) return
-            this.$message.success(Msg)
+            //this.$message.success(Msg)
+            this.$message.success(
+                classify_id
+                ?this.$t('ReportManage.CategoryList.modification_successful')
+                :this.$t('ReportManage.CategoryList.addition_successful')
+            )
             this.cancelClassify();
             this.getList();
         },
@@ -240,7 +270,8 @@ export default {
                 Enabled:item.Enabled==1?0:1
             }).then(res=>{
                 if(res.Ret===200){
-                    this.$message.success('设置成功')
+                    //设置成功
+                    this.$message.success(this.$t('ReportManage.CategoryList.setup_successful'))
                     this.getList()
                 }
             })
@@ -282,7 +313,7 @@ export default {
             console.log(params);
             classifyPermissionInterface.moveSort(params).then(res=>{
                 if(res.Ret===200){
-                    this.$message.success('移动成功')
+                    this.$message.success(this.$t('ReportManage.CategoryList.move_successful'))
                 }else{
                     this.getList()
                 }

+ 17 - 11
src/views/dataEntry_manage/addChart.vue

@@ -632,26 +632,30 @@
 							<template slot-scope="{row,$index}">
 								<div class="expand-wrap">
 									<div class="data-change">
-										<el-checkbox v-model="updateData[$index].IsConvert">数据转换</el-checkbox>
+										<!-- 数据转换 -->
+										<el-checkbox v-model="updateData[$index].IsConvert">
+											{{ $t('EtaChartAddPage.data_transformation') }}
+										</el-checkbox>
+										<!-- 乘以/除以/对数 -->
 										<el-select v-model="updateData[$index].ConvertType">
-											<el-option label="乘以" :value="1"></el-option>
-											<el-option label="除以" :value="2"></el-option>
-											<el-option label="对数" :value="3"></el-option>
+											<el-option :label="$t('EtaChartAddPage.multiply_by')" :value="1"></el-option>
+											<el-option :label="$t('EtaChartAddPage.divide_by')" :value="2"></el-option>
+											<el-option :label="$t('EtaChartAddPage.logarithm')" :value="3"></el-option>
 										</el-select>
 									<el-input type="number" v-model="updateData[$index].ConvertValue"></el-input>
 									</div>
 									<div class="unit-change">
-										<label>单位</label>
+										<label>{{ $t('Edb.Detail.e_unit') }}</label>
 										<el-input v-model="updateData[$index].ConvertUnit"></el-input>
-										<label>英文单位</label>
+										<label>{{ $t('Edb.Detail.e_en_unit') }}</label>
 										<el-input v-model="updateData[$index].ConvertEnUnit"></el-input>
 									</div>
-									<!--柱形图-->
+									<!--柱形图:设置为图表单位-->
 									<div class="use-change" v-if="chartInfo.ChartType===7">
-										<el-radio v-model="useUnit" :label="$index">设置为图表单位</el-radio>
+										<el-radio v-model="useUnit" :label="$index">{{ $t('EtaChartAddPage.chart_set_radio') }}</el-radio>
 									</div>
 									<div class="confirm-btn">
-										<el-button type="text" @click="changeTableData($index)">保存</el-button>
+										<el-button type="text" @click="changeTableData($index)">{{ $t('Dialog.confirm_save_btn') }}</el-button>
 									</div>
 								</div>
 							</template>
@@ -874,12 +878,14 @@ export default {
 							const {IsConvert,ConvertType,ConvertValue} = this.updateData[i]
 							//计算方式是否合法
 							if(IsConvert&&!this.checkConver(ConvertType,ConvertValue)){
-								return this.$message.warning(`第${i+1}个指标数据转换不合法,请检查数值`)
+								//提示语:第${i+1}个指标数据转换不合法,请检查数值
+								return this.$message.warning(this.$t('EtaChartAddPage.data_transformation_list_hint',{num:i+1}))
 							}
 							//如果类型为对数,检测数据是否包含负数
 							if(IsConvert&&ConvertType===3){
 								if(!this.checkEdbData(this.tableData[i].DataList)){
-									return this.$message.warning(`第${i+1}个指标数据含有负数或0,无法进行对数运算,请检查`)
+									//提示语:第${i+1}个指标数据含有负数或0,无法进行对数运算,请检查
+									return this.$message.warning(this.$t('EtaChartAddPage.data_transformation_list_hint2',{num:i+1}))
 								}
 							}
 						}

+ 53 - 2
src/views/dataEntry_manage/coal/index.vue

@@ -62,6 +62,9 @@
           :current-node-key="select_node"
           :props="defaultProps"
           default-expand-all
+          :default-expanded-keys="defaultShowNodes"
+          @node-expand="handleNodeExpand"
+          @node-collapse="handleNodeCollapse"
           :default-checked-keys="[select_classify]"
           ref="coalTree"
           highlight-current
@@ -152,7 +155,7 @@ export default {
       },
       classifyList: [],
       select_frequency: "",
-      frequencyType: new Map([
+      frequencyZhType: new Map([
         [1, "日度"],
         [2, "周度"],
         [3, "旬度"],
@@ -178,6 +181,7 @@ export default {
       select_classify_name: "", //选择的分类名称
       select_node: 0,
       isAuto: true, // 改变分类时是否自动获取数据
+      defaultShowNodes:[]
     };
   },
   methods: {
@@ -236,7 +240,7 @@ export default {
           CurrentIndex: this.page_no,
           ClassifyId: Number(this.select_classify),
           GroupName: this.select_classify_name,
-          Frequency: this.frequencyType.get(this.select_frequency),
+          Frequency: this.frequencyZhType.get(this.select_frequency),
         })
         .then((res) => {
           this.rightShow = true;
@@ -315,6 +319,7 @@ export default {
         this.haveMore = false;
         this.select_Unit = res.Data[0].Unit;
         this.select_classify = res.Data[0].ClassifyId;
+        this.orientationNode(res.Data[0].GroupId)
         this.select_UpdateTime = res.Data[0].ModifyTime;
         // 合并数据
         // this.tableOption = [{
@@ -351,6 +356,41 @@ export default {
         console.log(err);
       }
     },
+    // 左侧目录定位
+    orientationNode(Id){
+      this.select_node = Id;
+      this.$refs.coalTree.setCurrentKey(this.select_node);
+      this.defaultShowNodes.push(Id)
+      this.$nextTick(() => {
+        setTimeout(()=>{
+            let parent = document.getElementsByClassName('filter-tree')[0]
+            let node = parent.querySelector('.is-current')
+            parent.scrollTo({
+              top: node.offsetTop-200
+            })
+        },300)
+      })
+    },
+    // 树节点展开
+    handleNodeExpand(data) {
+      // 保存当前展开的节点
+      let flag = this.defaultShowNodes.some((item) => item === data.ClassifyId);
+
+      if (!flag) {
+        // 不存在则存到数组里
+        this.defaultShowNodes.push(data.ClassifyId);
+      }
+    },
+
+    // 树节点关闭
+    handleNodeCollapse(data) {
+      this.defaultShowNodes.some((item, index) => {
+        if (item === data.ClassifyId) {
+          // 删除关闭节点
+          this.defaultShowNodes.length = index;
+        }
+      });
+    },
     loadNext() {
       this.page_no++;
       this.getDataList();
@@ -500,6 +540,17 @@ export default {
       urlStr += `&ModifyTime=${this.select_UpdateTime}`;
       return this.escapeStr(urlStr);
     },
+    frequencyType(){
+        return new Map([
+            [1, /* 日度 */ this.$t('Edb.FreAll.day')],
+            [2, /*周度*/ this.$t('Edb.FreAll.week')],
+            [3, /*旬度*/ this.$t('Edb.FreAll.dekad')],
+            [4, /*月度*/ this.$t('Edb.FreAll.month')],
+            [5, /*季度*/ this.$t('Edb.FreAll.quarter')],
+            [6, /*年度*/ this.$t('Edb.FreAll.year')],
+            [99, /*无固定频率*/ this.$t('Edb.FreAll.unfixed')],
+        ])
+    },
   },
   created() {},
   mounted() {

+ 14 - 7
src/views/dataEntry_manage/dataEntry.vue

@@ -116,6 +116,9 @@
                       >
                       <span v-else>{{ data[item] }}</span>
                     </template>
+                    <template v-else-if="item === 'Frequency'">
+                        {{ frequencyList.find(i=>i.value===data[item])?frequencyList.find(i=>i.value===data[item]).label:'' }}
+                    </template>
                     <template v-else>{{ data[item] }}</template>
                   </div>
                   <div v-else>
@@ -125,7 +128,7 @@
                         v-model="data[item]"
                         filterable
                         remote
-                        placeholder="请输入关键词"
+                        :placeholder="$t('Edb.InputHolderAll.input_keyword')"
                         :remote-method="handleTableHeadSearch"
                         @change="handleTableSelect(sub_index, $event)"
                         @visible-change="handleTableSelectshow"
@@ -166,7 +169,7 @@
                     type="date"
                     :data-rindex="rindex"
                     :data-cindex="-1"
-                    placeholder="选择日期"
+                    :placeholder="$t('Edb.InputHolderAll.input_date')"
                     :clearable="false"
                     :editable="false"
                     value-format="yyyy-MM-dd"
@@ -208,11 +211,11 @@
         </div>
         <div class="frequency-wrap" v-if="showFrequency">
           <span
-            :class="['item', { active: frequency === item }]"
+            :class="['item', { active: frequency === item.value }]"
             v-for="item in frequencyList"
-            :key="item"
-            @click="handleFrequencyChange(item)"
-            >{{ item }}</span>
+            :key="item.value"
+            @click="handleFrequencyChange(item.value)"
+            >{{ item.label }}</span>
         </div>
       </div>
     </div>
@@ -248,6 +251,7 @@ import { dataAuthInterface, dataInterence } from "@/api/api.js";
 import insertData from "./components/insertData";
 import http from "@/api/http";
 import { router } from "../../main";
+import {frequencySelectList} from '@/utils/defaultOptions';
 export default {
   name: "dataEntry",
   components: { insertData },
@@ -278,7 +282,7 @@ export default {
 
       classifyList: [],
       selectClassifyId: null,
-      frequencyList: ["日度", "周度", "旬度", "月度", "季度", "半年度", "年度"],
+      //frequencyList: ["日度", "周度", "旬度", "月度", "季度", "半年度", "年度"],
       frequency: "日度",
       showFrequency: true,
 
@@ -327,6 +331,9 @@ export default {
     role() {
       return localStorage.getItem("Role") || "";
     },
+    frequencyList(){
+        return frequencySelectList()
+    },
   },
 
   watch: {

+ 2 - 2
src/views/dataEntry_manage/databaseComponents/updateNewestDia.vue

@@ -8,7 +8,7 @@
     custom-class="update-newsetdata-dialog"
     center
     v-dialogDrag
-    :title="edbinfo&&edbinfo.DataInsertConfig.Date?`${$t('Table.edit_btn')}${'EtaBasePage.latest_val'}`:`${$t('Table.add_btn')}${'EtaBasePage.latest_val'}`"
+    :title="edbinfo&&edbinfo.DataInsertConfig.Date?`${$t('Table.edit_btn')}${$t('EtaBasePage.latest_val')}`:`${$t('Table.add_btn')}${$t('EtaBasePage.latest_val')}`"
 		width="650px"
   >
     <el-form
@@ -45,7 +45,7 @@
 			<el-form-item :label="$t('Edb.Detail.predict_val')" prop="newEdb" style="width:45%">
 				<el-input
           v-model="formData.value"
-          placeholder="输入值"
+          :placeholder="$t('Edb.InputHolderAll.input_value')"
           style="width:120px;"
           type="number"
         />

+ 17 - 11
src/views/dataEntry_manage/editChart.vue

@@ -636,26 +636,30 @@
 							<template slot-scope="{row,$index}">
 								<div class="expand-wrap">
 									<div class="data-change">
-										<el-checkbox v-model="updateData[$index].IsConvert">数据转换</el-checkbox>
+										<!-- 数据转换 -->
+										<el-checkbox v-model="updateData[$index].IsConvert">
+											{{ $t('EtaChartAddPage.data_transformation') }}
+										</el-checkbox>
+										<!-- 乘以/除以/对数 -->
 										<el-select v-model="updateData[$index].ConvertType">
-											<el-option label="乘以" :value="1"></el-option>
-											<el-option label="除以" :value="2"></el-option>
-											<el-option label="对数" :value="3"></el-option>
+											<el-option :label="$t('EtaChartAddPage.multiply_by')" :value="1"></el-option>
+											<el-option :label="$t('EtaChartAddPage.divide_by')" :value="2"></el-option>
+											<el-option :label="$t('EtaChartAddPage.logarithm')" :value="3"></el-option>
 										</el-select>
 									<el-input type="number" v-model="updateData[$index].ConvertValue"></el-input>
 									</div>
 									<div class="unit-change">
-										<label>单位</label>
+										<label>{{ $t('Edb.Detail.e_unit') }}</label>
 										<el-input v-model="updateData[$index].ConvertUnit"></el-input>
-										<label>英文单位</label>
+										<label>{{ $t('Edb.Detail.e_en_unit') }}</label>
 										<el-input v-model="updateData[$index].ConvertEnUnit"></el-input>
 									</div>
-									<!--柱形图-->
+									<!--柱形图:设置为图表单位-->
 									<div class="use-change" v-if="chartInfo.ChartType===7">
-										<el-radio v-model="useUnit" :label="$index">设置为图表单位</el-radio>
+										<el-radio v-model="useUnit" :label="$index">{{ $t('EtaChartAddPage.chart_set_radio') }}</el-radio>
 									</div>
 									<div class="confirm-btn">
-										<el-button type="text" @click="changeTableData($index)">保存</el-button>
+										<el-button type="text" @click="changeTableData($index)">{{ $t('Dialog.confirm_save_btn') }}</el-button>
 									</div>
 								</div>
 							</template>
@@ -985,12 +989,14 @@ export default {
 							const {IsConvert,ConvertType,ConvertValue} = this.updateData[i]
 							//计算方式是否合法
 							if(IsConvert&&!this.checkConver(ConvertType,ConvertValue)){
-								return this.$message.warning(`第${i+1}个指标数据转换不合法,请检查数值`)
+								//提示语:第${i+1}个指标数据转换不合法,请检查数值
+								return this.$message.warning(this.$t('EtaChartAddPage.data_transformation_list_hint',{num:i+1}))
 							}
 							//如果类型为对数,检测数据是否包含负数
 							if(IsConvert&&ConvertType===3){
 								if(!this.checkEdbData(this.tableData[i].DataList)){
-									return this.$message.warning(`第${i+1}个指标数据含有负数或0,无法进行对数运算,请检查`)
+									//提示语:第${i+1}个指标数据含有负数或0,无法进行对数运算,请检查
+									return this.$message.warning(this.$t('EtaChartAddPage.data_transformation_list_hint2',{num:i+1}))
 								}
 							}
 						}

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

@@ -182,13 +182,15 @@ export default {
 			//计算方式是否合法
 			if(!this.checkConver(ConvertType,ConvertValue)){
 				this.updateData[index].IsConvert = false
-				return this.$message.warning("数据转换不合法,请检查数值")
+				//提示语:数据转换不合法,请检查数值
+				return this.$message.warning(this.$t('EtaChartAddPage.data_transformation_hint'))
 			}
 			//如果类型为对数,检测数据是否包含负数
 			if(ConvertType===3){
 				if(!this.checkEdbData(this.tableData[index].DataList||[])){
 					this.updateData[index].IsConvert = false
-					return this.$message.warning("指标数据含有负数或0,无法进行对数运算")
+					//提示语:指标数据含有负数或0,无法进行对数运算
+					return this.$message.warning(this.$t('EtaChartAddPage.data_transformation_hint2'))
 				}
 			}
 			//柱形图单独设置

+ 1 - 0
src/views/dataEntry_manage/mixins/chartPublic.js

@@ -2878,6 +2878,7 @@ export const chartSetMixin = {
         },
         //图表详情-设置图表上下限
         setLimitData(tableData=[]){
+            if([7,10,11].includes(this.chartInfo.ChartType)) return
             const {
                 //左右轴极值字段 
                 LeftMin=0,LeftMax=0,

+ 91 - 37
src/views/dataEntry_manage/onlineExcelCopy.vue

@@ -1,5 +1,6 @@
 <template>
-  <div class="excel-data-container" v-loading="saveLoading" element-loading-text="保存中,请稍后······" element-loading-spinner="el-icon-loading"
+  <div class="excel-data-container" v-loading="saveLoading" 
+    :element-loading-text="$t('Edb.save_ing')" element-loading-spinner="el-icon-loading"
     element-loading-background="rgba(0, 0, 0, 0.8)">
     <div class="online-excel">
       <div id="luckysheet"></div>
@@ -23,7 +24,7 @@
           </el-form-item>
           <el-form-item :label="$t('Edb.Detail.e_fre')" prop="frequency" :rules="[{required:true,message:'频度不能为空',trigger:'change'}]">
             <el-select v-model="dataForm.frequency" placeholder="请选择频度" style="width: 100%;" @change="changeFrequency">
-              <el-option :label="item" :value="item" v-for="item in frequencyList" :key="item"></el-option>
+              <el-option :label="item.label" :value="item.value" v-for="item in frequencyList" :key="item.value"></el-option>
             </el-select>
           </el-form-item>
         </el-form>
@@ -43,7 +44,8 @@
 <script>
 
 import { dataInterence } from "@/api/api.js";
-import EventBus from '@/api/bus.js'
+import EventBus from '@/api/bus.js';
+import {frequencySelectList} from '@/utils/defaultOptions';
 
 export default {
   name:'onlineExcelCopy',
@@ -67,7 +69,7 @@ export default {
               "r":0,
               "c":0,
               "v":{
-                ct: {fa: "General", t: "g"},
+                ct: {fa: "@", t: "s"},
                 m:"一级分类",
                 v:"一级分类",
                 bg:'#b4a7d6'
@@ -77,7 +79,7 @@ export default {
               "r":1,
               "c":0,
               "v":{
-                ct: {fa: "General", t: "g"},
+                ct: {fa: "@", t: "s"},
                 m:"指标分类",
                 v:"指标分类",
                 bg:'#b4a7d6'
@@ -87,7 +89,7 @@ export default {
               "r":2,
               "c":0,
               "v":{
-                ct: {fa: "General", t: "g"},
+                ct: {fa: "@", t: "s"},
                 m:"频度",
                 v:"频度",
                 bg:'#b4a7d6'
@@ -97,7 +99,7 @@ export default {
               "r":3,
               "c":0,
               "v":{
-                ct: {fa: "General", t: "g"},
+                ct: {fa: "@", t: "s"},
                 m:"指标名称",
                 v:"指标名称",
                 bg:'#b4a7d6'
@@ -107,7 +109,7 @@ export default {
               "r":4,
               "c":0,
               "v":{
-                ct: {fa: "General", t: "g"},
+                ct: {fa: "@", t: "s"},
                 m:"单位",
                 v:"单位",
                 bg:'#b4a7d6'
@@ -134,12 +136,7 @@ export default {
         }
       ],
       hook:{},
-      showsheetbar:false,
-      // cellRightClickConfig:{
-      //   insertColumn:false,
-      //   deleteRow:false,
-      //   deleteColumn:false
-      // }
+      showsheetbar:false
     }
 
     return {
@@ -152,7 +149,7 @@ export default {
       copyDataForm:{},
       firstClassName:'',
       secondClassName:'',
-      frequencyList: ['日度','周度','旬度','月度','季度','半年度','年度'],
+      //frequencyList: ['日度','周度','旬度','月度','季度','半年度','年度'],
       classifyArray:[],
       unitList:[],
       secondClassifyArray:[],
@@ -170,6 +167,11 @@ export default {
       `
     }
   },
+  computed:{
+    frequencyList(){
+        return frequencySelectList()
+    }
+  },
 created() {
     this.dataForm.firstClassify = parseInt(this.$route.query.parentClassifyId) || ''
     this.dataForm.secondClassify = parseInt(this.$route.query.ClassifyId) || ''
@@ -223,7 +225,6 @@ created() {
         })
         if(res.Ret == 200){
           dataList = res.Data.List || []
-          // if(res.Data.FrequencyList) this.dataForm.frequency = res.Data.FrequencyList[0]
         }
       }
 
@@ -231,7 +232,6 @@ created() {
       // 处理复制粘贴造成的漏洞 - 记录数据
       this.options.hook.cellAllRenderBefore=(data,sheet)=>{
         if(this.haveSaveProtected) return 
-        // console.log("全部刷新");
         if(!this.protectedData.length>0){
           for (let i = 0; i < 5; i++) {
             if([0,1,2].includes(i)){
@@ -252,16 +252,19 @@ created() {
         this.haveSaveProtected=true
       }
       this.options.hook.cellUpdateBefore=(r,c)=>{
+        let edbNameEle = luckysheet.getSheetData()[3][c]
         // 禁止更新的单元格 已经有的指标名称和单位不允许更新
-        if(([0,1,2].includes(r) && c==0) || ([3,4].includes(r) && c<=dataList.length)){
+        if(([0,1,2].includes(r) && c==0) 
+          || ([3,4].includes(r) && edbNameEle && this.protectedData[3].some(data => data.v == edbNameEle.v))){
           return false
         }
       }
 
       this.options.hook.cellMousedownBefore=(e,position)=>{
-        // console.log(e,position);
+        let edbNameEle = luckysheet.getSheetData()[3][position.c]
         // 禁止鼠标选中的单元格
-        if([0,1,2].includes(position.r) || ([3,4].includes(position.r) && position.c<=dataList.length)){
+        if([0,1,2].includes(position.r) 
+          || ([3,4].includes(position.r) && edbNameEle && this.protectedData[3].some(data => data.v == edbNameEle.v))){
           return false
         }
       }
@@ -285,23 +288,23 @@ created() {
         
         // 是否更改了受保护的数据
         let haveUpdatedProtectedData=false
-        if([3,4].includes(position.r) && position.c>=0 && position.c<=dataList.length){
+        if([3,4].includes(position.r)){
           if(!cell) return 
-          Object.keys(this.protectedData[position.r][position.c]).forEach(key => {
-            // console.log(_.isEqual(cell[key], this.protectedData[position.r][position.c][key]),'lodash');
-            if(!_.isEqual(cell[key], this.protectedData[position.r][position.c][key])){
+          let index = this.protectedData[3].findIndex((pd,ind) => pd && ind==position.c)
+          if(index ==-1) return 
+          Object.keys(this.protectedData[position.r][index]).forEach(key => {
+            if(!_.isEqual(cell[key], this.protectedData[position.r][index][key])){
               haveUpdatedProtectedData=true
-              cell[key] = this.protectedData[position.r][position.c][key]
+              cell[key] = this.protectedData[position.r][index][key]
             }
           }); 
         }else if([0,1,2].includes(position.r)){
           let cindex = position.c>1?1:position.c
-          // console.log(position.c,position.r,cell);
           if(!cell){
             if(cindex<1){
               return 
             }
-            luckysheet.getSheet().data[position.r][position.c] = this.protectedData[position.r][cindex]
+            sheet.data[position.r][position.c] = this.protectedData[position.r][1]
           }else{
             Object.keys(this.protectedData[position.r][cindex]).forEach(key => {
               if(!_.isEqual(cell[key], this.protectedData[position.r][cindex][key])){
@@ -309,7 +312,7 @@ created() {
                 cell[key] = this.protectedData[position.r][cindex][key]
               }
             });
-            if([0,1,2].includes(position.r) && position.c>0){
+            if(position.c>0){
               if(position.r==0){
                 if(cell.m !==this.firstClassName || cell.v !== this.firstClassName){
                   haveUpdatedProtectedData=true
@@ -328,13 +331,67 @@ created() {
               }
             }
           }
-          // console.log(cindex,position.r,'cindex,position.r',this.protectedData[position.r][cindex]);
         }
         if(haveUpdatedProtectedData){
           // 还原数据后的手动刷新
           this.refreshManual()
         }
       }
+
+      this.options.hook.updated=(operation)=>{
+        // 维护 protectedData数据
+        if(operation.type == 'delRC'){
+          // 删除列
+          if(operation.ctrlValue.rc == 'c'){
+            // console.log('删除列',`第${operation.ctrlValue.index+1}列开始`,`删除了${operation.ctrlValue.len}列`);
+            if(!operation.data){
+              // 没有data为撤销 恢复他
+              for (let i = operation.ctrlValue.index; i < operation.ctrlValue.index+operation.ctrlValue.len; i++) {
+                // 在celldata初始数据里面找,有找到说明不是新加的
+                let isFind = luckysheet.getSheet().celldata.some(cd => {
+                  return cd.r==3 && cd.c < operation.ctrlValue.index+operation.ctrlValue.len+1 &&
+                         cd.v && cd.v.v == operation.curdata[3][i].v
+                })
+                this.protectedData[3].splice(i,0,isFind?operation.curdata[3][i]:false)
+                this.protectedData[4].splice(i,0,isFind?operation.curdata[4][i]:false)
+              }
+            }else{
+              for (let i = operation.ctrlValue.index; i < operation.ctrlValue.index+operation.ctrlValue.len; i++) {
+                if(operation.ctrlValue.index > this.protectedData[3].length){
+                  break;
+                }
+                this.protectedData[3].splice(operation.ctrlValue.index,1)
+                this.protectedData[4].splice(operation.ctrlValue.index,1)
+              }
+            }
+          }
+        }else if(operation.type == 'addRC' && operation.ctrlValue.rc == 'c'){
+          // 增加列
+          let addIndex = operation.ctrlValue.index
+          if(operation.ctrlValue.direction=='lefttop'){
+            // 向左加
+            addIndex--
+          }
+          // 比原本的protectedData数组长度大,就不会对protectedData造成形象 就return
+          if(!(addIndex < this.protectedData[3].length)) return 
+          // console.log('增加列',`第${addIndex+1}列开始向右`,`增加了${operation.ctrlValue.len}列,${operation.data?"正向操作":"撤销"}`);
+
+          if(!operation.data){
+            // 没有data为撤销 删除它
+            for (let i = addIndex; i < addIndex+operation.ctrlValue.len; i++) {
+              this.protectedData[3].splice(addIndex+1,1)
+              this.protectedData[4].splice(addIndex+1,1)
+            }
+          }else{
+            for (let i = addIndex; i < addIndex+operation.ctrlValue.len; i++) {
+              // 新加的列,只占个位置,保持索引相对,不需要保护,置为false
+              this.protectedData[3].splice(i+1,0,false)
+              this.protectedData[4].splice(i+1,0,false)
+            }
+          }
+        }
+      }
+
       // 拿出所有数组
       let arr = dataList.map((item => item.DataList)).flat()
       // 拿出所有数组的日期并展平排序
@@ -366,7 +423,7 @@ created() {
             "r":3,
             "c":1+index,
             "v":{
-              ct: {fa: "General", t: "g"},
+              ct: {fa: "@", t: "s"},
               m:item.SecName,
               v:item.SecName,
               bg:'#cccccc'
@@ -376,7 +433,7 @@ created() {
             "r":4,
             "c":1+index,
             "v":{
-              ct: {fa: "General", t: "g"},
+              ct: {fa: "@", t: "s"},
               m:item.Unit,
               v:item.Unit,
               bg:'#cccccc'
@@ -384,13 +441,12 @@ created() {
         })
       })
       for (let i = 0; i < col; i++) {
-        // let item =dataList[0]
         this.options.data[0].celldata.push(
         {
           "r":0,
           "c":1+i,
           "v":{
-            ct: {fa: "General", t: "g"},
+            ct: {fa: "@", t: "s"},
             m:this.firstClassName || '',
             v:this.firstClassName || '',
             bg:'#cccccc'
@@ -400,7 +456,7 @@ created() {
           "r":1,
           "c":1+i,
           "v":{
-            ct: {fa: "General", t: "g"},
+            ct: {fa: "@", t: "s"},
             m:this.secondClassName || '',
             v:this.secondClassName || '',
             bg:'#cccccc'
@@ -410,7 +466,7 @@ created() {
           "r":2,
           "c":1+i,
           "v":{
-            ct: {fa: "General", t: "g"},
+            ct: {fa: "@", t: "s"},
             m:this.dataForm.frequency || '',
             v:this.dataForm.frequency || '',
             bg:'#cccccc'
@@ -474,8 +530,6 @@ created() {
           "value1": this.unitList.join(','),
           "value2": "",
           "prohibitInput": false,
-          // "hintShow": false,
-          // "hintText": ""
         }
       }
       this.$nextTick(()=>{

+ 10 - 7
src/views/dataEntry_manage/thirdBase/BAIINFOTargetbase.vue

@@ -182,7 +182,7 @@
             v-for="item in frequencyList"
             :key="item.key"
             @click="changeFrequency(item.key)"
-            >{{ item.key || "全部" }}</el-button
+            >{{ getFrequencyTrans(item.key)||'全部' }}</el-button
           >
         </div>
       </template>
@@ -238,16 +238,16 @@
               >
                 <el-option
                   v-for="item in frequencyArr"
-                  :key="item"
-                  :label="item"
-                  :value="item"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
                 >
                 </el-option>
               </el-select>
             </el-form-item>
             <el-form-item :label="$t('Edb.Detail.e_unit')" prop="unit">
               <el-select
-                placeholder="请选择单位"
+                :placeholder="$t('Edb.InputHolderAll.select_unit')"
                 style="width: 80%"
                 v-model="classifyForm.unit"
               >
@@ -301,7 +301,7 @@ import lzTable from "@/components/lzTable.vue";
 import { baiinfoInterface } from "@/api/api.js";
 import mDialog from "@/components/mDialog.vue";
 import leftMixin from "./mixins/leftMixin.js";
-import { unitArr } from "@/utils/defaultOptions";
+import { unitArr,frequencySelectList } from "@/utils/defaultOptions";
 export default {
   name: "",
   components: { lzTable, mDialog },
@@ -351,7 +351,7 @@ export default {
           { required: true, message: /* "分类名称不能为空"  */this.$t('Edb.InputHolderAll.input_common',{label: this.$t('SteelChemicalPage.label_classify_name')}), trigger: "blur" },
         ],
       }, //可编辑信息校验
-      frequencyArr: ["日度", "周度", "旬度", "月度", "季度", "年度"],
+      //frequencyArr: ["日度", "周度", "旬度", "月度", "季度", "年度"],
       unitArr,
     };
   },
@@ -1193,6 +1193,9 @@ export default {
       }
       return this.escapeStr(urlStr);
     },
+    frequencyArr(){
+        return frequencySelectList()
+    }
   },
   created() {},
   mounted() {

+ 1 - 1
src/views/dataEntry_manage/thirdBase/SCITargetbase.vue

@@ -177,7 +177,7 @@
             v-for="item in frequencyList"
             :key="item.key"
             @click="changeFrequency(item.key)"
-            >{{ item.key }}</el-button
+            >{{ getFrequencyTrans(item.key) }}</el-button
           >
         </div>
       </template>

+ 40 - 6
src/views/dataEntry_manage/thirdBase/YyzxData.vue

@@ -62,6 +62,9 @@
           :expand-on-click-node="false"
           check-strictly
           highlight-current
+          :default-expanded-keys="defaultShowNodes"
+          @node-expand="handleNodeExpand"
+          @node-collapse="handleNodeCollapse"
           empty-text="暂无分类"
           @current-change="nodeChangeHandle"
         >
@@ -160,6 +163,7 @@ export default {
       leftSearchVal: "", //左侧搜索值
       leftSearchTradeCode: "", //如果是搜索选择的 则有此code
       isShowSingleData: false, //右侧是否展示的是单个指标数据
+      defaultShowNodes: [], //展开的节点
     };
   },
   methods: {
@@ -253,8 +257,6 @@ export default {
         this.rightShow = true;
         if (res.Ret !== 200) return;
         const DataList = res.Data.Data || [];
-        // 设置为没有更多数据
-        this.haveMore = false;
         // 合并数据
         this.tableOption = [
           {
@@ -262,6 +264,7 @@ export default {
             ...res.Data,
           },
         ];
+        this.orientationNode(res.Data ? res.Data.ClassifyId:-1)
         // 这里是单个指标所以不用合并日期
         const arr = DataList.map((item) => item.DataTime);
         this.dateArr = [...new Set(arr)].sort().reverse();
@@ -278,16 +281,47 @@ export default {
             this.dateArr.push("");
             if (this.dateArr.length >= 12) break;
           }
-        this.select_quota = res.Data.IndexName;
-        this.select_Unit = res.Data.Unit;
-        this.select_frequency = res.Data.Frequency;
-        this.select_ModifyTime = res.Data.ModifyTime || "";
         this.dataloading = false;
         this.rightShow && this.initWidth();
       } catch (err) {
         console.log(err);
       }
     },
+    // 左侧目录定位
+    orientationNode(Id){
+      this.select_classify = Id;
+      this.defaultShowNodes.push(Id)
+      this.$refs.treeRef.setCurrentKey(Id);
+      this.$nextTick(() => {
+        setTimeout(()=>{
+          let parent = document.getElementsByClassName('scroll-wrap')[0]
+          let node = parent.querySelector('.is-current')
+          parent.scrollTo({
+            top: node.offsetTop-200
+          })
+        },300)
+      })
+    },
+    // 树节点展开
+    handleNodeExpand(data) {
+      // 保存当前展开的节点
+      let flag = this.defaultShowNodes.some((item) => item === data.ClassifyId);
+
+      if (!flag) {
+        // 不存在则存到数组里
+        this.defaultShowNodes.push(data.ClassifyId);
+      }
+    },
+
+    // 树节点关闭
+    handleNodeCollapse(data) {
+      this.defaultShowNodes.some((item, index) => {
+        if (item === data.ClassifyId) {
+          // 删除关闭节点
+          this.defaultShowNodes.length = index;
+        }
+      });
+    },
     initWidth() {
       this.$nextTick(() => {
         $(".right-box")[0].style.width =

+ 14 - 1
src/views/dataEntry_manage/thirdBase/coalWord.vue

@@ -90,7 +90,7 @@
           v-for="item in frequencyList"
           :key="item"
           @click="changeFrequency(item)"
-          >{{ item }}</el-button
+          >{{ getFrequencyTrans(item) }}</el-button
         >
       </div>
     </div>
@@ -188,6 +188,19 @@ export default {
         });
       });
     },
+    // 频度翻译
+    getFrequencyTrans(frequency){
+        const map = {
+            '日度':this.$t('Edb.FreAll.day'),
+            '周度':this.$t('Edb.FreAll.week'),
+            '旬度':this.$t('Edb.FreAll.dekad'),
+            '月度':this.$t('Edb.FreAll.month'),
+            '季度':this.$t('Edb.FreAll.quarter'),
+            '半年度':this.$t('Edb.FreAll.half_year'),
+            '年度':this.$t('Edb.FreAll.year'),
+        }
+        return map[frequency]||''
+    },
     /* 获取数据 */
     getDataList() {
       this.dataloading = true;

+ 12 - 2
src/views/dataEntry_manage/thirdBase/lzTargetbase.vue

@@ -118,14 +118,14 @@ export default {
       select_classify: "",
       classifyList: [],
       select_frequency: "",
-      frequencyType: new Map([
+      /* frequencyType: new Map([
         [1, "日度"],
         [2, "周度"],
         [3, "月度"],
         [4, "季度"],
         [5, "年度"],
         [99, "无固定频率"],
-      ]),
+      ]), */
       frequencyList: [],
       tableOption: [],
       dateArr: [], //最长的日期数组
@@ -370,6 +370,16 @@ export default {
       urlStr += `&ModifyTime=${this.select_ModifyTime}`;
       return this.escapeStr(urlStr);
     },
+    frequencyType(){
+        return new Map([
+            [1, /* 日度 */ this.$t('Edb.FreAll.day')],
+            [2, /*周度*/ this.$t('Edb.FreAll.week')],
+            [3, /*月度*/ this.$t('Edb.FreAll.month')],
+            [4, /*季度*/ this.$t('Edb.FreAll.quarter')],
+            [5, /*年度*/ this.$t('Edb.FreAll.year')],
+            [99, /*无固定频率*/ this.$t('Edb.FreAll.unfixed')],
+        ])
+    },
   },
   created() {},
   mounted() {

+ 15 - 0
src/views/dataEntry_manage/thirdBase/mixins/leftMixin.js

@@ -273,5 +273,20 @@ export default {
 
       return canDrop;
     },
+
+    // 频度翻译
+    getFrequencyTrans(frequency){
+        const map = {
+            '':this.$t('Edb.FreAll.total'),//全部
+            '日度':this.$t('Edb.FreAll.day'),
+            '周度':this.$t('Edb.FreAll.week'),
+            '旬度':this.$t('Edb.FreAll.dekad'),
+            '月度':this.$t('Edb.FreAll.month'),
+            '季度':this.$t('Edb.FreAll.quarter'),
+            '半年度':this.$t('Edb.FreAll.half_year'),
+            '年度':this.$t('Edb.FreAll.year'),
+        }
+        return map[frequency]||''
+    },
   },
 };

+ 7 - 4
src/views/dataEntry_manage/thirdBase/ysTargetBase.vue

@@ -12,7 +12,7 @@
         }"></el-cascader>
         <el-select v-model="frequencyChecks" class="search-item" :placeholder="$t('Edb.InputHolderAll.input_fre')" 
         multiple collapse-tags clearable @change="searchListDelay">
-          <el-option :label="item" :value="item" v-for="item in frequencyList" :key="item" ></el-option>  
+          <el-option :label="item.label" :value="item.value" v-for="item in frequencyList" :key="item.value" ></el-option>  
         </el-select>
         <el-select v-model="dataStateChecks" class="search-item" :placeholder="$t('YsDataPage.ph_data_status')" 
         multiple collapse-tags clearable @change="searchListDelay">
@@ -189,7 +189,7 @@
 import mPage from '@/components/mPage.vue'
 import { dataBaseInterface,dataInterence,smmDataInterface} from '@/api/api.js'
 import { frequencyArr} from '../databaseComponents/util';
-
+import {frequencySelectList} from '@/utils/defaultOptions';
   export default {
     name:'ysTargetBase',
     components:{mPage},
@@ -216,7 +216,7 @@ import { frequencyArr} from '../databaseComponents/util';
         // 标志列表当前是全选状态还是不是全选状态和 isCheckAll不一样
         checkAllStatus:false,
         classifyList:[],
-        frequencyList: ["日度", "周度", "月度", "季度", "半年", "年度"],
+        //frequencyList: ["日度", "周度", "月度", "季度", "半年", "年度"],
         edbFrequencyList:frequencyArr,
         dataStatusList:[
           {value:'normal',label:this.$t('YsDataPage.col_status_normal')},
@@ -274,7 +274,10 @@ import { frequencyArr} from '../databaseComponents/util';
           ["EdbName", /* "指标名称" */this.$t('Edb.Detail.e_name')],
           ["EdbCode", /* "指标ID" */this.$t('Edb.Detail.e_id')],
         ])
-      }
+      },
+      frequencyList(){
+        return frequencySelectList()
+      },
     },
     watch:{
       // edbCheckList(value){

+ 1 - 1
src/views/datasheet_manage/common/customTable.js

@@ -185,7 +185,7 @@ export function getRightClickMenu(pos,canEdit=false) {
     ],
     'row': [
       { label: bus.$i18nt ? bus.$i18nt.t('ETable.MenuSelect.row_above') : "向上插入行", key: "insert-row-up" },
-      { label: bus.$i18nt ? bus.$i18nt.t('ETable.MenuSelect.saturday') : "向下插入行", key: "insert-row-down" },
+      { label: bus.$i18nt ? bus.$i18nt.t('ETable.MenuSelect.row_below') : "向下插入行", key: "insert-row-down" },
       { label: bus.$i18nt ? bus.$i18nt.t('ETable.Btn.delete_btn') : "删除", key: "del" },
     ],
     'cell': canEdit 

+ 15 - 1
src/views/datasheet_manage/components/insertDateDia.vue

@@ -28,7 +28,7 @@
                 width="240px"
               />
               
-              <span v-show="selectEdbInfo.Frequency" style="margin: 0 10px">{{$t('ETableChildren.frequency_lable')}}: {{ selectEdbInfo.Frequency }}</span>
+              <span v-show="selectEdbInfo.Frequency" style="margin: 0 10px">{{$t('ETableChildren.frequency_lable')}}: {{ getFrequencyTrans(selectEdbInfo.Frequency) }}</span>
               <span v-show="selectEdbInfo.LatestDate">{{$t('OnlineExcelPage.lastest_date_lab')}}: {{ selectEdbInfo.LatestDate }}</span>
             </li>
             <li class="form-item" style="padding-left:10px">
@@ -178,6 +178,20 @@ export default {
       this.$emit('insert',backData)
       this.cancelHandle()
     },
+    // 频度翻译
+    getFrequencyTrans(frequency){
+        const map = {
+            '':this.$t('Edb.FreAll.total'),//全部
+            '日度':this.$t('Edb.FreAll.day'),
+            '周度':this.$t('Edb.FreAll.week'),
+            '旬度':this.$t('Edb.FreAll.dekad'),
+            '月度':this.$t('Edb.FreAll.month'),
+            '季度':this.$t('Edb.FreAll.quarter'),
+            '半年度':this.$t('Edb.FreAll.half_year'),
+            '年度':this.$t('Edb.FreAll.year'),
+        }
+        return map[frequency]||''
+    },
 
     init() {
 

+ 3 - 3
src/views/operation_manage/AIQA/AIQA.vue

@@ -71,7 +71,7 @@
                     :disabled="startUploadAudio">
                         <img src="~@/assets/img/icons/ai-upload.png" />
                     </el-upload>
-                    <span>支持格式:PDF、PPTX、DOCX;大小不超过50MB</span>
+                    <span>{{ $t('ToolBox.AIQuestion.support_formats') }}:PDF、PPTX、DOCX;{{ $t('ToolBox.AIQuestion.max_file_text') }}</span>
                 </div>
                 <textarea rows="6" v-model="inputText" :placeholder="$t('ToolBox.AIQuestion.input_placeholder')" @keydown.enter="handleSendMsg"></textarea>
                 <div class="send-btn" @click="handleSendMsg"><img src="~@/assets/img/ai_m/send.png" />{{$t('ToolBox.AIQuestion.send_btn')}}</div>
@@ -229,7 +229,7 @@ export default {
         handleAddNewWindow(){
             //禁止重复新建
             if(this.activeWindowId===0){
-                this.$message.warning("您已建立对话窗口,请输入提问")
+                this.$message.warning(this.$t('ToolBox.AIQuestion.add_new_window_hint'))
                 return
             }
             //将相关值置空
@@ -337,7 +337,7 @@ export default {
             //     return
             // }
             if(this.inputText.length===0){
-                this.$message.warning('请输入提问')
+                this.$message.warning(this.$t('ToolBox.AIQuestion.inter_check'))
                 return
             }
             this.answerLoading=true

+ 4 - 3
src/views/positionAnalysis_manage/components/chartBox.vue

@@ -50,11 +50,12 @@
             <div>{{ showDetailData.DealChange }}</div>
           </div>
           <div class="item">
-            <div>占比</div>
+            <div>{{$t('ToolBox.PositionAnalysis.proportion')}}</div>
             <div>{{ (showDetailData.Rate * 100).toFixed(2) }}%</div>
           </div>
           <div class="item">
-            <div>前{{ showDetailData.Rank }}名持净多单</div>
+            <!-- <div>前{{ showDetailData.Rank }}名持净多单</div> -->
+            <div>{{$t('ToolBox.PositionAnalysis.top_held_long_position',{num:showDetailData.Rank})}}</div>
             <div>{{ showDetailData.BeforeAllValue }}</div>
           </div>
           <div class="item">
@@ -62,7 +63,7 @@
             <div>{{ showDetailData.BeforeAllChange }}</div>
           </div>
           <div class="item">
-            <div>占比</div>
+            <div>{{$t('ToolBox.PositionAnalysis.proportion')}}</div>
             <div>{{ (showDetailData.BeforeAllRate * 100).toFixed(2) }}%</div>
           </div>
         </div>

+ 12 - 9
src/views/positionAnalysis_manage/detail.vue

@@ -174,15 +174,18 @@ export default {
     .position-analysis-detail-page{
         .list{
             .tabs-wrap{
-                .el-tabs__nav{
-                    display: flex;
-                    width: 100%;
-                }
-                .el-tabs__item{
-                    text-align: center;
-                    flex: 1;
-                    padding:0;
-                }
+              .el-tabs__nav-wrap::after{
+                display: none
+              }
+                // .el-tabs__nav{
+                //     display: flex;
+                //     width: 100%;
+                // }
+                // .el-tabs__item{
+                    // text-align: center;
+                    // flex: 1;
+                    // padding:0;
+                // }
                 .el-tabs__header{
                     margin-bottom: 0;
                 }

+ 42 - 8
src/views/ppt_manage/mixins/pptMixins.js

@@ -70,7 +70,10 @@ export default {
 
       //截面散点设置英文props
 			enChartInfo: {},
-			enEdblist:[]
+			enEdblist:[],
+
+
+        chartSVGDataMap:{}
     }
   },
   methods: {
@@ -592,7 +595,8 @@ export default {
           this.initChart(
 				    `chart_${index}_${item.position}`,
 				    this.optionMap[item.chartId],
-				    page
+				    page,
+                    item.chartId
 			    )
         }else{
           //显示图表已被删除
@@ -604,7 +608,7 @@ export default {
 			
       });
     },
-    initChart(refName, options, page) {
+    initChart(refName, options, page,chartId="") {
       console.log("refName", refName);
       const index = this.pageList.findIndex((i) => i.id === page.id)
       if(index===-1) return
@@ -626,7 +630,7 @@ export default {
      
     /* 主题样式*/
     const chartTheme =  ChartThemeStyle ? JSON.parse(ChartThemeStyle) : null;
-
+    console.log('chartTheme',chartTheme)
       //console.log(options)
       this.$nextTick(() => {
         let is_linear = options.series 
@@ -727,22 +731,52 @@ export default {
 
         if(!$(`#${refName}`)[0]) return
 
-        console.log(SpecialOption)
-
+        let chart = null
         if(is_linear)
-          Highcharts.chart({
+          chart = Highcharts.chart({
             // Highcharts 配置
             ...options,
             ...SpecialOption,
             ...secialBarOpt
             });
         else
-        Highcharts.stockChart({
+        chart = Highcharts.stockChart({
           // Highcharts 配置
           ...options,
           ...SpecialOption,
           ...secialBarOpt
         });
+        
+        
+        if(isPublish&&chartId){
+            const {clientWidth,clientHeight} = $(`#${refName}`)[0]
+            const {plotBackgroundColor} = chartTheme&&chartTheme.drawOption||{}
+            const svgData = chart.getSVG({
+                    chart:{
+                        width:clientWidth,
+                        height:clientHeight,
+                        backgroundColor:null,
+                        plotBorderColor:null,
+                        plotBackgroundColor:null,
+                        plotBackgroundImage:null,
+                        plotBorderWidth:null,
+                        plotShadow:false,
+                        animation: false,
+                    }
+                })
+            let  parser = new DOMParser();
+            let svgDoc = parser.parseFromString(svgData, 'image/svg+xml');
+
+            // 查找class为'background'的rect元素并修改fill属性
+            let rectElement = svgDoc.querySelector('rect.highcharts-plot-background');
+            if (rectElement) {
+                rectElement.setAttribute('fill', plotBackgroundColor);
+            }
+            // 将修改后的SVG文档转换回字符串
+            let serializer = new XMLSerializer();
+            let updatedSvgCode = serializer.serializeToString(svgDoc);
+            this.chartSVGDataMap[`${refName}_${chartId}`] = updatedSvgCode
+        }
       });
     },
     initImages(elements,page){

+ 89 - 7
src/views/ppt_manage/newVersion/pptCatalog.vue

@@ -210,7 +210,7 @@
             @end="moveListPPT"
             :disabled="(treeName==='private'&&!selectNode)||treeName!=='private'"
             >
-            <div class="list-item" 
+            <!-- <div class="list-item" 
               v-for="item in catalogPPTList" :key="item.PptId"
               @click="changeModel('ppt',item)"
               >
@@ -228,6 +228,27 @@
                 <span>{{item.Title}}</span>
               </div>
               <span style="font-size:14px;">{{$t('Slides.creation_time')}}:{{$moment(item.PptCreateTime).format('YYYY-MM-DD')}}</span>
+            </div> -->
+            <div class="list-item" 
+                v-for="item in catalogPPTList" :key="item.PptId"
+                @click="changeModel('ppt',item)">
+                <div class="item-image" 
+                    :style="{'background-image':`url(${require('@/assets/img/ppt_m/list_bg.png')})`}">
+                        <span>{{item.Title}}</span>
+                </div>
+                <div class="item-opt">
+                    <span v-for="optItem in setListTool()" :key="optItem.key" @click.stop="handleListToolClick(optItem,item)">
+                        {{ getListMenuOptText(optItem.label) }}
+                    </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"
+                    />
+                </div>
             </div>
           </draggable>
           <div class="empty" v-if="catalogPPTList.length===0">
@@ -438,7 +459,15 @@ export default {
     } */
   },
   methods: {
-    // 
+    //ppt列表操作栏
+    getListMenuOptText(e){
+        if(e==='预览发布') return this.$t('Slides.list_ppt_item_publish')
+        if(e==='演示') return this.$t('Slides.list_ppt_item_preview')
+        if(e==='下载') return this.$t('Slides.list_ppt_item_download')
+        if(e==='编辑') return this.$t('Slides.list_ppt_item_edit')
+
+    },
+    //ppt详情操作栏
     getContentMenuOptText(e){
       if(e==='查看报告') return this.$t('Slides.view_report_btn')
       if(e==='编辑') return this.$t('Slides.edit_lable_name')
@@ -565,6 +594,34 @@ export default {
         })
       }
     },
+    //设置列表的操作按钮
+    setListTool(){
+      let list = []
+      const {checkPermissionBtn,pptPermission} = this.permissionBtn
+      const authMap = {
+          'publish':checkPermissionBtn(pptPermission.ppt_publish),
+          'present':checkPermissionBtn(pptPermission.ppt_show),
+          'download':checkPermissionBtn(pptPermission.ppt_download),
+          'edit':checkPermissionBtn(pptPermission.ppt_save),
+      }
+      //私有目录显示编辑,其他不显示
+      list = toolList.filter((i)=>{
+          return ['publish','present','download','edit'].includes(i.key)
+        })
+      if(this.treeName!=='private'){
+        list = list.filter(_ => _.key !== 'edit')
+      }
+      const sortMap = {
+        'present':0,
+        'edit':1,
+        'publish':2,
+        'download':3
+      }
+      list.sort((a,b)=>{
+        return sortMap[a.key] - sortMap[b.key]
+      })
+      return list
+    },
     //设置操作按钮
     setToolList(pptDetail={}){
       //公共目录:显示除 删除, 编辑 外的全部按钮
@@ -755,6 +812,22 @@ export default {
         })
       })
     },
+    //点击列表操作栏事件处理
+    handleListToolClick(item,{PptId,PptxUrl,Title}){
+        const urlMap = {
+        edit:`/ppteditor?id=${PptId}`,
+        publish:`/pptpublish?id=${PptId}`,
+        present:`/pptpresent?id=${PptId}`
+      }
+      if(urlMap[item.key]){
+        window.open(urlMap[item.key],'_blank')
+        return 
+      }
+      const handleCommand = {
+        'download':this.downloadPpt,
+      }
+      handleCommand[item.key]({PptxUrl,Title})
+    },
     //点击操作栏事件处理
     async handleToolClick(item){
       const urlMap = {
@@ -778,14 +851,15 @@ export default {
             window.open(urlMap[item.key],'_blank');
           }else if(item.key==='publish'){
             //this.$message.warning('该PPT页数超过60页或图表数量超过100张,无法发布,请修改后重试')
-            if(!this.pptItem.overLimitHint.chartNum){
+            /* if(!this.pptItem.overLimitHint.chartNum){
               this.$message.warning(this.$t('Slides.exceed_ppt_msg') )
               return
             }
             if(!this.pptItem.overLimitHint.pageNum){
               this.$message.warning(this.$t('Slides.exceed_sixty_ppt_msg') )
               return
-            }
+            } */
+            window.open(urlMap[item.key],'_blank');
           }     
         }else{
           if(item.key==='publish'){
@@ -1503,7 +1577,7 @@ export default {
           flex-wrap: wrap;
         }
         .list-item{
-          width: 30%;
+          width: 23%;
           background-color: white;
           border: 1px solid #ECECEC;
           border-radius: 4px;
@@ -1512,7 +1586,7 @@ export default {
           margin: 0 20px 20px 0;
           padding:10px;
           box-sizing: border-box;
-          .item-title{
+          .item-title,.item-foot{
             width:100%;
             height:20px;
             display: flex;
@@ -1549,9 +1623,17 @@ export default {
               transform: translate(-50%,-50%);
               font-size: 24px;
               color: #FFFFFF;
-              font-weight: bold;
+              /* font-weight: bold; */
             }
           }
+          .item-opt{
+            display:flex;
+            justify-content:space-between;
+            color:#0052D9;
+            cursor:pointer;
+            margin:10px 0;
+            font-size:16px;
+          }
         }
         .empty{
           position: absolute;

+ 85 - 4
src/views/ppt_manage/newVersion/pptEnCatalog.vue

@@ -205,7 +205,7 @@
             @end="moveListPPT"
             :disabled="treeName!=='private'"
             >
-            <div class="list-item" 
+            <!-- <div class="list-item" 
               v-for="item in catalogPPTList" :key="item.PptId"
               @click="changeModel('ppt',item)"
               >
@@ -223,6 +223,27 @@
                 <span>{{item.Title}}</span>
               </div>
               <span style="font-size:14px;">{{$t('Slides.creation_time')}}:{{$moment(item.PptCreateTime).format('YYYY-MM-DD')}}</span>
+            </div> -->
+            <div class="list-item" 
+                v-for="item in catalogPPTList" :key="item.PptId"
+                @click="changeModel('ppt',item)">
+                <div class="item-image" 
+                :style="{'background-image':`url(${require('@/assets/img/ppt_m/list_bg.png')})`}">
+                        <span>{{item.Title}}</span>
+                </div>
+                <div class="item-opt">
+                    <span v-for="optItem in setListTool()" :key="optItem.key" @click.stop="handleListToolClick(optItem,item)">
+                        {{ getListMenuOptText(optItem.label) }}
+                    </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"
+                    />
+                </div>
             </div>
           </draggable>
           <div class="empty" v-if="catalogPPTList.length===0">
@@ -424,6 +445,14 @@ export default {
     },
   },
   methods: {
+    //ppt列表操作栏
+    getListMenuOptText(e){
+        if(e==='预览发布') return this.$t('Slides.list_ppt_item_publish')
+        if(e==='演示') return this.$t('Slides.list_ppt_item_preview')
+        if(e==='下载') return this.$t('Slides.list_ppt_item_download')
+        if(e==='编辑') return this.$t('Slides.list_ppt_item_edit')
+
+    },
     getContentMenuOptText(e){
       if(e==='查看报告') return this.$t('Slides.view_report_btn')
       if(e==='编辑') return this.$t('Slides.edit_lable_name')
@@ -537,6 +566,34 @@ export default {
         })
       }
     },
+    //设置列表的操作按钮
+    setListTool(){
+      let list = []
+      const {checkPermissionBtn,pptPermission} = this.permissionBtn
+      const authMap = {
+          'publish':checkPermissionBtn(pptPermission.ppt_publish),
+          'present':checkPermissionBtn(pptPermission.ppt_show),
+          'download':checkPermissionBtn(pptPermission.ppt_download),
+          'edit':checkPermissionBtn(pptPermission.ppt_save),
+      }
+      //私有目录显示编辑,其他不显示
+      list = toolList.filter((i)=>{
+          return ['publish','present','download','edit'].includes(i.key)
+        })
+      if(this.treeName!=='private'){
+        list = list.filter(_ => _.key !== 'edit')
+      }
+      const sortMap = {
+        'present':0,
+        'edit':1,
+        'publish':2,
+        'download':3
+      }
+      list.sort((a,b)=>{
+        return sortMap[a.key] - sortMap[b.key]
+      })
+      return list
+    },
     //设置操作按钮
     setToolList(pptDetail={}){
       //公共目录:显示除 删除, 编辑 外的全部按钮
@@ -720,6 +777,22 @@ export default {
         })
       })
     },
+    //点击列表操作栏事件处理
+    handleListToolClick(item,{PptId,PptxUrl,Title}){
+        const urlMap = {
+        edit:`/ppteditor?id=${PptId}`,
+        publish:`/pptpublish?id=${PptId}`,
+        present:`/pptpresent?id=${PptId}`
+      }
+      if(urlMap[item.key]){
+        window.open(urlMap[item.key],'_blank')
+        return 
+      }
+      const handleCommand = {
+        'download':this.downloadPpt,
+      }
+      handleCommand[item.key]({PptxUrl,Title})
+    },
     //点击操作栏事件处理
     async handleToolClick(item){
       const urlMap = {
@@ -1393,7 +1466,7 @@ export default {
           flex-wrap: wrap;
         }
         .list-item{
-          width: 30%;
+          width: 23%;
           background-color: white;
           border: 1px solid #ECECEC;
           border-radius: 4px;
@@ -1402,7 +1475,7 @@ export default {
           margin: 0 20px 20px 0;
           padding:10px;
           box-sizing: border-box;
-          .item-title{
+          .item-title,.item-foot{
             width:100%;
             height:20px;
             display: flex;
@@ -1438,9 +1511,17 @@ export default {
               transform: translate(-50%,-50%);
               font-size: 24px;
               color: #FFFFFF;
-              font-weight: bold;
+              /* font-weight: bold; */
             }
           }
+          .item-opt{
+            display:flex;
+            justify-content:space-between;
+            color:#0052D9;
+            cursor:pointer;
+            margin:10px 0;
+            font-size:16px;
+          }
         }
         .empty{
           position: absolute;

+ 62 - 86
src/views/ppt_manage/newVersion/pptEnPublish.vue

@@ -1,11 +1,20 @@
 <template>
   <div class="publish-page-wrap page-wrap">
       <div class="pub-btn-list">
-        <!-- <div>图表转换方式:
-          <el-radio v-model="transChartType" :label="1">传服务器</el-radio>
-          <el-radio v-model="transChartType" :label="2">本地转</el-radio>
-        </div> -->
         <el-button  type="primary" plain style="width:182px;height:40px;" @click="$router.push({path:'/pptenlist'})">{{$t('Slides.return_to_list')}}</el-button>
+          <!-- 下载配置 -->
+          <!-- <div class="setting">
+            <div>
+                <span>是否压缩</span>
+                <el-radio v-model="setCompression" :label="true">是</el-radio>
+                <el-radio v-model="setCompression" :label="false">否</el-radio>
+            </div>
+            <div>
+                <span>图表转换优化</span>
+                <el-radio v-model="setCompression2" :label="true">开</el-radio>
+                <el-radio v-model="setCompression2" :label="false">关</el-radio>
+            </div>
+        </div> -->
         <el-button  type="primary" style="width:182px;height:40px;margin-left: 0;" @click="downloadPPT" :disabled="isPublish">{{$t('Slides.operations_download')}}</el-button>
         <el-dropdown split-button style="width:182px;height:40px;" type="primary" @click="transHandle" @command="handleCommand" :disabled="isPublish">
           {{layoutStr}}
@@ -51,7 +60,7 @@
 import Cover from './components/CoverEn.vue';
 import CustomCover from './components/CustomCover.vue';
 import TransReport from './components/catalog/transReport.vue';
-import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,getImgRealSize,calcScale,getShapeOptions,createRandomCode,getTableData,getChartInfo} from './utils/untils';
+import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,svgData2Base64,getImgRealSize,calcScale,getShapeOptions,createRandomCode,getTableData,getChartInfo} from './utils/untils';
 import {marginTop,modelConfig,pptSlideMaster,pptSlideMasterEn,pptCoverEn} from './utils/config';
 import pptmixin from '../mixins/pptMixins';
 import mixins from '../mixins/mixins';
@@ -105,6 +114,10 @@ export default {
       transReportShow:false,//转双周报的弹窗是否显示
       transChartType:2,//生成PPT时,转换动态图表的方式:1.将svg传至服务端转换;2.调用changeUrl转换
       currentLang:'en',//语言标识
+
+      setCompression:true,
+      setCompression2:true,
+      downloadLoading:null,
     };
   },
   watch:{
@@ -127,10 +140,11 @@ export default {
         text: this.$t('Slides.generating_powerPoint_msg'),
       });
       this.isPublish = true
-      if(this.loadingAll){
-        await this.pageToPptx()       
-      } 
-      this.isPublish = false
+      this.$nextTick(()=>{
+            setTimeout(async ()=>{
+                await this.pageToPptx() 
+            },50)
+        })
     },
     async downloadPPT(){
         this.loadingInstance = this.$loading({
@@ -139,8 +153,11 @@ export default {
             text: "生成ppt中...",
         });
         this.isPublish = true
-        await this.pageToPptx('dowload') 
-        this.isPublish = false
+        this.$nextTick(()=>{
+            setTimeout(async ()=>{
+                await this.pageToPptx('dowload') 
+            },50)
+        })
     },
     //计算ppt的版式名称
     getComponentName(modelId){
@@ -244,8 +261,21 @@ export default {
       const SlideMaster = _.cloneDeep(pptSlideMasterEn) 
       SlideMaster.objects[1] = {image: {x:0,y:0,w:10,h:7,path:this.pptBgImage}}
       let pptx = pptConfigInit(new pptxgen(),this.LayoutType,'en',SlideMaster,this.pptBgImage)
-      //添加一页空白页,后续转换需要
-      pptx.addSlide()
+      //添加封面
+      let cover = pptx.addSlide()
+      let coverId = this.loadingAll?'cover':'changecover'
+      //let coverImg = await this.htmlToCanvans(coverId)
+      let coverImg = $(`#${coverId} .cover img`)[0].src
+      cover.addImage({
+        path: coverImg,
+        x: 0,
+        y: 0,
+        w:'100%',
+        h: '100%',
+        size: { type: "contain" },
+      })
+      //自定义封面页的内容
+      cover = this.setPPTCover(cover,this.pptCoverContent,this.coverInfo.page.Title)
       const length = this.pageList.length;
       for (let i = 0; i < length; i++) {
         let slide = pptx.addSlide({ masterName: pptSlideMaster.title });
@@ -265,17 +295,10 @@ export default {
             console.log("img/chart...");
             let svgData = this.optionMap[this.pageList[i].elements[j].chartId] instanceof Object
             if(svgData){
-              if(this.transChartType===1){
-                //将svg传至服务端,返回一个线上图片地址
-                const params = new FormData();
-			          params.append('Img',svgData)
-                const { Data } = await dataBaseInterface.uploadImgSvg(params);
-                imgData = Data.ResourceUrl
-              }else if(this.transChartType===2){
                 //将svgDom转为base64 png,返回一个base64字符串
-                imgData = await this.changeUrl(`chart_${i}_${elements[j].position}`)
-                //imgData = svg2Base64($(`#chart_${i}_${elements[j].position} svg`)[0])//生成的svg背景色是黑色不是透明
-              }
+                imgData = this.setCompression2
+                         ?svgData2Base64(this.chartSVGDataMap[`chart_${i}_${elements[j].position}_${elements[j].chartId}`])
+                         :await this.changeUrl(`chart_${i}_${elements[j].position}`)
             }
           } else if (elements[j].type === 'text'){
             console.log('text...')
@@ -299,16 +322,6 @@ export default {
             elements[j].position
           );
           if (imgData) {
-            if(this.transChartType===1){
-              slide.addImage({
-                path:imgData,
-                x: x,
-                y: y,
-                w: width,
-                h: height,
-                size: { type: "contain" },
-              });
-            }else if(this.transChartType===2){
               slide.addImage({
                 data:imgData,
                 x: x,
@@ -317,7 +330,6 @@ export default {
                 h: height,
                 size: { type: "contain" },
               });
-            }
 
             //追加生成图表底部文字
             this.transChartBottomInfo(slide,{x,y,width,height},this.optionMap[this.pageList[i].elements[j].chartId])
@@ -400,62 +412,24 @@ export default {
             size: { type: "contain" },
         })
       }
-      //为了把封面放到第一页,操作pptx.slides达不成想要的效果,于是弄了个pptx2
-      //将封面放在最后生成是因为htmlToCanvans占用太多内存会导致页面假死
-      let pptx2 = pptConfigInit(new pptxgen(),this.LayoutType,'en',SlideMaster,this.pptBgImage)
-      //添加封面
-      let cover = pptx2.addSlide()
-      let coverId = this.loadingAll?'cover':'changecover'
-      //let coverImg = await this.htmlToCanvans(coverId)
-      let coverImg = $(`#${coverId} .cover img`)[0].src
-      cover.addImage({
-        path: coverImg,
-        x: 0,
-        y: 0,
-        w:'100%',
-        h: '100%',
-        size: { type: "contain" },
-      })
-      //生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
-      /* const coverInfo = [
-        //{text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
-        {text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
-        {text:`\n${this.pptCoverCompenyName||'ETA'}`,
-         options:{fontSize:16*0.75,breakLine:true}},
-        {text:`\n — ${this.coverInfo.page.ReportType} —`,options:{fontSize:16*0.75,breakLine:true}}, 
-        {text:`\n${this.pptCoverDepartName||'Research Department'}`,options:{fontSize:16*0.75,breakLine:true}},
-        {text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
-        //{text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
-      ]
-      cover.addText(coverInfo,{
-        x:'38%',
-        y:'50%',
-        w:'60%',
-        h:'28%',
-        color:(this.pptCoverTextColor||'#ffffff').slice(1),
-        align:'center',
-        fontFace:'SimHei'
-      }) */
-      //自定义封面页的内容
-      cover = this.setPPTCover(cover,this.pptCoverContent,this.coverInfo.page.Title)
-      //遍历pptx.slides,重新给每一项的部分属性赋值,再推入pptx2.slides中
-      //第一页不需要,因为是空白的
-      for(let i=1;i<pptx.slides.length;i++){
-        let item  = _.cloneDeep(pptx.slides[i])
-        item._name = `Slide ${i+1}`
-        item._slideNum = i+1
-        item._rId = cover._rId+i
-        item._slideId  = cover._slideId+i
-        pptx2._slides.push(item)
-      }
       this.loadingInstance.close();
+      this.isPublish = false
       //结束计时
       const end = Date.now()
       console.log("转换ppt用时:",Math.floor((end-start)/1000),' s')
       //pptx2.writeFile({ fileName: "test.pptx" });//本地测试用
       //直接下载
       if(type==='dowload'){
-        pptx2.writeFile({ fileName: `${this.coverInfo.page.Title||'unname'}.pptx` });
+        this.downloadLoading = this.$loading({
+            fullscreen:true,
+            text:'生成PPT完成,正在下载PPT...'
+        })
+        pptx2.writeFile({ 
+            fileName: `${this.coverInfo.page.Title||'unname'}.pptx`,
+            compression:this.setCompression
+        }).then(()=>{
+            this.downloadLoading.close()
+        })
         return
       }
       this.publishLoading = this.$loading({
@@ -486,15 +460,17 @@ export default {
           partSize: 1024 * 1024 * 10, // 10MB
         }
       };
-
-      pptx2.write('blob').then((data)=>{
+      //outputType为blob时不会启用压缩,为STREAM时会按nodebuffer压缩
+      pptx2.write({compression:this.setCompression,outputType:'STREAM'}).then((data)=>{
+        //将nodebuffer转为blob
+        const blob = new Blob([data])
         // 1走后端接口上传
         const uploadType=this.$setting.dynamicOutLinks.PptUpdateApi ||
                         this.$store.state.dynamicOutLinks.PptUpdateApi ||
                         JSON.parse(localStorage.getItem('dynamicOutLinks')).PptUpdateApi
         if(uploadType==1){
           let form = new FormData()
-          form.append("file",data)
+          form.append("file",blob)
           form.append("PptId",this.$route.query.id) 
           pptInterface.uploadPPTXFile(form).then(res=>{
             if(res.Ret===200){

+ 84 - 93
src/views/ppt_manage/newVersion/pptPublish.vue

@@ -1,12 +1,21 @@
 <template>
   <div class="publish-page-wrap page-wrap">
       <div class="pub-btn-list">
-        <!-- <el-button  type="primary" style="width:120px;height:40px;" @click="transHandle" :loading="isPublish">{{isPublish?'发布中':'发布'}}</el-button> -->
-        <!-- <div>图表转换方式:
-          <el-radio v-model="transChartType" :label="1">传服务器</el-radio>
-          <el-radio v-model="transChartType" :label="2">本地转</el-radio>
-        </div> -->
         <el-button  type="primary" plain style="width:182px;height:40px;" @click="$router.push({path:'/pptlist'})">{{$t('Slides.return_to_list')}}</el-button>
+
+        <!-- 下载配置 -->
+        <!-- <div class="setting">
+            <div>
+                <span>是否压缩</span>
+                <el-radio v-model="setCompression" :label="true">是</el-radio>
+                <el-radio v-model="setCompression" :label="false">否</el-radio>
+            </div>
+            <div>
+                <span>图表转换优化</span>
+                <el-radio v-model="setCompression2" :label="true">开</el-radio>
+                <el-radio v-model="setCompression2" :label="false">关</el-radio>
+            </div>
+        </div> -->
         <el-button  type="primary" style="width:182px;height:40px;margin-left: 0;" @click="downloadPPT" :disabled="isPublish">{{$t('Slides.operations_download')}}</el-button>
         <el-dropdown split-button style="width:182px;height:40px;" type="primary" @click="transHandle" @command="handleCommand" :disabled="isPublish">
           {{layoutStr}}
@@ -65,7 +74,7 @@ import Cover from './components/Cover.vue';
 import CustomCover from './components/CustomCover.vue';
 import TransReport from './components/catalog/transReport.vue';
 //import {pageList} from './utils/mock';
-import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,getImgRealSize,calcScale,countStrSize,getShapeOptions,createRandomCode,getTableData,getChartInfo,pptInit,rgbaToHex } from './utils/untils';
+import {countComponentName,pptConfigInit,toTextProps,toJson,svg2Base64,svgData2Base64,getImgRealSize,calcScale,countStrSize,getShapeOptions,createRandomCode,getTableData,getChartInfo,pptInit,rgbaToHex } from './utils/untils';
 import {marginTop,modelConfig,pptSlideMaster} from './utils/config';
 import pptmixin from '../mixins/pptMixins';
 import mixins from '../mixins/mixins';
@@ -117,7 +126,10 @@ export default {
       layoutStr:`10:7${this.$t('Slides.default_publish')}`,
       ReportId:0,//ppt对应的双周报id,如果没转过,则为0
       transReportShow:false,//转双周报的弹窗是否显示
-      transChartType:2,//生成PPT时,转换动态图表的方式:1.将svg传至服务端转换;2.调用changeUrl转换
+
+      setCompression:true,
+      setCompression2:true,
+      downloadLoading:null
     };
   },
   watch:{
@@ -149,20 +161,24 @@ export default {
         text: this.$t('Slides.generating_powerPoint_msg'),
       });
       this.isPublish = true
-      if(this.loadingAll){
-        await this.pageToPptx() 
-      }
-      this.isPublish = false
+      this.$nextTick(()=>{
+            setTimeout(async ()=>{
+                await this.pageToPptx() 
+            },50)
+        })
     },
     async downloadPPT(){
         this.loadingInstance = this.$loading({
             lock:true,
             fullscreen: true,
-            text: "生成ppt中...",
+            text: this.$t('Slides.generating_powerPoint_msg'),
         });
         this.isPublish = true
-        await this.pageToPptx('dowload') 
-        this.isPublish = false
+        this.$nextTick(()=>{
+            setTimeout(async ()=>{
+                await this.pageToPptx('dowload') 
+            },50)
+        })
     },
     //计算ppt的版式名称
     getComponentName(modelId){
@@ -270,8 +286,20 @@ export default {
       const SlideMaster = _.cloneDeep(pptSlideMaster) 
       SlideMaster.objects[1] = {image: {x:0,y:0,w:10,h:7,path:this.pptBgImage}}
       let pptx = pptConfigInit(new pptxgen(),this.LayoutType,'ch',SlideMaster,this.pptBgImage)
-      //添加一页空白页,后续转换需要
-      pptx.addSlide()
+      //添加封面
+      let cover = pptx.addSlide()
+      let coverId = this.loadingAll?'cover':'changecover'
+      let coverImg = $(`#${coverId} .cover img`)[0].src
+      cover.addImage({
+        path: coverImg,
+        x: 0,
+        y: 0,
+        w:'100%',
+        h: '100%',
+        size: { type: "contain" },
+      })
+      //自定义封面页的内容
+      cover = this.setPPTCover(cover,this.pptCoverContent,this.coverInfo.page.Title)
       const length = this.pageList.length;
       for (let i = 0; i < length; i++) {
         let slide = pptx.addSlide({ masterName: pptSlideMaster.title });
@@ -291,17 +319,15 @@ export default {
             console.log("img/chart...");
             let svgData = this.optionMap[this.pageList[i].elements[j].chartId] instanceof Object
             if(svgData){
-              if(this.transChartType===1){
-                //将svg传至服务端,返回一个线上图片地址
-                const params = new FormData();
-			          params.append('Img',svgData)
-                const { Data } = await dataBaseInterface.uploadImgSvg(params);
-                imgData = Data.ResourceUrl
-              }else if(this.transChartType===2){
                 //将svgDom转为base64 png,返回一个base64字符串
-                imgData = await this.changeUrl(`chart_${i}_${elements[j].position}`)
-                //imgData = svg2Base64($(`#chart_${i}_${elements[j].position} svg`)[0])//生成的svg背景色是黑色不是透明
-              }
+                //转换方式有两种,两者生成的图表无明显差别
+                /**
+                 * svgData2Base64:通过chart.getSVG获取,可能会与页面上的图表有所差别,但生成的svg更小,速度更快
+                 * changeUrl:通过html获取,页面上什么样,图表就什么样,为了保证清晰度将原图表放大4倍后通过canvas转为png,这个过程比较耗时,生成的文件也会比较大
+                 */
+                imgData = this.setCompression2
+                         ?svgData2Base64(this.chartSVGDataMap[`chart_${i}_${elements[j].position}_${elements[j].chartId}`])
+                         :await this.changeUrl(`chart_${i}_${elements[j].position}`)
             }
           } else if (elements[j].type === 'text'){
             console.log('text...')
@@ -325,16 +351,6 @@ export default {
             elements[j].position
           );
           if (imgData) { //图表
-            if(this.transChartType===1){
-              slide.addImage({
-                path:imgData,
-                x: x,
-                y: y,
-                w: width,
-                h: height,
-                size: { type: "contain" },
-              });
-            }else if(this.transChartType===2){
               slide.addImage({
                 data:imgData,
                 x: x,
@@ -343,7 +359,6 @@ export default {
                 h: height,
                 size: { type: "contain" },
               });
-            }
 
             //追加生成图表底部文字
             this.transChartBottomInfo(slide,{x,y,width,height},this.optionMap[this.pageList[i].elements[j].chartId])
@@ -365,10 +380,7 @@ export default {
             const offsetY = realSize.height===imgData2Obj.imgHeight?0:(percentHeight-(realSize.height/imgData2Obj.imgHeight*percentHeight))/2
             const realX = Number(x.substring(0,x.length-1))+offsetX
             const realY = Number(y.substring(0,y.length-1))+offsetY
-            /* const realWidth = offsetX===0?width:(realSize.width/imgData2Obj.imgWidth*percentWidth)
-            const realHeight = offsetY===0?height:(realSize.height/imgData2Obj.imgHeight*percentHeight) */
-            //console.log('position x',x,' y',y,' width',width,' height',height)
-            //console.log('x y',realX,realY,'w h',realWidth,realHeight)
+
             slide.addImage({
               path:imgData2+'?v='+new Date().getTime(),
               x:realX+'%',
@@ -430,61 +442,25 @@ export default {
             size: { type: "contain" },
         })
       }
-      
-      //为了把封面放到第一页,操作pptx.slides达不成想要的效果,于是弄了个pptx2
-      //将封面放在最后生成是因为htmlToCanvans占用太多内存会导致页面假死
-      let pptx2 = pptConfigInit(new pptxgen(),this.LayoutType,'ch',SlideMaster,this.pptBgImage)
-      //添加封面
-      let cover = pptx2.addSlide()
-      let coverId = this.loadingAll?'cover':'changecover'
-      let coverImg = $(`#${coverId} .cover img`)[0].src
-      cover.addImage({
-        path: coverImg,
-        x: 0,
-        y: 0,
-        w:'100%',
-        h: '100%',
-        size: { type: "contain" },
-      })
-      //生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
-      /* const coverInfo = [
-        {text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
-        {text:this.coverInfo.page.Title,options:{fontSize:28*0.75,breakLine:true}},
-        {text:`\n— ${this.pptCoverCompenyName||'ETA'} ● ${this.coverInfo.page.ReportType} —`,
-         options:{fontSize:16*0.75,breakLine:false}},
-        {text:`\n${this.pptCoverDepartName||'投研部'}`,options:{fontSize:16*0.75,breakLine:true}},
-        {text:this.coverInfo.page.PptDate,options:{fontSize:16*0.75,breakLine:true}},
-        {text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
-      ]
-      cover.addText(coverInfo,{
-        x:'38%',
-        y:'50%',
-        w:'60%',
-        h:'28%',
-        color:(this.pptCoverTextColor||'#ffffff').slice(1),
-        align:'center',
-        fontFace:'SimHei'
-      }) */
-      //自定义封面页的内容
-      cover = this.setPPTCover(cover,this.pptCoverContent,this.coverInfo.page.Title)
-      //遍历pptx.slides,重新给每一项的部分属性赋值,再推入pptx2.slides中
-      //第一页不需要,因为是空白的
-      for(let i=1;i<pptx.slides.length;i++){
-        let item  = _.cloneDeep(pptx.slides[i])
-        item._name = `Slide ${i+1}`
-        item._slideNum = i+1
-        item._rId = cover._rId+i
-        item._slideId  = cover._slideId+i
-        pptx2._slides.push(item)
-      }
+     
       this.loadingInstance.close();
+      this.isPublish = false
       //结束计时
       const end = Date.now()
       console.log("转换ppt用时:",Math.floor((end-start)/1000),' s')
-      //pptx2.writeFile({ fileName: "test.pptx" });//本地测试用
+      //pptx.writeFile({ fileName: "test.pptx" });//本地测试用
       //直接下载
       if(type==='dowload'){
-        pptx2.writeFile({ fileName: `${this.coverInfo.page.Title||'unname'}.pptx` });
+        this.downloadLoading = this.$loading({
+            fullscreen:true,
+            text:'生成PPT完成,正在下载PPT...'
+        })
+        pptx.writeFile({ 
+            fileName: `${this.coverInfo.page.Title||'unname'}.pptx`,
+            compression:this.setCompression 
+        }).then(()=>{
+            this.downloadLoading.close()
+        })
         return
       }
       this.publishLoading = this.$loading({
@@ -515,14 +491,18 @@ export default {
 
       //console.log('pptx',pptx)
       //根据配置选择是走后端接口上传还是直接前端上传到oss
-      pptx2.write('blob').then((data)=>{
+
+      //outputType为blob时不会启用压缩,为STREAM时会按nodebuffer压缩
+      pptx.write({compression:this.setCompression,outputType:'STREAM'}).then((data)=>{
+        //将nodebuffer转为blob
+        const blob = new Blob([data])
         // 1走后端接口上传
         const uploadType=this.$setting.dynamicOutLinks.PptUpdateApi ||
                         this.$store.state.dynamicOutLinks.PptUpdateApi ||
                         JSON.parse(localStorage.getItem('dynamicOutLinks')).PptUpdateApi
         if(uploadType==1){
           let form = new FormData()
-          form.append("file",data)
+          form.append("file",blob)
           form.append("PptId",this.$route.query.id) 
           pptInterface.uploadPPTXFile(form).then(res=>{
             if(res.Ret===200){
@@ -539,7 +519,7 @@ export default {
                         this.$store.state.dynamicOutLinks.ObjectStorageClient ||
                         JSON.parse(localStorage.getItem('dynamicOutLinks')).ObjectStorageClient
         // 上传到 对象存储器
-        uploadFileDirect(clientType,data,temName,options).then(url=>{
+        uploadFileDirect(clientType,blob,temName,options).then(url=>{
           console.log('文件地址',url);
           this.publishPPT(url)
         }).catch(err=>{
@@ -835,5 +815,16 @@ $titleColor:#333333;
     width:1100px;
     height: 770px;
   }
+  .el-dropdown{
+    .el-button-group{
+        display: flex;
+        width: 100%;
+        .el-button{
+            &:first-of-type{
+                flex:1;
+            }
+        }
+    }
+  }
 }
 </style>

+ 4 - 1
src/views/ppt_manage/newVersion/utils/untils.js

@@ -461,6 +461,9 @@ const encode = (input) => {
   }
   return output
 }
+export const svgData2Base64 = (svg)=>{
+    return PREFIX + encode(svg)
+}
 export const svg2Base64 = (element) => {
   const XMLS = new XMLSerializer()
   const svg = XMLS.serializeToString(element)
@@ -624,7 +627,7 @@ export const getTableData = (data)=>{
       let cellOptions = {
         colspan:cell.mc.cs===0?1:cell.mc.cs,
         rowspan:cell.mc.rs===0?1:cell.mc.rs,
-        color: cell.fc?cell.fc.substring(1):'333',
+        color: cell.fc?cell.fc.substring(1):'333333',
         fill: cell.bg ? cell.bg.substring(1):'',
         bold: cell.bl ? true : false,
         italic: cell.it ? true : false,

+ 8 - 5
src/views/predictEdb_manage/components/operationDialog.vue

@@ -206,9 +206,9 @@
 							>
 								<el-option
 									v-for="item in frequencyArr"
-									:key="item"
-									:label="item"
-									:value="item"
+									:key="item.value"
+									:label="item.label"
+									:value="item.value"
 								>
 								</el-option>
 							</el-select>
@@ -281,7 +281,7 @@
 <script>
 import * as preDictEdbInterface from '@/api/modules/predictEdbApi.js';
 import { formRules } from '@/views/dataEntry_manage/databaseComponents/util';
-import { unitArr } from '@/utils/defaultOptions';
+import { unitArr,frequencySelectList } from '@/utils/defaultOptions';
 export default {
 	name:'',
 	props: {
@@ -373,6 +373,9 @@ export default {
 		unitArr() {
 			return unitArr
 		},
+		frequencyArr(){
+			return frequencySelectList()
+		}
 	},
 	data () {
 		return {
@@ -428,7 +431,7 @@ export default {
 				value_type: '期末值'
 			},
 			options: [],
-			frequencyArr: ['日度', '周度','旬度', '月度', '季度', '年度'],
+			//frequencyArr: ['日度', '周度','旬度', '月度', '季度', '年度'],
 			fre_options: ['天','周','月','季','年'],
 			moveTypeOpions: [
 				{

+ 43 - 20
src/views/report_manage/reportVarietyV2.vue

@@ -2,14 +2,27 @@
     <div class="report-variety-page">
         <div class="top-wrap">
             <div class="type-box">
-                <div :class="['item',typeVal==1?'active':'']" @click="handleTypeChange(1)" v-permission="permissionBtn.reportVariety.zhVarietyHas">中文品种</div>
-                <div :class="['item',typeVal==2?'active':'']" @click="handleTypeChange(2)" v-permission="permissionBtn.reportVariety.enVarietyHas">英文品种</div>
+                <div 
+                    :class="['item',typeVal==1?'active':'']" 
+                    @click="handleTypeChange(1)" 
+                    v-permission="permissionBtn.reportVariety.zhVarietyHas">
+                    {{$t('ReportManage.CommodityConfiguration.chinese_tabs')}}
+                </div>
+                <div 
+                    :class="['item',typeVal==2?'active':'']" 
+                    @click="handleTypeChange(2)" 
+                    v-permission="permissionBtn.reportVariety.enVarietyHas">
+                    {{$t('ReportManage.CommodityConfiguration.english_tabs')}}
+                </div>
             </div>
         </div>
         <div class="main-wrap">
             <div class="left-wrap">
                 <div class="add-btn-box">
-                    <el-button type="primary" @click="handleAddVariety" v-if="isShowAddBtn">添加品种</el-button>
+                    <!-- 添加品种 -->
+                    <el-button type="primary" @click="handleAddVariety" v-if="isShowAddBtn">
+                        {{$t('ReportManage.CommodityConfiguration.add_variety')}}
+                    </el-button>
                 </div>
                 <div class="first-variety-wrap">
                     <draggable
@@ -67,11 +80,11 @@
                     </div>
                     <template v-if="typeVal==1&&permissionBtn.isShowBtn('reportVariety','zhPublicSet')">
                     <div class="tag-box open" v-if="item.IsPublic==1" @click="handleQuickSet(item,'ispublic')">
-                        <span class="tag">公有</span>
+                        <span class="tag">{{$t('ReportManage.CommodityConfiguration.variety_public')}}</span>
                         <img class="icon" src="~@/assets/img/icons/changeLang01.png" alt="">
                     </div>
                     <div class="tag-box close" v-else @click="handleQuickSet(item,'ispublic')">
-                        <span class="tag">私有</span>
+                        <span class="tag">{{$t('ReportManage.CommodityConfiguration.variety_private')}}</span>
                         <img class="icon" src="~@/assets/img/icons/edit_icon01.png" alt="">
                     </div>
                     </template>
@@ -88,7 +101,7 @@
         <!-- 品种编辑弹窗 -->
         <el-dialog 
             :modal-append-to-body='false' 
-            :title="!editBreedData.id?'添加品种':'品种设置'" 
+            :title="!editBreedData.id?$t('ReportManage.CommodityConfiguration.add_variety'):$t('ReportManage.CommodityConfiguration.edit_variety')" 
             :visible.sync="showEditBreed" 
             :close-on-click-modal="false"
             :center="true" 
@@ -97,7 +110,8 @@
         >
             <div class="edit-variety-wrap" style="padding-bottom:30px">
                 <el-form>
-                    <el-form-item label="上级品种" v-if="editBreedData.parentId">
+                    <!-- 上级品种 -->
+                    <el-form-item :label="$t('ReportManage.CommodityConfiguration.parent_variety')" v-if="editBreedData.parentId">
                         <el-select v-model="editBreedData.parentId" style="width:400px">
                             <el-option 
                                 v-for="item in tableData" 
@@ -107,10 +121,14 @@
                             />
                         </el-select>
                     </el-form-item>
-                    <el-form-item label="品种名称">
-                        <el-input placeholder="请输入品种名称" v-model.trim="editBreedData.name" style="width:400px"></el-input>
+                    <!-- 品种名称 -->
+                    <el-form-item :label="$t('ReportManage.CommodityConfiguration.variety_name')">
+                        <el-input 
+                            :placeholder="$t('ReportManage.CommodityConfiguration.variety_name_hint')" 
+                            v-model.trim="editBreedData.name" style="width:400px"></el-input>
                     </el-form-item>
-                    <el-form-item label="启用状态" v-if="!editBreedData.id">
+                    <!-- 启动状态 -->
+                    <el-form-item :label="$t('ReportManage.CommodityConfiguration.active_status')" v-if="!editBreedData.id">
                         <el-switch
                             v-model="editBreedData.status"
                             active-color="#0052D9">
@@ -118,14 +136,14 @@
                     </el-form-item>
                     <!-- 中文品种特有的设置公有权限 -->
                     <div class="public-auth-box" v-if="typeVal==1&&checkOpts.length>0&&editBreedData.parentId==0&&permissionBtn.isShowBtn('reportVariety','zhPublicSet')">
-                        <el-tooltip effect="dark" content="默认为私有,勾选并保存设置为公有">
+                        <el-tooltip effect="dark" :content="$t('ReportManage.CommodityConfiguration.set_root_hint')">
                             <div style="display:inline-block">
-                                <span>公有权限设置</span>
+                                <span>{{ $t('ReportManage.CommodityConfiguration.set_root_text') }}</span>
                                 <i class="el-icon-info"></i>
                             </div>
                         </el-tooltip>
                         <div class="auth-list-box">
-                            <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">全选</el-checkbox>
+                            <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">{{ $t('Common.all_select') }}</el-checkbox>
                             <el-checkbox-group style="padding:20px" v-model="checkedList" @change="handleCheckedAuthChange">
                                 <el-checkbox style="display:block;margin-bottom:10px" v-for="item in checkOpts" :label="item.PermissionId" :key="item.PermissionId">{{item.PermissionName}}</el-checkbox>
                             </el-checkbox-group>   
@@ -133,8 +151,8 @@
                     </div>
                 </el-form>
                 <div style="text-align: center;margin-top:40px">
-                    <el-button type="primary" plain @click="showEditBreed=false">取消</el-button>
-                    <el-button type="primary" @click="handleConfirmEidtBreed">确定</el-button>
+                    <el-button type="primary" plain @click="showEditBreed=false">{{ $t('Dialog.cancel_btn') }}</el-button>
+                    <el-button type="primary" @click="handleConfirmEidtBreed">{{ $t('Dialog.confirm_btn') }}</el-button>
                 </div>
             </div>
         </el-dialog>
@@ -260,7 +278,7 @@ export default {
             }
             const res=this.typeVal==1?await reportVarietyInterence.editVariety(params):await reportVarietyENInterence.editVariety(params)
             if(res.Ret===200){
-                this.$message.success(`编辑成功`)
+                this.$message.success(this.$t('ReportManage.CommodityConfiguration.variety_edit_succ_msg'))
                 this.getList()
             }
         },
@@ -273,7 +291,7 @@ export default {
             }
             const res=this.typeVal==1?await reportVarietyInterence.setEnable(params):await reportVarietyENInterence.setEnable(params)
             if(res.Ret===200){
-                this.$message.success(`设置成功`)
+                this.$message.success(this.$t('ReportManage.CategoryList.setup_successful'))
                 this.getList()
             }
         },
@@ -368,7 +386,7 @@ export default {
             }
             const res=this.typeVal==1?await reportVarietyInterence.sortVariety(params):await reportVarietyENInterence.sortVariety(params)
             if(res.Ret===200){
-                this.$message.success('移动成功')
+                this.$message.success(this.$t('ReportManage.CategoryList.move_successful'))
             }
             this.getList()
         },
@@ -384,7 +402,7 @@ export default {
 
         async handleConfirmEidtBreed(){
             if(!this.editBreedData.name){
-                this.$message.warning('请填写品种名称')
+                this.$message.warning($t('ReportManage.CommodityConfiguration.variety_name_check_hint'))
                 return
             }
             let params={
@@ -409,7 +427,12 @@ export default {
                 res=this.editBreedData.id?await reportVarietyENInterence.editVariety(params):await reportVarietyENInterence.addVariety(params)
             }
             if(res.Ret===200){
-                this.$message.success(`${this.editBreedData.id?'编辑':"新增"}成功`)
+                //this.$message.success(`${this.editBreedData.id?'编辑':"新增"}成功`)
+                this.$message.success(
+                    this.editBreedData.id
+                    ?this.$t('ReportManage.CommodityConfiguration.variety_edit_succ_msg')
+                    :this.$t('ReportManage.CommodityConfiguration.variety_add_succ_msg')
+                )
                 this.getList()
                 this.showEditBreed=false
             }

+ 37 - 14
src/views/sandbox_manage/sandFlowNew/components/addLInkDia.vue

@@ -1,6 +1,6 @@
 <template>
     <el-dialog :modal-append-to-body='false' :title="$t('SandboxManage.SandFlow.add_link')" :visible.sync="show" 
-    :close-on-click-modal="false" width="872px" top="5vh">
+    :close-on-click-modal="false" width="872px" top="5vh" @close="cancelHandle">
       <div class="add-link-box">
         <div class="link-box-option">
           <el-select v-model="addLinkSearchParams.linkType" placeholder="链接类型" style="width: 240px;" @change="changeLinkType">
@@ -191,7 +191,7 @@ import * as sheetInterface from "@/api/modules/sheetApi.js";
 import mPage from "@/components/mPage.vue";
 import Chart from '../../../dataEntry_manage/components/chart.vue'
 import { dataBaseInterface,reportlist} from '@/api/api.js';
-
+import * as preDictEdbInterface from '@/api/modules/predictEdbApi.js';
   export default {
     components:{
       mPage,Chart
@@ -262,9 +262,15 @@ import { dataBaseInterface,reportlist} from '@/api/api.js';
       },
       show(value){
         if(value){
-          this.addLinkSearchParams.linkType=1
-          this.changeLinkType()
           this.checkedLinkList = JSON.parse(JSON.stringify(this.linkList))
+          let firstCheckedLink = this.checkedLinkList[0]
+          if(firstCheckedLink){
+            this.activeItemRId=''
+            this.linkClick(firstCheckedLink)
+          }else{
+            this.addLinkSearchParams.linkType=1
+          }
+          this.changeLinkType()
         }
       }
     },
@@ -305,6 +311,7 @@ import { dataBaseInterface,reportlist} from '@/api/api.js';
         reportTotal:0,
         editingLabel:'',
         activeItemRId:'',
+        activeItem:''
       }
     },
     methods: {
@@ -386,10 +393,12 @@ import { dataBaseInterface,reportlist} from '@/api/api.js';
         this.getDatabaseList();
       },
       getDatabaseList(){
-        dataBaseInterface.targetList({
+        // 0-普通指标 1-预测指标
+        let api = this.activeItem.databaseType==0?(dataBaseInterface.targetList):(preDictEdbInterface.edbDataInfo)
+        api({
           PageSize: 20,
           CurrentIndex: this.databasePageNo,
-          EdbInfoId: this.search_dataBaseId,
+          EdbInfoId: this.search_dataBaseId || this.activeItem.Id,
         }).then(res => {
           if(res.Ret === 200) {
             if(res.Data) {
@@ -435,34 +444,48 @@ import { dataBaseInterface,reportlist} from '@/api/api.js';
           this.$refs.labelEditInput[0].focus();
         });
       },
-      linkClick(item){
+      // 链接点击
+      /*
+        config.noInfo - 研报类型的不提示
+      */
+      linkClick(item,config={}){
         if(this.activeItemRId == item.RId) return
         this.activeItemRId = item.RId
+        this.activeItem = item
+        this.addLinkSearchParams.linkType=item.Type
         if(item.Type==3){
-          this.$message.info('研报类型的暂无回显')
-        }else if(item.Type==1){
-          this.addLinkSearchParams.linkType=item.Type
+          if(!config.noInfo){
+            this.$message.info('研报类型的暂无回显')
+          }
+        }else if(item.Type==1){          
           this.changeLinkType()
           this.initGetData() 
         }else if(item.Type==2){
-          this.addLinkSearchParams.linkType=item.Type
           this.changeLinkType()
           this.getChartDetail(item.Id)
         }
 
       },
       linkDelete(item,index){
-        if(this.activeItemRId == item.RId){
-          this.activeItemRId=""
+        let rId = item.RId
+        this.checkedLinkList.splice(index,1)
+        if(this.activeItemRId == rId){
+          let firstCheckedLink = this.checkedLinkList[0]
+          if(firstCheckedLink){
+            this.linkClick(firstCheckedLink,{noInfo:true})
+          }else{
+            this.activeItemRId = ""
+            this.addLinkSearchParams.linkType=1
+          }
           this.changeLinkType()
         }
+
         if(item.Type==3){
           let deleteId=this.selections.filter(it=> it.Id==item.Id)
           if(deleteId[0]){
             this.$refs.reportTable && this.$refs.reportTable.toggleRowSelection(deleteId[0],false)
           }
         }
-        this.checkedLinkList.splice(index,1)
       },
       editLinkNameFinish(item){
         if (this.editingLabel) {

+ 117 - 69
src/views/semantics_manage/asr/ASR.vue

@@ -3,32 +3,39 @@
     <div class="asr-main">
       <div class="asr-main-left">
         <div class="add-zone" >
+            <!-- 新建 -->
           <el-button @click="addAsr" type="primary" style="min-width: 100px;"
-          v-permission="permissionBtn.semanticPermission.ASR_addArticles">新建</el-button>
+          v-permission="permissionBtn.semanticPermission.ASR_addArticles">{{$t('SemanticsManage.ASRpage.create_new')}}</el-button>
         </div>
         <div class="catalogue-zone" v-loading="detailLoadig" element-loading-text="加载中······">
           <div class="search-box">
+            <!-- 请输入文件名称 -->
             <el-select v-model="search_txt" v-loadMore="searchLoad" :filterable="!search_txt" remote clearable
-              placeholder="请输入文件名称" class="select-com" :remote-method="searchHandle" @click.native="inputFocusHandle">
+              :placeholder="$t('SemanticsManage.ASRpage.search_placeholder')" 
+              class="select-com" :remote-method="searchHandle" @click.native="inputFocusHandle">
               <i slot="prefix" class="el-input__icon el-icon-search"></i>
               <el-option v-for="item in searchOptions" :key="item.SpeechRecognitionId" :label="item.FileName"
                 :value="item.SpeechRecognitionId">
               </el-option>
             </el-select>
+            <!-- 筛选 -->
             <el-popover placement="bottom-end" :offset="10" width="334" v-model="showFilterPopopver"
               trigger="click" @hide="resetFilterOption" @show="getTagsList">
                 <div class="filter-poopver">
                   <div class="filter-poopver-header">
-                    <span>筛选项</span>
-                    <span style="cursor: pointer;color: #0052D9;" @click="resetFilterOption('clear')">清空</span>
+                    <span>{{ $t('SemanticsManage.ASRpage.filter_options') }}</span>
+                    <span style="cursor: pointer;color: #0052D9;" @click="resetFilterOption('clear')">{{ $t('SemanticsManage.ASRpage.clear_btn') }}</span>
                   </div>
                   <el-form :model="filterForm" ref="filterForm" class="filter-poopver-form">
                     <el-form-item prop="createtimeRange">
-                      <el-date-picker v-model="filterForm.createtimeRange" start-placeholder="开始" end-placeholder="结束"
+                      <el-date-picker v-model="filterForm.createtimeRange" 
+                      :start-placeholder="$t('SemanticsManage.ASRpage.start_text')" 
+                      :end-placeholder="$t('SemanticsManage.ASRpage.end_text')"
                       type="daterange" style="width: 100%;" value-format="yyyy-MM-dd"></el-date-picker>
                     </el-form-item>
                     <el-form-item prop="author" >
-                      <el-cascader v-model="filterForm.author" placeholder="创建人" ref="authorsCascader" clearable 
+                      <el-cascader v-model="filterForm.author" ref="authorsCascader" clearable 
+                      :placeholder="$t('SemanticsManage.ASRpage.creator_text')" 
                       id="authors-cascader" style="width: 100%" :options="authorsList" collapse-tags :show-all-levels="false"
                       :props="{value:'ItemId',label:'ItemName',children:'Children',multiple:true,emitPath:false}"></el-cascader>
                       <!-- <el-select v-model="filterForm.author" placeholder="创建人" style="width: 100%;" multiple
@@ -38,7 +45,8 @@
                       </el-select> -->
                     </el-form-item>
                     <el-form-item prop="tags" v-if="leftShowLabel !== '标签'">
-                      <el-select v-model="filterForm.tags" placeholder="标签" style="width: 100%;" multiple
+                      <el-select v-model="filterForm.tags" style="width: 100%;" multiple
+                      :placeholder="$t('SemanticsManage.ASRpage.tag_text')" 
                       collapse-tags filterable>
                         <el-option :label="item.TagName" :value="item.TagId" 
                         v-for="item in tagsList" :key="item.TagId"></el-option>
@@ -46,20 +54,28 @@
                     </el-form-item>
                   </el-form>
                   <div class="filter-poopver-footer">
-                    <el-button type="primary" plain style="width: 140px;"  @click="showFilterPopopver=false">取消</el-button>
-                    <el-button type="primary" style="width: 140px;" @click="filterArticle">确认</el-button>
+                    <el-button type="primary" plain style="width: 140px;"  @click="showFilterPopopver=false">
+                        {{ $t('Dialog.cancel_btn') }}
+                    </el-button>
+                    <el-button type="primary" style="width: 140px;" @click="filterArticle">
+                        {{ $t('Dialog.confirm_btn') }}
+                    </el-button>
                   </div>
                 </div>
               <div class="filter-box" slot="reference">
                 <img src="~@/assets/img/filter.png" />
-                <span>筛选</span>
+                <span>{{ $t('SemanticsManage.ASRpage.filter_text') }}</span>
               </div>
             </el-popover>
           </div>
           <div class="catalogue-head">
             <ul class="left-tab">
-              <li :class="['tab', { 'act': leftShowLabel === tab }]" v-for="tab in ['目录', '标签']" :key="tab"
-                @click="tabChange(tab)">{{ tab }}</li>
+              <li :class="['tab', { 'act': leftShowLabel === tab.key }]" 
+                v-for="tab in [
+                    {key:'目录',label:$t('SemanticsManage.ASRpage.directory_text')},
+                    {key:'标签',label:$t('SemanticsManage.ASRpage.tag_text')}]" 
+                :key="tab.key"
+                @click="tabChange(tab.key)">{{ tab.label }}</li>
             </ul>
           </div>
           <div v-show="leftShowLabel=='目录'" class="tree-container">
@@ -67,7 +83,7 @@
               <el-tree ref="treeRef" class="target_tree" :data="treeData" node-key="UniqueCode" :props="defaultProp"
                 :allow-drag="canDragHandle" :allow-drop="canDropHandle" :current-node-key="select_node_key"
                 :default-expanded-keys="defaultShowNodes" draggable :expand-on-click-node="false" check-strictly
-                empty-text="暂无分类" lazy :load="getLazyTreeData" @node-expand="handleNodeExpand"
+                :empty-text="$t('Common.no_classify_msg')" lazy :load="getLazyTreeData" @node-expand="handleNodeExpand"
                 @node-collapse="handleNodeCollapse" @current-change="nodeChange" @node-drop="dropOverHandle"
                 @node-drag-end="dropMouseLeave" @node-drag-leave="dropMouseLeave" @node-drag-enter="dropMouseOver">
                 <span class="custom-tree-node" slot-scope="{ node, data }">
@@ -90,7 +106,8 @@
             <div class="bottom-operation" v-permission="permissionBtn.semanticPermission.ASR_classify_catalogue_add">
               <div class="bottom-add" @click="editCatalogue(1)">
                 <img src="~@/assets/img/add-quadrate-blue.png" />
-                <span>添加目录分类</span>
+                <!-- 添加目录分类 -->
+                <span>{{ $t('SemanticsManage.ASRpage.add_directory_category') }}</span>
               </div>
             </div>
           </div>
@@ -99,7 +116,7 @@
               <el-tree ref="tagTreeRef" class="target_tree" :data="tagTreeData" node-key="UniqueCode" :props="defaultProp"
                 :allow-drag="canDragHandle" :allow-drop="canDropHandle" :current-node-key="tag_select_node_key"
                 :default-expanded-keys="tagDefaultShowNodes" draggable :expand-on-click-node="false" check-strictly
-                empty-text="暂无分类" lazy :load="getLazyTreeTagData" @node-expand="handleNodeExpand"
+                :empty-text="$t('Common.no_classify_msg')" lazy :load="getLazyTreeTagData" @node-expand="handleNodeExpand"
                 @node-collapse="handleNodeCollapse" @current-change="nodeChange" @node-drop="dropOverHandle"
                 @node-drag-end="dropMouseLeave" @node-drag-leave="dropMouseLeave" @node-drag-enter="dropMouseOver">
                 <span class="custom-tree-node" slot-scope="{ node, data }">
@@ -127,11 +144,13 @@
               <div class="bottom-add" @click="editCatalogue(1)" style="margin-right: 20px;" 
               v-permission="permissionBtn.semanticPermission.ASR_classify_tag_add">
                 <img src="~@/assets/img/add-quadrate-blue.png" />
-                <span>添加标签分类</span>
+                <!-- 添加标签分类 -->
+                <span>{{ $t('SemanticsManage.ASRpage.add_tag_category') }}</span>
               </div>
               <div class="bottom-add" @click="editTag" v-permission="permissionBtn.semanticPermission.ASR_tagOperation_addTag">
                 <img src="~@/assets/img/add-quadrate-blue.png" />
-                <span>添加标签</span>
+                <!-- 添加标签 -->
+                <span>{{ $t('SemanticsManage.ASRpage.add_tag_text') }}</span>
               </div>
             </div>
           </div>
@@ -142,14 +161,17 @@
       v-if="articleDetail && articleDetail.SpeechRecognitionId">
         <div class="detail-top">
           <div class="detail-top-search">
-            <el-input v-model="articleDetail.FileName" placeholder="请输入文件名称" style="width: 240px;margin-right: 30px;"
+            <el-input v-model="articleDetail.FileName" 
+            :placeholder="$t('SemanticsManage.ASRpage.search_placeholder')" style="width: 240px;margin-right: 30px;"
             :disabled="!permissionBtn.isShowBtn('semanticPermission', 'ASR_renameArticles')"></el-input>
             <div class="tag-button" @click="makeTagsDiaOpen(null)" style="margin-right: 30px;cursor: pointer;"
             v-permission="permissionBtn.semanticPermission.ASR_tagMark_view">
               <img src="~@/assets/img/tag.png" />
-              <span style="color: #0052D9;">打标签</span>
+              <!-- 打标签-->
+              <span style="color: #0052D9;">{{ $t('SemanticsManage.ASRpage.tagging_text') }}</span>
             </div>
-            <el-input v-model="keyWord" placeholder="请输入关键词" prefix-icon="el-icon-search" clearable
+            <el-input v-model="keyWord" 
+            :placeholder="$t('SemanticsManage.ASRpage.please_enter_keywords')" prefix-icon="el-icon-search" clearable
             style="width: 360px;margin-right: 30px;" @input="searchKeyword">
               <template slot="append">
                 <div class="toggle-keywords-box" v-if="keyWord">
@@ -161,8 +183,9 @@
               </template>
             </el-input>
           </div>
+          <!-- 保存 -->
           <el-button type="primary" style="width: 120px;" @click="save" :loading="saveLoading" 
-          v-permission="permissionBtn.semanticPermission.ASR_saveArticles">保存</el-button>
+          v-permission="permissionBtn.semanticPermission.ASR_saveArticles">{{$t('Dialog.confirm_save_btn')}}</el-button>
         </div>
         <div class="detail-tag-area">
           <div class="tag-button" v-for="(item,index) in articleDetail.Tags" :key="item.TagId" >
@@ -189,21 +212,29 @@
             </div>
           </div>
           <div class="content-mutil-operation">
-            <el-checkbox label="全选" style="margin-right: 30px;" @change="checkAll"
+            <el-checkbox :label="$t('SemanticsManage.ASRpage.select_all_text')" 
+            style="margin-right: 30px;" @change="checkAll"
             v-model="isCheckAll" :indeterminate="isIndeterminate"></el-checkbox>
             <div class="content-row-operation active" @click="copyText(null)" v-show="checkList && checkList.length>0"
               v-permission="permissionBtn.semanticPermission.ASR_copyText">
               <img src="~@/assets/img/icons/copy-active.png" />
-              <span>复制</span>
+              <!-- 复制 -->
+              <span>{{ $t('SemanticsManage.ASRpage.copy_text') }}</span>
             </div>
             <div class="content-row-operation active" v-show="checkList && checkList.length>0"
               v-permission="permissionBtn.semanticPermission.ASR_toggleTimestampShow" 
               @click="toggleTimestampShow(null)">
               <img :src="hideTimestampAll?require('@/assets/img/icons/eyes-show-active.png'):require('@/assets/img/icons/eyes-hide-active.png')" />
-              <span>{{ hideTimestampAll?"展示时间戳":"隐藏时间戳" }}</span>
+              <span>
+                {{ 
+                    hideTimestampAll
+                    ?/*"展示时间戳"*/ $t('SemanticsManage.ASRpage.show_timestamps')
+                    :/*"隐藏时间戳" */ $t('SemanticsManage.ASRpage.hide_timestamps')
+                }}
+              </span>
             </div>
           </div>
-          <div class="content-title">原文</div>
+          <div class="content-title">{{ $t('SemanticsManage.ASRpage.original_text') }}</div>
           <div class="content-main" :style="{minHeight:articleDetail.ResourceUrl?'490px':'560px'}" ref="contentMain">
             <div class="content-row" v-for="(item,index) in articleDetail.Contents" :key="item.SpeechRecognitionContentId"
             @mouseover="item.IsHover=true" @mouseout="item.IsHover=false" :id="'paragraph_'+(index+1)">
@@ -215,7 +246,8 @@
                 <div class="content-row-operation" :class="{'active':item.IsHover}" @click="copyText(item)"
                 v-permission="permissionBtn.semanticPermission.ASR_copyText">
                   <img :src="item.IsHover?require('@/assets/img/icons/copy-active.png'):require('@/assets/img/icons/copy.png')" />
-                  <span>复制</span>
+                  <!--复制-->
+                  <span>{{ $t('SemanticsManage.ASRpage.copy_text') }}</span>
                 </div>
                 <div class="content-row-operation" :class="{'active':item.IsHover}" @click="toggleTimestampShow(item)"
                 v-permission="permissionBtn.semanticPermission.ASR_toggleTimestampShow" >
@@ -223,7 +255,13 @@
                   v-show="!item.IsHover"/>
                   <img :src="item.HideTimestamp?require('@/assets/img/icons/eyes-show-active.png'):require('@/assets/img/icons/eyes-hide-active.png')" 
                   v-show="item.IsHover"/>
-                  <span>{{ item.HideTimestamp?"展示时间戳":"隐藏时间戳" }}</span>
+                  <span>
+                    {{ 
+                        hideTimestampAll
+                        ?/*"展示时间戳"*/ $t('SemanticsManage.ASRpage.show_timestamps')
+                        :/*"隐藏时间戳" */ $t('SemanticsManage.ASRpage.hide_timestamps')
+                    }}
+                  </span>
                 </div>
               </div>
               <div class="content-row-content" >
@@ -245,7 +283,7 @@
       <div class="asr-main-right" v-else v-permission="permissionBtn.semanticPermission.ASR_view" 
       v-infinite-scroll="handleLoadMore" :infinite-scroll-immediate="true" :infinite-scroll-disabled="articleListRequest.finished">
         <template v-if="articleList && articleList.length>0">
-          <div class="file-count">{{ total }}个文件</div>
+          <div class="file-count">{{ $t('SemanticsManage.ASRpage.total_files',{num:total}) }}</div>
           <div class="file-container">
             <div class="file-item" v-for="item in articleList" :key="item.SpeechRecognitionId" @click="switchDetail(item)">
               <div class="file-main">
@@ -273,10 +311,18 @@
                   <el-dropdown @command="(e)=>handleCommandMore(e,item)">
                     <img src="~@/assets/img/more.png" />
                     <el-dropdown-menu slot="dropdown">
-                      <el-dropdown-item command="rename" v-permission="permissionBtn.semanticPermission.ASR_renameArticles">重命名</el-dropdown-item>
-                      <el-dropdown-item command="tag" v-permission="permissionBtn.semanticPermission.ASR_tagMark_view">打标签</el-dropdown-item>
-                      <el-dropdown-item command="export" v-permission="permissionBtn.semanticPermission.ASR_exportArticles">导出</el-dropdown-item>
-                      <el-dropdown-item command="del" v-permission="permissionBtn.semanticPermission.ASR_deleteArticles">删除</el-dropdown-item>
+                      <el-dropdown-item command="rename" v-permission="permissionBtn.semanticPermission.ASR_renameArticles">
+                        {{ $t('SemanticsManage.ASRpage.rename_text') }}
+                      </el-dropdown-item>
+                      <el-dropdown-item command="tag" v-permission="permissionBtn.semanticPermission.ASR_tagMark_view">
+                        {{ $t('SemanticsManage.ASRpage.tagging_text') }}
+                      </el-dropdown-item>
+                      <el-dropdown-item command="export" v-permission="permissionBtn.semanticPermission.ASR_exportArticles">
+                        {{ $t('SemanticsManage.ASRpage.export_text') }}
+                      </el-dropdown-item>
+                      <el-dropdown-item command="del" v-permission="permissionBtn.semanticPermission.ASR_deleteArticles">
+                        {{ $t('SemanticsManage.ASRpage.delete_text') }}
+                      </el-dropdown-item>
                     </el-dropdown-menu>
                   </el-dropdown>
                 </div>
@@ -285,7 +331,7 @@
           </div>
         </template>
         <div v-else class="nodata">
-          <tableNoData text="暂无记录"/>
+          <tableNoData :text="$t('SemanticsManage.ASRpage.no_directory_available')"/>
         </div>
       </div>
     </div>
@@ -638,42 +684,42 @@ export default {
         params={TagId:data.TagId}
         apiName='removeTagCheck'
         deleteLabelMap = {
-          0: '确定删除该标签吗?',
-          1: '标签关联转写文件,删除失败!'
+          0: /*'确定删除该标签吗?'*/this.$t('SemanticsManage.ASRpage.check_text3'),
+          1: /*'标签关联转写文件,删除失败!'*/ this.$t('SemanticsManage.ASRpage.failed_delete_text3')
         }
       }else{
         // 目录
         params={MenuId:data.MenuId}
         apiName=this.leftShowLabel=="目录"?'removeCatalogueCheck':'removeTagCatalogueCheck'
         deleteLabelMap = {
-						0: '确定删除当前分类吗?',
-						1: `该分类关联${this.leftShowLabel=='目录'?'转写文件':'标签'},删除失败!`,
-						2: '确定删除当前分类及包含的子分类吗?'
-					}
+            0: /*'确定删除当前分类吗?'*/ this.$t('SemanticsManage.ASRpage.check_text'),
+            /*`该分类关联${this.leftShowLabel=='目录'?'转写文件':'标签'},删除失败!`*/
+            1: this.leftShowLabel=='目录'?this.$t('SemanticsManage.ASRpage.failed_delete_text2'):this.$t('SemanticsManage.ASRpage.failed_delete_text'),
+            2: /*'确定删除当前分类及包含的子分类吗?'*/this.$t('SemanticsManage.ASRpage.check_text2'),
+        }
       }
       asrInterface[apiName](params).then(res => {
-				if(res.Ret === 200) {
-					if([1].includes(res.Data.CheckResult)) this.$confirm(
-            deleteLabelMap[res.Data.CheckResult],
-            '删除失败',
-            {
-            confirmButtonText: '知道了',
-            showCancelButton:false,
-            type: 'error'
-          })
-					else if([0,2].includes(res.Data.CheckResult)) this.$confirm(
-              deleteLabelMap[res.Data.CheckResult]
-							|| '确定删除吗?', 
-							'提示',
-							{
-							confirmButtonText: '确定',
-							cancelButtonText: '取消',
-							type: 'warning'
-						}).then(() => {
-							this.delHandle(data.MenuId,data.TagId);
-						}).catch(() => {})
-				}
-			})
+        if(res.Ret === 200) {
+            if([1].includes(res.Data.CheckResult)) this.$confirm(
+                deleteLabelMap[res.Data.CheckResult],
+                this.$t('SemanticsManage.ASRpage.failed_text'),
+                {
+                    confirmButtonText: this.$t('SemanticsManage.ASRpage.failed_btn'),
+                    showCancelButton:false,
+                    type: 'error'
+                }).then(() => {}).catch(() => {})
+            else if([0,2].includes(res.Data.CheckResult)) this.$confirm(
+                deleteLabelMap[res.Data.CheckResult], 
+                this.$t('SemanticsManage.ASRpage.prompt_text'),
+                {
+                    confirmButtonText: this.$t('Dialog.confirm_btn'),
+                    cancelButtonText: this.$t('Dialog.cancel_btn'),
+                    type: 'warning'
+                }).then(() => {
+                    this.delHandle(data.MenuId,data.TagId);
+                }).catch(() => {})
+        }
+      })
     },
     delHandle(mId,tid){
       let params={}
@@ -690,7 +736,7 @@ export default {
       asrInterface[apiName](params).then(res=>{
         if(res.Ret == 200){
           this.leftShowLabel=='目录'?this.getTreeData():this.getTagTreeData()
-          this.$message.success("删除成功")
+          this.$message.success(this.$t('SemanticsManage.ASRpage.deletion_successful'))
         }
       })
     },
@@ -1085,15 +1131,17 @@ export default {
       }
     },
     articleDel(row){
-      this.$confirm('确定删除选中的记录吗?', '提示',
+      this.$confirm(
+        /*确定删除选中的记录吗*/this.$t('SemanticsManage.ASRpage.delete_file_check'), 
+        /*'提示'*/this.$t('SemanticsManage.ASRpage.prompt_text'),
         {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
+        confirmButtonText: this.$t('Dialog.confirm_btn'),
+        cancelButtonText: this.$t('Dialog.cancel_btn'),
         type: 'warning'
       }).then(() => {
         asrInterface.speechRemove({SpeechRecognitionId:row.SpeechRecognitionId}).then(res=>{
           if(res.Ret == 200){
-            this.$message.success("删除成功")
+            this.$message.success(this.$t('SemanticsManage.ASRpage.deletion_successful'))
             this.page=1
             this.getArticleList()
             this.leftShowLabel=="目录" && this.getTreeData()
@@ -1259,14 +1307,14 @@ export default {
       if(window.ClipboardItem) {
         await navigator.clipboard.writeText(text).then(
         () => {
-            this.$message.success('复制成功!')
+            this.$message.success(this.$t('MsgPrompt.copy_success_msg'))
         },
         (err) => {
             console.error(err);
-            this.$message.warning('浏览器不支持')
+            this.$message.warning(this.$t('MsgPrompt.browser_not_support'))
         })
       }else {
-        this.$message.warning('当前协议暂不支持,仅支持https协议')
+        this.$message.warning(this.$t('MsgPrompt.http_not_support'))
       }	
     },
     toggleTimestampShow(item){

+ 49 - 21
src/views/semantics_manage/asr/components/catalogueDia.vue

@@ -3,28 +3,35 @@
 		:visible.sync="diaShow"
 		:close-on-click-modal="false"
 		:modal-append-to-body='false'
-    :title="diaTitle"
+		:title="diaTitle"
 		@close="closeHandle"
 		center
 		width="480px">
 			<div class="dialog-main">
 				<el-form
-				ref="diaForm"
-				label-position="top"
-				hide-required-asterisk
-				:model="formData">
-          <el-form-item :label="(index+1)==formData.level?'目录名称':getFormLabel(index,formData.level)" 
-          :rules="{required:true,message:'目录名称必填',trigger:'blur'}" :prop="formProps[index]" 
-          v-for="(item,index) in new Array(formData.level)" :key="index">
-            <el-input v-model="formData.first" style="width: 100%" placeholder="必填项" v-if="index==0" :disabled="formData.level!=1"></el-input>
-            <el-input v-model="formData.second" style="width: 100%" placeholder="必填项" v-else-if="index==1" :disabled="formData.level!=2"></el-input>
-            <el-input v-model="formData.third" style="width: 100%" placeholder="必填项" v-else></el-input>
-          </el-form-item>
+					ref="diaForm"
+					label-position="top"
+					hide-required-asterisk
+					:model="formData">
+					<el-form-item 
+					:label="(index+1)==formData.level
+						?$t('SemanticsManage.ASRpage.directory_name')
+						:getFormLabel(index,formData.level)" 
+					:rules="{required:true,message:$t('SemanticsManage.ASRpage.directory_name_required'),trigger:'blur'}" :prop="formProps[index]" 
+					v-for="(item,index) in new Array(formData.level)" :key="index">
+						<el-input v-model="formData.first" style="width: 100%" :placeholder="$t('SemanticsManage.ASRpage.required_field')" v-if="index==0" :disabled="formData.level!=1"></el-input>
+						<el-input v-model="formData.second" style="width: 100%" :placeholder="$t('SemanticsManage.ASRpage.required_field')" v-else-if="index==1" :disabled="formData.level!=2"></el-input>
+						<el-input v-model="formData.third" style="width: 100%" :placeholder="$t('SemanticsManage.ASRpage.required_field')" v-else></el-input>
+					</el-form-item>
 				</el-form>
-        <div class="dia-bot">
-          <el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">取消</el-button>
-          <el-button type="primary" @click="saveHandle" style="min-width:120px;">保存</el-button>
-        </div>
+				<div class="dia-bot">
+					<el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">
+						{{ $t('Dialog.cancel_btn') }}
+					</el-button>
+					<el-button type="primary" @click="saveHandle" style="min-width:120px;">
+						{{ $t('Dialog.confirm_save_btn') }}
+					</el-button>
+				</div>
 			</div>
 		</el-dialog>
 </template>
@@ -50,7 +57,17 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
     watch:{
       diaShow(value){
         if(value){
-          this.diaTitle = this.formData.code?"编辑":"添加"
+          const titleAddMap = {
+            '目录':this.$t('SemanticsManage.ASRpage.add_directory_text'),//添加目录
+            '标签':this.$t('SemanticsManage.ASRpage.add_tag_category'),//添加标签分类
+          }
+          const titleEditMap = {
+            '目录':this.$t('SemanticsManage.ASRpage.edit_directory_text'),//编辑目录
+            '标签':this.$t('SemanticsManage.ASRpage.edit_tag_category'),//编辑标签分类
+          }
+          this.diaTitle = this.formData.code
+            ?titleEditMap[this.formData.type]
+            :titleAddMap[this.formData.type]
           this.$refs.diaForm && this.$nextTick(()=>{
             this.$refs.diaForm.clearValidate()
           })
@@ -86,7 +103,11 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
                 MenuName:this.formData[keyI]
               }).then(res=>{
                 if(res.Ret == 200){
-                  this.$message.success(this.diaTitle+"成功")
+                  this.$message.success(
+                    this.formData.type == "目录"
+                    ?this.$t('SemanticsManage.ASRpage.edition_directory_successful')
+                    :this.$t('SemanticsManage.ASRpage.editition_tag_successful')
+                  )
                   this.$emit("catalogueSuccess",{type:'edit',code:''})
                   this.$emit("update:diaShow",false)
                 }
@@ -105,7 +126,11 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
                 MenuName:this.formData[keyI]
               }).then(res=>{
                 if(res.Ret == 200){
-                  this.$message.success(this.diaTitle+"成功")
+                    this.$message.success(
+                    this.formData.type == "目录"
+                    ?this.$t('SemanticsManage.ASRpage.addition_directory_successful')
+                    :this.$t('SemanticsManage.ASRpage.addition_tag_successful')
+                  )
                   this.$emit("catalogueSuccess",{type:'add',code:this.formData.code})
                   this.$emit("update:diaShow",false)
                 }
@@ -116,9 +141,12 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
       },
       getFormLabel(index,level){
         if(level==2){
-          return "上级目录"
+          return /* 上级目录 */ this.$t('SemanticsManage.ASRpage.parent_directory')
         }
-        let levelLabel=['一级目录','二级目录']
+        let levelLabel=[
+            /*一级目录*/ this.$t('SemanticsManage.ASRpage.first_directory'),
+            /*二级目录*/ this.$t('SemanticsManage.ASRpage.second_directory'),
+        ]
         return levelLabel[index]
       },
       closeHandle(){

+ 33 - 21
src/views/semantics_manage/asr/components/editTag.vue

@@ -3,30 +3,40 @@
 		:visible.sync="diaShow"
 		:close-on-click-modal="false"
 		:modal-append-to-body='false'
-    :title="diaTitle"
+		:title="diaTitle"
 		@close="closeHandle"
 		center
 		width="480px">
 			<div class="dialog-main">
 				<el-form
-				ref="diaForm"
-				label-position="top"
-				hide-required-asterisk
-				:model="formData">
-          <el-form-item label="标签名称" :rules="{required:true,message:'标签名称必填',trigger:'blur'}" prop="tName">
-            <el-input v-model="formData.tName" style="width: 100%" placeholder="请输入标签名称"></el-input>
-          </el-form-item>
-          <el-form-item label="所属目录" :rules="{required:true,message:'所属目录必填',trigger:'change'}" prop="mId"
-          v-if="!formData.tId">
-            <el-cascader v-model="formData.mId" ref="editTagCascader" placeholder="请选择标签目录" clearable id="edit-tag-cascader"
-              :options="tagCatalogue" :props="{value:'MenuId',label:'MenuName',children:'Children',checkStrictly:true,emitPath:false}"
-              style="width: 100%;" :clearable="false" ></el-cascader>
-          </el-form-item>
+					ref="diaForm"
+					label-position="top"
+					hide-required-asterisk
+					:model="formData">
+					<!-- 标签名称 -->
+					<el-form-item :label="$t('SemanticsManage.ASRpage.tag_name')" 
+						:rules="{required:true,message:$t('SemanticsManage.ASRpage.tag_name_required'),trigger:'blur'}" prop="tName">
+						<el-input v-model="formData.tName" style="width: 100%" 
+						:placeholder="$t('SemanticsManage.ASRpage.tag_name_placeholder')"></el-input>
+					</el-form-item>
+					<!-- 所属目录 -->
+					<el-form-item :label="$t('SemanticsManage.ASRpage.belonging_directory')" 
+					:rules="{required:true,message:$t('SemanticsManage.ASRpage.belonging_directory_required'),trigger:'change'}" prop="mId"
+						v-if="!formData.tId">
+						<el-cascader v-model="formData.mId" ref="editTagCascader" 
+							:placeholder="$t('SemanticsManage.ASRpage.belonging_directory_placeholder')" clearable id="edit-tag-cascader"
+							:options="tagCatalogue" :props="{value:'MenuId',label:'MenuName',children:'Children',checkStrictly:true,emitPath:false}"
+							style="width: 100%;" :clearable="false" ></el-cascader>
+					</el-form-item>
 				</el-form>
-        <div class="dia-bot">
-          <el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">取消</el-button>
-          <el-button type="primary" @click="saveHandle" style="min-width:120px;">保存</el-button>
-        </div>
+				<div class="dia-bot">
+					<el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">
+						{{ $t('Dialog.cancel_btn') }}
+					</el-button>
+					<el-button type="primary" @click="saveHandle" style="min-width:120px;">
+						{{ $t('Dialog.confirm_save_btn') }}
+					</el-button>
+				</div>
 			</div>
 		</el-dialog>
 </template>
@@ -55,7 +65,9 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
     watch:{
       diaShow(value){
         if(value){
-          this.diaTitle = this.formData.tId?"编辑标签":"添加标签"
+          this.diaTitle = this.formData.tId
+            ?this.$t("SemanticsManage.ASRpage.edit_tag_text")
+            :this.$t("SemanticsManage.ASRpage.add_tag_text")
           this.$refs.diaForm && this.$nextTick(()=>{
             this.$refs.diaForm.clearValidate()
           })
@@ -81,7 +93,7 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
                 TagName:this.formData.tName
               }).then(res=>{
                 if(res.Ret == 200){
-                  this.$message.success(this.diaTitle+"成功")
+                  this.$message.success(this.$t('SemanticsManage.ASRpage.editition_tag_successful'))
                   this.$emit("tagSuccess",{type:"edit"})
                   this.$emit("update:diaShow",false)
                 }
@@ -92,7 +104,7 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
                 TagName:this.formData.tName
               }).then(res=>{
                 if(res.Ret == 200){
-                  this.$message.success(this.diaTitle+"成功")
+                  this.$message.success(this.$t('SemanticsManage.ASRpage.addition_tag_successful'))
                   let menuIds = this.$refs.editTagCascader.getCheckedNodes()[0] && this.$refs.editTagCascader.getCheckedNodes()[0].pathNodes.map(node=> node.data.UniqueCode)
                   this.$emit("tagSuccess",{type:"add",menuIds})
                   this.$emit("update:diaShow",false)

+ 30 - 22
src/views/semantics_manage/asr/components/exportDia.vue

@@ -3,33 +3,38 @@
 		:visible.sync="diaShow"
 		:close-on-click-modal="false"
 		:modal-append-to-body='false'
-    :title="diaTitle"
+		:title="diaTitle"
 		@close="closeHandle"
 		center
 		width="480px">
 			<div class="dialog-main">
 				<el-form
-				ref="diaForm"
-				label-position="top"
-				hide-required-asterisk
-				:model="formData">
-          <el-form-item label="文件格式" :rules="{required:true,message:'文件格式必填',trigger:'change'}" prop="type">
-            <el-select v-model="formData.type" placeholder="请选择文件格式" style="width: 100%">
-              <el-option :label="item.label" :value="item.value" v-for="item in exportType" :key="item.value"></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="显示信息" prop="shows">
-            <el-select v-model="formData.shows" placeholder="请选择显示信息" style="width: 100%" clearable >
-              <el-option :label="item.label" :value="item.value" v-for="item in showsList" :key="item.value"></el-option>
-            </el-select>
-          </el-form-item>
+					ref="diaForm"
+					label-position="top"
+					hide-required-asterisk
+					:model="formData">
+					<el-form-item :label="$t('SemanticsManage.ASRpage.file_format')" 
+						:rules="{required:true,message:'文件格式必填',trigger:'change'}" prop="type">
+						<el-select v-model="formData.type" placeholder="请选择文件格式" style="width: 100%">
+							<el-option :label="item.label" :value="item.value" v-for="item in exportType" :key="item.value"></el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item :label="$t('SemanticsManage.ASRpage.display_information')" prop="shows">
+						<el-select v-model="formData.shows" :placeholder="$t('SemanticsManage.ASRpage.display_information_placeholder')" style="width: 100%" clearable >
+							<el-option :label="item.label" :value="item.value" v-for="item in showsList" :key="item.value"></el-option>
+						</el-select>
+					</el-form-item>
 				</el-form>
-        <div class="dia-bot">
-          <el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle" >取消</el-button>
-          <el-button type="primary" @click="saveHandle" style="min-width:120px;" >保存</el-button>
-        </div>
+				<div class="dia-bot">
+					<el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle" >
+						{{ $t('Dialog.cancel_btn') }}
+					</el-button>
+					<el-button type="primary" @click="saveHandle" style="min-width:120px;" >
+						{{ $t('Dialog.confirm_btn') }}
+					</el-button>
+				</div>
 			</div>
-		</el-dialog>
+	</el-dialog>
 </template>
 
 <script>
@@ -50,9 +55,9 @@
     },
     data() {
       return {
-        diaTitle:'导出内容',
+        //diaTitle:'导出内容',
         exportType:[{value:1,label:".txt"},{value:2,label:".doc"},{value:3,label:".pdf"}],
-        showsList:[{value:"timestamp",label:"时间戳"}],
+        showsList:[{value:"timestamp",label:this.$t('SemanticsManage.ASRpage.timestamps_text')}],
         exportBase: process.env.VUE_APP_API_ROOT + "/speech_recognition/export", //数据导出接口
       }
     },
@@ -79,6 +84,9 @@
         urlStr += `&Timestamp=${!!this.formData.shows}`;
         return this.escapeStr(urlStr);
       },
+      diaTitle(){
+        return this.$t('SemanticsManage.ASRpage.export_text')
+      },
     },
     methods: {
       cancelHandle(){

+ 26 - 14
src/views/semantics_manage/asr/components/fileRename.vue

@@ -3,24 +3,31 @@
 		:visible.sync="diaShow"
 		:close-on-click-modal="false"
 		:modal-append-to-body='false'
-    :title="diaTitle"
+		:title="diaTitle"
 		@close="closeHandle"
 		center
 		width="480px">
 			<div class="dialog-main">
 				<el-form
-				ref="diaForm"
-				label-position="top"
-				hide-required-asterisk
-				:model="formData">
-          <el-form-item label="文件名称" :rules="{required:true,message:'文件名称必填',trigger:'blur'}" prop="name">
-            <el-input v-model="formData.name" style="width: 100%" placeholder="请输入文件名称"></el-input>
-          </el-form-item>
+					ref="diaForm"
+					label-position="top"
+					hide-required-asterisk
+					:model="formData">
+					<el-form-item :label="$t('SemanticsManage.ASRpage.file_name')" 
+						:rules="{required:true,message:$t('SemanticsManage.ASRpage.file_name_required'),trigger:'blur'}" 
+						prop="name">
+						<el-input v-model="formData.name" style="width: 100%" 
+							:placeholder="$t('SemanticsManage.ASRpage.search_placeholder')"></el-input>
+					</el-form-item>
 				</el-form>
-        <div class="dia-bot">
-          <el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">取消</el-button>
-          <el-button type="primary" @click="saveHandle" style="min-width:120px;">保存</el-button>
-        </div>
+				<div class="dia-bot">
+					<el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">
+						{{ $t('Dialog.cancel_btn') }}
+					</el-button>
+					<el-button type="primary" @click="saveHandle" style="min-width:120px;">
+						{{ $t('Dialog.confirm_btn') }}
+					</el-button>
+				</div>
 			</div>
 		</el-dialog>
 </template>
@@ -53,9 +60,14 @@ import { asrInterface } from '../../../../api/modules/semanticsApi'
     },
     data() {
       return {
-        diaTitle:'重命名',
+        //diaTitle:'重命名',
       }
     },
+    computed:{
+        diaTitle(){
+            return this.$t('SemanticsManage.ASRpage.rename_text')
+        }
+    },
     methods: {
       cancelHandle(){
         this.$emit("update:diaShow",false)
@@ -65,7 +77,7 @@ import { asrInterface } from '../../../../api/modules/semanticsApi'
           if(valid){
             asrInterface.speechRename({SpeechRecognitionId:this.formData.id,FileName:this.formData.name}).then(res=>{
               if(res.Ret == 200){
-                this.$message.success(this.diaTitle+"成功")
+                this.$message.success(this.$t('SemanticsManage.ASRpage.rename_successful'))
                 this.$emit("renameSuccess")
                 this.$emit("update:diaShow",false)
               }

+ 54 - 39
src/views/semantics_manage/asr/components/makeTags.vue

@@ -3,47 +3,57 @@
 		:visible.sync="diaShow"
 		:close-on-click-modal="false"
 		:modal-append-to-body='false'
-    :title="diaTitle"
+		:title="diaTitle"
 		@close="closeHandle"
 		center
 		width="800px"
-    top="5vh">
+		top="5vh">
 			<div class="dialog-main">
-        <div class="make-tags-header">
-          <el-checkbox :indeterminate="isIndeterminate" v-model="isCheckAll" @change="checkAllTags">全选</el-checkbox>
-          <el-input v-model="tagSeachWord" placeholder="请输入标签名称" prefix-icon="el-icon-search" clearable
-              style="width: 360px;" @input="searchTags"></el-input>
-        </div>
-        <div class="make-tags-list">
-          <el-checkbox-group v-model="formData.tagsArr" class="make-tags-group" ref="tagsGroupRef" 
-          v-if="tagsListAfterFilter && tagsListAfterFilter.length>0" @change="tagsCheckedChange">
-            <el-checkbox :label="item.TagId" v-for="item in tagsListAfterFilter" :key="item.TagId" style="margin-right: 0;"> {{ item.TagName }}</el-checkbox>
-          </el-checkbox-group>
-          <tableNoData text="暂无数据" v-else />
-        </div>
-        <div class="make-tags-add" v-permission="permissionBtn.semanticPermission.ASR_tagMark_add">
-          <div class="make-tags-add-title">添加标签</div>
-          <el-form
-          ref="tagsForm" class="tags-form"
-          label-position="top" inline
-          hide-required-asterisk
-          :model="addTagsForm">
-            <el-form-item :rules="{required:true,message:'标签名称必填',trigger:'blur'}" prop="TagName">
-              <el-input v-model="addTagsForm.TagName" placeholder="请输入标签名称" style="width: 260px"></el-input>
-            </el-form-item>
-            <el-form-item prop="MenuId"  :rules="{required:true,message:'标签目录必填',trigger:'change'}">
-              <el-cascader v-model="addTagsForm.MenuId" placeholder="请选择标签目录" ref="makeTagsCascader" id="make-tags-cascader" style="width: 260px"
-              :options="tagCatalogueList" :props="{value:'MenuId',label:'MenuName',children:'Children',checkStrictly:true,emitPath:false}"></el-cascader>
-            </el-form-item>
-            <el-button type="primary" style="width: 100px;" @click="addTag">添加</el-button>
-          </el-form>
-        </div>
-        <div class="dia-bot">
-          <el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">取消</el-button>
-          <el-button type="primary" @click="saveHandle" style="min-width:120px;">保存</el-button>
-        </div>
+				<div class="make-tags-header">
+					<el-checkbox :indeterminate="isIndeterminate" v-model="isCheckAll" @change="checkAllTags">
+						{{ $t('SemanticsManage.ASRpage.select_all_text') }}
+					</el-checkbox>
+					<el-input v-model="tagSeachWord" 
+						:placeholder="$t('SemanticsManage.ASRpage.tag_name_placeholder')" prefix-icon="el-icon-search" clearable
+						style="width: 360px;" @input="searchTags"></el-input>
+				</div>
+				<div class="make-tags-list">
+					<el-checkbox-group v-model="formData.tagsArr" class="make-tags-group" ref="tagsGroupRef" 
+					v-if="tagsListAfterFilter && tagsListAfterFilter.length>0" @change="tagsCheckedChange">
+					<el-checkbox :label="item.TagId" v-for="item in tagsListAfterFilter" :key="item.TagId" style="margin-right: 0;"> {{ item.TagName }}</el-checkbox>
+					</el-checkbox-group>
+					<tableNoData :text="$t('Table.prompt_slogan')" v-else />
+				</div>
+				<div class="make-tags-add" v-permission="permissionBtn.semanticPermission.ASR_tagMark_add">
+					<div class="make-tags-add-title">{{ $t('SemanticsManage.ASRpage.add_tag_text') }}</div>
+					<el-form
+						ref="tagsForm" class="tags-form"
+						label-position="top" inline
+						hide-required-asterisk
+						:model="addTagsForm">
+						<el-form-item :rules="{required:true,message:$t('SemanticsManage.ASRpage.tag_name_required'),trigger:'blur'}" prop="TagName">
+							<el-input v-model="addTagsForm.TagName" 
+								:placeholder="$t('SemanticsManage.ASRpage.tag_name_placeholder')" style="width: 260px"></el-input>
+						</el-form-item>
+						<el-form-item prop="MenuId"  :rules="{required:true,message:$t('SemanticsManage.ASRpage.tag_directory_required'),trigger:'change'}">
+							<el-cascader v-model="addTagsForm.MenuId" 
+								:placeholder="$t('SemanticsManage.ASRpage.tag_directory_placeholder')" 
+								ref="makeTagsCascader" id="make-tags-cascader" style="width: 260px"
+								:options="tagCatalogueList" :props="{value:'MenuId',label:'MenuName',children:'Children',checkStrictly:true,emitPath:false}"></el-cascader>
+						</el-form-item>
+						<el-button type="primary" style="width: 100px;" @click="addTag">{{ $t('SemanticsManage.ASRpage.add_tag_text') }}</el-button>
+					</el-form>
+				</div>
+				<div class="dia-bot">
+					<el-button type="primary" plain style="margin-right:20px;min-width:120px ;" @click="cancelHandle">
+						{{ $t('Dialog.cancel_btn') }}
+					</el-button>
+					<el-button type="primary" @click="saveHandle" style="min-width:120px;">
+						{{ $t('Dialog.confirm_btn') }}
+					</el-button>
+				</div>
 			</div>
-		</el-dialog>
+	</el-dialog>
 </template>
 
 <script>
@@ -72,7 +82,7 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
     },
     data() {
       return {
-        diaTitle:'打标签',
+        //diaTitle:'打标签',
         tagSeachWord:"",
         isIndeterminate:false,
         isCheckAll:false,
@@ -85,6 +95,11 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
         hasAddTag:false
       }
     },
+    computed:{
+        diaTitle(){
+            return this.$t('SemanticsManage.ASRpage.tagging_text')
+        },
+    },
     methods: {
       checkAllTags(){
         this.isIndeterminate=false
@@ -158,7 +173,7 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
                   TagName:'',
                   MenuId:''
                 }
-                this.$message.success("新增标签成功")
+                this.$message.success(this.$t('SemanticsManage.ASRpage.addition_tag_successful'))
                 this.$emit("addTagSuccess")
               }
             })
@@ -171,7 +186,7 @@ import {asrInterface} from '@/api/modules/semanticsApi.js';
           TagIds:this.formData.tagsArr
         }).then(res=>{
           if(res.Ret == 200){
-            this.$message.success("打标签成功")
+            this.$message.success(this.$t('SemanticsManage.ASRpage.tagging_successful'))
             let tagsData=this.tagsList.filter(tag => this.formData.tagsArr.includes(tag.TagId))
             this.$emit("makeTagsSuccess",tagsData)
             this.$emit("update:diaShow",false)

+ 2 - 1
src/views/semantics_manage/asr/components/mediaCom.vue

@@ -14,7 +14,8 @@
       @input="handleDragTime" :max="duration"/>
       <div class="played-time">{{ formatTime(currentTime) }}</div>
       <el-dropdown @command="setSpeed" class="dropdown-speed">
-        <span>倍速 {{ speed }}x</span>
+        <!--倍速-->
+        <span>{{$t('SemanticsManage.ASRpage.speed_text')}} {{ speed }}x</span>
         <el-dropdown-menu slot="dropdown">
           <el-dropdown-item :command="0.5" :class="speed==0.5?'current-speed':''">0.5</el-dropdown-item>
           <el-dropdown-item :command="1" :class="speed==1?'current-speed':''">1</el-dropdown-item>

+ 10 - 5
src/views/supply_manage/components/createTargetDia.vue

@@ -42,9 +42,9 @@
 						clearable>
 							<el-option
 								v-for="item in frequencyArr"
-								:key="item"
-								:label="item"
-								:value="item">
+								:key="item.value"
+								:label="item.label"
+								:value="item.value">
 							</el-option>
 						</el-select>
 					</el-form-item>
@@ -75,7 +75,7 @@
 
 <script>
 import { dataBaseInterface } from '@/api/api.js';
-import { unitArr } from '@/utils/defaultOptions';
+import { unitArr,frequencySelectList } from '@/utils/defaultOptions';
 import * as supplyApi from '@/api/modules/supplyApi.js';
 export default {
 	name:'',
@@ -126,9 +126,14 @@ export default {
 				children: 'Children',
 				checkStrictly: true
 			},
-			frequencyArr:['日度','周度','旬度','月度','季度','年度']
+			//frequencyArr:['日度','周度','旬度','月度','季度','年度']
 		};
 	},
+	computed:{
+		frequencyArr(){
+			return frequencySelectList()
+		}
+	},
 	methods: {
 		/* 获取目录结构 */
 		getMenu() {

+ 5 - 1
src/views/system_manage/outlinkListConfig.vue

@@ -135,7 +135,11 @@ import mPage from '@/components/mPage.vue';
           if(valid){
             outlinkConfigInterence.outlinkSave(this.outlinkForm).then(res=>{
               if(res.Ret == 200){
-                this.$message.success(`${this.dialogTitle}成功`)
+                this.$message.success(
+                    this.outlinkForm.Id
+                    ?/* 编辑 */ this.$t('SystemManage.OutLinkConfig.edit_successful')
+                    :/* 添加 */ this.$t('SystemManage.OutLinkConfig.add_successful')
+                )
                 this.addOutlinkShow=false
                 this.getOutlinkData()
               }

+ 227 - 0
src/views/toolBox_manage/ForexCalendar.vue

@@ -0,0 +1,227 @@
+<template>
+    <div class="forex-calendar-wrap">
+        <div class="calendar-header">
+            <div class="left-select">
+                <!-- 添加事项 -->
+                <el-button 
+                    v-permission="permissionBtn.toolBoxPermission.forexCalendar_save"
+                    type="primary" @click="dateClick">{{ $t('ToolBox.ForexCalendar.add_item') }}</el-button>
+                <!-- 选择日期 -->
+                <el-date-picker type="month" :placeholder="$t('ToolBox.ForexCalendar.select_date')" 
+                    :clearable="false"
+                    v-model="monthValue"
+                    value-format="yyyy-MM"
+                    :disabled="!permissionValue"
+                    style="margin-left: 30px;"
+                    @change="changeMonth"/>
+            </div>
+            <div class="center-title"> <!-- 当前日期 -->
+                {{ $t('ToolBox.ForexCalendar.header_title',{
+                    //中文版传字符,英文版传月份翻译
+                    month:$i18n.locale==='zh'?`${currentMonth}`:calendarTrans.Month[Number(currentMonth)||1].en,
+                    year:currentYear||'2024'}) 
+                }}</div>
+            <div class="right-select">
+
+                <el-cascader :options="permissonList" 
+                    ref="cascaderRef"
+                    :placeholder="$t('ToolBox.ForexCalendar.select_type')"
+                    v-model="permissionValue"
+                    :props="{
+                        children:'Children',
+                        expandTrigger:'hover',
+                        emitPath:false,
+                        value:'ChartPermissionId',
+                        label:'ChartPermissionName'
+                    }"
+                    style="min-width:300px;"
+                    @change="changePermission"
+                ></el-cascader>
+            </div>
+        </div>
+        <BaseCalendar
+            ref="baseCalendar"
+            :markText="{
+                date:`${$t('ToolBox.ForexCalendar.mark_date',{
+                    month:$i18n.locale==='zh'?`${currentMonth}`:calendarTrans.Month[Number(currentMonth)||1].en,
+                    year:currentYear||'2024'})
+                }`,
+                type:`${permissionName}`
+            }"
+            @dateClick="dateClick"
+            @eventClick="eventClick"
+        ></BaseCalendar>
+        <AddEventDialog
+            :isEventDialogShow="isEventDialogShow"
+            :choosedDay="choosedDay"
+            :choosedPermission="permissionValue"
+            @save="addEvents"
+            @close="isEventDialogShow=false"
+        />
+    </div>
+</template>
+
+<script>
+import BaseCalendar from './components/BaseCalendar.vue';
+import AddEventDialog from './components/AddEventDialog.vue';
+import calendarTrans from '@/lang/modules/ToolBox/calendar/commonLang';
+import {ForexCalendarInterface} from '@/api/modules/toolBoxApi';
+export default {
+    data() {
+        return {
+            monthValue:'',//选择的月份
+            permissionValue:'',//选择的品种Id
+            permissionName:'',//选择的品种Name
+            permissonList:[],//品种列表
+
+            calendarApi:null,//日历Api
+            calendarTrans:calendarTrans,//翻译方法
+
+            isEventDialogShow:false,//控制添加事项弹窗
+            eventInfo:null,
+            choosedDay:'',//选择的日期
+        };
+    },
+    computed:{
+        currentYear(){//选择的年份
+            const date = this.monthValue||new Date()
+            return this.$moment(date).format('YYYY')
+        },
+        currentMonth(){//选择的月份
+            const date = this.monthValue||new Date()
+            return this.$moment(date).format('MM')
+        }
+    },
+    methods: {
+        getPermissonList(){
+            ForexCalendarInterface.getPermissionList().then(res=>{
+                if(res.Ret!==200) return 
+                this.permissonList = res.Data||[]
+            })
+        },
+        changePermission(){
+            this.getPermissionName()
+            this.renderCalendar()
+        },
+        //获取选择品种的名称
+        getPermissionName(){
+            const node = this.$refs.cascaderRef.getCheckedNodes(true)[0]
+            this.permissionName = node.label
+        },
+        changeMonth(month){
+            const Month = month||new Date()
+            this.calendarApi.gotoDate(Month)
+            this.renderCalendar()
+        },
+        async renderCalendar(){
+            //获取当前日历的起始日期+终止日期,可能会跨月
+            const {activeStart,activeEnd} = this.calendarApi.view
+            const res = await ForexCalendarInterface.getCalendarEventList({
+                ChartPermissionId:Number(this.permissionValue),
+                StartDate:this.$moment(activeStart).format('YYYY-MM-DD'),
+                EndDate:this.$moment(activeEnd).subtract(1, 'days').format('YYYY-MM-DD'), //activeEnd到最后一天的24:00会被认为是第二天,所以取前一天
+            })
+            if(res.Ret!==200) return 
+            const allEventSource = this.calendarApi.getEventSources()||[]
+            //先清空所有eventSource,再添加
+            allEventSource.forEach(es=>es.remove())
+            //将日历表每天的事件作为一个eventSource
+            const eventList = (res.Data?res.Data:[]).map(dailyEvents=>{
+                const eventSource = { id:dailyEvents.Date,events:[]}
+                eventSource.events = dailyEvents.Matters.map(e=>{
+                    return {
+                        ...e,
+                        start:e.MatterDate,
+                        title:e.Title,
+                        textColor:e.FontColor||'#000',
+                        backgroundColor:e.FillingColor||'#fff',
+                        borderColor:e.FillingColor||'#fff',
+                    }
+                })
+                return eventSource
+            })
+            eventList.forEach(es=>{
+                this.calendarApi.addEventSource(es)
+            })
+        },
+        //点击单元格(非事项部分)
+        dateClick(info){
+            this.setEventInfo(info.dateStr)
+        },
+        //点击事项
+        eventClick(info){
+            this.setEventInfo(info.event.startStr)
+        },
+        //根据日期设置弹窗信息
+        setEventInfo(date){
+            if(!this.permissionBtn.isShowBtn('toolBoxPermission','forexCalendar_save')) return
+            if(!this.permissionValue) return this.$message.warning(this.$t('ToolBox.ForexCalendar.select_type_hint'))
+            this.choosedDay = date||''
+            this.isEventDialogShow = true
+        },
+        //添加事项(批量)
+        async addEvents({events,eventDay}){
+            //需要添加的事项
+            const eventSource = events.map((e,index)=>{
+                return {
+                    FeCalendarMatterId:e.FeCalendarMatterId||0,
+                    Title:e.title,
+                    MatterType:Number(e.MatterType),
+                    EdbInfoId:Number(e.EdbInfoId||''),
+                    EdbUniqueCode:e.EdbUniqueCode||'',
+                    EdbCode:e.EdbCode||'',
+                    FontBold:e.FontBold,
+                    FontColor:e.textColor,
+                    FillingColor:e.backgroundColor,
+                    Sort:index+1
+                }
+            })
+
+            //通过接口,添加该日的事件
+            const res = await ForexCalendarInterface.saveDailyEvents({
+                ChartPermissionId:Number(this.permissionValue),
+                MatterDate:eventDay,
+                Matters:eventSource
+            })
+            if(res.Ret!==200) return 
+
+            //重新加载日历
+            if(this.$moment(eventDay).format('MM')===this.currentMonth){
+                this.renderCalendar()
+            }else{
+                this.monthValue = this.$moment(eventDay).format('YYYY-MM')
+                this.changeMonth(this.monthValue)
+            }
+            
+            this.isEventDialogShow = false
+        },
+    },
+    components: { BaseCalendar , AddEventDialog },
+    mounted(){
+        this.monthValue = this.$moment(new Date()).format('YYYY-MM')
+        this.calendarApi = this.$refs.baseCalendar.$refs.fullCalendar.getApi()
+        this.getPermissonList()
+    }
+};
+</script>
+
+<style scoped lang="scss">
+.forex-calendar-wrap{
+    min-height: calc(100vh - 120px);
+    box-sizing: border-box;
+    padding:20px;
+    background-color: #fff;
+    display: flex;
+    flex-direction: column;
+    .calendar-header{
+        display: flex;
+        justify-content:space-between;
+        align-items: center;
+        margin-bottom: 20px;
+        .center-title{
+            font-size: 18px;
+            font-weight: bold;
+        }
+    }
+}
+</style>

+ 155 - 0
src/views/toolBox_manage/components/BaseCalendar.vue

@@ -0,0 +1,155 @@
+<template>
+    <div class="base-calendar-wrap">
+        <FullCalendar class="full-calendar-wrap"
+            ref="fullCalendar"
+            :options="calendarOptions"
+        >
+            <template #eventContent="arg">
+                <div class="popper-content"
+                    :style="{fontWeight:arg.event.extendedProps.FontBold?'bold':'normal'}"
+                >
+                   {{arg.event.title||''}}
+                </div>
+            </template>
+        </FullCalendar>
+        <div class="water-mark" v-if="showMark">
+            <p>{{ markText.date }}</p>
+            <p>{{ markText.type }}</p>
+        </div>
+    </div>
+</template>
+
+<script>
+import FullCalendar from "@fullcalendar/vue";
+import dayGridPlugin from '@fullcalendar/daygrid'
+import interactionPlugin from '@fullcalendar/interaction'
+export default {
+    components: {FullCalendar},
+    props:{
+        showMark:{
+            type:Boolean,
+            default:true
+        },
+        markText:{
+            type:Object,
+            default:()=>{
+                return {
+                    date:'当前日期',
+                    type:'当前品种'
+                }
+            }
+        },
+        options:{
+            type:Object,
+            default:{}
+        }
+    },
+    data() {
+        return {
+            calendarOptions:{
+                height:'100%',
+                locale: "zh-cn",
+                plugins: [ dayGridPlugin, interactionPlugin ],
+                initialView:'dayGridMonth',
+                headerToolbar:false,//不显示头部信息
+                weekNumberCalculation:'ISO',//从周一开始
+                dayHeaderFormat:{ //https://fullcalendar.io/docs/v5/date-formatting
+                    weekday:'narrow', //头部星期显示为一 二 三...
+                },
+                dayCellContent:function(arg){ //单元格日期显示为 1 2 3...
+                    return arg.date.getDate()
+                },
+                fixedWeekCount:false,//是否固定6周
+                eventOrder:'Sort', //指定事项排序字段
+                /* dayMaxEventRows:6,//一天最多展示6条
+                moreLinkClick:(info)=>{this.handleDateClick(info)},//点击more时触发 */
+                events:[
+                    /* {
+                        id:1,
+                        title:'我是默认事件', //事件名称
+                        start:'2024-03-26',//日期,默认是全天事件
+                        textColor:'#000',//字体颜色
+                        backgroundColor:'#ffc0cb',//背景色
+                        borderColor:'#ffc0cb',//边框色
+                        //↑此外的属性会被FullCalendar插件放到extendedProps属性中
+                        //extendedProps
+                        isTextBold:true,//是否加粗
+                    }, */
+                ],
+                dateClick:this.handleDateClick,
+                eventClick:this.handleEventClick
+            }
+        };
+    },
+    methods: {
+        handleDateClick(info){
+            this.$emit("dateClick",info)
+        },
+        handleEventClick(info){
+            this.$emit("eventClick",info)
+        }
+    },
+};
+</script>
+
+<style lang="scss">
+.base-calendar-wrap{
+    .full-calendar-wrap{
+        .fc-daygrid-day-top{ //日期偏左显示
+            flex-direction: row;
+        }
+        .fc-daygrid-event{
+            border-radius: 0;
+            margin:0 !important;
+        }
+        .fc-scrollgrid{
+            border:none;
+            .fc-scrollgrid-section-header{
+                th{
+                    border:none !important;
+                }
+                .fc-col-header-cell{
+                    text-align: left;
+                    //font-weight: 500;
+                }
+            }
+            .fc-scrollgrid-section-body{
+                td{
+                    border: none !important;
+                    border-left:2px solid #002D78 !important;
+                }
+            }
+        }
+        .fc-more-popover{
+            display:none !important;
+        }
+    }
+}
+</style>
+<style scoped lang="scss">
+.base-calendar-wrap{
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    position:relative;
+    .full-calendar-wrap{
+        flex:1;
+        .popper-content{
+            cursor: pointer;
+        }
+    }
+    .water-mark{
+        position: absolute;
+        top:0;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        font-size: 64px;
+        opacity: 0.3;
+    }
+}
+</style>

+ 344 - 0
src/views/toolBox_manage/components/addEventDialog.vue

@@ -0,0 +1,344 @@
+<template>
+    <el-dialog
+        :title="$t('ToolBox.ForexCalendar.add_item')"
+        width="600px"
+        center
+        custom-class="add-event-dialog-wrap"
+        :visible.sync="isEventDialogShow"
+        :modal-append-to-body="false"
+        :append-to-body="false"
+        @close="$emit('close')"
+    >
+        <div class="dialog-content">
+            <div class="event-header">
+                <!-- 选择日期 -->
+                <el-date-picker  type="date" v-model="eventDay"
+                    :placeholder="$t('ToolBox.ForexCalendar.select_date')"
+                    value-format="yyyy-MM-dd"
+                    @change="getDayEvents"
+                    >
+                </el-date-picker>
+                <div class="event-select">
+                    <el-select v-model="selectType" style="width:130px">
+                        <!-- 关联指标 -->
+                        <el-option :label="$t('ToolBox.ForexCalendar.link_edb')" :value="1"/>
+                        <!-- 自定义事项 -->
+                        <el-option :label="$t('ToolBox.ForexCalendar.link_item')" :value="2"/>
+                    </el-select>
+                    <!-- 关联指标 -->
+                   <el-select v-if="selectType===1" style="flex:1;"
+                        filterable remote clearable
+                        :placeholder="$t('ToolBox.ForexCalendar.edb_input')"
+                        v-model="searchObj"
+                        :remote-method="searchHandle"
+                        value-key="EdbInfoId"
+                        @change="searchChange">
+                        <i slot="prefix" class="el-input__icon el-icon-search"></i>
+                        <el-option
+                            v-for="item in searchOptions"
+                            :key="item.EdbInfoId"
+                            :label="item.EdbName"
+                            :value="item"/>
+                    </el-select>
+                    <!-- 自定义事项 -->
+                    <el-button v-if="selectType===2" style="flex:1;" @click="addEventItem">+</el-button>
+
+                    <el-tooltip effect="dark" :content="$t('ToolBox.ForexCalendar.link_hint')" placement="top">
+                        <i class="el-icon-question" style="font-size: 16px;"></i>
+                    </el-tooltip>
+                </div>
+            </div>
+            <div class="event-form">
+                <el-form :model="eventForm" ref="eventForm">
+                    <draggable 
+                        v-model="eventForm.events"
+                        animation="300"
+                        tag="div" 
+                        class="events-wrap"
+                        handle=".el-icon-rank">
+                        <div class="event" v-for="(item,index) in eventForm.events" :key="index">
+                            <el-form-item :prop="`events[${index}].title`" class="event-item"
+                                :rules="[
+                                    {required:true,message:$t('ToolBox.ForexCalendar.item_input'),trigger: 'blur'},
+                                    {max: 15, message: $t('ToolBox.ForexCalendar.item_input_limit'), trigger: 'blur'}]">
+                                <!-- move icon -->
+                                <i class="el-icon-rank icon" style="color: #0052D9;"></i>
+                                <el-input v-model="item.title" :placeholder="$t('ToolBox.ForexCalendar.item_input')">
+                                    <el-button slot="append" type="primary" @click.stop="item.isExpand = !item.isExpand">
+                                        {{$t(`ToolBox.ForexCalendar.item_btn_text${item.isExpand?'_pickup':''}`)}}
+                                    </el-button>
+                                </el-input>
+                                <!-- close icon -->
+                                <i class="el-icon-remove-outline icon" style="color:#D54941;" @click="removeEvent(index)"></i>
+                                <!-- edb icon -->
+                                <img class="icon" src="~@/assets/img/icons/edb-icon.png" v-if="item.MatterType!==1" @click="toEdbDetail(item)">
+                                <!-- 占位 -->
+                                <span class="icon" v-else></span>
+                            </el-form-item>
+                            <div class="event-expand-setting" v-show="item.isExpand">
+                                <div><span>{{ $t('ToolBox.ForexCalendar.font_color') }}</span> <el-color-picker v-model="item.textColor" color-format="hex" size="mini"></el-color-picker></div>
+                                <div><span>{{ $t('ToolBox.ForexCalendar.fill_color') }}</span> <el-color-picker v-model="item.backgroundColor" color-format="hex" size="mini"></el-color-picker></div>
+                                <div><span>{{ $t('ToolBox.ForexCalendar.font_bold') }}</span> <el-switch v-model="item.FontBold" :active-value="1" :inactive-value="0"></el-switch></div>
+                            </div>
+                        </div>
+                    </draggable>
+                    
+                </el-form>
+            </div>
+            
+        </div>
+        <div class="dialog-footer" slot="footer">
+            <el-button @click="$emit('close')">{{ $t('Dialog.cancel_btn') }}</el-button>
+            <el-button type="primary" @click="handleSaveEvents">{{ $t('Dialog.confirm_save_btn') }}</el-button>
+        </div>
+        
+    </el-dialog>
+</template>
+
+<script>
+import draggable from 'vuedraggable';
+import {ForexCalendarInterface} from '@/api/modules/toolBoxApi';
+export default {
+    components:{draggable},
+    props:{
+        isEventDialogShow:{
+            type:Boolean,
+            default:false
+        },
+        choosedDay:{
+            type:String,
+            default:''
+        },
+        choosedPermission:{
+            type:Number,
+            default:0
+        },
+    },
+    data() {
+        return {
+            eventDay:'',
+            selectType:1,
+            searchObj:'',
+            searchOptions:[],
+            eventForm:{
+                events:[/* {
+                    title:'',
+                    textColor:'#000',
+                    backgroundColor:'#ccc',
+                    isTextBold:false,
+                    isExpand:false,//是否展开
+                } */]
+            }
+        };
+    },
+    watch:{
+        isEventDialogShow(newVal){
+            if(newVal){
+                this.eventDay = this.choosedDay||this.$moment(new Date()).format('YYYY-MM-DD')
+                this.getDayEvents()
+            }
+        }
+    },
+    methods: {
+        searchHandle(keyword){
+            ForexCalendarInterface.searchEdbInfo({
+                KeyWord:keyword,
+                CurrentIndex:1,
+                PageSize:100,
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.searchOptions = res.Data.List||[]
+            })
+        },
+        searchChange(){
+            if(typeof this.searchObj === 'object'){
+                this.addEdbItem()
+            }
+        },
+        //获取当天的事项
+        getDayEvents(){
+            this.eventForm.events = []
+            //接口获取
+            ForexCalendarInterface.getDailyEventList({
+                ChartPermissionId:Number(this.choosedPermission),
+                MatterDate:this.eventDay
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                this.eventForm.events = (res.Data?res.Data:[]).map(e=>{
+                    return {
+                        ...e,
+                        title:e.Title,
+                        textColor:e.FontColor||'#333333',
+                        backgroundColor:e.FillingColor||'#0052D9',
+                        borderColor:e.FillingColor||'#0052D9',
+                        isExpand:false
+                    }
+                })
+            })
+        },
+        //添加一个事项
+        addEventItem(){
+            this.eventForm.events.push({
+                title:'',
+                textColor:'#333333',
+                backgroundColor:'#0052D9',
+                isExpand:false,
+                MatterType:1,
+                FontBold:0,
+                FeCalendarMatterId:0,
+                EdbInfoId:'',
+                EdbUniqueCode:'',
+                EdbCode:'',
+                
+            })
+        },
+        //添加一个指标事项
+        addEdbItem(){
+            const {EdbName,EdbInfoType,EdbInfoId,UniqueCode,EdbCode} = this.searchObj
+            this.eventForm.events.push({
+                title:EdbName||'',
+                textColor:'#333333',
+                backgroundColor:'#0052D9',
+                isExpand:false,
+                MatterType:EdbInfoType?3:2,
+                FontBold:0,
+                FeCalendarMatterId:0,
+                EdbInfoId:EdbInfoId||'',
+                EdbUniqueCode:UniqueCode||'',
+                EdbCode:EdbCode||'',
+            })
+            this.searchObj=''
+        },
+        removeEvent(index){
+            this.eventForm.events.splice(index,1)
+        },
+        //跳转指标库/预测指标库
+        toEdbDetail(item){
+            const { EdbUniqueCode, EdbInfoId, MatterType } = item
+            let { href } = this.$router.resolve({ 
+                path: MatterType === 3 ? '/predictEdb' : '/database',
+                query: { 
+                    code: EdbUniqueCode, 
+                    id:EdbInfoId, 
+                } 
+            });
+            window.open(href, '_blank');
+        },
+        async handleSaveEvents(){
+            if(!this.eventDay) return this.$message.warning('请选择日期')
+            try{
+                await this.$refs.eventForm.validate()
+            }catch(e){
+                return 
+            }
+            this.$emit('save',{events:this.eventForm.events,eventDay:this.eventDay})
+        }
+    },
+};
+</script>
+
+<style lang="scss">
+.add-event-dialog-wrap{
+    .el-input{
+        width: 100%;
+    }
+    .el-form-item{
+        margin-bottom:0;
+        &.event-item{
+            .el-form-item__content{
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+                /* gap:10px; */
+                .icon{
+                    margin:10px;
+                    &:last-of-type{
+                        margin-right: 0;
+                    }
+                }
+                img.icon,span.icon{
+                    width:16px;
+                    height:16px;
+                }
+                .el-input{
+                    flex: 1;
+                }
+                .el-input-group__append{
+                    .el-button{
+                        color: #FFFFFF;
+                        background-color: #0052D9;
+                        border-color: #0052D9;
+                        border-top-left-radius:0;
+                        border-bottom-left-radius: 0;
+                    }
+                    
+                }
+                .el-form-item__error{
+                    left: 34px;
+                }
+            }
+        }
+    }
+    .event-expand-setting{
+        .el-color-picker {
+            display: inline-block;
+            &.el-color-picker--mini {
+                height: 20px;
+            }
+            .el-color-picker__trigger {
+                width: 40px;
+                height: 20px;
+                padding: 0;
+                border: 0;
+                .el-color-picker__icon{
+                    display: none;
+                }
+            }
+        }
+    }
+}
+</style>
+<style scoped lang="scss">
+.add-event-dialog-wrap{
+    .dialog-content{
+        padding:15px 30px;
+        .event-select{
+            display: flex;
+            gap:10px;
+            align-items: center;
+            margin:30px 0;
+        }
+        .event-form{
+            min-height: 200px;
+            max-height: 320px;
+            overflow-y: auto;
+            margin-left: -34px;
+            .event{
+                position:relative;
+                margin-bottom: 30px;
+                .event-item{
+                    .icon{
+                        cursor: pointer;
+                    }
+                }
+                .event-expand-setting{
+                    display: flex;
+                    justify-content: space-around;
+                    align-items: center;
+                    border:1px dashed #0052D9;
+                    border-top: none;
+                    border-radius: 0 0 4px 4px;
+                    padding:14px;
+                    background-color: #ECF2FE;
+                    margin:0 52px 0 34px;
+                    >div{
+                        display: flex;
+                        align-items: center;
+                        gap:10px;
+                    }
+                }
+            }
+        }
+    }
+}
+</style>