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.dto.ContentModel; import com.java3y.austin.dto.SmsContentModel; import com.java3y.austin.enums.ChannelType; import com.java3y.austin.enums.RespStatusEnum; 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.pipeline.BusinessProcess; import com.java3y.austin.pipeline.ProcessContext; import com.java3y.austin.domain.TaskInfo; 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 = messageTemplateDao.findById(messageTemplateId); if (!messageTemplate.isPresent() || messageTemplate.get().getIsDeleted().equals(AustinConstant.TRUE)) { context.setNeedBreak(true).setResponse(BasicResultVO.fail(RespStatusEnum.TEMPLATE_NOT_FOUND)); return; } List 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 assembleTaskInfo(SendTaskModel sendTaskModel, MessageTemplate messageTemplate) { List messageParamList = sendTaskModel.getMessageParamList(); List 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)) .deduplicationTime(messageTemplate.getDeduplicationTime()) .isNightShield(messageTemplate.getIsNightShield()).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 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); } } return contentModel; } }