cy
2023-11-08 77154e8c3aeb00299aa1ab1e61306b3ba9c7f667
src/main/java/com/integrated/zyyt/util/ZyytUtil.java
@@ -1,17 +1,31 @@
package com.integrated.zyyt.util;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.integrated.zyyt.ZyytConstant;
import com.integrated.zyyt.enetity.TokenResult;
import com.integrated.zyyt.enetity.ZyytDataResult;
import com.integrated.zyyt.enetity.business.Zyyt;
import com.integrated.zyyt.enetity.business.ZyytStationInfo;
import com.integrated.zyyt.enetity.business.ZyytTDjtjb;
import com.integrated.zyyt.enetity.business.ZyytTShkdrb;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @ClassName ZyytGetData
@@ -23,6 +37,34 @@
@Component
@Slf4j
public class ZyytUtil {
    /**
     * 超时重试次数
     */
    private static int TRYNUM = 3;
    @Value("${pullData.tryNum}")
    public void setTRYNUM(Integer tryNum) {
        tryNum = tryNum <= 0 ? 3 : tryNum;
        this.TRYNUM = tryNum;
    }
    /**
     * http超时时间设置
     */
    private static int TRYTIMEOUT = 3 * 1000;
    @Value("${pullData.tryTimeOut}")
    public void setTRYTIMEOUT(Integer tryTimeOut) {
        this.TRYTIMEOUT = tryTimeOut * 1000;
    }
    private static JdbcTemplate jdbcTemplate;
    @Autowired
    public void setAlphaService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    /**
     * 获取批次号
@@ -52,19 +94,54 @@
        params.put("ciphertext", eciphrtext);
        params.put("client", client);
        params.put("secret", secret);
        String httpResult = HttpRequest.post(url)
        HttpRequest httpRequest = HttpRequest.post(url)
                .form(params)
                .header("X-EOS-SourceSysKey", sourceSysKey)
                .execute()
                .body();
                .timeout(TRYTIMEOUT);
        log.info("超时时间为{}毫秒", TRYTIMEOUT);
        log.info("url =》》{}", url);
        log.info("params =》》{}", params);
        HttpResponse httpResponse = null;
        int tryNumTemp = 1;
        boolean isTimeOut = false;
        try {
            httpResponse = httpRequest.execute();
        } catch (IORuntimeException e) {
//            e.printStackTrace();
            // 超时重试
            isTimeOut = true;
            log.error(e.getMessage());
        }
        while (tryNumTemp <= TRYNUM && isTimeOut) {
            log.error("请求接口超时,进行第{}次重试!", tryNumTemp);
            try {
                httpResponse = httpRequest.execute();
                isTimeOut = false;
            } catch (IORuntimeException e) {
//                e.printStackTrace();
                // 超时重试
                log.error(e.getMessage());
            }
            tryNumTemp++;
        }
        if (httpResponse == null) {
            log.error("请求接口超时,请联系接口提供方!");
            return null;
        }
        int responseStatus = httpResponse.getStatus();
        if (HttpStatus.NOT_FOUND.value() == responseStatus) {
            log.error("接口API异常,请联系接口提供方!HttpStatus:{}", responseStatus);
            return null;
        } else if (HttpStatus.OK.value() != responseStatus) {
            log.error("请求接口状态有误!HttpStatus:{}", responseStatus);
            return null;
        }
        String httpResult = httpResponse.body();
        log.info("result =》》{}", httpResult);
        try {
            return JSONObject.parseObject(httpResult, TokenResult.class);
        } catch (Exception e) {
            log.error(e.getMessage());
            log.error("Token解析失败!", e.getMessage());
            return null;
        }
    }
@@ -79,6 +156,10 @@
     * @return
     */
    public static <T> ZyytDataResult<T> getData(String url, String bearToken, String sourceSysKey, JSONObject params, int pageNum, int pageSize, Class<T> tClass) {
        if (StringUtils.isEmpty(bearToken)) {
            log.error("bearToken不能为null!");
            return null;
        }
        HashMap header = new HashMap();
        header.put("Authorization", "Bearer " + bearToken);
        header.put("X-EOS-SourceSysKey", sourceSysKey);
@@ -87,23 +168,55 @@
        log.info("url =》》{}", trueUrl);
        log.info("header=>>bearToken》》{}\r\nSourceSysKey=>>{}", bearToken, sourceSysKey);
        log.info("params =》》{}", params);
        String httpResult = HttpRequest.post(trueUrl)
        HttpRequest httpRequest = HttpRequest.post(trueUrl)
                .addHeaders(header)
                .contentType("application/json")
                .body(params.toJSONString())
                .timeout(1000 * 50)
                .execute()
                .body();
                .timeout(TRYTIMEOUT);
        log.info("超时时间为{}毫秒", TRYTIMEOUT);
        HttpResponse httpResponse = null;
        int tryNumTemp = 1;
        boolean isTimeOut = false;
        try {
            httpResponse = httpRequest.execute();
        } catch (IORuntimeException e) {
            // 超时重试
            isTimeOut = true;
            log.error(e.getMessage());
        }
        while (tryNumTemp <= TRYNUM && isTimeOut) {
            log.error("请求接口超时,进行第{}次重试!", tryNumTemp);
            try {
                httpResponse = httpRequest.execute();
                isTimeOut = false;
            } catch (IORuntimeException e) {
//                e.printStackTrace();
                // 超时重试
                log.error(e.getMessage());
            }
            tryNumTemp++;
        }
        if (httpResponse == null) {
            log.error("请求接口超时,请联系接口提供方!");
            return null;
        }
        int responseStatus = httpResponse.getStatus();
        if (HttpStatus.NOT_FOUND.value() == responseStatus) {
            log.error("接口API异常,请联系接口提供方!HttpStatus:{}", responseStatus);
            return null;
        } else if (HttpStatus.OK.value() != responseStatus) {
            log.error("请求接口状态有误!HttpStatus:{}", responseStatus);
            return null;
        }
        String httpResult = httpResponse.body();
        try {
            JSONObject respJson = JSONObject.parseObject(httpResult);
            log.info("开始解析结果4");
            Long contentSize = respJson.getLong("contentSize");
            if (contentSize != null && contentSize.compareTo(0L) > 0) {
                JSONArray dataArray = respJson.getJSONArray("content");
                log.info("开始解析结果5");
                List<T> content = dataArray.toJavaList(tClass);
                respJson.remove("content");
                log.info("开始解析结果6");
                ZyytDataResult<T> zyytDataResult = respJson.toJavaObject(ZyytDataResult.class);
                zyytDataResult.setContent(content);
                return zyytDataResult;
@@ -113,10 +226,176 @@
            }
        } catch (Exception e) {
            log.error("getData 异常");
            e.printStackTrace();
//            e.printStackTrace();
            return null;
        }
    }
    /**
     * 查询执行日期是否在执行
     *
     * @param tableName
     * @param date
     */
    public static Map<String, Object> getLastRecord(String tableName, LocalDate date) {
        String sql = "SELECT*FROM (SELECT*FROM ZYYT_RECORD WHERE BATCH_NO='" + getBatchNo(date) + "'  AND TABLE_NAME='" + tableName + "' ORDER BY START_TIME DESC) tmp WHERE ROWNUM<=1";
        Map<String, Object> map = null;
        try {
//            map = jdbcTemplate.queryForMap(sql);
            List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
            if (CollectionUtils.isEmpty(maps)) {
                return map;
            }
            map = maps.get(0);
        } catch (Exception e) {
            log.error("sql=={} 查询发生了异常,可能因为没有查询到数据", sql);
            log.error(e.getMessage());
        }
        return map;
    }
    /**
     * 查询指定批次是否有正在运行的任务
     *
     * @param tableName
     * @param date
     * @return true 正在运行 false 没有运行
     */
    public static boolean isRunning(String tableName, LocalDate date) {
        Map<String, Object> lastRecord = getLastRecord(tableName, date);
        if (lastRecord != null) {
            String isFinish = Convert.toStr(lastRecord.get("IS_FINISH"));
            return !"1".equals(isFinish);
        } else {
            return false;
        }
    }
    /**
     * 判断指定日期是否需要重新执行
     *
     * @param tableName
     * @param date
     * @return true 需要执行,false 不需要
     */
    public static boolean canGetAgain(String tableName, LocalDate date) {
        Map<String, Object> map = getLastRecord(tableName, date);
        if (map != null) {
            String isFinish = Convert.toStr(map.get("IS_FINISH"));
            if (!"1".equals(isFinish)) {
                log.info("表:{} 日期: {},上次执行未完成,不执行拉取", tableName, date);
                return false;
            }
            //下面 isFinish都是1
            String isError = Convert.toStr(map.get("IS_ERROR"));
            if ("1".equals(isError)) {
                log.info("表:{} 日期: {},上次执行有误,执行拉取", tableName, date);
                return true;
            }
            // 成功执行没有错
            String countNum = Convert.toStr(map.get("COUNT_NUM"));
            // 同接口返回的最新业务数据条数比较,如果不相同则重新拉取
            Long apiTotalElements = getApiTotalElements(tableName, date);
            if (apiTotalElements == null) {
                log.error("API获取总数失败,不执行拉取");
                return false;
            }
            if (apiTotalElements.compareTo(Convert.toLong(countNum)) == 0) {
                log.info("API返回总数 与 数据库条数相同,不执行拉取");
                return false;
            } else {
                log.info("API返回总数 与 数据库条数 不相同,执行拉取");
                return true;
            }
        } else {
            // 该批次未执行
            log.info("表:{} 日期: {},未执行过", tableName, date);
            return true;
        }
    }
    public static Zyyt getBusinessEntity(String tableName, LocalDate date) {
        if ("STATIONINFO".equalsIgnoreCase(tableName)) {
            return new ZyytStationInfo(
                    ZyytConstant.URL_AUTHON,
                    ZyytConstant.URL_STATIONINFO_QUERY,
                    false,
                    ZyytConstant.CLIENT_STATIONINFO,
                    ZyytConstant.SECRET_STATIONINFO,
                    ZyytConstant.X_EOS_SOURCESYSKEY_STATIONINFO,
                    new JSONObject()
            );
        } else {
            JSONObject queryParams = new JSONObject();
            JSONObject criteria = new JSONObject();
            criteria.put("match", "and");
            JSONArray matchChildren = new JSONArray();
            JSONObject children1 = new JSONObject();
            children1.put("name", "dRbrq");
            JSONArray child1C = new JSONArray();
            child1C.add(date + " 00:00:00");
            children1.put("value", child1C);
            children1.put("match", "eq");
            matchChildren.add(children1);
            criteria.put("children", matchChildren);
            queryParams.put("criteria", criteria);
            if ("YYZT_T_SHKDRB".equalsIgnoreCase(tableName)) {
                return new ZyytTShkdrb(
                        ZyytConstant.URL_AUTHON,
                        ZyytConstant.URL_SHKDRB_QUERY,
                        false,
                        ZyytConstant.CLIENT_SHKDRB,
                        ZyytConstant.SECRET_SHKDRB,
                        ZyytConstant.X_EOS_SOURCESYSKEY_SHKDRB,
                        queryParams
                );
            } else if ("YYZT_T_DJTJB".equalsIgnoreCase(tableName)) {
                return new ZyytTDjtjb(
                        ZyytConstant.URL_AUTHON,
                        ZyytConstant.URL_DJTJB_QUERY,
                        false,
                        ZyytConstant.CLIENT_DJTJB,
                        ZyytConstant.SECRET_DJTJB,
                        ZyytConstant.X_EOS_SOURCESYSKEY_DJTJB,
                        queryParams
                );
            }
        }
        return null;
    }
    /**
     * 获取API中返回的记录总数
     *
     * @param tableName
     * @param date
     * @return
     */
    public static Long getApiTotalElements(String tableName, LocalDate date) {
        Zyyt businessEntity = getBusinessEntity(tableName, date);
        ZyytDataResult zyytDataResult = businessEntity.getData(0, 1);
        if (zyytDataResult == null) {
            log.info("拉取数据失败,拉取返回值为null");
            return 0l;
        }
        log.info("总共拉取到数据{}条", zyytDataResult.getTotalElements());
        return zyytDataResult.getTotalElements();
    }
    public static Long calcPages(Long totalElements, int pageSize) {
        Long totalPages = 0L;
        totalPages = totalElements / pageSize;
        if (totalElements % pageSize != 0) {
            totalPages++;
        }
        return totalPages;
    }
}