JSD-9468 定时调度消息推送
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

217 lines
9.2 KiB

/*
* Copyright (C), 2018-2021
* Project: starter
* FileName: PostJsonOutput
* Author: Louis
* Date: 2021/4/15 10:45
*/
package com.fr.plugin.idfh.action;
import com.fanruan.api.i18n.I18nKit;
import com.fanruan.api.log.LogKit;
import com.fanruan.api.net.http.rs.HttpRequestType;
import com.fanruan.api.util.StringKit;
import com.fr.decision.system.bean.message.MessageUrlType;
import com.fr.decision.webservice.v10.message.MessageService;
import com.fr.general.ComparatorUtils;
import com.fr.general.DateUtils;
import com.fr.io.utils.ResourceIOUtils;
import com.fr.json.JSONArray;
import com.fr.json.JSONObject;
import com.fr.plugin.idfh.kit.HttpKit;
import com.fr.schedule.base.constant.ScheduleConstants;
import com.fr.stable.StringUtils;
import com.fr.third.org.apache.http.HttpEntity;
import com.fr.third.org.apache.http.entity.StringEntity;
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.springframework.web.util.HtmlUtils;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
* <Function Description><br>
* <PostJsonOutput>
*
* @author fr.open
* @since 1.0.0
*/
public class PostJsonOutput extends AbstractDataOutput {
public static final String KEY = "PostJsonOutput";
public static final String USERNAME = "username";
public static final String VALIDATE_CODE = "validateCode";
public static final String LOGIN_URL = "loginUrl";
@Override
public void checkHeader(Map<String, String> headers) throws Exception {
if (!headers.containsKey("Content-Type")) {
headers.put("Content-Type", "application/json");
}
if (!ComparatorUtils.equalsIgnoreCase(headers.get("Content-Type"), "application/json")) {
throw new Exception(I18nKit.getLocText("Plugin-httpaction_Header_Content-Type_Valid"));
}
}
@Override
public void operation(OutputHttp outputHttp, Map<String, Object> taskParams, Map<String, String> bodyParams, Map<String, String> headers) throws Exception {
LogKit.info("idfh-PostJsonOutput-operation-bodyParams:{}, taskParams:{}", bodyParams, taskParams);
JSONObject msgEntity = createMsgEntity(bodyParams, outputHttp.getBodyContent());
headers.put("Authorization", "Bearer " + getAPIToken(bodyParams));
LogKit.info("idfh-PostJsonOutput-operation-headers:{}", headers);
List<String> attachFiles = uploadFiles(taskParams, bodyParams.get("uploadUrl"), headers.get("Authorization"));
LogKit.info("idfh-PostJsonOutput-operation-attachFiles:{}", attachFiles);
if (outputHttp.isPreviewAttach()) {
handleContent(attachFiles, msgEntity);
}
String[] usernames = getUserNames(taskParams);
JSONArray msgList = JSONArray.create();
for (String username : usernames) {
msgEntity.put("originalMsgId", UUID.randomUUID());
msgEntity.put("employeeNo", username);
for (int i = 0; i < Math.min(attachFiles.size(), 5); i++) {
if (attachFiles.get(i).endsWith(ScheduleConstants.Suffix.PNG)) {
continue;
}
msgEntity.put("attachFile" + (i + 1), attachFiles.get(i));
}
msgList.add(msgEntity.copy());
}
JSONObject requestJo = JSONObject.create();
requestJo.put("msgList", msgList);
LogKit.info("idfh-PostJsonOutput-operation-requestJo:{}", requestJo.encode());
StringEntity stringEntity = new StringEntity(requestJo.encode(), "UTF-8");
String response = HttpKit.executeAndParse(com.fanruan.api.net.http.rs.HttpRequest.custom()
.url(outputHttp.getApiUrl()).post(stringEntity).headers(headers).build());
LogKit.info("idfh-PostJsonOutput-operation-response:{}", response);
sendTemplateMessage(HtmlUtils.htmlUnescape(response), PostJsonOutput.KEY);
}
private JSONObject createMsgEntity(Map<String, String> bodyParams, String bodyContent) {
JSONObject msgEntity = JSONObject.create();
msgEntity.put("srcSystem", bodyParams.get("srcSystem"));
msgEntity.put("keyword", bodyParams.get("keyword"));
msgEntity.put("dbSource", bodyParams.get("dbSource"));
msgEntity.put("target", bodyParams.get("target"));
msgEntity.put("msgContent", bodyContent);
msgEntity.put("createTime", DateUtils.getDate2LStr(new Date()));
bodyParams.remove("srcSystem");
bodyParams.remove("keyword");
bodyParams.remove("dbSource");
bodyParams.remove("target");
return msgEntity;
}
/**
* 消息内容加入图片HTML
*
* @param attachFiles
* @param msgEntity
*/
private void handleContent(List<String> attachFiles, JSONObject msgEntity) {
StringBuilder msgContent = new StringBuilder();
msgContent.append(msgEntity.getString("msgContent")).append("<br/>");
for (String file : attachFiles) {
if (file.endsWith(ScheduleConstants.Suffix.PNG)) {
msgContent.append("<img src=\"").append(file).append("\">");
}
}
msgEntity.put("msgContent", msgContent);
}
/**
* 上传附件操作
*
* @param taskParams
* @param url
* @param authorization
* @return
*/
private List<String> uploadFiles(Map<String, Object> taskParams, String url, String authorization) {
List<String> attachFiles = new ArrayList<>();
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", authorization);
String[] outputFiles = (String[]) taskParams.get(ScheduleConstants.OUTPUT_FILES);
MultipartEntityBuilder builder;
String filePath;
File file;
FileBody fileBody;
HttpEntity httpEntity;
String response;
JSONObject result;
for (String outputFile : outputFiles) {
try {
LogKit.info("idfh-PostJsonOutput-uploadFiles-outputFile:{}", outputFile);
builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
filePath = ResourceIOUtils.getRealPath(outputFile);
file = new File(filePath);
fileBody = new FileBody(file);
builder.addPart("file", fileBody);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
httpEntity = builder.setCharset(StandardCharsets.UTF_8).build();
response = HttpKit.uploadFile(url, httpEntity, StandardCharsets.UTF_8, headers, HttpRequestType.POST);
LogKit.info("idfh-PostJsonOutput-uploadFiles-response:{}", response);
result = new JSONObject(response);
if (ComparatorUtils.equals(result.getInt("code"), 0)) {
attachFiles.add(result.getString("data"));
}
} catch (Exception e) {
LogKit.error(e.getMessage(), e);
}
}
return attachFiles;
}
/**
* 获取定时任务发送用户
*
* @param taskParams
* @return
*/
private String[] getUserNames(Map<String, Object> taskParams) {
String username = (String) taskParams.get(ScheduleConstants.USERNAME);
if (StringUtils.isNotEmpty(username)) {
return new String[]{username};
} else {
String[] usernames = (String[]) taskParams.get(ScheduleConstants.USERNAMES);
return usernames != null ? usernames : new String[0];
}
}
/**
* 获取调用后续接口的凭证
*
* @param params
*/
private String getAPIToken(Map<String, String> params) throws Exception {
Map<String, String> bodyParams = new HashMap<>();
bodyParams.put(USERNAME, params.get(USERNAME));
bodyParams.put(VALIDATE_CODE, params.get(VALIDATE_CODE));
String bodyContent = JSONObject.mapFrom(bodyParams).encode();
StringEntity stringEntity = new StringEntity(bodyContent, "UTF-8");
Map<String, String> loginHeaders = new HashMap<>();
loginHeaders.put("Content-Type", "application/json");
String response = HttpKit.executeAndParse(com.fanruan.api.net.http.rs.HttpRequest.custom()
.url(params.get(LOGIN_URL)).post(stringEntity).headers(loginHeaders).build());
JSONObject result = new JSONObject(response);
if (ComparatorUtils.equals(result.getInt("code"), 0)) {
return result.getJSONObject("data").getString("apiToken");
}
return StringKit.EMPTY;
}
/**
* 接口返回结果发送消息
*
* @param response
*/
public static void sendTemplateMessage(String response, String type) {
String content = I18nKit.getLocText("Plugin-httpaction") + "-" +
type + "-" +
I18nKit.getLocText("Plugin-httpaction_Result_Message") +
response;
MessageService.getInstance().sendMessage2SupperRole(content, StringUtils.EMPTY, MessageUrlType.NONE);
}
}