diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/pending/CrowdBatchTaskPending.java b/austin-cron/src/main/java/com/java3y/austin/cron/pending/CrowdBatchTaskPending.java index d3de60c..cbb4c43 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/pending/CrowdBatchTaskPending.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/pending/CrowdBatchTaskPending.java @@ -53,10 +53,10 @@ public class CrowdBatchTaskPending extends AbstractLazyPending { public void doHandle(List crowdInfoVos) { // 1. 如果参数相同,组装成同一个MessageParam发送 - Map, String> paramMap = MapUtil.newHashMap(); + Map, String> paramMap = MapUtil.newHashMap(); for (CrowdInfoVo crowdInfoVo : crowdInfoVos) { String receiver = crowdInfoVo.getReceiver(); - Map vars = crowdInfoVo.getParams(); + Map vars = crowdInfoVo.getParams(); if (Objects.isNull(paramMap.get(vars))) { paramMap.put(vars, receiver); } else { @@ -68,7 +68,7 @@ public class CrowdBatchTaskPending extends AbstractLazyPending { // 2. 组装参数 List messageParams = Lists.newArrayList(); - for (Map.Entry, String> entry : paramMap.entrySet()) { + for (Map.Entry, String> entry : paramMap.entrySet()) { MessageParam messageParam = MessageParam.builder().receiver(entry.getValue()) .variables(entry.getKey()).build(); messageParams.add(messageParam); diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/service/impl/TaskHandlerImpl.java b/austin-cron/src/main/java/com/java3y/austin/cron/service/impl/TaskHandlerImpl.java index 3858fea..adb2bfe 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/service/impl/TaskHandlerImpl.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/service/impl/TaskHandlerImpl.java @@ -57,7 +57,7 @@ public class TaskHandlerImpl implements TaskHandler { } // 3. 每一行处理交给LazyPending - HashMap params = ReadFileUtils.getParamFromLine(row.getFieldMap()); + HashMap params = ReadFileUtils.getParamFromLine(row.getFieldMap()); CrowdInfoVo crowdInfoVo = CrowdInfoVo.builder().receiver(row.getFieldMap().get(ReadFileUtils.RECEIVER_KEY)) .params(params).messageTemplateId(messageTemplateId).build(); crowdBatchTaskPending.pending(crowdInfoVo); diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/utils/ReadFileUtils.java b/austin-cron/src/main/java/com/java3y/austin/cron/utils/ReadFileUtils.java index a9cb722..83dd968 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/utils/ReadFileUtils.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/utils/ReadFileUtils.java @@ -69,8 +69,8 @@ public class ReadFileUtils { * @param fieldMap * @return */ - public static HashMap getParamFromLine(Map fieldMap) { - HashMap params = MapUtil.newHashMap(); + public static HashMap getParamFromLine(Map fieldMap) { + HashMap params = MapUtil.newHashMap(); for (Map.Entry entry : fieldMap.entrySet()) { if (!ReadFileUtils.RECEIVER_KEY.equals(entry.getKey())) { params.put(entry.getKey(), entry.getValue()); @@ -101,7 +101,7 @@ public class ReadFileUtils { CsvRow headerInfo = data.getRow(0); for (int i = 1; i < data.getRowCount(); i++) { CsvRow row = data.getRow(i); - Map param = MapUtil.newHashMap(); + Map param = MapUtil.newHashMap(); for (int j = 1; j < headerInfo.size(); j++) { param.put(headerInfo.get(j), row.get(j)); } diff --git a/austin-cron/src/main/java/com/java3y/austin/cron/vo/CrowdInfoVo.java b/austin-cron/src/main/java/com/java3y/austin/cron/vo/CrowdInfoVo.java index 4a49886..5c09b26 100644 --- a/austin-cron/src/main/java/com/java3y/austin/cron/vo/CrowdInfoVo.java +++ b/austin-cron/src/main/java/com/java3y/austin/cron/vo/CrowdInfoVo.java @@ -35,5 +35,5 @@ public class CrowdInfoVo implements Serializable { /** * 参数信息 */ - private Map params; + private Map params; } diff --git a/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/AssembleAction.java b/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/AssembleAction.java index 7360002..e702c57 100644 --- a/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/AssembleAction.java +++ b/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/AssembleAction.java @@ -108,7 +108,7 @@ public class AssembleAction implements BusinessProcess { Class contentModelClass = ChannelType.getChanelModelClassByCode(sendChannel); // 得到模板的 msgContent 和 入参 - Map variables = messageParam.getVariables(); + Map variables = messageParam.getVariables(); JSONObject jsonObject = JSON.parseObject(messageTemplate.getMsgContent()); diff --git a/austin-service-api/src/main/java/com/java3y/austin/service/api/domain/MessageParam.java b/austin-service-api/src/main/java/com/java3y/austin/service/api/domain/MessageParam.java index 5fbb17f..ac88239 100644 --- a/austin-service-api/src/main/java/com/java3y/austin/service/api/domain/MessageParam.java +++ b/austin-service-api/src/main/java/com/java3y/austin/service/api/domain/MessageParam.java @@ -33,11 +33,11 @@ public class MessageParam { * @Description: 消息内容中的可变部分(占位符替换) * 可选 */ - private Map variables; + private Map variables; /** * @Description: 扩展参数 * 可选 */ - private Map extra; + private Map extra; } diff --git a/austin-support/pom.xml b/austin-support/pom.xml index 6dcc2bb..14efd6c 100644 --- a/austin-support/pom.xml +++ b/austin-support/pom.xml @@ -123,6 +123,11 @@ hades-nacos-starter + + org.freemarker + freemarker + + \ No newline at end of file diff --git a/austin-support/src/main/java/com/java3y/austin/support/utils/ContentHolderUtil.java b/austin-support/src/main/java/com/java3y/austin/support/utils/ContentHolderUtil.java index 82fcdeb..6867a8e 100644 --- a/austin-support/src/main/java/com/java3y/austin/support/utils/ContentHolderUtil.java +++ b/austin-support/src/main/java/com/java3y/austin/support/utils/ContentHolderUtil.java @@ -1,6 +1,10 @@ package com.java3y.austin.support.utils; -import org.apache.commons.lang3.StringUtils; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.TemplateUtil; +import cn.hutool.json.JSONUtil; import org.springframework.util.PropertyPlaceholderHelper; import java.text.MessageFormat; @@ -11,6 +15,7 @@ import java.util.Map; * 内容占位符 替换 *

* austin占位符格式{$var} + * json 占位符 {$_JSON_var} */ public class ContentHolderUtil { @@ -19,6 +24,11 @@ public class ContentHolderUtil { */ private static final String PLACE_HOLDER_PREFIX = "{$"; + /** + * 模版引擎解析字段前缀 + */ + private static final String JSON_FLAG_PREFIX = "_JSON_"; + /** * 占位符后缀 */ @@ -26,16 +36,21 @@ public class ContentHolderUtil { private static final PropertyPlaceholderHelper PROPERTY_PLACEHOLDER_HELPER = new PropertyPlaceholderHelper(PLACE_HOLDER_PREFIX, PLACE_HOLDER_SUFFIX); + private static final TemplateEngine engine = TemplateUtil.createEngine(); - public static String replacePlaceHolder(final String template, final Map paramMap) { - return PROPERTY_PLACEHOLDER_HELPER.replacePlaceholders(template, new CustomPlaceholderResolver(template, paramMap)); + + public static String replacePlaceHolder(final String template, final Map paramMap) { + String result = PROPERTY_PLACEHOLDER_HELPER.replacePlaceholders(template, new CustomPlaceholderResolver(template, paramMap)); + // 最后用模板引擎动态解析一次json字符串 + result = engine.getTemplate(result).render(paramMap); + return result; } private static class CustomPlaceholderResolver implements PropertyPlaceholderHelper.PlaceholderResolver { private final String template; - private final Map paramMap; + private final Map paramMap; - public CustomPlaceholderResolver(String template, Map paramMap) { + public CustomPlaceholderResolver(String template, Map paramMap) { super(); this.template = template; this.paramMap = paramMap; @@ -43,12 +58,22 @@ public class ContentHolderUtil { @Override public String resolvePlaceholder(String placeholderName) { - String value = paramMap.get(placeholderName); - if (StringUtils.isEmpty(value)) { + Object value = paramMap.get(placeholderName); + if (ObjectUtil.isEmpty(value)) { String errorStr = MessageFormat.format("template:{0} require param:{1},but not exist! paramMap:{2}", template, placeholderName, paramMap.toString()); throw new IllegalArgumentException(errorStr); } - return value; + // 如果遇到 Json, 则先跳过不处理, 到外部使用整体模板引擎渲染 + if (StrUtil.startWith(placeholderName, JSON_FLAG_PREFIX)) { + // 如果值为 字符串, 则将其转换为 JSON 做字段解析 + if (value instanceof String) { + Object jsonValue = JSONUtil.parse(value); + paramMap.put(placeholderName, jsonValue); + } + return placeholderName; + } + return StrUtil.toString(value); + } } diff --git a/austin-web/src/main/java/com/java3y/austin/web/controller/MessageTemplateController.java b/austin-web/src/main/java/com/java3y/austin/web/controller/MessageTemplateController.java index 5c75116..f972fcc 100644 --- a/austin-web/src/main/java/com/java3y/austin/web/controller/MessageTemplateController.java +++ b/austin-web/src/main/java/com/java3y/austin/web/controller/MessageTemplateController.java @@ -133,7 +133,7 @@ public class MessageTemplateController { @ApiOperation("/测试发送接口") public SendResponse test(@RequestBody MessageTemplateParam messageTemplateParam) { - Map variables = JSON.parseObject(messageTemplateParam.getMsgContent(), Map.class); + Map variables = JSON.parseObject(messageTemplateParam.getMsgContent(), Map.class); MessageParam messageParam = MessageParam.builder().receiver(messageTemplateParam.getReceiver()).variables(variables).build(); SendRequest sendRequest = SendRequest.builder().code(BusinessCode.COMMON_SEND.getCode()).messageTemplateId(messageTemplateParam.getId()).messageParam(messageParam).build(); SendResponse response = sendService.send(sendRequest); diff --git a/pom.xml b/pom.xml index 7692650..8e9ca2c 100644 --- a/pom.xml +++ b/pom.xml @@ -230,6 +230,14 @@ + + + + org.freemarker + freemarker + 2.3.32 + +