package com.zy.asrs.task.kingdee.handler;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.Cools;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.entity.ErpSecret;
|
import com.zy.asrs.entity.WrkMast;
|
import com.zy.asrs.service.ApiLogService;
|
import com.zy.asrs.service.impl.ErpSecretServiceImpl;
|
import com.zy.asrs.task.AbstractHandler;
|
import com.zy.asrs.task.core.ReturnT;
|
import com.zy.common.utils.HttpHandler;
|
import com.zy.erp.kingdee.entity.param.LoginParam;
|
import com.zy.erp.kingdee.enums.KingDeeUtilType;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.HashMap;
|
import java.util.Map;
|
import java.util.Set;
|
|
@Service
|
@Slf4j
|
@Transactional
|
public class LoginAuthenticationHandler extends AbstractHandler<String> {
|
|
@Value("${erp.address.URL}")
|
//端口
|
private String URL;
|
|
@Value("${erp.address.loginaddress}")
|
//登录地址
|
private String loginaddress;
|
|
@Value("${erp.login.clientId}")
|
//WMS端ID
|
private String clientId;
|
|
@Value("${erp.login.clientSecret}")
|
//账号密钥
|
private String clientSecret;
|
|
@Value("${erp.login.username}")
|
private String username;
|
|
@Value("${erp.login.accountId}")
|
private String accountId;
|
|
@Value("${erp.login.xAcfwIdentity}")
|
private String xAcfwIdentity;
|
|
@Autowired
|
private ApiLogService apiLogService;
|
@Autowired
|
private ErpSecretServiceImpl erpSecretService;
|
|
/**
|
* 45分钟登录一次金蝶系统
|
* @return
|
*/
|
@Transactional
|
public synchronized ReturnT<String> start() {
|
ErpSecret erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId));
|
String time = String.valueOf(System.currentTimeMillis());
|
// 创建请求参数
|
JSONObject requestPayload = new JSONObject();
|
requestPayload.put("client_id", clientId);
|
requestPayload.put("client_secret", clientSecret);
|
requestPayload.put("username", username);
|
requestPayload.put("accountId", accountId);
|
requestPayload.put("nonce", erpSecret.getRefreshToken());//刷新token
|
requestPayload.put("timestamp", time);
|
requestPayload.put("language", "zh_CN");
|
|
// 创建请求头
|
Map<String, Object> headers = new HashMap<>();
|
headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头
|
headers.put("Content-Type", "application/json;charset=UTF-8");
|
String response = "";
|
boolean success = false;
|
String accessToken = "";
|
try {
|
// 使用 HttpHandler 发起请求
|
response = new HttpHandler.Builder()
|
.setUri(URL)
|
.setPath(loginaddress) // 登录接口路径
|
.setJson(requestPayload.toJSONString()) // 请求体
|
.setHeaders(headers) // 设置请求头
|
.build()
|
.doPost(); // 执行POST请求
|
// 解析返回结果
|
JSONObject jsonResponse = JSON.parseObject(response);
|
// 判断请求是否成功
|
if (jsonResponse.getBooleanValue("status")) {
|
accessToken = jsonResponse.getJSONObject("data").getString("access_token");
|
String refreshToken = jsonResponse.getJSONObject("data").getString("refresh_token");
|
success = true;
|
erpSecret.setRefreshToken(refreshToken);
|
erpSecret.setAccessToken(accessToken);
|
if(erpSecretService.saveErpSecret(erpSecret)){
|
log.info("获取更新Token成功: {}", accessToken);
|
}
|
} else {
|
log.error("获取Token失败,错误信息:{}", jsonResponse.getString("message"));
|
callApiLogSaveLog(requestPayload.toJSONString(), false);
|
}
|
|
} catch (Exception e) {
|
log.error("获取Token失败,异常信息:", e);
|
callApiLogSaveLog(requestPayload.toJSONString(), false);
|
return FAIL.setMsg(e.getMessage());
|
}
|
|
if (!success) {
|
return FAIL.setMsg("Token获取失败");
|
}
|
|
return SUCCESS.setContent(accessToken);
|
}
|
|
|
/**
|
* 递归查找JSON中的指定字段
|
*/
|
public static Object findValueByKey(JSONObject json, String key) {
|
Set<String> keySet = json.keySet();
|
for (String k : keySet) {
|
Object v = json.get(k);
|
if (k.equals(key)) {
|
return v;
|
} else if (v instanceof JSONArray) {
|
int size = ((JSONArray) v).size();
|
for (int i = 0; i < size; i++) {
|
Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key);
|
if (result != null){
|
return result;
|
}
|
}
|
} else if (v instanceof JSONObject) {
|
Object result = findValueByKey((JSONObject) v, key);
|
if (result != null) {
|
return result;
|
}
|
}
|
}
|
return null;
|
}
|
|
/**
|
* 保存API日志
|
*/
|
public void callApiLogSaveLog(String response, Boolean bool) {
|
apiLogService.save("登录金蝶失败", URL, "端口", loginaddress,
|
"账号Id:"+accountId+"、用户端Id:"+clientId+"、用户密钥:"+clientSecret+"、username:"+username+"、refresh_token:",
|
response, bool);
|
}
|
}
|