Przeglądaj źródła

Merge branch 'master' into eta2.0.4

Karsa 3 miesięcy temu
rodzic
commit
0e4ffca6cc
62 zmienionych plików z 5972 dodań i 4072 usunięć
  1. 1 1
      build/webpack.dll.config.js
  2. 10 0
      src/api/modules/chartApi.js
  3. 164 12
      src/api/modules/dataApi.js
  4. BIN
      src/assets/img/data_m/tem1.jpg
  5. BIN
      src/assets/img/data_m/tem2.jpg
  6. BIN
      src/assets/img/icons/delete-icon01.png
  7. 70 0
      src/components/chart/chartTypeSelect.vue
  8. 4 0
      src/lang/commonLang.js
  9. 21 3
      src/lang/modules/DataSources/En.js
  10. 21 3
      src/lang/modules/DataSources/Zh.js
  11. 31 1
      src/lang/modules/EtaChart/En.js
  12. 33 1
      src/lang/modules/EtaChart/Zh.js
  13. 38 2
      src/routes/modules/dataRoutes.js
  14. 70 70
      src/routes/modules/oldRoutes.js
  15. 6 1
      src/utils/buttonConfig.js
  16. 4 0
      src/utils/registryComponents.js
  17. 7 2
      src/views/chartRelevance_manage/components/selectTarget.vue
  18. 47 18
      src/views/dataEntry_manage/addChart.vue
  19. 13 3
      src/views/dataEntry_manage/chartSetting.vue
  20. 4 4
      src/views/dataEntry_manage/components/addMarkerDialog.vue
  21. 1 1
      src/views/dataEntry_manage/components/chart.vue
  22. 2 2
      src/views/dataEntry_manage/components/chartReleationEdbTable.vue
  23. 71 48
      src/views/dataEntry_manage/components/insertData.vue
  24. 116 0
      src/views/dataEntry_manage/components/sectionalCombination/axisSet.vue
  25. 175 0
      src/views/dataEntry_manage/components/sectionalCombination/batchModifyDate.vue
  26. 185 0
      src/views/dataEntry_manage/components/sectionalCombination/dateTrans.vue
  27. 306 0
      src/views/dataEntry_manage/components/sectionalCombination/referenceDateSet.vue
  28. 530 0
      src/views/dataEntry_manage/components/sectionalCombination/sectionalCombinationOption.vue
  29. 398 0
      src/views/dataEntry_manage/components/sectionalCombination/seriesEdit.vue
  30. 314 0
      src/views/dataEntry_manage/components/sectionalCombination/seriesItemWrap.vue
  31. 725 0
      src/views/dataEntry_manage/dataEntry/addToBaseList.vue
  32. 675 0
      src/views/dataEntry_manage/dataEntry/components/edbDetail.vue
  33. 108 0
      src/views/dataEntry_manage/dataEntry/components/operateLogsDia.vue
  34. 383 0
      src/views/dataEntry_manage/dataEntry/dataEdit.vue
  35. 593 0
      src/views/dataEntry_manage/dataEntry/index.vue
  36. 16 1
      src/views/dataEntry_manage/databaseComponents/batchComptedDialog.vue
  37. 2 1
      src/views/dataEntry_manage/databaseComponents/batchComputedSave.vue
  38. 15 0
      src/views/dataEntry_manage/databaseComponents/batchComputedV2.vue
  39. 3 2
      src/views/dataEntry_manage/databaseComponents/completeTargetDia.vue
  40. 21 5
      src/views/dataEntry_manage/databaseComponents/operationDialog.vue
  41. 2 78
      src/views/dataEntry_manage/databaseList.vue
  42. 55 6
      src/views/dataEntry_manage/editChart.vue
  43. 142 1
      src/views/dataEntry_manage/mixins/addOreditMixin.js
  44. 282 212
      src/views/dataEntry_manage/mixins/chartPublic.js
  45. 19 26
      src/views/dataEntry_manage/onlineExcelCopy.vue
  46. 9 0
      src/views/datasheet_manage/components/dateMoveWaySection.vue
  47. 2 1
      src/views/datasheet_manage/sheetList.vue
  48. 1 1
      src/views/futures_manage/chartEditor.vue
  49. 5 1
      src/views/mychart_manage/components/chartDetailDia.vue
  50. 169 3
      src/views/ppt_manage/mixins/mixins.js
  51. 10 1
      src/views/ppt_manage/mixins/pptMixins.js
  52. 19 3
      src/views/predictEdb_manage/components/operationDialog.vue
  53. 1 0
      src/views/predictEdb_manage/predictEdb.vue
  54. 0 1059
      src/views/report_manage/addreportNew.vue
  55. 0 447
      src/views/report_manage/dayOrWeek.vue
  56. 0 997
      src/views/report_manage/editChapterReport.vue
  57. 0 1047
      src/views/report_manage/editreportNew.vue
  58. 37 0
      src/views/system_manage/chartTheme/components/optionsSection.vue
  59. 16 2
      src/views/system_manage/chartTheme/index.vue
  60. 16 2
      src/views/system_manage/chartTheme/themeSetting.vue
  61. 4 4
      src/views/system_manage/dataOperaAuth.vue
  62. 0 0
      vendor-manifest.json

+ 1 - 1
build/webpack.dll.config.js

@@ -2,7 +2,7 @@ const path = require('path')
 const webpack = require('webpack')
 module.exports = {
   entry: {
-    vendor: ['highcharts','@antv/x6','vue-router']
+    vendor: ['highcharts','vue-router']
   },
   output: {
     path: path.join(__dirname, '../static'),

+ 10 - 0
src/api/modules/chartApi.js

@@ -727,6 +727,11 @@ const dataBaseInterface = {
 			return http.post('/datamanage/chart_info/copy',params)
 		},
 
+		// 图表类型
+		chartTypeList:()=>{
+			return http.get('/datamanage/chart_info/type_list',{})
+		},
+
 
 		/* ================代码运算========================= */
 		/**
@@ -882,6 +887,11 @@ const dataBaseInterface = {
 		return http.post('/datamanage/chart_info/preview/season',params)
 	},
 
+	// 截面组合图预览数据
+	sectionalCombinationPreviewData:params=>{
+		return http.post('/datamanage/chart_info/preview/section_combine',params)
+	},
+
 	 /* 批量计算
 	 * @param {*} params 
 	 * CalculateId

+ 164 - 12
src/api/modules/dataApi.js

@@ -113,17 +113,17 @@ const dataInterence = {
 		return http.post('/entry/data/delete',params)
 	},
 	/* 	获取数据列表
-		page_no	是	int	每页起始位置:默认0
-		page_size	是	int	每页数据条数,默认10
-		start_date	否	string	开始日期
-		end_date	否	string	结束日期
-		frequency	否	string	频度
-		classify_id	否	int	分类id,默认0
-		key_word	否	string	标题搜索关键词 
-		trade_code	否	string	指标编码 */
-		getDatalist:params => {
-			return http.get('/entry/data/list',params)
-		},
+	page_no	是	int	每页起始位置:默认0
+	page_size	是	int	每页数据条数,默认10
+	start_date	否	string	开始日期
+	end_date	否	string	结束日期
+	frequency	否	string	频度
+	classify_id	否	int	分类id,默认0
+	key_word	否	string	标题搜索关键词 
+	trade_code	否	string	指标编码 */
+	getDatalist:params => {
+		return http.get('/entry/data/list',params)
+	},
 	/* 	导出数据
 	start_date	否	string	开始日期
 	end_date	否	string	结束日期
@@ -293,7 +293,158 @@ const dataInterence = {
  */
 	getIndexCodeData: (params) => {
 		return http.get('datamanage/com_trade/list',params)
+	},
+
+
+
+	//=========new version eta2.0.0
+	/**
+	 * 获取分类
+	 * @param {*} params 
+	 * @returns 
+	 */
+	getClassifyV2: params => {
+		return http.get('/entry/classify',params)
+	},
+
+	/**
+	 * 获取指标详情
+	 * @param {*TradeCode} params 
+	 * @returns 
+	 */
+	getEdbDetailV2: params => {
+		return http.get('/entry/target/edb/detail',params)
+	},
+	
+	/**
+	 * load分类子集
+	 * @param {*ClassifyId} params 
+	 * @returns 
+	 */
+	getClassifyLoadChild: params => {
+		return http.get('/entry/target/classify/edb/list',params)
+	},
+
+	/**
+	 * 获取指标列表
+	 * @param {*PageSize CurrentIndex ClassifyId} params 
+	 * @returns 
+	 */
+	getEdbListV2:params => {
+		return http.get('/entry/target/edb/list',params)
+	},
+
+	/**
+	 * 搜索指标
+	 * @param {* Keyword PageSize CurrentIndex} params 
+	 * @returns 
+	 */
+	searchEdbV2: params => {
+		return http.get('/entry/target/edb/search',params)
+	},
+
+	/**
+	 * 可批量加入的指标列表
+	 * @param {*} params 
+	 * 	"ListAll": true,
+		"FrequencyList": [],
+		"ClassifyIdList": [],
+		"UserIdList": [],
+		"TradeCodeList": [],
+		"Keyword": "测试混合表格"
+	 */
+	getBatchAddListV2: params => {
+		return http.post('/entry/target/edb/batch/list',params)
+	},
+
+	/**
+	 * 编辑指标数据全量
+	 * @param {*} params 
+	 * "ClassifyId": 20,
+		"Frequency":"日度",
+		"Unit":"吨",
+		"TradeCode":""
+	 * @returns 
+	 */
+	editEdbDataV2: params => {
+		return http.post('/entry/target/edb/excel_style/edit',params)
+	},
+
+	/**
+	 * 批量入库时校验
+	 * @param {*} params 
+	 * 
+		"ListAll": true,
+		"FrequencyList"
+		"ClassifyIdList"
+		"UserIdList"
+		"TradeCodeList": []
+	 * @returns 
+	 */
+	checkAddListV2: params => {
+		return http.post('/entry/target/edb/batch/add/check',params)
+	},
+
+	/**
+	 * 批量入库校验名称
+	 * @param {*} params []
+	 * "EdbCode": "W001117",
+		"EdbName": "美国:堪萨斯联储制造业指数:同比增减:原料价格"
+	 * @returns 
+	 */
+	checkAddListNameV2: params => {
+		return http.post('/entry/target/edb/batch/add/name_check',params)
+	},
+
+	/**
+	 * 批量加入指标库
+	 * @param {*} params 
+	 * @returns 
+	 */
+	addToBaseBatchV2: params => {
+		return http.post('/entry/target/edb/batch/add',params)
+	},
+
+	/**
+	 * 校验是否可删除
+	 * @param {*} params 
+	 * 	"ListAll": true,
+			"FrequencyList": [],
+			"ClassifyIdList": [],
+			"UserIdList": [],
+			"TradeCodeList": [,
+    	"Keyword":""
+	 * @returns 
+	 */
+	checkDelListV2: params => {
+		return http.post('/entry/target/edb/batch/del/check',params)
+	},
+	
+	/**
+	 * 批量删除指标
+	 * @param {*} params 
+	 * "ListAll": true,
+			"FrequencyList": [],
+			"ClassifyIdList": [],
+			"UserIdList": [],
+			"TradeCodeList": [,
+    	"Keyword":""
+	 * @returns 
+	 */
+	delEdbBatchV2: params => {
+		return http.post('/entry/target/edb/batch/del',params)
+	},
+
+	/**
+	 * 操作日志接口
+	 * @param {*} params 
+	 * PageSize=10 CurrentIndex=1 TradeCode=W001116
+	 * @returns 
+	 */
+	getOperaLogsList: params => {
+		return http.get('/entry/target/edb/op/record/list',params)
 	}
+
 }
 
 /* 手工数据权限 */
@@ -383,8 +534,9 @@ const dataAuthInterface = {
 	 */
 	classifyAll: params => {
 		return http.get('/datamanage/manual/classify/all_list',params)
-	}
+	},
 }
+
 /* 数据刷新设置 */
 const dataRefreshInterface = {
     /**

BIN
src/assets/img/data_m/tem1.jpg


BIN
src/assets/img/data_m/tem2.jpg


BIN
src/assets/img/icons/delete-icon01.png


+ 70 - 0
src/components/chart/chartTypeSelect.vue

@@ -0,0 +1,70 @@
+<template>
+  <el-cascader
+    v-model="innerValue"
+    :options="options"
+    :show-all-levels="false"
+    :props="{
+      emitPath:false,
+      label:$i18nt.locale==='zh'?'ChartTypeName':'ChartTypeNameEn',
+      value:'ChartTypeId',
+      children:'Child'
+    }"
+    placeholder="请选择生成样式"
+    @change="handleChange"
+    style="width:100%"
+    popper-class="chart-type-select-wrap"
+  />
+</template>
+
+<script>
+import { dataBaseInterface } from '@/api/api.js';
+export default {
+  name: 'ChartTypeSelect',
+  props: {
+    value: {
+      type: [String, Number, Array],
+      default: () => null
+    },
+  },
+  data() {
+    return {
+      options:[],
+      innerValue: this.value
+    };
+  },
+  watch: {
+    value: {
+      handler(newValue) {
+        this.innerValue = newValue;
+      },
+      immediate: true // 在组件创建时立即执行处理函数
+    },
+    innerValue(newValue) {
+      this.$emit('input', newValue);
+    }
+  },
+  created() {
+    this.getOptions()
+  },
+  methods: {
+    getOptions(){
+      dataBaseInterface.chartTypeList().then(res=>{
+        if(res.Ret===200){
+          this.options=res.Data.List||[]
+        }
+      })
+    },
+    handleChange(value) {
+      this.$emit('change', value);
+    }
+  }
+};
+</script>
+
+<style lang="scss">
+.chart-type-select-wrap{
+  .el-cascader-menu__wrap{
+    height: 300px;
+  }
+}
+</style>

+ 4 - 0
src/lang/commonLang.js

@@ -69,6 +69,10 @@ export default {
       en: 'Complete',
       zh: '完成'
     },
+    apply_btn:{
+      en: 'Apply',
+      zh: '应用'
+    },
     operation_prompt: {
       en: 'Operation Prompt',
       zh: '操作提示'

+ 21 - 3
src/lang/modules/DataSources/En.js

@@ -43,8 +43,8 @@ export default {
     right_op_insertcol:'Insert Column',
     right_op_delrow:'Delete Row',
     right_op_delcol:'Delete Column',
-    label_one_level_classify:'Primary Category',
-    label_edb_classify:'Indicator Category',
+    label_one_level_classify:'Variety',
+    label_edb_classify:'Sub-Variety',
     use_intro:'Instructions for Use',
     use_msg:` 1、Add new indicators: Enter the name, unit and value of the indicator under the column of the preset indicator and save it;</br>
     2、Add date: select a date in the first column or insert a date line (to copy the existing date format), enter the value and save it;</br>
@@ -54,7 +54,9 @@ export default {
 
     //导入弹窗
     tit_insert_data:'Import Data',
-    down_tem:'Download Templates',
+    tem_msg:'Template {index}',
+    tit_export:'Export to Excel',
+    down_tem:'Download Import Templates',
     down_fail_list:'the list of failed imports',
     step_one:'1. Step One: Download the template. Fill in the data according to the specifications required by the template; templates with empty data are not allowed to be imported. ',
     step_two:'2. Step Two: Upload data. Click on "Import Data" to upload the completed template and confirm the import. ',
@@ -63,9 +65,25 @@ export default {
     down_fail_list2: 'Download Failure List',
     upload_tip_msg: 'A total of {success_count} data entries have been successfully imported this time.',
     upload_tip_msg2: 'A total of {success_count} data entries were successfully imported this time, with {fail_count} failures.',
+    view_big_img: 'View larger image',
 
     col_status_1:'Completed',
     col_status_2:'Incomplete',
+    label_vaiety: 'Variety',
+    add_tobase:'Add to Indicator Library',
+    opera_logs:'Operation Log',
+    batch_addbase:'Bulk Add to Indicator Library',
+    online_excel:'Online Excel',
+    batch_del:'Bulk Delete',
+
+    opera_time:'Operation Time',
+    opera_msg:'Operation Content',
+    opera_user:'Operator',
+    insert_up_row:'Insert Row Above',
+    insert_down_row:'Insert Row Below',
+    max_batch_msg: 'Please do not add more than 30 metrics at a time!',
+    export_msg:`Export the Filtered Metric List of the Current Page`,
+    ph_creator: 'Please select a creator'
   },
 
   /* 期货数据库页面 */

+ 21 - 3
src/lang/modules/DataSources/Zh.js

@@ -43,8 +43,8 @@ export default {
     right_op_insertcol:'插入列',
     right_op_delrow:'删除行',
     right_op_delcol:'删除列',
-    label_one_level_classify:'一级分类',
-    label_edb_classify:'指标分类',
+    label_one_level_classify:'品种',
+    label_edb_classify:'子品种',
     use_intro:'使用说明',
     use_msg:` 1、新增指标:在预设好的指标列下输入指标名称、单位、数值并保存;</br>
     2、新增日期:在第一列选择日期或插入日期行(需复制已有日期格式)输入数值并保存;</br>
@@ -54,7 +54,9 @@ export default {
 
     //导入弹窗
     tit_insert_data:'导入数据',
-    down_tem:'下载模板',
+    tem_msg:'模板{index}',
+    tit_export:'导出Excel',
+    down_tem:'下载导入模板',
     down_fail_list:'导入失败列表',
     step_one:'1、第一步,下载模板。按照模板要求的规范填写数据,空数据模板不允许导入。',
     step_two:'2、第二步,上传数据。点击“导入数据”,上传已经填写好的模板,确认导入。',
@@ -63,9 +65,25 @@ export default {
     down_fail_list2: '下载失败列表',
     upload_tip_msg: '本次共成功导入{success_count}条数据',
     upload_tip_msg2: '本次共成功导入{success_count}条数据,失败{fail_count}条',
+    view_big_img: '查看大图',
 
     col_status_1:'完成',
     col_status_2:'未完成',
+    label_vaiety: '品种',
+    add_tobase:'加入指标库',
+    opera_logs:'操作日志',
+    batch_addbase:'批量加入指标库',
+    online_excel:'在线Excel',
+    batch_del:'批量删除',
+
+    opera_time:'操作时间',
+    opera_msg:'操作内容',
+    opera_user:'操作人',
+    insert_up_row:'向上插入',
+    insert_down_row:'向下插入',
+    max_batch_msg:'批量添加指标数量不得超过30个!',
+    export_msg:`导出当前页面筛选的指标列表`,
+    ph_creator: '请选择创建人'
   },
 
   /* 期货数据库页面 */

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

@@ -139,6 +139,36 @@ export default {
     data_transformation_hint: "Invalid data conversion, please check the value",
     data_transformation_hint2: "The indicator data contains negative numbers or zeros and cannot be logarithmically calculated",
     data_transformation_list_hint: "Invalid data conversion, please check the value",
-    data_transformation_list_hint2: "The indicator data contains negative numbers or zeros and cannot be logarithmically calculated"
+    data_transformation_list_hint2: "The indicator data contains negative numbers or zeros and cannot be logarithmically calculated",
+
+    //截面组合图
+    reference_date_set:'Reference Date Settings',
+    reference_date_name:'Name of Reference Date',
+    sort_tips:'Default is to order each series by adding indicators in sequence, when switching ascending/descending, a reference series must be selected, and the horizontal axis is rearranged according to the values of that series.',
+    select_base_placehold:'Select Baseline',
+    axis_set:'Horizontal and Vertical Axis Settings',
+    xAxis_name_set:'Horizontal Axis Name Setting',
+    yAxis_unit_set:'Vertical Axis Unit Setting',
+    show_data_point:'Data Point Display',
+    show_data_point_tips:'When turned on, data points are displayed on this series.',
+    show_data_value:'Display Values',
+    show_data_value_tips:'When turned on, values are displayed on this series.',
+    add_series_btn:'Add Series',
+    batch_set_date:'Batch Setting Dates',
+    refrence_date_name:'Reference Date',
+    date_set_tips:'Batch set indicator dates, and override the original values after application.',
+    more_refrence_date:'Add More Reference Dates',
+    new_series:'New Series',
+    series_name:'Series Name',
+    more_series_btn:'More Series',
+    refrence_date_repeat:'Duplicate Date Name, Please Adjust',
+    series_name_repeat:'Duplicate Series Name, Please Adjust',
+    series_number_tips:'Inconsistent Series Metric Count, Please Adjust', 
+    series_del_tips:'Are you sure you want to delete all series? The chart will be cleared after the operation.',
+    select_refrence_tips:'Please select Date Name',
+    stack_tips:'When turned on, all bar series on the chart are stacked.',
+    select_date_type:'Please select Date type',
+    series_name_empty:'Empty Series Name,Please Adjust',
+    bar_stacking:'bar stacking',
   }
 }

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

@@ -134,6 +134,38 @@ export default {
     data_transformation_hint: "数据转换不合法,请检查数值",
     data_transformation_hint2: "指标数据含有负数或0,无法进行对数运算",
     data_transformation_list_hint: "第{num}个数据转换不合法,请检查数值",
-    data_transformation_list_hint2: "第{num}个指标数据含有负数或0,无法进行对数运算"
+    data_transformation_list_hint2: "第{num}个指标数据含有负数或0,无法进行对数运算",
+
+    //截面组合图
+    reference_date_set:'引用日期设置',
+    reference_date_name:'引用日期名称',
+    sort_tips:'默认排序为每个系列添加指标的顺序,切换升序/降序时,需选择基准系列,按照该系列的数值大小对横轴重排',
+    select_base_placehold:'请选择基准',
+    axis_set:'横纵轴设置',
+    xAxis_name_set:'横轴名称设置',
+    yAxis_unit_set:'纵轴单位设置',
+    show_data_point:'数据点展示',
+    show_data_point_tips:'开启时,该系列上展示数据点',
+    show_data_value:'数值展示',
+    show_data_value_tips:'开启时,该系列上展示数值',
+    add_series_btn:'添加系列',
+    batch_set_date:'批量设置日期',
+    refrence_date_name:'引用日期',
+    date_set_tips:'批量设置指标日期,应用后覆盖原值',
+    more_refrence_date:'添加更多引用日期',
+    new_series:'新系列',
+    series_name:'系列名称',
+    more_series_btn:'更多系列',
+    refrence_date_repeat:'引用日期名称重复,请调整',
+    series_name_repeat:'系列名称重复,请调整',
+    series_number_tips:'系列指标数量不一致,请调整',
+    series_del_tips:'系列全部删除后,图表会被清除,确认操作吗?',
+    select_refrence_tips:'请选择引用日期',
+    stack_tips:'开启时,图上的所有柱形系列堆积',
+    select_date_type:'请选择日期类型',
+    series_name_empty:'系列名称不能为空,请调整',
+    bar_stacking:'柱形堆积',
+
+
   }
 }

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

@@ -47,7 +47,7 @@ export default [
       },
       {
         path: "dataList",
-        component: () => import("@/views/dataEntry_manage/dataEntry.vue"),
+        component: () => import("@/views/dataEntry_manage/dataEntry/index.vue"),
         name: "手工数据录入",
         hidden: false,
         meta: {
@@ -58,7 +58,19 @@ export default [
       {
         path: "onlineExcelCopy",
         component: () => import("@/views/dataEntry_manage/onlineExcelCopy.vue"),
-        name: "复制excel数据",
+        name: "在线excel",
+        meta: {
+          name_en:'Online Excel',
+          pathFrom: "dataList",
+          pathName: "手工数据录入",
+          pathName_en:'Manual data entry',
+        },
+        hidden: true,
+      },
+      {
+        path: "dataEdit",
+        component: () => import("@/views/dataEntry_manage/dataEntry/dataEdit.vue"),
+        name: "编辑",
         meta: {
           name_en:'Online Excel Copy',
           pathFrom: "dataList",
@@ -67,6 +79,30 @@ export default [
         },
         hidden: true,
       },
+      {
+        path: "batchToBase",
+        component: () => import("@/views/dataEntry_manage/dataEntry/addToBaseList.vue"),
+        name: "批量加入指标库",
+        meta: {
+          name_en:'Bulk Add to Indicator Library',
+          pathFrom: "dataList",
+          pathName: "手工数据录入",
+          pathName_en:'Manual data entry',
+        },
+        hidden: true,
+      },
+      {
+        path: "batchDelList",
+        component: () => import("@/views/dataEntry_manage/dataEntry/addToBaseList.vue"),
+        name: "批量删除",
+        meta: {
+          name_en:'Bulk Delete',
+          pathFrom: "dataList",
+          pathName: "手工数据录入",
+          pathName_en:'Manual data entry',
+        },
+        hidden: true,
+      },
       {
         path: "smmTarget",
         component: () =>

+ 70 - 70
src/routes/modules/oldRoutes.js

@@ -125,16 +125,16 @@ export default [
         name_en:"RepMgmt"
     },
     children: [
-      {
-        path: "reportlist",
-        component: reportlist,
-        name: "研报列表",
-        hidden: false,
-        meta: {
-          keepAlive: false,
-          name_en:"Report list"
-        },
-      },
+      // {
+      //   path: "reportlist",
+      //   component: reportlist,
+      //   name: "研报列表",
+      //   hidden: false,
+      //   meta: {
+      //     keepAlive: false,
+      //     name_en:"Report list"
+      //   },
+      // },
       {
         path: "classifylist",
         component: classifylist,
@@ -167,58 +167,58 @@ export default [
           name_en:"EveryDay",
         },
       },
-      {
-        path: "addreportNew",
-        component: () => import("@/views/report_manage/addreportNew.vue"),
-        name: "添加研报",
-        hidden: true,
-        meta: {
-          pathFrom: "reportlist",
-          pathName: "研报列表",
-          keepAlive: false,
-          name_en:"Add Report",
-          pathName_en:"Report list"
-        },
-      },
-      {
-        path: "editreportNew",
-        component: () => import("@/views/report_manage/editreportNew.vue"),
-        name: "编辑研报",
-        hidden: true,
-        meta: {
-          pathFrom: "reportlist",
-          pathName: "研报列表",
-          keepAlive: false,
-          name_en:"Edit Report",
-          pathName_en:"Report list"
-        },
-      },
-      {
-        path: "dayorweek",
-        component: () => import("@/views/report_manage/dayOrWeek.vue"),
-        name: "添加晨报/周报",
-        hidden: true,
-        meta: {
-          pathFrom: "reportlist",
-          pathName: "研报列表",
-          keepAlive: false,
-          name_en:"Add/Edit Day or Week Report",
-          pathName_en:"Report list"
-        },
-      },
-      {
-        path: "editchapterreport",
-        component: () => import("@/views/report_manage/editChapterReport.vue"),
-        name: "晨报/周报",
-        hidden: true,
-        meta: {
-          keepAlive: false,
-          pathFrom: "dayorweek",
-          pathName: "晨报/周报",
-          name_en:"Day or Week Report",
-          pathName_en:"Add/Edit Day or Week Report"
-        },
-      },
+      // {
+      //   path: "addreportNew",
+      //   component: () => import("@/views/report_manage/addreportNew.vue"),
+      //   name: "添加研报",
+      //   hidden: true,
+      //   meta: {
+      //     pathFrom: "reportlist",
+      //     pathName: "研报列表",
+      //     keepAlive: false,
+      //     name_en:"Add Report",
+      //     pathName_en:"Report list"
+      //   },
+      // },
+      // {
+      //   path: "editreportNew",
+      //   component: () => import("@/views/report_manage/editreportNew.vue"),
+      //   name: "编辑研报",
+      //   hidden: true,
+      //   meta: {
+      //     pathFrom: "reportlist",
+      //     pathName: "研报列表",
+      //     keepAlive: false,
+      //     name_en:"Edit Report",
+      //     pathName_en:"Report list"
+      //   },
+      // },
+      // {
+      //   path: "dayorweek",
+      //   component: () => import("@/views/report_manage/dayOrWeek.vue"),
+      //   name: "添加晨报/周报",
+      //   hidden: true,
+      //   meta: {
+      //     pathFrom: "reportlist",
+      //     pathName: "研报列表",
+      //     keepAlive: false,
+      //     name_en:"Add/Edit Day or Week Report",
+      //     pathName_en:"Report list"
+      //   },
+      // },
+      // {
+      //   path: "editchapterreport",
+      //   component: () => import("@/views/report_manage/editChapterReport.vue"),
+      //   name: "晨报/周报",
+      //   hidden: true,
+      //   meta: {
+      //     keepAlive: false,
+      //     pathFrom: "dayorweek",
+      //     pathName: "晨报/周报",
+      //     name_en:"Day or Week Report",
+      //     pathName_en:"Add/Edit Day or Week Report"
+      //   },
+      // },
       {
         path: "reportEnList",
         component: () =>
@@ -302,14 +302,14 @@ export default [
             name_en:"Variety Mgmt"
         }
       },
-      {
-        path: "smartReportList",
-        name: "智能研报",
-        component: () => import("@/views/smartReport/reportList.vue"),
-        meta:{
-            name_en:"Smart Report"
-        }
-      },
+      // {
+      //   path: "smartReportList",
+      //   name: "智能研报",
+      //   component: () => import("@/views/smartReport/reportList.vue"),
+      //   meta:{
+      //       name_en:"Smart Report"
+      //   }
+      // },
       {
         path: 'reportNew',
         name:'研报中心',

+ 6 - 1
src/utils/buttonConfig.js

@@ -223,9 +223,14 @@ export const dataSourcePermission = {
     manualData_add_updateRemind:'manualData:add:updateRemind',//新增编辑-更新提醒
     /*--------手工数据录入---- */
     manualDataWrite_edit:'manualDataWrite:edit',//编辑按钮,直接编辑没有禁
+    manualDataWrite_del:'manualDataWrite:del',//删除
+    manualDataWrite_add:'manualDataWrite:add',//添加
     manualDataWrite_export:'manualDataWrite:export',//导出
     manualDataWrite_import:'manualDataWrite:import',//导入
-    manualDataWrite_copy:'manualDataWrite:copy',//复制
+    manualDataWrite_online_excel:'manualDataWrite:online:excel',//在线excel
+    manualDataWrite_batch_add:'manualDataWrite:batch:add',//批量加入
+    manualDataWrite_batch_del:'manualDataWrite:batch:del',//批量删除
+    
     /*--------期货数据库没有要控制的东西---- */
     /*--------隆众原始数据库---- */
     longzhongData_export:'longzhongData:export',

+ 4 - 0
src/utils/registryComponents.js

@@ -42,3 +42,7 @@ Vue.component('dataLoading',dataLoading)
 //无指标/图表/表格权限缺省
 import noDataAuth from '@/components/noDataAuth.vue';
 Vue.component('noDataAuth',noDataAuth)
+
+// 选择图表类型
+import chartTypeSelect from '@/components/chart/chartTypeSelect.vue'
+Vue.component('chartTypeSelect',chartTypeSelect)

+ 7 - 2
src/views/chartRelevance_manage/components/selectTarget.vue

@@ -32,7 +32,7 @@
         v-model="targetType"
         :placeholder="$t('StatisticAnalysis.StatisticFeatureChart.selecr_indicator_pld')"
         @change="targetTypeChange"
-        style="width: 150px;"
+        :style="{'width': selectBoxWidth?selectBoxWidth:'150px'}"
       >
         <el-option
           v-for="item in etaTypeOpt"
@@ -141,7 +141,10 @@ export default {
       },
       isDisabled:{
         default:false
-      }
+      },
+      selectBoxWidth:{
+        default:''
+      },
     },
     watch:{
       defaultId(){
@@ -251,12 +254,14 @@ export default {
           this.search_page = 1;
           this.search_txt=''
           this.$emit('select','')
+          this.$emit('edbTypeChange',this.targetType=='1'?0:1)
         },
 
         // 指标选择
         handleSelectTarget(e){
             let arr=this.searchOptions.filter(_item=>_item.EdbInfoId==e)
             this.$emit('select',arr[0])
+            this.$emit('edbTypeChange',this.targetType=='1'?0:1)
         },
     },
 }

+ 47 - 18
src/views/dataEntry_manage/addChart.vue

@@ -26,19 +26,7 @@
 					:rules="chartRules"
 				>
 					<el-form-item :label="$t('EtaChartAddPage.label_chart_type')" prop="ChartType">
-						<el-select
-							v-model="chartInfo.ChartType"
-							placeholder="请选择生成样式"
-							style="width: 90%"
-						>
-							<el-option
-								v-for="item in styleArr"
-								:key="item.key"
-								:label="item.label"
-								:value="item.key"
-							>
-							</el-option>
-						</el-select>
+						<chartTypeSelect v-model="chartInfo.ChartType" style="width:90%"/>
 					</el-form-item>
 
 					<el-form-item :label="$t('EtaChartAddPage.label_chart_theme')" prop="Theme">
@@ -59,7 +47,7 @@
 					</el-form-item>
 
 					<el-form-item label="">
-						<div class="search-cont" v-if="chartInfo.ChartType!==10">
+						<div class="search-cont" v-if="![10,14].includes(chartInfo.ChartType)">
 							<div>
 								<label><!-- 选择指标 -->{{$t('Edb.choose_edb')}}:</label>
 								<el-radio-group v-model="edbFromType">
@@ -201,7 +189,7 @@
 					</div>
 					
 					<!-- 配置区  柱形 截面 雷达不需要-->
-          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10,11].includes(chartInfo.ChartType)">
+          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10,11,14].includes(chartInfo.ChartType)">
             <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="[2,5].includes(chartInfo.ChartType)">
               <template slot="title">
                 <span class="text_oneLine">{{currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}</span>
@@ -352,6 +340,17 @@
 						@modifySeriesName="IsNameDefault = false"
 					/>
 
+					<!-- 截面组合图 -->
+					<sectional-combination-option 
+						ref="sectionalCombinationIns"
+						v-if="chartInfo.ChartType===14"
+						:chartInfo="chartInfo"
+						:defaultData="sectionalCombinationData"
+						@getData="getSectionalCombination"
+						@hideChart="tableData=[];"
+						@updateChart="handleUpdateSectionalCombinationChart"
+					/>
+
 
 					<!-- 标识区 标记线 图表说明 -->
 					<markersSection
@@ -599,6 +598,24 @@
 								<span class="editsty" @click="isShowSourceDialog=true"><!-- 编辑 -->{{$t('Chart.chart_edit_btn')}}</span>
 							</div>
 
+							<!-- 是否堆积 -->
+							<div v-if="showIsHeap">
+								<span>{{$t('EtaChartAddPage.bar_stacking')}}</span>
+								<el-tooltip
+                  :content="$t('EtaChartAddPage.stack_tips')"
+                  placement="top"
+                >
+                  <i class="el-icon-info"></i>
+                </el-tooltip>
+                <el-switch
+                  style="margin-left: 20px"
+                  v-model="IsHeap"
+									@change="handleHeapChange"
+                >
+                </el-switch> 
+							</div>
+
+
 							<!-- 公历农历切换 只用于季节性图 -->
 							<el-radio-group
 								v-model="calendar_type"
@@ -684,8 +701,19 @@ import LegendEditDia from './components/LegendEditDia.vue';
 import markersSection from './components/markersSection.vue';
 import chartSourceEditDia from './components/chartSourceEditDialog.vue';
 import chartRelationEdbList from './components/chartReleationEdbTable.vue';
+import sectionalCombinationOption from './components/sectionalCombination/sectionalCombinationOption.vue';
 export default {
-  components: { Chart,DateChooseDia,barOption,sectionalScatterOption,LegendEditDia,markersSection,chartSourceEditDia,chartRelationEdbList},
+  components: { 
+		Chart,
+		DateChooseDia,
+		barOption,
+		sectionalScatterOption,
+		LegendEditDia,
+		markersSection,
+		chartSourceEditDia,
+		chartRelationEdbList,
+		sectionalCombinationOption
+	},
 	directives: {
     drag(el, bindings) {
       el.onmousedown = function (e) {
@@ -716,7 +744,7 @@ export default {
 		tableData: {
       handler(newval, oldval) {
 				if(newval.length) {
-					if([7,10,11].includes(this.chartInfo.ChartType)) {
+					if([7,10,11,14].includes(this.chartInfo.ChartType)) {
 						// 奇怪柱形图
 						this.chartInfo.ChartType === 7 && this.barDateList.length && this.$refs.BarOptRef.getBarData();
 
@@ -822,7 +850,7 @@ export default {
 						hasLimitChange = !limitSame
 					}
 					
-					if(![10,11].includes(this.chartInfo.ChartType)){
+					if(![10,11,14].includes(this.chartInfo.ChartType)){
 						//每个数据转换需要检测是否合法
 						for(let i=0;i<db_arr.length;i++){
 							const {IsConvert,ConvertType,ConvertValue} = this.updateData[i]
@@ -880,6 +908,7 @@ export default {
 											? this.select_date[0]
 											: '',
 								EndDate: this.year_select === 5 ? this.select_date[1] : '',
+								ExtraConfig:JSON.stringify({IsHeap:this.IsHeap?1:0})//时间序列组合图是否堆积控制
 							} 
 						: typePrams
 					if(![7,10,11].includes(this.chartInfo.ChartType)){

+ 13 - 3
src/views/dataEntry_manage/chartSetting.vue

@@ -1747,12 +1747,18 @@ export default {
       this.setDefaultPreviewOption(); //设置默认预览配置项
 
       sessionStorage.setItem('defaultArr',JSON.stringify(res.Data.EdbInfoList));
-
+      
+      // 时序组合图控制是否堆叠
+      if(this.chartInfo.ChartType===6){
+        this.IsHeap=res.Data.DataResp.IsHeap===1?true:false
+      }
       const chartTypeMap = {
         7: this.initBarData, //柱形图
         10: this.initSectionScatterData, //截面散点
-        11: this.initRadarData //雷达图
+        11: this.initRadarData, //雷达图
+        14: this.initSectionalCombinationChart
       }
+      
       chartTypeMap[this.chartInfo.ChartType] && chartTypeMap[this.chartInfo.ChartType](res.Data);
 
     },
@@ -1990,6 +1996,10 @@ export default {
                 YMaxValue: String(this.chartLimit.max),
               })
             }
+          case 14:
+            typeChartParam = {
+              ...public_param,
+            }
             break
         }
 
@@ -2380,7 +2390,7 @@ export default {
         .then((res) => {
           this.refreshLoading.close();
           if (res.Ret === 200) {
-            [7,10,11].includes(this.chartInfo.ChartType) ? this.getChartDetail() : this.getPreviewChartInfo();
+            [7,10,11,14].includes(this.chartInfo.ChartType) ? this.getChartDetail() : this.getPreviewChartInfo();
             // this.$message.success('刷新成功');
             this.$message.success(this.$t('MsgPrompt.refresh_success_msg'));
           }

+ 4 - 4
src/views/dataEntry_manage/components/addMarkerDialog.vue

@@ -65,7 +65,7 @@
                     </template>
 
                     <!-- 柱形图,散点,截面散点只可选数字 -->
-                    <template v-else-if="[5,7,10].includes(chartInfo.ChartType)">
+                    <template v-else-if="[5,7,10,14].includes(chartInfo.ChartType)">
                         <el-input
                             v-model="markerForm.value"
                             style="width: 100px;"
@@ -135,7 +135,7 @@
               </template>
 
               <!-- 柱形图,散点,截面散点只可选数字 -->
-              <div v-else-if="[5,7,10].includes(chartInfo.ChartType)">
+              <div v-else-if="[5,7,10,14].includes(chartInfo.ChartType)">
                 <el-input
                   v-model="markerForm.fromValue"
                   class="number-input"
@@ -535,9 +535,9 @@ export default {
       }
       return isHave
     },
-    /* 是否可选x轴 柱形图不可选*/
+    /* 是否可选x轴 柱形图、截面组合图不可选*/
     canSelectXaxis() {
-      return this.chartInfo.ChartType!==7
+      return ![7,14].includes(this.chartInfo.ChartType)
     },
     /* 是否可选右轴 曲线 组合 堆积柱*/
     canSelectRightYaxis() {

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

@@ -67,7 +67,7 @@ export default {
 			let themeOptions = this.setThemeOptions();
 			const options = {...defaultOpts,...themeOptions,...this.options}
 
-			console.log(themeOptions,this.options)
+			console.log('图表配置:',themeOptions,this.options,options)
 			
 			let thatThis = this
 			//stock不支持线形图只支持时间图 部分图用原始chart

+ 2 - 2
src/views/dataEntry_manage/components/chartReleationEdbTable.vue

@@ -5,7 +5,7 @@
     highlight-current-row
     border
   >
-    <el-table-column type="expand" v-if="![10,11].includes(chartInfo.ChartType)">
+    <el-table-column type="expand" v-if="![10,11,14].includes(chartInfo.ChartType)">
       <template slot-scope="{row,$index}">
             <div class="expand-wrap">
                 <div class="data-change">
@@ -68,7 +68,7 @@
     >
         <template slot-scope="scope" v-if="scope.row.HaveOperaAuth">
             <!-- 如果是季节性图的右轴,隐藏删除按钮 -->
-            <span @click="delTarget(scope.row)" class="deletesty" v-if="!(scope.$index===1&&chartInfo.ChartType===2)"><!-- 删除 -->{{$t('Table.delete_btn')}}&nbsp;</span>
+            <span @click="delTarget(scope.row)" class="deletesty" v-if="!((scope.$index===1&&chartInfo.ChartType===2)||chartInfo.ChartType===14)"><!-- 删除 -->{{$t('Table.delete_btn')}}&nbsp;</span>
             <span v-permission="permissionBtn.chartLibPermission.chartLib_copyData"
                 class="editsty" @click="copyCode(scope.row)">
                 <i class="el-icon-document-copy" />&nbsp;<!-- 复制数据 -->{{$t('Edb.detail_copydata_btn')}}</span

+ 71 - 48
src/views/dataEntry_manage/components/insertData.vue

@@ -13,22 +13,30 @@
     <div slot="title" style="display: flex; alignitems: center">
       <img
         :src="$icons.imp"
-        style="color: #fff; width: 16px; height: 16px; marginright: 5px"
+        style="color: #fff; width: 16px; height: 16px; margin-right: 5px"
       />
-      <span style="fontsize: 16px">{{$t('ManualEntryPage.tit_insert_data')}}</span>
+      <span style="font-size: 16px">{{$t('ManualEntryPage.tit_insert_data')}}</span>
     </div>
     <div class="down-min">
       <dataLoading :loading="isLoading"/>
-      
-      <div class="download-ico">
-        <a :href="`${downloadTemplate}${$i18nt.locale==='zh'?'':'/en'}`" download="模板">
-          <i class="icon down_ico"></i>
-          <span style="color: #5882ef; cursor: pointer">{{$t('ManualEntryPage.down_tem')}}</span>
-        </a>
-        <!-- <a :href="downloadTemplate" download="模板" style="color:#5882EF;cursor:pointer;">下载模板</a> -->
+
+      <div class="section-item">
+        <h3><!-- 下载导入模板 -->{{$t('ManualEntryPage.down_tem')}}</h3>
+        <div class="templete-wrap">
+          <div class="item" v-for="tem in templateList" :key="tem.name">
+            <a :href="tem.url" download="模板">
+              <el-button type="primary" icon="el-icon-download">{{tem.name}}</el-button>
+            </a>
+            <div>
+              <img :src="tem.previewImg" alt="" width="150" style="display:block;margin:10px 0;">
+              <span class="editsty" @click="handlePreviewImg(tem)"><!-- 查看大图 -->{{$t('ManualEntryPage.view_big_img')}}</span>
+            </div>
+          </div>
+        </div>
       </div>
-      <i class="arrow-ico"></i>
-      <div class="import-ico">
+
+      <div class="section-item">
+        <h3><!-- 导入数据 -->{{$t('ManualEntryPage.tit_insert_data')}}</h3>
         <el-upload
           class="upload-demo"
           :before-upload="beforeUploadFile"
@@ -44,9 +52,7 @@
           :name="name"
           :show-file-list="false"
         >
-          <i class="icon up_ico"></i>
-          <span style="color: #5882ef; cursor: pointer">{{$t('ManualEntryPage.tit_insert_data')}}</span>
-          <!-- <el-button type="primary">导入</el-button> -->
+          <el-button type="primary" icon="el-icon-upload">{{$t('ManualEntryPage.tit_insert_data')}}</el-button>
         </el-upload>
       </div>
     </div>
@@ -55,65 +61,68 @@
       <span>{{$t('ManualEntryPage.step_two')}}</span>
       <span>{{$t('ManualEntryPage.step_three')}}
         <a
-          style="display: inline; color: #5882ef"
+          style="display: inline; color: #0052D9"
           :href="downloadErrorlist"
           download
           >{{$t('ManualEntryPage.down_fail_list')}}</a
         >。</span
       >
     </div>
+
+    <el-image-viewer 
+        v-if="showImgViewer" 
+        :on-close="()=>{this.previewList=[];this.showImgViewer = false}" 
+        :url-list="previewList" 
+    />
   </el-dialog>
 </template>
 
 <script>
 import { dataInterence } from "api/api.js";
+import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
 export default {
   name: "",
+  components: { ElImageViewer },
   props: {
     isShowinsert: {
       type: Boolean,
     },
-    source: {
-      type: String,
-    },
   },
   data() {
     return {
       action: process.env.VUE_APP_API_ROOT + "/entry/import/data", //上传文件
-      downloadTemplate: process.env.VUE_APP_API_ROOT + "/entry/template", //模板下载
       downloadErrorlist:
         process.env.VUE_APP_API_ROOT +
         "/entry/import/failList" +
         `?${localStorage.getItem("auth")}`, //失败列表下载
       name: "EntryFile",
+
+      templateList: [
+        {
+          name:/* "模板1"  */this.$t('ManualEntryPage.tem_msg',{index:1}),
+          url: process.env.VUE_APP_API_ROOT + "/entry/template?Source=1",
+          previewImg: require('@/assets/img/data_m/tem1.jpg')
+        },
+        {
+          name:/* "模板2" */this.$t('ManualEntryPage.tem_msg',{index:2}),
+          url: process.env.VUE_APP_API_ROOT + "/entry/template?Source=2",
+          previewImg: require('@/assets/img/data_m/tem2.jpg')
+        },
+      ],
       params: {},
       headerConfig: {
         Authorization: localStorage.getItem("auth"),
       },
       isLoading: false,
-      fileList: []
+      fileList: [],
+
+      showImgViewer: false,
+      previewList: []
     };
   },
-  watch: {
-    source: {
-      handler(nval) {
-        if (nval === "targetList") {
-          this.action = process.env.VUE_APP_API_ROOT + "/entry/target/import";
-          this.downloadTemplate =
-            process.env.VUE_APP_API_ROOT + "/entry/target/template";
-          this.downloadErrorlist =
-            process.env.VUE_APP_API_ROOT +
-            "/entry/import_target/failList" +
-            `?${localStorage.getItem("auth")}`;
-          this.name = "ImportTargetFile";
-        }
-      },
-      immediate: true,
-    },
-  },
   methods: {
     cancelHandle() {
-      this.$emit("cancelHandle", 2);
+      this.$emit('update:isShowinsert',false)
     },
     // 校验文件和大小
     beforeUploadFile(file) {
@@ -172,13 +181,12 @@ export default {
       }
       this.isLoading = false;
     },
-    // 下载模板
-    // downLoad() {
-    // 	dataInterence.downTemplate().then(res => {})
-    // },
+
+    handlePreviewImg(item) {
+      this.previewList=[item.previewImg]
+      this.showImgViewer=true 
+    }
   },
-  created() {},
-  mounted() {},
 };
 </script>
 <style lang="scss" scoped>
@@ -186,11 +194,11 @@ export default {
   max-width: 800px;
   .down-min {
     position: relative;
-    display: flex;
+    /* display: flex;
     align-items: center;
-    justify-content: center;
-    text-align: center;
-    margin: 100px 0 90px;
+    justify-content: center; */
+    /* text-align: center; */
+    margin: 20px 0 50px;
     .arrow-ico {
       width: 140px;
       height: 14px;
@@ -224,5 +232,20 @@ export default {
       margin-bottom: 18px;
     }
   }
+
+  .section-item {
+    padding: 20px 0;
+    &:first-child {
+      border-bottom: 1px solid #C8CDD9;
+    }
+    h3 {
+      font-size: 16px;
+      margin-bottom: 20px;
+    }
+    .templete-wrap {
+      display: flex;
+      gap: 20px;
+    }
+  }
 }
 </style>

+ 116 - 0
src/views/dataEntry_manage/components/sectionalCombination/axisSet.vue

@@ -0,0 +1,116 @@
+<template>
+  <el-dialog
+    :visible.sync="show"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+    @close="cancelHandle"
+    custom-class="axis-set-dialog"
+    center
+    width="800px"
+    v-dialogDrag
+    top="8vh"
+    :title="$t('EtaChartAddPage.axis_set')"
+  >
+    <div class="axis-wrap">
+        <div class="label-text">{{$t('EtaChartAddPage.xAxis_name_set')}}</div>
+        <div class="list-box">
+          <el-input class="item-box" v-model="item.Name" v-for="item,index in xData" :key="index"></el-input>
+        </div>
+    </div>
+    <div class="axis-wrap">
+        <div class="label-text">{{$t('EtaChartAddPage.yAxis_unit_set')}}</div>
+        <div class="list-box">
+          <el-input class="item-box" v-model="yData.LeftName" v-if="seriesData.some(_=>_.IsAxis==1)"></el-input>
+          <el-input class="item-box" v-model="yData.RightName" v-if="seriesData.some(_=>_.IsAxis==0)"></el-input>
+          <el-input class="item-box" v-model="yData.RightTwoName" v-if="seriesData.some(_=>_.IsAxis==2)"></el-input>
+        </div>
+    </div>
+    <div class="btn-bottom">
+      
+      <el-button @click="cancelHandle"
+        ><!-- 取消 -->{{ $t("Dialog.cancel_btn") }}</el-button
+      >
+      <el-button type="primary"
+        @click="handleSave"
+        ><!-- 保存 -->{{ $t("Dialog.confirm_save_btn") }}</el-button
+      >
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    XDataList:[],
+    UnitList:{},
+    seriesData:null
+  },
+  watch:{
+    show(n){
+      if(n){
+        this.xData=this.XDataList||[]
+        this.yData=this.UnitList
+      }
+    }
+  },
+  data() {
+    return {
+      xData:[],
+      yData:{
+        LeftName:'',
+				RightName:'',
+				RightTwoName:''
+      }
+    }
+  },
+  methods: {
+    cancelHandle() {
+      this.$emit("update:show", false);
+    },
+    handleSave(){
+      for (let item of this.xData) {
+        if(!item.Name){
+          this.$message.warning('横轴名称不能为空')
+          return false
+        }
+      }
+      this.$emit('change',{XDataList:this.xData,UnitList:this.yData})
+      this.cancelHandle()
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.axis-set-dialog {
+  .axis-wrap{
+    margin-bottom: 30px;
+    .label-text{
+      padding: 13px 30px;
+      font-size: 18px;
+      border-bottom: 1px solid #C8CDD9;
+      background-color: #EBEFF6;
+    }
+    .list-box{
+      padding: 20px;
+      background-color: #F4F8FE ;
+      display: flex;
+      flex-wrap: wrap;
+      gap: 20px;
+      .item-box{
+        width: 30%;
+      }
+    }
+  }
+  .btn-bottom {
+    margin-top: 40px;
+    text-align: center;
+    padding: 30px 0;
+    position: relative;
+  }
+}
+</style>

+ 175 - 0
src/views/dataEntry_manage/components/sectionalCombination/batchModifyDate.vue

@@ -0,0 +1,175 @@
+<template>
+  <el-dialog
+    :visible.sync="show"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+    @close="cancelHandle"
+    custom-class="batchset-date-dialog"
+    center
+    width="600px"
+    v-dialogDrag
+    top="15vh"
+    :title="$t('EtaChartAddPage.batch_set_date')"
+  >
+    <div class="top-flex-box">
+      <div style="display: flex; align-items: center">
+        <el-radio v-model="dateType" :label="0">{{$t('ETableChildren.latest_date_indicator')}}</el-radio>
+        <div>
+          <label class="el-form-item__label">{{
+            $t("ETableChildren.advance_the_term")
+          }}</label>
+          <el-input
+            class="number-input"
+            v-model="MoveForward"
+            type="number"
+            :min="0"
+            style="margin-right: 10px; width: 60px"
+            @change="
+              (e) => {
+                MoveForward = Number(e);
+              }
+            "
+          />{{ $t("ETableChildren.term_ipt") }}
+        </div>
+      </div>
+      <div>
+        <el-radio v-model="dateType" :label="1">{{$t('EtaChartAddPage.refrence_date_name')}}</el-radio>
+        <el-select v-model="refrenceDateName" :placeholder="$t('Edb.InputHolderAll.input_date')" style="width: 120px">
+          <el-option v-for="opt in referenceDateOpts" :key="opt.name" :label="opt.name" :value="opt.name"></el-option>
+        </el-select>
+      </div>
+    </div>
+    <div v-if="dateType!=1">
+      <dateTrans v-model="dateTransfData" />
+    </div>
+    <div class="btn-bottom">
+      <el-button @click="cancelHandle"
+        ><!-- 取消 -->{{ $t("Dialog.cancel_btn") }}</el-button
+      >
+      <el-button type="primary" style="margin-right: 20px"
+        @click="handleApply"
+        ><!-- 应用 -->{{ $t("Dialog.apply_btn") }}</el-button
+      >
+      <el-tooltip class="item" effect="dark" :content="$t('EtaChartAddPage.date_set_tips')" placement="top-start">
+        <i class="el-icon-info" style="position: relative;left:-15px"></i>
+      </el-tooltip>
+
+      <el-popover placement="top-start" width="400" trigger="hover">
+        <p style="padding: 20px; line-height: 25px" v-html="introHtml" />
+        <el-button class="tips-btn" type="text" slot="reference"
+          >{{$t('Edb.formula_instru')}}</el-button
+        >
+      </el-popover>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import dateTrans from './dateTrans.vue'
+export default {
+  components: { dateTrans },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    referenceDateOpts:[]
+  },
+  watch: {
+    show(n){
+      if(n){
+        this.dateType=''
+        this.MoveForward=0
+        this.dateTransfData=[]
+        this.refrenceDateName=''
+      }
+    }
+  },
+  computed: {
+    introHtml() {
+      return `
+        <p>批量设置日期说明:</p>
+        <p>1、默认未选中任何选项,无需回显上次配置项;</p>
+        <p>2、进行批量设置日期,应用后,覆盖该系列的所有已添加指标的日期选择;</p>
+        <p>3、进行批量设置日期,应用后,该系列添加更多指标时,使用该设置日期的选项;</p>
+        <p>4、应用文案说明如下:</p>
+      `
+    }
+  },
+  data() {
+    return {
+      dateType: '',
+      MoveForward: 0,
+      dateTransfData: [],//日期变换数据
+      refrenceDateName:''
+    }
+  },
+  methods: {
+    cancelHandle() {
+      this.$emit("update:show", false);
+    },
+    handleApply(){
+      if(![0,1].includes(this.dateType)){
+        this.$message.warning(this.$t('EtaChartAddPage.select_date_type'))
+        return
+      }
+      if(this.dateType===1&&!this.refrenceDateName){
+        this.$message.warning(this.$t('EtaChartAddPage.select_refrence_tips'))
+        return
+      }
+      this.$emit('apply',{
+        dateType:this.dateType,
+        MoveForward:this.MoveForward,
+        dateTransfData:this.dateTransfData,
+        refrenceDateName:this.refrenceDateName
+      })
+      this.cancelHandle()
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.batchset-date-dialog {
+  .top-flex-box {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    gap: 0 10px;
+    .el-radio {
+      margin-right: 10px !important;
+    }
+    .el-input__inner{
+      padding: 0 5px;
+    }
+  }
+  .date-change-ways {
+    margin-top: 20px;
+    padding-left: 0;
+    .header {
+      label {
+        width: auto;
+        margin-left: 0;
+      }
+    }
+    .date-change-list {
+      padding-left: 0;
+      .el-tag.el-tag--info {
+        background-color: #dae8ff;
+        border-color: #dae8ff;
+        color: #075eee;
+      }
+    }
+  }
+  .btn-bottom {
+    text-align: center;
+    padding: 30px 0;
+    position: relative;
+    .tips-btn {
+      position: absolute;
+      bottom: 20px;
+      right: 0;
+    }
+  }
+}
+</style>

+ 185 - 0
src/views/dataEntry_manage/components/sectionalCombination/dateTrans.vue

@@ -0,0 +1,185 @@
+<template>
+  <div class="date-change-ways">
+    <div class="header date-item">
+      <label class="el-form-item__label">{{$t('ETableChildren.date_change_label')}}</label>
+                
+      <el-select v-model="dateChangeSelect" :placeholder="$t('ETable.Msg.please_select')" style="width:110px">
+        <el-option :label="$t('ETableChildren.date_displacement_label')" :value="1"/>
+        <el-option :label="$t('ETableChildren.specified_frequency_tag')" :value="2"/>
+      </el-select>
+
+      <el-button type="text" style="margin: 0 10px;" @click="addDateChange">{{$t('ETable.Btn.add_btn')}}</el-button>
+    </div>
+    
+    <ul v-if="dateChangeArr.length" class="date-change-list">
+      <li v-for="(dateItem,index) in dateChangeArr" :key="dateItem.ChangeType" class="date-change-li">
+
+        <div v-if="dateItem.ChangeType===1" class="date-item">
+          <el-tag type="info" style="margin-right:15px">{{$t('ETableChildren.date_displacement_label')}}</el-tag>
+          <div>
+            <el-input
+              v-model="dateItem.Day"
+              type="number"
+              style="margin-right:10px;width:80px"
+              @change="e => {dateItem.Day=Number(e);}"
+            />{{$t('ETable.Date.day')}}
+            <el-input
+              v-model="dateItem.Month"
+              type="number"
+              style="margin-right:10px;width:80px"
+              @change="e => {dateItem.Month=Number(e);}"
+            />{{$t('ETable.Date.month')}}
+            <el-input
+              v-model="dateItem.Year"
+              type="number"
+              style="margin-right:10px;width:80px"
+              @change="e => {dateItem.Year=Number(e);}"
+            />{{$t('ETable.Date.year')}}
+          </div>
+          <i class="el-icon-delete" @click="removeDateItem(index)"></i>
+        </div>
+
+        <div v-else-if="dateItem.ChangeType===2" class="date-item">
+          <el-tag type="info" style="margin-right:15px">{{$t('ETableChildren.specified_frequency_tag')}}</el-tag>
+          <el-select
+              style="max-width: 120px;"
+              v-model="dateItem.Frequency"
+              :placeholder="$t('OnlineExcelPage.please_select_frequency')"
+              @change="dateItem.FrequencyDay=frequencyDaysOptions[0].name;"
+          >
+            <el-option
+                v-for="item in frequencyOptions"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value"
+            />
+          </el-select>
+
+          <el-select
+              style="max-width: 120px;margin:0 10px"
+              v-model="dateItem.FrequencyDay"
+              :placeholder="$t('ETable.Msg.please_select')"
+          >
+            <el-option
+                v-for="item in frequencyDaysOptions"
+                :key="item.name"
+                :label="item.lable"
+                :value="item.name"
+            />
+          </el-select>
+
+          <i class="el-icon-delete" @click="removeDateItem(index)"></i>
+        </div>
+      </li>
+    </ul>
+  </div>
+</template>
+<script>
+export default {
+  props:{
+    value:{
+      default:()=>[]
+    },
+  },
+  watch: {
+    value: {
+      handler(newValue) {
+        this.dateChangeArr = newValue||[];
+      },
+      immediate: true // 在组件创建时立即执行处理函数
+    },
+    dateChangeArr:{
+      handler(newValue) {
+        this.$emit('input', newValue);
+      },
+      deep: true
+    }
+  },
+  computed: {
+    frequencyDaysOptions() {
+      let typeMap = {
+        '本周': [
+          { name: '周一' ,lable: this.$t('ETable.Date.monday') },
+          { name: '周二' ,lable: this.$t('ETable.Date.tuesday')},
+          { name: '周三' ,lable: this.$t('ETable.Date.wednesday')},
+          { name: '周四' ,lable: this.$t('ETable.Date.thursday')},
+          { name: '周五' ,lable: this.$t('ETable.Date.friday')},
+          { name: '周六' ,lable: this.$t('ETable.Date.saturday')},
+          { name: '周日' ,lable: this.$t('ETable.Date.sunday')},
+        ]
+      }
+      
+      let obj = this.dateChangeArr.find(_ => _.ChangeType===2);
+      if(!obj) return []
+
+      return typeMap[obj.Frequency] 
+        ? typeMap[obj.Frequency] 
+        : [
+          {name:'第一天',lable: this.$t('ETable.Date.first_day')},
+          {name:'最后一天',lable: this.$t('ETable.Date.last_day')}
+        ]
+    },
+    frequencyOptions(){
+      return  [
+        { name: this.$t('ETable.Date.this_week'), value: '本周' },
+        { name: this.$t('ETable.Date.this_ten_days'), value: '本旬' },
+        { name: this.$t('ETable.Date.this_month'), value: '本月' },
+        { name: this.$t('ETable.Date.this_season'), value: '本季' },
+        { name: this.$t('ETable.Date.this_half_year'), value: '本半年' },
+        { name: this.$t('ETable.Date.this_year'), value: '本年' },
+      ]
+    }
+  },
+  data() {
+    return {
+      dateChangeSelect: 1,
+      dateChangeArr: [],
+    }
+  },
+  methods:{
+    /* 提加日期变换数组 */
+    addDateChange() {
+      let haveObj = this.dateChangeArr.find(_ => _.ChangeType===this.dateChangeSelect);
+      if(haveObj) return this.$message.warning(this.dateChangeSelect===1?this.$t('ETableChildren.added_date_offset_msg') :this.$t('ETableChildren.added_frequency_offset_msg') )
+      let item = {
+        ChangeType: this.dateChangeSelect,
+        Day: 0,
+        Month: 0,
+        Year: 0,
+        Frequency: '本周',
+        FrequencyDay: '周一'
+      }
+
+      this.dateChangeArr.push(item)
+    },
+
+    removeDateItem(index) {
+      this.dateChangeArr.splice(index,1)
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.date-change-ways {
+  padding-left: 20px;
+  .date-change-list {
+    padding-left: 68px;
+  }
+  .date-change-li {
+    margin: 10px 0;
+  }
+  .header {
+    label { width: 100px;text-align: right;margin-left: -20px;}
+  }
+  .date-item {
+    display: flex;
+    align-items: center;
+    .el-icon-delete {
+      color: #f00;
+      font-size: 16px;
+      margin:0 10px;
+      cursor: pointer;
+    }
+  }
+}
+</style>

+ 306 - 0
src/views/dataEntry_manage/components/sectionalCombination/referenceDateSet.vue

@@ -0,0 +1,306 @@
+<template>
+  <el-dialog
+    :visible.sync="show"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+    @close="cancelHandle"
+    custom-class="referenceData-set-dialog"
+    center
+    width="960px"
+    v-dialogDrag
+    top="8vh"
+    :title="$t('EtaChartAddPage.reference_date_set')"
+  >
+    <div class="list-wrap">
+      <div class="list-item" v-for="(item, index) in list" :key="index">
+        <img
+          class="btn-del"
+          v-if="list.length > 1"
+          src="~@/assets/img/icons/delete-red.png"
+          alt=""
+          @click="handleDelListItem(index)"
+        />
+        <el-input
+          :placeholder="$t('EtaChartAddPage.reference_date_name')"
+          v-model="item.name"
+          style="width: 220px"
+        ></el-input>
+        <div class="date-type-box">
+          <el-radio v-model="item.dateType" :label="0">{{$t('ETableChildren.latest_date_indicator')}}</el-radio>
+          <div style="width: 300px">
+            <selectTarget
+              ref="selectRef"
+              :defaultType="item.edbType"
+              :defaultId="
+                item.selectEdbData ? item.selectEdbData.EdbInfoId : ''
+              "
+              :defaultOpt="item.selectEdbData ? [item.selectEdbData] : []"
+              :selectStyleType="3"
+              selectBoxWidth="105px"
+              @select="chooseEdb($event, index)"
+              @edbTypeChange="handleEdbTypeChange($event,index)"
+            />
+          </div>
+          <div style="flex: 1">
+            <template v-if="item.selectEdbData">
+              <span>{{$t('Table.frequency')}}:</span>
+              <span>{{ item.selectEdbData.Frequency }}</span>
+              <span>{{$t('Edb.Detail.e_latest_date')}}:</span>
+              <span>{{ item.selectEdbData.EndDate }}</span>
+            </template>
+          </div>
+          <div>
+            <label class="el-form-item__label">{{
+              $t("ETableChildren.advance_the_term")
+            }}</label>
+            <el-input
+              class="number-input"
+              v-model="item.MoveForward"
+              type="number"
+              :min="0"
+              style="margin-right: 10px; width: 40px"
+              @change="
+                (e) => {
+                  item.MoveForward = Number(e);
+                }
+              "
+            />{{ $t("ETableChildren.term_ipt") }}
+          </div>
+        </div>
+        <div class="date-type-box">
+          <el-radio v-model="item.dateType" :label="1" @input="handleSelectSystemDate($event,index)">{{$t('ETableChildren.system_date_rai')}}</el-radio>
+          <span>{{ today }}</span>
+        </div>
+        <div>
+          <dateTrans v-model="item.dateTransfData" />
+        </div>
+      </div>
+    </div>
+    <div class="add-more-btn" @click="handleAddListItem">
+      <img src="~@/assets/img/icons/add_blue_new.png" alt="" />
+      <span>{{$t('EtaChartAddPage.more_refrence_date')}}</span>
+    </div>
+    <div class="btn-bottom">
+      <el-button @click="cancelHandle"
+        ><!-- 取消 -->{{ $t("Dialog.cancel_btn") }}</el-button
+      >
+      <el-button
+        type="primary"
+        style="margin-right: 20px"
+        @click="handleConfirm"
+        ><!-- 保存 -->{{ $t("Dialog.confirm_save_btn") }}</el-button
+      >
+      <el-popover placement="top-start" width="400" trigger="hover">
+        <p style="padding: 20px; line-height: 25px" v-html="introHtml" />
+        <el-button class="tips-btn" type="text" slot="reference"
+          >{{$t('Edb.formula_instru')}}</el-button
+        >
+      </el-popover>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import moment from 'moment';
+import selectTarget from '@/views/chartRelevance_manage/components/selectTarget.vue';
+import dateTrans from './dateTrans.vue'
+export default {
+  components: { selectTarget, dateTrans },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    defaultDate: null,
+  },
+  watch: {
+    show(n){
+      if (n) {
+        console.log(this.defaultDate);
+        if (this.defaultDate.length) {
+          this.list = JSON.parse(JSON.stringify(this.defaultDate))
+        } else {
+          this.list = [{
+            name: '',
+            dateType: 0,//0指标最新日期 1系统日期
+            edbType:0,
+            selectEdbData: null,
+            MoveForward: 0,//期数前移
+            dateTransfData: [],//日期变换数据
+          }]
+        }
+      }
+    }
+  },
+  computed: {
+    introHtml() {
+      return this.$t('ETableChildren.tips_text') 
+    }
+  },
+  data() {
+    return {
+      today: moment().format('YYYY-MM-DD'),
+      list: [
+        {
+          name: '',
+          dateType: 0,//0指标最新日期 1系统日期
+          edbType:0,
+          selectEdbData: null,
+          MoveForward: 0,//期数前移
+          dateTransfData: [],//日期变换数据
+        }
+      ]
+    }
+  },
+  methods: {
+    cancelHandle() {
+      this.$emit("update:show", false);
+    },
+    chooseEdb(e, index) {
+      console.log('选择的指标', e);
+      this.list[index].selectEdbData = e || null
+      // 设置name
+      if (this.list[index].dateType === 0 && !this.list[index].name && e) {
+        this.list[index].name = e.EndDate
+      }
+    },
+    handleSelectSystemDate(e,index){
+      if(!this.list[index].name){
+        this.list[index].name=this.today
+      }
+    },
+
+    handleEdbTypeChange(e,index){
+      console.log('指标类型变化',e);
+      this.list[index].edbType=e
+    },
+
+    handleDelListItem(index) {
+      this.list.splice(index, 1)
+    },
+
+    handleConfirm() {
+      let flag = true
+      this.list.forEach(item => {
+        if (!item.name || (item.dateType == 0 && !item.selectEdbData)) {
+          flag = false
+        }
+      });
+      if (!flag) {
+        this.$message.warning('名称和指标不能为空')
+        return
+      }
+      // 用于检查重复的 name
+      const nameSet = new Set();
+
+      for(let i of this.list){
+        // 检查 seriesName 是否重复
+        if (nameSet.has(i.name)) {
+          this.$message.warning(this.$t('EtaChartAddPage.refrence_date_repeat'))
+          return false;
+        }
+        nameSet.add(i.name);
+      }
+
+
+      this.$emit('change', JSON.parse(JSON.stringify(this.list)))
+      this.$message.success(this.$t('MsgPrompt.saved_msg'))
+      this.cancelHandle()
+    },
+
+    handleAddListItem() {
+      this.list.push({
+        name: '',
+        dateType: 0,//0指标最新日期 1系统日期
+        edbType:0,
+        selectEdbData: null,
+        MoveForward: 0,//期数前移
+        dateTransfData: [],//日期变换数据
+      })
+    }
+  },
+
+}
+</script>
+
+<style lang="scss">
+.referenceData-set-dialog {
+  .list-wrap {
+    max-height: 800px;
+    overflow-y: auto;
+    .list-item {
+      width: 90%;
+      margin-bottom: 20px;
+      padding: 28px 16px;
+      background-color: #f5f7f9;
+      border-radius: 4px;
+      position: relative;
+      .btn-del {
+        position: absolute;
+        right: -25px;
+        width: 20px;
+        height: 20px;
+        top: 50%;
+        transform: translateY(-50%);
+        cursor: pointer;
+      }
+      .date-type-box {
+        margin-top: 20px;
+        display: flex;
+        align-items: center;
+        gap: 0 5px;
+      }
+      .number-input {
+        .el-input__inner {
+          padding: 0 3px;
+        }
+      }
+      .date-change-ways {
+        margin-top: 20px;
+        padding-left: 0;
+        .header {
+          label {
+            width: auto;
+            margin-left: 0;
+          }
+        }
+        .date-change-list {
+          padding-left: 0;
+          .el-tag.el-tag--info {
+            background-color: #dae8ff;
+            border-color: #dae8ff;
+            color: #075eee;
+          }
+        }
+      }
+    }
+  }
+  .add-more-btn {
+    display: inline-block;
+    cursor: pointer;
+    color: #075eee;
+    img {
+      width: 20px;
+      height: 20px;
+      margin-right: 5px;
+      vertical-align: middle;
+    }
+    span {
+      display: inline-block;
+      line-height: 20px;
+      position: relative;
+      top: 2px;
+    }
+  }
+  .btn-bottom {
+    text-align: center;
+    padding: 30px 0;
+    position: relative;
+    .tips-btn {
+      position: absolute;
+      bottom: 20px;
+      right: 0;
+    }
+  }
+}
+</style>

+ 530 - 0
src/views/dataEntry_manage/components/sectionalCombination/sectionalCombinationOption.vue

@@ -0,0 +1,530 @@
+<template>
+  <div class="sectionalCombination-option-wrap">
+    <div class="sort-wrap" v-if="seriesData.length>1">
+      <div>
+        <el-tooltip
+          effect="dark"
+          :content="$t('EtaChartAddPage.sort_tips')"
+          placement="top-start"
+        >
+          <span>
+            <span>{{ $t('EtaChartAddPage.label_sort_rule')}}</span>
+            <i class="el-icon-info"></i>
+          </span>
+        </el-tooltip>
+        <el-radio-group v-model="sortType" style="margin-left: 20px" @change="handleGetChartData">
+          <el-radio :label="0">{{$t('EtaBasePage.default_select_text')}}</el-radio>
+          <el-radio :label="1">{{$t('EtaChartAddPage.option_sort_up')}}</el-radio>
+          <el-radio :label="2">{{$t('EtaChartAddPage.option_sort_low')}}</el-radio>
+        </el-radio-group>
+      </div>
+      <el-select
+        class="select-box"
+        v-model="sortBasisEdb"
+        :placeholder="$t('EtaChartAddPage.select_base_placehold')"
+        @change="handleGetChartData('sortBasisEdb')"
+      >
+        <el-option
+          v-for="item in seriesData"
+          :key="item.seriesName"
+          :label="item.seriesName"
+          :value="item.seriesName"
+        >
+        </el-option>
+      </el-select>
+    </div>
+    <div class="date-set-wrap">
+      <span @click="handleShowRefrenceDate">{{$t('EtaChartAddPage.reference_date_set')}}</span>
+      <span @click="handleShowAxis">{{$t('EtaChartAddPage.axis_set')}}</span>
+    </div>
+    <!-- 系列数据模块 -->
+    <div class="series-data-wrap" v-if="seriesData.length">
+      <el-collapse class="series-list">
+        <el-collapse-item v-for="(item, index) in seriesData" :key="index">
+          <template slot="title">
+            <span class="text_oneLine" @click.stop="handleShowEditSeries(index)">{{
+              currentLang === "en"?item.seriesNameEn||item.seriesName:item.seriesName
+            }}</span>
+            <img class="copy-icon" src="~@/assets/img/icons/copy-active.png" alt="" @click.stop="copySeries(item)">
+            <i
+              class="el-icon-delete del-icon"
+              @click.stop="handleDelSeries(item,index)"
+            ></i>
+          </template>
+          <ul class="set-box">
+            <li>
+              <el-radio-group
+                v-model="item.IsAxis"
+                size="mini"
+                @input="handleChartUpdate('isAxis')"
+              >
+                <el-radio-button :label="1"
+                  ><!-- 左轴 -->{{ $t("Chart.Detail.l_axis") }}</el-radio-button
+                >
+                <el-radio-button :label="0"
+                  ><!-- 右轴 -->{{ $t("Chart.Detail.r_axis") }}</el-radio-button
+                >
+
+                <!-- 指标有右轴时才可以选右2轴 不然没有右2这个概念的意义 -->
+                <el-radio-button
+                  :label="2"
+                  :disabled="
+                    seriesData.findIndex((_) => _.IsAxis === 0) === -1 ||
+                    (seriesData.findIndex((_) => _.IsAxis === 0) === index &&
+                      seriesData.filter((_) => _.IsAxis === 0).length === 1)
+                  "
+                  ><!-- 右2轴 -->{{
+                    $t("Chart.Detail.rtwo_axis")
+                  }}</el-radio-button
+                >
+              </el-radio-group>
+            </li>
+            <li>
+              <div style="display: flex">
+                <span style="margin-right: 3px"
+                  ><!-- 生成样式 -->{{ $t("Chart.label_create_sty") }}:</span
+                >
+                <el-select
+                  v-model="item.seriesChartType"
+                  placeholder="请选择生成样式"
+                  style="width: 50%"
+                  class="edb-item-style"
+                  @change="handleChartUpdate('chartType')"
+                >
+                  <el-option
+                    v-for="item in chartItemStyleArr"
+                    :key="item.key"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </div>
+            </li>
+            <!-- 数据点展示 -->
+            <li>
+              <div style="display: flex; align-items: center" v-if="item.seriesChartType!='column'">
+                <span>{{$t('EtaChartAddPage.show_data_point')}}</span>
+                <el-tooltip
+                  :content="$t('EtaChartAddPage.show_data_point_tips')"
+                  placement="top"
+                >
+                  <i class="el-icon-info"></i>
+                </el-tooltip>
+                <el-switch
+                  style="margin-left: 20px"
+                  v-model="item.showDataPoint"
+                  @change="handleChartUpdate('dataPoint')"
+                >
+                </el-switch>
+              </div>
+            </li>
+            <!-- 数值展示 -->
+            <li>
+              <div style="display: flex; align-items: center">
+                <span>{{$t('EtaChartAddPage.show_data_value')}}</span>
+                <el-tooltip :content="$t('EtaChartAddPage.show_data_value_tips')" placement="top">
+                  <i class="el-icon-info"></i>
+                </el-tooltip>
+                <el-switch
+                  style="margin-left: 33px"
+                  v-model="item.showDataValue"
+                  @change="handleChartUpdate('dataValue')"
+                >
+                </el-switch>
+              </div>
+            </li>
+            <li>
+              <div style="display: flex">
+                <span style="margin-right: 3px"
+                  ><!-- 线条颜色 -->{{ $t("Chart.Detail.line_color") }}:</span
+                >
+                <el-color-picker
+                  v-model="item.ChartColor"
+                  size="mini"
+                  show-alpha
+                  :predefine="predefineColors"
+                  @change="handleChartUpdate('ChartColor')"
+                ></el-color-picker>
+              </div>
+
+              <div style="margin-top: 12px" v-if="item.seriesChartType!='column'">
+                <!-- 线条粗细 -->{{ $t("Chart.Detail.line_size") }}:
+                <el-input
+                  style="width: 60px"
+                  size="mini"
+                  type="number"
+                  :min="1"
+                  v-model="item.ChartWidth"
+                  @change="handleChartUpdate('ChartWidth')"
+                />
+              </div>
+            </li>
+          </ul>
+        </el-collapse-item>
+      </el-collapse>
+    </div>
+
+    <div class="add-cont" @click="showSeriesEdit = true">
+      <img
+        src="~@/assets/img/set_m/add_ico.png"
+        alt=""
+        style="width: 16px; height: 16px; margin-right: 10px"
+      />
+      <span>{{$t('EtaChartAddPage.add_series_btn')}}</span>
+    </div>
+
+    <!-- 引用日期设置 -->
+    <referenceDateSet :show.sync="showReferenceDate" :defaultDate="referenceDateOpts" @change="handleUpdateRefrenceDate"/>
+
+    <!-- 添加系列 -->
+    <seriesEdit 
+      ref="seriesEditIns"
+      :show.sync="showSeriesEdit" 
+      :chartInfo="chartInfo"
+      :defaultData="seriesData"
+      :referenceDateOpts="referenceDateOpts" 
+      @change="handleSeriesChange" 
+      @hideChart="handleHideChart"
+    />
+
+    <!-- 横纵轴设置 -->
+    <axisSet 
+      :show.sync="showAxisSet" 
+      :XDataList="XDataList" 
+      :UnitList="UnitList" 
+      :seriesData="seriesData"
+      @change="handleAxisChange"
+    />
+  </div>
+</template>
+
+<script>
+import axisSet from './axisSet.vue'
+import referenceDateSet from './referenceDateSet.vue'
+import seriesEdit from './seriesEdit.vue'
+import { defaultOpts } from '@/utils/defaultOptions';
+export default {
+  components: { referenceDateSet, seriesEdit, axisSet },
+  props:{
+    defaultData:{},
+    chartInfo: {
+      type: Object
+    },
+  },
+  computed:{
+    //可选样式
+    chartItemStyleArr(){
+      return [
+        { label: this.$i18nt.locale==='zh'?'曲线图':'Line chart(curve)', key: 1, value: 'spline' },
+        { label: this.$i18nt.locale==='zh'?'折线图':'Broken line(Line)', key: 2, value: 'line' },
+        { label: this.$i18nt.locale==='zh'?'柱状图':'Bar chart(Bar)', key: 4, value: 'column' },
+      ]
+    }
+  },
+  data() {
+    return {
+      predefineColors: defaultOpts.colors.slice(0, 2), //定义颜色蓝,红 默认颜色
+
+      seriesData: [],
+
+      sortType: 0,//排序类型,0默认,1升序,2降序
+      sortBasisEdb: '',//基准
+
+      referenceDateOpts:[],//引用日期选择项
+
+      showReferenceDate: false,
+
+      showSeriesEdit: false,
+
+      XDataList:[],//横轴配置
+      UnitList:{
+        LeftName:'',
+				RightName:'',
+				RightTwoName:''
+      },//纵轴单位配置
+      showAxisSet: false
+
+    }
+  },
+  mounted(){
+    this.initData()
+  },
+  methods: {
+    handleShowEditSeries(index){
+      this.showSeriesEdit=true
+      this.$nextTick(()=>{
+        this.$refs.seriesEditIns.activeIndex=index
+      })
+    },
+    initData(){
+      if(this.defaultData&&Object.keys(this.defaultData).length !== 0){
+        this.sortType=this.defaultData.SortType
+        this.sortBasisEdb=this.defaultData.BaseChartSeriesName
+        const arr=this.defaultData.SeriesList||[]
+        this.seriesData=arr.map(item=>{
+          const _arr=item.EdbInfoList||[]
+          return {
+            seriesName: item.SeriesName,
+            seriesNameEn: item.SeriesNameEn,
+            seriesChartType: item.ChartStyle,//系列图表展示类型
+            IsAxis: item.IsAxis,
+            ChartColor: item.ChartColor,
+            ChartWidth: item.ChartWidth,
+            showDataPoint: item.IsPoint?true:false,
+            showDataValue: item.IsNumber?true:false,
+            edbList: _arr.map(i=>{
+              return {
+                ChartSeriesEdbMappingId:i.ChartSeriesEdbMappingId,
+						    ChartSeriesId:i.ChartSeriesId,
+                dateType: i.DateConfType,//0指标最新日期 1引用日期
+                edbType:i.EdbInfoType,
+                selectEdbData: i,
+                MoveForward: i.DateConf.MoveForward,//期数前移
+                dateTransfData: i.DateConf.DateChange,//日期变换数据
+                refrenceDateName: i.DateConfName,//选择的引用日期
+              }
+            })
+          }
+        })
+        
+        const arr2=this.defaultData.XDataList||[]
+        this.XDataList=arr2.map(item=>{
+          return {Name:this.$i18nt.locale==='zh'?item.Name:item.NameEn}
+        })
+        this.UnitList=this.defaultData.UnitList
+        this.referenceDateOpts=this.defaultData.DateConfList.map(item=>{
+          return {
+            name: item.DateConfName,
+            dateType: item.DateType||0,//0指标最新日期 1系统日期
+            selectEdbData: item.EdbInfoId?{
+              EdbInfoId:item.EdbInfoId,
+              EdbName:item.EdbName,
+              EdbNameEn:item.EdbNameEn,
+              EndDate:item.EndDate,
+              Frequency:item.Frequency
+            }:null,
+            MoveForward: item.MoveForward||0,//期数前移
+            dateTransfData: item.DateChange||[],//日期变换数据
+          }
+        })
+
+      
+      }
+      console.log('初始化后截面组合图数据:',this.defaultData, this.$data);
+    },
+
+    // 获取图表数据
+    handleGetChartData(type){
+      const data=_.cloneDeep(this.$data)
+      if(type==='sortBasisEdb'){
+        data.XDataList=[]
+      }
+      this.$emit('getData',data)
+    },
+
+    // 图表配置更新
+    handleChartUpdate(type){
+      const params={
+        type,
+        data:this.$data
+      }
+      this.$emit('updateChart',params)
+    },
+
+    //设置横纵轴回调
+    handleAxisChange(e){
+      this.XDataList=e.XDataList
+      this.UnitList=e.UnitList
+      this.handleGetChartData()
+    },
+
+    // 显示设置横纵轴
+    handleShowAxis(){
+      if(this.defaultData&&Object.keys(this.defaultData).length !== 0){
+        const arr=this.defaultData.XDataList||[]
+        this.XDataList=arr.map(item=>{
+          return {Name:this.$i18nt.locale==='zh'?item.Name:item.NameEn}
+        })
+        this.UnitList=this.defaultData.UnitList
+      }
+      this.showAxisSet=true
+    },
+
+    // 系列删除完了
+    handleHideChart(){
+      this.seriesData=[]
+      this.sortBasisEdb=''
+      this.XDataList=[]
+      this.UnitList={
+        LeftName:'',
+        RightName:'',
+        RightTwoName:''
+      }
+      this.$emit('hideChart')
+    },
+
+    // 删除系列
+    async handleDelSeries(item,index){
+      if(this.seriesData.length===1){
+        await this.$confirm(this.$t('EtaChartAddPage.series_del_tips'),this.$t('Dialog.warn_tit'))
+      }
+      this.seriesData.splice(index,1)
+      // 删完了
+      if(this.seriesData.length===0){
+        this.sortBasisEdb=''
+        this.XDataList=[]
+        this.UnitList={
+          LeftName:'',
+          RightName:'',
+          RightTwoName:''
+        }
+        this.$emit('hideChart')
+      }else{
+        // 删除的是基准
+        if(item.seriesName===this.sortBasisEdb){
+          this.sortBasisEdb=this.seriesData[0].seriesName
+        }
+        // 判断是否还有右轴 如果没了则要将右二轴换成右轴
+        const hasRightTwo=this.seriesData.some(i=>i.IsAxis===2)
+        const hasRight=this.seriesData.some(i=>i.IsAxis===0)
+        if(hasRightTwo&&!hasRight){
+          this.seriesData.forEach(i=>{
+            if(i.IsAxis===2){
+              i.IsAxis=0
+            }
+          })
+        }
+        this.handleGetChartData()
+      }
+      console.log('this.seriesData',this.seriesData);
+    },
+
+    //复制系列
+    copySeries(item){
+      this.seriesData.push(JSON.parse(JSON.stringify(item)))
+      this.$refs.seriesEditIns.handleCopySeries()
+      this.showSeriesEdit=true
+    },
+
+    handleSeriesChange(data) {
+      console.log('系列数据改变',data);
+      this.seriesData = JSON.parse(JSON.stringify(data))
+
+      // 设置基准为第一个系列
+      if(!this.sortBasisEdb){
+        this.sortBasisEdb=data[0].seriesName
+      }else{
+        // 如果改了系列名称并且基准名称不在系列里面则重置为第一个
+        if(!data.some(i=>i.seriesName==this.sortBasisEdb)){
+          this.sortBasisEdb=data[0].seriesName
+        }
+      }
+      
+  
+      this.handleGetChartData()
+    },
+
+    handleUpdateRefrenceDate(e){
+      console.log('更新引用日期',e);
+      this.referenceDateOpts=e
+    },
+
+    handleShowRefrenceDate(){
+      console.log('展示引用日期',this.referenceDateOpts);
+      this.showReferenceDate=true
+    }
+  },
+}
+</script>
+
+<style lang="scss">
+.sectionalCombination-option-wrap {
+  .sort-wrap {
+    width: 90%;
+    .el-radio {
+      margin-right: 10px;
+    }
+  }
+  .select-box {
+    display: block;
+    margin-top: 10px;
+    .el-input__inner {
+      height: 40px !important;
+      line-height: 40px !important;
+      padding: 0 15px !important;
+    }
+  }
+  .date-set-wrap {
+    width: 90%;
+    margin-top: 10px;
+    display: flex;
+    justify-content: space-between;
+    color: #409eff;
+    font-size: 15px;
+    cursor: pointer;
+  }
+  .add-cont {
+    margin-top: 10px;
+    color: #409eff;
+    font-size: 16px;
+    cursor: pointer;
+    display: flex;
+    align-items: center;
+  }
+  .series-data-wrap {
+    padding: 30px 0 20px;
+    .el-input__inner {
+      height: 27px;
+      line-height: 27px;
+      padding: 0 4px;
+    }
+    .series-list {
+      border: 1px solid #dcdfe6;
+      .del-icon {
+        position: absolute;
+        right: 10px;
+        font-size: 16px;
+        color: #f00;
+        cursor: pointer;
+      }
+      .copy-icon {
+        position: absolute;
+        right: 30px;
+        font-size: 16px;
+        color: #409eff;
+        cursor: pointer;
+      }
+      .text_oneLine {
+        color: #409eff;
+      }
+      .set-box {
+        padding: 20px 20px 0;
+        li {
+          padding-bottom: 20px;
+          &:last-child {
+            padding-bottom: 0;
+            margin-bottom: 0;
+            border-bottom: none;
+          }
+        }
+      }
+    }
+    .el-collapse-item__header {
+      background-color: #f0f2f5;
+      margin-bottom: 0;
+      border-bottom: 1px solid #dcdfe6;
+      padding: 0 30px;
+      .el-collapse-item__arrow {
+        position: absolute;
+        left: 8px;
+      }
+    }
+
+    .scatter-setting {
+      display: flex;
+      margin-bottom: 20px;
+    }
+  }
+}
+</style>

+ 398 - 0
src/views/dataEntry_manage/components/sectionalCombination/seriesEdit.vue

@@ -0,0 +1,398 @@
+<template>
+  <el-dialog
+    :visible.sync="show"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+    @close="cancelHandle"
+    custom-class="series-set-dialog"
+    center
+    width="1000px"
+    v-dialogDrag
+    top="8vh"
+    :title="$t('EtaChartAddPage.add_series_btn')"
+  >
+    <div class="content-wrap">
+      <div class="top-nav-wrap">
+        <el-button
+          v-for="(item, index) in list"
+          :key="index"
+          type="primary"
+          :plain="activeIndex !== index"
+          @click="handleChangeSeries(index)"
+          class="series-btn"
+          >{{ item.seriesName || $t('EtaChartAddPage.new_series') }}({{
+            item.edbList.length
+          }})<img src="~@/assets/img/icons/delete-icon01.png" class="el-icon-error" alt="" @click.stop="handleDelSeries(index)"></el-button
+        >
+        <el-button
+          class="add-btn"
+          type="default"
+          icon="el-icon-plus"
+          plain
+          @click="handleAddSeries"
+          >{{$t('EtaChartAddPage.more_series_btn')}}</el-button
+        >
+      </div>
+      <series-item-wrap
+        v-if="list.length"
+        v-model="list[activeIndex]"
+        :referenceDateOpts="referenceDateOpts"
+        :disRightTwoAxis="
+          list.findIndex((_) => _.IsAxis === 0) === -1 ||
+          (list.findIndex((_) => _.IsAxis === 0) === activeIndex &&
+            list.filter((_) => _.IsAxis === 0).length === 1)
+        "
+        @del="handleDelListItem"
+      />
+    </div>
+
+    <div class="btn-bottom">
+      <el-button @click="cancelHandle"
+        ><!-- 取消 -->{{ $t("Dialog.cancel_btn") }}</el-button
+      >
+      <el-button type="primary" style="margin-right: 20px" @click="handleSave"
+        ><!-- 保存 -->{{ $t("Dialog.confirm_save_btn") }}</el-button
+      >
+      <el-popover placement="top-start" width="400" trigger="hover">
+        <p style="padding: 20px; line-height: 25px" v-html="introHtml" />
+        <el-button class="tips-btn" type="text" slot="reference"
+          >{{$t('Edb.formula_instru')}}</el-button
+        >
+      </el-popover>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import seriesItemWrap from './seriesItemWrap.vue';
+import { defaultOpts } from '@/utils/defaultOptions';
+export default {
+  name: "sectionalCombinationSeriesEdit",
+  components: { seriesItemWrap },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    referenceDateOpts: [],
+    defaultData: null,
+    chartInfo: {
+      type: Object
+    },
+  },
+  computed: {
+    introHtml() {
+      return this.$t('ETableChildren.tips_text') 
+    }
+  },
+  watch: {
+    show(n) {
+      if (n) {
+        if (this.defaultData && this.defaultData.length > 0) {
+          this.initData()
+        } else {
+          this.list = [
+            {
+              seriesName: '',
+              seriesNameEn: '',
+              seriesChartType: 'spline',//系列图表展示类型
+              IsAxis: 1,
+              ChartColor: '',
+              ChartWidth: 1,
+              showDataPoint: false,
+              showDataValue: false,
+
+              edbList: [
+                {
+                  ChartSeriesEdbMappingId: 0,
+                  ChartSeriesId: 0,
+                  dateType: 0,//0指标最新日期 1引用日期
+                  edbType:0,//指标类型 0普通 1预测
+                  selectEdbData: null,
+                  MoveForward: 0,//期数前移
+                  dateTransfData: [],//日期变换数据
+                  refrenceDateName: '',//选择的引用日期
+                },
+                {
+                  ChartSeriesEdbMappingId: 0,
+                  ChartSeriesId: 0,
+                  dateType: 0,//0指标最新日期 1引用日期
+                  edbType:0,//指标类型 0普通 1预测
+                  selectEdbData: null,
+                  MoveForward: 0,//期数前移
+                  dateTransfData: [],//日期变换数据
+                  refrenceDateName: '',//选择的引用日期
+                },
+                {
+                  ChartSeriesEdbMappingId: 0,
+                  ChartSeriesId: 0,
+                  dateType: 0,//0指标最新日期 1引用日期
+                  edbType:0,//指标类型 0普通 1预测
+                  selectEdbData: null,
+                  MoveForward: 0,//期数前移
+                  dateTransfData: [],//日期变换数据
+                  refrenceDateName: '',//选择的引用日期
+                }
+              ]
+            }
+          ]
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      activeIndex: 0,
+
+      list: [
+        {
+          seriesName: '',
+          seriesNameEn: '',
+          seriesChartType: 'spline',//系列图表展示类型
+          IsAxis: 1,
+          ChartColor: '',
+          ChartWidth: 1,
+          showDataPoint: false,
+          showDataValue: false,
+
+          edbList: [
+            {
+              ChartSeriesEdbMappingId: 0,
+              ChartSeriesId: 0,
+              dateType: 0,//0指标最新日期 1引用日期
+              edbType:0,//指标类型 0普通 1预测
+              selectEdbData: null,
+              MoveForward: 0,//期数前移
+              dateTransfData: [],//日期变换数据
+              refrenceDateName: '',//选择的引用日期
+            },
+            {
+              ChartSeriesEdbMappingId: 0,
+              ChartSeriesId: 0,
+              dateType: 0,//0指标最新日期 1引用日期
+              edbType:0,//指标类型 0普通 1预测
+              selectEdbData: null,
+              MoveForward: 0,//期数前移
+              dateTransfData: [],//日期变换数据
+              refrenceDateName: '',//选择的引用日期
+            },
+            {
+              ChartSeriesEdbMappingId: 0,
+              ChartSeriesId: 0,
+              dateType: 0,//0指标最新日期 1引用日期
+              edbType:0,//指标类型 0普通 1预测
+              selectEdbData: null,
+              MoveForward: 0,//期数前移
+              dateTransfData: [],//日期变换数据
+              refrenceDateName: '',//选择的引用日期
+            }
+          ]
+        }
+      ]
+    }
+  },
+  methods: {
+    initData() {
+      this.list=[]
+      const temArr=_.cloneDeep(this.defaultData)
+      if(this.activeIndex>temArr.length-1){
+        this.activeIndex=0
+      }
+      // 处理选择的引用日期不在引用日期里面问题
+      temArr.forEach(item=>{
+        item.edbList.forEach(_item=>{
+          const inRefrenceDataConf=this.referenceDateOpts.some(i=>i.name===_item.refrenceDateName)
+          if(!inRefrenceDataConf){
+            _item.refrenceDateName=''
+            _item.dateType=0
+          }
+        })
+      })
+      this.list = temArr
+    },
+
+    cancelHandle() {
+      this.$emit("update:show", false);
+    },
+
+    handleAddSeries() {
+      this.list.push({
+        seriesName: '',
+        seriesNameEn: '',
+        seriesChartType: 'spline',//系列图表展示类型
+        IsAxis: 1,
+        ChartColor: '',
+        ChartWidth: 1,
+        showDataPoint: false,
+        showDataValue: false,
+        edbList: [
+          {
+            ChartSeriesEdbMappingId: 0,
+            ChartSeriesId: 0,
+            dateType: 0,//0指标最新日期 1引用日期
+            edbType:0,//指标类型 0普通 1预测
+            selectEdbData: null,
+            MoveForward: 0,//期数前移
+            dateTransfData: [],//日期变换数据
+            refrenceDateName: '',//选择的引用日期
+          },
+          {
+            ChartSeriesEdbMappingId: 0,
+            ChartSeriesId: 0,
+            dateType: 0,//0指标最新日期 1引用日期
+            edbType:0,//指标类型 0普通 1预测
+            selectEdbData: null,
+            MoveForward: 0,//期数前移
+            dateTransfData: [],//日期变换数据
+            refrenceDateName: '',//选择的引用日期
+          },
+          {
+            ChartSeriesEdbMappingId: 0,
+            ChartSeriesId: 0,
+            dateType: 0,//0指标最新日期 1引用日期
+            edbType:0,//指标类型 0普通 1预测
+            selectEdbData: null,
+            MoveForward: 0,//期数前移
+            dateTransfData: [],//日期变换数据
+            refrenceDateName: '',//选择的引用日期
+          }
+        ]
+      })
+
+      this.$nextTick(() => {
+        this.activeIndex = this.list.length - 1
+      })
+
+    },
+
+    handleDelListItem(){
+      this.list.splice(this.activeIndex,1)
+      this.activeIndex=0
+    },
+
+    // 删除系列
+    async handleDelSeries(index){
+      if(this.list.length===1){
+        await this.$confirm(this.$t('EtaChartAddPage.series_del_tips'),this.$t('Dialog.warn_tit'))
+      }
+      this.list.splice(index,1)
+      if(this.activeIndex>this.list.length-1){
+        this.activeIndex=0
+      }
+      
+      if(this.list.length===0){
+        this.$emit('hideChart')
+        this.cancelHandle()
+      }
+    },
+
+    // 处理复制情况
+    handleCopySeries() {
+      this.$nextTick(() => {
+        this.activeIndex = this.list.length - 1
+      })
+    },
+
+    handleChangeSeries(index) {
+      this.activeIndex = index
+    },
+
+    checkArray(arr) {
+      if (!Array.isArray(arr) || arr.length === 0) return false;
+
+      // 用于检查重复的 seriesName
+      const seriesNameSet = new Set();
+
+      // 检查所有 edbList 是否一样长,并且 selectEdbData 都不是 null
+      const edbListLength = arr[0].edbList.length;
+      for (let item of arr) {
+        // 检查是否有seriesName为空
+        if(!item.seriesName){
+          this.$message.warning(this.$t('EtaChartAddPage.series_name_empty'))
+          return false
+        }
+        // 检查 seriesName 是否重复
+        if (seriesNameSet.has(item.seriesName)) {
+          this.$message.warning(this.$t('EtaChartAddPage.series_name_repeat'))
+          return false;
+        }
+        seriesNameSet.add(item.seriesName);
+
+        // 检查 edbList 长度
+        if (item.edbList.length !== edbListLength) {
+          this.$message.warning(this.$t('EtaChartAddPage.series_number_tips'))
+          return false;
+        }
+
+        // 检查 selectEdbData 是否都不是 null
+        for (let edbItem of item.edbList) {
+          if (edbItem.selectEdbData === null) {
+            this.$message.warning('指标为空,请检查')
+            return false;
+          }
+        }
+      }
+
+      return true;
+    },
+
+
+    handleSave() {
+      // 校验系列名称
+      if (!this.checkArray(this.list)) return
+
+      const arr = JSON.parse(JSON.stringify(this.list))
+      // 处理图表配置
+      let themeOpt = this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+      arr.forEach((item, index) => {
+        item.ChartColor = item.ChartColor || (themeOpt && themeOpt.colorsOptions[index] || defaultOpts.colors[index]);
+        item.ChartWidth = item.ChartWidth || (themeOpt && themeOpt.lineOptionList[index].lineWidth || 1);
+      });
+      this.$emit('change', arr)
+      this.cancelHandle()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.series-set-dialog {
+  .content-wrap {
+    .top-nav-wrap {
+      display: flex;
+      flex-wrap: wrap;
+      gap: 10px;
+      padding-bottom: 10px;
+      border-bottom: 1px solid #efefef;
+      margin-bottom: 10px;
+      .el-button {
+        margin-left: 0 !important;
+      }
+      .add-btn {
+        background: #ffffff;
+        border-color: #0052d9;
+        color: #0052d9;
+      }
+      .series-btn{
+        position: relative;
+        .el-icon-error{
+          position: absolute;
+          top: -8px;
+          right: -8px;
+          color: #f00;
+          font-size: 20px;
+        }
+      }
+    }
+  }
+  .btn-bottom {
+    padding: 30px;
+    text-align: center;
+    position: relative;
+    .tips-btn {
+      position: absolute;
+      right: 0;
+    }
+  }
+}
+</style>

+ 314 - 0
src/views/dataEntry_manage/components/sectionalCombination/seriesItemWrap.vue

@@ -0,0 +1,314 @@
+<template>
+  <div class="series-item-wrap">
+    <div class="series-content-wrap">
+      <div class="top-box">
+        <el-input
+          style="width: 200px"
+          :placeholder="$t('EtaChartAddPage.series_name')"
+          v-model="compData.seriesName"
+        ></el-input>
+        <div style="width: 200px">
+          <span style="margin-right: 3px"
+            ><!-- 生成样式 -->{{ $t("Chart.label_create_sty") }}:</span
+          >
+          <el-select
+            v-model="compData.seriesChartType"
+            placeholder="请选择生成样式"
+            style="width: 120px"
+          >
+            <el-option
+              v-for="item in chartItemStyleArr"
+              :key="item.key"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <el-radio-group v-model="compData.IsAxis">
+          <el-radio-button :label="1"
+            ><!-- 左轴 -->{{ $t("Chart.Detail.l_axis") }}</el-radio-button
+          >
+          <el-radio-button :label="0"
+            ><!-- 右轴 -->{{ $t("Chart.Detail.r_axis") }}</el-radio-button
+          >
+          <!-- 指标有右轴时才可以选右2轴 不然没有右2这个概念的意义 -->
+          <el-radio-button :label="2" :disabled="disRightTwoAxis"
+            ><!-- 右2轴 -->{{ $t("Chart.Detail.rtwo_axis") }}</el-radio-button
+          >
+        </el-radio-group>
+        <!-- 批量设置日期 -->
+        <el-button
+          type="text"
+          style="margin-left: auto"
+          @click="showBatchModifyDate = true"
+          >{{$t('EtaChartAddPage.batch_set_date')}}</el-button
+        >
+      </div>
+      <div class="edb-list-wrap">
+        <div class="edb-item-box" v-for="(item, index) in compData.edbList" :key="index">
+          <img
+            class="btn-del"
+            src="~@/assets/img/icons/delete-red.png"
+            alt=""
+            v-if="compData.edbList.length>1"
+            @click="handleDelListItem(index)"
+          />
+          <div class="top-flex-box">
+            <div style="width: 300px">
+              <selectTarget
+                ref="selectEdbRef"
+                :defaultType="item.edbType"
+                :defaultId="
+                  item.selectEdbData ? item.selectEdbData.EdbInfoId : ''
+                "
+                :defaultOpt="item.selectEdbData ? [item.selectEdbData] : []"
+                :selectStyleType="3"
+                selectBoxWidth="105px"
+                @select="chooseEdb($event, index)"
+              />
+            </div>
+            <div style="display: flex; align-items: center">
+              <el-radio v-model="item.dateType" :label="0"
+                >{{$t('ETableChildren.latest_date_indicator')}}</el-radio
+              >
+              <div>
+                <label class="el-form-item__label">{{
+                  $t("ETableChildren.advance_the_term")
+                }}</label>
+                <el-input
+                  class="number-input"
+                  v-model="item.MoveForward"
+                  type="number"
+                  :min="0"
+                  style="margin-right: 10px; width: 60px"
+                  @change="
+                    (e) => {
+                      item.MoveForward = Number(e);
+                    }
+                  "
+                />{{ $t("ETableChildren.term_ipt") }}
+              </div>
+            </div>
+            <div>
+              <el-radio v-model="item.dateType" :label="1">{{$t('EtaChartAddPage.refrence_date_name')}}</el-radio>
+              <el-select v-model="item.refrenceDateName" placeholder="请选择日期" style="width: 120px">
+                <el-option v-for="opt in referenceDateOpts" :key="opt.name" :label="opt.name" :value="opt.name"></el-option>
+              </el-select>
+            </div>
+          </div>
+          <div v-if="item.dateType === 0">
+            <dateTrans
+              v-model="item.dateTransfData"
+            />
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="add-more-btn" @click="handleAddListItem">
+      <img src="~@/assets/img/icons/add_blue_new.png" alt="" />
+      <span>{{$t('EtaBasePage.add_more_edb')}}{{canRightTwoAxis}}</span>
+    </div>
+
+    <batchModifyDate :show.sync="showBatchModifyDate" :referenceDateOpts="referenceDateOpts" @apply="handleBatchModifyDate"/>
+  </div>
+</template>
+
+<script>
+import dateTrans from './dateTrans.vue'
+import selectTarget from '@/views/chartRelevance_manage/components/selectTarget.vue';
+import batchModifyDate from './batchModifyDate.vue';
+export default {
+  name:"SeriesItemWrap",
+  components: { selectTarget,dateTrans,batchModifyDate },
+  props:{
+    value:null,
+    disRightTwoAxis:{
+      type:Boolean,
+      default:false
+    },
+    referenceDateOpts:[]
+  },
+  computed:{
+    //可选样式
+    chartItemStyleArr(){
+      return [
+        { label: this.$i18nt.locale==='zh'?'曲线图':'Line chart(curve)', key: 1, value: 'spline' },
+        { label: this.$i18nt.locale==='zh'?'折线图':'Broken line(Line)', key: 2, value: 'line' },
+        { label: this.$i18nt.locale==='zh'?'柱状图':'Bar chart(Bar)', key: 4, value: 'column' },
+      ]
+    }
+  },
+  data() {
+    return {
+      // chartItemStyleArr: [
+      //   { label: '曲线图', key: 1, value: 'spline' },
+      //   { label: '折线图', key: 2, value: 'line' },
+      //   { label: '柱状图', key: 4, value: 'column' },
+      // ],//可选样式
+      showBatchModifyDate:false,// 批量设置日期
+
+      compData:this.value,
+    }
+  },
+  watch: {
+    value: {
+      handler(newValue) {
+        this.compData = newValue;
+        this.initEdbType()      
+      },
+      immediate: true // 在组件创建时立即执行处理函数
+    },
+    compData:{
+      handler(newValue) {
+        this.$emit('input', newValue);
+      },
+      deep: true
+    }
+  },
+  methods: {
+    // 更新指标类型
+    initEdbType(){
+      this.$nextTick(()=>{
+        const arr=this.$refs.selectEdbRef
+        console.log('aaaa');
+        arr.forEach((item,index)=>{
+          if(this.compData.edbList[index].selectEdbData){
+            item.targetType=this.compData.edbList[index].edbType==1?'2':'1' 
+          }
+        })
+      })
+    },
+
+    chooseEdb(e, index) {
+      console.log('选择的指标', e);
+      this.compData.edbList[index].selectEdbData = e || null
+      if(e){//更新指标类型
+        this.compData.edbList[index].edbType=e.EdbInfoType
+      }
+      if(e&&!this.compData.seriesName){//设置系列名称
+        this.compData.seriesName=e.LatestDate
+      }
+    },
+
+    handleDelListItem(index) {
+      this.compData.edbList.splice(index, 1)
+      if(this.compData.edbList.length===0){
+        this.$emit('del')
+      }
+    },
+
+    handleAddListItem(){
+      this.compData.edbList.push({
+        dateType: 0,//0指标最新日期 1系统日期
+        edbType:0,//指标类型 0普通 1预测
+        selectEdbData: null,
+        MoveForward: 0,//期数前移
+        dateTransfData: [],//日期变换数据
+        refrenceDateName:'',//选择的引用日期
+      })
+    },
+
+    // 批量覆盖日期变换
+    handleBatchModifyDate(data){
+      console.log('handleBatchModifyDate',data);
+      this.compData.edbList.forEach((item,index) => {
+        item.dateType=data.dateType
+        item.MoveForward=data.MoveForward
+        item.dateTransfData=data.dateTransfData
+        item.refrenceDateName=data.refrenceDateName
+      });
+    }
+  },
+}
+</script>
+
+<style lang="scss">
+.series-content-wrap{
+  .edb-list-wrap{
+    .edb-item-box{
+      .top-flex-box{
+          .el-radio{
+            margin-right: 10px !important;
+          }
+      }
+      .date-change-ways {
+        margin-top: 20px;
+        padding-left: 0;
+        .header {
+          label {
+            width: auto;
+            margin-left: 0;
+          }
+        }
+        .date-change-list {
+          padding-left: 0;
+          .el-tag.el-tag--info {
+            background-color: #dae8ff;
+            border-color: #dae8ff;
+            color: #075eee;
+          }
+        }
+      }
+    }
+  }
+}
+</style>
+<style lang="scss" scoped>
+.series-item-wrap {
+    .add-more-btn {
+      display: inline-block;
+      cursor: pointer;
+      color: #075eee;
+      img {
+        width: 20px;
+        height: 20px;
+        margin-right: 5px;
+        vertical-align: middle;
+      }
+      span {
+        display: inline-block;
+        line-height: 20px;
+        position: relative;
+        top: 2px;
+      }
+    }
+     
+  .series-content-wrap{
+    .top-box{
+      display: flex;
+      gap: 0 20px;
+      align-items: center;
+    }
+    .edb-list-wrap{
+      margin: 30px 0;
+      max-height: 600px;
+      overflow-y: auto;
+      .edb-item-box{
+        padding: 20px;
+        background-color: #F5F7F9;
+        border-radius: 4px;
+        width: 90%;
+        position: relative;
+        margin-bottom: 20px;
+        .btn-del {
+          position: absolute;
+          right: -25px;
+          width: 20px;
+          height: 20px;
+          top: 50%;
+          transform: translateY(-50%);
+          cursor: pointer;
+        }
+        .top-flex-box{
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          gap: 0 10px;
+        }
+      }
+    }
+    
+  }
+}
+</style>

+ 725 - 0
src/views/dataEntry_manage/dataEntry/addToBaseList.vue

@@ -0,0 +1,725 @@
+<template>
+  <div class="batch-opera-list">
+    <div class="header" v-if="step===1">
+      <div class="left">
+
+        <el-cascader
+          v-model="filterObj.classify"
+          :options="classifyList"
+          :props="{
+            label: 'ClassifyName',
+            value: 'ClassifyId',
+            children: 'Child',
+            emitPath: false,
+            multiple:true,
+          }"
+          collapse-tags
+          style="width: 200px;"
+          :placeholder="$t('ManualEntryPage.label_vaiety')"
+          clearable
+          @change="filterChange"
+        />
+
+        <el-select
+          v-model="filterObj.frequency"
+          @change="filterChange"
+          :placeholder="$t('Edb.InputHolderAll.input_fre')"
+          clearable
+          multiple
+        >
+          <el-option v-for="item in frequencyOptions" :key="item.val" :label="item.label" :value="item.val"/>
+        </el-select>
+
+        <el-cascader
+          v-model="filterObj.users"
+          :options="userOptions"
+          :props="{
+            label: 'NodeName',
+            value: 'NodeId',
+            children: 'Children',
+            emitPath: false,
+            multiple: true
+          }"
+          collapse-tags
+          style="width: 250px;"
+          :placeholder="$t('ManualEntryPage.ph_creator')"
+          clearable
+           @change="filterChange"
+        />
+
+        <el-input 
+          v-model="filterObj.keyWord" 
+          :placeholder="$t('Edb.InputHolderAll.input_name_orid')"
+          style="width: 250px;"
+          @change="filterChange"
+          clearable
+          >
+          <i slot="prefix" class="el-input__icon el-icon-search"/>
+        </el-input>
+
+        <el-checkbox 
+            v-model="filterObj.checkAll"
+            :indeterminate="filterObj.checkSome"
+            :disabled="tableData.length===0"
+            style="margin-left:20px" 
+            @change="listCheckAllChange"
+          ><!-- 列表全选 -->{{$t('SystemManage.OperateAuth.all_select')}}</el-checkbox>
+      </div>
+
+      <span>{{$t('SystemManage.OperateAuth.label_checked')}}:{{ isSelectAll ? (total-filterDuplicateChecked.length) : filterDuplicateChecked.length }}</span>
+      <el-button
+        type="primary"
+        v-if="$route.path==='/batchDelList'"
+        @click="handleBatchDel"
+      ><!-- 批量删除 -->{{$t('ManualEntryPage.batch_del')}}</el-button>
+    </div>
+
+    <div class="main">
+      <template v-if="step===1">
+        <el-table
+          :data="tableData"
+          ref="table"
+          key="table"
+          element-loading-text="加载中..."
+          v-loading="tableLoading"
+          border
+          style="margin:20px 0"
+          @selection-change="selectionChange"
+          @select="selectHandle" 
+          @select-all="selectAllPageHandle"
+        >
+            <el-table-column
+              type="selection"
+              width="55"
+            />
+            <el-table-column
+              v-for="item in tableColums"
+              :key="item.label"
+              :label="item.label"
+              :prop="item.key"
+              :width="item.widthsty"
+              :min-width="item.minwidthsty"
+              align="center"
+            >
+              <template slot-scope="{row}">
+
+                <template v-if="item.key==='SecName'">
+                  <span style="white-space: pre-wrap;">{{ row.SecName }}</span>
+                </template>
+
+                <span v-else>{{ row[item.key] }}</span>
+              </template>
+            </el-table-column>
+            
+            <div slot="empty" style="padding: 100px 0">
+              <tableNoData :text="$t('Table.prompt_slogan')" size="mini"/>
+            </div>
+        </el-table>
+
+        <div style="height:35px;margin: 20px 0;">
+          <m-page
+            :page_no="page_no"
+            :pageSize="pageSize"
+            :total="total"
+            @handleCurrentChange="pageChange"
+          />
+        </div>
+
+        <div class="add-handles-bot" v-if="$route.path==='/batchToBase'">
+          <el-button @click="$router.go(-1)" style="width:120px"><!-- 取消 -->{{$t('Dialog.cancel_btn')}}</el-button>
+          <el-button @click="handleNextStep" type="primary" style="width:120px;margin-left:5%;"><!-- 下一步 -->{{$t('Dialog.next_step')}}</el-button>
+        </div>
+      </template>
+
+      <!-- 第二步 -->
+      <template v-else>
+        <el-table 
+          :data="addToBaseList" 
+          border
+          ref="addTableRef"
+          key="addTableRef"
+        >
+          <el-table-column :label="$t('Edb.Detail.e_id')" align="center" prop="TradeCode">
+            <template slot-scope="scope">
+                {{scope.row.TradeCode}}
+            </template>
+          </el-table-column>
+
+          <el-table-column :label="$t('Edb.Detail.e_name')" align="center" width="210px">
+              <template slot-scope="scope">
+                <div class="name-cell">
+                    <el-input 
+                      v-model="scope.row.SecName" 
+                      placeholder="请填写指标名称" 
+                      style="width:100%;margin:5px 0;"
+                      :class="existNameArr.includes(scope.row.SecName)&&'error-ipt'"
+                    />
+                  <div class="error" v-if="existNameArr.includes(scope.row.SecName)">
+                    <span>指标名称已存在,请重新填写</span>
+                  </div>
+                </div>
+              </template>
+          </el-table-column>
+          <el-table-column :label="$t('Edb.Detail.e_unit')" align="center" width="150px">
+              <template slot-scope="scope">
+                  <selectUnit v-model="scope.row.Unit"/>
+              </template>
+          </el-table-column>
+          <el-table-column :label="$t('Edb.Detail.e_fre')" align="center" width="120px">
+            <template slot-scope="scope">
+              <el-select
+                v-model="scope.row.Frequency"
+                placeholder="请选择频率"
+              >
+                <el-option
+                  v-for="item in frequencyOptions"
+                  :key="item.val"
+                  :label="item.label"
+                  :value="item.val"
+                >
+                </el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" width="280px">
+              <template slot="header" slot-scope="scope">
+                  <span style="margin-right:40px;display:inline-block">目录</span>
+                  <el-radio-group 
+                    v-model="classifyType"
+                    @change="handleClassifyTypeChange"
+                  >
+                      <el-radio :label="0">分目录</el-radio>
+                      <el-radio :label="1">同目录</el-radio>
+                  </el-radio-group>
+              </template>
+              <template slot-scope="{row,$index}">
+                    <el-cascader
+                      v-model="row.EtaClassifyId"
+                      :options="edbBaseClassify"
+                      :props="{	
+                        label: 'ClassifyName',
+                        value: 'ClassifyId',
+                        children: 'Children',
+                        checkStrictly: true,
+                        emitPath:false
+                      }"
+                      placeholder="请选择指标目录"
+                      :disabled="(classifyType===1&&$index>0)"
+                      @change="handleClassifyChange(row,$index)"
+                      class="cascader-wrapper"
+                    />
+              </template>
+          </el-table-column>
+        </el-table>
+
+        <div style="text-align: center; margin: 30px 0">
+          <el-button @click="step--;checkedSomeSelection()">{{$t('Dialog.prev_step')}}</el-button>
+          <el-button
+            type="primary"
+            @click="handleCheckName"
+            :loading="saveLoading"
+          >
+            {{ $t("Dialog.confirm_save_btn") }}
+          </el-button>
+        </div>
+      </template>
+    </div>
+
+  </div>
+</template>
+<script>
+import { dataInterence,dataBaseInterface,departInterence } from '@/api/api.js';
+import mPage from '@/components/mPage.vue';
+export default {
+  components: { mPage },
+  computed: {
+    tableColums() {
+        return [
+          {
+            label: this.$t('Edb.Detail.e_id'),
+            key: 'TradeCode',
+          },
+         {
+            label: this.$t('Edb.Detail.e_name'),
+            key: 'SecName',
+          },
+          {
+            label: /* '最新日期' */this.$t('Edb.Detail.e_latest_date'),
+            key: 'EndDate',
+            sortable:true,
+          },
+          {
+            label: /* '最新值' */this.$t('Edb.Detail.e_latest_value'),
+            key: 'LatestValue',
+            sortable:true,
+          },
+          {
+            label: this.$t('Edb.Detail.e_fre'),
+            key: 'Frequency',
+          },
+          {
+            label: this.$t('Edb.Detail.e_unit'),
+            key: 'Unit',
+          },
+          {  
+            label: this.$t('Edb.Detail.e_creator'),
+            key: 'UserName' 
+          },
+          {  
+            label: this.$t('Edb.Detail.e_update_time'),
+            key: 'ModifyTime' 
+          },
+
+        ]
+    },
+
+    frequencyOptions(){
+      return [
+        { label:'日度',val: '日度' },
+        { label:'周度',val: '周度' },
+        { label:'旬度',val: '旬度' },
+        { label:'月度',val: '月度' },
+        { label:'季度',val: '季度' },
+        { label:'半年度',val: '半年度' },
+        { label:'年度',val: '年度' },
+      ]
+    },
+
+    hintText(){
+        let key = 0
+        if(this.existEdbList.length) key++
+        if(!this.addToBaseList.length) key++
+
+        return {
+            0:'',
+            1:this.$t('YsDataPage.haved_all_msg'),//本次添加的指标均已在指标库中,请勿重复添加!
+            2:this.$t('YsDataPage.haved_some_msg'),//指标库中已存在以下指标,会自动过滤!
+        }[key]
+    },
+
+    filterDuplicateChecked() {
+      return Array.from(new Set(this.checkedList))
+    }
+  },
+  data() {
+    return {
+      tableLoading: false,
+      total: 0,
+      
+      tableData: [],
+
+      classifyList: [],
+      userOptions: [],
+
+      isSelectAll: false, //真正意义上的全选或不全选
+      checkedList: [], //不全选勾选中的 或 全选取消勾的
+      selectionReactCancel:false,//手动设置选中中
+
+      filterObj: {
+        page_no: 1,
+        pageSize: 10,
+        classify: [],
+        frequency: [],
+        users: [],
+        keyWord: '',
+        checkAll: false, //控制全选显示状态
+        checkSome: false
+      },
+
+      step: 1,
+      classifyType:0,//目录方式
+      edbBaseClassify: [],
+      addToBaseList: [],//可加入的指标
+      existEdbList: [],//已存在的指标
+      existNameArr:[]
+
+    }
+  },
+  mounted(){
+    this.getClassify();
+    this.getTableData('init');
+    this.getUserOptions()
+    this.$route.path === '/batchToBase'&& this.getEdbBaseClassify();
+  },
+  methods:{
+    /* 下一步 */
+    handleNextStep() {
+      if(!this.checkedList.length && !this.isSelectAll) return this.$message.warning('请选择指标')
+
+      const { frequency,keyWord,users,classify } = this.filterObj
+
+      dataInterence.checkAddListV2({
+          UserIdList: users,
+          FrequencyList:frequency,
+          ClassifyIdList: classify,
+          Keyword:keyWord,
+          ListAll:this.isSelectAll,
+          TradeCodeList:this.checkedList.map(_=>_.TradeCode)
+      }).then(res=>{
+          if(res.Ret!==200) return 
+
+          const edbList = res.Data||[]
+          this.existEdbList = edbList.filter(i=>i.IsJoinEdb===1)
+          this.addToBaseList = edbList.filter(i=>i.IsJoinEdb===0)
+
+          if(this.addToBaseList.length>30) return this.$message.warning('批量添加指标数量不得超过30个!')
+
+          this.step++;
+          this.$refs.table.doLayout()
+          this.$nextTick(() => {
+            this.$refs.addTableRef.doLayout()
+          })
+      })
+    },
+
+    filterNodes(arr) {
+			arr.length &&
+				arr.forEach((item) => {
+					item.Children.length && this.filterNodes(item.Children);
+					if (!item.Children.length) {
+						delete item.Children;
+					}
+				});
+		},
+    // 获取指标库分类
+    async getEdbBaseClassify(){
+      if(this.$route.path !== '/batchToBase') return
+      
+      const res=await dataBaseInterface.menuListV3()
+      if (res.Ret !== 200) return
+      this.filterNodes(res.Data.AllNodes||[]);
+			this.edbBaseClassify = res.Data.AllNodes || [];
+    },
+
+    // 获取分类
+		getClassify() {
+			dataInterence.getClassifyV2().then(res =>{
+				if(res.Ret === 200 && res.Data.List) {
+					this.classifyList = res.Data.List||[];
+				}
+			})
+		},
+
+    // 同目录修改
+    handleClassifyChange(e,index){
+        if(this.classifyType===1){
+          // 修改所有的指标的目录为第一个
+          this.addToBaseList.forEach(item=>{
+              item.EtaClassifyId=e.EtaClassifyId
+          })
+        }
+    },
+
+    handleClassifyTypeChange(){
+      this.handleClassifyChange(this.addToBaseList[0])
+    },
+
+    handleCheckName() {
+      //重名校验
+      this.existNameArr = []
+      dataInterence.checkAddListNameV2(
+          this.addToBaseList.map(_=>({EdbCode:_.TradeCode,EdbName:_.SecName}))
+      ).then(res=>{
+          if(res.Ret!==200) return 
+          this.existNameArr = res.Data.filter(i=>i.Exist).map(_=>_.EdbName)
+
+          if(this.existNameArr.length) return 
+          this.handleSave()
+      })
+    },
+
+    handleSave() {
+
+      let haveIncomplete = this.addToBaseList.some(_ => !_.SecName||!_.EtaClassifyId||!_.Unit)
+      if(haveIncomplete) return this.$message.warning('指标信息填写不完整')
+
+      this.saveLoading = true;
+      dataInterence.addToBaseBatchV2(
+          this.addToBaseList.map(i=>({
+            EdbCode: i.TradeCode,
+            EdbName: i.SecName,
+            Frequency: i.Frequency,
+            Unit: i.Unit,
+            ClassifyId: i.EtaClassifyId
+          }))
+      ).then(res=>{
+          this.saveLoading = false
+
+          if(res.Ret!==200) return 
+          this.$message.success(this.$t('MsgPrompt.add_msg2'))
+          
+          this.$router.replace({
+            path: '/dataList'
+          })
+      })
+    },
+
+    getTableData(type='pageChange') {
+      this.tableLoading = true;
+
+      const { frequency,page_no,pageSize,keyWord,classify,users } = this.filterObj;
+
+      let params = {
+        UserIdList: users,
+        FrequencyList: frequency,
+        CurrentIndex: page_no,
+        PageSize: pageSize,
+        Keyword: keyWord,
+        ClassifyIdList: classify
+      }
+			dataInterence.getBatchAddListV2(params).then(res => {
+        this.tableLoading = false;
+        if( res.Ret!==200 )return
+
+        const { Data } = res;
+
+        this.tableData = Data.List || [];
+        this.total = Data.Paging.Totals;
+        
+        if(type==='filter'){
+          this.listCheckAllChange(true)
+        }else {
+          //页码变化 选中项不做清空
+          this.checkedSomeSelection()
+
+        }
+			});
+    },
+
+    // 获取所有用户
+    async getUserOptions() {
+      const res = await departInterence.getSystemUser()
+
+      if(res.Ret !== 200) return
+      this.userOptions = res.Data || []
+      this.filterUserEmpty(this.userOptions)
+    },
+
+    filterUserEmpty(arr) {
+      arr.length && arr.forEach(item => {
+        item.Children && item.Children.length && this.filterUserEmpty(item.Children)
+        if (!item.Children || !item.Children.length) {
+          delete item.Children
+        }
+      })
+    },
+
+    /* 设置当页数据勾选状态 */
+    checkedSomeSelection() {
+      this.selectionReactCancel=true
+
+      if(!this.isSelectAll){
+          this.checkedList.map(_ =>{
+              let row = this.tableData.find(item => item.TradeCode==_.TradeCode)
+              if(row){ //设置部分选中
+                  setTimeout(()=>{
+                      this.$refs.table.toggleRowSelection(row,true)
+                  },20)
+              }
+          })
+      }else{
+          this.$refs.table &&this.$refs.table.toggleAllSelection()
+          this.checkedList.map(_ =>{
+              let row = this.tableData.find(item => item.TradeCode==_.TradeCode)
+              if(row){ //设置部分不勾选
+                  setTimeout(()=>{
+                      this.$refs.table.toggleRowSelection(row,false)
+                  },20)
+              }
+          })
+      }
+      setTimeout(()=>{
+          this.selectionReactCancel=false
+      },30)
+    },
+
+    //列表全选或全不选
+    listCheckAllChange(value){
+      this.checkedList = []
+      this.isSelectAll = value
+      this.$refs.table && this.$refs.table.clearSelection()
+
+      value && this.$refs.table && this.$refs.table.toggleAllSelection()
+    },
+
+    selectionChange() {
+      if(this.selectionReactCancel) return
+
+        //设置全选框状态 选中 半选 不选
+        setTimeout(()=>{
+            let filterChecked = Array.from(new Set(this.checkedList))
+            //全选
+            if(
+              (filterChecked.length===this.total&&this.total>0 && (!this.isSelectAll))
+                || (filterChecked.length === 0 && this.isSelectAll)
+            ){
+                this.filterObj.checkAll = true
+                this.filterObj.checkSome = false
+            //不选
+            }else if(
+              (filterChecked.length === 0 && (!this.isSelectAll))
+              || (filterChecked.length === this.total && this.isSelectAll)
+            ){
+                this.filterObj.checkAll = false
+                this.filterObj.checkSome = false
+            //半选
+            }else{
+                this.filterObj.checkAll = false
+                this.filterObj.checkSome=true
+            }
+        },1)
+    },
+
+    //单选
+    selectHandle(selection,row){ //当前选中的项是进选中还是取消选中中
+        if(this.selectionReactCancel) return 
+
+        //当前项是选中还是取消选
+        let haveChecked = selection.some(_ => _.TradeCode === row.TradeCode);
+
+        //全选取消选和不全选选中才有意义
+        if((haveChecked&&!this.isSelectAll) || (!haveChecked&&this.isSelectAll)) {
+          this.checkedList.push(row)
+        }else {
+          this.checkedList=this.checkedList.filter(_ => _.TradeCode!==row.TradeCode)
+        }
+    },
+
+    //整列选
+    selectAllPageHandle(selection){
+        if(this.selectionReactCancel) return 
+        
+        //当前页是选中还是取消
+        let haveChecked = selection && selection.length>0;
+
+        //全选取消选和不全选选中才有意义
+        if((haveChecked&&!this.isSelectAll) || (!haveChecked&&this.isSelectAll)) {
+          this.checkedList = [...this.checkedList,...this.tableData]
+        }else {
+
+          let pageIds = this.tableData.map(_ => _.TradeCode);
+          this.checkedList = this.checkedList.filter(_ => !pageIds.includes(_.TradeCode))
+        }
+    },
+
+
+    // 页码改变
+    pageChange(page) {
+      this.filterObj.page_no = page;
+      this.getTableData('pageChange')
+    },
+
+    filterChange(val) {
+      console.log(val)
+      this.filterObj.page_no = 1;
+      if(!val||!val.length) {
+        this.isSelectAll = false
+        this.checkedList = []
+        this.filterObj.checkAll = false
+        this.filterObj.checkSome = false
+      }
+      this.getTableData(val.length?'filter':'')
+    },
+
+    /* 批量删除 */
+    handleBatchDel(data={}){
+
+      if(!this.checkedList.length && !this.isSelectAll) return this.$message.warning('请选择指标')
+
+      const { frequency,keyWord,users,classify } = this.filterObj
+
+      let params = {
+        UserIdList: users,
+        FrequencyList:frequency,
+        ClassifyIdList: classify,
+        Keyword:keyWord,
+        ListAll:this.isSelectAll,
+        TradeCodeList:this.checkedList.map(_=>_.TradeCode)
+      }
+
+      dataInterence.checkDelListV2(params).then(res=>{
+          if(res.Ret!==200) return 
+
+          const edbList = res.Data||[]
+          this.existEdbList = edbList.filter(i=>i.IsJoinEdb===1)
+          
+          if(this.existEdbList.length) {
+            let existCode = this.existEdbList.map(_ => _.TradeCode).join(',');
+            this.$alert(`${existCode}已加入指标库,不可删除`,this.$t('Confirm.prompt'),{
+                confirmButtonText: '知道了',
+              }).then(()=>{
+              }).catch(()=>{})
+
+            return
+          }
+
+          this.$confirm('删除操作不可撤销,确定删除吗?',this.$t('Dialog.warn_tit'),{
+                confirmButtonText:/* "确定" */this.$t('Dialog.confirm_btn'),
+                cancelButtonText:/* "取消" */this.$t('Dialog.cancel_btn'),
+                type:"warning"
+            }).then(()=>{
+              this.handleDelApi(params);
+            }).catch(()=>{})
+         
+      })
+    },
+
+    async handleDelApi(params) {
+      const res = await dataInterence.delEdbBatchV2(params)
+      this.saveLoading = false
+
+      if(res.Ret!==200) return 
+      this.$message.success(this.$t('MsgPrompt.delete_msg'))
+      
+      this.$router.replace({
+        path: '/dataList'
+      })
+    }
+
+  },
+}
+</script>
+<style scoped lang='scss'>
+.batch-opera-list {
+    min-height: calc(100vh - 120px);
+    display: flex;
+    flex-direction: column;
+    background-color: #fff;
+    border: 1px solid #c8cdd9;
+    border-radius: 4px;
+    box-shadow: 0 3px 6px rgba(0, 0, 0, .05);
+    padding: 20px;
+    box-sizing: border-box;
+
+    .header {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      .left {
+        display: flex;
+        align-items: center;
+        gap: 10px;
+      }
+    }
+
+    .add-handles-bot {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+    .name-cell {
+      .error {
+        position: absolute;
+        bottom: -5px;
+        color: #f00;
+      }
+    }
+}
+</style>
+<style lang="scss">
+.batch-opera-list {
+    .error-ipt .el-input__inner{
+      border-color: #f00;
+    }
+}
+</style>

+ 675 - 0
src/views/dataEntry_manage/dataEntry/components/edbDetail.vue

@@ -0,0 +1,675 @@
+<template>
+  <div class="edb-detail-data-wrap">
+    <div class="handle-list">
+      <span class="editsty" @click="$emit('handle',{item:edbInfo.Detail,type:'edit'})" v-if="hasEditAuth"><!-- 编辑 -->{{$t('Table.edit_btn')}}</span>
+
+      <span class="editsty" @click="$emit('handle',{item:edbInfo.Detail,type:'addToBase'})" v-if="edbInfo.Detail&&edbInfo.Detail.IsJoinEdb===0&&permissionBtn.isShowBtn('dataSourcePermission','manualDataWrite_add')"><!-- 加入指标库 -->{{$t('ManualEntryPage.add_tobase')}}</span>
+
+      <span class="editsty" @click="$emit('handle',{item:edbInfo.Detail,type:'logs'})"><!-- 操作日志 -->{{$t('ManualEntryPage.opera_logs')}}</span>
+
+      <span class="deletesty" @click="$emit('handle',{item:edbInfo.Detail,type:'del'})" v-if="edbInfo.Detail&&edbInfo.Detail.IsJoinEdb===0&&permissionBtn.isShowBtn('dataSourcePermission','manualDataWrite_del')"><!-- 删除 -->{{$t('Table.delete_btn')}}</span>
+    </div>
+		<el-table
+			:data="tableData"
+			class="firstColumTable" 
+      border
+    >
+			<el-table-column
+				v-for="item in tableColumsOne"
+				:key="item.key"
+				:width="item.widthsty"
+        :label="item.label"
+				:min-width="item.minwidthsty"
+				align="center">
+				<template slot-scope="scope">
+
+						<span v-if="item.key === 'Unit'">{{ getUnitTrans(scope.row.Unit) }}</span>
+						<span v-else-if="item.key === 'Frequency'">{{ getFrequencyTrans(scope.row.Frequency) }}</span>
+
+						<span v-else>{{ scope.row[item.key] }}</span>
+				</template>
+			</el-table-column>
+		</el-table>
+		<el-table
+			:data="tableData"
+			style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);"
+			border>
+			<el-table-column
+				v-for="item in tableColumsTwo"
+				:key="item.label"
+				:label="item.label"
+				:width="item.widthsty"
+				:min-width="item.minwidthsty"
+				align="center"
+			>
+				<template slot-scope="scope">
+					<span>{{ scope.row[item.key] }}</span>
+				</template>
+			</el-table-column>
+			<div slot="empty" style="padding: 50px 0 50px;">
+					<tableNoData :text="$t('Table.prompt_slogan')"/>
+			</div>
+		</el-table>
+
+    <div class="bottom">
+      <div class="left-select" ref="url" v-if="yearsList.length">
+        <el-button 
+          type="primary"
+          v-for="year in yearsList"
+          :key="year"
+          @click="handleLinkPostion(year)"
+        >{{year}}</el-button>
+      </div>
+
+      <div 
+        class="value-ul" 
+        ref="valueUl"
+        @scroll="handleLoadData"
+      >
+        <div class="total-cont" :style="{height: totalHeight}" v-if="dataList.length"></div>
+        <ul 
+          class="list-wrapper" 
+          @contextmenu.prevent="handleRightClick"
+          v-if="dataList.length"
+        >
+          <li
+            class="value-item"
+            v-for="(item,rindex) in renderDataList"
+            :key="rindex"
+          >
+            <div 
+              :class="['value-label',
+                { 'select': rindex===rightMouseMenu.rindex && rightMouseMenu.cindex === 0 }
+              ]"
+            >
+              <el-date-picker
+                v-model="item.Dt"
+                type="date"
+                :placeholder="$t('Edb.InputHolderAll.input_date')"
+                :data-rindex="rindex"
+                :data-cindex="0"
+                :clearable="false"
+                :editable="false"
+                value-format="yyyy-MM-dd"
+                :readonly="readonly"
+                :disabled="!hasEditAuth"
+                @mousedown.native="e=> { readonly = e.button===2?true:false }"
+                prefix-icon="none"
+                @input="handleTimeChange(rindex, item)"
+                @focus="handleTimeFocus(rindex, item)"
+              ></el-date-picker>
+            </div>
+            <div 
+              :class="['value-label',
+                { 'select': rindex===rightMouseMenu.rindex && rightMouseMenu.cindex === 1 }
+              ]"
+              :data-rindex="rindex"
+              :data-cindex="1"
+            >
+              <input
+                @focus="handleInputFocus(item, rindex, 1)"
+                @blur="handleInputChange(item)"
+                @input="handleInput(item)"
+                class="input-val-box"
+                type="number"
+                v-model="item.Close"
+                :data-rindex="rindex"
+                :data-cindex="1"
+                :disabled="!hasEditAuth"
+              />
+            </div>
+          </li>
+        </ul>
+
+        <tableNoData :text="$t('Table.prompt_slogan')" v-else/>
+      </div>
+    </div>
+
+
+    <!-- 右键菜单 -->
+    <div
+      class="right-lick-menu"
+      @mouseleave="hideContextMenu"
+    >
+      <div class="item" @click="handleOptTable('insert_up_row')">
+        <!-- 向上插入 -->{{$t('ManualEntryPage.insert_up_row')}}
+        <el-input v-model="rightMouseMenu.insertUpRows" size="mini" style="width:50px;" @change="val => { rightMouseMenu.insertUpRows = Number(val) }" @click.native.stop/>
+      </div>
+      <div class="item" @click="handleOptTable('insert_down_row')">
+        <!-- 向下插入 -->{{$t('ManualEntryPage.insert_down_row')}}
+        <el-input v-model="rightMouseMenu.insertDownRows" size="mini" style="width:50px;" @change="val => { rightMouseMenu.insertDownRows = Number(val) }" @click.native.stop/>
+      </div>
+      <div class="item" @click="handleOptTable('del_row')"><!-- 删除行 -->{{$t('ManualEntryPage.right_op_delrow')}}</div>
+    </div>
+	</div>
+</template>
+<script>
+import { dataInterence } from '@/api/api.js';
+export default {
+  props: {
+    id: {
+      type: String
+    }
+  },
+  computed: {
+		tableColumsOne(){
+			return [
+				{
+					label: this.$t('Edb.Detail.e_id'),
+					key: 'TradeCode',
+					minwidthsty: '150px'
+				},
+				{
+					label: this.$t('Edb.Detail.e_name'),
+					key: 'SecName',
+					minwidthsty: '200px'
+				},
+				{
+					label: this.$t('Edb.Detail.e_fre'),
+					key: 'Frequency',
+					widthsty: '100px'
+				},
+				{
+					label: this.$t('Edb.Detail.e_unit'),
+					key: 'Unit',
+					widthsty: '100px'
+				},
+			]
+		},
+
+		tableColumsTwo() {
+			return [
+				{
+					label: this.$t('Edb.Detail.e_menu'),
+					key: 'ClassifyName',
+					minwidthsty: '150px',
+				},
+				{
+					label: this.$t('Edb.Detail.e_start_time'),
+					key: 'StartDate',
+					minwidthsty: '115px',
+				},
+				{
+					label: this.$t('Edb.Detail.e_update_time'),
+					key: 'ModifyTime',
+					minwidthsty: '120px',
+				},
+				{
+					label: this.$t('Edb.creater'),
+					key: 'UserName',
+					widthsty: '160px',
+				}
+			]
+		},
+
+    yearsList() {
+      if(!this.edbInfo.Detail) return []
+      if(!['日度','周度'].includes(this.edbInfo.Detail.Frequency)) return []
+
+      let years = [];
+      this.dataList.forEach(_ => {
+        if(!years.includes(_.Dt.substring(0,4))&&_.Dt) {
+          years.push(_.Dt.substring(0,4))
+        }
+      })
+      return years;
+    },
+
+    totalHeight() {
+      return `${this.dataList.length*45}px`
+    },
+
+    renderDataList() {
+      console.log(this.startIndex,this.endIndex)
+      console.log(this.dataList.slice(this.startIndex,this.endIndex))
+      return this.dataList.slice(this.startIndex,this.endIndex)
+    },
+
+    hasEditAuth() {
+      return this.permissionBtn.isShowBtn('dataSourcePermission','manualDataWrite_edit')
+    }
+
+  },
+  watch: {
+    id(newval) {
+      if(!newval) return 
+      this.$refs.valueUl.scrollTop = 0;
+      this.rightMouseMenu.rindex=-1;
+      this.rightMouseMenu.cindex=-1;
+      this.getEdbDetail()
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      edbInfo: {},
+      // yearsList: [],
+      dataList: [],
+      startIndex: 0,
+      endIndex: 100,
+
+      readonly:  false,//日期只读
+      temInputVal:{},
+      tempTime:'',
+
+      rightMouseMenu: {
+        rindex:-1,
+        cindex:-1,
+        insertUpRows: 1,
+        insertDownRows: 1,
+      }
+    }
+  },
+  mounted(){
+    this.getEdbDetail()
+  },
+  methods:{
+    /* 获取指标详情 */
+    async getEdbDetail() {
+      let loading = this.$loading({
+        lock: true,
+        text: `${this.$t('Table.data_loading')}...`,
+        target: '.edb-detail-data-wrap',
+        spinner: 'el-icon-loading',
+        background: 'rgba(255, 255, 255, 0.8)'
+      })
+
+      const res = await dataInterence.getEdbDetailV2({
+        TradeCode: this.id
+      })
+
+      loading.close()
+      if(res.Ret !== 200) return 
+      this.edbInfo = res.Data;
+      res.Data.Detail.ClassifyName = res.Data.ClassifyList.map(_ => _.ClassifyName).join('/')
+      this.tableData = [res.Data.Detail]
+      
+      this.dataList = res.Data.Detail.DataList||[];
+      this.dataList.length && this.$nextTick(() => {
+        this.handleLoadData()
+      })
+    },
+
+    /* 滚动加载位置数据 */
+    handleLoadData: _.throttle(function() {
+      const scrollTop = this.$refs.valueUl.scrollTop;
+      const visibleCount = Math.ceil(
+        this.$refs.valueUl.clientHeight / 45
+      )+5;
+
+      console.log(visibleCount)
+
+      this.startIndex = Math.floor(scrollTop / 45);
+      this.endIndex = this.startIndex + visibleCount;
+
+      this.$nextTick(() => {
+        $('.list-wrapper')[0].style=`transform: translateY(${this.startIndex*45}px)`
+      })
+    },300),
+
+    handleLinkPostion(year) {
+      let index = this.dataList.findIndex(_ => _.Dt.substring(0,4)===year)
+      console.log(index)
+      this.$refs.valueUl.scrollTop = index*45
+      this.handleLoadData()
+    },
+
+    /* 更改日期 */
+    async handleTimeChange(index, e) {
+        // 判断选择的日期是否重复
+      let arr = this.dataList.filter((item) => item.Dt&&(item.Dt===e.Dt));
+      if (arr.length>1) {
+        if (!this.tempTime) {
+          // 如果是新增行的
+          e.Dt = "";
+        } else {
+          e.Dt = this.tempTime;
+        }
+        this.$message.warning(/* "该日期已存在"  */this.$t('Edb.MsgPrompt.date_haved_msg'));
+      } else {
+          if(!this.tempTime) return
+
+          // 修改日期
+          let params = {
+            TradeCode: e.TradeCode,
+            CreateDate: e.Dt, //新录入日期
+            OldCreateDate: this.tempTime, //之前日期
+            Close: e.Close,
+          };
+          const res = await dataInterence.editData(params);
+          if (res.Ret === 200) {
+            this.$message.success("修改成功");
+          }
+      }
+    },
+
+     // 日期获取焦点存放日期
+    handleTimeFocus(index, e) {
+      if(!this.hasEditAuth) return 
+
+      this.tempTime = e.Dt;
+      this.rightMouseMenu.rindex = index;
+      this.rightMouseMenu.cindex = 0;
+    },
+
+    // input 获取焦点
+    handleInputFocus(e, rindex, cindex) {
+      console.log(e, rindex, cindex)
+
+      if(!this.hasEditAuth) return 
+
+      this.rightMouseMenu.rindex = rindex;
+      this.rightMouseMenu.cindex = cindex;
+      this.temInputVal = _.cloneDeep(e)
+    },
+
+    // input 值改变 失去焦点
+    async handleInputChange(e) {
+      console.log(e);
+
+      // 如果input 为改变 且 之前也为空
+      if (!this.temInputVal.Close && !e.Close) {
+        return;
+      }
+
+      // 没有选择日期
+      if (!e.Dt) {
+        e.Close = "";
+        this.$message.warning(/* "请选择日期" */this.$t('Edb.InputHolderAll.input_date'));
+        return;
+      }
+      // 判断值是否改变
+      if (
+        this.temInputVal.TradeCode === e.TradeCode &&
+        this.temInputVal.Close === e.Close
+      ) {
+        console.log("值未改变");
+        return;
+      }
+
+      // 删除情况
+      if (!e.Close) {
+        this.handleDelete(e);
+        return;
+      }
+
+      // 修改情况
+      // 检查该日期下是否存在数据
+      let checkRes = await dataInterence.checkData({
+        TradeCode: e.TradeCode,
+        CreateDate: e.Dt,
+      });
+      if (checkRes.Data.Status === 0) {
+        const editRes = await dataInterence.editData({
+          TradeCode: e.TradeCode,
+          CreateDate: e.Dt,
+          Close: e.Close,
+          OldCreateDate: "",
+        });
+        if (editRes.Ret === 200) {
+
+          this.$message({
+            message: /* "新增成功" */this.$t('MsgPrompt.add_msg'),
+            type: "success",
+          });
+        } else {
+          this.$message({
+            message: editRes.msg,
+            type: "warning",
+          });
+          this.getTableList();
+        }
+      } else if (checkRes.Data.Status === 1) {
+        this.$confirm(
+          this.$t('Edb.MsgPrompt.date_have_value_msg',{val:checkRes.Data.Close}),
+          /* "提示" */this.$t('Dialog.warn_tit'),
+          {
+            type: "warning",
+          }
+        )
+          .then(async () => {
+            const editRes = await dataInterence.editData({
+              TradeCode: e.TradeCode,
+              CreateDate: e.Dt,
+              Close: e.Close,
+              OldCreateDate: e.Dt,
+            });
+            if (editRes.Ret === 200) {
+              this.$message({
+                message: /* "修改成功" */this.$t('MsgPrompt.edit_msg'),
+                type: "success",
+              });
+            } else {
+              this.$message({
+                message: editRes.msg,
+                type: "warning",
+              });
+              this.getTableList();
+            }
+          })
+          .catch(() => {
+            this.getTableList();
+          });
+      }
+    },
+
+    // 只允许输入整数或者小数点后四位
+    handleInput(e) {
+      if (e.Close.indexOf(".") > 0) {
+        e.Close = e.Close.slice(0, e.Close.indexOf(".") + 5);
+      }
+    },
+
+    /* 右键 */
+    handleRightClick(e) {
+      if(!this.hasEditAuth) return 
+
+      let dom = $('.right-lick-menu')[0];
+      if(e.clientY > window.innerHeight/2) {
+        dom.style.left = e.clientX-3 + 'px';
+        dom.style.top = e.clientY-dom.offsetHeight-3 + 'px';
+      }else {
+        dom.style.left = e.clientX-3 + 'px';
+        dom.style.top = e.clientY-3 + 'px';
+      }
+    },
+
+    // 隐藏
+    hideContextMenu() {
+      let dom = $('.right-lick-menu')[0];
+			dom.style.left = '-9999px';
+			dom.style.top = '-9999px';
+      this.rightMouseMenu.insertUpRows = 1;
+      this.rightMouseMenu.insertDownRows = 1
+    },
+
+    // 插入操作
+    handleOptTable(type) {
+      const handlesMap = {
+        'insert_up_row': this.insertRow,
+        'insert_down_row': this.insertRow,
+        'del_row': this.delRow
+      }
+      handlesMap[type] && handlesMap[type](type)
+    },
+    
+    //插入行
+    insertRow(type) {
+      let newItem = {
+        Close: '',
+        Dt: '',
+        TradeCode: this.edbInfo.Detail.TradeCode
+      }
+      if(type==='insert_up_row') {
+        let insertArr = new Array(this.rightMouseMenu.insertUpRows).fill('').map(item => _.cloneDeep(newItem))
+        this.dataList.splice(this.rightMouseMenu.rindex, 0, ...insertArr);
+      }else {
+        let insertArr = new Array(this.rightMouseMenu.insertDownRows).fill('').map(item => _.cloneDeep(newItem))
+        this.dataList.splice(this.rightMouseMenu.rindex+1, 0, ...insertArr);
+      }
+
+      console.log(this.dataList)
+    },
+
+    delRow() {
+      this.dataList.splice(this.rightMouseMenu.rindex, 1);
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.edb-detail-data-wrap{
+	display: flex;
+	flex-direction: column;
+	height: 100%;
+	.firstColumTable{
+		box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);
+	}
+  .handle-list { 
+    flex: 0;
+    display: flex;
+    justify-content: flex-end;
+    gap: 20px;
+    margin-bottom: 15px;
+  }
+	.el-table{
+		flex: none;
+	}
+  .bottom {
+    flex: 1;
+    display: flex;
+    overflow: hidden;
+    .value-ul{
+      flex: 1;
+      max-height: 100%;
+      overflow-y: auto;
+      border: 1px solid #EBEFF6;
+      box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);
+      position: relative;
+      .total-cont {
+        position: absolute;
+        left: 0;
+        right: 0;
+        top: 0;
+        bottom: 0;
+        z-index: -2;
+      }
+      .list-wrapper {
+        left: 0;
+        right: 0;
+        top: 0;
+        position: absolute;
+        .value-item {
+          border-bottom: 1px solid #dcdfe6;
+          display: flex;
+
+          .value-label {
+            width: 50%;
+            padding: 2px;
+            position: relative;
+            text-align: center;
+            color: #666;
+            &:first-child {
+              border-right: 1px solid #dcdfe6;
+            }
+            &.select::after {
+              position: absolute;
+              top: 0;
+              left: 0;
+              right: 0;
+              bottom: 0;
+              content: " ";
+              display: block;
+              outline: 0;
+              border: 2px solid #0033ff;
+              box-shadow: 0 0 5px rgba(73, 177, 249, 0.5);
+            }
+            .value-style{
+              padding:5px;
+              border-radius: 4px;
+              &.predict-act {
+                color: orange;
+              }
+            }
+          }
+
+          .input-val-box {
+            width: 100%;
+            height: 100%;
+            border: none;
+            text-align: center;
+            color: #666;
+          }
+          .input-val-box:disabled {
+            background: transparent;
+          }
+          input::-webkit-outer-spin-button,
+          input::-webkit-inner-spin-button {
+            -webkit-appearance: none !important;
+            margin: 0;
+          }
+          input[type="number"] {
+            -moz-appearance: textfield;
+          }
+        }
+      }
+      .nodata {
+        text-align: center;
+        padding: 40px 0;
+        color: #999;
+      }
+    }
+
+    .left-select {
+      width: fit-content;
+      max-height: 90%;
+      border: 1px solid #EBEFF6;
+      padding: 10px 15px;
+      overflow-y: auto;
+      .el-button { display: block;margin:10px 0; }
+    }
+  }
+
+  .right-lick-menu  {
+    position: fixed;
+    z-index: 99;
+    top: -9999px;
+    left: -9999px;
+    background: #fff;
+    padding: 10px 0;
+    min-width: 180px;
+    max-height: 400px;
+    overflow-y: auto;
+    /* border: 1px solid #999; */
+    box-shadow: 0 1px 4px #999;
+    .item {
+      padding: 10px 25px;
+      cursor: pointer;
+      &:hover {
+        background-color: #f5f7fa;
+      }
+      &:hover .subMenu-wrapper {
+        display: block;
+      }
+    }
+  }
+}
+</style>
+<style lang="scss">
+.edb-detail-data-wrap {
+  .value-ul {
+    .el-date-editor.el-input {
+      width: 100%;
+    }
+    .el-date-editor .el-input__inner {
+      border: none;
+      text-align: center;
+    }
+
+    .el-input.is-disabled .el-input__inner {
+      background-color: #fff;
+      color: #666;
+    }
+  }
+}
+</style>

+ 108 - 0
src/views/dataEntry_manage/dataEntry/components/operateLogsDia.vue

@@ -0,0 +1,108 @@
+<template>
+  <m-dialog
+    :show.sync="isShow"
+    width="750px"
+    :title="$t('ManualEntryPage.opera_logs')"
+    @close="closeDialog"
+  >
+    <div>
+      <el-table
+        :data="tableData"
+        style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top: 20px"
+        border
+        ref="table"
+      >
+        <el-table-column
+          v-for="item in tableColums"
+          :key="item.key"
+          :label="item.label"
+          :width="item.widthsty"
+          :min-width="item.minwidthsty"
+          align="center"
+        >
+          <template slot-scope="{row}">
+            <span>{{row[item.key]}}</span>
+          </template>
+        </el-table-column>
+
+      </el-table>
+      <div style="height:35px;margin: 20px 0;">
+        <m-page
+          :page_no="page_no"
+          :pageSize="pageSize"
+          :total="total"
+          @handleCurrentChange="pageChange"
+        />
+      </div>
+    </div>
+  </m-dialog>
+</template>
+<script>
+import { dataInterence } from '@/api/api.js';
+import mDialog from '@/components/mDialog.vue';
+import mPage from '@/components/mPage.vue';
+export default {
+  components: { mDialog,mPage },
+  props: {
+    isShow: {
+      type: Boolean
+    },
+    edbCode: {
+      type: String
+    }
+  },
+  watch: {
+    isShow(nval) {
+      if(!nval) return 
+      this.getTableData()
+    }
+  },
+  computed: {
+    tableColums() {
+      return [
+        {  label: /* '操作时间' */this.$t('ManualEntryPage.opera_time'),key: 'CreateTime' },
+        {  label: /* '操作内容' */this.$t('ManualEntryPage.opera_msg'),key: 'Remark',minwidthsty:'150px' },
+        {  label: /* '操作人' */this.$t('ManualEntryPage.opera_user'),key: 'UserName'},
+      ]
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      page_no:1,
+      pageSize: 8,
+      total: 0
+    }
+  },
+  mounted(){
+
+  },
+  methods:{
+    async getTableData() {
+      const res = await dataInterence.getOperaLogsList({
+        PageSize: this.pageSize,
+        CurrentIndex: this.page_no,
+        TradeCode: this.edbCode
+      })
+
+      if(res.Ret !== 200) return 
+
+      this.tableData = res.Data.List || [];
+      this.total = res.Data.Paging.Totals;
+
+    },
+
+    pageChange(page) {
+      this.page_no = page;
+      this.getTableData()
+    },
+
+    closeDialog() {
+      this.$emit('update:isShow',false)
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+
+</style>

+ 383 - 0
src/views/dataEntry_manage/dataEntry/dataEdit.vue

@@ -0,0 +1,383 @@
+<template>
+  <div class="edit-data-page">
+    <div class="wrap-top">
+      <div class="left-handle">
+        <el-form
+          ref="form"
+          label-position="right"
+          inline
+          label-width="120px"
+          :model="formData"
+          :rules="formRules"
+        >
+          <el-form-item :label="$t('Edb.Detail.e_name')" prop="targetName">
+            <el-input
+              v-model="formData.targetName"
+              style="width: 150px"
+              :placeholder="$t('Edb.InputHolderAll.input_name')"
+            />
+          </el-form-item>
+          <el-form-item :label="$t('ManualEntryPage.label_vaiety')" prop="menu">
+            <el-cascader
+              v-model="formData.menu"
+              :options="classifyOptions"
+              :props="{
+                label: 'ClassifyName',
+                value: 'ClassifyId',
+                children: 'Child',
+                emitPath: false,
+              }"
+              clearable
+              :placeholder="$t('Edb.InputHolderAll.input_menu')"
+            />
+          </el-form-item>
+          <el-form-item :label="$t('Edb.Detail.e_fre')" prop="frequency">
+            <el-select
+              v-model="formData.frequency"
+              :placeholder="$t('Edb.InputHolderAll.input_fre')"
+              style="width: 120px"
+              clearable
+            >
+              <el-option
+                v-for="item in frequencyArr"
+                :key="item.label"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item :label="$t('Edb.Detail.e_unit')" prop="unit">
+            <selectUnit 
+							v-model="formData.unit" 
+							style="width: 120px"
+						/>
+          </el-form-item>
+        
+        </el-form>
+      </div>
+      <div class="right-handle">
+        <div>
+          <el-button type="primary" size="medium" @click="handleSaveEdb"><!-- 保存 -->{{$t('Dialog.confirm_save_btn')}}</el-button>
+          <el-button type="primary" size="medium" plain @click="$router.go(-1)"><!-- 取消 -->{{$t('Dialog.back_btn')}}</el-button>
+        </div>
+      </div>
+      
+    </div>
+    
+    <div class="main">
+      <div id="excel-container"></div>
+    </div>
+
+  </div>
+</template>
+
+<script>
+import { dataInterence } from '@/api/api.js';
+import { formRules } from '../databaseComponents/util';
+import { unitArr,frequencySelectList } from '@/utils/defaultOptions';
+import { mapState } from 'vuex';
+export default {
+  data() {
+    return {
+      edb_id: this.$route.query.edbid,
+      formData: {
+        targetName: '',
+        menu: '',
+        frequency: '',
+        unit: ''
+      },
+      formRules,
+      unitArr,
+      /* frequencyArr, */
+      classifyOptions: [],
+      edbInfo: {},
+
+      excelData: [
+        {
+          r:0,
+          c:0,
+          v:{
+            m: this.$t('Edb.Detail.e_date'),
+            v: this.$t('Edb.Detail.e_date'),
+            bg:'#bbb'
+          },
+        },
+        {
+          r:0,
+          c:1,
+          v:{
+            m:this.$t('Edb.Detail.e_value'),
+            v:this.$t('Edb.Detail.e_value'),
+            bg:'#bbb'
+          },
+        },
+      ],
+
+    }
+  },
+  computed: {
+    excelOptions() {
+      return {
+        container: 'excel-container',
+        lang: this.$i18nt.locale, // 设定表格语言
+        showinfobar: false,//顶部info
+        showsheetbar:false,//底部sheet页 暂禁止添加多个表格
+        showtoolbarConfig:{
+          image: false,//图片
+          print: false,//打印
+          chart: false, // '图表'
+          postil:  false, //'批注'
+          pivotTable: false,  //'数据透视表'
+          function: false, // '公式'
+          frozenMode: false, // '冻结方式'
+          sortAndFilter: false, // '排序和筛选'
+          conditionalFormat: false, // '条件格式'
+          dataVerification: false, // '数据验证'
+          splitColumn: false, // '分列'
+          screenshot: false, // '截图'
+          findAndReplace: false, // '查找替换'
+        },
+        cellRightClickConfig: {
+          insertColumn: false,
+          matrix: false,
+          chart: false, // 图表生成
+          image: false, // 插入图片
+          link: false, // 插入链接
+          copyAs: false,
+        },
+        data: [{
+          column: 2,
+          scrollTop: 0,
+          scrollLeft: 0,
+          defaultColWidth: 200,
+          defaultRowHeight: 20,
+          frozen: [
+            {
+              type: 'row'
+            }
+          ],
+          celldata: this.excelData,
+        }],
+        hook:{
+          cellUpdateBefore(r,c,value){
+            // 禁止更新第一行
+            if(r===0) return false
+          },
+          cellMousedownBefore(e,{r,c}){
+            if(r===0) return false
+          },
+        },
+      }  
+    },
+
+    ...mapState({
+			currentLang: state => state.lang,
+		}),
+    frequencyArr(){
+        return frequencySelectList(['半年度'])
+    }
+  },
+
+  mounted() {
+    this.getClassify();
+    if(this.$route.query.id) {
+      this.getEdbDetail()
+    }else {
+      this.initExcelOptions();
+    }
+    
+  },
+
+  beforeDestroy() {
+    luckysheet.destroy();
+  },
+
+  methods: {
+
+    async getEdbDetail() {
+      const res = await dataInterence.getEdbDetailV2({
+        TradeCode: this.$route.query.id,
+      })
+      if (res.Ret!==200) return 
+
+      this.edbInfo = res.Data;
+
+      this.formData = {
+        targetName: this.edbInfo.Detail.SecName,
+        menu: this.edbInfo.Detail.ClassifyId,
+        frequency: this.edbInfo.Detail.Frequency,
+        unit: this.edbInfo.Detail.Unit
+      }
+      this.initData()
+    },
+
+    /* 重置数据 */
+    initData() { 
+      this.excelData = [
+        {
+          r:0,
+          c:0,
+          v:{
+            m:"日期",
+            v:"日期",
+            bg:'#bbb'
+          },
+        },
+        {
+          r:0,
+          c:1,
+          v:{
+            m:"值",
+            v:"值",
+            bg:'#bbb'
+          },
+        },
+      ]
+
+      this.edbInfo.Detail.DataList&&this.edbInfo.Detail.DataList.forEach((item,index) => {
+        this.excelData.push({
+          r: index+1,
+          c:0,
+          v:{
+            m:item.Dt,
+            v:item.Dt
+          },
+        })
+        this.excelData.push({
+          r: index+1,
+          c:1,
+          v:{
+            m:item.Close,
+            v:item.Close
+          },
+        })
+      })
+      luckysheet.create(this.excelOptions)
+    },
+
+    getClassify() {
+			dataInterence.getClassify().then(res =>{
+				if(res.Ret === 200 && res.Data.List) {
+					this.classifyOptions = res.Data.List||[];
+				}
+			})
+		},
+
+    /* 保存 */
+    async handleSaveEdb() {
+      let data = luckysheet.getAllSheets()[0]
+      await this.$refs.form.validate();
+      
+      if(data.celldata.length < 3) return this.$message.warning(this.$t('AdjustDataPage.input_content_msg'));
+
+      const { targetName,menu,frequency,unit} = this.formData;
+
+      //处理数据格式
+      let result_obj = {},DataList=[];
+      data.celldata.forEach(item => {
+        if(result_obj[item.r]&&item.c===1) {
+          result_obj[item.r] = {
+            Date: result_obj[item.r].v.m,
+            Value: Number(item.v.m)
+          }
+        } else {
+          result_obj[item.r] = item
+        }
+      })
+      for(let key in result_obj) {
+        if(result_obj[key].Date && !isNaN(result_obj[key].Value)) DataList.push(result_obj[key]);
+      }
+
+      const { Ret,Data } = await dataInterence.editEdbDataV2({
+        EdbName: targetName,
+        Frequency: frequency,
+        Unit: unit,
+        ClassifyId: menu,
+        TradeCode: this.$route.query.id,
+        Data: DataList
+      })
+
+      if(Ret !== 200) return
+      // this.$message.success('保存成功')
+      this.$message.success(this.$t('MsgPrompt.saved_msg'))
+
+      this.$router.replace({path:'/dataList'});
+    },  
+
+    initExcelOptions() {
+      this.$nextTick(() => {
+        luckysheet.create(this.excelOptions)
+      })
+    },
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+*{ box-sizing: border-box; }
+.edit-data-page {
+  .wrap-top {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    /* align-items: center; */
+    margin-bottom: 20px;
+    padding: 20px;
+    background: #fff;
+    border: 1px solid #ececec;
+    border-radius: 4px;
+    box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+    z-index: 1;
+    .min-top {
+      margin-bottom: 10px;
+      display: flex;
+      flex-wrap: wrap;
+      align-items: center;
+      color: #606266;
+      li { margin-right: 35px; }
+    }
+    .left-handle{
+        flex: 1;
+    }
+    .right-handle {
+      min-width: 155px;
+      display: flex;
+      flex-direction: row-reverse;
+      align-items: center;
+    }
+    .el-form{
+        width:100%;
+    }
+    .tips-cont {
+      margin-right: 20px;
+    }
+  }
+  .main {
+    position: relative;
+    height: 650px;
+    display: flex;
+    .table-cont {
+      width: 260px;
+      flex-shrink: 0;
+      margin-right: 20px;
+      /* height: 600px;
+      overflow-y: scroll; */
+    }
+    #excel-container {
+      margin:0;padding:0;
+      width:100%;
+    }
+  }
+}
+</style>
+<style lang="scss">
+  .luckysheet .toolbar {
+    background: none;
+    margin: 0;
+    padding: 0;
+  }
+.luckysheet-input-box {
+  z-index: 99999;
+}
+</style>

+ 593 - 0
src/views/dataEntry_manage/dataEntry/index.vue

@@ -0,0 +1,593 @@
+<template>
+  <div class="dataEntry-page">
+    
+    <header>
+      <div class="left-btn">
+        <el-button 
+          type="primary" 
+          @click="isShowinsert=true" 
+          v-permission="permissionBtn.dataSourcePermission.manualDataWrite_import"
+        ><!-- 导入数据 -->{{$t('ManualEntryPage.tit_insert_data')}}</el-button>
+
+        <el-button 
+          type="primary" 
+          @click="$router.push({path: '/batchToBase' })" 
+          v-permission="permissionBtn.dataSourcePermission.manualDataWrite_batch_add"
+        ><!-- 批量加入指标库 -->{{$t('ManualEntryPage.batch_addbase')}}</el-button>
+
+        <el-button 
+          v-permission="permissionBtn.dataSourcePermission.manualDataWrite_online_excel" 
+          type="primary" 
+          @click="$router.push({path: '/onlineExcelCopy' })"
+        ><!-- 在线Excel -->{{$t('ManualEntryPage.online_excel')}}</el-button>
+
+        <el-button
+          v-permission="permissionBtn.dataSourcePermission.manualDataWrite_batch_del" 
+          type="primary" 
+          @click="$router.push({path: '/batchDelList' })"
+        ><!-- 批量删除 -->{{$t('ManualEntryPage.batch_del')}}</el-button>
+      </div>
+
+      <div class="right-wrap">
+        <a style="width: 100%" :href="exportUrl" download>
+          <el-button
+            v-permission="permissionBtn.dataSourcePermission.manualDataWrite_export"
+            type="text"
+          >
+            <!-- 导出Excel -->{{$t('Common.exp_excel')}}
+            <el-tooltip placement="top">
+              <div slot="content" v-html="exportMsg" style="max-width:350px"></div>
+              <i class="el-icon-warning" style="color: #666;"></i>
+            </el-tooltip>
+          </el-button>
+        </a>
+        <el-select
+					v-model="search_txt"
+					v-loadMore="searchLoad"
+					ref="searchRef"
+					:filterable="!search_txt"
+					remote
+					clearable
+					:placeholder="$t('Edb.InputHolderAll.input_name_orid')"
+					style="width: 260px;margin-left:10px;"
+					:remote-method="searchHandle"
+					@click.native="inputFocusHandle"
+				>
+					<i slot="prefix" class="el-input__icon el-icon-search"></i>
+					<el-option
+						v-for="item in searchOptions"
+						:key="item.TradeCode"
+						:label="item.SecName"
+						:value="item.TradeCode"
+					/>
+				</el-select>
+      </div>
+    </header>
+    <div class="main">
+
+      <div class="main-left" id="left">
+        
+        <div class="left-main">
+            <div class="tree-cont">
+              <el-tree
+                ref="treeRef"
+                class="classify-tree"
+                :data="classifyList"
+                node-key="UniqueCode"
+                :props="defaultProp"
+                :current-node-key="select_node"
+                :default-expanded-keys="defaultShowNodes"
+                :expand-on-click-node="false"
+                check-strictly
+                empty-text="暂无分类"
+                lazy
+                :load="getLazyTreeData"
+                @current-change="nodeChange"
+              >
+                <span class="custom-tree-node" slot-scope="{ node, data }">
+                  <span
+                    class="text_oneLine node_label"
+                    :style="`width:${
+                      (select_node === data.UniqueCode && node.Nodewidth) || ''
+                    }`"
+                  >
+                    <span>{{ data.ClassifyName  }}</span>
+                  </span>
+                </span>
+              </el-tree>
+
+            </div>
+        </div>
+
+      </div>
+
+      <div class="main-right" id="right">
+        <!-- 分类 -->
+        <template v-if="!selectedEdb">
+          <div>
+            <h3><!-- 共{{total}}个指标 --> {{$t('EtaBasePage.total_show',{limit:total})}}</h3>
+            <el-table
+              :data="tableData"
+              style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top: 20px"
+              border
+              ref="table"
+            >
+              <el-table-column
+                v-for="item in tableColums"
+                :key="item.key"
+                :label="item.label"
+                :width="item.widthsty"
+                :min-width="item.minwidthsty"
+                align="center"
+              >
+                <template slot-scope="{row}">
+                  <span v-if="item.key==='SecName'" class="editsty" @click="lookDetailHandle(row)">{{row[item.key]}}</span>
+                  <span v-else>{{row[item.key]}}</span>
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                :label="$t('Table.column_operations')"
+                align="center"
+                min-width="200"
+              >
+                <template slot-scope="{row}">
+                  <div>
+                    <span class="editsty" @click="handleEdb({item:row,type:'edit'})"  v-if="permissionBtn.isShowBtn('dataSourcePermission','manualDataWrite_edit')">{{$t('Table.edit_btn')}}</span>
+
+                    <span v-if="row.IsJoinEdb===0&&permissionBtn.isShowBtn('dataSourcePermission','manualDataWrite_add')" class="editsty" @click="handleEdb({item:row,type:'addToBase'})"><!-- 加入指标库 -->{{$t('ManualEntryPage.add_tobase')}}</span>
+
+                    <span class="editsty" @click="handleEdb({item:row,type:'logs'})"><!-- 操作日志 -->{{$t('ManualEntryPage.opera_logs')}}</span>
+                    <span v-if="row.IsJoinEdb===0&&permissionBtn.isShowBtn('dataSourcePermission','manualDataWrite_del')" class="deletesty" @click="handleEdb({item:row,type:'del'})">{{$t('Table.delete_btn')}}</span>
+                  </div>
+
+                  
+                </template>
+              </el-table-column>
+              <div class="nodata" slot="empty">
+                <tableNoData :text="$t('Table.prompt_slogan')" size="mini"/>
+              </div>
+            </el-table>
+            
+            <div style="height:35px;margin: 20px 0;">
+              <m-page
+                :page_no="pageNo"
+                :pageSize="pageSize"
+                :total="total"
+                @handleCurrentChange="pageChange"
+              />
+            </div>
+          </div>
+        </template>
+
+        <!-- 指标详情 -->
+        <template v-else>
+          <edbDetail
+            ref="edbDetailRef"
+            :id="selectedEdb"
+            @handle="handleEdb"
+          />
+        </template>
+      </div>
+    </div>
+
+
+  <!-- 导入数据弹窗 -->
+  <insert-data
+    :isShowinsert.sync="isShowinsert"
+    @importSuccess="importSuccess"
+    source="dataEntry"
+  />
+
+  
+  <!-- 操作日志弹窗 -->
+  <operateLogsDia
+    :isShow.sync="isShowOperaLogs"
+    :edbCode="operteId"
+  />
+
+  <!-- 加入指标库弹窗 -->
+  <completeTargetDia
+    :isOpenDialog="isAddBaseDia"
+    @cancel="isAddBaseDia=false"
+    :params="addBaseInfo"
+    @add="handleAddBaseApi"
+  />
+  </div>
+</template>
+<script>
+import { dataInterence } from '@/api/api.js';
+import mPage from '@/components/mPage.vue';
+import edbDetail from './components/edbDetail.vue'
+import operateLogsDia from './components/operateLogsDia.vue';
+import insertData from '../components/insertData.vue';
+import completeTargetDia from '../databaseComponents/completeTargetDia.vue';
+export default {
+  components: { 
+    mPage,
+    edbDetail,
+    operateLogsDia,
+    insertData,
+    completeTargetDia
+  },
+  computed: {
+    tableColums() {
+      return [
+        {  label: this.$t('Edb.Detail.e_id'),key: 'TradeCode' },
+        {  label: this.$t('Edb.Detail.e_name'),key: 'SecName',minwidthsty:'150px' },
+        {  label: this.$t('Edb.Detail.e_fre'),key: 'Frequency',widthsty:'100px' },
+        {  label: this.$t('Edb.Detail.e_unit'),key: 'Unit', },
+        {  label: this.$t('Edb.Detail.e_creator'),key: 'UserName', },
+        {  label: this.$t('Edb.Detail.e_update_time'),key: 'ModifyTime', },
+      ]
+    },
+
+    exportUrl() {
+      let exportDataurl = process.env.VUE_APP_API_ROOT + "/entry/export/dataList";
+
+      let str = `${exportDataurl}?ClassifyId=${
+        this.selectClassifyId
+      }&TradeCode=${
+        this.selectedEdb ? this.selectedEdb : ''
+      }&StartDate=&EndDate=&Mobile=&${localStorage.getItem("auth")}`;
+      return str.replace(/#/g, encodeURIComponent("#")).replace(/;/g, encodeURIComponent(";"));
+    },
+  },
+  watch: {
+    search_txt(nval) {
+      if(!nval) return
+
+      this.selectClassifyId = 0;
+			this.selectedEdb = nval;
+
+			this.selectNode = this.searchOptions.find(_ => _.TradeCode===nval).UniqueCode;
+    }
+  },
+  data() {
+    return {
+      defaultProp: {
+        label: 'ClassifyName',
+        children: 'Child',
+				isLeaf: 'isLeaf'
+      },
+      defaultShowNodes: [],
+      classifyList: [],
+
+      tableData: [],
+      pageNo: 1,
+      total: 0,
+      pageSize: 10,
+
+      search_txt: '',
+      searchOptions: [],
+      search_page: 1,
+      current_search: '',
+      search_have_more: false,
+
+      exportMsg: /* `导出当前页面筛选的指标列表` */this.$t('ManualEntryPage.export_msg'),//导出tip
+
+      selectClassifyId: 0,
+      selectNode: '',
+      selectedEdb: 0,
+
+      /* 操作日志弹窗 */
+      isShowOperaLogs: false,
+      operteId: '',
+
+      /* 导入弹窗 */
+      isShowinsert:false,
+
+      /* 加入弹窗 */
+      isAddBaseDia: false,
+      addBaseInfo: {}
+    }
+  },
+  mounted(){
+    this.getClassify();
+    this.getTableData()
+  },
+  methods:{
+    lookDetailHandle(row) {
+      this.selectClassifyId = 0;
+			this.selectNode = '';
+			this.selectedEdb = row.TradeCode;
+    },
+
+    // 获取分类
+		getClassify() {
+			dataInterence.getClassifyV2().then(res =>{
+				if(res.Ret === 200 && res.Data.List) {
+					this.classifyList = res.Data.List||[];
+				}
+			})
+		},
+
+    //加载子指标
+    async getLazyTreeData(node,resolve,maxLevel=2) {
+      if(node.level===0){
+				resolve(this.classifyList)
+			}else if(node.level>0&&node.level<maxLevel){
+				//获取对应层级的Child
+				resolve(node.data.Child||[])
+			}else{
+				let arr=[]
+				const res=await dataInterence.getClassifyLoadChild({
+          ClassifyId: node.data.ClassifyId
+        })
+				if (res.Ret === 200) {
+					const temarr = res.Data.List || [];
+					arr=temarr.map(item=>{
+						return {
+							...item,
+							isLeaf:item.TradeCode?true:false
+						}
+					})
+				}
+				resolve(arr)
+			}
+    },
+
+    async getTableData() {
+      const res = await dataInterence.getEdbListV2({
+        ClassifyId: this.selectClassifyId,
+        CurrentIndex: this.pageNo,
+        PageSize: this.pageSize
+      })
+
+      if(res.Ret !==200) return 
+      this.tableData = res.Data.List || [];
+      this.total = res.Data.Paging.Totals;
+    },
+
+    pageChange(page) {
+      this.pageNo = page;
+      this.getTableData()
+    },
+
+    	/* 搜索 */
+		searchHandle(query) {
+			this.search_page = 1;
+			this.current_search = query;
+			this.searchApi(this.current_search)
+		},
+
+		searchApi(query,page=1) {
+			dataInterence.searchEdbV2({
+				Keyword:query,
+				CurrentIndex: page
+			}).then(res => {
+				if(res.Ret !== 200) return
+
+				const { List,Paging } = res.Data;
+				this.search_have_more = page < Paging.Pages;
+				this.searchOptions = page === 1 ? List : this.searchOptions.concat(List);
+					
+			})
+		},
+
+		/* 聚焦获取当前检索 */
+		inputFocusHandle(e) {
+			this.search_page = 1;
+			this.current_search = e.target.value;
+			this.searchApi(this.current_search);
+		},
+
+		searchLoad() {
+			if(!this.search_have_more) return;
+			this.searchApi(this.current_search,++this.search_page);
+		},
+
+    //选中节点
+    nodeChange(data,node) {
+      this.selectClassifyId = !data.TradeCode?data.ClassifyId:0;
+			this.selectNode = data.UniqueCode;
+			this.selectedEdb = data.TradeCode;
+      
+      if(this.selectClassifyId){
+        this.pageNo = 1;
+        this.getTableData();
+      }
+    },
+
+    //导入成功
+    importSuccess() {
+      this.isShowinsert = false;
+      this.getTableList();
+    },
+
+    /* 操作 */
+    handleEdb({item,type}) {
+      const typeMap = {
+        'edit': this.handleEditEdb,
+        'addToBase': this.handleAddToBase,
+        'logs': this.handleOperaLogs,
+        'del': this.handleDelEdb
+      }
+
+      typeMap[type]&&typeMap[type](item)
+    },
+
+    handleEditEdb(item) {
+      this.$router.push({
+        path: '/dataEdit',
+        query: {
+          id: item.TradeCode
+        }
+      })
+    },
+
+    /* 加入指标库 */
+    handleAddToBase(item) {
+      this.addBaseInfo = {
+        edb_name: item.SecName,
+        menu: [],
+        frequency: item.Frequency,
+        unit: item.Unit,
+        ...item
+      }
+      this.isAddBaseDia = true
+    },
+
+    handleAddBaseApi(params) {
+      dataInterence.addToBaseBatchV2(
+          [{
+            EdbCode: params.TradeCode,
+            EdbName: params.EdbName,
+            Frequency: params.Frequency,
+            Unit: params.Unit,
+            ClassifyId: params.ClassifyId
+          }]
+      ).then(res=>{
+          this.saveLoading = false
+
+          if(res.Ret!==200) return 
+
+          this.$message.success(this.$t('MsgPrompt.add_msg2'))
+          this.isAddBaseDia = false;
+
+          if(this.selectedEdb){
+            this.$refs.edbDetailRef.edbInfo.Detail.IsJoinEdb=1
+          }else {
+             this.getTableData()
+          }
+      })
+    },
+
+    // 查看操作日志
+    handleOperaLogs(item){
+      this.operteId = item.TradeCode;
+      this.isShowOperaLogs = true;
+    },
+    
+    /* 删除指标 */
+    handleDelEdb(item) {
+      // 删除前检测指标下是否有录入数据
+			dataInterence.checkTarget({
+				TradeCode:item.TradeCode
+			}).then(res => {
+				if(res.Data.Status===1){
+					this.$message.error(/* "该指标已加入指标库,不可删除" */ this.$t('ManualEdbListPage.edb_not_allow_delete'))
+					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'),{
+						type:'warning'
+					}).then(() => {
+						dataInterence.delTarget({
+							TradeCode:item.TradeCode
+						}).then(res =>{
+								if( res.Ret !== 200 ) return
+								this.$message.success(/* '删除成功!' */this.$t('MsgPrompt.delete_msg'));
+                this.getClassify();
+                this.getTableData()
+							});
+					}).catch(() => {});
+				}
+			})
+    }
+  },
+}
+</script>
+<style scoped lang='scss'>
+.dataEntry-page {
+  *{box-sizing: border-box;}
+  header,.main-left,.main-right {
+    padding: 20px;
+    background: #fff;
+    border: 1px solid #C8CDD9;
+    border-radius: 4px;
+  }
+  header {
+    margin-bottom: 20px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+  .main {
+    display: flex;
+
+    .main-left {
+      width: 300px;
+      flex-shrink: 0;
+      margin-right: 30px;
+      .tree-cont {
+        height: calc(100vh - 260px);
+        overflow: auto;
+      }
+      .classify-tree {
+        color: #333;
+        overflow: hidden; 
+        .custom-tree-node {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          display: block;
+          flex: 1;
+        }
+      }
+    }
+
+    .main-right {
+      flex: 1;
+      height: calc(100vh - 220px);
+      overflow: auto;
+    }
+  }
+}
+</style>
+<style lang="scss">
+ .dataEntry-page {
+  .classify-tree {
+		.el-tree__drop-indicator {
+			height: 3px;
+			background-color: #409eff;
+		}
+
+		.el-tree-node__content {
+			margin-bottom: 14px !important;
+		}
+
+		.el-tree-node__children {
+			.el-tree-node {
+				margin-bottom: 0px !important;
+				padding-left: 18px;
+			}
+
+			.el-tree-node__content {
+				margin-bottom: 5px !important;
+				padding-left: 0 !important;
+			}
+		}
+
+		.expanded.el-icon-caret-right:before {
+			content: url('~@/assets/img/set_m/down.png') !important;
+		}
+
+		.el-icon-caret-right:before {
+			content: url('~@/assets/img/set_m/slide.png') !important;
+		}
+		.el-tree-node__expand-icon{
+			padding-top: 10px;
+		}
+
+		.el-tree-node__expand-icon.is-leaf.el-icon-caret-right:before {
+			content: '' !important;
+		}
+
+		.el-tree-node__expand-icon.expanded {
+			-webkit-transform: rotate(0deg);
+			transform: rotate(0deg);
+		}
+
+		.el-tree-node.is-current>.el-tree-node__content {
+			background-color: #f0f4ff !important;
+		}
+
+		.el-tree-node__content {
+			padding-right: 10px !important;
+		}
+	}
+
+} 
+</style>

+ 16 - 1
src/views/dataEntry_manage/databaseComponents/batchComptedDialog.vue

@@ -120,6 +120,15 @@
 						>
 						</el-option>
 					</el-select>
+					<el-select
+						v-if="type===45"
+						v-model="list.emptyType"
+						:placeholder="$t('Edb.InputHolderAll.input_fre')"
+						style="width:20%;margin-left:10px"
+					>
+						<el-option :label="$t('EtaBasePage.null_val_deal_2')" :value="0"></el-option>
+						<el-option :label="$t('EtaBasePage.null_val_deal_3')" :value="3"></el-option>
+					</el-select>
         </li>
       </ul>
     </div>
@@ -197,6 +206,7 @@ export default {
           menu: '',
           frequency: '',
           n_num: 1,
+					emptyType:0,
 				},
 				{
 					tag: tag_arr[1],
@@ -208,6 +218,7 @@ export default {
           menu: '',
           frequency: '',
           n_num: 1,
+					emptyType:0
 				},
       ],
 
@@ -363,6 +374,7 @@ export default {
         menu: '',
         frequency: '',
         n_num: 1,
+				emptyType:0
 			};
 			this.targetList.push(item);
 		},
@@ -425,6 +437,7 @@ export default {
           menu: '',
           frequency: '',
           n_num: 1,
+					emptyType:0,
 				},
 				{
 					tag: tag_arr[1],
@@ -436,6 +449,7 @@ export default {
           menu: '',
           frequency: '',
           n_num: 1,
+					emptyType:0,
 				},
       ]
 			// this.$refs.form.resetFields();
@@ -459,7 +473,8 @@ export default {
           MoveFrequency: "天",
           MoveType: 1,
           Source: this.type,
-          Unit: item.unit
+          Unit: item.unit,
+					EmptyType:item.emptyType
         }
       }))
 

+ 2 - 1
src/views/dataEntry_manage/databaseComponents/batchComputedSave.vue

@@ -294,7 +294,8 @@ export default {
                 Extra:JSON.stringify({
                     LastValType:this.formData.newValue,
                     DateTag:this.formData.timeSeriesVal
-                })
+                }),
+                EmptyType:this.formData.emptyType
             }
             // 处理多指标求和\平均 情况的数据
             if(this.computedType==='multipleEDB'){

+ 15 - 0
src/views/dataEntry_manage/databaseComponents/batchComputedV2.vue

@@ -232,6 +232,18 @@
                     </el-form-item>
                     </template>
 
+                    <!-- 升频 -->
+                    <template v-if="computedType==14">
+                    <el-form-item :label="$t('EtaBasePage.null_val_deal')" prop="emptyType">
+                        <el-select
+                            v-model="formData.emptyType"
+                            :placeholder="$t('Edb.InputHolderAll.input_fre')"
+                        >
+                            <el-option :label="$t('EtaBasePage.null_val_deal_2')" :value="0"></el-option>
+                            <el-option :label="$t('EtaBasePage.null_val_deal_3')" :value="3"></el-option>
+                        </el-select>
+				    </el-form-item>
+                    </template>
 
                 </div>
             </div>
@@ -555,6 +567,7 @@ export default {
                     timeSeriesVal:'A',
                     nullValueWay:0,
                     maxNullWay:1,
+                    emptyType:0
                 }
             }else{
                 // 编辑多指标求和\平均
@@ -582,6 +595,7 @@ export default {
                 timeSeriesVal:'A',
                 nullValueWay:0,
                 maxNullWay:1,
+                emptyType:0,
             },
 
             select_target:'',
@@ -784,6 +798,7 @@ export default {
                 timeSeriesVal:'A',
                 nullValueWay:0,
                 maxNullWay:1,
+                emptyType:0
             }
             this.filter={
                 classify:'',

+ 3 - 2
src/views/dataEntry_manage/databaseComponents/completeTargetDia.vue

@@ -153,6 +153,9 @@ export default {
 						Frequency: this.formData.frequency,
 						Unit: this.formData.unit
 					}
+
+					if(this.$route.path!=='/database') return this.$emit('add',params)
+
 					dataBaseInterface.targetAdd(params).then(res => {
 						if(res.Ret === 200) {
 							this.$message.success(/* '新增指标成功!' */this.$t('EtaBasePage.add_success_msg'))
@@ -168,8 +171,6 @@ export default {
 			this.$emit('cancel')
 		}
 	},
-	created() {},
-	mounted() {},
 }
 </script>
 <style lang='scss'>

+ 21 - 5
src/views/dataEntry_manage/databaseComponents/operationDialog.vue

@@ -256,6 +256,16 @@
 								<el-option :label="$t('EtaBasePage.mean_imputation_select_text')" :value="'均值填充'" v-if="hasNewValueOpt"></el-option> 
 							</el-select>
 						</el-form-item>
+						<el-form-item :label="$t('EtaBasePage.null_val_deal')" prop="emptyType" v-if="type===14">
+							<el-select
+								v-model="formData.emptyType"
+								:placeholder="$t('Edb.InputHolderAll.input_fre')"
+								style="width: 340px"
+							>
+								<el-option :label="$t('EtaBasePage.null_val_deal_2')" :value="0"></el-option>
+								<el-option :label="$t('EtaBasePage.null_val_deal_3')" :value="3"></el-option>
+							</el-select>
+						</el-form-item>
 					</el-form>
 				</div>
 			</div>
@@ -321,7 +331,8 @@ export default {
 					moveVal,
 					oldedb_id,
 					oldEdb_name,
-					calendar_type
+					calendar_type,
+					EmptyType
 				} = backData;
 				this.formData = {
 					edb_id,
@@ -335,7 +346,8 @@ export default {
 					moveUnit,
 					moveVal,
 					calendar_type,
-					new_value:''
+					new_value:'',
+					emptyType:EmptyType,
 				}
 				this.getDataList();
 
@@ -500,6 +512,7 @@ export default {
 				calendar_type: '公历',
 				value_type: '期末值',
 				new_value:'',
+				emptyType:0,
 			},
 			options: [],
 			levelProps: {
@@ -688,7 +701,8 @@ export default {
 				moveVal: '',
 				calendar_type: '公历',
 				value_type: '期末值',
-				new_value:''
+				new_value:'',
+				emptyType:0,
 			};
 			this.$refs.form.resetFields();
 		},
@@ -718,7 +732,8 @@ export default {
 					Calendar: this.formData.calendar_type,
 					Extra:JSON.stringify({
 						LastValType:this.formData.new_value==='均值填充'?1:0
-					})
+					}),
+					EmptyType:this.formData.emptyType
 				}
 
 				const res = this.operationForm.edb_id 
@@ -844,7 +859,8 @@ export default {
 				moveVal: '',
 				calendar_type: this.formData.calendar_type,
 				value_type: this.formData.value_type,
-				new_value:''
+				new_value:'',
+				emptyType:0
 			}
 		},
         handleSelectBtnClick(){

+ 2 - 78
src/views/dataEntry_manage/databaseList.vue

@@ -1165,11 +1165,6 @@ export default {
 			this.searchApi(this.current_search,++this.search_page);
 		},
 
-		/* 存储中英文状态 */
-		// setLangIntoStore() {
-		// 	this.$store.commit('edb/SET_LANG',this.currentLang)
-		// },
-
 		/* 数值滚动加载 */
 		scrollHandle: _.throttle(function() {
 			let scrollTop = this.$refs.valueUl.scrollTop;
@@ -1183,79 +1178,7 @@ export default {
 				this.getDataList();
 			}
 		},200),
-		/* 切换中英文 */
-		// changeLanguage: _.debounce(async function (lang){
-		// 	this.search_txt = '';
-		// 	this.currentLang = lang;
-		// 	await dataBaseInterface.setUserLang({
-		// 		ConfigCode: 'edb_language',
-		// 		ConfigValue: lang === 'en' ? 'EN' : 'CN'
-		// 	})
-
-		// 	this.setLangIntoStore()
-		// },200),
-		// 打开 编辑英文名称弹窗
-		// openEnNameDia(type='table'){
-		// 	this.updateType = type
-		// 	this.formItemArray=[{
-		// 		label:/* '指标名称' */ this.$t('Edb.Detail.e_name'),
-		// 		value:this.tableData[0].EdbName,
-		// 		key:'EdbName',
-		// 		notEdit:true
-		// 	}]
-		// 	// 中文单位有 才能编辑英文单位
-		// 	if(this.tableData[0].Unit && this.tableData[0].Unit!='无'){
-		// 		this.formItemArray.push({
-		// 			label:this.$t('Edb.Detail.e_unit') /* '单位' */,
-		// 			value:this.tableData[0].Unit,
-		// 			key:'Unit',
-		// 			notEdit:true
-		// 		},
-		// 		{
-		// 			label:this.$t('Edb.Detail.e_en_name')/* '英文指标名称' */,
-		// 			value:this.tableData[0].EdbNameEn,
-		// 			key:'EdbNameEn',
-		// 			placeholder: this.$t('Edb.InputHolderAll.input_common',{label:this.$t('Edb.Detail.e_en_name')}) /* '请输入英文指标名称' */
-		// 		},
-		// 		{
-		// 			label:this.$t('Edb.Detail.e_en_unit') /* '英文单位' */,
-		// 			value:this.tableData[0].UnitEn,
-		// 			key:'UnitEn',
-		// 			placeholder:this.$t('Edb.InputHolderAll.input_common',{label:this.$t('Edb.Detail.e_en_unit')})  /* '请输入英文单位' */
-		// 		})
-		// 	}else{
-		// 		this.formItemArray.push({
-		// 			label:this.$t('Edb.Detail.e_en_name') /* '英文指标名称' */,
-		// 			value:this.tableData[0].EdbNameEn,
-		// 			key:'EdbNameEn',
-		// 			placeholder:this.$t('Edb.InputHolderAll.input_common',{label:this.$t('Edb.Detail.e_en_name')}) /* '请输入英文指标名称' */
-		// 		})
-		// 	}
-
-		// 	this.setEnName = true
-		// },
-		// updateEnName(item){
-		// 	let params={
-		// 		EdbInfoId: Number(this.selected_edbid),
-		// 		...item
-		// 	}
-		// 	dataBaseInterface.edbInfoEditEn(params).then(res=>{
-		// 		if(res.Ret ==200){
-		// 			this.$message({
-		// 				message:res.Msg,
-		// 				type:"success"
-		// 			})
-
-		// 			this.getTreeData()
-		// 			this.getDataList()
-		// 			if(this.updateType=='chart'){
-		// 				// 重绘图表,刷新数据
-		// 				this.$refs.createChart.getEdbData()
-		// 			}
-		// 			this.setEnName = false
-		// 		}
-		// 	})
-		// },
+		
 		openLangInfoDia(type='table') {
 				this.updateType = type
 				this.formItemArray=[
@@ -1997,6 +1920,7 @@ export default {
 							moveUnit: dataInfo.MoveFrequency,
 							moveVal: type === 22 ? dataInfo.CalculateFormula : '',
 							calendar_type: type === 35 ? dataInfo.Calendar : '',
+							EmptyType:dataInfo.EmptyType||0,
 					}
 
 				if([72,73].includes(type)){

+ 55 - 6
src/views/dataEntry_manage/editChart.vue

@@ -33,7 +33,8 @@
 					:rules="chartRules"
 				>
 					<el-form-item :label="$t('EtaChartAddPage.label_chart_type')" prop="ChartType">
-						<el-select
+						<chartTypeSelect v-model="chartInfo.ChartType" style="width:90%"/>
+						<!-- <el-select
 							v-model="chartInfo.ChartType"
 							placeholder="请选择生成样式"
 							style="width: 90%"
@@ -46,7 +47,7 @@
 								:value="item.key"
 							>
 							</el-option>
-						</el-select>
+						</el-select> -->
 					</el-form-item>
 
 					<el-form-item :label="$t('EtaChartAddPage.label_chart_theme')" prop="Theme">
@@ -67,7 +68,7 @@
 					</el-form-item>
 
 					<el-form-item label="">
-						<div class="search-cont" v-if="chartInfo.ChartType!==10">
+						<div class="search-cont" v-if="![10,14].includes(chartInfo.ChartType)">
 							<div>
 								<label><!-- 选择指标 -->{{$t('Edb.choose_edb')}}:</label>
 								<el-radio-group v-model="edbFromType">
@@ -208,7 +209,7 @@
 						<el-checkbox v-model="tableData[0].IsOrder"><!-- 逆序 -->{{$t('Chart.Detail.re_order')}}</el-checkbox>
 					</div>
 
-          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10,11].includes(chartInfo.ChartType)">
+          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10,11,14].includes(chartInfo.ChartType)">
             <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="[2,5].includes(chartInfo.ChartType)">
               <template slot="title">
                 <span class="text_oneLine">{{currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName}}</span>
@@ -360,6 +361,17 @@
 						@modifySeriesName="IsNameDefault = false"
 					/>
 
+					<!-- 截面组合图 -->
+					<sectional-combination-option 
+						ref="sectionalCombinationIns"
+						v-if="chartInfo.ChartType===14"
+						:chartInfo="chartInfo"
+						:defaultData="sectionalCombinationData"
+						@getData="getSectionalCombination"
+						@hideChart="tableData=[];"
+						@updateChart="handleUpdateSectionalCombinationChart"
+					/>
+
 					<!-- 标识区 标记线 图表说明 -->
 					<markersSection
 						ref="markerSectionRef"
@@ -603,6 +615,23 @@
 								<span class="editsty" @click="isShowSourceDialog=true"><!-- 编辑 -->{{$t('Chart.chart_edit_btn')}}</span>
 							</div>
 
+							<!-- 是否堆积 -->
+							<div v-if="showIsHeap">
+								<span>{{$t('EtaChartAddPage.bar_stacking')}}</span>
+								<el-tooltip
+                  :content="$t('EtaChartAddPage.stack_tips')"
+                  placement="top"
+                >
+                  <i class="el-icon-info"></i>
+                </el-tooltip>
+                <el-switch
+                  style="margin-left: 20px"
+                  v-model="IsHeap"
+									@change="handleHeapChange"
+                >
+                </el-switch> 
+							</div>
+
 							<!-- 公历农历切换 只用于季节性图 -->
 							<el-radio-group
 								v-model="calendar_type"
@@ -695,8 +724,20 @@ import LegendEditDia from './components/LegendEditDia.vue';
 import markersSection from './components/markersSection.vue';
 import chartSourceEditDia from './components/chartSourceEditDialog.vue';
 import chartRelationEdbList from './components/chartReleationEdbTable.vue';
+import sectionalCombinationOption from './components/sectionalCombination/sectionalCombinationOption.vue';
 export default {
-  components: { Chart,DateChooseDia,SaveChartOther,barOption,sectionalScatterOption,LegendEditDia,markersSection,chartSourceEditDia,chartRelationEdbList },
+  components: { 
+		Chart,
+		DateChooseDia,
+		SaveChartOther,
+		barOption,
+		sectionalScatterOption,
+		LegendEditDia,
+		markersSection,
+		chartSourceEditDia,
+		chartRelationEdbList,
+		sectionalCombinationOption
+	},
 	directives: {
     drag(el, bindings) {
       el.onmousedown = function (e) {
@@ -844,6 +885,13 @@ export default {
 
 					//雷达图
 					this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
+
+					// 时间序列组合图
+					if(this.chartInfo.ChartType===6){
+						this.IsHeap=res.Data.DataResp.IsHeap===1?true:false
+					}
+					// 截面组合图
+					this.chartInfo.ChartType===14&&this.initSectionalCombinationChart(res.Data);
 					
 					this.getThemeList();
 					//初始化上下限
@@ -953,7 +1001,7 @@ export default {
 						const limitSame= this.getLimitInfo()
 						hasLimitChange = !limitSame
 					}
-					if(![10,11].includes(this.chartInfo.ChartType)){
+					if(![10,11,14].includes(this.chartInfo.ChartType)){
 						//每个数据转换需要检测是否合法
 						for(let i=0;i<db_arr.length;i++){
 							const {IsConvert,ConvertType,ConvertValue} = this.updateData[i]
@@ -1011,6 +1059,7 @@ export default {
 										? this.select_date[0]
 										: '',
 							EndDate: this.year_select === 5 ? this.select_date[1] : '',
+							ExtraConfig:JSON.stringify({IsHeap:this.IsHeap?1:0})//时间序列组合图是否堆积控制
 						} 
 					: typePrams
 					

+ 142 - 1
src/views/dataEntry_manage/mixins/addOreditMixin.js

@@ -98,6 +98,27 @@ export default {
 		//是否需要更新上下限
 		updateLimit(){
 			return this.isModifyEdb||this.isChangeEdbAxis
+		},
+		// 判断是否显示堆积控制按钮
+		showIsHeap(){
+			let flag=false
+			if(!this.chartInfo) return flag
+			// 堆积组合图
+			if(this.chartInfo.ChartType==14&&this.sectionalCombinationData.SeriesList){
+				const arr=this.sectionalCombinationData.SeriesList.filter(item=>item.ChartStyle==='column')
+				if(arr.length>1){
+					flag=true
+				}
+			}
+			// 时序组合图
+			if(this.chartInfo.ChartType==6){
+				const arr=this.tableData.filter(item=>item.ChartStyle==='column')
+				if(arr.length>1){
+					flag=true
+				}
+			}
+
+			return flag
 		}
 	},
 	watch: {
@@ -666,6 +687,7 @@ export default {
 				rightTwoMax:'',
 			};
       this.sectionScatterData = {};
+			this.sectionalCombinationData={}
 
 			this.$nextTick(()=>{
 				// 等待 tableData的 监听里面的获取到 起始时间和最近日期
@@ -853,6 +875,118 @@ export default {
 			})
 		},
 
+		//截面组合图参数处理
+		getSectionalCombinationParams(opt){
+			const params={
+				DateConfList:[],// 引用日期配置
+				IsHeap:this.IsHeap?1:0,//是否堆积(1.堆积,0不堆积)
+				XDataList:[],
+				UnitList:{
+					LeftName:opt.UnitList.LeftName||'',
+					RightName:opt.UnitList.RightName||'',
+					RightTwoName:opt.UnitList.RightTwoName||''
+				},
+				BaseChartSeriesName:opt.sortBasisEdb,
+				SortType:opt.sortType,
+				SeriesList:[],
+			}
+			params.XDataList=opt.XDataList.map(i=> {
+				return {Name:i.Name}
+			})
+			params.DateConfList=opt.referenceDateOpts.map(item=>{
+				return {
+					MoveForward:item.MoveForward,
+					EdbInfoId:item.selectEdbData?item.selectEdbData.EdbInfoId:0,
+					DateType:item.dateType,
+					DateConfName:item.name,
+					DateChange:item.dateTransfData.map(_item=>{
+						return {
+							Year:_item.Year,
+							Month:_item.Month,
+							Day:_item.Day,
+							Frequency:_item.Frequency,
+							FrequencyDay:_item.FrequencyDay,
+							ChangeType:_item.ChangeType
+						}
+					})
+				}
+			})
+			params.SeriesList=opt.seriesData.map(item=>{
+				let edbArr=item.edbList.map(_item=>{
+					const inRefrenceDataConf=params.DateConfList.some(i=>i.DateConfName===_item.refrenceDateName)
+					return {
+						ChartSeriesEdbMappingId:_item.ChartSeriesEdbMappingId||0,
+						ChartSeriesId:_item.ChartSeriesId||0,
+						EdbInfoId:_item.selectEdbData.EdbInfoId,
+						DateConfName:!inRefrenceDataConf?'':_item.refrenceDateName,
+						DateConfType:!inRefrenceDataConf?0:_item.dateType,
+						DateConf:{
+							MoveForward:_item.MoveForward,
+							DateChange:_item.dateTransfData.map(_e=>{
+								return {
+									Year:_e.Year,
+									Month:_e.Month,
+									Day:_e.Day,
+									Frequency:_e.Frequency,
+									FrequencyDay:_e.FrequencyDay,
+									ChangeType:_e.ChangeType
+								}
+							})
+						}
+					}
+				})
+				return {
+					ChartSeriesId:0,
+					SeriesName:item.seriesName,
+					ChartStyle:item.seriesChartType,
+					ChartColor:item.ChartColor,
+					ChartWidth:Number(item.ChartWidth)||1,
+					IsPoint:item.showDataPoint?1:0,
+					IsNumber:item.showDataValue?1:0,
+					IsAxis:item.IsAxis,
+					// MaxData:'',
+					// MinData:'',
+					EdbInfoList:edbArr
+				}
+			})
+
+			return params
+		},
+		// 截面组合图预览数据
+		getSectionalCombination(opt){
+			console.log('截面组合图模块数据',opt);
+			const params=this.getSectionalCombinationParams(opt)
+			console.log('截面组合图数据params',params);
+
+			dataBaseInterface.sectionalCombinationPreviewData({
+				ExtraConfig: JSON.stringify(params)
+			}).then(res=>{
+				if(res.Ret!==200) return 
+
+				const { EdbInfoList,DataResp,ChartInfo } = res.Data;
+				this.chartInfo = {
+					...this.chartInfo,
+					ChartSource: ChartInfo.ChartSource
+				}
+
+				this.sectionalCombinationData = DataResp;
+				this.tableData = EdbInfoList;
+
+				this.chartLimit = {
+					min:DataResp.LeftMin, //左轴上下限
+					max:DataResp.LeftMax,
+					rightMin:DataResp.RightMin,//右轴上下限
+					rightMax:DataResp.RightMax,
+					rightTwoMin:DataResp.Right2Min,//右二轴上下限
+					rightTwoMax:DataResp.Right2Max,
+				}
+
+
+				//默认来源搞一下
+				this.setDefaultSourceFrom();
+			})
+		},
+
 		/* 添加图表参数 */
 		getSaveParamsByChartType(public_param) {
 			switch(this.chartInfo.ChartType) {
@@ -949,6 +1083,12 @@ export default {
 							})),
 						})
 					}
+				case 14://截面组合图
+					return {
+						...public_param,
+						ChartEdbInfoList:[],
+						ExtraConfig:JSON.stringify(this.getSectionalCombinationParams(this.$refs.sectionalCombinationIns.$data))
+					}
 			}
 		},
 
@@ -1144,7 +1284,8 @@ export default {
 			const chartTypeMap = {
         7: this.setBarChart, //柱形图
         10: this.setSectionScatterChart, //截面散点
-				11: this.setRadarChart  //雷达图
+				11: this.setRadarChart,  //雷达图
+				14:this.setSectionalCombinationChart,//截面组合图
       }
       chartTypeMap[this.chartInfo.ChartType] 
 				? chartTypeMap[this.chartInfo.ChartType]() 

+ 282 - 212
src/views/dataEntry_manage/mixins/chartPublic.js

@@ -158,7 +158,11 @@ export const chartSetMixin = {
       radarChartData: {},
 
       /* 修改对应版本信息弹窗  替换原有设置英文*/
-			isLangInfoDia: false
+			isLangInfoDia: false,
+
+      sectionalCombinationData:{},//截面组合图数据
+
+      IsHeap:false,//是否堆积
 		}
 	},
   computed:{
@@ -240,6 +244,14 @@ export const chartSetMixin = {
 			deep: true
     },
 
+    // 截面组合图
+    sectionalCombinationData: {
+      handler(newval) {
+				newval.SeriesList && this.setSectionalCombinationChart();
+			},
+			deep: true
+    },
+
     currentLang() {
       this.changeLanguage()
     }
@@ -262,214 +274,6 @@ export const chartSetMixin = {
 
       sourceMap[this.chartInfo.Source]&&sourceMap[this.chartInfo.Source]()
 		},
-    // // 打开设置英文信息弹窗
-    // async openEnNameDia(){
-    //   this.formItemArray={}
-    //   this.formItemArray.chartInfo=[]
-    //   this.formItemArray.chartsList=[]
-    //   this.formItemArray.chartInfo.push({
-    //     label:/* '图表名称' */this.$t('Chart.Detail.chart_name'),
-    //     value:this.chartInfo.ChartName,
-    //     key:'ChartName',
-    //     id:this.chartInfo.ChartInfoId,
-    //     source: this.chartInfo.Source,
-    //     notEdit:true
-    //   },
-    //   {
-    //     label:/* '英文图表名称' */this.$t('Chart.Detail.chart_en_name'),
-    //     value:this.chartInfo.ChartNameEn,
-    //     key:'ChartNameEn',
-    //     id:this.chartInfo.ChartInfoId,
-    //     placeholder:/* '请输入英文图表名称' */this.$t('Chart.InputHolderAll.input_en_name')
-    //   })
-
-    //   if([1,2,5].includes(this.chartInfo.Source)){ //需要设置指标的
-    //     this.tableData.map(item =>{
-    //       if(item.Unit){
-    //         this.formItemArray.chartsList.push([
-    //           {
-    //             label:/* '指标名称' */this.$t('Edb.Detail.e_name'),
-    //             value:item.EdbName,
-    //             key:'EdbName',
-    //             id:item.EdbInfoId,
-    //             notEdit:true
-    //           },
-    //           {
-    //             label:/* '单位' */this.$t('Edb.Detail.e_unit'),
-    //             value:item.Unit,
-    //             key:'Unit',
-    //             id:item.EdbInfoId,
-    //             notEdit:true
-    //           },
-    //           {
-    //             label:/* '英文指标名称' */this.$t('Edb.Detail.e_en_name'),
-    //             value:item.EdbNameEn,
-    //             key:'EdbNameEn',
-    //             id:item.EdbInfoId,
-    //             placeholder:/* '请输入英文指标名称' */ this.$t('Edb.InputHolderAll.input_common',{label: this.$t('Edb.Detail.e_en_name')})
-    //           },
-    //           {
-    //             label:/* '英文单位' */this.$t('Edb.Detail.e_en_unit'),
-    //             value:item.UnitEn,
-    //             key:'UnitEn',
-    //             id:item.EdbInfoId,
-    //             placeholder:/* '请输入英文单位' */this.$t('Edb.InputHolderAll.input_common',{label: this.$t('Edb.Detail.e_en_unit')})
-    //           }
-    //         ])
-    //       }else{
-    //         this.formItemArray.chartsList.push([
-    //           {
-    //             label:/* '指标名称' */this.$t('Edb.Detail.e_name'),
-    //             value:item.EdbName,
-    //             key:'EdbName',
-    //             id:item.EdbInfoId,
-    //             notEdit:true
-    //           },
-    //           {
-    //             label:/* '英文指标名称' */this.$t('Edb.Detail.e_en_name'),
-    //             value:item.EdbNameEn,
-    //             key:'EdbNameEn',
-    //             id:item.EdbInfoId,
-    //             placeholder:this.$t('Edb.InputHolderAll.input_common',{label: this.$t('Edb.Detail.e_en_name')})
-    //           }
-    //         ])
-    //       }
-    //     })
-    //   }
-
-    //   //价格曲线
-    //   if(this.chartInfo.Source===2) {
-    //     this.formItemArray.chartInfo.push({
-    //       label:/* '期货名称' */this.$t('Chart.Detail.good_name'),
-    //       value:this.commodityEdbList[1].EdbName,
-    //       key:'FutureGoodName',
-    //       id:this.chartInfo.ChartInfoId,
-    //       notEdit:true
-    //     },
-    //     {
-    //       label:/* '英文期货名称' */this.$t('Chart.Detail.good_en_name'),
-    //       value:this.commodityEdbList[1].EdbNameEn,
-    //       key:'FutureGoodNameEn',
-    //       id:this.chartInfo.ChartInfoId,
-    //       placeholder:/* '请输入英文期货名称' */this.$t('Chart.InputHolderAll.input_common',{label:this.$t('Chart.Detail.good_en_name')})
-    //     })
-    //   }
-
-    //   //利润曲线
-    //   else if(this.chartInfo.Source===5) {
-    //     this.formItemArray.chartInfo.push({
-    //       label:/* '盘面利润名称' */this.$t('Chart.Detail.profit_name'),
-    //       value:this.chartInfo.ProfitName,
-    //       key:'ProfitName',
-    //       id:this.chartInfo.ChartInfoId,
-    //       notEdit:true
-    //     },
-    //     {
-    //       label:/* '英文盘面利润名称' */this.$t('Chart.Detail.profit_en_name'),
-    //       value:this.chartInfo.ProfitNameEn,
-    //       key:'ProfitNameEn',
-    //       id:this.chartInfo.ChartInfoId,
-    //       placeholder:/* '请输入英文盘面利润名称' */this.$t('Chart.InputHolderAll.input_common',{label:this.$t('Chart.Detail.profit_en_name')})
-    //     })
-    //   }
-
-    //   //跨品种分析
-    //   else if(this.chartInfo.Source===10) {
-    //     let { Data } = await crossVarietyInterface.chartLangOption({ChartInfoId: this.chartInfo.ChartInfoId})
-
-    //     const { TagList,VarietyList } = Data;
-
-    //     this.formItemArray.chartInfo.push({
-    //       label:/* 'X轴名称' */this.$t('Chart.Detail.x_name'),
-    //       value:this.crossVarietyChartData.XName,
-    //       key:'XName',
-    //       id:TagList[0].ChartTagId,
-    //       notEdit:true
-    //     },
-    //     {
-    //       label:/* '英文X轴名称' */this.$t('Chart.Detail.x_en_name'),
-    //       value:this.crossVarietyChartData.XNameEn,
-    //       key:'XNameEn',
-    //       id:TagList[0].ChartTagId,
-    //       placeholder:/* '请输入英文X轴名称' */this.$t('Chart.InputHolderAll.input_common',{label:this.$t('Chart.Detail.x_en_name')})
-    //     },{
-    //       label:/* 'Y轴名称' */this.$t('Chart.Detail.y_name'),
-    //       value:this.crossVarietyChartData.YName,
-    //       key:'YName',
-    //       id:TagList[1].ChartTagId,
-    //       notEdit:true
-    //     },
-    //     {
-    //       label:/* '英文Y轴名称' */this.$t('Chart.Detail.y_en_name'),
-    //       value:this.crossVarietyChartData.YNameEn,
-    //       key:'YNameEn',
-    //       id:TagList[1].ChartTagId,
-    //       placeholder:/* '请输入英文Y轴名称' */this.$t('Chart.InputHolderAll.input_common',{label:this.$t('Chart.Detail.y_en_name')})
-    //     })
-
-    //     VarietyList.forEach(item => {
-    //       this.formItemArray.chartsList.push([
-    //         {
-    //           label:/* '品种名称' */this.$t('Chart.Detail.variety_name'),
-    //           value:item.ChartVarietyName,
-    //           key:'ChartVarietyName',
-    //           id:item.ChartVarietyId,
-    //           notEdit:true
-    //         },
-    //         {
-    //           label:/* '英文品种名称' */this.$t('Chart.Detail.variety_en_name'),
-    //           value:item.ChartVarietyNameEn,
-    //           key:'ChartVarietyNameEn',
-    //           id:item.ChartVarietyId,
-    //           placeholder:/* '请输入英文品种名称' */this.$t('Chart.InputHolderAll.input_common',{label:this.$t('Chart.Detail.variety_en_name')})
-    //         }
-    //       ])
-    //     })
-    //   }
-
-
-    //   this.setEnName = true
-    // },
-    // // 更新英文信息
-    // async updateEnName(enNameData){
-    //   // console.log(enNameData)
-    //   let res=null
-    //   if([2,5].includes(this.chartInfo.Source)){//商品价格
-    //     res=await futuresInterface.editChartEn({
-    //       ChartInfoId: enNameData.ChartInfoId,
-    //       ChartNameEn: enNameData.ChartNameEn,
-    //       UnitEn: enNameData.ChartEdbInfoList[0].UnitEn || '',
-    //       EdbNameEn: enNameData.ChartEdbInfoList[0].EdbNameEn || '',
-    //       FutureGoodNameEn: enNameData.FutureGoodNameEn || '',
-    //       ProfitNameEn: enNameData.ProfitNameEn || ''
-    //     })
-    //   }else if(this.chartInfo.Source===3){//相关性
-    //     res=await chartRelevanceApi.editChartEn({
-    //       ChartInfoId: enNameData.ChartInfoId,
-    //       ChartNameEn: enNameData.ChartNameEn
-    //     })
-    //   }else if(this.chartInfo.Source===6){//拟合方程
-    //     res=await fittingEquationInterface.editChartEn({
-    //       ChartInfoId: enNameData.ChartInfoId,
-    //       ChartNameEn: enNameData.ChartNameEn
-    //     })
-    //   }else if([7,8,9].includes(this.chartInfo.Source)){//统计特征
-    //     res=await statisticFeatureInterface.editChartEn({
-    //       ChartInfoId: enNameData.ChartInfoId,
-    //       ChartNameEn: enNameData.ChartNameEn
-    //     })
-    //   }else if(this.chartInfo.Source === 10) {//跨品种分析
-    //     res=await crossVarietyInterface.editChartEn(enNameData)
-    //   }else{
-    //     res = await dataBaseInterface.chartInfoEditEn(enNameData)
-    //   }
-
-		// 	if(res.Ret !==200) return
-
-		// 	this.$message.success(this.$t('MsgPrompt.edit_msg'))
-    //   this.getChartInfo()
-		// 	this.setEnName = false
-    // },
 
     /* 打开编辑信息弹窗 */
     async openLangInfoDia() {
@@ -1074,7 +878,8 @@ export const chartSetMixin = {
           borderWidth: 1,
           borderColor: item.ChartColor,
           zIndex: (this.chartInfo.ChartType === 6 && ['line','spline'].includes(item.ChartStyle)) ? 1 : 0, //防止组合图曲线被遮住
-          ...predict_params
+          ...predict_params,
+          stacking:this.chartInfo.ChartType==6&&!this.IsHeap?undefined:'normal',
         };
         item.DataList = item.DataList || [];
         for (let i of item.DataList) {
@@ -2259,6 +2064,263 @@ export const chartSetMixin = {
       this.currentLang=='en' && this.changeOptions()
     },
 
+    // 截面组合图渲染配置
+    setSectionalCombinationChart(){
+      const {XDataList,UnitList,SeriesList,IsHeap}=this.sectionalCombinationData
+      /* 主题样式*/
+      const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+      
+      this.leftIndex = SeriesList.findIndex((item) => item.IsAxis===1);
+      this.rightIndex = SeriesList.findIndex((item) => !item.IsAxis);
+      this.rightTwoIndex = SeriesList.findIndex((item) => item.IsAxis ===2);
+
+      //x轴
+      const xAxis={
+        categories:XDataList.map(_=>this.currentLang=='en'?_.NameEn:_.Name),
+        tickWidth: 1,
+        labels: {
+          style:{
+            ...chartTheme&&chartTheme.xAxisOptions.style
+          },
+        },
+        plotBands: this.setAxisPlotAreas(3),
+        plotLines: this.setAxisPlotLines(3)
+      }
+
+      let yAxis=[]
+      let seriesData=[]
+
+      //有右二轴时排个序 按照左 右 右2的顺序
+      const chartData = SeriesList.some(_ =>_.IsAxis===2) ? this.changeEdbOrder(SeriesList) : _.cloneDeep(SeriesList);
+      chartData.forEach((item,index)=>{
+        //轴位置值相同的下标
+        const sameSideIndex = chartData.findIndex(
+          (i) => i.IsAxis === item.IsAxis
+        );
+
+        const yTitleMap={
+          1:['LeftName','LeftNameEn'],
+          0:['RightName','RightNameEn'],
+          2:['RightTwoName','RightTwoNameEn'],
+        }
+
+        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
+        }
+
+        let yItem = {
+          ...basicYAxis,
+          title: {
+            text: UnitList[yTitleMap[item.IsAxis][0]],
+            textCh:UnitList[yTitleMap[item.IsAxis][0]], // 中文
+            // 中文不存在,无论英文有无都显示空
+            textEn:UnitList[yTitleMap[item.IsAxis][0]]?UnitList[yTitleMap[item.IsAxis][1]]:'', // 英文
+            style:{
+              ...chartTheme&&chartTheme.yAxisOptions.style
+            },
+            align: 'high',
+            rotation: 0,
+            y: -12,
+            // x: (item.IsAxis===0 && this.rightTwoIndex>-1) ? -chartData[this.rightTwoIndex].Unit.length*12 : 0,
+            textAlign: item.IsAxis===1 ? 'left' : 'right',
+            reserveSpace: false
+          },
+          labels: {
+            formatter: function (ctx) {
+              return ctx.value;
+            },
+            align: 'center',
+            x: [0,2].includes(item.IsAxis) ? 5 : -5,
+            style: {
+              ...chartTheme&&chartTheme.yAxisOptions.style,
+            }
+          },
+          opposite: [0,2].includes(item.IsAxis),
+          min: Number(minLimit),
+          max: Number(maxLimit),
+          tickWidth: 1,
+          visible: sameSideIndex === index,
+          plotBands: this.setAxisPlotAreas(item.IsAxis),
+          plotLines: this.setAxisPlotLines(item.IsAxis)
+        };
+
+        //堆叠图的yAxis必须一致 数据列所对应的y轴
+        let serie_yIndex = index;
+        if(IsHeap==1) {
+          // 类型为堆叠图时公用第一个指标y轴 
+          serie_yIndex =  0;
+        }
+
+        //数据列
+        let dataArr=item.DataList||[]
+        // 根据NoDataEdbIndex 将对应位置的值置为null
+        dataArr.forEach((i,index)=>{
+          if(item.NoDataEdbIndex.includes(index)){
+            dataArr[index]=null
+          }
+        })
+        //图表可配置的线条数就10条,第11条用第1条的配置,索引取下模
+				const lineIndex = chartTheme ? index%chartTheme.lineOptionList.length : index
+        let obj={
+          data:dataArr,
+          type: item.ChartStyle||'',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[lineIndex].dashStyle)||'Solid',
+          chartType:'linear',
+          yAxis: serie_yIndex,
+          name:item.SeriesName,
+          nameCh:item.SeriesName,
+          nameEn:item.SeriesNameEn,
+          unitName:UnitList[yTitleMap[item.IsAxis][0]],
+          unitNameCh:UnitList[yTitleMap[item.IsAxis][0]],
+          unitNameEn:UnitList[yTitleMap[item.IsAxis][0]]?UnitList[yTitleMap[item.IsAxis][1]]:'',
+          color: item.ChartColor,
+          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptionList[lineIndex].lineWidth),
+          borderWidth: 1,
+          borderColor: item.ChartColor,
+          marker: {//展示数据点
+            enabled:item.ChartStyle!='column'&&item.IsPoint?true:false,
+            radius: (chartTheme&&chartTheme.lineOptionList[lineIndex].radius)||5,
+          },
+          dataLabels: {//展示数值
+            enabled: item.IsNumber?true:false,
+            align:item.ChartStyle=='column'?'center':undefined,
+            y:item.ChartStyle=='column'?-20:0,
+            inside: item.ChartStyle=='column'?false:undefined,
+            crop: item.ChartStyle=='column'?false:true,
+          },
+          stacking:IsHeap==1?'normal':undefined,
+          zIndex: ['line','spline'].includes(item.ChartStyle) ? 1 : 0, //防止组合图曲线被遮住
+        }
+
+        yAxis.push(yItem)
+        seriesData.push(obj)
+      })
+
+      const tooltip={
+        formatter:function () { 
+          let str=`<b>${this.points[0].x}</b>`
+          this.points.forEach(item=>{
+            const sObj=seriesData.find(_=>_.name===item.series.name)
+            str=str+`<br><span style="color:${item.color}">\u25CF</span>${sObj.name}:${item.y} ${sObj.unitNameCh}`
+          })
+          return str
+        },
+        formatterCh:function () { 
+          let str=`<b>${this.points[0].x}</b>`
+          this.points.forEach(item=>{
+            const sObj=seriesData.find(_=>_.name===item.series.name)
+            str=str+`<br><span style="color:${item.color}">\u25CF</span>${sObj.nameCh}:${item.y} ${sObj.unitNameCh}`
+          })
+          return str
+        },
+        formatterEn:function () { 
+          let str=`<b>${this.points[0].x}</b>`
+          this.points.forEach(item=>{
+            const sObj=seriesData.find(_=>_.name===item.series.name)
+            str=str+`<br><span style="color:${item.color}">\u25CF</span>${sObj.nameEn}:${item.y} ${sObj.unitNameEn}`
+          })
+          return str
+        },
+        shared:true
+      }
+
+      this.options = {
+        title: {
+          text:''
+        },
+        tooltip,
+        series: seriesData,
+        yAxis: yAxis,
+        xAxis,
+      };
+      if(this.currentLang=='en') this.changeOptions()
+
+    },
+    // 截面组合图初始化
+    initSectionalCombinationChart(data){
+      const { EdbInfoList,DataResp,ChartInfo } = data;
+      this.sectionalCombinationData = DataResp;
+      this.chartLimit = {
+        min:DataResp.LeftMin, //左轴上下限
+        max:DataResp.LeftMax,
+        rightMin:DataResp.RightMin,//右轴上下限
+        rightMax:DataResp.RightMax,
+        rightTwoMin:DataResp.Right2Min,//右二轴上下限
+        rightTwoMax:DataResp.Right2Max,
+      }
+      this.IsHeap=DataResp.IsHeap?true:false
+
+
+      //默认来源搞一下
+      this.setDefaultSourceFrom();
+      this.setSectionalCombinationChart()
+    },
+    // 截面组合图渲染更新
+    handleUpdateSectionalCombinationChart(e){
+      // console.log(e);
+      // console.log(this.sectionalCombinationData);
+      if(e.type==='isAxis'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.IsAxis=item.IsAxis
+            }
+          })
+        })
+        // 更新上下限
+        this.calcYAxislimit(this.sectionalCombinationData.SeriesList)
+      }else if(e.type==='chartType'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.ChartStyle=item.seriesChartType
+            }
+          })
+        })
+      }else if(e.type==='dataPoint'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.IsPoint=item.showDataPoint?1:0
+            }
+          })
+        })
+      }else if(e.type==='dataValue'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.IsNumber=item.showDataValue?1:0
+            }
+          })
+        })
+      }else if(e.type==='ChartColor'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.ChartColor=item.ChartColor
+            }
+          })
+        })
+      }else if(e.type==='ChartWidth'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.ChartWidth=item.ChartWidth
+            }
+          })
+        })
+      }
+
+      this.setSectionalCombinationChart()
+    },
+
     //雷达图数据初始化
     initRadarData(data) {
       const { DataResp,EdbInfoList,ChartInfo } = data;
@@ -2923,7 +2985,8 @@ export const chartSetMixin = {
         6: this.setStackOrCombinChart,
         7: this.setBarChart,
         10: this.setSectionScatterChart,
-        11: this.setRadarChart
+        11: this.setRadarChart,
+        14: this.setSectionalCombinationChart
       }
       //其他source
       const sourceMap = {
@@ -3160,7 +3223,7 @@ export const chartSetMixin = {
         },
         //图表详情-设置图表上下限
         setLimitData(tableData=[]){
-            if([7,10,11].includes(this.chartInfo.ChartType)) return
+            if([7,10,11,14].includes(this.chartInfo.ChartType)) return
             const {
                 //左右轴极值字段 
                 LeftMin=0,LeftMax=0,
@@ -3222,6 +3285,13 @@ export const chartSetMixin = {
                 }
             }
         },
+
+    // 柱形堆积控制
+    handleHeapChange(){
+      this.options.series.forEach(item=>{
+        item.stacking=this.IsHeap?'normal':undefined
+      })
+    },
     /*-------------------- */
 	}
 }

+ 19 - 26
src/views/dataEntry_manage/onlineExcelCopy.vue

@@ -12,18 +12,18 @@
       </div>
       <div class="data-options" >
         <el-form :model="dataForm" label-position="top" ref="dataOptions">
-          <el-form-item :label="$t('ManualEntryPage.label_one_level_classify')" prop="firstClassify" :rules="[{required:true,message:'一级分类不能为空',trigger:'change'}]">
-            <el-select v-model="dataForm.firstClassify" placeholder="请选择一级分类" style="width: 100%;" @change="changeFirstClassify">
+          <el-form-item :label="$t('ManualEntryPage.label_one_level_classify')" prop="firstClassify" :rules="[{required:true,message:'品种不能为空',trigger:'change'}]">
+            <el-select v-model="dataForm.firstClassify" placeholder="请选择品种" style="width: 100%;" @change="changeFirstClassify">
               <el-option :label="item.ClassifyName" :value="item.ClassifyId" v-for="item in classifyArray" :key="item.ClassifyId"></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item :label="$t('ManualEntryPage.label_edb_classify')" prop="secondClassify" :rules="[{required:true,message:'指标分类不能为空',trigger:'change'}]">
-            <el-select v-model="dataForm.secondClassify" placeholder="请选择指标分类" style="width: 100%;" @change="changeSecondClassify">
+          <el-form-item :label="$t('ManualEntryPage.label_edb_classify')" prop="secondClassify" :rules="[{required:true,message:'子品种不能为空',trigger:'change'}]">
+            <el-select v-model="dataForm.secondClassify" placeholder="请选择子品种" style="width: 100%;" @change="changeSecondClassify">
               <el-option :label="item.ClassifyName" :value="item.ClassifyId" v-for="item in secondClassifyArray" :key="item.ClassifyId"></el-option>
             </el-select>
           </el-form-item>
           <el-form-item :label="$t('Edb.Detail.e_fre')" prop="frequency" :rules="[{required:true,message:'频度不能为空',trigger:'change'}]">
-            <el-select v-model="dataForm.frequency" placeholder="请选择频度" style="width: 100%;" @change="changeFrequency">
+            <el-select v-model="dataForm.frequency" :placeholder="$t('Edb.InputHolderAll.input_fre')" style="width: 100%;" @change="changeFrequency">
               <el-option :label="item.label" :value="item.value" v-for="item in frequencyList" :key="item.value"></el-option>
             </el-select>
           </el-form-item>
@@ -173,14 +173,14 @@ export default {
     }
   },
 created() {
-    this.dataForm.firstClassify = parseInt(this.$route.query.parentClassifyId) || ''
-    this.dataForm.secondClassify = parseInt(this.$route.query.ClassifyId) || ''
-    this.dataForm.frequency = this.$route.query.Frequency || ''
-    this.dataForm.tradeCode = this.$route.query.TradeCode || ''
-    this.dataForm.tradeName = this.$route.query.TradeName || ''
-    this.copyDataForm = JSON.parse(JSON.stringify(this.dataForm))
-    // 字符串
-    this.isEdit = this.$route.query.isEdit.toString()
+    // this.dataForm.firstClassify = parseInt(this.$route.query.parentClassifyId) || ''
+    // this.dataForm.secondClassify = parseInt(this.$route.query.ClassifyId) || ''
+    // this.dataForm.frequency = this.$route.query.Frequency || ''
+    // this.dataForm.tradeCode = this.$route.query.TradeCode || ''
+    // this.dataForm.tradeName = this.$route.query.TradeName || ''
+    // this.copyDataForm = JSON.parse(JSON.stringify(this.dataForm))
+    // // 字符串
+    // this.isEdit = this.$route.query.isEdit.toString()
     this.initExcelOptions()
     // 监听折叠导航栏事件
     EventBus.$off('collapseHandle')
@@ -189,14 +189,6 @@ created() {
       luckysheet.create(this.options)
     })
   },
-  beforeRouteEnter(to, from, next){
-    if(to.query.isEdit=='true'){
-      to.matched[1].name='编辑excel数据'
-    }else{
-      to.matched[1].name='复制excel数据'
-    }
-    next()
-  },
   beforeRouteLeave(to, from, next) {
     luckysheet.destroy()
     next();
@@ -550,12 +542,13 @@ created() {
       let res=await dataInterence.getClassify()
       if(res.Ret===200){
         this.classifyArray = res.Data.List || []
-        let item = this.classifyArray.find(item => item.ClassifyId == this.dataForm.firstClassify)
-        this.firstClassName = item && item.ClassifyName
-        this.secondClassifyArray = item ? item.Child : []
+        
+        this.dataForm.firstClassify = this.classifyArray[0].ClassifyId;
+        this.firstClassName = this.classifyArray[0].ClassifyName
+        this.secondClassifyArray = this.classifyArray[0] ? this.classifyArray[0].Child : []
         if(this.secondClassifyArray.length>0){
-          let item2 = this.secondClassifyArray.find(item => item.ClassifyId == this.dataForm.secondClassify)
-          this.secondClassName = item2 && item2.ClassifyName
+          this.dataForm.secondClassify = this.secondClassifyArray[0].ClassifyId;
+          this.secondClassName = this.secondClassifyArray[0].ClassifyName
         }
       }
     },

+ 9 - 0
src/views/datasheet_manage/components/dateMoveWaySection.vue

@@ -76,6 +76,11 @@
 </template>
 <script>
 export default {
+  props:{
+    defaultArr:{
+      default:()=>[]
+    }
+  },
   computed: {
     frequencyDaysOptions() {
       let typeMap = {
@@ -119,6 +124,10 @@ export default {
       
     }
   },
+  created() {
+    console.log('日期变换组件加载',this.defaultArr);
+    this.initData(this.defaultArr)
+  },
   methods:{
     /* 提加日期变换数组 */
     addDateChange() {

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

@@ -707,13 +707,14 @@ export default {
 
         this.showData = true;
         this.treeData = Data.AllNodes || [];
+
         this.$nextTick(() => {
           /* 新增完成后 处理树展开和选中 */
           params && this.selectCurrentNode(params);
         });
       });
       // 更新一下分类把 新增平衡表时要
-      if([3,5].includes(this.sourceMap[this.$route.path])){
+      if([2,3,5].includes(this.sourceMap[this.$route.path])){
         this.getBalanceClassifyOpts()
       }
     },

+ 1 - 1
src/views/futures_manage/chartEditor.vue

@@ -365,7 +365,7 @@ export default {
 						basisEdb:BarChartInfo.BaseEdbInfoId
 					};
 					if(ChartInfo.Source===5){
-						XDataList=DataResp.Extra.XDataList
+						XDataList=DataResp.XDataList
 					}
 
 					// this.tableData = [EdbInfoList[0]];

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

@@ -667,6 +667,10 @@ export default {
 
             //雷达图
             this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
+
+            // 截面组合图
+					  this.chartInfo.ChartType===14&&this.initSectionalCombinationChart(res.Data);
+
           }else if([2,5].includes(this.chartInfo.Source)) {
             // this.tableData = [res.Data.EdbInfoList[0]];
             this.tableData=res.Data.EdbInfoList.filter(_e=>_e.Source)
@@ -909,7 +913,7 @@ export default {
         if (res.Ret !== 200) return
         this.$message.success(res.Msg);
 
-        Source===1&&![7,10,11].includes(ChartType) 
+        Source===1&&![7,10,11,14].includes(ChartType) 
           ? this.getPreviewChartInfo() 
           : this.getChartDetail(UniqueCode);
     },

+ 169 - 3
src/views/ppt_manage/mixins/mixins.js

@@ -91,7 +91,9 @@ export default {
       crossVarietyChartData: {},
 
       /* 雷达图 */
-      radarChartData: {}
+      radarChartData: {},
+
+      IsHeap:false,//是否堆积
     }
   },
   methods: {
@@ -105,12 +107,175 @@ export default {
         3: this.setStackOrCombinChart,
         4: this.setStackOrCombinChart,
         5: this.setScatterChart,
-        6: this.setStackOrCombinChart
+        6: this.setStackOrCombinChart,
+        14: this.setSectionalCombinationChart
       };
 
       chartSetMap[this.chartInfo.ChartType]&&chartSetMap[this.chartInfo.ChartType]()
     },
 
+    // 截面组合图渲染配置
+    setSectionalCombinationChart(){
+      const {XDataList,UnitList,SeriesList,IsHeap}=this.sectionalCombinationData
+      /* 主题样式*/
+      const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+      
+      this.leftIndex = SeriesList.findIndex((item) => item.IsAxis===1);
+      this.rightIndex = SeriesList.findIndex((item) => !item.IsAxis);
+      this.rightTwoIndex = SeriesList.findIndex((item) => item.IsAxis ===2);
+
+      //x轴
+      const xAxis={
+        categories:XDataList.map(_=>this.currentLang=='en'?_.NameEn:_.Name),
+        tickWidth: 1,
+        labels: {
+          style:{
+            ...chartTheme&&chartTheme.xAxisOptions.style
+          },
+        },
+        plotBands: this.setAxisPlotAreas(3),
+        plotLines: this.setAxisPlotLines(3)
+      }
+
+      let yAxis=[]
+      let seriesData=[]
+
+      //有右二轴时排个序 按照左 右 右2的顺序
+      const chartData = SeriesList.some(_ =>_.IsAxis===2) ? this.changeEdbOrder(SeriesList) : _.cloneDeep(SeriesList);
+      chartData.forEach((item,index)=>{
+        //轴位置值相同的下标
+        const sameSideIndex = chartData.findIndex(
+          (i) => i.IsAxis === item.IsAxis
+        );
+
+        const yTitleMap={
+          1:['LeftName','LeftNameEn'],
+          0:['RightName','RightNameEn'],
+          2:['RightTwoName','RightTwoNameEn'],
+        }
+
+        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
+        }
+
+        let yItem = {
+          ...basicYAxis,
+          title: {
+            text: UnitList[yTitleMap[item.IsAxis][0]],
+            textCh:UnitList[yTitleMap[item.IsAxis][0]], // 中文
+            // 中文不存在,无论英文有无都显示空
+            textEn:UnitList[yTitleMap[item.IsAxis][0]]?UnitList[yTitleMap[item.IsAxis][1]]:'', // 英文
+            style:{
+              ...chartTheme&&chartTheme.yAxisOptions.style
+            },
+            align: 'high',
+            rotation: 0,
+            y: -12,
+            // x: (item.IsAxis===0 && this.rightTwoIndex>-1) ? -chartData[this.rightTwoIndex].Unit.length*12 : 0,
+            textAlign: item.IsAxis===1 ? 'left' : 'right',
+            reserveSpace: false
+          },
+          labels: {
+            formatter: function (ctx) {
+              return ctx.value;
+            },
+            align: 'center',
+            x: [0,2].includes(item.IsAxis) ? 5 : -5,
+            style: {
+              ...chartTheme&&chartTheme.yAxisOptions.style,
+            }
+          },
+          opposite: [0,2].includes(item.IsAxis),
+          min: Number(minLimit),
+          max: Number(maxLimit),
+          tickWidth: 1,
+          visible: sameSideIndex === index,
+          plotBands: this.setAxisPlotAreas(item.IsAxis),
+          plotLines: this.setAxisPlotLines(item.IsAxis)
+        };
+
+        //堆叠图的yAxis必须一致 数据列所对应的y轴
+        let serie_yIndex = index;
+        if(IsHeap==1) {
+          // 类型为堆叠图时公用第一个指标y轴 
+          serie_yIndex =  0;
+        }
+
+        //数据列
+        let dataArr=item.DataList||[]
+        // 根据NoDataEdbIndex 将对应位置的值置为null
+        dataArr.forEach((i,index)=>{
+          if(item.NoDataEdbIndex.includes(index)){
+            dataArr[index]=null
+          }
+        })
+        //图表可配置的线条数就10条,第11条用第1条的配置,索引取下模
+				const lineIndex = chartTheme ? index%chartTheme.lineOptionList.length : index
+        let obj={
+          data:dataArr,
+          type: item.ChartStyle||'',
+          chartType:'linear',
+          yAxis: serie_yIndex,
+          name:item.SeriesName,
+          nameCh:item.SeriesName,
+          nameEn:item.SeriesNameEn,
+          color: item.ChartColor,
+          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptionList[lineIndex].lineWidth),
+          borderWidth: 1,
+          borderColor: item.ChartColor,
+          marker: {//展示数据点
+            enabled:item.ChartStyle!='column'&&item.IsPoint?true:false,
+            radius: (chartTheme&&chartTheme.lineOptionList[lineIndex].radius)||5,
+          },
+          dataLabels: {//展示数值
+            enabled: item.IsNumber?true:false,
+            align:item.ChartStyle=='column'?'center':undefined,
+            y:item.ChartStyle=='column'?-20:0,
+            inside: item.ChartStyle=='column'?false:undefined,
+            crop: item.ChartStyle=='column'?false:true,
+          },
+          stacking:IsHeap==1?'normal':undefined,
+          zIndex: ['line','spline'].includes(item.ChartStyle) ? 1 : 0, //防止组合图曲线被遮住
+        }
+
+        yAxis.push(yItem)
+        seriesData.push(obj)
+      })
+
+      this.options = {
+        title: {
+          text:''
+        },
+        series: seriesData,
+        yAxis: yAxis,
+        xAxis,
+      };
+
+    },
+    // 截面组合图初始化
+    initSectionalCombinationChart(data){
+      const { EdbInfoList,DataResp,ChartInfo } = data;
+      this.sectionalCombinationData = DataResp;
+      this.chartLimit = {
+        min:DataResp.LeftMin, //左轴上下限
+        max:DataResp.LeftMax,
+        rightMin:DataResp.RightMin,//右轴上下限
+        rightMax:DataResp.RightMax,
+        rightTwoMin:DataResp.Right2Min,//右二轴上下限
+        rightTwoMax:DataResp.Right2Max,
+      }
+      this.IsHeap=DataResp.IsHeap?true:false
+
+      this.setSectionalCombinationChart()
+    },
+
     /* 曲线 */
     setDefaultChart() {
 
@@ -408,7 +573,8 @@ export default {
           borderWidth: 1,
           borderColor: item.ChartColor,
           zIndex: (this.chartInfo.ChartType === 6 && ['line','spline'].includes(item.ChartStyle)) ? 1 : 0, //防止组合图曲线被遮住
-          ...predict_params
+          ...predict_params,
+          stacking:this.chartInfo.ChartType==6&&!this.IsHeap?undefined:'normal',
         };
         item.DataList = item.DataList || [];
         for (let i of item.DataList) {

+ 10 - 1
src/views/ppt_manage/mixins/pptMixins.js

@@ -299,7 +299,16 @@ export default {
         //雷达图
         this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
 
-        Data.Status && ![7,10].includes(this.chartInfo.ChartType) && this.setOptions();
+        //截面组合图
+        this.chartInfo.ChartType===14 && this.initSectionalCombinationChart(res.Data)
+
+        // 时序组合图控制是否堆叠
+        if(this.chartInfo.ChartType===6){
+          this.IsHeap=res.Data.DataResp.IsHeap===1?true:false
+        }
+        
+
+        Data.Status && ![7,10,14].includes(this.chartInfo.ChartType) && this.setOptions();
         Data.Status&&this.setOptionsLang(currentLang)
       }else if([2,5].includes(this.chartInfo.Source)) { //商品价格图
         this.chartInfo = Data.ChartInfo.Source===5 ? {

+ 19 - 3
src/views/predictEdb_manage/components/operationDialog.vue

@@ -253,6 +253,17 @@
 						<el-form-item :label="$t('Edb.Detail.source')" v-if="[69,70].includes(type)" style="width:50%">
 							<span>{{type===69?'标准差':'百分比'}}</span>
 						</el-form-item>
+
+						<el-form-item :label="$t('EtaBasePage.null_val_deal')" prop="emptyType" v-if="type===45">
+							<el-select
+								v-model="formData.emptyType"
+								:placeholder="$t('Edb.InputHolderAll.input_fre')"
+								style="width: 340px"
+							>
+								<el-option :label="$t('EtaBasePage.null_val_deal_2')" :value="0"></el-option>
+								<el-option :label="$t('EtaBasePage.null_val_deal_3')" :value="3"></el-option>
+							</el-select>
+						</el-form-item>
 					</el-form>
 				</div>
 			</div>
@@ -313,6 +324,7 @@ export default {
 					moveVal:backData.moveVal,
 					calendar_type:backData.calendar_type,
 					value_type: this.type === 54 ? backData.formula : '期末值',
+					emptyType:backData.emptyType||0
 				}
 				this.getDataList();
 
@@ -428,7 +440,8 @@ export default {
 				moveUnit: '天',
 				moveVal: '',
 				calendar_type: '公历',
-				value_type: '期末值'
+				value_type: '期末值',
+				emptyType:0
 			},
 			options: [],
 			//frequencyArr: ['日度', '周度','旬度', '月度', '季度', '年度'],
@@ -597,7 +610,8 @@ export default {
 				moveUnit: '天',
 				moveVal: '',
 				calendar_type: '公历',
-				value_type: '期末值'
+				value_type: '期末值',
+				emptyType:0,
 			};
 			this.$refs.form.resetFields();
 		},
@@ -625,6 +639,7 @@ export default {
 					MoveFrequency: this.formData.moveUnit,
 					MoveType: this.formData.moveType, 
 					Calendar: this.formData.calendar_type,
+					EmptyType:this.formData.emptyType
 				}
 
 				/* 编辑 */
@@ -696,7 +711,8 @@ export default {
 				moveUnit: '天',
 				moveVal: '',
 				calendar_type: this.formData.calendar_type,
-				value_type: this.formData.value_type
+				value_type: this.formData.value_type,
+				emptyType:0,
 			}
 		},
 

+ 1 - 0
src/views/predictEdb_manage/predictEdb.vue

@@ -1273,6 +1273,7 @@ export default {
 					moveUnit: MoveFrequency,
 					moveVal: Source === 46 ? CalculateFormula : '',
 					calendar_type: Source === 49 ? Calendar : '',
+					emptyType:EmptyType
 				}
 
 				if([72,73].includes(Source)){

+ 0 - 1059
src/views/report_manage/addreportNew.vue

@@ -1,1059 +0,0 @@
-<template>
-	<div id="addreport">
-		<div 
-			id="leftfroala" 
-			:class="{'full':!isRightFormShow,'block':isRightFormShow}"
-			v-loading="importChartNum>0" 
-			:element-loading-text="$t('ReportManage.ReportList.chart_insertion_progress')"
-			element-loading-spinner="el-icon-loading"
-			element-loading-background="rgba(0, 0, 0, 0.8)"
-		>
-			<froala
-				id="froala-editor"
-				ref="froalaEditor"
-				:tag="'textarea'"
-				:config="CNEditorConfig"
-				v-model="aeForm.content"
-			></froala>
-		</div>
-		<div id="rightitems" v-show="isRightFormShow">
-			<!-- 通过接口判断是否走审批流,按钮显示的不一致,干脆判断完成再显示所有按钮-->
-			<div v-if="!pageLoading"
-				style="
-					text-align: right;
-					padding: 0px 0 15px 0;
-					box-sizing: border-box;
-				"
-			>
-				<div v-show="lastsavetime" style="color: #666; margin-bottom: 15px">
-					{{$t('ReportManage.ReportList.last_save_time')}}:{{ lastsavetime }}
-				</div>
-				<el-button
-					type="primary"
-					size="medium"
-					plain
-					@click.native="refreshReport"
-				>
-					{{$t('ReportManage.ReportList.click_refresh_btn')}}
-				</el-button>
-				<el-button v-permission="permissionBtn.reportManageBtn.reportManage_reportView"
-					type="primary"
-					size="medium"
-					plain
-					@click.native="clickreportadd('yl')"
-					>{{$t('ReportManage.ReportList.preview_btn')}}</el-button
-				>
-				<el-button
-					type="primary"
-					size="medium"
-					plain
-					@click.native="clickreportadd('cg')"
-					>{{$t('ReportManage.ReportList.save_draft_btn')}}</el-button
-				>
-				<!--不走审批流-->
-				<template v-if="!isApprove||!hasApproveFlow">
-					<el-button v-permission="permissionBtn.reportManageBtn.reportManage_publish"
-						type="primary"
-						size="medium"
-						:disabled="checkLoading"
-						@click.native="clickreportadd('dsfb')"
-						>{{$t('ReportManage.ReportList.scheduled_publish_btn')}}</el-button
-					>
-					<el-button v-permission="permissionBtn.reportManageBtn.reportManage_publish"
-						type="primary"
-						size="medium"
-						:disabled="checkLoading"
-						@click.native="clickreportadd('fb')"
-						:loading="isPublishloading"
-						>{{$t('ReportManage.ReportList.publish_btn')}}</el-button
-					>
-				</template>
-				<template v-if="isApprove&&hasApproveFlow">
-					<el-button v-permission="permissionBtn.reportManageBtn.reportManage_publish"
-						:disabled="checkLoading"
-						type="primary" size="medium" @click="clickreportadd('submit')">{{$t('ReportManage.ReportList.submission_btn')}}</el-button>
-				</template>
-			</div>
-			<div
-				style="
-					margin: 0px 0 0 20px;
-					padding: 10px 20px;
-					box-sizing: border-box;
-					background: #fff;
-					border: 1px solid #3464e0;
-				"
-			>
-				<el-tabs v-model="tabsactive">
-					<el-tab-pane :label="tab.label" :name="tab.key" v-for="tab in panelTabs" :key="tab.key"></el-tab-pane>
-				</el-tabs>
-				<div
-					v-if="tabsactive == '基础信息'"
-					style="height: calc(100vh - 280px); overflow-y: auto"
-				>
-					<el-form
-						:model="aeForm"
-						:rules="aerules"
-						ref="aeForm"
-						label-position="right"
-						label-width="90px"
-						class="demo-aeForm"
-						id="login-container"
-						@submit.native.prevent
-					>
-						<el-form-item prop="add_type" :label="$t('ReportManage.ReportList.new_method_btn')">
-							<el-select
-								v-model="aeForm.add_type"
-								@change="userclassidreportdetail"
-								:placeholder="$t('ReportManage.CategoryList.please_select')"
-								size="medium"
-								style="width: 270px"
-							>
-								<el-option :label="$t('ReportManage.ReportList.new_report_radio')" :value="1"></el-option>
-								<el-option :label="$t('ReportManage.ReportList.inherit_report_radio')" :value="2"></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item prop="classifynameArr" :label="$t('ReportManage.ReportList.classificiation_selest')">
-							<el-cascader
-								@change="userclassidreportdetail"
-								ref="cascader"
-								:options="optionsArr"
-								v-model="aeForm.classifynameArr"
-								:placeholder="$t('ReportManage.smart_type_filtering')"
-								size="medium"
-								style="width: 270px"
-							></el-cascader>
-						</el-form-item>
-						<el-form-item prop="title" :label="$t('ReportManage.ReportList.title_ipt')">
-							<el-input
-								type="textarea"
-								:rows="2"
-								:placeholder="$t('ReportManage.CategoryList.please_input')"
-								v-model="aeForm.title"
-								size="medium"
-							></el-input>
-						</el-form-item>
-						<el-form-item :label="$t('ReportManage.ReportList.abstract_ipt')">
-							<el-input
-								type="textarea"
-								:rows="2"
-								:placeholder="$t('ReportManage.CategoryList.please_input')"
-								v-model="aeForm.abstract"
-								size="medium"
-							></el-input>
-						</el-form-item>
-						<el-form-item :label="$t('ReportManage.ReportList.author_select')">
-							<el-select
-								v-model="aeForm.author"
-								multiple
-								:placeholder="$t('ReportManage.CategoryList.please_select')"
-								size="medium"
-								style="width: 270px"
-							>
-								<el-option
-									v-for="(item, i) in authorlist"
-									:key="i"
-									:label="item.ReportAuthor"
-									:value="item.ReportAuthor"
-								></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item :label="$t('ReportManage.ReportList.frequency_select')">
-							<el-select
-								v-model="aeForm.frequency"
-								:placeholder="$t('ReportManage.CategoryList.please_select')"
-								size="medium"
-								style="width: 270px"
-							>
-								<el-option :label="$t('ReportManage.smart_annually')" value="年度"></el-option>
-								<el-option :label="$t('ReportManage.smart_semi_annually')" value="半年度"></el-option>
-								<el-option :label="$t('ReportManage.smart_quarterly')" value="季度"></el-option>
-								<el-option :label="$t('ReportManage.smart_monthly')" value="月度"></el-option>
-								<el-option :label="$t('ReportManage.smart_bi_weekly')" value="双周度"></el-option>
-								<el-option :label="$t('ReportManage.smart_weekly')" value="周度"></el-option>
-								<el-option :label="$t('ReportManage.smart_daily')" value="日度"></el-option>
-								<el-option :label="$t('ReportManage.smart_irregularly')" value="不定时"></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item :label="$t('ReportManage.ReportList.creation_time_select')">
-							<el-date-picker
-								v-model="aeForm.create_time"
-								type="date"
-								value-format="yyyy-MM-dd"
-								:placeholder="$t('ReportManage.ReportList.select_date')"
-								size="medium"
-								:clearable="false"
-								style="width: 270px"
-							></el-date-picker>
-						</el-form-item>
-					</el-form>
-				</div>
-				<div v-if="tabsactive == '图表插入'">
-					<el-input
-						:placeholder="$t('ReportManage.ReportList.chart_name')"
-						v-model="key_word"
-						size="medium"
-						prefix-icon="el-icon-search"
-						@input="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist(key_word)}"
-					>
-					</el-input>
-					<el-radio-group v-model="chart_source" @change="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist()}" style="margin-top: 10px;">
-						<el-radio :label="1">{{$t('ReportManage.ReportList.chart_inventory_radio')}}</el-radio>
-						<el-radio :label="2">{{$t('ReportManage.ReportList.price_curve_radio')}}</el-radio> 
-						<el-radio :label="3">{{$t('ReportManage.ReportList.related_charts_radio')}}</el-radio>
-						<el-radio :label="6">{{$t('ReportManage.ReportList.curve_fitting_radio')}}</el-radio>
-						<el-radio :label="7">{{$t('ReportManage.ReportList.statistical_feature_radio')}}</el-radio>
-						<el-radio :label="10">{{$t('ReportManage.ReportList.intercommodity_analysis_radio')}}</el-radio>
-					</el-radio-group>
-					<div style="margin: 10px 0">
-						<el-checkbox v-model="isShowMe" @change="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist(key_word)}">{{$t('ReportManage.ReportList.just_mine_radio')}}</el-checkbox>
-					</div>
-					<div
-						id="reportwin"
-						ref="chartListRef"
-						style="
-							height: calc(100vh - 370px);
-							overflow-x: hidden;
-							overflow-y: auto;
-						"
-						v-infinite-scroll="loadReportHandle"
-						:infinite-scroll-immediate="false"
-					>
-						<template v-if="newreportlist.length">
-							<div
-								v-for="(item, index) in newreportlist"
-								:key="item.ChartInfoId"
-								:style="item.Disabled && 'cursor: not-allowed;'"
-								class="liststy"
-							>
-								<p class="color_primary">{{ item.ChartName }}</p>
-								<img
-									:src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage"
-									:id="'listnode' + index"
-									@click="insertHtml(item)"
-								/>
-							</div>
-						</template>
-
-						<tableNoData :text="$t('ReportManage.ReportList.no_chart_table_available')" size="mini" v-else/>
-					</div>
-
-				</div>
-				<div v-if="tabsactive == '沙盘插入'">
-					<el-input
-						:placeholder="$t('ReportManage.ReportList.no_reports_msg')"
-						v-model="sandTabelQuery.Keyword"
-						size="medium"
-						prefix-icon="el-icon-search"
-					>
-					</el-input>
-					<div
-						id="sandTable-container"
-						ref="sandTable"
-						style="
-							height: calc(100vh - 370px);
-							overflow-x: hidden;
-							overflow-y: auto;
-						"
-						@scroll="sandTableHandleScroll"
-					>
-						<template v-if="sandTableList.length">
-							<div
-								v-for="(item, index) in sandTableList"
-								:key="item.SandboxId"
-								class="liststy"
-							>
-								<p class="color_primary">{{ item.Name }}</p>
-								<img
-									:src="item.PicUrl"
-									:id="'sandTable' + index"
-									@click="insertHtml(item,'image')"
-								/>
-								<!-- <p class="source-identification">来源:弘则研究</p> -->
-							</div>
-						</template>
-						<tableNoData :text="$t('Table.prompt_slogan')"  size="mini" v-else/>
-					</div>
-				</div>
-				<div v-if="tabsactive == '表格插入'">
-					<el-input
-						:placeholder="$t('ReportManage.ReportList.table_name_tabs')"
-						v-model="sheetSearchObj.Keyword"
-						size="medium"
-						prefix-icon="el-icon-search"
-						@input="getSheetList"
-					>
-					</el-input>
-					<div
-						style="
-							height: calc(100vh - 370px);
-							overflow-x: hidden;
-							overflow-y: auto;
-						"
-					>
-						<template v-if="sheetSearchList.length">
-							<div
-								v-for="item in sheetSearchList"
-								:key="item.ExcelInfoId"
-								class="liststy"
-							>
-								<p class="color_primary">{{ item.ExcelName }}</p>
-								<img
-									:src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage"
-									:id="'sheet' + item.ExcelInfoId"
-									style="object-fit: contain;height: 250px;"
-									@click="insertHtml(item,'sheet')"
-								/>
-							</div>
-						</template>
-
-						<tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-else/>
-					</div>
-				</div>
-				<div v-if="tabsactive == 'MyETA批量插入'">
-					<importMyChart @handleImportMyChart="handleImportMyChart"/>
-				</div>
-				<div v-if="tabsactive == '语义分析插入'">
-					<importSemantics @handleImportSemantic="(item)=>insertHtml(item,'image')"/>
-				</div>
-			</div>
-		</div>
-		<span
-			class="slide-icon slide-btn-icon"
-			:class="{'slide-left':!isRightFormShow,'slide-right':isRightFormShow}"
-			@click="isRightFormShow = !isRightFormShow"
-		>
-			<i :class="{'el-icon-d-arrow-left':!isRightFormShow,'el-icon-d-arrow-right':isRightFormShow}"></i>
-		</span>
-
-		<!-- 定时发布弹窗 -->
-		<el-dialog 
-			v-dialogDrag 
-			:append-to-body="true" 
-			:visible.sync="showDSFB" 
-			width="500px" 
-			:title="$t('ReportManage.ReportList.scheduled_publish_btn')"
-		>
-			<div>
-				<div>
-					<span>{{$t('ReportManage.ReportList.publish_time')}}</span>
-					<el-date-picker
-						v-model="taskTime"
-						type="datetime"
-						:placeholder="$t('ReportManage.ReportList.select_date_and_time')"
-						value-format="yyyy-MM-dd HH:mm"
-						:picker-options="timePickerOpt"
-					/>
-				</div>
-				<p style="margin:15px 0">{{$t('ReportManage.ReportList.the_report_will_be_posted_on_time')}}</p>
-				<div style="text-align:right;margin:20px 0">
-					<el-button type="primary" plain @click="showDSFB=false">{{$t('Dialog.cancel_btn')}}</el-button>
-					<el-button type="primary" @click="handleSetReportPrepublish">{{$t('Dialog.confirm_btn')}}</el-button>
-				</div>
-			</div>
-		</el-dialog>
-	</div>
-</template>
-
-<script>
-import {
-	autosave,
-	reportadd,
-	reportedit,
-	classifylist,
-	classifyIdDetail,
-	reportpublish,
-	reportauthor,
-	getDraft,
-	dataBaseInterface,
-	sandInterface,
-	reportSetPrepublish,
-	departInterence
-} from '@/api/api.js';
-import http from '@/api/http.js';
-import VueFroala from 'vue-froala-wysiwyg';
-import urlSlug from 'url-slug';
-import mixinMsg from './mixins/messagePush'
-import reportMixin from './mixins/reportMixin';
-import reportApproveConfig from "@/mixins/reportApproveConfig.js"
-import importMyChart from './components/importMyChart.vue'
-import importSemantics from './components/importSemantics.vue';
-export default {
-	mixins:[mixinMsg,reportMixin,reportApproveConfig],
-	data() {
-		var that = this;
-		return {
-			//批量导入图表
-			importChartNum:0,//批量导入图表的数量 如果大于0则说明在加载
-			tabsactive: '基础信息',
-			optionsArr: [],
-			key_word: '',
-			// 沙盘插入 ----------start
-			sandTabelQuery:{
-				PageSize: 13,
-				CurrentIndex: 1,
-				Keyword: '',
-			}, // 沙盘图查询参数
-			sandTableLoading:false,
-			sandTableTotal:0,//沙盘总共条数
-			sandTableList:[],
-			isRequesting:false,
-			loadedText:'', // 全部加载完的文字提示
-			// 沙盘插入 ------------- end
-			originreportlist: [],
-			newreportlist: [], //图表列表
-			authorlist: [],
-			aeForm: {
-				add_type: 1,
-				classify_name: 1,
-				classifynameArr: [],
-				title: '',
-				abstract: '',
-				author: ['投研团队'],
-				frequency: '日度',
-				create_time: http.dateFormatter(new Date(), false).replace(/\./g,'-'),
-				content: '',
-			},
-			aerules: {
-				add_type: [
-					{
-						required: true,
-						message: '',
-						trigger: 'blur',
-					},
-				],
-				classifynameArr: [
-					{
-						required: true,
-						message: '',
-						trigger: 'blur',
-					},
-				],
-				title: [
-					{
-						required: true,
-						message: '请输入',
-						trigger: 'blur',
-					},
-				],
-			},
-			lastEditRange: null,
-			report_draft_id: 0,
-			waterMarkStr:''
-		};
-	},
-	mounted() {
-		this.getclassifylist();
-		this.getreportlist('');
-		this.getreportauthor();
-		this.getSandTable();
-		this.getSheetList();
-		this.getSystemUserInfo()
-		this.timer = setInterval(() => {
-			this.autoSave();
-		}, 6000);
-
-		window.addEventListener('message',this.reInitIframe)
-	},
-	destroyed() {
-		window.removeEventListener('message',this.reInitIframe)
-		if (this.timer) {
-			clearInterval(this.timer);
-		}
-	},
-	updated() {
-		$('#leftfroala').find('p').css({ fontSize: '16px',width:'100%' });
-		$('#leftfroala').find('p strong span').css({ fontSize: '16px' });
-		$('#leftfroala')
-			.find('.fr-placeholder')
-			.css({ fontSize: '16px', lineHeight: '25.6px' });
-	},
-	methods: {
-		// 每十秒自动保存
-		autoSave() {
-			console.log(this.ischange,this.autoSaveFlag);
-			if (this.report_draft_id&&this.autoSaveFlag) {
-				//如果富文本中有未上传完成的图片,去除这个dom
-				$('.fr-element').find('img.fr-uploading').length&&$('.fr-element').find('img.fr-uploading').remove()
-				autosave({
-					ReportId: Number(this.report_draft_id),
-					Content: $('.fr-element').html(),
-					NoChange:this.ischange?0:1
-				}).then((res) => {
-					if (res.Ret === 200) {
-						this.report_id = res.Data.ReportId;
-						this.lastsavetime = http.dateFormatter(new Date(), true);
-					}
-				});
-				this.ischange = false;
-			}
-		},
-		getDrafts() {
-			getDraft({}).then((res) => {
-				if (res.Ret == 200) {
-					this.report_draft_id = res.Data.Id;
-					this.aeForm = {
-						classifynameArr:
-							res.Data.ClassifyIdSecond && res.Data.ClassifyNameSecond
-								? [
-										JSON.stringify({
-											l: res.Data.ClassifyNameFirst,
-											v: parseInt(res.Data.ClassifyIdFirst),
-										}),
-										JSON.stringify({
-											l: res.Data.ClassifyNameSecond,
-											v: parseInt(res.Data.ClassifyIdSecond),
-										}),
-									]
-								: [
-										JSON.stringify({
-											l: res.Data.ClassifyNameFirst,
-											v: parseInt(res.Data.ClassifyIdFirst),
-										}),
-								  ],
-						title: res.Data.Title,
-						abstract: res.Data.Abstract,
-						author: res.Data.Author ? res.Data.Author.split(',') : '',
-						frequency: res.Data.Frequency,
-						content: res.Data.Content,
-					};
-					let classify = this.aeForm.classifynameArr.map(i=>{
-						return JSON.parse(i).v||0
-					})
-					this.checkClassifyNameArr(1,classify)
-				}
-			});
-		},
-		getreportauthor() {
-			reportauthor({}).then((res) => {
-				if (res.Ret == 200) {
-					this.authorlist = res.Data.List || [];
-				}
-			});
-		},
-		userclassidreportdetail() {
-			//检查classifynameArr是否有审批流
-			let classify = this.aeForm.classifynameArr.map(i=>{
-				return JSON.parse(i).v||0
-			})
-			this.checkClassifyNameArr(1,classify)
-
-			if (this.aeForm.add_type == 1) {
-				if (this.aeForm.classifynameArr.length == 2) {
-					this.aeForm.title = JSON.parse(this.aeForm.classifynameArr[1]).l;
-				}
-				return false;
-			}
-			if (this.aeForm.classifynameArr.length == 0) {
-				return false;
-			}
-			let params = {
-				ClassifyIdFirst: JSON.parse(this.aeForm.classifynameArr[0]).v,
-			};
-			if (this.aeForm.classifynameArr.length == 2) {
-				params.ClassifyIdSecond = JSON.parse(
-					this.aeForm.classifynameArr[1]
-				).v;
-			} else {
-				params.ClassifyIdSecond = 0;
-			}
-			classifyIdDetail(params).then((res) => {
-				if (res.Ret == 200) {
-					if (res.Data == null) {
-						this.$message.error(this.$t('ReportManage.ReportList.no_reports_msg'));
-						return false;
-					}
-					let obj=JSON.parse(JSON.stringify(this.aeForm.classifynameArr))
-					this.aeForm = {
-						add_type: 2,
-						classify_name: 1,
-						classifynameArr:obj,
-						title: res.Data.Title,
-						abstract: res.Data.Abstract,
-						author: res.Data.Author ? res.Data.Author.split(',') : '',
-						frequency: res.Data.Frequency,
-						create_time:
-							this.aeForm.add_type == 2
-								? http.dateFormatter(new Date(), false)
-								: res.Data.CreateTime,
-						content: res.Data.Content,
-					};
-				}
-			});
-		},
-		clickreportadd(tp) {
-			console.log(this.aeForm.classifynameArr);
-			if (
-				!this.aeForm.classifynameArr ||
-				this.aeForm.classifynameArr.length == 0
-			) {
-				this.$message.error(this.$t('ReportManage.ReportList.please_select_category'));
-				return false;
-			}
-			if (!this.aeForm.title) {
-				this.$message.error(this.$t('ReportManage.ReportList.input_title_please'));
-				return false;
-			}
-			if(!this.autoSaveFlag){
-				this.$message.error(this.$t('ReportManage.smart_msg.img_wait'))
-				return false
-			}
-			//如果富文本中有未上传完成的图片,去除这个dom
-			$('.fr-element').find('img.fr-uploading').length&&$('.fr-element').find('img.fr-uploading').remove()
-			let params = {
-				AddType: this.aeForm.add_type,
-				ClassifyIdFirst: JSON.parse(this.aeForm.classifynameArr[0]).v,
-				ClassifyNameFirst: JSON.parse(this.aeForm.classifynameArr[0]).l,
-				Title: this.aeForm.title,
-				Abstract: this.aeForm.abstract,
-				Author:
-					this.aeForm.author.length > 0
-						? this.aeForm.author.join(',')
-						: '',
-				Frequency: this.aeForm.frequency,
-				// content:this.aeForm.content,create_time:this.aeForm.create_time
-				Content: $('.fr-element').html(),
-				CreateTime: this.aeForm.create_time,
-				ReportVersion: 2
-			};
-
-			if (this.aeForm.classifynameArr.length == 2) {
-				params.ClassifyIdSecond = JSON.parse(
-					this.aeForm.classifynameArr[1]
-				).v;
-				params.ClassifyNameSecond = JSON.parse(
-					this.aeForm.classifynameArr[1]
-				).l;
-			}
-			params.State = 1;
-			if (tp == 'yl') {
-				sessionStorage.setItem('reportdtl', JSON.stringify(params));
-				let { href } = this.$router.resolve({ name: '预览报告' });
-				window.open(href, '_blank');
-				return false;
-			}
-			if (tp == 'fb'||tp == 'submit') {
-				this.isPublishloading = true;
-			}
-			const isPost = this.permissionBtn.checkPermissionBtn(this.permissionBtn.reportManageBtn.reportManage_sendMsg)&&(!this.isApprove)
-			// 如果已经添加过就修改 否则新增
-			if (this.isAddEnter) {
-				let params2 = {
-					ReportId: Number(this.report_draft_id),
-					State: 1,
-					AddType: this.aeForm.add_type,
-					ClassifyIdFirst: JSON.parse(this.aeForm.classifynameArr[0]).v,
-					ClassifyNameFirst: JSON.parse(this.aeForm.classifynameArr[0]).l,
-					Title: this.aeForm.title,
-					Abstract: this.aeForm.abstract,
-					Author:
-						this.aeForm.author.length > 0
-							? this.aeForm.author.join(',')
-							: '',
-					Frequency: this.aeForm.frequency,
-					// content:this.aeForm.content,
-					Content: $('.fr-element').html(),
-					CreateTime: this.aeForm.create_time,
-				};
-				if (this.aeForm.classifynameArr.length == 2) {
-					params2.ClassifyIdSecond = JSON.parse(
-						this.aeForm.classifynameArr[1]
-					).v;
-					params2.ClassifyNameSecond = JSON.parse(
-						this.aeForm.classifynameArr[1]
-					).l;
-				}
-				if(tp=='fb') {   
-					const hasTel=this.aeForm.classifynameArr.length == 2?JSON.parse(this.aeForm.classifynameArr[1]).HasTeleconference:JSON.parse(this.aeForm.classifynameArr[0]).HasTeleconference
-					if(hasTel==1){
-						this.isMessagePost = false; 
-						this.reporteditMsg(params2,tp)
-					}else if(isPost){
-						this.$confirm(this.$t('ReportManage.smart_msg.publishing_messages'), this.$t('ReportManage.smart_release_prompt_btn'), {
-								confirmButtonText: this.$t('ReportManage.smart_btn.push'),
-								cancelButtonText: this.$t('ReportManage.smart_btn.not_push'),
-								type: 'warning',
-								distinguishCancelAndClose:true,
-								beforeClose:(action, instance,done)=>{
-									if(action=='close') {
-										//右上角
-										this.isPublishloading = false;
-									} else if(action=='cancel') {
-										//cancelButton
-										this.isMessagePost = false; 
-										this.reporteditMsg(params2,tp)
-									}else {
-										//confirmButton
-										this.isMessagePost = true; 
-										this.reporteditMsg(params2,tp)
-									}
-									done()
-								}
-						})
-					}else{
-						this.isMessagePost = false;
-						this.reporteditMsg(params2,tp)
-					}
-					
-				}else {
-					this.reporteditMsg(params2,tp)
-				}
-				
-			} else {
-				if(tp=='fb') {
-					const hasTel=this.aeForm.classifynameArr.length == 2?JSON.parse(this.aeForm.classifynameArr[1]).HasTeleconference:JSON.parse(this.aeForm.classifynameArr[0]).HasTeleconference
-					if(hasTel==1){
-						this.isMessagePost = false; 
-						this.reportaddMsg(params,tp)
-					}else if(isPost){
-						this.$confirm(this.$t('ReportManage.smart_msg.publishing_messages'), this.$t('ReportManage.smart_release_prompt_btn'), {
-								confirmButtonText: this.$t('ReportManage.smart_btn.push'),
-								cancelButtonText:  this.$t('ReportManage.smart_btn.not_push'),
-								type: 'warning',
-								distinguishCancelAndClose:true,
-								beforeClose:(action, instance,done)=>{
-									console.log(action, instance);
-									if(action==='close') {
-										//右上角
-										this.isPublishloading = false;
-									} else if(action==='cancel') {
-										//cancelButton
-										this.isMessagePost = false; 
-										this.reportaddMsg(params,tp)
-									}else {
-									//confirmButton
-										this.isMessagePost = true; 
-										this.reportaddMsg(params,tp)
-									}
-									done()
-								}
-						})
-					}else{
-						this.isMessagePost = false;
-						this.reportaddMsg(params,tp)
-					}
-						
-				}else {
-					this.reportaddMsg(params,tp)
-				}
-			}
-		},
-		publishreport(id,code) {
-			//发布报告
-			reportpublish({ ReportIds: String(id) ,ReportUrl:this.generatePdfLinks(code)}).then((res) => {
-				if (res.Ret == 200) {
-					this.isPublishloading = false;
-					this.$router.push({ path: '/reportlist' });
-				}
-			});
-		},
-		generatePdfLinks(Code){
-			const baseUrl= localStorage.getItem('dynamicOutLinks') ? JSON.parse(localStorage.getItem('dynamicOutLinks')).ReportViewUrl : '';
-			return `${baseUrl}/reportshare_pdf?code=${Code}&flag=${this.waterMarkStr}`
-		},
-		// 定时发布报告
-		handleSetReportPrepublish(){
-			if(!this.taskTime){
-				this.$message.warning(this.$t('ReportManage.smart_msg.select_push_time'))
-				return
-			}
-			const now=this.$moment().format('YYYY-MM-DD HH:mm:ss')
-			console.log(now);
-			console.log(this.taskTime);
-			if(this.$moment(this.taskTime).isBefore(now,'second')){
-				this.$message.warning(this.$t('ReportManage.smart_msg.than_current_time'))
-				return
-			}
-			const isPost = this.permissionBtn.checkPermissionBtn(this.permissionBtn.reportManageBtn.reportManage_sendMsg)
-			this.$confirm(isPost?this.$t('ReportManage.smart_msg.push_report_msg'):this.$t('ReportManage.smart_msg.is_push_timed'), this.$t('ReportManage.smart_release_prompt_btn'), {
-				confirmButtonText: isPost?this.$t('ReportManage.smart_btn.push'):this.$t('ReportManage.smart_btn.publish'),
-				cancelButtonText: isPost?this.$t('ReportManage.smart_btn.not_push'):this.$t('Dialog.cancel_btn'),
-				type: 'warning',
-				distinguishCancelAndClose:true,
-				beforeClose:(action, instance,done)=>{
-					console.log(action, instance);
-					if(action==='close'||action==='cancel') {
-						if(isPost) {
-							//右上角或者不推送
-							reportSetPrepublish({
-								ReportId:Number(this.report_draft_id),
-								PrePublishTime:this.taskTime,
-								PreMsgSend:0,
-								ReportUrl:this.generatePdfLinks(this.reportCode)
-							}).then(res=>{
-								if(res.Ret===200){
-									this.$message.success(this.$t('ReportManage.smart_msg.timed_success'))
-									this.$router.push({ path: '/reportlist' });
-								}
-							})
-						}
-					} else {
-						//confirmButton
-						reportSetPrepublish({
-							ReportId:Number(this.report_draft_id),
-							PrePublishTime:this.taskTime,
-							PreMsgSend:isPost?1:0,
-							ReportUrl:this.generatePdfLinks(this.reportCode)
-						}).then(res=>{
-							if(res.Ret===200){
-								this.$message.success(this.$t('ReportManage.smart_msg.timed_success'))
-								this.$router.push({ path: '/reportlist' });
-							}
-						})
-					}
-					done()
-				}
-			})
-
-		},
-		//批量插入我的图表
-		handleImportMyChart(data){
-			//设置编辑器获取焦点
-			this.editor.events.focus();
-			// 获取选定对象
-			const selection = getSelection();
-			// 判断是否有最后光标对象存在
-			if (this.lastEditRange) {
-				// 存在最后光标对象,选定对象清除所有光标并添加最后光标还原之前的状态
-				selection.removeAllRanges();
-				selection.addRange(this.lastEditRange);
-			}
-			//插入内容
-			let htmlStr=''
-			const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
-			
-			data.forEach(item=>{
-				const t=new Date().getTime()
-				item.domId=item.UniqueCode+t //避免多次添加同一图表 id相同
-				htmlStr=htmlStr+`<p style='text-align:left; margin-top:10px;'>
-							<iframe id='${item.domId}' src='${LINK_CHART_URL}?code=${item.UniqueCode}&lang=${this.currentLang}' width='100%' height='350' style='border-width:0px; min-height:350px;'></iframe>
-						</p>`
-			})
-			this.$nextTick(()=>{
-				console.log('import start',data);
-				this.importChartNum=data.length
-				this.editor.html.insert(htmlStr)
-				this.handleListenIframeLoad(data)
-			})
-			
-			this.lastEditRange = selection.getRangeAt(0);
-		},
-		// 监听批量导入的iframe是否加载完
-		handleListenIframeLoad(list){
-			list.forEach(item=>{
-				let ifm=document.getElementById(item.domId)
-				ifm.onload=(e)=>{
-					this.importChartNum--
-				}
-			})
-		},
-
-		// 获取沙盘图列表 分页
-		getSandTable(){
-			this.sandTableLoading = true
-			this.isRequesting = true
-			sandInterface.sandlistByQuote(this.sandTabelQuery).then(({Data:{List,Paging}})=>{
-				if(this.sandTabelQuery.CurrentIndex>1){
-					this.sandTableList = [...this.sandTableList,...List]
-				}else{
-					this.sandTableList = List
-					this.sandTableTotal = Paging.Totals
-					if(this.sandTableList.length ==0){
-						this.loadedText = this.$t('Table.prompt_slogan')
-					}else if(this.sandTableList.length>=this.sandTableTotal){
-						this.loadedText = this.$t('ReportManage.smart_msg.all_loaded_have')
-					}else{
-
-					}
-				}		
-			})
-			.finally(()=>{
-				this.sandTableLoading = false
-				this.isRequesting = false
-			})
-		},
-		// 沙盘列表滚动事件,触底加载下一页数据 防抖
-		sandTableHandleScroll:_.debounce(function (e) {
-			if(this.sandTableList.length>=this.sandTableTotal){
-				this.loadedText = this.$t('ReportManage.smart_msg.all_loaded_have')
-				return
-			}
-			if(e.target.scrollHeight-e.target.clientHeight-e.target.scrollTop<10 && !this.isRequesting){
-				this.sandTabelQuery.CurrentIndex++
-				this.getSandTable()
-			}
-		},100),
-		getclassifylist() {
-			//获取分类列表
-			let params = { Enabled:1, KeyWord: '',HideDayWeek:1,/*不显示晨报/周报*/ };
-			classifylist(params).then((res) => {
-				if (res.Ret == 200 && Array.isArray(res.Data.List)) {
-					this.optionsArr = [];
-					res.Data.List.forEach((item, index) => {
-						let newitem = {
-							label: item.ClassifyName,
-							value: JSON.stringify({
-								l: item.ClassifyName,
-								v: parseInt(item.Id),
-								HasTeleconference:item.HasTeleconference
-							}),
-						};
-						if (item.Child && item.Child.length > 0) {
-							let childnode = [];
-							item.Child.forEach((itemchild, i) => {
-								childnode.push({
-									label: itemchild.ClassifyName,
-									value: JSON.stringify({
-										l: itemchild.ClassifyName,
-										v: parseInt(itemchild.Id),
-										HasTeleconference:itemchild.HasTeleconference
-									}),
-								});
-							});
-							newitem.children = childnode;
-						} else {
-							newitem.children = undefined;
-							newitem.disabled=true
-						}
-						this.optionsArr.push(newitem);
-					});
-					console.log(this.optionsArr);
-				}
-			});
-		},
-		getSystemUserInfo(){
-      departInterence.systemUserInfo().then(res=>{
-        if(res.Ret===200){
-          const systemUserInfo=res.Data
-          // 设置水印文案
-          let waterMarkString=''
-          if(systemUserInfo){
-            waterMarkString=`${systemUserInfo.RealName}${systemUserInfo.Mobile?systemUserInfo.Mobile:systemUserInfo.Email}`
-            waterMarkString=encodeURIComponent(waterMarkString)
-            this.waterMarkStr=Base64.encode(waterMarkString)
-          }
-        }
-      })
-    },
-	},
-	components: {importMyChart,importSemantics},
-	watch: {
-		'aeForm.add_type'(to, from) {
-			if (from == 2 && to == 1) {
-				this.aeForm = {
-					add_type: 1,
-					classify_name: 1,
-					classifynameArr: [],
-					title: '',
-					abstract: '',
-					author: ['投研团队'],
-					frequency: this.$t('ReportManage.smart_daily'),
-					create_time: http.dateFormatter(new Date(), false),
-					content: '',
-				};
-			}
-		},
-		'sandTabelQuery.Keyword'(newval,oldval){
-			this.$refs.sandTable.scrollTop=0
-			this.sandTabelQuery.CurrentIndex = 1
-			this.getSandTable()
-		}
-	},
-};
-</script>
-
-<style scoped lang="scss">
-#addreport {
-	display: flex;
-	overflow: hidden;
-	#leftfroala {
-		flex: 1;
-		overflow: hidden;
-		&.full{
-			max-width: calc(100vw - 200px - 60px);
-		}
-		&.block{
-			max-width: calc(100vw - 200px - 60px - 500px);
-		}
-	}
-	#rightitems {
-		width: 500px;
-		flex: 500px 0 0;
-		overflow: hidden;
-		position: fixed;
-		right: 30px;
-		#tabs {
-			padding: 0px 20px;
-			box-sizing: border-box;
-			margin-bottom: 15px;
-			overflow: hidden;
-			> p {
-				/* display: inline-block; */
-				float: left;
-				// width: 50%;
-				width: 25%;
-				font-size: 18px;
-				cursor: pointer;
-				color: #1f2e4d;
-				padding: 10px 0;
-				text-align: center;
-			}
-			> p.active {
-				border-bottom: 2px solid #3464e0;
-				color: #3464e0;
-			}
-		}
-		.liststy {
-			width: 100%;
-			margin: 20px 0;
-			padding: 20px;
-			box-sizing: border-box;
-			border: 1px solid #eaeaea;
-			border-radius: 10px;
-			position: relative;
-			overflow: hidden;
-			> p {
-				text-align: center;
-				font-size: 16px;
-				margin-bottom: 10px;
-			}
-			> img {
-				width: 100%;
-				height: auto;
-			}
-			// .source-identification{
-			// 	text-align: left;
-			// }
-		}
-		.loaded-text{
-			height: 20px;
-			text-align: center;
-			color: #666;
-			font-size: 14px;
-		}
-	}
-	.slide-icon {
-		cursor: pointer;
-		position: fixed;
-		top: 50%;
-		transform: translateY(-50%);
-		z-index: 99;
-		&:hover {
-			background-color: #e0e0e0;
-		}
-		&.slide-left {
-			right: 30px;
-		}
-		&.slide-right {
-			right: 500px;
-		}
-	}
-}
-</style>
-<style lang="scss">
-#addreport {
-	.el-tabs__nav-wrap::after {
-		height: 0;
-	}
-	.el-tabs__item { font-size: 16px; }
-}	
-</style>

+ 0 - 447
src/views/report_manage/dayOrWeek.vue

@@ -1,447 +0,0 @@
-<template>
-    <div class="morning-week-page">
-        <el-form :model="form" :rules="rules" label-width="110px" ref="form" class="form-wrap">
-            <section class="section flex">
-                <el-form-item :label="$t('ReportManage.smart_report_type')" prop="type" style="width:50%">
-                    <el-select :disabled="$route.query.isEdit" v-model="form.type" @change="typeChange" :placeholder="$t('ReportManage.ReportList.please_report_type_select')" style="width:80%">
-                        <el-option :label="$t('ReportManage.smart_btn.weekly')" :value="'week'"></el-option>
-                        <el-option :label="$t('ReportManage.smart_btn.morning_paper')" :value="'day'"></el-option>
-                    </el-select>
-                </el-form-item>
-                <el-form-item :label="$t('ReportManage.smart_report_title')" prop="title" style="width:50%">
-                    <el-input :placeholder="$t('ReportManage.ReportList.please_report_title_input')" v-model="form.title" style="width:80%"></el-input>
-                </el-form-item>
-                <el-form-item :label="$t('ReportManage.smart_publish_time')" prop="time" style="width:50%">
-                    <el-date-picker
-                        v-model="form.time"
-                        type="date"
-                        :placeholder="$t('ReportManage.ReportList.select_date')"
-                        style="width:80%"
-                        format="yyyy-MM-dd"
-                        value-format="yyyy-MM-dd">
-                    </el-date-picker>
-                </el-form-item>
-                <el-form-item :label="$t('ReportManage.ReportList.author_select')" prop="auth" style="width:50%">
-                    <el-input :placeholder="$t('ReportManage.ReportList.author_select_ipt')" v-model="form.auth" style="width:80%"></el-input>
-                </el-form-item>
-                <div v-if="!$route.query.isEdit">
-                    <el-button type="primary" plain @click="$router.go(-1)">{{$t('Dialog.cancel_btn')}}</el-button>
-                    <el-button type="primary" @click="handleSave">{{$t('Dialog.confirm_save_btn')}}</el-button>
-                </div>
-            </section>
-            <section class="section" v-if="$route.query.isEdit">
-                <div style="font-size:16px;margin-bottom:20px">{{$t('ReportManage.ReportList.chapter_list_label')}}</div>
-                <div class="list-box">
-                    <div class="list-item" v-for="(item,index) in list" :key="item.ReportChapterId">
-                        <div class="item-image-box">
-                            <img :src="item.TypeEditImg" alt="" @click="goEditChapterReport(item)">
-                            <p>{{item.TypeName}}</p>
-                        </div>
-                        <div style="border-bottom:1px solid #ededed;padding-bottom:5px;margin-bottom:5px">{{item.TypeName}}</div>
-                        <div class="bot">
-                            <p>
-                                <span :style="{color:item.PublishState==2&&'#67C23A'}">{{item.PublishState==1? $t('ReportManage.smart_unpublished') : $t('ReportManage.smart_published') }}</span>
-                                <span style="float:right;color:#4099ef;cursor: pointer;" @click.stop="handleShowEditTag(item)">{{item.Trend||$t('ReportManage.ReportList.add_labels_section')}}</span>
-                            </p>
-                            <p style="margin-top:5px">
-                                <span :style="{color:item.VideoUrl&&item.VideoKind==1?'#67C23A':''}" v-if="form.type=='week'">{{item.VideoUrl&&item.VideoKind==1? $t('ReportManage.ReportList.recorded_audio'):$t('ReportManage.ReportList.not_recorded_audio')}}</span>
-                                <el-popover
-                                    placement="bottom"
-                                    trigger="click"
-                                >   
-                                    <img style="width:150px" :src="item.QRCodeImg" alt="">
-                                    <span 
-                                        slot="reference" 
-                                        style="float:right;color:#4099ef;cursor: pointer;" 
-                                        v-if="item.PublishState==2" 
-                                        @click="handleGetWechatImg(item,index)"
-                                    >{{$t('ReportManage.ReportList.weChat_share')}}</span>
-                                </el-popover>
-                            </p>
-                            <p style="margin-top:5px"><span>{{item.ModifyTime}}</span></p>
-                        </div>
-                    </div>
-                </div>
-                <div>
-                    <el-button type="primary" style="width:120px" @click="handleEditDayWeekReport">{{$t('Dialog.confirm_save_btn')}}</el-button>
-                    <el-button v-if="permissionBtn.checkPermissionBtn(permissionBtn.reportManageBtn.reportManage_publish)"
-                        type="primary" style="width:120px" @click="handlePublishValid">{{$t('ReportManage.ReportList.publish_btn')}}</el-button>
-                </div>
-            </section>
-        </el-form>
-
-      <!-- 章节标签 -->
-      <el-dialog
-        :visible.sync="editTag.show"
-		:modal-append-to-body='false'
-		width="400px"
-        :title="$t('ReportManage.ReportList.set_tags_title')"
-        v-dialogDrag
-      >
-        <div class="edit-tag-wrap">
-            <span>{{editTag.type}}</span>
-            <el-select
-                v-model="editTag.text"
-                filterable
-                allow-create
-                default-first-option
-                :placeholder="$t('ReportManage.ReportList.select_ipt_pld')">
-                <el-option
-                    v-for="item in TagOptions"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value">
-                </el-option>
-            </el-select>
-            <div style="margin:30px 0;text-align:center">
-                <el-button type="primary" plain @click="editTag.show=false">{{$t('Dialog.cancel_btn')}}</el-button>
-                <el-button type="primary" @click="handleEditTrendTag">{{$t('Dialog.confirm_btn')}}</el-button>
-            </div>
-        </div>
-      </el-dialog>
-    </div>
-</template>
-<script>
-import moment from 'moment'
-import {
-    dayWeekChapterList,
-    addDayWeekReport,
-    chapterTrendTagList,
-    editChapterTrendTag,
-    editDayWeekReport,
-    publishDayOrWeekReport,
-    messagePushPost,
-    chapterQRCodeImg,
-    reportMessageSend,
-    weekReportValidAudio
-} from '@/api/api.js'
-export default {
-    beforeRouteEnter(to, from, next) {
-        if(to.query.type){
-            to.matched[1].name=`编辑${to.query.type=='day'?'晨报':'周报'}`
-        }else{
-            to.matched[1].name='添加晨报/周报'
-        }
-        next()
-    },
-    data () {
-        return {
-            form:{
-                type:'',
-                title:'',
-                time:'',
-                auth:''
-            },
-            
-            list:[],
-            reportId:this.$route.query.reportid||'',
-            isEdit:this.$route.query.isEdit,
-            editTag:{
-                show:false,
-                ReportChapterId:0,
-                text:'',
-                type:''//编辑的章节名称
-            },//编辑标签
-            TagOptions:[]
-        }
-    },
-    computed:{
-        rules(){
-           return {
-                type:[{required:true,message:this.$t('ReportManage.ReportList.please_report_type_select'),trigger:'change'}],
-                title:[{required:true,message:this.$t('ReportManage.ReportList.please_report_title_input'),trigger:'blur'}],
-                time:[{required:true,message:this.$t('ReportManage.ReportList.please_select_date'),trigger:'change'}]
-            } 
-        }
-    },
-    created () {
-        if(this.reportId){
-            this.getChapterList(this.reportId)
-            const data=JSON.parse(sessionStorage.getItem('dayWeek'))
-            this.form.type=data.ChapterType
-            this.form.title=data.Title
-            this.form.time=moment(data.CreateTime).format('YYYY-MM-DD')
-            this.form.auth=data.Author
-        }  
-    },
-    methods:{
-        typeChange(){
-            this.form.title=`【弘则FICC${this.form.type=='day'?'晨报':'周报'}】`
-            this.form.time=moment().format('YYYY-MM-DD')
-            this.form.auth='弘则研究'
-        },
-        
-        //保存
-        handleSave(){
-            this.$refs.form.validate((valid)=>{
-                if(valid){
-                    addDayWeekReport({
-                        Title:this.form.title,
-                        ReportType:this.form.type,
-                        CreateTime:this.form.time,
-                        Author:this.form.auth
-                    }).then(res=>{
-                        if(res.Ret===200){
-                            this.reportId=res.Data.ReportId
-                            this.getChapterList(res.Data.ReportId)
-                            const formData={
-                                ChapterType:this.form.type,
-                                Title:this.form.title,
-                                CreateTime:this.form.time,
-                                Author:this.form.auth
-                            }
-                            sessionStorage.setItem('dayWeek',JSON.stringify(formData))
-                            this.$router.replace({
-                                query:{
-                                    reportid:res.Data.ReportId,
-                                    isEdit:true,
-                                    type:this.form.type
-                                }
-                            })
-                        }
-                    })
-                }
-            })
-        },
-
-        // 获取章节列表
-        async getChapterList(reportId){
-            const res=await dayWeekChapterList({ReportId:reportId})
-            if(res.Ret===200){
-                this.list=res.Data
-                this.getChapterTrendTagList()
-            }
-        },
-
-        //获取章节标签数据(仅在获取章节列表成功后获取一次)
-        async getChapterTrendTagList(){
-            const res=await chapterTrendTagList()
-            if(res.Ret===200){
-                let arr=res.Data||[]
-                this.TagOptions=arr.map(item=>{
-                    return {value:item.KeyWord,label:item.KeyWord}
-                })
-            }
-        },
-
-        // 点击修改标签
-        handleShowEditTag(item){
-            this.editTag={
-                show:true,
-                ReportChapterId:item.ReportChapterId,
-                text:item.Trend,
-                type:item.TypeName
-            }
-        },
-
-        //确定修改标签
-        async handleEditTrendTag(){
-            const res=await editChapterTrendTag({
-                ReportChapterId:Number(this.editTag.ReportChapterId),
-                Trend:this.editTag.text
-            })
-            if(res.Ret===200){
-                this.$message.success('修改成功')
-                this.editTag.show=false
-                this.getChapterList(this.reportId)
-            }
-        },
-
-        //修改晨报周报
-        async handleEditDayWeekReport(){
-            this.$refs.form.validate((valid)=>{
-                if(valid){
-                    editDayWeekReport({
-                        ReportId:Number(this.reportId),
-                        Title:this.form.title,
-                        ReportType:this.form.type,
-                        CreateTime:this.form.time,
-                        Author:this.form.auth
-                    }).then(res=>{
-                        if(res.Ret===200){
-                            this.$message.success(this.$t('MsgPrompt.saved_msg'))
-                        }
-                    })
-                }
-            })
-        },
-
-        //前往编辑章节详情
-        goEditChapterReport(item){
-            this.$router.push({
-                path:'/editchapterreport',
-                query:{
-                    id:item.ReportChapterId,
-                    type:item.ReportType,
-                    typename:item.TypeName
-                }
-            })
-        },
-
-        //周报校验音频是否都上传了
-        async handlePublishValid(){
-            if(this.form.type==='week'){
-                const validRes=await weekReportValidAudio({ReportId:Number(this.reportId)})
-                if(validRes.Ret===200){
-                    if(validRes.Data){
-                        this.$confirm(`${this.$t('ReportManage.smart_msg.report_recording')}${validRes.Data.join('、')},${this.$t('ReportManage.smart_msg.publish_it')}`, this.$t('ReportManage.smart_release_prompt_btn'), {
-                            confirmButtonText:  this.$t('Dialog.confirm_btn'),
-                            cancelButtonText: this.$t('Dialog.cancel_btn'),
-                            type: 'warning'
-                        }).then(()=>{
-                            this.handlePublishReport()
-                        }).catch(()=>{})
-                    }else{
-                        this.handlePublishReport()
-                    }
-                    
-                }
-                return
-            }else{
-                this.handlePublishReport()
-            }
-        },
-
-        //发布报告 晨报提示是否推送客群
-        async handlePublishReport(){
-            const res=await publishDayOrWeekReport({
-                ReportId:Number(this.reportId)
-            })
-            if(res.Ret===200){
-                if(this.form.type=='day'){
-                    if(res.Data){
-                        this.$alert(res.Data, this.$t('ReportManage.smart_release_prompt_btn'), {
-                            confirmButtonText: '确定',
-                            callback: action => {
-                                this.$confirm(this.$t('ReportManage.smart_msg.publishing_is_push'), this.$t('ReportManage.smart_release_prompt_btn'), {
-                                    confirmButtonText: this.$t('ReportManage.smart_btn.push'),
-								    cancelButtonText: this.$t('ReportManage.smart_btn.not_push'),
-                                    type: 'warning'
-                                }).then(async ()=>{
-                                    const pushRes=await reportMessageSend({ReportId:this.reportId})
-                                    if(pushRes.Ret===200){
-                                        this.$message.success(this.$t('ReportManage.smart_msg.push_success'))
-                                        setTimeout(() => {
-                                            this.$router.go(-1)
-                                        }, 1500);
-                                    }
-                                }).catch(()=>{
-                                    this.$message.success(this.$t('MsgPrompt.publish_msg'))
-                                    setTimeout(() => {
-                                        this.$router.go(-1)
-                                    }, 1500);
-                                })
-                            }
-                        });
-                    }else{
-                        this.$confirm(this.$t('ReportManage.smart_msg.publishing_is_push'), this.$t('ReportManage.smart_release_prompt_btn'), {
-                            confirmButtonText: this.$t('ReportManage.smart_btn.push'),
-							cancelButtonText: this.$t('ReportManage.smart_btn.not_push'),
-                            type: 'warning'
-                        }).then(async ()=>{
-                            const pushRes=await reportMessageSend({ReportId:this.reportId})
-                            if(pushRes.Ret===200){
-                                this.$message.success(this.$t('ReportManage.smart_msg.push_success'))
-                                setTimeout(() => {
-                                    this.$router.go(-1)
-                                }, 1500);
-                            }
-                        }).catch(()=>{
-                            this.$message.success(this.$t('MsgPrompt.publish_msg'))
-                            setTimeout(() => {
-                                this.$router.go(-1)
-                            }, 1500);
-                        })
-                    }
-
-                    
-
-
-                }else{
-                    this.$message.success(this.$t('MsgPrompt.publish_msg'))
-                    setTimeout(() => {
-                        this.$router.go(-1)
-                    }, 1500);
-                }
-            }
-
-        },
-
-        //获取章节太阳码
-        async handleGetWechatImg(item,index){
-            // 如果存在则不请求
-            if(item.QRCodeImg) return
-            const res=await chapterQRCodeImg({
-                CodeScene:JSON.stringify({chapterId:item.ReportChapterId.toString()}),
-                CodePage:'pages-report/chapterDetail'
-            })
-            if(res.Ret===200){
-                this.$set(this.list,index,{...item,QRCodeImg:res.Data})
-            }
-        }
-
-    }
-}
-</script>
-
-<style lang="scss" scoped>
-// .el-row{
-//     flex-wrap: wrap;
-// }
-.morning-week-page{
-    .section{
-        background: #FFFFFF;
-        border-radius: 4px;
-        border: 1px solid #ECECEC;
-        padding: 20px 30px;
-        margin-bottom: 30px;
-    }
-    .flex{
-        display: flex;
-        flex-wrap: wrap;
-    }
-    .list-box{
-    display: flex;
-    // align-items: center;
-    flex-wrap: wrap;
-    // justify-content: space-between;
-    margin-left: -20px;
-        .list-item{
-            margin-left: 20px;
-            padding: 10px;
-            border-radius: 4px;
-            margin-bottom: 20px;
-            border: 1px solid #ECECEC;
-            width: 160px;
-            // flex: 1;
-            .item-image-box{
-                position: relative;
-                width: 160px;
-                height: 160px;
-                margin: 0 auto;
-                img{
-                    width: 100%;
-                    display: block;
-                    height: 160px;
-                    background-color: gray;
-                }
-                p{
-                    // white-space: nowrap;
-                    word-break: break-all;
-                    font-size: 20px;
-                    color: white;
-                    font-weight: bolder;
-                    position: absolute;
-                    top: 50%;
-                    left: 50%;
-                    transform: translateX(-50%) translateY(-50%);
-                    cursor:default;
-                    pointer-events: none;
-                    min-width: 100%;
-                    text-align: center;
-                }
-            }
-        }
-    }
-}
-</style>

+ 0 - 997
src/views/report_manage/editChapterReport.vue

@@ -1,997 +0,0 @@
-<template>
-  <div id="editreport">
-    <div
-      id="leftfroala"
-      :class="{'full':!isRightFormShow,'block':isRightFormShow}"
-      v-loading="importChartNum > 0"
-      :element-loading-text="$t('ReportManage.ReportList.chart_insertion_progress')"
-      element-loading-spinner="el-icon-loading"
-      element-loading-background="rgba(0, 0, 0, 0.8)"
-    >
-      <froala
-        id="froala-editor"
-        ref="froalaEditor"
-        :tag="'textarea'"
-        :config="CNEditorConfig"
-        v-model="aeForm.content"
-      ></froala>
-    </div>
-    <div id="rightitems" v-show="isRightFormShow">
-      <div
-        style="text-align: right; padding: 0px 0 15px 0; box-sizing: border-box"
-      >
-        <div v-show="lastsavetime" style="color: #666; margin-bottom: 15px">
-          {{$t('ReportManage.ReportList.last_save_time')}}:{{ lastsavetime }}
-        </div>
-        <el-button
-          type="primary"
-          size="medium"
-          plain
-          @click.native="refreshReport"
-        >
-          {{$t('ReportManage.ReportList.click_refresh_btn')}}
-        </el-button>
-        <el-button
-          type="primary"
-          size="medium"
-          plain
-          @click.native="handlePreviewReport"
-          >{{$t('ReportManage.ReportList.preview_btn')}}</el-button
-        >
-        <el-button
-          type="primary"
-          size="medium"
-          plain
-          @click.native="autoSave('cg')"
-          >{{$t('ReportManage.ReportList.save_draft_btn')}}</el-button
-        >
-        <el-button
-          type="primary"
-          size="medium"
-          @click.native="handlePublishReport"
-          :loading="isPublishloading"
-          >{{$t('ReportManage.ReportList.publish_btn')}}</el-button
-        >
-      </div>
-      <div
-        style="
-          margin: 0px 0 0 20px;
-          padding: 10px 20px;
-          box-sizing: border-box;
-          background: #fff;
-          border: 1px solid #3464e0;
-        "
-      >
-        <el-tabs v-model="tabsactive">
-					<el-tab-pane :label="tab.label" :name="tab.key" v-for="tab in panelTabs" :key="tab.key"></el-tab-pane>
-				</el-tabs>
-				<div
-          v-if="tabsactive == '基础信息'"
-          style="height: calc(100vh - 280px); overflow-y: auto"
-        >
-          <el-form
-            :model="aeForm"
-            :rules="aerules"
-            ref="aeForm"
-            label-position="right"
-            label-width="90px"
-            class="demo-aeForm"
-            id="login-container"
-            @submit.native.prevent
-          >
-            <el-form-item prop="type" :label="$t('ReportManage.CategoryList.form_product_option')">
-              <el-input v-model="aeForm.type" size="medium" disabled></el-input>
-            </el-form-item>
-            <el-form-item prop="title" :label="$t('ReportManage.ReportList.title_ipt')">
-              <el-input
-                v-model="aeForm.title"
-                size="medium"
-                :placeholder="$t('ReportManage.ReportList.input_title_please')"
-              ></el-input>
-            </el-form-item>
-            <el-form-item prop="addType" :label="$t('ReportManage.ReportList.new_method_btn')">
-              <el-select
-                v-model="aeForm.addType"
-                :placeholder="$t('ReportManage.CategoryList.please_select')"
-                @change="handleAddTypeChange"
-                size="medium"
-                style="width: 270px"
-              >
-               <el-option :label="$t('ReportManage.ReportList.new_report_radio')" :value="1"></el-option>
-								<el-option :label="$t('ReportManage.ReportList.inherit_report_radio')" :value="2"></el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item
-              prop="ticket"
-              :label="$t('ReportManage.ReportList.display_metrics_lable')"
-              v-if="$route.query.type == 'day'"
-            >
-              <el-select
-                v-model="aeForm.ticket"
-                :placeholder="$t('ReportManage.CategoryList.please_select')"
-                multiple
-                collapse-tags
-                size="medium"
-                style="width: 270px"
-              >
-                <el-option
-                  v-for="item in ticketList"
-                  :key="item.BaseColumnTicker"
-                  :label="item.BaseColumnName"
-                  :value="item.BaseColumnTicker"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item prop="author" :label="$t('ReportManage.smart_creator_btn')">
-              <el-input :placeholder="$t('ReportManage.CategoryList.please_input')" v-model="aeForm.author"></el-input>
-            </el-form-item>
-            <el-form-item :label="$t('ReportManage.ReportList.creation_time_select')">
-              <el-date-picker
-                v-model="aeForm.createTime"
-                type="date"
-                value-format="yyyy-MM-dd"
-                :placeholder="$t('ReportManage.ReportList.select_date')"
-                size="medium"
-                :clearable="false"
-                style="width: 270px"
-              ></el-date-picker>
-            </el-form-item>
-            <el-form-item :label="$t('ReportManage.ReportList.recording_lable')" v-if="$route.query.type == 'week'">
-              <el-input
-                v-model="aeForm.audioUrl"
-                readonly
-                style="width: 65%"
-                :placeholder="$t('ReportManage.ReportList.upload_audio_file')"
-              ></el-input>
-              <el-upload
-                style="display: inline-block; margin-left: 10px"
-                action=""
-                accept=".mp3,.m4a"
-                :http-request="handleUpload"
-                :before-upload="handelBeforeUploadAudio"
-                :show-file-list="false"
-                :disabled="startUploadAudio"
-              >
-                <el-button type="primary" :loading="startUploadAudio"
-                  >{{$t('ReportManage.ReportList.up_recording_lable')}}</el-button
-                >
-              </el-upload>
-
-              <p style="color: #999; font-size: 12px">
-                {{$t('ReportManage.ReportList.note_audio_minutes')}}
-              </p>
-            </el-form-item>
-          </el-form>
-        </div>
-        <div v-if="tabsactive == '图表插入'">
-          <el-input
-           :placeholder="$t('ReportManage.ReportList.chart_name')"
-            v-model="key_word"
-            size="medium"
-            prefix-icon="el-icon-search"
-            @input="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist(key_word)}"
-          >
-          </el-input>
-          <el-radio-group v-model="chart_source" @change="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist()}" style="margin-top: 10px;">
-            <el-radio :label="1">{{$t('ReportManage.ReportList.chart_inventory_radio')}}</el-radio>
-						<el-radio :label="2">{{$t('ReportManage.ReportList.price_curve_radio')}}</el-radio> 
-						<el-radio :label="3">{{$t('ReportManage.ReportList.related_charts_radio')}}</el-radio>
-						<el-radio :label="6">{{$t('ReportManage.ReportList.curve_fitting_radio')}}</el-radio>
-						<el-radio :label="7">{{$t('ReportManage.ReportList.statistical_feature_radio')}}</el-radio>
-						<el-radio :label="10">{{$t('ReportManage.ReportList.intercommodity_analysis_radio')}}</el-radio>
-          </el-radio-group>
-          <div style="margin: 10px 0">
-            <el-checkbox v-model="isShowMe" @change="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist(key_word)}">{{$t('ReportManage.ReportList.just_mine_radio')}}</el-checkbox>
-          </div>
-          <div
-            id="reportwin"
-            ref="chartListRef"
-            style="
-              height: calc(100vh - 370px);
-              overflow-x: hidden;
-              overflow-y: auto;
-            "
-            v-infinite-scroll="loadReportHandle"
-            :infinite-scroll-immediate="false"
-          >
-          <template v-if="newreportlist.length">
-            <div
-              v-for="(item, index) in newreportlist"
-              :key="item.ChartInfoId"
-              class="liststy"
-              :style="item.Disabled && 'cursor: not-allowed;'"
-            >
-              <p class="color_primary">{{ item.ChartName }}</p>
-              <img
-                :src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage"
-                :id="'listnode' + index"
-                @click="insertHtml(item)"
-              />
-            </div>
-          </template>
-          <tableNoData :text="$t('ReportManage.ReportList.no_chart_table_available')" size="mini" v-else/>
-          </div>
-        </div>
-        <div v-if="tabsactive == '沙盘插入'">
-          <el-input
-            :placeholder="$t('ReportManage.ReportList.no_reports_msg')"
-            v-model="sandTabelQuery.Keyword"
-            size="medium"
-            prefix-icon="el-icon-search"
-          >
-          </el-input>
-          <div
-            id="sandTable-container"
-            ref="sandTable"
-            style="
-              height: calc(100vh - 370px);
-              overflow-x: hidden;
-              overflow-y: auto;
-            "
-            @scroll="sandTableHandleScroll"
-          >
-            <template v-if="sandTableList.length">
-            <div
-              v-for="(item, index) in sandTableList"
-              :key="item.SandboxId"
-              class="liststy"
-            >
-              <p class="color_primary">{{ item.Name }}</p>
-              <img
-                :src="item.PicUrl"
-                :id="'sandTable' + index"
-                @click="insertHtml(item, 'image')"
-              />
-              <!-- <p class="source-identification">来源:弘则研究</p> -->
-            </div>
-            </template>
-            <tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-else/>
-          </div>
-        </div>
-        <div v-if="tabsactive == '表格插入'">
-					<el-input
-						:placeholder="$t('ReportManage.ReportList.table_name_tabs')"
-						v-model="sheetSearchObj.Keyword"
-						size="medium"
-						prefix-icon="el-icon-search"
-						@input="getSheetList"
-					>
-					</el-input>
-					<div
-						style="
-							height: calc(100vh - 370px);
-							overflow-x: hidden;
-							overflow-y: auto;
-						"
-					>
-						<template v-if="sheetSearchList.length">
-							<div
-								v-for="item in sheetSearchList"
-								:key="item.ExcelInfoId"
-								class="liststy"
-							>
-								<p class="color_primary">{{ item.ExcelName }}</p>
-								<img
-									:src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage"
-									:id="'sheet' + item.ExcelInfoId"
-									style="object-fit: contain;height: 250px;"
-									@click="insertHtml(item,'sheet')"
-								/>
-							</div>
-						</template>
-
-						<tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-else/>
-					</div>
-				</div>
-        <div v-if="tabsactive == 'MyETA批量插入'">
-          <importMyChart @handleImportMyChart="handleImportMyChart" />
-        </div>
-        <div v-if="tabsactive == '语义分析插入'">
-					<importSemantics @handleImportSemantic="(item)=>insertHtml(item,'image')"/>
-				</div>
-      </div>
-    </div>
-    <span
-            class="slide-icon slide-btn-icon"
-            :class="{'slide-left':!isRightFormShow,'slide-right':isRightFormShow}"
-            @click="isRightFormShow = !isRightFormShow"
-        >
-            <i :class="{'el-icon-d-arrow-left':!isRightFormShow,'el-icon-d-arrow-right':isRightFormShow}"></i>
-        </span>
-  </div>
-</template>
-
-<script>
-import {
-  autosave,
-  chapterDetail,
-  reportedit,
-  dayTicketList,
-  dataBaseInterface,
-  saveChapterReport,
-  getChapterReportBefore,
-  getChapterReportIsLast,
-  publishChapterReport,
-  sandInterface,
-  getOSSSign,
-} from "api/api.js";
-import MD5 from "js-md5";
-import futuresInterface from "@/api/modules/futuresBaseApi";
-import chartRelevanceApi from "@/api/modules/chartRelevanceApi";
-import {
-  fittingEquationInterface,
-  statisticFeatureInterface,
-} from "@/api/modules/chartRelevanceApi";
-import http from "@/api/http.js";
-import mixinMsg from "./mixins/messagePush";
-import reportMixin from './mixins/reportMixin';
-import moment from "moment";
-import importMyChart from "./components/importMyChart.vue";
-import importSemantics from './components/importSemantics.vue';
-import {uploadFileDirect} from "@/utils/common.js"
-
-export default {
-  beforeRouteEnter(to, from, next) {
-    // 设置面包屑
-    to.matched[1].meta.pathName = `编辑${
-      to.query.type == "day" ? "晨报" : "周报"
-    }`;
-    to.matched[1].name = to.query.typename;
-    next();
-  },
-  mixins: [mixinMsg,reportMixin],
-  data() {
-    let that=this
-    return {
-      isRightFormShow:true,
-      weekPanelTabs:[
-        "基础信息",
-        "图表插入",
-        "MyETA批量插入",
-        "沙盘插入",
-        "语义分析插入"
-      ],
-      //批量导入图表
-      importChartNum: 0, //批量导入图表的数量 如果大于0则说明在加载
-
-      report_id: this.$route.query.id,
-      tabsactive: "基础信息",
-      ticketList: [], //指标列表
-      key_word: "",
-      newreportlist: [],
-
-      // 沙盘插入 ----------start
-      sandTabelQuery: {
-        PageSize: 13,
-        CurrentIndex: 1,
-        Keyword: "",
-      }, // 沙盘图查询参数
-      sandTableLoading: false,
-      sandTableTotal: 0, //沙盘总共条数
-      sandTableList: [],
-      isRequesting: false,
-      loadedText: "", // 全部加载完的文字提示
-      // 沙盘插入 ------------- end
-      chartlist: [],
-      aeForm: {
-        type: "", //品种
-        title: "", //标题
-        addType: 2, //新增方式
-        ticket: [], //指标
-        author: localStorage.getItem("userName") || "",
-        createTime: http.dateFormatter(new Date(), false),
-        content: "",
-        audioUrl: "",
-        audioDuration: 0,
-        audioSize: 0,
-      },
-      aerules: {
-        title: [
-          {
-            required: true,
-            message: "请输入",
-            trigger: "blur",
-          },
-        ],
-        addType: [{ required: true, message: "请选择", trigger: "change" }],
-      },
-      lastEditRange: null,
-      reportloadding: false,
-      timer: null,
-      ischange: false,
-
-      chapterTypeId: 0, //章节类型id
-
-      search_page: 1,
-      search_page_sizes: 20,
-      search_have_more: true,
-
-      startUploadAudio: false,
-
-      autoSaveFlag: true, //是否开启自动保存
-    };
-  },
-  mounted() {
-    this.getreportdetail();
-    this.getreportlist("");
-
-		this.getSandTable();
-		this.getSheetList();
-    this.timer = setInterval(() => {
-      this.autoSave();
-    }, 6000);
-
-    window.addEventListener('message',this.reInitIframe)
-  },
-  updated() {
-    $("#leftfroala").find("p").css({ fontSize: "16px" });
-  },
-  destroyed() {
-    window.removeEventListener('message',this.reInitIframe)
-    if (this.timer) {
-      clearInterval(this.timer);
-    }
-  },
-  watch: {
-    "sandTabelQuery.Keyword"(newval, oldval) {
-      this.$refs.sandTable.scrollTop = 0;
-      this.sandTabelQuery.CurrentIndex = 1;
-      this.getSandTable();
-    },
-  },
-  methods: {
-    handelBeforeUploadAudio(e) {
-      // console.log(e);
-      if (
-        e.name.indexOf(".mp3") == -1 &&
-        e.name.indexOf(".wav") == -1 &&
-        e.name.indexOf(".wma") == -1 &&
-        e.name.indexOf(".m4a") == -1
-      ) {
-        // this.$message.warning("上传失败,上传音频格式不正确");
-        this.$message.warning(this.$t('ReportManage.ReportList.upload_audio_error_msg'));
-        upload_audio_error_msg
-        return false;
-      }
-    },
-    async handleUpload(e) {
-      const duration = await this.handleGetDuration(e.file);
-      if (duration > 60 * 15) {
-        //this.$message.warning("音频时长不得超过15分钟");
-        this.$message.warning(this.$t('ReportManage.ReportList.audio_minutes_exceed'));
-        return;
-      }
-      this.aeForm.audioDuration = duration;
-      this.aeForm.audioSize = e.file.size / 1024 / 1024; //单位MB
-      this.startUploadAudio = true;
-
-      const t = new Date().getTime().toString();
-      const temName = `static/yb/audio/${process.env.NODE_ENV}/${MD5(t)}.${
-        e.file.type.split("/")[1]
-      }`;
-      // const temName = `testOne.${
-      //   e.file.type.split("/")[1]
-      // }`;
-
-      let clientType = this.$setting.dynamicOutLinks.ObjectStorageClient ||
-                        this.$store.state.dynamicOutLinks.ObjectStorageClient ||
-                        JSON.parse(localStorage.getItem('dynamicOutLinks')).ObjectStorageClient
-      uploadFileDirect(clientType,e.file,temName).then(res=>{
-        console.log(res);
-        this.aeForm.audioUrl = res;
-      })
-      .finally(()=>{
-        this.startUploadAudio = false;
-      })
-      // const res = await getOSSSign({StorageSource:1});
-      // if (res.Ret === 200) {
-        // this.handleUploadToOSS(e.file, res.Data);
-      // }
-    },
-    //上传到阿里云
-    async handleUploadToOSS(file, ossRes) {
-
-       let oss_params = {
-        // yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
-        region: ossRes.RegionId,
-        // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
-        accessKeyId: ossRes.AccessKeyId,
-        accessKeySecret: ossRes.AccessKeySecret,
-        // 从STS服务获取的安全令牌(SecurityToken)。
-        stsToken: ossRes.SecurityToken,
-        // 填写Bucket名称,例如examplebucket。
-        bucket: ossRes.Bucketname,
-        endpoint: ossRes.Endpoint,
-        cname:true,
-        timeout:6000000
-      }
-
-      let imgHost = ossRes.Imghost;
-
-      ALOSSINS = new OSS(oss_params);
-      // 生成文件名
-      const t = new Date().getTime().toString();
-      const temName = `static/yb/audio/${process.env.NODE_ENV}/${MD5(t)}.${
-        file.type.split("/")[1]
-      }`;
-      console.log(temName);
-
-      try {
-        const res = await ALOSSINS.put(temName, file);
-        console.log("上传结果", res);
-        if (res.res.status === 200) {
-          this.aeForm.audioUrl = imgHost + res.name;
-          this.startUploadAudio = false;
-        }
-      } catch (error) {
-        console.log("上传到阿里云失败", error);
-        if (error.name !== "cancel") {
-          //不是取消上传的则给错误提示
-          this.$message.warning("上传失败,请刷新重试");
-        }
-        this.startUploadAudio = false;
-      }
-    },
-
-    //获取音频时长的promise
-    handleGetDuration(file) {
-      return new Promise((resolve, reject) => {
-        const fileUrl = URL.createObjectURL(file);
-        const audioEl = new Audio(fileUrl);
-        audioEl.addEventListener("loadedmetadata", (e) => {
-          console.log("e.path", e.path);
-          console.log("e.composedPath", e.composedPath());
-          console.log("获取视频时长", e.composedPath()[0].duration);
-          console.log(audioEl.duration);
-          const t = e.composedPath()[0].duration;
-          resolve(t);
-        });
-      });
-    },
-
-    // 每十秒自动保存
-    autoSave(e) {
-      // if(!this.aeForm.title&&e=='cg'){
-      // 	this.$message.warning('请填写标题')
-      // 	return
-      // }
-      // if(!e){//自动保存情况
-      // 	if(!this.ischange||!this.aeForm.title) return
-      // }
-      // if(e!='cg'||!this.ischange||!this.aeForm.title) return
-
-      //去除校验title等必填项
-      if (!e && !this.ischange) return;
-
-      if (!this.autoSaveFlag) {
-        e === "cg" && this.$message.error(/*"有图片未上传完成,请稍等"*/this.$t('ReportManage.ReportList.upload_img_error_msg'));
-        return;
-      }
-
-      let arr = [];
-      this.ticketList.forEach((item) => {
-        let obj = {
-          ticker: "",
-          sort: 1,
-          lable: "",
-        };
-        if (this.aeForm.ticket.includes(item.BaseColumnTicker)) {
-          obj.ticker = item.BaseColumnTicker;
-          obj.sort = arr.length + 1;
-          obj.lable = item.BaseColumnName;
-          arr.push(obj);
-        }
-      });
-      //如果富文本中有未上传完成的图片,去除这个dom
-      $(".fr-element").find("img.fr-uploading").length &&
-        $(".fr-element").find("img.fr-uploading").remove();
-
-      saveChapterReport({
-        ReportChapterId: Number(this.$route.query.id),
-        Title: this.aeForm.title,
-        AddType: this.aeForm.addType,
-        Author: this.aeForm.author,
-        CreateTime: this.aeForm.createTime,
-        TickerList: arr,
-        Content: $(".fr-element").html(),
-        VideoUrl: this.aeForm.audioUrl,
-        VideoName: `${this.aeForm.title}(${moment().format("MMDD")})`,
-        VideoPlaySeconds: Number(this.aeForm.audioDuration)
-          .toFixed(2)
-          .toString(),
-        VideoSize: Number(this.aeForm.audioSize).toFixed(2).toString(),
-      }).then((res) => {
-        if (res.Ret === 200) {
-          // this.report_id = res.Data.ReportId;
-          this.lastsavetime = http.dateFormatter(new Date(), true);
-          if (e == "cg") {
-            // this.$message.success("保存成功");
-            this.$message.success( this.$t('MsgPrompt.saved_msg'));
-          }
-        }
-        this.ischange = false;
-      });
-    },
-    //章节详情
-    getreportdetail() {
-      chapterDetail({ ReportChapterId: parseInt(this.report_id) }).then(
-        (res) => {
-          if (res.Ret == 200) {
-            let data = res.Data;
-            this.aeForm.type = data.TypeName;
-            this.aeForm.title = data.Title;
-            this.aeForm.addType = data.AddType;
-            this.aeForm.author =
-              data.Author || localStorage.getItem("userName");
-            this.aeForm.createTime = moment(data.CreateTime).format(
-              "YYYY-MM-DD"
-            );
-            this.aeForm.content = data.Content;
-            if (data.VideoKind == 1) {
-              this.aeForm.audioUrl = data.VideoUrl;
-              this.aeForm.audioDuration = data.VideoPlaySeconds;
-              this.aeForm.audioSize = data.VideoSize;
-            }
-            this.chapterTypeId = data.TypeId;
-
-            // 晨报获取指标数据
-            if (data.ReportType == "day") {
-              this.getDayTicketList();
-            }
-          }
-        }
-      );
-    },
-
-    //预览
-    handlePreviewReport() {
-      if (!this.aeForm.title) {
-        this.$message.error(/* "请输入标题" */this.$t('ReportManage.ReportList.input_title_please'));
-        return false;
-      }
-      if (!this.autoSaveFlag) {
-        this.$message.error(/*"有图片未上传完成,请稍等"*/this.$t('ReportManage.ReportList.upload_img_error_msg'));
-        return;
-      }
-      //如果富文本中有未上传完成的图片,去除这个dom
-      $(".fr-element").find("img.fr-uploading").length &&
-        $(".fr-element").find("img.fr-uploading").remove();
-      let params = {
-        ReportId: parseInt(this.report_id),
-        AddType: this.aeForm.addType,
-        Title: this.aeForm.title,
-        Author: this.aeForm.author,
-        Content: $(".fr-element").html(),
-        CreateTime: this.aeForm.createTime,
-      };
-
-      sessionStorage.setItem("reportdtl", JSON.stringify(params));
-      let { href } = this.$router.resolve({ name: "预览报告" });
-      window.open(href, "_blank");
-    },
-
-    //点击发布 首先判断是否为最后一篇
-    async handlePublishReport() {
-      if (this.$route.query.type == "week" && !this.aeForm.audioUrl) {
-        const validRes = await this.handleWeekValidAudio();
-        if (!validRes) return;
-      }
-      if (!this.autoSaveFlag) {
-        this.$message.error(/*"有图片未上传完成,请稍等"*/this.$t('ReportManage.ReportList.upload_img_error_msg'));
-        return;
-      }
-      this.isPublishloading = true;
-      const res = await getChapterReportIsLast({
-        ReportChapterId: Number(this.report_id),
-      });
-      if (res.Ret === 200) {
-        if (res.Data) {
-          this.$confirm(
-            this.$t('ReportManage.ReportList.all_update_publish_msg'),
-            this.$t('ReportManage.smart_release_prompt_btn'),
-            {
-              confirmButtonText: this.$t('ReportManage.smart_btn.push'),
-							cancelButtonText: this.$t('ReportManage.smart_btn.not_push'),
-              type: "warning",
-              distinguishCancelAndClose: true,
-              beforeClose: (action, instance, done) => {
-                if (action == "cancel") {
-                  this.publishReport(0);
-                } else if (action == "confirm") {
-                  this.publishReport(1);
-                } else {
-                  this.isPublishloading = false;
-                }
-                done();
-              },
-            }
-          );
-        } else {
-          this.publishReport(0);
-        }
-      }
-    },
-
-    // 周报校验是否上传了音频
-    handleWeekValidAudio() {
-      return new Promise((resovle, reject) => {
-        this.$confirm(this.$t('ReportManage.ReportList.is_publish_report_msg'), this.$t('ReportManage.smart_release_prompt_btn'), {
-          confirmButtonText: this.$t('ReportManage.smart_btn.push'),
-					cancelButtonText: this.$t('ReportManage.smart_btn.not_push'),
-          type: "warning",
-          beforeClose: (action, instance, done) => {
-            if (action == "confirm") {
-              resovle(true);
-            } else {
-              resovle(false);
-            }
-            done();
-          },
-        });
-      });
-    },
-
-    async publishReport(PublishReport) {
-      let arr = [];
-      this.ticketList.forEach((item) => {
-        let obj = {
-          ticker: "",
-          sort: 1,
-          lable: "",
-        };
-        if (this.aeForm.ticket.includes(item.BaseColumnTicker)) {
-          obj.ticker = item.BaseColumnTicker;
-          obj.sort = arr.length + 1;
-          obj.lable = item.BaseColumnName;
-          arr.push(obj);
-        }
-      });
-      //如果富文本中有未上传完成的图片,去除这个dom
-      $(".fr-element").find("img.fr-uploading").length &&
-        $(".fr-element").find("img.fr-uploading").remove();
-      const res = await publishChapterReport({
-        ReportChapterId: Number(this.$route.query.id),
-        Title: this.aeForm.title,
-        AddType: this.aeForm.addType,
-        Author: this.aeForm.author,
-        CreateTime: this.aeForm.createTime,
-        TickerList: arr,
-        Content: $(".fr-element").html(),
-        PublishReport: PublishReport,
-        VideoUrl: this.aeForm.audioUrl,
-        VideoName: `${this.aeForm.title}(${moment().format("MMDD")})`,
-        VideoPlaySeconds: Number(this.aeForm.audioDuration)
-          .toFixed(2)
-          .toString(),
-        VideoSize: Number(this.aeForm.audioSize).toFixed(2).toString(),
-      });
-      if (res.Ret === 200) {
-         this.$message.success(this.$t('MsgPrompt.publish_msg'))
-        setTimeout(() => {
-          this.$router.go(-1);
-        }, 1000);
-      }
-      this.isPublishloading = false;
-    },
-
-    //批量插入我的图表
-    handleImportMyChart(data) {
-      //设置编辑器获取焦点
-      this.editor.events.focus();
-      // 获取选定对象
-      const selection = getSelection();
-      // 判断是否有最后光标对象存在
-      if (this.lastEditRange) {
-        // 存在最后光标对象,选定对象清除所有光标并添加最后光标还原之前的状态
-        selection.removeAllRanges();
-        selection.addRange(this.lastEditRange);
-      }
-      //插入内容
-      let htmlStr = "";
-      const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
-
-      data.forEach((item) => {
-        const t = new Date().getTime();
-        item.domId = item.UniqueCode + t; //避免多次添加同一图表 id相同
-        htmlStr =
-          htmlStr +
-          `<p style='text-align:left; margin-top:10px;'>
-							<iframe id='${item.domId}' src='${LINK_CHART_URL}?code=${item.UniqueCode}&lang=${this.currentLang}' width='100%' height='350' style='border-width:0px; min-height:350px;'></iframe>
-						</p>`;
-      });
-      this.$nextTick(() => {
-        console.log("import start", data);
-        this.importChartNum = data.length;
-        this.editor.html.insert(htmlStr);
-        this.handleListenIframeLoad(data);
-      });
-
-      this.lastEditRange = selection.getRangeAt(0);
-    },
-    // 监听批量导入的iframe是否加载完
-    handleListenIframeLoad(list) {
-      list.forEach((item) => {
-        let ifm = document.getElementById(item.domId);
-        ifm.onload = (e) => {
-          this.importChartNum--;
-          console.log("一个iframe加载了", e.path[0]);
-        };
-      });
-    },
-
-    // 获取沙盘图列表 分页
-    getSandTable() {
-      this.sandTableLoading = true;
-      this.isRequesting = true;
-      sandInterface
-        .sandlistByQuote(this.sandTabelQuery)
-        .then(({ Data: { List, Paging } }) => {
-          if (this.sandTabelQuery.CurrentIndex > 1) {
-            this.sandTableList = [...this.sandTableList, ...List];
-          } else {
-            this.sandTableList = List;
-            this.sandTableTotal = Paging.Totals;
-            if (this.sandTableList.length == 0) {
-              this.loadedText = this.$t('Table.prompt_slogan');
-            } else if (this.sandTableList.length >= this.sandTableTotal) {
-              this.loadedText = this.$t('ReportManage.smart_msg.all_loaded_have');
-            } else {
-            }
-          }
-        })
-        .finally(() => {
-          this.sandTableLoading = false;
-          this.isRequesting = false;
-        });
-    },
-    // 沙盘列表滚动事件,触底加载下一页数据 防抖
-    sandTableHandleScroll: _.debounce(function (e) {
-      if (this.sandTableList.length >= this.sandTableTotal) {
-        this.loadedText = this.$t('ReportManage.smart_msg.all_loaded_have');
-        return;
-      }
-      if (
-        e.target.scrollHeight - e.target.clientHeight - e.target.scrollTop <
-          10 &&
-        !this.isRequesting
-      ) {
-        this.sandTabelQuery.CurrentIndex++;
-        this.getSandTable();
-      }
-    }, 100),
-    // 获取指标数据
-    async getDayTicketList() {
-      const res = await dayTicketList({
-        ReportChapterId: Number(this.report_id),
-      });
-      if (res.Ret === 200) {
-        this.ticketList = res.Data || [];
-        this.ticketList.forEach((item) => {
-          if (item.Selected) {
-            this.aeForm.ticket.push(item.BaseColumnTicker);
-          }
-        });
-      }
-    },
-
-    //选择继承报告时 获取上篇报告内容
-    async handleAddTypeChange() {
-      if (this.aeForm.addType == 2) {
-        const res = await getChapterReportBefore({
-          TypeId: Number(this.chapterTypeId),
-          ReportType: this.$route.query.type,
-        });
-        if (res.Ret === 200) {
-          let data = res.Data;
-          this.aeForm.type = data.TypeName;
-          this.aeForm.title = data.Title;
-          this.aeForm.author = data.Author || localStorage.getItem("userName");
-          this.aeForm.createTime = moment(data.CreateTime).format("YYYY-MM-DD");
-          this.aeForm.content = data.Content;
-          // 晨报获取指标数据
-          if (data.ReportType == "day") {
-            this.getDayTicketList();
-          }
-        }
-      }
-      if (this.aeForm.addType == 1) {
-        this.aeForm.content = "";
-      }
-    },
-  },
-  components: { importMyChart,importSemantics },
-};
-</script>
-
-<style scoped lang="scss">
-#editreport {
-  display: flex;
-  overflow: hidden;
-  #leftfroala {
-    flex: 1;
-    overflow: hidden;
-    &.full{
-        max-width: calc(100vw - 200px - 60px);
-    }
-    &.block{
-        max-width: calc(100vw - 200px - 60px - 500px);
-    }
-  }
-  #rightitems {
-    width: 500px;
-    flex: 500px 0 0;
-    overflow: hidden;
-    #tabs {
-      padding: 0px 20px;
-      box-sizing: border-box;
-      margin-bottom: 15px;
-      overflow: hidden;
-      > p {
-        /* display: inline-block; */
-        float: left;
-        width: 25%;
-        font-size: 18px;
-        cursor: pointer;
-        color: #1f2e4d;
-        padding: 10px 0;
-        text-align: center;
-      }
-      > p.active {
-        border-bottom: 2px solid #3464e0;
-        color: #3464e0;
-      }
-    }
-    .liststy {
-      width: 100%;
-      margin: 20px 0;
-      padding: 20px;
-      box-sizing: border-box;
-      border: 1px solid #eaeaea;
-      border-radius: 10px;
-      position: relative;
-      overflow: hidden;
-      > p {
-        text-align: center;
-        font-size: 16px;
-        margin-bottom: 10px;
-      }
-      > img {
-        width: 100%;
-        height: auto;
-      }
-      // .source-identification {
-      //   text-align: left;
-      // }
-    }
-    .loaded-text {
-      height: 20px;
-      text-align: center;
-      color: #666;
-      font-size: 14px;
-    }
-  }
-  .slide-icon{
-    position:fixed;
-    top: 50%;
-    transform: translateY(-50%);
-    z-index: 99;
-    &:hover {
-        background-color: #e0e0e0;
-    }
-    &.slide-left {
-        right: 30px;
-    }
-    &.slide-right {
-        right: 515px;
-    }
-  }
-}
-</style>
-<style lang="scss">
-#editreport {
-	.el-tabs__nav-wrap::after {
-		height: 0;
-	}
-	.el-tabs__item { font-size: 16px; }
-}	
-</style>

+ 0 - 1047
src/views/report_manage/editreportNew.vue

@@ -1,1047 +0,0 @@
-<template>
-	<div id="editreport">
-		<div 
-			id="leftfroala" 
-			:class="{'full':!isRightFormShow,'block':isRightFormShow}"
-			v-loading="importChartNum>0" 
-			:element-loading-text="$t('ReportManage.ReportList.chart_insertion_progress')"
-			element-loading-spinner="el-icon-loading"
-			element-loading-background="rgba(0, 0, 0, 0.8)"
-		>
-			<froala
-				id="froala-editor"
-				ref="froalaEditor"
-				:tag="'textarea'"
-				:config="CNEditorConfig"
-				v-model="aeForm.content"
-			></froala>
-		</div>
-		<div id="rightitems" v-show="isRightFormShow">
-			<!-- 通过接口判断是否走审批流,按钮显示的不一致,干脆判断完成再显示所有按钮-->
-			<div v-if="!pageLoading"
-				style="
-					text-align: right;
-					padding: 0px 0 15px 0;
-					box-sizing: border-box;
-				"
-			>
-				<div v-show="lastsavetime" style="color: #666; margin-bottom: 15px">
-					{{$t('ReportManage.ReportList.last_save_time')}}:{{ lastsavetime }}
-				</div>
-				<el-button
-					type="primary"
-					size="medium"
-					plain
-					@click.native="refreshReport"
-				>
-					{{$t('ReportManage.ReportList.click_refresh_btn')}}
-				</el-button>
-				<el-button v-permission="permissionBtn.reportManageBtn.reportManage_reportView"
-					type="primary"
-					size="medium"
-					plain
-					@click.native="clickreportadd('yl')"
-					>{{$t('ReportManage.ReportList.preview_btn')}}</el-button
-				>
-				<el-button
-					type="primary"
-					size="medium"
-					plain
-					@click.native="clickreportadd('cg')"
-					>{{$t('ReportManage.ReportList.save_draft_btn')}}</el-button
-				>
-				<!--不走审批流-->
-				<template v-if="!isApprove||!hasApproveFlow">
-					<el-button v-permission="permissionBtn.reportManageBtn.reportManage_publish"
-						type="primary"
-						size="medium"
-						:disabled="checkLoading"
-						@click.native="clickreportadd('dsfb')"
-						>{{$t('ReportManage.ReportList.scheduled_publish_btn')}}</el-button
-					>
-					<el-button v-permission="permissionBtn.reportManageBtn.reportManage_publish"
-						type="primary"
-						size="medium"
-						:disabled="checkLoading"
-						@click.native="clickreportadd('fb')"
-						:loading="isPublishloading"
-						>{{$t('ReportManage.ReportList.publish_btn')}}</el-button
-					>
-				</template>
-				<template v-if="isApprove&&hasApproveFlow">
-					<el-button v-permission="permissionBtn.reportManageBtn.reportManage_publish"
-						:disabled="checkLoading"
-						type="primary" size="medium" @click="clickreportadd('submit')">{{$t('ReportManage.ReportList.submission_btn')}}</el-button>
-				</template>
-			</div>
-			<div
-				style="
-					margin: 0px 0 0 20px;
-					padding: 10px 20px;
-					box-sizing: border-box;
-					background: #fff;
-					border: 1px solid #3464e0;
-				"
-			>
-				<el-tabs v-model="tabsactive">
-					<el-tab-pane :label="tab.label" :name="tab.key" v-for="tab in panelTabs" :key="tab.key"></el-tab-pane>
-				</el-tabs>
-				<div
-					v-if="tabsactive == '基础信息'"
-					style="height: calc(100vh - 280px); overflow-y: auto"
-				>
-					<el-form
-						:model="aeForm"
-						:rules="aerules"
-						ref="aeForm"
-						label-position="right"
-						label-width="90px"
-						class="demo-aeForm"
-						id="login-container"
-						@submit.native.prevent
-					>
-						<el-form-item prop="add_type" :label="$t('ReportManage.ReportList.new_method_btn')">
-							<el-select
-								v-model="aeForm.add_type"
-								@change="userclassidreportdetail"
-								:placeholder="$t('ReportManage.CategoryList.please_select')"
-								size="medium"
-								style="width: 270px"
-							>
-								<el-option :label="$t('ReportManage.ReportList.new_report_radio')" :value="1"></el-option>
-								<el-option :label="$t('ReportManage.ReportList.inherit_report_radio')" :value="2"></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item prop="classifynameArr" :label="$t('ReportManage.ReportList.classificiation_selest')">
-							<el-cascader
-								@change="userclassidreportdetail"
-								:options="optionsArr"
-								v-model="aeForm.classifynameArr"
-								:placeholder="$t('ReportManage.smart_type_filtering')"
-								size="medium"
-								style="width: 270px"
-							></el-cascader>
-						</el-form-item>
-						<el-form-item prop="title" :label="$t('ReportManage.ReportList.title_ipt')">
-							<el-input
-								type="textarea"
-								:rows="2"
-								:placeholder="$t('ReportManage.CategoryList.please_input')"
-								v-model="aeForm.title"
-								size="medium"
-							></el-input>
-						</el-form-item>
-						<el-form-item :label="$t('ReportManage.ReportList.abstract_ipt')">
-							<el-input
-								type="textarea"
-								:rows="2"
-								:placeholder="$t('ReportManage.CategoryList.please_input')"
-								v-model="aeForm.abstract"
-								size="medium"
-							></el-input>
-						</el-form-item>
-						<el-form-item :label="$t('ReportManage.ReportList.author_select')">
-							<el-select
-								v-model="aeForm.author"
-								multiple
-								:placeholder="$t('ReportManage.CategoryList.please_select')"
-								size="medium"
-								style="width: 270px"
-							>
-								<el-option
-									v-for="(item, i) in authorlist"
-									:key="i"
-									:label="item.ReportAuthor"
-									:value="item.ReportAuthor"
-								></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item :label="$t('ReportManage.ReportList.frequency_select')">
-							<el-select
-								v-model="aeForm.frequency"
-								:placeholder="$t('ReportManage.CategoryList.please_select')"
-								size="medium"
-								style="width: 270px"
-							>
-								<el-option :label="$t('ReportManage.smart_annually')" value="年度"></el-option>
-								<el-option :label="$t('ReportManage.smart_semi_annually')" value="半年度"></el-option>
-								<el-option :label="$t('ReportManage.smart_quarterly')" value="季度"></el-option>
-								<el-option :label="$t('ReportManage.smart_monthly')" value="月度"></el-option>
-								<el-option :label="$t('ReportManage.smart_bi_weekly')" value="双周度"></el-option>
-								<el-option :label="$t('ReportManage.smart_weekly')" value="周度"></el-option>
-								<el-option :label="$t('ReportManage.smart_daily')" value="日度"></el-option>
-								<el-option :label="$t('ReportManage.smart_irregularly')" value="不定时"></el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item :label="$t('ReportManage.ReportList.creation_time_select')">
-							<el-date-picker
-								v-model="aeForm.create_time"
-								type="date"
-								value-format="yyyy-MM-dd"
-								:placeholder="$t('ReportManage.ReportList.select_date')"
-								size="medium"
-								:clearable="false"
-								style="width: 270px"
-							></el-date-picker>
-						</el-form-item>
-					</el-form>
-				</div>
-				<div v-if="tabsactive == '图表插入'">
-					<el-input
-						:placeholder="$t('ReportManage.ReportList.chart_name')"
-						v-model="key_word"
-						size="medium"
-						prefix-icon="el-icon-search"
-						@input="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist(key_word)}"
-					>
-					</el-input>
-					<el-radio-group v-model="chart_source" @change="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist()}" style="margin-top: 10px;">
-						<el-radio :label="1">{{$t('ReportManage.ReportList.chart_inventory_radio')}}</el-radio>
-						<el-radio :label="2">{{$t('ReportManage.ReportList.price_curve_radio')}}</el-radio> 
-						<el-radio :label="3">{{$t('ReportManage.ReportList.related_charts_radio')}}</el-radio>
-						<el-radio :label="6">{{$t('ReportManage.ReportList.curve_fitting_radio')}}</el-radio>
-						<el-radio :label="7">{{$t('ReportManage.ReportList.statistical_feature_radio')}}</el-radio>
-						<el-radio :label="10">{{$t('ReportManage.ReportList.intercommodity_analysis_radio')}}</el-radio>
-					</el-radio-group>
-					<div style="margin: 10px 0">
-						<el-checkbox v-model="isShowMe" @change="() => {search_page=1;$refs.chartListRef.scrollTop = 0;getreportlist(key_word)}">{{$t('ReportManage.ReportList.just_mine_radio')}}</el-checkbox>
-					</div>
-					<div
-						ref="chartListRef"
-						style="
-							height: calc(100vh - 370px);
-							overflow-x: hidden;
-							overflow-y: auto;
-						"
-						v-infinite-scroll="loadReportHandle"
-						:infinite-scroll-immediate="false"
-					>
-						<template v-if="newreportlist.length">
-							<div
-								v-for="(item, index) in newreportlist"
-								:key="item.ChartInfoId"
-								:style="item.Disabled && 'cursor: not-allowed;'"
-								class="liststy"
-							>
-								<p class="color_primary">{{ item.ChartName }}</p>
-								<img
-									:src="!item.HaveOperaAuth?$icons.lock_big:item.ChartImage"
-									:id="'listnode' + index"
-									@click="insertHtml(item)"
-								/>
-							</div>
-						</template>
-						<tableNoData :text="$t('ReportManage.ReportList.no_chart_table_available')" size="mini" v-else/>
-					</div>
-
-				</div>
-				<div v-if="tabsactive == '沙盘插入'">
-					<el-input
-						:placeholder="$t('ReportManage.ReportList.no_reports_msg')"
-						v-model="sandTabelQuery.Keyword"
-						size="medium"
-						prefix-icon="el-icon-search"
-					>
-					</el-input>
-					<div
-						id="sandTable-container"
-						ref="sandTable"
-						style="
-							height: calc(100vh - 370px);
-							overflow-x: hidden;
-							overflow-y: auto;
-						"
-						@scroll="sandTableHandleScroll"
-					>
-						<template v-if="sandTableList.length">
-							<div
-								v-for="(item, index) in sandTableList"
-								:key="item.SandboxId"
-								class="liststy"
-							>
-								<p class="color_primary">{{ item.Name }}</p>
-								<img
-									:src="item.PicUrl"
-									:id="'sandTable' + index"
-									@click="insertHtml(item,'image')"
-								/>
-								<!-- <p class="source-identification">来源:弘则研究</p> -->
-							</div>
-						</template>
-						<tableNoData :text="$t('Table.prompt_slogan')"  size="mini" v-else/>
-					</div>
-				</div>
-				<div v-if="tabsactive == '表格插入'">
-					<el-input
-						:placeholder="$t('ReportManage.ReportList.table_name_tabs')"
-						v-model="sheetSearchObj.Keyword"
-						size="medium"
-						prefix-icon="el-icon-search"
-						@input="getSheetList"
-					>
-					</el-input>
-					<div
-						style="
-							height: calc(100vh - 370px);
-							overflow-x: hidden;
-							overflow-y: auto;
-						"
-					>
-						<template v-if="sheetSearchList.length">
-							<div
-								v-for="item in sheetSearchList"
-								:key="item.ExcelInfoId"
-								class="liststy"
-							>
-								<p class="color_primary">{{ item.ExcelName }}</p>
-								<img
-									:src="!item.HaveOperaAuth?$icons.lock_big:item.ExcelImage"
-									:id="'sheet' + item.ExcelInfoId"
-									style="object-fit: contain;height: 250px;"
-									@click="insertHtml(item,'sheet')"
-								/>
-							</div>
-						</template>
-
-						<tableNoData :text="$t('Table.prompt_slogan')" size="mini" v-else/>
-					</div>
-				</div>
-				<div v-if="tabsactive == 'MyETA批量插入'">
-					<importMyChart @handleImportMyChart="handleImportMyChart"/>
-				</div>
-				<div v-if="tabsactive == '语义分析插入'">
-					<importSemantics @handleImportSemantic="(item)=>insertHtml(item,'image')"/>
-				</div>
-			</div>
-		</div>
-		<span
-			class="slide-icon"
-			:class="{'slide-left':!isRightFormShow,'slide-right':isRightFormShow}"
-			@click="isRightFormShow = !isRightFormShow"
-		>
-			<i :class="{'el-icon-d-arrow-left':!isRightFormShow,'el-icon-d-arrow-right':isRightFormShow}"></i>
-		</span>
-
-		<!-- 定时发布弹窗 -->
-		<el-dialog 
-			v-dialogDrag 
-			:append-to-body="true" 
-			:visible.sync="showDSFB" 
-			width="500px" 
-			:title="$t('ReportManage.ReportList.scheduled_publish_btn')"
-		>
-			<div>
-				<div>
-					<span>{{$t('ReportManage.ReportList.publish_time')}}</span>
-					<el-date-picker
-						v-model="taskTime"
-						type="datetime"
-						:placeholder="$t('ReportManage.ReportList.select_date_and_time')"
-						value-format="yyyy-MM-dd HH:mm"
-						:picker-options="timePickerOpt"
-					/>
-				</div>
-				<p style="margin:15px 0">{{$t('ReportManage.ReportList.the_report_will_be_posted_on_time')}}</p>
-				<div style="text-align:right;margin:20px 0">
-					<el-button type="primary" plain @click="showDSFB=false">{{$t('Dialog.cancel_btn')}}</el-button>
-					<el-button type="primary" @click="handleSetReportPrepublish">{{$t('Dialog.confirm_btn')}}</el-button>
-				</div>
-			</div>
-		</el-dialog>
-	</div>
-</template>
-
-<script>
-import {
-	autosave,
-	reportdetail,
-	reportedit,
-	classifylist,
-	reportpublish,
-	reportauthor,
-	classifyIdDetail,
-	dataBaseInterface,
-	sandInterface,
-	reportSetPrepublish,
-	departInterence
-} from 'api/api.js';
-import VueFroala from 'vue-froala-wysiwyg';
-import urlSlug from 'url-slug';
-import http from '@/api/http.js';
-import mixinMsg from './mixins/messagePush'
-import reportMixin from './mixins/reportMixin';
-import reportApproveConfig from "@/mixins/reportApproveConfig.js"
-import importMyChart from './components/importMyChart.vue'
-import importSemantics from './components/importSemantics.vue';
-export default {
-	mixins:[mixinMsg,reportMixin,reportApproveConfig],
-	data() {
-		var that = this;
-		return {
-			//批量导入图表
-			importChartNum:0,//批量导入图表的数量 如果大于0则说明在加载
-			report_id: this.$route.query.id,
-			tabsactive: '基础信息',
-			optionsArr: [],
-			key_word: '',
-			// 沙盘插入 ----------start
-			sandTabelQuery:{
-				PageSize: 13,
-				CurrentIndex: 1,
-				Keyword: '',
-			}, // 沙盘图查询参数
-			sandTableLoading:false,
-			sandTableTotal:0,//沙盘总共条数
-			sandTableList:[],
-			isRequesting:false,
-			loadedText:'', // 全部加载完的文字提示
-			// 沙盘插入 ------------- end
-			originreportlist: [],
-			newreportlist: [],
-			authorlist: [],
-			aeForm: {
-				add_type: 1,
-				classify_name: 1,
-				classifynameArr: [],
-				title: '',
-				abstract: '',
-				author: ['投研团队'],
-				frequency: '日度',
-				create_time: http.dateFormatter(new Date(), false),
-				content: '',
-			},
-			aerules: {
-				add_type: [
-					{
-						required: true,
-						message: '',
-						trigger: 'blur',
-					},
-				],
-				classifynameArr: [
-					{
-						required: true,
-						message: '',
-						trigger: 'blur',
-					},
-				],
-				title: [
-					{
-						required: true,
-						message: '请输入',
-						trigger: 'blur',
-					},
-				],
-			},
-			lastEditRange: null,
-			reportloadding: false,
-			lastsavetime: '',
-			timer: null,
-			ischange: false,
-			isPublishloading: false,
-			ThsMsgIsSend:'',//是否推送过客群
-		};
-	},
-	mounted() {
-		this.getreportdetail();
-		this.getclassifylist();
-		this.getreportlist('');
-		this.getreportauthor();
-		this.getSandTable();
-		this.getSheetList();
-		this.getSystemUserInfo()
-		this.timer = setInterval(() => {
-			this.autoSave();
-		}, 6000);
-
-		window.addEventListener('message',this.reInitIframe)
-	},
-	updated() {
-		$('#leftfroala').find('p').css({ fontSize: '16px',width:'100%'});
-	},
-	destroyed() {
-		window.removeEventListener('message',this.reInitIframe)
-		if (this.timer) {
-			clearInterval(this.timer);
-		}
-	},
-	watch: {
-		'sandTabelQuery.Keyword'(newval,oldval){
-			this.$refs.sandTable.scrollTop=0
-			this.sandTabelQuery.CurrentIndex = 1
-			this.getSandTable()
-		}
-	},
-	methods: {
-		// 每十秒自动保存
-		autoSave() {
-			console.log(this.ischange);
-			// if (this.ischange) {
-				if(!this.autoSaveFlag) return
-				//如果富文本中有未上传完成的图片,去除这个dom
-				$('.fr-element').find('img.fr-uploading').length&&$('.fr-element').find('img.fr-uploading').remove()
-				autosave({
-					ReportId: Number(this.$route.query.id),
-					Content: $('.fr-element').html(),
-					NoChange:this.ischange?0:1
-				}).then((res) => {
-					if (res.Ret === 200) {
-						this.report_id = res.Data.ReportId;
-						this.lastsavetime = http.dateFormatter(new Date(), true);
-					}
-				});
-				this.ischange = false;
-			// }
-		},
-		userclassidreportdetail() {
-			//检查classifynameArr是否有审批流
-			let classify = this.aeForm.classifynameArr.map(i=>{
-				return JSON.parse(i).v||0
-			})
-			this.checkClassifyNameArr(1,classify)
-
-			if (this.aeForm.add_type == 1) {
-				if (this.aeForm.classifynameArr.length == 2) {
-					this.aeForm.title = JSON.parse(this.aeForm.classifynameArr[1]).l;
-				}
-				return false;
-			}
-			if (this.aeForm.classifynameArr.length == 0) {
-				return false;
-			}
-			console.log(this.aeForm.classifynameArr);
-			let params = {
-				ClassifyIdFirst: JSON.parse(this.aeForm.classifynameArr[0]).v,
-			};
-			if (this.aeForm.classifynameArr.length == 2) {
-				params.ClassifyIdSecond = JSON.parse(
-					this.aeForm.classifynameArr[1]
-				).v;
-			} else {
-				params.ClassifyIdSecond = 0;
-			}
-			classifyIdDetail(params).then((res) => {
-				if (res.Ret == 200) {
-					if (res.Data == null) {
-						this.$message.error(this.$t('ReportManage.ReportList.no_reports_msg'));
-						return false;
-					}
-					this.aeForm = {
-						add_type: 2,
-						classify_name: 1,
-						classifynameArr:
-							res.Data.ClassifyIdSecond && res.Data.ClassifyNameSecond
-								? [
-										JSON.stringify({
-											l: res.Data.ClassifyNameFirst,
-											v: res.Data.ClassifyIdFirst,
-										}),
-										JSON.stringify({
-											l: res.Data.ClassifyNameSecond,
-											v: res.Data.ClassifyIdSecond,
-										}),
-								  ]
-								: [
-										JSON.stringify({
-											l: res.Data.ClassifyNameFirst,
-											v: res.Data.ClassifyIdFirst,
-										}),
-								  ],
-						title: res.Data.Title,
-						abstract: res.Data.Abstract,
-						author: res.Data.Author ? res.Data.Author.split(',') : '',
-						frequency: res.Data.Frequency,
-						create_time: res.Data.CreateTime,
-						content: res.Data.Content,
-					};
-				}
-			});
-		},
-		getreportauthor() {
-			reportauthor({}).then((res) => {
-				if (res.Ret == 200) {
-					this.authorlist = res.Data.List || [];
-				}
-			});
-		},
-		getreportdetail() {
-			reportdetail({ ReportId: parseInt(this.report_id) }).then((res) => {
-				if (res.Ret == 200) {
-					let data = res.Data;
-					this.aeForm = {
-						add_type: parseInt(data.AddType),
-						classify_name: 1,
-						classifynameArr:
-							data.ClassifyIdSecond && data.ClassifyNameSecond
-								? [
-										JSON.stringify({
-											l: data.ClassifyNameFirst,
-											v: parseInt(data.ClassifyIdFirst),
-										}),
-										JSON.stringify({
-											l: data.ClassifyNameSecond,
-											v: parseInt(data.ClassifyIdSecond),
-										}),
-								  ]
-								: [
-										JSON.stringify({
-											l: data.ClassifyNameFirst,
-											v: parseInt(data.ClassifyIdFirst),
-										}),
-								  ],
-						title: data.Title,
-						abstract: data.Abstract,
-						author: data.Author ? data.Author.split(',') : '',
-						frequency: data.Frequency,
-						create_time: data.CreateTime,
-						content: data.Content,
-					};
-					this.ThsMsgIsSend=data.ThsMsgIsSend
-					// 回显定时发布时间
-					if(data.PrePublishTime){
-						this.taskTime=data.PrePublishTime
-					}
-					let classify = [data.ClassifyIdFirst,data.ClassifyIdSecond]
-					this.checkClassifyNameArr(1,classify)
-				}
-			});
-		},
-		clickreportadd(tp) {
-			if (
-				!this.aeForm.classifynameArr ||
-				this.aeForm.classifynameArr.length == 0
-			) {
-				this.$message.error(this.$t('ReportManage.ReportList.please_select_category'));
-				return false;
-			}
-			if (!this.aeForm.title) {
-				this.$message.error(this.$t('ReportManage.ReportList.input_title_please'));
-				return false;
-			}
-			if(!this.autoSaveFlag){
-				this.$message.error(this.$t('ReportManage.smart_msg.img_wait'))
-				return false
-			}
-			//如果富文本中有未上传完成的图片,去除这个dom
-			$('.fr-element').find('img.fr-uploading').length&&$('.fr-element').find('img.fr-uploading').remove()
-			let params = {
-				ReportId: parseInt(this.report_id),
-				AddType: this.aeForm.add_type,
-				ClassifyIdFirst: JSON.parse(this.aeForm.classifynameArr[0]).v,
-				ClassifyNameFirst: JSON.parse(this.aeForm.classifynameArr[0]).l,
-				Title: this.aeForm.title,
-				Abstract: this.aeForm.abstract,
-				Author:
-					this.aeForm.author.length > 0
-						? this.aeForm.author.join(',')
-						: '',
-				Frequency: this.aeForm.frequency,
-				// content:this.aeForm.content,create_time:this.aeForm.create_time
-				Content: $('.fr-element').html(),
-				CreateTime: this.aeForm.create_time,
-			};
-			if (this.aeForm.classifynameArr.length == 2) {
-				params.ClassifyIdSecond = JSON.parse(
-					this.aeForm.classifynameArr[1]
-				).v;
-				params.ClassifyNameSecond = JSON.parse(
-					this.aeForm.classifynameArr[1]
-				).l;
-			}
-			params.State = 1;
-			if (tp == 'yl') {
-				sessionStorage.setItem('reportdtl', JSON.stringify(params));
-				let { href } = this.$router.resolve({ name: '预览报告' });
-				window.open(href, '_blank');
-				return false;
-			}
-			if(tp=='fb'||tp=='submit'){
-				this.isPublishloading = true;
-			}
-			const isPost = this.permissionBtn.checkPermissionBtn(this.permissionBtn.reportManageBtn.reportManage_sendMsg)&&(!this.isApprove)
-			if (tp == 'fb') {
-				// 判断是否要推送客群
-				let hasTel=0
-				if(this.aeForm.classifynameArr.length == 2){
-					this.optionsArr.forEach(item=>{
-						item.children&&item.children.forEach(childItem=>{
-							if(JSON.parse(item.value).v==params.ClassifyIdSecond){
-								hasTel=childItem.HasTeleconference
-							}
-						})
-					})
-				}else{
-					this.optionsArr.forEach(item=>{
-						if(JSON.parse(item.value).v==params.ClassifyIdFirst){
-							hasTel=item.HasTeleconference
-						}
-					})
-				}
-				console.log(hasTel);
-				if(hasTel==1||this.ThsMsgIsSend==1){
-					this.isMessagePost = false; 
-					this.reporteditMsg(params,tp)
-				}else if(isPost){
-					this.$confirm(this.$t('ReportManage.smart_msg.publishing_messages'), this.$t('ReportManage.smart_release_prompt_btn'), {
-								confirmButtonText: this.$t('ReportManage.smart_btn.push'),
-								cancelButtonText: this.$t('ReportManage.smart_btn.not_push'),
-								type: 'warning',
-						    distinguishCancelAndClose:true,
-						    beforeClose:(action, instance,done)=>{
-						        console.log(action, instance);
-						        if(action==='close') {
-						            //右上角
-									this.isPublishloading = false;
-						        } else if(action==='cancel') {
-						            //cancelButton
-									this.isMessagePost = false; 
-									this.reporteditMsg(params,tp)
-						        }else {
-						           //confirmButton
-								   	this.isMessagePost = true; 
-									this.reporteditMsg(params,tp)
-						        }
-						        done()
-						    }
-					})
-				}else{
-					this.isMessagePost = false; 
-					this.reporteditMsg(params,tp)
-				}
-			}else {
-				this.reporteditMsg(params,tp)
-			}
-			// reportedit(params).then((res) => {
-			// 	if (res.Ret == 200) {
-			// 		this.$message.success(res.Msg);
-			// 		if (tp == 'yl') {
-			// 			// this.$router.push({name:'预览报告',query:{id:res.report_id}});
-			// 			let { href } = this.$router.resolve({
-			// 				name: '预览报告',
-			// 				query: { id: res.Data.ReportId },
-			// 			});
-			// 			window.open(href, '_blank');
-			// 		} else if (tp == 'fb') {
-			// 			this.publishreport(res.Data.ReportId);
-			// 		} else {
-			// 			// this.$router.push({path:'/reportlist'});
-			// 		}
-			// 	}
-			// });
-		},
-		publishreport(id,code) {
-			//发布报告
-			reportpublish({ ReportIds: String(id) ,ReportUrl:this.generatePdfLinks(code)}).then((res) => {
-				if (res.Ret == 200) {
-					this.isPublishloading = false;
-					this.$router.push({ path: '/reportlist' });
-				}
-			});
-		},
-		generatePdfLinks(Code){
-			const baseUrl= localStorage.getItem('dynamicOutLinks') ? JSON.parse(localStorage.getItem('dynamicOutLinks')).ReportViewUrl : '';
-			return `${baseUrl}/reportshare_pdf?code=${Code}&flag=${this.waterMarkStr}`
-		},
-		// 定时发布报告
-		handleSetReportPrepublish(){
-			if(!this.taskTime){
-				this.$message.warning(this.$t('ReportManage.smart_msg.select_push_time'))
-				return
-			}
-			const now=this.$moment().format('YYYY-MM-DD HH:mm:ss')
-			if(this.$moment(this.taskTime).isBefore(now,'second')){
-				this.$message.warning(this.$t('ReportManage.smart_msg.than_current_time'))
-				return
-			}
-			// return console.log(this.reportCode,'reportCode');
-			// 如果改报告已经推送过模板消息
-			if(this.ThsMsgIsSend==1){
-				reportSetPrepublish({
-					ReportId:Number(this.report_id),
-					PrePublishTime:this.taskTime,
-					PreMsgSend:0,
-					ReportUrl:this.generatePdfLinks(this.reportCode)
-				}).then(res=>{
-					if(res.Ret===200){
-						this.$message.success(this.$t('ReportManage.smart_msg.timed_success'))
-						this.$router.push({ path: '/reportlist' });
-					}
-				})
-				return
-			}
-			const isPost = this.permissionBtn.checkPermissionBtn(this.permissionBtn.reportManageBtn.reportManage_sendMsg)
-
-			this.$confirm(isPost?this.$t('ReportManage.smart_msg.push_report_msg'):this.$t('ReportManage.smart_msg.is_push_timed'), this.$t('ReportManage.smart_release_prompt_btn'), {
-				confirmButtonText: isPost?this.$t('ReportManage.smart_btn.push'):this.$t('ReportManage.smart_btn.publish'),
-				cancelButtonText: isPost?this.$t('ReportManage.smart_btn.not_push'):this.$t('Dialog.cancel_btn'),
-				type: 'warning',
-				distinguishCancelAndClose:true,
-				beforeClose:(action, instance,done)=>{
-					console.log(action, instance);
-					if(action==='close'||action==='cancel') {
-						//右上角或者不推送
-						if(isPost){
-							reportSetPrepublish({
-								ReportId:Number(this.report_id),
-								PrePublishTime:this.taskTime,
-								PreMsgSend:0,
-								ReportUrl:this.generatePdfLinks(this.reportCode)
-							}).then(res=>{
-								if(res.Ret===200){
-									this.$message.success(this.$t('ReportManage.smart_msg.timed_success'))
-									this.$router.push({ path: '/reportlist' });
-								}
-							})
-						}
-					} else {
-						//confirmButton
-						reportSetPrepublish({
-							ReportId:Number(this.report_id),
-							PrePublishTime:this.taskTime,
-							PreMsgSend:isPost?1:0,
-							ReportUrl:this.generatePdfLinks(this.reportCode)
-						}).then(res=>{
-							if(res.Ret===200){
-								this.$message.success(this.$t('ReportManage.smart_msg.timed_success'))
-								this.$router.push({ path: '/reportlist' });
-							}
-						})
-					}
-					done()
-				}
-			})
-
-		},
-		//批量插入我的图表
-		handleImportMyChart(data){
-			//设置编辑器获取焦点
-			this.editor.events.focus();
-			// 获取选定对象
-			const selection = getSelection();
-			// 判断是否有最后光标对象存在
-			if (this.lastEditRange) {
-				// 存在最后光标对象,选定对象清除所有光标并添加最后光标还原之前的状态
-				selection.removeAllRanges();
-				selection.addRange(this.lastEditRange);
-			}
-			//插入内容
-			let htmlStr=''
-			const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
-			
-			data.forEach(item=>{
-				const t=new Date().getTime()
-				item.domId=item.UniqueCode+t //避免多次添加同一图表 id相同
-				htmlStr=htmlStr+`<p style='text-align:left; margin-top:10px;'>
-							<iframe id='${item.domId}' src='${LINK_CHART_URL}?code=${item.UniqueCode}&lang=${this.currentLang}' width='100%' height='350' style='border-width:0px; min-height:350px;'></iframe>
-						</p>`
-			})
-			this.$nextTick(()=>{
-				console.log('import start',data);
-				this.importChartNum=data.length
-				this.editor.html.insert(htmlStr)
-				this.handleListenIframeLoad(data)
-			})
-			
-			this.lastEditRange = selection.getRangeAt(0);
-		},
-		// 监听批量导入的iframe是否加载完
-		handleListenIframeLoad(list){
-			list.forEach(item=>{
-				let ifm=document.getElementById(item.domId)
-				ifm.onload=(e)=>{
-					this.importChartNum--
-					console.log('一个iframe加载了',e.path[0]);
-				}
-			})
-		},
-
-		// 获取沙盘图列表 分页
-		getSandTable(){
-			this.sandTableLoading = true
-			this.isRequesting = true
-			sandInterface.sandlistByQuote(this.sandTabelQuery).then(({Data:{List,Paging}})=>{
-				if(this.sandTabelQuery.CurrentIndex>1){
-					this.sandTableList = [...this.sandTableList,...List]
-				}else{
-					this.sandTableList = List
-					this.sandTableTotal = Paging.Totals
-					if(this.sandTableList.length ==0){
-						this.loadedText = this.$t('Table.prompt_slogan')
-					}else if(this.sandTableList.length>=this.sandTableTotal){
-						this.loadedText= this.$t('ReportManage.smart_msg.all_loaded_have')
-					}else{
-
-					}
-				}		
-			})
-			.finally(()=>{
-				this.sandTableLoading = false
-				this.isRequesting = false
-			})
-		},
-		// 沙盘列表滚动事件,触底加载下一页数据 防抖
-		sandTableHandleScroll:_.debounce(function (e) {
-			if(this.sandTableList.length>=this.sandTableTotal){
-				this.loadedText = this.$t('ReportManage.smart_msg.all_loaded_have')
-				return
-			}
-			if(e.target.scrollHeight-e.target.clientHeight-e.target.scrollTop<10 && !this.isRequesting){
-				this.sandTabelQuery.CurrentIndex++
-				this.getSandTable()
-			}
-		},100),
-		getclassifylist() {
-			//获取分类列表
-			let params = { Enabled:1, KeyWord: '' ,HideDayWeek:1,/*不显示晨报/周报*/ };
-			classifylist(params).then((res) => {
-				if (res.Ret == 200 && Array.isArray(res.Data.List)) {
-					this.optionsArr = [];
-					res.Data.List.forEach((item, index) => {
-						let newitem = {
-							label: item.ClassifyName,
-							value: JSON.stringify({
-								l: item.ClassifyName,
-								v: parseInt(item.Id),
-							}),
-							HasTeleconference:item.HasTeleconference
-						};
-						if (item.Child&&item.Child.length > 0) {
-							let childnode = [];
-							item.Child.forEach((itemchild, i) => {
-								childnode.push({
-									label: itemchild.ClassifyName,
-									value: JSON.stringify({
-										l: itemchild.ClassifyName,
-										v: parseInt(itemchild.Id),
-									}),
-									HasTeleconference:itemchild.HasTeleconference
-								});
-							});
-							newitem.children = childnode;
-						} else {
-							newitem.children = undefined;
-							newitem.disabled=true
-						}
-						this.optionsArr.push(newitem);
-					});
-				}
-			});
-		},
-		getSystemUserInfo(){
-      departInterence.systemUserInfo().then(res=>{
-        if(res.Ret===200){
-          const systemUserInfo=res.Data
-          // 设置水印文案
-          let waterMarkString=''
-          if(systemUserInfo){
-            waterMarkString=`${systemUserInfo.RealName}${systemUserInfo.Mobile?systemUserInfo.Mobile:systemUserInfo.Email}`
-            waterMarkString=encodeURIComponent(waterMarkString)
-            this.waterMarkStr=Base64.encode(waterMarkString)
-          }
-        }
-      })
-    },
-	},
-	components: {importMyChart,importSemantics},
-};
-</script>
-
-<style scoped lang="scss">
-#editreport {
-	display: flex;
-	overflow: hidden;
-	#leftfroala {
-		flex: 1;
-		overflow: hidden;
-		&.full{
-			max-width: calc(100vw - 200px - 60px);
-		}
-		&.block{
-			max-width: calc(100vw - 200px - 60px - 500px);
-		}
-	}
-	#rightitems {
-		width: 500px;
-		flex: 500px 0 0;
-		overflow: hidden;
-		position: fixed;
-		right: 30px;
-		#tabs {
-			padding: 0px 20px;
-			box-sizing: border-box;
-			margin-bottom: 15px;
-			overflow: hidden;
-			> p {
-				/* display: inline-block; */
-				float: left;
-				width: 25%;
-				font-size: 18px;
-				cursor: pointer;
-				color: #1f2e4d;
-				padding: 10px 0;
-				text-align: center;
-			}
-			> p.active {
-				border-bottom: 2px solid #3464e0;
-				color: #3464e0;
-			}
-		}
-		.liststy {
-			width: 100%;
-			margin: 20px 0;
-			padding: 20px;
-			box-sizing: border-box;
-			border: 1px solid #eaeaea;
-			border-radius: 10px;
-			position: relative;
-			overflow: hidden;
-			> p {
-				text-align: center;
-				font-size: 16px;
-				margin-bottom: 10px;
-			}
-			> img {
-				width: 100%;
-				height: auto;
-			}
-			// .source-identification{
-			// 	text-align: left;
-			// }
-		}
-		.loaded-text{
-			height: 20px;
-			text-align: center;
-			color: #666;
-			font-size: 14px;
-		}
-	}
-	.slide-icon {
-		padding: 20px 0;
-		box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.3);
-		border-radius: 5px;
-		background-color: #fff;
-		cursor: pointer;
-		position: fixed;
-		top: 50%;
-		transform: translateY(-50%);
-		z-index: 99;
-		&:hover {
-			background-color: #e0e0e0;
-		}
-		&.slide-left {
-			right: 30px;
-		}
-		&.slide-right {
-			right: 500px;
-		}
-	}
-}
-</style>
-<style lang="scss">
-#editreport {
-	.el-tabs__nav-wrap::after {
-		height: 0;
-	}
-	.el-tabs__item { font-size: 16px; }
-}	
-</style>

+ 37 - 0
src/views/system_manage/chartTheme/components/optionsSection.vue

@@ -138,6 +138,42 @@
                     />
                   </li>
                 </template>
+                <!-- 组合图配置 -->
+                <template v-else-if="[6,14].includes(chartType)">
+                  <li class="option-item" style="position: relative;">
+                    <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt03')}}</label>
+                    <el-tooltip content="线型设置只针对线条类型" placement="top">
+                      <i class="el-icon-info" style="position:absolute;left:35px"></i>
+                    </el-tooltip>
+                    <el-select 
+                      v-model="themeOptions[key][lineIndex].dashStyle"
+                      style="width: 90px"
+                    >
+                      <el-option 
+                        v-for="item in lineStylesOpts" 
+                        :key="item.value"
+                        :value="item.value"
+                        :label="item.label"
+                      >
+                        <svg width="60" height="10" viewBox="0 0 60 10" fill="none" xmlns="http://www.w3.org/2000/svg" v-html="item.svg">
+                        </svg>
+                      </el-option>
+                    </el-select>
+                  </li>
+                  <li class="option-item" style="position: relative;">
+                    <label class="el-form-item__label">{{$t('SystemManage.ChartSet.config_opt04')}}</label>
+                    <el-tooltip content="粗细设置只针对线条类型" placement="top">
+                      <i class="el-icon-info" style="position:absolute;left:35px"></i>
+                    </el-tooltip>
+                    <el-input
+                      v-model="themeOptions[key][lineIndex].lineWidth"
+                      style="width: 90px"
+                      type="number"
+                      :min="1"
+                      @change="val => { themeOptions[key][lineIndex].lineWidth=Number(val)}"
+                    />
+                  </li>
+                </template>
             </template>
 
              <!-- 图例设置 -->
@@ -291,6 +327,7 @@ export default {
         7: {label:this.$t('SystemManage.ChartSet.opt_label09'),lineLabel: this.$t('SystemManage.ChartSet.unit02')},
         10: {label:this.$t('SystemManage.ChartSet.opt_label02'),lineLabel: this.$t('SystemManage.ChartSet.unit03')},
         11: {label:this.$t('SystemManage.ChartSet.opt_label01'),lineLabel: this.$t('SystemManage.ChartSet.unit01')},
+        14: {label:this.$t('SystemManage.ChartSet.opt_label10'),lineLabel: this.$t('SystemManage.ChartSet.unit03')},
       }
     }
   },

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

@@ -23,14 +23,28 @@
         <div class="select-item">
           <div class="select-item">
             <label>{{$t('SystemManage.ChartSet.label01')}}</label>
-            <el-select v-model="formData.chartType" style="margin-left: 15px;" @change="getThemeList();">
+            <el-cascader
+              v-model="formData.chartType"
+              :options="chartTypeOpts"
+              :show-all-levels="false"
+              :props="{
+                emitPath:false,
+                label:'ChartTypeName',
+                value:'ChartThemeTypeId',
+                children:'Child'
+              }"
+              @change="getThemeList();"
+              style="margin-left: 15px;"
+              popper-class="chart-type-select-wrap"
+            />
+            <!-- <el-select v-model="formData.chartType" style="margin-left: 15px;" @change="getThemeList();">
               <el-option
                 v-for="item in chartTypeOpts"
                 :key="item.ChartThemeTypeId"
                 :label="item.ChartTypeName"
                 :value="item.ChartThemeTypeId"
               />
-            </el-select>
+            </el-select> -->
           </div>
         </div>
         <div class="select-item">

+ 16 - 2
src/views/system_manage/chartTheme/themeSetting.vue

@@ -2,14 +2,27 @@
   <div class="themeSet-page">
     <div class="header">
       <div class="header-option">
-        <el-select v-model="formData.chartType" @change="getThemeList('init');">
+        <el-cascader
+              v-model="formData.chartType"
+              :options="chartTypeOpts"
+              :show-all-levels="false"
+              :props="{
+                emitPath:false,
+                label:'ChartTypeName',
+                value:'ChartThemeTypeId',
+                children:'Child'
+              }"
+              @change="getThemeList('init');"
+              popper-class="chart-type-select-wrap"
+        />
+        <!-- <el-select v-model="formData.chartType" @change="getThemeList('init');">
             <el-option
               v-for="item in chartTypeOpts"
               :key="item.ChartThemeTypeId"
               :label="item.ChartTypeName"
               :value="item.ChartThemeTypeId"
             />
-          </el-select>
+          </el-select> -->
 
         <el-select v-model="formData.theme" style="margin-left: 10px;" @change="changeThemeHandle">
           <el-option
@@ -150,6 +163,7 @@ export default {
       else if(this.chartInfo.ChartType === 10) return this.initSectionScatterData(res.Data);
       
       else if(this.chartInfo.ChartType === 11) return this.initRadarData(res.Data);
+      else if(this.chartInfo.ChartType === 14) return this.initSectionalCombinationChart(res.Data);
 
       this.setChartOptionHandle(this.tableData)
     },

+ 4 - 4
src/views/system_manage/dataOperaAuth.vue

@@ -214,8 +214,8 @@
               v-model="transferForm.creatorIds"
               :options="userList"
               :props="{
-                value: 'ItemId',
-                label: 'ItemName',
+                value: 'NodeId',
+                label: 'NodeName',
                 children: 'Children',
                 emitPath: false,
                 multiple:true
@@ -237,8 +237,8 @@
               v-model="transferForm.newUser"
               :options="userList"
               :props="{
-                value: 'ItemId',
-                label: 'ItemName',
+                value: 'NodeId',
+                label: 'NodeName',
                 children: 'Children',
                 emitPath: false,
               }"

Plik diff jest za duży
+ 0 - 0
vendor-manifest.json


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików