From a191c25773374591127d9d9b8ee3b1e5de53aaab Mon Sep 17 00:00:00 2001 From: xhy <203152807@qq.com> Date: Fri, 15 Dec 2023 14:49:22 +0800 Subject: [PATCH] =?UTF-8?q?feature(server)(=E9=98=BF=E9=87=8C=E4=BA=91?= =?UTF-8?q?=E7=94=B5=E8=AF=9D=E8=AF=AD=E9=9F=B3=E6=9C=8D=E5=8A=A1):?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/client/call/CallClient.java | 7 ++ .../client/call/impl/AliYunCallClient.java | 74 ++++++++++++++++++- .../client/sms/impl/AliYunSmsClient.java | 24 ++++-- .../server/handler/impl/SmsHandler.java | 2 +- .../server/model/app/call/AliYunCallApp.java | 20 +++++ .../server/model/app/{ => call}/CallApp.java | 3 +- .../server/model/app/sms/AliYunSmsApp.java | 4 +- deliver-backend/pom.xml | 6 ++ deliver-front/vue/components.d.ts | 10 --- 9 files changed, 127 insertions(+), 23 deletions(-) create mode 100644 deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/AliYunCallApp.java rename deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/{ => call}/CallApp.java (68%) diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/CallClient.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/CallClient.java index e7f86805..a1268038 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/CallClient.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/CallClient.java @@ -1,5 +1,10 @@ package com.oszero.deliver.server.client.call; +import com.oszero.deliver.server.model.app.call.CallApp; +import com.oszero.deliver.server.model.dto.common.SendTaskDto; + +import java.util.concurrent.ExecutionException; + /** * 电话客户端接口 * @@ -8,4 +13,6 @@ package com.oszero.deliver.server.client.call; */ public interface CallClient { + void sendCall(CallApp callApp, SendTaskDto sendTaskDto) throws ExecutionException, InterruptedException; + } diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/impl/AliYunCallClient.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/impl/AliYunCallClient.java index 6793f2d5..70021b52 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/impl/AliYunCallClient.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/call/impl/AliYunCallClient.java @@ -1,7 +1,23 @@ package com.oszero.deliver.server.client.call.impl; +import com.aliyun.auth.credentials.Credential; +import com.aliyun.auth.credentials.provider.StaticCredentialProvider; +import com.aliyun.sdk.service.dyvmsapi20170525.AsyncClient; +import com.aliyun.sdk.service.dyvmsapi20170525.models.SingleCallByTtsRequest; +import com.aliyun.sdk.service.dyvmsapi20170525.models.SingleCallByTtsResponse; +import com.oszero.deliver.server.client.call.CallClient; +import com.oszero.deliver.server.exception.MessageException; +import com.oszero.deliver.server.model.app.call.AliYunCallApp; +import com.oszero.deliver.server.model.app.call.CallApp; +import com.oszero.deliver.server.model.dto.common.SendTaskDto; +import darabonba.core.client.ClientOverrideConfiguration; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + /** * 电话客户端阿里云实现 * @@ -9,5 +25,61 @@ import org.springframework.stereotype.Service; * @version 1.0.0 */ @Service -public class AliYunCallClient { +public class AliYunCallClient implements CallClient { + + private static final String ENDPOINT_OVERRIDE = "dyvmsapi.aliyuncs.com"; + private static final String OUT_ID = "outId"; + private static final String REGION = "region"; + private static final String CALLED_SHOW_NUMBER = "calledShowNumber"; + private static final String CALLED_NUMBER = "calledNumber"; + private static final String TTS_CODE = "ttsCode"; + private static final String TTS_PARAM = "ttsParam"; + private static final String PLAY_TIMES = "playTimes"; + private static final String VOLUME = "volume"; + private static final String SPEED = "speed"; + + + @Override + public void sendCall(CallApp callApp, SendTaskDto sendTaskDto) { + + List users = sendTaskDto.getUsers(); + String phoneNumbers = String.join(",", users); + Map map = sendTaskDto.getParamMap(); + AliYunCallApp aliYunCallApp = (AliYunCallApp) callApp ; + + StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() + .accessKeyId(aliYunCallApp.getAccessKeyId()) + .accessKeySecret(aliYunCallApp.getAccessKeySecret()) + .build()); + + try (AsyncClient client = AsyncClient.builder() + .region((String) map.get(REGION)) + .credentialsProvider(provider) + .overrideConfiguration( + ClientOverrideConfiguration.create() + .setEndpointOverride(ENDPOINT_OVERRIDE) + ) + .build()) { + + SingleCallByTtsRequest singleCallByTtsRequest = SingleCallByTtsRequest.builder() + .calledNumber((String) map.get(CALLED_NUMBER)) + .calledShowNumber((String) map.get(CALLED_SHOW_NUMBER)) + .ttsCode((String) map.get(TTS_CODE)) + .ttsParam((String) map.get(TTS_PARAM)) + .playTimes((Integer) map.get(PLAY_TIMES)) + .volume((Integer) map.get(VOLUME)) + .speed((Integer) map.get(SPEED)) + .outId((String) map.get(OUT_ID)) + .build(); + CompletableFuture response = client.singleCallByTts(singleCallByTtsRequest); + SingleCallByTtsResponse resp = response.get(); + } catch (InterruptedException | ExecutionException e) { + throw new MessageException("语音电话失败," + e.getMessage()); + } + + + } + + } + diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/sms/impl/AliYunSmsClient.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/sms/impl/AliYunSmsClient.java index d53e1961..9eb35698 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/sms/impl/AliYunSmsClient.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/client/sms/impl/AliYunSmsClient.java @@ -7,13 +7,14 @@ import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest; import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse; import com.oszero.deliver.server.client.sms.SmsClient; import com.oszero.deliver.server.exception.MessageException; -import com.oszero.deliver.server.model.app.sms.SmsApp; import com.oszero.deliver.server.model.app.sms.AliYunSmsApp; +import com.oszero.deliver.server.model.app.sms.SmsApp; import com.oszero.deliver.server.model.dto.common.SendTaskDto; import darabonba.core.client.ClientOverrideConfiguration; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -28,21 +29,26 @@ public class AliYunSmsClient implements SmsClient { private static final String TEMPLATE_PARAM = "templateParam"; private static final String ENDPOINT_OVERRIDE = "dysmsapi.aliyuncs.com"; + private static final String SMS_UP_EXTEND_CODE = "smsUpExtendCode"; + private static final String OUT_ID = "outId"; + private static final String SIG_NAME = "signName"; + private static final String TEMPLATE_CODE = "templateCode"; + private static final String REGION = "region"; @Override public void sendSms(SmsApp smsApp, SendTaskDto sendTaskDto) { List users = sendTaskDto.getUsers(); String phoneNumbers = String.join(",", users); + Map map = sendTaskDto.getParamMap(); AliYunSmsApp aliYunSmsApp = (AliYunSmsApp) smsApp; StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() - // 此处以把AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里 - // 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险 - .accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) - .accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")) + .accessKeyId(aliYunSmsApp.getAccessKeyId()) + .accessKeySecret(aliYunSmsApp.getAccessKeySecret()) .build()); try (AsyncClient client = AsyncClient.builder() + .region((String) map.get(REGION)) .credentialsProvider(provider) .overrideConfiguration( ClientOverrideConfiguration @@ -53,9 +59,11 @@ public class AliYunSmsClient implements SmsClient { SendSmsRequest sendSmsRequest = SendSmsRequest.builder() .phoneNumbers(phoneNumbers) - .signName(aliYunSmsApp.getSignName()) - .templateCode(aliYunSmsApp.getTemplateCode()) - .templateParam((String) sendTaskDto.getParamMap().get(TEMPLATE_PARAM)) + .signName((String) map.get(SIG_NAME)) + .templateCode((String) map.get(TEMPLATE_CODE)) + .templateParam((String)map.get(TEMPLATE_PARAM)) + .smsUpExtendCode((String) map.get(SMS_UP_EXTEND_CODE)) + .outId((String) map.get(OUT_ID)) .build(); CompletableFuture response = client.sendSms(sendSmsRequest); diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/handler/impl/SmsHandler.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/handler/impl/SmsHandler.java index 817a6299..bf3c71ba 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/handler/impl/SmsHandler.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/handler/impl/SmsHandler.java @@ -54,6 +54,6 @@ public class SmsHandler extends BaseHandler { } else if (SmsProviderTypeEnum.TENCENT.getName().equals(smsProvider)) { return JSONUtil.toBean(appConfig, TencentSmsApp.class); } - throw new MessageException("没有指定的短信服务 App:" + smsProvider); + throw new MessageException("没有指定的短信服务 App:" + smsProvider); } } diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/AliYunCallApp.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/AliYunCallApp.java new file mode 100644 index 00000000..e38523ad --- /dev/null +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/AliYunCallApp.java @@ -0,0 +1,20 @@ +package com.oszero.deliver.server.model.app.call; + +import lombok.*; + +/** + * 阿里云电话 APP 配置 + * + * @author oszero + * @version 1.0.0 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class AliYunCallApp extends CallApp { + private String accessKeyId; + private String accessKeySecret; + +} diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/CallApp.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/CallApp.java similarity index 68% rename from deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/CallApp.java rename to deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/CallApp.java index bdb5872d..cda779d5 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/CallApp.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/call/CallApp.java @@ -1,5 +1,6 @@ -package com.oszero.deliver.server.model.app; +package com.oszero.deliver.server.model.app.call; +import com.oszero.deliver.server.model.app.AppConfig; import lombok.*; /** diff --git a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/sms/AliYunSmsApp.java b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/sms/AliYunSmsApp.java index a843416e..8bf1c320 100644 --- a/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/sms/AliYunSmsApp.java +++ b/deliver-backend/deliver-backend-server/src/main/java/com/oszero/deliver/server/model/app/sms/AliYunSmsApp.java @@ -15,7 +15,7 @@ import lombok.*; @EqualsAndHashCode(callSuper = true) public class AliYunSmsApp extends SmsApp { - private String signName; - private String templateCode; + private String accessKeyId; + private String accessKeySecret; } diff --git a/deliver-backend/pom.xml b/deliver-backend/pom.xml index 7cb6e086..89071570 100644 --- a/deliver-backend/pom.xml +++ b/deliver-backend/pom.xml @@ -40,6 +40,7 @@ 2.2.3 2.0.24 + 1.0.0 3.1.915 @@ -50,6 +51,11 @@ alibabacloud-dysmsapi20170525 ${aliyun-sms-sdk-version} + + com.aliyun + alibabacloud-dyvmsapi20170525 + ${aliyun-call-sdk-version} + com.tencentcloudapi tencentcloud-sdk-java diff --git a/deliver-front/vue/components.d.ts b/deliver-front/vue/components.d.ts index 3c605da2..06d4b469 100644 --- a/deliver-front/vue/components.d.ts +++ b/deliver-front/vue/components.d.ts @@ -13,34 +13,24 @@ declare module 'vue' { ACard: typeof import('ant-design-vue/es')['Card'] ACardMeta: typeof import('ant-design-vue/es')['CardMeta'] ACol: typeof import('ant-design-vue/es')['Col'] - ADescriptions: typeof import('ant-design-vue/es')['Descriptions'] - ADescriptionsItem: typeof import('ant-design-vue/es')['DescriptionsItem'] ADivider: typeof import('ant-design-vue/es')['Divider'] - ADrawer: typeof import('ant-design-vue/es')['Drawer'] AForm: typeof import('ant-design-vue/es')['Form'] AFormItem: typeof import('ant-design-vue/es')['FormItem'] AInput: typeof import('ant-design-vue/es')['Input'] - AInputGroup: typeof import('ant-design-vue/es')['InputGroup'] - AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] ALayout: typeof import('ant-design-vue/es')['Layout'] ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent'] ALayoutFooter: typeof import('ant-design-vue/es')['LayoutFooter'] ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader'] ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider'] - AList: typeof import('ant-design-vue/es')['List'] - AListItem: typeof import('ant-design-vue/es')['ListItem'] AMenu: typeof import('ant-design-vue/es')['Menu'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] AModal: typeof import('ant-design-vue/es')['Modal'] APagination: typeof import('ant-design-vue/es')['Pagination'] APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] - ARadioButton: typeof import('ant-design-vue/es')['RadioButton'] - ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] ARangePicker: typeof import('ant-design-vue/es')['RangePicker'] ARow: typeof import('ant-design-vue/es')['Row'] ASelect: typeof import('ant-design-vue/es')['Select'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] - AStatistic: typeof import('ant-design-vue/es')['Statistic'] ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] ASwitch: typeof import('ant-design-vue/es')['Switch'] ATable: typeof import('ant-design-vue/es')['Table'] -- Gitee