From 246e325e6531eb45ba30f66e7e773c72586d975b Mon Sep 17 00:00:00 2001 From: 3y Date: Sat, 26 Nov 2022 16:49:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E6=8B=89=E5=8F=96?= =?UTF-8?q?=E5=9B=9E=E6=89=A7=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dto/account/TencentSmsAccount.java | 47 ------- .../common/dto/account/sms/SmsAccount.java | 8 +- .../dto/account/sms/TencentSmsAccount.java | 5 +- .../dto/account/sms/YunPianSmsAccount.java | 3 +- .../austin/handler/domain/sms/SmsParam.java | 2 +- .../austin/handler/handler/Handler.java | 1 - .../impl/DingDingWorkNoticeHandler.java | 19 +++ .../handler/handler/impl/PushHandler.java | 7 +- .../handler/handler/impl/SmsHandler.java | 1 - .../handler/receipt/DingDingWorkReceipt.java | 51 ------- .../handler/receipt/MessageReceipt.java | 19 ++- .../handler/receipt/SmsPullReceipt.java | 126 ------------------ .../receipt/stater/ReceiptMessageStater.java | 14 ++ .../impl/DingDingWorkReceiptStaterImpl.java | 33 +++++ .../impl/SmsPullReceiptStarterImpl.java | 60 +++++++++ .../austin/handler/script/BaseSmsScript.java | 42 ------ .../austin/handler/script/SmsScript.java | 13 +- .../handler/script/SmsScriptHandler.java | 27 ---- .../handler/script/SmsScriptHolder.java | 25 ---- .../handler/script/impl/TencentSmsScript.java | 78 ++++++++++- .../handler/script/impl/YunPianSmsScript.java | 7 + .../austin/support/utils/AccountUtils.java | 4 - 22 files changed, 240 insertions(+), 352 deletions(-) delete mode 100644 austin-common/src/main/java/com/java3y/austin/common/dto/account/TencentSmsAccount.java delete mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/receipt/DingDingWorkReceipt.java delete mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/receipt/SmsPullReceipt.java create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/ReceiptMessageStater.java create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/impl/DingDingWorkReceiptStaterImpl.java create mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/impl/SmsPullReceiptStarterImpl.java delete mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/script/BaseSmsScript.java delete mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScriptHandler.java delete mode 100644 austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScriptHolder.java diff --git a/austin-common/src/main/java/com/java3y/austin/common/dto/account/TencentSmsAccount.java b/austin-common/src/main/java/com/java3y/austin/common/dto/account/TencentSmsAccount.java deleted file mode 100644 index 81a1353..0000000 --- a/austin-common/src/main/java/com/java3y/austin/common/dto/account/TencentSmsAccount.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.java3y.austin.common.dto.account; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 腾讯短信参数 - * - * 参数示例: - * [{"sms_10":{"url":"sms.tencentcloudapi.com","region":"ap-guangzhou","secretId":"AKIDhDUUDfffffMEqBF1WljQq","secretKey":"B4h39yWnfffff7D2btue7JErDJ8gxyi","smsSdkAppId":"140025","templateId":"11897","signName":"Java3y公众号","supplierId":10,"supplierName":"腾讯云"}}] - * - * @author 3y - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class TencentSmsAccount { - - /** - * api相关 - */ - private String url; - private String region ; - - /** - * 账号相关 - */ - private String secretId; - private String secretKey; - private String smsSdkAppId; - private String templateId; - private String signName; - - /** - * 标识渠道商Id - */ - private Integer supplierId; - - /** - * 标识渠道商名字 - */ - private String supplierName; - -} diff --git a/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/SmsAccount.java b/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/SmsAccount.java index 31a5215..9d1c99f 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/SmsAccount.java +++ b/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/SmsAccount.java @@ -1,7 +1,6 @@ package com.java3y.austin.common.dto.account.sms; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -20,9 +19,10 @@ public class SmsAccount { protected String supplierName; /** - * 【重要】类名,定位到具体的处理下发和回执逻辑 - * - * 依据scriptName对应具体的某一个短信账号 + * 【重要】类名,定位到具体的处理"下发"/"回执"逻辑 + * 依据ScriptName对应具体的某一个短信账号 */ protected String scriptName; + + } diff --git a/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/TencentSmsAccount.java b/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/TencentSmsAccount.java index 1f28379..73fe7cf 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/TencentSmsAccount.java +++ b/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/TencentSmsAccount.java @@ -1,13 +1,12 @@ package com.java3y.austin.common.dto.account.sms; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * 腾讯短信参数 - * + *

* 账号参数示例: * {"url":"sms.tencentcloudapi.com","region":"ap-guangzhou","secretId":"AKIDhDxxxxxxxx1WljQq","secretKey":"B4hwww39yxxxrrrrgxyi","smsSdkAppId":"1423123125","templateId":"1182097","signName":"Java3y公众号","supplierId":10,"supplierName":"腾讯云","scriptName":"TencentSmsScript"} * @@ -22,7 +21,7 @@ public class TencentSmsAccount extends SmsAccount { * api相关 */ private String url; - private String region ; + private String region; /** * 账号相关 diff --git a/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/YunPianSmsAccount.java b/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/YunPianSmsAccount.java index 1421569..f33e369 100644 --- a/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/YunPianSmsAccount.java +++ b/austin-common/src/main/java/com/java3y/austin/common/dto/account/sms/YunPianSmsAccount.java @@ -1,13 +1,12 @@ package com.java3y.austin.common.dto.account.sms; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * 云片账号信息 - * + *

* 账号参数示例: * {"url":"https://sms.yunpian.com/v2/sms/tpl_batch_send.json","apikey":"caffff8234234231b5cd7","tpl_id":"523333332","supplierId":20,"supplierName":"云片","scriptName":"YunPianSmsScript"} * diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/domain/sms/SmsParam.java b/austin-handler/src/main/java/com/java3y/austin/handler/domain/sms/SmsParam.java index f9cf01a..827b26d 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/domain/sms/SmsParam.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/domain/sms/SmsParam.java @@ -25,7 +25,7 @@ public class SmsParam { private Set phones; /** - * 发送渠道账号的脚本名标识 + * 渠道账号的脚本名标识 */ private String scriptName; diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/Handler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/Handler.java index d9c3165..88291b5 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/Handler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/Handler.java @@ -24,5 +24,4 @@ public interface Handler { */ void recall(MessageTemplate messageTemplate); - } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java index 4f484d9..19e5954 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/DingDingWorkNoticeHandler.java @@ -59,6 +59,7 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { private static final String SEND_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2"; private static final String RECALL_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/recall"; + private static final String PULL_URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/getsendresult"; private static final String DING_DING_RECALL_KEY_PREFIX = "RECALL_"; private static final String RECALL_BIZ_TYPE = "DingDingWorkNoticeHandler#recall"; @@ -195,5 +196,23 @@ public class DingDingWorkNoticeHandler extends BaseHandler implements Handler { } }); } + + /** + * 拉取回执 + */ + public void pull(Long accountId) { + try { +// DingDingWorkNoticeAccount account = accountUtils.getAccountById(accountId, DingDingWorkNoticeAccount.class); +// String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + accountId); +// DingTalkClient client = new DefaultDingTalkClient(PULL_URL); +// OapiMessageCorpconversationGetsendresultRequest req = new OapiMessageCorpconversationGetsendresultRequest(); +// req.setAgentId(Long.valueOf(account.getAgentId())); +// req.setTaskId(456L); +// OapiMessageCorpconversationGetsendresultResponse rsp = client.execute(req, accessToken); +// System.out.println(rsp.getBody()); + } catch (Exception e) { + log.error("DingDingWorkNoticeHandler#pull fail:{}", Throwables.getStackTraceAsString(e)); + } + } } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java index e131431..8856452 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/PushHandler.java @@ -58,7 +58,7 @@ public class PushHandler extends BaseHandler implements Handler { public boolean handler(TaskInfo taskInfo) { try { - GeTuiAccount account = accountUtils.getAccountById(taskInfo.getSendAccount(),GeTuiAccount.class); + GeTuiAccount account = accountUtils.getAccountById(taskInfo.getSendAccount(), GeTuiAccount.class); String token = redisTemplate.opsForValue().get(SendAccountConstant.GE_TUI_ACCESS_TOKEN_PREFIX + taskInfo.getSendAccount()); PushParam pushParam = PushParam.builder().token(token).appId(account.getAppId()).taskInfo(taskInfo).build(); @@ -83,6 +83,7 @@ public class PushHandler extends BaseHandler implements Handler { /** * 单推 + * * @param pushParam * @return http result */ @@ -101,7 +102,7 @@ public class PushHandler extends BaseHandler implements Handler { /** * 批量推送 * - * @param taskId 个推 返回的任务Id + * @param taskId 个推 返回的任务Id * @param pushParam * @return */ @@ -122,6 +123,7 @@ public class PushHandler extends BaseHandler implements Handler { /** * 群推前需要构建taskId + * * @param pushParam * @return http result */ @@ -161,6 +163,7 @@ public class PushHandler extends BaseHandler implements Handler { } return param; } + @Override public void recall(MessageTemplate messageTemplate) { diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/SmsHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/SmsHandler.java index 8b2cb55..c4e1e7f 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/SmsHandler.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/handler/impl/SmsHandler.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.google.common.base.Throwables; -import com.java3y.austin.common.constant.AustinConstant; import com.java3y.austin.common.constant.CommonConstant; import com.java3y.austin.common.domain.TaskInfo; import com.java3y.austin.common.dto.model.SmsContentModel; diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/DingDingWorkReceipt.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/DingDingWorkReceipt.java deleted file mode 100644 index 50092f1..0000000 --- a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/DingDingWorkReceipt.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.java3y.austin.handler.receipt; - - -import cn.hutool.core.util.StrUtil; -import com.dingtalk.api.DefaultDingTalkClient; -import com.dingtalk.api.DingTalkClient; -import com.dingtalk.api.request.OapiMessageCorpconversationGetsendresultRequest; -import com.dingtalk.api.response.OapiMessageCorpconversationGetsendresultResponse; -import com.java3y.austin.common.constant.SendAccountConstant; -import com.java3y.austin.common.dto.account.DingDingWorkNoticeAccount; -import com.java3y.austin.support.utils.AccountUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -/** - * 拉取钉钉工作消息回执信息 - * - * @author 3y - */ -@Component -@Slf4j -public class DingDingWorkReceipt { - - private static final String URL = "https://oapi.dingtalk.com/topapi/message/corpconversation/getsendresult"; - @Autowired - private StringRedisTemplate redisTemplate; - - @Autowired - private AccountUtils accountUtils; - public void pull() { -// try { -// for (int index = SendAccountConstant.START; true; index = index + SendAccountConstant.STEP) { -// DingDingWorkNoticeAccount account = accountUtils.getAccountById(index, SendAccountConstant.DING_DING_WORK_NOTICE_ACCOUNT_KEY, SendAccountConstant.DING_DING_WORK_NOTICE_PREFIX, DingDingWorkNoticeAccount.class); -// if (account == null) { -// break; -// } -// String accessToken = redisTemplate.opsForValue().get(SendAccountConstant.DING_DING_ACCESS_TOKEN_PREFIX + index); -// DingTalkClient client = new DefaultDingTalkClient(URL); -// OapiMessageCorpconversationGetsendresultRequest req = new OapiMessageCorpconversationGetsendresultRequest(); -// req.setAgentId(Long.valueOf(account.getAgentId())); -// req.setTaskId(456L); -// OapiMessageCorpconversationGetsendresultResponse rsp = client.execute(req, accessToken); -// System.out.println(rsp.getBody()); -// } -// } catch (Exception e) { -// log.error("DingDingWorkReceipt#pull"); -// } - } -} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/MessageReceipt.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/MessageReceipt.java index 1ad7ce3..a5cd6c9 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/MessageReceipt.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/MessageReceipt.java @@ -1,15 +1,18 @@ package com.java3y.austin.handler.receipt; +import com.google.common.base.Throwables; +import com.java3y.austin.handler.receipt.stater.ReceiptMessageStater; import com.java3y.austin.support.config.SupportThreadPoolConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; +import java.util.List; /** - * 拉取回执信息 + * 拉取回执信息 入口 * * @author 3y */ @@ -18,18 +21,20 @@ import javax.annotation.PostConstruct; public class MessageReceipt { @Autowired - private SmsPullReceipt smsPullReceipt; + private List receiptMessageStaterList; @PostConstruct private void init() { SupportThreadPoolConfig.getPendingSingleThreadPool().execute(() -> { while (true) { - // TODO 回执这里自行打开(免得报错) - // smsPullReceipt.pull(); try { - Thread.sleep(200); - } catch (InterruptedException e) { - e.printStackTrace(); + for (ReceiptMessageStater receiptMessageStater : receiptMessageStaterList) { + // 拉取回执需要打开下面一行注释 + //receiptMessageStater.start(); + } + Thread.sleep(2000); + } catch (Exception e) { + log.error("MessageReceiptApplication#fail:{}", Throwables.getStackTraceAsString(e)); } } }); diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/SmsPullReceipt.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/SmsPullReceipt.java deleted file mode 100644 index 94ef07f..0000000 --- a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/SmsPullReceipt.java +++ /dev/null @@ -1,126 +0,0 @@ -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.CommonConstant; -import com.java3y.austin.common.dto.account.sms.TencentSmsAccount; -import com.java3y.austin.common.dto.account.sms.YunPianSmsAccount; -import com.java3y.austin.common.enums.ChannelType; -import com.java3y.austin.common.enums.SmsStatus; -import com.java3y.austin.common.enums.SmsSupplier; -import com.java3y.austin.support.dao.ChannelAccountDao; -import com.java3y.austin.support.dao.SmsRecordDao; -import com.java3y.austin.support.domain.ChannelAccount; -import com.java3y.austin.support.domain.SmsRecord; -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.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 java.util.ArrayList; -import java.util.Date; -import java.util.List; - - -/** - * 拉取短信回执信息 - * - * @author 3y - */ -@Component -@Slf4j -public class SmsPullReceipt { - - @Autowired - private ChannelAccountDao channelAccountDao; - - @Autowired - private SmsRecordDao smsRecordDao; - - /** - * 拉取消息并入库 - *

- * eg accountList:[{"sms_10":{"url":"sms.tencentcloudapi.com","region":"ap-guangzhou","secretId":"234234","secretKey":"234324324","smsSdkAppId":"2343242","templateId":"234234","signName":"Java3y公众号","supplierId":10,"supplierName":"腾讯云"}},{"sms_20":{"url":"https://sms.yunpian.com/v2/sms/tpl_batch_send.json","apikey":"23423432","tpl_id":"23423432","supplierId":20,"supplierName":"云片"}}] - */ - public void pull() { - List channelAccountList = channelAccountDao.findAllByIsDeletedEqualsAndSendChannelEquals(CommonConstant.FALSE, ChannelType.SMS.getCode()); - for (ChannelAccount channelAccount : channelAccountList) { - Integer supplierId = JSON.parseObject(channelAccount.getAccountConfig()).getInteger("supplierId"); - if (SmsSupplier.TENCENT.getCode().equals(supplierId)) { - TencentSmsAccount tencentSmsAccount = JSON.parseObject(channelAccount.getAccountConfig(), TencentSmsAccount.class); - pullTencent(tencentSmsAccount); - } else if (SmsSupplier.YUN_PAIN.getCode().equals(supplierId)) { - YunPianSmsAccount yunPianSmsAccount = JSON.parseObject(channelAccount.getAccountConfig(), YunPianSmsAccount.class); - pullYunPain(yunPianSmsAccount); - } - } - } - - /** - * 拉取腾讯的回执 - * - * @param account - */ - private void pullTencent(TencentSmsAccount account) { - try { - /** - * 初始化客户端 - */ - HttpProfile httpProfile = new HttpProfile(); - httpProfile.setEndpoint(account.getUrl()); - ClientProfile clientProfile = new ClientProfile(); - clientProfile.setHttpProfile(httpProfile); - SmsClient client = new SmsClient(new Credential(account.getSecretId(), account.getSecretKey()), account.getRegion(), clientProfile); - - /** - * 每次拉取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) { - 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)); - } - } - - private void pullYunPain(YunPianSmsAccount yunPianSmsAccount) { - - } -} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/ReceiptMessageStater.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/ReceiptMessageStater.java new file mode 100644 index 0000000..5895227 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/ReceiptMessageStater.java @@ -0,0 +1,14 @@ +package com.java3y.austin.handler.receipt.stater; + +/** + * 拉取回执信息 启动器 + * + * @author 3y + */ +public interface ReceiptMessageStater { + + /** + * 启动拉取回执 + */ + void start(); +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/impl/DingDingWorkReceiptStaterImpl.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/impl/DingDingWorkReceiptStaterImpl.java new file mode 100644 index 0000000..aca3495 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/impl/DingDingWorkReceiptStaterImpl.java @@ -0,0 +1,33 @@ +package com.java3y.austin.handler.receipt.stater.impl; + +import com.java3y.austin.common.constant.CommonConstant; +import com.java3y.austin.common.enums.ChannelType; +import com.java3y.austin.handler.handler.impl.DingDingWorkNoticeHandler; +import com.java3y.austin.handler.receipt.stater.ReceiptMessageStater; +import com.java3y.austin.support.dao.ChannelAccountDao; +import com.java3y.austin.support.domain.ChannelAccount; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * 拉取 钉钉工作消息的回执 内容 【未完成】 + * + * @author 3y + */ +public class DingDingWorkReceiptStaterImpl implements ReceiptMessageStater { + + @Autowired + private DingDingWorkNoticeHandler workNoticeHandler; + + @Autowired + private ChannelAccountDao channelAccountDao; + + @Override + public void start() { + List accountList = channelAccountDao.findAllByIsDeletedEqualsAndSendChannelEquals(CommonConstant.FALSE, ChannelType.DING_DING_WORK_NOTICE.getCode()); + for (ChannelAccount channelAccount : accountList) { + workNoticeHandler.pull(channelAccount.getId()); + } + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/impl/SmsPullReceiptStarterImpl.java b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/impl/SmsPullReceiptStarterImpl.java new file mode 100644 index 0000000..39e8728 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/handler/receipt/stater/impl/SmsPullReceiptStarterImpl.java @@ -0,0 +1,60 @@ +package com.java3y.austin.handler.receipt.stater.impl; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; +import com.google.common.base.Throwables; +import com.java3y.austin.common.constant.CommonConstant; +import com.java3y.austin.common.dto.account.sms.SmsAccount; +import com.java3y.austin.common.enums.ChannelType; +import com.java3y.austin.handler.receipt.stater.ReceiptMessageStater; +import com.java3y.austin.handler.script.SmsScript; +import com.java3y.austin.support.dao.ChannelAccountDao; +import com.java3y.austin.support.dao.SmsRecordDao; +import com.java3y.austin.support.domain.ChannelAccount; +import com.java3y.austin.support.domain.SmsRecord; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + + +/** + * 拉取短信回执信息 + * + * @author 3y + */ +@Component +@Slf4j +public class SmsPullReceiptStarterImpl implements ReceiptMessageStater { + + @Autowired + private ChannelAccountDao channelAccountDao; + + @Autowired + private Map scriptMap; + + @Autowired + private SmsRecordDao smsRecordDao; + + /** + * 拉取消息并入库 + */ + public void start() { + try { + List channelAccountList = channelAccountDao.findAllByIsDeletedEqualsAndSendChannelEquals(CommonConstant.FALSE, ChannelType.SMS.getCode()); + for (ChannelAccount channelAccount : channelAccountList) { + SmsAccount smsAccount = JSON.parseObject(channelAccount.getAccountConfig(), SmsAccount.class); + List smsRecordList = scriptMap.get(smsAccount.getScriptName()).pull(smsAccount.getScriptName()); + if (CollUtil.isNotEmpty(smsRecordList)) { + smsRecordDao.saveAll(smsRecordList); + } + } + } catch (Exception e) { + log.error("SmsPullReceiptStarter#start fail:{}", Throwables.getStackTraceAsString(e)); + + } + + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/script/BaseSmsScript.java b/austin-handler/src/main/java/com/java3y/austin/handler/script/BaseSmsScript.java deleted file mode 100644 index 931cb5c..0000000 --- a/austin-handler/src/main/java/com/java3y/austin/handler/script/BaseSmsScript.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.java3y.austin.handler.script; - - -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ArrayUtils; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.PostConstruct; -import java.lang.annotation.Annotation; - -/** - * sms发送脚本的抽象类 - * - * @author 3y - */ -@Slf4j -public abstract class BaseSmsScript implements SmsScript { - - @Autowired - private SmsScriptHolder smsScriptHolder; - - @PostConstruct - public void registerProcessScript() { - if (ArrayUtils.isEmpty(this.getClass().getAnnotations())) { - log.error("BaseSmsScript can not find annotation!"); - return; - } - Annotation handlerAnnotations = null; - for (Annotation annotation : this.getClass().getAnnotations()) { - if (annotation instanceof SmsScriptHandler) { - handlerAnnotations = annotation; - break; - } - } - if (handlerAnnotations == null) { - log.error("handler annotations not declared"); - return; - } - //注册handler - smsScriptHolder.putHandler(((SmsScriptHandler) handlerAnnotations).value(), this); - } -} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScript.java b/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScript.java index 35d6e98..4facaba 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScript.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScript.java @@ -9,16 +9,25 @@ import java.util.List; /** * 短信脚本 接口 + * * @author 3y */ public interface SmsScript { /** * 发送短信 + * * @param smsParam - * @return 渠道商接口返回值 - + * @return 渠道商发送接口返回值 */ List send(SmsParam smsParam); + + /** + * 拉取回执 + * @param scriptName 标识账号的脚本名 + * @return 渠道商回执接口返回值 + */ + List pull(String scriptName); + } diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScriptHandler.java b/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScriptHandler.java deleted file mode 100644 index 7b285e8..0000000 --- a/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScriptHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.java3y.austin.handler.script; - -import org.springframework.stereotype.Component; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - - -/** - * 标识 短信渠道 - * - * @author 3y - */ -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE}) -@Component -public @interface SmsScriptHandler { - - /** - * 这里输入脚本名 - * - * @return - */ - String value(); -} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScriptHolder.java b/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScriptHolder.java deleted file mode 100644 index b02244e..0000000 --- a/austin-handler/src/main/java/com/java3y/austin/handler/script/SmsScriptHolder.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.java3y.austin.handler.script; - - -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * sendAccount->SmsScript的映射关系 - * - * @author 3y - */ -@Component -public class SmsScriptHolder { - - private Map handlers = new HashMap<>(8); - - public void putHandler(String scriptName, SmsScript handler) { - handlers.put(scriptName, handler); - } - public SmsScript route(String scriptName) { - return handlers.get(scriptName); - } -} diff --git a/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/TencentSmsScript.java b/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/TencentSmsScript.java index 32cfec0..4681020 100644 --- a/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/TencentSmsScript.java +++ b/austin-handler/src/main/java/com/java3y/austin/handler/script/impl/TencentSmsScript.java @@ -16,9 +16,7 @@ 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 com.tencentcloudapi.sms.v20210111.models.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -49,17 +47,38 @@ public class TencentSmsScript implements SmsScript { try { TencentSmsAccount tencentSmsAccount = accountUtils.getSmsAccountByScriptName(smsParam.getScriptName(), TencentSmsAccount.class); SmsClient client = init(tencentSmsAccount); - SendSmsRequest request = assembleReq(smsParam, tencentSmsAccount); + SendSmsRequest request = assembleSendReq(smsParam, tencentSmsAccount); SendSmsResponse response = client.SendSms(request); - return assembleSmsRecord(smsParam, response, tencentSmsAccount); + return assembleSendSmsRecord(smsParam, response, tencentSmsAccount); } catch (Exception e) { log.error("TencentSmsScript#send fail:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(smsParam)); return null; } } + @Override + public List pull(String scriptName) { + try { + TencentSmsAccount account = accountUtils.getSmsAccountByScriptName(scriptName, TencentSmsAccount.class); + SmsClient client = init(account); + PullSmsSendStatusRequest req = assemblePullReq(account); + PullSmsSendStatusResponse resp = client.PullSmsSendStatus(req); + return assemblePullSmsRecord(account, resp); + } catch (Exception e) { + log.error("TencentSmsReceipt#pull fail!{}", Throwables.getStackTraceAsString(e)); + return null; + } + } - private List assembleSmsRecord(SmsParam smsParam, SendSmsResponse response, TencentSmsAccount tencentSmsAccount) { + /** + * 组装 发送消息的 返回值 + * + * @param smsParam + * @param response + * @param tencentSmsAccount + * @return + */ + private List assembleSendSmsRecord(SmsParam smsParam, SendSmsResponse response, TencentSmsAccount tencentSmsAccount) { if (response == null || ArrayUtil.isEmpty(response.getSendStatusSet())) { return null; } @@ -94,7 +113,7 @@ public class TencentSmsScript implements SmsScript { /** * 组装发送短信参数 */ - private SendSmsRequest assembleReq(SmsParam smsParam, TencentSmsAccount account) { + private SendSmsRequest assembleSendReq(SmsParam smsParam, TencentSmsAccount account) { SendSmsRequest req = new SendSmsRequest(); String[] phoneNumberSet1 = smsParam.getPhones().toArray(new String[smsParam.getPhones().size() - 1]); req.setPhoneNumberSet(phoneNumberSet1); @@ -122,5 +141,50 @@ public class TencentSmsScript implements SmsScript { return client; } + /** + * 组装 拉取回执信息 + * + * @param account + * @param resp + * @return + */ + private List assemblePullSmsRecord(TencentSmsAccount account, PullSmsSendStatusResponse resp) { + List smsRecordList = new ArrayList<>(); + if (resp != null && resp.getPullSmsSendStatusSet() != null && resp.getPullSmsSendStatusSet().length > 0) { + 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); + } + } + return smsRecordList; + } + + /** + * 组装 拉取回执 入参 + * + * @param account + * @return + */ + private PullSmsSendStatusRequest assemblePullReq(TencentSmsAccount account) { + PullSmsSendStatusRequest req = new PullSmsSendStatusRequest(); + req.setLimit(10L); + req.setSmsSdkAppId(account.getSmsSdkAppId()); + return req; + } + + } 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 index 021e789..991096f 100644 --- 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 @@ -56,6 +56,13 @@ public class YunPianSmsScript implements SmsScript { } + @Override + public List pull(String scriptName) { + YunPianSmsAccount account = accountUtils.getSmsAccountByScriptName(scriptName, YunPianSmsAccount.class); + // ..... + return null; + } + /** * 组装参数 * diff --git a/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java b/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java index afd5d75..813641b 100644 --- a/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java +++ b/austin-support/src/main/java/com/java3y/austin/support/utils/AccountUtils.java @@ -1,10 +1,7 @@ package com.java3y.austin.support.utils; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import com.google.common.base.Throwables; -import com.java3y.austin.common.constant.AustinConstant; import com.java3y.austin.common.constant.CommonConstant; import com.java3y.austin.common.dto.account.sms.SmsAccount; import com.java3y.austin.common.enums.ChannelType; @@ -84,7 +81,6 @@ public class AccountUtils { } catch (Exception e) { log.error("AccountUtils#getSmsAccount fail! e:{}", Throwables.getStackTraceAsString(e)); } - log.error("AccountUtils#getSmsAccount not found!:{}", scriptName); return null; }