package foundation.icall.connector;
|
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.Objects;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
|
import foundation.dao.DataPackage;
|
import foundation.dao.DataReader;
|
import foundation.dao.DataSource;
|
import foundation.dao.bizlogic.DocDescription;
|
import foundation.dao.bizlogic.IRequest;
|
import foundation.data.entity.Entity;
|
import foundation.icall.ContentType;
|
import foundation.icall.ICall;
|
import foundation.icall.callout.ICallRequest;
|
import foundation.icall.callout.JSONResponse;
|
import foundation.io.FileCenter;
|
import foundation.io.object.FileRecord;
|
import foundation.io.template.Template;
|
import foundation.util.MD5Utils;
|
import foundation.util.MapList;
|
import foundation.util.Util;
|
import foundation.workflow.WorkStep;
|
import okhttp3.MediaType;
|
import okhttp3.OkHttpClient;
|
import okhttp3.Request;
|
import okhttp3.RequestBody;
|
import okhttp3.Response;
|
import sun.misc.BASE64Encoder;
|
|
public class KingdeeAIConn extends HttpServerConn {
|
|
private static KingdeeAIConn instance;
|
private static String monitorId = "KingdeeAIConn";
|
private String token;
|
|
private KingdeeAIConn() {
|
|
}
|
|
public static synchronized KingdeeAIConn getInstance() {
|
if (instance == null) {
|
instance = new KingdeeAIConn();
|
}
|
|
return instance;
|
}
|
|
@Override
|
public void login(WorkStep step, ICall iCall) throws Exception {
|
getToken();
|
}
|
|
@Override
|
public void logout(WorkStep step, ICall iCall) throws Exception {
|
|
}
|
|
@Override
|
public ICallRequest createRequest(String url) {
|
String host = meta.getString("url");
|
ICallRequest request = new ICallRequest(host + url + "?access_token=" + token);
|
request.addHeader("access_token", token);
|
|
return request;
|
}
|
|
@Override
|
public IRequest buildBody(IRequest request, WorkStep step, ICall iCall) throws Exception {
|
String jsonBody = null;
|
ContentType contentType = iCall.getContentType();
|
DataPackage dataPackage = step.getDataPackage();
|
dataPackage.loadOneDataFromDB();
|
String fileId = dataPackage.getString("file_id", null);
|
|
if (!Util.isEmpty(fileId) && ContentType.TextPlain == contentType) {
|
FileRecord fileRecord = FileCenter.getFile(dataPackage.getName(), fileId);
|
File file = fileRecord.getFile();
|
|
request.setDocDescription(new DocDescription(fileRecord.getIndexId(), fileRecord.getFileName()));
|
jsonBody = imageToBase64(file);
|
|
if (jsonBody == null) {
|
logger.error("无法对图片{}进行Base64编码,无法进行AI识别", file);
|
return null;
|
}
|
}
|
else {
|
dataPackage.loadDataFromRequest();
|
Entity master = dataPackage.getMasterEntity(DataSource.Request);
|
|
MapList<String, Template> templateList = iCall.getRequestTemplateList();
|
|
if (templateList != null && templateList.size() > 0) {
|
Template template = templateList.get(0);
|
jsonBody = template.fillVariants(dataPackage);
|
}
|
|
if (master != null) {
|
request.setDocDescription(new DocDescription(master.getId(), master.getString("code")));
|
}
|
|
}
|
|
request.setJSONBody(jsonBody);
|
request.setContentType(contentType.getCode());
|
return request;
|
}
|
|
private void getToken() throws Exception {
|
long currentTimeStamp = System.currentTimeMillis();
|
String client_id = meta.getString("clientid");
|
String client_secret = meta.getString("clientsecret");
|
String host = meta.getString("url");
|
String token_path = meta.getString("tokenpath");
|
String sign = MD5Utils.MD5Encode(client_id + client_secret + currentTimeStamp, "UTF-8");
|
|
// 1. build request
|
JSONObject jsonBody = new JSONObject();
|
jsonBody.put("client_id", client_id);
|
jsonBody.put("client_secret", client_secret);
|
jsonBody.put("sign", sign);
|
jsonBody.put("timestamp", currentTimeStamp);
|
|
String bodyStr = JSON.toJSONString(jsonBody);
|
Request request = new Request.Builder()
|
.url(host + token_path)
|
.post(RequestBody.create(MediaType.get("application/json"), bodyStr))
|
.build();
|
|
// 2. send request
|
OkHttpClient httpClient = new OkHttpClient();
|
Response response = httpClient.newCall(request).execute();
|
|
if (!response.isSuccessful()) {
|
return ;
|
}
|
|
JSONResponse result = new JSONResponse(response);
|
|
token = result.getString("access_token");
|
}
|
|
private static String imageToBase64(File file) {
|
byte[] data = null;
|
|
InputStream in = null;
|
try {
|
// 1. bytes
|
in = new FileInputStream(file);
|
data = new byte[in.available()];
|
in.read(data);
|
in.close();
|
|
// 2. encode
|
BASE64Encoder encoder = new BASE64Encoder();
|
return encoder.encode(Objects.requireNonNull(data));
|
} catch (IOException e) {
|
e.printStackTrace();
|
} finally {
|
try {
|
in.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
|
return null;
|
}
|
|
public String getName() {
|
return meta.getName();
|
}
|
}
|