Quellcode durchsuchen

Merge branch 'master' of http://8.136.199.33:3000/eta_front/eta_front

Karsa vor 3 Monaten
Ursprung
Commit
451041e667
38 geänderte Dateien mit 3067 neuen und 63 gelöschten Zeilen
  1. 10 0
      src/api/modules/chartApi.js
  2. BIN
      src/assets/img/icons/delete-icon01.png
  3. 70 0
      src/components/chart/chartTypeSelect.vue
  4. 4 0
      src/lang/commonLang.js
  5. 31 1
      src/lang/modules/EtaChart/En.js
  6. 33 1
      src/lang/modules/EtaChart/Zh.js
  7. 4 0
      src/utils/registryComponents.js
  8. 7 2
      src/views/chartRelevance_manage/components/selectTarget.vue
  9. 47 18
      src/views/dataEntry_manage/addChart.vue
  10. 13 3
      src/views/dataEntry_manage/chartSetting.vue
  11. 4 4
      src/views/dataEntry_manage/components/addMarkerDialog.vue
  12. 1 1
      src/views/dataEntry_manage/components/chart.vue
  13. 2 2
      src/views/dataEntry_manage/components/chartReleationEdbTable.vue
  14. 116 0
      src/views/dataEntry_manage/components/sectionalCombination/axisSet.vue
  15. 175 0
      src/views/dataEntry_manage/components/sectionalCombination/batchModifyDate.vue
  16. 185 0
      src/views/dataEntry_manage/components/sectionalCombination/dateTrans.vue
  17. 306 0
      src/views/dataEntry_manage/components/sectionalCombination/referenceDateSet.vue
  18. 530 0
      src/views/dataEntry_manage/components/sectionalCombination/sectionalCombinationOption.vue
  19. 398 0
      src/views/dataEntry_manage/components/sectionalCombination/seriesEdit.vue
  20. 314 0
      src/views/dataEntry_manage/components/sectionalCombination/seriesItemWrap.vue
  21. 16 1
      src/views/dataEntry_manage/databaseComponents/batchComptedDialog.vue
  22. 2 1
      src/views/dataEntry_manage/databaseComponents/batchComputedSave.vue
  23. 15 0
      src/views/dataEntry_manage/databaseComponents/batchComputedV2.vue
  24. 21 5
      src/views/dataEntry_manage/databaseComponents/operationDialog.vue
  25. 1 0
      src/views/dataEntry_manage/databaseList.vue
  26. 55 6
      src/views/dataEntry_manage/editChart.vue
  27. 142 1
      src/views/dataEntry_manage/mixins/addOreditMixin.js
  28. 282 4
      src/views/dataEntry_manage/mixins/chartPublic.js
  29. 9 0
      src/views/datasheet_manage/components/dateMoveWaySection.vue
  30. 1 1
      src/views/futures_manage/chartEditor.vue
  31. 5 1
      src/views/mychart_manage/components/chartDetailDia.vue
  32. 169 3
      src/views/ppt_manage/mixins/mixins.js
  33. 10 1
      src/views/ppt_manage/mixins/pptMixins.js
  34. 19 3
      src/views/predictEdb_manage/components/operationDialog.vue
  35. 1 0
      src/views/predictEdb_manage/predictEdb.vue
  36. 37 0
      src/views/system_manage/chartTheme/components/optionsSection.vue
  37. 16 2
      src/views/system_manage/chartTheme/index.vue
  38. 16 2
      src/views/system_manage/chartTheme/themeSetting.vue

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

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

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


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

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

+ 4 - 0
src/lang/commonLang.js

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

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

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

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

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

+ 4 - 0
src/utils/registryComponents.js

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -1920,6 +1920,7 @@ export default {
 							moveUnit: dataInfo.MoveFrequency,
 							moveVal: type === 22 ? dataInfo.CalculateFormula : '',
 							calendar_type: type === 35 ? dataInfo.Calendar : '',
+							EmptyType:dataInfo.EmptyType||0,
 					}
 
 				if([72,73].includes(type)){

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

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

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

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

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

@@ -158,7 +158,11 @@ export const chartSetMixin = {
       radarChartData: {},
 
       /* 修改对应版本信息弹窗  替换原有设置英文*/
-			isLangInfoDia: false
+			isLangInfoDia: false,
+
+      sectionalCombinationData:{},//截面组合图数据
+
+      IsHeap:false,//是否堆积
 		}
 	},
   computed:{
@@ -240,6 +244,14 @@ export const chartSetMixin = {
 			deep: true
     },
 
+    // 截面组合图
+    sectionalCombinationData: {
+      handler(newval) {
+				newval.SeriesList && this.setSectionalCombinationChart();
+			},
+			deep: true
+    },
+
     currentLang() {
       this.changeLanguage()
     }
@@ -866,7 +878,8 @@ export const chartSetMixin = {
           borderWidth: 1,
           borderColor: item.ChartColor,
           zIndex: (this.chartInfo.ChartType === 6 && ['line','spline'].includes(item.ChartStyle)) ? 1 : 0, //防止组合图曲线被遮住
-          ...predict_params
+          ...predict_params,
+          stacking:this.chartInfo.ChartType==6&&!this.IsHeap?undefined:'normal',
         };
         item.DataList = item.DataList || [];
         for (let i of item.DataList) {
@@ -2051,6 +2064,263 @@ export const chartSetMixin = {
       this.currentLang=='en' && this.changeOptions()
     },
 
+    // 截面组合图渲染配置
+    setSectionalCombinationChart(){
+      const {XDataList,UnitList,SeriesList,IsHeap}=this.sectionalCombinationData
+      /* 主题样式*/
+      const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+      
+      this.leftIndex = SeriesList.findIndex((item) => item.IsAxis===1);
+      this.rightIndex = SeriesList.findIndex((item) => !item.IsAxis);
+      this.rightTwoIndex = SeriesList.findIndex((item) => item.IsAxis ===2);
+
+      //x轴
+      const xAxis={
+        categories:XDataList.map(_=>this.currentLang=='en'?_.NameEn:_.Name),
+        tickWidth: 1,
+        labels: {
+          style:{
+            ...chartTheme&&chartTheme.xAxisOptions.style
+          },
+        },
+        plotBands: this.setAxisPlotAreas(3),
+        plotLines: this.setAxisPlotLines(3)
+      }
+
+      let yAxis=[]
+      let seriesData=[]
+
+      //有右二轴时排个序 按照左 右 右2的顺序
+      const chartData = SeriesList.some(_ =>_.IsAxis===2) ? this.changeEdbOrder(SeriesList) : _.cloneDeep(SeriesList);
+      chartData.forEach((item,index)=>{
+        //轴位置值相同的下标
+        const sameSideIndex = chartData.findIndex(
+          (i) => i.IsAxis === item.IsAxis
+        );
+
+        const yTitleMap={
+          1:['LeftName','LeftNameEn'],
+          0:['RightName','RightNameEn'],
+          2:['RightTwoName','RightTwoNameEn'],
+        }
+
+        let minLimit = 0,maxLimit = 0
+        const limitMap = {
+            0:['rightMin','rightMax'],
+            1:['min','max'],
+            2:['rightTwoMin','rightTwoMax']
+        }
+        if(limitMap[item.IsAxis]){
+            minLimit = this.chartLimit[`${limitMap[item.IsAxis][0]}`]||0
+            maxLimit = this.chartLimit[`${limitMap[item.IsAxis][1]}`]||0
+        }
+
+        let yItem = {
+          ...basicYAxis,
+          title: {
+            text: UnitList[yTitleMap[item.IsAxis][0]],
+            textCh:UnitList[yTitleMap[item.IsAxis][0]], // 中文
+            // 中文不存在,无论英文有无都显示空
+            textEn:UnitList[yTitleMap[item.IsAxis][0]]?UnitList[yTitleMap[item.IsAxis][1]]:'', // 英文
+            style:{
+              ...chartTheme&&chartTheme.yAxisOptions.style
+            },
+            align: 'high',
+            rotation: 0,
+            y: -12,
+            // x: (item.IsAxis===0 && this.rightTwoIndex>-1) ? -chartData[this.rightTwoIndex].Unit.length*12 : 0,
+            textAlign: item.IsAxis===1 ? 'left' : 'right',
+            reserveSpace: false
+          },
+          labels: {
+            formatter: function (ctx) {
+              return ctx.value;
+            },
+            align: 'center',
+            x: [0,2].includes(item.IsAxis) ? 5 : -5,
+            style: {
+              ...chartTheme&&chartTheme.yAxisOptions.style,
+            }
+          },
+          opposite: [0,2].includes(item.IsAxis),
+          min: Number(minLimit),
+          max: Number(maxLimit),
+          tickWidth: 1,
+          visible: sameSideIndex === index,
+          plotBands: this.setAxisPlotAreas(item.IsAxis),
+          plotLines: this.setAxisPlotLines(item.IsAxis)
+        };
+
+        //堆叠图的yAxis必须一致 数据列所对应的y轴
+        let serie_yIndex = index;
+        if(IsHeap==1) {
+          // 类型为堆叠图时公用第一个指标y轴 
+          serie_yIndex =  0;
+        }
+
+        //数据列
+        let dataArr=item.DataList||[]
+        // 根据NoDataEdbIndex 将对应位置的值置为null
+        dataArr.forEach((i,index)=>{
+          if(item.NoDataEdbIndex.includes(index)){
+            dataArr[index]=null
+          }
+        })
+        //图表可配置的线条数就10条,第11条用第1条的配置,索引取下模
+				const lineIndex = chartTheme ? index%chartTheme.lineOptionList.length : index
+        let obj={
+          data:dataArr,
+          type: item.ChartStyle||'',
+          dashStyle: (chartTheme&&chartTheme.lineOptionList[lineIndex].dashStyle)||'Solid',
+          chartType:'linear',
+          yAxis: serie_yIndex,
+          name:item.SeriesName,
+          nameCh:item.SeriesName,
+          nameEn:item.SeriesNameEn,
+          unitName:UnitList[yTitleMap[item.IsAxis][0]],
+          unitNameCh:UnitList[yTitleMap[item.IsAxis][0]],
+          unitNameEn:UnitList[yTitleMap[item.IsAxis][0]]?UnitList[yTitleMap[item.IsAxis][1]]:'',
+          color: item.ChartColor,
+          lineWidth: Number(item.ChartWidth)||(chartTheme&&chartTheme.lineOptionList[lineIndex].lineWidth),
+          borderWidth: 1,
+          borderColor: item.ChartColor,
+          marker: {//展示数据点
+            enabled:item.ChartStyle!='column'&&item.IsPoint?true:false,
+            radius: (chartTheme&&chartTheme.lineOptionList[lineIndex].radius)||5,
+          },
+          dataLabels: {//展示数值
+            enabled: item.IsNumber?true:false,
+            align:item.ChartStyle=='column'?'center':undefined,
+            y:item.ChartStyle=='column'?-20:0,
+            inside: item.ChartStyle=='column'?false:undefined,
+            crop: item.ChartStyle=='column'?false:true,
+          },
+          stacking:IsHeap==1?'normal':undefined,
+          zIndex: ['line','spline'].includes(item.ChartStyle) ? 1 : 0, //防止组合图曲线被遮住
+        }
+
+        yAxis.push(yItem)
+        seriesData.push(obj)
+      })
+
+      const tooltip={
+        formatter:function () { 
+          let str=`<b>${this.points[0].x}</b>`
+          this.points.forEach(item=>{
+            const sObj=seriesData.find(_=>_.name===item.series.name)
+            str=str+`<br><span style="color:${item.color}">\u25CF</span>${sObj.name}:${item.y} ${sObj.unitNameCh}`
+          })
+          return str
+        },
+        formatterCh:function () { 
+          let str=`<b>${this.points[0].x}</b>`
+          this.points.forEach(item=>{
+            const sObj=seriesData.find(_=>_.name===item.series.name)
+            str=str+`<br><span style="color:${item.color}">\u25CF</span>${sObj.nameCh}:${item.y} ${sObj.unitNameCh}`
+          })
+          return str
+        },
+        formatterEn:function () { 
+          let str=`<b>${this.points[0].x}</b>`
+          this.points.forEach(item=>{
+            const sObj=seriesData.find(_=>_.name===item.series.name)
+            str=str+`<br><span style="color:${item.color}">\u25CF</span>${sObj.nameEn}:${item.y} ${sObj.unitNameEn}`
+          })
+          return str
+        },
+        shared:true
+      }
+
+      this.options = {
+        title: {
+          text:''
+        },
+        tooltip,
+        series: seriesData,
+        yAxis: yAxis,
+        xAxis,
+      };
+      if(this.currentLang=='en') this.changeOptions()
+
+    },
+    // 截面组合图初始化
+    initSectionalCombinationChart(data){
+      const { EdbInfoList,DataResp,ChartInfo } = data;
+      this.sectionalCombinationData = DataResp;
+      this.chartLimit = {
+        min:DataResp.LeftMin, //左轴上下限
+        max:DataResp.LeftMax,
+        rightMin:DataResp.RightMin,//右轴上下限
+        rightMax:DataResp.RightMax,
+        rightTwoMin:DataResp.Right2Min,//右二轴上下限
+        rightTwoMax:DataResp.Right2Max,
+      }
+      this.IsHeap=DataResp.IsHeap?true:false
+
+
+      //默认来源搞一下
+      this.setDefaultSourceFrom();
+      this.setSectionalCombinationChart()
+    },
+    // 截面组合图渲染更新
+    handleUpdateSectionalCombinationChart(e){
+      // console.log(e);
+      // console.log(this.sectionalCombinationData);
+      if(e.type==='isAxis'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.IsAxis=item.IsAxis
+            }
+          })
+        })
+        // 更新上下限
+        this.calcYAxislimit(this.sectionalCombinationData.SeriesList)
+      }else if(e.type==='chartType'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.ChartStyle=item.seriesChartType
+            }
+          })
+        })
+      }else if(e.type==='dataPoint'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.IsPoint=item.showDataPoint?1:0
+            }
+          })
+        })
+      }else if(e.type==='dataValue'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.IsNumber=item.showDataValue?1:0
+            }
+          })
+        })
+      }else if(e.type==='ChartColor'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.ChartColor=item.ChartColor
+            }
+          })
+        })
+      }else if(e.type==='ChartWidth'){
+        e.data.seriesData.forEach(item=>{
+          this.sectionalCombinationData.SeriesList.forEach(_item=>{
+            if(item.seriesName===_item.SeriesName){
+              _item.ChartWidth=item.ChartWidth
+            }
+          })
+        })
+      }
+
+      this.setSectionalCombinationChart()
+    },
+
     //雷达图数据初始化
     initRadarData(data) {
       const { DataResp,EdbInfoList,ChartInfo } = data;
@@ -2715,7 +2985,8 @@ export const chartSetMixin = {
         6: this.setStackOrCombinChart,
         7: this.setBarChart,
         10: this.setSectionScatterChart,
-        11: this.setRadarChart
+        11: this.setRadarChart,
+        14: this.setSectionalCombinationChart
       }
       //其他source
       const sourceMap = {
@@ -2952,7 +3223,7 @@ export const chartSetMixin = {
         },
         //图表详情-设置图表上下限
         setLimitData(tableData=[]){
-            if([7,10,11].includes(this.chartInfo.ChartType)) return
+            if([7,10,11,14].includes(this.chartInfo.ChartType)) return
             const {
                 //左右轴极值字段 
                 LeftMin=0,LeftMax=0,
@@ -3014,6 +3285,13 @@ export const chartSetMixin = {
                 }
             }
         },
+
+    // 柱形堆积控制
+    handleHeapChange(){
+      this.options.series.forEach(item=>{
+        item.stacking=this.IsHeap?'normal':undefined
+      })
+    },
     /*-------------------- */
 	}
 }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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