From ac0174a0e864925561393444e475dfc172ef8157 Mon Sep 17 00:00:00 2001 From: 3y Date: Mon, 23 May 2022 22:07:58 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E9=99=90=E5=88=B6=20receiver=20?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E7=9A=84=E5=A4=A7=E5=B0=8F=202=E3=80=81?= =?UTF-8?q?=E5=A6=82=E6=9E=9Cid=E7=B1=BB=E5=9E=8B=E6=98=AF=E9=82=AE?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E5=8A=A0=E5=85=A5=E6=AD=A3=E5=88=99=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E9=82=AE=E4=BB=B6=E5=90=88=E6=B3=95=E6=80=A7=203?= =?UTF-8?q?=E3=80=81=E5=8A=A0=E5=85=A5=20=E4=BA=91=E7=89=87=20=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E6=B8=A0=E9=81=93=20=E5=81=9A=E5=AE=B9=E7=81=BE?= =?UTF-8?q?=E5=92=8C=E6=B5=81=E9=87=8F=E5=88=87=E6=8D=A2=EF=BC=88=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dto/account/YunPianSmsAccount.java | 45 +++++++ .../java3y/austin/common/enums/SmsStatus.java | 3 +- .../handler/domain/sms/YunPianSendResult.java | 81 +++++++++++++ .../austin/handler/receipt/SmsReceipt.java | 55 +++++++++ .../handler/receipt/TencentSmsReceipt.java | 89 +++++++------- .../handler/receipt/YunPianSmsReceipt.java | 25 ++++ .../handler/script/impl/YunPianSmsScript.java | 114 ++++++++++++++++++ .../impl/action/AfterParamCheckAction.java | 60 +++++---- .../api/impl/action/PreParamCheckAction.java | 18 ++- .../service/api/domain/MessageParam.java | 1 + .../web/service/impl/DataServiceImpl.java | 10 -- 11 files changed, 414 insertions(+), 87 deletions(-) create mode 100644 austin-common/src/main/java/com/java3y/austin/common/dto/account/YunPianSmsAccount.java create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/domain/sms/YunPianSendResult.java create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/receipt/SmsReceipt.java create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/receipt/YunPianSmsReceipt.java create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/script/impl/YunPianSmsScript.java diff --git a/austin-common/src/main/java/com/java3y/austin/common/dto/account/YunPianSmsAccount.java b/austin-common/src/main/java/com/java3y/austin/common/dto/account/YunPianSmsAccount.java new file mode 100644 index 0000000..361fe3c --- /dev/null +++ b/austin-common/src/main/java/com/java3y/austin/common/dto/account/YunPianSmsAccount.java @@ -0,0 +1,45 @@ +package com.java3y.austin.common.dto.account; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 云片账号信息 + * + * 参数示例: + * [{"sms_20":{"url":"https://sms.yunpian.com/v2/sms/tpl_batch_send.json","apikey":"ca55d4c8544444444444622221b5cd7","tpl_id":"533332222282","supplierId":20,"supplierName":"云片"}}] + * + * @author 3y + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class YunPianSmsAccount { + + /** + * apikey + */ + private String apikey; + /** + * tplId + */ + private String tplId; + + /** + * api相关 + */ + private String url; + + /** + * 标识渠道商Id + */ + private Integer supplierId; + + /** + * 标识渠道商名字 + */ + private String supplierName; +} diff --git a/austin-common/src/main/java/com/java3y/austin/common/enums/SmsStatus.java b/austin-common/src/main/java/com/java3y/austin/common/enums/SmsStatus.java index 285280c..8bbdf67 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/enums/SmsStatus.java +++ b/austin-common/src/main/java/com/java3y/austin/common/enums/SmsStatus.java @@ -15,7 +15,8 @@ public enum SmsStatus { SEND_SUCCESS(10,"调用渠道接口发送成功"), RECEIVE_SUCCESS(20,"用户收到短信(收到渠道短信回执,状态成功)"), - RECEIVE_FAIL(30, "用户收不到短信(收到渠道短信回执,状态失败)"); + RECEIVE_FAIL(30, "用户收不到短信(收到渠道短信回执,状态失败)"), + SEND_FAIL(40, "调用渠道接口发送失败"); private Integer code; private String description; diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/domain/sms/YunPianSendResult.java b/austin-handler/src/main/java/com/java3y/austin/handler/domain/sms/YunPianSendResult.java new file mode 100644 index 0000000..dc7ddc9 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/domain/sms/YunPianSendResult.java @@ -0,0 +1,81 @@ +package com.java3y.austin.handler.domain.sms; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor +@Data +public class YunPianSendResult { + + /** + * totalCount + */ + @JSONField(name = "total_count") + private Integer totalCount; + /** + * totalFee + */ + @JSONField(name = "total_fee") + private String totalFee; + /** + * unit + */ + @JSONField(name = "unit") + private String unit; + /** + * data + */ + @JSONField(name = "data") + private List data; + + /** + * DataDTO + */ + @NoArgsConstructor + @Data + public static class DataDTO { + /** + * httpStatusCode + */ + @JSONField(name = "http_status_code") + private Integer httpStatusCode; + /** + * code + */ + @JSONField(name = "code") + private Integer code; + /** + * msg + */ + @JSONField(name = "msg") + private String msg; + /** + * count + */ + @JSONField(name = "count") + private Integer count; + /** + * fee + */ + @JSONField(name = "fee") + private Integer fee; + /** + * unit + */ + @JSONField(name = "unit") + private String unit; + /** + * mobile + */ + @JSONField(name = "mobile") + private String mobile; + /** + * sid + */ + @JSONField(name = "sid") + private Integer sid; + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/SmsReceipt.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/SmsReceipt.java new file mode 100644 index 0000000..79f1e90 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/SmsReceipt.java @@ -0,0 +1,55 @@ +package com.java3y.austin.handler.receipt; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import com.google.common.base.Throwables; +import com.java3y.austin.common.constant.SendAccountConstant; +import com.java3y.austin.common.dto.account.TencentSmsAccount; +import com.java3y.austin.common.enums.SmsStatus; +import com.java3y.austin.support.config.SupportThreadPoolConfig; +import com.java3y.austin.support.domain.SmsRecord; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.PullSmsSendStatus; +import com.tencentcloudapi.sms.v20210111.models.PullSmsSendStatusRequest; +import com.tencentcloudapi.sms.v20210111.models.PullSmsSendStatusResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 拉取短信回执信息 + * + * @author 3y + */ +@Component +@Slf4j +public class SmsReceipt { + + @Autowired + private TencentSmsReceipt tencentSmsReceipt; + + @Autowired + private YunPianSmsReceipt yunPianSmsReceipt; + + @PostConstruct + private void init() { + SupportThreadPoolConfig.getPendingSingleThreadPool().execute(() -> { + while (true) { + tencentSmsReceipt.pull(); + yunPianSmsReceipt.pull(); + try { + Thread.sleep(200); + } catch (InterruptedException e) { + } + } + }); + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/TencentSmsReceipt.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/TencentSmsReceipt.java index e59f67a..704422e 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/TencentSmsReceipt.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/TencentSmsReceipt.java @@ -13,13 +13,11 @@ import com.java3y.austin.support.dao.SmsRecordDao; import com.java3y.austin.support.domain.SmsRecord; import com.java3y.austin.support.utils.AccountUtils; import com.tencentcloudapi.common.Credential; -import com.tencentcloudapi.common.exception.TencentCloudSDKException; import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.HttpProfile; import com.tencentcloudapi.sms.v20210111.SmsClient; import com.tencentcloudapi.sms.v20210111.models.*; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -30,7 +28,7 @@ import java.util.List; /** - * 拉取短信回执信息 + * 拉取腾讯云短信回执信息 * * @author 3y */ @@ -45,60 +43,55 @@ public class TencentSmsReceipt { @Autowired private SmsRecordDao smsRecordDao; - @PostConstruct - private void init() { + + /** + * 拉取消息并入库 + */ + public void pull() { // 获取腾讯云账号信息 TencentSmsAccount account = accountUtils.getAccount(10, SendAccountConstant.SMS_ACCOUNT_KEY, SendAccountConstant.SMS_PREFIX, TencentSmsAccount.class); - - SupportThreadPoolConfig.getPendingSingleThreadPool().execute(() -> { - - while (true) { - try { - SmsClient client = getSmsClient(account); - - // 每次拉取10条 - PullSmsSendStatusRequest req = new PullSmsSendStatusRequest(); - req.setLimit(10L); - req.setSmsSdkAppId(account.getSmsSdkAppId()); - - PullSmsSendStatusResponse resp = client.PullSmsSendStatus(req); - List smsRecordList = new ArrayList<>(); - if (resp != null && resp.getPullSmsSendStatusSet() != null && resp.getPullSmsSendStatusSet().length > 0) { - log.debug("receipt sms:{}", JSON.toJSONString(resp.getPullSmsSendStatusSet())); - for (PullSmsSendStatus pullSmsSendStatus : resp.getPullSmsSendStatusSet()) { - SmsRecord smsRecord = SmsRecord.builder() - .sendDate(Integer.valueOf(DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN))) - .messageTemplateId(0L) - .phone(Long.valueOf(pullSmsSendStatus.getSubscriberNumber())) - .supplierId(account.getSupplierId()) - .supplierName(account.getSupplierName()) - .msgContent("") - .seriesId(pullSmsSendStatus.getSerialNo()) - .chargingNum(0) - .status("SUCCESS".equals(pullSmsSendStatus.getReportStatus()) ? SmsStatus.RECEIVE_SUCCESS.getCode() : SmsStatus.RECEIVE_FAIL.getCode()) - .reportContent(pullSmsSendStatus.getDescription()) - .updated(Math.toIntExact(pullSmsSendStatus.getUserReceiveTime())) - .created(Math.toIntExact(DateUtil.currentSeconds())) - .build(); - smsRecordList.add(smsRecord); - } - } - if (!CollUtil.isEmpty(smsRecordList)) { - smsRecordDao.saveAll(smsRecordList); - } - Thread.sleep(200); - } catch (Exception e) { - log.error("TencentSmsReceipt#init fail!{}", Throwables.getStackTraceAsString(e)); + try { + SmsClient client = getSmsClient(account); + + // 每次拉取10条 + PullSmsSendStatusRequest req = new PullSmsSendStatusRequest(); + req.setLimit(10L); + req.setSmsSdkAppId(account.getSmsSdkAppId()); + + PullSmsSendStatusResponse resp = client.PullSmsSendStatus(req); + List smsRecordList = new ArrayList<>(); + if (resp != null && resp.getPullSmsSendStatusSet() != null && resp.getPullSmsSendStatusSet().length > 0) { + log.debug("receipt sms:{}", JSON.toJSONString(resp.getPullSmsSendStatusSet())); + for (PullSmsSendStatus pullSmsSendStatus : resp.getPullSmsSendStatusSet()) { + SmsRecord smsRecord = SmsRecord.builder() + .sendDate(Integer.valueOf(DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN))) + .messageTemplateId(0L) + .phone(Long.valueOf(pullSmsSendStatus.getSubscriberNumber())) + .supplierId(account.getSupplierId()) + .supplierName(account.getSupplierName()) + .msgContent("") + .seriesId(pullSmsSendStatus.getSerialNo()) + .chargingNum(0) + .status("SUCCESS".equals(pullSmsSendStatus.getReportStatus()) ? SmsStatus.RECEIVE_SUCCESS.getCode() : SmsStatus.RECEIVE_FAIL.getCode()) + .reportContent(pullSmsSendStatus.getDescription()) + .updated(Math.toIntExact(pullSmsSendStatus.getUserReceiveTime())) + .created(Math.toIntExact(DateUtil.currentSeconds())) + .build(); + smsRecordList.add(smsRecord); } } - - }); - + if (!CollUtil.isEmpty(smsRecordList)) { + smsRecordDao.saveAll(smsRecordList); + } + } catch (Exception e) { + log.error("TencentSmsReceipt#init fail!{}", Throwables.getStackTraceAsString(e)); + } } /** * 构造smsClient + * * @param account * @return */ diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/YunPianSmsReceipt.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/YunPianSmsReceipt.java new file mode 100644 index 0000000..1e6442d --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/YunPianSmsReceipt.java @@ -0,0 +1,25 @@ +package com.java3y.austin.handler.receipt; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + + +/** + * 拉取云片网短信回执信息 + * + * @author 3y + */ +@Component +@Slf4j +public class YunPianSmsReceipt { + /** + * 拉取消息并入库 + */ + public void pull() { + + } + +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/YunPianSmsScript.java b/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/YunPianSmsScript.java new file mode 100644 index 0000000..e65f566 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/YunPianSmsScript.java @@ -0,0 +1,114 @@ +package com.java3y.austin.handler.script.impl; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.ContentType; +import cn.hutool.http.Header; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSON; +import com.java3y.austin.common.constant.SendAccountConstant; +import com.java3y.austin.common.dto.account.TencentSmsAccount; +import com.java3y.austin.common.dto.account.YunPianSmsAccount; +import com.java3y.austin.common.enums.SmsStatus; +import com.java3y.austin.handler.domain.sms.SmsParam; +import com.java3y.austin.handler.domain.sms.YunPianSendResult; +import com.java3y.austin.handler.script.SmsScript; +import com.java3y.austin.support.domain.SmsRecord; +import com.java3y.austin.support.utils.AccountUtils; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.profile.ClientProfile; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import com.tencentcloudapi.sms.v20210111.models.SendStatus; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author 3y + * @date 2022年5月23日 + * 发送短信接入文档:https://www.yunpian.com/official/document/sms/zh_CN/domestic_list + */ +//@Service +@Slf4j +public class YunPianSmsScript implements SmsScript { + @Autowired + private AccountUtils accountUtils; + + @Override + public List send(SmsParam smsParam) throws Exception { + YunPianSmsAccount account = accountUtils.getAccount(smsParam.getSendAccount(), SendAccountConstant.SMS_ACCOUNT_KEY, SendAccountConstant.SMS_PREFIX, YunPianSmsAccount.class); + + Map params = assembleParam(smsParam, account); + + String result = HttpRequest.post(account.getUrl()) + .header(Header.CONTENT_TYPE.getValue(), ContentType.FORM_URLENCODED.getValue()) + .header(Header.ACCEPT.getValue(), ContentType.JSON.getValue()) + .body(JSON.toJSONString(params)) + .timeout(2000) + .execute().body(); + + YunPianSendResult yunPianSendResult = JSON.parseObject(result, YunPianSendResult.class); + + return assembleSmsRecord(smsParam, yunPianSendResult, account); + } + + /** + * 组装参数 + * @param smsParam + * @param account + * @return + */ + private Map assembleParam(SmsParam smsParam, YunPianSmsAccount account) { + Map params = new HashMap<>(); + params.put("apikey", account.getApikey()); + params.put("mobile", StringUtils.join(smsParam.getPhones(), StrUtil.C_COMMA)); + params.put("tpl_id", account.getTplId()); + params.put("tpl_value", ""); + return params; + } + + + private List assembleSmsRecord(SmsParam smsParam, YunPianSendResult response, YunPianSmsAccount account) { + if (response == null || ArrayUtil.isEmpty(response.getData())) { + return null; + } + + List smsRecordList = new ArrayList<>(); + + for (YunPianSendResult.DataDTO datum : response.getData()) { + SmsRecord smsRecord = SmsRecord.builder() + .sendDate(Integer.valueOf(DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN))) + .messageTemplateId(smsParam.getMessageTemplateId()) + .phone(Long.valueOf(datum.getMobile())) + .supplierId(account.getSupplierId()) + .supplierName(account.getSupplierName()) + .msgContent(smsParam.getContent()) + .seriesId(String.valueOf(datum.getSid())) + .chargingNum(Math.toIntExact(datum.getCount())) + .status("0".equals(datum.getCode())?SmsStatus.SEND_SUCCESS.getCode():SmsStatus.SEND_FAIL.getCode()) + .reportContent(datum.getMsg()) + .created(Math.toIntExact(DateUtil.currentSeconds())) + .updated(Math.toIntExact(DateUtil.currentSeconds())) + .build(); + + smsRecordList.add(smsRecord); + } + + return smsRecordList; + } + + + +} + diff --git a/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/AfterParamCheckAction.java b/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/AfterParamCheckAction.java index 8c97488..ee44492 100644 --- a/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/AfterParamCheckAction.java +++ b/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/AfterParamCheckAction.java @@ -15,6 +15,7 @@ import com.java3y.austin.support.pipeline.ProcessContext; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -29,18 +30,23 @@ import java.util.stream.Collectors; @Service public class AfterParamCheckAction implements BusinessProcess { - public static final String PHONE_REGEX_EXP = "^((13[0-9])|(14[5,7,9])|(15[0-3,5-9])|(166)|(17[0-9])|(18[0-9])|(19[1,8,9]))\\d{8}$"; + public static final String EMAIL_REGEX_EXP = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\\\\.[a-zA-Z0-9]+"; + + public static final HashMap CHANNEL_REGEX_EXP = new HashMap<>(); + static { + CHANNEL_REGEX_EXP.put(IdType.PHONE.getCode(), PHONE_REGEX_EXP); + CHANNEL_REGEX_EXP.put(IdType.EMAIL.getCode(), EMAIL_REGEX_EXP); + } + @Override public void process(ProcessContext context) { SendTaskModel sendTaskModel = context.getProcessModel(); List taskInfo = sendTaskModel.getTaskInfo(); - // 1. 过滤掉不合法的手机号 - filterIllegalPhoneNum(taskInfo); - - // 2. + // 1. 过滤掉不合法的手机号、邮件 + filterIllegalReceiver(taskInfo); if (CollUtil.isEmpty(taskInfo)) { context.setNeedBreak(true).setResponse(BasicResultVO.fail(RespStatusEnum.CLIENT_BAD_PARAMETERS)); @@ -48,31 +54,35 @@ public class AfterParamCheckAction implements BusinessProcess { } /** - * 如果指定类型是手机号,且渠道是发送短信,检测输入手机号是否合法 - * + * 如果指定类型是手机号,检测输入手机号是否合法 + * 如果指定类型是邮件,检测输入邮件是否合法 * @param taskInfo */ - private void filterIllegalPhoneNum(List taskInfo) { + private void filterIllegalReceiver(List taskInfo) { Integer idType = CollUtil.getFirst(taskInfo.iterator()).getIdType(); - Integer sendChannel = CollUtil.getFirst(taskInfo.iterator()).getSendChannel(); - - if (IdType.PHONE.getCode().equals(idType) && ChannelType.SMS.getCode().equals(sendChannel)) { - Iterator iterator = taskInfo.iterator(); + filter(taskInfo, CHANNEL_REGEX_EXP.get(idType)); + } - // 利用正则找出不合法的手机号 - while (iterator.hasNext()) { - TaskInfo task = iterator.next(); - Set illegalPhone = task.getReceiver().stream() - .filter(phone -> !ReUtil.isMatch(PHONE_REGEX_EXP, phone)) - .collect(Collectors.toSet()); + /** + * 利用正则过滤掉不合法的接收者 + * + * @param taskInfo + * @param regexExp + */ + private void filter(List taskInfo, String regexExp) { + Iterator iterator = taskInfo.iterator(); + while (iterator.hasNext()) { + TaskInfo task = iterator.next(); + Set illegalPhone = task.getReceiver().stream() + .filter(phone -> !ReUtil.isMatch(regexExp, phone)) + .collect(Collectors.toSet()); - if (CollUtil.isNotEmpty(illegalPhone)) { - task.getReceiver().removeAll(illegalPhone); - log.error("messageTemplateId:{} find illegal phone!{}", task.getMessageTemplateId(), JSON.toJSONString(illegalPhone)); - } - if (CollUtil.isEmpty(task.getReceiver())) { - iterator.remove(); - } + if (CollUtil.isNotEmpty(illegalPhone)) { + task.getReceiver().removeAll(illegalPhone); + log.error("messageTemplateId:{} find illegal receiver!{}", task.getMessageTemplateId(), JSON.toJSONString(illegalPhone)); + } + if (CollUtil.isEmpty(task.getReceiver())) { + iterator.remove(); } } } diff --git a/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/PreParamCheckAction.java b/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/PreParamCheckAction.java index 2c1d152..4e48e07 100644 --- a/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/PreParamCheckAction.java +++ b/austin-service-api-impl/src/main/java/com/java3y/austin/service/api/impl/action/PreParamCheckAction.java @@ -11,6 +11,7 @@ import com.java3y.austin.support.pipeline.ProcessContext; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -23,6 +24,11 @@ import java.util.stream.Collectors; @Service public class PreParamCheckAction implements BusinessProcess { + /** + * 最大的人数 + */ + private static final Integer BATCH_RECEIVER_SIZE = 100; + @Override public void process(ProcessContext context) { SendTaskModel sendTaskModel = context.getProcessModel(); @@ -30,13 +36,13 @@ public class PreParamCheckAction implements BusinessProcess { Long messageTemplateId = sendTaskModel.getMessageTemplateId(); List messageParamList = sendTaskModel.getMessageParamList(); - // 没有传入 消息模板Id 或者 messageParam + // 1.没有传入 消息模板Id 或者 messageParam if (messageTemplateId == null || CollUtil.isEmpty(messageParamList)) { context.setNeedBreak(true).setResponse(BasicResultVO.fail(RespStatusEnum.CLIENT_BAD_PARAMETERS)); return; } - // 过滤 receiver=null 的messageParam + // 2.过滤 receiver=null 的messageParam List resultMessageParamList = messageParamList.stream() .filter(messageParam -> !StrUtil.isBlank(messageParam.getReceiver())) .collect(Collectors.toList()); @@ -44,7 +50,13 @@ public class PreParamCheckAction implements BusinessProcess { context.setNeedBreak(true).setResponse(BasicResultVO.fail(RespStatusEnum.CLIENT_BAD_PARAMETERS)); return; } - sendTaskModel.setMessageParamList(resultMessageParamList); + + // 3.过滤receiver大于100的请求 + if (messageParamList.stream().anyMatch(messageParam -> messageParam.getReceiver().split(StrUtil.COMMA).length > BATCH_RECEIVER_SIZE)) { + context.setNeedBreak(true).setResponse(BasicResultVO.fail(RespStatusEnum.TOO_MANY_RECEIVER)); + return; + } + } } 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 95aa2f8..509efa2 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 @@ -23,6 +23,7 @@ public class MessageParam { /** * @Description: 接收者 * 多个用,逗号号分隔开 + * 【不能大于100个】 * 必传 */ private String receiver; diff --git a/austin-web/src/main/java/com/java3y/austin/web/service/impl/DataServiceImpl.java b/austin-web/src/main/java/com/java3y/austin/web/service/impl/DataServiceImpl.java index 15f3727..5a9b6b1 100644 --- a/austin-web/src/main/java/com/java3y/austin/web/service/impl/DataServiceImpl.java +++ b/austin-web/src/main/java/com/java3y/austin/web/service/impl/DataServiceImpl.java @@ -197,14 +197,4 @@ public class DataServiceImpl implements DataService { } return businessId; } - - public static void main(String[] args) { - - Long time = 1653140847 * 1000L; - - String format = DateUtil.format(new Date(time), DatePattern.NORM_DATETIME_PATTERN); - - System.out.println(format - ); - } }