2025-10-13 07:49:19 +00:00
|
|
|
|
package tqq9.lc123.cloud.app.plugin.utils;
|
|
|
|
|
|
|
2025-10-16 01:48:28 +00:00
|
|
|
|
import cn.hutool.core.util.CharsetUtil;
|
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
|
import cn.hutool.crypto.asymmetric.KeyType;
|
|
|
|
|
|
import cn.hutool.crypto.asymmetric.RSA;
|
|
|
|
|
|
import cn.hutool.http.HttpRequest;
|
|
|
|
|
|
import cn.hutool.json.JSONUtil;
|
2025-10-13 07:49:19 +00:00
|
|
|
|
import com.alibaba.fastjson.JSON;
|
2025-10-15 09:57:59 +00:00
|
|
|
|
import com.alibaba.fastjson.JSONArray;
|
2025-10-13 07:49:19 +00:00
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
2025-10-16 05:31:35 +00:00
|
|
|
|
import kd.bos.dataentity.OperateOption;
|
|
|
|
|
|
import kd.bos.dataentity.entity.DynamicObject;
|
|
|
|
|
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
|
|
|
|
import kd.bos.servicehelper.operation.OperationServiceHelper;
|
2025-10-15 09:57:59 +00:00
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
2025-10-13 07:49:19 +00:00
|
|
|
|
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
|
|
|
|
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
|
|
|
|
|
import org.apache.http.client.methods.HttpPost;
|
|
|
|
|
|
import org.apache.http.impl.client.CloseableHttpClient;
|
|
|
|
|
|
import org.apache.http.impl.client.HttpClients;
|
|
|
|
|
|
import org.apache.http.message.BasicNameValuePair;
|
|
|
|
|
|
import org.apache.http.util.EntityUtils;
|
|
|
|
|
|
|
|
|
|
|
|
import java.math.BigInteger;
|
|
|
|
|
|
import java.security.MessageDigest;
|
|
|
|
|
|
import java.security.NoSuchAlgorithmException;
|
|
|
|
|
|
import java.sql.Timestamp;
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
|
|
public class FWRestfulUtils {
|
|
|
|
|
|
|
2025-10-15 09:57:59 +00:00
|
|
|
|
private static final String FW_Main_URL = ConfigUtils.getThirdConfigByNumber("FW_Main_URL");//获取泛微接口ip、端口号
|
|
|
|
|
|
private static final String FW_systemid = ConfigUtils.getThirdConfigByNumber("FW_systemid");//获取泛微接口授权用户名、系统标识
|
|
|
|
|
|
private static final String FW_password = ConfigUtils.getThirdConfigByNumber("FW_password");//获取泛微接口授权密码
|
|
|
|
|
|
private static final String FW_appid = ConfigUtils.getThirdConfigByNumber("FW_appid");//FW_appid
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 第一步:
|
|
|
|
|
|
* 调用ecology注册接口,根据appid进行注册,将返回服务端公钥和Secret信息
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static Map<String,Object> regist(){
|
|
|
|
|
|
//获取当前系统RSA加密的公钥
|
|
|
|
|
|
RSA rsa = new RSA();
|
|
|
|
|
|
String publicKey = rsa.getPublicKeyBase64();
|
|
|
|
|
|
String privateKey = rsa.getPrivateKeyBase64();
|
|
|
|
|
|
|
|
|
|
|
|
//调用ECOLOGY系统接口进行注册
|
|
|
|
|
|
String data = HttpRequest.post( "http://180.166.208.42:8043/" + "api/ec/dev/auth/regist")
|
|
|
|
|
|
.header("appid",FW_appid)
|
|
|
|
|
|
.header("cpk",publicKey)
|
|
|
|
|
|
.timeout(2000)
|
|
|
|
|
|
.execute().body();
|
|
|
|
|
|
|
|
|
|
|
|
// 打印ECOLOGY响应信息
|
|
|
|
|
|
System.out.println("testRegist():"+data);
|
|
|
|
|
|
Map<String,Object> datas = JSONUtil.parseObj(data);
|
|
|
|
|
|
|
|
|
|
|
|
return datas;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 第二步:
|
|
|
|
|
|
* 通过第一步中注册系统返回信息进行获取token信息
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static String getoken(String spk, String secret){
|
|
|
|
|
|
// 公钥加密,所以RSA对象私钥为null
|
|
|
|
|
|
RSA rsa = new RSA(null,spk);
|
|
|
|
|
|
//对秘钥进行加密传输,防止篡改数据
|
|
|
|
|
|
String encryptSecret = rsa.encryptBase64(secret,CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey);
|
|
|
|
|
|
//调用ECOLOGY系统接口进行注册
|
|
|
|
|
|
String data = HttpRequest.post("http://180.166.208.42:8043/" + "api/ec/dev/auth/applytoken")
|
|
|
|
|
|
.header("appid",FW_appid)
|
|
|
|
|
|
.header("secret",encryptSecret)
|
|
|
|
|
|
.header("time","3600")
|
|
|
|
|
|
.execute().body();
|
|
|
|
|
|
System.out.println("testGetoken():"+data);
|
|
|
|
|
|
Map<String,Object> datas = JSONUtil.parseObj(data);
|
|
|
|
|
|
//ECOLOGY返回的token
|
|
|
|
|
|
String token = StrUtil.nullToEmpty((String) datas.get("token"));
|
|
|
|
|
|
return token;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-13 07:49:19 +00:00
|
|
|
|
/**
|
|
|
|
|
|
*restful接口调用案例
|
|
|
|
|
|
*以getModeDataPageList为例
|
|
|
|
|
|
*/
|
2025-10-16 05:31:35 +00:00
|
|
|
|
public String doAction(String url, JSONObject mainTable, String fwuserid, String requestName, String billno){
|
2025-10-13 07:49:19 +00:00
|
|
|
|
CloseableHttpResponse response;// 响应类,
|
|
|
|
|
|
CloseableHttpClient httpClient = HttpClients.createDefault();
|
|
|
|
|
|
|
|
|
|
|
|
//restful接口url
|
2025-10-16 05:31:35 +00:00
|
|
|
|
url = FW_Main_URL + url;
|
|
|
|
|
|
HttpPost httpPost = new HttpPost(url);
|
2025-10-13 07:49:19 +00:00
|
|
|
|
//当前日期
|
|
|
|
|
|
String currentDate = getCurrentDate();
|
|
|
|
|
|
//当前时间
|
|
|
|
|
|
String currentTime = getCurrentTime();
|
|
|
|
|
|
//获取时间戳
|
|
|
|
|
|
String currentTimeTamp = getTimestamp();
|
|
|
|
|
|
|
|
|
|
|
|
//header
|
|
|
|
|
|
Map<String, Object> header = new HashMap<>();
|
2025-10-15 09:57:59 +00:00
|
|
|
|
header.put("systemid", FW_systemid);
|
2025-10-13 07:49:19 +00:00
|
|
|
|
header.put("currentDateTime", currentTimeTamp);
|
2025-10-16 05:31:35 +00:00
|
|
|
|
//Md5是:系统标识+密码+时间戳 并且md5加密的结果
|
2025-10-15 09:57:59 +00:00
|
|
|
|
String md5Source = FW_systemid + FW_password + currentTimeTamp;
|
2025-10-13 07:49:19 +00:00
|
|
|
|
String md5OfStr = getMD5Str(md5Source).toLowerCase();
|
|
|
|
|
|
header.put("Md5",md5OfStr);
|
|
|
|
|
|
|
|
|
|
|
|
//封装mainTable参数
|
2025-10-16 05:31:35 +00:00
|
|
|
|
Map<String, Object> dataParam = new HashMap<>();
|
2025-10-13 07:49:19 +00:00
|
|
|
|
dataParam.put("mainTable",mainTable);
|
|
|
|
|
|
|
|
|
|
|
|
//封装operationinfo参数
|
|
|
|
|
|
JSONObject operationinfo = new JSONObject();
|
|
|
|
|
|
operationinfo.put("operator", fwuserid);
|
|
|
|
|
|
dataParam.put("operationinfo",operationinfo);
|
|
|
|
|
|
System.out.println("===请求参数dataparam==="+dataParam);
|
2025-10-16 05:31:35 +00:00
|
|
|
|
|
|
|
|
|
|
Map<String, Object> params = new HashMap<>();
|
2025-10-13 07:49:19 +00:00
|
|
|
|
params.put("data",dataParam);
|
2025-10-16 05:31:35 +00:00
|
|
|
|
|
2025-10-13 07:49:19 +00:00
|
|
|
|
Map<String, Object>[] arr = new Map[1];
|
|
|
|
|
|
arr[0] = dataParam;
|
|
|
|
|
|
|
2025-10-16 05:31:35 +00:00
|
|
|
|
Map<String, Object> datajson = new HashMap<>();
|
2025-10-13 07:49:19 +00:00
|
|
|
|
datajson.put("header", header);
|
|
|
|
|
|
datajson.put("data", arr);
|
|
|
|
|
|
|
|
|
|
|
|
//装填参数
|
|
|
|
|
|
List<BasicNameValuePair> list = new ArrayList<>();
|
|
|
|
|
|
list.add(new BasicNameValuePair("datajson", JSON.toJSONString(datajson)));
|
|
|
|
|
|
|
2025-10-16 05:31:35 +00:00
|
|
|
|
DynamicObject pushlog = BusinessDataServiceHelper.newDynamicObject("tqq9_fwpushlog");
|
|
|
|
|
|
pushlog.set("name", requestName);
|
|
|
|
|
|
pushlog.set("tqq9_billno", billno);
|
|
|
|
|
|
pushlog.set("tqq9_url", url);
|
|
|
|
|
|
pushlog.set("tqq9_header_tag", JSON.toJSONString(header));
|
|
|
|
|
|
pushlog.set("tqq9_body_tag", JSON.toJSONString(list));
|
|
|
|
|
|
pushlog.set("enable", "1");
|
|
|
|
|
|
pushlog.set("status", "C");
|
|
|
|
|
|
|
2025-10-13 07:49:19 +00:00
|
|
|
|
try{
|
|
|
|
|
|
httpPost.addHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");
|
|
|
|
|
|
httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
|
|
|
|
|
|
response = httpClient.execute(httpPost);
|
2025-10-16 05:31:35 +00:00
|
|
|
|
pushlog.set("tqq9_returnstring_tag", response.toString());
|
2025-10-13 07:49:19 +00:00
|
|
|
|
if (response != null && response.getEntity() != null) {
|
|
|
|
|
|
//返回信息
|
|
|
|
|
|
String resulString = EntityUtils.toString(response.getEntity());
|
|
|
|
|
|
System.out.println("成功"+ resulString);
|
2025-10-16 05:31:35 +00:00
|
|
|
|
OperationServiceHelper.executeOperate("save", "tqq9_fwpushlog", new DynamicObject[]{pushlog}, OperateOption.create());
|
2025-10-13 07:49:19 +00:00
|
|
|
|
return resulString;
|
|
|
|
|
|
}else{
|
2025-10-16 05:31:35 +00:00
|
|
|
|
pushlog.set("tqq9_returnstring_tag", response.toString());
|
|
|
|
|
|
OperationServiceHelper.executeOperate("save", "tqq9_fwpushlog", new DynamicObject[]{pushlog}, OperateOption.create());
|
2025-10-13 07:49:19 +00:00
|
|
|
|
System.out.println("获取数据失败,请查看日志"+currentDate+" "+currentTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
|
System.out.println("请求失败"+currentDate+" "+currentTime+"====errormsg:"+e.getMessage());
|
|
|
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-16 05:31:35 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* 发起审批流程
|
|
|
|
|
|
* @param mainData
|
|
|
|
|
|
* @param detailData
|
|
|
|
|
|
* @param requestName
|
|
|
|
|
|
* @param workflowid
|
|
|
|
|
|
* @param billno
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
public String doBillAction(JSONArray mainData, JSONArray detailData, String requestName, String workflowid, String billno){
|
2025-10-15 09:57:59 +00:00
|
|
|
|
Map<String, Object> registMap = regist();
|
|
|
|
|
|
if(registMap != null && registMap.size() > 0){
|
|
|
|
|
|
String spk = StrUtil.nullToEmpty((String) registMap.get("spk"));
|
|
|
|
|
|
String secrit = StrUtil.nullToEmpty((String) registMap.get("secrit"));
|
|
|
|
|
|
if(StringUtils.isNotBlank(spk) && StringUtils.isNotBlank(secrit)){
|
|
|
|
|
|
String token = getoken(spk, secrit);
|
|
|
|
|
|
if(StringUtils.isNotBlank(token)){
|
|
|
|
|
|
CloseableHttpResponse response;// 响应类,
|
|
|
|
|
|
CloseableHttpClient httpClient = HttpClients.createDefault();
|
|
|
|
|
|
//restful接口url
|
2025-10-16 05:31:35 +00:00
|
|
|
|
String url = "http://180.166.208.42:8043/" + "api/workflow/paService/doCreateRequest";
|
|
|
|
|
|
HttpPost httpPost = new HttpPost(url);
|
2025-10-15 09:57:59 +00:00
|
|
|
|
//当前日期
|
|
|
|
|
|
String currentDate = getCurrentDate();
|
|
|
|
|
|
//当前时间
|
|
|
|
|
|
String currentTime = getCurrentTime();
|
|
|
|
|
|
|
|
|
|
|
|
//封装请求头参数
|
|
|
|
|
|
RSA rsa = new RSA(null,spk);
|
|
|
|
|
|
//对用户信息进行加密传输,暂仅支持传输OA用户ID
|
|
|
|
|
|
String encryptUserid = rsa.encryptBase64("363", CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey);
|
|
|
|
|
|
//装填参数
|
|
|
|
|
|
List<BasicNameValuePair> list = new ArrayList<>();
|
|
|
|
|
|
list.add(new BasicNameValuePair("mainData", JSON.toJSONString(mainData)));
|
|
|
|
|
|
list.add(new BasicNameValuePair("detailData", JSON.toJSONString(detailData)));
|
|
|
|
|
|
list.add(new BasicNameValuePair("requestName", requestName));
|
|
|
|
|
|
list.add(new BasicNameValuePair("workflowId", workflowid));
|
|
|
|
|
|
|
2025-10-16 05:31:35 +00:00
|
|
|
|
DynamicObject pushlog = BusinessDataServiceHelper.newDynamicObject("tqq9_fwpushlog");
|
|
|
|
|
|
pushlog.set("name", requestName);
|
|
|
|
|
|
pushlog.set("tqq9_billno", billno);
|
|
|
|
|
|
pushlog.set("tqq9_url", url);
|
|
|
|
|
|
pushlog.set("tqq9_header_tag", "appid:"+FW_appid+";token:"+token+";userid:"+encryptUserid);
|
|
|
|
|
|
pushlog.set("tqq9_body_tag", JSON.toJSONString(list));
|
|
|
|
|
|
pushlog.set("enable", "1");
|
|
|
|
|
|
pushlog.set("status", "C");
|
|
|
|
|
|
|
2025-10-15 09:57:59 +00:00
|
|
|
|
try{
|
|
|
|
|
|
httpPost.addHeader("appid",FW_appid);
|
|
|
|
|
|
httpPost.addHeader("token",token);
|
|
|
|
|
|
httpPost.addHeader("userid",encryptUserid);
|
|
|
|
|
|
httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
|
|
|
|
|
|
response = httpClient.execute(httpPost);
|
|
|
|
|
|
if (response != null && response.getEntity() != null) {
|
|
|
|
|
|
//返回信息
|
|
|
|
|
|
String resulString = EntityUtils.toString(response.getEntity());
|
2025-10-16 05:31:35 +00:00
|
|
|
|
pushlog.set("tqq9_returnstring_tag", resulString);
|
2025-10-15 09:57:59 +00:00
|
|
|
|
System.out.println("成功"+ resulString);
|
2025-10-16 05:31:35 +00:00
|
|
|
|
OperationServiceHelper.executeOperate("save", "tqq9_fwpushlog", new DynamicObject[]{pushlog}, OperateOption.create());
|
2025-10-15 09:57:59 +00:00
|
|
|
|
return resulString;
|
|
|
|
|
|
}else{
|
2025-10-16 05:31:35 +00:00
|
|
|
|
pushlog.set("tqq9_returnstring_tag", response.toString());
|
|
|
|
|
|
OperationServiceHelper.executeOperate("save", "tqq9_fwpushlog", new DynamicObject[]{pushlog}, OperateOption.create());
|
2025-10-15 09:57:59 +00:00
|
|
|
|
System.out.println("获取数据失败,请查看日志"+currentDate+" "+currentTime);
|
|
|
|
|
|
}
|
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
|
System.out.println("请求失败"+currentDate+" "+currentTime+"====errormsg:"+e.getMessage());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-13 07:49:19 +00:00
|
|
|
|
public String getMD5Str(String plainText){
|
|
|
|
|
|
//定义一个字节数组
|
|
|
|
|
|
byte[] secretBytes = null;
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 生成一个MD5加密计算摘要
|
|
|
|
|
|
MessageDigest md = MessageDigest.getInstance("MD5");
|
|
|
|
|
|
//对字符串进行加密
|
|
|
|
|
|
md.update(plainText.getBytes());
|
|
|
|
|
|
//获得加密后的数据
|
|
|
|
|
|
secretBytes = md.digest();
|
|
|
|
|
|
} catch (NoSuchAlgorithmException e) {
|
|
|
|
|
|
throw new RuntimeException("没有md5这个算法!");
|
|
|
|
|
|
// throw new RuntimeException(SystemEnv.getHtmlLabelName(517545,userLanguage));
|
|
|
|
|
|
}
|
|
|
|
|
|
//将加密后的数据转换为16进制数字
|
|
|
|
|
|
String md5code = new BigInteger(1, secretBytes).toString(16);
|
|
|
|
|
|
// 如果生成数字未满32位,需要前面补0
|
|
|
|
|
|
// 不能把变量放到循环条件,值改变之后会导致条件变化。如果生成30位 只能生成31位md5
|
|
|
|
|
|
int tempIndex = 32 - md5code.length();
|
|
|
|
|
|
for (int i = 0; i < tempIndex; i++) {
|
|
|
|
|
|
md5code = "0" + md5code;
|
|
|
|
|
|
}
|
|
|
|
|
|
return md5code;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static String getCurrentTime() {
|
|
|
|
|
|
Date newdate = new Date();
|
|
|
|
|
|
long datetime = newdate.getTime();
|
|
|
|
|
|
Timestamp timestamp = new Timestamp(datetime);
|
|
|
|
|
|
String currenttime = (timestamp.toString()).substring(11, 13) + ":" + (timestamp.toString()).substring(14, 16) + ":"
|
|
|
|
|
|
+ (timestamp.toString()).substring(17, 19);
|
|
|
|
|
|
return currenttime;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static String getCurrentDate() {
|
|
|
|
|
|
Date newdate = new Date();
|
|
|
|
|
|
long datetime = newdate.getTime();
|
|
|
|
|
|
Timestamp timestamp = new Timestamp(datetime);
|
|
|
|
|
|
String currentdate = (timestamp.toString()).substring(0, 4) + "-" + (timestamp.toString()).substring(5, 7) + "-"
|
|
|
|
|
|
+ (timestamp.toString()).substring(8, 10);
|
|
|
|
|
|
return currentdate;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取当前日期时间。 YYYY-MM-DD HH:MM:SS
|
|
|
|
|
|
* @return 当前日期时间
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static String getCurDateTime() {
|
|
|
|
|
|
Date newdate = new Date();
|
|
|
|
|
|
long datetime = newdate.getTime();
|
|
|
|
|
|
Timestamp timestamp = new Timestamp(datetime);
|
|
|
|
|
|
return (timestamp.toString()).substring(0, 19);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取时间戳 格式如:19990101235959
|
|
|
|
|
|
* @return
|
|
|
|
|
|
*/
|
|
|
|
|
|
public static String getTimestamp(){
|
|
|
|
|
|
return getCurDateTime().replace("-", "").replace(":", "").replace(" ", "");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static int getIntValue(String v, int def) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
return Integer.parseInt(v);
|
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
|
return def;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String null2String(Object s) {
|
|
|
|
|
|
return s == null ? "" : s.toString();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-10-15 09:57:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-13 07:49:19 +00:00
|
|
|
|
}
|