UserSyncService.java 7.12 KB
package com.mass.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mass.util.HttpClientUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.io.*;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class UserSyncService {

    @Value("${mass.domain}")
    private String massDomain;

    @Value("${mass.userListUrl}")
    private String massUserListUrl;

    @Value("${mass.userUpdateListUrl}")
    private String massUserUpdateListUrl;

    @Value("${mass.orgListUrl}")
    private String massOrgListUrl;

    @Value("${mass.orgListUpdateUrl}")
    private String massOrgListUpdateUrl;

    @Value("${mass.syscode}")
    private String massSyscode;

    @Value("${mass.tmpFilePath}")
    private String tmpFilePath;

    private static final Integer PAGE_SIZE = 1000;
    private static final String USER_DATE_FILE = "userDate.txt";
    private static final String ORG_DATE_FILE = "orgDate.txt";

    @Scheduled(cron = "*/5 * * * * ?")
    public void snyc() {
        log.info( Thread.currentThread().getName()+"====test");
    }


    public void syncAllOrg() throws IOException {
        String url = massDomain + massOrgListUrl;
        Map<String, Object> paramsMap = new HashMap<>();
        Integer pageNo = 1;
        paramsMap.put("page", pageNo);
        paramsMap.put("limit", PAGE_SIZE);
        JSONArray dataList = getData(url, paramsMap, pageNo);
        getLastExecTime(ORG_DATE_FILE);
        log.info("=======================syncAllOrg data:" + JSONObject.toJSONString(dataList));
    }

    public void syncUpdateOrg() throws IOException {
        String url = massDomain + massOrgListUpdateUrl;
        Map<String, Object> paramsMap = new HashMap<>();
        Integer pageNo = 1;
        paramsMap.put("page", pageNo);
        paramsMap.put("limit", PAGE_SIZE);
        String startTime = getLastExecTime(USER_DATE_FILE);
        LocalDateTime now = LocalDateTime.now();
        String endTime = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        paramsMap.put("startTime", startTime);
        paramsMap.put("endTime", endTime);
        JSONArray dataList = getData(url, paramsMap, pageNo);
        getLastExecTime(ORG_DATE_FILE);
        log.info("=======================syncAllOrg data:" + JSONObject.toJSONString(dataList));
    }

    public void syncAllUser() throws IOException {
        String url = massDomain + massUserListUrl;
        Map<String, Object> paramsMap = new HashMap<>();
        Integer pageNo = 1;
        paramsMap.put("page", pageNo);
        paramsMap.put("limit", PAGE_SIZE);
        JSONArray dataList = getData(url, paramsMap, pageNo);
        getLastExecTime(USER_DATE_FILE);
        log.info("=======================syncAllUser data:" + JSONObject.toJSONString(dataList));
    }

    public void syncUpdateUser() throws IOException {
        String url = massDomain + massUserUpdateListUrl;
        Map<String, Object> paramsMap = new HashMap<>();
        Integer pageNo = 1;
        paramsMap.put("page", pageNo);
        paramsMap.put("limit", PAGE_SIZE);
        String startTime = getLastExecTime(USER_DATE_FILE);
        LocalDateTime now = LocalDateTime.now();
        String endTime = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        paramsMap.put("startTime", startTime);
        paramsMap.put("endTime", endTime);
        JSONArray dataList = getData(url, paramsMap, pageNo);
        log.info("=======================syncUpdateUser data:" + JSONObject.toJSONString(dataList));
    }

    public String getLastExecTime(String fileName) throws IOException {
        String filePath = tmpFilePath + fileName;
        File file = new File(filePath);
        if (!file.getParentFile().exists()) {
            if (!file.getParentFile().mkdirs()) {
                log.error("create dateFileDir error!");
                return null;
            }
        }
        if (!file.exists()) {
            if (!file.createNewFile()) {
                log.error("create dateFile error!");
            }
            return setNowDateFile(filePath);
        } else {
            String lastDate = readFile(filePath);
            setNowDateFile(filePath);
            return lastDate;
        }
    }

    private String setNowDateFile(String filePath) {
        LocalDateTime now = LocalDateTime.now();
        String nowStr = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        writeFile(filePath, nowStr);
        return nowStr;
    }

    private void writeFile(String path, String content) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(path))) {
            writer.write(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private String readFile(String path) {
        StringBuilder content = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = br.readLine()) != null) {
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content.toString();
    }

    private JSONArray getData(String url, Map<String, Object> paramsMap, Integer pageNo) {
        JSONArray dataList = new JSONArray();
        JSONObject result = invokeMassInterface(url, paramsMap);
        if (result != null) {
            Integer count = result.getInteger("count");
            JSONArray data = result.getJSONArray("data");
            dataList.addAll(data);
            int pageNum = count / PAGE_SIZE;
            pageNum = count % PAGE_SIZE != 0 ? pageNum + 1 : pageNum;
            while (pageNo < pageNum) {
                pageNo++;
                paramsMap.put("page", pageNo);
                result = invokeMassInterface(url, paramsMap);
                if (result != null) {
                    JSONArray currentData = result.getJSONArray("data");
                    dataList.addAll(currentData);
                }
            }
        }
        return dataList;
    }

    private JSONObject invokeMassInterface(String url, Map<String, Object> paramsMap) {
        Map<String, String> header = new HashMap<>();
        header.put("syscode", massSyscode);
        String toJson = JSONObject.toJSONString(paramsMap);
        StringEntity myEntity = new StringEntity(toJson, ContentType.APPLICATION_JSON);
        String sResult = HttpClientUtils.doPostRequest(url, header, null, myEntity);
        JSONObject result = JSONObject.parseObject(sResult);
        Integer code = result.getInteger("code");
        if (code == 200) {
            return result;
        } else {
            log.info("========invoke error! url:" + url + " params:" + JSONObject.toJSONString(paramsMap) + " result:" + JSONObject.toJSONString(result));
            return null;
        }
    }
}