浏览代码

marge lang_dev

bding 1 年之前
父节点
当前提交
dbd05d00bb
共有 98 个文件被更改,包括 2065 次插入612 次删除
  1. 4 4
      src/App.vue
  2. 9 0
      src/api/modules/chartRelevanceApi.js
  3. 7 0
      src/api/modules/setApi.js
  4. 二进制
      src/assets/img/cloudDisk/audio_icon.png
  5. 0 0
      src/assets/img/cloudDisk/config_icon.png
  6. 二进制
      src/assets/img/cloudDisk/excel_icon.png
  7. 二进制
      src/assets/img/cloudDisk/file_icon.png
  8. 二进制
      src/assets/img/cloudDisk/img_icon.png
  9. 0 0
      src/assets/img/cloudDisk/pdf_icon.png
  10. 0 0
      src/assets/img/cloudDisk/ppt_icon.png
  11. 二进制
      src/assets/img/cloudDisk/video_icon.png
  12. 二进制
      src/assets/img/cloudDisk/word_icon.png
  13. 1 1
      src/components/chart/chartDetailHandlesWrap.vue
  14. 52 0
      src/lang/commonLang.js
  15. 8 1
      src/lang/modules/DataSources/En.js
  16. 7 1
      src/lang/modules/DataSources/Zh.js
  17. 5 1
      src/lang/modules/EtaBase/commonLang.js
  18. 8 0
      src/lang/modules/EtaChart/commonLang.js
  19. 67 0
      src/lang/modules/MainApp/En.js
  20. 67 0
      src/lang/modules/MainApp/Zh.js
  21. 4 2
      src/lang/modules/MyEta/En.js
  22. 3 1
      src/lang/modules/MyEta/Zh.js
  23. 7 0
      src/lang/modules/SandboxManage/SandList.js
  24. 3 3
      src/utils/svgToblob.js
  25. 8 20
      src/views/Home.vue
  26. 115 100
      src/views/Login.vue
  27. 12 5
      src/views/chartFrame_manage/frameEditor.vue
  28. 2 2
      src/views/chartFrame_manage/index.vue
  29. 2 0
      src/views/chartRelevance_manage/components/chartCard.vue
  30. 6 2
      src/views/chartRelevance_manage/components/explainText.js
  31. 7 5
      src/views/chartRelevance_manage/crossVarietyAnalysis/chartEditor.vue
  32. 68 5
      src/views/chartRelevance_manage/crossVarietyAnalysis/components/chartFormSection.vue
  33. 72 4
      src/views/chartRelevance_manage/crossVarietyAnalysis/list.vue
  34. 16 2
      src/views/chartRelevance_manage/css/index.scss
  35. 34 1
      src/views/chartRelevance_manage/statistic/statisticFeatureChartEditor.vue
  36. 83 4
      src/views/dataEntry_manage/addChart.vue
  37. 91 10
      src/views/dataEntry_manage/chartSetting.vue
  38. 7 4
      src/views/dataEntry_manage/coal/index.vue
  39. 30 12
      src/views/dataEntry_manage/components/addTarget.vue
  40. 3 3
      src/views/dataEntry_manage/components/changeLang.vue
  41. 33 21
      src/views/dataEntry_manage/components/editTarget.vue
  42. 8 0
      src/views/dataEntry_manage/css/baseTargetPage.scss
  43. 3 2
      src/views/dataEntry_manage/css/coalCommon.scss
  44. 4 4
      src/views/dataEntry_manage/dataEntry.vue
  45. 12 2
      src/views/dataEntry_manage/databaseComponents/addTargetDiaBase.vue
  46. 10 6
      src/views/dataEntry_manage/databaseList.vue
  47. 85 5
      src/views/dataEntry_manage/editChart.vue
  48. 100 8
      src/views/dataEntry_manage/mixins/addOreditMixin.js
  49. 307 19
      src/views/dataEntry_manage/mixins/chartPublic.js
  50. 14 9
      src/views/dataEntry_manage/targetList.vue
  51. 7 5
      src/views/dataEntry_manage/thirdBase/BAIINFOTargetbase.vue
  52. 6 4
      src/views/dataEntry_manage/thirdBase/FwmtData.vue
  53. 7 5
      src/views/dataEntry_manage/thirdBase/SCITargetbase.vue
  54. 10 4
      src/views/dataEntry_manage/thirdBase/YyzxData.vue
  55. 1 1
      src/views/dataEntry_manage/thirdBase/components/batchAddEdbDia.vue
  56. 3 2
      src/views/dataEntry_manage/thirdBase/elaSteoBase.vue
  57. 1 0
      src/views/dataEntry_manage/thirdBase/glTargetbase.vue
  58. 1 0
      src/views/dataEntry_manage/thirdBase/lzTargetbase.vue
  59. 12 10
      src/views/dataEntry_manage/thirdBase/smmTargetbase.vue
  60. 7 6
      src/views/dataEntry_manage/thirdBase/steelChemicalbase.vue
  61. 26 2
      src/views/datasheet_manage/common/option.js
  62. 1 0
      src/views/datasheet_manage/customAnalysis/list.vue
  63. 9 4
      src/views/datasheet_manage/sheetList.vue
  64. 16 13
      src/views/login_manage/EmailModel.vue
  65. 18 18
      src/views/login_manage/ForgetPassModel.vue
  66. 17 14
      src/views/login_manage/MobileModel.vue
  67. 9 9
      src/views/login_manage/OrdinaryModel.vue
  68. 6 2
      src/views/login_manage/components/ModelSteps.vue
  69. 1 1
      src/views/login_manage/components/VerificationBox.vue
  70. 2 2
      src/views/login_manage/modelMixins.js
  71. 110 66
      src/views/mychart_manage/components/chartDetailDia.vue
  72. 4 4
      src/views/mychart_manage/components/classifyDeleteCheck.vue
  73. 14 15
      src/views/mychart_manage/index.vue
  74. 12 11
      src/views/operation_manage/AIQA/AIQA.vue
  75. 8 5
      src/views/operation_manage/AIQA/components/messageItem.vue
  76. 194 11
      src/views/ppt_manage/mixins/mixins.js
  77. 8 4
      src/views/ppt_manage/mixins/pptMixins.js
  78. 1 0
      src/views/ppt_manage/newVersion/pptCatalog.vue
  79. 1 0
      src/views/ppt_manage/newVersion/pptEnCatalog.vue
  80. 6 2
      src/views/predictEdb_manage/predictEdb.vue
  81. 2 2
      src/views/report_manage/addreportNew.vue
  82. 37 2
      src/views/report_manage/cloudDisk.vue
  83. 1 1
      src/views/report_manage/editreportNew.vue
  84. 1 1
      src/views/report_manage/mixins/editor.js
  85. 1 1
      src/views/report_manage/mixins/reportMixin.js
  86. 2 2
      src/views/report_manage/reportEn/reportEditor.vue
  87. 19 23
      src/views/resetpassword.vue
  88. 6 8
      src/views/sandbox_manage/common/mindmap.js
  89. 3 3
      src/views/sandbox_manage/common/toolConfig.js
  90. 17 30
      src/views/sandbox_manage/index_new_version.vue
  91. 2 1
      src/views/sandbox_manage/sandFlowNew/components/addLInkDia.vue
  92. 39 30
      src/views/sandbox_manage/sandFlowNew/index.vue
  93. 2 2
      src/views/smartReport/components/BaseInfo.vue
  94. 4 3
      src/views/smartReport/components/ImgSource.vue
  95. 1 1
      src/views/smartReport/components/TextEdit.vue
  96. 10 5
      src/views/system_manage/components/addUserDialog.vue
  97. 15 7
      src/views/system_manage/departManage.vue
  98. 1 1
      src/vuex/modules/sand.js

+ 4 - 4
src/App.vue

@@ -226,8 +226,8 @@ iframe {
 
 /*修改滚动条样式 chrome edge safari*/
 div::-webkit-scrollbar {
-  width: 6px;
-  height: 6px;
+  width: 7px;
+  height: 7px;
 }
 div::-webkit-scrollbar-track {
   background: rgb(239, 239, 239);
@@ -278,8 +278,8 @@ div::-webkit-scrollbar-corner {
 
 /*修改滚动条样式 chrome edge safari*/
 ul::-webkit-scrollbar {
-  width: 6px;
-  height: 6px;
+  width: 7px;
+  height: 7px;
 }
 ul::-webkit-scrollbar-track {
   background: rgb(239, 239, 239);

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

@@ -1018,5 +1018,14 @@ export const crossVarietyInterface = {
      */
     getTagRelation: params => {
       return http.get('/cross_variety/tag/variety_edb/list',params)
+    },
+
+    /**
+     * 保存图表上下限
+     * @param {*} params 
+     * @returns 
+     */
+    saveChart: params => {
+      return http.post('/cross_variety/chart_info/save',params)
     }
 }

+ 7 - 0
src/api/modules/setApi.js

@@ -338,6 +338,13 @@ const departInterence = {
 	getPhoneAreaCode:params=>{
 		return http.get('/user_login/area_code/list',params)
 	},
+
+	// 判断用户是否为域用户
+	checkUserIsLdap:params=>{
+		return http.post('/user_login/ldap/user_check',params)
+	},
+
+
 	/**
 	 * 获取登录页的信息 
 	 * @returns ETATitle登录标题 Icp备案信息

二进制
src/assets/img/cloudDisk/audio_icon.png


+ 0 - 0
src/assets/img/icons/file_type_unknown.png → src/assets/img/cloudDisk/config_icon.png


二进制
src/assets/img/cloudDisk/excel_icon.png


二进制
src/assets/img/cloudDisk/file_icon.png


二进制
src/assets/img/cloudDisk/img_icon.png


+ 0 - 0
src/assets/img/icons/file_type_pdf.png → src/assets/img/cloudDisk/pdf_icon.png


+ 0 - 0
src/assets/img/icons/file_type_ppt.png → src/assets/img/cloudDisk/ppt_icon.png


二进制
src/assets/img/cloudDisk/video_icon.png


二进制
src/assets/img/cloudDisk/word_icon.png


+ 1 - 1
src/components/chart/chartDetailHandlesWrap.vue

@@ -23,7 +23,7 @@
         ><i class="el-icon-refresh" style="margin-left: 0" />&nbsp;{{$t('Edb.detail_refresh_btn')}}
       </span>
     </li>
-    <li class="span-item" v-if="['/commordityChartBase'].includes($route.path)">
+    <li class="span-item" v-if="['/commordityChartBase','/crossVarietyChartList'].includes($route.path)">
       <span @click="saveChartHandle">
         <i class="el-icon-collection" />&nbsp;{{$t('Chart.chart_save_btn')}}
       </span>

+ 52 - 0
src/lang/commonLang.js

@@ -48,6 +48,14 @@ export default {
     submit_btn: {
       en: 'Submit',
       zh: '提交'
+    },
+    next_step: {
+      en: 'Next step',
+      zh: '下一步'
+    },
+    prev_step: {
+      en: 'Previous step',
+      zh: '上一步'
     }
   },
   Table: {
@@ -167,6 +175,10 @@ export default {
       en: "Saved successfully.",
       zh: "保存成功",
     },
+    entry_msg: {
+      en: "Entry Successful",
+      zh: "录入成功",
+    },
     delete_info_msg: {
       en: "Are you sure you want to permanently delete this file?",
       zh: "删除后不可恢复,是否确认删除?",
@@ -238,6 +250,18 @@ export default {
     move_success_msg: {
       en: 'Move successful',
       zh: '移动成功'
+    },
+    move_out_msg: {
+      en: 'Removed successful',
+      zh: '移出成功'
+    },
+    clean_classify_msg: {
+      en: 'Category Cleared Successfully',
+      zh: '清除分类成功'
+    },
+    confirm_logout_msg: {
+      en: 'Are you sure you want to log out?',
+      zh: '确认退出吗?'
     }
   },
   Common: {
@@ -304,6 +328,34 @@ export default {
     copy_excel: {
       en: 'Copy Excel Data',
       zh: '复制excel数据',
+    },
+    switch_to_en_v: {
+      en: 'Switch to English version',
+      zh: '切换英文版',
+    },
+    switch_to_zh_v: {
+      en: 'Switch to Chinese version',
+      zh: '切换中文版',
+    },
+    switch_to_en: {
+      en: 'Switch to English',
+      zh: '切换英文',
+    },
+    switch_to_zh: {
+      en: 'Switch to Chinese',
+      zh: '切换中文',
+    },
+    ya_hei:{
+      en:'Microsoft YaHei',
+      zh:'微软雅黑'
+    },
+    sim_sun:{
+      en:'SimSun',
+      zh:'宋体'
+    },
+    sim_hei:{
+      en:'SimHei',
+      zh:'黑体'
     }
   },
   Edb,

+ 8 - 1
src/lang/modules/DataSources/En.js

@@ -58,6 +58,10 @@ export default {
     step_two:'2. Step Two: Upload data. Click on "Import Data" to upload the completed template and confirm the import. ',
     step_three:'Step Three: Complete the import. If there is any data that failed to import, download ',
     upload_size_msg:'The file size must not exceed 10MB',
+    down_fail_list2: 'Download Failure List',
+
+    col_status_1:'Completed',
+    col_status_2:'Incomplete',
   },
 
   /* 期货数据库页面 */
@@ -101,7 +105,9 @@ export default {
     label_edb_classify:'Affiliated Category',
     ph_edbid:'Indicator ID can not be empty',
     ph_classify:'Affiliated Category can not be empty',
-    add_loading_msg:'The loading time is approximately five minutes; closing the popup will not affect the loading process'
+    add_loading_msg:'The loading time is approximately five minutes; closing the popup will not affect the loading process',
+    add_max_msg: 'The number of additions has reached the upper limit (upper limit 100)!',
+    ph_classify_name: 'Please select a category name',
   },
 
   /* un数据页面 */
@@ -150,6 +156,7 @@ export default {
   /* 上期能源 */
   SqEnergyPage: {
     contranct_code:'Contract Code',
+    product_name:'Product Name',
     col_rank:'Rank',
     col_sname:'Membership Abbreviation',
     col_trade:'Volume (lots)',

+ 7 - 1
src/lang/modules/DataSources/Zh.js

@@ -58,6 +58,10 @@ export default {
     step_two:'2、第二步,上传数据。点击“导入数据”,上传已经填写好的模板,确认导入。',
     step_three:'3、第三步,完成导入。若有导入失败数据,下载',
     upload_size_msg:'文件大小不得超过10M',
+    down_fail_list2: '下载失败列表',
+
+    col_status_1:'完成',
+    col_status_2:'未完成',
   },
 
   /* 期货数据库页面 */
@@ -100,7 +104,9 @@ export default {
     label_edb_classify:'所属分类',
     ph_edbid:'指标ID不能为空',
     ph_classify:'所属分类不能为空',
-    add_loading_msg:'加载时间大概五分钟,关闭弹窗不影响加载'
+    add_loading_msg:'加载时间大概五分钟,关闭弹窗不影响加载',
+    add_max_msg: '添加数量已达上限(上限100)!',
+    ph_classify_name: '请选择分类名称',
   },
 
   /* un数据页面 */

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

@@ -315,7 +315,7 @@ export default {
     },
     dekad: {
       zh:'旬度',
-      en:'Every ten days'
+      en:'Decadal'
     },
     month: {
       zh:'月度',
@@ -325,6 +325,10 @@ export default {
       zh:'季度',
       en:'Quarterly'
     },
+    half_year: {
+      zh:'半年度',
+      en:'Semi-Annual'
+    },
     year: {
       zh:'年度',
       en:'Yearly'

+ 8 - 0
src/lang/modules/EtaChart/commonLang.js

@@ -198,6 +198,14 @@ export default {
     add_mine_success: {
       zh:'已加入我的图库',
       en:'Successfully added to my gallery'
+    },
+    del_classify_chart_msg: {
+      zh:'若删除该分类,则分类下关联的所有图表将被全部删除, 是否继续?',
+      en:'If you delete this category, all charts associated with the category will be deleted. Do you want to continue?'
+    },
+    del_classify_link_msg: {
+      zh:'该图分类已添加节点链接,不允许删除!',
+      en:'This chart category has added node links and cannot be deleted!'
     }
 
 

+ 67 - 0
src/lang/modules/MainApp/En.js

@@ -0,0 +1,67 @@
+/* 主框架 登录 
+  $t('EtaChartPage.xxx')
+*/
+
+export default {
+  MainPage: {
+    help_center: 'Help Center',
+    tab_help_update: 'Update Log',
+    tab_help_docs: 'Help Documentation',
+    tab_reset_pwd: 'Change Password',
+    tab_log_out: 'Log out'
+  },
+
+  /* 修改密码页面 */
+  ResetPwdPage: {
+    label_old_pwd: 'Old Password',
+    label_new_pwd: 'New Password',
+    label_ensure_pwd: 'Confirm New Password',
+    ph_pwd:'Please enter no more than 20 characters',
+    vaild_old:'Please enter the old password',
+    vaild_rule:'Password must be at least 8 characters with numbers, upper/lowercase letters, and symbols',
+    vaild_new:'Please enter confirmation password',
+    vaild_same:'The new password entries do not match; please check them!',
+    edit_pwd_msg:'Password change successful, please log in again!'
+  },
+
+  /* 登录页 */
+  LoginPage: {
+    login_sub_tit: 'Stay half a step ahead of the market in investment research',
+    login_btn: 'Log in',
+    other_login_type: 'Other login methods',
+    login_by_account:'Account login',
+    login_by_mobile:'Mobile phone login',
+    login_by_email:'Email login',
+    ph_account:'Please enter your account',
+    ph_pwd:'Please enter your password',
+    label_remember: 'Remember account and password',
+    vaild_day_msg: 'Valid for 60 days',
+    label_forget: 'Forgot password',
+    error_wrong_msg: 'Incorrect account or password',
+    error_abnormal_msg: 'Account is abnormal, please log in through verification',
+
+    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',
+    ver_code_msg:'Get verification code',
+    recode_ing_msg:'Retrieve Again({count})seconds',
+    recode_msg:'Retrieve Again',
+    vaild_curr_mobile: 'Please enter the correct mobile phone format',
+    vaild_curr_email:'Please enter the correct email format',
+    recode_warn_msg:'To retrieve again, you need to enter the graphic verification code once more',
+    send_code_msg: 'Verification code has been sent',
+
+    ph_new_pwd:"Please enter a new password",
+    label_find_pwd: 'You are retrieving the password for account {name}',
+    label_not_bind:'Not yet bound',
+    send_vaild_btn:'Start verification',
+    step_vaild_one: 'Choose a verification method',
+    step_vaild_two: 'Perform security verification',
+    step_vaild_three: 'Setup a password',
+    reset_pwd_success_msg:'Password reset successful, please log in',
+
+    tab_vaild_phone:'Mobile Phone Verification',
+    tab_vaild_email:'Email Verification',
+  }
+}

+ 67 - 0
src/lang/modules/MainApp/Zh.js

@@ -0,0 +1,67 @@
+/* 主框架 登录 
+  $t('EtaChartPage.xxx')
+*/
+
+export default {
+  MainPage: {
+    help_center: '帮助中心',
+    tab_help_update: '更新日志',
+    tab_help_docs: '帮助文档',
+    tab_reset_pwd: '修改密码',
+    tab_log_out: '退出登录'
+  },
+
+  /* 修改密码页面 */
+  ResetPwdPage: {
+    label_old_pwd: '原密码',
+    label_new_pwd: '新密码',
+    label_ensure_pwd: '确认新密码',
+    ph_pwd:'请输入不超过20个字符',
+    vaild_old:'请输入原密码',
+    vaild_rule:'密码要求8位及以上,包含数字、大写字母、小写字母、特殊字符中的三个类型',
+    vaild_new:'请输入确认密码',
+    vaild_same:'新密码两次输入不一致,请核对!',
+    edit_pwd_msg:'修改密码成功,请重新登录!'
+  },
+
+  /* 登录页 */
+  LoginPage: {
+    login_sub_tit: '让投研领先市场半步',
+    login_btn: '登录',
+    other_login_type: '其他登录方式',
+    login_by_account:'账号登录',
+    login_by_mobile:'手机号登录',
+    login_by_email:'邮箱登录',
+    ph_account:'请输入账号',
+    ph_pwd:'请输入密码',
+    label_remember: '记住账号密码',
+    vaild_day_msg: '有效期60天',
+    label_forget: '忘记密码',
+    error_wrong_msg: '账号或密码错误',
+    error_abnormal_msg: '账号异常,请通过验证登录',
+
+    ph_mobile: '请输入手机号',
+    ph_email:'请输入邮箱',
+    ph_img_code: '请输入图形验证码',
+    ph_msg_code: '请输入短信验证码',
+    ver_code_msg:'获取验证码',
+    recode_ing_msg:'重新获取({count})秒',
+    recode_msg:'重新获取',
+    vaild_curr_mobile: '请输入正确的手机号格式',
+    vaild_curr_email:'请输入正确的邮箱格式',
+    recode_warn_msg:'重新获取需再次输入图形验证码',
+    send_code_msg: '验证码已发送',
+    
+    ph_new_pwd:"请输入新密码",
+    label_find_pwd: '您正在找回账号{name}的密码',
+    label_not_bind:'暂未绑定',
+    send_vaild_btn:'开始验证',
+    step_vaild_one: '选择验证方式',
+    step_vaild_two: '进行安全验证',
+    step_vaild_three: '设置密码',
+    reset_pwd_success_msg:'重置密码成功,请登陆',
+
+    tab_vaild_phone:'手机号验证',
+    tab_vaild_email:'邮箱验证',
+  }
+}

+ 4 - 2
src/lang/modules/MyEta/En.js

@@ -73,8 +73,10 @@ export default {
     no_classify:'This node has not selected a chart category',
 
     //节点名称
-    label_node_name:'节点名称',
+    label_node_name:'Node Name',
     label_label_link:'Node Link',
-    ph_link: 'Please select a node link'
+    ph_link: 'Please select a node link',
+
+    no_graph_msg: 'Please draw canvas content'
   }
 }

+ 3 - 1
src/lang/modules/MyEta/Zh.js

@@ -76,6 +76,8 @@ export default {
     //节点名称
     label_node_name:'节点名称',
     label_label_link:'节点链接',
-    ph_link: '请选择节点链接'
+    ph_link: '请选择节点链接',
+
+    no_graph_msg: '请绘制画布内容'
   }
 }

+ 7 - 0
src/lang/modules/SandboxManage/SandList.js

@@ -16,10 +16,13 @@ export const SandListEn = {
     parent_dir:'Parent directory',
     catalog_name:'Catalog name',
     catalog_name_placeholder:'Please enter the catalog name',
+    catalog_variety_placeholder:'Please select variety',
     associated_variety:'Associated variety',
     logic_diagram_name:"Logic diagram's name",
     delete_attention_msg1:'Logic diagrams exist under this category and cannot be deleted',
     delete_attention_msg2:'Are you sure to delete current category?',
+    add_diagram_msg01:"Please fill in the logic diagram's name",
+    select_categories_msg:'Please select category',
   };
   
   /* 中文 */
@@ -36,10 +39,14 @@ export const SandListEn = {
     parent_dir:'上级目录',
     catalog_name:'目录名称',
     catalog_name_placeholder:'请输入目录名称',
+    catalog_variety_placeholder:'请选择对应品种',
     associated_variety:'关联品种',
     logic_diagram_name:"逻辑图名称",
     delete_attention_msg1:'该分类下存在沙盘图,不可删除',
     delete_attention_msg2:'确定删除当前分类吗?',
+    add_diagram_msg01:'请填写逻辑图名称',
+    select_categories_msg:'请选择所属分类',
+
   };
   
   /**

+ 3 - 3
src/utils/svgToblob.js

@@ -22,15 +22,15 @@
           const data = [new ClipboardItem({ [blob.type]: blob })];
           await navigator.clipboard.write(data).then(
             () => {
-              bus.$message.success('复制成功!')
+              bus.$message.success(/* '复制成功!' */bus.$i18nt.t('MsgPrompt.copy_success_msg'))
             },
             () => {
-              bus.$message.warning('浏览器暂不支持')
+              bus.$message.warning(/* '浏览器暂不支持' */bus.$i18nt.t('MsgPrompt.browser_not_support'))
             }
           );
         })
       }else {
-        bus.$message.warning('当前协议暂不支持,仅支持https协议')
+        bus.$message.warning(/* '当前协议暂不支持,仅支持https协议' */ bus.$i18nt.t('MsgPrompt.http_not_support'))
       }
     }	
  

+ 8 - 20
src/views/Home.vue

@@ -149,7 +149,7 @@
                         margin: 0 9px;
                         font-weight: 700;
                         color: #c0c4cc;
-                        fontsize: 16px;
+                        font-size: 16px;
                       "
                     >/</span>
                     <span
@@ -203,31 +203,22 @@
                   {{item.name}}
                 </el-button>
 
-                <!-- <el-tooltip effect="dark" content="帮助文档" placement="bottom">
-                  <div class="icon-box-item" v-if="isShowRole" @click="toOperation('fingerpost')">
-                    <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" style="color:#333">
-                      <path d="M9.24255 14.5C9.24255 14.0858 9.57834 13.75 9.99255 13.75C10.4068 13.75 10.7426 14.0858 10.7426 14.5C10.7426 14.9142 10.4068 15.25 9.99255 15.25C9.57834 15.25 9.24255 14.9142 9.24255 14.5Z" fill="currentColor"/>
-                      <path d="M9.99261 5.00763C8.32056 5.00763 6.96136 6.36682 6.96136 8.03888H8.21136C8.21136 7.05718 9.01092 6.25763 9.99261 6.25763C10.9743 6.25763 11.7739 7.05718 11.7739 8.03888C11.7739 8.71106 11.2183 9.3851 10.4931 9.67971L10.4899 9.68101C9.82793 9.95419 9.36767 10.6052 9.36767 11.3656V12.5H10.6177V11.3656C10.6177 11.1228 10.7618 10.9216 10.9655 10.837C11.9996 10.4161 13.0239 9.37337 13.0239 8.03888C13.0239 6.36682 11.6647 5.00763 9.99261 5.00763Z" fill="currentColor"/>
-                      <path d="M18.7427 10C18.7427 5.16751 14.8252 1.25 9.99268 1.25C5.16019 1.25 1.24268 5.16751 1.24268 10C1.24267 14.8325 5.16018 18.75 9.99267 18.75C14.8252 18.75 18.7427 14.8325 18.7427 10ZM17.4927 10C17.4927 14.1421 14.1348 17.5 9.99267 17.5C5.85054 17.5 2.49267 14.1421 2.49268 10C2.49268 5.85786 5.85054 2.5 9.99268 2.5C14.1348 2.5 17.4927 5.85787 17.4927 10Z" fill="currentColor"/>
-                    </svg>
-                  </div>
-                </el-tooltip> -->
-                <el-dropdown trigger="click" style="width:130px;" v-if="isUpdateLogShow||isHelpDocShow">
+                <el-dropdown trigger="click" style="width:140px;" v-if="isUpdateLogShow||isHelpDocShow">
                   <span class="el-dropdown-link userinfo-inner help-center-inner">
                     <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" style="color:#333">
                       <path d="M9.24255 14.5C9.24255 14.0858 9.57834 13.75 9.99255 13.75C10.4068 13.75 10.7426 14.0858 10.7426 14.5C10.7426 14.9142 10.4068 15.25 9.99255 15.25C9.57834 15.25 9.24255 14.9142 9.24255 14.5Z" fill="currentColor"/>
                       <path d="M9.99261 5.00763C8.32056 5.00763 6.96136 6.36682 6.96136 8.03888H8.21136C8.21136 7.05718 9.01092 6.25763 9.99261 6.25763C10.9743 6.25763 11.7739 7.05718 11.7739 8.03888C11.7739 8.71106 11.2183 9.3851 10.4931 9.67971L10.4899 9.68101C9.82793 9.95419 9.36767 10.6052 9.36767 11.3656V12.5H10.6177V11.3656C10.6177 11.1228 10.7618 10.9216 10.9655 10.837C11.9996 10.4161 13.0239 9.37337 13.0239 8.03888C13.0239 6.36682 11.6647 5.00763 9.99261 5.00763Z" fill="currentColor"/>
                       <path d="M18.7427 10C18.7427 5.16751 14.8252 1.25 9.99268 1.25C5.16019 1.25 1.24268 5.16751 1.24268 10C1.24267 14.8325 5.16018 18.75 9.99267 18.75C14.8252 18.75 18.7427 14.8325 18.7427 10ZM17.4927 10C17.4927 14.1421 14.1348 17.5 9.99267 17.5C5.85054 17.5 2.49267 14.1421 2.49268 10C2.49268 5.85786 5.85054 2.5 9.99268 2.5C14.1348 2.5 17.4927 5.85787 17.4927 10Z" fill="currentColor"/>
                     </svg>
-                    <span style="line-height: 20px;margin-left: 4px;">帮助中心</span>
+                    <span style="line-height: 20px;margin-left: 4px;"><!-- 帮助中心 -->{{ $t('MainPage.help_center') }}</span>
                     <i class="el-icon-arrow-down el-icon--right" />
                   </span>
                   <el-dropdown-menu slot="dropdown">
                     <el-dropdown-item divided @click.native="toDoc" v-if="isUpdateLogShow"
-                      >更新日志</el-dropdown-item
+                      ><!-- 更新日志 -->{{ $t('MainPage.tab_help_update') }}</el-dropdown-item
                     >
                     <el-dropdown-item divided @click.native="toOperation" v-if="isHelpDocShow"
-                      >帮助文档</el-dropdown-item
+                      ><!-- 帮助文档 -->{{ $t('MainPage.tab_help_docs') }}</el-dropdown-item
                     >
                   </el-dropdown-menu>
                 </el-dropdown>
@@ -247,10 +238,10 @@
                 </span>
                 <el-dropdown-menu slot="dropdown">
                   <el-dropdown-item divided @click.native="resetpwd"
-                    >修改密码</el-dropdown-item
+                    ><!-- 修改密码 -->{{ $t('MainPage.tab_reset_pwd') }}</el-dropdown-item
                   >
                   <el-dropdown-item divided @click.native="logout"
-                    >退出登录</el-dropdown-item
+                    ><!-- 退出登录 -->{{ $t('MainPage.tab_log_out') }}</el-dropdown-item
                   >
                   <!-- <el-dropdown-item divided @click.native="toDoc"
                     >更新日志</el-dropdown-item
@@ -307,9 +298,6 @@ import EventBus from "@/api/bus.js";
 
 import {recordActiveLoginFun,loginEndCalc} from "@/utils/TimeOnPage.js"
 import NotificationMsg from "../components/notificationMsg.vue";
-import langEN from 'element-ui/lib/locale/lang/en'
-import langZH from 'element-ui/lib/locale/lang/zh-CN'
-import locale from 'element-ui/lib/locale'
 export default {
   components: {
     PwdDlg,
@@ -810,7 +798,7 @@ export default {
     logout() {
       //退出登录
       var that = this;
-      this.$confirm("确认退出吗?", "提示", {
+      this.$confirm(/* "确认退出吗?" */this.$t('MsgPrompt.confirm_logout_msg'), this.$t('Dialog.warn_tit'), {
         type: "warning",
       })
         .then(() => {

+ 115 - 100
src/views/Login.vue

@@ -64,39 +64,32 @@
 					>
 				</el-form-item>
 			</el-form>  -->
+
+            <el-radio-group v-model="lang" @input="changeLang" class="lang-wrapper">
+                <el-radio-button label="zh">中文版</el-radio-button>
+                <el-radio-button label="en">英文版</el-radio-button>
+            </el-radio-group>
+
 			<div class="login-box" id="login-container" v-if="activeModel!=='forgetPassModel'">
                 <div class="fixed-login-cont">
                     <span class="login-title">{{ loginTitle }}</span>
-                    <span class="login-sub-title">ETA — 让投研领先市场半步</span>
+                    <span class="login-sub-title">ETA — {{ $t('LoginPage.login_sub_tit') }}<!-- 让投研领先市场半步 --></span>
                     <el-tabs v-model="activeModel" >
-                        <!-- <el-tab-pane label="账号登录" name="ordinaryModel">
-                            <OrdinaryModel ref="ordinaryModel"
-                                :loginCheck="loginCheck"
-                                :accountCheck="accountCheck"
-                                @clearnHint="clearnHint"
-                                @changeModel="changeModel('forgetPassModel')"
-                            />
-                        </el-tab-pane>
-                        <el-tab-pane label="手机号登录" name="mobileModel">
-                            <MobileModel ref="mobileModel"
-                                :areaCode="areaCode"
-                            />
-                        </el-tab-pane> -->
 
                         <OrdinaryModel ref="ordinaryModel"
                             :loginCheck="loginCheck"
                             :accountCheck="accountCheck"
                             @clearnHint="clearnHint"
                             @changeModel="changeModel('forgetPassModel')"
-                            v-show="activeModel=='ordinaryModel'"
+                            v-if="activeModel=='ordinaryModel'"
                         />
 
                         <MobileModel ref="mobileModel"
                             :areaCode="areaCode"
-                            v-show="activeModel=='mobileModel'"
+                            v-if="activeModel=='mobileModel'"
                         />
 
-                        <EmailModel ref="emailModel" v-show="activeModel=='emailModel'"/>
+                        <EmailModel ref="emailModel" v-if="activeModel=='emailModel'"/>
                     </el-tabs>
                     <el-button
                         type="primary"
@@ -104,11 +97,11 @@
                         @click.native="handleLogin"
                         :loading="logining"
                         class="submit_btn"
-                        >登录</el-button>
+                        ><!-- 登录 -->{{ $t('LoginPage.login_btn') }}</el-button>
                     <div class="another-login-type">
                         <div class="another-type-hint">
                             <div class="type-hint-line"></div>
-                            <div class="type-hint-text">其他登录方式</div>
+                            <div class="type-hint-text"><!-- 其他登录方式 -->{{ $t('LoginPage.other_login_type') }}</div>
                             <div class="type-hint-line"></div>
                         </div>
                         <div class="another-type">
@@ -121,7 +114,6 @@
                             <div v-html="item.svg"></div>
                             {{item.label}}
                             </div>
-                                <!-- <img src="~@/assets/img/icons/email-login-type.png" @click="activeModel='emailModel';handleClick({name:'emailModel'})" /> -->
                         </div>
                     </div>
                 </div>
@@ -149,12 +141,12 @@
 			@close="isCheckDialogShow = false"
 			>
 			<el-tabs v-model="checkActiveModel" @tab-click="handleClick">
-				<el-tab-pane label="手机号验证" name="checkMobileModel">
+				<el-tab-pane :label="$t('LoginPage.tab_vaild_phone')" name="checkMobileModel">
 						<MobileModel ref="checkMobileModel"
 							:areaCode="areaCode"
 						/>
 					</el-tab-pane>
-					<el-tab-pane label="邮箱验证" name="checkEmailModel">
+					<el-tab-pane :label="$t('LoginPage.tab_vaild_email')" name="checkEmailModel">
 						<EmailModel ref="checkEmailModel"/>
 					</el-tab-pane>
 			</el-tabs>
@@ -162,7 +154,7 @@
 				<el-button 
 					type="primary" 
 					:loading="checkLogining"
-					@click="submitCheck">提 交</el-button>
+					@click="submitCheck"><!-- 提 交 -->{{ $t('Dialog.submit_btn') }}</el-button>
 			</span>
 		</el-dialog>
 	</div>
@@ -180,6 +172,88 @@ import OrdinaryModel from "./login_manage/OrdinaryModel.vue";
 
 export default {
     components: { OrdinaryModel, MobileModel, EmailModel, ForgetPassModel },
+    computed: {
+        lang() {
+            return this.$i18n.locale
+        },
+         /* 登录方式icon */
+        loginTypeIcons(){
+          return  [
+                    {
+                        name: 'ordinaryModel',
+                        label: /* '账号登录'  */this.$t('LoginPage.login_by_account'),
+                        svg: `<svg data-v-5b948168="" width="64" height="64" viewBox="0 0 60 64" fill="none" xmlns="http://www.w3.org/2000/svg"><g filter="url(#filter0_d_6575_1450)">
+                            <circle cx="26" cy="25" r="20" fill="white"></circle>
+                            <circle cx="26" cy="25" r="19.75" stroke="#DCDFE6" stroke-width="0.5"></circle>
+                            </g>
+                            <g clip-path="url(#clip0_6575_1450)">
+                            <path d="M30.9555 24.9201C29.6869 26.0392 28.0029 26.7261 26.1469 26.7261C24.2634 26.7261 22.5516 26.0169 21.2775 24.8647C18.3137 25.6402 16.48 28.2883 16.48 31.4516V33.0637C16.48 36.8364 35.5204 36.8364 35.5204 33.0637V31.4516C35.5203 28.3716 33.7809 25.7678 30.9555 24.9201ZM26.1469 25.5794C29.4321 25.5794 32.1023 23.0144 32.1023 19.8457C32.1023 16.677 29.4376 14.1064 26.1469 14.1064C22.8673 14.1064 20.1972 16.677 20.1972 19.8457C20.1972 23.0145 22.8673 25.5794 26.1469 25.5794Z" fill="#0052D9"></path>
+                            </g>
+                            <defs>
+                            <filter id="filter0_d_6575_1450" x="0" y="0" width="52" height="52" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                            <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                            <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                            <feOffset dy="1"></feOffset>
+                            <feGaussianBlur stdDeviation="3"></feGaussianBlur>
+                            <feComposite in2="hardAlpha" operator="out"></feComposite>
+                            <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                            <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1450"></feBlend>
+                            <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1450" result="shape"></feBlend>
+                            </filter>
+                            <clipPath id="clip0_6575_1450">
+                            <rect width="24" height="24" fill="white" transform="translate(14 13)"></rect>
+                            </clipPath>
+                            </defs></svg>`
+                    },
+                    {
+                        name:'mobileModel',
+                        label: /* '手机号登录' */this.$t('LoginPage.login_by_mobile'),
+                        svg: `<svg data-v-5b948168="" width="64" height="64" viewBox="0 0 56 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+                            <g filter="url(#filter0_d_6575_1430)">
+                            <circle cx="26" cy="25" r="20" fill="white"></circle>
+                            <circle cx="26" cy="25" r="19.75" stroke="#DCDFE6" stroke-width="0.5"></circle>
+                            </g>
+                            <path d="M31.7982 13.6985H19.7718C18.6414 13.6985 17.7246 14.6153 17.7246 15.7457V34.2977C17.7246 35.4281 18.6414 36.3449 19.7718 36.3449H24.8262H27.6366H31.7982C32.9286 36.3449 33.8454 35.4281 33.8454 34.2977V15.7457C33.8454 14.6153 32.9286 13.6985 31.7982 13.6985ZM23.8038 15.1577H27.7662C27.963 15.1577 28.1238 15.3185 28.1238 15.5153C28.1238 15.7121 27.963 15.8729 27.7662 15.8729H23.8038C23.607 15.8729 23.4462 15.7121 23.4462 15.5153C23.4462 15.3185 23.607 15.1577 23.8038 15.1577ZM25.7862 33.9689C24.9894 33.9689 24.3438 33.3233 24.3438 32.5265C24.3438 31.7297 24.9894 31.0841 25.7862 31.0841C26.583 31.0841 27.2286 31.7297 27.2286 32.5265C27.2262 33.3233 26.5806 33.9689 25.7862 33.9689ZM32.3478 28.6337C32.3478 28.9169 32.1198 29.1449 31.8366 29.1449H19.7334C19.4502 29.1449 19.2222 28.9169 19.2222 28.6337V17.7377C19.2222 17.4545 19.4502 17.2265 19.7334 17.2265H31.8342C32.1174 17.2265 32.3454 17.4545 32.3454 17.7377V28.6337H32.3478Z" fill="#0052D9"></path>
+                            <defs>
+                            <filter id="filter0_d_6575_1430" x="0" y="0" width="52" height="52" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                            <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                            <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                            <feOffset dy="1"></feOffset>
+                            <feGaussianBlur stdDeviation="3"></feGaussianBlur>
+                            <feComposite in2="hardAlpha" operator="out"></feComposite>
+                            <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                            <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1430"></feBlend>
+                            <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1430" result="shape"></feBlend>
+                            </filter>
+                            </defs></svg>`
+                    },
+                    {
+                        name: 'emailModel',
+                        label: /* '邮箱登录' */this.$t('LoginPage.login_by_email'),
+                        svg: `
+                            <svg data-v-5b948168="" width="64" height="64" viewBox="0 4 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+                            <g filter="url(#filter0_d_6575_1422)">
+                            <circle cx="32" cy="30" r="20" fill="white"></circle>
+                            <circle cx="32" cy="30" r="19.5" stroke="#DCDFE6"></circle>
+                            </g>
+                            <path d="M41.1382 34.9875C41.1382 37.1966 39.3473 38.9875 37.1382 38.9875H26.8774C24.6683 38.9875 22.8774 37.1966 22.8774 34.9875V28.1164C22.8774 26.864 23.464 25.6839 24.4623 24.9278L31.3139 19.7381C31.517 19.5832 31.7594 19.5 32.0078 19.5C32.2562 19.5 32.4986 19.5832 32.7017 19.7381L39.5533 24.9278C40.5516 25.6839 41.1382 26.864 41.1382 28.1164V34.9875Z" fill="#0052D9"></path>
+                            <path d="M38.682 26.5957C38.682 27.0061 38.4316 27.3751 38.0501 27.5266L33.4963 29.3353C32.5408 29.7148 31.4758 29.7119 30.5224 29.327L25.956 27.4837C25.5853 27.334 25.3425 26.9743 25.3425 26.5745C25.3425 26.033 25.7815 25.594 26.323 25.594H37.6803C38.2335 25.594 38.682 26.0425 38.682 26.5957Z" fill="white"></path>
+                            <defs>
+                            <filter id="filter0_d_6575_1422" x="0" y="0" width="64" height="64" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                            <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                            <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                            <feOffset dy="2"></feOffset>
+                            <feGaussianBlur stdDeviation="6"></feGaussianBlur>
+                            <feComposite in2="hardAlpha" operator="out"></feComposite>
+                            <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                            <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1422"></feBlend>
+                            <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1422" result="shape"></feBlend>
+                            </filter>
+                            </defs></svg>`
+                    },
+                  ]
+        } 
+    },
     data() {
         return {
             b: new http.Base64(),
@@ -219,81 +293,6 @@ export default {
             isCheckDialogShow:false,
             checkActiveModel:'checkMobileModel',
             
-            /* 登录方式icon */
-            loginTypeIcons: [
-                {
-                    name: 'ordinaryModel',
-                    label: '账号登录',
-                    svg: `<svg data-v-5b948168="" width="64" height="64" viewBox="0 0 60 64" fill="none" xmlns="http://www.w3.org/2000/svg"><g filter="url(#filter0_d_6575_1450)">
-                        <circle cx="26" cy="25" r="20" fill="white"></circle>
-                        <circle cx="26" cy="25" r="19.75" stroke="#DCDFE6" stroke-width="0.5"></circle>
-                        </g>
-                        <g clip-path="url(#clip0_6575_1450)">
-                        <path d="M30.9555 24.9201C29.6869 26.0392 28.0029 26.7261 26.1469 26.7261C24.2634 26.7261 22.5516 26.0169 21.2775 24.8647C18.3137 25.6402 16.48 28.2883 16.48 31.4516V33.0637C16.48 36.8364 35.5204 36.8364 35.5204 33.0637V31.4516C35.5203 28.3716 33.7809 25.7678 30.9555 24.9201ZM26.1469 25.5794C29.4321 25.5794 32.1023 23.0144 32.1023 19.8457C32.1023 16.677 29.4376 14.1064 26.1469 14.1064C22.8673 14.1064 20.1972 16.677 20.1972 19.8457C20.1972 23.0145 22.8673 25.5794 26.1469 25.5794Z" fill="#0052D9"></path>
-                        </g>
-                        <defs>
-                        <filter id="filter0_d_6575_1450" x="0" y="0" width="52" height="52" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
-                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
-                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
-                        <feOffset dy="1"></feOffset>
-                        <feGaussianBlur stdDeviation="3"></feGaussianBlur>
-                        <feComposite in2="hardAlpha" operator="out"></feComposite>
-                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
-                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1450"></feBlend>
-                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1450" result="shape"></feBlend>
-                        </filter>
-                        <clipPath id="clip0_6575_1450">
-                        <rect width="24" height="24" fill="white" transform="translate(14 13)"></rect>
-                        </clipPath>
-                        </defs></svg>`
-                },
-                {
-                    name:'mobileModel',
-                    label: '手机号登录',
-                    svg: `<svg data-v-5b948168="" width="64" height="64" viewBox="0 0 56 64" fill="none" xmlns="http://www.w3.org/2000/svg">
-                        <g filter="url(#filter0_d_6575_1430)">
-                        <circle cx="26" cy="25" r="20" fill="white"></circle>
-                        <circle cx="26" cy="25" r="19.75" stroke="#DCDFE6" stroke-width="0.5"></circle>
-                        </g>
-                        <path d="M31.7982 13.6985H19.7718C18.6414 13.6985 17.7246 14.6153 17.7246 15.7457V34.2977C17.7246 35.4281 18.6414 36.3449 19.7718 36.3449H24.8262H27.6366H31.7982C32.9286 36.3449 33.8454 35.4281 33.8454 34.2977V15.7457C33.8454 14.6153 32.9286 13.6985 31.7982 13.6985ZM23.8038 15.1577H27.7662C27.963 15.1577 28.1238 15.3185 28.1238 15.5153C28.1238 15.7121 27.963 15.8729 27.7662 15.8729H23.8038C23.607 15.8729 23.4462 15.7121 23.4462 15.5153C23.4462 15.3185 23.607 15.1577 23.8038 15.1577ZM25.7862 33.9689C24.9894 33.9689 24.3438 33.3233 24.3438 32.5265C24.3438 31.7297 24.9894 31.0841 25.7862 31.0841C26.583 31.0841 27.2286 31.7297 27.2286 32.5265C27.2262 33.3233 26.5806 33.9689 25.7862 33.9689ZM32.3478 28.6337C32.3478 28.9169 32.1198 29.1449 31.8366 29.1449H19.7334C19.4502 29.1449 19.2222 28.9169 19.2222 28.6337V17.7377C19.2222 17.4545 19.4502 17.2265 19.7334 17.2265H31.8342C32.1174 17.2265 32.3454 17.4545 32.3454 17.7377V28.6337H32.3478Z" fill="#0052D9"></path>
-                        <defs>
-                        <filter id="filter0_d_6575_1430" x="0" y="0" width="52" height="52" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
-                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
-                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
-                        <feOffset dy="1"></feOffset>
-                        <feGaussianBlur stdDeviation="3"></feGaussianBlur>
-                        <feComposite in2="hardAlpha" operator="out"></feComposite>
-                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
-                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1430"></feBlend>
-                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1430" result="shape"></feBlend>
-                        </filter>
-                        </defs></svg>`
-                },
-                {
-                    name: 'emailModel',
-                    label: '邮箱登录',
-                    svg: `
-                        <svg data-v-5b948168="" width="64" height="64" viewBox="0 4 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
-                        <g filter="url(#filter0_d_6575_1422)">
-                        <circle cx="32" cy="30" r="20" fill="white"></circle>
-                        <circle cx="32" cy="30" r="19.5" stroke="#DCDFE6"></circle>
-                        </g>
-                        <path d="M41.1382 34.9875C41.1382 37.1966 39.3473 38.9875 37.1382 38.9875H26.8774C24.6683 38.9875 22.8774 37.1966 22.8774 34.9875V28.1164C22.8774 26.864 23.464 25.6839 24.4623 24.9278L31.3139 19.7381C31.517 19.5832 31.7594 19.5 32.0078 19.5C32.2562 19.5 32.4986 19.5832 32.7017 19.7381L39.5533 24.9278C40.5516 25.6839 41.1382 26.864 41.1382 28.1164V34.9875Z" fill="#0052D9"></path>
-                        <path d="M38.682 26.5957C38.682 27.0061 38.4316 27.3751 38.0501 27.5266L33.4963 29.3353C32.5408 29.7148 31.4758 29.7119 30.5224 29.327L25.956 27.4837C25.5853 27.334 25.3425 26.9743 25.3425 26.5745C25.3425 26.033 25.7815 25.594 26.323 25.594H37.6803C38.2335 25.594 38.682 26.0425 38.682 26.5957Z" fill="white"></path>
-                        <defs>
-                        <filter id="filter0_d_6575_1422" x="0" y="0" width="64" height="64" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
-                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
-                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
-                        <feOffset dy="2"></feOffset>
-                        <feGaussianBlur stdDeviation="6"></feGaussianBlur>
-                        <feComposite in2="hardAlpha" operator="out"></feComposite>
-                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
-                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1422"></feBlend>
-                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1422" result="shape"></feBlend>
-                        </filter>
-                        </defs></svg>`
-                },
-            ],
             recordInformation:[],
             loginTitle:''
         };
@@ -467,14 +466,18 @@ export default {
                 }
             })
         },
-        ordinaryModelLogin(){
+        async ordinaryModelLogin(){
             const {account,checkPass,checked} = this.$refs.ordinaryModel.form
             const t=new Date().getTime()
             const md5key='MiQM9yusNA9T2uIH'
+            // 校验一下是不是域用户
+            let IsLdap=false
+            const checkRes=await departInterence.checkUserIsLdap({UserName:account})
+            if(checkRes.Ret===200&&checkRes.Data) IsLdap=true
             departInterence.userLogin({
                 LoginType:1,
                 Username:account,
-                Password: `${md5.hex_md5(md5.hex_md5(checkPass)+md5key+t)}`,
+                Password: IsLdap?this.b.encode(checkPass+md5key):`${md5.hex_md5(md5.hex_md5(checkPass)+md5key+t)}`,
                 ReqTime:`${t}`
             }).then(res=>{
                 //this.logining = false
@@ -513,6 +516,7 @@ export default {
             departInterence.userLogin({
                 LoginType:2,
                 Mobile:mobile,
+                TelAreaCode:this.$refs[model].areaCodeSelect,
                 VerifyCode:checkCode
             }).then(res=>{
                 if(res.Ret!==200){
@@ -618,6 +622,11 @@ export default {
                     }
                 }
             }
+        },
+
+        changeLang(val) {
+            this.$i18n.locale = val
+            localStorage.setItem('i18n',this.$i18n.locale)
         }
     },
     destroyed() {
@@ -857,5 +866,11 @@ export default {
 			font-size: 14px;
 		}
 	}
+
+    .lang-wrapper {
+        position: absolute;
+        top: 3%;
+        right: 3%;
+    }
 }
 </style>

+ 12 - 5
src/views/chartFrame_manage/frameEditor.vue

@@ -117,7 +117,7 @@ export default {
                 return this.$message.warning(/* "请输入框架名称" */this.$t('ChartFramePage.ph_search'))
             }
             if(!this.$refs.container.graph.toJSON().cells.length){
-                return this.$message.warning('请绘制画布内容');
+                return this.$message.warning(/* '请绘制画布内容' */this.$t('ChartFrameEditorPage.no_graph_msg'));
             }
 
             this.lockLoding = this.$loading({
@@ -141,22 +141,29 @@ export default {
                 this.frameDetail.FrameworkImg = Data.ResourceUrl||''
             }
             //获取框架节点和内容
-            this.frameDetail.Nodes = this.$refs.container.getContentNodes()
+            const Nodes = this.$refs.container.getContentNodes() //与frameDetail.Nodes的结构不同
             this.frameDetail.FrameworkContent = JSON.stringify(this.$refs.container.graph.toJSON())
             if(this.frameId){
                 //edit
-                chartFrameInterface.editFrame({...this.frameDetail,...{ChartFrameworkId:Number(this.frameId)}}).then(res=>{
+                chartFrameInterface.editFrame({
+                    ...this.frameDetail,
+                    ChartFrameworkId:Number(this.frameId),
+                    Nodes,
+                }).then(res=>{
                     this.lockLoding.close();
                     if(res.Ret!==200) return 
                     this.$message.success(/* "编辑成功" */this.$t('MsgPrompt.edit_msg'))
                 })
             }else{
                 //add 
-                chartFrameInterface.addFrame(this.frameDetail).then(res=>{
+                chartFrameInterface.addFrame({
+                    ...this.frameDetail,
+                    Nodes,
+                }).then(res=>{
                     this.lockLoding.close();
                     if(res.Ret!==200) return 
                     this.frameId = res.Data?res.Data.ChartFrameworkId:0
-                    this.frameDetail = res.Data||{FrameworkName:'',FrameworkContent:''}
+                    this.frameDetail = res.Data||{FrameworkName:'',FrameworkContent:'',Nodes:[]}
                     this.$message.success(/* "新增成功" */ this.$t('MsgPrompt.add_msg'))
                     //切换至编辑页
                     this.$router.replace({path:'/editframe',query:{frameId:this.frameId}})

+ 2 - 2
src/views/chartFrame_manage/index.vue

@@ -188,7 +188,7 @@
             <div class="dialog-container">
                 <div>
                     <span style="margin-right:5px;"><!-- 框架名称 -->{{$t('ChartFramePage.label_frame_name')}}</span>
-                    <el-input v-model.trim="modifyFrame.FrameworkName" placeholder="请输入框架名称"></el-input>
+                    <el-input v-model.trim="modifyFrame.FrameworkName" :placeholder="$t('ChartFramePage.ph_search')"></el-input>
                 </div>
             </div>
             <div class="dialog-footer">
@@ -520,7 +520,7 @@ export default {
         },
         renameFrame(){
             if(!this.modifyFrame.FrameworkName.length){
-                this.$message.warning("请输入框架名称")
+                this.$message.warning(/* "请输入框架名称" */this.$t('ChartFramePage.ph_search'))
                 return
             }
             chartFrameInterface.reNameFrame({

+ 2 - 0
src/views/chartRelevance_manage/components/chartCard.vue

@@ -125,6 +125,8 @@ export default {
       switch(data.ChartInfo.Source) {//1曲线 
         case 1:
           this.chartInfo = data.ChartInfo;
+          //初始化上下限
+          this.setLimitData(data.EdbInfoList)
           this.setDefaultChart(data.EdbInfoList);
           break
         case 3: //3相关性 

+ 6 - 2
src/views/chartRelevance_manage/components/explainText.js

@@ -53,7 +53,9 @@ export const statisticFeatureListTextArr = [
     `<p style='font-weight:bold;'>标准差处理逻辑:</p>
     <p>计算所选时间范围内数据的样本标准差s,s=sqrt(((x1-x)^2 (x2-x)^2 ......(xn-x)^2)/(n-1)),n表示数据个数</p>`,
     `<p style='font-weight:bold;'>百分位处理逻辑:</p>
-    <p>对所选时间范围内的数据,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不计算</p>`,
+    <p>1、数据个数百分位算法:数据区间第一个(较远日期)和最后一个数据点(较近日期)分别为 (T1,S1),(T2,S2)。T代表时间。S代表对应的值;N=T1到T2时间段指标数据个数。n=小于等于S2的数据个数。个数百分位=(n-1)/(N-1) ,N=1时不计算。</p>
+    <p>2、数据区间百分位算法:对所选时间范围内的数据,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不计算
+    </p>`,
     `<p style='font-weight:bold;'>频率分布处理逻辑:</p>
     <p>1、在所选时间范围内,取最大值和最小值;</p>
     <p>2、根据频段数划分多个间距相同的区间(左闭右开,最后一个区间为左闭右闭),统计数据值落在每个区间的数据个数;</p>
@@ -75,7 +77,9 @@ export const statisticFeatureListTextArrEn = [
 //跨品种分析
 export const crossVarietyAnalisisTextArr = [
     `<p style="font-weight:bold;">一、处理逻辑</p>
-    <p>1、百分位计算公式:对所选时间范围内的数据,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不计算</p>
+    <p>1、百分位计算公式:</p>
+    <p>(1)数据个数百分位算法:数据区间第一个(较远日期)和最后一个数据点(较近日期)分别为 (T1,S1),(T2,S2)。T代 表时间。S代表对应的值。 N=T1到T2时间段指标数据个数。n=小于等于S2的数据个数。个数百分位=(n-1)/(N-1) ,N=1时不计算。</p>
+    <p>(2)数据区间百分位算法:对所选时间范围内的数据,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不计算</p>
     <p>2、取值方式:</p>
     <p>(1)通过“选择日期”和“时间长度”,时间范围为“选择日期”至选择的日期往过去推“时间长度”,在这个时间段找出指标最大值和最小值,进行百分位计算。</p>
     <p>(2)若在(1)的时间范围下找不到值,则继续往过去找,直到找到值。</p>

+ 7 - 5
src/views/chartRelevance_manage/crossVarietyAnalysis/chartEditor.vue

@@ -298,11 +298,13 @@ export default {
       this.chartInfo = ChartInfo;
       this.tableData = EdbInfoList;
       this.crossVarietyChartData = DataResp;
+
+      /* 历史数据chartInfo里全是空 兼容下历史数据不崩 */
       this.chartLimit = {
-        min: DataResp.YMinValue,
-        max: DataResp.YMaxValue ,
-        x_min: DataResp.XMinValue,
-        x_max: DataResp.XMaxValue,
+        min: ChartInfo.LeftMin?Number(ChartInfo.LeftMin):Number(DataResp.YMinValue),
+        max: ChartInfo.LeftMax?Number(ChartInfo.LeftMax):Number(DataResp.YMaxValue),
+        x_min: ChartInfo.XMin?Number(ChartInfo.XMin):Number(DataResp.XMinValue),
+        x_max: ChartInfo.XMax?Number(ChartInfo.XMax):Number(DataResp.XMaxValue),
       }
 
       this.setCrossVarietyChart()
@@ -576,7 +578,7 @@ export default {
     overflow-x: auto;
     .chart-min-cont {
       background: #fff;
-      min-width: 880px;
+      min-width: 900px;
       height: calc(100vh - 118px);
       overflow-y: auto;
       display: flex;

+ 68 - 5
src/views/chartRelevance_manage/crossVarietyAnalysis/components/chartFormSection.vue

@@ -29,6 +29,29 @@
           />
         </el-select>
       </el-form-item>
+      <el-form-item label="百分位" prop="PercentType">
+        <el-select
+          v-model="form.PercentType"
+          style="width: 240px"
+          placeholder="请选择"
+          @change="changeParams"
+        >
+          <el-option
+            v-for="item in percentOptions"
+            :key="item.val"
+            :label="item.label"
+            :value="item.val"
+          />
+        </el-select>
+        <el-tooltip effect="dark" placement="right">
+          <div
+            slot="content"
+            v-html="tips.percent"
+            style="line-height: 20px;width:300px"
+          ></div>
+          <i class="el-icon-question" style="color: #666" />
+        </el-tooltip>
+      </el-form-item>
       <el-form-item :label="$t('StatisticAnalysis.CrossVarietyChart.x_axis')" prop="TagX">
         <el-select
           v-model="form.TagX"
@@ -41,6 +64,7 @@
             :key="item.ChartTagId"
             :label="item.ChartTagName"
             :value="item.ChartTagId"
+            :disabled="item.ChartTagId===form.TagY"
           />
         </el-select>
       </el-form-item>
@@ -56,6 +80,7 @@
             :key="item.ChartTagId"
             :label="item.ChartTagName"
             :value="item.ChartTagId"
+            :disabled="item.ChartTagId===form.TagX"
           />
         </el-select>
       </el-form-item>
@@ -75,7 +100,7 @@
         <li class="date-li" v-for="(item,index) in form.DateConfigList" :key="index">
           <el-select
             v-model="item.DateType"
-            style="width: 150px"
+            style="width: 140px"
             placeholder="请选择"
             @change="changeParams"
           >
@@ -96,6 +121,21 @@
             @change="(val) => {item.Num = Number(val);changeParams()}"
           />
 
+          <el-date-picker
+            v-model="item.FixDate"
+            v-else-if="item.DateType===3"
+            value-format="yyyy-MM-dd"
+            type="date"
+            placeholder="选择日期"
+            style="width: 150px"
+            @change="changeParams"
+          />
+
+          <span>
+            <i class="el-icon-view" v-if="item.ShowTips===1" @click="()=>{item.ShowTips=item.ShowTips===1?0:1;changeParams()}"/>
+            <img :src="$icons.no_view" v-else style="width:24px;height:24px" @click="()=>{item.ShowTips=item.ShowTips===1?0:1;changeParams()}">
+          </span>
+
           <el-button type="text" v-if="index===0" @click="addDateHandle">
             <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 -2 16 16" fill="none">
               <path d="M5.23966 8.48046H7.51966V10.7605C7.51966 10.8265 7.57366 10.8805 7.63966 10.8805H8.35966C8.42566 10.8805 8.47966 10.8265 8.47966 10.7605V8.48046H10.7597C10.8257 8.48046 10.8797 8.42646 10.8797 8.36046V7.64046C10.8797 7.57446 10.8257 7.52046 10.7597 7.52046H8.47966V5.24046C8.47966 5.17446 8.42566 5.12046 8.35966 5.12046H7.63966C7.57366 5.12046 7.51966 5.17446 7.51966 5.24046V7.52046H5.23966C5.17366 7.52046 5.11966 7.57446 5.11966 7.64046V8.36046C5.11966 8.42646 5.17366 8.48046 5.23966 8.48046Z" fill="#0052D9"/>
@@ -139,6 +179,7 @@ export default {
       return [
         { label: this.$t('StatisticAnalysis.CrossVarietyChart.latest_date')||'最新日期',val: 1 },
         { label: this.$t('StatisticAnalysis.CrossVarietyChart.n_day_before')||'N天前',val: 2 },
+        { label: '固定日期',val: 3 },
       ]
     }
   },
@@ -147,12 +188,13 @@ export default {
       form: {
         ChartName:'',
         Source: 10,
+        PercentType: 1,
         CalculateValue: 6,
         CalculateUnit: '月',
         TagX: '',
         TagY: '',
         DateConfigList: [
-          { DateType: 1,Num: 0 },
+          { DateType: 1,Num: 0,FixDate:'',ShowTips: 1 },
         ],
       },
       // unitOpt: [
@@ -167,6 +209,15 @@ export default {
       //   { label: '最新日期',val: 1 },
       //   { label: 'N天前',val: 2 },
       // ]
+
+      percentOptions: [
+        { label: '数据个数',val: 1 },
+        { label: '数据区间',val: 0 },
+      ],
+      tips: {
+        'percent':`1、数据个数百分位算法:数据区间第一个(较远日期)和最后一个数据点(较近日期)分别为 (T1,S1),(T2,S2)。T代表时间。S代表对应的值,N=T1到T2时间段指标数据个数。n=小于等于S2的数据个数。个数百分位=(n-1)/(N-1) ,N=1时不计算。<br>
+        2、数据区间百分位算法:对所选时间范围内的数据,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不计算`
+      }
     };
   },
   methods: {
@@ -174,21 +225,25 @@ export default {
       if(this.form.DateConfigList.length === 5) return this.$message.warning('日期数量已达上限')
 
       this.form.DateConfigList.push({
-        DateType: 1,Num: 1
+        DateType: 1,Num: 1,FixDate:'',ShowTips: 1
       })
       
       this.changeParams()
     },
 
     initData(data) {
-      const { ChartName,CalculateValue,CalculateUnit,TagX,TagY,DateConfigList } = data;
+      const { ChartName,CalculateValue,CalculateUnit,TagX,TagY,DateConfigList,PercentType } = data;
       this.form = {
         ChartName,
         CalculateValue,
         CalculateUnit,
         TagX,
         TagY,
-        DateConfigList
+        DateConfigList: DateConfigList.map(_ =>({
+          ..._,
+          ShowTips: _.ShowTips || 0
+        })),
+        PercentType: PercentType||0
       }
     },
 
@@ -219,6 +274,14 @@ export default {
       align-items: center;
       gap: 10px;
       margin-bottom: 20px;
+      .el-icon-view {
+        width: 24px;
+        height: 24px;
+        line-height: 24px;
+        text-align: center;
+        font-size: 20px;
+        color: #409EFF;
+      }
     }
   }
 }

+ 72 - 4
src/views/chartRelevance_manage/crossVarietyAnalysis/list.vue

@@ -143,6 +143,54 @@
 											height="500px"
 											ref="chartRef"
 										/>
+										<!-- 上下限 -->
+										<template>	
+											<div class="range-cont left">
+												<el-input
+													style="width: 60px; display: block"
+													size="mini"
+													type="number"
+													:min="0"
+													:max="100"
+													placeholder="上限"
+													v-model="chartLimit.max"
+													@change="changeLimit"
+												/>
+												<el-input
+													class="min-data-input"
+													size="mini"
+													type="number"
+													:min="0"
+													:max="100"
+													placeholder="下限"
+													v-model="chartLimit.min"
+													@change="changeLimit"
+												/>
+											</div>
+											<!-- x轴上下限 -->
+											<div class="range-cont bottom" > 
+												<el-input
+													class="left"
+													size="mini"
+													type="number"
+													:min="0"
+													:max="100"
+													placeholder="下限"
+													v-model="chartLimit.x_min"
+													@change="changeLimit"
+												/>
+												<el-input
+													class="left"
+													size="mini"
+													type="number"
+													:min="0"
+													:max="100"
+													placeholder="上限"
+													v-model="chartLimit.x_max"
+													@change="changeLimit"
+												/>
+											</div>
+										</template>
                   </div>
                   <span class="chart-author">{{$t('MsgPrompt.author')}}:{{ chartInfo.SysUserRealName}}</span>
                 </div>
@@ -158,6 +206,7 @@
 									@copyChartConfirm="copyChartConfirm"
 									@addMychartHandle="addMychartHandle"
 									@refreshHandle="refreshHandle"
+									@saveChartHandle="saveChartHandle"
 									@saveChartOtherHandle="saveChartOtherHandle"
 									@editChartHandle="editChartHandle"
 									@openEnNameDia="openEnNameDia"
@@ -415,6 +464,23 @@ export default {
       }
 		},
 
+		/* 保存上下限 */
+		async saveChartHandle() {
+			let { min,max,x_min,x_max } = this.chartLimit;
+      let params = {
+        ChartInfoId: this.chartInfo.ChartInfoId,
+        XMin: String(x_min),
+				XMax: String(x_max),
+				LeftMin: String(min),
+				LeftMax: String(max),
+      }
+			let res = await crossVarietyInterface.saveChart(params);
+
+			if(res.Ret !== 200) return
+
+			this.$message.success('保存成功')
+		},
+
 		/* 获取图表列表 */
 		getPublicList() {
 			crossVarietyInterface.getChartList({
@@ -453,11 +519,13 @@ export default {
 				this.chartInfo = ChartInfo;
 				this.tableData = EdbInfoList;
 				this.crossVarietyChartData = DataResp;
+
+				/* 历史数据chartInfo里全是空 兼容下历史数据不崩 */
 				this.chartLimit = {
-					min: DataResp.YMinValue,
-					max: DataResp.YMaxValue ,
-					x_min: DataResp.XMinValue,
-					x_max: DataResp.XMaxValue,
+					min: ChartInfo.LeftMin?Number(ChartInfo.LeftMin):Number(DataResp.YMinValue),
+					max: ChartInfo.LeftMax?Number(ChartInfo.LeftMax):Number(DataResp.YMaxValue),
+					x_min: ChartInfo.XMin?Number(ChartInfo.XMin):Number(DataResp.XMinValue),
+					x_max: ChartInfo.XMax?Number(ChartInfo.XMax):Number(DataResp.XMaxValue),
 				}
 
 				this.setCrossVarietyChart()

+ 16 - 2
src/views/chartRelevance_manage/css/index.scss

@@ -77,6 +77,7 @@ $normal-font: 14px;
         padding: 30px 20px;
         max-height: calc(100vh - 280px);
         overflow: auto;
+        margin-right: 20px;
       }
       .target_tree {
         color: #333;
@@ -136,7 +137,7 @@ $normal-font: 14px;
           margin-bottom: 20px;
 
           .chart-show-cont {
-            padding: 0 160px 0 100px;
+            padding: 0 160px 50px 120px;
             position: relative;
             min-height: 400px;
             .chart-title {
@@ -162,7 +163,7 @@ $normal-font: 14px;
                   display: block;
                 }
                 &.left {
-                  left: -80px;
+                  left: -70px;
                 }
                 &.right {
                   right: -65px;
@@ -170,6 +171,19 @@ $normal-font: 14px;
                 &.rightTwo {
                   right: -130px;
                 }
+                &.bottom {
+                  width: 100%;
+                  display: flex;
+                  justify-content: space-between;
+                  top: auto;
+                  right: 0;
+                  bottom: -4%;
+                  .left {
+                    width: 60px;
+                    display: block;
+                    flex-shrink: 0;
+                  }
+                }
               }
             }
           }

+ 34 - 1
src/views/chartRelevance_manage/statistic/statisticFeatureChartEditor.vue

@@ -108,6 +108,29 @@
               <i class="el-icon-question" style="color: #666" />
             </el-tooltip> -->
           </div>
+          <div class="section-item">
+            <span style="flex-shrink:0;min-width:70px">百分位:</span>
+            <el-select
+              v-model="chartInfo.Percentile.PercentType"
+              style="width: 120px"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in percentOptions"
+                :key="item.val"
+                :label="item.label"
+                :value="item.val"
+              />
+            </el-select>
+            <el-tooltip effect="dark" placement="right">
+              <div
+                slot="content"
+                v-html="tips.percent"
+                style="line-height: 20px;width:300px"
+              ></div>
+              <i class="el-icon-question" style="color: #666" />
+            </el-tooltip>
+          </div>
           <div class="section-item">
             <span style="flex-shrink:0;min-width:70px">{{$t('StatisticAnalysis.StatisticFeatureChart.time_length')}}:</span>
             <el-input
@@ -372,7 +395,8 @@ export default {
         },
         Percentile: {
           CalculateValue: 0,
-          CalculateUnit: '天'
+          CalculateUnit: '天',
+          PercentType: 1
         },
         FrequencyDistribution: {
           DateType: 1,
@@ -405,6 +429,15 @@ export default {
         FrequencyDistribution: `在所选时间范围内,取最大值和最小值,根据频段数划分多个间距相同的区间(左闭右开,最后一个区间为左闭右闭),统计数据值落在每个区间的数据个数,频率=落在某区间数据个数/所选时间段内数据总个数,累计频率为从最小值所在区间对应的频率开始累加。`
       },
 
+      percentOptions: [
+        { label: '数据个数',val: 1 },
+        { label: '数据区间',val: 0 },
+      ],
+      tips: {
+        'percent':`1、数据个数百分位算法:数据区间第一个(较远日期)和最后一个数据点(较近日期)分别为 (T1,S1),(T2,S2),T代表时间,S代表对应的值。个数百分位=(n-1)/(N-1) ,N=1时不计算, N=T1到T2时间段指标数据个数,n=小于等于S2的数据个数。<br>
+        2、数据区间百分位算法:对所选时间范围内的数据,取最大值Max,最小值Min,计算Max-Min,百分位=(现值-Min)/(Max-Min),Max=Min时不计算`
+      },
+
       /* 图表入库 */
       isSaveChartToBase: false,
       saveSource:0,//图表位置1 2 3 4

+ 83 - 4
src/views/dataEntry_manage/addChart.vue

@@ -412,7 +412,7 @@
 							</h2>
 
 							<Chart :options="options" :chartInfo="chartInfo" ref="chartRef"/>
-							<div class="range-cont left" v-if="leftIndex != -1">
+							<!-- <div class="range-cont left" v-if="leftIndex != -1">
 								<el-input
 									style="width: 60px; display: block"
 									size="mini"
@@ -444,7 +444,6 @@
 									v-model="tableData[rightIndex].MinData"
 								/>
 							</div>
-							<!-- 右2上下限设置 -->
 							<div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
 								<el-input
 									style="width: 60px; display: block"
@@ -460,7 +459,65 @@
 									placeholder="下限"
 									v-model="tableData[rightTwoIndex].MinData"
 								/>
-							</div>
+							</div> -->
+							<!-- 需求:曲线图、堆积柱状图、组合图加入新指标时上下限自动调整 -->
+							<template v-if="![7,10,11].includes(chartInfo.ChartType)">
+								<div class="range-cont left" v-if="leftIndex !== -1">
+									<el-input
+										style="width: 60px; display: block"
+										size="mini"
+										type="number"
+										placeholder="上限"
+										v-model="chartLimit.max"
+										@change="changeLimit"
+									/>
+									<el-input
+										class="min-data-input"
+										size="mini"
+										type="number"
+										placeholder="下限"
+										v-model="chartLimit.min"
+										@change="changeLimit"
+									/>
+								</div>
+								<div class="range-cont right" v-if="rightIndex !== -1">
+									<el-input
+										style="width: 60px; display: block"
+										size="mini"
+										type="number"
+										placeholder="上限"
+										v-model="chartLimit.rightMax"
+										@change="changeLimit"
+									/>
+									<el-input
+										class="min-data-input"
+										size="mini"
+										type="number"
+										placeholder="下限"
+										v-model="chartLimit.rightMin"
+										@change="changeLimit"
+									/>
+								</div>
+								<!-- 右2上下限设置 -->
+								<div class="range-cont rightTwo" v-if="rightTwoIndex !== -1">
+									<el-input
+										style="width: 60px; display: block"
+										size="mini"
+										type="number"
+										placeholder="上限"
+										v-model="chartLimit.rightTwoMax"
+										@change="changeLimit"
+									/>
+									<el-input
+										class="min-data-input"
+										size="mini"
+										type="number"
+										placeholder="下限"
+										v-model="chartLimit.rightTwoMin"
+										@change="changeLimit"
+									/>
+								</div>
+							</template>
 
 							<!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
 							<template v-if="[7,10,11].includes(chartInfo.ChartType)">	
@@ -719,7 +776,7 @@ export default {
 					}else {
 						//拼接标题
 						this.chartInfo.ChartName =  this.sameOptionType.includes(this.chartInfo.ChartType) ? newval.map((item,index) => index === newval.length-1 ? item.EdbName : `${item.EdbName}和`).join('') : `${newval[0].EdbName}季节性`;
-	
+						this.EdbAxisChange()
 						this.setAddChartDefault();
 						this.setChartOptionHandle(newval);
 					}
@@ -794,6 +851,13 @@ export default {
 							MinData: Number(item.MinData)
 						})
 					)
+					let hasLimitChange = false
+					//需检测上下限是否修改
+					if(![7,10,11].includes(this.chartInfo.ChartType)){
+						const limitSame= this.getLimitInfo()
+						hasLimitChange = !limitSame
+					}
+					
 					if(![10,11].includes(this.chartInfo.ChartType)){
 						//每个数据转换需要检测是否合法
 						for(let i=0;i<db_arr.length;i++){
@@ -852,6 +916,21 @@ export default {
 								EndDate: this.year_select === 5 ? this.select_date[1] : '',
 							} 
 						: typePrams
+					if(![7,10,11].includes(this.chartInfo.ChartType)){
+						const {
+							min,max,rightMin,rightMax,rightTwoMin,rightTwoMax
+						} = this.chartLimit
+						params = {
+							...params,
+							LeftMin:min+'',
+							LeftMax:max+'',
+							RightMin:rightMin+'',
+							RightMax:rightMax+'',
+							Right2Min:rightTwoMin+'',
+							Right2Max:rightTwoMax+'',
+							MinMaxSave:Number(hasLimitChange)
+						}
+					}
 					dataBaseInterface.chartAdd(params).then(res => {
 						if(res.Ret !== 200) return;
 							this.setChartImage(res.Data);

+ 91 - 10
src/views/dataEntry_manage/chartSetting.vue

@@ -27,8 +27,8 @@
             @click="$router.push({path: '/addchart'})" type="primary"
           ><!-- 添加图表 -->{{$t('Chart.add_chart_btn')}}</el-button>
 
-          <!-- <change-lang v-permission="permissionBtn.chartLibPermission.chartLib_switchEn"
-            :lang="currentLang" @changeLang="changeLanguage" style="margin-left: 10px;"/> -->
+          <change-lang v-permission="permissionBtn.chartLibPermission.chartLib_switchEn"
+            :lang="currentLang" @changeLang="changeLanguage" style="margin-left: 10px;"/>
 
         </div>
         
@@ -388,7 +388,7 @@
 
                     <Chart :options="options" :chartInfo="chartInfo" ref="chartRef"/>
 
-                    <div class="range-cont left" v-if="leftIndex != -1">
+                   <!--  <div class="range-cont left" v-if="leftIndex != -1">
                       <el-input
                         style="width: 60px; display: block"
                         size="mini"
@@ -427,8 +427,6 @@
                         v-model="tableData[rightIndex].MinData"
                       />
                     </div>
-
-                    <!-- 右2上下限设置 -->
                     <div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
                       <el-input
                         style="width: 60px; display: block"
@@ -446,7 +444,72 @@
                         :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
                         v-model="tableData[rightTwoIndex].MinData"
                       />
+                    </div> -->
+                    <template v-if="![7,10,11].includes(chartInfo.ChartType)">
+                        <div class="range-cont left" v-if="leftIndex != -1">
+                            <el-input
+                                style="width: 60px; display: block"
+                                size="mini"
+                                type="number"
+                                placeholder="上限"
+                                :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                                v-model="chartLimit.max"
+                                @change="changeLimit"
+                            />
+                            <el-input
+                                class="min-data-input"
+                                size="mini"
+                                type="number"
+                                placeholder="下限"
+                                :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                                v-model="chartLimit.min"
+                                @change="changeLimit"
+                            />
+                        </div>
+                    <div 
+                      class="range-cont right" 
+                      v-if="rightIndex != -1"
+                    >
+                      <el-input
+                        style="width: 60px; display: block"
+                        size="mini"
+                        type="number"
+                        placeholder="上限"
+                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                        v-model="chartLimit.rightMax"
+                        @change="changeLimit"
+                      />
+                      <el-input
+                        class="min-data-input"
+                        size="mini"
+                        type="number"
+                        placeholder="下限"
+                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                        v-model="chartLimit.rightMin"
+                        @change="changeLimit"
+                      />
                     </div>
+                    <div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
+                      <el-input
+                        style="width: 60px; display: block"
+                        size="mini"
+                        type="number"
+                        placeholder="上限"
+                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                        v-model="chartLimit.rightTwoMax"
+                        @change="changeLimit"
+                      />
+                      <el-input
+                        class="min-data-input"
+                        size="mini"
+                        type="number"
+                        placeholder="下限"
+                        :disabled="!permissionBtn.isShowBtn('chartLibPermission','chartLib_editLimit')"
+                        v-model="chartLimit.rightTwoMin"
+                        @change="changeLimit"
+                      />
+                    </div>
+                    </template>
 
                     <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
                     <template v-if="[7,10,11].includes(chartInfo.ChartType)">	
@@ -788,7 +851,6 @@ import {
   copyOtherOptions
 } from '@/utils/defaultOptions';
 import { chartSetMixin } from './mixins/chartPublic'
-
 import mPage from '@/components/mPage';
 import Chart from './components/chart';
 import chartDialog from './components/chartDialog';
@@ -1410,8 +1472,8 @@ export default {
       }).then((res) => {
         if (res.Ret === 200) {
           this.$message.success('移动成功!');
-          this.getTreeData();
         }
+        this.getTreeData();
       });
 		},
 
@@ -1594,6 +1656,9 @@ export default {
 			this.setDefaultSourceFrom();
   
       this.tableData = res.Data.EdbInfoList;
+      //初始化上下限
+      this.setLimitData(this.tableData)
+        
       // 设置起始日期和最新日期
       this.setExtremumDate()
 
@@ -1851,7 +1916,22 @@ export default {
               EndDate: this.year_select === 5 ? this.select_date[1] : '',
             }
           : typeChartParam;
-
+        if(![7,10,11].includes(this.selected_chartType)){
+            const {
+                min,max,rightMin,rightMax,rightTwoMin,rightTwoMax
+            } = this.chartLimit
+            params = {
+                ...params,
+                LeftMin:min+'',
+                LeftMax:max+'',
+                RightMin:rightMin+'',
+                RightMax:rightMax+'',
+                Right2Min:rightTwoMin+'',
+                Right2Max:rightTwoMax+'',
+                //手动保存视为更改过上下限
+                MinMaxSave:1
+            }
+        }
         dataBaseInterface.chartSave(params).then((res) => {
           if (res.Ret === 200) {
             // this.$message.success('保存成功');
@@ -2682,9 +2762,9 @@ export default {
     }
     .chartSetting_main {
       /* display: flex; */
-      div::-webkit-scrollbar {
+      /* div::-webkit-scrollbar {
         width: 5px !important;
-      }
+      } */
       .slide-icon {
         padding: 20px 0;
         /* display: block; */
@@ -2729,6 +2809,7 @@ export default {
           padding: 15px 20px 30px;
           overflow: auto;
           max-height: calc(100vh - 330px);
+          margin-right: 20px;
         }
         .target_tree {
           font-size: 14px;

+ 7 - 4
src/views/dataEntry_manage/coal/index.vue

@@ -526,8 +526,10 @@ export default {
     }
   }
   .el-tree-node__content {
-    // min-height: 26px;
-    // white-space: normal;
+    min-height: 26px;
+    height: auto;
+    white-space: normal;
+    margin-bottom: 5px;
   }
 }
 </style>
@@ -552,9 +554,9 @@ export default {
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
   }
-  div::-webkit-scrollbar {
+  /* div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
     min-width: 250px;
     width:250px;
@@ -569,6 +571,7 @@ export default {
       /* margin-top: 20px; */
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .classify-item {
         font-size: 14px;
         color: #666;

+ 30 - 12
src/views/dataEntry_manage/components/addTarget.vue

@@ -84,7 +84,7 @@
 								class="inline-input"
 								v-model="formData.unit"
 								:fetch-suggestions="querySearchUnit"
-								placeholder="请填写单位"
+								:placeholder="$t('Edb.InputHolderAll.input_unit')"
 								suffix-icon="el-icon-arrow-down"
 								style="width: 321px;"
 							></el-autocomplete>
@@ -190,13 +190,34 @@ import {dataInterence} from 'api/api.js';
 					],
 				},
 				frequencyArr: [
-					{ label:'日度',value:'日度' },
-					{ label:'周度',value:'周度' },
-					{ label:'旬度',value:'旬度' },
-					{ label:'月度',value:'月度' },
-					{ label:'季度',value:'季度' },
-					{ label:'半年度',value:'半年度' },
-					{ label:'年度',value:'年度' },
+					{
+						value: '日度',
+						label: /* '日度'  */this.$t('Edb.FreAll.day'),
+					},
+					{
+						value: '周度',
+						label: /* '周度' */this.$t('Edb.FreAll.week'),
+					},
+					{
+						value: '旬度',
+						label: /* '旬度' */this.$t('Edb.FreAll.dekad'),
+					},
+					{
+						value: '月度',
+						label: /* '月度' */this.$t('Edb.FreAll.month'),
+					},
+					{
+						value: '季度',
+						label: /* '季度' */ this.$t('Edb.FreAll.quarter'),
+					},
+					{
+						value: '半年度',
+						label: /* '半年度' */ this.$t('Edb.FreAll.month'),
+					},
+					{
+						value: '年度',
+						label: /* '年度' */ this.$t('Edb.FreAll.year'),
+					}
 				],
 				weeksArr: [
 					{ label:'周一',value:'周一' },
@@ -360,10 +381,7 @@ import {dataInterence} from 'api/api.js';
 								NoticeTime:notice_time
 							}).then(res => {
 								if(res.Ret === 200) {
-									this.$message({
-										message: '新增指标成功!',
-										type: 'success'
-									});
+									this.$message.success(this.$t('MsgPrompt.add_msg'));
 									this.$emit('addOver',this.formData.type)
 									// // 重置分类id
 									// this.classify_id = sessionStorage.getItem('default_id') || '';

+ 3 - 3
src/views/dataEntry_manage/components/changeLang.vue

@@ -1,11 +1,11 @@
 <template>
   <div class="changeLang-box" >
     <div class="changeLang-item" @click="changeLang">
-      <el-button type="primary" v-if="showButton">{{lang==='ch'?'切换英文版':'切换中文版'}}</el-button>
+      <el-button type="primary" v-if="showButton">{{lang==='ch'?$t('Common.switch_to_en_v'):$t('Common.switch_to_zh_v')}}</el-button>
       <template v-else>
         <img src="../../../assets/img/icons/changeLang.png" />
-        <span v-show="lang=='en'">切换中文</span>
-        <span v-show="lang=='ch'">切换英文</span>
+        <span v-show="lang=='en'"><!-- 切换中文 -->{{ $t('Common.switch_to_zh') }}</span>
+        <span v-show="lang=='ch'"><!-- 切换英文 -->{{ $t('Common.switch_to_en') }}</span>
 
       </template>
     </div>

+ 33 - 21
src/views/dataEntry_manage/components/editTarget.vue

@@ -76,7 +76,7 @@
 								class="inline-input"
 								v-model="formData.unit"
 								:fetch-suggestions="querySearchUnit"
-								placeholder="请填写单位"
+								:placeholder="$t('Edb.InputHolderAll.input_unit')"
 								suffix-icon="el-icon-arrow-down"
 								style="width: 321px;"
 							></el-autocomplete>
@@ -193,13 +193,34 @@ import {dataInterence} from 'api/api.js';
 					],
 				},
 				frequencyArr: [
-					{ label:'日度',value:'日度' },
-					{ label:'周度',value:'周度' },
-					{ label:'旬度',value:'旬度' },
-					{ label:'月度',value:'月度' },
-					{ label:'季度',value:'季度' },
-					{ label:'半年度',value:'半年度' },
-					{ label:'年度',value:'年度' },
+					{
+						value: '日度',
+						label: /* '日度'  */this.$t('Edb.FreAll.day'),
+					},
+					{
+						value: '周度',
+						label: /* '周度' */this.$t('Edb.FreAll.week'),
+					},
+					{
+						value: '旬度',
+						label: /* '旬度' */this.$t('Edb.FreAll.dekad'),
+					},
+					{
+						value: '月度',
+						label: /* '月度' */this.$t('Edb.FreAll.month'),
+					},
+					{
+						value: '季度',
+						label: /* '季度' */ this.$t('Edb.FreAll.quarter'),
+					},
+					{
+						value: '半年度',
+						label: /* '半年度' */ this.$t('Edb.FreAll.month'),
+					},
+					{
+						value: '年度',
+						label: /* '年度' */ this.$t('Edb.FreAll.year'),
+					}
 				],
 				weeksArr: [
 					{ label:'周一',value:'周一' },
@@ -306,10 +327,7 @@ import {dataInterence} from 'api/api.js';
 										OldCreateDate:this.old_date
 									}).then(res => {
 										if(res.Ret === 200) {
-											this.$message({
-												message: '录入成功',
-												type: 'success'
-											});
+											this.$message.success(this.$t('MsgPrompt.entry_msg'));
 											this.$emit('editDataOver')
 										}else {
 											this.$message({
@@ -319,7 +337,7 @@ import {dataInterence} from 'api/api.js';
 										}
 									})
 								}else if(res.Data.Status==1) {
-									this.$confirm('该日期已存在数据值'+res.Data.Close+',确认修改?','提示',{
+									this.$confirm('该日期已存在数据值'+res.Data.Close+',确认修改?',this.$t('Dialog.warn_tit'),{
 										type:'warning'
 									}).then(() => {
 										//编辑数据
@@ -330,10 +348,7 @@ import {dataInterence} from 'api/api.js';
 											OldCreateDate:this.old_date
 										}).then(res => {
 											if(res.Ret === 200) {
-												this.$message({
-													message: '修改成功',
-													type: 'success'
-												});
+												this.$message.success(this.$t('MsgPrompt.edit_msg'));
 												this.$emit('editDataOver')
 											}else {
 												this.$message({
@@ -379,10 +394,7 @@ import {dataInterence} from 'api/api.js';
 								NoticeTime:notice_time
 							}).then(res => {
 								if(res.Ret === 200) {
-									this.$message({
-										message: '修改成功',
-										type: 'success'
-									});
+									this.$message.success(this.$t('MsgPrompt.edit_msg'));
 									this.$emit('editDataOver',1)
 								}else if(res.Ret!=403){
 									this.$message({

+ 8 - 0
src/views/dataEntry_manage/css/baseTargetPage.scss

@@ -19,4 +19,12 @@
             margin-left: 0 !important;
         }
     }
+    .word-wrap{
+        .el-tree-node__content {
+            min-height: 26px;
+            height: auto;
+            white-space: normal;
+            margin-bottom: 5px;
+          }
+    }
 }

+ 3 - 2
src/views/dataEntry_manage/css/coalCommon.scss

@@ -19,9 +19,9 @@
     border-radius: 4px;
     box-sizing: border-box;
   }
-  div::-webkit-scrollbar {
+  /* div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
     min-width: 240px;
     width:240px;
@@ -36,6 +36,7 @@
       margin-top: 20px;
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .classify-item {
         font-size: 14px;
         color: #666;

+ 4 - 4
src/views/dataEntry_manage/dataEntry.vue

@@ -107,12 +107,12 @@
                       <span
                         v-if="data[item] === '未完成'"
                         style="color: #ff0000"
-                        >{{ data[item] }}</span
+                        >{{ $t('ManualEntryPage.col_status_2') }}</span
                       >
                       <span
                         v-else-if="data[item] === '完成'"
                         style="color: #4ac526"
-                        >{{ data[item] }}</span
+                        >{{$t('ManualEntryPage.col_status_1')}}</span
                       >
                       <span v-else>{{ data[item] }}</span>
                     </template>
@@ -1180,9 +1180,9 @@ export default {
       padding: 0 10px;
       height: calc(100% - 176px);
       overflow-y: scroll;
-      &::-webkit-scrollbar {
+      /* &::-webkit-scrollbar {
         width: 0px !important;
-      }
+      } */
       .classify-item {
         text-align: left;
         font-size: 15px;

+ 12 - 2
src/views/dataEntry_manage/databaseComponents/addTargetDiaBase.vue

@@ -21,6 +21,13 @@
 							</el-option>
 						</el-select>
 					</div>
+
+					<!-- 路透增加频度选择 -->
+					<el-select v-model="rtrFromFrequency" placeholder="请选择频度" v-if="fromType==='路透'">
+						<el-option :label="item" :value="item"
+						v-for="item in frequencyArr" :key="item"></el-option>
+					</el-select>
+
 					<el-input v-show="isCompanyCode" :placeholder="$t('EtaBasePage.complany_pholder')" v-model="search_company_txt" style="maxWidth:340px;"
 						@keyup.enter.native="searchHandle" :disabled="haveResult" clearable>
 						<i slot="prefix" class="el-input__icon el-icon-search"></i>
@@ -304,7 +311,8 @@ export default {
 			THSIndexCodeTypeArr:[
 				{value:1,label:this.$t('EtaBasePage.future_common_edb')},
 				{value:2,label:this.$t('EtaBasePage.stock_common_edb')}
-			]
+			],
+			rtrFromFrequency:frequencyArr[0],//路透频度
 		};
 	},
 	watch:{
@@ -334,6 +342,7 @@ export default {
 			this.indexCodeSelected=[]
 			this.THSIndexCodeType=1
 			this.isCompanyCode = false;
+			this.rtrFromFrequency=frequencyArr[0]
 		},
 		cancelHandle() {
 			this.init();
@@ -375,7 +384,8 @@ export default {
 				dataBaseInterface.getTarget({
 					Source: Number(this.fromCode.get(this.fromType)),
 					EdbCode: this.search_txt,
-					CompanyCode: this.search_company_txt
+					CompanyCode: this.search_company_txt,
+					Frequency: this.rtrFromFrequency
 				}).then(res => {
 					if (res.Ret === 200) {
 						this.haveResult = false;

+ 10 - 6
src/views/dataEntry_manage/databaseList.vue

@@ -17,8 +17,12 @@
 			</div>
 			<div class="top-right">
 
-				<!-- <change-lang v-permission="permissionBtn.edbDataPermission.edbData_switchEn"
-					:lang="currentLang" style="height: 32px;" @changeLang="changeLanguage"/> -->
+				<change-lang 
+					v-permission="permissionBtn.edbDataPermission.edbData_switchEn"
+					:lang="currentLang" 
+					style="height: 32px;" 
+					@changeLang="changeLanguage"
+				/>
 
 				<el-select
 					v-model="search_txt"
@@ -422,7 +426,7 @@
 			<ul class="computed-ul">
 				<li
 					:class="['cpmputed-li',item.type === computed_type?'act':'']" 
-					v-for="item in computedTypes" 
+					v-for="item in computedShowTypes" 
 					:key="item.type" 
 					@click="changeComputedType(item.type)">
 					{{item.name}}
@@ -2222,9 +2226,9 @@ export default {
 		position:relative;
 		width:100%;
 		overflow-x: auto;
-		div::-webkit-scrollbar {
+		/* div::-webkit-scrollbar {
 			width: 5px !important;
-		}
+		} */
 		.main-left {
 			width: 400px;
 			min-width: 300px;
@@ -2238,7 +2242,7 @@ export default {
 			position: relative;
 			box-sizing: border-box;
 			.tree-cont {
-				padding: 30px 0 30px 30px;
+				padding: 30px;
 				/* height: calc(100vh - 290px);
 				overflow: auto; */
 			}

+ 85 - 5
src/views/dataEntry_manage/editChart.vue

@@ -418,7 +418,7 @@
 								{{ chartInfo.ChartName }}
 							</h2>
 							<Chart :options="options" :chartInfo="chartInfo" ref="chartRef" />
-							<div class="range-cont left" v-if="leftIndex != -1">
+							<!-- <div class="range-cont left" v-if="leftIndex != -1">
 								<el-input
 									style="width: 60px; display: block"
 									size="mini"
@@ -450,7 +450,6 @@
 									v-model="tableData[rightIndex].MinData"
 								/>
 							</div>
-							<!-- 右2上下限设置 -->
 							<div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
 								<el-input
 									style="width: 60px; display: block"
@@ -466,7 +465,65 @@
 									placeholder="下限"
 									v-model="tableData[rightTwoIndex].MinData"
 								/>
-							</div>
+							</div> -->
+							<!-- 需求:曲线图、堆积柱状图、组合图加入新指标时上下限自动调整 -->
+							<template v-if="![7,10,11].includes(chartInfo.ChartType)">
+								<div class="range-cont left" v-if="leftIndex !== -1">
+									<el-input
+										style="width: 60px; display: block"
+										size="mini"
+										type="number"
+										placeholder="上限"
+										v-model="chartLimit.max"
+										@change="changeLimit"
+									/>
+									<el-input
+										class="min-data-input"
+										size="mini"
+										type="number"
+										placeholder="下限"
+										v-model="chartLimit.min"
+										@change="changeLimit"
+									/>
+								</div>
+								<div class="range-cont right" v-if="rightIndex !== -1">
+									<el-input
+										style="width: 60px; display: block"
+										size="mini"
+										type="number"
+										placeholder="上限"
+										v-model="chartLimit.rightMax"
+										@change="changeLimit"
+									/>
+									<el-input
+										class="min-data-input"
+										size="mini"
+										type="number"
+										placeholder="下限"
+										v-model="chartLimit.rightMin"
+										@change="changeLimit"
+									/>
+								</div>
+								<!-- 右2上下限设置 -->
+								<div class="range-cont rightTwo" v-if="rightTwoIndex !== -1">
+									<el-input
+										style="width: 60px; display: block"
+										size="mini"
+										type="number"
+										placeholder="上限"
+										v-model="chartLimit.rightTwoMax"
+										@change="changeLimit"
+									/>
+									<el-input
+										class="min-data-input"
+										size="mini"
+										type="number"
+										placeholder="下限"
+										v-model="chartLimit.rightTwoMin"
+										@change="changeLimit"
+									/>
+								</div>
+							</template>
 
 							<!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
 							<template v-if="[7,10,11].includes(chartInfo.ChartType)">	
@@ -680,7 +737,6 @@ import { dataBaseInterface } from '@/api/api.js';
 import { chartSetMixin } from './mixins/chartPublic';
 import {unitArr} from '@/utils/defaultOptions.js'
 import addOrEditMixn from './mixins/addOreditMixin';
-
 import Chart from './components/chart';
 import DateChooseDia from './components/DateChooseDia';
 import SaveChartOther from './components/SaveChartOther';
@@ -728,6 +784,7 @@ export default {
 						//雷达图
 						this.chartInfo.ChartType === 11 && this.$refs.BarOptRef && this.$refs.BarOptRef.getBarData();
 					}else {
+						this.EdbAxisChange()
 						this.setAddChartDefault();
 						newval.length && !this.chartInfo.WarnMsg && this.setChartOptionHandle(newval);
 					}
@@ -809,6 +866,8 @@ export default {
 					this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
 					
 					this.getThemeList();
+					//初始化上下限
+					this.setLimitData(this.tableData)
 
         });
 		},
@@ -903,6 +962,13 @@ export default {
 							MinData: Number(item.MinData)
 						})
 					)
+					
+					let hasLimitChange = Boolean(this.chartInfo.MinMaxSave)
+					//需检测上下限是否修改
+					if(![7,10,11].includes(this.chartInfo.ChartType)&&!this.chartInfo.MinMaxSave){
+						const limitSame= this.getLimitInfo()
+						hasLimitChange = !limitSame
+					}
 					if(![10,11].includes(this.chartInfo.ChartType)){
 						//每个数据转换需要检测是否合法
 						for(let i=0;i<db_arr.length;i++){
@@ -968,7 +1034,21 @@ export default {
 							height: 230,
 						}
 					});
-
+					if(![7,10,11].includes(this.chartInfo.ChartType)){
+						const {
+							min,max,rightMin,rightMax,rightTwoMin,rightTwoMax
+						} = this.chartLimit
+						params = {
+							...params,
+							LeftMin:min+'',
+							LeftMax:max+'',
+							RightMin:rightMin+'',
+							RightMax:rightMax+'',
+							Right2Min:rightTwoMin+'',
+							Right2Max:rightTwoMax+'',
+							MinMaxSave:Number(hasLimitChange)
+						}
+					}
 					dataBaseInterface.chartEdit(params).then(res => {
 						if(res.Ret !== 200) return;
 						

+ 100 - 8
src/views/dataEntry_manage/mixins/addOreditMixin.js

@@ -82,6 +82,7 @@ export default {
 			sourceEditForm: {
 
 			},
+
 			updateData:[],
 			useUnit:''
 		}
@@ -153,6 +154,8 @@ export default {
 
 				//共用结构的类型切换可以直接画图
 				if(![7,10,11].includes(newval)) {
+					//初始化上下限
+					this.setLimitData(this.tableData)
 					//单指标允许切换到季节图需药重新请求数据
 					this.tableData.length===1 && this.selectTarget(this.tableData[0],'switch');
 					this.tableData.length > 1 && this.setChartOptionHandle(this.tableData);
@@ -183,7 +186,7 @@ export default {
 			}
 			//如果类型为对数,检测数据是否包含负数
 			if(ConvertType===3){
-				if(!this.checkEdbData(this.tableData[index].DataList)){
+				if(!this.checkEdbData(this.tableData[index].DataList||[])){
 					this.updateData[index].IsConvert = false
 					return this.$message.warning("指标数据含有负数或0,无法进行对数运算")
 				}
@@ -242,9 +245,22 @@ export default {
 			}
 		},
 		checkEdbData(data){
-			const ValueArr = data.map(i=>(i.Value||0))
-			const minData = Math.min(...ValueArr)
-			return minData>0
+			//季节性图要遍历data 取下一层的DataList
+			if(this.chartInfo.ChartType===2){
+				let minDataArr = []
+				data.forEach(d=>{
+					const DataList = d.DataList||[]
+					const ValueArr = DataList.map(i=>(i.Value||0))
+					const minData = Math.min(...ValueArr)
+					minDataArr.push(minData)
+				})
+				return Math.min(...minDataArr)>0
+			}else{
+				//其他图
+				const ValueArr = data.map(i=>(i.Value||0))
+				const minData = Math.min(...ValueArr)
+				return minData>0
+			}
 		},
 		/* 选择指标 获取指标详情并push到表格中*/
 		selectTarget(item,type='') {
@@ -314,6 +330,8 @@ export default {
 									text: sourceStr
 								});
 							}
+							//新增指标后,检测上下限变化,修改上下限
+							this.EdbAxisChange()
 
 							this.$nextTick(()=>{
 								// 等待 tableData的 监听里面的获取到 起始时间和最近日期
@@ -579,7 +597,14 @@ export default {
 			this.dateForm = {};
 			this.dateTip = /* '请选择时间段' */ this.$t('Chart.choose_time');
 			this.barDateList = [];
-      this.chartLimit = {};
+			this.chartLimit = {
+				min:'', //左轴上下限
+				max:'',
+				rightMin:'',//右轴上下限
+				rightMax:'',
+				rightTwoMin:'',//右二轴上下限
+				rightTwoMax:'',
+			};
       this.sectionScatterData = {};
 
 			this.$nextTick(()=>{
@@ -661,9 +686,10 @@ export default {
 		delTarget(item) {
 			let index = this.tableData.findIndex(obj => obj.EdbInfoId === item.EdbInfoId);
 			this.tableData.splice(index, 1);
-			// this.$message.success('删除成功')
+			this.updateData.splice(index, 1)
 			this.$message.success(this.$t('MsgPrompt.delete_msg'))
-
+			//删除指标时,检测上下限,修改上下限
+			this.EdbAxisChange()
 			//添加图表时重置默认样式
 			this.$route.path==='/addchart' && this.resetChartEdbDefault();
 			
@@ -1037,6 +1063,72 @@ export default {
 				...JSON.parse(this.chartInfo.SourcesFrom),
 				isShow:this.chartInfo.SourcesFromVisable
 			})
-		}
+		},
+		/* 图表轴发生变化:增加/删除指标,改变指标左右轴*/
+		EdbAxisChange(){
+			//若用户没有修改过,则计算y轴的上下限
+			if(!this.chartInfo.MinMaxSave){
+				this.calcYAxislimit(this.tableData)
+			}else{
+				//若用户修改过,则检测轴的上下限是否为空,若为空,则需要计算对应轴的上下限
+				this.checkChartLimit(this.tableData)
+			}
+		},
+		//新增/编辑保存图表时-判断用户有没有手动更改过上下限
+		getLimitInfo(){
+			//散点图单独处理
+			if(this.chartInfo.ChartType===5){
+				if(this.tableData[1]){
+					const {min,max} = this.chartLimit
+					return Number(max)===Number(this.tableData[1].MaxData)
+					&& Number(min)===Number(this.tableData[1].MinData)
+				}
+				return false
+			}
+			const leftData = this.tableData.filter(i=>i.IsAxis===1).map(i=>[Number(i.MinData),Number(i.MaxData)])
+			const rightData = this.tableData.filter(i=>!i.IsAxis).map(i=>[Number(i.MinData),Number(i.MaxData)])
+			const rightTwoData = this.tableData.filter(i=>i.IsAxis===2).map(i=>[Number(i.MinData),Number(i.MaxData)])
+			let leftLimitSame=true,rightLimitSame=true,rightTwoLimitSame=true
+			const {
+				min,max,rightMin,rightMax,rightTwoMin,rightTwoMax
+			} = this.chartLimit
+			//若每个轴的最大值和最小值不一致,则认为是更改过
+			if(leftData.length){
+				const {Max,Min} = this.calcLimit(leftData.flat())
+				leftLimitSame = Max===Number(max)&&Min===Number(min)
+				console.table([{
+					'y轴': '左轴',
+					'设置最大值': max,
+					'设置最小值': min,
+					'指标最大值':Max,
+					'指标最小值':Min
+				}])
+			}
+			if(rightData.length){
+				const {Max,Min} = this.calcLimit(rightData.flat())
+				rightLimitSame = Max===Number(rightMax)&&Min===Number(rightMin)
+				console.table([{
+					'y轴': '右轴',
+					'设置最大值': rightMax,
+					'设置最小值': rightMin,
+					'指标最大值':Max,
+					'指标最小值':Min
+				}])
+			}
+			if(rightTwoData.length){
+				const {Max,Min} = this.calcLimit(rightTwoData.flat())
+				rightTwoLimitSame = Max===Number(rightTwoMax)&&Min===Number(rightTwoMin)
+				console.table([{
+					'y轴': '右二轴',
+					'设置最大值': rightTwoMax,
+					'设置最小值': rightTwoMin,
+					'指标最大值':Max,
+					'指标最小值':Min
+				}])
+			}
+			let limitSame = leftLimitSame&&rightLimitSame&&rightTwoLimitSame
+			console.log('是否修改过上下限?',!limitSame)
+			return limitSame
+		},
 	}
 }

+ 307 - 19
src/views/dataEntry_manage/mixins/chartPublic.js

@@ -38,7 +38,7 @@ const basicYAxis = {
 }
 /**备注一下 越多越乱
  * @params
- * Source 1 ; chartType 1曲线 2季节 3面积 4堆积柱 5散点 6组合 7柱形 8截面散点
+ * Source 1 ; chartType 1曲线 2季节 3面积 4堆积柱 5散点 6组合 7柱形 10截面散点 11雷达图
  * 2 商品价格
  * 3 相关性
  * 4 滚动相关性
@@ -158,7 +158,15 @@ export const chartSetMixin = {
       barXData: [],//柱形图的x轴
       barXIdList: [],//x轴id数组 用于切换英文遍历用
       barEdbData: [],//柱形图的表格数据 只用于取值
-      chartLimit: {},
+      chartLimit: {
+        min:'', //左轴上下限
+        max:'',
+        rightMin:'',//右轴上下限
+        rightMax:'',
+        rightTwoMin:'',//右二轴上下限
+        rightTwoMax:'',
+
+      },
 
       /* 商品价格曲线 本来逻辑分开写 但需求又得加入myeta和eta图库共存 还是写一块算了 */
       commodityChartData: [],
@@ -312,7 +320,7 @@ export const chartSetMixin = {
         notEdit:true
       },
       {
-        label:/* '英文图表名称' */this.$t('Chart.Detail.chart_name'),
+        label:/* '英文图表名称' */this.$t('Chart.Detail.chart_en_name'),
         value:this.chartInfo.ChartNameEn,
         key:'ChartNameEn',
         id:this.chartInfo.ChartInfoId,
@@ -502,10 +510,7 @@ export const chartSetMixin = {
 
 			if(res.Ret !==200) return
 
-			this.$message({
-				message:res.Msg,
-				type:"success"
-			})
+			this.$message.success(this.$t('MsgPrompt.edit_msg'))
       this.getChartInfo()
 			this.setEnName = false
     },
@@ -625,7 +630,14 @@ export const chartSetMixin = {
         this.leftIndex = -1;
         this.rightIndex = -1;
         this.rightTwoIndex = -1;
-        this.chartLimit = {};
+        this.chartLimit = {
+            min:'', //左轴上下限
+            max:'',
+            rightMin:'',//右轴上下限
+            rightMax:'',
+            rightTwoMin:'',//右二轴上下限
+            rightTwoMax:'',
+        };
       }else {
         this.leftIndex = newval.findIndex((item) => item.IsAxis===1);
         this.rightIndex = newval.findIndex((item) => !item.IsAxis);
@@ -646,7 +658,31 @@ export const chartSetMixin = {
         let sameSideIndex = chartData.findIndex(
           (i) => i.IsAxis === item.IsAxis
         );
-
+        
+        //获取对应轴的上下限
+        //预测指标-走势图;图表配置-主题设置;不使用自定义上下限,剔除
+        const useTableLimit = ['/predictEdb','/addpredictEdb','/editpredictEdb','/chartThemeSet'].includes(this.$route.path)
+        //非ETA图库图表也不设置自定义上下限,相关性和统计特征也会用到曲线图
+        //若chartInfo.Source为1,需在之前调用setLimitData
+        const isETASource = this.chartInfo.Source===1
+        let minLimit = 0,maxLimit = 0
+        if(useTableLimit||!isETASource){
+            minLimit = newval[sameSideIndex].MinData
+            maxLimit = newval[sameSideIndex].MaxData
+        }
+        if(!useTableLimit&&isETASource){
+            const limitMap = {
+                0:['rightMin','rightMax'],
+                1:['min','max'],
+                2:['rightTwoMin','rightTwoMax']
+            }
+            if(limitMap[item.IsAxis]){
+                minLimit = this.chartLimit[`${limitMap[item.IsAxis][0]}`]||0
+                maxLimit = this.chartLimit[`${limitMap[item.IsAxis][1]}`]||0
+            }
+        }
+        
+        
         //y轴
         const textZh = item.ConvertUnit||item.Unit
         const textEn = item.ConvertEnUnit||item.UnitEn||item.ConvertUnit||item.Unit
@@ -679,8 +715,8 @@ export const chartSetMixin = {
           },
           opposite: [0,2].includes(item.IsAxis),
           reversed: item.IsOrder,
-          min: Number(item.MinData),
-          max: Number(item.MaxData),
+          min: Number(minLimit),
+          max: Number(maxLimit),
           tickWidth: 1,
           visible: sameSideIndex === index,
           plotBands: this.setAxisPlotAreas(item.IsAxis),
@@ -826,6 +862,26 @@ export const chartSetMixin = {
         ? -1
         : newval.findIndex((item) => item.IsAxis===2);
 
+
+        //获取对应轴的上下限
+        //预测指标-走势图;图表配置-主题设置;不使用自定义上下限,剔除
+        const useTableLimit = ['/predictEdb','/chartThemeSet'].includes(this.$route.path)
+        let minLimit = 0,maxLimit = 0
+        if(useTableLimit){
+            minLimit = chartData[sameSideIndex].MinData
+            maxLimit = chartData[sameSideIndex].MaxData
+        }else{
+            const limitMap = {
+                0:['rightMin','rightMax'],
+                1:['min','max'],
+                2:['rightTwoMin','rightTwoMax']
+            }
+            if(limitMap[item.IsAxis]){
+                minLimit = this.chartLimit[`${limitMap[item.IsAxis][0]}`]||0
+                maxLimit = this.chartLimit[`${limitMap[item.IsAxis][1]}`]||0
+            }
+        }
+        
         //y轴
         const textZh = item.ConvertUnit||item.Unit
         const textEn = item.ConvertEnUnit||item.UnitEn||item.ConvertUnit||item.Unit
@@ -858,8 +914,8 @@ export const chartSetMixin = {
           },
           opposite: [0,2].includes(item.IsAxis),
           reversed: item.IsOrder,
-          min: Number(chartData[sameSideIndex].MinData),
-          max: Number(chartData[sameSideIndex].MaxData),
+          min: Number(minLimit),
+          max: Number(maxLimit),
           tickWidth: 1,
           visible: serie_yIndex === index && sameSideIndex ===index,
           plotBands: this.setAxisPlotAreas(item.IsAxis),
@@ -956,6 +1012,18 @@ export const chartSetMixin = {
       let seasonYdata = [],
         seasonData = [];
 
+        //获取对应轴的上下限
+        //预测指标-走势图;图表配置-主题设置;不使用自定义上下限,剔除
+        const useTableLimit = ['/predictEdb','/chartThemeSet','/addpredictEdb','/editpredictEdb'].includes(this.$route.path)
+        let minLimit = 0,maxLimit = 0
+        if(useTableLimit){
+            minLimit = chartData.MinData
+            maxLimit = chartData.MaxData
+        }else{
+            minLimit = this.chartLimit.min||0
+            maxLimit = this.chartLimit.max||0
+        }
+
       //数据列
       for (let j of chartDataHandle) {
         //预测指标配置
@@ -1008,8 +1076,8 @@ export const chartSetMixin = {
           textAlign: 'left',
           reserveSpace: false
         },
-        max: Number(chartData.MaxData),
-        min: Number(chartData.MinData),
+        max: Number(maxLimit),
+        min: Number(minLimit),
         plotBands: this.setAxisPlotAreas(1),
         plotLines: this.setAxisPlotLines(1)
       }];
@@ -1042,11 +1110,52 @@ export const chartSetMixin = {
       }
 
       let colors = chartTheme&&chartTheme.colorsOptions.reverse()||seasonOptions.colors;
+      // 季节性 农历成图老逻辑,需要截取 指标成图还在用,后面需要统一或者拆分
+      let rangeSelector =
+      this.calendar_type === '农历' && this.isPredictorChart
+        ? {
+            enabled: true,
+            selected: 0,
+            inputStyle: {
+              display: 'none',
+            },
+            labelStyle: {
+              display: 'none',
+            },
+            buttonTheme: {
+              style: {
+                display: 'none',
+              },
+            },
+            buttons: [
+              {
+                type: 'month',
+                count: 12,
+                text: '12月',
+              },
+              {
+                type: 'month',
+                count: 15,
+                text: '15月',
+              },
+              {
+                type: 'all',
+                text: '全部',
+                type: 'all',
+              },
+            ],
+          }
+        : {
+            enabled: false,
+          };
+
+
       this.options = {
         colors: colors.slice(-chartDataHandle.length),
         series: seasonData,
         yAxis: seasonYdata,
         xAxis,
+        rangeSelector,
         tooltip
       };
       if(this.currentLang=='en') this.changeOptions()
@@ -1132,6 +1241,18 @@ export const chartSetMixin = {
       } */
 
 
+      //获取对应轴的上下限
+        //预测指标-走势图;图表配置-主题设置;不使用自定义上下限,剔除
+        const useTableLimit = ['/predictEdb','/chartThemeSet'].includes(this.$route.path)
+        let minLimit = 0,maxLimit = 0
+        if(useTableLimit){
+            minLimit = Math.min(...real_data.map(_ => _.y));
+            maxLimit = Math.max(...real_data.map(_ => _.y));
+        }else{
+            minLimit = this.chartLimit.min||0
+            maxLimit = this.chartLimit.max||0
+        }
+
       const { IsOrder,ChartColor } = newval[0];
       //y轴
       const textYZh = newval[1].ConvertUnit||newval[1].Unit
@@ -1165,8 +1286,8 @@ export const chartSetMixin = {
         },
         opposite: false,
         reversed: IsOrder,
-        min: Number(newval[1].MinData),
-        max: Number(newval[1].MaxData),
+        min: Number(minLimit),
+        max: Number(maxLimit),
         tickWidth: 1,
         plotBands: this.setAxisPlotAreas(1),
         plotLines: this.setAxisPlotLines(1)
@@ -1232,6 +1353,9 @@ export const chartSetMixin = {
       x轴为指标名称的柱形图 以日期作为series
     */
     setBarChart() {
+      this.leftIndex = -1;
+      this.rightIndex = -1;
+      this.rightTwoIndex = -1;
       let seriesData = [];
       const data = _.cloneDeep(this.barDateList);
 
@@ -2140,6 +2264,10 @@ export const chartSetMixin = {
 
        //数据列
       let series = [];
+      const tagMap = { //标签对应文字
+        1: '最新',
+        3: 'Fix'
+      }
       DataList.forEach(item => {
         //数据列
         let series_item = {
@@ -2153,7 +2281,16 @@ export const chartSetMixin = {
           zIndex:1
         }
         item.CoordinatePointData.forEach(_ => {
-          series_item.data.push({x: _.X,y: _.Y,})
+          series_item.data.push({
+            x: _.X,
+            y: _.Y,
+            dataLabels: {
+              enabled: _.ShowTips===1,
+              allowOverlap: true,
+              align: 'left',
+              format: tagMap[_.DateType] || `-${_.DaysAgo}D`,
+            }
+          })
         })
         series.push(series_item);
       })
@@ -2509,6 +2646,12 @@ export const chartSetMixin = {
     changeLimit() {
       //source1 eta图库的类型对应
       const typeMap = {
+        1: this.setDefaultChart,
+        2: this.setSeasonChart,
+        3: this.setStackOrCombinChart,
+        4: this.setStackOrCombinChart,
+        5: this.setScatterChart,
+        6: this.setStackOrCombinChart,
         7: this.setBarChart,
         10: this.setSectionScatterChart,
         11: this.setRadarChart
@@ -2520,7 +2663,13 @@ export const chartSetMixin = {
         // 3:
       }
       if(this.chartInfo.Source === 1) {
-        typeMap[this.chartInfo.ChartType]()
+        if([7,10,11].includes(this.chartInfo.ChartType)){
+            typeMap[this.chartInfo.ChartType]()
+        }else{
+            this.setAddChartDefault&&this.setAddChartDefault();
+            typeMap[this.chartInfo.ChartType](this.tableData)
+        }
+        
       }else {
         sourceMap[this.chartInfo.Source]();
       }
@@ -2652,5 +2801,144 @@ export const chartSetMixin = {
 				});
 			}
 		},
+    /* ----自定义上下限相关--- */
+        /* 计算y轴上下限 */
+        calcYAxislimit(tableData=[]) {
+            //散点图单独处理
+            if(this.chartInfo.ChartType===5){
+                if(tableData[1]){
+                    this.chartLimit.min = tableData[1].MinData
+                    this.chartLimit.max = tableData[1].MaxData
+                }
+                return 
+            }
+            //分组
+            const leftData = tableData.filter(i => i.IsAxis === 1).map(i => [Number(i.MinData), Number(i.MaxData)])
+            const rightData = tableData.filter(i => !i.IsAxis).map(i => [Number(i.MinData), Number(i.MaxData)])
+            const rightTwoData = tableData.filter(i => i.IsAxis === 2).map(i => [Number(i.MinData), Number(i.MaxData)])
+            //计算最大最小值
+            if (leftData.length) {
+                const {
+                    Max,
+                    Min
+                } = this.calcLimit(leftData.flat())
+                this.chartLimit.min=Min
+                this.chartLimit.max=Max
+            } else {
+                this.leftIndex = -1
+                this.chartLimit.min=0
+                this.chartLimit.max=0
+            }
+            if (rightData.length) {
+                const {
+                    Max,
+                    Min
+                } = this.calcLimit(rightData.flat())
+                this.chartLimit.rightMin = Min
+                this.chartLimit.rightMax = Max
+            } else {
+                this.rightIndex = -1
+                this.chartLimit.rightMin = 0
+                this.chartLimit.rightMax = 0
+            }
+            if (rightTwoData.length) {
+                const {
+                    Max,
+                    Min
+                } = this.calcLimit(rightTwoData.flat())
+                this.chartLimit.rightTwoMin = Min
+                this.chartLimit.rightTwoMax = Max
+            } else {
+                this.rightTwoIndex = -1
+                this.chartLimit.rightTwoMin = 0
+                this.chartLimit.rightTwoMax = 0
+            }
+            console.table([{
+                    'y轴': '左轴',
+                    '最大值': this.chartLimit.max,
+                    '最小值': this.chartLimit.min
+                },
+                {
+                    'y轴': '右轴',
+                    '最大值': this.chartLimit.rightMax,
+                    '最小值': this.chartLimit.rightMin
+                },
+                {
+                    'y轴': '右二轴',
+                    '最大值': this.chartLimit.rightTwoMax,
+                    '最小值': this.chartLimit.rightTwoMin
+                }
+            ])
+        },
+        calcLimit(arr) {
+            return {
+                Max: Math.max(...arr),
+                Min: Math.min(...arr)
+            }
+        },
+        //图表详情-设置图表上下限
+        setLimitData(tableData=[]){
+            const {
+                //左右轴极值字段 
+                LeftMin=0,LeftMax=0,
+                RightMin=0,RightMax=0,
+                Right2Min=0,Right2Max=0,
+                MinMaxSave
+            } = this.chartInfo
+            if(MinMaxSave){
+                this.chartLimit.min = Number(LeftMin)
+                this.chartLimit.max = Number(LeftMax)
+                this.chartLimit.rightMin = Number(RightMin)
+                this.chartLimit.rightMax = Number(RightMax)
+                this.chartLimit.rightTwoMin = Number(Right2Min)
+                this.chartLimit.rightTwoMax = Number(Right2Max)
+                //若用户修改过,则检测轴的上下限是否为空,若为空,则需要计算对应轴的上下限
+                this.checkChartLimit(tableData)
+            }else{
+                this.calcYAxislimit(tableData)
+            }
+        },
+        checkChartLimit(tableData=[]){
+            //散点图单独处理
+            if(this.chartInfo.ChartType===5){
+                if(tableData[1]){
+                    const {min,max} = this.chartLimit
+                    if(Number(min)===0&&Number(max)===0){
+                        this.chartLimit.min = tableData[1].MinData
+                        this.chartLimit.max = tableData[1].MaxData
+                    }
+                }
+                return 
+            }
+            const {
+                min,max,rightMin,rightMax,rightTwoMin,rightTwoMax
+            } = this.chartLimit
+            //若轴的上下限均为0,则不管用户有没有修改过,都重新赋值
+            if(Number(min)===0&&Number(max)===0){
+                const leftData = tableData.filter(i=>i.IsAxis===1).map(i=>[Number(i.MinData),Number(i.MaxData)])
+                if(leftData.length){
+                    const {Max,Min} = this.calcLimit(leftData.flat())
+                    this.chartLimit.min=Min
+                    this.chartLimit.max=Max
+                }
+            }
+            if(Number(rightMin)===0&&Number(rightMax)===0){
+                const rightData = tableData.filter(i => !i.IsAxis).map(i=>[Number(i.MinData),Number(i.MaxData)])
+                if(rightData.length){
+                    const {Max,Min} = this.calcLimit(rightData.flat())
+                    this.chartLimit.rightMin = Min
+                    this.chartLimit.rightMax = Max
+                }
+            }
+            if(Number(rightTwoMin)===0&&Number(rightTwoMax)===0){
+                const rightTwoData = tableData.filter(i=>i.IsAxis===2).map(i=>[Number(i.MinData),Number(i.MaxData)])
+                if(rightTwoData.length){
+                    const {Max,Min} = this.calcLimit(rightTwoData.flat())
+                    this.chartLimit.rightTwoMin = Min
+                    this.chartLimit.rightTwoMax = Max
+                }
+            }
+        },
+    /*-------------------- */
 	}
 }

+ 14 - 9
src/views/dataEntry_manage/targetList.vue

@@ -50,8 +50,8 @@
 					v-model="date"
 					type="daterange"
 					:range-separator="$t('Common.to')"
-					:start-placeholder="$t('Edb.InputHolderAll.ph_start_time')"
-					:end-placeholder="$t('Edb.InputHolderAll.ph_end_time')"
+					:start-placeholder="$t('ManualEdbListPage.ph_start_time')"
+					:end-placeholder="$t('ManualEdbListPage.ph_end_time')"
 					@change="dateChange"
 					value-format="yyyy-MM-dd">
 				</el-date-picker>
@@ -194,31 +194,31 @@ export default {
 			frequencyList:[
 				{
 					value: '日度',
-					label: '日度',
+					label: /* '日度'  */this.$t('Edb.FreAll.day'),
 				},
 				{
 					value: '周度',
-					label: '周度',
+					label: /* '周度' */this.$t('Edb.FreAll.week'),
 				},
 				{
 					value: '旬度',
-					label: '旬度',
+					label: /* '旬度' */this.$t('Edb.FreAll.dekad'),
 				},
 				{
 					value: '月度',
-					label: '月度',
+					label: /* '月度' */this.$t('Edb.FreAll.month'),
 				},
 				{
 					value: '季度',
-					label: '季度',
+					label: /* '季度' */ this.$t('Edb.FreAll.quarter'),
 				},
 				{
 					value: '半年度',
-					label: '半年度',
+					label: /* '半年度' */ this.$t('Edb.FreAll.month'),
 				},
 				{
 					value: '年度',
-					label: '年度',
+					label: /* '年度' */ this.$t('Edb.FreAll.year'),
 				}
 			],//频度列表
 			tableData: [],
@@ -562,6 +562,10 @@ export default {
 			dataInterence.checkTarget({
 				TradeCode:item.TradeCode
 			}).then(res => {
+				if(res.Data.Status===1){
+					this.$message.error("该指标已加入ETA指标库,不可删除")
+					return
+				}else{
 					this.$confirm(
 						res.Data.Status===0 ? this.$t('ManualEdbListPage.del_edb_msg') : this.$t('ManualEdbListPage.del_edb_rela_msg'),
 						this.$t('Dialog.warn_tit'),{
@@ -575,6 +579,7 @@ export default {
 								this.getTableData();
 							});
 					}).catch(() => {});
+				}
 			})
 		}
 	},

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

@@ -907,7 +907,7 @@ export default {
       if (type === "classify") {
         //检查classify_name
         if (!classify_name.length) {
-          this.$message.warning("请输入分类名称");
+          this.$message.warning(/* "请输入分类名称" */ this.$t('Edb.InputHolderAll.input_common',{label: this.$t('SteelChemicalPage.label_classify_name')}));
           return;
         }
         //添加分类
@@ -941,7 +941,8 @@ export default {
         });
       }
       if (res.Ret !== 200) return;
-      this.$message.success(`${optionType}成功`);
+      // this.$message.success(`${optionType}成功`);
+      this.$message.success(`${title.includes("添加")?this.$t('MsgPrompt.add_msg2'):this.$t('MsgPrompt.edit_msg')}`);
       this.getClassify();
       this.cancelDialogHandle();
       //判断是分类还是指标,请求对应详情
@@ -1222,9 +1223,9 @@ export default {
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
   }
-  div::-webkit-scrollbar {
+/*   div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
     min-width: 300px;
     width: 300px;
@@ -1236,9 +1237,10 @@ export default {
       padding: 0 20px;
     }
     .scroll-wrap {
-      padding: 0 10px;
+      padding: 0 20px;
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .target_tree {
         color: #333;
         .label-input .el-input__inner {

+ 6 - 4
src/views/dataEntry_manage/thirdBase/FwmtData.vue

@@ -50,7 +50,7 @@
       <div class="scroll-wrap">
         <el-tree
           ref="treeRef"
-          class="target_tree"
+          class="target_tree word-wrap"
           :data="classifyList"
           node-key="ClassifyId"
           :props="{
@@ -389,6 +389,7 @@ export default {
 </script>
 <style lang="scss">
 @import "../css/customtree.scss";
+@import "../css/baseTargetPage.scss";
 .smmTarget-dialog-cont {
   .el-cascader {
     .el-input {
@@ -409,9 +410,9 @@ export default {
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
   }
-  div::-webkit-scrollbar {
+/*   div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
     min-width: 300px;
     width: 300px;
@@ -423,9 +424,10 @@ export default {
       padding: 0 20px;
     }
     .scroll-wrap {
-      padding: 0 10px;
+      padding: 0 20px;
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .target_tree {
         color: #333;
         .label-input .el-input__inner {

+ 7 - 5
src/views/dataEntry_manage/thirdBase/SCITargetbase.vue

@@ -813,7 +813,7 @@ export default {
       if (type === "classify") {
         //检查classify_name
         if (!classify_name.length) {
-          this.$message.warning("请输入分类名称");
+          this.$message.warning(/* "请输入分类名称" */ this.$t('Edb.InputHolderAll.input_common',{label: this.$t('SteelChemicalPage.label_classify_name')}));
           return;
         }
         //添加分类
@@ -845,7 +845,8 @@ export default {
       }
 
       if (res.Ret !== 200) return;
-      this.$message.success(`${optionType}成功`);
+      // this.$message.success(`${optionType}成功`);
+      this.$message.success(`${title.includes("添加")?this.$t('MsgPrompt.add_msg2'):this.$t('MsgPrompt.edit_msg')}`);
       this.getClassify();
       this.cancelDialogHandle();
     },
@@ -1110,9 +1111,9 @@ export default {
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
   }
-  div::-webkit-scrollbar {
+  /* div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
     min-width: 300px;
     width: 300px;
@@ -1124,9 +1125,10 @@ export default {
       padding: 0 20px;
     }
     .scroll-wrap {
-      padding: 0 10px;
+      padding: 0 20px;
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right:20px;
       .target_tree {
         color: #333;
         .label-input .el-input__inner {

+ 10 - 4
src/views/dataEntry_manage/thirdBase/YyzxData.vue

@@ -51,7 +51,7 @@
       <div class="scroll-wrap">
         <el-tree
           ref="treeRef"
-          class="target_tree"
+          class="target_tree word-wrap"
           :data="classifyList"
           node-key="ClassifyId"
           :props="{
@@ -375,6 +375,11 @@ export default {
   
     //改变选中节点
     nodeChangeHandle(data, node) {
+      //目录不显示数据
+      if(data.Level===1&&data.Children){
+        this.rightShow = false
+        return
+      }
       if (data.ClassifyId === this.select_classify) return;
       this.select_classify = data.ClassifyId;
       this.leftSearchVal=''
@@ -433,9 +438,9 @@ export default {
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
   }
-  div::-webkit-scrollbar {
+  /* div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
     min-width: 300px;
     width: 300px;
@@ -447,9 +452,10 @@ export default {
       padding: 0 20px;
     }
     .scroll-wrap {
-      padding: 0 10px;
+      padding: 0 20px;
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .target_tree {
         color: #333;
         .label-input .el-input__inner {

+ 1 - 1
src/views/dataEntry_manage/thirdBase/components/batchAddEdbDia.vue

@@ -186,7 +186,7 @@ import { steelInterface } from "@/api/modules/thirdBaseApi";
         this.$refs.edbFormDataListRef.validate(valid=>{
           if(valid){
             if(this.edbForm.edbDataList.length>=100){
-              this.$message.warning('添加数量已达上限(上限100)!')
+              this.$message.warning(/* '添加数量已达上限(上限100)!' */this.$t('SteelChemicalPage.add_max_msg'))
               return 
             }
             let lastItem = this.edbForm.edbDataList[this.edbForm.edbDataList.length-1]

+ 3 - 2
src/views/dataEntry_manage/thirdBase/elaSteoBase.vue

@@ -322,9 +322,9 @@ export default {
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
   }
-  div::-webkit-scrollbar {
+  /* div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
     min-width: 240px;
     width:240px;
@@ -339,6 +339,7 @@ export default {
       /* margin-top: 20px; */
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .classify-item {
         font-size: 14px;
         color: #666;

+ 1 - 0
src/views/dataEntry_manage/thirdBase/glTargetbase.vue

@@ -482,6 +482,7 @@ export default {
       /* margin-top: 20px; */
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .classify-item {
         font-size: 14px;
         color: #666;

+ 1 - 0
src/views/dataEntry_manage/thirdBase/lzTargetbase.vue

@@ -415,6 +415,7 @@ export default {
       margin-top: 20px;
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .classify-item {
         font-size: 14px;
         color: #666;

+ 12 - 10
src/views/dataEntry_manage/thirdBase/smmTargetbase.vue

@@ -231,7 +231,7 @@
             <el-input
               v-model="classifyForm.classify_name"
               style="width: 80%"
-              placeholder="请输入分类名称"
+              :placeholder="$t('Edb.InputHolderAll.input_common',{label: $t('SteelChemicalPage.label_classify_name')})"
             />
           </el-form-item>
           <el-form-item :label="$t('SteelChemicalPage.label_classify_name')" prop="classifys_id" v-else>
@@ -315,7 +315,7 @@ export default {
       }, //弹窗可编辑信息
       classifyFormRules: {
         classify_name: [
-          { required: true, message: "分类名称不能为空", trigger: "blur" },
+          { required: true, message: /* "分类名称不能为空"  */this.$t('Edb.InputHolderAll.input_common',{label: this.$t('SteelChemicalPage.label_classify_name')}), trigger: "blur" },
         ],
       }, //可编辑信息校验
     };
@@ -798,8 +798,8 @@ export default {
       //如果分类下有子分类或指标
       let hintText =
         Children && Children.length
-          ? this.$t('SteelChemicalPage.del_classify_msg')
-          : "删除分类不可恢复,确定删除吗?";
+          ? this.$t('SteelChemicalPage.del_classify_only_msg')
+          : this.$t('SteelChemicalPage.del_classify_msg');
       this.$confirm(hintText,this.$t('Dialog.warn_tit'), {
         type: "warning",
       })
@@ -826,7 +826,7 @@ export default {
         })
         .then((res) => {
           if (res.Ret !== 200) return;
-          this.$message.success("清除分类成功");
+          this.$message.success(/* "清除分类成功" */this.$t('MsgPrompt.clean_classify_msg'));
           this.getClassify();
         });
     },
@@ -879,7 +879,7 @@ export default {
       if (type === "classify") {
         //检查classify_name
         if (!classify_name.length) {
-          this.$message.warning("请输入分类名称");
+          this.$message.warning(/* "请输入分类名称" */this.$t('Edb.InputHolderAll.input_common',{label: this.$t('SteelChemicalPage.label_classify_name')}));
           return;
         }
         //添加分类
@@ -911,7 +911,8 @@ export default {
       }
 
       if (res.Ret !== 200) return;
-      this.$message.success(`${optionType}成功`);
+      // this.$message.success(`${optionType}成功`);
+      this.$message.success(`${title.includes("添加")?this.$t('MsgPrompt.add_msg2'):this.$t('MsgPrompt.edit_msg')}`);
       this.getClassify();
       this.cancelDialogHandle();
     },
@@ -1178,9 +1179,9 @@ export default {
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
   }
-  div::-webkit-scrollbar {
+  /* div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
     min-width: 300px;
     width: 300px;
@@ -1192,9 +1193,10 @@ export default {
       padding: 0 20px;
     }
     .scroll-wrap {
-      padding: 0 10px;
+      padding: 0 20px;
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
       .target_tree {
         color: #333;
         .label-input .el-input__inner {

+ 7 - 6
src/views/dataEntry_manage/thirdBase/steelChemicalbase.vue

@@ -302,7 +302,7 @@ export default {
       },
       classifyFormRules: {
         classify_name: [
-          { required: true, message: "分类名称不能为空", trigger: "blur" },
+          { required: true, message: /* "分类名称不能为空"  */this.$t('Edb.InputHolderAll.input_common',{label: this.$t('SteelChemicalPage.label_classify_name')}), trigger: "blur" },
         ],
       },
 
@@ -749,12 +749,12 @@ export default {
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
   }
-  div::-webkit-scrollbar {
+  /* div::-webkit-scrollbar {
     width: 5px !important;
-  }
+  } */
   .left-cont {
-    min-width: 300px;
-    width: 300px;
+    min-width: 330px;
+    width: 330px;
     flex-shrink: 0;
     margin-right: 20px;
     padding: 30px 0;
@@ -764,9 +764,10 @@ export default {
       padding: 0 20px;
     }
     .scroll-wrap {
-      padding: 0 10px;
+      padding: 0 20px;
       height: calc(100vh - 280px);
       overflow-y: auto;
+      margin-right: 20px;
     }
     .target_tree {
       color: #333;

+ 26 - 2
src/views/datasheet_manage/common/option.js

@@ -9,6 +9,7 @@ import * as sheetInterface from '@/api/modules/sheetApi.js';
 import { Message } from 'element-ui';
 
 export function initSheet(container,options={},sheetInfo={},limit,callbackItems) {
+  console.log(limit);
   const configOpt = {
     container,
     lang: localStorage.getItem('i18n') == 'en' ? 'en' : 'zh', // 设定表格语言
@@ -50,9 +51,32 @@ export function initSheet(container,options={},sheetInfo={},limit,callbackItems)
       //   console.log(range,data,'range,data','rangeCopyAfter');
       // },
       updated: (a,b,c,d,e)=> {
+        /**
+         * lucksheet 本身没有完美的禁止用户编辑的功能,只能自己控制了,用户操作后撤销,用户撤销后重做
+         * stopUndo -- 阻止撤销 由于撤销会触发updated,又再进行撤销,直接撤销到最初状态了,我们只需要撤销一次
+         * withdrawUndo -- 撤销用户撤销的操作 即重做
+         */
         if(limit.disabled){
-          Message.warning("当前不可编辑")
-          luckysheet.undo()
+          if((!luckysheet.stopUndo)){
+            setTimeout(()=>{
+              Message.warning("当前不可编辑")
+              if(luckysheet.withdrawUndo) {
+                // 重做用户撤销的操作,我们自己的重做操作,不能再撤销
+                luckysheet.stopUndo=false
+                luckysheet.withdrawUndo=false
+                return
+              }
+              let result=luckysheet.undo()
+              luckysheet.stopUndo=false
+              if(Object.keys(result).length==0){
+                requestAnimationFrame(()=>{
+                  luckysheet.redo()
+                  luckysheet.withdrawUndo=true
+                })
+              }
+            },0)
+            luckysheet.stopUndo=true
+          }
           return 
         }
         // console.log(callbackItems);

+ 1 - 0
src/views/datasheet_manage/customAnalysis/list.vue

@@ -956,6 +956,7 @@ $normal-font: 14px;
         padding: 30px 20px;
         max-height: calc(100vh - 280px);
         overflow: auto;
+        margin-right:20px;
       }
       .target_tree {
         color: #333;

+ 9 - 4
src/views/datasheet_manage/sheetList.vue

@@ -779,9 +779,13 @@ export default {
         return 
       }
       this.$message.success(this.$t('MsgPrompt.saved_msg') );
-      this.markFinishStatus()
+      // this.markFinishStatus()
+
+      if(this.autoSaveType == "nameEdit"){
+        this.getTreeData();
+        this.autoSaveType=''
+      }
 
-      this.getTreeData();
       this.getDetailHandle();
     }, 300),
     autoSaveFun:_.debounce(async function(){
@@ -790,7 +794,7 @@ export default {
         this.cancelAutoSave=false
         return
       }
-      luckysheet.exitEditMode();
+      // luckysheet.exitEditMode();
       //结构类型乱飘 强制定义下
       let data = {...luckysheet.getAllSheets()[0],status:Number(luckysheet.getAllSheets()[0].status)}
       if (!data.celldata.length) return this.$message.warning(this.$t('OnlineExcelPage.input_content_msg') );
@@ -983,7 +987,7 @@ export default {
       if(!this.onlineExcelEditing) return
       this.editNodeLabel(sheetDetailInfo, type)
     },
-    // 标记 编辑完成
+    // 标记 编辑完成 退出编辑状态
     markFinishStatus(select_id){
       let id = select_id || this.select_id
       if((!this.onlineExcelEditing) || (!id) || id=='0'){
@@ -1115,6 +1119,7 @@ $normal-font: 14px;
         padding: 30px 20px;
         max-height: calc(100vh - 280px);
         overflow: auto;
+        margin-right: 20px;
       }
       .target_tree {
         color: #333;

+ 16 - 13
src/views/login_manage/EmailModel.vue

@@ -11,7 +11,7 @@
                     type="text"
                     v-model="form.email"
                     auto-complete="off"
-                    placeholder="请输入邮箱"
+                    :placeholder="$t('LoginPage.ph_email')"
                 >
                 </el-input>
                 <span class="inline-message el-form-item__error" 
@@ -25,7 +25,7 @@
                     type="text"
                     v-model="form.picCode"
                     auto-complete="off"
-                    placeholder="请输入图形验证码"
+                    :placeholder="$t('LoginPage.ph_img_code')"
                 >
                     <div class="pic-box" slot="append" @click="getCodePic">
                         <img :src="picSrc" alt="图形验证码"/>
@@ -37,7 +37,7 @@
                     type="text"
                     v-model="form.checkCode"
                     auto-complete="off"
-                    placeholder="请输入验证码"
+                    :placeholder="$t('LoginPage.ph_msg_code')"
                 ></el-input>
                 <el-button type="text" class="code-btn" @click="checkForm" :disabled="codeCountDown<60&&codeCountDown>0">{{codeStr}}</el-button>
             </el-form-item>
@@ -71,7 +71,7 @@ export default {
             picSrc:'',
             picId:'',
             timer:0,
-            codeStr:'获取验证码',
+            codeStr:/* '获取验证码'  */this.$t('LoginPage.ver_code_msg'),
             codeCountDown:60,
             isGetNewCode:false,
             form:{
@@ -81,17 +81,17 @@ export default {
             },
             rules:{
                 email:[
-                    {required:true,message:'请输入邮箱',trigger:'blur'},
+                    {required:true,message:/* '请输入邮箱' */this.$t('LoginPage.ph_email'),trigger:'blur'},
                     {validator:(rule,value,callback)=>{
                         if(!patternEmail.test(value)){
-                            callback(new Error("请输入正确的邮箱格式"))
+                            callback(new Error(/* "请输入正确的邮箱格式" */this.$t('LoginPage.vaild_curr_email')))
                         }else{
                             callback()
                         }
                     },trigger:'blur'}
                 ],
-                picCode:[{required:true,message:'请输入图形验证码',trigger:'blur'}],
-                checkCode:[{required:true,message:'请输入短信验证码',trigger:'blur'}]
+                picCode:[{required:true,message:/* '请输入图形验证码' */this.$t('LoginPage.ph_img_code'),trigger:'blur'}],
+                checkCode:[{required:true,message:/* '请输入短信验证码' */this.$t('LoginPage.ph_msg_code'),trigger:'blur'}]
             },
             hintMessage:''
         };
@@ -99,9 +99,9 @@ export default {
     methods: {
         checkForm(){
             //首先检查是否是重新获取验证码
-            if(this.codeStr==='重新获取'&&!this.isGetNewCode){
+            if(this.codeStr===this.$t('LoginPage.recode_msg')&&!this.isGetNewCode){
                 //引导用户重新输入图形验证码
-                this.$message.warning('重新获取需再次输入图形验证码')
+                this.$message.warning(/* '重新获取需再次输入图形验证码' */this.$t('LoginPage.recode_warn_msg'))
                 this.getCodePic()
                 this.form.picCode = ''
                 this.isGetNewCode = true
@@ -110,11 +110,11 @@ export default {
             //检查邮箱和图形验证码是否正确
             const {email,picCode} = this.form
             if(!picCode.length){
-                this.$message.warning('请输入图形验证码')
+                this.$message.warning(/* '请输入图形验证码' */this.$t('LoginPage.ph_img_code'))
                 return
             }
             if(!patternEmail.test(email)){
-                this.$message.warning('请输入正确的邮箱')
+                this.$message.warning(/* '请输入正确的邮箱' */this.$t('LoginPage.vaild_curr_email'))
                 return
             }
             //通过请求发送验证码
@@ -126,7 +126,7 @@ export default {
                 Source:this.Source
             }).then(res=>{
                 if(res.Ret!==200) return 
-                this.$message.success('验证码已发送')
+                this.$message.success(/* '验证码已发送' */this.$t('LoginPage.send_code_msg'))
                 this.isGetNewCode = false
                 //60秒倒计时
                 this.codeCountDown = 60
@@ -137,6 +137,9 @@ export default {
             })
         }
     },
+    mounted() {
+        this.getCodePic()
+    }
 };
 </script>
 

+ 18 - 18
src/views/login_manage/ForgetPassModel.vue

@@ -2,7 +2,7 @@
     <div class="forget-pass-model">
         <div class="header-nav" @click="changeModel">
             <span><i class="el-icon-back"></i></span>
-            <span>忘记密码</span>
+            <span><!-- 忘记密码 -->{{ $t('LoginPage.label_forget') }}</span>
         </div>
         <div class="step-container model-wrap" v-show="currentStep===0">
             <el-form 
@@ -16,7 +16,7 @@
                         type="text"
                         v-model="form.account"
                         auto-complete="off"
-                        placeholder="请输入账号">
+                        :placeholder="$t('LoginPage.ph_account')">
                     </el-input>
                 </el-form-item>
                 <el-form-item prop="picCode">
@@ -25,7 +25,7 @@
                         type="text"
                         v-model="form.picCode"
                         auto-complete="off"
-                        placeholder="请输入图形验证码"
+                        :placeholder="$t('LoginPage.ph_img_code')"
                     >
                         <div class="pic-box" slot="append" @click="getCodePic">
                             <img :src="picSrc" alt="图形验证码"/>
@@ -33,23 +33,23 @@
                     </el-input>
                 </el-form-item>
             </el-form>
-            <el-button class="submit_btn" @click="getUserInfo">下一步</el-button>
+            <el-button class="submit_btn" @click="getUserInfo"><!-- 下一步 -->{{ $t('Dialog.next_step') }}</el-button>
         </div>
         <div class="step-container" v-show="currentStep>0">
             <div class="container-header">
-                <p>您正在找回账号{{form.account}}的密码</p>
+                <p> {{ $t('LoginPage.label_find_pwd',{name: form.account}) }}</p>
                 <ModelSteps :active-step="currentStep"/>
             </div>
             <div class="container-inner model-wrap" v-show="currentStep===1">
                 <VerificationBox
                     verifies-type="mobile"
-                    :info-text="userMobile||'暂未绑定'"
+                    :info-text="userMobile||$t('LoginPage.label_not_bind')"
                     :hideBtn="!userMobile"
                     @goNext="getCode"
                 />
                 <VerificationBox
                     verifies-type="email"
-                    :info-text="userEmail||'暂未绑定'"
+                    :info-text="userEmail||$t('LoginPage.label_not_bind')"
                     :hideBtn="!userEmail"
                     @goNext="getCode"
                 />
@@ -59,8 +59,8 @@
                     ref="captInput"
                 />
                 <div class="btn-wrap">
-                    <el-button type="primary" plain @click="changeModel">上一步</el-button>
-                    <el-button type="primary" @click="checkInput">下一步</el-button>
+                    <el-button type="primary" plain @click="changeModel"><!-- 上一步 -->{{ $t('Dialog.prev_step') }}</el-button>
+                    <el-button type="primary" @click="checkInput"><!-- 下一步 -->{{ $t('Dialog.next_step') }}</el-button>
                 </div>
                 
             </div>
@@ -79,7 +79,7 @@
                             @copy.native.capture.prevent="()=>{return false}"
                             @cut.native.capture.prevent="()=>{return false}"
                             @paste.native.capture.prevent="()=>{return false}"
-                            placeholder="请输入新密码">
+                            :placeholder="$t('LoginPage.ph_new_pwd')">
                         </el-input>
                     </el-form-item>
                     <el-form-item prop="pass2">
@@ -90,7 +90,7 @@
                             @copy.native.capture.prevent="()=>{return false}"
                             @cut.native.capture.prevent="()=>{return false}"
                             @paste.native.capture.prevent="()=>{return false}"
-                            placeholder="请确认新密码">
+                            :placeholder="$t('ResetPwdPage.vaild_new')">
                         </el-input>
                     </el-form-item>
                 </el-form>
@@ -120,22 +120,22 @@ export default {
     data() {
         const validatePass = (rule,value,callback)=>{
             if(value===''){
-                callback(new Error('请输入新密码'))
+                callback(new Error(/* '请输入新密码' */this.$t('LoginPage.ph_new_pwd')))
             }
             if(this.passForm.pass2!==''){
                 this.$refs.passForm.validateField('pass2')
             }
             if(!checkPassWord(value)){
-                callback(new Error('密码要求8位及以上,包含数字、大写字母、小写字母、特殊字符中的三个类型'))
+                callback(new Error(/* '密码要求8位及以上,包含数字、大写字母、小写字母、特殊字符中的三个类型' */this.$t('ResetPwdPage.vaild_rule')))
             }else{
                 callback()
             }
         }
         const validateCheck = (rule,value,callback)=>{
             if(value===''){
-                callback(new Error('请输入确认密码'))
+                callback(new Error(/* '请输入确认密码' */this.$t('ResetPwdPage.vaild_new')))
             }else if(value!==this.passForm.pass1){
-                callback(new Error('两次输入的密码不一致,请检查'))
+                callback(new Error(/* '两次输入的密码不一致,请检查' */this.$t('ResetPwdPage.vaild_same')))
             }else{
                 callback()
             }
@@ -182,11 +182,11 @@ export default {
             //检查form是否填写完整
             const {account,picCode} = this.form
             if(!account){
-                this.$message.warning('请输入账号')
+                this.$message.warning(/* '请输入账号' */this.$t('LoginPage.ph_account'))
                 return
             }
             if(!picCode){
-                this.$message.warning('请输入图形验证码')
+                this.$message.warning(/* '请输入图形验证码' */this.$t('LoginPage.ph_img_code'))
                 return
             }
             //请求接口获取账号数据,赋值userMobile,userEmail
@@ -280,7 +280,7 @@ export default {
                         RePassword:new http.Base64().encode(this.passForm.pass2)
                     }).then(res=>{
                         if(res.Ret!==200) return
-                        this.$message.success('重置密码成功,请登陆')
+                        this.$message.success(/* '重置密码成功,请登陆' */this.$t('LoginPage.reset_pwd_success_msg'))
                         localStorage.setItem('timeKey',Date.now())
                         localStorage.setItem("account", new http.Base64().encode(this.form.account));
                         localStorage.setItem("checkPass", new http.Base64().encode(this.passForm.pass1));

+ 17 - 14
src/views/login_manage/MobileModel.vue

@@ -12,7 +12,7 @@
                     type="text"
                     v-model="form.mobile"
                     auto-complete="off"
-                    placeholder="请输入手机号"
+                    :placeholder="$t('LoginPage.ph_mobile')"
                 >
                     <el-select v-model="areaCodeSelect" slot="prepend" placeholder="请选择">
                         <el-option v-for="item in areaCode" :key="item.Value"
@@ -30,7 +30,7 @@
                     type="text"
                     v-model="form.picCode"
                     auto-complete="off"
-                    placeholder="请输入图形验证码"
+                    :placeholder="$t('LoginPage.ph_img_code')"
                 >
                     <div class="pic-box" slot="append" @click="getCodePic">
                         <img :src="picSrc" alt="图形验证码"/>
@@ -42,7 +42,7 @@
                     type="text"
                     v-model="form.checkCode"
                     auto-complete="off"
-                    placeholder="请输入验证码">
+                    :placeholder="$t('LoginPage.ph_msg_code')">
                 </el-input>
                 <el-button type="text" class="code-btn" @click="checkForm" :disabled="codeCountDown<60&&codeCountDown>0">{{codeStr}}</el-button>
             </el-form-item>
@@ -81,7 +81,7 @@ export default {
             picSrc:'',//图形验证码地址
             picId:'',//图形验证码id
             timer:0,
-            codeStr:'获取验证码',
+            codeStr:/* '获取验证码'  */this.$t('LoginPage.ver_code_msg'),
             codeCountDown:60,
             isGetNewCode:false,
             form:{
@@ -91,28 +91,28 @@ export default {
             },
             rules:{
                 mobile:[
-                    {required: true,message: "请输入手机号",trigger: "blur"},
+                    {required: true,message: /* "请输入手机号" */this.$t('LoginPage.ph_mobile'),trigger: "blur"},
                     {validator:(rule,value,callback)=>{
                         if(this.areaCodeSelect==='86'&&!isMobileNo(value)){
-                            callback(new Error('请输入正确的手机号格式'));
+                            callback(new Error(/* '请输入正确的手机号格式' */this.$t('LoginPage.vaild_curr_mobile')));
                         }else if(this.areaCodeSelect!=='86'&&isNaN(value.trim())){
-                            callback(new Error('请输入正确的手机号格式'));
+                            callback(new Error(/* '请输入正确的手机号格式' */this.$t('LoginPage.vaild_curr_mobile')));
                         }else{
                             callback()
                         }
                     },trigger:'blur'}
                 ],
-                picCode:[{required:true,message:'请输入图形验证码',trigger:'blur'}],
-                checkCode:[{required:true,message:'请输入短信验证码',trigger:'blur'}]
+                picCode:[{required:true,message:/* '请输入图形验证码' */this.$t('LoginPage.ph_img_code'),trigger:'blur'}],
+                checkCode:[{required:true,message:/* '请输入短信验证码' */this.$t('LoginPage.ph_msg_code'),trigger:'blur'}]
             }
         };
     },
     methods: {
         checkForm(){
             //首先检查是否是重新获取验证码
-            if(this.codeStr==='重新获取'&&!this.isGetNewCode){
+            if(this.codeStr===this.$t('LoginPage.recode_msg')&&!this.isGetNewCode){
                 //引导用户重新输入图形验证码
-                this.$message.warning('重新获取需再次输入图形验证码')
+                this.$message.warning(/* '重新获取需再次输入图形验证码' */this.$t('LoginPage.recode_warn_msg'))
                 this.getCodePic()
                 this.form.picCode = ''
                 this.isGetNewCode = true
@@ -121,11 +121,11 @@ export default {
             //检查手机号和图形验证码是否正确
             const {picCode,mobile} = this.form
             if(!picCode.length){
-                this.$message.warning('请输入图形验证码')
+                this.$message.warning(/* '请输入图形验证码' */this.$t('LoginPage.ph_img_code'))
                 return
             }
             if(this.areaCodeSelect==='86'&&!isMobileNo(mobile)){
-                this.$message.warning('请输入正确的手机号')
+                this.$message.warning(/* '请输入正确的手机号' */this.$t('LoginPage.vaild_curr_mobile'))
                 return
             }
 
@@ -139,7 +139,7 @@ export default {
                 Source:this.Source
             }).then(res=>{
                 if(res.Ret!==200) return 
-                this.$message.success('验证码已发送')
+                this.$message.success(/* '验证码已发送' */this.$t('LoginPage.send_code_msg'))
                 this.isGetNewCode = false
                 //60秒倒计时
                 this.codeCountDown = 60
@@ -151,6 +151,9 @@ export default {
 
         }
     },
+    mounted() {
+        this.getCodePic()
+    }
 };
 </script>
 

+ 9 - 9
src/views/login_manage/OrdinaryModel.vue

@@ -11,7 +11,7 @@
                     type="text"
                     v-model="form.account"
                     auto-complete="off"
-                    placeholder="请输入用户名"
+                    :placeholder="$t('LoginPage.ph_account')"
                 />
                 <span class="inline-message el-form-item__error" 
                     v-show="(loginCheck||accountCheck)&&form.account.length">
@@ -23,7 +23,7 @@
                     type="password" show-password
                     v-model="form.checkPass"
                     auto-complete="off"
-                    placeholder="请输入密码"
+                    :placeholder="$t('LoginPage.ph_pwd')"
                     @copy.native.capture.prevent="()=>{return false}"
                     @cut.native.capture.prevent="()=>{return false}"
                     @paste.native.capture.prevent="()=>{return false}"
@@ -34,14 +34,14 @@
             </el-form-item>
             <el-form-item class="remember-cont" prop="checked">
                 <el-checkbox v-model="form.checked" class="remember">
-                    记住账号密码
-                    <el-tooltip effect="dark" content="有效期60天" placement="top">
+                    <!-- 记住账号密码 -->{{ $t('LoginPage.label_remember') }}
+                    <el-tooltip effect="dark" :content="$t('LoginPage.vaild_day_msg')" placement="top">
                         <span class="hint-text">
                             <i class="el-icon-question"></i>
                         </span>
                     </el-tooltip>
                 </el-checkbox>
-                <el-button type="text" style="font-size: 16px;" @click="changeModel">忘记密码</el-button>
+                <el-button type="text" style="font-size: 16px;" @click="changeModel"><!-- 忘记密码 -->{{ $t('LoginPage.label_forget') }}</el-button>
             </el-form-item>
         </el-form>
     </div>
@@ -76,11 +76,11 @@ export default {
             },
             rules:{
                 account:[
-                    {required: true,message: "请输入账号",trigger: "blur"},
+                    {required: true,message: /* "请输入账号" */this.$t('LoginPage.ph_account'),trigger: "blur"},
                     {validator:validateClearn,trigger:['change']}
                 ],
                 checkPass:[
-                    {required: true,message: "请输入密码",trigger: "blur"},
+                    {required: true,message: /* "请输入密码" */this.$t('LoginPage.ph_pwd'),trigger: "blur"},
                     {validator:validateClearn,trigger:['change']}
                 ]
             },
@@ -91,14 +91,14 @@ export default {
         loginCheck(newVal){
             //显示/隐藏inline-message
             if(newVal){
-                this.hintMessage="账号或密码错误"
+                this.hintMessage=/* "账号或密码错误" */ this.$t('LoginPage.error_wrong_msg')
             }else{
                 this.hintMessage=''
             }
         },
         accountCheck(newVal){
             if(newVal){
-                this.hintMessage="账号异常,请通过验证登录"
+                this.hintMessage=/* "账号异常,请通过验证登录" */this.$t('LoginPage.error_abnormal_msg')
             }else{
                 this.hintMessage=''
             }

+ 6 - 2
src/views/login_manage/components/ModelSteps.vue

@@ -7,7 +7,7 @@
             <div class="step-line"></div>
             <div class="step-num" v-if="index+1>=activeStep">{{index+1}}</div>
             <div class="step-num" v-else><i class="el-icon-check"></i></div>
-            <div class="step-text">{{step.text}}</div>
+            <div class="step-text">{{textMap[step.text]}}</div>
             
         </li>
     </ul>
@@ -33,7 +33,11 @@ export default {
     },
     data() {
         return {
-
+            textMap: {
+                '选择验证方式':  this.$t('LoginPage.step_vaild_one'),
+                '进行安全验证':  this.$t('LoginPage.step_vaild_two'),
+                '设置密码':  this.$t('LoginPage.step_vaild_three'),
+            }
         };
     },
     methods: {

+ 1 - 1
src/views/login_manage/components/VerificationBox.vue

@@ -4,7 +4,7 @@
             <img :src="verifiesType==='mobile'?mobile_src:email_src" />
         </div>
         <div class="text">{{infoText}}</div>
-        <el-button  type="primary" @click="goNext" v-if="!hideBtn" :disabled="countDown">{{countDown?`重发(${countDown}秒)`:btnText}}</el-button>
+        <el-button  type="primary" @click="goNext" v-if="!hideBtn" :disabled="countDown">{{countDown?`重发(${countDown}秒)`:(btnText==='开始验证'?$t('LoginPage.send_vaild_btn'):btnText)}}</el-button>
     </div>
 </template>
 

+ 2 - 2
src/views/login_manage/modelMixins.js

@@ -23,10 +23,10 @@ export default {
             /* if(!this.timer) return */
             //console.log('click down')
             this.codeCountDown--
-            this.codeStr=`重新获取(${this.codeCountDown})秒`
+            this.codeStr=/* `重新获取(${this.codeCountDown})秒` */ this.$t('LoginPage.recode_ing_msg',{count: this.codeCountDown})
             if(this.codeCountDown<=0){
                 clearInterval(this.timer)
-                this.codeStr = '重新获取'
+                this.codeStr = /* '重新获取' */ this.$t('LoginPage.recode_msg')
                 return
             }
         }

+ 110 - 66
src/views/mychart_manage/components/chartDetailDia.vue

@@ -122,7 +122,7 @@
               class="span-item"
               style="margin-left: 7px"
               @click="saveChartMapHandle"
-              v-if="[1,2,5].includes(chartInfo.Source)"
+              v-if="[1,2,5,10].includes(chartInfo.Source)"
             >
               <span> <i class="el-icon-collection" />&nbsp;<!-- 保存 -->{{$t('Chart.chart_save_btn')}} </span>
             </span>
@@ -193,6 +193,8 @@
               v-permission="permissionBtn.myETAPermission.myChart_del"
               :title="$t('Chart.OptMsg.chart_del_confirm')"
               icon="el-icon-info"
+              :confirm-button-text="$t('Dialog.confirm_btn')"
+              :cancel-button-text="$t('Dialog.cancel_btn')"
               @onConfirm="delChartHandle"
               v-if="chartInfo.Button.IsEdit"
             >
@@ -214,65 +216,66 @@
               <template v-if="!chartInfo.WarnMsg">
                 <Chart :options="options" :chartInfo="chartInfo" ref="chartRef"/>
                 <!-- 上下限 -->
-                <div class="range-cont left" v-if="leftIndex != -1">
-                  <el-input
-                    style="width: 60px; display: block"
-                    size="mini"
-                    type="number"
-                    placeholder="上限"
-                    :disabled="!isAllowEditLimit"
-                    v-model="tableData[leftIndex].MaxData"
-                  />
-                  <el-input
-                    class="min-data-input"
-                    size="mini"
-                    type="number"
-                    placeholder="下限"
-                    :disabled="!isAllowEditLimit"
-                    v-model="tableData[leftIndex].MinData"
-                  />
-                </div>
-                <div class="range-cont right" v-if="rightIndex != -1">
-                  <el-input
-                    style="width: 60px; display: block"
-                    size="mini"
-                    type="number"
-                    placeholder="上限"
-                    :disabled="!isAllowEditLimit"
-                    v-model="tableData[rightIndex].MaxData"
-                  />
-                  <el-input
-                    class="min-data-input"
-                    size="mini"
-                    type="number"
-                    placeholder="下限"
-                    :disabled="!isAllowEditLimit"
-                    v-model="tableData[rightIndex].MinData"
-                  />
-                </div>
-
-                <!-- 右2上下限设置 -->
-                <div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
-                  <el-input
-                    style="width: 60px; display: block"
-                    size="mini"
-                    type="number"
-                    placeholder="上限"
-                    :disabled="!isAllowEditLimit"
-                    v-model="tableData[rightTwoIndex].MaxData"
-                  />
-                  <el-input
-                    class="min-data-input"
-                    size="mini"
-                    type="number"
-                    placeholder="下限"
-                    :disabled="!isAllowEditLimit"
-                    v-model="tableData[rightTwoIndex].MinData"
-                  />
-                </div>
+                <template v-if="chartInfo.Source===1&&![7,10,11].includes(chartInfo.ChartType)">
+                    <div class="range-cont left" v-if="leftIndex !== -1">
+                        <el-input
+                            style="width: 60px; display: block"
+                            size="mini"
+                            type="number"
+                            placeholder="上限"
+                            v-model="chartLimit.max"
+                            @change="changeLimit"
+                        />
+                        <el-input
+                            class="min-data-input"
+                            size="mini"
+                            type="number"
+                            placeholder="下限"
+                            v-model="chartLimit.min"
+                            @change="changeLimit"
+                        />
+                    </div>
+                    <div class="range-cont right" v-if="rightIndex !== -1">
+                        <el-input
+                            style="width: 60px; display: block"
+                            size="mini"
+                            type="number"
+                            placeholder="上限"
+                            v-model="chartLimit.rightMax"
+                            @change="changeLimit"
+                        />
+                        <el-input
+                            class="min-data-input"
+                            size="mini"
+                            type="number"
+                            placeholder="下限"
+                            v-model="chartLimit.rightMin"
+                            @change="changeLimit"
+                        />
+                    </div>
+                    <!-- 右2上下限设置 -->
+                    <div class="range-cont rightTwo" v-if="rightTwoIndex !== -1">
+                        <el-input
+                            style="width: 60px; display: block"
+                            size="mini"
+                            type="number"
+                            placeholder="上限"
+                            v-model="chartLimit.rightTwoMax"
+                            @change="changeLimit"
+                        />
+                        <el-input
+                            class="min-data-input"
+                            size="mini"
+                            type="number"
+                            placeholder="下限"
+                            v-model="chartLimit.rightTwoMin"
+                            @change="changeLimit"
+                        />
+                    </div>
+                </template>
 
                   <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-                <template v-if="[7,10,11].includes(chartInfo.ChartType)">	
+                <template v-if="[7,10,11].includes(chartInfo.ChartType)||[2,5,10].includes(chartInfo.Source)">	
                   <div class="range-cont left">
                     <el-input
                       style="width: 60px; display: block"
@@ -577,7 +580,7 @@
 import { dataBaseInterface,mychartInterface } from '@/api/api.js';
 import futuresInterface from '@/api/modules/futuresBaseApi';
 import chartRelevanceApi from '@/api/modules/chartRelevanceApi';
-import { fittingEquationInterface,statisticFeatureInterface } from '@/api/modules/chartRelevanceApi';
+import { fittingEquationInterface,statisticFeatureInterface,crossVarietyInterface } from '@/api/modules/chartRelevanceApi';
 import {
   seasonOptions,
   copyOtherOptions
@@ -592,7 +595,7 @@ import { copyFit } from '@/utils/svgToblob.js';
 
 export default {
   components: { Chart, DateChooseDia,SaveChartOther,changeLang,setEnNameDia },
-  mixins: [ chartSetMixin ],
+  mixins: [ chartSetMixin],
   directives: {
     'click-outside':{
       bind(el, binding) {
@@ -731,8 +734,12 @@ export default {
             this.setDefaultSourceFrom();
             
             this.tableData = res.Data.EdbInfoList;
+            //初始化上下限
+            this.setLimitData(this.tableData)
+            
             //eta图
             this.setDefaultDateSelect(); //设置默认的日期选中
+
             this.chartInfo.ChartType === 7 && this.initBarData(res.Data);
 
             //截面散点图
@@ -786,11 +793,13 @@ export default {
           }else if(this.chartInfo.Source===10) { //跨品种分析
             this.tableData = res.Data.EdbInfoList;
             this.crossVarietyChartData = res.Data.DataResp;
+
+            /* 历史数据chartInfo里全是空 兼容下历史数据不崩 */
             this.chartLimit = {
-              min: Number(res.Data.DataResp.YMinValue),
-              max: Number(res.Data.DataResp.YMaxValue),
-              x_min: Number(res.Data.DataResp.XMinValue),
-              x_max: Number(res.Data.DataResp.XMaxValue)
+              min: res.Data.ChartInfo.LeftMin?Number(res.Data.ChartInfo.LeftMin):Number(res.Data.DataResp.YMinValue),
+              max: res.Data.ChartInfo.LeftMax?Number(res.Data.ChartInfo.LeftMax):Number(res.Data.DataResp.YMaxValue),
+              x_min: res.Data.ChartInfo.XMin?Number(res.Data.ChartInfo.XMin):Number(res.Data.DataResp.XMinValue),
+              x_max: res.Data.ChartInfo.XMax?Number(res.Data.ChartInfo.XMax):Number(res.Data.DataResp.XMaxValue),
             }
             this.setCrossVarietyChart();
           }
@@ -1110,6 +1119,7 @@ export default {
         1: this.saveChartHandle,
         2: this.saveCommodityChart,
         5: this.saveCommodityChart,//利润曲线
+        10: this.saveCrossVarietyChart
       }
       sourceMap[this.chartInfo.Source]&&sourceMap[this.chartInfo.Source]();
     },
@@ -1129,6 +1139,24 @@ export default {
 			this.setChartImage();
 		},300),
 
+    saveCrossVarietyChart: _.debounce(async function() {
+      let { min,max,x_min,x_max } = this.chartLimit;
+      let params = {
+        ChartInfoId: this.chartInfo.ChartInfoId,
+        XMin: String(x_min),
+				XMax: String(x_max),
+				LeftMin: String(min),
+				LeftMax: String(max),
+      }
+			let res = await crossVarietyInterface.saveChart(params);
+
+			if(res.Ret !== 200) return
+
+			this.$message.success('保存成功')
+			//关联图表和图片
+			this.setChartImage();
+    },300),
+
     /* 保存当前图表配置 */
     saveChartHandle: _.debounce(function () {
       //遍历每条线的指标配置
@@ -1202,7 +1230,23 @@ export default {
             EndDate: this.year_select === 5 ? this.select_date[1] : '',
           }
         : typeChartParam;
-
+        
+        if(![7,10,11].includes(this.selected_chartType)){
+            const {
+                min,max,rightMin,rightMax,rightTwoMin,rightTwoMax
+            } = this.chartLimit
+            params = {
+                ...params,
+                LeftMin:min+'',
+                LeftMax:max+'',
+                RightMin:rightMin+'',
+                RightMax:rightMax+'',
+                Right2Min:rightTwoMin+'',
+                Right2Max:rightTwoMax+'',
+                //手动保存视为更改过上下限
+                MinMaxSave:1
+            }
+        }
       dataBaseInterface.chartSave(params).then((res) => {
         if (res.Ret === 200) {
           // this.$message.success('保存成功');
@@ -1313,7 +1357,7 @@ export default {
         );
       mychartInterface.del({ MyChartId: item.MyChartId,MyChartClassifyId: this.select_classify }).then((res) => {
         if (res.Ret !== 200) return;
-        this.$message.success('移出成功');
+        this.$message.success(/* '移出成功' */this.$t('MsgPrompt.move_out_msg'));
         item.IsAdd = false;
 				sessionStorage.removeItem('myChartbeforeOptions');
 

+ 4 - 4
src/views/mychart_manage/components/classifyDeleteCheck.vue

@@ -11,10 +11,10 @@
     >
         <div slot="title" style="display: flex; align-items: center;">
             <i style="color:#FF8A00;font-size: 16px;" class="el-icon-warning"></i>
-            <span style="font-size: 16px;color:#333;margin-left: 5px;">提示</span>
+            <span style="font-size: 16px;color:#333;margin-left: 5px;"><!-- 提示 -->{{$t('Dialog.warn_tit')}}</span>
         </div>
         <div class="dialog-container">
-            <p>该图分类已添加节点链接,不允许删除!</p>
+            <p><!-- 该图分类已添加节点链接,不允许删除! -->{{ $t('Chart.OptMsg.del_classify_link_msg') }}</p>
             <div class="frame-list">
                 <p class="frame-item" v-for="(item,index) in detailArr" :key="index" @click="goToFrameList(item)">
                     {{index+1}}、{{item.FrameworkName}}({{item.NodeName}})
@@ -22,8 +22,8 @@
             </div>
         </div>
         <div class="dialog-footer">
-            <el-button @click="$emit('close')">取消</el-button>
-            <el-button type="primary" @click="$emit('close')">确定</el-button>
+            <el-button @click="$emit('close')"><!-- 取消 -->{{$t('Dialog.cancel_btn')}}</el-button>
+            <el-button type="primary" @click="$emit('close')"><!-- 确定 -->{{$t('Dialog.confirm_btn')}}</el-button>
         </div>
     </el-dialog>
 </template>

+ 14 - 15
src/views/mychart_manage/index.vue

@@ -643,19 +643,19 @@ export default {
 
     /* 添加分类回调 */
     addClassifyBack(params, title) {
-      title === '新增分类' &&
+      title === this.$t('MyEtaPage.label_add_classify') &&
         mychartInterface
           .addClassify({
             MyChartClassifyName: params.name,
           })
           .then((res) => {
             if (res.Ret !== 200) return;
-            this.$message.success('新增成功');
+            this.$message.success(/* '新增成功' */this.$t('MsgPrompt.add_msg'));
             this.isClassifyDia = false;
             this.getClassify();
           });
 
-      title === '重命名分类' &&
+      title === this.$t('MyEtaPage.label_rename_classify') &&
         mychartInterface
           .editClassify({
             MyChartClassifyName: params.name,
@@ -663,13 +663,13 @@ export default {
           })
           .then((res) => {
             if (res.Ret !== 200) return;
-            this.$message.success('编辑成功');
+            this.$message.success(/* '编辑成功' */this.$t('MsgPrompt.edit_msg'));
             this.isClassifyDia = false;
             this.getClassify();
             this.getPublicClassify();
           });
 
-      title === '复制图表分类' &&
+      title === this.$t('MyEtaPage.label_copy_classify') &&
         mychartInterface
           .copyMyChart({
             ChartInfoId: this.move_id,
@@ -677,7 +677,7 @@ export default {
           })
           .then((res) => {
             if (res.Ret !== 200) return;
-            this.$message.success('复制成功');
+            this.$message.success(/* '复制成功' */this.$t('MsgPrompt.copy_success_msg'));
             this.isClassifyDia = false;
             // this.isOpenDetail = false;
             // this.select_classify = '';
@@ -716,7 +716,7 @@ export default {
         MyChartClassifyId: this.select_classify
       }).then(res => {
         if(res.Ret !== 200) return;
-        this.$message.success('复制成功');
+        this.$message.success(/* '复制成功' */this.$t('MsgPrompt.copy_success_msg'));
         this.getClassify();
       });
 
@@ -727,7 +727,7 @@ export default {
         MyChartClassifyId: this.select_classify
       }).then(res => {
         if(res.Ret !== 200) return;
-        this.$message.success('设置成功');
+        this.$message.success(/* '设置成功' */this.$t('MsgPrompt.set_success_msg'));
         if(key === 'own'){
           item.IsPublic=0
           item.IsCompanyPublic=0
@@ -744,7 +744,7 @@ export default {
           IsCompanyPublic:IsCompanyPublic
         }).then(res=>{
           if(res.Ret !== 200) return;
-          this.$message.success('操作成功');
+          this.$message.success(/* '操作成功' */this.$t('MsgPrompt.operate_success_msg'));
           item.IsCompanyPublic=IsCompanyPublic
           // 不想请求接口
           // this.getPublicClassify();
@@ -794,11 +794,9 @@ export default {
             return
         }
         this.$confirm(
-          '若删除该分类,则分类下关联的所有图表将被全部删除, 是否继续?',
-          '提示',
+          /* '若删除该分类,则分类下关联的所有图表将被全部删除, 是否继续?' */this.$t('Chart.OptMsg.del_classify_chart_msg'),
+          /* '提示' */this.$t('Dialog.warn_tit'),
           {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
             type: 'warning',
           }
         )
@@ -809,7 +807,7 @@ export default {
               })
               .then((res) => {
                 if (res.Ret !== 200) return;
-                this.$message.success('删除成功');
+                this.$message.success(/* '删除成功' */ this.$t('MsgPrompt.delete_msg'));
                 this.getClassify();
                 this.getPublicClassify();
               });
@@ -930,7 +928,7 @@ export default {
         })
         .then((res) => {
           if (res.Ret !== 200) return;
-          this.$message.success('移出成功');
+          this.$message.success(/* '移出成功' */this.$t('MsgPrompt.move_out_msg'));
           this.page_no = 1;
           this.getChartList();
         });
@@ -1091,6 +1089,7 @@ export default {
       overflow: auto;
       max-height: calc(100vh - 290px);
       position: relative;
+      margin-right: 20px;
       .classify-item {
         padding: 10px 30px;
         display: flex;

+ 12 - 11
src/views/operation_manage/AIQA/AIQA.vue

@@ -63,7 +63,7 @@
                 <div class="upload-row">
                     <el-upload
                     style="display: inline-block; margin-right: 8px"
-                    accept=".pptx,.pdf"
+                    accept=".pptx,.pdf,.docx"
                     action=""
                     :http-request="handleUpload"
                     :before-upload="handleBeforeUpload"
@@ -71,7 +71,7 @@
                     :disabled="startUploadAudio">
                         <img src="~@/assets/img/icons/ai-upload.png" />
                     </el-upload>
-                    <span>支持格式:PDF、PPTX;大小不超过10MB;要求纯文本,不含图片</span>
+                    <span>支持格式:PDF、PPTX、DOCX;大小不超过50MB</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>
@@ -131,7 +131,8 @@ export default {
             companyName:'',
             aiFileIds:[],
             // 上传窗口的队列
-            windowSet:new Set()
+            windowSet:new Set(),
+            fileTypeRule:new RegExp(/\.pdf|\.pptx|\.docx$/,'i')
         };
     },
     watch:{
@@ -453,14 +454,14 @@ export default {
                     return this.$message.error("单次只能上传一个文件,请重试");
                 }else{
                     let file = DataTransferItemList[0]
-                    if(file.type && (file.name.endsWith('.pdf')||file.name.endsWith('.pptx'))){
-                        if(file.size/1024/1024 > 10.1){
-                            this.$message.error("上传文件大小不超过10MB");
+                    if(file.type && this.fileTypeRule.test(file.name)){
+                        if(file.size/1024/1024 > 50.1){
+                            this.$message.error("上传文件大小不超过50MB");
                             return false;
                         }
                         this.handleUpload({file})
                     }else{
-                        return this.$message.error("上传文件格式只支持PDF、PPTX");
+                        return this.$message.error("上传文件格式只支持PDF、PPTX、DOCX");
                     }
                 }
             }else{
@@ -470,12 +471,12 @@ export default {
             }
         },
         handleBeforeUpload(e) {
-            if(!(e.name.endsWith('.pdf') || e.name.endsWith('.pptx'))){
-                this.$message.error("上传文件格式只支持PDF、PPTX");
+            if(!this.fileTypeRule.test(e.name)){
+                this.$message.error("上传文件格式只支持PDF、PPTX、DOCX");
                 return false;
             }
-            if(!(e.size/1024/1024 < 10.1)){
-                this.$message.error("上传文件大小不超过10MB");
+            if(!(e.size/1024/1024 < 50.1)){
+                this.$message.error("上传文件大小不超过50MB");
                 return false;
             }
         },

+ 8 - 5
src/views/operation_manage/AIQA/components/messageItem.vue

@@ -69,12 +69,15 @@ export default {
         },
         getFileIcon(){
             if(this.messageInfo.askFileUrl){
-                if(this.messageInfo.askFileUrl.endsWith('.pdf')){
-                    return require('@/assets/img/icons/file_type_pdf.png')
-                }else if(this.messageInfo.askFileUrl.endsWith('.pptx')){
-                    return require('@/assets/img/icons/file_type_ppt.png')
+                let fileUrl=this.messageInfo.askFileUrl.toLocaleLowerCase()
+                if(fileUrl.endsWith('.pdf')){
+                    return require('@/assets/img/cloudDisk/pdf_icon.png')
+                }else if(fileUrl.endsWith('.pptx')){
+                    return require('@/assets/img/cloudDisk/ppt_icon.png')
+                }else if(fileUrl.endsWith('.doc') || fileUrl.endsWith('.docx')){
+                    return require('@/assets/img/cloudDisk/word_icon.png')
                 }else{
-                    return require('@/assets/img/icons/file_type_unknown.png')
+                    return require('@/assets/img/cloudDisk/config_icon.png')
                 }
             }else{
                 return ''

+ 194 - 11
src/views/ppt_manage/mixins/mixins.js

@@ -52,7 +52,14 @@ export default {
       barDateList: [],//柱形图的绘图数据
       barXIdData: [],//柱形图的x轴
       barEdbData: [],//柱形图的表格数据 只用于取值
-      chartLimit: {},
+      chartLimit: {
+        min:'', //左轴上下限
+        max:'',
+        rightMin:'',//右轴上下限
+        rightMax:'',
+        rightTwoMin:'',//右二轴上下限
+        rightTwoMax:'',
+      },
 
       /* 商品价格曲线 */
       commodityChartData: [],
@@ -115,6 +122,26 @@ export default {
       chartData.forEach((item, index) => {
         //轴位置值相同的下标
         let sameSideIndex = chartData.findIndex(i => i.IsAxis === item.IsAxis);
+        //获取对应轴的上下限
+        //非ETA图库图表也不设置自定义上下限
+        const isETASource = this.chartInfo.Source===1
+        let minLimit = 0,maxLimit = 0
+        if(isETASource){
+            const limitMap = {
+                0:['rightMin','rightMax'],
+                1:['min','max'],
+                2:['rightTwoMin','rightTwoMax']
+            }
+            if(limitMap[item.IsAxis]){
+                minLimit = this.chartLimit[`${limitMap[item.IsAxis][0]}`]||0
+                maxLimit = this.chartLimit[`${limitMap[item.IsAxis][1]}`]||0
+            }
+        }else{
+            minLimit = this.dataList[sameSideIndex].MinData
+            maxLimit = this.dataList[sameSideIndex].MaxData
+            console.log('useDefault',minLimit,maxLimit)
+        }
+        
         //y轴
         const textZh = item.ConvertUnit||item.Unit
         const textEn = item.ConvertEnUnit||item.UnitEn||item.ConvertUnit||item.Unit
@@ -147,8 +174,8 @@ export default {
           },
           opposite: [0,2].includes(item.IsAxis),
           reversed: item.IsOrder,
-          min: Number(item.MinData),
-          max: Number(item.MaxData),
+          min: Number(minLimit),
+          max: Number(maxLimit),
           tickWidth: 1,
           visible: sameSideIndex === index,
           plotBands: this.setAxisPlotAreas(item.IsAxis),
@@ -278,6 +305,19 @@ export default {
         ? -1
         : this.dataList.findIndex((item) => item.IsAxis===2);
 
+         //获取对应轴的上下限
+         let minLimit = 0,maxLimit = 0
+         const limitMap = {
+            0:['rightMin','rightMax'],
+            1:['min','max'],
+            2:['rightTwoMin','rightTwoMax']
+        }
+        if(limitMap[item.IsAxis]){
+            minLimit = this.chartLimit[`${limitMap[item.IsAxis][0]}`]||0
+            maxLimit = this.chartLimit[`${limitMap[item.IsAxis][1]}`]||0
+        }
+        console.log('test堆积',minLimit,maxLimit)
+
         //y轴
         let yItem = {
           ...basicYAxis,
@@ -308,8 +348,8 @@ export default {
           },
           opposite: [0,2].includes(item.IsAxis),
           reversed: item.IsOrder,
-          min: Number(chartData[sameSideIndex].MinData),
-          max: Number(chartData[sameSideIndex].MaxData),
+          min: Number(minLimit),
+          max: Number(maxLimit),
           tickWidth: sameSideIndex !== index ? 0 : 1,
           visible: serie_yIndex === index && sameSideIndex ===index,
           plotBands: this.setAxisPlotAreas(item.IsAxis),
@@ -402,6 +442,10 @@ export default {
       let seasonYdata = [],
         seasonData = []
 
+        //获取对应轴的上下限
+        let minLimit = 0,maxLimit = 0
+        minLimit = this.chartLimit.min||0
+        maxLimit = this.chartLimit.max||0
       //数据列
       for (let j of chartDataHandle) {
           //预测指标配置
@@ -455,8 +499,8 @@ export default {
           textAlign: 'left',
           reserveSpace: false
         },
-        max: Number(chartData.MaxData),
-        min: Number(chartData.MinData),
+        max: Number(maxLimit),
+        min: Number(minLimit),
         plotBands: this.setAxisPlotAreas(1),
         plotLines: this.setAxisPlotLines(1)
       }];
@@ -560,6 +604,10 @@ export default {
       }
 
       const { IsOrder,ChartColor,MaxData,MinData } = chartData[0];
+      //获取对应轴的上下限
+      let minLimit = 0,maxLimit = 0
+      minLimit = this.chartLimit.min||0
+      maxLimit = this.chartLimit.max||0
       //y轴
       const textYZh = chartData[1].ConvertUnit||chartData[1].Unit
       const textYEn = chartData[1].ConvertEnUnit||chartData[1].UnitEn||chartData[1].ConvertUnit||chartData[1].Unit
@@ -587,8 +635,8 @@ export default {
         },
         opposite: false,
         reversed: IsOrder,
-        min: Number(chartData[1].MinData),
-        max: Number(chartData[1].MaxData),
+        min: Number(minLimit),
+        max: Number(maxLimit),
         tickWidth: 1,
         tickLength: 5,
         lineWidth: 1,
@@ -1429,6 +1477,10 @@ export default {
 
        //数据列
       let series = [];
+      const tagMap = { //标签对应文字
+        1: '最新',
+        3: 'Fix'
+      }
       DataList.forEach(item => {
         //数据列
         let series_item = {
@@ -1442,7 +1494,16 @@ export default {
           zIndex:1
         }
         item.CoordinatePointData.forEach(_ => {
-          series_item.data.push({x: _.X,y: _.Y,})
+          series_item.data.push({
+            x: _.X,
+            y: _.Y,
+            dataLabels: {
+              enabled: _.ShowTips===1,
+              allowOverlap: true,
+              align: 'left',
+              format: tagMap[_.DateType] || `-${_.DaysAgo}D`,
+            }
+          })
         })
         series.push(series_item);
       })
@@ -1812,6 +1873,128 @@ export default {
       })
 
       return plotBands
-    }
+    },
+    /* ----自定义上下限相关--- */
+    setLimitData(tableData=[]){
+        const {
+            //左右轴极值字段 
+            LeftMin=0,LeftMax=0,
+            RightMin=0,RightMax=0,
+            Right2Min=0,Right2Max=0,
+            MinMaxSave
+        } = this.chartInfo
+        if(MinMaxSave){
+            this.chartLimit.min = Number(LeftMin)
+            this.chartLimit.max = Number(LeftMax)
+            this.chartLimit.rightMin = Number(RightMin)
+            this.chartLimit.rightMax = Number(RightMax)
+            this.chartLimit.rightTwoMin = Number(Right2Min)
+            this.chartLimit.rightTwoMax = Number(Right2Max)
+            //若用户修改过,则检测轴的上下限是否为空,若为空,则需要计算对应轴的上下限
+            this.checkChartLimit(tableData)
+        }else{
+            this.calcYAxislimit(tableData)
+        }
+    },
+    checkChartLimit(tableData=[]){
+        //散点图单独处理
+        if(this.chartInfo.ChartType===5){
+            if(tableData[1]){
+                const {min,max} = this.chartLimit
+                if(Number(min)===0&&Number(max)===0){
+                    this.chartLimit.min = tableData[1].MinData
+                    this.chartLimit.max = tableData[1].MaxData
+                }
+            }
+            return 
+        }
+        const {
+            min,max,rightMin,rightMax,rightTwoMin,rightTwoMax
+        } = this.chartLimit
+        //若轴的上下限均为0,则不管用户有没有修改过,都重新赋值
+        if(Number(min)===0&&Number(max)===0){
+            const leftData = tableData.filter(i=>i.IsAxis===1).map(i=>[Number(i.MinData),Number(i.MaxData)])
+            if(leftData.length){
+                const {Max,Min} = this.calcLimit(leftData.flat())
+                this.chartLimit.min=Min
+                this.chartLimit.max=Max
+            }
+        }
+        if(Number(rightMin)===0&&Number(rightMax)===0){
+            const rightData = tableData.filter(i => !i.IsAxis).map(i=>[Number(i.MinData),Number(i.MaxData)])
+            if(rightData.length){
+                const {Max,Min} = this.calcLimit(rightData.flat())
+                this.chartLimit.rightMin = Min
+                this.chartLimit.rightMax = Max
+            }
+        }
+        if(Number(rightTwoMin)===0&&Number(rightTwoMax)===0){
+            const rightTwoData = tableData.filter(i=>i.IsAxis===2).map(i=>[Number(i.MinData),Number(i.MaxData)])
+            if(rightTwoData.length){
+                const {Max,Min} = this.calcLimit(rightTwoData.flat())
+                this.chartLimit.rightTwoMin = Min
+                this.chartLimit.rightTwoMax = Max
+            }
+        }
+    },
+    /* 计算y轴上下限 */
+    calcYAxislimit(tableData=[]) {
+        //散点图单独处理
+        if(this.chartInfo.ChartType===5){
+            if(tableData[1]){
+                this.chartLimit.min = tableData[1].MinData
+                this.chartLimit.max = tableData[1].MaxData
+            }
+            return 
+        }
+        //分组
+        const leftData = tableData.filter(i => i.IsAxis === 1).map(i => [Number(i.MinData), Number(i.MaxData)])
+        const rightData = tableData.filter(i => !i.IsAxis).map(i => [Number(i.MinData), Number(i.MaxData)])
+        const rightTwoData = tableData.filter(i => i.IsAxis === 2).map(i => [Number(i.MinData), Number(i.MaxData)])
+        //计算最大最小值
+        if (leftData.length) {
+            const {
+                Max,
+                Min
+            } = this.calcLimit(leftData.flat())
+            this.chartLimit.min=Min
+            this.chartLimit.max=Max
+        } else {
+            this.leftIndex = -1
+            this.chartLimit.min=0
+            this.chartLimit.max=0
+        }
+        if (rightData.length) {
+            const {
+                Max,
+                Min
+            } = this.calcLimit(rightData.flat())
+            this.chartLimit.rightMin = Min
+            this.chartLimit.rightMax = Max
+        } else {
+            this.rightIndex = -1
+            this.chartLimit.rightMin = 0
+            this.chartLimit.rightMax = 0
+        }
+        if (rightTwoData.length) {
+            const {
+                Max,
+                Min
+            } = this.calcLimit(rightTwoData.flat())
+            this.chartLimit.rightTwoMin = Min
+            this.chartLimit.rightTwoMax = Max
+        } else {
+            this.rightTwoIndex = -1
+            this.chartLimit.rightTwoMin = 0
+            this.chartLimit.rightTwoMax = 0
+        }
+    },
+    calcLimit(arr) {
+        return {
+            Max: Math.max(...arr),
+            Min: Math.min(...arr)
+        }
+    },
+    /*-------------------- */
   },
 };

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

@@ -211,6 +211,8 @@ export default {
         this.setDefaultSourceFrom();
         
         this.dataList = Data.EdbInfoList;
+        //初始化上下限
+        this.setLimitData(this.dataList)
         //柱形图独立数据
         this.chartInfo.ChartType === 7 && this.initBarData(res.Data);
         //截面散点图
@@ -265,11 +267,13 @@ export default {
       }else if(this.chartInfo.Source===10) {
         this.dataList = res.Data.EdbInfoList;
         this.crossVarietyChartData = res.Data.DataResp;
+        
+        /* 历史数据chartInfo里全是空 兼容下历史数据不崩 */
         this.chartLimit = {
-          min: Number(res.Data.DataResp.YMinValue),
-          max: Number(res.Data.DataResp.YMaxValue),
-          x_min: Number(res.Data.DataResp.XMinValue),
-          x_max: Number(res.Data.DataResp.XMaxValue)
+          min: res.Data.ChartInfo.LeftMin?Number(res.Data.ChartInfo.LeftMin):Number(res.Data.DataResp.YMinValue),
+          max: res.Data.ChartInfo.LeftMax?Number(res.Data.ChartInfo.LeftMax):Number(res.Data.DataResp.YMaxValue),
+          x_min: res.Data.ChartInfo.XMin?Number(res.Data.ChartInfo.XMin):Number(res.Data.DataResp.XMinValue),
+          x_max: res.Data.ChartInfo.XMax?Number(res.Data.ChartInfo.XMax):Number(res.Data.DataResp.XMaxValue),
         }
         this.setCrossVarietyChart();
         this.changeRelevanceOptions();//更改英文一样

+ 1 - 0
src/views/ppt_manage/newVersion/pptCatalog.vue

@@ -1440,6 +1440,7 @@ export default {
       margin-top:20px;
       height: calc(100vh - 290px);
       overflow-y: scroll;
+      margin-right:8px;
       &::-webkit-scrollbar-track{
         display: none;
       }

+ 1 - 0
src/views/ppt_manage/newVersion/pptEnCatalog.vue

@@ -1332,6 +1332,7 @@ export default {
       margin-top:20px;
       height: calc(100vh - 290px);
       overflow-y: scroll;
+      margin-right:8px;
       &::-webkit-scrollbar-track{
         display: none;
       }

+ 6 - 2
src/views/predictEdb_manage/predictEdb.vue

@@ -14,8 +14,12 @@
 							type="primary" @click="addEdbHandle"><!-- 添加指标 -->{{$t('EtaBasePage.add_edb_btn')}}</el-button>
 						<el-button v-permission="permissionBtn.predictEdbPermission.edbPreData_calcuEdb"
 							type="primary" @click="addComputedHandler" style="margin-right:10px;"><!-- 计算指标 -->{{$t('EtaBasePage.calculation_edb_btn')}}</el-button>
-						<!-- <change-lang v-permission="permissionBtn.predictEdbPermission.edbPreData_switchEn"
-							:lang="currentLang" style="height: 32px;" @changeLang="changeLangHandle"/> -->
+						<change-lang 
+							v-permission="permissionBtn.predictEdbPermission.edbPreData_switchEn"
+							:lang="currentLang" 
+							style="height: 32px;" 
+							@changeLang="changeLangHandle"
+						/>
 				</div>
 				<div class="search-cont" v-loading="searchLoading">
 					<el-select

+ 2 - 2
src/views/report_manage/addreportNew.vue

@@ -407,7 +407,7 @@ export default {
 				classifynameArr: [],
 				title: '',
 				abstract: '',
-				author: ['FICC团队'],
+				author: ['投研团队'],
 				frequency: '日度',
 				create_time: http.dateFormatter(new Date(), false).replace(/\./g,'-'),
 				content: '',
@@ -922,7 +922,7 @@ export default {
 					classifynameArr: [],
 					title: '',
 					abstract: '',
-					author: ['FICC团队'],
+					author: ['投研团队'],
 					frequency: this.$t('ReportManage.smart_daily'),
 					create_time: http.dateFormatter(new Date(), false),
 					content: '',

+ 37 - 2
src/views/report_manage/cloudDisk.vue

@@ -52,7 +52,7 @@
             </template>
             <template slot-scope="{row}">
               <div class="file-name">
-                <img :src="row.ItemIcon" />
+                <img :src="iconGetMap(row)" />
                 <span class="active-file-name">{{ row.ItemName }}</span>
               </div>
             </template>
@@ -195,7 +195,17 @@ import 'streamsaver/examples/zip-stream'
         isUploading:false,
         folderPath:'',
         // 选择文件弹窗
-        chooseFolderDiaShow:false
+        chooseFolderDiaShow:false,
+
+        staticFileIco: require('@/assets/img/cloudDisk/file_icon.png'),
+        staticImageIco: require('@/assets/img/cloudDisk/img_icon.png'),
+        staticWordIco: require('@/assets/img/cloudDisk/word_icon.png'),
+        staticExcelIco: require('@/assets/img/cloudDisk/excel_icon.png'),
+        staticPptIco: require('@/assets/img/cloudDisk/ppt_icon.png'),
+        staticPdfIco: require('@/assets/img/cloudDisk/pdf_icon.png'),
+        staticVideoIco: require('@/assets/img/cloudDisk/video_icon.png'),
+        staticAudioIco: require('@/assets/img/cloudDisk/audio_icon.png'),
+        staticConfigIco: require('@/assets/img/cloudDisk/config_icon.png'),
       }
     },
     watch:{
@@ -449,6 +459,7 @@ import 'streamsaver/examples/zip-stream'
       },
       // 下载文件
       downloadFile(row){
+        if(row.Size === 0) return this.$message.warning('文件夹为空')
         let downloadHint = this.$message({
           type:"info",
           message:row.ItemName+'开始下载,请勿重复下载',
@@ -679,6 +690,30 @@ import 'streamsaver/examples/zip-stream'
           this.downloadFile(row)
         }
         // console.log(type,row);
+      },
+
+      //静态icon资源
+      iconGetMap(item) {
+
+        //文件夹icon
+        if(item.ItemIcon.includes('file_type_menu')) return this.staticFileIco
+        //img icon
+        if(item.ItemIcon.includes('file_type_pic')) return this.staticImageIco
+        //其他icon
+        if(item.ItemIcon.includes('file_type_unknown')) return this.staticConfigIco
+        //音频icon
+        if(item.ItemIcon.includes('file_type_audio')) return this.staticAudioIco
+        //视频icon
+        if(item.ItemIcon.includes('file_type_video')) return this.staticVideoIco
+        //word icon
+        if(item.ItemIcon.includes('file_type_docx')) return this.staticWordIco
+        //excel icon
+        if(item.ItemIcon.includes('file_type_xlsx')) return this.staticExcelIco
+        //ppt icon
+        if(item.ItemIcon.includes('file_type_ppt')) return this.staticPptIco
+        //pdf icon
+        if(item.ItemIcon.includes('file_type_pdf')) return this.staticPdfIco
+
       }
     },
     created(){

+ 1 - 1
src/views/report_manage/editreportNew.vue

@@ -404,7 +404,7 @@ export default {
 				classifynameArr: [],
 				title: '',
 				abstract: '',
-				author: ['FICC团队'],
+				author: ['投研团队'],
 				frequency: '日度',
 				create_time: http.dateFormatter(new Date(), false),
 				content: '',

+ 1 - 1
src/views/report_manage/mixins/editor.js

@@ -42,7 +42,7 @@ export default {
           "redo",
         ],
         height: 800,
-        fontSize: ["12", "14", "16", "18", "20", "24", "28", "32", "36", "40"],
+        fontSize: ["12", "13","14","15", "16", "18", "20", "24", "28", "32", "36", "40"],
         fontSizeDefaultSelection: "16",
         theme: "dark", //主题
         placeholderText: "请输入内容",

+ 1 - 1
src/views/report_manage/mixins/reportMixin.js

@@ -92,7 +92,7 @@ export default {
           "redo",
         ],
         height: 800,
-        fontSize: ["12", "14", "16", "18", "20", "24", "28", "32", "36", "40"],
+        fontSize: ["12", "13","14","15", "16", "18", "20", "24", "28", "32", "36", "40"],
         fontSizeDefaultSelection: "16",
         theme: "dark", //主题
         placeholderText: "请输入内容",

+ 2 - 2
src/views/report_manage/reportEn/reportEditor.vue

@@ -419,7 +419,7 @@ export default {
 				classifynameArr: [],
 				title: '',
 				abstract: '',
-				author: ['Horizon Insights FICC Team'],
+				author: ['Investment Research Team'],
 				frequency: '日度',
 				create_time: http.dateFormatter(new Date(), false),
 				content: '',
@@ -489,7 +489,7 @@ export default {
 					'undo',
 					'redo',
         ],
-        fontSize: ["12", "14", "16", "18", "20", "24", "28", "32", "36", "40"],
+        fontSize: ["12", "13","14","15", "16", "18", "20", "24", "28", "32", "36", "40"],
         height:300,
         fontSizeDefaultSelection: "16",
         quickInsertEnabled: false,

+ 19 - 23
src/views/resetpassword.vue

@@ -2,7 +2,7 @@
   <div>
     <el-card class="box-card">
       <div slot="header" class="clearfix">
-        <b>修改密码</b>
+        <b><!-- 修改密码 -->{{ $t('MainPage.tab_reset_pwd') }}</b>
       </div>
       <el-form
         :model="addForm"
@@ -11,76 +11,72 @@
         ref="addForm"
         style="width: 500px"
       >
-        <el-form-item label="原密码" prop="OldPwd">
+        <el-form-item :label="$t('ResetPwdPage.label_old_pwd')" prop="OldPwd">
           <el-input
             type="text"
             v-model="addForm.OldPwd"
-            placeholder="请输入不超过20个字符"
+            :placeholder="$t('ResetPwdPage.ph_pwd')"
             clearable
             autocomplete="new-password"
           ></el-input>
         </el-form-item>
-        <el-form-item label="新密码" prop="NewPwd" v-if="visible">
+        <el-form-item :label="$t('ResetPwdPage.label_new_pwd')" prop="NewPwd" v-if="visible">
           <el-input
             type="password"
             v-model="addForm.NewPwd"
-            placeholder="请输入长度不超过20个字符"
+            :placeholder="$t('ResetPwdPage.ph_pwd')"
             maxlength="20"
             autocomplete="new-password"
           >
             <i
               slot="suffix"
               class="el-icon-view el-input__icon"
-              title="显示密码"
               @click="changePass('show')"
               style="cursor: pointer"
             ></i>
           </el-input>
         </el-form-item>
-        <el-form-item label="新密码" prop="NewPwd" v-else>
+        <el-form-item :label="$t('ResetPwdPage.label_new_pwd')" prop="NewPwd" v-else>
           <el-input
             type="text"
             v-model="addForm.NewPwd"
-            placeholder="请输入长度不超过20个字符"
+            :placeholder="$t('ResetPwdPage.ph_pwd')"
             maxlength="20"
             autocomplete="new-password"
           >
             <i
               slot="suffix"
               class="el-icon-more el-input__icon"
-              title="隐藏密码"
               @click="changePass('hide')"
               style="cursor: pointer"
             ></i>
           </el-input>
         </el-form-item>
-        <el-form-item label="确认新密码" prop="twoNewPwd" v-if="twovisible">
+        <el-form-item :label="$t('ResetPwdPage.label_ensure_pwd')" prop="twoNewPwd" v-if="twovisible">
           <el-input
             type="password"
             v-model="addForm.twoNewPwd"
-            placeholder="请输入长度不超过20个字符"
+            :placeholder="$t('ResetPwdPage.ph_pwd')"
             maxlength="20"
           >
             <i
               slot="suffix"
               class="el-icon-view el-input__icon"
-              title="显示密码"
               @click="changetwoPass('show')"
               style="cursor: pointer"
             ></i>
           </el-input>
         </el-form-item>
-        <el-form-item label="确认新密码" prop="twoNewPwd" v-else>
+        <el-form-item :label="$t('ResetPwdPage.label_ensure_pwd')" prop="twoNewPwd" v-else>
           <el-input
             type="text"
             v-model="addForm.twoNewPwd"
-            placeholder="请输入长度不超过20个字符"
+            :placeholder="$t('ResetPwdPage.ph_pwd')"
             maxlength="20"
           >
             <i
               slot="suffix"
               class="el-icon-more el-input__icon"
-              title="隐藏密码"
               @click="changetwoPass('hide')"
               style="cursor: pointer"
             ></i>
@@ -88,14 +84,14 @@
         </el-form-item>
         <el-form-item style="text-align: center;">
           <el-button type="primary" size="medium" @click.native="addSubmit"
-            >确定</el-button
+            ><!-- 确定 -->{{ $t('Dialog.confirm_btn') }}</el-button
           >
           <el-button
             type="primary"
             size="medium"
             plain
             @click.native="historyBack"
-            >返回</el-button
+            ><!-- 返回 -->{{ $t('Dialog.back_btn') }}</el-button
           >
         </el-form-item>
       </el-form>
@@ -122,7 +118,7 @@ export default {
         OldPwd: [
           {
             required: true,
-            message: "请输入原密码",
+            message: /* "请输入原密码" */ this.$t('ResetPwdPage.vaild_old'),
             trigger: "blur",
           },
         ],
@@ -130,7 +126,7 @@ export default {
             {
                 validator:(rule,value,callback)=>{
                     if(!checkPassWord(value)){
-                        callback(new Error('密码要求8位及以上,包含数字、大写字母、小写字母、特殊字符中的三个类型'))
+                        callback(new Error(/* '密码要求8位及以上,包含数字、大写字母、小写字母、特殊字符中的三个类型' */this.$t('ResetPwdPage.vaild_rule')))
                     }else{
                         callback()
                     }
@@ -138,14 +134,14 @@ export default {
             },
           {
             required: true,
-            message: "请输入确认密码",
+            message: /* "请输入确认密码" */this.$t('ResetPwdPage.vaild_new'),
             trigger: "blur",
           },
         ],
         twoNewPwd: [
           {
             required: true,
-            message: "请输入确认密码",
+            message: /* "请输入确认密码" */this.$t('ResetPwdPage.vaild_new'),
             trigger: "blur",
           },
         ],
@@ -165,7 +161,7 @@ export default {
         if (valid) {
           let that = this;
           if (that.addForm.NewPwd != that.addForm.twoNewPwd) {
-            that.$message.warning("新密码两次输入不一致,请核对!");
+            that.$message.warning(/* "新密码两次输入不一致,请核对!"  */this.$t('ResetPwdPage.vaild_same'));
             return false;
           }
           modifyPwd({
@@ -173,7 +169,7 @@ export default {
             NewPwd: md5.hex_md5(that.addForm.NewPwd),
           }).then((res) => {
             if (res.Ret == 200) {
-              that.$message.success("修改密码成功,请重新登录!");
+              that.$message.success(/* "修改密码成功,请重新登录!" */ this.$t('ResetPwdPage.edit_pwd_msg'));
               setTimeout(function () {
                 localStorage.setItem("auth", "");
                 localStorage.setItem("userName", "");

+ 6 - 8
src/views/sandbox_manage/common/mindmap.js

@@ -58,8 +58,7 @@ export default {
             refY2: -8,
             width: 16,
             height: 16,
-            'xlink:href':
-              'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',
+            'xlink:href':require('@/assets/img/icons/add_blue_new.png'),
             event: 'add:topic:left',
             class: 'left-topic-image',
           },
@@ -70,8 +69,7 @@ export default {
             refY2: -8,
             width: 16,
             height: 16,
-            'xlink:href':
-              'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',
+            'xlink:href':require('@/assets/img/icons/add_blue_new.png'),
             event: 'add:topic:right',
             class: 'right-topic-image',
           },
@@ -124,8 +122,7 @@ export default {
             refY2: -8,
             width: 16,
             height: 16,
-            'xlink:href':
-              'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',
+            'xlink:href':require('@/assets/img/icons/add_blue_new.png'),
             event: 'add:topic:left',
             class: 'left-topic-image',
           },
@@ -178,8 +175,9 @@ export default {
             refY2: -8,
             width: 16,
             height: 16,
-            'xlink:href':
-              'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',
+            'xlink:href':require('@/assets/img/icons/add_blue_new.png'),
+            // 'xlink:href':
+            // 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*SYCuQ6HHs5cAAAAAAAAAAAAAARQnAQ',
             event: 'add:topic:right',
             class: 'right-topic-image',
           },

+ 3 - 3
src/views/sandbox_manage/common/toolConfig.js

@@ -23,9 +23,9 @@ export let configOpt = {
 export const colorsOptions = ['#333','#5B9BD5','#f00','#fff','#00f','#000','#00FFFF','#70DB93','#9F5F9F','#A67D3D','#5F9F9F']
 
 export const familyOptions = [
-	{name:'微软雅黑',value:'微软雅黑'},
-	{name:'宋体',value:'宋体'},
-	{name:'黑体',value:'黑体'}
+	{name:localStorage.getItem('i18n')=='zh'?'微软雅黑':'Microsoft YaHei',value:'微软雅黑'},
+	{name:localStorage.getItem('i18n')=='zh'?'宋体':'SimSun',value:'宋体'},
+	{name:localStorage.getItem('i18n')=='zh'?'黑体':'SimHei',value:'黑体'}
 ]
 export const fontSizeOptions = [
 	{name:'12px',value:12},

+ 17 - 30
src/views/sandbox_manage/index_new_version.vue

@@ -138,7 +138,7 @@
 							:options="classifyArr"
 							:props="classifyProps"
 							v-model="classifyForm.ChartPermissionId" 
-							placeholder="请选择对应品种" 
+							:placeholder="this.$t('SandboxManage.SandList.catalog_variety_placeholder')" 
               id="classifyAddCascader"
               ref="chartPermissionCascader"
               :disabled="(classifyForm.SandboxClassifyId && classifyForm.Level!=1) || (!classifyForm.SandboxClassifyId && classifyForm.Level!=0)"
@@ -302,7 +302,7 @@ import { myGraph } from './common/gragh';
         },
         classifyFormRules:{
           SandboxClassifyName:{required: true, message:this.$t('SandboxManage.SandList.catalog_name_placeholder')||'请输入目录名称', trigger: 'blur'},
-          ChartPermissionId:{required: true, message:'请选择对应品种', trigger: 'change'}
+          ChartPermissionId:{required: true, message:this.$t('SandboxManage.SandList.catalog_variety_placeholder')||'请选择对应品种', trigger: 'change'}
         },
         classifyProps: {
           children: 'Items',
@@ -873,7 +873,7 @@ import { myGraph } from './common/gragh';
             });
           }else {
             this.lockLoding && this.lockLoding.close();
-            this.$message.warning(this.$t('MsgPrompt.http_not_support'))
+            this.$message.warning(this.$t('MsgPrompt.http_not_support')||'当前协议暂不支持,仅支持https协议')
           }
         }
       },500),
@@ -998,6 +998,11 @@ import { myGraph } from './common/gragh';
             },{
               preserveDimensions:true,//让svg为实际图片大小
               beforeSerialize:(svg)=>{
+                let shouldRemoveElement = svg.querySelectorAll('.right-topic-image,.left-topic-image')
+                for (let i = 0; i < shouldRemoveElement.length; i++) {
+                  const element = shouldRemoveElement[i];
+                  element.remove()
+                }
                 // const zoom = this.graph.zoom();
                 const {x,y,width,height} = this.graph.getContentBBox(cells)
                 // let {tx,ty} = this.graph.translate() // 画布偏移量
@@ -1017,20 +1022,7 @@ import { myGraph } from './common/gragh';
                 // gNode.appendChild(textNode)
                   },
               copyStyles:false,
-              stylesheet: `
-                  svg{
-                      background-color:white;
-                  }
-                .x6-port {
-                    visibility: hidden;
-                }
-                .left-topic-image{
-                  visibility:hidden;
-                }
-                .right-topic-image{
-                  visibility: hidden;
-                }
-                ` 
+              stylesheet: `svg{background-color:white;} .x6-port{visibility: hidden;}` 
             })
           }
         })
@@ -1093,6 +1085,11 @@ import { myGraph } from './common/gragh';
       },{
         preserveDimensions:true,//让svg为实际图片大小
         beforeSerialize:(svg)=>{
+          let shouldRemoveElement = svg.querySelectorAll('.right-topic-image,.left-topic-image')
+          for (let i = 0; i < shouldRemoveElement.length; i++) {
+            const element = shouldRemoveElement[i];
+            element.remove()
+          }
           const {x,y,width,height} = this.graph.getContentBBox(cells)
           // let {tx,ty} = this.graph.translate()
           //给导出的svg增加一点宽高
@@ -1110,19 +1107,7 @@ import { myGraph } from './common/gragh';
           // gNode.appendChild(textNode)
             },
           copyStyles:false,
-          stylesheet: `
-            svg{
-                background-color:white;
-            }
-          .x6-port {
-              visibility: hidden;
-          }
-          .left-topic-image{
-            visibility:hidden;
-          }
-          .right-topic-image{
-            visibility: hidden;
-          }` 
+          stylesheet: `svg{background-color:white;} .x6-port{visibility: hidden;}` 
         })
       },500),
       //==============================画布
@@ -1243,6 +1228,7 @@ import { myGraph } from './common/gragh';
       border-bottom: solid 1px #DCDFE6;
       box-shadow: 0px 2px 12px 0px rgba($color: #000000, $alpha: 0.08);
       display: flex;
+      flex-wrap: wrap;
       align-items: center;
       justify-content: space-between;
     }
@@ -1255,6 +1241,7 @@ import { myGraph } from './common/gragh';
         padding: 0 20px;
         overflow: auto;
         scroll-behavior: smooth;
+        margin-right: 20px;
         .add-classify{
           margin: 30px 0 50px;
           display: flex;

+ 2 - 1
src/views/sandbox_manage/sandFlowNew/components/addLInkDia.vue

@@ -388,7 +388,8 @@ import { dataBaseInterface,reportlist} from '@/api/api.js';
         if (res.Ret !== 200) return;
         this.chartInfo = res.Data.ChartInfo || {}
         this.edbData = res.Data.EdbInfoList|| []
-
+        //初始化上下限
+        this.setLimitData(this.edbData)
         const chartTypeMap = {
           7: this.initBarData, //柱形图
           10: this.initSectionScatterData //截面散点

+ 39 - 30
src/views/sandbox_manage/sandFlowNew/index.vue

@@ -187,6 +187,30 @@
               />
             </el-tooltip>
           </div>
+          <div class="sand-tool-item">
+            <el-dropdown trigger="click" @command="(e)=>toolClickOptions('changeLineHeight',nodeTextDisable,e)" 
+              placement="bottom">
+              <div :class="nodeTextDisable?'tool-disabled':''" class="dropdown-box">
+                <el-tooltip content="文本行高" placement="top" :open-delay="250">
+                  <div class="dropdown-content"  >
+                    <img :src="nodeTextDisable? 
+                      require('@/assets/img/sand_new/tools/line-height-disabled.png'):
+                      require('@/assets/img/sand_new/tools/line-height.png')" 
+                      style="vertical-align: middle;"/>
+                  </div>
+                </el-tooltip>
+                <el-tooltip content="文本行高" placement="top" :open-delay="250">
+                  <span v-show="nodeTextDisable" class="disabled-item" @click.stop="()=>{}"></span>
+                </el-tooltip>
+              </div>
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item v-for="s in lineHeightOptions" :command="s" :key="s"
+                :class="styleOptions.lineHeight==s?'style-acitve':''">
+                    {{ s }}
+                </el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+          </div>
           <div class="sand-tool-item">
             <el-dropdown trigger="click" @command="(e)=>toolClickOptions('changeTextAlign',nodeTextDisable,e)" 
               placement="bottom">
@@ -886,6 +910,12 @@ import addLInkDia from './components/addLInkDia.vue';
         },{
           preserveDimensions:false,//让svg为实际图片大小
           beforeSerialize:(svg)=>{
+            let shouldRemoveElement = svg.querySelectorAll('.right-topic-image,.left-topic-image')
+            for (let i = 0; i < shouldRemoveElement.length; i++) {
+              const element = shouldRemoveElement[i];
+              element.remove()
+            }
+
             const {x,y,width,height} = this.graph.getContentBBox(cells)
             // let {tx,ty} = this.graph.translate()
             //给导出的svg增加一点宽高
@@ -894,7 +924,6 @@ import addLInkDia from './components/addLInkDia.vue';
             //设置viewBox使图像居中
             svg.setAttribute('viewBox',`${x-25} ${y-25} ${width+50} ${height+50}`)
             // let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
-            // console.log(leftImg,rightImg,'rightImg');
 
             // let textNode = document.createElement('text')
             // textNode.setAttribute('x',x-tx+width-90)
@@ -905,27 +934,15 @@ import addLInkDia from './components/addLInkDia.vue';
             // gNode.appendChild(textNode)
               },
           copyStyles:false,
-          stylesheet: `
-              svg{
-                  background-color:white;
-              }
-            .x6-port {
-                visibility: hidden;
-            }
-            .left-topic-image{
-              visibility:hidden;
-            }
-            .right-topic-image{
-              visibility: hidden;
-            }` 
+          stylesheet: `svg{background-color:white;} .x6-port{visibility: hidden;}` 
             
         })
       },500),
       saveChart: _.debounce(function(callback=null) {
         if(!this.sandSaveParams.Name) 
-          return this.$message.warning('请填写逻辑图名称');
+          return this.$message.warning(this.$t('SandboxManage.SandList.add_diagram_msg01'));
         if(!this.sandSaveParams.SandboxClassifyId) 
-          return this.$message.warning('请选择所属分类');
+          return this.$message.warning(this.$t('SandboxManage.SandList.select_categories_msg'));
 
         if(!this.graph.toJSON().cells.length) return this.$message.warning('请绘制画布内容');
 
@@ -979,6 +996,11 @@ import addLInkDia from './components/addLInkDia.vue';
         },{
           preserveDimensions:true,//让svg为实际图片大小
           beforeSerialize:(svg)=>{
+            let shouldRemoveElement = svg.querySelectorAll('.right-topic-image,.left-topic-image')
+            for (let i = 0; i < shouldRemoveElement.length; i++) {
+              const element = shouldRemoveElement[i];
+              element.remove()
+            }
             // const zoom = this.graph.zoom();
             const {x,y,width,height} = this.graph.getContentBBox(cells)
             // let {tx,ty} = this.graph.translate() // 画布偏移量
@@ -998,20 +1020,7 @@ import addLInkDia from './components/addLInkDia.vue';
             // gNode.appendChild(textNode)
               },
           copyStyles:false,
-          stylesheet: `
-              svg{
-                  background-color:white;
-              }
-            .x6-port {
-                visibility: hidden;
-            }
-            .left-topic-image{
-              visibility:hidden;
-            }
-            .right-topic-image{
-              visibility: hidden;
-            }
-            ` 
+          stylesheet: `svg{background-color:white;} .x6-port{visibility: hidden;}` 
         })
           
       },500),

+ 2 - 2
src/views/smartReport/components/BaseInfo.vue

@@ -116,7 +116,7 @@ export default {
                 this.formData.classify=[]
                 this.formData.title=''
                 this.formData.abstract=''
-                this.formData.author=['FICC团队']
+                this.formData.author=['投研团队']
                 this.formData.frequency='日度'
                 this.formData.time=this.$moment().format('YYYY-MM-DD')
             }else{
@@ -146,7 +146,7 @@ export default {
                 classify:[],
                 title:'',
                 abstract:'',
-                author:['FICC团队'],
+                author:['投研团队'],
                 frequency:'日度',
                 time:this.$moment().format('YYYY-MM-DD')||''
             },

+ 4 - 3
src/views/smartReport/components/ImgSource.vue

@@ -9,11 +9,11 @@
                     class="search-box"
 					:placeholder="$t('ReportManage.ReportList.img_name_ipt')"
 					v-model="keyword"
-					size="medium"
                     @input="handleSearch"
                     style="width:240px"
+                    size="medium"
 				/>
-                <el-select :placeholder="$t('ReportManage.ReportList.select_img_type')" v-model="type" style="width:240px" @change="handleSearch">
+                <el-select :placeholder="$t('ReportManage.ReportList.select_img_type')" v-model="type" style="width:240px" @change="handleSearch" size="medium">
                     <el-option :label="$t('ReportManage.ReportList.page_header_op')" :value="1"></el-option>
                     <el-option :label="$t('ReportManage.ReportList.page_trailer_op')" :value="2"></el-option>
                 </el-select>
@@ -96,6 +96,7 @@ export default {
         handleSearch(){
             this.page=1
             this.finished=false
+            this.selectItem=null
             this.getImgList()
         },
 
@@ -113,7 +114,7 @@ export default {
             //     return
             // }
             if(!this.selectItem){
-                this.$message.warning(this.$t('ReportManage.ReportList.select_layout_msg'))
+                this.$message.warning(this.type==1?'请选择版头':'请选择版尾')
                 return
             }
             this.$emit('change',{

+ 1 - 1
src/views/smartReport/components/TextEdit.vue

@@ -59,7 +59,7 @@ export default {
                     "redo",
                 ],
                 height: 800,
-                fontSize: ["12", "14", "16", "18", "20", "24", "28", "32", "36", "40"],
+                fontSize: ["12", "13","14","15", "16", "18", "20", "24", "28", "32", "36", "40"],
                 fontSizeDefaultSelection: "16",
                 theme: "dark", //主题
                 placeholderText: "请输入内容",

+ 10 - 5
src/views/system_manage/components/addUserDialog.vue

@@ -28,6 +28,12 @@
                         :label="item.Name" :value="item.Value" />
                 </el-select>
             </el-form-item>
+            <el-form-item label="用户类型" prop="IsLdap">
+                <el-select v-model="userForm.IsLdap" placeholder="请选择用户类型">
+                    <el-option label="系统用户" :value="0"></el-option>
+                    <el-option label="域用户" :value="1"></el-option>
+                </el-select>
+            </el-form-item>
             <el-form-item :label="$t('SystemManage.DepartManage.user_depart')" prop="depart" v-if="userForm.title == $t('SystemManage.DepartManage.user_add_btn')">
                 <el-cascader :options="departArr" v-model="userForm.depart" :props="form_departProp"
                     :placeholder="$t('SystemManage.DepartManage.user_add_placeholder05')" :disabled="userForm.disabledForm" clearable>
@@ -118,14 +124,13 @@ import {patternEmail,isMobileNo,checkPassWord} from '@/utils/commonOptions';
                 pwd:[
                     {
                         validator:(rule,value,callback)=>{
+                            if(this.userForm.IsLdap==1){
+                                callback()
+                                return
+                            }
                             if(value===''){
                                 callback(new Error(this.$t('SystemManage.DepartManage.use_add_valid_msg02')))
                             }
-                            if(!checkPassWord(value)){
-                                callback(new Error(this.$t('SystemManage.DepartManage.use_add_valid_msg03')))
-                            }else{
-                                callback()
-                            }
                         }
                     }
                 ],

+ 15 - 7
src/views/system_manage/departManage.vue

@@ -493,6 +493,7 @@ export default {
 				disabledForm:false,//是否禁用表单的某些选项
 				disabledStatus:false,//是否禁用表单的状态项
 				departmentName:'',//所属一级部门名称
+				IsLdap:0,//用户类型
 			},//用户弹框表单
 			// 是否有工号
 			hasEmployeeNo:false,
@@ -986,7 +987,8 @@ export default {
 				email:'',
 				areacode:'86',
 				auth:0,
-				status:1
+				status:1,
+				IsLdap:0,
 			}
 		},
 		// 同步每刻
@@ -1041,7 +1043,8 @@ export default {
 							Province:this.userForm.province,
 							City:this.userForm.city,
 							Email:this.userForm.email,
-							TelAreaCode:this.userForm.areacode
+							TelAreaCode:this.userForm.areacode,
+							IsLdap:this.userForm.IsLdap
 						}
 						//console.log('testAdd',params)
 						departInterence.addUser(params).then(res => {
@@ -1064,7 +1067,8 @@ export default {
 									email:'',
 									areacode:'86',
 									auth:0,
-									status:1
+									status:1,
+									IsLdap:0
 								}
 								this.getTableUser();
 							}
@@ -1093,7 +1097,8 @@ export default {
 							Province:this.userForm.province,
 							City:this.userForm.city,
 							Email:this.userForm.email,
-							TelAreaCode:this.userForm.areacode
+							TelAreaCode:this.userForm.areacode,
+							IsLdap:this.userForm.IsLdap
 						}
 						//console.log('testEdit',params)
 						departInterence.editUser(params).then(res => {
@@ -1116,7 +1121,8 @@ export default {
 									email:'',
 									areacode:'86',
 									auth:0,
-									status:1
+									status:1,
+									IsLdap:0
 								}
 								this.getTableUser();
 							}
@@ -1158,7 +1164,8 @@ export default {
 					email:'',
 					areacode:'86',
 					auth:'无',
-					status:1
+					status:1,
+					IsLdap:0
 				},
 				this.$refs.addUserDialog.$refs.userForm.resetFields();//重置校验
 				this.isAddUser = false;
@@ -1255,7 +1262,8 @@ export default {
         disabledForm:false,
 				disabledStatus:false,
 				email:item.Email,
-				areacode:item.TelAreaCode
+				areacode:item.TelAreaCode,
+				IsLdap:item.IsLdap||0
 			}
 			this.hasEmployeeNo=!!item.EmployeeId
 			this.isAddUser = true;

+ 1 - 1
src/vuex/modules/sand.js

@@ -44,7 +44,7 @@ const setSandboxToolStatus=(state,payload)=>{
 				fontStyleSet.add(attrs.text.fontStyle)
 				textDecorationSet.add(attrs.text.textDecoration)
 				colorSet.add(attrs.text.fill)
-				lineHeightSet.add(Math.round((attrs.text.lineHeight/attrs.text.fontSize)*10)/10)
+				lineHeightSet.add(Math.round((attrs.text.lineHeight/attrs.text.fontSize)*100)/100)
 				textAlignSet.add(attrs.text.textAnchor)
 				if(!(element.data) || element.data.key!='text'){
 					// console.log('不是text');