package com.dy.pipIrrRemote.video.ys; 
 | 
  
 | 
import com.dy.common.schedulerTask.SchedulerTaskSupport; 
 | 
import com.dy.pipIrrRemote.video.YsAppCtrl; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.http.*; 
 | 
import org.springframework.stereotype.Component; 
 | 
import org.springframework.util.LinkedMultiValueMap; 
 | 
import org.springframework.util.MultiValueMap; 
 | 
import org.springframework.web.client.RestTemplate; 
 | 
import org.springframework.web.util.UriComponentsBuilder; 
 | 
  
 | 
/** 
 | 
 * @Author: liurunyu 
 | 
 * @Date: 2025/6/7 11:40 
 | 
 * @Description 
 | 
 */ 
 | 
@Slf4j 
 | 
@Component 
 | 
public class YsAppClient { 
 | 
  
 | 
    private static final String JobName = "VideoYsJob" ; 
 | 
    private static final String JobGroupName = "VideoYsGroup" ; 
 | 
    private static final Integer ThreadPoolMaxCount = 1 ;//线程池线程最大个数 
 | 
    private static final Integer ThreadPoolPriority = 5 ;//线程优先级 
 | 
    private static final boolean quartzJobRunOneTimes = true ;//定时任务只执行一次 
 | 
  
 | 
    @Value("${video.ys.accessTokenExpireDay: 7}") 
 | 
    protected Integer accessTokenExpireDay;//AccessToken过期时间,单位天 
 | 
  
 | 
    @Value("${video.ys.appKey}") 
 | 
    protected String appKey; 
 | 
  
 | 
    @Value("${video.ys.secret}") 
 | 
    protected String secret; 
 | 
  
 | 
    @Value("${video.ys.requestAccessTokenUrl}") 
 | 
    protected String requestAccessTokenUrl; 
 | 
  
 | 
    @Autowired 
 | 
    protected RestTemplate restTemplate ; 
 | 
  
 | 
    @Autowired 
 | 
    protected YsAppCtrl ysVideoCtrl; 
 | 
  
 | 
    private Long computeNetGetAccessTokenAt(){ 
 | 
        Long millis = (System.currentTimeMillis() + (accessTokenExpireDay * 24 * 60 * 60 * 1000) ) ; 
 | 
        // millis = 10000L ; 
 | 
        return millis ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获得AccessToken 
 | 
     */ 
 | 
    public void getAccessToken(){ 
 | 
        if((appKey != null && appKey.trim().length() > 0) 
 | 
                && (secret != null && secret.trim().length() > 0) 
 | 
                && (requestAccessTokenUrl != null && requestAccessTokenUrl.trim().length() > 0)){ 
 | 
            MultiValueMap<String, String> formData = new LinkedMultiValueMap<>(); 
 | 
            formData.add("appKey", appKey); 
 | 
            formData.add("appSecret", secret); 
 | 
            YsAccessTokenResponse response = this.postRequest2Ys(restTemplate, requestAccessTokenUrl, formData); 
 | 
            if(response != null){ 
 | 
                switch (response.code){ 
 | 
                    case "200" :{ 
 | 
                        this.dealSuccessOfRequestAccessTokenFromYs(response) ; 
 | 
                        break ; 
 | 
                    } 
 | 
                    default: { 
 | 
                        this.dealErrorOfRequestAccessTokenFromYs(response) ; 
 | 
                        break ; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    private void dealSuccessOfRequestAccessTokenFromYs(YsAccessTokenResponse response){ 
 | 
        if(response != null && response.data != null){ 
 | 
            ysVideoCtrl.saveAccessTokenOfYs(response.data.accessToken, response.data.expireTime); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void dealErrorOfRequestAccessTokenFromYs(YsAccessTokenResponse response){ 
 | 
        log.error("从萤石开放平台获得AccessToken失败,错误码:{},错误信息:{}", response.code, response.msg); 
 | 
    } 
 | 
    /** 
 | 
     * 设置下次获得AccessToken 
 | 
     */ 
 | 
    public void reSetNextGetAccessToken(Long getAccessTokenAt){ 
 | 
        if(getAccessTokenAt == null || getAccessTokenAt.longValue() == 0){ 
 | 
            getAccessTokenAt = this.computeNetGetAccessTokenAt() ; 
 | 
        } 
 | 
        //毫秒变成秒 
 | 
        int futureSecond = (int)((getAccessTokenAt - System.currentTimeMillis()) / 1000) ; 
 | 
        try { 
 | 
            SchedulerTaskSupport.setThreadPoolPro(ThreadPoolMaxCount , ThreadPoolPriority); 
 | 
            //因为要重复加工作任务,所以先把上次加的同组同名任务删除 
 | 
            SchedulerTaskSupport.deleteJob(JobName , JobGroupName) ; 
 | 
            // 只执行一次的任务 
 | 
            SchedulerTaskSupport.addSecondlyJob(JobName , JobGroupName, YsAccessTokenQuartzJob.class, null, futureSecond, 1, 0) ; 
 | 
        } catch (Exception e) { 
 | 
            log.error("设置从萤石开放平台定时获得AccessToken任务时发生异常", e); 
 | 
        } 
 | 
    } 
 | 
    /** 
 | 
     * 向萤石开放平台发送Post请求 
 | 
     * @param restTemplate SpringBoot的RestTemplate 
 | 
     * @param toMwUrl web请求Url 
 | 
     * @param body 数据 
 | 
     * @return 
 | 
     */ 
 | 
    private YsAccessTokenResponse postRequest2Ys(RestTemplate restTemplate, String toMwUrl, Object body) { 
 | 
        String url = UriComponentsBuilder.fromUriString(toMwUrl) 
 | 
                .build() 
 | 
                .toUriString(); 
 | 
        HttpHeaders headers = new HttpHeaders(); 
 | 
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
 | 
  
 | 
        HttpEntity<?> httpEntity = new HttpEntity<>(body, headers); 
 | 
        ResponseEntity<YsAccessTokenResponse> resEntity = null; 
 | 
        try { 
 | 
            // 通过Post方式调用接口 
 | 
            resEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, YsAccessTokenResponse.class); 
 | 
        } catch (Exception e) { 
 | 
            log.error("从萤石开放平台定时获得AccessToken任务执行时发生异常", e); 
 | 
        } 
 | 
        if(resEntity != null){ 
 | 
            return resEntity.getBody(); 
 | 
        } 
 | 
        return null ; 
 | 
    } 
 | 
  
 | 
} 
 |