tjx
2025-11-25 ac891b014f5110e01fd19bc537f208ae9e7c689c
新增企业微信的接口
已修改3个文件
已添加1个文件
227 ■■■■■ 文件已修改
src/main/java/com/gs/xky/config/DataAcquisitionConfiguration.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/service/WorkWXService.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/task/ScheduledTasks.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/gs/xky/XkyApplicationTests.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xky/config/DataAcquisitionConfiguration.java
@@ -40,4 +40,9 @@
    public static final String CUSTOM_ROBOT_TOKEN = "c2849e46cb0d91b0721c377742938b8ac5ef57e3c9eeab918e2cd5dd9c3aad2a";
    public static final String SECRET = "SEC382027a5c81ea5152b71b687fb2c1ebf26acbde035355da6ab2fb37306454134";
    //企业微信
    public static final String CORPID = "wwabe21b935901a7d8";
    public static final String CORPSECRET = "Z-7fNbZjrd80ypz69U14j8FMxI_fpUxcT6PksxlvKaY";
}
src/main/java/com/gs/xky/service/WorkWXService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.gs.xky.service;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gs.xky.config.DataAcquisitionConfiguration;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Service
@RequiredArgsConstructor
public class WorkWXService {
    private static final Logger log = LoggerFactory.getLogger(WorkWXService.class);
    private final OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(90, TimeUnit.SECONDS)
            .readTimeout(90, TimeUnit.SECONDS)
            .build();
    private final ObjectMapper objectMapper = new ObjectMapper();
    public String getAccessToken() throws IOException {
        String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",
                DataAcquisitionConfiguration.CORPID,
                DataAcquisitionConfiguration.CORPSECRET);
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                log.error("获取企业微信access_token失败,HTTP状态码: {}", response.code());
                throw new IOException("获取access_token失败: " + response.message());
            }
            String responseBody = response.body().string();
            WorkWXTokenResponse tokenResponse = objectMapper.readValue(responseBody, WorkWXTokenResponse.class);
            if (tokenResponse.getErrcode() != 0) {
                log.error("获取企业微信access_token失败,错误码: {}, é”™è¯¯ä¿¡æ¯: {}",
                        tokenResponse.getErrcode(), tokenResponse.getErrmsg());
                throw new IOException("获取access_token失败: " + tokenResponse.getErrmsg());
            }
            log.info("成功获取企业微信access_token,有效期: {}秒", tokenResponse.getExpiresIn());
            return tokenResponse.getAccessToken();
        }
    }
    @Data
    private static class WorkWXTokenResponse {
        private Integer errcode;
        private String errmsg;
        @JsonProperty("access_token")
        private String accessToken;
        @JsonProperty("expires_in")
        private Integer expiresIn;
    }
}
src/main/java/com/gs/xky/task/ScheduledTasks.java
@@ -20,14 +20,17 @@
    private final AtomicBoolean exportTaskRunning = new AtomicBoolean(false);
    /**
     * æ¯äº”分钟执行一次
     * èŽ·å–è®¾å¤‡æœ€è¿‘çš„ä¸€æ¡è®°å½•
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void getDeviceRealTimeData() {
//    private final XkyService xkyService;
//    private final ApiService apiService;
//    private final MesStaffService staffService;
//    private final DeliveryNoticeService deliveryNoticeService;
//    private final MesInvItemArnService invItemArnService;
//    private final Executor taskExecutor; // æ³¨å…¥é€šç”¨çº¿ç¨‹æ± 
    }
    // ç”¨äºŽæ ‡è®°å„任务是否正在执行
//    private final AtomicBoolean isDeviceDataRunning = new AtomicBoolean(false);
//    private final AtomicBoolean isCompensateRunning = new AtomicBoolean(false);
//    private final AtomicBoolean isDingTalkRunning = new AtomicBoolean(false);
    /**
     * æ¯å¤©ä¸Šåˆ9点执行
@@ -57,4 +60,98 @@
        }
    }
//    /**
//     * æ¯äº”分钟执行一次
//     * èŽ·å–åå®¢äº‘æœ€è¿‘çš„ä¸€æ¡è®°å½•
//     */
//    @Scheduled(cron = "0 0/5 * * * ?")
//    public void getDeviceRealTimeData() {
//        // å¦‚果任务已经在运行,则跳过本次执行
//        if (!isDeviceDataRunning.compareAndSet(false, true)) {
//            log.info("【getDeviceRealTimeData】上一次任务还在执行中,跳过本次执行");
//            return;
//        }
//
//        log.info("【getDeviceRealTimeData】开始获取设备实时数据");
//
//        // ä½¿ç”¨å¼‚步执行,避免阻塞调度线程
//        CompletableFuture.runAsync(() -> {
//            try {
//                xkyService.GetSaveDetail();
//                log.info("【getDeviceRealTimeData】获取设备实时数据成功");
//            } catch (IOException e) {
//                log.error("【getDeviceRealTimeData】获取设备实时数据异常: {}", e.getMessage(), e);
//            } finally {
//                isDeviceDataRunning.set(false);
//            }
//        }, taskExecutor);
//    }
//
//    /**
//     * å®šæ—¶æ‰§è¡Œè¡¥å¿é€»è¾‘
//     */
//    @Scheduled(cron = "10 3,8,13,18,23,28,33,38,43,48,53,58 * * * ?")
//    public void compensateMethod() {
//        // å¦‚果任务已经在运行,则跳过本次执行
//        if (!isCompensateRunning.compareAndSet(false, true)) {
//            log.info("【compensateMethod】上一次任务还在执行中,跳过本次执行");
//            return;
//        }
//
//        log.info("【compensateMethod】开始执行补偿逻辑");
//
//        // ä½¿ç”¨å¼‚步执行,避免阻塞调度线程
//        CompletableFuture.runAsync(() -> {
//            try {
//                // è¡¥å¿é€»è¾‘
//                List<MesInvItemArn> itemArnMinus = invItemArnService.getItemArnMinus();
//                deliveryNoticeService.processMesInvItemArnStatusAsync(itemArnMinus);
//                log.info("【compensateMethod】补偿逻辑执行成功");
//            } catch (Exception e) {
//                log.error("【compensateMethod】补偿逻辑执行异常: {}", e.getMessage(), e);
//            } finally {
//                isCompensateRunning.set(false);
//            }
//        }, taskExecutor);
//    }
//
//    /**
//     * å®šæ—¶èŽ·å–é’‰é’‰æ•°æ®
//     */
//    @Scheduled(cron = "0 0/53 * * * ?")
//    public void getDinTalkData() {
//        // å¦‚果任务已经在运行,则跳过本次执行
//        if (!isDingTalkRunning.compareAndSet(false, true)) {
//            log.info("【getDinTalkData】上一次任务还在执行中,跳过本次执行");
//            return;
//        }
//
//        log.info("【getDinTalkData】开始获取钉钉数据");
//
//        // ä½¿ç”¨å¼‚步执行,避免阻塞调度线程
//        CompletableFuture.runAsync(() -> {
//            try {
//                DingTalkParam dingTalkParam = new DingTalkParam(1);
//                DingTalkResponse<EmployeeInfo> employeeInfoDingTalkResponse =
//                        apiService.sendListRequest(dingTalkParam, EmployeeInfo.class,
//                                "http://192.168.1.64/eHR/eHRExternalService/Service.ashx");
//
//                List<EmployeeInfo> collect = employeeInfoDingTalkResponse.getData().stream()
//                        .filter(s -> "造梦者(浙江)科技有限公司".equals(s.getCUnitName()))
//                        .collect(Collectors.toList());
//
//                log.info("【getDinTalkData】获取到{}条员工数据", collect.size());
//
//                List<List<EmployeeInfo>> partition = ListUtil.partition(collect, 100);
//                partition.forEach(staffService::UpdateStaff);
//
//                log.info("【getDinTalkData】钉钉数据处理完成");
//            } catch (IOException e) {
//                log.error("【getDinTalkData】获取钉钉数据异常: {}", e.getMessage(), e);
//            } finally {
//                isDingTalkRunning.set(false);
//            }
//        }, taskExecutor);
//    }
}
src/test/java/com/gs/xky/XkyApplicationTests.java
@@ -1,20 +1,12 @@
package com.gs.xky;
import com.alibaba.fastjson.JSON;
import com.gs.xky.config.*;
import com.gs.xky.dto.BarcodeDeliveryNo;
import com.gs.xky.dto.EmployeeInfo;
import com.gs.xky.dto.XkyDetail;
import com.gs.xky.dto.XkyEntity;
import com.gs.xky.entity.MesInvItemArn;
import com.gs.xky.service.*;
import com.gs.xky.service.VwCjScSjTsBbService;
import com.gs.xky.service.WorkWXService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
@SpringBootTest
class XkyApplicationTests {
@@ -22,6 +14,9 @@
    @Autowired
    private VwCjScSjTsBbService vwCjScSjTsBbService;
    @Autowired
    private WorkWXService workWXService;
    /**
     * æµ‹è¯•导出生产数据并发送钉钉消息
@@ -49,4 +44,30 @@
        System.out.println("=== æµ‹è¯•结束 ===");
    }
    /**
     * æµ‹è¯•获取企业微信access_token
     * åŠŸèƒ½ï¼šè°ƒç”¨ä¼ä¸šå¾®ä¿¡API获取access_token
     */
    @Test
    void testGetWorkWXAccessToken() {
        System.out.println("=== å¼€å§‹æµ‹è¯•获取企业微信access_token ===");
        try {
            String accessToken = workWXService.getAccessToken();
            if (accessToken != null && !accessToken.isEmpty()) {
                System.out.println("✓ æˆåŠŸèŽ·å–ä¼ä¸šå¾®ä¿¡access_token");
                System.out.println("  - access_token: " + accessToken);
                System.out.println("  - token长度: " + accessToken.length());
            } else {
                System.out.println("✗ èŽ·å–çš„access_token为空");
            }
        } catch (IOException e) {
            System.out.println("✗ èŽ·å–access_token失败: " + e.getMessage());
            e.printStackTrace();
        }
        System.out.println("=== æµ‹è¯•结束 ===");
    }
}