Bläddra i källkod

Merge branch 'master' of http://nokia.tianhaikj.tk:13000/other/hb_nokia_pm_ui

wangrulan 1 år sedan
förälder
incheckning
b7a27ae646

+ 28 - 4
pom.xml

@@ -14,7 +14,12 @@
 	<name>hb</name>
 	<description>hb_nokia</description>
 	<properties>
-		<java.version>1.8</java.version>
+		<java.version>8</java.version>
+		<maven.compiler.source>${java.version}</maven.compiler.source>
+		<maven.compiler.target>${java.version}</maven.compiler.target>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>${project.build.sourceEncoding}</project.reporting.outputEncoding>
+		<skipTests>true</skipTests>
 	</properties>
 
 	<dependencies>
@@ -30,7 +35,11 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
 		</dependency>
-
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-configuration-processor</artifactId>
+			<optional>true</optional>
+		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-devtools</artifactId>
@@ -47,13 +56,25 @@
 			<artifactId>postgresql</artifactId>
 			<version>42.3.5</version>
 		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
+		<dependency>
+			<groupId>org.projectlombok</groupId>
+			<artifactId>lombok</artifactId>
+			<version>1.18.24</version>
+			<scope>provided</scope>
+		</dependency>
 		<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
 		<dependency>
 			<groupId>com.alibaba</groupId>
 			<artifactId>fastjson</artifactId>
-			<version>2.0.9.graal</version>
+			<version>2.0.22</version>
+		</dependency>
+		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.12.0</version>
 		</dependency>
-
 	</dependencies>
 
 	<build>
@@ -76,6 +97,9 @@
 				<groupId>org.springframework.boot</groupId>
 				<artifactId>spring-boot-maven-plugin</artifactId>
 				<version>2.5.4</version>
+				<configuration>
+					<fork>true</fork>
+				</configuration>
 			</plugin>
 		</plugins>
 	</build>

+ 0 - 19
src/main/java/com/nokia/hb/config/MyWebMvcConfigurer.java

@@ -1,19 +0,0 @@
-package com.nokia.hb.config;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-@Configuration
-public class MyWebMvcConfigurer implements WebMvcConfigurer {
-    /**
-     * 注册拦截器
-     */
-    @Override
-    public void addInterceptors(InterceptorRegistry registry) {
-        InterceptorRegistration ir = registry.addInterceptor(new LoginHandlerInterceptor());
-        ir.addPathPatterns("/**");
-        ir.excludePathPatterns("/login", "/userLogin", "/js/**", "/html/**", "/image/**", "/css/**");
-    }
-}

+ 1 - 1
src/main/java/com/nokia/hb/config/LoginHandlerInterceptor.java → src/main/java/com/nokia/hb/config/web/LoginHandlerInterceptor.java

@@ -1,4 +1,4 @@
-package com.nokia.hb.config;
+package com.nokia.hb.config.web;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

+ 14 - 0
src/main/java/com/nokia/hb/config/web/MyDispatcherServlet.java

@@ -0,0 +1,14 @@
+package com.nokia.hb.config.web;
+
+import org.springframework.web.servlet.DispatcherServlet;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class MyDispatcherServlet extends DispatcherServlet {
+    @Override
+    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        // 替换request和response
+        super.doDispatch(new MyHttpServletRequestWrapper(request), new MyHttpServletResponseWrapper(response));
+    }
+}

+ 54 - 0
src/main/java/com/nokia/hb/config/web/MyHttpServletRequestWrapper.java

@@ -0,0 +1,54 @@
+package com.nokia.hb.config.web;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.StreamUtils;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.*;
+
+/**
+ * 解决流只能读取一次问题
+ */
+@Slf4j
+public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
+    private byte[] bytes;
+
+    public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+        bytes = StreamUtils.copyToByteArray(request.getInputStream());
+    }
+
+    @Override
+    public ServletInputStream getInputStream() {
+        ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
+        return new ServletInputStream() {
+            @Override
+            public boolean isFinished() {
+                return false;
+            }
+
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+
+            @Override
+            public void setReadListener(ReadListener readListener) {
+                //
+            }
+
+            @Override
+            public int read() {
+                return stream.read();
+            }
+        };
+    }
+
+    @Override
+    public BufferedReader getReader() throws UnsupportedEncodingException {
+        return new BufferedReader(new InputStreamReader(getInputStream(), super.getCharacterEncoding()));
+    }
+}

+ 47 - 0
src/main/java/com/nokia/hb/config/web/MyHttpServletResponseWrapper.java

@@ -0,0 +1,47 @@
+package com.nokia.hb.config.web;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * 解决流只能读取一次问题
+ */
+public class MyHttpServletResponseWrapper extends HttpServletResponseWrapper {
+    private ByteArrayOutputStream byteArrayOutputStream;
+    private ServletOutputStream servletOutputStream;
+
+    public MyHttpServletResponseWrapper(HttpServletResponse response) {
+        super(response);
+        byteArrayOutputStream = new ByteArrayOutputStream();
+        servletOutputStream = new ServletOutputStream() {
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+
+            @Override
+            public void setWriteListener(WriteListener writeListener) {
+                //
+            }
+
+            @Override
+            public void write(int b) throws IOException {
+                response.getOutputStream().write(b);
+                byteArrayOutputStream.write(b);
+            }
+        };
+    }
+
+    @Override
+    public ServletOutputStream getOutputStream() {
+        return servletOutputStream;
+    }
+
+    public byte[] toByteArray() {
+        return byteArrayOutputStream.toByteArray();
+    }
+}

+ 62 - 0
src/main/java/com/nokia/hb/config/web/MyWebMvcConfigurer.java

@@ -0,0 +1,62 @@
+package com.nokia.hb.config.web;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.DispatcherServlet;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class MyWebMvcConfigurer implements WebMvcConfigurer {
+    @Value("${redis.timeoutSeconds:600}")
+    private Integer timeoutSeconds;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        // 添加请求日志拦截
+        registry.addInterceptor(new RequestLogHandlerInterceptor())
+                .addPathPatterns("/**")
+                .excludePathPatterns("/", "/login", "/template", "/error", "/js/**", "/html/**", "/image/**", "/css/**");
+        // 添加web登录拦截
+        registry.addInterceptor(new LoginHandlerInterceptor())
+                .addPathPatterns("/**")
+                .excludePathPatterns("/login", "/error", "/userLogin", "/js/**", "/html/**", "/image/**", "/css/**");
+    }
+
+    /**
+     * 使用自定义DispatcherServlet
+     */
+    @Bean
+    @Qualifier(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
+    public DispatcherServlet dispatcherServlet() {
+        return new MyDispatcherServlet();
+    }
+
+//    /**
+//     * 配置消息转换器
+//     *
+//     * @param converters 转换器
+//     */
+//    @Override
+//    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+//        converters.add(mappingJackson2HttpMessageConverter());
+//    }
+//
+//    /**
+//     * 配置映射jackson2 http消息转换器
+//     *
+//     * @return {@link MappingJackson2HttpMessageConverter}
+//     */
+//    @Bean
+//    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
+//        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+//        ObjectMapper mapper = new ObjectMapper();
+//        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+//        mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
+//        converter.setObjectMapper(mapper);
+//        return converter;
+//    }
+}

+ 76 - 0
src/main/java/com/nokia/hb/config/web/RequestLogHandlerInterceptor.java

@@ -0,0 +1,76 @@
+package com.nokia.hb.config.web;
+
+import com.alibaba.fastjson2.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.lang.Nullable;
+import org.springframework.util.StopWatch;
+import org.springframework.util.StreamUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.nio.charset.Charset;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 请求日志拦截器
+ */
+@Slf4j
+public class RequestLogHandlerInterceptor implements HandlerInterceptor {
+    /**
+     * 计时器线程变量
+     */
+    private static final ThreadLocal<StopWatch> STOP_WATCH_THREAD_LOCAL = new ThreadLocal<>();
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+        // 计时器放入线程变量
+        STOP_WATCH_THREAD_LOCAL.set(stopWatch);
+        // 日志添加跟踪id
+        MDC.put("traceId", UUID.randomUUID().toString().replace("-", ""));
+        log.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
+        // 请求头参数
+        Map<String, String> headers = new HashMap<>();
+        Enumeration<String> headerNames = request.getHeaderNames();
+        while (headerNames.hasMoreElements()) {
+            String k	= headerNames.nextElement();
+            String v = request.getHeader(k);
+            headers.put(k, v);
+        }
+        log.info("请求头参数: {}", JSON.toJSONString(headers));
+        // 查询参数
+        Map<String, String> parameters = new HashMap<>();
+        Enumeration<String> parameterNames = request.getParameterNames();
+        while (parameterNames.hasMoreElements()) {
+            String k	= parameterNames.nextElement();
+            String v = request.getParameter(k);
+            parameters.put(k, v);
+        }
+        log.info("查询参数: {}", JSON.toJSONString(parameters));
+        // 请求体参数
+        String body = StreamUtils.copyToString(request.getInputStream(), Charset.forName(request.getCharacterEncoding()));
+        log.info("请求参数: {}", StringUtils.trimAllWhitespace(body));
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
+                                @Nullable Exception ex) throws Exception {
+        MyHttpServletResponseWrapper wrapper = (MyHttpServletResponseWrapper) response;
+        String responseString = new String(wrapper.toByteArray());
+        // 返回结果打印前100个字符
+        log.info("返回 {}: {}", wrapper.getStatus(),
+                org.apache.commons.lang3.StringUtils.substring(responseString, 0, 100));
+        StopWatch stopWatch = STOP_WATCH_THREAD_LOCAL.get();
+        stopWatch.stop();
+        log.info("耗时 {} ms", stopWatch.getTotalTimeMillis());
+        STOP_WATCH_THREAD_LOCAL.remove();
+    }
+}

+ 30 - 31
src/main/java/com/nokia/hb/utils/DbUtil.java

@@ -16,18 +16,18 @@ public class DbUtil {
     private static final Logger log = LoggerFactory.getLogger(DbUtil.class);
     private static Connection conn = null;
 
-    // private final static String url =
+    // private static final String URL =
     // "jdbc:postgresql://127.0.0.1:5432/postgres";
-    // private final static String user = "postgres";
-    // private final static String password = "ava1234";
+    // private static final String USER = "postgres";
+    // private static final String PASSWORD = "ava1234";
 
-    private final static String url = "jdbc:postgresql://10.100.68.195:5432/sqmmt";
-    private final static String user = "pmparse";
-    private final static String password = "abc123!";
+    private static final String URL = "jdbc:postgresql://10.100.68.195:5432/sqmmt";
+    private static final String USER = "pmparse";
+    private static final String PASSWORD = "abc123!";
 
     static {
         try {
-            conn = DriverManager.getConnection(url, user, password);
+            conn = DriverManager.getConnection(URL, USER, PASSWORD);
         } catch (SQLException e) {
             e.printStackTrace();
         }
@@ -60,17 +60,27 @@ public class DbUtil {
         String[] timeArray = sdate.split(" - ");
         String startTime = timeArray[0];
         String endTime = timeArray[1];
-        String sql = "select a.cellname,a.city,a.quxian,a.vendor,b.* from \n(select eci,cellname,city,quxian,vendor from pm_parse.per_cfg_cell where "
-                + searchType + " in (" + condition + ")) a\ninner join \n(select " + indicators
-                + " from pm_parse.pm_4g_" + ttype + " where sdate>='" + startTime + "' and sdate <= '" + endTime
-                + "') b\n" + "on a.eci=b.eci";
+        condition = condition.replace(",", "','");
+        log.debug("condition: {}", condition);
+        // eci
+        String sql = "select a.cellname,a.city,a.quxian,a.vendor,b.*"
+                + " from (select eci, cellname, city, quxian, vendor"
+                    + " from pm_parse.per_cfg_cell"
+                    + " where eci in (" + condition + ")) a"
+                + " inner join (select " + indicators + " from pm_parse.pm_4g_" + ttype
+                    + " where sdate >= '" + startTime
+                    + "' and sdate <= '" + endTime + "') b"
+                + " on a.eci = b.eci";
         // 全网
         if ("all".equals(searchType)) {
-            sql = "select a.cellname,a.city,a.quxian,a.vendor,b.* from pm_parse.per_cfg_cell a\ninner join \n(select "
-                    + indicators + " from pm_parse.pm_4g_" + ttype + " where sdate>='" + startTime + "' and sdate <= '"
-                    + endTime + "') b\n" + "on a.eci=b.eci";
+            sql = "select a.cellname, a.city, a.quxian, a.vendor, b.* from pm_parse.per_cfg_cell a"
+                    + " inner join (select " + indicators + " from pm_parse.pm_4g_" + ttype
+                        + " where sdate >= '" + startTime
+                        + "' and sdate <= '" + endTime + "') b"
+                    + " on a.eci = b.eci";
         }
 
+        log.debug("sql: {}", sql);
         List<Map<String, String>> datas = new ArrayList<>();
         List<Col> cols = new ArrayList<>();
         try {
@@ -125,23 +135,12 @@ public class DbUtil {
         String startTime = timeArray[0];
         String endTime = timeArray[1];
 
-        String sql = "select b.* from \n" +
-                "(select eci from pm_parse.per_cfg_cell where quxian in (" + quxians + ")) a\n" +
-                "inner join \n" +
-                "(select eci," + indicators + " from pm_parse.pm_4g_" + ttype +
-                " where sdate>='" + startTime +
-                "' and sdate <= '" + endTime + "') b\n" +
-                "on a.eci=b.eci";
-
-        if (indicators.contains("eci")) {
-            sql = "select b.* from \n" +
-                    "(select eci from pm_parse.per_cfg_cell where quxian in (" + quxians + ")) a\n" +
-                    "inner join \n" +
-                    "(select " + indicators + " from pm_parse.pm_4g_" + ttype +
-                    " where sdate>='" + startTime +
-                    "' and sdate <= '" + endTime + "') b\n" +
-                    "on a.eci=b.eci";
-        }
+        String sql = "select b.* from (select eci from pm_parse.per_cfg_cell where quxian in (" + quxians + ")) a"
+                + " inner join (select " + indicators + " from pm_parse.pm_4g_" + ttype
+                + " where sdate >= '" + startTime
+                + "' and sdate <= '" + endTime + "') b"
+                + " on a.eci = b.eci";
+        log.debug("sql: {}", sql);
         List<Map<String, String>> datas = new ArrayList<>();
         List<Col> cols = new ArrayList<>();
         try {

+ 41 - 3
src/main/resources/logback-spring.xml

@@ -1,12 +1,50 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
+    <property name="PATH" value="./log"/>
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
-            <Pattern>%d %highlight(%-5level) %blue(%logger:%line) %msg%n</Pattern>
+            <Pattern>%d{HH:mm:ss.SSS} %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
+            <charset>UTF-8</charset>
         </encoder>
     </appender>
-
+    <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${PATH}/trace.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- rollover daily -->
+            <fileNamePattern>${PATH}/trace.%d{yyyy-MM-dd_HH}.%i.log</fileNamePattern>
+            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>60</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <Pattern>%d %highlight(%-5level) %yellow(%X{traceId}) %magenta([%thread]) %cyan(%logger:%line) %msg%n</Pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${PATH}/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <!-- rollover daily -->
+            <fileNamePattern>${PATH}/error.%d{yyyy-MM-dd_HH}.%i.log</fileNamePattern>
+            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>60</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <Pattern>%d %-5level %X{traceId} [%thread] %logger:%line %msg%n</Pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
     <root level="INFO">
         <appender-ref ref="STDOUT"/>
+        <appender-ref ref="TRACE_FILE"/>
+        <appender-ref ref="ERROR_FILE"/>
     </root>
-</configuration>
+</configuration>

+ 16 - 64
src/main/resources/templates/template.html

@@ -160,9 +160,7 @@
             tree = layui.tree;
             layer = layui.layer;
             table = layui.table;
-            var form = layui.form,
-
-                laydate = layui.laydate;
+            var form = layui.form, laydate = layui.laydate;
             // layer.msg('Hello Zhou')
             table.render({
                 elem: '#demo',
@@ -184,7 +182,6 @@
                 ],
                 data: []
             });
-
             //工具条事件
             table.on('toolbar(test)', function (obj) { //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
                 var data = obj.data; //获得当前行数据
@@ -202,7 +199,6 @@
                 type: 'datetime',
                 range: true,
             });
-
             initTreeCity(tree)
             initTreeIndicator(tree)
             initTreeIndicatorTemplate(tree)
@@ -225,7 +221,6 @@
                     if (!o) {
                         r = JSON.parse(r)
                     }
-
                     treeCity = tree.render({
                         elem: '#allArea',
                         showCheckbox: true,
@@ -233,14 +228,9 @@
                         id: 'Id1',
                         data: r
                     });
-
-
                     return false;
-
                 }
-
             });
-
         }
 
         var treeIn;
@@ -258,7 +248,6 @@
                     if (!o) {
                         r = JSON.parse(r)
                     }
-
                     treeIn = tree.render({
                         elem: '#indicatorTemplate',
                         showCheckbox: true,
@@ -280,13 +269,11 @@
                     "spread": false
                 },
                 success: function (r) {
-
                     // console.log(r)
                     let o = r instanceof Object
                     if (!o) {
                         r = JSON.parse(r)
                     }
-
                     treeIn = tree.render({
                         elem: '#allIndicator',
                         showCheckbox: true,
@@ -294,19 +281,13 @@
                         id: 'Id2',
                         data: r
                     });
-
-
                     return false;
-
                 }
-
             });
-
         }
 
         function renderTable(table, citys, quxians, indicators, ttype, sdate) {
             console.log('renderTable')
-
             $.ajax({
                 type: "POST",
                 url: './renderTable',
@@ -325,12 +306,10 @@
                         alert(r.msg);
                         return;
                     }
-
                     let o = r instanceof Object
                     if (!o) {
                         r = JSON.parse(r)
                     }
-
                     table.render({
                         elem: '#demo',
                         height: 320,
@@ -351,19 +330,13 @@
                         ],
                         data: r.datas
                     });
-
-
                     return false;
-
                 }
-
             });
-
         }
 
         function conditionRenderTable(table, condition, searchType, indicators, ttype, sdate) {
             console.log('conditionRenderTable')
-
             $.ajax({
                 type: "POST",
                 url: './conditionRenderTable',
@@ -382,7 +355,6 @@
                     if (!o) {
                         r = JSON.parse(r)
                     }
-
                     table.render({
                         elem: '#demo',
                         height: 320,
@@ -403,31 +375,25 @@
                         ],
                         data: r.datas
                     });
-
-
                     return false;
-
                 }
-
             });
-
         }
 
         function search() {
             // form.on('submit(formDemo)', function (data) {
-            if ($('#time1').val() == 0) {
+            if ($('#time1').val() === 0) {
                 alert('填选择时间')
                 return;
             }
-            if (tree.getChecked('Id1').length == 0) {
+            if (tree.getChecked('Id1').length === 0) {
                 alert('请选择地市')
                 return;
             }
-            if (tree.getChecked('Id3').length == 0) {
+            if (tree.getChecked('Id3').length === 0) {
                 alert('请选择指标')
                 return;
             }
-
            alert('开始查询')
             // layer.msg(JSON.stringify(data.field));
             console.log(JSON.stringify(tree.getChecked('Id1')))
@@ -435,7 +401,6 @@
             let checkData2 = tree.getChecked('Id3')[0].children;
             console.log(checkData1)
             console.log(checkData2)
-
             const quxianA = new Set();
             var citysA = [];
             checkData1.forEach(eee => {
@@ -444,33 +409,30 @@
                     quxianA.add("'" + ee.title + "'")
                 })
             });
-
             const quxians = Array.from(quxianA).join(',')
             citys = citysA.join(',')
             console.log(`citys: ${citys}`)
             console.log(`quxians: ${quxians}`)
-            var indicatorsA = new Set();
+            const indicatorsA = new Set();
             checkData2.forEach(eee => {
                 eee.children.forEach(ee => {
                     indicatorsA.add(ee.id)
                 })
             });
+            indicatorsA.add('eci')
             const indicators = Array.from(indicatorsA).join(',')
             console.log(`indicators: ${JSON.stringify(indicators)}`)
             let ttype = $('#timeType').val()
             let sdate = $('#time1').val()
             console.log(`sdate: ${sdate}`)
             renderTable(table, citys, quxians,indicators, ttype, sdate)
-
             return false;
         }
 
-
-
         function conditionSearch() {
             let sdate = $('#time1').val()
-            if (sdate.length == 0) {
-                alert('选择时间')
+            if (sdate.length === 0) {
+                alert('选择时间')
                 return;
             }
 
@@ -478,35 +440,29 @@
                 alert('请选择指标')
                 return;
             }
-
             let condition = $('#condition').val();
             let ttype = $('#timeType').val()
             let searchType = $('#searchType').find('input:checked').val()
-            if (searchType === 'eci' && $('#condition').val().length == 0) {
-                alert('填写查询条件')
+            if (searchType === 'eci' && $('#condition').val().length === 0) {
+                alert('填写查询条件')
                 return;
             }
-
             console.log(`searchType: ${searchType}`)
             console.log(`condition: ${condition}`)
             // layer.msg(JSON.stringify(data.field));
             // let checkData1 = tree.getChecked('Id1')[0].children;
-
             let checkData2 = tree.getChecked('Id3')[0].children;
-
-
-            var indicatorsA = new Array();
+            const indicatorsA = new Set();
             checkData2.forEach(eee => {
                 eee.children.forEach(ee => {
-
-                    indicatorsA.push(ee.id)
-
+                    indicatorsA.add(ee.id)
                 })
             });
-            indicators = indicatorsA.join(',')
-            // console.log(indicators)
+            indicatorsA.add('eci')
+            const indicatorsB = [...indicatorsA]
+            const indicators = indicatorsB.join(',')
+            console.log(`indicators: ${indicators}`)
             conditionRenderTable(table, condition, searchType, indicators, ttype, sdate)
-
             return false;
         }
 
@@ -525,13 +481,11 @@
                         alert('请输入模板名称!')
                         return
                     }
-
                     const checkedData = tree?.getChecked('Id2')?.[0]?.children
                     if (!checkedData || checkedData.length <= 0) {
                         alert('请选择指标!')
                         return
                     }
-
                     console.log(`templateName: ${templateName}`)
                     console.log(`checkedData: ${JSON.stringify(checkedData)}`)
                     const indicatorsA = []
@@ -573,12 +527,10 @@
             checkedData.forEach(t => {
                 idArray.push(t.id)
             });
-
             if (!checkedData || checkedData.length <= 0) {
                 alert('请选择要删除的指标模板!')
                 return
             }
-
             layer.confirm('确认删除?', {icon: 3, title:'删除模板'}, function(index){
                 const ids = idArray.join(',')
                 console.log(`deleteTemplate: ${JSON.stringify(idArray)}`)