pioneer
2 years ago
commit
d94749731a
74 changed files with 9123 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||||||
|
# open-JSD-9943 |
||||||
|
|
||||||
|
JSD-9943 私有版本飞书集成\ |
||||||
|
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||||
|
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||||
|
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,28 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||||
|
<plugin> |
||||||
|
<id>com.fr.plugin.third.party.jsdjjed</id> |
||||||
|
<name><![CDATA[飞书登录集成与定时任务_EK]]></name> |
||||||
|
<active>yes</active> |
||||||
|
<version>1.0.37</version> |
||||||
|
<env-version>10.0</env-version> |
||||||
|
<jartime>2019-01-01</jartime> |
||||||
|
<vendor>fr.open</vendor> |
||||||
|
<description><![CDATA[]]></description> |
||||||
|
<change-notes><![CDATA[ |
||||||
|
]]></change-notes> |
||||||
|
<lifecycle-monitor class="com.fr.plugin.third.party.jsdjjed.OutputPluginLifecycleMonitor"/> |
||||||
|
<extra-core> |
||||||
|
<DBAccessProvider class="com.fr.plugin.third.party.jsdjjed.app.config.AppConfigAccessBridge"/> |
||||||
|
</extra-core> |
||||||
|
<extra-decision> |
||||||
|
<OutputFormulaProvider class="com.fr.plugin.third.party.jsdjjed.schedule.formula.FeishuOutputFormula"/> |
||||||
|
<OutputFormulaExtractorProvider class="com.fr.plugin.third.party.jsdjjed.schedule.formula.FormulaCalculator"/> |
||||||
|
<HttpHandlerProvider class="com.fr.plugin.third.party.jsdjjed.http.CustomHttpHandlerProvider"/> |
||||||
|
<URLAliasProvider class="com.fr.plugin.third.party.jsdjjed.http.CustomURLAliasProvider"/> |
||||||
|
<GlobalRequestFilterProvider class="com.fr.plugin.third.party.jsdjjed.http.SessionGlobalRequestFilterProvider"/> |
||||||
|
<SystemOptionProvider class="com.fr.plugin.third.party.jsdjjed.FeishuManagerSystemOption"/> |
||||||
|
<WebResourceProvider class="com.fr.plugin.third.party.jsdjjed.schedule.components.JsAndCssBridge"/> |
||||||
|
<DecisionDBAccessProvider class="com.fr.plugin.third.party.jsdjjed.schedule.provider.DBAccessProvider"/> |
||||||
|
</extra-decision> |
||||||
|
<function-recorder class="com.fr.plugin.third.party.jsdjjed.OutputPluginLifecycleMonitor"/> |
||||||
|
</plugin> |
@ -0,0 +1,25 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed; |
||||||
|
|
||||||
|
import com.fr.web.struct.Component; |
||||||
|
import com.fr.web.struct.category.ScriptPath; |
||||||
|
import com.fr.web.struct.category.StylePath; |
||||||
|
|
||||||
|
|
||||||
|
public class FeishuManagerComponent extends Component { |
||||||
|
|
||||||
|
public static FeishuManagerComponent KEY = new FeishuManagerComponent(); |
||||||
|
|
||||||
|
private FeishuManagerComponent(){ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ScriptPath script() { |
||||||
|
return ScriptPath.build("/com/fr/plugin/third/party/jsdjjed/feishu.js"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public StylePath style() { |
||||||
|
return StylePath.build("/com/fr/plugin/third/party/jsdjjed/feishu.css"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractSystemOptionProvider; |
||||||
|
import com.fr.decision.web.MainComponent; |
||||||
|
import com.fr.web.struct.Atom; |
||||||
|
|
||||||
|
public class FeishuManagerSystemOption extends AbstractSystemOptionProvider { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String id() { |
||||||
|
return "decision-jsdjjed-feishu-manager"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String displayName() { |
||||||
|
return "飞书管理"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int sortIndex() { |
||||||
|
return 2; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Atom attach() { |
||||||
|
return MainComponent.KEY; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Atom client() { |
||||||
|
return FeishuManagerComponent.KEY; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed; |
||||||
|
|
||||||
|
import com.fr.intelli.record.Focus; |
||||||
|
import com.fr.intelli.record.Original; |
||||||
|
import com.fr.plugin.context.PluginContext; |
||||||
|
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.config.AppDataConfig; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.handle.ImageOutputFormat; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.AppMessagePushHandler; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.bean.OutputAppMessagePush; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.entity.AppMessagePushEntity; |
||||||
|
import com.fr.record.analyzer.EnableMetrics; |
||||||
|
import com.fr.schedule.extension.report.job.output.BaseOutputFormat; |
||||||
|
import com.fr.schedule.feature.ScheduleOutputActionEntityRegister; |
||||||
|
import com.fr.schedule.feature.output.OutputActionHandler; |
||||||
|
import com.fr.stable.fun.Authorize; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 配置信息初始化 |
||||||
|
*/ |
||||||
|
@EnableMetrics |
||||||
|
public class OutputPluginLifecycleMonitor extends AbstractPluginLifecycleMonitor { |
||||||
|
@Override |
||||||
|
@Focus(id = "com.fr.plugin.third.party.jsdjjed", text = "plugin-jsdjjed", source = Original.PLUGIN) |
||||||
|
public void afterRun(PluginContext pluginContext) { |
||||||
|
BaseOutputFormat.registerOutputFormat(new ImageOutputFormat()); |
||||||
|
AppDataConfig.getInstance(); |
||||||
|
OutputActionHandler.registerHandler(new AppMessagePushHandler(), OutputAppMessagePush.class.getName()); |
||||||
|
ScheduleOutputActionEntityRegister.getInstance().addClass(AppMessagePushEntity.class); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStop(PluginContext pluginContext) { |
||||||
|
BaseOutputFormat.removeOutputFormat(ImageOutputFormat.FORMAT_IMAGE); |
||||||
|
OutputActionHandler.removeOutputHandler(OutputAppMessagePush.class.getName()); |
||||||
|
ScheduleOutputActionEntityRegister.getInstance().removeClass(AppMessagePushEntity.class); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,386 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.webservice.bean.user.UserBean; |
||||||
|
import com.fr.decision.webservice.bean.user.UserUpdateBean; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.third.org.apache.http.HttpEntity; |
||||||
|
import com.fr.third.org.apache.http.HttpStatus; |
||||||
|
import com.fr.third.org.apache.http.client.config.RequestConfig; |
||||||
|
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; |
||||||
|
import com.fr.third.org.apache.http.client.methods.HttpGet; |
||||||
|
import com.fr.third.org.apache.http.client.methods.HttpPost; |
||||||
|
import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; |
||||||
|
import com.fr.third.org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
||||||
|
import com.fr.third.org.apache.http.entity.StringEntity; |
||||||
|
import com.fr.third.org.apache.http.entity.mime.MultipartEntityBuilder; |
||||||
|
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||||
|
import com.fr.third.org.apache.http.impl.client.HttpClients; |
||||||
|
import com.fr.third.org.apache.http.ssl.SSLContextBuilder; |
||||||
|
import com.fr.third.org.apache.http.ssl.TrustStrategy; |
||||||
|
import com.fr.third.org.apache.http.util.EntityUtils; |
||||||
|
import com.fr.third.springframework.web.util.UriUtils; |
||||||
|
|
||||||
|
import javax.net.ssl.HostnameVerifier; |
||||||
|
import javax.net.ssl.SSLContext; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
import java.security.cert.CertificateException; |
||||||
|
import java.security.cert.X509Certificate; |
||||||
|
import java.util.List; |
||||||
|
import java.util.UUID; |
||||||
|
|
||||||
|
public class Utils { |
||||||
|
public static String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"; |
||||||
|
public static RequestConfig REQUEST_CONFIG = RequestConfig.custom() |
||||||
|
.setConnectionRequestTimeout(30000) |
||||||
|
.setSocketTimeout(30000) // 服务端相应超时
|
||||||
|
.setConnectTimeout(30000) // 建立socket链接超时时间
|
||||||
|
.build(); |
||||||
|
|
||||||
|
public static CloseableHttpClient createSslHttpClient() { |
||||||
|
try { |
||||||
|
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
||||||
|
return true; |
||||||
|
} |
||||||
|
}).build(); |
||||||
|
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; |
||||||
|
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); |
||||||
|
return HttpClients.custom() |
||||||
|
.setSSLSocketFactory(sslsf) |
||||||
|
.build(); |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error(e.getMessage(), e); |
||||||
|
} |
||||||
|
return HttpClients.createDefault(); |
||||||
|
} |
||||||
|
|
||||||
|
public static CloseableHttpClient createDefaultHttpClient() { |
||||||
|
CloseableHttpClient httpClient = HttpClients.custom() |
||||||
|
.build(); |
||||||
|
return httpClient; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized CloseableHttpClient createHttpClient(String url) { |
||||||
|
CloseableHttpClient httpClient = null; |
||||||
|
if (StringKit.isEmpty(url)) { |
||||||
|
httpClient = createDefaultHttpClient(); |
||||||
|
return httpClient; |
||||||
|
} |
||||||
|
|
||||||
|
if (url.startsWith("https://")) { |
||||||
|
httpClient = createSslHttpClient(); |
||||||
|
return httpClient; |
||||||
|
} |
||||||
|
httpClient = createDefaultHttpClient(); |
||||||
|
return httpClient; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取响应内容 |
||||||
|
* |
||||||
|
* @param response |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static String getResponseBodyContent(CloseableHttpResponse response) throws IOException { |
||||||
|
if (response == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
HttpEntity httpEntity = response.getEntity(); |
||||||
|
if (httpEntity == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String content = EntityUtils.toString(httpEntity, "UTF-8"); |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized String createHttpGetContent(CloseableHttpClient httpClient, String url, String basicAuth, String contentType) throws IOException { |
||||||
|
if ((httpClient == null) || (StringKit.isEmpty(url))) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
LogKit.info("http请求链接:" + url); |
||||||
|
HttpGet httpGet = new HttpGet(url); |
||||||
|
httpGet.addHeader("User-Agent", Utils.DEFAULT_USER_AGENT); |
||||||
|
if (StringKit.isNotEmpty(basicAuth)) { |
||||||
|
httpGet.addHeader("Authorization", basicAuth); |
||||||
|
} |
||||||
|
if (StringKit.isNotEmpty(contentType)) { |
||||||
|
httpGet.addHeader("Content-Type", contentType); |
||||||
|
} |
||||||
|
|
||||||
|
httpGet.setConfig(Utils.REQUEST_CONFIG); |
||||||
|
CloseableHttpResponse response = httpClient.execute(httpGet); |
||||||
|
int statusCode = response.getStatusLine().getStatusCode(); |
||||||
|
String responseContent = getResponseBodyContent(response); |
||||||
|
LogKit.info("http响应内容:\n" + responseContent); |
||||||
|
if (statusCode != HttpStatus.SC_OK) { |
||||||
|
response.close(); |
||||||
|
LogKit.error("http请求出错,http status:" + statusCode); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
response.close(); |
||||||
|
if (StringKit.isEmpty(responseContent)) { |
||||||
|
LogKit.error("http请求出错,http响应内容为空"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return responseContent; |
||||||
|
} |
||||||
|
|
||||||
|
public static String createHttpPostContent(CloseableHttpClient httpClient, String url, String bodyContent, String basicAuth, String contentType) throws IOException { |
||||||
|
return createHttpPostContent(httpClient, url, bodyContent, null, basicAuth, contentType); |
||||||
|
} |
||||||
|
|
||||||
|
public static String createHttpPostContent(CloseableHttpClient httpClient, String url, MultipartEntityBuilder multipartEntityBuilder, String basicAuth, String contentType) throws IOException { |
||||||
|
return createHttpPostContent(httpClient, url, "", multipartEntityBuilder, basicAuth, contentType); |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized String createHttpPostContent(CloseableHttpClient httpClient, String url, String bodyContent, MultipartEntityBuilder multipartEntityBuilder, String basicAuth, String contentType) throws IOException { |
||||||
|
if ((httpClient == null) || (StringKit.isEmpty(url))) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
LogKit.info("http请求链接:" + url); |
||||||
|
HttpPost httpPost = new HttpPost(url); |
||||||
|
httpPost.addHeader("User-Agent", Utils.DEFAULT_USER_AGENT); |
||||||
|
httpPost.setConfig(Utils.REQUEST_CONFIG); |
||||||
|
if (StringKit.isNotEmpty(basicAuth)) { |
||||||
|
httpPost.addHeader("Authorization", basicAuth); |
||||||
|
} |
||||||
|
if (StringKit.isNotEmpty(contentType)) { |
||||||
|
httpPost.addHeader("Content-Type", contentType); |
||||||
|
} |
||||||
|
if (StringKit.isNotEmpty(bodyContent)) { |
||||||
|
LogKit.info("http请求内容:\n" + bodyContent); |
||||||
|
StringEntity bodyEntity = new StringEntity(bodyContent, "UTF-8"); |
||||||
|
httpPost.setEntity(bodyEntity); |
||||||
|
} |
||||||
|
|
||||||
|
if (multipartEntityBuilder != null) { |
||||||
|
httpPost.setEntity(multipartEntityBuilder.build()); |
||||||
|
} |
||||||
|
|
||||||
|
CloseableHttpResponse response = httpClient.execute(httpPost); |
||||||
|
String responseContent = getResponseBodyContent(response); |
||||||
|
LogKit.info("http响应内容:\n" + responseContent); |
||||||
|
int statusCode = response.getStatusLine().getStatusCode(); |
||||||
|
if (statusCode != HttpStatus.SC_OK) { |
||||||
|
response.close(); |
||||||
|
LogKit.error("http请求出错,http status:" + statusCode); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
response.close(); |
||||||
|
if (StringKit.isEmpty(responseContent)) { |
||||||
|
LogKit.error("http请求出错,http响应内容为空"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return responseContent; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static String createHttpGetContent(CloseableHttpClient httpClient, String url, String contentType) throws IOException { |
||||||
|
return createHttpGetContent(httpClient, url, "", contentType); |
||||||
|
} |
||||||
|
|
||||||
|
public static String createHttpGetContentWithHttpClient(String url, String basicAuth, String contentType) throws IOException { |
||||||
|
CloseableHttpClient httpClient = Utils.createHttpClient(url); |
||||||
|
String content = createHttpGetContent(httpClient, url, basicAuth, contentType); |
||||||
|
httpClient.close(); |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
public static String createHttpGetContentWithHttpClient(String url) throws IOException { |
||||||
|
return createHttpGetContentWithHttpClient(url, "", ""); |
||||||
|
} |
||||||
|
|
||||||
|
public static String createHttpPostContentWithHttpClient(String url, String bodyContent, String contentType) throws IOException { |
||||||
|
return createHttpPostContentWithHttpClient(url, bodyContent, "", contentType); |
||||||
|
} |
||||||
|
|
||||||
|
public static String createHttpPostContentWithHttpClient(String url, String bodyContent, String basicAuth, String contentType) throws IOException { |
||||||
|
CloseableHttpClient httpClient = Utils.createHttpClient(url); |
||||||
|
String content = createHttpPostContent(httpClient, url, bodyContent, basicAuth, contentType); |
||||||
|
httpClient.close(); |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static String createHttpPostContentWithHttpClient(String url, MultipartEntityBuilder multipartEntityBuilder, String contentType) throws IOException { |
||||||
|
return createHttpPostContentWithHttpClient(url, multipartEntityBuilder, "", contentType); |
||||||
|
} |
||||||
|
|
||||||
|
public static String createHttpPostContentWithHttpClient(String url, MultipartEntityBuilder multipartEntityBuilder, String basicAuth, String contentType) throws IOException { |
||||||
|
CloseableHttpClient httpClient = Utils.createHttpClient(url); |
||||||
|
String content = createHttpPostContent(httpClient, url, multipartEntityBuilder, basicAuth, contentType); |
||||||
|
httpClient.close(); |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized String createHttpPostContent(CloseableHttpClient httpClient, String url, String bodyContent, String contentType) throws IOException { |
||||||
|
return createHttpPostContent(httpClient, url, bodyContent, "", contentType); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static String getRequestUrl(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String url = req.getRequestURL().toString(); |
||||||
|
return url; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取完整请求链接 |
||||||
|
* |
||||||
|
* @param req 请求 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getFullRequestUrl(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String url = req.getRequestURL().toString(); |
||||||
|
String queryUrl = req.getQueryString(); |
||||||
|
if ((queryUrl == null) || "null".equalsIgnoreCase(queryUrl)) { |
||||||
|
queryUrl = ""; |
||||||
|
} else { |
||||||
|
queryUrl = "?" + queryUrl; |
||||||
|
} |
||||||
|
String fullUrl = url + queryUrl; |
||||||
|
return fullUrl; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static boolean isDecisionLoginRequest(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (!"GET".equalsIgnoreCase(req.getMethod())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String url = req.getRequestURL().toString(); |
||||||
|
if (url.endsWith("/decision/login") || url.endsWith("/decision/login/")) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 重定向 |
||||||
|
* |
||||||
|
* @param res |
||||||
|
* @param url |
||||||
|
*/ |
||||||
|
public static void sendRedirect(HttpServletResponse res, String url) { |
||||||
|
if ((res == null) || (StringKit.isEmpty(url))) { |
||||||
|
return; |
||||||
|
} |
||||||
|
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); |
||||||
|
res.setHeader("Location", url); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static synchronized String getUuid() { |
||||||
|
String uuid = UUID.randomUUID().toString().replace("-", ""); |
||||||
|
return uuid; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 通过用户名删除用户,管理员用户无法删除 |
||||||
|
* |
||||||
|
* @param username 用户名 |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static int deleteUsersByUsername(String username) throws Exception { |
||||||
|
if (StringUtils.isEmpty(username)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
User user = UserService.getInstance().getUserByUserName(username); |
||||||
|
if (user == null) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
String userId = user.getId(); |
||||||
|
List<String> adminUserIds = UserService.getInstance().getAdminUserIdList(); |
||||||
|
if ((adminUserIds != null) && (adminUserIds.size() >= 1) && (adminUserIds.contains(userId))) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
UserUpdateBean userUpdateBean = new UserUpdateBean(); |
||||||
|
userUpdateBean.setRemoveUserIds(new String[]{userId}); |
||||||
|
return UserService.getInstance().deleteUsers(userUpdateBean); |
||||||
|
} |
||||||
|
|
||||||
|
public static int deleteUsersByUsernames(List<String> usernames) throws Exception { |
||||||
|
if ((usernames == null) || (usernames.size() <= 0)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
String username; |
||||||
|
int totalCount = 0, count; |
||||||
|
for (int i = 0, max = usernames.size() - 1; i <= max; i++) { |
||||||
|
username = usernames.get(i); |
||||||
|
count = deleteUsersByUsername(username); |
||||||
|
totalCount = totalCount + count; |
||||||
|
} |
||||||
|
return totalCount; |
||||||
|
} |
||||||
|
|
||||||
|
public static void editRealNameByUsername(String username, String realName) throws Exception { |
||||||
|
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(realName)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
User user = UserService.getInstance().getUserByUserName(username); |
||||||
|
if (user == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
UserBean userBean = new UserBean(user.getEmail(), user.isEnable(), user.getMobile(), realName, user.getUserName(), user.getId()); |
||||||
|
UserService.getInstance().editAccount(username, userBean); |
||||||
|
} |
||||||
|
|
||||||
|
public static JSONObject getSuccessResultJson() { |
||||||
|
return getResultJson("success", ""); |
||||||
|
} |
||||||
|
|
||||||
|
public static JSONObject getFailuresResultJson() { |
||||||
|
return getResultJson("failure", ""); |
||||||
|
} |
||||||
|
|
||||||
|
public static JSONObject getFailuresResultJson(String msg) { |
||||||
|
return getResultJson("failure", msg); |
||||||
|
} |
||||||
|
|
||||||
|
public static JSONObject getResultJson(String status, String msg) { |
||||||
|
JSONObject json = new JSONObject(); |
||||||
|
json.put("status", status); |
||||||
|
json.put("msg", msg); |
||||||
|
return json; |
||||||
|
} |
||||||
|
|
||||||
|
public static String encodeUrlWithUtf8(String value) { |
||||||
|
if ((value == null) || (value.length() <= 0)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
/*String path = "/" + value; |
||||||
|
URI uri = new URI("http", "a", path, null); |
||||||
|
String tempValue = uri.toASCIIString(); |
||||||
|
String encodedValue = tempValue.substring(9);*/ |
||||||
|
String tempValue = ""; |
||||||
|
try { |
||||||
|
tempValue = UriUtils.encodeQueryParam(value, "UTF-8"); |
||||||
|
return tempValue; |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error("Utils.encodeUrlWithUtf8:" + e.getMessage(), e); |
||||||
|
tempValue = value; |
||||||
|
} |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.app.config; |
||||||
|
|
||||||
|
import com.fr.db.fun.impl.AbstractDBAccessProvider; |
||||||
|
import com.fr.stable.db.accessor.DBAccessor; |
||||||
|
import com.fr.stable.db.dao.BaseDAO; |
||||||
|
import com.fr.stable.db.dao.DAOProvider; |
||||||
|
import com.fr.stable.fun.Authorize; |
||||||
|
|
||||||
|
|
||||||
|
@Authorize(callSignKey = "com.fr.plugin.third.party.jsdjjed") |
||||||
|
public class AppConfigAccessBridge extends AbstractDBAccessProvider { |
||||||
|
|
||||||
|
private static DBAccessor dbAccessor = null; |
||||||
|
|
||||||
|
public static DBAccessor getDbAccessor() { |
||||||
|
return dbAccessor; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public DAOProvider[] registerDAO() { |
||||||
|
return new DAOProvider[]{ |
||||||
|
new DAOProvider() { |
||||||
|
@Override |
||||||
|
public Class getEntityClass() { |
||||||
|
return AppConfigEntity.class; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Class<? extends BaseDAO> getDAOClass() { |
||||||
|
return AppConfigDao.class; |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onDBAvailable(DBAccessor dbAccessor) { |
||||||
|
AppConfigAccessBridge.dbAccessor = dbAccessor; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.app.config; |
||||||
|
|
||||||
|
import com.fr.stable.db.dao.BaseDAO; |
||||||
|
import com.fr.stable.db.session.DAOSession; |
||||||
|
|
||||||
|
public class AppConfigDao extends BaseDAO<AppConfigEntity> { |
||||||
|
|
||||||
|
public AppConfigDao(DAOSession daoSession) { |
||||||
|
super(daoSession); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Class<AppConfigEntity> getEntityClass() { |
||||||
|
return AppConfigEntity.class; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,138 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.app.config; |
||||||
|
|
||||||
|
import com.fanruan.api.query.QueryConditionKit; |
||||||
|
import com.fanruan.api.query.RestrictionKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.stable.db.action.DBAction; |
||||||
|
import com.fr.stable.db.dao.DAOContext; |
||||||
|
import com.fr.third.org.apache.commons.collections4.CollectionUtils; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.UUID; |
||||||
|
|
||||||
|
public class AppConfigData { |
||||||
|
public static synchronized List<AppConfigEntity> queryAllAppConfigData() throws Exception { |
||||||
|
List<AppConfigEntity> entities = AppConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction<List<AppConfigEntity>>() { |
||||||
|
@Override |
||||||
|
public List<AppConfigEntity> run(DAOContext daoContext) throws Exception { |
||||||
|
return daoContext.getDAO(AppConfigDao.class).find(QueryConditionKit.newQueryCondition()); |
||||||
|
} |
||||||
|
}); |
||||||
|
if (CollectionUtils.isEmpty(entities)) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
return entities; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized AppConfigEntity queryAppConfigDataWithId(String id) throws Exception { |
||||||
|
AppConfigEntity entity = AppConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction<AppConfigEntity>() { |
||||||
|
@Override |
||||||
|
public AppConfigEntity run(DAOContext daoContext) throws Exception { |
||||||
|
return daoContext.getDAO(AppConfigDao.class).getById(id); |
||||||
|
} |
||||||
|
}); |
||||||
|
return entity; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized List<AppConfigEntity> queryAppConfigDataWithConfigId(String configId) throws Exception { |
||||||
|
List<AppConfigEntity> entities = AppConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction<List<AppConfigEntity>>() { |
||||||
|
@Override |
||||||
|
public List<AppConfigEntity> run(DAOContext daoContext) throws Exception { |
||||||
|
return daoContext.getDAO(AppConfigDao.class).find(QueryConditionKit.newQueryCondition().addRestriction(RestrictionKit.eq("configId", configId))); |
||||||
|
} |
||||||
|
}); |
||||||
|
return entities; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized AppConfigEntity queryAppConfigDataWithLogin() throws Exception { |
||||||
|
List<AppConfigEntity> entities = queryAppConfigDatasWithLogin(); |
||||||
|
if (CollectionUtils.isEmpty(entities)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return entities.get(0); |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized List<AppConfigEntity> queryAppConfigDatasWithLogin() throws Exception { |
||||||
|
List<AppConfigEntity> entities = AppConfigAccessBridge.getDbAccessor().runQueryAction(new DBAction<List<AppConfigEntity>>() { |
||||||
|
@Override |
||||||
|
public List<AppConfigEntity> run(DAOContext daoContext) throws Exception { |
||||||
|
return daoContext.getDAO(AppConfigDao.class).find(QueryConditionKit.newQueryCondition().addRestriction(RestrictionKit.eq("login", 1))); |
||||||
|
} |
||||||
|
}); |
||||||
|
return entities; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static AppConfigEntity queryAppConfigDataWithConfigIdAndOnlyOne(String id) throws Exception { |
||||||
|
List<AppConfigEntity> entities = queryAppConfigDataWithConfigId(id); |
||||||
|
if (CollectionUtils.isEmpty(entities)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
AppConfigEntity entity = entities.get(0); |
||||||
|
return entity; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isAppConfigDataExistsWithConfigId(String configId) throws Exception { |
||||||
|
return isAppConfigDataExistsWithConfigId(configId,""); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static boolean isAppConfigDataExistsWithConfigId(String configId, String id) throws Exception { |
||||||
|
AppConfigEntity entity = queryAppConfigDataWithConfigIdAndOnlyOne(configId); |
||||||
|
if (entity == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (StringKit.isNotEmpty(id) && StringKit.equals(id, entity.getId())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static synchronized AppConfigEntity addAppConfigData(AppConfigEntity appConfigEntity) throws Exception { |
||||||
|
AppConfigEntity resultEntity = AppConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction<AppConfigEntity>() { |
||||||
|
@Override |
||||||
|
public AppConfigEntity run(DAOContext daoContext) throws Exception { |
||||||
|
AppConfigEntity entity = appConfigEntity; |
||||||
|
entity.setId(UUID.randomUUID().toString()); |
||||||
|
daoContext.getDAO(AppConfigDao.class).add(entity); |
||||||
|
return entity; |
||||||
|
} |
||||||
|
}); |
||||||
|
return resultEntity; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized void updateAppConfigData(AppConfigEntity appConfigEntity) throws Exception { |
||||||
|
AppConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction<Boolean>() { |
||||||
|
@Override |
||||||
|
public Boolean run(DAOContext daoContext) throws Exception { |
||||||
|
daoContext.getDAO(AppConfigDao.class).update(appConfigEntity); |
||||||
|
return true; |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized AppConfigEntity deleteAppConfigDataWithId(String id) throws Exception { |
||||||
|
AppConfigEntity appConfigEntity = queryAppConfigDataWithId(id); |
||||||
|
if (appConfigEntity == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
AppConfigEntity resultEntity = AppConfigAccessBridge.getDbAccessor().runDMLAction(new DBAction<AppConfigEntity>() { |
||||||
|
@Override |
||||||
|
public AppConfigEntity run(DAOContext daoContext) throws Exception { |
||||||
|
daoContext.getDAO(AppConfigDao.class).remove(appConfigEntity.getId()); |
||||||
|
return appConfigEntity; |
||||||
|
} |
||||||
|
}); |
||||||
|
return resultEntity; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized AppConfigEntity deleteAppConfigDataWithConfigId(String configId) throws Exception { |
||||||
|
AppConfigEntity appConfigEntity = queryAppConfigDataWithConfigIdAndOnlyOne(configId); |
||||||
|
if (appConfigEntity == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return deleteAppConfigDataWithId(appConfigEntity.getId()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,87 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.app.config; |
||||||
|
|
||||||
|
import com.fr.stable.AssistUtils; |
||||||
|
import com.fr.stable.db.entity.BaseEntity; |
||||||
|
import com.fr.third.javax.persistence.Column; |
||||||
|
import com.fr.third.javax.persistence.Entity; |
||||||
|
import com.fr.third.javax.persistence.Table; |
||||||
|
|
||||||
|
@Entity |
||||||
|
@Table(name = "jsdjjed_feishu_config") |
||||||
|
public class AppConfigEntity extends BaseEntity { |
||||||
|
@Column(name = "config_id") |
||||||
|
private String configId; |
||||||
|
|
||||||
|
@Column(name = "notes") |
||||||
|
private String notes; |
||||||
|
|
||||||
|
@Column(name = "app_id") |
||||||
|
private String appId; |
||||||
|
|
||||||
|
@Column(name = "app_secret") |
||||||
|
private String appSecret; |
||||||
|
|
||||||
|
@Column(name = "login_map") |
||||||
|
private String loginMap; |
||||||
|
|
||||||
|
@Column(name = "login") |
||||||
|
private int login; |
||||||
|
|
||||||
|
|
||||||
|
public AppConfigEntity() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public String getConfigId() { |
||||||
|
return configId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setConfigId(String configId) { |
||||||
|
this.configId = configId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getNotes() { |
||||||
|
return notes; |
||||||
|
} |
||||||
|
|
||||||
|
public void setNotes(String notes) { |
||||||
|
this.notes = notes; |
||||||
|
} |
||||||
|
|
||||||
|
public String getAppId() { |
||||||
|
return appId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAppId(String appId) { |
||||||
|
this.appId = appId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getAppSecret() { |
||||||
|
return appSecret; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAppSecret(String appSecret) { |
||||||
|
this.appSecret = appSecret; |
||||||
|
} |
||||||
|
|
||||||
|
public int getLogin() { |
||||||
|
return login; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLogin(int login) { |
||||||
|
this.login = login; |
||||||
|
} |
||||||
|
|
||||||
|
public String getLoginMap() { |
||||||
|
return loginMap; |
||||||
|
} |
||||||
|
|
||||||
|
public void setLoginMap(String loginMap) { |
||||||
|
this.loginMap = loginMap; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return AssistUtils.toString(this); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,498 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.config; |
||||||
|
|
||||||
|
import com.fr.config.*; |
||||||
|
import com.fr.config.holder.Conf; |
||||||
|
import com.fr.config.holder.factory.Holders; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
|
||||||
|
public class AppDataConfig extends DefaultConfiguration { |
||||||
|
public String getNameSpace() { |
||||||
|
return this.getClass().getName(); |
||||||
|
} |
||||||
|
|
||||||
|
private static volatile AppDataConfig config = null; |
||||||
|
|
||||||
|
public static AppDataConfig getInstance() { |
||||||
|
if (config == null) { |
||||||
|
config = ConfigContext.getConfigInstance(AppDataConfig.class); |
||||||
|
} |
||||||
|
return config; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static volatile Map<String, String> URL_MAP = new HashMap<>(); |
||||||
|
|
||||||
|
public synchronized static void addMapUrl(String key, String url) { |
||||||
|
URL_MAP.put(key, url); |
||||||
|
} |
||||||
|
|
||||||
|
public synchronized static String getMapUrl(String key) { |
||||||
|
if (!URL_MAP.containsKey(key)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String url = URL_MAP.get(key); |
||||||
|
URL_MAP.remove(key); |
||||||
|
return url; |
||||||
|
} |
||||||
|
|
||||||
|
private Conf<String> frUrl = Holders.simple(""); |
||||||
|
private Conf<String> accessTokenUrl = Holders.simple("https://xxx/open-apis/auth/v3/app_access_token/internal"); |
||||||
|
private Conf<String> codeUserUrl = Holders.simple("https://xxx/open-apis/authen/v1/access_token"); |
||||||
|
private Conf<String> chatGroupsUrl = Holders.simple("https://xxx/open-apis/im/v1/chats"); |
||||||
|
private Conf<String> usersUrl = Holders.simple("https://xxx/open-apis/user/v1/batch_get_id"); |
||||||
|
private Conf<String> sendMessageUrl = Holders.simple("https://xxx/open-apis/im/v1/messages"); |
||||||
|
private Conf<String> sendBatchMessageUrl = Holders.simple("https://xxx/open-apis/message/v4/batch_send"); |
||||||
|
private Conf<String> uploadImageUrl = Holders.simple("https://xxx/open-apis/im/v1/images"); |
||||||
|
private Conf<String> uploadFileUrl = Holders.simple("https://xxx/open-apis/im/v1/files"); |
||||||
|
private Conf<String> authorizeUrl = Holders.simple("https://xxx/open-apis/authen/v1/index"); |
||||||
|
|
||||||
|
private Conf<Boolean> accessTokenUrlEscbOption = Holders.simple(true); |
||||||
|
private Conf<Boolean> codeUserUrlEscbOption = Holders.simple(true); |
||||||
|
private Conf<Boolean> chatGroupsUrlEscbOption = Holders.simple(true); |
||||||
|
private Conf<Boolean> usersUrlEscbOption = Holders.simple(true); |
||||||
|
private Conf<Boolean> sendMessageUrlEscbOption = Holders.simple(true); |
||||||
|
private Conf<Boolean> sendBatchMessageUrlEscbOption = Holders.simple(true); |
||||||
|
private Conf<Boolean> uploadImageUrlEscbOption = Holders.simple(false); |
||||||
|
private Conf<Boolean> uploadFileUrlEscbOption = Holders.simple(false); |
||||||
|
private Conf<Boolean> authorizeUrlEscbOption = Holders.simple(false); |
||||||
|
|
||||||
|
private Conf<String> accessTokenUrlEscbCode = Holders.simple("xxx.app.app_access_token"); |
||||||
|
private Conf<String> codeUserUrlEscbCode = Holders.simple("xxx.app.get_user_accessToken"); |
||||||
|
private Conf<String> chatGroupsUrlEscbCode = Holders.simple("xxx.app.get_chat_v4_list"); |
||||||
|
private Conf<String> usersUrlEscbCode = Holders.simple("xxx.app.lark_batch_get_id"); |
||||||
|
private Conf<String> sendMessageUrlEscbCode = Holders.simple("xxx.app.feishu_send_message"); |
||||||
|
private Conf<String> sendBatchMessageUrlEscbCode = Holders.simple("xxx.app.feishu_batch_send"); |
||||||
|
private Conf<String> uploadImageUrlEscbCode = Holders.simple(""); |
||||||
|
private Conf<String> uploadFileUrlEscbCode = Holders.simple(""); |
||||||
|
private Conf<String> authorizeUrlEscbCode = Holders.simple(""); |
||||||
|
|
||||||
|
private Conf<String> accessTokenUrlEscbVersion = Holders.simple("1.0"); |
||||||
|
private Conf<String> codeUserUrlEscbVersion = Holders.simple("1.0"); |
||||||
|
private Conf<String> chatGroupsUrlEscbVersion = Holders.simple("1.0"); |
||||||
|
private Conf<String> usersUrlEscbVersion = Holders.simple("1.0"); |
||||||
|
private Conf<String> sendMessageUrlEscbVersion = Holders.simple("2.0"); |
||||||
|
private Conf<String> sendBatchMessageUrlEscbVersion = Holders.simple("1.0"); |
||||||
|
private Conf<String> uploadImageUrlEscbVersion = Holders.simple(""); |
||||||
|
private Conf<String> uploadFileUrlEscbVersion = Holders.simple(""); |
||||||
|
private Conf<String> authorizeUrlEscbVersion = Holders.simple(""); |
||||||
|
|
||||||
|
private Conf<String> escbUrl = Holders.simple("http://xxxxxx/ecsb/gw/cls/rf"); |
||||||
|
private Conf<String> escbAppCode = Holders.simple("xx"); |
||||||
|
private Conf<String> escbAppToken = Holders.simple("xxx"); |
||||||
|
private Conf<String> escbOrgCode = Holders.simple("xxx"); |
||||||
|
private Conf<String> escbSysCode = Holders.simple("xxx"); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Identifier(value = "loginTypeNameParameter", name = "登录类型参数名称", description = "", status = Status.HIDE) |
||||||
|
private Conf<String> loginTypeNameParameter = Holders.simple("loginType"); |
||||||
|
|
||||||
|
@Identifier(value = "loginTypeValue", name = "登录类型值", description = "", status = Status.HIDE) |
||||||
|
private Conf<String> loginTypeValue = Holders.simple("oauth"); |
||||||
|
|
||||||
|
public String getLoginTypeNameParameter() { |
||||||
|
return loginTypeNameParameter.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setLoginTypeNameParameter(String loginTypeNameParameter) { |
||||||
|
this.loginTypeNameParameter.set(loginTypeNameParameter); |
||||||
|
} |
||||||
|
|
||||||
|
public String getLoginTypeValue() { |
||||||
|
return loginTypeValue.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setLoginTypeValue(String loginTypeValue) { |
||||||
|
this.loginTypeValue.set(loginTypeValue); |
||||||
|
} |
||||||
|
|
||||||
|
public String getFrUrl() { |
||||||
|
return frUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setFrUrl(String frUrl) { |
||||||
|
this.frUrl.set(frUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getAccessTokenUrl() { |
||||||
|
return accessTokenUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAccessTokenUrl(String accessTokenUrl) { |
||||||
|
this.accessTokenUrl.set(accessTokenUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getCodeUserUrl() { |
||||||
|
return codeUserUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCodeUserUrl(String codeUserUrl) { |
||||||
|
this.codeUserUrl.set(codeUserUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getChatGroupsUrl() { |
||||||
|
return chatGroupsUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setChatGroupsUrl(String chatGroupsUrl) { |
||||||
|
this.chatGroupsUrl.set(chatGroupsUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUsersUrl() { |
||||||
|
return usersUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUsersUrl(String usersUrl) { |
||||||
|
this.usersUrl.set(usersUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getSendMessageUrl() { |
||||||
|
return sendMessageUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSendMessageUrl(String sendMessageUrl) { |
||||||
|
this.sendMessageUrl.set(sendMessageUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getSendBatchMessageUrl() { |
||||||
|
return sendBatchMessageUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSendBatchMessageUrl(String sendBatchMessageUrl) { |
||||||
|
this.sendBatchMessageUrl.set(sendBatchMessageUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUploadImageUrl() { |
||||||
|
return uploadImageUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUploadImageUrl(String uploadImageUrl) { |
||||||
|
this.uploadImageUrl.set(uploadImageUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUploadFileUrl() { |
||||||
|
return uploadFileUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUploadFileUrl(String uploadFileUrl) { |
||||||
|
this.uploadFileUrl.set(uploadFileUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getAuthorizeUrl() { |
||||||
|
return authorizeUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAuthorizeUrl(String authorizeUrl) { |
||||||
|
this.authorizeUrl.set(authorizeUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isAccessTokenUrlEscbOption() { |
||||||
|
return accessTokenUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAccessTokenUrlEscbOption(Boolean accessTokenUrlEscbOption) { |
||||||
|
this.accessTokenUrlEscbOption.set(accessTokenUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isCodeUserUrlEscbOption() { |
||||||
|
return codeUserUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCodeUserUrlEscbOption(Boolean codeUserUrlEscbOption) { |
||||||
|
this.codeUserUrlEscbOption.set(codeUserUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isChatGroupsUrlEscbOption() { |
||||||
|
return chatGroupsUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setChatGroupsUrlEscbOption(Boolean chatGroupsUrlEscbOption) { |
||||||
|
this.chatGroupsUrlEscbOption.set(chatGroupsUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isUsersUrlEscbOption() { |
||||||
|
return usersUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUsersUrlEscbOption(Boolean usersUrlEscbOption) { |
||||||
|
this.usersUrlEscbOption.set(usersUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isSendMessageUrlEscbOption() { |
||||||
|
return sendMessageUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSendMessageUrlEscbOption(Boolean sendMessageUrlEscbOption) { |
||||||
|
this.sendMessageUrlEscbOption.set(sendMessageUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isSendBatchMessageUrlEscbOption() { |
||||||
|
return sendBatchMessageUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSendBatchMessageUrlEscbOption(Boolean sendBatchMessageUrlEscbOption) { |
||||||
|
this.sendBatchMessageUrlEscbOption.set(sendBatchMessageUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isUploadImageUrlEscbOption() { |
||||||
|
return uploadImageUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUploadImageUrlEscbOption(Boolean uploadImageUrlEscbOption) { |
||||||
|
this.uploadImageUrlEscbOption.set(uploadImageUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isUploadFileUrlEscbOption() { |
||||||
|
return uploadFileUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUploadFileUrlEscbOption(Boolean uploadFileUrlEscbOption) { |
||||||
|
this.uploadFileUrlEscbOption.set(uploadFileUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public Boolean isAuthorizeUrlEscbOption() { |
||||||
|
return authorizeUrlEscbOption.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAuthorizeUrlEscbOption(Boolean authorizeUrlEscbOption) { |
||||||
|
this.authorizeUrlEscbOption.set(authorizeUrlEscbOption); |
||||||
|
} |
||||||
|
|
||||||
|
public String getAccessTokenUrlEscbCode() { |
||||||
|
return accessTokenUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAccessTokenUrlEscbCode(String accessTokenUrlEscbCode) { |
||||||
|
this.accessTokenUrlEscbCode.set(accessTokenUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getCodeUserUrlEscbCode() { |
||||||
|
return codeUserUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCodeUserUrlEscbCode(String codeUserUrlEscbCode) { |
||||||
|
this.codeUserUrlEscbCode.set(codeUserUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getChatGroupsUrlEscbCode() { |
||||||
|
return chatGroupsUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setChatGroupsUrlEscbCode(String chatGroupsUrlEscbCode) { |
||||||
|
this.chatGroupsUrlEscbCode.set(chatGroupsUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUsersUrlEscbCode() { |
||||||
|
return usersUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUsersUrlEscbCode(String usersUrlEscbCode) { |
||||||
|
this.usersUrlEscbCode.set(usersUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getSendMessageUrlEscbCode() { |
||||||
|
return sendMessageUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSendMessageUrlEscbCode(String sendMessageUrlEscbCode) { |
||||||
|
this.sendMessageUrlEscbCode.set(sendMessageUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getSendBatchMessageUrlEscbCode() { |
||||||
|
return sendBatchMessageUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSendBatchMessageUrlEscbCode(String sendBatchMessageUrlEscbCode) { |
||||||
|
this.sendBatchMessageUrlEscbCode.set(sendBatchMessageUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUploadImageUrlEscbCode() { |
||||||
|
return uploadImageUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUploadImageUrlEscbCode(String uploadImageUrlEscbCode) { |
||||||
|
this.uploadImageUrlEscbCode.set(uploadImageUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUploadFileUrlEscbCode() { |
||||||
|
return uploadFileUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUploadFileUrlEscbCode(String uploadFileUrlEscbCode) { |
||||||
|
this.uploadFileUrlEscbCode.set(uploadFileUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getAuthorizeUrlEscbCode() { |
||||||
|
return authorizeUrlEscbCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAuthorizeUrlEscbCode(String authorizeUrlEscbCode) { |
||||||
|
this.authorizeUrlEscbCode.set(authorizeUrlEscbCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getAccessTokenUrlEscbVersion() { |
||||||
|
return accessTokenUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAccessTokenUrlEscbVersion(String accessTokenUrlEscbVersion) { |
||||||
|
this.accessTokenUrlEscbVersion.set(accessTokenUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getCodeUserUrlEscbVersion() { |
||||||
|
return codeUserUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCodeUserUrlEscbVersion(String codeUserUrlEscbVersion) { |
||||||
|
this.codeUserUrlEscbVersion.set(codeUserUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getChatGroupsUrlEscbVersion() { |
||||||
|
return chatGroupsUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setChatGroupsUrlEscbVersion(String chatGroupsUrlEscbVersion) { |
||||||
|
this.chatGroupsUrlEscbVersion.set(chatGroupsUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUsersUrlEscbVersion() { |
||||||
|
return usersUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUsersUrlEscbVersion(String usersUrlEscbVersion) { |
||||||
|
this.usersUrlEscbVersion.set(usersUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getSendMessageUrlEscbVersion() { |
||||||
|
return sendMessageUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSendMessageUrlEscbVersion(String sendMessageUrlEscbVersion) { |
||||||
|
this.sendMessageUrlEscbVersion.set(sendMessageUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getSendBatchMessageUrlEscbVersion() { |
||||||
|
return sendBatchMessageUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setSendBatchMessageUrlEscbVersion(String sendBatchMessageUrlEscbVersion) { |
||||||
|
this.sendBatchMessageUrlEscbVersion.set(sendBatchMessageUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUploadImageUrlEscbVersion() { |
||||||
|
return uploadImageUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUploadImageUrlEscbVersion(String uploadImageUrlEscbVersion) { |
||||||
|
this.uploadImageUrlEscbVersion.set(uploadImageUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getUploadFileUrlEscbVersion() { |
||||||
|
return uploadFileUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setUploadFileUrlEscbVersion(String uploadFileUrlEscbVersion) { |
||||||
|
this.uploadFileUrlEscbVersion.set(uploadFileUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getAuthorizeUrlEscbVersion() { |
||||||
|
return authorizeUrlEscbVersion.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setAuthorizeUrlEscbVersion(String authorizeUrlEscbVersion) { |
||||||
|
this.authorizeUrlEscbVersion.set(authorizeUrlEscbVersion); |
||||||
|
} |
||||||
|
|
||||||
|
public String getEscbUrl() { |
||||||
|
return escbUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setEscbUrl(String escbUrl) { |
||||||
|
this.escbUrl.set(escbUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getEscbAppCode() { |
||||||
|
return escbAppCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setEscbAppCode(String escbAppCode) { |
||||||
|
this.escbAppCode.set(escbAppCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getEscbAppToken() { |
||||||
|
return escbAppToken.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setEscbAppToken(String escbAppToken) { |
||||||
|
this.escbAppToken.set(escbAppToken); |
||||||
|
} |
||||||
|
|
||||||
|
public String getEscbOrgCode() { |
||||||
|
return escbOrgCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setEscbOrgCode(String escbOrgCode) { |
||||||
|
this.escbOrgCode.set(escbOrgCode); |
||||||
|
} |
||||||
|
|
||||||
|
public String getEscbSysCode() { |
||||||
|
return escbSysCode.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setEscbSysCode(String escbSysCode) { |
||||||
|
this.escbSysCode.set(escbSysCode); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Object clone() throws CloneNotSupportedException { |
||||||
|
AppDataConfig cloned = (AppDataConfig) super.clone(); |
||||||
|
cloned.loginTypeNameParameter = (Conf<String>) loginTypeNameParameter.clone(); |
||||||
|
cloned.loginTypeValue = (Conf<String>) loginTypeValue.clone(); |
||||||
|
cloned.accessTokenUrl = (Conf<String>) accessTokenUrl.clone(); |
||||||
|
cloned.frUrl = (Conf<String>) frUrl.clone(); |
||||||
|
cloned.codeUserUrl = (Conf<String>) codeUserUrl.clone(); |
||||||
|
cloned.chatGroupsUrl = (Conf<String>) chatGroupsUrl.clone(); |
||||||
|
cloned.sendMessageUrl = (Conf<String>) sendMessageUrl.clone(); |
||||||
|
cloned.uploadImageUrl = (Conf<String>) uploadImageUrl.clone(); |
||||||
|
cloned.uploadFileUrl = (Conf<String>) uploadFileUrl.clone(); |
||||||
|
cloned.usersUrl = (Conf<String>) usersUrl.clone(); |
||||||
|
cloned.sendBatchMessageUrl = (Conf<String>) sendBatchMessageUrl.clone(); |
||||||
|
cloned.authorizeUrl = (Conf<String>) authorizeUrl.clone(); |
||||||
|
|
||||||
|
cloned.accessTokenUrlEscbOption = (Conf<Boolean>) accessTokenUrlEscbOption.clone(); |
||||||
|
cloned.codeUserUrlEscbOption = (Conf<Boolean>) codeUserUrlEscbOption.clone(); |
||||||
|
cloned.chatGroupsUrlEscbOption = (Conf<Boolean>) chatGroupsUrlEscbOption.clone(); |
||||||
|
cloned.usersUrlEscbOption = (Conf<Boolean>) usersUrlEscbOption.clone(); |
||||||
|
cloned.sendMessageUrlEscbOption = (Conf<Boolean>) sendMessageUrlEscbOption.clone(); |
||||||
|
cloned.sendBatchMessageUrlEscbOption = (Conf<Boolean>) sendBatchMessageUrlEscbOption.clone(); |
||||||
|
cloned.uploadImageUrlEscbOption = (Conf<Boolean>) uploadImageUrlEscbOption.clone(); |
||||||
|
cloned.uploadFileUrlEscbOption = (Conf<Boolean>) uploadFileUrlEscbOption.clone(); |
||||||
|
cloned.authorizeUrlEscbOption = (Conf<Boolean>) authorizeUrlEscbOption.clone(); |
||||||
|
cloned.accessTokenUrlEscbCode = (Conf<String>) accessTokenUrlEscbCode.clone(); |
||||||
|
cloned.codeUserUrlEscbCode = (Conf<String>) codeUserUrlEscbCode.clone(); |
||||||
|
cloned.chatGroupsUrlEscbCode = (Conf<String>) chatGroupsUrlEscbCode.clone(); |
||||||
|
cloned.usersUrlEscbCode = (Conf<String>) usersUrlEscbCode.clone(); |
||||||
|
cloned.sendMessageUrlEscbCode = (Conf<String>) sendMessageUrlEscbCode.clone(); |
||||||
|
cloned.sendBatchMessageUrlEscbCode = (Conf<String>) sendBatchMessageUrlEscbCode.clone(); |
||||||
|
cloned.uploadImageUrlEscbCode = (Conf<String>) uploadImageUrlEscbCode.clone(); |
||||||
|
cloned.uploadFileUrlEscbCode = (Conf<String>) uploadFileUrlEscbCode.clone(); |
||||||
|
cloned.authorizeUrlEscbCode = (Conf<String>) authorizeUrlEscbCode.clone(); |
||||||
|
cloned.accessTokenUrlEscbVersion = (Conf<String>) accessTokenUrlEscbVersion.clone(); |
||||||
|
cloned.codeUserUrlEscbVersion = (Conf<String>) codeUserUrlEscbVersion.clone(); |
||||||
|
cloned.chatGroupsUrlEscbVersion = (Conf<String>) chatGroupsUrlEscbVersion.clone(); |
||||||
|
cloned.usersUrlEscbVersion = (Conf<String>) usersUrlEscbVersion.clone(); |
||||||
|
cloned.sendMessageUrlEscbVersion = (Conf<String>) sendMessageUrlEscbVersion.clone(); |
||||||
|
cloned.sendBatchMessageUrlEscbVersion = (Conf<String>) sendBatchMessageUrlEscbVersion.clone(); |
||||||
|
cloned.uploadImageUrlEscbVersion = (Conf<String>) uploadImageUrlEscbVersion.clone(); |
||||||
|
cloned.uploadFileUrlEscbVersion = (Conf<String>) uploadFileUrlEscbVersion.clone(); |
||||||
|
cloned.authorizeUrlEscbVersion = (Conf<String>) authorizeUrlEscbVersion.clone(); |
||||||
|
cloned.escbUrl = (Conf<String>) escbUrl.clone(); |
||||||
|
cloned.escbAppCode = (Conf<String>) escbAppCode.clone(); |
||||||
|
cloned.escbAppToken = (Conf<String>) escbAppToken.clone(); |
||||||
|
cloned.escbOrgCode = (Conf<String>) escbOrgCode.clone(); |
||||||
|
cloned.escbSysCode = (Conf<String>) escbSysCode.clone(); |
||||||
|
return cloned; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,687 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.feishu; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.config.AppDataConfig; |
||||||
|
import com.fr.third.org.apache.commons.collections4.CollectionUtils; |
||||||
|
import com.fr.third.org.apache.commons.lang3.time.DateFormatUtils; |
||||||
|
import com.fr.third.org.apache.http.entity.ContentType; |
||||||
|
import com.fr.third.org.apache.http.entity.mime.HttpMultipartMode; |
||||||
|
import com.fr.third.org.apache.http.entity.mime.MultipartEntityBuilder; |
||||||
|
import com.fr.third.org.apache.http.entity.mime.content.FileBody; |
||||||
|
import com.fr.third.org.apache.http.entity.mime.content.InputStreamBody; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
public class FeishuApp { |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取消息类型 |
||||||
|
* |
||||||
|
* @param type |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getMsgType(String type) { |
||||||
|
if ("post".equalsIgnoreCase(type)) { |
||||||
|
return "post"; |
||||||
|
} |
||||||
|
return "text"; |
||||||
|
} |
||||||
|
|
||||||
|
public static String getMsgTypeNotes(String type) { |
||||||
|
if ("post".equalsIgnoreCase(type)) { |
||||||
|
return "富文本"; |
||||||
|
} |
||||||
|
return "文本"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取发送类型 |
||||||
|
* |
||||||
|
* @param type |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getSendType(String type) { |
||||||
|
if ("file".equalsIgnoreCase(type)) { |
||||||
|
return "file"; |
||||||
|
} |
||||||
|
if ("message_file".equalsIgnoreCase(type)) { |
||||||
|
return "message_file"; |
||||||
|
} |
||||||
|
return "message"; |
||||||
|
} |
||||||
|
|
||||||
|
public static String getSendTypeNotes(String type) { |
||||||
|
if ("file".equalsIgnoreCase(type)) { |
||||||
|
return "文件"; |
||||||
|
} |
||||||
|
if ("message_file".equalsIgnoreCase(type)) { |
||||||
|
return "消息与文件"; |
||||||
|
} |
||||||
|
return "消息"; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isSendMessage(String type) { |
||||||
|
if ("message".equalsIgnoreCase(type)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if ("message_file".equalsIgnoreCase(type)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static boolean isSendFile(String type) { |
||||||
|
if ("file".equalsIgnoreCase(type)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if ("message_file".equalsIgnoreCase(type)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取 app_access_token(企业自建应用) |
||||||
|
* |
||||||
|
* @param appId |
||||||
|
* @param appSecret |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public synchronized static String createAppAccessToken(String appId, String appSecret) throws IOException { |
||||||
|
if (StringKit.isEmpty(appId) || StringKit.isEmpty(appSecret)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject bodyJson = new JSONObject(); |
||||||
|
bodyJson.put("app_id", appId); |
||||||
|
bodyJson.put("app_secret", appSecret); |
||||||
|
|
||||||
|
String url = "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal"; |
||||||
|
String configUrl = AppDataConfig.getInstance().getAccessTokenUrl(); |
||||||
|
url = getRealValue(url, configUrl); |
||||||
|
url = getEscbUrl("accessTokenUrl", url); |
||||||
|
String content = Utils.createHttpPostContentWithHttpClient(url, bodyJson.toString(), "application/json; charset=utf-8"); |
||||||
|
if (StringKit.isEmpty(content)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
JSONObject contentJson = new JSONObject(content); |
||||||
|
int code = contentJson.getInt("code"); |
||||||
|
if (code != 0) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String token = contentJson.getString("app_access_token"); |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取登录用户身份 |
||||||
|
* |
||||||
|
* @param codeValue |
||||||
|
* @param accessToken |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public synchronized static FeishuLoginUserBean getLoginUserInfo(String codeValue, String accessToken) throws IOException { |
||||||
|
if (StringKit.isEmpty(codeValue) || StringKit.isEmpty(accessToken)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject bodyJson = new JSONObject(); |
||||||
|
bodyJson.put("grant_type", "authorization_code"); |
||||||
|
bodyJson.put("code", codeValue); |
||||||
|
|
||||||
|
String authorizationValue = "Bearer " + accessToken; |
||||||
|
String url = "https://open.feishu.cn/open-apis/authen/v1/access_token"; |
||||||
|
String configUrl = AppDataConfig.getInstance().getCodeUserUrl(); |
||||||
|
url = getRealValue(url, configUrl); |
||||||
|
String content = Utils.createHttpPostContentWithHttpClient(url, bodyJson.toString(), authorizationValue, "application/json; charset=utf-8"); |
||||||
|
if (StringKit.isEmpty(content)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
JSONObject contentJson = new JSONObject(content); |
||||||
|
int code = contentJson.getInt("code"); |
||||||
|
if (code != 0) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
JSONObject dataJson = contentJson.getJSONObject("data"); |
||||||
|
FeishuLoginUserBean userBean = new FeishuLoginUserBean(); |
||||||
|
userBean.setUserId(dataJson.getString("user_id", "")); |
||||||
|
userBean.setName(dataJson.getString("name", "")); |
||||||
|
userBean.setEnName(dataJson.getString("en_name", "")); |
||||||
|
userBean.setMobile(dataJson.getString("mobile", "")); |
||||||
|
return userBean; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取用户或机器人所在的群列表 |
||||||
|
* |
||||||
|
* @param accessToken |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public synchronized static List<FeishuChatGroupBean> getChatGroups(String accessToken) throws IOException { |
||||||
|
List<FeishuChatGroupBean> chatGroups = new ArrayList<>(); |
||||||
|
if (StringKit.isEmpty(accessToken)) { |
||||||
|
return chatGroups; |
||||||
|
} |
||||||
|
|
||||||
|
String authorizationValue = "Bearer " + accessToken; |
||||||
|
String url = "https://open.feishu.cn/open-apis/im/v1/chats"; |
||||||
|
String configUrl = AppDataConfig.getInstance().getChatGroupsUrl(); |
||||||
|
url = getRealValue(url, configUrl) + "?page_size=100"; |
||||||
|
url = getEscbUrl("chatGroupsUrl", url) + "&page_size=100"; |
||||||
|
String content = Utils.createHttpGetContentWithHttpClient(url, authorizationValue, "application/json; charset=utf-8"); |
||||||
|
if (StringKit.isEmpty(content)) { |
||||||
|
return chatGroups; |
||||||
|
} |
||||||
|
JSONObject contentJson = new JSONObject(content); |
||||||
|
int code = contentJson.getInt("code"); |
||||||
|
if (code != 0) { |
||||||
|
return chatGroups; |
||||||
|
} |
||||||
|
JSONObject dataJson = contentJson.getJSONObject("data"); |
||||||
|
if (!contentJson.containsKey("data")) { |
||||||
|
return chatGroups; |
||||||
|
} |
||||||
|
if (dataJson == null) { |
||||||
|
return chatGroups; |
||||||
|
} |
||||||
|
|
||||||
|
if ((!dataJson.containsKey("items")) && (!dataJson.containsKey("groups"))) { |
||||||
|
return chatGroups; |
||||||
|
} |
||||||
|
|
||||||
|
JSONArray itemJsons = null; |
||||||
|
if (dataJson.containsKey("items")) { |
||||||
|
itemJsons = dataJson.getJSONArray("items"); |
||||||
|
} |
||||||
|
if (dataJson.containsKey("groups")) { |
||||||
|
itemJsons = dataJson.getJSONArray("groups"); |
||||||
|
} |
||||||
|
|
||||||
|
if ((dataJson == null) || (itemJsons.size() <= 0)) { |
||||||
|
return chatGroups; |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject itemJson; |
||||||
|
FeishuChatGroupBean chatGroupBean; |
||||||
|
for (int i = 0, max = itemJsons.size() - 1; i <= max; i++) { |
||||||
|
itemJson = itemJsons.getJSONObject(i); |
||||||
|
chatGroupBean = new FeishuChatGroupBean(); |
||||||
|
chatGroupBean.setChatId(itemJson.getString("chat_id", "")); |
||||||
|
chatGroupBean.setName(itemJson.getString("name", "")); |
||||||
|
chatGroupBean.setDescription(itemJson.getString("description", "")); |
||||||
|
chatGroupBean.setTenantKey(itemJson.getString("tenant_key", "")); |
||||||
|
chatGroups.add(chatGroupBean); |
||||||
|
} |
||||||
|
return chatGroups; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 使用手机号或邮箱获取用户 ID |
||||||
|
* |
||||||
|
* @param emailSet |
||||||
|
* @param mobileSet |
||||||
|
* @param accessToken |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public synchronized static List<String> getFeishuUserId(Set<String> emailSet, Set<String> mobileSet, String accessToken) throws IOException { |
||||||
|
List<String> feishuUserIds = new ArrayList<>(); |
||||||
|
if (StringKit.isEmpty(accessToken)) { |
||||||
|
return feishuUserIds; |
||||||
|
} |
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(emailSet) && CollectionUtils.isEmpty(mobileSet)) { |
||||||
|
return feishuUserIds; |
||||||
|
} |
||||||
|
String emailsContent = getUrlParams("emails", emailSet); |
||||||
|
String mobilesContent = getUrlParams("mobiles", mobileSet); |
||||||
|
|
||||||
|
String authorizationValue = "Bearer " + accessToken; |
||||||
|
String url = "https://open.feishu.cn/open-apis/user/v1/batch_get_id"; |
||||||
|
String configUrl = AppDataConfig.getInstance().getUsersUrl(); |
||||||
|
url = getRealValue(url, configUrl); |
||||||
|
url = getEscbUrl("usersUrl", url); |
||||||
|
int flag = 0; |
||||||
|
if (StringKit.isNotEmpty(emailsContent)) { |
||||||
|
if (url.indexOf("?") > 0) { |
||||||
|
url = url + "&" + emailsContent; |
||||||
|
} else { |
||||||
|
url = url + "?" + emailsContent; |
||||||
|
} |
||||||
|
flag++; |
||||||
|
} |
||||||
|
|
||||||
|
if (StringKit.isNotEmpty(mobilesContent)) { |
||||||
|
if (url.indexOf("?") > 0) { |
||||||
|
url = url + "&" + mobilesContent; |
||||||
|
} else { |
||||||
|
url = url + "?" + mobilesContent; |
||||||
|
} |
||||||
|
flag++; |
||||||
|
} |
||||||
|
if (flag == 0) { |
||||||
|
return feishuUserIds; |
||||||
|
} |
||||||
|
String content = Utils.createHttpGetContentWithHttpClient(url, authorizationValue, "application/json; charset=utf-8"); |
||||||
|
if (StringKit.isEmpty(content)) { |
||||||
|
return feishuUserIds; |
||||||
|
} |
||||||
|
JSONObject contentJson = new JSONObject(content); |
||||||
|
int code = contentJson.getInt("code"); |
||||||
|
if (code != 0) { |
||||||
|
return feishuUserIds; |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject dataJson = contentJson.getJSONObject("data"); |
||||||
|
if (dataJson == null) { |
||||||
|
return feishuUserIds; |
||||||
|
} |
||||||
|
|
||||||
|
Set<String> userIdSet = new HashSet<>(); |
||||||
|
if (dataJson.containsKey("email_users")) { |
||||||
|
JSONObject emailUsersJson = dataJson.getJSONObject("email_users"); |
||||||
|
userIdSet.addAll(getUserIdsByJson(emailUsersJson)); |
||||||
|
} |
||||||
|
|
||||||
|
if (dataJson.containsKey("mobile_users")) { |
||||||
|
JSONObject mobileUsersJson = dataJson.getJSONObject("mobile_users"); |
||||||
|
userIdSet.addAll(getUserIdsByJson(mobileUsersJson)); |
||||||
|
} |
||||||
|
|
||||||
|
feishuUserIds.addAll(userIdSet); |
||||||
|
return feishuUserIds; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 上传图片 |
||||||
|
* |
||||||
|
* @param imageInputStream |
||||||
|
* @param accessToken |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public synchronized static JSONObject uploadImage(InputStream imageInputStream, String accessToken) throws IOException { |
||||||
|
JSONObject fileJson = new JSONObject(); |
||||||
|
if (StringKit.isEmpty(accessToken) || (imageInputStream == null)) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
String authorizationValue = "Bearer " + accessToken; |
||||||
|
String url = "https://open.feishu.cn/open-apis/open-apis/im/v1/images"; |
||||||
|
String configUrl = AppDataConfig.getInstance().getUploadImageUrl(); |
||||||
|
url = getRealValue(url, configUrl); |
||||||
|
url = getEscbUrl("uploadImageUrl", url); |
||||||
|
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); |
||||||
|
multipartEntityBuilder.addTextBody("image_type", "message"); |
||||||
|
multipartEntityBuilder.addPart("image", new InputStreamBody(imageInputStream, "image.png")); |
||||||
|
String content = Utils.createHttpPostContentWithHttpClient(url, multipartEntityBuilder, authorizationValue, ""); |
||||||
|
if (StringKit.isEmpty(content)) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
JSONObject contentJson = new JSONObject(content); |
||||||
|
int code = contentJson.getInt("code"); |
||||||
|
if (code != 0) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
JSONObject dataJson = contentJson.getJSONObject("data"); |
||||||
|
if (dataJson == null) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
return dataJson; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 上传文件 |
||||||
|
* |
||||||
|
* @param fileType |
||||||
|
* @param fileName |
||||||
|
* @param fileInputStream |
||||||
|
* @param accessToken |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public synchronized static JSONObject uploadFile(String fileType, String fileName, InputStream fileInputStream, String accessToken) throws IOException { |
||||||
|
JSONObject fileJson = new JSONObject(); |
||||||
|
if (StringKit.isEmpty(accessToken) || StringKit.isEmpty(fileName) || (fileInputStream == null)) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
String fileTypeValue = StringKit.trim(fileType); |
||||||
|
if (StringKit.isEmpty(fileTypeValue)) { |
||||||
|
fileTypeValue = "stream"; |
||||||
|
} else { |
||||||
|
fileTypeValue = fileTypeValue.toLowerCase(); |
||||||
|
String[] defaultFileTypes = {"opus", "mp4", "pdf", "doc", "xls", "ppt", "stream"}; |
||||||
|
int flag = 0; |
||||||
|
for (int i = 0, max = defaultFileTypes.length - 1; i <= max; i++) { |
||||||
|
if (StringKit.equals(fileTypeValue, defaultFileTypes[i])) { |
||||||
|
flag++; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
if (flag == 0) { |
||||||
|
fileTypeValue = "stream"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
String authorizationValue = "Bearer " + accessToken; |
||||||
|
String url = "https://open.feishu.cn/open-apis/open-apis/im/v1/files"; |
||||||
|
String configUrl = AppDataConfig.getInstance().getUploadFileUrl(); |
||||||
|
url = getRealValue(url, configUrl); |
||||||
|
url = getEscbUrl("uploadFileUrl", url); |
||||||
|
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); |
||||||
|
multipartEntityBuilder.addTextBody("file_type", fileTypeValue,ContentType.create("text/plain",Charset.forName("UTF-8"))); |
||||||
|
multipartEntityBuilder.addTextBody("file_name", fileName,ContentType.create("text/plain",Charset.forName("UTF-8"))); |
||||||
|
multipartEntityBuilder.addBinaryBody("file", fileInputStream); |
||||||
|
String content = Utils.createHttpPostContentWithHttpClient(url, multipartEntityBuilder, authorizationValue, ""); |
||||||
|
if (StringKit.isEmpty(content)) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
JSONObject contentJson = new JSONObject(content); |
||||||
|
int code = contentJson.getInt("code"); |
||||||
|
if (code != 0) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
JSONObject dataJson = contentJson.getJSONObject("data"); |
||||||
|
if (dataJson == null) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
return dataJson; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isValidFileJson(JSONObject fileJson) { |
||||||
|
if (fileJson == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
if (fileJson.containsKey("file_key")) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isValidImageJson(JSONObject fileJson) { |
||||||
|
if (fileJson == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
if (fileJson.containsKey("image_key")) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送消息 |
||||||
|
* |
||||||
|
* @param receiveIdType |
||||||
|
* @param receiveId |
||||||
|
* @param msgContent |
||||||
|
* @param msgType |
||||||
|
* @param accessToken |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public synchronized static void sendMessage(String receiveIdType, String receiveId, String msgContent, String msgType, String accessToken) throws IOException { |
||||||
|
if (StringKit.isEmpty(receiveIdType) || StringKit.isEmpty(receiveId) || StringKit.isEmpty(msgContent) || StringKit.isEmpty(msgType) || StringKit.isEmpty(accessToken)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject bodyJson = new JSONObject(); |
||||||
|
//bodyJson.put("receive_id_type", receiveIdType);
|
||||||
|
bodyJson.put("receive_id", receiveId); |
||||||
|
bodyJson.put("content", msgContent); |
||||||
|
bodyJson.put("msg_type", msgType); |
||||||
|
|
||||||
|
String authorizationValue = "Bearer " + accessToken; |
||||||
|
String url = "https://open.feishu.cn/open-apis/im/v1/messages"; |
||||||
|
String configUrl = AppDataConfig.getInstance().getSendMessageUrl(); |
||||||
|
url = getRealValue(url, configUrl) + "?receive_id_type=" + receiveIdType; |
||||||
|
url = getEscbUrl("sendMessageUrl", url) + "&receive_id_type=" + receiveIdType; |
||||||
|
String content = Utils.createHttpPostContentWithHttpClient(url, bodyJson.toString(), authorizationValue, "application/json; charset=utf-8"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送文本消息 |
||||||
|
* |
||||||
|
* @param receiveIdType |
||||||
|
* @param receiveId |
||||||
|
* @param textContent |
||||||
|
* @param accessToken |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static void sendMessageWithText(String receiveIdType, String receiveId, String textContent, String accessToken) throws IOException { |
||||||
|
JSONObject textJson = new JSONObject(); |
||||||
|
textJson.put("text", textContent); |
||||||
|
sendMessage(receiveIdType, receiveId, textJson.toString(), "text", accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送群文本消息 |
||||||
|
* |
||||||
|
* @param chatId |
||||||
|
* @param textContent |
||||||
|
* @param accessToken |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static void sendGroupMessageWithText(String chatId, String textContent, String accessToken) throws IOException { |
||||||
|
sendMessageWithText("chat_id", chatId, textContent, accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
public static void sendMessageWithImage(String receiveIdType, String receiveId, String imageContent, String accessToken) throws IOException { |
||||||
|
sendMessage(receiveIdType, receiveId, imageContent, "image", accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
public static void sendGroupMessageWithImage(String chatId, String imageContent, String accessToken) throws IOException { |
||||||
|
sendMessageWithImage("chat_id", chatId, imageContent, accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
public static void sendMessageWithFile(String receiveIdType, String receiveId, String fileContent, String accessToken) throws IOException { |
||||||
|
sendMessage(receiveIdType, receiveId, fileContent, "file", accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
public static void sendMessageWithFileByUserId(String receiveId, String fileContent, String accessToken) throws IOException { |
||||||
|
sendMessage("user_id", receiveId, fileContent, "file", accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
public static void sendGroupMessageWithFile(String chatId, String fileContent, String accessToken) throws IOException { |
||||||
|
sendMessageWithFile("chat_id", chatId, fileContent, accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public synchronized static void sendBatchMessage(List<String> userIds, String msgContent, String msgType, String accessToken) throws IOException { |
||||||
|
if (CollectionUtils.isEmpty(userIds) || StringKit.isEmpty(msgContent) || StringKit.isEmpty(msgType) || StringKit.isEmpty(accessToken)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
JSONArray userIdJsons = new JSONArray(); |
||||||
|
for (int i = 0, max = userIds.size() - 1; i <= max; i++) { |
||||||
|
userIdJsons.add(userIds.get(i)); |
||||||
|
} |
||||||
|
JSONObject bodyJson = new JSONObject(); |
||||||
|
bodyJson.put("content", new JSONObject(msgContent)); |
||||||
|
bodyJson.put("msg_type", msgType); |
||||||
|
bodyJson.put("user_ids", userIdJsons); |
||||||
|
|
||||||
|
String authorizationValue = "Bearer " + accessToken; |
||||||
|
String url = "https://open.feishu.cn/open-apis/message/v4/batch_send"; |
||||||
|
String configUrl = AppDataConfig.getInstance().getSendBatchMessageUrl(); |
||||||
|
url = getRealValue(url, configUrl); |
||||||
|
url = getEscbUrl("sendBatchMessageUrl", url); |
||||||
|
String content = Utils.createHttpPostContentWithHttpClient(url, bodyJson.toString(), authorizationValue, "application/json; charset=utf-8"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static String getEscbUrl(String type, String originalUrl) { |
||||||
|
boolean escbOption = false; |
||||||
|
String escbCode = ""; |
||||||
|
String escbVersion = ""; |
||||||
|
|
||||||
|
if ("accessTokenUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isAccessTokenUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getAccessTokenUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getAccessTokenUrlEscbVersion(); |
||||||
|
} else if ("codeUserUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isCodeUserUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getCodeUserUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getCodeUserUrlEscbVersion(); |
||||||
|
} else if ("chatGroupsUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isChatGroupsUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getChatGroupsUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getChatGroupsUrlEscbVersion(); |
||||||
|
} else if ("usersUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isUsersUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getUsersUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getUsersUrlEscbVersion(); |
||||||
|
} else if ("sendMessageUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isSendMessageUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getSendMessageUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getSendMessageUrlEscbVersion(); |
||||||
|
} else if ("sendBatchMessageUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isSendBatchMessageUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getSendBatchMessageUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getSendBatchMessageUrlEscbVersion(); |
||||||
|
} else if ("uploadImageUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isUploadImageUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getUploadImageUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getUploadImageUrlEscbVersion(); |
||||||
|
} else if ("uploadFileUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isUploadFileUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getUploadFileUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getUploadFileUrlEscbVersion(); |
||||||
|
} else if ("authorizeUrl".equals(type)) { |
||||||
|
escbOption = AppDataConfig.getInstance().isAuthorizeUrlEscbOption(); |
||||||
|
escbCode = AppDataConfig.getInstance().getAuthorizeUrlEscbCode(); |
||||||
|
escbVersion = AppDataConfig.getInstance().getAuthorizeUrlEscbVersion(); |
||||||
|
} else { |
||||||
|
return originalUrl; |
||||||
|
} |
||||||
|
|
||||||
|
if ((!escbOption) || StringKit.isEmpty(escbCode)) { |
||||||
|
return originalUrl; |
||||||
|
} |
||||||
|
|
||||||
|
if (StringKit.isEmpty(escbVersion)) { |
||||||
|
escbVersion = "1.0"; |
||||||
|
} |
||||||
|
|
||||||
|
String ssdpValue = "Api_ID=" + escbCode |
||||||
|
+ "&Api_Version=" + escbVersion |
||||||
|
+ "&App_Sub_ID=" + AppDataConfig.getInstance().getEscbAppCode() |
||||||
|
+ "&App_Token=" + AppDataConfig.getInstance().getEscbAppToken() |
||||||
|
+ "&Partner_ID=" + AppDataConfig.getInstance().getEscbOrgCode() |
||||||
|
+ "&Sign=NO_SIGN" |
||||||
|
+ "&Sys_ID=" + AppDataConfig.getInstance().getEscbSysCode() |
||||||
|
+ "&Time_Stamp=" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss:SSS") |
||||||
|
+ "&User_Token="; |
||||||
|
LogKit.info("飞书集成," + type + ",ssdp:" + ssdpValue); |
||||||
|
|
||||||
|
Base64.Encoder encoder = Base64.getEncoder(); |
||||||
|
String url = AppDataConfig.getInstance().getEscbUrl() + "?ssdp=" + new String(encoder.encode(ssdpValue.getBytes())); |
||||||
|
LogKit.info("飞书集成,ssdp url:" + url); |
||||||
|
return url; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static void sendBatchMessageWithText(List<String> userIds, String textContent, String accessToken) throws IOException { |
||||||
|
JSONObject textJson = new JSONObject(); |
||||||
|
textJson.put("text", textContent); |
||||||
|
sendBatchMessage(userIds, textJson.toString(), "text", accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
public static void sendBatchMessageWithRichText(List<String> userIds, String textContent, String accessToken) throws IOException { |
||||||
|
JSONObject textJson = new JSONObject(); |
||||||
|
textJson.put("post", new JSONObject(textContent)); |
||||||
|
sendBatchMessage(userIds, textJson.toString(), "post", accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static void sendBatchMessageWithImage(List<String> userIds, String imageContent, String accessToken) throws IOException { |
||||||
|
sendBatchMessage(userIds, imageContent, "image", accessToken); |
||||||
|
} |
||||||
|
|
||||||
|
public static void sendBatchMessageWithFile(List<String> userIds, String fileContent, String accessToken) throws IOException { |
||||||
|
//sendBatchMessage(userIds, fileContent, "file", accessToken);
|
||||||
|
//批量发送不支持发送文件
|
||||||
|
if (CollectionUtils.isEmpty(userIds)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
for (int i = 0, max = userIds.size() - 1; i <= max; i++) { |
||||||
|
sendMessageWithFileByUserId(userIds.get(i), fileContent, accessToken); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static List<String> getUserIdsByJson(JSONObject dataJson) { |
||||||
|
List<String> userIds = new ArrayList<>(); |
||||||
|
if (dataJson == null) { |
||||||
|
return userIds; |
||||||
|
} |
||||||
|
|
||||||
|
Set<String> fieldNames = dataJson.fieldNames(); |
||||||
|
if (CollectionUtils.isEmpty(fieldNames)) { |
||||||
|
return userIds; |
||||||
|
} |
||||||
|
|
||||||
|
JSONArray tempJsons; |
||||||
|
JSONObject tempJson; |
||||||
|
for (String fieldName : fieldNames) { |
||||||
|
tempJsons = dataJson.getJSONArray(fieldName); |
||||||
|
if ((tempJsons == null) || (tempJsons.size() <= 0)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
for (int i = 0, max = tempJsons.size() - 1; i <= max; i++) { |
||||||
|
tempJson = tempJsons.getJSONObject(i); |
||||||
|
userIds.add(tempJson.getString("user_id")); |
||||||
|
} |
||||||
|
} |
||||||
|
return userIds; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static String getUrlParams(String paramName, Set<String> valueSet) { |
||||||
|
if (StringKit.isEmpty(paramName) || CollectionUtils.isEmpty(valueSet)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
List<String> values = new ArrayList<>(); |
||||||
|
values.addAll(valueSet); |
||||||
|
String paramsContent = ""; |
||||||
|
String value; |
||||||
|
int count = 0; |
||||||
|
for (int i = 0, max = values.size() - 1; i <= max; i++) { |
||||||
|
if (count >= 1) { |
||||||
|
paramsContent = paramsContent + "&"; |
||||||
|
} |
||||||
|
value = values.get(i); |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
paramsContent = paramsContent + paramName + "=" + value; |
||||||
|
count++; |
||||||
|
} |
||||||
|
return paramsContent; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static String getRealValue(String value, String value1) { |
||||||
|
String tempValue = StringKit.trim(value1); |
||||||
|
if (StringKit.isEmpty(tempValue)) { |
||||||
|
return value; |
||||||
|
} |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.feishu; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
public class FeishuChatGroupBean implements Serializable { |
||||||
|
/** |
||||||
|
* 群组 ID chat_id |
||||||
|
*/ |
||||||
|
private String chatId; |
||||||
|
/** |
||||||
|
* 群名称 |
||||||
|
*/ |
||||||
|
private String name; |
||||||
|
/** |
||||||
|
* 群描述 |
||||||
|
*/ |
||||||
|
private String description; |
||||||
|
/** |
||||||
|
* tenant_key |
||||||
|
*/ |
||||||
|
private String tenantKey; |
||||||
|
|
||||||
|
|
||||||
|
public String getChatId() { |
||||||
|
return chatId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setChatId(String chatId) { |
||||||
|
this.chatId = chatId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public void setName(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
public String getDescription() { |
||||||
|
return description; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDescription(String description) { |
||||||
|
this.description = description; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTenantKey() { |
||||||
|
return tenantKey; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTenantKey(String tenantKey) { |
||||||
|
this.tenantKey = tenantKey; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,63 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.feishu; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
public class FeishuLoginUserBean implements Serializable { |
||||||
|
/** |
||||||
|
* 用户 user_id |
||||||
|
*/ |
||||||
|
private String userId; |
||||||
|
/** |
||||||
|
* 用户姓名 |
||||||
|
*/ |
||||||
|
private String name; |
||||||
|
/** |
||||||
|
* 用户英文名称 |
||||||
|
*/ |
||||||
|
private String enName; |
||||||
|
/** |
||||||
|
* 用户手机号 |
||||||
|
*/ |
||||||
|
private String mobile; |
||||||
|
|
||||||
|
|
||||||
|
public String getUserId() { |
||||||
|
return userId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setUserId(String userId) { |
||||||
|
this.userId = userId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public void setName(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
public String getEnName() { |
||||||
|
return enName; |
||||||
|
} |
||||||
|
|
||||||
|
public void setEnName(String enName) { |
||||||
|
this.enName = enName; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMobile() { |
||||||
|
return mobile; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMobile(String value) { |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
this.mobile = ""; |
||||||
|
} |
||||||
|
if (value.startsWith("+86")) { |
||||||
|
value = value.substring(3); |
||||||
|
} |
||||||
|
this.mobile = value; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.handle; |
||||||
|
|
||||||
|
import com.fr.general.ReportDeclareRecordType; |
||||||
|
import com.fr.io.exporter.ScaledImageExporter; |
||||||
|
import com.fr.main.workbook.ResultWorkBook; |
||||||
|
import com.fr.schedule.extension.report.job.output.BaseOutputFormat; |
||||||
|
|
||||||
|
import java.io.OutputStream; |
||||||
|
|
||||||
|
public class ImageOutputFormat extends BaseOutputFormat { |
||||||
|
public static final int FORMAT_IMAGE = 4096; |
||||||
|
|
||||||
|
public int getFormat() { |
||||||
|
return FORMAT_IMAGE; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFileSuffix() { |
||||||
|
return ".png"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void flush(OutputStream outputStream, ResultWorkBook resultWorkBook) throws Exception { |
||||||
|
|
||||||
|
ScaledImageExporter exporter = new ScaledImageExporter(ReportDeclareRecordType.EXPORT_TYPE_IMAGE_PNG.getTypeString(), 96); |
||||||
|
exporter.export(outputStream, resultWorkBook); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.http.app.*; |
||||||
|
|
||||||
|
|
||||||
|
public class CustomHttpHandlerProvider extends AbstractHttpHandlerProvider { |
||||||
|
@Override |
||||||
|
public BaseHttpHandler[] registerHandlers() { |
||||||
|
return new BaseHttpHandler[]{ |
||||||
|
new AddAppHttpHandler(), |
||||||
|
new DeleteAppHttpHandler(), |
||||||
|
new EditAppHttpHandler(), |
||||||
|
new QueryAppHttpHandler(), |
||||||
|
new ForbidAppHttpHandler(), |
||||||
|
new QueryAppConfigHttpHandler(), |
||||||
|
new SaveAppConfigHttpHandler(), |
||||||
|
new QueryChatGroupsHttpHandler(), |
||||||
|
new SynchronizeSourceHttpHandler() |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractURLAliasProvider; |
||||||
|
import com.fr.decision.webservice.url.alias.URLAlias; |
||||||
|
import com.fr.decision.webservice.url.alias.URLAliasFactory; |
||||||
|
|
||||||
|
public class CustomURLAliasProvider extends AbstractURLAliasProvider { |
||||||
|
@Override |
||||||
|
public URLAlias[] registerAlias() { |
||||||
|
return new URLAlias[]{ |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/add/app", "/jsdjjed/add/app", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/delete/app", "/jsdjjed/delete/app", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/edit/app", "/jsdjjed/edit/app", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/query/app", "/jsdjjed/query/app", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/forbid/app", "/jsdjjed/forbid/app", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/query/config/app", "/jsdjjed/query/config/app", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/save/config/app", "/jsdjjed/save/config/app", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/query/chat/group", "/jsdjjed/query/chat/group", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdjjed/synchronize/source", "/jsdjjed/synchronize/source", true), |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,566 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.query.QueryConditionKit; |
||||||
|
import com.fanruan.api.query.RestrictionKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.authority.AuthorityContext; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||||
|
import com.fr.decision.webservice.v10.login.LoginService; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.general.ComparatorUtils; |
||||||
|
import com.fr.plugin.context.PluginContexts; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.config.AppDataConfig; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.feishu.FeishuApp; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.feishu.FeishuLoginUserBean; |
||||||
|
import com.fr.stable.query.condition.QueryCondition; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.FilterChain; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
|
||||||
|
public class SessionGlobalRequestFilterProvider extends AbstractGlobalRequestFilterProvider { |
||||||
|
private static String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"; |
||||||
|
|
||||||
|
@Override |
||||||
|
public String filterName() { |
||||||
|
return "ttt.com.fr.plugin.third.party.jsdjjed"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] urlPatterns() { |
||||||
|
return new String[]{"/decision", "/decision/*"}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||||
|
try { |
||||||
|
|
||||||
|
String fullUrl = Utils.getFullRequestUrl(req); |
||||||
|
String method = req.getMethod(); |
||||||
|
LogKit.info("飞书登录集成,记录访问地址:" + method + " " + fullUrl); |
||||||
|
if (!"GET".equalsIgnoreCase(method)) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
String reqUrl = Utils.getRequestUrl(req); |
||||||
|
|
||||||
|
if (Utils.isDecisionLoginRequest(req)) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (reqUrl.indexOf("/remote/") >= 0) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (reqUrl.indexOf("terminal=H5") >= 0) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (reqUrl.indexOf("__device__=") >= 0) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (reqUrl.indexOf("/weixin/") >= 0) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (reqUrl.indexOf("/dingtalk/") >= 0) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
String state; |
||||||
|
if (isAllowLoginWithParameter(req)) { |
||||||
|
reqUrl = getRequestUrl(req); |
||||||
|
state = UUID.randomUUID().toString(); |
||||||
|
AppDataConfig.getInstance().addMapUrl(state, reqUrl); |
||||||
|
String tempUrl = getFullAuthorizeUrl(state); |
||||||
|
LogKit.info("飞书登录集成,请求认证地址:" + tempUrl); |
||||||
|
sendRedirect(res, tempUrl); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (isAllowLoginWithLightApp(req)) { |
||||||
|
reqUrl = getRequestUrl(req); |
||||||
|
state = UUID.randomUUID().toString(); |
||||||
|
AppDataConfig.getInstance().addMapUrl(state, reqUrl); |
||||||
|
LogKit.info("飞书登录集成,报表轻应用跳转"); |
||||||
|
AppConfigEntity appConfigEntity = AppConfigData.queryAppConfigDataWithLogin(); |
||||||
|
if (appConfigEntity == null) { |
||||||
|
LogKit.info("飞书登录集成,报表轻应用跳转,没有获取到登录飞书凭证"); |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
String loginContent = "<!DOCTYPE html>\n" + |
||||||
|
"<html lang=\"en\">\n" + |
||||||
|
"<head>\n" + |
||||||
|
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n" + |
||||||
|
" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>\n" + |
||||||
|
" <title>数据决策系统</title>\n" + |
||||||
|
" <script type=\"text/javascript\"\n" + |
||||||
|
" src=\"/webroot/decision/file?path=/com/fr/plugin/third/party/jsdjjed/sdk/h5-js-sdk-1.5.12.js&type=plain&parser=plain\"></script>\n" + |
||||||
|
" <script type=\"text/javascript\"\n" + |
||||||
|
" src=\"/webroot/decision/file?path=/com/fr/plugin/third/party/jsdjjed/sdk/runworkhelp.js&type=plain&parser=plain\"></script>\n" + |
||||||
|
" <script type=\"text/javascript\"\n" + |
||||||
|
" src=\"/webroot/decision/file?path=/com/fr/plugin/third/party/jsdjjed/sdk/vconsole.min.js&type=plain&parser=plain\"></script>\n" + |
||||||
|
"</head>\n" + |
||||||
|
"<body>\n" + |
||||||
|
"<h2>轻应用跳转中,请稍等...</h2>\n" + |
||||||
|
//"<button onclick=\"test()\">测试</button>"+
|
||||||
|
"<script type=\"text/javascript\">\n" + |
||||||
|
" var runWorkH5 = new window.runworkHelp.RunWorkH5({\n" + |
||||||
|
" env: \"uat\",\n" + |
||||||
|
" devUser: \"xm\",\n" + |
||||||
|
" isLocal: false,\n" + |
||||||
|
" appId: \"" + appConfigEntity.getAppId() + "\",\n" + |
||||||
|
" appSecret: \"" + appConfigEntity.getAppSecret() + "\",\n" + |
||||||
|
" isHrInfo: true,\n" + |
||||||
|
" isCross: true\n" + |
||||||
|
" });\n" + |
||||||
|
" runWorkH5.initReady().then(() => {\n" + |
||||||
|
|
||||||
|
" if (runWorkH5.user && runWorkH5.user.user_id) {\n" + |
||||||
|
" var state = \"" + state + "\";\n" + |
||||||
|
" window.location = \"/webroot/decision?login=feishu&light_app_id=\" + runWorkH5.user.user_id + \"&state=\" + state;\n" + |
||||||
|
" }\n" + |
||||||
|
"else {\n" + |
||||||
|
"document.write('<h3>获取user_id出错,请联系管理员</h3>');\n" + |
||||||
|
"}" + |
||||||
|
" });\n" + |
||||||
|
"function test(){ \n" + |
||||||
|
"\n" + |
||||||
|
" var vConsole = new window.VConsole();\n" + |
||||||
|
" \n" + |
||||||
|
" vConsole.show();\n" + |
||||||
|
"console.log('Hello world');\n" + |
||||||
|
" debugger;\n" + |
||||||
|
" var runWorkH5 = new window.runworkHelp.RunWorkH5({\n" + |
||||||
|
" env: \"uat\",\n" + |
||||||
|
" devUser: \"xm\",\n" + |
||||||
|
" isLocal: false,\n" + |
||||||
|
" appId: \"" + appConfigEntity.getAppId() + "\",\n" + |
||||||
|
" appSecret: \"" + appConfigEntity.getAppSecret() + "\",\n" + |
||||||
|
" isHrInfo: true,\n" + |
||||||
|
" isCross: true\n" + |
||||||
|
" });\n" + |
||||||
|
"\t\n" + |
||||||
|
"vConsole.log(runWorkH5);\t\n" + |
||||||
|
" runWorkH5.initReady().then(() => {\n" + |
||||||
|
" debugger;\n" + |
||||||
|
"vConsole.log(runWorkH5);\n" + |
||||||
|
"if (runWorkH5.user && runWorkH5.user.user_id) {\n" + |
||||||
|
"document.write('<h3>runWorkH5.user.user_id:'+runWorkH5.user.user_id+'</h3>');\n" + |
||||||
|
"}\n" + |
||||||
|
"\n" + |
||||||
|
"if (runWorkH5.user && runWorkH5.user.name) {\n" + |
||||||
|
"document.write('<h3>runWorkH5.user.name:'+runWorkH5.user.name+'</h3>');\n" + |
||||||
|
"}\n" + |
||||||
|
"\n" + |
||||||
|
"if (runWorkH5.user && runWorkH5.user.en_name) {\n" + |
||||||
|
"document.write('<h3>runWorkH5.user.en_name:'+runWorkH5.user.en_name+'</h3>');\n" + |
||||||
|
"}\n" + |
||||||
|
"\n" + |
||||||
|
"if (runWorkH5.user && runWorkH5.user.open_id) {\n" + |
||||||
|
"document.write('<h3>runWorkH5.user.open_id:'+runWorkH5.user.open_id+'</h3>');\n" + |
||||||
|
"} });\n" + |
||||||
|
"\n" + |
||||||
|
"}" + |
||||||
|
"</script>\n" + |
||||||
|
"</body>\n" + |
||||||
|
"</html>\n"; |
||||||
|
res.setContentType("text/html;charset=UTF-8"); |
||||||
|
WebUtils.printAsString(res, loginContent); |
||||||
|
res.setStatus(200); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
String loginUsername = getOauthLoginUsername(req); |
||||||
|
if (StringKit.isEmpty(loginUsername)) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
LogKit.info("飞书登录集成,用户名:" + loginUsername); |
||||||
|
|
||||||
|
User user = UserService.getInstance().getUserByUserName(loginUsername); |
||||||
|
boolean tipsOption = false; |
||||||
|
String tipsContent = ""; |
||||||
|
if (user == null) { |
||||||
|
tipsOption = true; |
||||||
|
LogKit.info("飞书登录集成,用户名:" + loginUsername + "在报表平台不存在"); |
||||||
|
tipsContent = "在报表服务器上不存在"; |
||||||
|
} else if (!user.isEnable()) { |
||||||
|
tipsOption = true; |
||||||
|
LogKit.info("飞书登录集成,用户名:" + loginUsername + "在报表平台上被禁用"); |
||||||
|
tipsContent = "在报表平台上被禁用"; |
||||||
|
} |
||||||
|
|
||||||
|
//添加认证
|
||||||
|
if (!PluginContexts.currentContext().isAvailable()) { |
||||||
|
tipsOption = true; |
||||||
|
LogKit.error("飞书登录集成插件试用过期, 请购买许可证"); |
||||||
|
tipsContent = "飞书登录集成插件试用过期, 请购买许可证"; |
||||||
|
} |
||||||
|
|
||||||
|
if (tipsOption) { |
||||||
|
String jumpContent = "<!doctype html>\n" + |
||||||
|
"<head>\n" + |
||||||
|
" <meta charset=\"utf-8\" />\n" + |
||||||
|
" <title>提示</title>\n" + |
||||||
|
"\t\n" + |
||||||
|
"<script type=\"text/javascript\">\n" + |
||||||
|
"window.onload=function(){\n" + |
||||||
|
" alert(\"用户:" + loginUsername + tipsContent + ",请联系管理员!\");\n" + |
||||||
|
" window.location = \"" + AppDataConfig.getInstance().getFrUrl() + "\";\n" + |
||||||
|
"}\n" + |
||||||
|
"</script>\t\n" + |
||||||
|
"</head>\n" + |
||||||
|
"<body>\n" + |
||||||
|
" <div style=\"width: 100%;height:200px; line-height: 200px;font-size:30px;vertical-align:middle;text-align:center\">\n" + |
||||||
|
" <span id=\"show\"></span>\n" + |
||||||
|
" </div>\n" + |
||||||
|
"</body>\n" + |
||||||
|
"</html>"; |
||||||
|
res.setContentType("text/html;charset=UTF-8"); |
||||||
|
WebUtils.printAsString(res, jumpContent); |
||||||
|
res.setStatus(200); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
loginUsername = user.getUserName(); |
||||||
|
LogKit.info("飞书登录集成,报表平台用户名:" + loginUsername); |
||||||
|
|
||||||
|
|
||||||
|
String loginToken = LoginService.getInstance().login(req, res, loginUsername); |
||||||
|
req.setAttribute("fine_auth_token", loginToken); |
||||||
|
|
||||||
|
String reqUrl1 = getRealUrl(req); |
||||||
|
if (StringKit.isNotEmpty(reqUrl1) && (!StringKit.equals(reqUrl1, fullUrl))) { |
||||||
|
sendRedirect(res, reqUrl1); |
||||||
|
return; |
||||||
|
} |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error("飞书登录集成出错," + e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String getRealUrl(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String state = WebUtils.getHTTPRequestParameter(req, "state"); |
||||||
|
if (StringKit.isEmpty(state)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String url = AppDataConfig.getInstance().getMapUrl(state); |
||||||
|
url = addLoginPara(url); |
||||||
|
return url; |
||||||
|
} |
||||||
|
|
||||||
|
private String addLoginPara(String url) { |
||||||
|
if (StringKit.isEmpty(url)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
if ((url.indexOf("&login=feishu") >= 0) || (url.indexOf("?login=feishu") >= 0)) { |
||||||
|
return url; |
||||||
|
} |
||||||
|
if (url.indexOf("?") >= 0) { |
||||||
|
url = url + "&login=feishu"; |
||||||
|
return url; |
||||||
|
} |
||||||
|
url = url + "?login=feishu"; |
||||||
|
return url; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private String getFullAuthorizeUrl(String state) throws Exception { |
||||||
|
|
||||||
|
AppConfigEntity configEntity = AppConfigData.queryAppConfigDataWithLogin(); |
||||||
|
if (configEntity == null) { |
||||||
|
LogKit.error("飞书登录集成,没有登录验证的应用凭证信息0"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
AppDataConfig config = AppDataConfig.getInstance(); |
||||||
|
String tempUrl = config.getFrUrl(); |
||||||
|
String url = config.getAuthorizeUrl() + "?app_id=" + configEntity.getAppId() + "&redirect_uri=" + tempUrl + "&state=" + state; |
||||||
|
LogKit.info("飞书登录集成,请求用户授权地址:" + url); |
||||||
|
return url; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private String getOauthLoginUsername(HttpServletRequest req) throws Exception { |
||||||
|
if (req == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String lightAppId = StringKit.trim(WebUtils.getHTTPRequestParameter(req, "light_app_id")); |
||||||
|
if (StringKit.isNotEmpty(lightAppId)) { |
||||||
|
lightAppId = lightAppId.toUpperCase(); |
||||||
|
return lightAppId; |
||||||
|
} |
||||||
|
|
||||||
|
String oAuthCode = WebUtils.getHTTPRequestParameter(req, "code"); |
||||||
|
if (StringKit.isEmpty(oAuthCode)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
LogKit.info("飞书登录集成,OAuth Code:" + oAuthCode); |
||||||
|
|
||||||
|
|
||||||
|
AppConfigEntity configEntity = AppConfigData.queryAppConfigDataWithLogin(); |
||||||
|
if (configEntity == null) { |
||||||
|
LogKit.error("飞书登录集成,没有登录验证的应用凭证信息1"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String accessToken = FeishuApp.createAppAccessToken(configEntity.getAppId(), configEntity.getAppSecret()); |
||||||
|
if (StringKit.isEmpty(accessToken)) { |
||||||
|
LogKit.error("飞书登录集成,获取app_access_token为空"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
FeishuLoginUserBean loginUserBean = FeishuApp.getLoginUserInfo(oAuthCode, accessToken); |
||||||
|
if (loginUserBean == null) { |
||||||
|
LogKit.error("飞书登录集成,获取登录信息为空"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
String loginMap = configEntity.getLoginMap(); |
||||||
|
QueryCondition queryCondition = getUserQueryCondition(loginMap, loginUserBean); |
||||||
|
if (queryCondition == null) { |
||||||
|
LogKit.error("飞书登录集成,用户信息没有有效的映射匹配"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
List<User> perfectMatchUsers = AuthorityContext.getInstance().getUserController().find(queryCondition); |
||||||
|
if ((perfectMatchUsers == null) || (perfectMatchUsers.size() <= 0)) { |
||||||
|
LogKit.error("飞书登录集成,没有匹配到用户信息"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
if (perfectMatchUsers.size() >= 2) { |
||||||
|
LogKit.error("飞书登录集成,匹配到多个用户信息"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
User user = perfectMatchUsers.get(0); |
||||||
|
String username = user.getUserName(); |
||||||
|
return username; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private QueryCondition getUserQueryCondition(String loginMap, FeishuLoginUserBean loginUserBean) { |
||||||
|
if (StringKit.isEmpty(loginMap)) { |
||||||
|
loginMap = "name"; |
||||||
|
} |
||||||
|
Set<String> usernameValues = new HashSet<>(); |
||||||
|
String[] loginNames = loginMap.split(","); |
||||||
|
String loginName; |
||||||
|
String mobile = ""; |
||||||
|
for (int i = 0, max = loginNames.length - 1; i <= max; i++) { |
||||||
|
loginName = StringKit.trim(loginNames[i]); |
||||||
|
if (StringKit.isEmpty(loginName)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (StringKit.equalsIgnoreCase("name", loginName) && StringKit.isNotEmpty(loginUserBean.getName())) { |
||||||
|
usernameValues.add(loginUserBean.getName()); |
||||||
|
} else if (StringKit.equalsIgnoreCase("en_name", loginName) && StringKit.isNotEmpty(loginUserBean.getEnName())) { |
||||||
|
usernameValues.add(loginUserBean.getEnName()); |
||||||
|
} else if (StringKit.equalsIgnoreCase("user_id", loginName) && StringKit.isNotEmpty(loginUserBean.getUserId())) { |
||||||
|
usernameValues.add(loginUserBean.getUserId()); |
||||||
|
usernameValues.add(loginUserBean.getUserId().toUpperCase()); |
||||||
|
} else if (StringKit.equalsIgnoreCase("mobile", loginName) && StringKit.isNotEmpty(loginUserBean.getMobile())) { |
||||||
|
mobile = loginUserBean.getMobile(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
int queryCount = 0; |
||||||
|
QueryCondition queryCondition = QueryConditionKit.newQueryCondition(); |
||||||
|
if (usernameValues.size() >= 1) { |
||||||
|
queryCount++; |
||||||
|
queryCondition.addRestriction(RestrictionKit.in("userName", usernameValues)); |
||||||
|
} |
||||||
|
if (StringKit.isNotEmpty(mobile)) { |
||||||
|
queryCount++; |
||||||
|
queryCondition.addRestriction(RestrictionKit.eq("mobile", mobile)); |
||||||
|
} |
||||||
|
if (queryCount <= 0) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return queryCondition; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public synchronized static String getSysTime() { |
||||||
|
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); |
||||||
|
Date date = new Date(); |
||||||
|
String nowData = format.format(date); |
||||||
|
return nowData; |
||||||
|
} |
||||||
|
|
||||||
|
private void sendRedirect(HttpServletResponse res, String url) { |
||||||
|
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); |
||||||
|
res.setHeader("Location", url); |
||||||
|
} |
||||||
|
|
||||||
|
private String getRequestUrl(HttpServletRequest req) { |
||||||
|
String fullUrl = req.getRequestURL().toString(); |
||||||
|
fullUrl = getRealUrl(fullUrl); |
||||||
|
Map<String, String[]> paraMap = req.getParameterMap(); |
||||||
|
String paraName; |
||||||
|
String[] paraValues; |
||||||
|
String loginTypeParaName = AppDataConfig.getInstance().getLoginTypeNameParameter(); |
||||||
|
String queryStr = ""; |
||||||
|
for (Map.Entry<String, String[]> entry : paraMap.entrySet()) { |
||||||
|
paraName = entry.getKey(); |
||||||
|
if (ComparatorUtils.equals(paraName, loginTypeParaName)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (ComparatorUtils.equals(paraName, "code")) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (ComparatorUtils.equals(paraName, "state")) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (ComparatorUtils.equals(paraName, "login_type")) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (ComparatorUtils.equals(paraName, "light_app")) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
paraValues = entry.getValue(); |
||||||
|
queryStr = addParaToQuery(queryStr, paraName, paraValues); |
||||||
|
} |
||||||
|
if (StringKit.isEmpty(queryStr)) { |
||||||
|
return fullUrl; |
||||||
|
} |
||||||
|
fullUrl = fullUrl + "?" + queryStr; |
||||||
|
return fullUrl; |
||||||
|
} |
||||||
|
|
||||||
|
private String getRealUrl(String url) { |
||||||
|
if (StringKit.isEmpty(url)) { |
||||||
|
return url; |
||||||
|
} |
||||||
|
int index = url.indexOf("/decision"); |
||||||
|
if (index < 0) { |
||||||
|
return url; |
||||||
|
} |
||||||
|
String tempUrl = AppDataConfig.getInstance().getFrUrl() + url.substring(index + "/decision".length()); |
||||||
|
return tempUrl; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private String addParaToQuery(String query, String paraName, String[] paraValues) { |
||||||
|
if (StringKit.isEmpty(paraName)) { |
||||||
|
return query; |
||||||
|
} |
||||||
|
String fullQuery = query; |
||||||
|
if ((paraValues == null) || (paraValues.length <= 0)) { |
||||||
|
if (StringKit.isNotEmpty(fullQuery)) { |
||||||
|
fullQuery = fullQuery + "&"; |
||||||
|
} |
||||||
|
fullQuery = fullQuery + paraName + "="; |
||||||
|
return fullQuery; |
||||||
|
} |
||||||
|
for (int i = 0, max = paraValues.length - 1; i <= max; i++) { |
||||||
|
if (StringKit.isNotEmpty(fullQuery)) { |
||||||
|
fullQuery = fullQuery + "&"; |
||||||
|
} |
||||||
|
fullQuery = fullQuery + paraName + "=" + Utils.encodeUrlWithUtf8(paraValues[i]); |
||||||
|
} |
||||||
|
return fullQuery; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private boolean isAllowLoginWithParameter(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String loginTypeNameParameter = "login_type"; |
||||||
|
String loginTypeConfigValue = "feishu"; |
||||||
|
if (StringKit.isEmpty(loginTypeNameParameter) || StringKit.isEmpty(loginTypeConfigValue)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String loginTypeValue = WebUtils.getHTTPRequestParameter(req, loginTypeNameParameter); |
||||||
|
return ComparatorUtils.equalsIgnoreCase(loginTypeConfigValue, loginTypeValue); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private boolean isAllowLoginWithLightApp(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String loginTypeNameParameter = "light_app"; |
||||||
|
String loginTypeConfigValue = "feishu"; |
||||||
|
if (StringKit.isEmpty(loginTypeNameParameter) || StringKit.isEmpty(loginTypeConfigValue)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String loginTypeValue = WebUtils.getHTTPRequestParameter(req, loginTypeNameParameter); |
||||||
|
return ComparatorUtils.equalsIgnoreCase(loginTypeConfigValue, loginTypeValue); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private boolean isReportRequest(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (!"GET".equalsIgnoreCase(req.getMethod())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String url = req.getRequestURL().toString(); |
||||||
|
if (url.endsWith("/decision") || url.endsWith("/decision/")) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if ((url.indexOf("/decision/") >= 0) && (url.indexOf("/entry/access/") >= 0)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
String viewlet = WebUtils.getHTTPRequestParameter(req, "viewlet"); |
||||||
|
if ((url.indexOf("/decision/view/report") >= 0) && (StringKit.isNotEmpty(viewlet))) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
if ((url.indexOf("/decision/view/form") >= 0) && (StringKit.isNotEmpty(viewlet))) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isOauthCodeRequest(HttpServletRequest req) throws IOException { |
||||||
|
if (req == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (!"GET".equalsIgnoreCase(req.getMethod())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String oAuthCode = WebUtils.getHTTPRequestParameter(req, "code"); |
||||||
|
if (StringKit.isNotEmpty(oAuthCode)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private boolean isNoAuthRequest(HttpServletRequest req) throws IOException { |
||||||
|
if (req == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (!"GET".equalsIgnoreCase(req.getMethod())) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String oAuthCode = WebUtils.getHTTPRequestParameter(req, "loginType"); |
||||||
|
if (StringKit.equalsIgnoreCase("noauth", oAuthCode)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.general.IOUtils; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class AddAppHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.POST; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/add/app"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
String repBody = IOUtils.inputStream2String(req.getInputStream(), "UTF-8"); |
||||||
|
if (StringKit.isEmpty(repBody)) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("请求内容为空")); |
||||||
|
return; |
||||||
|
} |
||||||
|
JSONObject reqJson = new JSONObject(repBody); |
||||||
|
AppConfigEntity appConfigEntity = reqJson.mapTo(AppConfigEntity.class); |
||||||
|
appConfigEntity.setConfigId(toLowerCase(appConfigEntity.getConfigId())); |
||||||
|
if (AppConfigData.isAppConfigDataExistsWithConfigId(appConfigEntity.getConfigId())) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("应用唯一标识已存在")); |
||||||
|
return; |
||||||
|
} |
||||||
|
AppConfigData.addAppConfigData(appConfigEntity); |
||||||
|
WebUtils.printAsJSON(res, Utils.getSuccessResultJson()); |
||||||
|
} |
||||||
|
|
||||||
|
private String toLowerCase(String value) { |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return value.toLowerCase(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.general.IOUtils; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class DeleteAppHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.DELETE; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/delete/app"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
String repBody = IOUtils.inputStream2String(req.getInputStream(), "UTF-8"); |
||||||
|
if (StringKit.isEmpty(repBody)) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("请求内容为空")); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject removeJson = new JSONObject(repBody); |
||||||
|
JSONArray idJsons = removeJson.getJSONArray("removeUserIds"); |
||||||
|
if ((idJsons == null) || (idJsons.size() <= 0)) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getSuccessResultJson()); |
||||||
|
return; |
||||||
|
} |
||||||
|
String id; |
||||||
|
int size = idJsons.size(); |
||||||
|
for (int i = 0, max = size - 1; i <= max; i++) { |
||||||
|
id = idJsons.getString(i); |
||||||
|
AppConfigData.deleteAppConfigDataWithId(id); |
||||||
|
} |
||||||
|
String resultContent = "{\"data\":{\"count\":" + size + "},\"stauts\":\"success\"}"; |
||||||
|
WebUtils.printAsString(res, resultContent); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,60 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.general.IOUtils; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
|
||||||
|
public class EditAppHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.PUT; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/edit/app"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
String repBody = IOUtils.inputStream2String(req.getInputStream(), "UTF-8"); |
||||||
|
if (StringKit.isEmpty(repBody)) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("请求内容为空")); |
||||||
|
return; |
||||||
|
} |
||||||
|
JSONObject reqJson = new JSONObject(repBody); |
||||||
|
AppConfigEntity appConfigEntity = reqJson.mapTo(AppConfigEntity.class); |
||||||
|
if (AppConfigData.isAppConfigDataExistsWithConfigId(appConfigEntity.getConfigId(), appConfigEntity.getId())) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("应用唯一标识已存在")); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
AppConfigEntity entity = AppConfigData.queryAppConfigDataWithConfigIdAndOnlyOne(appConfigEntity.getConfigId()); |
||||||
|
if (entity == null) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("应用唯一标识不存在")); |
||||||
|
return; |
||||||
|
} |
||||||
|
appConfigEntity.setLogin(entity.getLogin()); |
||||||
|
AppConfigData.updateAppConfigData(appConfigEntity); |
||||||
|
WebUtils.printAsJSON(res, Utils.getSuccessResultJson()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,64 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.general.IOUtils; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class ForbidAppHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.PUT; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/forbid/app"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
String repBody = IOUtils.inputStream2String(req.getInputStream(), "UTF-8"); |
||||||
|
if (StringKit.isEmpty(repBody)) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("请求内容为空")); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject forbidJson = new JSONObject(repBody); |
||||||
|
boolean enable = forbidJson.getBoolean("enable"); |
||||||
|
String id = forbidJson.getString("id"); |
||||||
|
|
||||||
|
int login = 0; |
||||||
|
if (enable) { |
||||||
|
login = 1; |
||||||
|
} |
||||||
|
AppConfigEntity entity = AppConfigData.queryAppConfigDataWithId(id); |
||||||
|
if (entity == null) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getSuccessResultJson()); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
entity.setLogin(login); |
||||||
|
AppConfigData.updateAppConfigData(entity); |
||||||
|
WebUtils.printAsJSON(res, Utils.getSuccessResultJson()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,97 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.config.AppDataConfig; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class QueryAppConfigHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.GET; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/query/config/app"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
JSONObject dataJson = getConfigJsonData(); |
||||||
|
WebUtils.printAsJSON(res, dataJson); |
||||||
|
} |
||||||
|
|
||||||
|
private JSONObject getConfigJsonData() { |
||||||
|
JSONObject dataJson = new JSONObject(); |
||||||
|
dataJson.put("frUrl", AppDataConfig.getInstance().getFrUrl()); |
||||||
|
dataJson.put("accessTokenUrl", AppDataConfig.getInstance().getAccessTokenUrl()); |
||||||
|
dataJson.put("codeUserUrl", AppDataConfig.getInstance().getCodeUserUrl()); |
||||||
|
dataJson.put("chatGroupsUrl", AppDataConfig.getInstance().getChatGroupsUrl()); |
||||||
|
dataJson.put("usersUrl", AppDataConfig.getInstance().getUsersUrl()); |
||||||
|
dataJson.put("sendMessageUrl", AppDataConfig.getInstance().getSendMessageUrl()); |
||||||
|
dataJson.put("sendBatchMessageUrl", AppDataConfig.getInstance().getSendBatchMessageUrl()); |
||||||
|
dataJson.put("uploadImageUrl", AppDataConfig.getInstance().getUploadImageUrl()); |
||||||
|
dataJson.put("uploadFileUrl", AppDataConfig.getInstance().getUploadFileUrl()); |
||||||
|
dataJson.put("authorizeUrl", AppDataConfig.getInstance().getAuthorizeUrl()); |
||||||
|
|
||||||
|
dataJson.put("accessTokenUrlEscbOption", AppDataConfig.getInstance().isAccessTokenUrlEscbOption()); |
||||||
|
dataJson.put("codeUserUrlEscbOption", AppDataConfig.getInstance().isCodeUserUrlEscbOption()); |
||||||
|
dataJson.put("chatGroupsUrlEscbOption", AppDataConfig.getInstance().isChatGroupsUrlEscbOption()); |
||||||
|
dataJson.put("usersUrlEscbOption", AppDataConfig.getInstance().isUsersUrlEscbOption()); |
||||||
|
dataJson.put("sendMessageUrlEscbOption", AppDataConfig.getInstance().isSendMessageUrlEscbOption()); |
||||||
|
dataJson.put("sendBatchMessageUrlEscbOption", AppDataConfig.getInstance().isSendBatchMessageUrlEscbOption()); |
||||||
|
dataJson.put("uploadImageUrlEscbOption", AppDataConfig.getInstance().isUploadImageUrlEscbOption()); |
||||||
|
dataJson.put("uploadFileUrlEscbOption", AppDataConfig.getInstance().isUploadFileUrlEscbOption()); |
||||||
|
dataJson.put("authorizeUrlEscbOption", AppDataConfig.getInstance().isAuthorizeUrlEscbOption()); |
||||||
|
dataJson.put("accessTokenUrlEscbCode", AppDataConfig.getInstance().getAccessTokenUrlEscbCode()); |
||||||
|
dataJson.put("codeUserUrlEscbCode", AppDataConfig.getInstance().getCodeUserUrlEscbCode()); |
||||||
|
dataJson.put("chatGroupsUrlEscbCode", AppDataConfig.getInstance().getChatGroupsUrlEscbCode()); |
||||||
|
dataJson.put("usersUrlEscbCode", AppDataConfig.getInstance().getUsersUrlEscbCode()); |
||||||
|
dataJson.put("sendMessageUrlEscbCode", AppDataConfig.getInstance().getSendMessageUrlEscbCode()); |
||||||
|
dataJson.put("sendBatchMessageUrlEscbCode", AppDataConfig.getInstance().getSendBatchMessageUrlEscbCode()); |
||||||
|
dataJson.put("uploadImageUrlEscbCode", AppDataConfig.getInstance().getUploadImageUrlEscbCode()); |
||||||
|
dataJson.put("uploadFileUrlEscbCode", AppDataConfig.getInstance().getUploadFileUrlEscbCode()); |
||||||
|
dataJson.put("authorizeUrlEscbCode", AppDataConfig.getInstance().getAuthorizeUrlEscbCode()); |
||||||
|
dataJson.put("accessTokenUrlEscbVersion", AppDataConfig.getInstance().getAccessTokenUrlEscbVersion()); |
||||||
|
dataJson.put("codeUserUrlEscbVersion", AppDataConfig.getInstance().getCodeUserUrlEscbVersion()); |
||||||
|
dataJson.put("chatGroupsUrlEscbVersion", AppDataConfig.getInstance().getChatGroupsUrlEscbVersion()); |
||||||
|
dataJson.put("usersUrlEscbVersion", AppDataConfig.getInstance().getUsersUrlEscbVersion()); |
||||||
|
dataJson.put("sendMessageUrlEscbVersion", AppDataConfig.getInstance().getSendMessageUrlEscbVersion()); |
||||||
|
dataJson.put("sendBatchMessageUrlEscbVersion", AppDataConfig.getInstance().getSendBatchMessageUrlEscbVersion()); |
||||||
|
dataJson.put("uploadImageUrlEscbVersion", AppDataConfig.getInstance().getUploadImageUrlEscbVersion()); |
||||||
|
dataJson.put("uploadFileUrlEscbVersion", AppDataConfig.getInstance().getUploadFileUrlEscbVersion()); |
||||||
|
dataJson.put("authorizeUrlEscbVersion", AppDataConfig.getInstance().getAuthorizeUrlEscbVersion()); |
||||||
|
dataJson.put("escbUrl", AppDataConfig.getInstance().getEscbUrl()); |
||||||
|
dataJson.put("escbAppCode", AppDataConfig.getInstance().getEscbAppCode()); |
||||||
|
dataJson.put("escbAppToken", AppDataConfig.getInstance().getEscbAppToken()); |
||||||
|
dataJson.put("escbOrgCode", AppDataConfig.getInstance().getEscbOrgCode()); |
||||||
|
dataJson.put("escbSysCode", AppDataConfig.getInstance().getEscbSysCode()); |
||||||
|
|
||||||
|
dataJson.put("page", 1); |
||||||
|
JSONObject json = Utils.getSuccessResultJson(); |
||||||
|
json.put("data", dataJson); |
||||||
|
return json; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,71 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class QueryAppHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.GET; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/query/app"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
List<AppConfigEntity> entities = AppConfigData.queryAllAppConfigData(); |
||||||
|
JSONObject dataJson = createJsonData(entities); |
||||||
|
WebUtils.printAsJSON(res, dataJson); |
||||||
|
} |
||||||
|
|
||||||
|
private JSONObject createJsonData(List<AppConfigEntity> entities) { |
||||||
|
int total = entities.size(); |
||||||
|
JSONArray itemsJsons = new JSONArray(); |
||||||
|
AppConfigEntity entity; |
||||||
|
JSONObject itemsJson; |
||||||
|
for (int i = 0, max = total - 1; i <= max; i++) { |
||||||
|
entity = entities.get(i); |
||||||
|
itemsJson = JSONObject.mapFrom(entity); |
||||||
|
if (entity.getLogin() == 1) { |
||||||
|
itemsJson.put("enable", true); |
||||||
|
} else { |
||||||
|
itemsJson.put("enable", false); |
||||||
|
} |
||||||
|
itemsJson.put("show", entity.getConfigId() + "_" + entity.getNotes()); |
||||||
|
itemsJsons.add(itemsJson); |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject dataJson = new JSONObject(); |
||||||
|
dataJson.put("total", total); |
||||||
|
dataJson.put("page", 1); |
||||||
|
dataJson.put("items", itemsJsons); |
||||||
|
|
||||||
|
JSONObject json = new JSONObject(); |
||||||
|
json.put("data", dataJson); |
||||||
|
return json; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.feishu.FeishuApp; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.feishu.FeishuChatGroupBean; |
||||||
|
import com.fr.third.org.apache.commons.collections4.CollectionUtils; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class QueryChatGroupsHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.GET; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/query/chat/group"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
String configId = WebUtils.getHTTPRequestParameter(req, "config_id"); |
||||||
|
if (StringKit.isEmpty(configId)) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("应用唯一标识为空")); |
||||||
|
return; |
||||||
|
} |
||||||
|
JSONObject dataJson = createJsonData(configId); |
||||||
|
WebUtils.printAsJSON(res, dataJson); |
||||||
|
} |
||||||
|
|
||||||
|
private JSONObject createJsonData(String configId) throws Exception { |
||||||
|
AppConfigEntity configEntity = AppConfigData.queryAppConfigDataWithConfigIdAndOnlyOne(configId); |
||||||
|
if (configEntity == null) { |
||||||
|
return Utils.getFailuresResultJson("应用唯一标识无效,没有对应配置信息"); |
||||||
|
} |
||||||
|
|
||||||
|
String appId = configEntity.getAppId(); |
||||||
|
String appSecret = configEntity.getAppSecret(); |
||||||
|
String accessToken = FeishuApp.createAppAccessToken(appId, appSecret); |
||||||
|
if (StringKit.isEmpty(accessToken)) { |
||||||
|
return Utils.getFailuresResultJson("获取app_access_token为空"); |
||||||
|
} |
||||||
|
List<FeishuChatGroupBean> chatGroupBeans = FeishuApp.getChatGroups(accessToken); |
||||||
|
if (CollectionUtils.isEmpty(chatGroupBeans)) { |
||||||
|
return Utils.getFailuresResultJson("获取群列表为空"); |
||||||
|
} |
||||||
|
|
||||||
|
int total = chatGroupBeans.size(); |
||||||
|
JSONArray itemsJsons = new JSONArray(); |
||||||
|
FeishuChatGroupBean entity; |
||||||
|
JSONObject itemsJson; |
||||||
|
String show; |
||||||
|
for (int i = 0, max = total - 1; i <= max; i++) { |
||||||
|
entity = chatGroupBeans.get(i); |
||||||
|
itemsJson = JSONObject.mapFrom(entity); |
||||||
|
show = entity.getName() + "_" + entity.getChatId(); |
||||||
|
itemsJson.put("show", show); |
||||||
|
itemsJsons.add(itemsJson); |
||||||
|
} |
||||||
|
|
||||||
|
JSONObject dataJson = new JSONObject(); |
||||||
|
dataJson.put("total", total); |
||||||
|
dataJson.put("page", 1); |
||||||
|
dataJson.put("items", itemsJsons); |
||||||
|
|
||||||
|
JSONObject json = Utils.getSuccessResultJson(); |
||||||
|
json.put("data", dataJson); |
||||||
|
return json; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,105 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.general.IOUtils; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.config.AppDataConfig; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
|
||||||
|
public class SaveAppConfigHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.PUT; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/save/config/app"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
String repBody = IOUtils.inputStream2String(req.getInputStream(), "UTF-8"); |
||||||
|
if (StringKit.isEmpty(repBody)) { |
||||||
|
WebUtils.printAsJSON(res, Utils.getFailuresResultJson("请求内容为空")); |
||||||
|
return; |
||||||
|
} |
||||||
|
JSONObject reqJson = new JSONObject(repBody); |
||||||
|
String frUrl = reqJson.getString("frUrl", ""); |
||||||
|
String accessTokenUrl = reqJson.getString("accessTokenUrl", ""); |
||||||
|
String codeUserUrl = reqJson.getString("codeUserUrl", ""); |
||||||
|
String chatGroupsUrl = reqJson.getString("chatGroupsUrl", ""); |
||||||
|
String usersUrl = reqJson.getString("usersUrl", ""); |
||||||
|
String sendMessageUrl = reqJson.getString("sendMessageUrl", ""); |
||||||
|
String sendBatchMessageUrl = reqJson.getString("sendBatchMessageUrl", ""); |
||||||
|
String uploadImageUrl = reqJson.getString("uploadImageUrl", ""); |
||||||
|
String uploadFileUrl = reqJson.getString("uploadFileUrl", ""); |
||||||
|
String authorizeUrl = reqJson.getString("authorizeUrl", ""); |
||||||
|
|
||||||
|
AppDataConfig.getInstance().setFrUrl(frUrl); |
||||||
|
AppDataConfig.getInstance().setAccessTokenUrl(accessTokenUrl); |
||||||
|
AppDataConfig.getInstance().setCodeUserUrl(codeUserUrl); |
||||||
|
AppDataConfig.getInstance().setChatGroupsUrl(chatGroupsUrl); |
||||||
|
AppDataConfig.getInstance().setUsersUrl(usersUrl); |
||||||
|
AppDataConfig.getInstance().setSendMessageUrl(sendMessageUrl); |
||||||
|
AppDataConfig.getInstance().setSendBatchMessageUrl(sendBatchMessageUrl); |
||||||
|
AppDataConfig.getInstance().setUploadImageUrl(uploadImageUrl); |
||||||
|
AppDataConfig.getInstance().setUploadFileUrl(uploadFileUrl); |
||||||
|
AppDataConfig.getInstance().setAuthorizeUrl(authorizeUrl); |
||||||
|
|
||||||
|
AppDataConfig.getInstance().setAccessTokenUrlEscbOption(reqJson.getBoolean("accessTokenUrlEscbOption")); |
||||||
|
AppDataConfig.getInstance().setCodeUserUrlEscbOption(reqJson.getBoolean("codeUserUrlEscbOption")); |
||||||
|
AppDataConfig.getInstance().setChatGroupsUrlEscbOption(reqJson.getBoolean("chatGroupsUrlEscbOption")); |
||||||
|
AppDataConfig.getInstance().setUsersUrlEscbOption(reqJson.getBoolean("usersUrlEscbOption")); |
||||||
|
AppDataConfig.getInstance().setSendMessageUrlEscbOption(reqJson.getBoolean("sendMessageUrlEscbOption")); |
||||||
|
AppDataConfig.getInstance().setSendBatchMessageUrlEscbOption(reqJson.getBoolean("sendBatchMessageUrlEscbOption")); |
||||||
|
AppDataConfig.getInstance().setUploadImageUrlEscbOption(reqJson.getBoolean("uploadImageUrlEscbOption")); |
||||||
|
AppDataConfig.getInstance().setUploadFileUrlEscbOption(reqJson.getBoolean("uploadFileUrlEscbOption")); |
||||||
|
AppDataConfig.getInstance().setAuthorizeUrlEscbOption(reqJson.getBoolean("authorizeUrlEscbOption")); |
||||||
|
|
||||||
|
|
||||||
|
AppDataConfig.getInstance().setAccessTokenUrlEscbCode(reqJson.getString("accessTokenUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setCodeUserUrlEscbCode(reqJson.getString("codeUserUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setChatGroupsUrlEscbCode(reqJson.getString("chatGroupsUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setUsersUrlEscbCode(reqJson.getString("usersUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setSendMessageUrlEscbCode(reqJson.getString("sendMessageUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setSendBatchMessageUrlEscbCode(reqJson.getString("sendBatchMessageUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setUploadImageUrlEscbCode(reqJson.getString("uploadImageUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setUploadFileUrlEscbCode(reqJson.getString("uploadFileUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setAuthorizeUrlEscbCode(reqJson.getString("authorizeUrlEscbCode","")); |
||||||
|
AppDataConfig.getInstance().setAccessTokenUrlEscbVersion(reqJson.getString("accessTokenUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setCodeUserUrlEscbVersion(reqJson.getString("codeUserUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setChatGroupsUrlEscbVersion(reqJson.getString("chatGroupsUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setUsersUrlEscbVersion(reqJson.getString("usersUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setSendMessageUrlEscbVersion(reqJson.getString("sendMessageUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setSendBatchMessageUrlEscbVersion(reqJson.getString("sendBatchMessageUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setUploadImageUrlEscbVersion(reqJson.getString("uploadImageUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setUploadFileUrlEscbVersion(reqJson.getString("uploadFileUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setAuthorizeUrlEscbVersion(reqJson.getString("authorizeUrlEscbVersion","")); |
||||||
|
AppDataConfig.getInstance().setEscbUrl(reqJson.getString("escbUrl","")); |
||||||
|
AppDataConfig.getInstance().setEscbAppCode(reqJson.getString("escbAppCode","")); |
||||||
|
AppDataConfig.getInstance().setEscbAppToken(reqJson.getString("escbAppToken","")); |
||||||
|
AppDataConfig.getInstance().setEscbOrgCode(reqJson.getString("escbOrgCode","")); |
||||||
|
AppDataConfig.getInstance().setEscbSysCode(reqJson.getString("escbSysCode","")); |
||||||
|
|
||||||
|
WebUtils.printAsJSON(res, Utils.getSuccessResultJson()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.http.app; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.config.AppDataConfig; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class SynchronizeSourceHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.GET; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdjjed/synchronize/source"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
JSONObject dataJson = getConfigJsonData(); |
||||||
|
WebUtils.printAsJSON(res, dataJson); |
||||||
|
} |
||||||
|
|
||||||
|
private JSONObject getConfigJsonData() { |
||||||
|
JSONObject dataJson = new JSONObject("{\"data\":{\"type\":0}}"); |
||||||
|
return dataJson; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,410 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.base.DataSetFunctionParameterMapNameSpace; |
||||||
|
import com.fr.base.TemplateUtils; |
||||||
|
import com.fr.decision.authority.AuthorityContext; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.io.utils.ResourceIOUtils; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.context.PluginContexts; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigData; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.app.config.AppConfigEntity; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.feishu.FeishuApp; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.bean.OutputAppMessagePush; |
||||||
|
import com.fr.schedule.base.constant.ScheduleConstants; |
||||||
|
import com.fr.schedule.extension.report.job.output.BaseOutputFormat; |
||||||
|
import com.fr.schedule.feature.output.OutputActionHandler; |
||||||
|
import com.fr.script.Calculator; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.query.QueryFactory; |
||||||
|
import com.fr.stable.query.restriction.RestrictionFactory; |
||||||
|
import com.fr.third.org.apache.commons.collections4.CollectionUtils; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
public class AppMessagePushHandler extends OutputActionHandler<OutputAppMessagePush> { |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void doAction(OutputAppMessagePush action, Map<String, Object> map) throws Exception { |
||||||
|
LogKit.info("飞书发送消息,开发发送任务........"); |
||||||
|
String configId = action.getConfigId(); |
||||||
|
if (StringKit.isEmpty(configId)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
//添加认证
|
||||||
|
if (!PluginContexts.currentContext().isAvailable()) { |
||||||
|
LogKit.error("飞书登录集成插件试用过期,飞书发送消息, 请购买许可证"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
AppConfigEntity configEntity = AppConfigData.queryAppConfigDataWithConfigIdAndOnlyOne(configId); |
||||||
|
if (configEntity == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
LogKit.info("飞书发送消息,获取token........"); |
||||||
|
String appAccessToken = FeishuApp.createAppAccessToken(configEntity.getAppId(), configEntity.getAppSecret()); |
||||||
|
if (StringKit.isEmpty(appAccessToken)) { |
||||||
|
LogKit.error("飞书发送消息,获取app_access_token为空"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
LogKit.info("飞书发送消息,获取飞书用户和群........"); |
||||||
|
List<String> feishuUserIds = getFeishuUserIds(map); |
||||||
|
String chatGroupId = action.getChatGroupId(); |
||||||
|
if ("empty_group".equalsIgnoreCase(chatGroupId)) { |
||||||
|
chatGroupId = ""; |
||||||
|
} |
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(feishuUserIds) && StringKit.isEmpty(chatGroupId)) { |
||||||
|
LogKit.error("飞书发送消息,飞书用户ID和群ID都为空"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
String msgType = FeishuApp.getMsgType(action.getFeishuMsgType()); |
||||||
|
String sendType = FeishuApp.getSendType(action.getFeishuSendType()); |
||||||
|
LogKit.info("飞书发送消息,消息类型:" + FeishuApp.getMsgTypeNotes(msgType)); |
||||||
|
LogKit.info("飞书发送消息,发送类型:" + FeishuApp.getSendTypeNotes(sendType)); |
||||||
|
if (FeishuApp.isSendMessage(sendType)) { |
||||||
|
LogKit.info("飞书发送消息,生成发送文本........"); |
||||||
|
Calculator cal = Calculator.createCalculator(); |
||||||
|
String content = action.getContent(); |
||||||
|
String msgContent = TemplateUtils.renderTpl(cal, content); |
||||||
|
LogKit.info("飞书发送消息,发送文本:" + msgContent); |
||||||
|
|
||||||
|
LogKit.info("飞书发送消息,发送文本消息........"); |
||||||
|
if (StringKit.isNotEmpty(chatGroupId) && StringKit.isNotEmpty(msgContent)) { |
||||||
|
LogKit.info("飞书发送消息,发送群文本消息........"); |
||||||
|
if ("text".equals(msgType)) { |
||||||
|
FeishuApp.sendGroupMessageWithText(chatGroupId, msgContent, appAccessToken); |
||||||
|
} else { |
||||||
|
FeishuApp.sendMessage("chat_id", chatGroupId, msgContent, "post", appAccessToken); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (CollectionUtils.isNotEmpty(feishuUserIds) && StringKit.isNotEmpty(msgContent)) { |
||||||
|
LogKit.info("飞书发送消息,发送个人文本消息........"); |
||||||
|
if ("text".equals(msgType)) { |
||||||
|
FeishuApp.sendBatchMessageWithText(feishuUserIds, msgContent, appAccessToken); |
||||||
|
} else { |
||||||
|
FeishuApp.sendBatchMessageWithRichText(feishuUserIds, msgContent, appAccessToken); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (FeishuApp.isSendFile(sendType)) { |
||||||
|
LogKit.info("飞书发送消息,发送文件消息........"); |
||||||
|
JSONObject commonUploadJson = getUploadFileJson(action, map, appAccessToken); |
||||||
|
if (FeishuApp.isValidFileJson(commonUploadJson)) { |
||||||
|
if (StringKit.isNotEmpty(chatGroupId)) { |
||||||
|
LogKit.info("飞书发送消息,发送群文件消息........"); |
||||||
|
FeishuApp.sendGroupMessageWithFile(chatGroupId, commonUploadJson.toString(), appAccessToken); |
||||||
|
} |
||||||
|
} else if (FeishuApp.isValidImageJson(commonUploadJson)) { |
||||||
|
if (StringKit.isNotEmpty(chatGroupId)) { |
||||||
|
LogKit.info("飞书发送消息,发送群图片消息........"); |
||||||
|
FeishuApp.sendGroupMessageWithImage(chatGroupId, commonUploadJson.toString(), appAccessToken); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (CollectionUtils.isNotEmpty(feishuUserIds)) { |
||||||
|
List<String> userIds = getTaskUserIds(map); |
||||||
|
String feishuUserId, userId; |
||||||
|
List<String> sendUserIds = new ArrayList<>(); |
||||||
|
JSONObject uploadJson; |
||||||
|
List<String> tempFeishuUserIds = new ArrayList<>(); |
||||||
|
for (int i = 0, max = userIds.size() - 1; i <= max; i++) { |
||||||
|
userId = userIds.get(i); |
||||||
|
feishuUserId = toLower(userId); |
||||||
|
if (sendUserIds.contains(feishuUserId)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
tempFeishuUserIds.clear(); |
||||||
|
tempFeishuUserIds.add(feishuUserId); |
||||||
|
uploadJson = getUserUploadFileJson(action, map, appAccessToken, userId); |
||||||
|
if ((!FeishuApp.isValidFileJson(uploadJson)) && (!FeishuApp.isValidImageJson(uploadJson))) { |
||||||
|
uploadJson = commonUploadJson; |
||||||
|
} |
||||||
|
if (FeishuApp.isValidFileJson(uploadJson)) { |
||||||
|
if (CollectionUtils.isNotEmpty(tempFeishuUserIds)) { |
||||||
|
LogKit.info("飞书发送消息,发送个人文件消息........"); |
||||||
|
FeishuApp.sendBatchMessageWithFile(tempFeishuUserIds, uploadJson.toString(), appAccessToken); |
||||||
|
} |
||||||
|
} else if (FeishuApp.isValidImageJson(uploadJson)) { |
||||||
|
if (CollectionUtils.isNotEmpty(tempFeishuUserIds)) { |
||||||
|
LogKit.info("飞书发送消息,发送个人图片消息........"); |
||||||
|
FeishuApp.sendBatchMessageWithImage(tempFeishuUserIds, uploadJson.toString(), appAccessToken); |
||||||
|
} |
||||||
|
} |
||||||
|
sendUserIds.add(feishuUserId); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
LogKit.info("飞书发送消息,结束发送任务........"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private JSONObject getUserUploadFileJson(OutputAppMessagePush action, Map<String, Object> map, String appAccessToken, String userId) throws IOException { |
||||||
|
JSONObject fileJson = new JSONObject(); |
||||||
|
String fileType = getFileType(action); |
||||||
|
if (StringKit.isEmpty(fileType)) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
String filePath = getUploadFilePath(action, map); |
||||||
|
String fileName = getUploadFileName(filePath); |
||||||
|
|
||||||
|
String userFilePath = getUserUploadFilePath(action, map, userId, fileName); |
||||||
|
if (StringKit.isEmpty(userFilePath)) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
InputStream fileInputStream = getUploadFileInputStream(userFilePath); |
||||||
|
if (fileInputStream == null) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
if ("png".equals(fileType)) { |
||||||
|
fileJson = FeishuApp.uploadImage(fileInputStream, appAccessToken); |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
fileJson = FeishuApp.uploadFile(fileType, fileName, fileInputStream, appAccessToken); |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
private String getUserUploadFilePath(OutputAppMessagePush action, Map<String, Object> map, String userId, String fileName) { |
||||||
|
String fileType = getFileType(action); |
||||||
|
if (StringKit.isEmpty(fileType)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
String fileSuffix = "." + fileType; |
||||||
|
if (StringKit.isEmpty(fileSuffix)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String tempFilePath = String.valueOf(map.get(ScheduleConstants.SAVE_DIRECTORY_WITHOUT_USERNAME)); |
||||||
|
if (StringKit.isEmpty(tempFilePath)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String filePath = tempFilePath.substring(0, tempFilePath.lastIndexOf("/")) + "/" + userId + "/" + fileName; |
||||||
|
if (StringKit.isNotEmpty(filePath) && ResourceIOUtils.exist(filePath)) { |
||||||
|
return filePath; |
||||||
|
} |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
private JSONObject getUploadFileJson(OutputAppMessagePush action, Map<String, Object> map, String appAccessToken) throws IOException { |
||||||
|
JSONObject fileJson = new JSONObject(); |
||||||
|
String fileType = getFileType(action); |
||||||
|
if (StringKit.isEmpty(fileType)) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
String filePath = getUploadFilePath(action, map); |
||||||
|
InputStream fileInputStream = getUploadFileInputStream(filePath); |
||||||
|
if (fileInputStream == null) { |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
if ("png".equals(fileType)) { |
||||||
|
fileJson = FeishuApp.uploadImage(fileInputStream, appAccessToken); |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
String fileName = getUploadFileName(filePath); |
||||||
|
fileJson = FeishuApp.uploadFile(fileType, fileName, fileInputStream, appAccessToken); |
||||||
|
return fileJson; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private String getFileType(OutputAppMessagePush action) { |
||||||
|
if (action == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
if (action.getType() != 3) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
BaseOutputFormat outputFormat = BaseOutputFormat.fromInteger(action.getMediaId()); |
||||||
|
if (outputFormat == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String fileSuffix = StringKit.trim(outputFormat.getFileSuffix()); |
||||||
|
if (StringKit.isEmpty(fileSuffix)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String type = ""; |
||||||
|
if (fileSuffix.startsWith(".")) { |
||||||
|
type = fileSuffix.substring(1); |
||||||
|
} |
||||||
|
type = StringKit.trim(type); |
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
private String getUploadFilePath(OutputAppMessagePush action, Map<String, Object> map) { |
||||||
|
String fileType = getFileType(action); |
||||||
|
if (StringKit.isEmpty(fileType)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
String fileSuffix = "." + fileType; |
||||||
|
if (StringKit.isEmpty(fileSuffix)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String[] filePaths = (String[]) map.get(ScheduleConstants.OUTPUT_FILES); |
||||||
|
if ((filePaths == null) || (filePaths.length <= 0)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String filePath; |
||||||
|
for (int i = 0, max = filePaths.length - 1; i <= max; i++) { |
||||||
|
filePath = filePaths[i]; |
||||||
|
if (StringKit.isNotEmpty(filePath) && filePath.endsWith(fileSuffix) && ResourceIOUtils.exist(filePath)) { |
||||||
|
return filePath; |
||||||
|
} |
||||||
|
} |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
private String getUploadFileName(String filePath) { |
||||||
|
if (StringKit.isEmpty(filePath)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String name = ResourceIOUtils.getName(filePath); |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
private InputStream getUploadFileInputStream(String filePath) { |
||||||
|
if (StringKit.isEmpty(filePath)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
if (ResourceIOUtils.exist(filePath)) { |
||||||
|
InputStream in = ResourceIOUtils.read(filePath); |
||||||
|
return in; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private List<String> getTaskUserIds(Map<String, Object> map) throws Exception { |
||||||
|
if ((map == null) || (map.size() <= 0)) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
String[] scheduleUserNames = (String[]) map.get(ScheduleConstants.USERNAMES); |
||||||
|
String scheduleUserName = (String) map.get(ScheduleConstants.USERNAME); |
||||||
|
Set<String> userSet = new HashSet(); |
||||||
|
String tempUserName = StringKit.trim(scheduleUserName); |
||||||
|
if (StringKit.isNotEmpty(tempUserName)) { |
||||||
|
userSet.add(tempUserName); |
||||||
|
} |
||||||
|
|
||||||
|
if ((scheduleUserNames != null) && (scheduleUserNames.length >= 1)) { |
||||||
|
for (int i = 0, max = scheduleUserNames.length - 1; i <= max; i++) { |
||||||
|
tempUserName = StringKit.trim(scheduleUserNames[i]); |
||||||
|
if (StringKit.isNotEmpty(tempUserName)) { |
||||||
|
userSet.add(tempUserName); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (userSet.size() <= 0) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
List<String> userId = new ArrayList<>(); |
||||||
|
userId.addAll(userSet); |
||||||
|
return userId; |
||||||
|
} |
||||||
|
|
||||||
|
private List<String> getFeishuUserIds(Map<String, Object> map) throws Exception { |
||||||
|
if ((map == null) || (map.size() <= 0)) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
String[] scheduleUserNames = (String[]) map.get(ScheduleConstants.USERNAMES); |
||||||
|
String scheduleUserName = (String) map.get(ScheduleConstants.USERNAME); |
||||||
|
Set<String> userSet = new HashSet(); |
||||||
|
String tempUserName = toLower(scheduleUserName); |
||||||
|
if (StringKit.isNotEmpty(tempUserName)) { |
||||||
|
userSet.add(tempUserName); |
||||||
|
} |
||||||
|
|
||||||
|
if ((scheduleUserNames != null) && (scheduleUserNames.length >= 1)) { |
||||||
|
for (int i = 0, max = scheduleUserNames.length - 1; i <= max; i++) { |
||||||
|
tempUserName = toLower(scheduleUserNames[i]); |
||||||
|
if (StringKit.isNotEmpty(tempUserName)) { |
||||||
|
userSet.add(tempUserName); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (userSet.size() <= 0) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
List<String> userId = new ArrayList<>(); |
||||||
|
userId.addAll(userSet); |
||||||
|
return userId; |
||||||
|
} |
||||||
|
|
||||||
|
private String toLower(String value) { |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String tempValue = StringKit.trim(value.toLowerCase()); |
||||||
|
if (StringKit.isEmpty(tempValue)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private List<String> getFeishuUserId(String appAccessToken, Map<String, Object> map) throws Exception { |
||||||
|
if (StringKit.isEmpty(appAccessToken)) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
if ((map == null) || (map.size() <= 0)) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
String[] scheduleUserNames = (String[]) map.get(ScheduleConstants.USERNAMES); |
||||||
|
String scheduleUserName = (String) map.get(ScheduleConstants.USERNAME); |
||||||
|
Set<String> userSet = new HashSet(); |
||||||
|
if (StringUtils.isNotBlank(scheduleUserName)) { |
||||||
|
userSet.add(scheduleUserName); |
||||||
|
} |
||||||
|
if ((scheduleUserNames != null) && (scheduleUserNames.length >= 1)) { |
||||||
|
userSet.addAll(Arrays.asList(scheduleUserNames)); |
||||||
|
} |
||||||
|
|
||||||
|
List<User> userList = AuthorityContext.getInstance().getUserController().find(QueryFactory.create().addRestriction(RestrictionFactory.in("userName", userSet))); |
||||||
|
if ((userList == null) || (userList.size() <= 0)) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
Set<String> emailSet = new HashSet(); |
||||||
|
Set<String> mobileSet = new HashSet(); |
||||||
|
|
||||||
|
User user; |
||||||
|
String email, mobile; |
||||||
|
for (int i = 0, max = userList.size() - 1; i <= max; i++) { |
||||||
|
user = userList.get(i); |
||||||
|
email = StringKit.trim(user.getEmail()); |
||||||
|
if (StringKit.isNotEmpty(email)) { |
||||||
|
emailSet.add(email); |
||||||
|
} |
||||||
|
mobile = StringKit.trim(user.getMobile()); |
||||||
|
if (StringKit.isNotEmpty(mobile)) { |
||||||
|
mobileSet.add(mobile); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ((emailSet.size() <= 0) && (mobileSet.size() <= 0)) { |
||||||
|
return new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
List<String> feishuUserIds = FeishuApp.getFeishuUserId(emailSet, mobileSet, appAccessToken); |
||||||
|
return feishuUserIds; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,154 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.bean; |
||||||
|
|
||||||
|
|
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.entity.AppMessagePushEntity; |
||||||
|
import com.fr.schedule.base.bean.output.BaseOutputAction; |
||||||
|
import com.fr.schedule.base.entity.AbstractScheduleEntity; |
||||||
|
import com.fr.schedule.base.type.RunType; |
||||||
|
import com.fr.third.fasterxml.jackson.annotation.JsonSubTypes; |
||||||
|
|
||||||
|
|
||||||
|
@JsonSubTypes.Type(value = OutputAppMessagePush.class, name = "OutputAppMessagePush") |
||||||
|
public class OutputAppMessagePush extends BaseOutputAction { |
||||||
|
private int terminal = 64; |
||||||
|
|
||||||
|
private String subject; |
||||||
|
|
||||||
|
private String content; |
||||||
|
|
||||||
|
/** |
||||||
|
* 客户端通知 消息类型</br> |
||||||
|
* 1:链接消息;2:图文消息;3:文件消息 |
||||||
|
*/ |
||||||
|
private int type; |
||||||
|
|
||||||
|
private String configId; |
||||||
|
|
||||||
|
private String chatGroupId; |
||||||
|
|
||||||
|
private String feishuMsgType; |
||||||
|
|
||||||
|
private String feishuSendType; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 客户端通知 定时结果附件 |
||||||
|
*/ |
||||||
|
private int mediaId; |
||||||
|
|
||||||
|
private int runType = RunType.CLIENT_NOTIFICATION.getValue(); |
||||||
|
|
||||||
|
//是否受不同用户生成不同附件影响
|
||||||
|
@Override |
||||||
|
public boolean willExecuteByUser() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
//推送类型
|
||||||
|
@Override |
||||||
|
public RunType runType() { |
||||||
|
return RunType.CLIENT_NOTIFICATION; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Class<? extends AbstractScheduleEntity> outputActionEntityClass() { |
||||||
|
return AppMessagePushEntity.class; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public AbstractScheduleEntity createOutputActionEntity() { |
||||||
|
AppMessagePushEntity entity = new AppMessagePushEntity(); |
||||||
|
entity.setId(this.getId()); |
||||||
|
entity.setContent(this.getContent()); |
||||||
|
entity.setSubject(this.getSubject()); |
||||||
|
entity.setTerminal(this.getTerminal()); |
||||||
|
entity.setType(this.getType()); |
||||||
|
entity.setConfigId(this.getConfigId()); |
||||||
|
entity.setChatGroupId(this.getChatGroupId()); |
||||||
|
entity.setMediaId(this.getMediaId()); |
||||||
|
entity.setFeishuMsgType(this.getFeishuMsgType()); |
||||||
|
entity.setFeishuSendType(this.getFeishuSendType()); |
||||||
|
return entity; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public int getTerminal() { |
||||||
|
return terminal; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTerminal(int terminal) { |
||||||
|
this.terminal = terminal; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSubject() { |
||||||
|
return subject; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSubject(String subject) { |
||||||
|
this.subject = subject; |
||||||
|
} |
||||||
|
|
||||||
|
public String getContent() { |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
public void setContent(String content) { |
||||||
|
this.content = content; |
||||||
|
} |
||||||
|
|
||||||
|
public int getType() { |
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
public void setType(int type) { |
||||||
|
this.type = type; |
||||||
|
} |
||||||
|
|
||||||
|
public int getRunType() { |
||||||
|
return runType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setRunType(int runType) { |
||||||
|
this.runType = runType; |
||||||
|
} |
||||||
|
|
||||||
|
public String getConfigId() { |
||||||
|
return configId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setConfigId(String configId) { |
||||||
|
this.configId = configId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getChatGroupId() { |
||||||
|
return chatGroupId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setChatGroupId(String chatGroupId) { |
||||||
|
this.chatGroupId = chatGroupId; |
||||||
|
} |
||||||
|
|
||||||
|
public int getMediaId() { |
||||||
|
return mediaId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMediaId(int mediaId) { |
||||||
|
this.mediaId = mediaId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFeishuMsgType() { |
||||||
|
return feishuMsgType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFeishuMsgType(String feishuMsgType) { |
||||||
|
this.feishuMsgType = feishuMsgType; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFeishuSendType() { |
||||||
|
return feishuSendType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFeishuSendType(String feishuSendType) { |
||||||
|
this.feishuSendType = feishuSendType; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.components; |
||||||
|
|
||||||
|
import com.fr.web.struct.Component; |
||||||
|
import com.fr.web.struct.Filter; |
||||||
|
import com.fr.web.struct.browser.RequestClient; |
||||||
|
import com.fr.web.struct.category.ScriptPath; |
||||||
|
import com.fr.web.struct.category.StylePath; |
||||||
|
|
||||||
|
|
||||||
|
public class FileDef extends Component { |
||||||
|
|
||||||
|
public static final FileDef KEY = new FileDef(); |
||||||
|
private FileDef(){} |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回需要引入的JS脚本路径 |
||||||
|
* @param client 请求客户端描述 |
||||||
|
* @return JS脚本路径 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public ScriptPath script(RequestClient client) { |
||||||
|
return ScriptPath.build("com/fr/plugin/third/party/jsdjjed/message.js"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回需要引入的CSS样式路径 |
||||||
|
* @param client 请求客户端描述 |
||||||
|
* @return CSS样式路径 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public StylePath style(RequestClient client) { |
||||||
|
// //如果不需要就直接返回 StylePath.EMPTY;
|
||||||
|
// return StylePath.build("com/fr/plugin/publiclinksecurty/componet/demo.css");
|
||||||
|
return StylePath.EMPTY; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public Filter filter() { |
||||||
|
return new Filter(){ |
||||||
|
public boolean accept() { |
||||||
|
//任何情况下我们都在平台组件加载时加载我们的组件
|
||||||
|
return true; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.components; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractWebResourceProvider; |
||||||
|
import com.fr.decision.web.MainComponent; |
||||||
|
import com.fr.plugin.transform.FunctionRecorder; |
||||||
|
import com.fr.web.struct.Atom; |
||||||
|
|
||||||
|
@FunctionRecorder |
||||||
|
public class JsAndCssBridge extends AbstractWebResourceProvider { |
||||||
|
@Override |
||||||
|
public Atom attach() { |
||||||
|
return MainComponent.KEY; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Atom client() { |
||||||
|
return FileDef.KEY; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,131 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.entity; |
||||||
|
|
||||||
|
|
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.bean.OutputAppMessagePush; |
||||||
|
import com.fr.schedule.base.bean.BaseBean; |
||||||
|
import com.fr.schedule.base.entity.AbstractScheduleEntity; |
||||||
|
import com.fr.stable.db.constant.EntityConstant; |
||||||
|
import com.fr.third.javax.persistence.Column; |
||||||
|
import com.fr.third.javax.persistence.Entity; |
||||||
|
import com.fr.third.javax.persistence.Table; |
||||||
|
|
||||||
|
@Entity |
||||||
|
@Table(name = "jsdjjed_feishu_message_push") |
||||||
|
public class AppMessagePushEntity extends AbstractScheduleEntity { |
||||||
|
@Column(name = "terminal") |
||||||
|
private int terminal = 64; |
||||||
|
|
||||||
|
@Column(name = "media_id") |
||||||
|
private int mediaId = -1; |
||||||
|
|
||||||
|
@Column(name = "subject", length = EntityConstant.STRING_LONG_SIZE) |
||||||
|
private String subject; |
||||||
|
|
||||||
|
@Column(name = "content", length = EntityConstant.STRING_LONG_SIZE) |
||||||
|
private String content; |
||||||
|
|
||||||
|
@Column(name = "type") |
||||||
|
private int type; |
||||||
|
|
||||||
|
@Column(name = "config_id") |
||||||
|
private String configId; |
||||||
|
|
||||||
|
@Column(name = "chat_group_id", length = EntityConstant.STRING_LONG_SIZE) |
||||||
|
private String chatGroupId; |
||||||
|
|
||||||
|
@Column(name = "feishu_msg_type") |
||||||
|
private String feishuMsgType; |
||||||
|
|
||||||
|
@Column(name = "feishu_send_type") |
||||||
|
private String feishuSendType; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public BaseBean createBean() { |
||||||
|
OutputAppMessagePush outputAppMessagePush = new OutputAppMessagePush(); |
||||||
|
outputAppMessagePush.setId(this.getId()); |
||||||
|
outputAppMessagePush.setContent(this.getContent()); |
||||||
|
outputAppMessagePush.setSubject(this.getSubject()); |
||||||
|
outputAppMessagePush.setTerminal(this.getTerminal()); |
||||||
|
outputAppMessagePush.setType(this.getType()); |
||||||
|
outputAppMessagePush.setConfigId(this.getConfigId()); |
||||||
|
outputAppMessagePush.setChatGroupId(this.getChatGroupId()); |
||||||
|
outputAppMessagePush.setMediaId(this.getMediaId()); |
||||||
|
outputAppMessagePush.setFeishuMsgType(this.getFeishuMsgType()); |
||||||
|
outputAppMessagePush.setFeishuSendType(this.getFeishuSendType()); |
||||||
|
return outputAppMessagePush; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public int getTerminal() { |
||||||
|
return terminal; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTerminal(int terminal) { |
||||||
|
this.terminal = terminal; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSubject() { |
||||||
|
return subject; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSubject(String subject) { |
||||||
|
this.subject = subject; |
||||||
|
} |
||||||
|
|
||||||
|
public String getContent() { |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
public void setContent(String content) { |
||||||
|
this.content = content; |
||||||
|
} |
||||||
|
|
||||||
|
public int getType() { |
||||||
|
return type; |
||||||
|
} |
||||||
|
|
||||||
|
public void setType(int type) { |
||||||
|
this.type = type; |
||||||
|
} |
||||||
|
|
||||||
|
public String getConfigId() { |
||||||
|
return configId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setConfigId(String configId) { |
||||||
|
this.configId = configId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getChatGroupId() { |
||||||
|
return chatGroupId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setChatGroupId(String chatGroupId) { |
||||||
|
this.chatGroupId = chatGroupId; |
||||||
|
} |
||||||
|
|
||||||
|
public int getMediaId() { |
||||||
|
return mediaId; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMediaId(int mediaId) { |
||||||
|
this.mediaId = mediaId; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFeishuMsgType() { |
||||||
|
return feishuMsgType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFeishuMsgType(String feishuMsgType) { |
||||||
|
this.feishuMsgType = feishuMsgType; |
||||||
|
} |
||||||
|
|
||||||
|
public String getFeishuSendType() { |
||||||
|
return feishuSendType; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFeishuSendType(String feishuSendType) { |
||||||
|
this.feishuSendType = feishuSendType; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.formula; |
||||||
|
|
||||||
|
import com.fr.main.workbook.ResultWorkBook; |
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.bean.OutputAppMessagePush; |
||||||
|
import com.fr.schedule.base.provider.impl.AbstractOutputFormulaProvider; |
||||||
|
import com.fr.schedule.extension.report.util.ScheduleParameterUtils; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
public class FeishuOutputFormula extends AbstractOutputFormulaProvider<OutputAppMessagePush, ResultWorkBook> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void dealWithFormulaParam(OutputAppMessagePush bean, ResultWorkBook workBook, List<Map<String, Object>> param) throws Exception { |
||||||
|
Map map = param.get(0); |
||||||
|
bean.setSubject(ScheduleParameterUtils.dealWithParameter(bean.getSubject(), map, workBook)); |
||||||
|
bean.setContent(ScheduleParameterUtils.dealWithParameter(bean.getContent(), map, workBook)); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getActionClassName() { |
||||||
|
return OutputAppMessagePush.class.getName(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.formula; |
||||||
|
|
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.bean.OutputAppMessagePush; |
||||||
|
import com.fr.schedule.extension.report.job.output.formula.extract.impl.AbstractOutputFormulaExtractorProvider; |
||||||
|
import com.fr.schedule.extension.report.util.ScheduleParameterUtils; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
|
||||||
|
public class FormulaCalculator extends AbstractOutputFormulaExtractorProvider<OutputAppMessagePush> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getActionClassName() { |
||||||
|
return OutputAppMessagePush.class.getName(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void addFormulaToMap(OutputAppMessagePush bean, Pattern pattern, Map<String, Object> map) { |
||||||
|
ScheduleParameterUtils.addFormulaToMap(bean.getSubject(),pattern, map); |
||||||
|
ScheduleParameterUtils.addFormulaToMap(bean.getContent(),pattern, map); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.provider; |
||||||
|
|
||||||
|
|
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.entity.AppMessagePushEntity; |
||||||
|
import com.fr.stable.db.dao.BaseDAO; |
||||||
|
import com.fr.stable.db.session.DAOSession; |
||||||
|
|
||||||
|
public class AppMessagePushDao extends BaseDAO<AppMessagePushEntity> { |
||||||
|
public AppMessagePushDao(DAOSession daoSession) { |
||||||
|
super(daoSession); |
||||||
|
} |
||||||
|
// 反回实体类class
|
||||||
|
protected Class<AppMessagePushEntity> getEntityClass(){ |
||||||
|
return AppMessagePushEntity.class; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.provider; |
||||||
|
|
||||||
|
import com.fr.decision.plugin.db.AbstractDecisionDBAccessProvider; |
||||||
|
|
||||||
|
|
||||||
|
import com.fr.plugin.third.party.jsdjjed.schedule.entity.AppMessagePushEntity; |
||||||
|
import com.fr.stable.db.accessor.DBAccessor; |
||||||
|
import com.fr.stable.db.dao.BaseDAO; |
||||||
|
import com.fr.stable.db.dao.DAOProvider; |
||||||
|
|
||||||
|
|
||||||
|
public class DBAccessProvider extends AbstractDecisionDBAccessProvider { |
||||||
|
private static DBAccessor dbAccessor = null; |
||||||
|
|
||||||
|
public static DBAccessor getDbAccessor() { |
||||||
|
return dbAccessor; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public DAOProvider[] registerDAO() { |
||||||
|
return new DAOProvider[]{ |
||||||
|
new DAOProvider() { |
||||||
|
@Override |
||||||
|
public Class getEntityClass() { |
||||||
|
return AppMessagePushEntity.class; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Class<? extends BaseDAO> getDAOClass() { |
||||||
|
return AppMessagePushDao.class; |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void onDBAvailable(DBAccessor dbAccessor) { |
||||||
|
DBAccessProvider.dbAccessor = dbAccessor; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,111 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.utils; |
||||||
|
|
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.script.Calculator; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.UtilEvalError; |
||||||
|
|
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author: xx |
||||||
|
* @Date: 2020/9/13 11:44 |
||||||
|
*/ |
||||||
|
public class PlaceholderResolver { |
||||||
|
|
||||||
|
public static final String TEXT = "这是一个包含日期:${today()}和当前时间:${now()} 的两个公式文本"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 默认前缀占位符 |
||||||
|
*/ |
||||||
|
public static final String DEFAULT_PLACEHOLDER_PREFIX = "${"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 默认后缀占位符 |
||||||
|
*/ |
||||||
|
public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 默认单例解析器 |
||||||
|
*/ |
||||||
|
private static PlaceholderResolver defaultResolver = new PlaceholderResolver(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 占位符前缀 |
||||||
|
*/ |
||||||
|
private String placeholderPrefix = DEFAULT_PLACEHOLDER_PREFIX; |
||||||
|
|
||||||
|
/** |
||||||
|
* 占位符后缀 |
||||||
|
*/ |
||||||
|
private String placeholderSuffix = DEFAULT_PLACEHOLDER_SUFFIX; |
||||||
|
|
||||||
|
|
||||||
|
private PlaceholderResolver() { |
||||||
|
} |
||||||
|
|
||||||
|
private PlaceholderResolver(String placeholderPrefix, String placeholderSuffix) { |
||||||
|
this.placeholderPrefix = placeholderPrefix; |
||||||
|
this.placeholderSuffix = placeholderSuffix; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取默认的占位符解析器,即占位符前缀为"${", 后缀为"}" |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static PlaceholderResolver getDefaultResolver() { |
||||||
|
return defaultResolver; |
||||||
|
} |
||||||
|
|
||||||
|
public static PlaceholderResolver getResolver(String placeholderPrefix, String placeholderSuffix) { |
||||||
|
return new PlaceholderResolver(placeholderPrefix, placeholderSuffix); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 解析带有指定占位符的模板字符串,默认占位符为前缀:${ 后缀:} |
||||||
|
* 如:"这是一个包含日期:${today()}和当前时间:${sum(1,2)} 的两个公式文本" |
||||||
|
* |
||||||
|
* @param content 要解析的带有占位符的模板字符串 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public String resolve(String content) { |
||||||
|
int start = content.indexOf(this.placeholderPrefix); |
||||||
|
if (start == -1) { |
||||||
|
return content; |
||||||
|
} |
||||||
|
|
||||||
|
int valueIndex = 0; |
||||||
|
StringBuilder resultContent = new StringBuilder(content); |
||||||
|
while (start != -1) { |
||||||
|
int end = resultContent.indexOf(this.placeholderSuffix); |
||||||
|
String place = content.substring(start, end + this.placeholderSuffix.length()); |
||||||
|
String formula = place.replace(this.placeholderPrefix, "").replace(this.placeholderSuffix, ""); |
||||||
|
Calculator calculator = Calculator.createCalculator(); |
||||||
|
String value = StringUtils.EMPTY; |
||||||
|
try { |
||||||
|
Object o = calculator.evalValue(formula); |
||||||
|
|
||||||
|
if (o!=null){ |
||||||
|
if (o instanceof Date){ |
||||||
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
||||||
|
value = format.format(o); |
||||||
|
}else { |
||||||
|
value =o.toString(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} catch (UtilEvalError utilEvalError) { |
||||||
|
FineLoggerFactory.getLogger().error(utilEvalError,"JSD:>>calculator formula in text error!",utilEvalError.getMessage()); |
||||||
|
} |
||||||
|
resultContent.replace(start, end + this.placeholderSuffix.length(), value); |
||||||
|
start = resultContent.indexOf(this.placeholderPrefix, start + value.length()); |
||||||
|
} |
||||||
|
return resultContent.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.schedule.utils; |
||||||
|
|
||||||
|
import com.fr.io.utils.ResourceIOUtils; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.util.Properties; |
||||||
|
|
||||||
|
public class PropertiesUtils { |
||||||
|
//获取配置文件
|
||||||
|
private static Properties getProperties() { |
||||||
|
InputStream is = ResourceIOUtils.read("/resources/minxing_push_message.properties"); |
||||||
|
Properties properties = new Properties(); |
||||||
|
try { |
||||||
|
properties.load(is); |
||||||
|
} catch (IOException e) { |
||||||
|
FineLoggerFactory.getLogger().error("JSD:>>get properties error! ",e.getMessage()); |
||||||
|
} |
||||||
|
return properties; |
||||||
|
} |
||||||
|
|
||||||
|
public static String getPro(String key) { |
||||||
|
Properties properties = PropertiesUtils.getProperties(); |
||||||
|
String value = properties.get(key)==null?"":properties.get(key).toString(); |
||||||
|
if ( StringUtils.isEmpty(value)) { |
||||||
|
FineLoggerFactory.getLogger().error("JSD:>>[{}] is null or empty!",key); |
||||||
|
} |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,140 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util; |
||||||
|
|
||||||
|
import javax.crypto.Cipher; |
||||||
|
import javax.crypto.spec.IvParameterSpec; |
||||||
|
import javax.crypto.spec.SecretKeySpec; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class AES { |
||||||
|
|
||||||
|
public final static String ALGORITHM_AEPP = "AES/ECB/PKCS5Padding"; |
||||||
|
|
||||||
|
/** |
||||||
|
* AES加密 |
||||||
|
* |
||||||
|
* @param content |
||||||
|
* 内容 |
||||||
|
* @param password |
||||||
|
* 密钥 |
||||||
|
* @param algorithm |
||||||
|
* 算法 |
||||||
|
* @return 加密后数据 |
||||||
|
*/ |
||||||
|
public static byte[] encrypt(byte[] content, byte[] password, String algorithm) { |
||||||
|
if (content == null || password == null) |
||||||
|
return null; |
||||||
|
try { |
||||||
|
Cipher cipher = null; |
||||||
|
if (algorithm.endsWith("PKCS7Padding")) { |
||||||
|
cipher = Cipher.getInstance(algorithm, "BC"); |
||||||
|
} else { |
||||||
|
cipher = Cipher.getInstance(algorithm); |
||||||
|
} |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(password, "AES")); |
||||||
|
return cipher.doFinal(content); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* AES解密 |
||||||
|
* |
||||||
|
* @param content |
||||||
|
* 加密内容 |
||||||
|
* @param password |
||||||
|
* 密钥 |
||||||
|
* @param algorithm |
||||||
|
* 算法 |
||||||
|
* @return 解密后数据 |
||||||
|
*/ |
||||||
|
public static byte[] decrypt(byte[] content, byte[] password, String algorithm) { |
||||||
|
if (content == null || password == null) |
||||||
|
return null; |
||||||
|
try { |
||||||
|
Cipher cipher = null; |
||||||
|
if (algorithm.endsWith("PKCS7Padding")) { |
||||||
|
cipher = Cipher.getInstance(algorithm, "BC"); |
||||||
|
} else { |
||||||
|
cipher = Cipher.getInstance(algorithm); |
||||||
|
} |
||||||
|
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(password, "AES")); |
||||||
|
byte[] bytes = cipher.doFinal(content); |
||||||
|
return bytes; |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* AES加密 |
||||||
|
* |
||||||
|
* @param content |
||||||
|
* 内容 |
||||||
|
* @param password |
||||||
|
* 密钥 |
||||||
|
* @param algorithm |
||||||
|
* 算法 |
||||||
|
* @param ivStr |
||||||
|
* 向量 |
||||||
|
* @return 加密后数据 |
||||||
|
*/ |
||||||
|
public static byte[] encrypt(byte[] content, byte[] password, byte[] ivStr, String algorithm) { |
||||||
|
if (content == null || password == null) |
||||||
|
return null; |
||||||
|
try { |
||||||
|
Cipher cipher = null; |
||||||
|
if (algorithm.endsWith("PKCS7Padding")) { |
||||||
|
cipher = Cipher.getInstance(algorithm, "BC"); |
||||||
|
} else { |
||||||
|
cipher = Cipher.getInstance(algorithm); |
||||||
|
} |
||||||
|
IvParameterSpec iv = new IvParameterSpec(ivStr); |
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(password, "AES"), iv); |
||||||
|
return cipher.doFinal(content); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* AES解密 |
||||||
|
* |
||||||
|
* @param content |
||||||
|
* 加密内容 |
||||||
|
* @param password |
||||||
|
* 密钥 |
||||||
|
* @param algorithm |
||||||
|
* 算法 |
||||||
|
* @param ivStr |
||||||
|
* 向量 |
||||||
|
* @return 解密后数据 |
||||||
|
*/ |
||||||
|
public static byte[] decrypt(byte[] content, byte[] password, byte[] ivStr, String algorithm) { |
||||||
|
if (content == null || password == null) |
||||||
|
return null; |
||||||
|
try { |
||||||
|
Cipher cipher = null; |
||||||
|
if (algorithm.endsWith("PKCS7Padding")) { |
||||||
|
cipher = Cipher.getInstance(algorithm, "BC"); |
||||||
|
} else { |
||||||
|
cipher = Cipher.getInstance(algorithm); |
||||||
|
} |
||||||
|
IvParameterSpec iv = new IvParameterSpec(ivStr); |
||||||
|
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(password, "AES"), iv); |
||||||
|
byte[] bytes = cipher.doFinal(content); |
||||||
|
return bytes; |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,129 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util; |
||||||
|
|
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.Calendar; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class DateUtil { |
||||||
|
|
||||||
|
public static final long ONE_HOUR_TIME_LONG = 3600000; |
||||||
|
|
||||||
|
public static String toString(Date date, String format) { |
||||||
|
String dateStr = null; |
||||||
|
try { |
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat(format); |
||||||
|
dateStr = sdf.format(date); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
return dateStr; |
||||||
|
} |
||||||
|
|
||||||
|
public static Date parseDate(String dateStr, String format) { |
||||||
|
Date date = null; |
||||||
|
try { |
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat(format); |
||||||
|
date = sdf.parse(dateStr); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
return date; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取日期当天的最小时间日期,0点 |
||||||
|
*/ |
||||||
|
public static Date getMinTimeDateByDate(Date date) { |
||||||
|
if (date == null) |
||||||
|
return null; |
||||||
|
String datestr = toString(date, "yyyyMMdd"); |
||||||
|
return parseDate(datestr, "yyyyMMdd"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取日期当天的最大时间日期,12点整 |
||||||
|
*/ |
||||||
|
public static Date getMaxTimeDateByDate(Date date) { |
||||||
|
if (date == null) |
||||||
|
return null; |
||||||
|
String datestr = toString(date, "yyyyMMdd"); |
||||||
|
Date d = parseDate(datestr, "yyyyMMdd"); |
||||||
|
return new Date(d.getTime() + 24l * 60l * 60l * 1000l - 1l); |
||||||
|
} |
||||||
|
|
||||||
|
public static long subTime(Date startDate, Date endDate) { |
||||||
|
return endDate.getTime() - startDate.getTime(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取上月第一天最早时间 |
||||||
|
* @return Date |
||||||
|
*/ |
||||||
|
public static Date getLastMonthFirstDay() { |
||||||
|
Calendar cal_1 = Calendar.getInstance();// 获取当前日期
|
||||||
|
cal_1.setTime(getMinTimeDateByDate(new Date())); |
||||||
|
cal_1.add(Calendar.MONTH, -1); |
||||||
|
cal_1.set(Calendar.DAY_OF_MONTH, 1); |
||||||
|
return cal_1.getTime(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取上月最后一天最晚时间 |
||||||
|
* @return Date |
||||||
|
*/ |
||||||
|
public static Date getLastMonthLastDay() { |
||||||
|
Calendar cale = Calendar.getInstance(); |
||||||
|
cale.setTime(getMinTimeDateByDate(new Date())); |
||||||
|
cale.add(Calendar.MONTH, -1); |
||||||
|
cale.set(Calendar.DAY_OF_MONTH, cale.getActualMaximum(Calendar.DAY_OF_MONTH)); |
||||||
|
return new Date(cale.getTime().getTime() + 1000l * 60l * 60l * 24l - 1l); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取本月第一天最早时间 |
||||||
|
* @return Date |
||||||
|
*/ |
||||||
|
public static Date getNowMonthFirstDay() { |
||||||
|
Calendar cal_1 = Calendar.getInstance();// 获取当前日期
|
||||||
|
cal_1.setTime(getMinTimeDateByDate(new Date())); |
||||||
|
cal_1.add(Calendar.MONTH, 0); |
||||||
|
cal_1.set(Calendar.DAY_OF_MONTH, 1); |
||||||
|
return cal_1.getTime(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取本月最后一天最晚时间 |
||||||
|
* @return Date |
||||||
|
*/ |
||||||
|
public static Date getNowMonthLastDay() { |
||||||
|
Calendar cale = Calendar.getInstance(); |
||||||
|
cale.setTime(getMinTimeDateByDate(new Date())); |
||||||
|
cale.set(Calendar.DAY_OF_MONTH, cale.getActualMaximum(Calendar.DAY_OF_MONTH)); |
||||||
|
return new Date(cale.getTime().getTime() + 1000l * 60l * 60l * 24l - 1l); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取本月最后一天 |
||||||
|
* @return Date |
||||||
|
*/ |
||||||
|
public static Date getTheMonthLastDay(Date date) { |
||||||
|
if(date == null){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
Calendar cale = Calendar.getInstance(); |
||||||
|
cale.setTime(date); |
||||||
|
cale.set(Calendar.DAY_OF_MONTH, cale.getActualMaximum(Calendar.DAY_OF_MONTH)); |
||||||
|
cale.set(Calendar.HOUR, 0); |
||||||
|
cale.set(Calendar.HOUR_OF_DAY, 0); |
||||||
|
cale.set(Calendar.MINUTE, 0); |
||||||
|
cale.set(Calendar.SECOND, 0); |
||||||
|
cale.set(Calendar.MILLISECOND, 0); |
||||||
|
return cale.getTime(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util; |
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream; |
||||||
|
import java.io.ByteArrayOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.OutputStream; |
||||||
|
import java.util.zip.GZIPInputStream; |
||||||
|
import java.util.zip.GZIPOutputStream; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class GZIPUtils { |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 数据压缩传输 |
||||||
|
* |
||||||
|
* @param is |
||||||
|
* @param os |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static void compressTransfe(byte[] bytes, OutputStream out) throws IOException { |
||||||
|
GZIPOutputStream gos = null; |
||||||
|
try { |
||||||
|
gos = new GZIPOutputStream(out); |
||||||
|
gos.write(bytes); |
||||||
|
gos.finish(); |
||||||
|
gos.flush(); |
||||||
|
} finally{ |
||||||
|
if(gos != null){ |
||||||
|
gos.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 数据压缩 |
||||||
|
* |
||||||
|
* @param is |
||||||
|
* @param os |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static byte[] compress(byte[] bytes) throws IOException { |
||||||
|
ByteArrayOutputStream out = null; |
||||||
|
GZIPOutputStream gos = null; |
||||||
|
try { |
||||||
|
out = new ByteArrayOutputStream(); |
||||||
|
gos = new GZIPOutputStream(out); |
||||||
|
gos.write(bytes); |
||||||
|
gos.finish(); |
||||||
|
gos.flush(); |
||||||
|
} finally{ |
||||||
|
if(gos != null){ |
||||||
|
gos.close(); |
||||||
|
} |
||||||
|
if(out != null){ |
||||||
|
out.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
return out.toByteArray(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 数据解压 |
||||||
|
* |
||||||
|
* @param in |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static byte[] decompress(byte[] bytes) throws IOException { |
||||||
|
ByteArrayInputStream in = new ByteArrayInputStream(bytes); |
||||||
|
GZIPInputStream gin = new GZIPInputStream(in); |
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||||
|
int count; |
||||||
|
byte data[] = new byte[1024]; |
||||||
|
while ((count = gin.read(data, 0, 1024)) != -1) { |
||||||
|
out.write(data, 0, count); |
||||||
|
} |
||||||
|
out.flush(); |
||||||
|
out.close(); |
||||||
|
gin.close(); |
||||||
|
return out.toByteArray(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,129 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util; |
||||||
|
|
||||||
|
import com.google.gson.Gson; |
||||||
|
import com.google.gson.GsonBuilder; |
||||||
|
import com.google.gson.reflect.TypeToken; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class JsonHelper { |
||||||
|
|
||||||
|
private static Map<String,Gson> gsons = new HashMap<String, Gson>(); |
||||||
|
|
||||||
|
private static String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss"; |
||||||
|
|
||||||
|
static { |
||||||
|
gsons.put(DEFAULT_DATE_PATTERN, createGson(DEFAULT_DATE_PATTERN)); |
||||||
|
} |
||||||
|
|
||||||
|
private static Gson createGson(String datePattern){ |
||||||
|
return new GsonBuilder().setDateFormat(datePattern).disableHtmlEscaping().serializeNulls().create(); |
||||||
|
} |
||||||
|
|
||||||
|
public static Gson getGson() { |
||||||
|
return gsons.get(DEFAULT_DATE_PATTERN); |
||||||
|
} |
||||||
|
|
||||||
|
public static Gson getGson(String datePattern) { |
||||||
|
Gson gson = gsons.get(datePattern); |
||||||
|
if(gson == null){ |
||||||
|
gson = createGson(datePattern); |
||||||
|
gsons.put(datePattern, gson); |
||||||
|
} |
||||||
|
return gson; |
||||||
|
} |
||||||
|
|
||||||
|
public static GsonBuilder newGsonBuilder() { |
||||||
|
return new GsonBuilder(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将对象转换为json串 |
||||||
|
* |
||||||
|
* @param obj |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String toJsonString(Object obj) { |
||||||
|
if (obj == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return getGson().toJson(obj); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将对象转换为json串,自定义日期转换规则 |
||||||
|
* |
||||||
|
* @param obj |
||||||
|
* @param datePattern |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String toJsonString(Object obj, String datePattern) { |
||||||
|
if (obj == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return getGson(datePattern).toJson(obj); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将json串转换为对象 |
||||||
|
* |
||||||
|
* @param clazz |
||||||
|
* @param jsonString |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static <T> T fromJson(Class<T> clazz, String jsonString) { |
||||||
|
if (jsonString == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return getGson().fromJson(jsonString, clazz); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将json串转换为对象 |
||||||
|
* |
||||||
|
* @Type type |
||||||
|
* @param jsonString |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static <T> T fromJson(TypeToken<T> token, String jsonString) { |
||||||
|
if (jsonString == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return getGson().fromJson(jsonString, token.getType()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将json串转换为对象 |
||||||
|
* |
||||||
|
* @Type type |
||||||
|
* @param jsonString |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static <T> T fromJson(TypeToken<T> token, String jsonString, String datePattern) { |
||||||
|
if (jsonString == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return getGson(datePattern).fromJson(jsonString, token.getType()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将json串转换为对象 |
||||||
|
* |
||||||
|
* @param clazz |
||||||
|
* @param jsonString |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static <T> T fromJson(Class<T> clazz, String jsonString, String datePattern) { |
||||||
|
if (jsonString == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return getGson(datePattern).fromJson(jsonString, clazz); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util; |
||||||
|
|
||||||
|
import java.security.MessageDigest; |
||||||
|
import java.security.NoSuchAlgorithmException; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class Md5 { |
||||||
|
|
||||||
|
/** |
||||||
|
* MD5 |
||||||
|
* @param bytes |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String md5(byte[] bytes) { |
||||||
|
if (bytes == null || bytes.length == 0) |
||||||
|
return null; |
||||||
|
String s = null; |
||||||
|
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; |
||||||
|
try { |
||||||
|
MessageDigest md = MessageDigest.getInstance("MD5"); |
||||||
|
md.update(bytes); |
||||||
|
byte tmp[] = md.digest(); |
||||||
|
char str[] = new char[16 * 2]; |
||||||
|
int k = 0; |
||||||
|
for (int i = 0; i < 16; i++) { |
||||||
|
byte byte0 = tmp[i]; |
||||||
|
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; |
||||||
|
str[k++] = hexDigits[byte0 & 0xf]; |
||||||
|
} |
||||||
|
s = new String(str); |
||||||
|
} catch (NoSuchAlgorithmException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* MD5[16位] |
||||||
|
* |
||||||
|
* @param bytes |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String md5For16(byte[] bytes) { |
||||||
|
return md5(bytes).substring(8,24); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,451 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import javax.net.ssl.*; |
||||||
|
import java.io.*; |
||||||
|
import java.net.*; |
||||||
|
import java.security.*; |
||||||
|
import java.security.cert.CertificateException; |
||||||
|
import java.security.cert.X509Certificate; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Map.Entry; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpClient { |
||||||
|
|
||||||
|
/** |
||||||
|
* 链接超时时间(s) |
||||||
|
*/ |
||||||
|
private int httpConnectionTimeOut = 30; |
||||||
|
|
||||||
|
/** |
||||||
|
* 数据传输超时时间(s) |
||||||
|
*/ |
||||||
|
private int httpReadTimeOut = 30; |
||||||
|
|
||||||
|
public HttpClient() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpConnectionTimeOut |
||||||
|
* 链接超时时间(s) |
||||||
|
* @param httpReadTimeOut |
||||||
|
* 数据传输超时时间(s) |
||||||
|
*/ |
||||||
|
public HttpClient(int httpConnectionTimeOut, int httpReadTimeOut) { |
||||||
|
this.httpConnectionTimeOut = httpConnectionTimeOut; |
||||||
|
this.httpReadTimeOut = httpReadTimeOut; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送HTTP请求 |
||||||
|
* |
||||||
|
* @param request |
||||||
|
* 请求 |
||||||
|
* @param praser |
||||||
|
* 响应解析器 |
||||||
|
* @return T 响应 |
||||||
|
*/ |
||||||
|
public <T> T service(HttpRequest<?> request, HttpResponsePraser<T> praser) { |
||||||
|
HttpResultCode code = HttpResultCode.SUCCESS; |
||||||
|
if (request.getHttpParams().getUrl() == null || request.getHttpParams().getUrl().length() == 0) { |
||||||
|
code = HttpResultCode.ERROR_URL_NULL; |
||||||
|
return praser.prase(code, 0, null, null, request.getHttpParams().getCharSet(), null); |
||||||
|
} |
||||||
|
HttpURLConnection conn = null; |
||||||
|
int httpCode = 0; |
||||||
|
Map<String, String> headers = null; |
||||||
|
List<String> cookies = null; |
||||||
|
ByteArrayOutputStream outputStream = null; |
||||||
|
try { |
||||||
|
String realUrl = this.genUrl(request); |
||||||
|
conn = this.createConnection(request, realUrl); |
||||||
|
this.fillConnection(conn, request); |
||||||
|
this.request(conn, request); |
||||||
|
httpCode = conn.getResponseCode(); |
||||||
|
headers = this.getHeaders(conn, request.getHttpParams().getCharSet()); |
||||||
|
cookies = this.getCookies(conn, request.getHttpParams().getCharSet()); |
||||||
|
outputStream = this.getResultOutputStream(conn); |
||||||
|
} catch (SocketTimeoutException e) { |
||||||
|
code = HttpResultCode.ERROR_TIMEOUT; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (KeyManagementException e) { |
||||||
|
code = HttpResultCode.ERROR_HTTPS_SSL; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (NoSuchAlgorithmException e) { |
||||||
|
code = HttpResultCode.ERROR_HTTPS_SSL; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (ProtocolException e) { |
||||||
|
code = HttpResultCode.ERROR_METHOD; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
code = HttpResultCode.ERROR_CHARSET; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (MalformedURLException e) { |
||||||
|
code = HttpResultCode.ERROR_URL; |
||||||
|
httpCode = 500; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (IOException e) { |
||||||
|
code = HttpResultCode.ERROR_CONNECT; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (UnrecoverableKeyException e) { |
||||||
|
code = HttpResultCode.ERROR_HTTPS_SSL; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (KeyStoreException e) { |
||||||
|
code = HttpResultCode.ERROR_HTTPS_SSL; |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (CertificateException e) { |
||||||
|
code = HttpResultCode.ERROR_HTTPS_SSL; |
||||||
|
e.printStackTrace(); |
||||||
|
} finally { |
||||||
|
if (conn != null) { |
||||||
|
conn.disconnect(); |
||||||
|
} |
||||||
|
} |
||||||
|
T t = null; |
||||||
|
try { |
||||||
|
t = praser.prase(code, httpCode, headers, cookies, request.getHttpParams().getCharSet(), outputStream); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} finally { |
||||||
|
if (outputStream != null) { |
||||||
|
try { |
||||||
|
outputStream.flush(); |
||||||
|
outputStream.close(); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return t; |
||||||
|
} |
||||||
|
|
||||||
|
private <T> String genUrl(HttpRequest<T> request) { |
||||||
|
if (request.getHttpParams().getMethod().equalsIgnoreCase("GET")) { |
||||||
|
String getprams = request.getContentPraser().praseRqeuestContentToString(request.getHttpParams()); |
||||||
|
if (getprams != null) { |
||||||
|
String url = null; |
||||||
|
if (request.getHttpParams().getUrl().indexOf("?") > 0) { |
||||||
|
url = request.getHttpParams().getUrl() + "&" + getprams; |
||||||
|
} else { |
||||||
|
url = request.getHttpParams().getUrl() + "?" + getprams; |
||||||
|
} |
||||||
|
return url; |
||||||
|
} else { |
||||||
|
return request.getHttpParams().getUrl(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
return request.getHttpParams().getUrl(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取HTTP响应头 |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @param charSet |
||||||
|
* @return |
||||||
|
* @throws UnsupportedEncodingException |
||||||
|
*/ |
||||||
|
private Map<String, String> getHeaders(HttpURLConnection conn, String charSet) throws UnsupportedEncodingException { |
||||||
|
Map<String, String> resultHeaders = new HashMap<String, String>(); |
||||||
|
Map<String, List<String>> header = conn.getHeaderFields(); |
||||||
|
if (header != null && header.size() > 0) { |
||||||
|
for (Entry<String, List<String>> entry : header.entrySet()) { |
||||||
|
if (!"Set-Cookie".equalsIgnoreCase(entry.getKey())) { |
||||||
|
String valuer = ""; |
||||||
|
if (entry.getValue() != null && entry.getValue().size() > 0) { |
||||||
|
for (String value : entry.getValue()) { |
||||||
|
valuer += new String(value.getBytes("ISO-8859-1"), charSet) + ","; |
||||||
|
} |
||||||
|
valuer = valuer.substring(0, valuer.length() - 1); |
||||||
|
} |
||||||
|
resultHeaders.put(entry.getKey(), valuer); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return resultHeaders; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取HTTP响应Cookies |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @param charSet |
||||||
|
* @return |
||||||
|
* @throws UnsupportedEncodingException |
||||||
|
*/ |
||||||
|
private List<String> getCookies(HttpURLConnection conn, String charSet) throws UnsupportedEncodingException { |
||||||
|
List<String> resultC = new ArrayList<String>(); |
||||||
|
List<String> cookies = null; |
||||||
|
Map<String, List<String>> header = conn.getHeaderFields(); |
||||||
|
if (header != null && header.size() > 0) { |
||||||
|
cookies = header.get("Set-Cookie"); |
||||||
|
} |
||||||
|
if (cookies != null) { |
||||||
|
for (String cookie : cookies) { |
||||||
|
resultC.add(new String(cookie.getBytes("ISO-8859-1"), charSet)); |
||||||
|
} |
||||||
|
} |
||||||
|
return cookies; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取HTTP响应数据流 |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
private ByteArrayOutputStream getResultOutputStream(HttpURLConnection conn) throws IOException { |
||||||
|
ByteArrayOutputStream outStream = new ByteArrayOutputStream(); |
||||||
|
InputStream is = conn.getInputStream(); |
||||||
|
try { |
||||||
|
if (is != null) { |
||||||
|
byte[] buffer = new byte[1024]; |
||||||
|
int len = 0; |
||||||
|
while ((len = is.read(buffer)) != -1) { |
||||||
|
outStream.write(buffer, 0, len); |
||||||
|
} |
||||||
|
} |
||||||
|
} catch (IOException e) { |
||||||
|
throw e; |
||||||
|
} finally { |
||||||
|
if (is != null) { |
||||||
|
is.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
return outStream; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送Http请求 |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @param request |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
private <T> void request(HttpURLConnection conn, HttpRequest<T> request) throws IOException { |
||||||
|
if (request.getHttpParams().getMethod().equalsIgnoreCase("POST")) { |
||||||
|
conn.setDoOutput(true); |
||||||
|
// conn.connect();
|
||||||
|
if (request.getHttpParams().getParams() != null) { |
||||||
|
byte[] content = request.getContentPraser().praseRqeuestContentToBytes(request.getHttpParams()); |
||||||
|
fillHeader(conn, "Content-Length", String.valueOf(request.getContentPraser().praseRqeuestContentLength(request.getHttpParams()))); |
||||||
|
DataOutputStream out = new DataOutputStream(conn.getOutputStream()); |
||||||
|
out.write(content); |
||||||
|
out.flush(); |
||||||
|
out.close(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
conn.connect(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加请求信息 |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @param request |
||||||
|
* @throws ProtocolException |
||||||
|
*/ |
||||||
|
private void fillConnection(HttpURLConnection conn, HttpRequest<?> request) throws ProtocolException { |
||||||
|
this.fillTimeout(conn); |
||||||
|
this.filleMethod(conn, request); |
||||||
|
this.fillHeaders(conn, request); |
||||||
|
this.fillCookies(conn, request); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加超时时间 |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
*/ |
||||||
|
private void fillTimeout(HttpURLConnection conn) { |
||||||
|
if (httpConnectionTimeOut != 0) { |
||||||
|
conn.setConnectTimeout(httpConnectionTimeOut * 1000); |
||||||
|
} |
||||||
|
if (httpReadTimeOut != 0) { |
||||||
|
conn.setReadTimeout(httpReadTimeOut * 1000); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 指定HTTP方法 |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @param request |
||||||
|
* @throws ProtocolException |
||||||
|
*/ |
||||||
|
private void filleMethod(HttpURLConnection conn, HttpRequest<?> request) throws ProtocolException { |
||||||
|
conn.setRequestMethod(request.getHttpParams().getMethod().toUpperCase()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加头信息 |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @param request |
||||||
|
*/ |
||||||
|
private void fillHeaders(HttpURLConnection conn, HttpRequest<?> request) { |
||||||
|
if (request.getHttpParams().getHeaders() != null) { |
||||||
|
for (Entry<String, String> entry : request.getHttpParams().getHeaders().entrySet()) { |
||||||
|
fillHeader(conn, entry.getKey(), entry.getValue()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加头信息 |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @param request |
||||||
|
*/ |
||||||
|
private void fillHeader(HttpURLConnection conn, String key, String value) { |
||||||
|
conn.setRequestProperty(key, value); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 添加Cookies |
||||||
|
* |
||||||
|
* @param conn |
||||||
|
* @param request |
||||||
|
*/ |
||||||
|
private void fillCookies(HttpURLConnection conn, HttpRequest<?> request) { |
||||||
|
if (request.getHttpParams().getCookies() != null) { |
||||||
|
conn.setRequestProperty("Cookie", request.getHttpParams().getCookies()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 创建Http链接 |
||||||
|
* |
||||||
|
* @param request |
||||||
|
* @return |
||||||
|
* @throws NoSuchAlgorithmException |
||||||
|
* @throws KeyManagementException |
||||||
|
* @throws MalformedURLException |
||||||
|
* @throws IOException |
||||||
|
* @throws CertificateException |
||||||
|
* @throws KeyStoreException |
||||||
|
* @throws UnrecoverableKeyException |
||||||
|
*/ |
||||||
|
private HttpURLConnection createConnection(HttpRequest<?> request, String realUrl) |
||||||
|
throws NoSuchAlgorithmException, KeyManagementException, MalformedURLException, IOException, UnrecoverableKeyException, KeyStoreException, CertificateException { |
||||||
|
URL console = new URL(realUrl); |
||||||
|
HttpURLConnection conn; |
||||||
|
if (request.isHttps()) { |
||||||
|
conn = genHttpsConn(console, request); |
||||||
|
} else { |
||||||
|
conn = (HttpURLConnection) console.openConnection(); |
||||||
|
} |
||||||
|
return conn; |
||||||
|
} |
||||||
|
|
||||||
|
private HttpURLConnection genHttpsConn(URL console, HttpRequest<?> request) |
||||||
|
throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException { |
||||||
|
SSLContext ctx = getSSLContext(request.getHttpsParams()); |
||||||
|
HttpsURLConnection sconn = (HttpsURLConnection) console.openConnection(); |
||||||
|
sconn.setSSLSocketFactory(ctx.getSocketFactory()); |
||||||
|
sconn.setHostnameVerifier(new HostnameVerifier() { |
||||||
|
public boolean verify(String hostname, SSLSession session) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
}); |
||||||
|
return sconn; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获得KeyStore. |
||||||
|
* |
||||||
|
* @param keyStorePath |
||||||
|
* 密钥库路径 |
||||||
|
* @param password |
||||||
|
* 密码 |
||||||
|
* @return 密钥库 |
||||||
|
* @throws KeyStoreException |
||||||
|
* @throws IOException |
||||||
|
* @throws CertificateException |
||||||
|
* @throws NoSuchAlgorithmException |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
private KeyStore getKeyStore(HttpsParams params) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { |
||||||
|
// 实例化密钥库 KeyStore用于存放证书,创建对象时 指定交换数字证书的加密标准
|
||||||
|
// 指定交换数字证书的加密标准
|
||||||
|
KeyStore ks = KeyStore.getInstance(params.getAlgorithm()); |
||||||
|
// 获得密钥库文件流
|
||||||
|
FileInputStream is = new FileInputStream(params.getKeyStorePath()); |
||||||
|
// 加载密钥库
|
||||||
|
ks.load(is, params.getPassword().toCharArray()); |
||||||
|
// 关闭密钥库文件流
|
||||||
|
is.close(); |
||||||
|
return ks; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 获得SSLSocketFactory. |
||||||
|
* |
||||||
|
* @param password |
||||||
|
* 密码 |
||||||
|
* @param keyStorePath |
||||||
|
* 密钥库路径 |
||||||
|
* @param trustStorePath |
||||||
|
* 信任库路径 |
||||||
|
* @return SSLSocketFactory |
||||||
|
* @throws NoSuchAlgorithmException |
||||||
|
* @throws IOException |
||||||
|
* @throws CertificateException |
||||||
|
* @throws KeyStoreException |
||||||
|
* @throws UnrecoverableKeyException |
||||||
|
* @throws KeyManagementException |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
private SSLContext getSSLContext(HttpsParams params) throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException { |
||||||
|
// 实例化SSL上下文
|
||||||
|
SSLContext ctx = SSLContext.getInstance("TLS"); |
||||||
|
if (params != null) { |
||||||
|
// 实例化密钥库 KeyManager选择证书证明自己的身份
|
||||||
|
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); |
||||||
|
// 实例化信任库 TrustManager决定是否信任对方的证书
|
||||||
|
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); |
||||||
|
// 获得密钥库
|
||||||
|
KeyStore keyStore = getKeyStore(params); |
||||||
|
// 初始化密钥工厂
|
||||||
|
keyManagerFactory.init(keyStore, params.getPassword().toCharArray()); |
||||||
|
// 获得信任库
|
||||||
|
KeyStore trustStore = getKeyStore(params); |
||||||
|
// 初始化信任库
|
||||||
|
trustManagerFactory.init(trustStore); |
||||||
|
// 初始化SSL上下文
|
||||||
|
ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom()); |
||||||
|
} else { |
||||||
|
ctx.init(null, new TrustManager[] { myX509TrustManager }, new SecureRandom()); |
||||||
|
} |
||||||
|
return ctx; |
||||||
|
} |
||||||
|
|
||||||
|
private TrustManager myX509TrustManager = new X509TrustManager() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public X509Certificate[] getAcceptedIssuers() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,94 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpRequest<T> { |
||||||
|
|
||||||
|
/** |
||||||
|
* http参数 |
||||||
|
*/ |
||||||
|
private HttpRequestParams<T> httpParams; |
||||||
|
|
||||||
|
/** |
||||||
|
* https参数 |
||||||
|
*/ |
||||||
|
private HttpsParams httpsParams; |
||||||
|
|
||||||
|
/** |
||||||
|
* 内容解析器 |
||||||
|
*/ |
||||||
|
private HttpRequestPraser<T> contentPraser; |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否https请求 |
||||||
|
*/ |
||||||
|
private boolean isHttps; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
protected HttpRequest() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* http参数 |
||||||
|
* @param contentPraser |
||||||
|
* 内容解析器 |
||||||
|
*/ |
||||||
|
protected HttpRequest(HttpRequestParams<T> httpParams, HttpRequestPraser<T> contentPraser) { |
||||||
|
this.httpParams = httpParams; |
||||||
|
this.contentPraser = contentPraser; |
||||||
|
this.isHttps = false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* http参数 |
||||||
|
* @param httpsParams |
||||||
|
* https参数 |
||||||
|
* @param contentPraser |
||||||
|
* 内容解析器 |
||||||
|
*/ |
||||||
|
protected HttpRequest(HttpRequestParams<T> httpParams, HttpsParams httpsParams, HttpRequestPraser<T> contentPraser) { |
||||||
|
this.httpParams = httpParams; |
||||||
|
this.httpsParams = httpsParams; |
||||||
|
this.contentPraser = contentPraser; |
||||||
|
this.isHttps = true; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isHttps() { |
||||||
|
return isHttps; |
||||||
|
} |
||||||
|
|
||||||
|
public HttpRequestParams<T> getHttpParams() { |
||||||
|
return httpParams; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHttpParams(HttpRequestParams<T> httpParams) { |
||||||
|
this.httpParams = httpParams; |
||||||
|
} |
||||||
|
|
||||||
|
public HttpsParams getHttpsParams() { |
||||||
|
return httpsParams; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHttpsParams(HttpsParams httpsParams) { |
||||||
|
this.httpsParams = httpsParams; |
||||||
|
} |
||||||
|
|
||||||
|
public HttpRequestPraser<T> getContentPraser() { |
||||||
|
return contentPraser; |
||||||
|
} |
||||||
|
|
||||||
|
public void setContentPraser(HttpRequestPraser<T> contentPraser) { |
||||||
|
this.contentPraser = contentPraser; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpRequestBytes extends HttpRequest<byte[]> { |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* 请求参数 |
||||||
|
*/ |
||||||
|
public HttpRequestBytes(HttpRequestParams<byte[]> httpParams) { |
||||||
|
super(httpParams, new HttpRequestPraserBytes()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpRequestKV extends HttpRequest<Map<String, String>> { |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* 请求参数 |
||||||
|
*/ |
||||||
|
public HttpRequestKV(HttpRequestParams<Map<String, String>> httpParams) { |
||||||
|
super(httpParams, new HttpRequestPraserKV()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,67 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpRequestParams<T> { |
||||||
|
|
||||||
|
private String url;// URL
|
||||||
|
private String charSet = "UTF-8";// 编码
|
||||||
|
private String method = "GET";// Http方法
|
||||||
|
private Map<String, String> headers;// 头信息
|
||||||
|
private String cookies;// cookie信息
|
||||||
|
private T params;// 传输数据
|
||||||
|
|
||||||
|
public String getUrl() { |
||||||
|
return url; |
||||||
|
} |
||||||
|
|
||||||
|
public void setUrl(String url) { |
||||||
|
this.url = url; |
||||||
|
} |
||||||
|
|
||||||
|
public String getCharSet() { |
||||||
|
return charSet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCharSet(String charSet) { |
||||||
|
this.charSet = charSet; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMethod() { |
||||||
|
return method; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMethod(String method) { |
||||||
|
this.method = method; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<String, String> getHeaders() { |
||||||
|
return headers; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHeaders(Map<String, String> headers) { |
||||||
|
this.headers = headers; |
||||||
|
} |
||||||
|
|
||||||
|
public String getCookies() { |
||||||
|
return cookies; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCookies(String cookies) { |
||||||
|
this.cookies = cookies; |
||||||
|
} |
||||||
|
|
||||||
|
public T getParams() { |
||||||
|
return params; |
||||||
|
} |
||||||
|
|
||||||
|
public void setParams(T params) { |
||||||
|
this.params = params; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public interface HttpRequestPraser<T> { |
||||||
|
|
||||||
|
/** |
||||||
|
* 将请求参数转换为String<br/> |
||||||
|
* 主要用于get方法传输 |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* 请求参数 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public String praseRqeuestContentToString(HttpRequestParams<T> httpParams); |
||||||
|
|
||||||
|
/** |
||||||
|
* 将请求参数转换为byte[]<br/> |
||||||
|
* 主要用于post方法传输 |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* 请求参数 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public byte[] praseRqeuestContentToBytes(HttpRequestParams<T> httpParams); |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取请求参数大小<br/> |
||||||
|
* 主要用于post方法传输 |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* 请求参数 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public int praseRqeuestContentLength(HttpRequestParams<T> httpParams); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpRequestPraserBytes implements HttpRequestPraser<byte[]> { |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求内容字符串 |
||||||
|
*/ |
||||||
|
private String contentString; |
||||||
|
|
||||||
|
@Override |
||||||
|
public String praseRqeuestContentToString(HttpRequestParams<byte[]> httpParams) { |
||||||
|
if (contentString != null) { |
||||||
|
return contentString; |
||||||
|
} |
||||||
|
try { |
||||||
|
contentString = new String(httpParams.getParams(), httpParams.getCharSet()); |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return contentString; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public byte[] praseRqeuestContentToBytes(HttpRequestParams<byte[]> httpParams) { |
||||||
|
return httpParams.getParams(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int praseRqeuestContentLength(HttpRequestParams<byte[]> httpParams) { |
||||||
|
if (httpParams.getParams() != null) { |
||||||
|
return httpParams.getParams().length; |
||||||
|
} else { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,71 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Map.Entry; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpRequestPraserKV implements HttpRequestPraser<Map<String, String>> { |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求内容byte数组 |
||||||
|
*/ |
||||||
|
private byte[] contentBytes; |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求内容字符串 |
||||||
|
*/ |
||||||
|
private String contentString; |
||||||
|
|
||||||
|
@Override |
||||||
|
public String praseRqeuestContentToString(HttpRequestParams<Map<String, String>> httpParams) { |
||||||
|
if (contentString != null) { |
||||||
|
return contentString; |
||||||
|
} |
||||||
|
Map<String, String> params = httpParams.getParams(); |
||||||
|
if (params == null || params.size() == 0) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
StringBuffer buffer = new StringBuffer(); |
||||||
|
for (Entry<String, String> entry : params.entrySet()) { |
||||||
|
if (entry.getValue() != null) { |
||||||
|
buffer.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); |
||||||
|
} |
||||||
|
} |
||||||
|
String param = buffer.toString(); |
||||||
|
contentString = param.substring(0, param.length() - 1); |
||||||
|
return contentString; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public byte[] praseRqeuestContentToBytes(HttpRequestParams<Map<String, String>> httpParams) { |
||||||
|
if (contentBytes != null) { |
||||||
|
return contentBytes; |
||||||
|
} |
||||||
|
String paramStr = praseRqeuestContentToString(httpParams); |
||||||
|
if (paramStr == null) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
try { |
||||||
|
contentBytes = paramStr.getBytes(httpParams.getCharSet()); |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return contentBytes; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int praseRqeuestContentLength(HttpRequestParams<Map<String, String>> httpParams) { |
||||||
|
praseRqeuestContentToBytes(httpParams); |
||||||
|
if (contentBytes != null) { |
||||||
|
return contentBytes.length; |
||||||
|
} else { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpRequestPraserString implements HttpRequestPraser<String> { |
||||||
|
|
||||||
|
/** |
||||||
|
* 请求内容byte数组 |
||||||
|
*/ |
||||||
|
private byte[] contentBytes; |
||||||
|
|
||||||
|
@Override |
||||||
|
public String praseRqeuestContentToString(HttpRequestParams<String> httpParams) { |
||||||
|
return httpParams.getParams(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public byte[] praseRqeuestContentToBytes(HttpRequestParams<String> httpParams) { |
||||||
|
if (contentBytes != null) { |
||||||
|
return contentBytes; |
||||||
|
} |
||||||
|
try { |
||||||
|
contentBytes = httpParams.getParams().getBytes(httpParams.getCharSet()); |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
contentBytes = null; |
||||||
|
} |
||||||
|
return contentBytes; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int praseRqeuestContentLength(HttpRequestParams<String> httpParams) { |
||||||
|
praseRqeuestContentToBytes(httpParams); |
||||||
|
if (contentBytes != null) { |
||||||
|
return contentBytes.length; |
||||||
|
} else { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpRequestString extends HttpRequest<String> { |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* 请求参数 |
||||||
|
*/ |
||||||
|
public HttpRequestString(HttpRequestParams<String> httpParams) { |
||||||
|
super(httpParams, new HttpRequestPraserString()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,113 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpResponse<T> { |
||||||
|
|
||||||
|
/** |
||||||
|
* Http 结果代码 |
||||||
|
*/ |
||||||
|
private HttpResultCode resultCode; |
||||||
|
|
||||||
|
/** |
||||||
|
* Http链接Code |
||||||
|
*/ |
||||||
|
private int httpCode; |
||||||
|
|
||||||
|
/** |
||||||
|
* Http响应头 |
||||||
|
*/ |
||||||
|
private Map<String, String> headers; |
||||||
|
|
||||||
|
/** |
||||||
|
* http响应Cookies |
||||||
|
*/ |
||||||
|
private List<String> cookies; |
||||||
|
/** |
||||||
|
* http字符集 |
||||||
|
*/ |
||||||
|
private String charSet; |
||||||
|
/** |
||||||
|
* http响应数据 |
||||||
|
*/ |
||||||
|
private T result; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param resultCode |
||||||
|
* Http 结果代码 |
||||||
|
* @param httpCode |
||||||
|
* Http链接Code |
||||||
|
* @param headers |
||||||
|
* Http响应头 |
||||||
|
* @param cookies |
||||||
|
* http响应Cookies |
||||||
|
* @param charSet |
||||||
|
* http字符集 |
||||||
|
* @param result |
||||||
|
* http响应数据 |
||||||
|
*/ |
||||||
|
public HttpResponse(HttpResultCode resultCode, int httpCode, Map<String, String> headers, List<String> cookies, String charSet, T result) { |
||||||
|
this.resultCode = resultCode; |
||||||
|
this.httpCode = httpCode; |
||||||
|
this.headers = headers; |
||||||
|
this.cookies = cookies; |
||||||
|
this.charSet = charSet; |
||||||
|
this.result = result; |
||||||
|
} |
||||||
|
|
||||||
|
public HttpResultCode getResultCode() { |
||||||
|
return resultCode; |
||||||
|
} |
||||||
|
|
||||||
|
public void setResultCode(HttpResultCode resultCode) { |
||||||
|
this.resultCode = resultCode; |
||||||
|
} |
||||||
|
|
||||||
|
public int getHttpCode() { |
||||||
|
return httpCode; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHttpCode(int httpCode) { |
||||||
|
this.httpCode = httpCode; |
||||||
|
} |
||||||
|
|
||||||
|
public Map<String, String> getHeaders() { |
||||||
|
return headers; |
||||||
|
} |
||||||
|
|
||||||
|
public void setHeaders(Map<String, String> headers) { |
||||||
|
this.headers = headers; |
||||||
|
} |
||||||
|
|
||||||
|
public List<String> getCookies() { |
||||||
|
return cookies; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCookies(List<String> cookies) { |
||||||
|
this.cookies = cookies; |
||||||
|
} |
||||||
|
|
||||||
|
public String getCharSet() { |
||||||
|
return charSet; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCharSet(String charSet) { |
||||||
|
this.charSet = charSet; |
||||||
|
} |
||||||
|
|
||||||
|
public T getResult() { |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public void setResult(T result) { |
||||||
|
this.result = result; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author hujian |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpResponseBytes extends HttpResponse<byte[]> { |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param resultCode |
||||||
|
* Http 结果代码 |
||||||
|
* @param httpCode |
||||||
|
* Http链接Code |
||||||
|
* @param headers |
||||||
|
* Http响应头 |
||||||
|
* @param cookies |
||||||
|
* http响应Cookies |
||||||
|
* @param charSet |
||||||
|
* http字符集 |
||||||
|
* @param result |
||||||
|
* http响应数据 |
||||||
|
*/ |
||||||
|
public HttpResponseBytes(HttpResultCode resultCode, int httpCode, Map<String, String> headers, List<String> cookies, String charSet, byte[] result) { |
||||||
|
super(resultCode, httpCode, headers, cookies, charSet, result); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpResponseBytesPraser implements HttpResponsePraser<HttpResponseBytes> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public HttpResponseBytes prase(HttpResultCode resultCode, int httpCode, Map<String, String> headers, List<String> cookies, String charSet, ByteArrayOutputStream outputStream) { |
||||||
|
return new HttpResponseBytes(resultCode, httpCode, headers, cookies, charSet, outputStream == null ? null : outputStream.toByteArray()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public interface HttpResponsePraser<T> { |
||||||
|
|
||||||
|
/** |
||||||
|
* 解析 |
||||||
|
* |
||||||
|
* @param resultCode |
||||||
|
* Http 结果代码 |
||||||
|
* @param httpCode |
||||||
|
* Http链接Code |
||||||
|
* @param headers |
||||||
|
* Http响应头 |
||||||
|
* @param cookies |
||||||
|
* http响应Cookies |
||||||
|
* @param charSet |
||||||
|
* http字符集 |
||||||
|
* @param result |
||||||
|
* http响应数据 |
||||||
|
*/ |
||||||
|
public T prase(HttpResultCode resultCode, int httpCode, Map<String, String> headers, List<String> cookies, String charSet, ByteArrayOutputStream outputStream); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpResponseString extends HttpResponse<String> { |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param resultCode |
||||||
|
* Http 结果代码 |
||||||
|
* @param httpCode |
||||||
|
* Http链接Code |
||||||
|
* @param headers |
||||||
|
* Http响应头 |
||||||
|
* @param cookies |
||||||
|
* http响应Cookies |
||||||
|
* @param charSet |
||||||
|
* http字符集 |
||||||
|
* @param result |
||||||
|
* http响应数据 |
||||||
|
*/ |
||||||
|
public HttpResponseString(HttpResultCode resultCode, int httpCode, Map<String, String> headers, List<String> cookies, String charSet, String result) { |
||||||
|
super(resultCode, httpCode, headers, cookies, charSet, result); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream; |
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpResponseStringPraser implements HttpResponsePraser<HttpResponseString> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public HttpResponseString prase(HttpResultCode resultCode, int httpCode, Map<String, String> headers, List<String> cookies, String charSet, ByteArrayOutputStream outputStream) { |
||||||
|
String st = null; |
||||||
|
try { |
||||||
|
if(outputStream != null){ |
||||||
|
byte[] resultBytes = outputStream.toByteArray(); |
||||||
|
st = new String(resultBytes, charSet); |
||||||
|
} |
||||||
|
} catch (UnsupportedEncodingException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
return new HttpResponseString(resultCode, httpCode, headers, cookies, charSet, st); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public enum HttpResultCode { |
||||||
|
|
||||||
|
SUCCESS("成功", "SUCCESS"), //
|
||||||
|
ERROR_URL_NULL("URL为空", "ERROR-URL-NULL"), //
|
||||||
|
ERROR_URL("URL访问失败", "ERROR-URL"), //
|
||||||
|
ERROR_HTTPS_SSL("HTTPS异常", "ERROR-HTTPS-SSL"), //
|
||||||
|
ERROR_METHOD("HTTP方法无法识别", "ERROR-METHOD"), //
|
||||||
|
ERROR_CHARSET("编码错误", "ERROR-CHARSET"), //
|
||||||
|
ERROR_CONNECT("访问失败", "ERROR-CONNECT"), //
|
||||||
|
ERROR_TIMEOUT("访问超时", "ERROR-TIMEOUT"), //
|
||||||
|
|
||||||
|
; |
||||||
|
|
||||||
|
/** |
||||||
|
* 名称 |
||||||
|
*/ |
||||||
|
private String name; |
||||||
|
/** |
||||||
|
* 编码 |
||||||
|
*/ |
||||||
|
private String code; |
||||||
|
|
||||||
|
private HttpResultCode(String name, String code) { |
||||||
|
this.name = name; |
||||||
|
this.code = code; |
||||||
|
} |
||||||
|
|
||||||
|
public static String findNameByCode(String code) { |
||||||
|
for (HttpResultCode oc : HttpResultCode.values()) { |
||||||
|
if (oc.getCode().equals(code)) { |
||||||
|
return oc.getName(); |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public static String findCodeByName(String name) { |
||||||
|
for (HttpResultCode oc : HttpResultCode.values()) { |
||||||
|
if (oc.getName().equals(name)) { |
||||||
|
return oc.getCode(); |
||||||
|
} |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public String getName() { |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
public void setName(String name) { |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
public String getCode() { |
||||||
|
return code; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCode(String code) { |
||||||
|
this.code = code; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpsParams { |
||||||
|
|
||||||
|
private String password;// 密钥库密钥
|
||||||
|
private String keyStorePath;// 密钥库文件地址
|
||||||
|
private String trustStorePath;// 信任库文件地址
|
||||||
|
private String algorithm;// 指定交换数字证书的加密标准:JKS
|
||||||
|
|
||||||
|
public String getPassword() { |
||||||
|
return password; |
||||||
|
} |
||||||
|
|
||||||
|
public void setPassword(String password) { |
||||||
|
this.password = password; |
||||||
|
} |
||||||
|
|
||||||
|
public String getKeyStorePath() { |
||||||
|
return keyStorePath; |
||||||
|
} |
||||||
|
|
||||||
|
public void setKeyStorePath(String keyStorePath) { |
||||||
|
this.keyStorePath = keyStorePath; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTrustStorePath() { |
||||||
|
return trustStorePath; |
||||||
|
} |
||||||
|
|
||||||
|
public void setTrustStorePath(String trustStorePath) { |
||||||
|
this.trustStorePath = trustStorePath; |
||||||
|
} |
||||||
|
|
||||||
|
public String getAlgorithm() { |
||||||
|
return algorithm; |
||||||
|
} |
||||||
|
|
||||||
|
public void setAlgorithm(String algorithm) { |
||||||
|
this.algorithm = algorithm; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpsRequestBytes extends HttpRequest<byte[]> { |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* http请求参数 |
||||||
|
* @param httpsParams |
||||||
|
* https参数 |
||||||
|
*/ |
||||||
|
public HttpsRequestBytes(HttpRequestParams<byte[]> httpParams, HttpsParams httpsParams) { |
||||||
|
super(httpParams, httpsParams, new HttpRequestPraserBytes()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpsRequestKV extends HttpRequest<Map<String, String>> { |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* http请求参数 |
||||||
|
* @param httpsParams |
||||||
|
* https参数 |
||||||
|
*/ |
||||||
|
public HttpsRequestKV(HttpRequestParams<Map<String, String>> httpParams, HttpsParams httpsParams) { |
||||||
|
super(httpParams, httpsParams, new HttpRequestPraserKV()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.util.http; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author xx |
||||||
|
* @Date 2020/9/15 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class HttpsRequestString extends HttpRequest<String> { |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* @param httpParams |
||||||
|
* http请求参数 |
||||||
|
* @param httpsParams |
||||||
|
* https参数 |
||||||
|
*/ |
||||||
|
public HttpsRequestString(HttpRequestParams<String> httpParams, HttpsParams httpsParams) { |
||||||
|
super(httpParams, httpsParams, new HttpRequestPraserString()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.web; |
||||||
|
|
||||||
|
import com.fr.web.struct.Component; |
||||||
|
import com.fr.web.struct.Filter; |
||||||
|
import com.fr.web.struct.browser.RequestClient; |
||||||
|
import com.fr.web.struct.category.ScriptPath; |
||||||
|
import com.fr.web.struct.category.StylePath; |
||||||
|
|
||||||
|
public class MainFilesComponent extends Component { |
||||||
|
public static final MainFilesComponent KEY = new MainFilesComponent(); |
||||||
|
private MainFilesComponent(){} |
||||||
|
/** |
||||||
|
* 返回需要引入的JS脚本路径 |
||||||
|
* @param client 请求客户端描述 |
||||||
|
* @return JS脚本路径 |
||||||
|
*/ |
||||||
|
public ScriptPath script(RequestClient client ) { |
||||||
|
//如果不需要就直接返回 ScriptPath.EMPTY
|
||||||
|
return ScriptPath.build("com/fr/plugin/third/party/jsdjadh/main.js"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回需要引入的CSS样式路径 |
||||||
|
* @param client 请求客户端描述 |
||||||
|
* @return CSS样式路径 |
||||||
|
*/ |
||||||
|
public StylePath style(RequestClient client ) { |
||||||
|
//如果不需要就直接返回 StylePath.EMPTY;
|
||||||
|
//return StylePath.build("com/fr/plugin/jscssinput/demo/demo.css");
|
||||||
|
return StylePath.EMPTY; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过给定的资源过滤器控制是否加载这个资源 |
||||||
|
* @return 资源过滤器 |
||||||
|
*/ |
||||||
|
public Filter filter() { |
||||||
|
return new Filter(){ |
||||||
|
@Override |
||||||
|
public boolean accept() { |
||||||
|
//任何情况下我们都在平台组件加载时加载我们的组件
|
||||||
|
return true; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdjjed.web; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractWebResourceProvider; |
||||||
|
import com.fr.decision.web.MainComponent; |
||||||
|
import com.fr.web.struct.Atom; |
||||||
|
|
||||||
|
public class MainWebResourceProvider extends AbstractWebResourceProvider { |
||||||
|
@Override |
||||||
|
public Atom attach() { |
||||||
|
//在平台主组件加载时添加我们自己的组件
|
||||||
|
return MainComponent.KEY; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Atom client() { |
||||||
|
//我们自己要引入的组件
|
||||||
|
return MainFilesComponent.KEY; |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,263 @@ |
|||||||
|
!(function () { |
||||||
|
console.log("123"); |
||||||
|
BI.config("dec.constant.schedule.task.accessory", function (items) { |
||||||
|
items.push({ |
||||||
|
value: 4096, |
||||||
|
text: "图片" |
||||||
|
}) |
||||||
|
return items; |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
var jsdjjedTextValueCombo = BI.inherit(BI.Widget, { |
||||||
|
props: { |
||||||
|
baseCls: "dec-system-extensible-parameter", |
||||||
|
labelWidth: 210, |
||||||
|
editorWidth: 180, |
||||||
|
value: {} |
||||||
|
}, |
||||||
|
render: function () { |
||||||
|
var t = this |
||||||
|
, e = this.options |
||||||
|
, i = e.value; |
||||||
|
return { |
||||||
|
type: "bi.vertical_adapt", |
||||||
|
items: [{ |
||||||
|
type: "bi.label", |
||||||
|
textAlign: "left", |
||||||
|
cls: "dec-font-weight-bold", |
||||||
|
text: BI.i18nText(i.name), |
||||||
|
title: BI.i18nText(i.name), |
||||||
|
width: e.labelWidth |
||||||
|
}, { |
||||||
|
type: "bi.text_value_combo", |
||||||
|
$testId: "dec-system-normal-extensible-text-value-combo", |
||||||
|
width: e.editorWidth, |
||||||
|
value: i.value, |
||||||
|
items: this._createItems(i), |
||||||
|
ref: function (e) { |
||||||
|
t.textValueCombo = e |
||||||
|
}, |
||||||
|
listeners: [{ |
||||||
|
eventName: "EVENT_CHANGE", |
||||||
|
action: function () { |
||||||
|
t.fireEvent("EVENT_CHANGE", arguments) |
||||||
|
} |
||||||
|
}] |
||||||
|
}, { |
||||||
|
type: "dec.text.bubble.combo", |
||||||
|
cls: "help-area", |
||||||
|
invisible: !i.description, |
||||||
|
text: i.description ? BI.i18nText(i.description) : "", |
||||||
|
el: { |
||||||
|
type: "bi.icon_button", |
||||||
|
$point: "dec-system-normal-extensible", |
||||||
|
cls: "detail-font", |
||||||
|
width: 35, |
||||||
|
height: 24 |
||||||
|
} |
||||||
|
}] |
||||||
|
} |
||||||
|
}, |
||||||
|
_createItems: function (e) { |
||||||
|
return BI.map(e.items || e.alternatives, function (e, t) { |
||||||
|
return BI.extend(t, { |
||||||
|
text: BI.isKey(t.text) ? t.text : BI.i18nText(t.key) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}, |
||||||
|
getValue: function () { |
||||||
|
var e = this.textValueCombo.getValue(); |
||||||
|
return BI.isNotEmptyArray(e) ? e[0] : ""; |
||||||
|
}, |
||||||
|
setValue: function (e) { |
||||||
|
this.textValueCombo.setValue(e); |
||||||
|
}, |
||||||
|
populate: function (e) { |
||||||
|
this.textValueCombo.populate(e); |
||||||
|
} |
||||||
|
}); |
||||||
|
jsdjjedTextValueCombo.EVENT_CHANGE = "EVENT_CHANGE"; |
||||||
|
BI.shortcut("jsdjjed.text.value.combo", jsdjjedTextValueCombo); |
||||||
|
|
||||||
|
|
||||||
|
var appMessagePushTerminalType = 64; |
||||||
|
//debugger;
|
||||||
|
Dec.Plugin.OutPutActionProvider.items.push({ |
||||||
|
version: 1.0, |
||||||
|
terminalType: appMessagePushTerminalType, |
||||||
|
terminalText: BI.i18nText("飞书推送通知"), |
||||||
|
getItem: function () { |
||||||
|
var self = this; |
||||||
|
return { |
||||||
|
type: "bi.vertical", |
||||||
|
//width: 540,
|
||||||
|
height: 100, |
||||||
|
vgap: 0, |
||||||
|
items: [{ |
||||||
|
type: "jsdjjed.text.value.combo", |
||||||
|
labelWidth: 80, |
||||||
|
value: { |
||||||
|
name: "应用凭证", |
||||||
|
value: "", |
||||||
|
//description: BI.i18nText("Dec-System_Week_Begins_Tips"),
|
||||||
|
//items: BI.Constants.getConstant("dec.constant.system.normal.week.begins")
|
||||||
|
}, |
||||||
|
ref: function (e) { |
||||||
|
self.appConfigIds = e |
||||||
|
}, |
||||||
|
listeners: [{ |
||||||
|
eventName: "EVENT_CHANGE", |
||||||
|
action: function () { |
||||||
|
var configId = this.getValue(); |
||||||
|
//console.log(configId);
|
||||||
|
self._setChatGroupValue(configId); |
||||||
|
} |
||||||
|
}] |
||||||
|
}, |
||||||
|
{ |
||||||
|
type: "jsdjjed.text.value.combo", |
||||||
|
labelWidth: 80, |
||||||
|
value: { |
||||||
|
name: "飞书群", |
||||||
|
value: "", |
||||||
|
//description: BI.i18nText("Dec-System_Week_Begins_Tips"),
|
||||||
|
//items: BI.Constants.getConstant("dec.constant.system.normal.week.begins")
|
||||||
|
}, |
||||||
|
ref: function (e) { |
||||||
|
self.chatGroup = e |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
type: "jsdjjed.text.value.combo", |
||||||
|
labelWidth: 80, |
||||||
|
value: { |
||||||
|
name: "消息类型", |
||||||
|
value: "text", |
||||||
|
//description: BI.i18nText("Dec-System_Week_Begins_Tips"),
|
||||||
|
items: [{text: "文本", value: "text"}, {text: "富文本", value: "post"}] |
||||||
|
}, |
||||||
|
ref: function (e) { |
||||||
|
self.feishuMsgType = e |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
type: "jsdjjed.text.value.combo", |
||||||
|
labelWidth: 80, |
||||||
|
value: { |
||||||
|
name: "发送类型", |
||||||
|
value: "message", |
||||||
|
//description: BI.i18nText("Dec-System_Week_Begins_Tips"),
|
||||||
|
items: [{text: "消息", value: "message"}, {text: "文件", value: "file"}, { |
||||||
|
text: "消息与文件", |
||||||
|
value: "message_file" |
||||||
|
}] |
||||||
|
}, |
||||||
|
ref: function (e) { |
||||||
|
self.feishuSendType = e |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
}, |
||||||
|
_setChatGroupValue: function (configId) { |
||||||
|
var self = this; |
||||||
|
var id = configId || ""; |
||||||
|
Dec.jsdjjed.reqChatGroup({config_id: id}, function (e) { |
||||||
|
var items = BI.map(Dec.jsdjjed.getValidItemsData(e), function (e, t) { |
||||||
|
return {text: t.show, value: t.chatId}; |
||||||
|
}); |
||||||
|
items.unshift({text: "空", value: "empty_group"}); |
||||||
|
if (BI.isNotEmptyArray(items)) { |
||||||
|
var currentChatGroupId = self._getCurrentChatGroupId(); |
||||||
|
var chatId = self._getItemContainValue(currentChatGroupId, items); |
||||||
|
self.chatGroup.populate(items); |
||||||
|
self.chatGroup.setValue(chatId); |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
setValue: function (v) { |
||||||
|
//debugger;
|
||||||
|
if (v.terminal && v.terminal === appMessagePushTerminalType) { |
||||||
|
if ((v.feishuMsgType == undefined) || (v.feishuMsgType == null) || (v.feishuMsgType.length <= 0)) { |
||||||
|
v.feishuMsgType = "text"; |
||||||
|
} |
||||||
|
|
||||||
|
if ((v.feishuSendType == undefined) || (v.feishuSendType == null) || (v.feishuSendType.length <= 0)) { |
||||||
|
v.feishuSendType = "message"; |
||||||
|
} |
||||||
|
|
||||||
|
this.value = v; |
||||||
|
this.appConfigIds.setValue(v.configId); |
||||||
|
this.chatGroup.setValue(v.chatGroupId); |
||||||
|
this.feishuMsgType.setValue(v.feishuMsgType); |
||||||
|
this.feishuSendType.setValue(v.feishuSendType); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
getValue: function () { |
||||||
|
var self = this; |
||||||
|
// actionName最后一个点后面的类名要和这个return的json的字段名一致
|
||||||
|
|
||||||
|
return { |
||||||
|
OutputAppMessagePush: BI.extend(self.value, { |
||||||
|
"@class": "com.fr.plugin.third.party.jsdjjed.schedule.bean.OutputAppMessagePush", |
||||||
|
actionName: "com.fr.plugin.third.party.jsdjjed.schedule.bean.OutputAppMessagePush", |
||||||
|
terminal: appMessagePushTerminalType, |
||||||
|
configId: self.appConfigIds.getValue(), |
||||||
|
chatGroupId: self.chatGroup.getValue(), |
||||||
|
feishuMsgType: self.feishuMsgType.getValue(), |
||||||
|
feishuSendType: self.feishuSendType.getValue() |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
checkValid: function () { |
||||||
|
return this.getValue() ? true : false; |
||||||
|
}, |
||||||
|
|
||||||
|
fireEvent: function (v) { |
||||||
|
var self = this; |
||||||
|
if (v && v == true) { |
||||||
|
Dec.jsdjjed.reqAppsByPage({page: 1}, function (e) { |
||||||
|
var items = BI.map(Dec.jsdjjed.getValidItemsData(e), function (e, t) { |
||||||
|
return {text: t.show, value: t.configId}; |
||||||
|
}); |
||||||
|
if (BI.isNotEmptyArray(items)) { |
||||||
|
var currentConfigId = self._getCurrentConfigId(); |
||||||
|
var configId = self._getItemContainValue(currentConfigId, items); |
||||||
|
self.appConfigIds.populate(items); |
||||||
|
self.appConfigIds.setValue(configId); |
||||||
|
self.appConfigIds.fireEvent("EVENT_CHANGE"); |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
_getItemContainValue: function (currentValue, items) { |
||||||
|
var tempValue = items[0].value; |
||||||
|
if (BI.isEmpty(currentValue)) { |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
for (var i = 0, max = items.length - 1; i <= max; i++) { |
||||||
|
if (currentValue == items[i].value) { |
||||||
|
return currentValue; |
||||||
|
} |
||||||
|
} |
||||||
|
return tempValue; |
||||||
|
}, |
||||||
|
_getCurrentConfigId() { |
||||||
|
var self = this; |
||||||
|
if (self.value && self.value.configId) { |
||||||
|
return self.value.configId; |
||||||
|
} |
||||||
|
return ""; |
||||||
|
}, |
||||||
|
_getCurrentChatGroupId() { |
||||||
|
var self = this; |
||||||
|
if (self.value && self.value.chatGroupId) { |
||||||
|
return self.value.chatGroupId; |
||||||
|
} |
||||||
|
return ""; |
||||||
|
} |
||||||
|
}); |
||||||
|
})(); |
File diff suppressed because one or more lines are too long
@ -0,0 +1,36 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
<head> |
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"/> |
||||||
|
<title>数据决策系统</title> |
||||||
|
<script type="text/javascript" |
||||||
|
src="/webroot/decision/file?path=/com/fr/plugin/third/party/jsdjjed/sdk/h5-js-sdk-1.5.12.js&type=plain&parser=plain"></script> |
||||||
|
<script type="text/javascript" |
||||||
|
src="/webroot/decision/file?path=/com/fr/plugin/third/party/jsdjjed/sdk/runworkhelp.js&type=plain&parser=plain"></script> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<h2>报表轻应用跳转</h2> |
||||||
|
<script type="text/javascript"> |
||||||
|
var runWorkH5 = new window.runworkHelp.RunWorkH5({ |
||||||
|
env: "uat", |
||||||
|
devUser: "xm", |
||||||
|
isLocal: true, |
||||||
|
appId: "cli_a227f7a29b38d08f", |
||||||
|
appSecret: "nTuZlTPyEV3vS5FW107giffUOQc712K6", |
||||||
|
isHrInfo: true |
||||||
|
}); |
||||||
|
runWorkH5.initReady().then(() => { |
||||||
|
//debugger; |
||||||
|
//console.log(runWorkH5.user.open_id); |
||||||
|
if (runWorkH5.user && runWorkH5.user.open_id) { |
||||||
|
var state = ""; |
||||||
|
window.location = "/webroot/decision?login=feishu&light_app_id=" + runWorkH5.user.open_id + "&state=" + state; |
||||||
|
} |
||||||
|
}); |
||||||
|
</script> |
||||||
|
</body> |
||||||
|
</html> |
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue