Bläddra i källkod

帕科五期项目管理机票火车票同步问题更新

fyz 2 månader sedan
förälder
incheckning
20d8fc0e71

+ 6 - 0
mjava-pake/pom.xml

@@ -71,6 +71,12 @@
             <artifactId>dingtalk</artifactId>
             <version>1.4.35</version>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 1
mjava-pake/src/main/java/com/malk/pake/schedule/ScheduleTask.java

@@ -114,7 +114,7 @@ public class ScheduleTask {
      * 阿里商旅机票
      * 每天00:30获取阿里商旅机票昨日数据
      */
-    @Scheduled(cron = "0 30 0 * * ?")
+    @Scheduled(cron = "0 30 1 * * ?")
     public void getAirInternal() {
         log.info("阿里商旅机票");
         LocalDate now = LocalDate.now();

+ 14 - 2
mjava-pake/src/main/java/com/malk/pake/service/impl/PkProjectServiceImpl.java

@@ -14,6 +14,7 @@ import com.malk.service.dingtalk.DDClient_Notice;
 import com.malk.service.dingtalk.DDClient_Workflow;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.map.HashedMap;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -135,6 +136,9 @@ public class PkProjectServiceImpl implements PkProjectService {
             Double OAEntertainSum = 0.0;//OA招待费用
             Double OAOtherSum = 0.0;//OA其他费用
             optional = formComponentValues.stream().filter(item -> "项目编号".equals(item.get("name"))).findAny();
+            if (!optional.isPresent()){
+                return;
+            }
             String projectCode = UtilMap.getString((Map) optional.get(), "value");
             optional = formComponentValues.stream().filter(item -> "费用报销类型".equals(item.get("name"))).findAny();
             String type = UtilMap.getString((Map) optional.get(), "value");
@@ -463,7 +467,7 @@ public class PkProjectServiceImpl implements PkProjectService {
         if (ObjectUtil.isNotNull(jsonObject)){
             List<Object> objects = new ArrayList<>();
             int totalNum = Integer.parseInt(jsonObject.get("total_num").toString());
-            int totalPages = (int) Math.ceil(totalNum / pageSize);
+            int totalPages = (int) Math.ceil(totalNum / pageSize) + 1;
             for (int i = 1; i <= totalPages; i++) {
                 param.put("page_no",i);
                 JSONObject result = toRequest(url, param);
@@ -475,6 +479,7 @@ public class PkProjectServiceImpl implements PkProjectService {
         return null;
     }
     //获取module里的数据
+    @SneakyThrows
     public static JSONObject toRequest(String url, Map<String,Object> param){
         final String[] redirectUrl = {url};
         param.forEach((k,v)->{
@@ -485,7 +490,14 @@ public class PkProjectServiceImpl implements PkProjectService {
         }
         String result = HttpUtils.httpGet(redirectUrl[0]);
         JSONObject jsonObject = JSONObject.parseObject(result);
-        if (ObjectUtil.isNotNull(jsonObject) && Boolean.parseBoolean(jsonObject.get("success").toString())){
+        boolean success = Boolean.parseBoolean(jsonObject.get("success").toString());
+        while (!success){
+            result = HttpUtils.httpGet(redirectUrl[0]);
+            jsonObject = JSONObject.parseObject(result);
+            success = Boolean.parseBoolean(jsonObject.get("success").toString());
+            Thread.sleep(1000);
+        }
+        if (ObjectUtil.isNotNull(jsonObject) && success){
             Object module = jsonObject.get("module");
             jsonObject = JSONObject.parseObject(module.toString());
             return jsonObject;

+ 285 - 0
mjava-pake/src/main/java/com/malk/pake/utils/HttpUtils.java

@@ -0,0 +1,285 @@
+package com.malk.pake.utils;
+
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.config.SocketConfig;
+import org.apache.http.conn.DnsResolver;
+import org.apache.http.conn.HttpConnectionFactory;
+import org.apache.http.conn.ManagedHttpClientConnection;
+import org.apache.http.conn.routing.HttpRoute;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.DefaultConnectionReuseStrategy;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
+import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.impl.conn.SystemDefaultDnsResolver;
+import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
+import org.apache.http.impl.io.DefaultHttpResponseParserFactory;
+import org.apache.http.util.EntityUtils;
+
+import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * http请求封装
+ *
+ * @author lh
+ * @date 2022-09-23
+ */
+@Slf4j
+public class HttpUtils {
+
+    /**
+     * 默认请求类型
+     */
+    private static final String DEFAULT_CONTENT_TYPE = "application/json";
+
+    /**
+     * 默认编码
+     */
+    private static final String DEFAULT_ENCODING = "utf-8";
+
+    /**
+     * GBK编码
+     */
+    private static final String GBK_ENCODING = "GBK";
+
+    /**
+     * 默认超时时间
+     */
+    private static final int DEFAULT_TIME_OUT = 60;
+
+    private static PoolingHttpClientConnectionManager manager = null;
+
+    private static CloseableHttpClient httpClient = null;
+
+    /**
+     * 获取httpclient对象
+     *
+     * @return
+     */
+    public static synchronized CloseableHttpClient getHttpClient(int timeOut) {
+        if (null == httpClient) {
+            log.info("============================================创建");
+            // 注册访问协议相关的socket工厂
+            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+                    .register("http", PlainConnectionSocketFactory.INSTANCE)
+                    .register("https", SSLConnectionSocketFactory.getSystemSocketFactory())
+                    .build();
+
+            // httpConnection工厂
+            HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connectionFactory =
+                    new ManagedHttpClientConnectionFactory(DefaultHttpRequestWriterFactory.INSTANCE
+                            , DefaultHttpResponseParserFactory.INSTANCE);
+
+            // DNS解析器
+            DnsResolver dnsResolver = SystemDefaultDnsResolver.INSTANCE;
+            // 创建池化连接管理器
+            manager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, connectionFactory, dnsResolver);
+            // socket配置
+            SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
+            manager.setDefaultSocketConfig(socketConfig);
+            // 连接池最大连接数
+            manager.setMaxTotal(300);
+            manager.setDefaultMaxPerRoute(200);
+            // 5s检测一次连接池连接
+            manager.setValidateAfterInactivity(5 * 1000);
+            // 默认请求配置
+            RequestConfig requestConfig = RequestConfig.custom()
+                    // 连接超时时间
+                    .setConnectTimeout(timeOut * 1000)
+                    // 等待数据超时时间
+                    .setSocketTimeout(timeOut * 1000)
+                    // 从连接池获取连接超时时间
+                    .setConnectionRequestTimeout(timeOut * 1000)
+                    .build();
+            // 创建httpclient
+            httpClient = HttpClients.custom()
+                    .setConnectionManager(manager)
+                    // 连接池不共享
+                    .setConnectionManagerShared(false)
+                    // 定期回收空闲连接
+                    .evictIdleConnections(timeOut, TimeUnit.SECONDS)
+                    // 定期回收过期连接
+                    .evictExpiredConnections()
+                    .setConnectionTimeToLive(timeOut, TimeUnit.SECONDS)
+                    // 设置默认请求
+                    .setDefaultRequestConfig(requestConfig)
+                    // 连接重用策略
+                    .setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
+                    // 长连接配置
+                    .setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
+                    // 设置重试次数
+                    .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))
+                    .build();
+
+            // jvm停止或重启时,关闭连接池释放连接
+            Runtime.getRuntime().addShutdownHook(new Thread() {
+
+                @Override
+                public void run() {
+                    try {
+                        if (null != httpClient) {
+                            httpClient.close();
+                        }
+                    } catch (Exception e) {
+                        log.error("httpclient关闭异常:{}", e);
+                    }
+                }
+            });
+        }
+        return httpClient;
+    }
+
+    /**
+     * http请求
+     *
+     * @param url
+     * @param params
+     * @return
+     */
+    public static String httpPost(String url, Map params,Map<String,String> headers) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}",JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers){
+            for (String key:headers.keySet()){
+                httpPost.setHeader(key,headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求(POST请求,GBK编码)
+     *
+     * @param url
+     * @param params
+     * @return
+     */
+    public static String httpPostGBK(String url, Map params,Map<String,String> headers) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}",JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers){
+            for (String key:headers.keySet()){
+                httpPost.setHeader(key,headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+//                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                result = EntityUtils.toString(entity, Charset.defaultCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求(POST请求,GBK编码)
+     *
+     * @param url
+     * @param params
+     * @param headers
+     * @param timeOut 超时时间
+     * @return
+     */
+    public static String httpPostGBK(String url, Map params, Map<String, String> headers, int timeOut) {
+        log.info("POST请求url:{}", url);
+        log.info("POST请求参数:{}", JSON.toJSONString(params));
+        CloseableHttpClient httpClient = getHttpClient(timeOut);
+        HttpPost httpPost = new HttpPost(url);
+
+        if (null != headers) {
+            for (String key : headers.keySet()) {
+                httpPost.setHeader(key, headers.get(key).toString());
+            }
+        }
+
+        String json = JSON.toJSONString(params);
+        StringEntity stringEntity = new StringEntity(json, DEFAULT_ENCODING);
+        stringEntity.setContentEncoding(DEFAULT_ENCODING);
+        httpPost.setEntity(stringEntity);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpPost);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+//                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                result = EntityUtils.toString(entity, Charset.defaultCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+
+    /**
+     * http请求
+     *
+     * @param url
+     * @return
+     */
+    public static String httpGet(String url) {
+        log.info("请求url:{}", url);
+        CloseableHttpClient httpClient = getHttpClient(DEFAULT_TIME_OUT);
+        HttpGet httpGet = new HttpGet(url);
+        String result = null;
+        try (CloseableHttpResponse response = httpClient.execute(httpGet);) {
+            HttpEntity entity = response.getEntity();
+            if (null != entity) {
+                result = EntityUtils.toString(entity, ContentType.getOrDefault(entity).getCharset());
+                EntityUtils.consume(entity);
+            }
+        } catch (Exception e) {
+            log.error("接口请求异常:{}", e);
+        }
+        return result;
+    }
+}
+

+ 4 - 4
mjava-pake/src/main/resources/application-prod.yml

@@ -4,10 +4,10 @@ server:
     context-path: /pake
 spring:
   datasource:
-      url: jdbc:mysql://47.97.181.40:3306/dingtalk?serverTimezone=GMT%2B8
-      username: root
-      password: cp-root@2022++
-      driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://47.97.181.40:3306/dingtalk?serverTimezone=GMT%2B8
+    username: root
+    password: cp-root@2022++
+    driver-class-name: com.mysql.cj.jdbc.Driver
 enable:
   scheduling: true
 logging:

+ 1 - 1
mjava-pake/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: dev
+    active: prod
   servlet:
     multipart:
       max-file-size: 100MB