|
|
package com.java3y.austin.action;
|
|
|
|
|
|
import cn.hutool.core.util.ReflectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.google.common.base.Throwables;
|
|
|
import com.java3y.austin.constant.AustinConstant;
|
|
|
import com.java3y.austin.dao.MessageTemplateDao;
|
|
|
import com.java3y.austin.domain.MessageParam;
|
|
|
import com.java3y.austin.domain.MessageTemplate;
|
|
|
import com.java3y.austin.domain.SendTaskModel;
|
|
|
import com.java3y.austin.domain.TaskInfo;
|
|
|
import com.java3y.austin.dto.ContentModel;
|
|
|
import com.java3y.austin.enums.ChannelType;
|
|
|
import com.java3y.austin.enums.RespStatusEnum;
|
|
|
import com.java3y.austin.pipeline.BusinessProcess;
|
|
|
import com.java3y.austin.pipeline.ProcessContext;
|
|
|
import com.java3y.austin.utils.ContentHolderUtil;
|
|
|
import com.java3y.austin.utils.TaskInfoUtils;
|
|
|
import com.java3y.austin.vo.BasicResultVO;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* @author 3y
|
|
|
* @date 2021/11/22
|
|
|
* @description 拼装参数
|
|
|
*/
|
|
|
@Slf4j
|
|
|
public class AssembleAction implements BusinessProcess {
|
|
|
|
|
|
@Autowired
|
|
|
private MessageTemplateDao messageTemplateDao;
|
|
|
|
|
|
@Override
|
|
|
public void process(ProcessContext context) {
|
|
|
SendTaskModel sendTaskModel = (SendTaskModel) context.getProcessModel();
|
|
|
Long messageTemplateId = sendTaskModel.getMessageTemplateId();
|
|
|
|
|
|
try {
|
|
|
Optional<MessageTemplate> messageTemplate = messageTemplateDao.findById(messageTemplateId);
|
|
|
if (!messageTemplate.isPresent() || messageTemplate.get().getIsDeleted().equals(AustinConstant.TRUE)) {
|
|
|
context.setNeedBreak(true).setResponse(BasicResultVO.fail(RespStatusEnum.TEMPLATE_NOT_FOUND));
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
List<TaskInfo> taskInfos = assembleTaskInfo(sendTaskModel, messageTemplate.get());
|
|
|
sendTaskModel.setTaskInfo(taskInfos);
|
|
|
} catch (Exception e) {
|
|
|
context.setNeedBreak(true).setResponse(BasicResultVO.fail(RespStatusEnum.SERVICE_ERROR));
|
|
|
log.error("assemble task fail! templateId:{}, e:{}", messageTemplateId, Throwables.getStackTraceAsString(e));
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 组装 TaskInfo 任务消息
|
|
|
*
|
|
|
* @param sendTaskModel
|
|
|
* @param messageTemplate
|
|
|
*/
|
|
|
private List<TaskInfo> assembleTaskInfo(SendTaskModel sendTaskModel, MessageTemplate messageTemplate) {
|
|
|
List<MessageParam> messageParamList = sendTaskModel.getMessageParamList();
|
|
|
List<TaskInfo> taskInfoList = new ArrayList<>();
|
|
|
|
|
|
for (MessageParam messageParam : messageParamList) {
|
|
|
|
|
|
TaskInfo taskInfo = TaskInfo.builder()
|
|
|
.messageTemplateId(messageTemplate.getId())
|
|
|
.businessId(TaskInfoUtils.generateBusinessId(messageTemplate.getId(), messageTemplate.getTemplateType()))
|
|
|
.receiver(new HashSet<>(Arrays.asList(messageParam.getReceiver().split(String.valueOf(StrUtil.C_COMMA)))))
|
|
|
.idType(messageTemplate.getIdType())
|
|
|
.sendChannel(messageTemplate.getSendChannel())
|
|
|
.templateType(messageTemplate.getTemplateType())
|
|
|
.msgType(messageTemplate.getMsgType())
|
|
|
.sendAccount(messageTemplate.getSendAccount())
|
|
|
.contentModel(getContentModelValue(messageTemplate, messageParam)).build();
|
|
|
|
|
|
taskInfoList.add(taskInfo);
|
|
|
}
|
|
|
|
|
|
return taskInfoList;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 获取 contentModel,替换模板msgContent中占位符信息
|
|
|
*/
|
|
|
private static ContentModel getContentModelValue(MessageTemplate messageTemplate, MessageParam messageParam) {
|
|
|
|
|
|
// 得到真正的ContentModel 类型
|
|
|
Integer sendChannel = messageTemplate.getSendChannel();
|
|
|
Class contentModelClass = ChannelType.getChanelModelClassByCode(sendChannel);
|
|
|
|
|
|
|
|
|
// 得到模板的 msgContent 和 入参
|
|
|
Map<String, String> variables = messageParam.getVariables();
|
|
|
JSONObject jsonObject = JSON.parseObject(messageTemplate.getMsgContent());
|
|
|
|
|
|
|
|
|
// 通过反射 组装出 contentModel
|
|
|
Field[] fields = ReflectUtil.getFields(contentModelClass);
|
|
|
ContentModel contentModel = (ContentModel) ReflectUtil.newInstance(contentModelClass);
|
|
|
for (Field field : fields) {
|
|
|
String originValue = jsonObject.getString(field.getName());
|
|
|
|
|
|
if (StrUtil.isNotBlank(originValue)) {
|
|
|
String resultValue = ContentHolderUtil.replacePlaceHolder(originValue, variables);
|
|
|
ReflectUtil.setFieldValue(contentModel, field, resultValue);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 如果 url 字段存在,则在url拼接对应的埋点参数
|
|
|
String url = (String) ReflectUtil.getFieldValue(contentModel, "url");
|
|
|
if (StrUtil.isNotBlank(url)) {
|
|
|
String resultUrl = TaskInfoUtils.generateUrl(url, messageTemplate.getId(), messageTemplate.getTemplateType());
|
|
|
ReflectUtil.setFieldValue(contentModel, "url", resultUrl);
|
|
|
}
|
|
|
return contentModel;
|
|
|
}
|
|
|
}
|