yixindibang/measurement/src/main/java/com/ruoyi/webApi/ApiTask.java

237 lines
9.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.ruoyi.webApi;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
/**
* @author 16358
* @date 2025/6/5
*/
@Component("apiTask")
public class ApiTask {
@Autowired
private ISysConfigService sysConfigService;
@Autowired
private ISysDictTypeService dictTypeService;
//登录星空接口
public String OAlogin(){
// 目标URL
String url = sysConfigService.selectConfigByKey("OA_Url")+"/k3cloud/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc";
// 请求体JSON格式
String jsonInputString = sysConfigService.selectConfigByKey("login_JSON");
try {
// 创建URL对象
URL apiUrl = new URL(url);
// 打开连接
HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection();
// 设置请求方法为POST
connection.setRequestMethod("POST");
// 设置请求头
// Content-Type 指定发送的数据格式是JSON并且字符集为UTF-8
connection.setRequestProperty("Content-Type", "application/json; utf-8");
// Accept 指定期望接收的数据格式是JSON
connection.setRequestProperty("Accept", "application/json");
// 允许写入请求体
connection.setDoOutput(true);
// 获取输出流,发送请求体数据
try (OutputStream os = connection.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
// 获取响应码
int responseCode = connection.getResponseCode();
// 读取响应内容
StringBuilder response = new StringBuilder();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "utf-8"))) {
String responseLine = null;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
return response.toString();
}catch (Exception e) {
throw new RuntimeException("因未知原因导致登录OA系统失败");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//判断是否登录成功并返回token
public String getToken(){
//触发登录接口
String response = OAlogin();
// 解析响应体为 JSONObject
JSONObject jsonResponse = JSONObject.parseObject(response.toString());
// 提取 "Message" 字段
if (jsonResponse != null && !jsonResponse.containsKey("")) {
String loginResultType = jsonResponse.getString("LoginResultType");
if("1".equals(loginResultType)){
return jsonResponse.getString("KDSVCSessionId");
}else {
throw new RuntimeException(jsonResponse.getString("Message"));
}
} else {
throw new RuntimeException("返回参数解析错误!");
}
}
//测试任务
public void testTAS(){
String token = getToken();
System.out.println(token);
}
//定时任务拉取星空数据(发货通知单,收料通知单,调拨申请单,简单生产入库)
public void getOAData(){
//获取各个单据的单据id
List<SysDictData> oaFormid = dictTypeService.selectDictDataByType("oa_formid");
//记录错误日志
int errorCount = 1;
StringBuilder errorLog = new StringBuilder();
//循环调用接口 获取数据
try {
for (SysDictData sysDictData : oaFormid) {
String dictValue = sysDictData.getDictValue();
String oaData = getOAData(dictValue);
System.out.println(oaData);
if (oaData != null && !oaData.isEmpty()){
if (oaData.contains("ErrorCode")){
errorLog.append(errorCount++ + ""+ "获取"+ sysDictData.getDictLabel() + "数据失败!:" + oaData + "\n");
}else{
//保存数据
switch (dictValue){
case "SAL_DELIVERYNOTICE":
//保存数据
makePoundAppliFormData(dictValue);
break;
case "PUR_ReceiveBill":
//保存数据
makePoundAppliFormData(dictValue);
break;
case "STK_TRANSFERAPPLY":
//保存数据
makeMainPoundFormData(dictValue);
break;
case "SP_InStock":
//保存数据
makeMainPoundFormData(dictValue);
break;
default:
errorLog.append(errorCount++ + ""+ "获取数据失败!: 因未知错误导致返回参数为空!" + "\n");
}
}
}else{
errorLog.append(errorCount++ + ""+ "获取"+ sysDictData.getDictLabel() + "数据失败!: 因未知错误导致返回参数为空!" + "\n");
}
}
}catch (Exception e){
errorLog.append(errorCount++ + ""+ "获取数据失败!: " + e.getMessage() + "\n");
}
if (errorCount > 1){
throw new RuntimeException(errorLog.toString());
}
}
//调用OA系统接口拉取各个单据的数据
public String getOAData(String dictValue){
// 目标URL
String url = sysConfigService.selectConfigByKey("OA_Url")+"/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc";
//记录错误日志
StringBuilder errorLog = new StringBuilder();
try {
// 构建请求体,包含参数
String jsonInputString = sysConfigService.selectConfigByKey(dictValue+"_raw");
// 创建URL对象
URL apiUrl = new URL(url);
// 打开连接
HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection();
// 设置请求方法为POST
connection.setRequestMethod("POST");
// 设置请求头
// Content-Type 指定发送的数据格式是JSON并且字符集为UTF-8
connection.setRequestProperty("Content-Type", "application/json; utf-8");
// Accept 指定期望接收的数据格式是JSON
connection.setRequestProperty("Accept", "application/json");
// 设置请求头包含token
String token = getToken();
if (token != null && !token.isEmpty()) {
connection.setRequestProperty("kdservice-sessionid", token);
} else {
throw new RuntimeException("获取到的Token为空无法设置请求头。");
}
// 允许写入请求体
connection.setDoOutput(true);
// 获取输出流,发送请求体数据
try (OutputStream os = connection.getOutputStream()) {
byte[] input = jsonInputString.getBytes("utf-8");
os.write(input, 0, input.length);
}
// 获取响应码
int responseCode = connection.getResponseCode();
// 读取响应内容
StringBuilder response = new StringBuilder();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(connection.getInputStream(), "utf-8"))) {
String responseLine = null;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
return response.toString();
}catch (Exception e) {
// throw new RuntimeException("因未知原因导致获取数据失败!");
errorLog.append("因未知原因导致获取数据失败!\n");
}
} catch (IOException e) {
// throw new RuntimeException(e);
errorLog.append("获取数据失败!: " + e.getMessage()+ "\n");
}
return errorLog.toString();
}
//保存星空数据为中台<过磅申请>数据
public void makePoundAppliFormData(String formid){
}
//保存星空数据为中台<主榜单>数据
public void makeMainPoundFormData(String formid){
}
}