소스 검색

ETA1.9.3(同花顺时点数据对接)

hbchen 8 달 전
부모
커밋
0fed8aaa5c

+ 4 - 2
src/api/api.js

@@ -18,7 +18,8 @@ import {
   zczxInterface,
   coalWordInterface,
   bloombergInterface,
-  ccfDataInterface
+  ccfDataInterface,
+  highFrequencyDataInterface
 } from './modules/thirdBaseApi';
 
 //手工指标 手工数据 手工数据权限
@@ -128,7 +129,8 @@ export {
   zczxInterface,
   coalWordInterface,
   bloombergInterface,
-  ccfDataInterface
+  ccfDataInterface,
+  highFrequencyDataInterface
 };
 
 //老接口 研报 ppt等

+ 176 - 1
src/api/modules/thirdBaseApi.js

@@ -1009,6 +1009,180 @@ const ccfDataInterface={
 		return http.get('/datamanage/ccf/search_list',params);
 	}
 }
+
+/* CCF化纤信息 */
+const highFrequencyDataInterface={
+	/**
+	 * 分类树
+	 * @param {} params 
+	 * @returns 
+	 */
+	classifyListTree: params => {
+		return http.get('/datamanage/ths_hf/classify/tree',params);
+	},
+	/**
+	 * 分类列表 懒加载
+	 * @param {} params ParentId
+	 * @returns 
+	*/
+	classifyList: params => {
+		return http.get('/datamanage/ths_hf/classify/list',params);
+	},
+	/**
+	 * 添加分类
+	 * @param {} params ClassifyName ParentId-第一级传0 Level-第一级传0, 其余传上一级的层级
+	 * @returns 
+	*/
+	classifyAdd: params => {
+		return http.post('/datamanage/ths_hf/classify/add',params);
+	},
+	/**
+	 * 编辑分类
+	 * @param {} params ClassifyId ClassifyName
+	 * @returns 
+	*/
+	classifyEdit: params => {
+		return http.post('/datamanage/ths_hf/classify/edit',params);
+	},
+	/**
+	 * 删除分类 ClassifyId
+	 */
+	classifyDelete: params => {
+		return http.post('/datamanage/ths_hf/classify/remove',params);
+	},
+	/**
+	 * 移动分类 
+	 * "ClassifyId": 0, //分类ID
+		"ParentClassifyId": 0, //父级分类ID
+		"PrevClassifyId": 0, //上一个兄弟节点分类ID
+		"NextClassifyId": 0, //下一个兄弟节点分类ID
+		"ItemId": 0, //指标ID, 如果指标ID有值,则移动对象为指标,否则认为移动对象为分类
+		"PrevItemId": 0, //上一个指标ID
+		"NextItemId": 0 //下一个指标ID
+	*/
+	classifyMove: params => {
+		return http.post('/datamanage/ths_hf/classify/move',params);
+	},
+	/**
+	 * 获取高频数据列表 
+	 * PageSize、CurrentIndex、ClassifyId(多选)、IncludeChild(是否关联子分类)、Frequency(多选)、SysAdminId(多选)、
+	 * Keywords、SortField、SortType
+	*/
+	getTableDataApi:params=>{
+		return http.get('/datamanage/ths_hf/index/list',params);
+	},
+	/**
+	 * 检验高频数据指标是否重复 
+	 * StockCode、EdbCode、StartTime、EndTime、Interval(number)、Fill、CPS、BaseDate
+	*/
+	checkHighFreData:params=>{
+		return http.get('/datamanage/ths_hf/index/exist_check',params);
+	},
+	/**
+	 * 搜索高频数据指标 
+	 * StockCode、EdbCode、StartTime、EndTime、Interval(number)、Fill、CPS、BaseDate
+	*/
+	searchHighFreData:params=>{
+		return http.get('/datamanage/ths_hf/index/search',params);
+	},
+	/**
+	 * 批量添加高频数据指标 
+	 * StartTime、EndTime、Interval(number)、Fill、CPS、BaseDate
+	 * IndexList:[{ClassifyId,StockCode,EdbCode,IndexName,Frequency,Unit}]
+	*/
+	addHighFreDatas:params=>{
+		return http.post('/datamanage/ths_hf/index/add',params);
+	},
+	/**
+	 * 高频数据详情
+	 * IndexId(number)、DataDate(数据日期(非必填,默认为有数据的最新日期))
+	*/
+	highFreDataDetail:params=>{
+		return http.get('/datamanage/ths_hf/index/detail',params);
+	},
+	/**
+	 * 高频数据编辑
+	 * IndexId(number)、IndexName、ClassifyId、Unit
+	*/
+	highFreDataEdit:params=>{
+		return http.post('/datamanage/ths_hf/index/edit',params);
+	},
+	/**
+	 * 高频数据刷新
+	 * IndexId(number)
+	*/
+	highFreDataRefresh:params=>{
+		return http.post('/datamanage/ths_hf/index/refresh',params);
+	},
+	/**
+	 * 高频数据删除
+	 * IndexId(number)
+	*/
+	highFreDataDelete:params=>{
+		return http.post('/datamanage/ths_hf/index/remove',params);
+	},
+	/**
+	 * 高频数据列表选择
+	 * ClassifyId IncludeChild Frequency SysAdminId Keywords ListIds SelectAll
+	*/
+	highFreDataChoice:params=>{
+		return http.get('/datamanage/ths_hf/index/list_choice',params);
+	},
+	/**
+	 * 批量操作
+	 * IndexIds(array) OptType(1-移动分类; 2-删除; 3-刷新) MoveClassifyId RefreshType(1-最近6小时; 2-全部刷新(操作为3时必填))
+	*/
+	highFreDataBatchOperation:params=>{
+		return http.post('/datamanage/ths_hf/index/multi_opt',params);
+	},
+	/**
+	 * 获取新增指标(批量新增前)
+	 * {
+		* IndexIds(array) 
+		* ConvertRule:{
+			*	ConvertType //转换类型: 1-指定时间值; 2-区间计算值
+			*	ConvertFixed:{
+					FixedDay, //指定时间值日期: 1-当日; 2-前一日
+					FixedTime
+				},
+				ConvertArea:{
+					StartDay, //起始时间日期: 1-当日; 2-前一日
+					StartTime,
+					EndDay,//截止时间日期: 1-当日; 2-前一日
+					EndTime,
+					CalculateType //计算类型: 1-区间均值; 2-最大值; 3-最小值
+				}
+		* }
+	 * }
+	*/
+	highFreDataSavePre:params=>{
+		return http.post('/datamanage/ths_hf/index/save2edb_pre',params);
+	},
+	/**
+	 * 批量新增指标
+	 * {
+		* NewIndexes(array) 
+		* ConvertRule:{
+			*	ConvertType //转换类型: 1-指定时间值; 2-区间计算值
+			*	ConvertFixed:{
+					FixedDay, //指定时间值日期: 1-当日; 2-前一日
+					FixedTime
+				},
+				ConvertArea:{
+					StartDay, //起始时间日期: 1-当日; 2-前一日
+					StartTime,
+					EndDay,//截止时间日期: 1-当日; 2-前一日
+					EndTime,
+					CalculateType //计算类型: 1-区间均值; 2-最大值; 3-最小值
+				}
+		* }
+	 * }
+	*/
+	highFreDataSave:params=>{
+		return http.post('/datamanage/ths_hf/index/save2edb',params);
+	},
+}
+
 export { 
 	lzDataInterface,
 	glDataInterface,
@@ -1027,5 +1201,6 @@ export {
 	zczxInterface,
 	coalWordInterface,
 	bloombergInterface,
-	ccfDataInterface
+	ccfDataInterface,
+	highFrequencyDataInterface
 }

+ 34 - 2
src/lang/commonLang.js

@@ -64,7 +64,11 @@ export default {
     complete_btn: {
       en: 'Complete',
       zh: '完成'
-    }
+    },
+    operation_prompt: {
+      en: 'Operation Prompt',
+      zh: '操作提示'
+    },
   },
   Table: {
     add_btn: {
@@ -87,6 +91,14 @@ export default {
       en: "Copy",
       zh: "复制",
     },
+    detail_btn:{
+      en: "Detail",
+      zh: "详情",
+    },
+    refresh_btn:{
+      en: "Refresh",
+      zh: "刷新",
+    },
     column_operations: {
       en: "Operations",
       zh: "操作",
@@ -224,6 +236,10 @@ export default {
       en: "Delete failed",
       zh: "删除失败",
     },
+    add_fail_msg: {
+      en: "Failed to add new",
+      zh: "新增失败",
+    },
     known: {
       en: "Known",
       zh: "知道了",
@@ -312,6 +328,14 @@ export default {
       en: 'No data available for this date.',
       zh: '该日期暂无数据'
     },
+    please_complete:{
+      en: 'Please fill it out completely',
+      zh: '请填写完整'
+    },
+    name_none: {
+      zh: '名称不能为空',
+      en: 'Name can not be empty'
+    },
   },
   Common: {
     category: {
@@ -409,7 +433,15 @@ export default {
     sim_hei:{
       en:'SimHei',
       zh:'黑体'
-    }
+    },
+    latest:{
+      en:'latest',
+      zh:'最新'
+    },
+    fixed:{
+      en:'fixed',
+      zh:'固定'
+    },
   },
   Edb,
   Chart,

+ 51 - 0
src/lang/modules/DataSources/En.js

@@ -217,6 +217,57 @@ export default {
     add_edb_hint:'Max 30 indicators for bulk add!',
     add_edb_check_hint1:'Incomplete Indicator Info',
     add_edb_check_hint2:'Indicator name exists, please re-enter'
+  },
+
+  /* 高频数据 */
+  HighFrequencyData:{
+    add_high_frequency_data:'Add High-Freqcy Data',
+    select_classify_prompt:'Please select category',
+    associative_sub_classify:'Linked to Subcategory',
+    classify_setting:'Classification Settings',
+    add_to_eta_indicators:'Add to ETA Indicators',
+    batch_operation:'Batch Operation',
+    data_source_classify:'Data Source Classification',
+    data_date: 'Date of data',
+    belong_to_classify:'Category',
+    period:'Period',
+    adjustment:'Adjustment',
+    base_point:"Base Point",
+    no_interval_handle:'Non-Trading Interval',
+    move_to_new_classify:'Move to new classification',
+    last_six_hours:'The last 6 hours',
+    refresh_all:'Full refresh (Choose carefully, or it may exceed the quota)',
+
+    data_transformation: "Data Transformation",
+    edb_save:'Indicator Saving',
+    get_point_time:'Value at a Specified Time',
+    today:'Current Day',
+    yesterday:'Previous day',
+    get_range_time:'Interval Calculation',
+    range_average_value:'Interval Average',
+    range_max_value:'Maximum Value',
+    range_min_value:'Minimum Value',
+
+    stock_code_numer_prompt:'The total number of stock codes does not exceed 10.',
+    index_code_numer_prompt:'The total number of indicator codes does not exceed 20.',
+    start_time_right_end_time:'The start time cannot be greater than the deadline.',
+    batch_operation_limit:'The upper limit of batch operation is 500 indicators.',
+    index_has_exist_prompt:'The following indicator names are duplicated with the existing indicators in the indicator library. Please modify the indicator name and confirm.',
+
+    no_rehabilitation:'No',
+    forward_rehabilitation_1:'Pre-restoration rights (calculation of dividend plan)',
+    backward_rehabilitation_1:'Post-restoration rights (calculation of dividend plan)',
+    forward_rehabilitation_3:'Pre-restoration rights (calculation of exchange price)',
+    backward_rehabilitation_3:'Post-restoration rights (calculation of exchange price)',
+    forward_rehabilitation_2:'Pre-restoration rights for full circulation (calculation of dividend plan)',
+    backward_rehabilitation_2:'Post-restoration rights for full circulation (calculation of dividend plan)',
+    forward_rehabilitation_4:'Pre-restoration rights for full circulation (calculation of exchange pricen)',
+    backward_rehabilitation_4:'Post-restoration rights for full circulation (calculation of exchange price)',
+
+    original:'Original',
+    previous:'Previous',
+    blank:'Blank',
+
   }
   
 }

+ 50 - 0
src/lang/modules/DataSources/Zh.js

@@ -219,5 +219,55 @@ export default {
     add_edb_hint:'批量添加指标数量不得超过30个!',
     add_edb_check_hint1:'指标信息未填写完整',
     add_edb_check_hint2:'指标名称已存在,请重新填写'
+  },
+
+  /* 高频数据 */
+  HighFrequencyData:{
+    add_high_frequency_data:'添加高频数据',
+    select_classify_prompt:'请选择分类',
+    associative_sub_classify:'关联子分类',
+    classify_setting:'分类设置',
+    add_to_eta_indicators:'批量添加到指标库',
+    batch_operation:'批量操作',
+    data_source_classify:'数据源分类',
+    data_date: '数据日期',
+    belong_to_classify:'所属分类',
+    period:'时间周期',
+    adjustment:"复权方式",
+    base_point:"复权基点",
+    no_interval_handle:'非交易间隔处理',
+    move_to_new_classify:'移动至新分类',
+    last_six_hours:'最近6个小时',
+    refresh_all:'全部刷新(慎选,或超出额度)',
+
+    data_transformation: "数据转换",
+    edb_save:'指标保存',
+    get_point_time:'取指定时间的值',
+    today:'当日',
+    yesterday:'前一日',
+    get_range_time:'区间计算值',
+    range_average_value:'区间均值',
+    range_max_value:'最大值',
+    range_min_value:'最小值',
+
+    stock_code_numer_prompt:'证券代码总数不超过10个',
+    index_code_numer_prompt:'指标代码总数不超过20个',
+    start_time_right_end_time:'起始时间不能大于截止时间',
+    batch_operation_limit:'批量操作的上限为500个指标',
+    index_has_exist_prompt:'以下指标名称与指标库已有指标重复,请修改指标名称后确定',
+
+    no_rehabilitation:'不复权',
+    forward_rehabilitation_1:'前复权(分红方案计算)',
+    backward_rehabilitation_1:'后复权(分红方案计算)',
+    forward_rehabilitation_3:'前复权(交易所价格计算)',
+    backward_rehabilitation_3:'后复权(交易所价格计算)',
+    forward_rehabilitation_2:'全流通前复权(分红方案计算)',
+    backward_rehabilitation_2:'全流通后复权(分红方案计算)',
+    forward_rehabilitation_4:'全流通前复权(交易所价格计算)',
+    backward_rehabilitation_4:'全流通后复权(交易所价格计算)',
+
+    original:'不处理',
+    previous:'沿用之前数据',
+    blank:'空值',
   }
 }

+ 4 - 0
src/lang/modules/EtaBase/En.js

@@ -29,13 +29,16 @@ export default {
     date_serie: 'Date Series',
     stock_input_pholder: 'Please enter the stock code, only one stock code can be queried at a time',
     edb_input_pholder: 'Please enter the indicator codes, separated by commas for multiple indicator codes',
+    stocks_input_pholder: 'Please enter the stock codes, separated by commas for multiple stock codes',
     edb_wind_tip: 'When entering "CG" in the Wind Financial Terminal, a code generator will pop up, which can be used to obtain codes for other indicators',
     edb_ifind_tip: 'Use Excel iFind plug-in / date series function, according to the selected indicator to obtain the indicator code, futures and stock common code can be ticked below',
     future_common_edb: 'Future Common indicators',
     stock_common_edb: 'Stock Common indicators',
+    option_selectable:'Parameter (Optional)',
     pre_price: 'Previous Closing Price',
     op_price: 'Opening Price',
     high_price: 'Highest Price',
+    average_price: 'Average Price',
     low_price: 'Lowest Price',
     close_price: 'Closing Price',
     settle_price: 'Settlement Price',
@@ -165,6 +168,7 @@ export default {
     table_col_creator:'Creator',
     label_all_check:'Select All List',
     full_metric_name:'Full Metric Name',
+    origin_full_metric_name:'Full name of the original indicator',
     add_to_selections:'Add to Selections',
     serial_num:'Serial Number',
     search_value_days_options:'Search Nearest Value Within 35 Days Before and After',

+ 4 - 0
src/lang/modules/EtaBase/Zh.js

@@ -29,14 +29,17 @@ export default {
     date_serie: '日期序列',
     stock_input_pholder: '请输入证券代码,每次只查询一个证券代码',
     edb_input_pholder: '请输入指标代码,多个指标代码用英文逗号分隔',
+    stocks_input_pholder: '请输入证券代码,多个证券代码用英文逗号分隔',
     edb_wind_tip: 'wind金融终端输入”CG“会弹出代码生成器,可在代码生成器上获取其他指标的代码',
     edb_ifind_tip: '可用Excel同花顺插件/日期序列功能,根据所选指标获取指标代码,期货和股票常用代码可在下方勾选',
     future_common_edb: '期货常用指标',
     stock_common_edb: '股票常用指标',
+    option_selectable:'参数(可选)',
     pre_price: '前收盘价',
     op_price: '开盘价',
     high_price: '最高价',
     low_price: '最低价',
+    average_price: '均价',
     close_price: '收盘价',
     settle_price: '结算价',
     trade_volume: '成交量',
@@ -165,6 +168,7 @@ export default {
     table_col_creator:'创建人',
     label_all_check:'列表全选',
     full_metric_name:'指标全称',
+    origin_full_metric_name:'原指标全称',
     add_to_selections:'加入已选指标',
     serial_num:'序号',
     search_value_days_options:'查找前后35天最近值',

+ 29 - 2
src/lang/modules/EtaBase/commonLang.js

@@ -196,6 +196,10 @@ export default {
       zh:'起始时间',
       en:'Start Time'
     },
+    e_deadline_time: {
+      zh:'截止时间',
+      en:'Deadline'
+    },
     e_end_time: {
       zh: '结束时间',
       en: 'End Time'
@@ -224,9 +228,21 @@ export default {
       zh:'最近更新',
       en:'Recent Update'
     },
+    e_start_time_whole:{
+      zh:'指标开始时间',
+      en:'Indicator Start Time'
+    },
+    e_latest_time_whole:{
+      zh:'指标最新时间',
+      en:'Indicator Latest Time'
+    },
     e_stock_code: {
       zh:'证券代码',
-      en:' Security Code'
+      en:'Security Code'
+    },
+    e_indicator_code: {
+      zh:'指标代码',
+      en:'Indicator Code'
     },
     e_opera: {
       zh:'操作',
@@ -268,6 +284,10 @@ export default {
       zh:'所属目录',
       en:'catalogue'
     },
+    calculation_mode:{
+      zh:'计算方式',
+      en:'Calculation Method'
+    },
   },
 
   /* 单位 */
@@ -724,6 +744,10 @@ export default {
       zh: '请选择日期',
       en: 'Please select date'
     },
+    input_time: {
+      zh: '请选择时间',
+      en: 'Please select time'
+    },
     select_edb_name:{
       zh: '请选择指标名称',
       en: 'Please select an indicator name'
@@ -751,8 +775,11 @@ export default {
     input_value: {
       zh: '请输入值',
       en: 'Please input a value'
+    },
+    select_creator: {
+      zh: '请选择创建人',
+      en: 'Please select creator'
     }
-    
   },
   
   /* 公示说明 */

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

@@ -340,6 +340,14 @@ export default [
           name_en:'CCF Fiber Info'
         },
       },
+      {
+        path: "highFrequencyData",
+        component: () => import("@/views/dataEntry_manage/thirdBase/highFrequencyData.vue"),
+        name: "高频数据",
+        meta:{
+          name_en:'High Frequency Data'
+        }
+      },
     ],
   },
 ];

+ 10 - 0
src/utils/buttonConfig.js

@@ -277,6 +277,16 @@ export const dataSourcePermission = {
     /*--------CCF化纤信息--- */
     ccfData_view:'ccfData:view',//查看
     ccfData_exportExcel:'ccfData:exportExcel',//导出
+    /*--------高频数据--- */
+    highFrequency_adds:'highFrequency:adds',//添加高频数据
+    highFrequency_addTo_database:'highFrequency:addTo:database',//批量添加至指标库
+    highFrequency_operations:'highFrequency:operations',//批量操作
+    highFrequency_operation_detail:'highFrequency:operation:detail',//操作-详情
+    highFrequency_operation_refresh:'highFrequency:operation:refresh',//操作-刷新
+    highFrequency_operation_delete:'highFrequency:operation:delete',//操作-删除
+    highFrequency_classify_move:'highFrequency:classify:move',//分类设置-移动
+    highFrequency_classify_delete:'highFrequency:classify:delete',//分类设置-删除
+    highFrequency_classify_editAdd:'highFrequency:classify:editAdd',//分类设置-编辑/添加
 }
 
 /*

+ 13 - 1
src/views/dataEntry_manage/databaseComponents/addTargetDiaBase.vue

@@ -54,6 +54,10 @@
 							<el-option :label="item.label" :value="item.value" 
 							v-for="item in THSIndexCodeTypeArr" :key="item.value"></el-option>
 						</el-select>
+						<span class="selectable-option-row" v-if="fromType=='同花顺'">
+							<span>{{ $t('EtaBasePage.option_selectable') }}</span>
+							<el-input v-model="ExtraPars" style="width: 130px;margin-left: 10px;" />
+						</span>
 						<el-checkbox-group v-model="indexCodeSelected">
 							<el-checkbox :label="item.value" v-for="item in indexCodeArr" :key="item.value">{{ item.label }}</el-checkbox>
 						</el-checkbox-group>
@@ -284,6 +288,7 @@ export default {
 			search_company_txt: '',
 			securityCodeText:"",
 			indexCodeText:'',
+			ExtraPars:'',
 			indexCode:[],
 			edbIndexDatas:[],
 			edbTableHeadKey: [
@@ -341,6 +346,7 @@ export default {
 			this.search_company_txt = '';
 			this.wsdAddStep=1
 			this.securityCodeText=""
+			this.ExtraPars=''
 			this.indexCodeText=''
 			this.indexCode=[]
 			this.indexCodeSelected=[]
@@ -460,6 +466,7 @@ export default {
 			if(this.fromDatabase=='1'){
 				this.fromDatabase='0'
 				this.securityCodeText=""
+				this.ExtraPars=''
 				this.indexCodeText=''
 				this.indexCode=[]
 				this.indexCodeSelected=[]
@@ -550,7 +557,8 @@ export default {
 						Source:Number(this.fromCode.get(this.fromType)),
 						SubSource:this.fromDatabase,
 						EdbCode:Array.from(new Set([...this.indexCode,...this.indexCodeSelected])).join(','),
-						StockCode:this.securityCodeText
+						StockCode:this.securityCodeText,
+						ExtraPars:this.ExtraPars
 					}
 					dataBaseInterface.edbExistCheck(params).then(res=>{
 						if(res.Ret == 200){
@@ -746,6 +754,10 @@ export default {
 			width:400px;
 			margin-right: 10px;
 		}
+		.selectable-option-row{
+			display: inline-flex;
+			align-items: center;
+		}
 	}
 	.warn_txt {
 		font-size: 16px;

+ 721 - 0
src/views/dataEntry_manage/thirdBase/components/highFrequency/addHighFrequencyData.vue

@@ -0,0 +1,721 @@
+<template>
+  <div>
+		<el-dialog :visible.sync="isAddShow" :close-on-click-modal="false" :modal-append-to-body='false' 
+    @close="cancelHandle" top="5vh" center :width="addStep==1?'1250px':'1208px'" v-dialogDrag 
+    :title="$t('HighFrequencyData.add_high_frequency_data')">
+      <div class="dialog-container" v-loading="isLoadingData" :element-loading-text="$t('Table.loading')">
+        <div v-if="addStep==1">
+          <div class="data-query-box">
+            <el-input :placeholder="$t('EtaBasePage.stocks_input_pholder')" v-model.trim="securityCodeText" 
+            class="query-index-input" style="margin-bottom: 20px;" @blur="codeInputBlur('stock')"></el-input>
+            <div class="query-index-code">
+              <el-input :placeholder="$t('EtaBasePage.edb_input_pholder')" v-model.trim="indexCodeText" 
+              class="query-index-input" @blur="codeInputBlur('index')"></el-input>
+            </div>
+            <el-checkbox-group v-model="indexCodeSelected" style="margin-bottom: 20px;" @change="indexCodeSelectHandle">
+              <el-checkbox :label="item.value" v-for="item in indexCodeArr" :key="item.value" style="margin-right: 20px;">{{ item.label }}</el-checkbox>
+            </el-checkbox-group>
+            <div class="high-frequency-code-row" style="margin-top: -10px;" v-if="indexCode && indexCode.length>0">
+							<div class="high-frequency-code-item" v-for="item in indexCode" :key="item">
+								<div class="high-frequency-code-item-text">{{ item }}</div>
+								<img src="~@/assets/img/icons/close_icon_black.png" @click="deleteCode(item)" />
+							</div>
+						</div>
+            <div class="time-range-row">
+              <!-- 起始时间 -->
+              <div class="start-time-row">
+                <span>{{ $t('Edb.Detail.e_start_time') }}</span>
+                <el-date-picker
+                  class="date-picker"
+                  v-model="otherParams.startDate"
+                  value-format="yyyy-MM-dd"
+                  type="date"
+                  :placeholder="$t('Edb.InputHolderAll.input_date')">
+                </el-date-picker>
+                <el-time-picker
+                  class="time-picker"
+                  value-format="HH:mm:ss"
+                  v-model="otherParams.startTime"
+                  :placeholder="$t('Edb.InputHolderAll.input_time')">
+                </el-time-picker>
+              </div>
+              <div class="end-time-row"><!-- 截止时间 -->
+                <span>{{ $t('Edb.Detail.e_deadline_time') }}</span>
+                <el-radio v-model="otherParams.deadlineType" label="1">{{ $t('Common.latest') }}</el-radio>
+                <el-radio v-model="otherParams.deadlineType" label="2">{{ $t('Common.fixed') }}</el-radio>
+                <template v-if="otherParams.deadlineType=='2'">
+                  <el-date-picker
+                    class="date-picker"
+                    value-format="yyyy-MM-dd"
+                    v-model="otherParams.deadlineDate"
+                    type="date"
+                    :placeholder="$t('Edb.InputHolderAll.input_date')">
+                  </el-date-picker>
+                  <el-time-picker
+                    class="time-picker"
+                    value-format="HH:mm:ss"
+                    v-model="otherParams.deadlineTime"
+                    :placeholder="$t('Edb.InputHolderAll.input_time')">
+                  </el-time-picker>
+                </template>
+              </div>
+            </div>
+            <div class="time-cycle">
+              <!-- 时间周期 -->
+              <div class="time-cycle-item">
+                <span>{{ $t('HighFrequencyData.period') }}</span>
+                <el-select v-model="otherParams.period" :placeholder="$t('Edb.please_select')">
+                  <el-option
+                    v-for="item in periodList"
+                    :key="item"
+                    :label="item"
+                    :value="item">
+                  </el-option>
+                </el-select>
+              </div>
+              <!-- 复权方式 -->
+              <div class="time-cycle-item">
+                <span>{{ $t('HighFrequencyData.adjustment') }}</span>
+                <el-select v-model="otherParams.adjustment" :placeholder="$t('Edb.please_select')">
+                  <el-option
+                    v-for="item in adjustmentList"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value">
+                  </el-option>
+                </el-select>
+              </div>
+              <!-- 复权基点 -->
+              <div class="time-cycle-item">
+                <span>{{ $t('HighFrequencyData.base_point') }}</span>
+                <el-date-picker
+                  class="date-picker"
+                  v-model="otherParams.basePoint"
+                  value-format="yyyy-MM-dd"
+                  type="date"
+                  :placeholder="$t('Edb.InputHolderAll.input_date')">
+                </el-date-picker>
+              </div>
+            </div>
+            <div class="interval">
+              <span>{{ $t('HighFrequencyData.no_interval_handle') }}</span>
+              <el-select v-model="otherParams.noIntervalHandle" :placeholder="$t('Edb.please_select')">
+                <el-option
+                  v-for="item in noIntervalHandleList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+          <div class="dia-bot">
+            <el-button type="primary" @click="nextHandle" :disabled="!isCodeComplete"
+            style="width: 120px;" :loading="isLoadingData" ><!-- 下一步 -->{{$t('EtaBasePage.next_step')}}
+            </el-button>
+          </div>
+        </div>
+        <template v-else>
+          <div class="edb-table-preview">
+            <table width="auto" border="0">
+              <thead>
+                <tr v-for="(item, index) in edbTableHeadKey" :key="item">
+                  <td class="sticky" style="text-align: center;left: 0;text-align: center;position: sticky;z-index: 101;">
+                    {{ edbTableHeadData.get(item) }}
+                    <template v-if="item == 'ClassifyId'">
+                      <br />
+                      <el-radio-group v-model="classifyType" @change="handleClassifyTypeChange" style="margin-top: 5px;">
+                        <el-radio :label="0" style="margin-right: 8px;"><!-- 同目录 -->{{$t('EtaBasePage.directory_radio')}}</el-radio>
+                        <el-radio :label="1"><!-- 分目录 -->{{$t('EtaBasePage.subdirectory_radio')}}</el-radio>
+                      </el-radio-group>
+                    </template>
+                  </td>
+                  <td v-for="(data, sub_index) in edbIndexDatas" :key="sub_index" class="body-td"
+                  :class="highLightIndex.includes(data.IndexName) && item=='IndexName' ?'exist-highlight':''">
+                    <template v-if="item === 'ClassifyId'">
+                      <el-cascader :options="classifyList" v-model="data[item]" :placeholder="$t('Edb.InputHolderAll.input_menu')"
+                       :disabled="(classifyType===0&&sub_index>0)" @change="handleClassifyChange(data)"
+                      :props="{label: 'ClassifyName',
+                        value: 'ClassifyId',
+                        children: 'Children',
+                        checkStrictly: true,
+                        emitPath:false}">
+                      </el-cascader>
+                    </template>
+                    <template v-else-if="item === 'Unit'">
+                      <el-autocomplete
+                        v-model.trim="data[item]"
+                        :fetch-suggestions="querySearchUnit"
+                        :placeholder="$t('Edb.InputHolderAll.input_unit')"
+                        suffix-icon="el-icon-arrow-down"
+                        size="mini"
+                      ></el-autocomplete>
+                    </template>
+                    <template v-else-if="item === 'IndexName'">
+                      <el-input v-model.trim="data[item]" :placeholder="$t('Edb.InputHolderAll.input_name')" size="mini"></el-input>
+                    </template>
+                    <template v-else>
+                      <div style="padding: 0 7px;">{{ data[item] }}</div>
+                    </template>
+                  </td>
+                </tr>
+              </thead>
+              <tbody v-if="edbIndexDatas && edbIndexDatas.length>0">
+                <tr>
+                  <td class="body-td sticky" style="left: 0;text-align: center;height: 330px;text-align: center;position: sticky;z-index: 101;">
+                    <!-- 数据详情 -->{{$t('Edb.data_detail_tab')}}
+                  </td>
+                  <!-- <template > -->
+                    <td class="body-td" style="height: 330px;padding: 0;" v-for="(item,index) in edbIndexDatas" :key="index">
+                      <!-- {{ 'edbIndexDatas[index1].DataList[index].DataTime' }} -->
+                      <div class="td-box">
+                        <div class="data-item" v-for="(item1,index1) in edbIndexDatas[index].DataList">
+                          <span >{{ edbIndexDatas[index].DataList[index1].DataTime }}</span>
+                          <span >{{ edbIndexDatas[index].DataList[index1].Value }}</span>
+                        </div>
+                      </div>
+                    </td>
+                    <!-- <td></td>
+                  </template> -->
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div class="dia-bot">
+            <el-button @click="prevHandle" style="width: 120px;"><!-- 上一步 -->{{$t('Dialog.prev_step')}}</el-button>
+            <el-button type="primary" @click="saveHandle" style="width: 120px;margin-left: 50px;"><!-- 保存 -->{{$t('Dialog.confirm_save_btn')}}</el-button>
+          </div>
+        </template>
+      </div>
+
+		</el-dialog>
+    <el-dialog :visible.sync="checkFailShow" :close-on-click-modal="false" :modal-append-to-body='false' 
+			width="600px" :title="$t('Dialog.operation_prompt')">
+			<div class="check-fail-box">
+				<div>
+					<div style="margin-bottom: 20px;">{{$t('EtaBasePage.exist_edb_tips')}}</div>
+					<div v-for="(item,index) in existIndexList" :key="index">
+						{{ index+1+'、'+item.text }}
+					</div>
+				</div>
+				<div class="check-fail-button">
+					<el-button type="primary" @click="checkFailShow=false" style="width: 120px;">{{$t('MsgPrompt.known')}}</el-button>
+				</div>
+			</div>
+		</el-dialog>
+  </div>
+</template>
+
+<script>
+import { highFrequencyDataInterface } from '@/api/api.js'
+  export default {
+    name:"addHighFrequencyData",
+    props: {
+      isAddShow: {
+        type: Boolean,
+        default:false
+      },
+      unitList:{
+        type:Boolean,
+        default:()=>[]
+      },
+      classifyList:{
+        type:Boolean,
+        default:()=>[]
+      }
+    },
+    data() {
+      return {
+        isLoadingData:false,
+        addStep:1,
+        securityCodeText:"",
+        securityCodeLimit:10,
+        indexCodeText:"",
+        indexCode:[],
+        indexCodeLimit:20,
+        indexCodeSelected:[],
+        periodList:[1,3,5,10,15,30,60],
+        otherParams:{
+          startDate:this.$moment(new Date()).subtract(7, 'days').format('YYYY-MM-DD'),
+          startTime:'09:15:00',
+          deadlineType:'1',
+          deadlineDate:this.$moment(new Date()).format('YYYY-MM-DD'),
+          deadlineTime:'09:15:00',
+          period:1,
+          adjustment:'no',
+          basePoint:'1900-01-01',
+          noIntervalHandle:'Original'
+        },
+        edbIndexDatas:[],
+        checkFailShow:false,
+        existIndexList:[],
+        edbTableHeadKey: [
+          "ClassifyId",
+          "Unit",
+          "Frequency",
+          "IndexName",
+          "EdbCode",
+        ],
+        classifyType:0,
+        highLightIndex:[],
+      }
+    },
+    computed:{
+      isCodeComplete(){
+        return this.securityCodeText && (this.indexCode.length>0 || this.indexCodeSelected.length>0) && this.otherParams.startDate && 
+                this.otherParams.startTime && this.otherParams.period && this.otherParams.adjustment && this.otherParams.basePoint && 
+                (this.otherParams.deadlineType=='1' || (this.otherParams.deadlineType=='2' && this.otherParams.deadlineDate && this.otherParams.deadlineTime) )&&
+                this.otherParams.noIntervalHandle
+      },
+      // 常用的指标代码
+      indexCodeArr(){
+        return [
+          {value:'open',label:this.$t('EtaBasePage.op_price')/* "开盘价" */},
+          {value:'high',label:this.$t('EtaBasePage.high_price')/* "最高价" */},
+          {value:'low',label:this.$t('EtaBasePage.low_price')/* "最低价" */},
+          {value:'avgprice',label:this.$t('EtaBasePage.average_price')/* "均价" */},
+          {value:'close',label:this.$t('EtaBasePage.close_price')/* "收盘价" */},
+          {value:'volume',label:this.$t('EtaBasePage.trade_volume')/* "成交量" */},
+          {value:'amt',label:this.$t('EtaBasePage.turnover')/* "成交额" */},
+          {value:'pct_chg',label:this.$t('EtaBasePage.incre_decre')/* "涨跌幅" */},
+          {value:'oi',label:this.$t('EtaBasePage.open_inter')/* "持仓量" */}
+        ]
+      },
+      // currentLang() {
+      //   return this.$store.state.lang
+      // },
+      adjustmentList(){
+        return [
+          {label:this.$t('HighFrequencyData.no_rehabilitation'),value:'no'},
+          {label:this.$t('HighFrequencyData.forward_rehabilitation_1'),value:'forward1'},
+          {label:this.$t('HighFrequencyData.backward_rehabilitation_1'),value:'backward1'},
+          {label:this.$t('HighFrequencyData.forward_rehabilitation_3'),value:'forward3'},
+          {label:this.$t('HighFrequencyData.backward_rehabilitation_3'),value:'backward3'},
+          {label:this.$t('HighFrequencyData.forward_rehabilitation_2'),value:'forward2'},
+          {label:this.$t('HighFrequencyData.backward_rehabilitation_2'),value:'backward2'},
+          {label:this.$t('HighFrequencyData.forward_rehabilitation_4'),value:'forward4'},
+          {label:this.$t('HighFrequencyData.backward_rehabilitation_4'),value:'backward4'},
+        ]
+      },
+      noIntervalHandleList(){
+        return [
+          {label:this.$t('HighFrequencyData.original'),value:'Original'},
+          {label:this.$t('HighFrequencyData.previous'),value:'Previous'},
+          {label:this.$t('HighFrequencyData.blank'),value:'Blank'}
+        ]
+      },
+      edbTableHeadData(){
+        return new Map([
+          ["ClassifyId", /* "所属目录" */this.$t('EtaBasePage.belong_menu')],
+          ["Unit", /* "单位" */this.$t('Edb.Detail.e_unit')],
+          ["Frequency", /* "频度" */this.$t('Edb.Detail.e_fre')],
+          ["IndexName", /* "指标名称" */this.$t('Edb.Detail.e_name')],
+          ["StockCode", /* "证券代码" */this.$t('Edb.Detail.e_stock_code')],
+          ["EdbCode", /* "指标代码" */this.$t('Edb.Detail.e_code')],
+        ])
+      },
+    },
+    methods: {
+      init(){
+        this.isLoadingData=false
+        this.addStep=1
+        this.securityCodeText=""
+        this.indexCodeText=""
+        this.indexCode=[]
+        this.indexCodeSelected=[]
+        this.otherParams={
+          startDate:this.$moment(new Date()).subtract(7, 'days').format('YYYY-MM-DD'),
+          startTime:'09:15:00',
+          deadlineType:'1',
+          deadlineDate:this.$moment(new Date()).format('YYYY-MM-DD'),
+          deadlineTime:'09:15:00',
+          period:1,
+          adjustment:'no',
+          basePoint:'1900-01-01',
+          noIntervalHandle:'Original'
+        }
+      },
+      cancelHandle() {
+        this.init()
+        this.$emit('update:isAddShow',false)
+      },
+      //搜索单位
+      querySearchUnit(queryString, cb){
+        let results = queryString ? this.unitList.filter(item=>item.value.indexOf(queryString) === 0) : this.unitList;
+        // 调用 callback 返回建议列表的数据
+        cb(results);
+      },
+      // 指标代码和证券代码输入失焦
+      codeInputBlur(type){
+        if(type=='stock'){
+          if(!this.securityCodeText) return
+          this.securityCodeText=this.securityCodeText.replaceAll(' ','')
+          let arr = this.securityCodeText.split(',')
+          if(arr.length>this.securityCodeLimit){
+            this.$message.warning(this.$t('HighFrequencyData.stock_code_numer_prompt'))
+            this.securityCodeText=arr.slice(0,this.securityCodeLimit).join(',')
+          }
+        }else{
+          if(!this.indexCodeText) return  
+          this.indexCodeText=this.indexCodeText.replaceAll(' ','')
+          let arr = Array.from(new Set([...this.indexCode,...this.indexCodeText.split(',')]))
+          if(arr.length+this.indexCodeSelected.length>this.indexCodeLimit){
+            this.$message.warning(this.$t('HighFrequencyData.index_code_numer_prompt'))
+            this.indexCode=arr.slice(0,(this.indexCodeLimit-this.indexCodeSelected.length))
+          }else{
+            this.indexCode=arr
+          }
+          this.indexCodeText=''
+        }
+      },
+      deleteCode(code){
+        this.indexCode = this.indexCode.filter(it => it!=code)
+      },
+      indexCodeSelectHandle(){
+        if(this.indexCode.length+this.indexCodeSelected.length>this.indexCodeLimit){
+          this.$message.warning(this.$t('HighFrequencyData.index_code_numer_prompt'))
+          this.indexCodeSelected=this.indexCodeSelected.slice(0,(this.indexCodeLimit-this.indexCode.length))
+        }
+      },
+      nextHandle(){
+        let StartTime = this.otherParams.startDate+" "+this.otherParams.startTime
+        let EndTime = this.otherParams.deadlineType=='2'?this.otherParams.deadlineDate+" "+this.otherParams.deadlineTime:''
+        if(EndTime && !(new Date(EndTime)>new Date(StartTime))){
+          return this.$message.warning(this.$t('HighFrequencyData.start_time_right_end_time'))
+        }
+        setTimeout(()=>{
+          if(this.isCodeComplete){
+            let params={
+              EdbCode:Array.from(new Set([...this.indexCode,...this.indexCodeSelected])).join(','),
+              StockCode:this.securityCodeText,
+              StartTime,
+              EndTime,
+              Interval:+this.otherParams.period,
+              Fill:this.otherParams.noIntervalHandle,
+              CPS:this.otherParams.adjustment,
+              BaseDate:this.otherParams.basePoint
+            }
+            this.isLoadingData=true
+            highFrequencyDataInterface.checkHighFreData(params).then(res=>{
+              if(res.Ret == 200){
+                if(res.Data.ExistIndex && res.Data.ExistIndex.length>0){
+                  // 有重复
+                  this.existIndexList=[]
+                  let existEdbInfo=res.Data.ExistIndex || []
+                  let text=''
+                  existEdbInfo.map(item =>{
+                    text=`${item.IndexName}(${item.IndexCode})`
+                    this.existIndexList.push({text,id:item.IndexId})
+                  })
+                  this.checkFailShow=true
+                  this.isLoadingData=false
+                }else{
+                  // 没有重复
+                  highFrequencyDataInterface.searchHighFreData(params).then(res => {
+                    if(res.Ret == 200){
+                      let stockList = res.Data || []
+                      this.edbIndexDatas=[]
+                      stockList.map((item,index) =>{
+                        let batchParams={
+                          ClassifyId:0,
+                          Unit:'',
+                          Frequency:item.Frequency+'m',
+                          IndexName:item.IndexName,
+                          EdbCode:item.EdbCode,
+                          StockCode:item.StockCode
+                        }
+                        let datas = item.IndexData || []
+                        let datasLength = datas.length
+                        if( datasLength<10){
+                          for (let i = datasLength; i < 10; i++) {
+                            datas.push({DataTime:'',Value:''})													
+                          }
+                        }
+                        this.edbIndexDatas.push({...batchParams,DataList:datas})
+                      })
+
+                      let edbIndexDataLength = this.edbIndexDatas.length
+                      //填充空的列
+                      for (let i = edbIndexDataLength; i < 4; i++) {
+                        this.edbIndexDatas.push({
+                          ClassifyId:0,
+                          Unit:'',
+                          Frequency:'',
+                          IndexName:'',
+                          EdbCode:'',
+                          StockCode:'',
+                          DataList:new Array(10).fill({DataTime:'',Value:''})
+                        })
+                      }
+                      this.highLightIndex=[]
+                      this.classifyType=0
+
+                      this.addStep=2
+                    }
+                  }).finally(()=>{
+                    this.isLoadingData=false
+                  })
+                }
+              }
+            })
+          }
+        },10)
+      },
+      prevHandle(){
+        this.addStep=1
+      },
+      // 同目录修改
+      handleClassifyChange(e,index){
+        if(this.classifyType===0){
+          // 修改所有的指标的目录为第一个
+          this.edbIndexDatas.forEach(item=>{
+            item.ClassifyId=e.ClassifyId
+          })
+        }
+      },
+      handleClassifyTypeChange(){
+        this.handleClassifyChange(this.edbIndexDatas[0])
+      },
+      saveHandle(){
+        let flag = this.edbIndexDatas.some(it => {
+          return (it.StockCode && it.EdbCode) && ((!it.ClassifyId) || (!it.Unit) || (!it.IndexName))
+        })
+        if(flag){
+          this.$message.warning(/* "指标信息未填写完整" */this.$t('BloombergPage.add_edb_check_hint1'))
+          return 
+        }
+        this.isLoadingData=true
+        const IndexList=this.edbIndexDatas.map(data=>{
+          if(data.StockCode && data.EdbCode){
+            return {
+              ClassifyId:data.ClassifyId,
+              StockCode:data.StockCode,
+              EdbCode:data.EdbCode,
+              IndexName:data.IndexName,
+              Frequency:data.Frequency,
+              Unit:data.Unit,
+            }
+          }else{
+            return ''
+          }
+        }).filter(Boolean)
+        let StartTime = this.otherParams.startDate+" "+this.otherParams.startTime
+        let EndTime = this.otherParams.deadlineType=='2'?this.otherParams.deadlineDate+" "+this.otherParams.deadlineTime:''
+        let addParams={
+          IndexList,
+          StartTime,
+          EndTime,
+          Interval:+this.otherParams.period,
+          Fill:this.otherParams.noIntervalHandle,
+          CPS:this.otherParams.adjustment,
+          BaseDate:this.otherParams.basePoint
+        }
+        highFrequencyDataInterface.addHighFreDatas(addParams).then(res=>{
+          console.log(res,'mres');
+          if(res.Ret == 200){
+            this.$message.success(/* "添加指标成功" */this.$t('MsgPrompt.add_msg2'))
+            this.$emit('addSuccessHandle')	
+            this.cancelHandle()	
+          }
+          // else if(res.Ret == 403){
+          //   this.highLightIndex=res.Data?res.Data.ExistEdbName || []:[]
+          // }
+        }).finally(()=>{
+          this.isLoadingData=false
+        })
+      }
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+.dialog-container{
+  padding: 0 35px 35px;
+  .data-query-box{
+		padding-top: 20px;
+		.query-index-code{
+			display: flex;
+			align-items: center;
+			margin-bottom: 20px;
+		}
+		.query-index-input{
+			min-width: 490px;
+			width:490px;
+			margin-right: 10px;
+		}
+    .high-frequency-code-row{
+			margin-top: 10px;
+			min-height: 60px;
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+			.high-frequency-code-item{
+				height: 40px;
+				background-color: #EBEFF6;
+				display: flex;
+				align-items: center;
+				margin-right: 10px;
+				padding: 10px;
+				box-sizing: border-box;
+				margin-bottom: 10px;
+				.high-frequency-code-item-text{
+					color: #333333;
+					margin-right: 10px;
+				}
+				img{
+					height: 16px;
+					width: 16px;
+					cursor: pointer;
+				}
+			}
+		}
+    .time-range-row{
+      display: flex;
+      align-items: center;
+      margin-bottom: 20px;
+      .start-time-row{
+        margin-right: 40px;
+      }
+      .start-time-row,.end-time-row{
+        display: flex;
+        align-items: center;
+        span{
+          white-space: nowrap;
+          margin-right: 10px
+        }
+        .date-picker{
+          width: 240px;
+          margin-right: 10px
+        }
+        .time-picker{
+          width: 120px;
+        }
+      }
+      .end-time-row{
+        .el-radio{
+          margin-right: 10px;
+        }
+      }
+    }
+    .time-cycle{
+      display: flex;
+      align-items: center;
+      margin-bottom: 20px;
+      .time-cycle-item{
+        margin-right: 10px;
+        span{
+          margin-right: 10px;
+          white-space: nowrap;
+        }
+        .el-select{
+          width: 140px;
+        }
+        .el-date-editor{
+          width: 240px;
+        }
+      }
+    }
+    .interval{
+      display: flex;
+      align-items: center;
+      margin-bottom: 20px;
+      span{
+        margin-right: 10px;
+        white-space: nowrap;
+      }
+      .el-select{
+        width: 140px;
+      }
+    }
+	}
+  .dia-bot {
+		margin: 60px 0 0;
+		display: flex;
+		justify-content: center;
+	}
+}
+.check-fail-box{
+  padding: 0 0 15px 40px;	
+  color: #333333;
+  .check-fail-button{
+    margin-top: 80px;
+    display: flex;
+    justify-content: flex-end;
+  }
+}
+.edb-table-preview {
+  overflow: auto;
+  height: calc(100% - 124px);
+  &::-webkit-scrollbar {
+    width: 5px !important;
+  }
+  table {
+    border-color: #dcdfe6;
+    border-bottom: 1px solid #dcdfe6;
+    border-right: 1px solid #dcdfe6;
+    border-collapse: separate;
+  }
+  td {
+    height: 30px;
+    // text-align: center;
+    color: #333;
+    box-sizing: border-box;
+    padding: 0 5px;
+    background-color: #fff;
+    border-top: 1px solid #dcdfe6;
+    border-left: 1px solid #dcdfe6;
+  }
+  .body-td{
+    max-width: 217px;
+    min-width: 217px;
+  }
+  thead {
+    position: sticky;
+    z-index: 2;
+    top: 0;
+  }
+  .td-box{
+    height: 100%;
+    width: 100%;
+    overflow: auto;
+    .data-item{
+      border-bottom: 1px solid #dcdfe6;
+      padding: 0 5px;
+      box-sizing: border-box;
+      min-height: 30px;
+      display: flex;
+      align-items: center;
+      flex-wrap: wrap;
+      gap: 8px;
+      span{
+        white-space: nowrap;
+      }
+    }
+  }
+  .exist-highlight{
+    border: red solid 1px;
+  }
+}
+</style>
+<style lang="scss">
+.edb-table-preview{
+  border: 1px solid #dcdfe6;
+  .el-cascader{
+    width: 100%;
+  }
+  .el-autocomplete{
+    width: 100%;
+  }
+  .el-select{
+    width: 100%;
+  }
+  .el-input{
+    width: 100%;
+    input{
+      border: none;
+      padding-left: 7px;
+      font-size: 14px;
+    }
+  }
+}
+</style>

+ 473 - 0
src/views/dataEntry_manage/thirdBase/components/highFrequency/addToIndexDatabaseBatch.vue

@@ -0,0 +1,473 @@
+<template>
+  <el-dialog :visible.sync="isAddShow" :close-on-click-modal="false" :modal-append-to-body='false' 
+  @close="cancelHandle" top="5vh" center width="1090px" v-dialogDrag 
+  :title="$t('HighFrequencyData.add_high_frequency_data')">
+    <div class="dialog-container" v-loading="isLoadingData" :element-loading-text="$t('Table.loading')">
+      <div class="data-set-box" v-if="baseAddStep==1">
+        <div class="zone-title">{{ $t('HighFrequencyData.data_transformation') }} </div>
+        <div class="data-set-row">
+          <!-- 取指定时间的值 -->
+          <el-radio v-model="dataSetParams.getMethod" :label="1">{{ $t('HighFrequencyData.get_point_time') }}</el-radio>
+          <div class="radio-box" v-show="dataSetParams.getMethod==1" style="padding-left: 76px;">
+            <div class="time-item" style="width: 234px;">
+              <el-radio v-model="dataSetParams.pointTimeType" :label="1" 
+              @change="(value)=> radioChangeHandle(value,'pointTimeValue')">{{ $t('HighFrequencyData.today') }}</el-radio>
+              <el-time-picker v-show="dataSetParams.pointTimeType==1"
+                class="time-picker" value-format="HH:mm:ss"
+                v-model="dataSetParams.pointTimeValue"
+                :placeholder="$t('Edb.InputHolderAll.input_time')">
+              </el-time-picker>
+            </div>
+            <div class="time-item">
+              <el-radio v-model="dataSetParams.pointTimeType" :label="2" 
+              @change="(value)=> radioChangeHandle(value,'pointTimeValue')">{{ $t('HighFrequencyData.yesterday') }}</el-radio>
+              <el-time-picker v-show="dataSetParams.pointTimeType==2"
+                class="time-picker" value-format="HH:mm:ss"
+                v-model="dataSetParams.pointTimeValue"
+                :placeholder="$t('Edb.InputHolderAll.input_time')">
+              </el-time-picker>
+            </div>
+          </div>
+        </div>
+        <div class="data-set-row">
+          <el-radio v-model="dataSetParams.getMethod" :label="2">{{ $t('HighFrequencyData.get_range_time') }}</el-radio>
+          <!-- 起始时间 -->
+          <div class="radio-box" v-show="dataSetParams.getMethod==2">
+            <div class="data-set-row-text">{{ $t('Edb.Detail.e_start_time') }}</div>
+            <div class="time-item" style="width: 234px;">
+              <el-radio v-model="dataSetParams.rangeStartTimeType" :label="1"
+              @change="(value)=> radioChangeHandle(value,'rangeStartTimeValue')">{{ $t('HighFrequencyData.today') }}</el-radio>
+              <el-time-picker v-show="dataSetParams.rangeStartTimeType==1"
+                class="time-picker" value-format="HH:mm:ss"
+                v-model="dataSetParams.rangeStartTimeValue"
+                :placeholder="$t('Edb.InputHolderAll.input_time')">
+              </el-time-picker>
+            </div>
+            <div class="time-item">
+              <el-radio v-model="dataSetParams.rangeStartTimeType" :label="2"
+              @change="(value)=> radioChangeHandle(value,'rangeStartTimeValue')">{{ $t('HighFrequencyData.yesterday') }}</el-radio>
+              <el-time-picker v-show="dataSetParams.rangeStartTimeType==2"
+                class="time-picker" value-format="HH:mm:ss"
+                v-model="dataSetParams.rangeStartTimeValue"
+                :placeholder="$t('Edb.InputHolderAll.input_time')">
+              </el-time-picker>
+            </div>
+          </div>
+          <!-- 截止时间 -->
+          <div class="radio-box" v-show="dataSetParams.getMethod==2">
+            <div class="data-set-row-text">{{ $t('Edb.Detail.e_deadline_time') }}</div>
+            <div class="time-item" style="width: 234px;">
+              <el-radio v-model="dataSetParams.rangeDeadlineTimeType" :label="1"
+              @change="(value)=> radioChangeHandle(value,'rangeDeadlineTimeValue')">{{ $t('HighFrequencyData.today') }}</el-radio>
+              <el-time-picker v-show="dataSetParams.rangeDeadlineTimeType==1"
+                class="time-picker" value-format="HH:mm:ss"
+                v-model="dataSetParams.rangeDeadlineTimeValue"
+                :placeholder="$t('Edb.InputHolderAll.input_time')">
+              </el-time-picker>
+            </div>
+            <div class="time-item">
+              <el-radio v-model="dataSetParams.rangeDeadlineTimeType" :label="2"
+              @change="(value)=> radioChangeHandle(value,'rangeDeadlineTimeValue')">{{ $t('HighFrequencyData.yesterday') }}</el-radio>
+              <el-time-picker v-show="dataSetParams.rangeDeadlineTimeType==2"
+                class="time-picker" value-format="HH:mm:ss"
+                v-model="dataSetParams.rangeDeadlineTimeValue"
+                :placeholder="$t('Edb.InputHolderAll.input_time')">
+              </el-time-picker>
+            </div>
+          </div>
+          <!-- 计算方式 -->
+          <div class="radio-box" v-show="dataSetParams.getMethod==2">
+            <div class="data-set-row-text">{{ $t('Edb.Detail.calculation_mode') }}</div>
+            <el-radio v-model="dataSetParams.calculationMode" :label="1" style="margin-right: 20px;">{{ $t('HighFrequencyData.range_average_value') }}</el-radio>
+            <el-radio v-model="dataSetParams.calculationMode" :label="2" style="margin-right: 20px;">{{ $t('HighFrequencyData.range_max_value') }}</el-radio>
+            <el-radio v-model="dataSetParams.calculationMode" :label="3" style="margin-right: 20px;">{{ $t('HighFrequencyData.range_min_value') }}</el-radio>
+          </div>
+        </div>
+      </div>
+      <template v-else>
+        <div class="data-show-box" v-if="baseAddStep==2?(dataList && dataList.length>0):(existDataList && existDataList.length>0)">
+          <div class="zone-title" style="margin-bottom: 10px;">{{ $t('HighFrequencyData.edb_save') }}</div>
+          <el-table :data="baseAddStep==2?dataList:existDataList" border max-height="440px">
+            <el-table-column :label="$t('EtaBasePage.origin_full_metric_name')" align="center" prop="IndexName"/>
+            <el-table-column :label="$t('EtaBasePage.gen_metric_name_label')" align="center" prop="NewIndexName">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.NewIndexName" size="mini" class="table-input" :placeholder="$t('EtaBasePage.metric_name_input')"/>
+              </template>
+            </el-table-column>
+            <el-table-column :label="$t('Edb.Detail.e_unit')" align="center" width="80px" prop="Unit" />
+            <el-table-column :label="$t('Edb.Detail.e_fre')" align="center" width="80px" prop="NewFrequency" />
+            <el-table-column align="center" width="210px">
+              <template slot="header" slot-scope="scope">
+                <span style="margin-right:8px;display:inline-block"> <!-- 目录 -->{{$t('EtaBasePage.catalogue_directory')}}</span>
+                <el-radio-group v-model="classifyType" @change="handleClassifyTypeChange">
+                  <el-radio :label="0" style="margin-right: 8px;"><!-- 同目录 -->{{$t('EtaBasePage.directory_radio')}}</el-radio>
+                  <el-radio :label="1"><!-- 分目录 -->{{$t('EtaBasePage.subdirectory_radio')}}</el-radio>
+                </el-radio-group>
+              </template>
+              <template slot-scope="{row,$index}">
+                <el-cascader size="mini"
+                  v-model="row.ClassifyId"
+                  :options="classifyOpt"
+                  :props="levelProps"
+                  :placeholder="$t('Edb.InputHolderAll.input_menu')"
+                  :disabled="(classifyType===0&&$index>0)"
+                  @change="handleClassifyChange(row,$index)"/>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" width="50px">
+              <template slot="header" slot-scope="scope">
+                <img src="~@/assets/img/icons/delete-red.png" class="delete-icon" @click="deleteAllHandle"/>
+              </template>
+              <template slot-scope="{row,$index}">
+                <img src="~@/assets/img/icons/delete-red.png" class="delete-icon" @click="deleteHandle(row,$index)"/>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <tableNoData v-else></tableNoData>
+      </template>
+    </div>
+    <div class="dialog-btn">
+      <template v-if="baseAddStep==1">
+        <el-button type="primary" plain @click="cancelHandle" >{{$t('Dialog.cancel_btn')}}</el-button>
+        <el-button type="primary" @click="nextHandle" :disabled="!isCodeComplete"
+          style="min-width: 120px;" :loading="isLoadingData" ><!-- 下一步 -->{{$t('EtaBasePage.next_step')}}
+        </el-button>
+      </template>
+      <template v-else>
+        <el-button @click="prevHandle" style="min-width: 120px;" :loading="isLoadingData"><!-- 上一步 -->{{$t('Dialog.prev_step')}}</el-button>
+        <el-button type="primary" @click="addToDatabase" v-if="baseAddStep!=1" :loading="isLoadingData">{{$t('Dialog.confirm_btn')}}</el-button>
+      </template>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { dataBaseInterface } from '@/api/api.js';
+import { highFrequencyDataInterface } from '@/api/api.js'
+
+  export default {
+    name:"addToIndexDatabaseBatch",
+    props: {
+      isAddShow: {
+        type: Boolean,
+        default:false
+      },
+      IndexIds:{
+        type: Array,
+        default:() =>[]
+      }
+    },
+    data() {
+      return {
+        classifyOpt:[],
+        levelProps: {
+          label: 'ClassifyName',
+          value: 'ClassifyId',
+          children: 'Children',
+          checkStrictly: true,
+          emitPath:false
+        },
+        baseAddStep:1,
+        dataSetParams:{
+          getMethod:1,
+          pointTimeType:1,
+          pointTimeValue:'09:30:00',
+          rangeStartTimeType:1,
+          rangeStartTimeValue:'09:30:00',
+          rangeDeadlineTimeType:1,
+          rangeDeadlineTimeValue:'09:30:00',
+          calculationMode:1
+        },
+        isLoadingData:false,
+        dataList:[],
+        existDataList:[],//重复的数据
+        existDataDeleteIds:[],//重复数据中删除id列表
+        classifyType:0
+      }
+    },
+    watch:{
+      isAddShow(value){
+        if(value){
+          this.getClassifyOpt()
+        }
+      }
+    },
+    computed:{
+      isCodeComplete(){
+        return (this.dataSetParams.getMethod==1 && this.dataSetParams.pointTimeValue && this.dataSetParams.pointTimeType) || 
+              (this.dataSetParams.getMethod==2 && this.dataSetParams.rangeStartTimeValue && this.dataSetParams.rangeStartTimeType 
+                && this.dataSetParams.rangeDeadlineTimeValue && this.dataSetParams.rangeDeadlineTimeType  && this.dataSetParams.calculationMode) 
+      },
+    },
+    methods: {
+      // 获取指标分类
+      async getClassifyOpt(){
+        const res=await dataBaseInterface.menuListV3()
+        if (res.Ret !== 200) return
+        this.filterNodes(res.Data.AllNodes||[]);
+        this.classifyOpt = res.Data.AllNodes || [];
+      },
+      filterNodes(arr) {
+        arr.length &&
+          arr.forEach((item) => {
+            item.Children.length && this.filterNodes(item.Children);
+            if (!item.Children.length) {
+              delete item.Children;
+            }
+          });
+      },
+      radioChangeHandle(value,prop){
+        switch (value) {
+          case 1:
+            this.dataSetParams[prop]="09:30:00"
+            break;
+          case 2:
+            this.dataSetParams[prop]="21:30:00"
+            break;
+          default:
+            break;
+        }
+      },
+      // 同目录修改
+      handleClassifyChange(e,index){
+        if(this.classifyType===0){
+          // 修改所有的指标的目录为第一个
+          this.dataList.forEach(item=>{
+            item.ClassifyId=e.ClassifyId
+          })
+        }
+      },
+      handleClassifyTypeChange(){
+        this.handleClassifyChange(this.dataList[0])
+      },
+      cancelHandle(){
+        this.dataSetParams={
+          getMethod:1,
+          pointTimeType:1,
+          pointTimeValue:'09:30:00',
+          rangeStartTimeType:1,
+          rangeStartTimeValue:'09:30:00',
+          rangeDeadlineTimeType:1,
+          rangeDeadlineTimeValue:'09:30:00',
+          calculationMode:1
+        }
+        this.baseAddStep=1
+        this.dataList=[]
+        this.isLoadingData=false
+        this.existDataList=[]
+        this.existDataDeleteIds=[]
+        this.classifyType=0
+        this.$emit('update:isAddShow',false)
+      },
+      nextHandle(){
+        if(this.dataSetParams.getMethod==2){
+          let StartTime = this.$moment('2024-07-10 '+this.dataSetParams.rangeStartTimeValue).subtract(this.dataSetParams.rangeStartTimeType-1,'days') .format('YYYY-MM-DD HH:mm:ss')
+          let EndTime = this.$moment('2024-07-10 '+this.dataSetParams.rangeDeadlineTimeValue).subtract(this.dataSetParams.rangeDeadlineTimeType-1,'days') .format('YYYY-MM-DD HH:mm:ss')
+          if(!(new Date(EndTime)>new Date(StartTime))){
+            return this.$message.warning(this.$t('HighFrequencyData.start_time_right_end_time'))
+          }
+        }
+        setTimeout(()=>{
+          if(this.isCodeComplete){
+            let params={
+              ConvertRule:{
+                ConvertType:this.dataSetParams.getMethod,
+                ConvertFixed:{
+                  FixedDay:this.dataSetParams.pointTimeType,
+                  FixedTime:this.dataSetParams.pointTimeValue,
+                },
+                ConvertArea:{
+                  StartDay:this.dataSetParams.rangeStartTimeType,
+                  StartTime:this.dataSetParams.rangeStartTimeValue,
+                  EndDay:this.dataSetParams.rangeDeadlineTimeType,
+                  EndTime:this.dataSetParams.rangeDeadlineTimeValue,
+                  CalculateType:this.dataSetParams.calculationMode
+                },
+              },
+              IndexIds:this.IndexIds
+            }
+            // console.log(params,'params');
+            this.isLoadingData=true
+            highFrequencyDataInterface.highFreDataSavePre(params).then(res=>{
+              if(res.Ret == 200){
+                this.dataList=res.Data||[]
+                this.baseAddStep=2
+              }
+            }).finally(()=>{
+              this.isLoadingData=false
+            })
+          }
+        },10)
+      },
+      prevHandle(){
+        this.baseAddStep = this.baseAddStep-1 || 1
+      },
+      deleteHandle(row,index){
+        if(this.baseAddStep==2){
+          this.dataList.splice(index,1)
+        }else{
+          this.existDataDeleteIds.push(row.IndexId)
+          this.existDataList.splice(index,1)
+        }
+      },
+      deleteAllHandle(){
+        if(this.baseAddStep==2){
+          this.dataList=[]
+        }else{
+          this.existDataDeleteIds=this.existDataList.map(it => it.IndexId)
+          this.existDataList=[]
+        }
+      },
+      addToDatabase(){
+        for (let i = 0; i < this.dataList.length; i++) {
+          const element = this.dataList[i];
+          if(!element.NewIndexName){
+            return this.$message.warning(this.$t('EtaBasePage.metric_name_input'))
+          }
+          if(!element.ClassifyId){
+            return this.$message.warning(this.$t('Edb.InputHolderAll.input_menu'))
+          }
+        }
+        if(this.existDataDeleteIds && this.existDataDeleteIds.length>0){
+          // 处理重复数据时,删除掉了部分
+          this.dataList = this.dataList.filter(it => !this.existDataDeleteIds.includes(it.IndexId))
+        }
+        (this.existDataList && this.existDataList.length>0) && this.dataList.map(item =>{
+          let existItem = this.existDataList.find(it => it.IndexId == item.IndexId)
+          if(existItem){
+            item.NewIndexName=existItem.NewIndexName
+            item.ClassifyId=existItem.ClassifyId
+          }
+        })
+        // console.log(this.dataList,'this.dataList');
+        let params={
+          ConvertRule:{
+            ConvertType:this.dataSetParams.getMethod,
+            ConvertFixed:{
+              FixedDay:this.dataSetParams.pointTimeType,
+              FixedTime:this.dataSetParams.pointTimeValue,
+            },
+            ConvertArea:{
+              StartDay:this.dataSetParams.rangeStartTimeType,
+              StartTime:this.dataSetParams.rangeStartTimeValue,
+              EndDay:this.dataSetParams.rangeDeadlineTimeType,
+              EndTime:this.dataSetParams.rangeDeadlineTimeValue,
+              CalculateType:this.dataSetParams.calculationMode
+            },
+          },
+          NewIndexes:this.dataList
+        }
+        this.isLoadingData=true
+        highFrequencyDataInterface.highFreDataSave(params).then(res=>{
+          if(res.Ret == 200){
+            let resData = res.Data||{}
+            this.existDataList=[]
+            this.existDataDeleteIds=[]
+            let allSuccess=true
+            if(resData.Exist && resData.Exist.length>0){
+              // 已存在              
+              this.existDataList = [...this.existDataList,...resData.Exist]
+              this.baseAddStep=3
+              this.$message.warning(this.$t('HighFrequencyData.index_has_exist_prompt'))
+              allSuccess=false
+            }
+            if(resData.Fail && resData.Fail.length>0){
+              let message = '';
+              resData.Fail.forEach(item => {
+                message+=`${item.NewIndexName}:${this.$t('MsgPrompt.add_fail_msg')}</br>`
+              })
+              // 失败的
+              this.existDataList = [...this.existDataList,...resData.Fail]
+              this.baseAddStep=3
+              this.$message.error(message)
+              allSuccess=false
+            }
+            if(allSuccess){
+              this.$message.success(this.$t('MsgPrompt.add_msg2'))
+              this.cancelHandle()	
+            }
+          }
+        }).finally(()=>{
+          this.isLoadingData=false
+        })
+      }
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+.dialog-container{
+  padding: 0 35px 35px;
+  .zone-title{
+    font-size: 16px;
+    line-height: 24px;
+    font-weight: bold;
+    color: #333333;
+  }
+  .data-set-box{
+    .data-set-row{
+      padding-top: 10px;
+      .radio-box{
+        margin-top: 20px;
+        display: flex;
+        align-items: center;
+        .data-set-row-text{
+          margin-right: 20px;
+        }
+        .time-item{
+          margin-right: 40px;
+          display: flex;
+          align-items: center;
+          .el-radio{
+            margin-right: 10px;
+          }
+          .el-input{
+            width: 172px;
+          }
+        }
+      }
+    }
+  }
+  .data-show-box{
+    margin-top: 20px;
+  }
+}
+.dialog-btn{
+  text-align: center;
+  padding: 40px 0 25px;
+  .el-button{
+    min-width: 120px;
+  }
+}
+.delete-icon{
+  height: 16px;
+  width: 16px;
+  cursor: pointer;
+}
+</style>
+<style lang="scss">
+.data-show-box{
+  .el-input{
+    width: 100%;
+    input{
+      border: none;
+      text-align: center;
+    }
+  }
+  .table-input{
+    input{
+      padding: 0;
+    }
+  }
+  .el-table tr{
+    background-color: #fff !important;
+    &:hover>td{
+        background-color: transparent !important; /* 或者其他想要的颜色值 */
+    }
+  }
+  .el-table td{
+    padding: 10px 0;
+  }
+}
+</style>

+ 634 - 0
src/views/dataEntry_manage/thirdBase/components/highFrequency/classifySetting.vue

@@ -0,0 +1,634 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="showIt" :close-on-click-modal="false" append-to-body v-dialogDrag top="5vh"
+    width="600px" :title="$t('HighFrequencyData.classify_setting')" @close="classifySetClose">
+      <div class="dialog-container">
+        <el-tree
+          ref="treeRef"
+          class="target_tree"
+          :data="classify"
+          node-key="UniqueCode"
+          :props="defaultProp"
+          :allow-drag="canDragHandle"
+          :allow-drop="canDropHandle"
+          :current-node-key="select_node"
+          :default-expanded-keys="defaultShowNodes"
+          draggable
+          :expand-on-click-node="false"
+          check-strictly
+          :empty-text="$t('Common.no_classify_msg')"
+          lazy
+          :load="getLazyTreeData"
+          @node-expand="handleNodeExpand"
+          @node-collapse="handleNodeCollapse"
+          @current-change="nodeChange"
+          @node-drop="dropOverHandle"
+          @node-drag-end="dropMouseLeave"
+          @node-drag-leave="dropMouseLeave"
+          @node-drag-enter="dropMouseOver"
+        >
+          <span class="custom-tree-node" slot-scope="{ node, data }">
+            <el-input
+              ref="editVal"
+              class="label-input"
+              v-model="new_label"
+              v-if="data.isEdit"
+              @blur="changeValue(node, data)"
+            />
+            <span
+              @dblclick.stop="editNodeLabel(node, data)"
+              v-else
+              class="text_oneLine node_label"
+              :id="`node${data.UniqueCode}`"
+            > 
+              <span v-if="data.IndexId">{{ data.IndexName }}</span>
+              <span v-else>{{ currentLang==='en' ? (data.ClassifyNameEn || data.ClassifyName) : data.ClassifyName }}</span>
+            </span>
+            <span
+              style="display: flex; align-items: center"
+              v-if="select_node === data.UniqueCode"
+            >
+              <img
+                src="~@/assets/img/data_m/move_ico.png"
+                alt=""
+                style="width: 14px; height: 14px; margin-right: 8px"
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_classify_move"
+              />
+              <!-- 添加子项 -->
+              <img
+                v-if="!data.IndexId"
+                src="~@/assets/img/set_m/add.png"
+                style="width: 14px; height: 14px; margin-right: 8px"
+                @click.stop="addNode(node, data)"
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_classify_editAdd"
+              />
+              <!-- 编辑子项 -->
+              <img
+                v-if="!data.IndexId"
+                src="~@/assets/img/set_m/edit.png"
+                style="width: 15px; height: 14px; margin-right: 8px"
+                @click.stop="editNode(node, data)"
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_classify_editAdd"
+              />
+              <!-- 删除子项 -->
+              <img
+                v-if="!data.IndexId"
+                slot="reference"
+                src="~@/assets/img/set_m/del.png"
+                style="width: 14px; height: 14px"
+                @click.stop="removeNode(node, data)"
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_classify_delete"
+              />
+            </span>
+          </span>
+        </el-tree>
+        <div class="add-top-classify" @click="addLevelOneHandle" v-permission="permissionBtn.dataSourcePermission.highFrequency_classify_editAdd">
+          <img
+            src="~@/assets/img/sand_new/add_ico.png"
+            alt=""
+            style="width: 16px; height: 16px; margin-right: 10px"
+          />
+          <span>{{$t('EtaBasePage.add_first_menu_btn')}}</span>
+        </div>
+      </div>
+    </el-dialog>
+    <!-- 新增、编辑目录 -->
+    <el-dialog
+      :visible.sync="isOpenDialog"
+      :close-on-click-modal="false"
+      append-to-body 
+      @close="cancelHandle"
+      custom-class="dialog"
+      center
+      width="560px"
+      v-dialogDrag>
+        <div slot="title" style="display:flex;align-items:center;">
+          <img :src="title=='添加'?$icons.add:title=='编辑'?$icons.edit:''" style="color:#fff;width:16px;height:16px;margin-right:5px;">
+          <span style="font-size:16px;">{{title==='添加' ? $t('Table.add_btn') : $t('Table.edit_btn')}}</span>
+        </div>
+        <div class="dialog-main">
+          <el-form
+          ref="diaForm"
+          label-position="left"
+          hide-required-asterisk
+          label-width="120px"
+          :model="dialogForm"
+          :rules="formRules">
+              <el-form-item :label="$t('EtaBasePage.parent_menu')" v-if="dialogForm.level>0">
+                <el-tooltip class="item" effect="dark" :content="getParentName" placement="top">
+                      <span class="parentStr">{{getParentName}}</span>
+                  </el-tooltip>
+              </el-form-item>
+              <el-form-item :label="$t('EtaBasePage.menu_name')" prop="levelVal">
+                <el-input
+                v-model="dialogForm.levelVal"
+                style="width: 80%"
+                :placeholder="$t('Dialog.require_vaild')"></el-input>
+              </el-form-item>
+          </el-form>
+        </div>
+        <div class="dia-bot">
+          <el-button type="primary" style="margin-right:20px" @click="saveHandle"><!-- 保存 -->{{$t('Dialog.confirm_save_btn')}}</el-button>
+          <el-button type="primary" plain @click="cancelHandle"><!-- 取消 -->{{$t('Dialog.cancel_btn')}}</el-button>
+        </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { highFrequencyDataInterface } from '@/api/api.js'
+  export default {
+    name:'classifySetting',
+    props:{
+      showIt:{
+        Type:Boolean,
+        default:false
+      }
+    },
+    computed:{
+      currentLang() {
+        return this.$store.state.lang
+      },
+      getParentName(){
+        const arr=this.dialogForm.parentArr||[]
+        let strArr=arr.reverse().map(item=>{
+          return this.currentLang==='en'?item.classifyNameEn:item.classifyName
+        })
+        
+        return strArr.join('/')
+      }
+    },
+    data() {
+      return {
+        classify:[],
+        defaultProp: {
+          label: 'ClassifyName',
+          children: 'Children',
+          isLeaf:'isLeaf'
+        },//树结构配置项
+        select_node:'',//当前选中的节点
+        defaultShowNodes:[], //默认展开的节点
+        new_label: '',//新的节点label值
+        formRules: {
+          levelVal:[
+            { required: true, message: this.$t('EtaBasePage.input_menu_msg'), trigger: 'blur' },
+          ]
+        },
+        dialogForm:{
+          level:''
+        },
+        title:"",
+
+        requestDataList:false, //是否需要请求数据列表 修改分类名名称 移动分类、指标位置
+        requestClassifyList:false,//是否需要请求分类列表(筛选项中的) 新增、修改、删除、移动分类位置
+      }
+    },
+    watch:{
+      showIt(value){
+        if(value){
+          this.requestDataList=false
+          this.requestClassifyList=false
+        }
+      }
+    },
+    methods: {
+      //控制页面按钮权限
+      canBtnShow(type){
+        const {dataSourcePermission,checkPermissionBtn}=this.permissionBtn
+        const BtnMap = {
+          'editAddClassify':dataSourcePermission.highFrequency_classify_editAdd,//编辑/添加分类
+          'moveClassify':dataSourcePermission.highFrequency_classify_move,//移动分类
+        }
+        return checkPermissionBtn(BtnMap[type])
+      },
+      getClassify(){
+        highFrequencyDataInterface.classifyList({ParentId:0}).then(res=>{
+          if(res.Ret == 200){
+            this.classify=res.Data||[]
+            this.classify.map(cl => cl.Children || (cl.Children=[]))
+            console.log(this.classify,'classify');
+          }
+        })
+      },
+      //绑定el-tree的load属性
+      async getLazyTreeData (node,resolve){
+        console.log(node);
+        if(node.level===0){
+          resolve(this.classify)
+        }else{
+          let arr=[]
+          const res=await highFrequencyDataInterface.classifyList({ParentId:node.data.ClassifyId})
+          if (res.Ret === 200) {
+            const temarr = res.Data || [];
+            arr=temarr.map(item=>{
+              return {
+                ...item,
+                isLeaf:item.IndexId?true:false,
+                Children:[]
+              }
+            })
+          }
+          resolve(arr)
+        }
+        this.select_node && this.$refs.treeRef && this.$nextTick(() => {
+          this.$refs.treeRef.setCurrentKey(this.select_node);
+          let node = document.getElementById(`node${this.select_node}`)||{}
+          let parent = document.getElementsByClassName('target_tree')[0];
+          //parent可视区间:[scrollTop,scrollTop+offsetHeight]
+          //node位置:node.offsetTop
+          const overTop = node.offsetTop+node.clientHeight+30<parent.scrollTop
+          const overBottom = node.offsetTop+node.clientHeight+30>parent.scrollTop+parent.offsetHeight
+          if(overTop){
+            parent.scrollTop = node.offsetTop-60
+          }
+          if(overBottom){
+            parent.scrollTop =  node.offsetTop - parent.offsetHeight/2
+          }
+        });
+      },
+      // 树节点展开
+      handleNodeExpand (data) {
+        // 保存当前展开的节点
+        let flag = this.defaultShowNodes.some((item) => item === data.UniqueCode);
+        if (!flag) { // 不存在则存到数组里
+          this.defaultShowNodes.push(data.UniqueCode)
+        }
+      },
+      // 树节点关闭
+      handleNodeCollapse (data) {
+        this.defaultShowNodes.some((item, index) => {
+          if (item === data.UniqueCode) {
+            // 删除关闭节点
+            this.defaultShowNodes.length = index
+          }
+        })
+      },
+      /* 节点变化时 */
+      nodeChange(data,node) {
+        this.select_node = data.UniqueCode;
+      },
+      /* 判断节点是否能被拖拽 */
+      canDragHandle({data}) {
+        return this.canBtnShow('moveClassify')
+      },
+      /* 判断节点是否能被拖入 */
+      canDropHandle(draggingNode, dropNode, type) {
+        let canDrop=false
+        
+        // 如果拖动的是指标
+        if(draggingNode.data.IndexId){
+          if(!(dropNode.level===1&&type!=='inner')){
+            canDrop=true
+          }
+        }else{//拖动的是目录
+          // console.log(dropNode.level,draggingNode.level);
+          //目录层级不能改变
+          if((dropNode.level+1==draggingNode.level&&type==='inner'&&!dropNode.data.IndexId)||(dropNode.level===draggingNode.level&&type!=='inner')){
+            canDrop=true
+          }
+        }
+        return canDrop
+      },
+      /* 拖拽完成 */
+      dropOverHandle(b,a,i,e) {
+        // 被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置
+        console.log(b,a,i);
+        const isIndex=b.data.IndexId?true:false
+        let list=a.parent.childNodes;
+        let targetIndex=0,PrevClassifyId=0,NextClassifyId=0,ParentClassifyId=0;
+        let ClassifyId=0,ItemId=0,PrevItemId=0,NextItemId=0;
+
+        ClassifyId=isIndex?0:b.data.ClassifyId
+        ItemId=isIndex?b.data.IndexId:0
+        
+
+        if(i!=='inner'){
+          ParentClassifyId=a.parent.data.ClassifyId||0
+          list.forEach((item,index)=>{
+            if(isIndex){
+              if(item.data.IndexId===b.data.IndexId){
+                targetIndex=index
+              }
+            }else{
+              if(item.data.ClassifyId===b.data.ClassifyId){
+                targetIndex=index
+              }
+            }
+            
+          })
+
+          console.log(targetIndex);
+          
+          if(targetIndex===0){
+            const data=list[targetIndex+1].data
+            NextClassifyId=data.EdbCode?0:data.ClassifyId
+            NextItemId=data.EdbCode?data.IndexId:0
+          }else if(targetIndex===list.length-1){
+            const data=list[targetIndex-1].data
+            PrevClassifyId=data.EdbCode?0:data.ClassifyId
+            PrevItemId=data.EdbCode?data.IndexId:0
+          }else{
+            const pData=list[targetIndex-1].data
+            PrevClassifyId=pData.EdbCode?0:pData.ClassifyId
+
+            PrevItemId=pData.EdbCode?pData.IndexId:0
+
+            const nData=list[targetIndex+1].data
+            NextClassifyId=nData.EdbCode?0:nData.ClassifyId
+            NextItemId=nData.EdbCode?nData.IndexId:0
+          }
+        }else{
+          ParentClassifyId=a.data.ClassifyId||0
+        }
+
+        const params={
+          ClassifyId,
+          ParentClassifyId,
+          ItemId,
+          PrevClassifyId,
+          NextClassifyId,
+          PrevItemId,
+          NextItemId
+        }
+        // console.log(params);
+        highFrequencyDataInterface.classifyMove(params).then(res=>{
+          if(res.Ret===200){
+            this.$message.success(this.$t('MsgPrompt.move_sort_success'))
+          }
+          this.requestDataList=true
+          !isIndex && (this.requestClassifyList=true)
+          if(i=='inner'){
+            let code = a.data.UniqueCode
+            let flag = 	this.defaultShowNodes.some((item) => {
+              return item === code
+            });
+            code && !flag && this.defaultShowNodes.push(code);
+          }
+
+
+          this.getClassify() 
+        })
+      },
+      /* 拖拽覆盖添加背景色 */
+      dropMouseOver(node1,node2,e) {
+        // console.log(e.layerY);
+        // 被拖拽节点对应的 Node、所进入节点对应的 Node、event
+        if(!node2.data.IndexId&&(node1.level>node2.level||(node1.data.IndexId>0&&!node2.data.IndexId)) && (e.target.childNodes[0].className.includes('el-tree-node__content') 
+        || e.target.className.includes('el-tree-node__content'))) {
+          // console.log(e.target.childNodes[0])
+          e.target.childNodes[0].className.includes('el-tree-node__content') 
+          ? e.target.childNodes[0].style.backgroundColor = '#409eff' 
+          : e.target.style.backgroundColor = '#409eff';
+        }
+      },
+      /* 拖拽离开/拖拽完成重置背景色 */
+      dropMouseLeave(node1,node2,e) {
+        let arrs = $('.el-tree-node__content');
+        for( let a of arrs ) {
+          a.style.backgroundColor = 'transparent';
+        }
+      },
+      /* 双击label出现input修改框 */
+      editNodeLabel(node, data) {
+        //目录名称可以双击修改 指标不能
+        if(!data.IndexId &&this.canBtnShow('editAddClassify')) {
+          this.$set(data,'isEdit',true)
+          this.new_label = this.currentLang==='en' ? data.ClassifyNameEn : data.ClassifyName;
+          this.$nextTick(() => {
+            this.$refs.editVal.focus();
+          });
+        }
+      },
+      /* input失去焦点恢复node 修改最新的值*/
+      changeValue(node, data) {
+        this.$set(data,'isEdit',false)
+        if(!this.new_label) return this.$message.warning(this.$t('MsgPrompt.name_none'))
+        if(this.new_label!=(this.currentLang==='en' ? data.ClassifyNameEn : data.ClassifyName)) {
+          highFrequencyDataInterface.classifyEdit({
+            ClassifyId: data.ClassifyId,
+            ClassifyName: this.new_label
+          }).then(res => {
+            if(res.Ret === 200) {
+              this.getClassify();
+            }
+          })
+        }
+      },
+      /* 添加节点 */
+      addNode(node,data) {
+        this.title = '添加';
+        let arr=[]
+        arr=this.getNodeParentData(node,arr)
+        /* 添加目录 */
+        this.dialogForm = {
+          parentArr:arr,
+          parent_id: data.ClassifyId,
+          level: node.level,
+          levelVal:'',
+          uniqueCode:data.UniqueCode
+        }
+        this.isOpenDialog = true;
+      },
+      // 递归节点
+      getNodeParentData(data,arr){
+        if(data.level===0) return
+        arr.push({classifyName:this.currentLang==='en'?data.data.ClassifyNameEn:data.data.ClassifyName,classifyId:data.data.ClassifyId})
+        this.getNodeParentData(data.parent,arr)
+        return arr
+      },
+      /* 编辑节点 */
+      editNode(node,data) {
+        this.title = '编辑';
+        let arr=[]
+        arr=this.getNodeParentData(node.parent,arr)
+        /* 编辑目录 */
+        this.dialogForm = {
+          parentArr:arr,
+          levelVal: this.currentLang==='en'?data.ClassifyNameEn:data.ClassifyName,
+          classify_id: data.ClassifyId,
+          level: node.level-1,
+          uniqueCode:data.UniqueCode
+        }
+        this.isOpenDialog = true;
+      },
+      /* 删除节点校验 */
+      removeNode(node,data) {
+        this.$confirm(
+          this.$t('Edb.MsgPrompt.del_menu_confirm'),
+          /* 提示 */this.$t('Dialog.warn_tit'),
+          {
+          confirmButtonText: /* '确定' */this.$t('Dialog.confirm_btn'),
+          cancelButtonText: /* '取消' */this.$t('Dialog.cancel_btn'),
+          type: 'warning'
+        }).then(() => {
+          highFrequencyDataInterface.classifyDelete({
+            ClassifyId: data.ClassifyId,
+          }).then(res => {
+            if(res.Ret === 200) {
+            this.$message.success(this.$t('MsgPrompt.delete_msg'));
+            this.getClassify();
+            this.requestClassifyList=true
+          }
+          })
+        }).catch(() => {});
+      },
+      /* 添加一级目录 */
+      addLevelOneHandle() {
+        this.title = '添加';
+        this.dialogForm = {
+          parent_id: '',
+          level: 0,
+          levelVal:'',
+        }
+        this.isOpenDialog = true;
+      },
+      async saveHandle(){
+        await this.$refs.diaForm.validate();
+        let res = null;
+        if(this.title==='添加') {
+          res = await highFrequencyDataInterface.classifyAdd({
+            ClassifyName: this.dialogForm.levelVal||'',
+            ParentId:this.dialogForm.parent_id || 0,
+            Level: this.dialogForm.level
+          })
+        }else if(this.title==='编辑') {
+          res = await highFrequencyDataInterface.classifyEdit({
+            ClassifyName: this.dialogForm.levelVal||'',
+            ClassifyId:this.dialogForm.classify_id || 0
+          })
+        }
+        if(res.Ret !== 200) return
+        this.$message.success(res.Msg);
+        this.getClassify();
+        if(this.title==='添加'){
+          //新增分类完成之后,展开父节点显示刚新增的分类,若已展开节点则不做处理
+          let code = this.dialogForm.uniqueCode
+          let flag = 	this.defaultShowNodes.some((item) => {
+            return item === code
+          });
+          code && !flag && this.defaultShowNodes.push(code);
+        }else if(this.title==='编辑'){
+          this.requestDataList=true
+        }
+        this.requestClassifyList=true
+        this.cancelHandle()
+      },
+      cancelHandle(){
+        this.isOpenDialog=false
+        this.dialogForm={
+          level:''
+        }
+        this.$refs.diaForm.clearValidate();
+      },
+      classifySetClose(){
+        this.$emit('closeHandle',{requestClassifyList:this.requestClassifyList,requestDataList:this.requestDataList})
+      }
+    },
+    mounted(){
+      this.getClassify()
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .dialog-container{
+    padding: 0 35px 25px;
+  }
+  .parentStr{
+		display: block;
+		width: 304px;
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+	.dialog-main {
+		padding-left: 50px;
+	}
+	.el-cascader .el-input {
+		width: 100%;
+	}
+	.dia-bot {
+		margin: 52px 0 30px;
+		display: flex;
+		justify-content: center;
+
+	}
+</style>
+<style lang="scss">
+@import "~@/styles/theme-vars.scss";
+.target_tree {
+  color: #333;
+  height: 630px; 
+  overflow: auto;
+  .label-input .el-input__inner {
+    height: 25px;
+    line-height: 25px;
+  }
+  .el-input{
+    width: 100%;
+    padding-right: 10px;
+  }
+  .custom-tree-node {
+    display: flex !important;
+    justify-content: space-between;
+    align-items: center;
+    display: block;
+    flex: 1;
+    width: calc(100% - 30px);
+    .node_label {
+      margin-right: 2px;
+    }
+    .el-icon-view {
+      color: #409eff;
+      font-size: 18px;
+      margin-left: 5px;
+    }
+  }
+  .el-tree__drop-indicator{
+    height:3px;
+    background-color:$theme-color;
+  }
+  .el-tree-node__content {
+    margin-bottom: 10px !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_black.png') !important;
+  }
+  .el-icon-caret-right:before {
+    content: url('~@/assets/img/set_m/slide_black.png') !important;
+  }
+  .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;
+  }
+}
+.add-top-classify {
+  margin: 20px 0 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: $theme-color;
+  font-size: 16px;
+  cursor: pointer;
+}
+		
+</style>

+ 999 - 0
src/views/dataEntry_manage/thirdBase/highFrequencyData.vue

@@ -0,0 +1,999 @@
+<template>
+    <div class="hight-frequency-data-container">
+        <div class="top-box">
+            <div class="select-box">
+                <span>{{$t('SystemManage.DataRefresh.select_source')}}</span>
+                <el-select :placeholder="$t('SystemManage.DataRefresh.select_source_pld')" v-model="Source" @change="handleSourceChange">
+                    <el-option v-for="item in SourceList" :key="item.Source" 
+                    :label="$i18nt.locale==='zh'?item.SourceName:item.SourceNameEn||item.SourceName" :value="item.Source"/>
+                </el-select>
+                <el-select v-model="Sequence" @change="handleSequenceChange">
+                    <el-option v-for="item in SequenceList" :key="item.Sequence" 
+                    :label="$i18nt.locale==='zh'?item.SequenceName:item.SequenceNameEn||item.SequenceName" :value="item.Sequence"/>
+                </el-select>
+                <!-- 添加高频数据 -->
+                <el-button type="primary" @click="addHighFrequencyDiaShow" v-permission="permissionBtn.dataSourcePermission.highFrequency_adds"
+                >{{$t('HighFrequencyData.add_high_frequency_data')}}</el-button>
+            </div>
+        </div>
+        <div class="table-box">
+          <div class="table-select">
+            <div class="select-list">
+              <el-cascader :placeholder="$t('HighFrequencyData.select_classify_prompt')"
+                v-model="classifyArr" @change="searchListDelay" :options="classifyListTree" 
+                style="max-width: 160px;"
+                :show-all-levels="false" collapse-tags
+                :props="{
+                  emitPath:false,
+                  value:'ClassifyId',
+                  label:'ClassifyName',
+                  children:'Children',
+                  multiple:true
+                }" 
+                clearable/>
+              <div class="associative-box">
+                <span>{{$t('HighFrequencyData.associative_sub_classify')}}</span>
+                <el-switch v-model="searchParams.isAssociativeSub" @change="searchList"></el-switch>
+                <span class="span-button" @click="setClassify" 
+                v-permission="[permissionBtn.dataSourcePermission.highFrequency_classify_move,permissionBtn.dataSourcePermission.highFrequency_classify_delete,
+                  permissionBtn.dataSourcePermission.highFrequency_classify_editAdd,'or']"
+                >{{$t('HighFrequencyData.classify_setting')}}</span>
+              </div>
+              <el-select :placeholder="$t('Edb.InputHolderAll.input_fre')" v-model="frequencyArr" @change="searchListDelay" multiple collapse-tags clearable>
+                <el-option v-for="i in frequencyList" :key="i.value"
+                    :label="i.label" :value="i.value"
+                />
+              </el-select>
+              <el-cascader
+                :placeholder="$t('Edb.InputHolderAll.select_creator')" v-model="userArr" @change="searchListDelay"
+                :props="{
+                    value: 'ItemId',
+                    label: 'ItemName',
+                    children: 'Children',
+                    emitPath: false,
+                    multiple:true,
+                }"
+                :options="userList"
+                collapse-tags
+                :show-all-levels="false"
+                clearable
+                filterable 
+              />
+              <el-input :placeholder="$t('Edb.InputHolderAll.input_name_orid')" prefix-icon="el-icon-search" clearable
+              v-model="searchParams.keyWord" @input="searchList"></el-input>
+            </div>
+            <div class="select-other">
+              <el-checkbox :indeterminate="isIndeterminate" v-model="isCheckAll" @change="listCheckAllChange">{{$t('SystemManage.DataRefresh.all_list')}}</el-checkbox>
+              <!-- 批量添加到指标库 -->
+              <el-button type="primary" @click="batchAddToDatabaseOpen"
+                :disabled="!selectedTotal>0" :loading="batchLoading"
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_addTo_database"
+              >{{$t('HighFrequencyData.add_to_eta_indicators')}}</el-button>
+              <!-- 批量操作 -->
+              <el-button type="primary" @click="openBatchOperationDia"
+                :disabled="!selectedTotal>0" :loading="batchLoading"
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_operations"
+              >{{$t('HighFrequencyData.batch_operation')}}</el-button>
+            </div>
+          </div>
+          <el-table :data="tableData" border ref="edbDataRef"
+            @selection-change="selectionChange"
+            @select="selectHandle" 
+            @select-all="selectAllHandle"
+            @sort-change="handleSortChange"
+          >
+            <!-- 多选 -->
+            <el-table-column
+                align="center"
+                type="selection"
+                width="55">
+            </el-table-column>
+            <!-- 指标ID -->
+            <el-table-column prop="IndexCode" :label="$t('Edb.Detail.e_id')" align="center" show-overflow-tooltip>
+              <template slot-scope="{row}">
+                <span>{{row.IndexCode}}</span>
+              </template>
+            </el-table-column>
+            <!-- 指标名称 -->
+            <el-table-column prop="IndexName" :label="$t('Edb.Detail.e_name')" align="center" show-overflow-tooltip>
+              <template slot-scope="{row}">
+                <span>{{row.IndexName}}</span>
+              </template>
+            </el-table-column>
+            <!-- 频度 -->
+            <el-table-column prop="Frequency" :label="$t('Edb.Detail.e_fre')" align="center">
+              <template slot-scope="{row}">
+                <span>{{row.Frequency}}</span>
+              </template>
+            </el-table-column>
+            <!-- 单位 -->
+            <el-table-column prop="Unit" :label="$t('Edb.Detail.e_unit')" align="center">
+              <template slot-scope="{row}">
+                <span>{{row.Unit}}</span>
+              </template>
+            </el-table-column>
+            <!-- 指标开始时间 -->
+            <el-table-column prop="StartDate" :label="$t('Edb.Detail.e_start_time_whole')" align="center" sortable="custom">
+              <template slot-scope="{row}">
+                <span>{{row.StartDate}}</span>
+              </template>
+            </el-table-column>
+            <!-- 指标最新时间 -->
+            <el-table-column prop="EndDate" :label="$t('Edb.Detail.e_latest_time_whole')" align="center" sortable="custom">
+              <template slot-scope="{row}">
+                <span>{{row.EndDate}}</span>
+              </template>
+            </el-table-column>
+            <!-- 更新时间 -->
+            <el-table-column prop="ModifyTime" :label="$t('Edb.Detail.e_update_time')" align="center" sortable="custom">
+              <template slot-scope="{row}">
+                <span>{{row.ModifyTime}}</span>
+              </template>
+            </el-table-column>
+            <!-- 最新值 -->
+            <el-table-column prop="LatestValue" :label="$t('Edb.Detail.e_latest_value')" align="center" sortable="custom">
+              <template slot-scope="{row}">
+                <span>{{row.LatestValue}}</span>
+              </template>
+            </el-table-column>
+            <!-- 数据源分类 -->
+            <el-table-column prop="ClassifyPath" :label="$t('HighFrequencyData.data_source_classify')" align="center" show-overflow-tooltip>
+              <template slot-scope="{row}">
+                <span>{{row.ClassifyPath}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="Operation" :label="$t('Table.column_operations')" align="center">
+              <template slot-scope="{row}">
+                <span class="table-operation-item" @click="detailIndexHandle(row)" 
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_operation_detail">{{ $t('Table.detail_btn') }}</span>
+                <span class="table-operation-item" @click="refreshIndexHandle(row)"
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_operation_refresh">{{ $t('Table.refresh_btn') }}</span>
+                <span class="table-operation-item del-item" @click="deleteIndexHandle(row)"
+                v-permission="permissionBtn.dataSourcePermission.highFrequency_operation_delete">{{ $t('Table.delete_btn') }}</span>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-pagination 
+            :current-page="searchParams.currentPage"
+            :page-size="searchParams.pageSize"
+            :total="total"
+            @current-change="handleCurrentChange"
+          />
+        </div>
+        <!-- 数据详情 -->
+        <el-dialog custom-class="custom-dialog"
+          :title="$t('Edb.data_detail_tab')"
+          :visible.sync="detailDiaShow"
+          :close-on-click-modal="false"
+          :modal-append-to-body="false"
+          @close="detailDiaShow=false"
+          width="980px"
+          top="5vh"
+          v-dialogDrag
+          center
+        >
+          <div class="dialog-container">
+            <div class="detail-date-select-zone">
+              <span>{{ $t('HighFrequencyData.data_date') }}</span>
+              <el-date-picker v-model="detailRequestParams.DataDate" type="date" :clearable="false" @change="getIndexDetailFun"
+                :placeholder="$t('EtaBasePage.input_date_msg')" style="max-width:240px" value-format="yyyy-MM-dd"></el-date-picker>
+            </div>
+            <div class="detail-data-zone">
+              <div class="detail-data-zone-header">
+                <table border class="header-table">
+                    <tr>
+                      <td>{{ $t('Edb.Detail.e_name') }}</td>
+                      <td>
+                        <el-input v-model.trim="indexDetail.IndexName" :placeholder="$t('Edb.InputHolderAll.input_name')" size="mini"></el-input>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td>{{ $t('Edb.Detail.e_stock_code') }}</td>
+                      <td>{{ indexDetail.ZqCode }}</td>
+                    </tr>
+                    <tr>
+                      <td>{{ $t('Edb.Detail.e_indicator_code') }}</td>
+                      <td>{{ indexDetail.ZbCode }}</td>
+                    </tr>
+                </table>
+                <table border class="header-table">
+                    <tr>
+                      <td>{{ $t('HighFrequencyData.belong_to_classify') }}</td>
+                      <td>
+                        <el-cascader :options="classifyListTree" v-model="indexDetail.ClassifyId" 
+                        size="mini"
+                        :props="{label: 'ClassifyName',
+                          value: 'ClassifyId',
+                          children: 'Children',
+                          checkStrictly: true,
+                          emitPath:false}">
+                        </el-cascader>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td>{{ $t('Edb.Detail.e_unit') }}</td>
+                      <td>
+                        <el-autocomplete
+                          v-model.trim="indexDetail.Unit"
+                          :fetch-suggestions="querySearchUnit"
+                          :placeholder="$t('Edb.InputHolderAll.input_unit')"
+                          suffix-icon="el-icon-arrow-down"
+                          size="mini"
+                        ></el-autocomplete>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td>{{ $t('Edb.Detail.e_fre') }}</td>
+                      <td>{{indexDetail.Frequency}}</td>
+                    </tr>
+                </table>
+              </div>
+              <div class="detail-data-list" ref="detailDataListRef">
+                <table class="body-table" >
+                  <template v-if="indexDetail.DataList && indexDetail.DataList.length>0">
+                    <tr v-for="(item,index) in indexDetail.DataList" :key="index">
+                      <td>{{ item.DataTime }}</td>
+                      <td>{{ item.Value }}</td>
+                    </tr>
+                  </template>
+                  <tableNoData v-else></tableNoData>
+                </table>
+              </div>
+            </div>
+          </div>
+          <!-- 弹窗按钮 -->
+          <div class="dialog-btn">
+            <el-button type="primary" plain @click="detailDiaShow=false">{{$t('Dialog.cancel_btn')}}</el-button>
+            <el-button type="primary" @click="editDataHandle">{{$t('Dialog.confirm_btn')}}</el-button>
+          </div>
+        </el-dialog>
+        <!-- 批量操作 -->
+        <el-dialog custom-class="custom-dialog"
+          :title="$t('HighFrequencyData.batch_operation')"
+          :visible.sync="batchOperationDialogShow"
+          :close-on-click-modal="false"
+          :modal-append-to-body="false"
+          @close="batchOperationClose"
+          width="600px"
+          top="5vh"
+          v-dialogDrag
+        >
+          <div class="dialog-container">
+            <div class="batch-option-row">
+              <el-radio v-model="batchOperationData.type" :label="1">{{ $t('HighFrequencyData.move_to_new_classify') }}</el-radio>
+              <el-cascader :options="classifyListTree" v-model="batchOperationData.newClassify" 
+              style="width: 160px;"
+              :placeholder="$t('HighFrequencyData.select_classify_prompt')"
+              :props="{label: 'ClassifyName',
+              value: 'ClassifyId',
+              children: 'Children',
+              checkStrictly: true,
+              emitPath:false}">
+              </el-cascader>
+            </div>
+            <div class="batch-option-row">
+              <el-radio v-model="batchOperationData.type" :label="2" style="margin-right: 10px;">{{ $t('Edb.detail_del_btn') }}</el-radio>
+            </div>
+            <div class="batch-option-row">
+              <el-radio v-model="batchOperationData.type" :label="3">{{ $t('Edb.detail_refresh_btn') }}</el-radio>
+              <div class="radio-box" v-show="batchOperationData.type==3">
+                <el-radio v-model="batchOperationData.refreshType" :label="1">{{ $t('HighFrequencyData.last_six_hours') }}</el-radio>
+                <el-radio v-model="batchOperationData.refreshType" :label="2">{{ $t('HighFrequencyData.refresh_all') }}</el-radio>
+              </div>
+            </div>
+          </div>
+          <!-- 弹窗按钮 -->
+          <div class="dialog-btn">
+            <el-button type="primary" plain @click="batchOperationDialogShow=false">{{$t('Dialog.cancel_btn')}}</el-button>
+            <el-button type="primary" @click="batchOpeartion">{{$t('Dialog.confirm_btn')}}</el-button>
+          </div>
+        </el-dialog>
+        <!-- 分类设置 -->
+        <classifySetting :showIt.sync="classifySettingShow" @closeHandle="classifyCloseHandle" />
+        <!-- 添加高频数据 -->
+        <addHighFrequencyData :isAddShow.sync="addHighFrequencyShow" :unitList="unitList" :classifyList="classifyListTree"  @addSuccessHandle="addHighFrequencySuccess" />
+        <!-- 批量添加到到指标库 -->
+        <addToIndexDatabaseBatch :isAddShow.sync="batchAddToDatabaseShow" :IndexIds="choiceIdList"/>
+    </div>
+</template>
+
+<script>
+import {dataRefreshInterface,dataAuthInterface} from '@/api/modules/dataApi.js';
+import { dataInterence,highFrequencyDataInterface } from '@/api/api.js'
+import classifySetting from './components/highFrequency/classifySetting.vue';
+import addHighFrequencyData from './components/highFrequency/addHighFrequencyData.vue'
+import addToIndexDatabaseBatch from './components/highFrequency/addToIndexDatabaseBatch.vue';
+
+  export default {
+    name:'highFrequencyData',
+    components:{classifySetting,addHighFrequencyData,addToIndexDatabaseBatch},
+    data() {
+        return {
+            Source:'',
+            SourceList:[],
+            Sequence:'',
+            SequenceList:[],
+
+            classifyListTree:[],
+            userList:[],
+            unitList:[],
+            searchParams:{
+              classify:'',//分类
+              isAssociativeSub:true,//是否关联子分类
+              frequency:'',//频度
+              user:'',//创建人
+              keyWord:'',//关键字
+              sortType:'',//升序降序
+              sortParam:'',//排序字段
+              pageSize:10,
+              currentPage:1,
+            },
+            classifyArr:[],
+            frequencyArr:[],
+            userArr:[],
+            tableData: [],
+            tableDataIds:[],
+            total:0,
+
+            //全部全选
+            isIndeterminate:false,
+            isCheckAll:false,
+            isSelectAll:false,//为true时,selectList是剔除的指标,为false时selectList是已选择的指标
+            //已选择/已剔除的指标id
+            selectList:[],//监听table的select-all select
+            choiceIdList:[], //后端返回的选中的列表
+
+            detailDiaShow:false,
+            indexDetail:{},
+            detailRequestParams:{
+              IndexId:0,
+              DataDate:''
+            },
+
+            classifySettingShow:false,
+
+            addHighFrequencyShow:false,
+
+            batchOperationDialogShow:false,
+            batchOperationData:{
+              type:1,
+              newClassify:0,
+              refreshType:1
+            },
+
+            batchAddToDatabaseShow:false,
+            batchLoading:false
+        };
+    },
+    computed:{
+      selectedTotal(){
+        if(this.isSelectAll){
+          return this.total - (this.selectList ? this.selectList.length : 0)
+        }else{
+          return this.selectList ? this.selectList.length : 0
+        }
+      },
+      frequencyList() {
+        return [
+            {
+            value: "1m",
+            label: "1m",
+            },
+            {
+            value: "3m",
+            label: '3m',
+            },
+            {
+            value: "5m",
+            label: "5m",
+            },
+            {
+            value: "10m",
+            label: "10m",
+            },
+            {
+            value: "15m",
+            label: "15m",
+            },
+            {
+            value: "30m",
+            label: "30m",
+            },
+            {
+            value: "60m",
+            label: "60m",
+            },
+        ];
+      },
+    },
+    watch:{
+      classifyArr(value){
+        if(value && value.length>0){
+          const classifyIds = [...new Set(value.join(',').split(','))]
+          this.searchParams.classify=classifyIds.join(',')
+        }else{
+          this.searchParams.classify=''
+        }
+      },
+      frequencyArr(value){
+        if(value && value.length>0){
+          this.searchParams.frequency=value.join(',')
+        }else{
+          this.searchParams.frequency=''
+        }
+      },
+      userArr(value){
+        if(value && value.length>0){
+          this.searchParams.user=value.join(',')
+        }else{
+          this.searchParams.user=''
+        }
+      },
+    },
+    methods: {
+        //添加高频数据
+        addHighFrequencyDiaShow(){
+          this.addHighFrequencyShow=true
+        },
+        addHighFrequencySuccess(){
+          this.searchParams.currentPage = 1
+          this.getTableData()
+        },
+        //获取数据源列表
+        getSourceList(){
+          this.SourceList=[{Source: 1,SourceName: "同花顺",SourceNameEn: "同花顺"}]
+          this.Source = this.SourceList[0].Source
+        },
+        getSequenceList(){
+          this.SequenceList=[{Sequence: 1,SequenceName: "高频序列",SequenceNameEn: "高频序列"}]
+          this.Sequence = this.SequenceList[0].Sequence
+        },
+        //数据源改变
+        handleSourceChange(){
+        },
+        // 序列改变
+        handleSequenceChange(){
+        },
+        //获取分类列表
+        async getClassifyList(){
+          const res = await highFrequencyDataInterface.classifyListTree()
+          if(res.Ret!==200) return 
+          this.classifyListTree = res.Data||[]
+        },
+        //获取用户列表
+        getUserList() {
+          dataAuthInterface.userSearch({
+              KeyWord: ''
+          }).then(res => {
+              if(res.Ret !== 200) return 
+              this.userList = res.Data||[]
+          })
+        },
+        // 获取指标单位
+        async getUnitList(){
+          let res=await dataInterence.getTargetUnitList()
+          if(res.Ret===200){
+            this.unitList=res.Data&&res.Data.map(item=>{
+              return {value:item}
+            })
+          }
+        },
+        //搜索单位
+        querySearchUnit(queryString, cb){
+          let results = queryString ? this.unitList.filter(item=>item.value.indexOf(queryString) === 0) : this.unitList;
+          // 调用 callback 返回建议列表的数据
+          cb(results);
+        },
+        searchListDelay(){
+          setTimeout(()=>{
+            this.searchList()
+          },0)
+        },
+        //表格筛选项改变时触发
+        searchList(){
+          console.log('search');
+          this.searchParams.currentPage = 1
+          this.getTableData('search')
+        },
+        handleCurrentChange(page){
+            this.searchParams.currentPage = page
+            this.getTableData()
+        },
+        async getTableData(type){
+          const {frequency,user,classify,keyWord,sortParam,sortType,currentPage,pageSize,isAssociativeSub} = this.searchParams
+          let params={
+            ClassifyId:classify,
+            IncludeChild:isAssociativeSub,
+            SysAdminId:user,
+            Frequency:frequency,
+            Keywords:keyWord,
+            SortField:sortParam,
+            SortType:sortType,
+            PageSize:Number(pageSize) || 1,
+            CurrentIndex:Number(currentPage)||10
+          }
+          // console.log(params,'params');
+          const res = await highFrequencyDataInterface.getTableDataApi(params)
+          if(res.Ret!==200) return 
+          const {Paging,List} = res.Data||{}
+          this.tableData = List||[]
+          this.total = Paging.Totals||0
+          if(this.tableData.length>0){
+            this.tableDataIds = this.tableData.map(it => it.IndexId)
+          }else{
+            this.tableDataIds = []
+          }
+          if(type==='search'){
+              //如果是表格筛选项改变导致重新请求数据
+              //数据获取完成后,列表全选,表格全选
+              this.selectList = []
+              this.listCheckAllChange(true)
+          }else{
+              //若不是,数据获取完成后,查询列表全选的值
+              //若当页有数据在selectList内,则勾选/剔除
+              this.adjustSelection()
+          }
+        },
+        //勾选/取消勾选表格项
+        adjustSelection(){
+            if(!this.isSelectAll){
+              this.tableData.map(it =>{
+                    let row = this.selectList.includes(it.IndexId)?it:''
+                    if(row){
+                        this.$nextTick(()=>{
+                          this.$refs.edbDataRef.toggleRowSelection(row,true)
+                        })
+                    }
+                })
+            }else{
+              this.tableData.map(it =>{
+                let row = this.selectList.includes(it.IndexId)?'':it
+                if(row){
+                  this.$nextTick(()=>{
+                    this.$refs.edbDataRef.toggleRowSelection(row,true)
+                  })
+                }
+              })
+            }
+        },
+        //列表全选改变
+        listCheckAllChange(value){
+            this.selectList = []
+            this.isSelectAll = value
+            this.$refs.edbDataRef && this.$refs.edbDataRef.clearSelection()
+            if(value){
+                this.$refs.edbDataRef && this.$refs.edbDataRef.toggleAllSelection()
+            }
+        },
+        selectionChange(selection){
+            // selectAllHandle的触发在selectionChange后面,将selectionChange的逻辑延迟一下
+            setTimeout(()=>{
+                // 去重
+                let duplicateArr = Array.from(new Set(this.selectList))
+                //isSelectAll为true时,selectList表示需要剔除的项
+                //isSelectAll为false时,selectList表示需要勾选的项
+                //全选
+                if((duplicateArr.length == this.total && (!this.isSelectAll))|| (duplicateArr.length == 0 && this.isSelectAll)){
+                    this.isCheckAll = true
+                    this.isIndeterminate=false
+                //全不选
+                }else if((duplicateArr.length == 0 && (!this.isSelectAll))|| (duplicateArr.length == this.total && this.isSelectAll)){
+                    this.isCheckAll = false
+                    this.isIndeterminate=false
+                //半选
+                }else{
+                    this.isCheckAll = false
+                    this.isIndeterminate=true
+                }
+            },1)
+        },
+        selectHandle(selection,row){
+            let check = false; 
+            if(selection.some(it => it.IndexId == row.IndexId)){
+                // 勾选
+                if(this.isSelectAll){
+                    check=false
+                }else{
+                    check=true
+                }
+            }else{
+                // 取消勾选
+                if(this.isSelectAll){
+                    check=true
+                }else{
+                    check=false
+                }
+            }
+            if(check){
+              this.selectList.push(row.IndexId)
+            }else{
+              this.selectList=this.selectList.filter(it => it!=row.IndexId)
+            }
+        },
+        selectAllHandle(selection){
+          let check = false; 
+          if(selection && selection.length>0){
+              // 全选
+              if(this.isSelectAll){
+                  check=false
+              }else{
+                  check=true
+              }
+          }else{
+              // 全不选
+              if(this.isSelectAll){
+                  check=true
+              }else{
+                  check=false
+              }
+          }
+          if(check){
+              this.selectList =  [...this.selectList,...this.tableDataIds]
+          }else{
+              this.selectList = this.selectList.filter(it => !this.tableDataIds.includes(it))
+          }
+        },
+        handleSortChange({prop,order}){
+          let propMap = new Map([
+            ["StartDate",1],
+            ["EndDate",2],
+            ["ModifyTime",3],
+            ["LatestValue",4]
+          ])
+          if(order){
+            this.searchParams.sortParam = propMap.get(prop)
+            this.searchParams.sortType = order==='ascending'?1:2
+          }else{
+            this.searchParams.sortParam = ''
+            this.searchParams.sortType = ''
+          }
+          this.searchList()
+        },
+        // 详情
+        async detailIndexHandle(row){
+          this.detailRequestParams.IndexId = row.IndexId
+          this.detailRequestParams.DataDate = ''
+          await this.getIndexDetailFun()
+          this.detailDiaShow=true
+          this.$nextTick(()=>{
+            this.$refs.detailDataListRef && (this.$refs.detailDataListRef.scrollTop=0)
+          })
+        },
+        async getIndexDetailFun(){
+          await highFrequencyDataInterface.highFreDataDetail(this.detailRequestParams).then(res=>{
+            if(res.Ret == 200){
+              let resData = res.Data||{}
+              let indexData = resData.Index || {}
+              this.detailRequestParams.DataDate = resData.DataDate
+              this.indexDetail={
+                IndexId:indexData.IndexId,
+                IndexName:indexData.IndexName,
+                ZqCode:indexData.StockCode,
+                ZbCode:indexData.Indicator,
+                ClassifyId:indexData.ClassifyId,
+                Unit:indexData.Unit,
+                Frequency:indexData.Frequency,
+                DataList:resData.DataList||[]
+              }
+            }
+          })
+        },
+        editDataHandle(){
+          if(!(this.indexDetail.IndexName && this.indexDetail.ClassifyId && this.indexDetail.Unit)){
+            return this.$message.warning(this.$t('MsgPrompt.please_complete'))
+          }
+          let params={
+            IndexId:this.indexDetail.IndexId,
+            IndexName:this.indexDetail.IndexName,
+            ClassifyId:this.indexDetail.ClassifyId,
+            Unit:this.indexDetail.Unit,
+          }
+          highFrequencyDataInterface.highFreDataEdit(params).then(res=>{
+            if(res.Ret == 200){
+              this.$message.success(this.$t('MsgPrompt.operate_success_msg'))
+              this.detailDiaShow=false
+              this.getTableData()
+            }
+          })
+        },
+        // 刷新
+        refreshIndexHandle(row){
+          highFrequencyDataInterface.highFreDataRefresh({
+            IndexId:row.IndexId
+          }).then(res=>{
+            if(res.Ret!==200) return
+            this.$message.success(/* "刷新成功"  */this.$t('MsgPrompt.refresh_success_msg'))
+            this.getTableData()
+          })
+        },
+        // 删除
+        deleteIndexHandle(row){
+          this.$confirm(this.$t('Edb.MsgPrompt.del_edb_confirm'),this.$t('Dialog.warn_tit'),{
+            confirmButtonText:/* "确定" */this.$t('Dialog.confirm_btn'),
+            cancelButtonText:/* "取消" */this.$t('Dialog.cancel_btn'),
+            type:"warning"
+          }).then(()=>{
+            highFrequencyDataInterface.highFreDataDelete({
+              IndexId:row.IndexId
+            }).then(res=>{
+              if(res.Ret!==200) return
+              this.$message.success(/* "删除成功"  */this.$t('MsgPrompt.delete_msg'))
+              this.selectList=this.selectList.filter(it => it!=row.IndexId)
+              this.getTableData()
+            })
+          }).catch(()=>{})
+        },
+        setClassify(){
+          this.classifySettingShow=true
+        },
+        classifyCloseHandle({requestClassifyList,requestDataList}){
+          if(requestDataList) this.getTableData()
+          if(requestClassifyList) this.getClassifyList()
+          this.classifySettingShow=false
+        },
+        async openBatchOperationDia(){
+          if(this.selectedTotal>500){
+            return this.$message.warning(this.$t('HighFrequencyData.batch_operation_limit'))
+          }
+          this.batchLoading = true
+          let flag = await this.getHighFreDataChoiceList()
+          this.batchLoading = false
+          this.batchOperationDialogShow=!!flag
+        },
+        async getHighFreDataChoiceList(){
+          let params={
+            ClassifyId:this.searchParams.classify,
+            IncludeChild:this.searchParams.isAssociativeSub,
+            Frequency:this.searchParams.frequency,
+            SysAdminId:this.searchParams.user,
+            Keywords:this.searchParams.keyWord,
+            ListIds:this.selectList.join(','),
+            SelectAll:this.isSelectAll,
+          }
+          return await highFrequencyDataInterface.highFreDataChoice(params).then(res=>{
+            if(res.Ret == 200){
+              const choiceList = res.Data || []
+              this.choiceIdList=choiceList.map(cl=> cl.IndexId)
+              return true 
+            }else{
+              return false
+            }
+          })
+        },
+        batchOperationClose(){
+          this.batchOperationDialogShow=false
+          this.batchOperationData={
+            type:1,
+            newClassify:0,
+            refreshType:1
+          }
+        },
+        batchOpeartion(){
+          if(this.batchOperationData.type==1 && !this.batchOperationData.newClassify) return this.$message.warning(this.$t('HighFrequencyData.select_classify_prompt'))
+          let params={
+            IndexIds:this.choiceIdList,
+            OptType:this.batchOperationData.type,
+            MoveClassifyId:this.batchOperationData.newClassify,
+            RefreshType:this.batchOperationData.refreshType
+          }
+          highFrequencyDataInterface.highFreDataBatchOperation(params).then(res=>{
+            if(res.Ret == 200){
+              this.$message.success(this.$t('MsgPrompt.operate_success_msg'))
+              if(this.batchOperationData.type==2){
+                // 删除之后 调整选中
+                this.listCheckAllChange(false)
+              }
+              this.getTableData()
+              this.batchOperationDialogShow=false
+            }
+          })
+        },
+        async batchAddToDatabaseOpen(){
+          if(this.selectedTotal>500){
+            return this.$message.warning(this.$t('HighFrequencyData.batch_operation_limit'))
+          }
+          this.batchLoading = true
+          let flag = await this.getHighFreDataChoiceList()
+          this.batchLoading = false
+          this.batchAddToDatabaseShow=!!flag
+        }
+    },
+    mounted(){
+        this.getSourceList()
+        this.getSequenceList()
+        this.getClassifyList()
+        this.getUserList()
+        this.getUnitList()
+        this.getTableData()
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+.hight-frequency-data-container{
+    min-height: calc(100vh - 120px);
+    display: flex;
+    flex-direction: column;
+    .top-box{
+        box-sizing: border-box;
+        margin-bottom: 16px;
+        display: flex;
+        .select-box{
+          span{
+            margin-right:10px;
+          }
+          .el-select{
+            margin-right:10px;
+            width:160px;
+          }
+        }
+    }
+    .table-box{
+      flex:1;
+      .el-select{
+          min-width:180px;
+      }
+      .table-select{
+          display: flex;
+          justify-content: space-between;
+          .select-list{
+            flex:1;
+            display: flex;
+            flex-wrap: wrap;
+            gap:10px;
+            .el-select,.el-cascader,.el-input{
+              max-width: 210px;
+            }
+            .associative-box{
+              display: flex;
+              align-items: center;
+              gap: 10px;
+              color: #333333;
+              .span-button{
+                color:#0052D9 ;
+                cursor: pointer;
+              }
+            }
+          }
+          .select-other{
+            margin-left: 10px;
+            .el-button{
+                margin-left:10px;
+            }
+          }
+      }
+      .el-table{
+          margin:20px 0;
+      }
+      .el-pagination{
+        text-align: right;
+        background-color: white;
+        padding: 10px 0;
+      }
+      .table-operation-item{
+        padding: 0 3px;
+        cursor: pointer;
+        color: #0052D9;
+        white-space: nowrap;
+      }
+      .del-item{
+        color: #D54941;
+      }
+    }
+    .custom-dialog{
+      .dialog-container{
+        overflow: hidden;
+        padding: 0 35px;
+        .detail-date-select-zone{
+          display:flex;
+          margin-bottom: 30px;
+          align-items:center;
+          span{
+            margin-right: 20px;
+          }
+          .el-input{
+            width: 240px;
+          }
+        }
+        .detail-data-zone{
+          display: flex;
+          flex-direction: column;
+          justify-content: center;
+          .detail-data-zone-header{
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            .header-table{
+              font-size: 14px;
+              border:solid 1px #C8CDD9;
+              box-sizing: border-box;
+              tr{
+                box-sizing: border-box;
+                td{
+                  padding: 10px;
+                  width: 270px;
+                  color: #666666;
+                  box-sizing: border-box;
+                  &:first-child{
+                      width: 150px;
+                      text-align: center;
+                      font-weight: bold;
+                      color: #333333;
+                  }
+                }
+              }
+            }
+          }
+          .detail-data-list{
+            height: 260px;
+            overflow: auto;
+            margin: 40px auto 30px auto;
+            .body-table{
+              border-left: solid 1px #C8CDD9;
+              border-right: solid 1px #C8CDD9;
+              tr{
+                box-sizing: border-box;
+                td{
+                  min-width: 150px;
+                  text-align: center;
+                  padding: 8px 10px;
+                  color: #666666;
+                  box-sizing: border-box;
+                  &:first-child{
+                    width: 260px;
+                    border-right:solid 1px #C8CDD9;
+                  }
+                }
+              }
+            }
+          }
+        }
+        // 批量操作
+        .batch-option-row{
+          margin-bottom: 20px;
+          .radio-box{
+            margin-top: 20px;
+            padding-left: 50px;
+            .el-radio{
+              margin-right: 20px;
+            }
+          }
+        }
+      }
+      .dialog-btn{
+        text-align: center;
+        padding: 40px 0 25px;
+        .el-button{
+          min-width: 120px;
+        }
+      }
+    }
+}
+</style>
+<style lang="scss">
+.custom-dialog{
+  .el-input{
+    width: 100%!important;
+  }
+}
+
+.detail-data-zone-header{
+  .el-cascader{
+    width: 100%;
+  }
+  .el-autocomplete{
+    width: 100%;
+  }
+  .el-select{
+    width: 100%;
+  }
+  .el-input{
+    width: 100%;
+    input{
+      border: none;
+      padding: 0;
+      font-size: 14px;
+    }
+  }
+}
+</style>