Selaa lähdekoodia

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

Karsa 1 vuosi sitten
vanhempi
commit
c012089ad4
87 muutettua tiedostoa jossa 3121 lisäystä ja 474 poistoa
  1. 14 1
      src/api/modules/chartApi.js
  2. 66 0
      src/api/modules/dataSource.js
  3. BIN
      src/assets/img/data_m/icon01.png
  4. BIN
      src/assets/img/data_m/move_ico2.png
  5. BIN
      src/assets/img/data_m/set_icon.png
  6. BIN
      src/assets/img/icons/close_icon_black.png
  7. BIN
      src/assets/img/icons/email-login-type.png
  8. 1 1
      src/components/chart/chartListWrap.vue
  9. 19 0
      src/routes/modules/dataSource.js
  10. 6 0
      src/routes/modules/oldRoutes.js
  11. 6 1
      src/utils/buttonConfig.js
  12. 77 5
      src/views/Login.vue
  13. 2 1
      src/views/chartFrame_manage/index.vue
  14. 1 1
      src/views/chartRelevance_manage/components/chartCard.vue
  15. 4 1
      src/views/chartRelevance_manage/css/index.scss
  16. 4 2
      src/views/chartRelevance_manage/fittingEquationChartEditor.vue
  17. 1 1
      src/views/chartRelevance_manage/list.vue
  18. 4 5
      src/views/chartRelevance_manage/relevanceChartEditor.vue
  19. 2 3
      src/views/chartRelevance_manage/statisticFeatureChartEditor.vue
  20. 38 4
      src/views/dataEntry_manage/chartSetting.vue
  21. 26 4
      src/views/dataEntry_manage/coal/index.vue
  22. 22 0
      src/views/dataEntry_manage/css/baseTargetPage.scss
  23. 11 1
      src/views/dataEntry_manage/css/exchangedata.scss
  24. 26 6
      src/views/dataEntry_manage/dataEntry.vue
  25. 561 55
      src/views/dataEntry_manage/databaseComponents/addTargetDiaBase.vue
  26. 22 16
      src/views/dataEntry_manage/databaseList.vue
  27. 1 1
      src/views/dataEntry_manage/targetList.vue
  28. 19 5
      src/views/dataEntry_manage/thirdBase/BAIINFOTargetbase.vue
  29. 19 2
      src/views/dataEntry_manage/thirdBase/NationalDataBase.vue
  30. 18 2
      src/views/dataEntry_manage/thirdBase/SCITargetbase.vue
  31. 9 1
      src/views/dataEntry_manage/thirdBase/chinaFinancialFutures.vue
  32. 9 1
      src/views/dataEntry_manage/thirdBase/dlExchangeData.vue
  33. 22 3
      src/views/dataEntry_manage/thirdBase/elaSteoBase.vue
  34. 27 5
      src/views/dataEntry_manage/thirdBase/glTargetbase.vue
  35. 28 7
      src/views/dataEntry_manage/thirdBase/lzTargetbase.vue
  36. 9 1
      src/views/dataEntry_manage/thirdBase/shEnergy.vue
  37. 9 1
      src/views/dataEntry_manage/thirdBase/shFutures.vue
  38. 19 5
      src/views/dataEntry_manage/thirdBase/smmTargetbase.vue
  39. 32 4
      src/views/dataEntry_manage/thirdBase/steelChemicalbase.vue
  40. 9 1
      src/views/dataEntry_manage/thirdBase/zzExchangeData.vue
  41. 162 0
      src/views/dataSource_manage/accountList.vue
  42. 177 0
      src/views/dataSource_manage/components/DelEDBTable.vue
  43. 313 0
      src/views/dataSource_manage/components/DetailTable.vue
  44. 183 0
      src/views/dataSource_manage/components/EDBInfoChangeTable.vue
  45. 158 0
      src/views/dataSource_manage/components/EditAccount.vue
  46. 137 0
      src/views/dataSource_manage/components/GLRefreshFailDetail.vue
  47. 123 0
      src/views/dataSource_manage/components/SetTableCols.vue
  48. 186 0
      src/views/dataSource_manage/components/StatisticTable.vue
  49. 108 0
      src/views/dataSource_manage/dataSourceListGL.vue
  50. 4 0
      src/views/dataSource_manage/utils/config.js
  51. 7 0
      src/views/datasheet_manage/components/SheetExcel.vue
  52. 1 1
      src/views/datasheet_manage/components/sheetListWrap.vue
  53. 11 8
      src/views/datasheet_manage/customAnalysis/list.vue
  54. 14 9
      src/views/datasheet_manage/sheetList.vue
  55. 1 0
      src/views/futures_manage/commodityChartBase.vue
  56. 8 1
      src/views/futures_manage/futuresBase.vue
  57. 3 0
      src/views/login_manage/css/formStyle.scss
  58. 4 2
      src/views/mychart_manage/components/chooseChart.vue
  59. 1 1
      src/views/mychart_manage/index.vue
  60. 8 0
      src/views/positionAnalysis_manage/components/chartDetail.vue
  61. 1 1
      src/views/positionAnalysis_manage/detail.vue
  62. 9 1
      src/views/ppt_manage/newVersion/components/catalog/mergePPTDialog.vue
  63. 6 6
      src/views/ppt_manage/newVersion/pptEditor.vue
  64. 6 6
      src/views/ppt_manage/newVersion/pptEnEditor.vue
  65. 0 6
      src/views/predictEdb_manage/mixins/mixin.js
  66. 9 6
      src/views/predictEdb_manage/predictEdb.vue
  67. 4 4
      src/views/report_manage/addreportNew.vue
  68. 4 4
      src/views/report_manage/editChapterReport.vue
  69. 4 4
      src/views/report_manage/editreportNew.vue
  70. 4 4
      src/views/report_manage/reportEn/reportEditor.vue
  71. 21 0
      src/views/report_manage/reportEn/reportlist.vue
  72. 21 87
      src/views/report_manage/reportlist.vue
  73. 4 4
      src/views/sandbox_manage/common/edge.js
  74. 31 29
      src/views/sandbox_manage/index_new_version.vue
  75. 17 17
      src/views/sandbox_manage/sandFlow/index.vue
  76. 24 23
      src/views/sandbox_manage/sandFlowNew/index.vue
  77. 26 2
      src/views/smartReport/components/TextEdit.vue
  78. 2 2
      src/views/smartReport/editReport.vue
  79. 143 72
      src/views/smartReport/reportList.vue
  80. 1 1
      src/views/supply_manage/components/plantTable.vue
  81. 3 2
      src/views/system_manage/departManage.vue
  82. 2 0
      src/views/system_manage/enAuthManage.vue
  83. 2 2
      src/views/system_manage/etaBaseConfig.vue
  84. 14 14
      src/views/system_manage/operateAuthManage.vue
  85. 5 1
      src/views/system_manage/roleManage.vue
  86. 6 6
      src/vuex/modules/sand.js
  87. 0 1
      static/js/jquery.min.js

+ 14 - 1
src/api/modules/chartApi.js

@@ -396,7 +396,20 @@ const dataBaseInterface = {
 		return http.get('/datamanage/edb_source/list/python')
 	},
 
-
+	/**
+	 * 新增指标 检验指标是否存在接口
+	 * @param {*} params Source SubSource EdbCode StockCode
+	 */
+	edbExistCheck: params => {
+		return http.get('/datamanage/edb_info/exist/check',params)
+	},
+	/**
+	 * 批量新增指标
+	 * @param {*} params BatchList[{Source,EdbName,Frequency,Unit,ClassifyId,StockCode,EdbCode}]
+	 */
+	edbAddBatch: params => {
+		return http.post('/datamanage/edb_info/batch/add',params)
+	},
 	//========================================chart
 	// /**
 	//  * 

+ 66 - 0
src/api/modules/dataSource.js

@@ -0,0 +1,66 @@
+import http from "@/api/http.js"
+
+// 数据源管理模块
+const apiDataSource={
+    //获取数据源列表列配置项
+    //列表类型ColumnType:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"
+    GLTableColOpts:params=>{
+        return http.get('/data_stat/source_column',params)
+    },
+
+    //编辑自定义列
+    GLTableColEdit:params=>{
+        return http.post('/data_stat/source_column/edit',params)
+    },
+
+    //数据源明细表
+    GLDetailTableList:params=>{
+        return http.get('/data_stat/edb_update_stat',params)
+    },
+
+    //数据源统计
+    GLStatisticTableList:params=>{
+        return http.get('/data_stat/source_stat',params)
+    },
+
+    //删除指标列表数据
+    GLDelTableList:params=>{
+        return http.get('/data_stat/edb_delete_log',params)
+    },
+
+    //指标信息变更列表数据
+    GLEdbInfoTableList:params=>{
+        return http.get('/data_stat/edb_update_log',params)
+    },
+
+    //刷新失败指标详情
+    GLRefreshFailDetail:params=>{
+        return http.get('data_stat/edb_update_stat/failed',params)
+    },
+
+    // 新增/编辑终端账号
+    accountSave:params=>{
+        return http.post('/data_stat/terminal/save',params)
+    },
+
+    //终端账号列表
+    accountList:params=>{
+        return http.get('/data_stat/terminal/list',params)
+    },
+
+    //启用/禁用终端账号
+    accountSet:params=>{
+        return http.post('/data_stat/terminal/status/set',params)
+    },
+
+    // 获取终端编码数据
+    terminalCodeArr:params=>{
+        return http.get('/data_stat/terminal/code',{})
+    }
+    
+
+}
+
+export {
+    apiDataSource
+}

BIN
src/assets/img/data_m/icon01.png


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


BIN
src/assets/img/data_m/set_icon.png


BIN
src/assets/img/icons/close_icon_black.png


BIN
src/assets/img/icons/email-login-type.png


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

@@ -8,7 +8,7 @@
     >
       <el-col
         :span="6"
-        style="margin-bottom: 20px; padding-right: 20px"
+        style="margin-bottom: 20px; padding-right: 20px;min-width: 270px;"
         v-for="chart in list"
         :key="chart.ChartInfoId"
       >

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

@@ -0,0 +1,19 @@
+const home = r => require.ensure([], () => r(require('@/views/Home.vue')), 'Home'); //主页
+
+export default [
+    //
+    {
+        path: "/",
+        component: home,
+        name: "数据报表管理",
+        hidden: false,
+        icon_path: require("@/assets/img/home/data_ic.png"),
+        children: [
+            {
+                path: "dataSourceGL",
+                name: "数据源管理",
+                component: () => import("@/views/dataSource_manage/dataSourceListGL.vue"),
+            },
+        ]
+    }
+]

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

@@ -323,6 +323,12 @@ export default [
         name: "外部链接配置",
         hidden: true,
       },
+      {
+        path: "dataSourceAccountList",
+        component: () => import("@/views/dataSource_manage/accountList.vue"),
+        name: "数据源终端管理",
+        hidden: true,
+      },
     ],
   },
   // 外部链接

+ 6 - 1
src/utils/buttonConfig.js

@@ -232,8 +232,13 @@ export const dataSourcePermission = {
     /*--------EIA  STEO报告---- */
     eiaData_export:'eiaData:export',
     /*--------国家统计局---- */
-    gjtjjData_export:'gjtjjData:export'
+    gjtjjData_export:'gjtjjData:export',
 
+    /*--------数据报表管理---- */
+    /*--------数据源终端管理---- */
+    dataSource_account_add:'dataSourceAccount:add',//新增终端账号
+    dataSource_account_edit:'dataSourceAccount:edit',//编辑
+    dataSource_account_enable:'dataSourceAccount:enable',//禁用/启用
 }
 
 /*

+ 77 - 5
src/views/Login.vue

@@ -80,9 +80,9 @@
 							:areaCode="areaCode"
 						/>
 					</el-tab-pane>
-					<el-tab-pane label="邮箱登录" name="emailModel">
-						<EmailModel ref="emailModel"/>
-					</el-tab-pane>
+					<!-- <el-tab-pane label="邮箱登录" name="emailModel"> -->
+						<EmailModel ref="emailModel" v-show="activeModel=='emailModel'"/>
+					<!-- </el-tab-pane> -->
 				</el-tabs>
 				<el-button
 					type="primary"
@@ -91,6 +91,19 @@
 					:loading="logining"
 					class="submit_btn"
 					>登录</el-button>
+                <div class="another-login-type">
+                    <div class="another-type-hint">
+                        <div class="type-hint-line"></div>
+                        <div class="type-hint-text">其他登录方式</div>
+                        <div class="type-hint-line"></div>
+                    </div>
+                    <div class="another-type">
+                        <!-- <div class="login-type-item"
+                        > -->
+                            <img src="~@/assets/img/icons/email-login-type.png" @click="activeModel='emailModel';handleClick({name:'emailModel'})" />
+                        <!-- </div> -->
+                    </div>
+                </div>
 			</div>
 			<div class="login-box" v-else>
 				<ForgetPassModel 
@@ -532,7 +545,7 @@ export default {
 	height: 100%;
 	background: #fff;
 	position: relative;
-	overflow: hidden;
+	// overflow: hidden;
 	#login_wrapper {
 		width: 100%;
 		height: 100%;
@@ -566,7 +579,7 @@ export default {
 			box-sizing: border-box;
 			border-radius: 10px;
 			position: absolute;
-			top: 27%;
+			top: 18%;
 			right: 12%;
 			z-index: 100;
 			input::-webkit-input-placeholder {
@@ -582,6 +595,48 @@ export default {
 				font-size: 20px;
 				border-radius: 5px;
 			}
+            .another-login-type{
+				margin-top: 45px;
+				.another-type-hint{
+					display: flex;
+					align-items: center;
+					.type-hint-line{
+						flex: 1;
+						height: 1px;
+						background-color: #C0C4CC;
+					}
+					.type-hint-text{
+						font-size: 18px;
+						color: #999999;
+						padding: 0 20px;
+					}
+				}
+				.another-type{
+                    display: flex;
+                    align-items: center;
+                    justify-content: center;
+                    img{
+                        margin-top: 20px;
+                        height: 72px;
+                        width: 64px;
+                        cursor: pointer;
+                        // margin-bottom: 4px;
+                    }
+					// .login-type-item{
+					// 	display: flex;
+					// 	flex-direction: column;
+					// 	justify-content: center;
+					// 	align-items: center;
+					// 	margin-top: 20px;
+					// 	cursor: pointer;
+	
+					// 	span{
+					// 		font-size: 16px;
+					// 		color: #666666;
+					// 	}
+					// }
+				}
+			}
 			.el-input input {
 				width: 100%;
 				height: 40px;
@@ -640,6 +695,23 @@ export default {
 			}
 			#login-container ,.login-box{
 				width: 70%;
+				top:15%;
+			}
+		}
+		@media screen and (max-width:1440px){
+			#login-container ,.login-box{
+				.login-title{
+					font-size: 32px;
+				}
+			}
+			
+		}
+		@media screen and (max-height:720px) {
+			#login-container ,.login-box{
+				top:20%;
+				.login-title{
+					margin-bottom: 30px;
+				}
 			}
 		}
 	}

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

@@ -533,12 +533,13 @@ export default {
                 PageSize:1200,
                 CurrentIndex:1,
                 MyChartClassifyId: Number(id),
+                IsShared:true,
             }).then(res=>{
                 if(res.Ret!==200) return 
                 if(res.Data&&res.Data.List){
                     if(res.Data.List.length){
                         this.chartClassify = id
-                        this.classifyUserId = nodeLink.AdminId||0
+                        this.classifyUserId = nodeLink?nodeLink.AdminId||0:0
                         this.chartCode = res.Data.List[0].UniqueCode
                         this.chartArr = res.Data.List.map(item => item.UniqueCode)
                         this.myETADetailDialogShow = true

+ 1 - 1
src/views/chartRelevance_manage/components/chartCard.vue

@@ -4,7 +4,7 @@
       <div class="title text_twoLine">
          <span>{{cardTitle}}</span>
       </div>
-      <div style="flex-shrink: 0">
+      <div style="flex-shrink: 0;align-self: flex-start;">
         <template v-if="isHaveEdbHandle">
           <el-dropdown 
             v-show="isEdbAdd" 

+ 4 - 1
src/views/chartRelevance_manage/css/index.scss

@@ -28,7 +28,7 @@ $normal-font: 14px;
     display: flex;
 
     .main-left {
-      width: 400px;
+      width: 300px;
       min-width: 300px;
       background: #fff;
       margin-right: 20px;
@@ -46,6 +46,8 @@ $normal-font: 14px;
         border: 1px solid #ececec;
         box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
         margin-bottom: 20px;
+        display: flex;
+        justify-content: space-between;
       }
       .search-cont {
         padding: 0 20px;
@@ -78,6 +80,7 @@ $normal-font: 14px;
       }
       .target_tree {
         color: #333;
+        overflow: hidden;
         .custom-tree-node {
           display: flex !important;
           justify-content: space-between;

+ 4 - 2
src/views/chartRelevance_manage/fittingEquationChartEditor.vue

@@ -416,7 +416,7 @@ export default {
 	}
   .left-cont {
     width: 400px;
-    min-width: 300px;
+    min-width: 310px;
     background: #fff;
     margin-right: 20px;
     border: 1px solid #ececec;
@@ -496,9 +496,11 @@ export default {
 			display: flex;
 			flex-wrap: wrap;
 			.card-wrapper {
-				width: 50%;
+				width: 48%;
         margin-bottom: 20px;
         min-height: 350px;
+        min-width: 410px;
+        margin-right: 15px;
 				.card-item {
 					padding: 20px;
 					.top {

+ 1 - 1
src/views/chartRelevance_manage/list.vue

@@ -189,7 +189,7 @@
             </el-col>
             <el-col
               :span="3"
-              style="position: absolute; height: 100%; right: 0"
+              style="position: absolute; height: 100%; right: 0;min-width: 115px;"
             >
               <!-- 操作 -->
               <chartHandlesWrap

+ 4 - 5
src/views/chartRelevance_manage/relevanceChartEditor.vue

@@ -283,7 +283,6 @@
     <div
       class="right-cont"
       id="right"
-      :style="isSlideLeft ? 'width:100%' : `width:80%`"
     >
       <div
         class="chart-min-cont"
@@ -867,7 +866,7 @@ export default {
     }
   }
   .right-cont {
-    width: 80%;
+    flex:1;
     /* =================== */
     .chart-min-cont {
       /* background: #fff; */
@@ -882,9 +881,9 @@ export default {
         background: #fff;
         margin-bottom: 20px;
         min-height: 350px;
-        &:nth-child(2n) {
-          margin-left: 15px;
-        } 
+        min-width:410px;
+        margin-right: 15px;
+        
         .card-item {
           padding: 20px;
           .top {

+ 2 - 3
src/views/chartRelevance_manage/statisticFeatureChartEditor.vue

@@ -739,9 +739,8 @@ export default {
         width: 48%;
         margin-bottom: 20px;
         min-height: 350px;
-        &:nth-child(2n) {
-          margin-left: 15px;
-        } 
+        min-width:410px;
+        margin-right: 15px;
         .card-item {
           padding: 20px;
           background: #fff;

+ 38 - 4
src/views/dataEntry_manage/chartSetting.vue

@@ -496,7 +496,7 @@
                 <!-- 异常显示 -->
                 <p class="error-tip" style="min-height: 400px;" v-if="chartInfo.WarnMsg">{{chartInfo.WarnMsg}}</p>
               </el-col>
-              <el-col :span="3" style="position: absolute;height: 100%;right: 0;">
+              <el-col :span="3" style="position: absolute;height: 100%;right: 0;min-width: 115px;">
                 <ul class="right-actions">
                     <li>操作</li>
                     <li
@@ -637,7 +637,32 @@
             ref="listChartPage"
             @scroll="loadMorePublicChart"
           >
-            <el-col
+            <div class="chart-list-item-wrap">
+                <div class="chart-list-item" v-for="chart in chartPublicList" :key="chart.ChartInfoId">
+                    <div class="chart-item-top" style="position:relative;">
+                        <div class="chartEn-mark" v-show="chart.IsEnChart">En</div>
+                        <span class="text_oneLine" :style="{'padding-left':chart.IsEnChart?'24px':''}">{{ currentLang === 'en' ? (chart.ChartNameEn||chart.ChartName) : chart.ChartName }}</span>
+                    </div>
+                    <div class="chart-item-img" @click="detailShowHandle(chart)"
+                    :style="chart.ChartImage?{background: `no-repeat top/cover url('${chart.ChartImage}')`}:{}"></div>
+                    <div class="chart-item-bottom">
+                        <span>创建时间: {{ chart.CreateTime.slice(0,10) }}</span>
+                        <span v-permission="permissionBtn.chartLibPermission.chartLib_addMy"
+                            class="join_txt"
+                            @click="addMychartHandle(chart)"
+                        >
+                            <img
+                            :src="$icons.chart_join_ico"
+                            alt=""
+                            style="width: 13px; height: 12px; vertical-align: middle"
+                            />
+                            加入我的图库
+                        </span>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- <el-col
               :span="6"
               style="margin-bottom: 20px; padding-right: 20px"
               v-for="chart in chartPublicList"
@@ -669,7 +694,7 @@
                   </span>
                 </div>
               </el-card>
-            </el-col>
+            </el-col> -->
           </div>
           <div v-if="!public_total" class="nodata">
             <tableNoData text="暂无图表"/>
@@ -2479,6 +2504,7 @@ export default {
       margin-bottom: 20px;
       .right-actions {
         /* max-width: 160px; */
+        min-width: 115px;
         height: 100%;
         padding: 20px 10px;
         border-left: 1px solid #DCDFE6;
@@ -2562,6 +2588,14 @@ export default {
           }
         }
       }
+      .chart-list-item{
+          width:23%;
+          min-width:230px;
+          .chart-item-top,.chart-item-bottom{
+              display: flex;
+              justify-content: space-between;
+          }
+      }
     }
   }
   .nodata {
@@ -2728,7 +2762,7 @@ export default {
         }
       }
       .main-right {
-        width: 80%;
+        flex:1;
         .mx-datepicker {
           width: 220px !important;
         }

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

@@ -1,6 +1,13 @@
 <template>
   <div class="lzTarget-container">
-    <div class="left-cont minHeight">
+    <span
+        class="slide-btn-icon"
+        :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" v-show="isLeftWrapShow">
       <div class="left-top">
         <!-- <el-button type="primary" plain size="medium" @click="exportClick" :loading="btnload">导出Excel</el-button> -->
         <el-button
@@ -135,6 +142,7 @@ export default {
   },
   data() {
     return {
+      isLeftWrapShow:true,
       dataloading: false,
       rightShow: false,
       exportBase: process.env.VUE_APP_API_ROOT + "/entry/export/coalList", //中国煤炭网数据导出接口
@@ -526,6 +534,15 @@ export default {
 <style lang="scss" scoped>
 .lzTarget-container {
   display: flex;
+  position:relative;
+  .slide-btn-icon{
+        &.slide-left{
+            left:235px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+    }
   * {
     box-sizing: border-box;
   }
@@ -540,6 +557,7 @@ export default {
   }
   .left-cont {
     min-width: 250px;
+    width:250px;
     margin-right: 20px;
     padding: 30px 0;
     // overflow: hidden;
@@ -566,11 +584,12 @@ export default {
     }
   }
   .right-cont {
-    width: 80%;
+    flex:1;
+    overflow-x: auto;
     padding: 30px;
     .right-box {
       max-width: 100%;
-      max-height: calc(100vh - 230px);
+      max-height: calc(100vh - 240px);
       border-left: 1px solid #dcdfe6;
       border-right: 1px solid #dcdfe6;
       overflow: auto;
@@ -594,9 +613,12 @@ export default {
       margin-top: 20px;
       display: flex;
       flex-wrap: wrap;
+      gap:20px;
+      .el-button{
+            margin-left: 0 !important;
+        }
       .frequency-btn {
         width: 112px;
-        margin: 0 30px 10px 0;
       }
     }
   }

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

@@ -0,0 +1,22 @@
+//可调整宽度目录的统一样式
+.target-container{
+    position:relative;
+    .slide-btn-icon{
+        &.slide-left{
+            right:0;
+        }
+        &.slide-right{
+            left: 0;
+        }
+    }
+    .right-cont{
+        flex:1;
+        overflow-x: auto;
+    }
+    .frequency-list{
+        gap:20px;
+        .el-button{
+            margin-left: 0 !important;
+        }
+    }
+}

+ 11 - 1
src/views/dataEntry_manage/css/exchangedata.scss

@@ -4,6 +4,15 @@ div{
 .exchangedata-wrap{
     display: flex;
     height: 86vh;
+    position: relative;
+    .slide-btn-icon{
+        &.slide-left{
+            left:185px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+      }
     .box{
         background: #FFFFFF;
         border: 1px solid #ECECEC;
@@ -73,6 +82,8 @@ div{
         }
         .num-warp{
             display: flex;
+            flex-wrap: wrap;
+            gap:20px;
             margin-top: 20px;
             .num-box{
                 line-height: 40px;
@@ -84,7 +95,6 @@ div{
                 min-width: 100px;
                 padding: 0 10px;
                 cursor: pointer;
-                margin-right: 20px;
                 color: #409EFF;
             }
             .num-active{

+ 26 - 6
src/views/dataEntry_manage/dataEntry.vue

@@ -1,7 +1,14 @@
 <template>
   <div>
     <div class="data-entry-wrap" @click="rightMouseMenu.show = false">
-      <div class="left-wrap wrap-box">
+        <span
+            class="slide-btn-icon"
+            :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+      <div class="left-wrap wrap-box" v-show="isLeftWrapShow">
         <div
           style="display: flex; justify-content: space-between; flex-wrap: wrap"
           v-if="role != 'special_researcher'"
@@ -205,8 +212,7 @@
             v-for="item in frequencyList"
             :key="item"
             @click="handleFrequencyChange(item)"
-            >{{ item }}</span
-          >
+            >{{ item }}</span>
         </div>
       </div>
     </div>
@@ -247,6 +253,7 @@ export default {
   components: { insertData },
   data() {
     return {
+      isLeftWrapShow:true,
       timeArr: [],
       TradeCode: "",
       exportDataurl: process.env.VUE_APP_API_ROOT + "/entry/export/dataList", //导出数据
@@ -1146,13 +1153,23 @@ export default {
 <style lang="scss" scoped>
 .data-entry-wrap {
   display: flex;
+  position: relative;
+    .slide-btn-icon{
+        &.slide-left{
+            left:285px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+    }
   .wrap-box {
     background: #ffffff;
     border: 1px solid #ececec;
     box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
     border-radius: 4px;
     padding: 15px;
-    height: calc(100vh - 160px);
+    height: calc(100vh - 120px);
+    box-sizing: border-box;
   }
   .left-wrap {
     min-width: 300px;
@@ -1180,7 +1197,8 @@ export default {
     }
   }
   .right-wrap {
-    width: 80%;
+    flex:1;
+    overflow-x: auto;
     .sticky {
       position: sticky;
       border-right: 1px solid #dcdfe6;
@@ -1225,6 +1243,9 @@ export default {
 
     .frequency-wrap {
       margin-top: 20px;
+      display: flex;
+      flex-wrap: wrap;
+      gap:20px;
       .item {
         cursor: pointer;
         width: 105px;
@@ -1236,7 +1257,6 @@ export default {
         display: inline-block;
         line-height: 40px;
         text-align: center;
-        margin-right: 30px;
       }
       .active {
         color: #fff;

+ 561 - 55
src/views/dataEntry_manage/databaseComponents/addTargetDiaBase.vue

@@ -1,74 +1,191 @@
 <template>
 	<div class="addTargtDia-box" v-if="isAddTarget">
-		<el-dialog :visible.sync="isAddTarget" :close-on-click-modal="false" :modal-append-to-body='false'
+		<el-dialog :visible.sync="isAddTarget" :close-on-click-modal="false" :modal-append-to-body='false' 
 			@close="cancelHandle" custom-class="custom-dialog fit-screen-dialog" top="5vh" center width="85vw" v-dialogDrag>
 			<div slot="title" style="display:flex;alignItems:center;">
 				<img :src="$icons.add" style="color:#fff;width:16px;height:16px;marginRight:5px;">
 				<span style="fontSize:16px;">添加指标</span>
 			</div>
-			<div class="dialog-top">
-				<div>
-					<span>数据来源</span>
-					<el-select v-model="fromType" placeholder="请选择来源" style="width:240px;margin-left:10px" @change="changeTrade"
-						:disabled="haveResult">
-						<el-option v-for="item in fromArr" :key="item" :label="item" :value="item">
-						</el-option>
-					</el-select>
+			<div v-if="wsdAddStep==1" v-loading="isLoadingData" element-loading-text="加载中······">
+				<div class="dialog-top" >
+					<div>
+						<span>数据来源</span>
+						<el-select v-model="fromType" placeholder="请选择来源" style="width:240px;margin-left:10px" @change="changeTrade"
+							:disabled="haveResult">
+							<el-option v-for="item in fromArr" :key="item" :label="item" :value="item">
+							</el-option>
+						</el-select>
+						<el-select v-model="fromDatabase" placeholder="请选择数据库" style="width:240px;margin-left:10px" @change="changeDatabase"
+							:disabled="haveResult" v-if="fromType=='wind'">
+							<el-option v-for="item in databaseType" :key="item.value" :label="item.label" :value="item.value">
+							</el-option>
+						</el-select>
+					</div>
+					<el-input v-show="isCompanyCode" placeholder="公司ID" v-model="search_company_txt" style="maxWidth:340px;"
+						@keyup.enter.native="searchHandle" :disabled="haveResult" clearable>
+						<i slot="prefix" class="el-input__icon el-icon-search"></i>
+					</el-input>
+
+					<el-input placeholder="指标ID" v-model="search_txt" style="maxWidth:300px" v-if="!(this.fromType=='wind' && this.fromDatabase=='1')"
+						@keyup.enter.native="searchHandle" :disabled="haveResult" clearable>
+						<i slot="prefix" class="el-input__icon el-icon-search"></i>
+					</el-input>
+				</div>
+				<div v-if="this.fromType=='wind' && this.fromDatabase=='1'">
+					<div class="wsd-index-box">
+						<el-input placeholder="请输入证券代码,每次只查询一个证券代码" v-model.trim="securityCodeText" class="wsd-index-input" 
+						@blur="codeInputBlur('security')" style="margin-bottom: 20px;"></el-input>
+						<!-- <div class="wsd-code-row">
+							<div class="wsd-code-item" v-for="item in securityCode" :key="item">
+								<div class="wsd-code-item-text">{{ item }}</div>
+								<img src="~@/assets/img/icons/close_icon_black.png" @click="deleteCode('security',item)" />
+							</div>
+						</div> -->
+						<div class="wsd-index-code">
+							<el-input placeholder="请输入指标代码,多个指标代码用英文逗号分隔" v-model.trim="indexCodeText" class="wsd-index-input" @blur="codeInputBlur('index')"></el-input>
+							<div class="index-code-hint">Wind金融终端输入“CG”会弹出代码生成器,可在代码生成器上获取其他指标的代码</div>
+						</div>
+						<el-checkbox-group v-model="indexCodeSelected">
+							<el-checkbox :label="item.value" v-for="item in indexCodeArr" :key="item.value">{{ item.label }}</el-checkbox>
+						</el-checkbox-group>
+						<div class="wsd-code-row" style="margin-top: -10px;">
+							<div class="wsd-code-item" v-for="item in indexCode" :key="item">
+								<div class="wsd-code-item-text">{{ item }}</div>
+								<img src="~@/assets/img/icons/close_icon_black.png" @click="deleteCode('index',item)" />
+							</div>
+						</div>
+					</div>
+					<div class="dia-bot">
+						<el-button type="primary" @click="wsdNextHandle" :disabled="!isCodeComplete" 
+						style="width: 120px;" :loading="isLoadingData" >下一步
+						</el-button>
+					</div>
 				</div>
-				<el-input v-show="isCompanyCode" placeholder="公司ID" v-model="search_company_txt" style="maxWidth:340px;"
-					@keyup.enter.native="searchHandle" :disabled="haveResult" clearable>
-					<i slot="prefix" class="el-input__icon el-icon-search"></i>
-				</el-input>
+				<template v-else>
+					<div class="warn_txt" v-if="status === 1">
+						该数据已存在数据库,名称为:{{have_edbobj.edb_name}},目录为:{{ have_edbobj.warnTip }},如需重新添加,请删除原指标
+					</div>
+					<div class="warn_txt" v-else-if="status === 3">
+						该数据已存在数据库,名称为:{{have_edbobj.edb_name}},目录为:{{ have_edbobj.warnTip }}
+					</div>
 
-				<el-input placeholder="指标ID" v-model="search_txt" style="maxWidth:340px"
-					@keyup.enter.native="searchHandle" :disabled="haveResult" clearable>
-					<i slot="prefix" class="el-input__icon el-icon-search"></i>
-				</el-input>
-			</div>
-			<div class="warn_txt" v-if="status === 1">
-				该数据已存在数据库,名称为:{{have_edbobj.edb_name}},目录为:{{ have_edbobj.warnTip }},如需重新添加,请删除原指标
-			</div>
-			<div class="warn_txt" v-else-if="status === 3">
-				该数据已存在数据库,名称为:{{have_edbobj.edb_name}},目录为:{{ have_edbobj.warnTip }}
+					<div class="no-auth" v-if="status === 3">
+						您当前暂无权限查看该指标,如需查看,请联系管理员
+					</div>
+					<div class="dialog-main" v-else>
+						<el-table ref="Table" :data="tableData" highlight-current-row border
+							:style="(status === 1 || !tableData.length) ? 'height:350px' : ''">
+							<el-table-column v-for="item in tableColums" :key="item.label" :label="item.label" align="center">
+								<template slot-scope="scope">
+									<span v-if="item.key == 'StartDate' || item.key == 'EndDate'">{{ scope.row[item.key] |
+											formatTime
+									}}</span>
+									<span v-else>{{ scope.row[item.key] }}</span>
+								</template>
+							</el-table-column>
+							<div slot="empty" style="padding:40px 0 120px;">
+								<tableNoData text="未搜索到该指标" size="mini"/>
+							</div>
+						</el-table>
+						<ul class="value-ul" v-show="dataList.length && status === 2">
+							<li class="value-item" v-for="(item, index) in dataList" :key="index">
+								<span>{{ item.DataTime }}</span>
+								<span style="min-width:200px;text-align:center;">{{ item.Value }}</span>
+							</li>
+						</ul>
+					</div>
+					<div class="dia-bot">
+						<el-button type="primary" v-if="status === 2" @click="addTargtHandler" 
+						:disabled="!tableData.length">下一步
+						</el-button>
+						<el-button type="primary" v-else-if="[1,3].includes(status)" @click="cancelHandle">知道了</el-button>
+					</div>
+				</template>
 			</div>
+			<template v-else>
+				<div class="edb-table-preview">
+          <table width="auto" border="0">
+            <thead>
+              <tr v-for="(item, index) in edbTableHeadKey" :key="item">
+                <td class="sticky" style="left: 0;text-align: center;">
+                  {{ edbTableHeadData.get(item) }}
+                </td>
+                <td v-for="(data, sub_index) in edbIndexDatas" :key="sub_index" :colspan="2">
+									<template v-if="item === 'ClassifyId'">
+										<el-cascader :options="options" v-model="data[item]" placeholder="请选择所属目录"
+										size="mini" :disabled="!data.Source"
+										:props="{label: 'ClassifyName',
+											value: 'ClassifyId',
+											children: 'Children',
+											checkStrictly: true,
+											emitPath:false}">
+										</el-cascader>
+									</template>
+									<template v-else-if="item === 'Unit'">
+										<el-autocomplete
+										:disabled="!data.Source"
+											v-model.trim="data[item]"
+											:fetch-suggestions="querySearchUnit"
+											placeholder="请输入单位"
+											suffix-icon="el-icon-arrow-down"
+											size="mini"
+										></el-autocomplete>
+									</template>
+									<template v-else-if="item === 'Frequency'">
+										<el-select v-model="data[item]" placeholder="请选择频度" size="mini" :disabled="!data.Source">
+											<el-option :label="item" :value="item"
+											v-for="item in frequencyArr" :key="item"></el-option>
+										</el-select>
+									</template>
+									<template v-else-if="item === 'EdbName'">
+										<el-input v-model.trim="data[item]" placeholder="请输入指标名称" size="mini" :disabled="!data.Source"></el-input>
+									</template>
+									<template v-else>
+										<div style="padding: 0 7px;">{{ data[item] }}</div>
+									</template>
+                </td>
+              </tr>
+            </thead>
+            <tbody v-if="edbIndexDatas && edbIndexDatas.length>0">
+							<tr v-for="(item,index) in edbIndexDatas[0].DataList.length" :key="index">
+								<td :rowspan="edbIndexDatas[0].DataList.length" v-if="index==0"
+								class="sticky" style="left: 0;text-align: center;">
+									数据详情
+								</td>
+								<template v-for="(item1,index1) in edbIndexDatas.length">
+									<td>{{ edbIndexDatas[index1].DataList[index].DataTime }}</td>
+									<td>{{ edbIndexDatas[index1].DataList[index].Value }}</td>
+								</template>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+				<div class="dia-bot">
+					<el-button @click="wsdPrevHandle" style="width: 120px;">上一步</el-button>
+					<el-button type="primary" @click="wsdSaveHandle" style="width: 120px;margin-left: 50px;">保存</el-button>
+				</div>
+			</template>
+		</el-dialog>
 
-			<div class="no-auth" v-if="status === 3">
-				您当前暂无权限查看该指标,如需查看,请联系管理员
-			</div>
-			<div class="dialog-main" v-else>
-				<el-table ref="Table" :data="tableData" highlight-current-row border
-					:style="(status === 1 || !tableData.length) ? 'height:350px' : ''">
-					<el-table-column v-for="item in tableColums" :key="item.label" :label="item.label" align="center">
-						<template slot-scope="scope">
-							<span v-if="item.key == 'StartDate' || item.key == 'EndDate'">{{ scope.row[item.key] |
-									formatTime
-							}}</span>
-							<span v-else>{{ scope.row[item.key] }}</span>
-						</template>
-					</el-table-column>
-					<div slot="empty" style="padding:40px 0 120px;">
-						<tableNoData text="未搜索到该指标" size="mini"/>
+		<el-dialog :visible.sync="checkFailShow" :close-on-click-modal="false" :modal-append-to-body='false' 
+			width="600px" title="操作提示">
+			<div class="check-fail-box">
+				<div>
+					<div style="margin-bottom: 20px;">指标库中已存在以下指标,请勿重新输入!</div>
+					<div v-for="(item,index) in existIndexList">
+						{{ index+1+'、'+item }}
 					</div>
-				</el-table>
-				<ul class="value-ul" v-show="dataList.length && status === 2">
-					<li class="value-item" v-for="(item, index) in dataList" :key="index">
-						<span>{{ item.DataTime }}</span>
-						<span style="min-width:200px;text-align:center;">{{ item.Value }}</span>
-					</li>
-				</ul>
-			</div>
-			
-			<div class="dia-bot">
-				<el-button type="primary" v-if="status === 2" @click="addTargtHandler" :disabled="!tableData.length">下一步
-				</el-button>
-				<el-button type="primary" v-else-if="[1,3].includes(status)" @click="cancelHandle">知道了</el-button>
+				</div>
+				<div class="check-fail-button">
+					<el-button type="primary" @click="checkFailShow=false" style="width: 120px;">知道了</el-button>
+				</div>
 			</div>
 		</el-dialog>
 	</div>
 </template>
 
 <script>
-import { dataBaseInterface } from '@/api/api.js'
+import { dataBaseInterface,dataInterence } from '@/api/api.js'
 import { fromArr, fromCode ,frequencyArr} from './util';
 export default {
 	name: '',
@@ -77,11 +194,40 @@ export default {
 			type: Boolean
 		}
 	},
+	computed:{
+		isCodeComplete(){
+			// return this.securityCode.length>0 && (this.indexCode.length>0 || this.indexCodeSelected.length>0)
+			return this.securityCodeText && (this.indexCode.length>0 || this.indexCodeSelected.length>0)
+			
+		}
+	},
 	data() {
 		return {
 			search_txt: '',//搜素关键词 M001625518 M0001427
 			fromType: 'wind',
+			fromDatabase:'0',
 			fromArr,
+			indexCodeSelected:[],
+			indexCodeArr:[
+				{value:'pre_close',label:"前收盘价"},
+				{value:'open',label:"开盘价"},
+				{value:'high',label:"最高价"},
+				{value:'low',label:"最低价"},
+				{value:'close',label:"收盘价"},
+				{value:'settle',label:"结算价"},
+				{value:'volume',label:"成交量"},
+				{value:'amt',label:"成交额"},
+				{value:'pct_chg',label:"涨跌幅"},
+				{value:'swing',label:"振幅"},
+				{value:'turn',label:"换手率"},
+				{value:'oi',label:"持仓量"},
+				{value:'oiamount',label:"持仓额"},
+			], // 常用的指标代码
+			databaseType:[
+				{value:'0',label:'经济数据库'},
+				{value:'1',label:'日期序列'}
+			],
+			wsdAddStep:1,
 			fromCode,
 			tableColums: [
 				{
@@ -107,19 +253,76 @@ export default {
 				edb_name: '',
 			},
 			isCompanyCode: false,
-			search_company_txt: ''
+			search_company_txt: '',
+			securityCodeText:"",
+			// securityCode:[],
+			indexCodeText:'',
+			indexCode:[],
+			edbIndexDatas:[
+				// {Source:1,Catalogue:'',Unit:"",Frequency:'日度',SecName:'CU2403收盘价',SecurityCode:'CU2403.SHF',IndexCode:'close',
+				// DataList:[{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"}]},
+				// {Catalogue:'',Unit:"",Frequency:'日度',SecName:'CU2403收盘价',SecurityCode:'CU2403.SHF',IndexCode:'close',
+				// DataList:[{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"}]},
+				// {Catalogue:'',Unit:"",Frequency:'日度',SecName:'CU2403收盘价',SecurityCode:'CU2403.SHF',IndexCode:'close',
+				// DataList:[{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"}]},
+				// {Catalogue:'',Unit:"",Frequency:'日度',SecName:'CU2403收盘价',SecurityCode:'CU2403.SHF',IndexCode:'close',
+				// DataList:[{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"}]},
+				// {Catalogue:'',Unit:"",Frequency:'日度',SecName:'CU2403收盘价',SecurityCode:'CU2403.SHF',IndexCode:'close',
+				// DataList:[{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"}]},
+				// {Catalogue:'',Unit:"",Frequency:'日度',SecName:'CU2403收盘价',SecurityCode:'CU2403.SHF',IndexCode:'close',
+				// DataList:[{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},
+				// {Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"},{Close: "632107.0000",Dt: "2023-09-07"}]}
+			],
+			edbTableHeadKey: [
+        "ClassifyId",
+        "Unit",
+        "Frequency",
+        "EdbName",
+        "StockCode",
+        "EdbCode",
+      ],
+			edbTableHeadData:new Map([
+				["ClassifyId", "所属目录"],
+				["Unit", "单位"],
+				["Frequency", "频度"],
+				["EdbName", "指标名称"],
+				["StockCode", "证券代码"],
+				["EdbCode", "指标代码"],
+			]),
+			BatchList:[],
+			options:[],
+			unitList:[],
+			frequencyArr,
+			checkFailShow:false,
+			existIndexList:[],
+			isLoadingData:false
 		};
 	},
 	watch:{
 		isAddTarget(newVal){
 			if(newVal){
 				this.getTargetSource()
+				this.getMenu()
+				this.getTargetUnitList()
 			}
 		}
 	},
 	methods: {
 		init() {
 			this.fromType = 'wind'
+			this.fromDatabase='0'
+			this.wsdAddStep=1
 			this.status = ''
 			this.tableData = []
 			this.dataList = []
@@ -230,10 +433,21 @@ export default {
 			} else {
 				this.isCompanyCode = false;
 			}
+			if(this.fromDatabase=='1'){
+				this.changeDatabase('0')
+			}
 			this.search_txt = '';
 			this.search_company_txt = '';
 			this.loading && this.loading.close();
 		},
+		changeDatabase(e){
+			this.fromDatabase=e
+			this.securityCodeText=""
+			// this.securityCode=[]
+			this.indexCodeText=''
+			this.indexCode=[]
+			this.indexCodeSelected=[]
+		},
 		getTargetSource(){
 			this.fromArr = []
 			this.fromCode = []
@@ -248,6 +462,184 @@ export default {
 					}))
 				}
 			})
+		},
+		codeInputBlur(type){
+			if(type == 'security'){
+				this.securityCodeText=this.securityCodeText.replaceAll(' ','')
+				// if(!this.securityCodeText) return  
+				// if(!(this.securityCode.length<5)){
+				// 	this.$message.warning('证券代码一次最多输入5个')
+				// 	this.securityCodeText=''
+				// 	return
+				// }
+				// this.securityCode=Array.from(new Set([...this.securityCode,...this.securityCodeText.split(',')])).filter(Boolean)
+				// if(this.securityCode.length>5){
+				// 	this.securityCode = this.securityCode.slice(0,5)
+				// 	this.$message.warning('证券代码一次最多输入5个')
+				// }
+				// this.securityCodeText=''
+			}else if(type == 'index'){
+				if(!this.indexCodeText) return  
+				this.indexCodeText=this.indexCodeText.replaceAll(' ','')
+				this.indexCode=Array.from(new Set([...this.indexCode,...this.indexCodeText.split(',')]))
+
+				this.indexCodeText=''
+			}
+
+		},
+		deleteCode(type,code){
+			if(type == 'security'){
+				// this.securityCode = this.securityCode.filter(it => it!=code)
+			}else if(type == 'index'){
+				this.indexCode = this.indexCode.filter(it => it!=code)
+			}
+		},
+		/* 获取目录结构 */
+		getMenu() {
+			dataBaseInterface.menuListV3().then(res => {
+				if(res.Ret === 200) {
+					this.filterNodes(res.Data.AllNodes||[]);
+					this.options = res.Data.AllNodes || [];
+				}
+			})
+		},
+		// 递归改变目录结构
+		filterNodes(arr) {
+			arr.length && arr.forEach(item => {
+				item.Children.length && this.filterNodes(item.Children)
+				if(!item.Children.length) {
+					item.Children=null
+				}
+			})
+		},
+		// 获取指标单位
+		async getTargetUnitList(){
+			let res=await dataInterence.getTargetUnitList()
+			if(res.Ret===200){
+				this.unitList=res.Data&&res.Data.map(item=>{
+					return {value:item}
+				})
+			}
+		},
+		//搜索单位
+		querySearchUnit(queryString, cb){
+			let results = queryString ? this.unitList.filter(item=>item.value.indexOf(queryString) === 0) : this.unitList;
+			// 调用 callback 返回建议列表的数据
+			cb(results);
+		},
+		wsdNextHandle(){
+			this.getMenu()
+			setTimeout(()=>{
+				if(this.isCodeComplete){
+					let params={
+						Source:Number(this.fromCode.get(this.fromType)),
+						SubSource:this.fromDatabase,
+						EdbCode:Array.from(new Set([...this.indexCode,...this.indexCodeSelected])).join(','),
+						// StockCode:this.securityCode.join(',')
+						StockCode:this.securityCodeText
+					}
+					dataBaseInterface.edbExistCheck(params).then(res=>{
+						if(res.Ret == 200){
+							if(res.Data.IndexExist){
+								// 有重复
+								this.existIndexList=[]
+								let ExistEdbCodeArr=res.Data.ExistEdbCodeArr
+								// let ExistStockCodeArr=res.Data.ExistStockCodeArr
+								let text=''
+								// ExistStockCodeArr.map(item =>{
+									Array.from(new Set(ExistEdbCodeArr)).map(item1 =>{
+										let isCommon = this.indexCodeArr.find(it => it.value == item1)
+										if(isCommon){
+											text=`${this.securityCodeText}${isCommon.label}(wsd${this.securityCodeText}${isCommon.value})`
+										}else{
+											text=`${this.securityCodeText}${item1}(wsd${this.securityCodeText}${item1})`
+										}
+										this.existIndexList.push(text)
+									})
+								// })
+								this.checkFailShow=true
+							}else{
+								// 没有重复
+								this.isLoadingData=true
+								dataBaseInterface.getTarget(params).then(res => {
+									if(res.Ret == 200){
+										let stockList = res.Data.SearchItem.StockList || []
+										this.edbIndexDatas=[]
+										this.BatchList=[]
+										let Source = Number(this.fromCode.get(this.fromType))
+										stockList.map((item,index) =>{
+											let isCommon = this.indexCodeArr.find(it => it.value == item.EdbCode)
+											let params={
+												Source,
+												ClassifyId:0,
+												Unit:'',
+												Frequency:'日度',
+												EdbName:isCommon?`${item.StockCode}${isCommon.label}`:`${item.StockCode}${item.EdbCode}`,
+												EdbCode:item.EdbCode,
+												StockCode:item.StockCode
+											}
+											this.BatchList.push(params)
+											let datas = item.DataList || []
+											let datasLength = datas.length
+											if( datasLength<10){
+												for (let i = datasLength; i < 10; i++) {
+													datas.push({DataTime:'',Value:''})													
+												}
+											}
+											this.edbIndexDatas.push({...params,DataList:datas})
+										})
+
+										let edbIndexDataLength = this.edbIndexDatas.length
+										//填充空的列
+										for (let i = edbIndexDataLength; i < 6; i++) {
+											this.edbIndexDatas.push({
+												Source:0,
+												ClassifyId:0,
+												Unit:'',
+												Frequency:'',
+												EdbName:'',
+												EdbCode:'',
+												StockCode:'',
+												DataList:new Array(10).fill({DataTime:'',Value:''})
+											})
+										}
+										this.wsdAddStep=2
+									}
+								}).finally(()=>{
+									this.isLoadingData=false
+								})
+							}
+						}
+					})
+				}
+			},50)
+		},
+		wsdPrevHandle(){
+			this.wsdAddStep=1
+		},
+		wsdSaveHandle(){
+			 let flag = this.edbIndexDatas.some(it => {
+				return (it.StockCode && it.EdbCode) && ((!it.ClassifyId) || (!it.Unit) || (!it.Frequency) || (!it.EdbName))
+			})
+			if(flag){
+				this.$message.warning("指标信息未填写完整")
+				return 
+			}
+			this.BatchList.map((it,ind) => {
+				it.ClassifyId = this.edbIndexDatas[ind].ClassifyId
+				it.EdbCode = this.edbIndexDatas[ind].EdbCode
+				it.EdbName = this.edbIndexDatas[ind].EdbName
+				it.Frequency = this.edbIndexDatas[ind].Frequency
+				it.StockCode = this.edbIndexDatas[ind].StockCode
+				it.Unit = this.edbIndexDatas[ind].Unit
+			})
+			dataBaseInterface.edbAddBatch({BatchList:this.BatchList}).then(res=>{
+				if(res.Ret == 200){
+					this.$message.success("添加指标成功")
+					this.$emit('addSuccessHandle',{ code:res.Data.UniqueCode,id:res.Data.EdbInfoId,classifyId:res.Data.ClassifyId })	
+					this.cancelHandle()	
+				}
+			})
 		}
 	},
 	created() { },
@@ -260,6 +652,32 @@ export default {
 .addTargtDia-box {
     .custom-dialog{
         max-width: 1200px !important;
+				min-width: 1100px;
+				.el-checkbox{
+					margin-right: 20px;
+					margin-bottom: 16px;
+				}
+				.edb-table-preview{
+					border: 1px solid #dcdfe6;
+					.el-cascader{
+						width: 100%;
+					}
+					.el-autocomplete{
+						width: 100%;
+					}
+					.el-select{
+						width: 100%;
+					}
+					.el-input{
+						width: 100%;
+						input{
+							border: none;
+							padding-left: 7px;
+							font-size: 14px;
+						}
+					}
+				}
+
     }
 }
 </style>
@@ -272,7 +690,48 @@ export default {
 		border: 1px solid #ECECEC;
 		box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
 	}
-
+	.wsd-index-box{
+		padding-top: 20px;
+		.wsd-index-code{
+			display: flex;
+			align-items: center;
+			margin-bottom: 15px;
+			.index-code-hint{
+				color: #C0C4CC;
+				font-size: 15px;
+			}
+		}
+		.wsd-code-row{
+			margin-top: 10px;
+			min-height: 60px;
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+			.wsd-code-item{
+				height: 40px;
+				background-color: #EBEFF6;
+				display: flex;
+				align-items: center;
+				margin-right: 10px;
+				padding: 10px;
+				box-sizing: border-box;
+				margin-bottom: 10px;
+				.wsd-code-item-text{
+					color: #333333;
+					margin-right: 10px;
+				}
+				img{
+					height: 16px;
+					width: 16px;
+					cursor: pointer;
+				}
+			}
+		}
+		.wsd-index-input{
+			width: 400px;
+			margin-right: 10px;
+		}
+	}
 	.warn_txt {
 		font-size: 16px;
 		color: #FF4E00;
@@ -312,5 +771,52 @@ export default {
 		color: #FF4E00;
 		border: 1px dashed #FF4E00;
 	}
+	// 预览表格
+	.sticky {
+		position: sticky;
+		border-right: 1px solid #dcdfe6;
+		z-index: 10;
+	}
+	.edb-table-preview {
+		overflow: auto;
+		height: calc(100% - 124px);
+		&::-webkit-scrollbar {
+			width: 5px !important;
+		}
+		table {
+      border-color: #dcdfe6;
+      border-bottom: 1px solid #dcdfe6;
+      border-right: 1px solid #dcdfe6;
+      border-collapse: separate;
+    }
+    thead {
+      position: sticky;
+      z-index: 2;
+      top: 0;
+    }
+    td {
+      min-width: 100px;
+      max-width: 100px;
+      height: 30px;
+      // text-align: center;
+      color: #333;
+      box-sizing: border-box;
+      padding: 0 5px;
+      background-color: #fff;
+      border-top: 1px solid #dcdfe6;
+      border-left: 1px solid #dcdfe6;
+    }
+	}
+	.check-fail-box{
+		padding: 0 0 15px 40px;	
+		color: #333333;
+		.check-fail-button{
+			margin-top: 80px;
+			display: flex;
+			justify-content: flex-end;
+		}
+	}
 }
+
+
 </style>

+ 22 - 16
src/views/dataEntry_manage/databaseList.vue

@@ -65,9 +65,9 @@
 			<!-- <target-tree /> -->
 			<div class="main-left left" id="left" v-show="isMainLeftShow">
 				<div class="tree-cont">
+					<div class="target_tree">
 					<el-tree
 						ref="menuTree"
-						class="target_tree"
 						:data="treeData"
 						node-key="UniqueCode"
 						:props="defaultProp"
@@ -170,6 +170,7 @@
 							</span>
 						</span>
 					</el-tree>
+					</div>
 					<div class="noDepart" @click="addLevelOneHandle" v-if="CanOpClassify&&isEdbBtnShow('editCatalog')">
 						<img
 							src="~@/assets/img/set_m/add_ico.png"
@@ -242,7 +243,7 @@
 								type="text" @click.stop="saveEdbLimit">保存</el-button>
 							<el-button v-if="EdbData.EdbType===2&&isEdbBtnShow('toSource')"
 								type="text" @click="isLookHistory=true;lookEdbId=selected_edbid">指标溯源</el-button>
-							<el-popover 
+							<el-popover v-if="showPopver"
 								placement="bottom-end" 
 								trigger="hover"
 								popper-class="edb-tool-popover"
@@ -338,6 +339,7 @@
 			ref="addTargetDiaBase"
 			:isAddTarget="isAddTarget"
 			@cancelHandle="isAddTarget = false"
+			@addSuccessHandle="addTargetSuccess"
 		/>
 		<!-- 完善指标信息 -->
 		<completeTargetDia
@@ -472,7 +474,7 @@
 			:isShow.sync="isUpdateNewestData"
 			:edbinfo="tableData[0]"
 			:dataList="dataList"
-			@success="initGetData"
+			@success="updateNewest"
 		/>
 
 		 <!-- 指标历史记录 -->
@@ -802,6 +804,15 @@ export default {
 		//是否显示指标详情
 		isShowDetail(){
 			return !this.showAssociateChart&&!this.showAssociateComputeData&&this.selected_edbid
+		},
+		//是否显示更多操作
+		showPopver(){
+			return this.isEdbBtnShow('setEn')||
+			this.EdbData.Button.InsertNewDataButton&&this.isEdbBtnShow('newValue')||
+			this.EdbData.EdbType===2&&this.isEdbBtnShow('calculateAgain')||
+			this.EdbData.EdbType===1&&this.isEdbBtnShow('refreshAll')||
+			this.isEdbBtnShow('copyData')||
+			this.EdbData.Button.DeleteButton&&this.isEdbBtnShow('deleteEdb')
 		}
 	},
 	methods: {
@@ -1505,14 +1516,6 @@ export default {
 				? e.target.childNodes[0].style.backgroundColor = '#409eff' 
 				: e.target.style.backgroundColor = '#409eff';
 			}
-			const dropLine=$('.el-tree__drop-indicator')[0]
-			if(dropLine){
-				// console.log(dropLine);
-				setTimeout(() => {
-					dropLine.style.top=e.layerY+'px'
-					// console.log(e.layerY,dropLine);
-				}, 100);
-			}
 			
 		},
 		/* 拖拽离开/拖拽完成重置背景色 */
@@ -1836,7 +1839,10 @@ export default {
 		updateNewestDataHandle() {
 			this.isUpdateNewestData = true;
 		},
-
+		updateNewest(){
+				this.initGetData()
+				this.rePainChart()
+		},
 		/* 获取标签列表 */
 		getlabelList(){
 			const List = JSON.parse(sessionStorage.getItem('database'))||[]
@@ -1947,6 +1953,10 @@ export default {
 			this.selectCurrentNode(params);
 			this.select_classifyId = 0;
 		},
+		// 添加wind wsd指标成功
+		addTargetSuccess(params){
+			this.getTreeData(params);
+		}
 	},
 	//离开页面时保存标签
 	beforeRouteLeave(to,from,next){
@@ -1954,10 +1964,6 @@ export default {
 		next()
 	},
 	mounted() {
-		if (document.body.clientWidth <= 1400) {
-			//小屏适配
-			this.isMainLeftShow = false;
-		}
 		this.getlabelList()
 		this.getEdbChartList()
 		this.$route.query.code 

+ 1 - 1
src/views/dataEntry_manage/targetList.vue

@@ -12,7 +12,7 @@
 				placeholder="关键字搜索"
 				v-model="search_txt"
 				@input="searchHandle"
-				style="maxWidth:520px;float:right">
+				style="maxWidth:260px;float:right">
 				<i slot="prefix" class="el-input__icon el-icon-search"></i>
 			</el-input>
 		</div>

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

@@ -1,6 +1,20 @@
 <template>
-  <div class="smmTarget-container" id="box">
-    <div class="left-cont minHeight" id="left">
+  <div class="smmTarget-container target-container" id="box">
+    <span
+        v-show="!isLeftWrapShow"
+        class="slide-btn-icon slide-right"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" id="left" v-show="isLeftWrapShow">
+        <span
+            v-show="isLeftWrapShow"
+            class="slide-btn-icon slide-left"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
       <div class="left-top">
         <el-button
           v-permission="permissionBtn.dataSourcePermission.bcyfData_export"
@@ -295,6 +309,7 @@ export default {
   watch: {},
   data() {
     return {
+      isLeftWrapShow:true,
       exportBase:
         process.env.VUE_APP_API_ROOT + "/datamanage/export/baiinfoList", //ssm数据导出接口
       dataloading: false,
@@ -1190,6 +1205,7 @@ export default {
 </script>
 <style lang="scss">
 @import "../css/customtree.scss";
+@import "../css/baseTargetPage.scss";
 .smmTarget-dialog-cont {
   .el-cascader {
     .el-input {
@@ -1289,11 +1305,10 @@ export default {
     }
   }
   .right-cont {
-    width: 82%;
     padding: 30px;
     .right-box {
       max-width: 100%;
-      max-height: calc(100vh - 230px);
+      max-height: calc(100vh - 240px);
       border-left: 1px solid #dcdfe6;
       border-right: 1px solid #dcdfe6;
       overflow: auto;
@@ -1319,7 +1334,6 @@ export default {
       flex-wrap: wrap;
       .frequency-btn {
         width: 112px;
-        margin: 0 30px 10px 0;
       }
     }
     .nodata-cont {

+ 19 - 2
src/views/dataEntry_manage/thirdBase/NationalDataBase.vue

@@ -38,7 +38,14 @@
       >
     </div>
     <div class="data-show-cotainer" v-loading="searchLoading">
-      <div class="data-list-wrap wrap">
+        <span
+            class="slide-btn-icon"
+            :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+      <div class="data-list-wrap wrap" v-show="isLeftWrapShow">
         <p class="sub-menu-title" v-if="currentMenu">{{ currentMenu.label }}</p>
         <div class="search-box">
           <el-select
@@ -122,6 +129,7 @@ export default {
   components: { lzTable },
   data() {
     return {
+      isLeftWrapShow:true,
       /* menu */
       menuList: [], //菜单列表
       currentMenu: null, //当前选择的菜单
@@ -545,8 +553,17 @@ export default {
   }
   .data-show-cotainer {
     display: flex;
+    position: relative;
+    .slide-btn-icon{
+        &.slide-left{
+            left:385px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+    }
     .wrap {
-      height: calc(100vh - 192px);
+      height: calc(100vh - 194px);
       background-color: white;
       border: 1px solid #dcdfe6;
       border-radius: 4px;

+ 18 - 2
src/views/dataEntry_manage/thirdBase/SCITargetbase.vue

@@ -1,6 +1,20 @@
 <template>
-  <div class="smmTarget-container" id="box">
-    <div class="left-cont minHeight" id="left">
+  <div class="smmTarget-container target-container" id="box">
+    <span
+        v-show="!isLeftWrapShow"
+        class="slide-btn-icon slide-right"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" id="left" v-show="isLeftWrapShow">
+        <span
+            v-show="isLeftWrapShow"
+            class="slide-btn-icon slide-left"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
       <div class="left-top">
         <el-button
           v-permission="permissionBtn.dataSourcePermission.hongtao3Data_export"
@@ -247,6 +261,7 @@ export default {
   watch: {},
   data() {
     return {
+      isLeftWrapShow:true,
       exportBase: process.env.VUE_APP_API_ROOT + "/datamanage/export/sciList", //sci数据导出接口
       dataloading: false,
       rightShow: false,
@@ -1078,6 +1093,7 @@ export default {
 </script>
 <style lang="scss">
 @import "../css/customtree.scss";
+@import "../css/baseTargetPage.scss";
 .smmTarget-dialog-cont {
   .el-cascader {
     .el-input {

+ 9 - 1
src/views/dataEntry_manage/thirdBase/chinaFinancialFutures.vue

@@ -1,6 +1,13 @@
 <template>
   <div class="exchangedata-wrap">
-        <div class="left-wrap box">
+    <span
+        class="slide-btn-icon"
+        :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+        <div class="left-wrap box" v-show="isLeftWrapShow">
             <el-date-picker 
                 style="width:100%" 
                 v-model="time" 
@@ -75,6 +82,7 @@ export default {
     name:"chinaFinancialFutures",
     data() {
         return {
+            isLeftWrapShow:true,
             labelArr: {
                 Rank: "名次",
                 DealShortName: "会员简称",

+ 9 - 1
src/views/dataEntry_manage/thirdBase/dlExchangeData.vue

@@ -1,6 +1,13 @@
 <template>
     <div class="exchangedata-wrap">
-        <div class="left-wrap box">
+        <span
+            class="slide-btn-icon"
+            :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+        <div class="left-wrap box" v-show="isLeftWrapShow">
             <el-date-picker 
                 style="width:100%" 
                 v-model="time" 
@@ -73,6 +80,7 @@ export default {
     name: "大连交易所数据",
     data() {
         return {
+            isLeftWrapShow:true,
             labelArr: {
                 Rank: "名次",
                 DealShortName: "会员简称",

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

@@ -1,6 +1,13 @@
 <template>
   <div class="eteo-container">
-    <div class="left-cont minHeight">
+    <span
+        class="slide-btn-icon"
+        :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" v-show="isLeftWrapShow">
       <div class="left-top">
         <el-button
           v-permission="permissionBtn.dataSourcePermission.eiaData_export"
@@ -83,6 +90,7 @@ export default {
   components: { lzTable },
   data() {
     return {
+      isLeftWrapShow:true,
       exportBase: process.env.VUE_APP_API_ROOT + "/datamanage/eia_steo/data", //数据导出接口
       dataloading: false,
       rightShow: false,
@@ -296,6 +304,15 @@ export default {
 <style lang="scss" scoped>
 .eteo-container {
   display: flex;
+  position:relative;
+  .slide-btn-icon{
+    &.slide-left{
+        left:225px;
+    }
+    &.slide-right{
+        left: 0;
+    }
+  }
   * {
     box-sizing: border-box;
   }
@@ -309,7 +326,8 @@ export default {
     width: 5px !important;
   }
   .left-cont {
-    min-width: 160px;
+    min-width: 240px;
+    width:240px;
     margin-right: 20px;
     padding: 30px 0;
     overflow: hidden;
@@ -336,8 +354,9 @@ export default {
     }
   }
   .right-cont {
-    width: 86%;
+    flex:1;
     padding: 30px;
+    overflow-x: auto;
     .right-box {
       max-width: 100%;
       max-height: calc(100vh - 230px);

+ 27 - 5
src/views/dataEntry_manage/thirdBase/glTargetbase.vue

@@ -1,6 +1,13 @@
 <template>
   <div class="lzTarget-container">
-    <div class="left-cont minHeight">
+    <span
+        class="slide-btn-icon"
+        :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" v-show="isLeftWrapShow">
       <div class="left-top">
         <!-- <el-button type="primary" plain size="medium" @click="exportClick" :loading="btnload">导出Excel</el-button> -->
         <el-button
@@ -114,6 +121,7 @@ export default {
   },
   data() {
     return {
+      isLeftWrapShow:true,
       dataloading: false,
       rightShow: false,
       exportBase: process.env.VUE_APP_API_ROOT + "/datamanage/export/glList", //钢联数据导出接口
@@ -439,6 +447,15 @@ export default {
 <style lang="scss" scoped>
 .lzTarget-container {
   display: flex;
+  position:relative;
+  .slide-btn-icon{
+        &.slide-left{
+            left:225px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+    }
   * {
     box-sizing: border-box;
   }
@@ -452,7 +469,8 @@ export default {
     width: 5px !important;
   }
   .left-cont {
-    min-width: 140px;
+    min-width: 240px;
+    width:240px;
     margin-right: 20px;
     padding: 30px 0;
     overflow: hidden;
@@ -479,11 +497,12 @@ export default {
     }
   }
   .right-cont {
-    width: 86%;
+    flex:1;
     padding: 30px;
+    overflow-x: auto;
     .right-box {
       max-width: 100%;
-      max-height: calc(100vh - 230px);
+      max-height: calc(100vh - 240px);
       border-left: 1px solid #dcdfe6;
       border-right: 1px solid #dcdfe6;
       overflow: auto;
@@ -507,9 +526,12 @@ export default {
       margin-top: 20px;
       display: flex;
       flex-wrap: wrap;
+      gap:20px;
+      .el-button{
+            margin-left: 0 !important;
+        }
       .frequency-btn {
         width: 112px;
-        margin: 0 30px 10px 0;
       }
     }
   }

+ 28 - 7
src/views/dataEntry_manage/thirdBase/lzTargetbase.vue

@@ -1,6 +1,13 @@
 <template>
   <div class="lzTarget-container">
-    <div class="left-cont minHeight">
+    <span
+        class="slide-btn-icon"
+        :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" v-show="isLeftWrapShow">
       <div class="left-top">
         <el-button
           v-permission="permissionBtn.dataSourcePermission.longzhongData_export"
@@ -103,6 +110,7 @@ export default {
   },
   data() {
     return {
+      isLeftWrapShow:true,
       dataloading: false,
       rightShow: false,
       exportBase: process.env.VUE_APP_API_ROOT + "/datamanage/export/lzList", //隆众数据导出接口
@@ -372,6 +380,15 @@ export default {
 <style lang="scss" scoped>
 .lzTarget-container {
   display: flex;
+  position: relative;
+  .slide-btn-icon{
+        &.slide-left{
+            left:225px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+    }
   * {
     box-sizing: border-box;
   }
@@ -385,7 +402,8 @@ export default {
     width: 5px !important;
   }
   .left-cont {
-    min-width: 140px;
+    min-width: 240px;
+    width:240px;
     margin-right: 20px;
     padding: 30px 0;
     overflow: hidden;
@@ -412,13 +430,13 @@ export default {
     }
   }
   .right-cont {
-    width: 86%;
+    flex:1;
     padding: 30px;
-
+    overflow-x: auto;
     .right-box {
       max-width: 100%;
-      max-height: calc(100vh - 230px);
-      border-left: 1px solid #dcdfe6;
+      max-height: calc(100vh - 240px);
+      /* border-left: 1px solid #dcdfe6; */
       border-right: 1px solid #dcdfe6;
       overflow: auto;
       .data-header {
@@ -441,9 +459,12 @@ export default {
       margin-top: 20px;
       display: flex;
       flex-wrap: wrap;
+      gap:20px;
+      .el-button{
+            margin-left: 0 !important;
+        }
       .frequency-btn {
         width: 112px;
-        margin: 0 30px 10px 0;
       }
     }
   }

+ 9 - 1
src/views/dataEntry_manage/thirdBase/shEnergy.vue

@@ -1,6 +1,13 @@
 <template>
   <div class="exchangedata-wrap">
-        <div class="left-wrap box">
+        <span
+            class="slide-btn-icon"
+            :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+        <div class="left-wrap box" v-show="isLeftWrapShow">
             <el-date-picker 
                 style="width:100%" 
                 v-model="time" 
@@ -70,6 +77,7 @@ export default {
     name: "上海国际能源交易中心",
     data() {
         return {
+            isLeftWrapShow:true,
             labelArr: {
                 Rank: "名次",
                 DealShortName: "会员简称",

+ 9 - 1
src/views/dataEntry_manage/thirdBase/shFutures.vue

@@ -1,6 +1,13 @@
 <template>
     <div class="exchangedata-wrap">
-        <div class="left-wrap box">
+        <span
+            class="slide-btn-icon"
+            :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+        <div class="left-wrap box" v-show="isLeftWrapShow">
             <el-date-picker
                 style="width: 100%"
                 v-model="time"
@@ -88,6 +95,7 @@ export default {
     name: "上海期货交易所",
     data() {
         return {
+            isLeftWrapShow:true,
             labelArr: {
                 Rank: "名次",
                 DealShortName: "会员简称",

+ 19 - 5
src/views/dataEntry_manage/thirdBase/smmTargetbase.vue

@@ -1,6 +1,20 @@
 <template>
-  <div class="smmTarget-container" id="box">
-    <div class="left-cont minHeight" id="left">
+  <div class="smmTarget-container target-container" id="box">
+    <span
+        v-show="!isLeftWrapShow"
+        class="slide-btn-icon slide-right"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" id="left" v-show="isLeftWrapShow">
+        <span
+            v-show="isLeftWrapShow"
+            class="slide-btn-icon slide-left"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
       <div class="left-top">
         <el-button
           v-permission="permissionBtn.dataSourcePermission.smmData_export"
@@ -263,6 +277,7 @@ export default {
   watch: {},
   data() {
     return {
+      isLeftWrapShow:true,
       exportBase: process.env.VUE_APP_API_ROOT + "/datamanage/export/smmList", //ssm数据导出接口
       dataloading: false,
       rightShow: false,
@@ -1146,6 +1161,7 @@ export default {
 </script>
 <style lang="scss">
 @import "../css/customtree.scss";
+@import "../css/baseTargetPage.scss";
 .smmTarget-dialog-cont {
   .el-cascader {
     .el-input {
@@ -1245,11 +1261,10 @@ export default {
     }
   }
   .right-cont {
-    width: 82%;
     padding: 30px;
     .right-box {
       max-width: 100%;
-      max-height: calc(100vh - 230px);
+      max-height: calc(100vh - 240px);
       border-left: 1px solid #dcdfe6;
       border-right: 1px solid #dcdfe6;
       overflow: auto;
@@ -1275,7 +1290,6 @@ export default {
       flex-wrap: wrap;
       .frequency-btn {
         width: 112px;
-        margin: 0 30px 10px 0;
       }
     }
     .nodata-cont {

+ 32 - 4
src/views/dataEntry_manage/thirdBase/steelChemicalbase.vue

@@ -1,6 +1,20 @@
 <template>
   <div class="steelChemical-container" id="box">
-    <div class="left-cont minHeight" id="left">
+    <span
+        v-show="!isLeftWrapShow"
+        class="slide-btn-icon slide-right"
+        @click="isLeftWrapShow = !isLeftWrapShow"
+    >
+        <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+    </span>
+    <div class="left-cont minHeight" id="left" v-show="isLeftWrapShow">
+        <span
+            v-show="isLeftWrapShow"
+            class="slide-btn-icon slide-left"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
       <div class="left-top">
         <div>
           <el-button v-permission="permissionBtn.dataSourcePermission.mysteelData_add"
@@ -254,6 +268,7 @@ export default {
   components: { lzTable, mDialog, targetDialog,batchAddEdbDia },
   data() {
     return {
+      isLeftWrapShow:true,
       dataloading: false,
       rightShow: false,
       exportBase:
@@ -716,6 +731,15 @@ export default {
 <style lang="scss" scoped>
 .steelChemical-container {
   display: flex;
+  position: relative;
+  .slide-btn-icon{
+        &.slide-left{
+            right:0;
+        }
+        &.slide-right{
+            left: 0;
+        }
+    }
   * {
     box-sizing: border-box;
   }
@@ -787,12 +811,13 @@ export default {
     }
   }
   .right-cont {
-    width: 82%;
+    flex:1;
+    overflow-x: auto;
     padding: 30px;
     position: relative;
     .right-box {
       max-width: 100%;
-      max-height: calc(100vh - 230px);
+      max-height: calc(100vh - 240px);
       border-left: 1px solid #dcdfe6;
       border-right: 1px solid #dcdfe6;
       overflow: auto;
@@ -816,9 +841,12 @@ export default {
       margin-top: 20px;
       display: flex;
       flex-wrap: wrap;
+      gap:20px;
+      .el-button{
+            margin-left: 0 !important;
+        }
       .frequency-btn {
         width: 112px;
-        margin: 0 30px 10px 0;
       }
     }
   }

+ 9 - 1
src/views/dataEntry_manage/thirdBase/zzExchangeData.vue

@@ -1,6 +1,13 @@
 <template>
     <div class="exchangedata-wrap">
-        <div class="left-wrap box">
+        <span
+            class="slide-btn-icon"
+            :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+            @click="isLeftWrapShow = !isLeftWrapShow"
+        >
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+        <div class="left-wrap box" v-show="isLeftWrapShow">
             <el-date-picker 
                 style="width:100%" 
                 v-model="time" 
@@ -65,6 +72,7 @@ export default {
     name: "郑州交易所数据",
     data() {
         return {
+            isLeftWrapShow:true,
             labelArr: {
                 Rank: "名次",
                 DealShortName: "会员简称",

+ 162 - 0
src/views/dataSource_manage/accountList.vue

@@ -0,0 +1,162 @@
+<template>
+    <div class="account-list-page">
+
+        <el-button 
+            type="primary" 
+            @click="showEditAccount=true;activeTermId=0;initData={}"
+            v-permission="permissionBtn.dataSourcePermission.dataSource_account_add"
+        >新增终端账号</el-button>
+        <el-table
+            style="margin-top:30px"
+            :data="tableData"
+            border
+        >
+            <el-table-column
+                v-for="col in tableColOpts"
+                :key="col.key"
+                :label="col.name"
+                :prop="col.key"
+                :sortable="col.sortable"
+                align="center"
+            >
+                <template slot-scope="scope">
+                    <span 
+                        v-if="col.key==='Status'"
+                        :style="{color:scope.row.Status===1?'':'#FF0000'}"
+                    >{{scope.row.Status===1?'启用':'禁用'}}</span>
+                    <span v-else>{{scope.row[col.key]}}</span>
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" width="100">
+                <template slot-scope="scope">
+                    <span 
+                        style="color:#409EFF;cursor: pointer;" 
+                        @click="handleEditAccount(scope.row)"
+                        v-permission="permissionBtn.dataSourcePermission.dataSource_account_edit"
+                    >编辑</span>
+                    <span 
+                        style="color:#409EFF;cursor: pointer;" 
+                        @click="handleSetAccountStatus(scope.row,2)" 
+                        v-if="scope.row.Status===1"
+                        v-permission="permissionBtn.dataSourcePermission.dataSource_account_enable"
+                    >禁用</span>
+                    <span 
+                        style="color:#409EFF;cursor: pointer;" 
+                        @click="handleSetAccountStatus(scope.row,1)" 
+                        v-if="scope.row.Status===2"
+                        v-permission="permissionBtn.dataSourcePermission.dataSource_account_enable"
+                    >启用</span>
+                </template>
+            </el-table-column>
+            <div slot="empty">
+                <tableNoData text="暂无数据"/>
+            </div>
+        </el-table>
+
+        <!-- 新增/编辑终端账号 -->
+        <EditAccount 
+            v-model="showEditAccount" 
+            :TerminalId="activeTermId" 
+            :initData="initData"
+            @change="getAccountList"
+        />
+    </div>
+</template>
+
+<script>
+import EditAccount from './components/EditAccount.vue'
+import {apiDataSource} from '@/api/modules/dataSource.js'
+export default {
+    components:{EditAccount},
+    data() {
+        return {
+            tableData:[],
+            tableColOpts:[
+                {
+                    name:'终端编码',
+                    key:'TerminalCode',
+                },
+                {
+                    name:'终端名称',
+                    key:'Name',
+                },
+                {
+                    name:'文件夹路径',
+                    key:'DirPath',
+                },
+                {
+                    name:'终端地址',
+                    key:'ServerUrl',
+                },
+                {
+                    name:'终端token',
+                    key:'Value',
+                },
+                {
+                    name:'数据源类型',
+                    key:'Source',
+                },
+                {
+                    name:'状态',
+                    key:'Status',
+                },
+                {
+                    name:'指标数据量',
+                    key:'Num',
+                },
+                {
+                    name:'更新时间',
+                    key:'ModifyTime',
+                    sortable:true
+                },
+            ],
+
+            showEditAccount:false,
+            activeTermId:0,
+            initData:{},
+        }
+    },
+    created() {
+        this.getAccountList()
+    },
+    methods: {
+        async getAccountList(){
+            const res=await apiDataSource.accountList({})
+            if(res.Ret===200){
+                const arr=res.Data.List||[]
+                this.tableData=arr
+            }
+        },
+
+        // 点击编辑账号
+        handleEditAccount(e){
+            this.activeTermId=e.TerminalId
+            this.initData=e
+            this.showEditAccount=true
+        },
+
+        // 启用/禁用账号
+        handleSetAccountStatus(e,status){
+            apiDataSource.accountSet({
+                TerminalId:e.TerminalId,
+                Status:status
+            }).then(res=>{
+                if(res.Ret===200){
+                    this.$message.success('操作成功')
+                    this.getAccountList()
+                }
+            })
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.account-list-page{
+    padding: 30px;
+    border-radius: 4px;
+    border: 1px solid #DCDFE6; 
+    background-color: #fff;
+    min-height: calc(100vh - 260px);
+}
+</style>

+ 177 - 0
src/views/dataSource_manage/components/DelEDBTable.vue

@@ -0,0 +1,177 @@
+<template>
+    <div class="del-table-wrap">
+        <div>
+            <img src="~@/assets/img/data_m/set_icon.png" alt="" style="cursor: pointer;float:right" @click="showSetTableCols=true">
+        </div>
+        <el-table
+            v-loading="tableLoading"
+            ref="tableIns"
+            :data="tableData"
+            border
+            @sort-change="handleTableSortChange"
+        >
+            <el-table-column
+                v-for="col in tableColOpts"
+                :key="col.ColumnKey"
+                :column-key="col.ColumnKey"
+                :label="col.ColumnName"
+                :prop="col.ColumnKey"
+                :sortable="col.IsSort===1?'custom':false"
+                align="center"
+                :width="getColWidth(col.ColumnKey)"
+            >
+                <template slot="header" slot-scope="scope">
+                    <span>{{col.ColumnName}}</span>
+                    <el-tooltip 
+                        effect="dark" 
+                        :content="getTableHeadTips(col.ColumnKey)" 
+                        placement="top-start"
+                    >
+                        <i class="el-icon-info" v-if="tipsKeysArr.includes(col.ColumnKey)"></i>
+                    </el-tooltip>
+                </template>
+            </el-table-column>
+            <div slot="empty">
+                <tableNoData text="暂无数据"/>
+            </div>
+        </el-table>
+        <el-pagination
+          layout="total,prev,pager,next,jumper"
+          background
+          @current-change="handleCurrentChange"
+          :page-size="pageSize"
+          :total="total"
+          style="float: right;margin-top:20px"
+        />
+        <!-- 自定义列表 -->
+        <SetTableCols v-model="showSetTableCols" :ColumnType="3" @change="handleTableColChange"/>
+    </div>
+</template>
+
+<script>
+import {apiDataSource} from '@/api/modules/dataSource'
+import SetTableCols from './SetTableCols.vue'
+export default {
+    components:{SetTableCols},
+    data() {
+        return {
+            tipsKeysArr:['EdbNameSource','ErDataUpdateDate'], 
+            tableLoading:false,
+            tableColOpts:[],
+            tableData:[],
+            pageSize:15,
+            page:1,
+            total:0,
+            filterState:{
+                sortKey:'',
+                sortType:'',
+            },
+
+            showSetTableCols:false,
+        }
+    },
+    created() {
+        this.getTableColOpts()
+    },
+    methods: {
+        //获取表格数据
+        getTableList(){
+            this.tableLoading=true
+            apiDataSource.GLDelTableList({
+                CurrentIndex:this.page,
+                PageSize:this.pageSize,
+                SortParam:this.filterState.sortKey,
+                SortType:this.filterState.sortType,
+                CreateTime:''
+            }).then(res=>{
+                this.tableLoading=false
+                if(res.Ret===200){
+                    const arr=res.Data.List||[]
+                    this.tableData=arr
+                    this.total=res.Data.Paging.Totals
+                }
+            })
+        },
+
+        handleCurrentChange(e){
+            this.page=e
+            this.getTableList()
+        },
+
+        // 获取表格列配置项
+        getTableColOpts(){
+            this.tableColOpts=[]
+            this.tableLoading=true
+            apiDataSource.GLTableColOpts({ColumnType:3}).then(res=>{
+                if(res.Ret===200){
+                    const arr=res.Data.List||[]
+                    this.tableColOpts=arr.filter(item=>item.IsShow===1)
+                    this.$nextTick(()=>{
+                        // this.$refs.tableIns.doLayout()
+                        this.tableLoading=false
+                    })
+                    this.getTableList()
+                }
+            })
+        },
+
+        handleTableColChange(){
+            this.getTableColOpts()
+        },
+
+        handleShowSetTableCol(){
+            this.showSetTableCols=true
+        },
+
+        // 筛选项刷新列表
+        handleRefreshList(){
+            this.page=1
+            this.getTableList()
+        },
+
+        // 排序
+        handleTableSortChange({column, prop, order}){
+            console.log(column, prop, order);
+            this.filterState.sortKey=prop
+            this.filterState.sortType=order==='descending'?'desc':order==='ascending'?'asc':''
+            this.handleRefreshList()
+        },
+
+        // table说明文案
+        getTableHeadTips(key){
+            const tipsMap={
+                EdbNameSource:'指标在数据源的全称',
+                ErDataUpdateDate:'指标数据发生变化的最早日期',
+            }
+            return tipsMap[key]
+        },
+
+        // 设置列的宽度
+        getColWidth(key){
+            const widthMap={
+                DataUpdateTime:'150px',
+                ErDataUpdateDate:'200px',
+                StartDate:'150px',
+                LatestDate:'150px',
+                CreateTime:'150px'
+            }
+
+            return widthMap[key]
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.del-table-wrap{
+    .top-wrap{
+        display: flex;
+        justify-content: flex-end;
+        margin-bottom: 30px;
+        .set-icon{
+            width: 40px;
+            cursor: pointer;
+        }
+    }
+}
+</style>

+ 313 - 0
src/views/dataSource_manage/components/DetailTable.vue

@@ -0,0 +1,313 @@
+<template>
+    <div class="detail-table-wrap">
+        <div class="top-wrap">
+        <div class="filter-box">
+            <el-select
+                v-model="filterState.terminalCode"
+                placeholder="终端编码"
+                multiple
+                clearable
+                collapse-tags
+                style="width:250px"
+                @change="handleRefreshList"
+            >
+                <el-option
+                    v-for="item in terminalCodeOpts"
+                    :key="item.TerminalCode"
+                    :label="item.Name"
+                    :value="item.TerminalCode"
+                />
+            </el-select> 
+            <el-cascader
+                v-model="filterState.user"
+                placeholder="创建人"
+                :options="sysUserOpts"
+                :props="props"
+                collapse-tags
+                :show-all-levels="false"
+                clearable
+                @change="handleRefreshList"
+                filterable
+                style="width:250px"
+            />
+            <el-select
+                v-model="filterState.frequency"
+                placeholder="频度"
+                multiple
+                clearable
+                collapse-tags
+                style="width:250px"
+                @change="handleRefreshList"
+            >
+                <el-option
+                    v-for="item in frequencyOpt"
+                    :key="item"
+                    :label="item"
+                    :value="item"
+                />
+            </el-select>
+            <el-input
+                placeholder="指标ID/指标名称"
+                prefix-icon="el-icon-search"
+                v-model="filterState.keyword"
+                clearable
+                style="width:250px"
+                @input="handleRefreshList"
+            />
+        </div>
+        <img src="~@/assets/img/data_m/set_icon.png" alt="" style="cursor: pointer;" @click="showSetTableCols=true">
+        </div>
+        <el-table
+            v-loading="tableLoading"
+            ref="tableIns"
+            :data="tableData"
+            border
+            @sort-change="handleTableSortChange"
+        >
+            <el-table-column
+                v-for="col in tableColOpts"
+                :key="col.ColumnKey"
+                :column-key="col.ColumnKey"
+                :label="col.ColumnName"
+                :prop="col.ColumnKey"
+                :sortable="col.IsSort===1?'custom':false"
+                align="center"
+                :width="getColWidth(col.ColumnKey)"
+            >
+                <template slot="header" slot-scope="scope">
+                    <span>{{col.ColumnName}}</span>
+                    <el-tooltip 
+                        effect="dark" 
+                        :content="getTableHeadTips(col.ColumnKey)" 
+                        placement="top-start"
+                    >
+                        <i class="el-icon-info" v-if="tipsKeysArr.includes(col.ColumnKey)"></i>
+                    </el-tooltip>
+                </template>
+                <template slot-scope="scope">
+                    <span v-if="col.ColumnKey==='IsAdd'">{{scope.row.IsAdd===1?'是':'否'}}</span>
+                    <span v-else-if="col.ColumnKey==='NeedRefresh'">{{scope.row.NeedRefresh===1?'是':'否'}}</span>
+                    <span v-else-if="col.ColumnKey==='HasRefresh'">{{scope.row.HasRefresh===1?'是':'否'}}</span>
+                    <span v-else-if="col.ColumnKey==='DataUpdateResult'">{{scope.row.DataUpdateResult===1?'是':'否'}}</span>
+                    
+                    <span v-else>{{scope.row[col.ColumnKey]}}</span>
+                </template>
+            </el-table-column>
+            <div slot="empty">
+                <tableNoData text="暂无数据"/>
+            </div>
+        </el-table>
+        <el-pagination
+          layout="total,prev,pager,next,jumper"
+          background
+          @current-change="handleCurrentChange"
+          :page-size="pageSize"
+          @size-change="handleSizeChange"
+          :total="total"
+          style="float: right;margin-top:20px"
+        />
+        <!-- 自定义列表 -->
+        <SetTableCols v-model="showSetTableCols" :ColumnType="1" @change="handleTableColChange"/>
+    </div>
+</template>
+
+<script>
+import {apiDataSource} from '@/api/modules/dataSource'
+import {frequencyOpt} from '../utils/config'
+import SetTableCols from './SetTableCols.vue'
+import { departInterence } from "@/api/api.js";
+export default {
+    components:{SetTableCols},
+    data() {
+        return {
+            tipsKeysArr:['EdbNameSource','DataUpdateTime','ErDataUpdateDate','NeedRefresh','HasRefresh','UpdateTime'],
+            frequencyOpt,
+            terminalCodeOpts:[],
+            sysUserOpts:[],
+            props: {
+                value: "AdminId",
+                label: "RealName",
+                children: "ChildrenList",
+                multiple: true,
+                emitPath:false
+            },
+            filterState:{
+                frequency:'',
+                keyword:'',
+                sortKey:'',
+                sortType:'',
+                terminalCode:'',
+                user:[],
+                dateVal:this.$moment().format('YYYY-MM-DD')||''
+            },
+            checkAll:false,
+            tableColOpts:[],
+            tableData:[],
+            pageSize:15,
+            page:1,
+            total:0,
+            tableLoading:false,
+
+            showSetTableCols:false,
+
+        }
+    },
+    created() {
+        this.getTableColOpts()
+        this.getTerminalCodeOpts()
+        this.getSysUserList()
+    },
+    methods: {
+        //获取表格数据
+        getTableList(){
+            this.tableLoading=true
+            apiDataSource.GLDetailTableList({
+                CurrentIndex:this.page,
+                PageSize:this.pageSize,
+                SortParam:this.filterState.sortKey,
+                SortType:this.filterState.sortType,
+                CreateTime:this.filterState.dateVal,
+                TerminalCode:this.filterState.terminalCode?this.filterState.terminalCode.join(','):'',
+                SysUserId:this.filterState.user?this.filterState.user.join(','):'',
+                Frequency:this.filterState.frequency?this.filterState.frequency.join(','):'',
+                KeyWord:this.filterState.keyword
+            }).then(res=>{
+                this.tableLoading=false
+                if(res.Ret===200){
+                    const arr=res.Data.List||[]
+                    this.tableData=arr
+                    this.total=res.Data.Paging.Totals
+                }
+            })
+        },
+
+        handleCurrentChange(e){
+            this.page=e
+            this.getTableList()
+        },
+
+        // 筛选项刷新列表
+        handleRefreshList(){
+            this.page=1
+            this.getTableList()
+        },
+
+        // 获取表格列配置项
+        getTableColOpts(){
+            this.tableLoading=true
+            this.tableColOpts=[]
+            apiDataSource.GLTableColOpts({ColumnType:1}).then(res=>{
+                if(res.Ret===200){
+                    const arr=res.Data.List||[]
+                    this.tableColOpts=arr.filter(item=>item.IsShow===1)
+                    this.$nextTick(()=>{
+                        // this.$refs.tableIns.doLayout()
+                        this.tableLoading=false
+                    })
+                    this.getTableList()
+                    
+                }
+            })
+        },
+
+        // 表格配置项变更
+        handleTableColChange(){
+            this.getTableColOpts()
+        },
+
+        // 排序
+        handleTableSortChange({column, prop, order}){
+            console.log(column, prop, order);
+            this.filterState.sortKey=prop
+            this.filterState.sortType=order==='descending'?'desc':order==='ascending'?'asc':''
+            this.handleRefreshList()
+        },
+
+        // 获取终端编码数据
+        getTerminalCodeOpts(){
+            apiDataSource.terminalCodeArr().then(res=>{
+                if(res.Ret===200){
+                    this.terminalCodeOpts=res.Data.List||[]
+                }
+            })
+        },
+
+        // 获取所有系统用户
+        async getSysUserList() {
+            const res = await departInterence.getQuestionAdminList();
+            if (res.Ret === 200) {
+                this.sysUserOpts = res.Data.List||[];
+            }
+        },
+
+        handleShowSetTableCol(){
+            this.showSetTableCols=true
+        },
+
+        // table说明文案
+        getTableHeadTips(key){
+            const tipsMap={
+                EdbNameSource:'指标在数据源的全称',
+                DataUpdateTime:'指标最近一次数据发生变化的时间',
+                ErDataUpdateDate:'指标数据发生变化的最早日期',
+                NeedRefresh:'该指标今日是否设置了定时刷新任务',
+                HasRefresh:'该指标是否发起了刷新任务',
+                UpdateTime:'指标最近一次执行刷新任务的时间'
+            }
+            return tipsMap[key]
+        },
+
+        // 设置列的宽度
+        getColWidth(key){
+            const widthMap={
+                EdbNameSource:'120px',
+                DataUpdateTime:'120px',
+                ErDataUpdateDate:'200px',
+                NeedRefresh:'200px',
+                HasRefresh:'200px',
+                SourceUpdateTime:'120px',
+                DataUpdateResult:'120px',
+                SourceUpdateFailedReason:'120px'
+            }
+
+            return widthMap[key]
+        }
+    },
+}
+</script>
+
+<style lang="scss">
+.detail-table-wrap{
+    .top-wrap{
+        .el-cascader__search-input{
+            min-width: 30px;
+        }
+    }
+}
+
+</style>
+<style lang="scss" scoped>
+.top-wrap{
+    display: flex;
+    justify-content: space-between;
+    align-items: flex-start;
+    margin-bottom: 30px;
+    .filter-box{
+        margin-right: 100px;
+        display: flex;
+        flex-wrap: wrap;
+        align-items: center;
+        gap: 10px 20px;
+    }
+    .right-opt-box{
+        display: flex;
+        align-items: center;
+        gap: 20px;
+        .set-icon{
+            width: 40px;
+            cursor: pointer;
+        }
+    }
+}
+
+</style>

+ 183 - 0
src/views/dataSource_manage/components/EDBInfoChangeTable.vue

@@ -0,0 +1,183 @@
+<template>
+    <div class="edbinfo-table-wrap">
+        <div>
+            <img src="~@/assets/img/data_m/set_icon.png" alt="" style="cursor: pointer;float:right" @click="showSetTableCols=true">
+        </div>
+        <el-table
+            v-loading="tableLoading"
+            ref="tableIns"
+            :data="tableData"
+            border
+            @sort-change="handleTableSortChange"
+        >
+            <el-table-column
+                v-for="col in tableColOpts"
+                :key="col.ColumnKey"
+                :column-key="col.ColumnKey"
+                :label="col.ColumnName"
+                :prop="col.ColumnKey"
+                :sortable="col.IsSort===1?'custom':false"
+                align="center"
+                :width="getColWidth(col.ColumnKey)"
+            >
+                <template slot="header" slot-scope="scope">
+                    <span>{{col.ColumnName}}</span>
+                    <el-tooltip 
+                        effect="dark" 
+                        :content="getTableHeadTips(col.ColumnKey)" 
+                        placement="top-start"
+                    >
+                        <i class="el-icon-info" v-if="tipsKeysArr.includes(col.ColumnKey)"></i>
+                    </el-tooltip>
+                </template>
+            </el-table-column>
+            <div slot="empty">
+                <tableNoData text="暂无数据"/>
+            </div>
+        </el-table>
+        <el-pagination
+          layout="total,prev,pager,next,jumper"
+          background
+          @current-change="handleCurrentChange"
+          :page-size="pageSize"
+          @size-change="handleSizeChange"
+          :total="total"
+          style="float: right;margin-top:20px"
+        />
+        <!-- 自定义列表 -->
+        <SetTableCols v-model="showSetTableCols" :ColumnType="4" @change="handleTableColChange"/>
+    </div>
+</template>
+
+<script>
+import {apiDataSource} from '@/api/modules/dataSource'
+import SetTableCols from './SetTableCols.vue'
+export default {
+    components:{SetTableCols},
+    data() {
+        return {
+            tipsKeysArr:['EdbNameSource','EdbName','ErDataUpdateDate'],
+            tableLoading:false,
+            tableColOpts:[],
+            tableData:[],
+            pageSize:15,
+            page:1,
+            total:0,
+            tableLoading:false,
+            filterState:{
+                dateVal:this.$moment().format('YYYY-MM-DD')||'',
+                sortKey:'',
+                sortType:'',
+            },
+
+            showSetTableCols:false,
+        }
+    },
+    created() {
+        this.getTableColOpts()
+    },
+    methods: {
+        //获取表格数据
+        getTableList(){
+            this.tableLoading=true
+            apiDataSource.GLEdbInfoTableList({
+                CurrentIndex:this.page,
+                PageSize:this.pageSize,
+                SortParam:this.filterState.sortKey,
+                SortType:this.filterState.sortType,
+                CreateTime:this.filterState.dateVal,
+            }).then(res=>{
+                this.tableLoading=false
+                if(res.Ret===200){
+                    const arr=res.Data.List||[]
+                    this.tableData=arr
+                    this.total=res.Data.Paging.Totals
+                }
+            })
+        },
+
+        handleCurrentChange(e){
+            this.page=e
+            this.getTableList()
+        },
+
+        // 筛选项刷新列表
+        handleRefreshList(){
+            this.page=1
+            this.getTableList()
+        },
+
+        // 获取表格列配置项
+        getTableColOpts(){
+            this.tableColOpts=[]
+            this.tableLoading=true
+            apiDataSource.GLTableColOpts({ColumnType:4}).then(res=>{
+                if(res.Ret===200){
+                    const arr=res.Data.List||[]
+                    this.tableColOpts=arr.filter(item=>item.IsShow===1)
+                    this.$nextTick(()=>{
+                        // this.$refs.tableIns.doLayout()
+                        this.tableLoading=false
+                    })
+                    this.getTableList()
+                }
+            })
+        },
+
+        handleTableColChange(){
+            this.getTableColOpts()
+        },
+
+        handleShowSetTableCol(){
+            this.showSetTableCols=true
+        },
+
+        // 排序
+        handleTableSortChange({column, prop, order}){
+            console.log(column, prop, order);
+            this.filterState.sortKey=prop
+            this.filterState.sortType=order==='descending'?'desc':order==='ascending'?'asc':''
+            this.handleRefreshList()
+        },
+
+        // table说明文案
+        getTableHeadTips(key){
+            const tipsMap={
+                EdbNameSource:'指标在数据源的全称',
+                EdbName:'指标在ETA指标库保存的指标名称',
+                ErDataUpdateDate:'指标数据发生变化的最早日期',
+            }
+            return tipsMap[key]
+        },
+
+        // 设置列的宽度
+        getColWidth(key){
+            const widthMap={
+                EdbName:'150px',
+                DataUpdateTime:'150px',
+                ErDataUpdateDate:'200px',
+                StartDate:'150px',
+                LatestDate:'150px',
+                CreateTime:'150px',
+                EdbNameSource:'150px'
+            }
+
+            return widthMap[key]
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.edbinfo-table-wrap{
+    .top-wrap{
+        display: flex;
+        justify-content: flex-end;
+        margin-bottom: 30px;
+        .set-icon{
+            width: 40px;
+            cursor: pointer;
+        }
+    }
+}
+</style>

+ 158 - 0
src/views/dataSource_manage/components/EditAccount.vue

@@ -0,0 +1,158 @@
+<template>
+    <el-dialog
+      :title="TerminalId?'编辑终端账号':'新增终端账号'"
+      :visible.sync="show"
+      :modal-append-to-body="false"
+      :close-on-click-modal="false"
+      :center="true"
+      v-dialogDrag
+      custom-class="dialogclass"
+      width="540px"
+      @close="handleClose"
+    >
+        <el-form 
+            :model="formState" 
+            :rules="rules" 
+            ref="formIns" 
+            label-width="120px" 
+            class="demo-ruleForm"
+        >
+            <el-form-item label="终端名称" prop="name">
+                <el-input placeholder="请输入终端名称" v-model="formState.name" style="width:300px"></el-input>
+            </el-form-item>
+            <el-form-item label="文件夹路径" prop="dirUrl">
+                <el-input placeholder="请输入文件夹路径" v-model="formState.dirUrl"  style="width:300px" :disabled="TerminalId"></el-input>
+            </el-form-item>
+            <el-form-item label="终端地址" prop="url">
+                <el-input placeholder="请输入终端地址" v-model="formState.url"  style="width:300px"></el-input>
+            </el-form-item>
+            <el-form-item label="终端token" prop="token">
+                <el-input placeholder="请输入终端token" v-model="formState.token"  style="width:300px"></el-input>
+            </el-form-item>
+            <el-form-item label="数据源类型" prop="type">
+                <el-select 
+                    v-model="formState.type" 
+                    placeholder="请选择数据源类型"
+                    style="width:300px"
+                    :disabled="TerminalId"
+                >
+                    <el-option 
+                        v-for="item in dataSourceOpt"
+                        :key="item.EdbSourceId"
+                        :label="item.SourceName"
+                        :value="item.EdbSourceId"
+                    />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="指标数据量" prop="num">
+                <el-input placeholder="请输入指标数据量" type="number" min="0" v-model.number="formState.num"  style="width:300px"></el-input>
+            </el-form-item>
+        </el-form>
+        <div style="text-align:center;margin:30px 0">
+            <el-button type="primary" plain @click="handleClose">取消</el-button>
+            <el-button type="primary" @click="handleSave">确定</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+import {apiDataSource} from '@/api/modules/dataSource.js'
+import {dataBaseInterface} from '@/api/api.js'
+export default {
+    model:{
+        prop:"show",
+        event:'close'
+    },
+    props:{
+        show:{
+            type:Boolean,
+            default:false
+        },
+        TerminalId:{
+            type:Number,
+            default:0
+        },
+        initData:{
+            type:Object,
+            default:{}
+        }
+    },
+    watch: {
+        show(n,o){
+            if(n&&this.TerminalId){
+                console.log('aa');
+                console.log(this.initData);
+                this.formState.name=this.initData.Name
+                this.formState.url=this.initData.ServerUrl
+                this.formState.dirUrl=this.initData.DirPath
+                this.formState.type=this.initData.Source
+                this.formState.num=this.initData.Num
+                this.formState.token=this.initData.Value
+            }
+            if(!n){
+                this.formState.name=''
+                this.formState.url=''
+                this.formState.dirUrl=''
+                this.formState.type=''
+                this.formState.num=''
+                this.formState.token=''
+            }
+        }
+    },
+    data() {
+        return {
+            dataSourceOpt:[],
+            formState:{
+                name:'',
+                url:'',
+                token:'',
+                dirUrl:'',
+                type:'',
+                num:''
+            }
+        }
+    },
+    created() {
+        this.getTargetSource()
+    },
+    methods: {
+        handleClose(){
+            this.$emit('close', false)
+        },
+
+        async handleSave(){
+            const params={
+                TerminalId:this.TerminalId||0,
+                Source:Number(this.formState.type),//终端类型
+                Name:this.formState.name,
+                ServerUrl:this.formState.url,
+                DirPath:this.formState.dirUrl,
+                Num:Number(this.formState.num),
+                Value:this.formState.token
+            }
+            console.log(params);
+            const res=await apiDataSource.accountSave(params)
+            if(res.Ret===200){
+                this.$message.success('保存成功')
+                this.$emit('change')
+                this.handleClose()
+            }
+        },
+
+        // 获取数据源类型
+        getTargetSource(){
+			this.dataSourceOpt = []
+			dataBaseInterface.getDataSource({IsBase:1}).then(res=>{
+				if(res.Ret!==200) return
+				if(res.Data){
+					this.dataSourceOpt = res.Data||[]
+				}
+			})
+		}
+    },
+}
+</script>
+
+<style>
+
+</style>

+ 137 - 0
src/views/dataSource_manage/components/GLRefreshFailDetail.vue

@@ -0,0 +1,137 @@
+<template>
+    <el-dialog
+        title="更新失败指标详情"
+        :visible.sync="show"
+        :close-on-click-modal="false"
+        :append-to-body="true"
+        :center="true"
+        v-dialogDrag
+        width="645px"
+        @close="handleClose"
+    >
+        <div class="gl-refresh-fail-detail-wrap">
+            <div style="margin-bottom:20px">
+                <span>终端名称:{{info.Name}}</span>
+                <span style="display:inline-block;margin-left:20px">文件夹路径:{{info.DirPath}}</span>
+            </div>
+            <div style="display:flex;justify-content: space-between;">
+                <div>
+                    <span>已成功刷新指标数:{{info.UpdateSuccessNum}}</span>
+                    <span>更新失败指标数:{{info.UpdateFailedNum}}</span>
+                </div>
+                <div style="display:flex;align-items:center;color:#409EFF;cursor: pointer;" @click="showBZ=true">
+                    <img src="~@/assets/img/data_m/icon01.png" alt="">
+                    <span>排查步骤</span>
+                </div>
+            </div>
+            <el-table
+                :data="info.List"
+                border
+                height="500"
+            >
+                <el-table-column
+                    label="频度"
+                    prop="Frequency"
+                    align="center"
+                >
+                </el-table-column>
+                <el-table-column
+                    label="数量"
+                    prop="Num"
+                    align="center"
+                >
+                </el-table-column>
+                <el-table-column
+                    label="原因"
+                    prop="SourceUpdateFailedReason"
+                    align="center"
+                >
+                </el-table-column>
+                <div slot="empty">
+                    <tableNoData text="暂无数据"/>
+                </div>
+            </el-table>
+        </div>
+
+        <!-- 排查步骤说明 -->
+        <el-dialog
+            title="排查步骤"
+            :visible.sync="showBZ"
+            :close-on-click-modal="false"
+            :center="true"
+            v-dialogDrag
+            :append-to-body="true"
+            width="500px"
+        > 
+            <div style="padding-bottom:30px;line-height:2;color:#333">
+                <div>1、在钢联终端上,用指标编码查询下是否存在该指标,避免因为指标编码变更的原因导致刷新失败。</div>
+                <div>2、核实钢联终端账号处于登录状态。</div>
+                <div>3、打开Excel,如果“钢联数据2.0”插件不存在,则需要先退出所有Excel和WPS,在钢联终端:最上面的导航栏选择工具->Excel插件修复->点击一键修复,完成钢联数据2.0插件安装。</div>
+                <div>4、打开Excel,选中“钢联数据2.0”插件,查看登录状态是否正常。</div>
+                <div>5、打开文件目录下的一个Excel,选中“钢联数据2.0”插件,点击“更新所有页”按钮后,等待十几秒,查看Excel左下角是否提示额度超限。</div>
+            </div>
+        </el-dialog>
+    </el-dialog>
+    
+</template>
+
+<script>
+import {apiDataSource} from '@/api/modules/dataSource.js'
+export default {
+    model:{
+        prop:"show",
+        event:'close'
+    },
+    props:{
+        show:{
+            type:Boolean,
+            default:false
+        },
+        TerminalCode:{
+            type:String,
+            default:''
+        },
+        date:{
+            type:String,
+            default:''
+        }
+    },
+    watch: {
+      show(n){
+          if(n){
+              this.getDetail()
+          }
+      }  
+    },
+    data() {
+        return {
+            info:{},
+            showBZ:false
+        }
+    },
+    methods: {
+        handleClose(){
+            this.$emit('close', false)
+        },
+
+        getDetail(){
+            apiDataSource.GLRefreshFailDetail({
+                TerminalCode:this.TerminalCode,
+                CreateTime:this.date
+            }).then(res=>{
+                if(res.Ret===200){
+                    this.info=res.Data
+                }
+            })
+        }
+    },
+}
+</script>
+
+<style lang='scss'>
+.gl-refresh-fail-detail-wrap{
+    color: #333;
+    padding-bottom: 30px;
+}
+
+</style>

+ 123 - 0
src/views/dataSource_manage/components/SetTableCols.vue

@@ -0,0 +1,123 @@
+<template>
+    <el-dialog
+      title="自定义列"
+      :visible.sync="show"
+      :modal-append-to-body="false"
+      :close-on-click-modal="false"
+      :center="true"
+      v-dialogDrag
+      custom-class="dialogclass"
+      width="550px"
+      @close="handleClose"
+    >
+        <draggable
+            v-model="list"
+            class="list-wrap"
+            animation="300"
+            tag="div"
+            handle=".drag"
+        >
+            <div class="list-item" v-for="item in list" :key="item.ColumnKey">
+                <el-checkbox v-model="item.checked" :disabled="item.IsMust===1">
+                    <span class="name" :style="{color:item.IsMust===1?'#C0C4CC':''}">{{item.ColumnName}}</span>
+                </el-checkbox>
+                <img class="drag" src="~@/assets/img/data_m/move_ico2.png" alt="">
+            </div>
+        </draggable>
+        <div style="text-align:center;margin:30px 0">
+            <el-button type="primary" plain @click="handleClose">取消</el-button>
+            <el-button type="primary" @click="handleSave">确定</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+import draggable from 'vuedraggable';
+import {apiDataSource} from '@/api/modules/dataSource'
+export default {
+    components:{draggable},
+    model:{
+        prop:"show",
+        event:'close'
+    },
+    props:{
+        show:{
+            type:Boolean,
+            default:false
+        },
+        ColumnType:{//1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"
+            type:Number,
+            default:0
+        }
+    },
+    watch: {
+        show(n){
+            if(n){
+                this.getTableColOpts()
+            }
+        }  
+    },
+    data() {
+        return {
+            list:[]
+        }
+    },
+    methods: {
+        // 获取表格列配置项
+        getTableColOpts(){
+            apiDataSource.GLTableColOpts({ColumnType:this.ColumnType}).then(res=>{
+                if(res.Ret===200){
+                    const arr=res.Data.List||[]
+                    this.list=arr.map(item=>{
+                        return {
+                            ...item,
+                            checked:item.IsShow===1?true:false
+                        }
+                    })
+                }
+            })
+        },
+
+        handleSave(){
+            const list=this.list.map(item=>{
+                return {
+                    Id:item.Id,
+                    IsShow:item.checked?1:0
+                }
+            })
+            apiDataSource.GLTableColEdit({
+                list:list
+            }).then(res=>{
+                if(res.Ret===200){
+                    this.$message.success('保存成功')
+                    this.$emit('change')
+
+                    this.handleClose()
+                }
+            })
+        },
+
+        handleClose(){
+            this.$emit('close', false)
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.list-wrap{
+    .list-item{
+        padding: 10px 0;
+        border-bottom: 1px solid #000;
+        display: flex;
+        justify-content: space-between;
+        .name{
+            font-size: 16px;
+            color: #000;
+        }
+        .drag{
+            cursor: move;
+        }
+    }
+}
+</style>

+ 186 - 0
src/views/dataSource_manage/components/StatisticTable.vue

@@ -0,0 +1,186 @@
+<template>
+    <div class="statistic-table-wrap">
+        <div>
+            <img src="~@/assets/img/data_m/set_icon.png" alt="" style="cursor: pointer;float:right" @click="showSetTableCols=true">
+        </div>
+        <el-table
+            v-loading="tableLoading"
+            ref="tableIns"
+            :data="tableData"
+            border
+        >
+            <el-table-column
+                v-for="col in tableColOpts"
+                :key="col.ColumnKey"
+                :column-key="col.ColumnKey"
+                :label="col.ColumnName"
+                :prop="col.ColumnKey"
+                align="center"
+                :width="getColWidth(col.ColumnKey)"
+            >
+                <template slot="header" slot-scope="scope">
+                    <span>{{col.ColumnName}}</span>
+                    <el-tooltip 
+                        effect="dark" 
+                        :content="getTableHeadTips(col.ColumnKey)" 
+                        placement="top-start"
+                    >
+                        <i class="el-icon-info" v-if="tipsKeysArr.includes(col.ColumnKey)"></i>
+                    </el-tooltip>
+                </template>
+                <template slot-scope="scope">
+                    <span 
+                        v-if="col.ColumnKey==='UpdateFailedNum'" 
+                        style="color:#409EFF;cursor: pointer;"
+                        @click="handleShowFail(scope.row)"
+                    >{{scope.row.UpdateFailedNum}}</span>
+                    <span v-else>{{scope.row[col.ColumnKey]}}</span>
+                </template>
+            </el-table-column>
+            <div slot="empty">
+                <tableNoData text="暂无数据"/>
+            </div>
+        </el-table>
+        <el-pagination
+          layout="total,prev,pager,next,jumper"
+          background
+          @current-change="handleCurrentChange"
+          :page-size="pageSize"
+          @size-change="handleSizeChange"
+          :total="total"
+          style="float: right;margin-top:20px"
+        />
+        <!-- 自定义列表 -->
+        <SetTableCols v-model="showSetTableCols" :ColumnType="2" @change="handleTableColChange"/>
+
+        <!-- 刷新失败详情 -->
+        <GLRefreshFailDetail v-model="showFail" :TerminalCode="TerminalCode" :date="filterState.dateVal"/>
+    </div>
+</template>
+
+<script>
+import {apiDataSource} from '@/api/modules/dataSource'
+import SetTableCols from './SetTableCols.vue'
+import GLRefreshFailDetail from './GLRefreshFailDetail.vue'
+export default {
+    components:{SetTableCols,GLRefreshFailDetail},
+    data() {
+        return {
+            tipsKeysArr:['NeedRefreshNum','HasRefreshNum','RefreshSuccessNum','RefreshFailedNum','UpdateFailedNum','UpdateSuccessNum'],
+            tableColOpts:[],
+            tableData:[],
+            pageSize:15,
+            page:1,
+            total:0,
+            filterState:{
+                dateVal:this.$moment().format('YYYY-MM-DD')||''
+            },
+
+            showSetTableCols:false,
+            tableLoading:false,
+
+            showFail:false,
+            TerminalCode:''
+        }
+    },
+    created() {
+        this.getTableColOpts()
+    },
+    methods: {
+        //获取表格数据
+        getTableList(){
+            this.tableLoading=true
+            apiDataSource.GLStatisticTableList({
+                CurrentIndex:this.page,
+                PageSize:this.pageSize,
+                CreateTime:this.filterState.dateVal,
+            }).then(res=>{
+                this.tableLoading=false
+                if(res.Ret===200){
+                    const arr=res.Data.List||[]
+                    this.tableData=arr
+                    this.total=res.Data.Paging.Totals
+                }
+            })
+        },
+
+        handleCurrentChange(e){
+            this.page=e
+            this.getTableList()
+        },
+
+        // 筛选项刷新列表
+        handleRefreshList(){
+            this.page=1
+            this.getTableList()
+        },
+
+        // 获取表格列配置项
+        getTableColOpts(){
+            this.tableLoading=true
+            this.tableColOpts=[]
+            apiDataSource.GLTableColOpts({ColumnType:2}).then(res=>{
+                if(res.Ret===200){
+                    this.tableColOpts=res.Data.List||[]
+                    this.$nextTick(()=>{
+                        // this.$refs.tableIns.doLayout()
+                        this.tableLoading=false
+                    })
+                    this.getTableList()
+                }
+            })
+        },
+
+        handleTableColChange(){
+            this.getTableColOpts()
+        },
+
+        handleShowSetTableCol(){
+            this.showSetTableCols=true
+        },
+
+        handleShowFail(e){
+            this.TerminalCode=e.TerminalCode
+            this.showFail=true
+        },
+
+        // table说明文案
+        getTableHeadTips(key){
+            const tipsMap={
+                NeedRefreshNum:'今日该终端需定时刷新的指标数量',
+                HasRefreshNum:'今日该终端发起刷新任务的指标数量',
+                RefreshSuccessNum:'今日该终端刷新成功的指标数量',
+                RefreshFailedNum:'今日该终端刷新失败的指标数量',
+                UpdateFailedNum:'今日该终端成功发起刷新任务,但指标数据未变化的指标数量',
+                UpdateSuccessNum:' 今日该终端数据发生变化的指标数量'
+            }
+            return tipsMap[key]
+        },
+
+        // 设置列的宽度
+        getColWidth(key){
+            const widthMap={
+                NeedUpdateNum:'200px',
+                HasUpdateNum:'200px',
+                UpdateSuccessNum:'200px'
+            }
+
+            return widthMap[key]
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.statistic-table-wrap{
+    .top-wrap{
+        display: flex;
+        justify-content: flex-end;
+        margin-bottom: 30px;
+        .set-icon{
+            width: 40px;
+            cursor: pointer;
+        }
+    }
+}
+</style>

+ 108 - 0
src/views/dataSource_manage/dataSourceListGL.vue

@@ -0,0 +1,108 @@
+<template>
+    <div class="data-source-list-page">
+        <div class="top-wrap">
+            <ul class="nav-box">
+                <li 
+                    :class="['nav-item',item.key===activeNav?'active':'']" 
+                    v-for="item in navOpt" 
+                    :key="item.key"
+                    @click="activeNav=item.key"
+                >{{item.name}}</li>
+            </ul>
+            <div>
+                <el-date-picker
+                    v-model="time"
+                    type="date"
+                    placeholder="选择日期"
+                    value-format="yyyy-MM-dd"
+                    :clearable="false"
+                    @change="handleDateChange"
+                    style="width:200px"
+                    v-if="activeNav!='DelEDBTable'"
+                />
+            </div>
+        </div>
+        <div class="main-box">
+            <component :is='activeNav' ref="comIns"></component>
+        </div>
+    </div>
+</template>
+
+<script>
+import DelEDBTable from './components/DelEDBTable.vue'
+import DetailTable from './components/DetailTable.vue'
+import EDBInfoChangeTable from './components/EDBInfoChangeTable.vue'
+import StatisticTable from './components/StatisticTable.vue'
+export default {
+    components:{DelEDBTable,DetailTable,EDBInfoChangeTable,StatisticTable},
+    watch: {
+        activeNav(n){
+            this.time=this.$moment().format('YYYY-MM-DD')
+        }  
+    },
+    data() {
+        return {
+            navOpt:[
+                {name:'数据源明细表',key:'DetailTable'},
+                {name:'数据源统计表',key:'StatisticTable'},
+                {name:'删除指标表',key:'DelEDBTable'},
+                {name:'指标信息变更表',key:'EDBInfoChangeTable'}
+            ],
+            activeNav:'DetailTable',
+            time:this.$moment().format('YYYY-MM-DD')||''
+        }
+    },
+    methods: {
+        handleShowSetTableCol(){
+            this.$refs.comIns.handleShowSetTableCol()
+        },
+
+        handleDateChange(){
+            this.$refs.comIns.filterState.dateVal=this.time
+            this.$refs.comIns.handleRefreshList()
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+.data-source-list-page{
+    .top-wrap{
+        padding: 20px 30px;
+        border-radius: 4px;
+        border: 1px solid #DCDFE6; 
+        background-color: #fff;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        .nav-box{
+            display: flex;
+            border: 1px solid #DCDFE6;
+            border-radius: 4px;
+            overflow: hidden;
+            &:last-child{
+                border-right: none;
+            }
+            .nav-item{
+                padding: 10px;
+                color: #666;
+                border-right: 1px solid #DCDFE6;
+                cursor: pointer;
+                &.active{
+                    background-color: #0052D9;
+                    color: #fff;
+                }
+            }
+        }
+    }
+    .main-box{
+        margin-top: 30px;
+        padding: 30px;
+        border-radius: 4px;
+        border: 1px solid #DCDFE6; 
+        background-color: #fff;
+        min-height: calc(100vh - 380px);
+        padding-bottom: 80px;
+    }
+}
+</style>

+ 4 - 0
src/views/dataSource_manage/utils/config.js

@@ -0,0 +1,4 @@
+export const frequencyOpt=['日度','周度','旬度','月度','季度','年度']
+
+export const refreshFrequencyOpt=['每工作日','周一','周二','周三','周四','周五','周六','周日','每月',]
+

+ 7 - 0
src/views/datasheet_manage/components/SheetExcel.vue

@@ -33,6 +33,13 @@ export default {
       let optionData = this.option ? this.option : {};
       let callbackItems={updated:this.updateEmit}
       initSheet('sheet-container',optionData,this.sheetInfo,this.limit,callbackItems)
+      setTimeout(() => {
+        //获取sheet-container的宽度,设置更多操作的宽度
+        //#luckysheet-icon-morebtn-div
+        const sheetDom = document.querySelector('#sheet-container')
+        const morebtn = document.querySelector('#luckysheet-icon-morebtn-div')
+        morebtn.style.maxWidth = sheetDom.clientWidth - 70 +'px';
+      }, 300);
     },
     copyDisable(e){
       // 变向的禁止复制

+ 1 - 1
src/views/datasheet_manage/components/sheetListWrap.vue

@@ -4,7 +4,7 @@
     <div class="sheetlist-wrapper" ref="listRef" @scroll="$emit('loadMoreHandle')">
       <el-col
         :span="6"
-        style="margin-bottom: 20px; padding-right: 20px"
+        style="margin-bottom: 20px; padding-right: 20px;min-width: 260px;"
         v-for="cell in list"
         :key="cell.ExcelInfoId"
       >

+ 11 - 8
src/views/datasheet_manage/customAnalysis/list.vue

@@ -955,20 +955,22 @@ $normal-font: 14px;
 
     .main-right {
       width: 80%;
-      min-width: 900px;
+      min-width: 800px;
       position: relative;
+      height: calc(100vh - 120px);
+      display: flex;
       .sheet-detail-wrapper {
-        height: 100%;
+        flex: 1;
         border: 1px solid #ececec;
         border-radius: 4px;
         box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
-        overflow: auto;
         background: #fff;
+        box-sizing: border-box;
+        overflow-x: auto;
+        display: flex;
+        flex-direction: column;
         .detail-top {
           padding: 20px;
-          // display: flex;
-          // justify-content: space-between;
-          // align-items: center;
           border-bottom: 1px solid #ececec;
           .sheet-name {
             font-size: 18px;
@@ -984,6 +986,7 @@ $normal-font: 14px;
             display: flex;
             justify-content: space-between;
             align-items: center;
+            white-space: pre;
             .author{
               color: #666666;
               font-size: 16px;
@@ -1004,10 +1007,10 @@ $normal-font: 14px;
           }
         }
         .sheet-wrap {
+          flex:1;
           position: relative;
-          height: calc(100vh - 210px);
+          box-sizing: border-box;
           padding: 15px;
-          /* min-height: 500px; */
         }
       }
 

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

@@ -218,7 +218,7 @@
           <div class="sheet-wrap">
             <Sheet
               ref="sheetRef"
-              v-if="sheetDetailInfo.Source === 1"
+              v-if="sheetDetailInfo.Source === 1&&sheetDetailInfo.ExcelInfoId"
               :option="{
                 data: [{
                   ...JSON.parse(sheetDetailInfo.Content),
@@ -801,8 +801,8 @@ export default {
           this.editButtonText = this.sheetDetailInfo.CanEdit?'':`${this.sheetDetailInfo.Editor}编辑中`
 
           this.$nextTick(() => {
-
-            this.sheetDetailInfo.Source === 1 && this.$refs.sheetRef.init();
+            //sheet组件Mounted已经init一次,再次调用会导致工具栏样式错乱
+            //this.sheetDetailInfo.Source === 1 && this.$refs.sheetRef.init();
 
             this.sheetDetailInfo.Source === 2 &&
               this.$refs.customTableRef.initSheetData(res.Data.TableData);
@@ -1050,18 +1050,21 @@ $normal-font: 14px;
     .main-right {
       width: 80%;
       min-width: 800px;
+      position: relative;
+      height: calc(100vh - 120px);
+      display: flex;
       .sheet-detail-wrapper {
-        height: 100%;
+        flex: 1;
         border: 1px solid #ececec;
         border-radius: 4px;
         box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
-        overflow: auto;
         background: #fff;
+        box-sizing: border-box;
+        overflow-x: auto;
+        display: flex;
+        flex-direction: column;
         .detail-top {
           padding: 20px;
-          // display: flex;
-          // justify-content: space-between;
-          // align-items: center;
           border-bottom: 1px solid #ececec;
           .sheet-name {
             font-size: 18px;
@@ -1077,6 +1080,7 @@ $normal-font: 14px;
             display: flex;
             justify-content: space-between;
             align-items: center;
+            white-space: pre;
             .author{
               color: #666666;
               font-size: 16px;
@@ -1098,8 +1102,9 @@ $normal-font: 14px;
 
         }
         .sheet-wrap {
+          flex:1;
           position: relative;
-          height: calc(100vh - 210px);
+          box-sizing: border-box;
           padding: 15px;
           overflow-y: auto;
           /* min-height: 500px; */

+ 1 - 0
src/views/futures_manage/commodityChartBase.vue

@@ -14,6 +14,7 @@
 						<el-button v-permission="permissionBtn.productPricePermission.goodsPrice_priceLine"
 							type="primary" @click="goAddChart('price')">添加价格曲线</el-button>
 						<el-button v-permission="permissionBtn.productPricePermission.goodsPrice_incomeLine"
+							style="margin-left:0;"
 							type="primary" @click="goAddChart('profit')">添加利润曲线</el-button>
 				</div>
 

+ 8 - 1
src/views/futures_manage/futuresBase.vue

@@ -67,7 +67,7 @@
       :data="tableData"
       style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top: 20px"
       border
-      max-height="680"
+      height="auto"
       ref="table"
     >
       <el-table-column
@@ -238,10 +238,17 @@ export default {
   border-radius: 4px;
   height: calc(100vh - 120px);
   box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
+  display: flex;
+  flex-direction: column;
   .header {
     display: flex;
+    flex-wrap: wrap;
     justify-content: space-between;
     align-items: center;
+    gap:20px 0;
+  }
+  .el-table{
+    flex: 1;
   }
   .nodata {
     padding: 150px 0; 

+ 3 - 0
src/views/login_manage/css/formStyle.scss

@@ -4,6 +4,9 @@
         margin-top: -10px;
         margin-bottom: 60px !important;
         width: 100%;
+        @media screen and (max-height:720px) {
+            margin-bottom:40px !important;
+        }
         .hint-text{
             color: #606266 !important;
             font-size: 16px;

+ 4 - 2
src/views/mychart_manage/components/chooseChart.vue

@@ -53,7 +53,7 @@
             :span="5"
             v-for="chart in chartPublicList"
             :key="chart.ChartInfoId"
-            style="padding-right: 20px;margin-bottom:20px;"
+            style="padding-right: 20px;margin-bottom:20px;min-width: 260px;"
           >
             <el-card shadow class="public-chart-item">
               <div slot="header" class="item-top">
@@ -227,7 +227,9 @@ export default {
     .chart-public-list {
       display: flex;
       flex-wrap: wrap;
-      height: 650px;
+      /* height: 650px; */
+      max-height: 650px;
+      height: 65vh;
       padding: 0 0 0 20px;
       overflow: hidden;
       overflow-y: auto;

+ 1 - 1
src/views/mychart_manage/index.vue

@@ -188,7 +188,7 @@
               :span="6"
               v-for="chart in chartList"
               :key="chart.ChartInfoId"
-              style="margin-bottom: 20px; padding-right: 20px"
+              style="margin-bottom: 20px; padding-right: 20px;min-width: 270px;"
             >
               <el-card class="public-chart-item">
                 <div slot="header" class="item-top">

+ 8 - 0
src/views/positionAnalysis_manage/components/chartDetail.vue

@@ -285,7 +285,13 @@ export default {
 .chart-position-analysis-page {
   padding-bottom: calc(160px + constant(safe-area-inset-bottom));
   padding-bottom: calc(160px + env(safe-area-inset-bottom));
+  overflow-x: auto;
 }
+.chart-wrap-box{
+    min-width: 743px;
+    height: 100%;
+    overflow-y: hidden;
+  }
 .chart-wrap {
   width: 100%;
   margin-bottom: 60px;
@@ -306,11 +312,13 @@ export default {
 .empty-wrap {
   text-align: center;
   padding: 150px 0;
+  box-sizing: border-box;
 }
 
 // @media (min-width: 600px){
 .chart-position-analysis-page-pc {
   padding: 0;
+  height: 100%;
   .top-sticky-wrap {
     display: none;
   }

+ 1 - 1
src/views/positionAnalysis_manage/detail.vue

@@ -255,7 +255,7 @@ export default {
     justify-content: space-between;
   }
   .detail-content {
-      flex: 1;
+    flex: 1;
     padding: 20px;
     background: #fff;
     border-right: 2px solid #F2F2F2;

+ 9 - 1
src/views/ppt_manage/newVersion/components/catalog/mergePPTDialog.vue

@@ -6,7 +6,7 @@
       :visible.sync="mergePptShow" 
       :close-on-click-modal="false" 
       :modal-append-to-body="false"
-      @close="cancelHandle" width="40%" v-dialogDrag center>
+      @close="cancelHandle" v-dialogDrag center width="40%" top="8vh">
       <div slot="title" style="display: flex; alignitems: center">
         <span style="fontsize: 16px">合并PPT</span>
       </div>
@@ -450,6 +450,11 @@ export default {
 </script>
 
 <style lang="scss">
+.merge-ppt-dialog-wrap{
+    .el-dialog{
+        margin-bottom: 0;
+    }
+}
 .dialog-container{
   .tree-container-wrap{
     .tree-container{
@@ -506,6 +511,9 @@ export default {
 </style>
 <style scoped lang="scss">
 .dialog-container{
+    max-height: 700px;
+    height: 65vh;
+    overflow-y: auto;
   .tree-container-wrap{
     width: 100%;
     display: flex;

+ 6 - 6
src/views/ppt_manage/newVersion/pptEditor.vue

@@ -152,7 +152,7 @@
                     <div v-for="(item,index) in sandTableList" :key="index" class="sandTable-item" >
                       <p class="chart_tit">{{item.Name}}</p>
                       <img :src="item.PicUrl" style="width:100%;-webkit-user-drag:none;"  @click="chooseChart(item,'sandImage')"/>
-                      <p class="source-identification">来源:弘则研究</p>
+                      <!-- <p class="source-identification">来源:弘则研究</p> -->
                     </div>
                     <div v-loading = "sandTableLoading" class="loaded-text">{{loadedText}}</div>
                   </template>
@@ -1511,11 +1511,11 @@ $titleColor:#333333;
                     img{
                       cursor: pointer;
                     }
-                    .source-identification{
-                      color: #000;
-                      text-align: left;
-                      padding-left: 12px;
-                    }
+                    // .source-identification{
+                    //   color: #000;
+                    //   text-align: left;
+                    //   padding-left: 12px;
+                    // }
                   }
                   .loaded-text{
                       height: 20px;

+ 6 - 6
src/views/ppt_manage/newVersion/pptEnEditor.vue

@@ -153,7 +153,7 @@
                     <div v-for="(item,index) in sandTableList" :key="index" class="sandTable-item" >
                       <p class="chart_tit">{{item.Name}}</p>
                       <img :src="item.PicUrl" style="width:100%"  @click="chooseChart(item,'sandImage')"/>
-                      <p class="source-identification">来源:弘则研究</p>
+                      <!-- <p class="source-identification">来源:弘则研究</p> -->
                     </div>
                     <div v-loading = "sandTableLoading" class="loaded-text">{{loadedText}}</div>
                   </template>
@@ -1489,11 +1489,11 @@ $titleColor:#333333;
                     img{
                       cursor: pointer;
                     }
-                    .source-identification{
-                      color: #000;
-                      text-align: left;
-                      padding-left: 12px;
-                    }
+                    // .source-identification{
+                    //   color: #000;
+                    //   text-align: left;
+                    //   padding-left: 12px;
+                    // }
                   }
                   .loaded-text{
                       height: 20px;

+ 0 - 6
src/views/predictEdb_manage/mixins/mixin.js

@@ -189,12 +189,6 @@ export default {
 				? e.target.childNodes[0].style.backgroundColor = '#409eff' 
 				: e.target.style.backgroundColor = '#409eff';
 			}
-      const dropLine=$('.el-tree__drop-indicator')[0]
-			if(dropLine){
-				setTimeout(() => {
-					dropLine.style.top=e.layerY+'px'
-				}, 100);
-			}
     },
 
     /* 拖拽离开/拖拽完成重置背景色 */

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

@@ -46,9 +46,9 @@
 						@change="onlyMeHandler">只看我的</el-checkbox>
 				</div>
 				<div class="tree-cont">
+					<div class="target_tree">
 					<el-tree
 						ref="treeRef"
-						class="target_tree"
 						:data="treeData"
 						node-key="UniqueCode"
 						:props="defaultProp"
@@ -148,6 +148,7 @@
 							</span>
 						</span>
 					</el-tree>
+					</div>
 					<div
 						class="noDepart"
 						@click="addLevelOneHandle"
@@ -194,7 +195,7 @@
 									v-if="detail_show_chart&&isEdbBtnShow('edbPreData_save')">保存</el-button>
 							<el-button v-permission="permissionBtn.predictEdbPermission.edbPreData_edbSource"
 								type="text" @click="isLookHistory=true;lookEdbId=select_id">指标溯源</el-button>
-							<el-popover 
+							<el-popover v-if="showPopover"
 								placement="bottom-end" 
 								trigger="hover"
 								popper-class="edb-tool-popover"
@@ -684,6 +685,12 @@ export default {
 			let id = parseInt(localStorage.getItem('AdminId'));
 			return id;
 		},
+		showPopover(){
+			return this.isEdbBtnShow('edbPreData_enNameSetting')||
+			this.isEdbBtnShow('edbPreData_recalcu')||
+			this.edbButton.DeleteButton&&this.isEdbBtnShow('edbPreData_del')||
+			this.isEdbBtnShow('edbPreData_copyData')
+		}
 	},
 	watch: {
 		/* 设置动态右侧区域宽度 */
@@ -1451,10 +1458,6 @@ export default {
 		}
 	},
 	mounted() {
-		if (document.body.clientWidth <= 1400) {
-			//小屏适配
-			this.isSlideLeft = true;
-		}
 		const obj=sessionStorage.getItem('predictEdbTreeData')
 		if(obj||this.$route.query.code){
 			let code=obj?JSON.parse(obj).code:this.$route.query.code

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

@@ -262,7 +262,7 @@
 									:id="'sandTable' + index"
 									@click="insertHtml(item,'image')"
 								/>
-								<p class="source-identification">来源:弘则研究</p>
+								<!-- <p class="source-identification">来源:弘则研究</p> -->
 							</div>
 						</template>
 						<tableNoData text="暂无数据" size="mini" v-else/>
@@ -982,9 +982,9 @@ export default {
 				width: 100%;
 				height: auto;
 			}
-			.source-identification{
-				text-align: left;
-			}
+			// .source-identification{
+			// 	text-align: left;
+			// }
 		}
 		.loaded-text{
 			height: 20px;

+ 4 - 4
src/views/report_manage/editChapterReport.vue

@@ -241,7 +241,7 @@
                 :id="'sandTable' + index"
                 @click="insertHtml(item, 'image')"
               />
-              <p class="source-identification">来源:弘则研究</p>
+              <!-- <p class="source-identification">来源:弘则研究</p> -->
             </div>
             </template>
             <tableNoData text="暂无数据" size="mini" v-else/>
@@ -952,9 +952,9 @@ export default {
         width: 100%;
         height: auto;
       }
-      .source-identification {
-        text-align: left;
-      }
+      // .source-identification {
+      //   text-align: left;
+      // }
     }
     .loaded-text {
       height: 20px;

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

@@ -260,7 +260,7 @@
 									:id="'sandTable' + index"
 									@click="insertHtml(item,'image')"
 								/>
-								<p class="source-identification">来源:弘则研究</p>
+								<!-- <p class="source-identification">来源:弘则研究</p> -->
 							</div>
 						</template>
 						<tableNoData text="暂无数据" size="mini" v-else/>
@@ -966,9 +966,9 @@ export default {
 				width: 100%;
 				height: auto;
 			}
-			.source-identification{
-				text-align: left;
-			}
+			// .source-identification{
+			// 	text-align: left;
+			// }
 		}
 		.loaded-text{
 			height: 20px;

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

@@ -265,7 +265,7 @@
 									:id="'sandTable' + index"
 									@click="insertHtml(item,'image')"
 								/>
-								<p class="source-identification">来源:弘则研究</p>
+								<!-- <p class="source-identification">来源:弘则研究</p> -->
 							</div>
 						</template>
 						<tableNoData text="暂无数据" size="mini" v-else/>
@@ -1033,9 +1033,9 @@ export default {
 				width: 100%;
 				height: auto;
 			}
-			.source-identification{
-				text-align: left;
-			}
+			// .source-identification{
+			// 	text-align: left;
+			// }
 		}
 		.loaded-text{
 			height: 20px;

+ 21 - 0
src/views/report_manage/reportEn/reportlist.vue

@@ -96,6 +96,7 @@
                 <div class="select-btn" slot="reference">
                     <img src="~@/assets/icons/filter.svg">
                     <span>筛选条件</span>
+                    <span class="select-num">+{{selectNum}}</span>
                 </div>
             </el-popover>
           </el-form-item>
@@ -461,6 +462,16 @@ export default {
   watch: {
     searchform: {
       handler() {
+        this.selectNum = 1;
+        //检测筛选项的值,更新selectNum;
+        //frequency:string;classifynameArr:array;publishState:number;
+        ['frequency','classifynameArr','publishState','EmailState'].forEach(key=>{
+            const keyType = typeof(this.searchform[key])
+            if(this.searchform[key]&&keyType!=='object')
+                this.selectNum++;
+            if(keyType==='object'&&this.searchform[key].length>0)
+                this.selectNum++;
+        })
         this.page_no = 1;
         this.getTableData()
       },
@@ -582,6 +593,7 @@ export default {
       editId:0,//编辑策略报告id
 
       isPull:false,//是否正在同步获取报告
+      selectNum:1,
     };
   },
   mounted() {
@@ -969,6 +981,15 @@ export default {
             display: inline-block;
             vertical-align: middle;
           }
+          .select-num{
+            width:20px;
+            height:20px;
+            line-height: 20px;
+            border-radius: 50%;
+            background-color:#0052D9;
+            color:white;
+            font-size: 12px;
+        }
       }
   }
   .opt-btns {

+ 21 - 87
src/views/report_manage/reportlist.vue

@@ -128,21 +128,10 @@
                 <div class="select-btn" slot="reference">
                     <img src="~@/assets/icons/filter.svg">
                     <span>筛选条件</span>
+                    <span class="select-num">+{{selectNum}}</span>
                 </div>
             </el-popover>
           </el-form-item>
-          <!-- <el-form-item label="">
-            <el-select
-              v-model="searchform.timeType"
-              placeholder="选择时间类型"
-              size="medium"
-              style="width:110px"
-              @change="search"
-            >
-              <el-option :label="isApprove?'审批时间':'发布时间'" value="publish_time"></el-option>
-              <el-option label="更新时间" value="modify_time"></el-option>
-            </el-select>
-          </el-form-item> -->
           <el-form-item label="">
             <el-date-picker
               @change="search"
@@ -157,81 +146,6 @@
               style="width: 280px"
             ></el-date-picker>
           </el-form-item>
-          <!-- <el-form-item label="">
-            <el-select
-              @change="search"
-              v-model="searchform.frequency"
-              placeholder="更新频度筛选"
-              size="medium"
-              clearable
-              style="width: 140px"
-            >
-              <el-option label="年度" value="年度"></el-option>
-              <el-option label="半年度" value="半年度"></el-option>
-              <el-option label="季度" value="季度"></el-option>
-              <el-option label="月度" value="月度"></el-option>
-              <el-option label="双周度" value="双周度"></el-option>
-              <el-option label="周度" value="周度"></el-option>
-              <el-option label="日度" value="日度"></el-option>
-              <el-option label="不定时" value="不定时"></el-option>
-            </el-select>
-          </el-form-item> -->
-          <!-- <el-form-item label="">
-            <el-cascader
-              @change="search"
-              :options="optionsArr"
-              v-model="searchform.classifynameArr"
-              clearable
-              placeholder="类型筛选"
-              size="medium"
-            ></el-cascader>
-          </el-form-item>
-          <el-form-item label="" v-if="!isApprove">
-          </el-form-item> -->
-          <!-- <el-form-item label="">
-            <el-select
-              v-model.number="searchform.publishState"
-              placeholder="发布筛选"
-              size="medium"
-              clearable
-              style="width: 140px"
-              @change="search"
-            >
-              <el-option label="已发布" :value="2"></el-option>
-              <el-option label="未发布" :value="1"></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="" v-if="isApprove">
-            <el-select
-              v-model.number="searchform.publishState"
-              placeholder="状态筛选"
-              size="medium"
-              clearable
-              style="width: 140px"
-              @change="search"
-            >
-              <el-option label="待提交" :value="1"></el-option>
-              <el-option label="待审批" :value="2"></el-option>
-              <el-option label="已审批" :value="4"></el-option>
-              <el-option label="已驳回" :value="3"></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="">
-          </el-form-item> -->
-          <!-- <el-form-item label="">
-            <el-select
-              v-permission="permissionBtn.reportManageBtn.reportManage_reportList_sendTime"
-              @change="search"
-              v-model.number="searchform.msgIsSend"
-              placeholder="推送消息状态"
-              size="medium"
-              clearable
-              style="width: 140px"
-            >
-              <el-option label="未推送消息" :value="1"></el-option>
-              <el-option label="已推送消息" :value="2"></el-option>
-            </el-select>
-          </el-form-item> -->
           <el-form-item style="flex:1;text-align: right;">
             <el-input
               @input="search"
@@ -811,6 +725,7 @@ export default {
       showPublish: false,
       isDSFB:false,//是否为定时发布
       tableKey:0,
+      selectNum:1
 
       //isApprove:false,//是否开启审批流,若开启,发布相关按钮,筛选项改变
     };
@@ -1223,6 +1138,16 @@ export default {
     search() {
       //搜索
       this.ispage = false;
+      this.selectNum = 1;
+        //检测筛选项的值,更新selectNum;
+        //frequency:string;classifynameArr:array;publishState:number;msgIsSend:number;
+        ['frequency','classifynameArr','publishState','msgIsSend'].forEach(key=>{
+            const keyType = typeof(this.searchform[key])
+            if(this.searchform[key]&&keyType!=='object')
+                this.selectNum++;
+            if(keyType==='object'&&this.searchform[key].length>0)
+                this.selectNum++;
+        })
       this.$nextTick(() => {
         this.PageIndex = 1;
         this.getlist();
@@ -1327,6 +1252,15 @@ export default {
             display: inline-block;
             vertical-align: middle;
           }
+          .select-num{
+            width:20px;
+            height:20px;
+            line-height: 20px;
+            border-radius: 50%;
+            background-color:#0052D9;
+            color:white;
+            font-size: 12px;
+        }
       }
   }
   .opt-btns {

+ 4 - 4
src/views/sandbox_manage/common/edge.js

@@ -34,8 +34,8 @@ export const myEdgeOption = (type,xP=0,yP=0) => {
         strokeDasharray:null,
         stroke: styleConfig.lineColor,
         strokeWidth: line.width,
-        sourceMarker: {},//起始箭头 
-        targetMarker: {},//终止箭头
+        sourceMarker: '',//起始箭头 
+        targetMarker: '',//终止箭头
       }
     }
   }
@@ -49,8 +49,8 @@ export const myEdgeOption = (type,xP=0,yP=0) => {
         strokeDasharray:null,
         stroke: styleConfig.lineColor,
         strokeWidth: line.width,
-        sourceMarker: {},//起始箭头 
-        targetMarker: {},//终止箭头
+        sourceMarker: '',//起始箭头 
+        targetMarker: '',//终止箭头
       }
     }
   }

+ 31 - 29
src/views/sandbox_manage/index_new_version.vue

@@ -80,9 +80,9 @@
             <img src="~@/assets/img/sand_new/copy.png" />
             <span>复制</span> 
           </div>
-          <div class="chartHead-options-button" @click="deleteHandle(viewSandbox,'inchart')">
+          <div class="chartHead-options-button" @click="deleteHandle(viewSandbox,'inchart')" v-permission="permissionBtn.sandboxPermission.sandbox_del">
             <img src="~@/assets/img/sand_new/remove.png" />
-            <span style="color: red;" v-permission="permissionBtn.sandboxPermission.sandbox_del">删除</span> 
+            <span style="color: red;" >删除</span> 
           </div>
         </div>
       </div>
@@ -218,8 +218,10 @@ import { myGraph } from './common/gragh';
             this.graph.zoomToFit()
           })
         }else{
-          this.graph.fromJSON(newval);
-          this.graph.zoomToFit()
+          this.$nextTick(()=>{
+            this.graph.fromJSON(newval);
+            this.graph.zoomToFit()
+          })
         }
       }
 	  },
@@ -1076,16 +1078,16 @@ import { myGraph } from './common/gragh';
             },{
               preserveDimensions:true,//让svg为实际图片大小
               beforeSerialize:(svg)=>{
-                const zoom = this.graph.zoom();
+                // const zoom = this.graph.zoom();
                 const {x,y,width,height} = this.graph.getContentBBox(cells)
-                let {tx,ty} = this.graph.translate() // 画布偏移量
+                // let {tx,ty} = this.graph.translate() // 画布偏移量
                 //给导出的svg增加一点宽高
-                svg.setAttribute('width',width+60*zoom)
-                svg.setAttribute('height',height+60*zoom) 
+                svg.setAttribute('width',width+60)
+                svg.setAttribute('height',height+60) 
                 //设置viewBox使图像居中
-                svg.setAttribute('viewBox',`${x-30*zoom} ${y-30*zoom} ${width+60*zoom} ${height+60*zoom}`)
-                // 在图表右下方 加上"来源:弘则研究"字样
-                let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
+                svg.setAttribute('viewBox',`${x-30} ${y-30} ${width+60} ${height+60}`)
+                // // 在图表右下方 加上"来源:弘则研究"字样
+                // let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
                 // 去掉不该截图的添加图标
                 let leftImg = svg.getElementsByClassName('left-topic-image')
                 for (let i = 0; i < leftImg.length; i++) {
@@ -1099,13 +1101,13 @@ import { myGraph } from './common/gragh';
                   element.parentElement.removeChild(element)
                   i--
                 }
-                let textNode = document.createElement('text')
-                textNode.setAttribute('x',(x-tx+width)/zoom-85)
-                textNode.setAttribute('y',(y-ty+height)/zoom+27)
-                textNode.setAttribute('font-size','16px')
-                textNode.setAttribute('font-style','italic')
-                textNode.innerText = '来源:弘则研究'
-                gNode.appendChild(textNode)
+                // let textNode = document.createElement('text')
+                // textNode.setAttribute('x',(x-tx+width)/zoom-85)
+                // textNode.setAttribute('y',(y-ty+height)/zoom+27)
+                // textNode.setAttribute('font-size','16px')
+                // textNode.setAttribute('font-style','italic')
+                // textNode.innerText = '来源:弘则研究'
+                // gNode.appendChild(textNode)
                   },
               copyStyles:false,
               stylesheet: `
@@ -1182,11 +1184,11 @@ import { myGraph } from './common/gragh';
           const {x,y,width,height} = this.graph.getContentBBox(cells)
           let {tx,ty} = this.graph.translate()
           //给导出的svg增加一点宽高
-          svg.setAttribute('width',width+50)
-          svg.setAttribute('height',height+50) 
+          svg.setAttribute('width',width+60)
+          svg.setAttribute('height',height+60) 
           //设置viewBox使图像居中
-          svg.setAttribute('viewBox',`${x-25} ${y-25} ${width+50} ${height+50}`)
-          let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
+          svg.setAttribute('viewBox',`${x-30} ${y-30} ${width+60} ${height+60}`)
+          // let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
           // 去掉不该截图的添加图标
           let leftImg = svg.getElementsByClassName('left-topic-image')
           for (let i = 0; i < leftImg.length; i++) {
@@ -1200,13 +1202,13 @@ import { myGraph } from './common/gragh';
             element.parentElement.removeChild(element)
             i--
           }
-          let textNode = document.createElement('text')
-          textNode.setAttribute('x',x-tx+width-90)
-          textNode.setAttribute('y',y-ty+height+22)
-          textNode.setAttribute('font-size','16px')
-          textNode.setAttribute('font-style','italic')
-          textNode.innerText = '来源:弘则研究'
-          gNode.appendChild(textNode)
+          // let textNode = document.createElement('text')
+          // textNode.setAttribute('x',x-tx+width-90)
+          // textNode.setAttribute('y',y-ty+height+22)
+          // textNode.setAttribute('font-size','16px')
+          // textNode.setAttribute('font-style','italic')
+          // textNode.innerText = '来源:弘则研究'
+          // gNode.appendChild(textNode)
             },
         copyStyles:false,
         stylesheet: `

+ 17 - 17
src/views/sandbox_manage/sandFlow/index.vue

@@ -38,7 +38,7 @@
 			<div class="flow-wrapper">
 				<div id="flow-container"></div>
 
-				<div class="flow-source">来源:弘则研究</div>
+				<!-- <div class="flow-source">来源:弘则研究</div> -->
 
 				<!-- 右键菜单 -->
 				<div class="contextMenu-wrapper" id="contextMenu-wrapper" @mouseleave="hideContextMenu">
@@ -224,14 +224,14 @@ export default {
 					//设置viewBox使图像居中
 					svg.setAttribute('viewBox',`${x-25} ${y-25} ${width+50} ${height+50}`)
 					// 在图表右下方 加上"来源:弘则研究"字样
-					let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
-					let textNode = document.createElement('text')
-					textNode.setAttribute('x',x-tx+width-90)
-					textNode.setAttribute('y',y-ty+height+22)
-					textNode.setAttribute('font-size','16px')
-					textNode.setAttribute('font-style','italic')
-					textNode.innerText = '来源:弘则研究'
-					gNode.appendChild(textNode)
+					// let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
+					// let textNode = document.createElement('text')
+					// textNode.setAttribute('x',x-tx+width-90)
+					// textNode.setAttribute('y',y-ty+height+22)
+					// textNode.setAttribute('font-size','16px')
+					// textNode.setAttribute('font-style','italic')
+					// textNode.innerText = '来源:弘则研究'
+					// gNode.appendChild(textNode)
         		},
 				copyStyles:false,
 				stylesheet: `
@@ -316,14 +316,14 @@ export default {
 					svg.setAttribute('height',height+50) 
 					//设置viewBox使图像居中
 					svg.setAttribute('viewBox',`${x-25} ${y-25} ${width+50} ${height+50}`)
-					let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
-					let textNode = document.createElement('text')
-					textNode.setAttribute('x',x-tx+width-90)
-					textNode.setAttribute('y',y-ty+height+22)
-					textNode.setAttribute('font-size','16px')
-					textNode.setAttribute('font-style','italic')
-					textNode.innerText = '来源:弘则研究'
-					gNode.appendChild(textNode)
+					// let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
+					// let textNode = document.createElement('text')
+					// textNode.setAttribute('x',x-tx+width-90)
+					// textNode.setAttribute('y',y-ty+height+22)
+					// textNode.setAttribute('font-size','16px')
+					// textNode.setAttribute('font-style','italic')
+					// textNode.innerText = '来源:弘则研究'
+					// gNode.appendChild(textNode)
         		},
 				copyStyles:false,
 				stylesheet: `

+ 24 - 23
src/views/sandbox_manage/sandFlowNew/index.vue

@@ -386,7 +386,7 @@
                   <el-dropdown-item command="classic" :class="styleOptions.startArrow=='classic'?'style-acitve':''">
                   </el-dropdown-item>
-                  <el-dropdown-item :command="{}" :class="typeof(styleOptions.startArrow)=='string' || styleOptions.startArrow.name?'':'style-acitve'">
+                  <el-dropdown-item command="" :class="styleOptions.startArrow?'':'style-acitve'">
                   </el-dropdown-item>
                 </el-dropdown-menu>
@@ -412,7 +412,7 @@
                   <el-dropdown-item command="classic" :class="styleOptions.endArrow=='classic'?'style-acitve':''">
                   </el-dropdown-item>
-                  <el-dropdown-item :command="{}" :class="typeof(styleOptions.endArrow)=='string' || styleOptions.endArrow.name?'':'style-acitve'">
+                  <el-dropdown-item command="" :class="styleOptions.endArrow?'':'style-acitve'">
                   </el-dropdown-item>
                 </el-dropdown-menu>
@@ -838,6 +838,7 @@ import { svgToBase64 } from '@/utils/svgToblob'
       // });
     },
     beforeDestroy(){
+      clearInterval(this.loopTimer)
       document.getElementById('sand-mainBody-chart').removeEventListener("dragover",this.edgeDragover)
       document.getElementById('sand-mainBody-chart').removeEventListener("drop",this.edgeDrop)
       this.popoverDom.removeEventListener('mouseenter',this.clearPopoverTimeout)
@@ -1274,13 +1275,13 @@ import { svgToBase64 } from '@/utils/svgToblob'
             }
             // console.log(leftImg,rightImg,'rightImg');
 
-            let textNode = document.createElement('text')
-            textNode.setAttribute('x',x-tx+width-90)
-            textNode.setAttribute('y',y-ty+height+22)
-            textNode.setAttribute('font-size','16px')
-            textNode.setAttribute('font-style','italic')
-            textNode.innerText = '来源:弘则研究'
-            gNode.appendChild(textNode)
+            // let textNode = document.createElement('text')
+            // textNode.setAttribute('x',x-tx+width-90)
+            // textNode.setAttribute('y',y-ty+height+22)
+            // textNode.setAttribute('font-size','16px')
+            // textNode.setAttribute('font-style','italic')
+            // textNode.innerText = '来源:弘则研究'
+            // gNode.appendChild(textNode)
               },
           copyStyles:false,
           stylesheet: `
@@ -1361,16 +1362,16 @@ import { svgToBase64 } from '@/utils/svgToblob'
         },{
           preserveDimensions:true,//让svg为实际图片大小
           beforeSerialize:(svg)=>{
-            const zoom = this.graph.zoom();
+            // const zoom = this.graph.zoom();
             const {x,y,width,height} = this.graph.getContentBBox(cells)
-            let {tx,ty} = this.graph.translate() // 画布偏移量
+            // let {tx,ty} = this.graph.translate() // 画布偏移量
             //给导出的svg增加一点宽高
-            svg.setAttribute('width',width+60*zoom)
-            svg.setAttribute('height',height+60*zoom) 
+            svg.setAttribute('width',width+60)
+            svg.setAttribute('height',height+60) 
             //设置viewBox使图像居中
-            svg.setAttribute('viewBox',`${x-30*zoom} ${y-30*zoom} ${width+60*zoom} ${height+60*zoom}`)
-            // 在图表右下方 加上"来源:弘则研究"字样
-            let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
+            svg.setAttribute('viewBox',`${x-30} ${y-30} ${width+60} ${height+60}`)
+            // // 在图表右下方 加上"来源:弘则研究"字样
+            // let gNode = svg.getElementsByClassName('x6-graph-svg-viewport')[0]
             // 去掉不该截图的添加图标
             let leftImg = svg.getElementsByClassName('left-topic-image')
             for (let i = 0; i < leftImg.length; i++) {
@@ -1384,13 +1385,13 @@ import { svgToBase64 } from '@/utils/svgToblob'
               element.parentElement.removeChild(element)
               i--
             }
-            let textNode = document.createElement('text')
-            textNode.setAttribute('x',(x-tx+width)/zoom-85)
-            textNode.setAttribute('y',(y-ty+height)/zoom+27)
-            textNode.setAttribute('font-size','16px')
-            textNode.setAttribute('font-style','italic')
-            textNode.innerText = '来源:弘则研究'
-            gNode.appendChild(textNode)
+            // let textNode = document.createElement('text')
+            // textNode.setAttribute('x',(x-tx+width)/zoom-85)
+            // textNode.setAttribute('y',(y-ty+height)/zoom+27)
+            // textNode.setAttribute('font-size','16px')
+            // textNode.setAttribute('font-style','italic')
+            // textNode.innerText = '来源:弘则研究'
+            // gNode.appendChild(textNode)
               },
           copyStyles:false,
           stylesheet: `

+ 26 - 2
src/views/smartReport/components/TextEdit.vue

@@ -112,6 +112,30 @@ export default {
 }
 </script>
 
-<style>
-
+<style lang="scss">
+.text-edit-wrap{
+    .fr-box.fr-basic{
+        flex: 1;
+        overflow: hidden;
+        display: flex;
+        flex-direction: column;
+        .fr-wrapper{
+            flex: 1;
+            overflow: auto;
+        }
+    }
+}
+</style>
+<style lang="scss" scoped>
+.text-edit-wrap{
+    width:100%;
+    height: 100%;
+    overflow: hidden;
+    display: flex;
+    flex-direction: column;
+    #froala-editor{
+        flex:1;
+        overflow: auto;
+    }
+}
 </style>

+ 2 - 2
src/views/smartReport/editReport.vue

@@ -139,8 +139,8 @@
                 <div class="close-icon" @click="handleCloseRight">
                     <img src="~@/assets/img/smartReport/icon14.png" alt="">
                 </div>
-                <div style="overflow-x:auto">
-                <div style="min-width:800px">
+                <div style="overflow-x:auto;height:calc(100% + 12px);">
+                <div style="min-width:800px;height: 100%;">
                 <TextEdit 
                     v-if="rightType==='text'"
                     :key="activeId"

+ 143 - 72
src/views/smartReport/reportList.vue

@@ -2,7 +2,7 @@
     <div class="smart-report-list">
         <el-card class="box-card">
             <div slot="header" class="header">
-                <el-form :inline="true" :model="searchform" @submit.native.prevent>
+                <el-form :inline="true" :model="searchform" @submit.native.prevent style="display:flex;">
                 <el-form-item label="">
                     <el-button
                         v-permission="permissionBtn.smartReportManageBtn.reportManage_reportAdd"
@@ -11,17 +11,92 @@
                         @click="showAddReport=true"
                     >添加研报</el-button>
                 </el-form-item>
+                <!-- 整合的筛选项 -->
                 <el-form-item label="">
-                    <el-select
-                    v-model="searchform.timeType"
-                    placeholder="选择时间类型"
-                    size="medium"
-                    style="width:110px"
-                    @change="search"
-                    >
-                    <el-option :label="isApprove?'审批时间':'发布时间'" value="publish_time"></el-option>
-                    <el-option label="更新时间" value="modify_time"></el-option>
-                    </el-select>
+                    <el-popover 
+                        placement="bottom" 
+                        trigger="click" 
+                        :visible-arrow="false"
+                        popper-class="report-select-popover"
+                        width="320" style="display: inline-block;">
+                        <div class="select-wrap">
+                            <p>筛选项</p>
+                            <div class="select-item">
+                                <el-select
+                                    v-model="searchform.timeType"
+                                    placeholder="选择时间类型"
+                                    size="medium"
+                                    style="width:100%"
+                                    @change="search"
+                                    >
+                                    <el-option :label="isApprove?'审批时间':'发布时间'" value="publish_time"></el-option>
+                                    <el-option label="更新时间" value="modify_time"></el-option>
+                                </el-select>
+                            </div>
+                            <div class="select-item">
+                                <el-select
+                                    @change="search"
+                                    v-model="searchform.frequency"
+                                    placeholder="更新频度筛选"
+                                    size="medium"
+                                    clearable
+                                    style="width:100%"
+                                >
+                                    <el-option label="年度" value="年度"></el-option>
+                                    <el-option label="半年度" value="半年度"></el-option>
+                                    <el-option label="季度" value="季度"></el-option>
+                                    <el-option label="月度" value="月度"></el-option>
+                                    <el-option label="双周度" value="双周度"></el-option>
+                                    <el-option label="周度" value="周度"></el-option>
+                                    <el-option label="日度" value="日度"></el-option>
+                                    <el-option label="不定时" value="不定时"></el-option>
+                                </el-select>
+                            </div>
+                            <div class="select-item">
+                                <el-cascader
+                                    @change="search"
+                                    :options="optionsArr"
+                                    v-model="searchform.classifynameArr"
+                                    clearable
+                                    placeholder="类型筛选"
+                                    style="width:100%;"
+                                />
+                            </div>
+                            <div class="select-item" v-if="!isApprove">
+                                <el-select
+                                    v-model.number="searchform.publishState"
+                                    placeholder="发布筛选"
+                                    size="medium"
+                                    clearable
+                                    style="width:100%;"
+                                    @change="search"
+                                >
+                                    <el-option label="已发布" :value="2"></el-option>
+                                    <el-option label="未发布" :value="1"></el-option>
+                                </el-select>
+                            </div>
+                            <div class="select-item" v-if="isApprove">
+                                <el-select
+                                    v-model.number="searchform.publishState"
+                                    placeholder="状态筛选"
+                                    size="medium"
+                                    clearable
+                                    style="width:100%;"
+                                    @change="search"
+                                >
+                                    <el-option label="待提交" :value="1"></el-option>
+                                    <el-option label="待审批" :value="2"></el-option>
+                                    <el-option label="已审批" :value="4"></el-option>
+                                    <el-option label="已驳回" :value="3"></el-option>
+                                </el-select>
+                            </div>
+                        </div>
+                        <div class="select-btn" slot="reference">
+                            <img src="~@/assets/icons/filter.svg">
+                            <span>筛选条件</span>
+                            <span class="select-num">+{{selectNum}}</span>
+                        </div>
+                    </el-popover>
                 </el-form-item>
                 <el-form-item label="">
                     <el-date-picker
@@ -37,63 +112,6 @@
                         style="width: 280px"
                     />
                 </el-form-item>
-                <el-form-item label="">
-                    <el-select
-                        @change="search"
-                        v-model="searchform.frequency"
-                        placeholder="更新频度筛选"
-                        size="medium"
-                        clearable
-                        style="width: 140px"
-                    >
-                        <el-option label="年度" value="年度"></el-option>
-                        <el-option label="半年度" value="半年度"></el-option>
-                        <el-option label="季度" value="季度"></el-option>
-                        <el-option label="月度" value="月度"></el-option>
-                        <el-option label="双周度" value="双周度"></el-option>
-                        <el-option label="周度" value="周度"></el-option>
-                        <el-option label="日度" value="日度"></el-option>
-                        <el-option label="不定时" value="不定时"></el-option>
-                    </el-select>
-                </el-form-item>
-                <el-form-item label="">
-                    <el-cascader
-                        @change="search"
-                        :options="optionsArr"
-                        v-model="searchform.classifynameArr"
-                        clearable
-                        placeholder="类型筛选"
-                        size="medium"
-                    />
-                </el-form-item>
-                <el-form-item label="" v-if="!isApprove">
-                    <el-select
-                        v-model.number="searchform.publishState"
-                        placeholder="发布筛选"
-                        size="medium"
-                        clearable
-                        style="width: 140px"
-                        @change="search"
-                    >
-                        <el-option label="已发布" :value="2"></el-option>
-                        <el-option label="未发布" :value="1"></el-option>
-                    </el-select>
-                </el-form-item>
-                <el-form-item label="" v-if="isApprove">
-                    <el-select
-                        v-model.number="searchform.publishState"
-                        placeholder="状态筛选"
-                        size="medium"
-                        clearable
-                        style="width: 140px"
-                        @change="search"
-                    >
-                        <el-option label="待提交" :value="1"></el-option>
-                        <el-option label="待审批" :value="2"></el-option>
-                        <el-option label="已审批" :value="4"></el-option>
-                        <el-option label="已驳回" :value="3"></el-option>
-                    </el-select>
-                </el-form-item>
                 <!-- <el-form-item label="">
                     <el-select
                         v-permission="permissionBtn.smartReportManageBtn.reportManage_reportList_sendTime"
@@ -108,7 +126,7 @@
                         <el-option label="已推送消息" :value="2"></el-option>
                     </el-select>
                 </el-form-item> -->
-                <el-form-item>
+                <el-form-item style="flex:1;text-align:right;">
                     <el-input
                         @input="search"
                         placeholder="标题 / 创建人 / 更新人"
@@ -137,6 +155,7 @@
                     label="报告标题"
                     align="center"
                     min-width="140"
+                    fixed
                 >
                     <template slot-scope="scope">
                     <div @click="lookreportdtl(scope.row)">
@@ -166,6 +185,7 @@
                     label="摘要"
                     align="center"
                     min-width="140"
+                    fixed
                 ></el-table-column>
                 <el-table-column label="报告类型" align="center" min-width="140">
                     <template slot-scope="scope"
@@ -262,7 +282,7 @@
                     >{{ hasUV? scope.row.Pv+'/'+scope.row.Uv:scope.row.Pv }}</template
                     >
                 </el-table-column>
-                <el-table-column label="操作" align="center" min-width="130">
+                <el-table-column label="操作" align="center" min-width="130" fixed="right">
                     <template slot-scope="scope">
                     <div class="opt-btns">
                         <!-- 不走审批流的按钮 -->
@@ -560,7 +580,8 @@ export default {
             isDSFB:false,
 
             reportImgUrl:'',
-            showReportImg:false
+            showReportImg:false,
+            selectNum:1
         }
     },
     methods:{
@@ -754,6 +775,17 @@ export default {
         //搜索
         search() {
             this.ispage = false;
+            this.selectNum = 1;
+            //检测筛选项的值,更新selectNum;
+            //frequency:string;classifynameArr:array;publishState:number;
+            ['frequency','classifynameArr','publishState'].forEach(key=>{
+                const keyType = typeof(this.searchform[key])
+                if(this.searchform[key]&&keyType!=='object')
+                    this.selectNum++;
+                if(keyType==='object'&&this.searchform[key].length>0)
+                    this.selectNum++;
+            })
+
             this.$nextTick(() => {
                 this.PageIndex = 1;
                 this.getReportList();
@@ -907,8 +939,47 @@ export default {
 }
 </script>
 
-<style lang='scss' scoped>
+<style lang="scss">
+.report-select-popover{
+    .select-wrap{
+          padding:8px;
+          margin:0 20px;
+          .select-item{
+              margin-top:20px;
+          }
+      }
+}
+</style>
+<style lang="scss" scoped>
 .smart-report-list{
+    .select-btn{
+        cursor: pointer;
+        width:120px;
+        height: 36px;
+        text-align: center;
+        background-color: #ECF2FE;
+        border-radius: 4px;
+        box-sizing: border-box;
+        line-height:36px;
+        img,span{
+            display: inline-block;
+            vertical-align: middle;
+        }
+        .select-num{
+            width:20px;
+            height:20px;
+            line-height: 20px;
+            border-radius: 50%;
+            background-color:#0052D9;
+            color:white;
+            font-size: 12px;
+        }
+    }
+    .header{
+        .el-form-item{
+            margin-bottom: 0;
+        }
+    }
     .report-img-box{
         position: fixed;
         left: 0;

+ 1 - 1
src/views/supply_manage/components/plantTable.vue

@@ -169,7 +169,7 @@ export default {
         {
           label: '地点',
           key: 'address',
-          minwidthsty: '120px'
+          minwidthsty: '140px'
         },
         {
           label: '工厂',

+ 3 - 2
src/views/system_manage/departManage.vue

@@ -77,6 +77,7 @@
 					<el-table-column
 					prop="RealName"
 					label="姓名"
+					width="200"
 					align="center">
 						<template slot-scope="scope">
 							<el-tag size="small" 
@@ -113,7 +114,7 @@
 							<span :style="{color:scope.row.Enabled===0?'#FF0000':null}">{{scope.row.Enabled===0?'禁用':'启用'}}</span>
 						</template>
 					</el-table-column>
-					<el-table-column label="操作" align="center" width="300">
+					<el-table-column label="操作" align="center" width="300" fixed="right">
 						<template slot-scope="scope">
 							<div style="color:#4099ef; font-size:24px;display: flex;gap:0 10px;">
 								<span  v-permission="permissionBtn.sysDepartPermission.sysDepart_saveUser"
@@ -1408,7 +1409,7 @@ export default {
 				top: 0;
 				bottom: 0;
 				overflow-y: hidden;
-				z-index: 2;
+				z-index: 3;
 				box-shadow: -3px 0 6px rgba(0, 0, 0, 0.1);
 				border: 1px solid #ececec;
 				padding: 60px 30px;

+ 2 - 0
src/views/system_manage/enAuthManage.vue

@@ -38,6 +38,7 @@
           :key="item.label"
           :label="item.label"
           :prop="item.key"
+          :width="item.width"
           align="center"
         >
           <template slot-scope="{ row }">
@@ -150,6 +151,7 @@ export default {
         {
           label: "姓名",
           key: "RealName",
+          width:"200"
         },
         {
           label: "手机号",

+ 2 - 2
src/views/system_manage/etaBaseConfig.vue

@@ -148,7 +148,7 @@
                         </el-form-item>
                     </div>
                     
-                    <el-form-item label="PPT封面图" prop="CnPptCoverImgs">
+                    <el-form-item label="PPT封面图" prop="CnPptCoverImgs" style="min-width:400px;">
                         <div class="input-line" style="display:flex;">
                             <ImgUpload 
                                 :imgUrl="formData.CnPptCoverImgs.length===3?formData.CnPptCoverImgs[2]:''"
@@ -197,7 +197,7 @@
                             <el-input type="color" style="width:64px;" v-model="formData.PptFontColorEn"></el-input>
                         </el-form-item>
                     </div>
-                    <el-form-item label="PPT封面图" prop="EnPptCoverImgs">
+                    <el-form-item label="PPT封面图" prop="EnPptCoverImgs" style="min-width:400px;">
                         <div class="input-line" style="display:flex;">
                             <ImgUpload 
                                 :imgUrl="formData.EnPptCoverImgs.length===3?formData.EnPptCoverImgs[2]:''"

+ 14 - 14
src/views/system_manage/operateAuthManage.vue

@@ -4,22 +4,21 @@
       <ul class="tab-ul">
         <li :class="['tab-li',{act: default_tab===item.key}]" v-for="item in authTabs" :key="item.key" @click="changeTab(item)">{{item.label}}</li>
       </ul>
-
-      <div class="right-side" v-if="authTabs.length">
-        <el-input 
-          v-model="searchForm.key_word" 
-          :placeholder="default_tab === 5 ? '请输入图表名称' : '请输入指标Id/指标名称'" 
-          style="width: 300px"
-          @change="changeUser"
-          clearable
-        >
-          <i slot="prefix" class="el-input__icon el-icon-search"/>
-        </el-input>
-      </div>
     </div>
 
     <div class="top">
         <div v-if="authTabs.length">
+            <el-input 
+            v-model="searchForm.key_word" 
+            :placeholder="default_tab === 5 ? '请输入图表名称' : '请输入指标Id/指标名称'" 
+            style="width: 300px;margin-right:20px;"
+            @change="changeUser"
+            clearable
+            >
+            <i slot="prefix" class="el-input__icon el-icon-search"/>
+            </el-input>
+        </div>
+        <div v-if="authTabs.length" style="margin-right:auto;">
           <el-cascader
             v-model="searchForm.classification"
             :options="classificationList"
@@ -101,7 +100,7 @@
           <tableNoData text="暂无数据" size="mini"/>
 				</div>
     </el-table>
-    <el-col :span="24" style="height:35px">
+    <el-col :span="24" style="height:35px;text-align: right;float: none;">
       <m-page
         :page_no="page_no"
         :pageSize="pageSize"
@@ -419,7 +418,8 @@ export default {
 
 <style lang="scss" scoped>
 .container {
-  min-height: calc(100vh - 160px);
+  box-sizing: border-box;
+  min-height: calc(100vh - 120px);
   padding: 20px 30px;
   background: #fff;
   position: relative;

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

@@ -266,6 +266,9 @@ export default {
 </script>
 <style lang='scss' >
 .roleManage_container {
+	min-height: calc(100vh - 120px);
+	display: flex;
+	flex-direction: column;
 	/* reset */
 	.el-form-item__label {
 		font-size: 16px;
@@ -285,7 +288,8 @@ export default {
 		box-shadow: 0 3px 6px rgba(0, 0, 0, 0.05);
 	}
 	.role_bot {
-		min-height: calc(100vh - 260px);
+		flex: 1;
+		//min-height: calc(100vh - 260px);
 		padding: 20px 30px;
 		background: #fff;
 		margin-top: 20px;

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

@@ -21,8 +21,8 @@ const setSandboxToolStatus=(state,payload)=>{
 			lineStyle:null,
 			lineWidth:2,
 			connectStyle:1,
-			startArrow:{},
-			endArrow:{}
+			startArrow:'',
+			endArrow:''
 		}
 		return 
 	}else{
@@ -107,9 +107,9 @@ const setSandboxToolStatus=(state,payload)=>{
 		// 设置connectStyle回显
 		state.styleOptions.connectStyle=connectStyleSet.size==1?Array.from(connectStyleSet)[0]:1
 		// 设置sourceMarker回显
-		state.styleOptions.startArrow=startArrowSet.size==1?Array.from(startArrowSet)[0]||{}:{}
+		state.styleOptions.startArrow=startArrowSet.size==1?Array.from(startArrowSet)[0]||'':''
 		// 设置targetMarker回显
-		state.styleOptions.endArrow=endArrowSet.size==1?Array.from(endArrowSet)[0]||{}:{}
+		state.styleOptions.endArrow=endArrowSet.size==1?Array.from(endArrowSet)[0]||'':''
 	}
 }
 
@@ -153,8 +153,8 @@ const sand = {
 			lineStyle:null,
 			lineWidth:2,
 			connectStyle:1,
-			startArrow:{},
-			endArrow:{}
+			startArrow:'',
+			endArrow:''
 		},
 		selectCells:[]
 	}),

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 1
static/js/jquery.min.js


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä