Browse Source

[MODIFY]增加待审批短信通知、审批完成短信通知

dev-zzj
zhaozhenjing 2 months ago
parent
commit
da940af097
  1. 144
      src/2.services/ATS.NonCustodial.Application/Impl/Admins/SMSService.cs
  2. 22
      src/2.services/ATS.NonCustodial.Application/Impl/Business/AppBusinessApplicationService.cs
  3. 26
      src/2.services/ATS.NonCustodial.Application/Impl/Business/AppManagementService.cs
  4. 14
      src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Admins/SMS/ISMSService.cs
  5. 2
      src/4.apps/ATS.NonCustodial.Admin.Api/Dockerfile
  6. 27
      src/4.apps/ATS.NonCustodial.Admin.Api/configs/appsettings.json
  7. 1
      src/5.shared/ATS.NonCustodial.AdminUi/Configurations/AdminServerCollectionExtension.cs
  8. 5
      src/5.shared/ATS.NonCustodial.AdminUi/Configurations/AdminUiOptions.cs
  9. 34
      src/5.shared/ATS.NonCustodial.Domain.Shared/Enums/MessageAlertTypeEnum.cs
  10. 27
      src/5.shared/ATS.NonCustodial.Shared/Configurations/Options/SmsConfiguration.cs

144
src/2.services/ATS.NonCustodial.Application/Impl/Admins/SMSService.cs

@ -1,47 +1,19 @@
using ATS.NonCustodial.Application.Base; using ATS.NonCustodial.Application.Base;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth.Input;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.SMS; using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.SMS;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User;
using ATS.NonCustodial.Application.Contracts.Interfaces.Logs.LoginLog.Input;
using ATS.NonCustodial.Domain.Entities.Admins; using ATS.NonCustodial.Domain.Entities.Admins;
using ATS.NonCustodial.Domain.Entities.Business;
using ATS.NonCustodial.Domain.Entities.Business.EarlyWarning;
using ATS.NonCustodial.Domain.Shared.Enums; using ATS.NonCustodial.Domain.Shared.Enums;
using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore; using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore;
using ATS.NonCustodial.DynamicApi; using ATS.NonCustodial.DynamicApi;
using ATS.NonCustodial.DynamicApi.Attributes; using ATS.NonCustodial.DynamicApi.Attributes;
using ATS.NonCustodial.Shared.Captcha.Dto;
using ATS.NonCustodial.Shared.Common.Attributes;
using ATS.NonCustodial.Shared.Common.Auth;
using ATS.NonCustodial.Shared.Common.Constants;
using ATS.NonCustodial.Shared.Common.Dtos;
using ATS.NonCustodial.Shared.Common.Enums;
using ATS.NonCustodial.Shared.Common.UnifiedResults; using ATS.NonCustodial.Shared.Common.UnifiedResults;
using ATS.NonCustodial.Shared.Configurations.Options; using ATS.NonCustodial.Shared.Configurations.Options;
using ATS.NonCustodial.Shared.Extensions;
using ATS.NonCustodial.Shared.Helpers;
using ATS.NonCustodial.Shared.Helpers.Core.Hash;
using ATS.NonCustodial.Shared.Helpers.Http;
using ATS.NonCustodial.Shared.Tools.Captcha;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using NPOI.Util;
using StackExchange.Profiling;
using System.Diagnostics;
using System.Security.Claims;
using TencentCloud.Common; using TencentCloud.Common;
using TencentCloud.Common.Profile; using TencentCloud.Common.Profile;
using TencentCloud.Sms.V20210111; using TencentCloud.Sms.V20210111;
using TencentCloud.Sms.V20210111.Models; using TencentCloud.Sms.V20210111.Models;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ATS.NonCustodial.Application.Impl.Admins namespace ATS.NonCustodial.Application.Impl.Admins
{ {
@ -92,29 +64,86 @@ namespace ATS.NonCustodial.Application.Impl.Admins
}; };
// 发送短信 // 发送短信
var sendResult = SendSMS(phone, code); var sendResult = SendSMS(phone, new string[] { code, "5" }, "2524683");
addSMS.result = sendResult; addSMS.result = sendResult;
var sms = await _appSMSRepository.InsertAsync(addSMS); var sms = await _appSMSRepository.InsertAsync(addSMS);
return ResultOutput.Ok(true); return ResultOutput.Ok(true);
} }
/// <summary> /// <summary>
/// 给指定电话发送短信 /// 用于触发给指定人员发送短信
/// </summary> /// </summary>
/// <param name="phone"></param> /// <param name="alert">短信通知类型</param>
/// <param name="msg"></param> /// <param name="supervisor">监管人姓名</param>
/// <param name="type"></param> /// <param name="phone">需要通知的电话</param>
/// <returns></returns> /// <param name="dateTime">发送的日期</param>
public async Task<IResultOutput> SendMessageSMS(string phone, string msg = "", string type = "CheckCode") /// <param name="msg">触发的消息内容(小于等于6个字)</param>
/// <param name="ipAddress"></param>
/// <param name="supervisedPerson">被监管人姓名</param>
/// <returns></returns>
public async Task<IResultOutput> SendMessageSMS(MessageAlertTypeEnum alert, string supervisor, string phone,DateTime? dateTime, string msg = "", string ipAddress = "",string supervisedPerson = "")
{ {
// 检查是否可以发送(一分钟内只能发送一次) // 检查是否可以发送(一分钟内只能发送一次)
if (!await CanSendCodeAsync(phone)) if (!await CanSendCodeAsync(phone))
{ {
return ResultOutput.NotOk("请求过于频繁,请稍后再试"); return ResultOutput.NotOk("请求过于频繁,请稍后再试");
} }
// 创建短信记录
var addSMS = new AppSMS
{
phone = phone,
sendTime = DateTime.Now,
expiresTime = DateTime.Now.AddMinutes(5), // 5分钟有效期
ipAddress = ipAddress
};
string[] sendMessage;
string templateId = string.Empty;
string year , month , day ;
if(dateTime.HasValue)
{
year = dateTime.Value.Year.ToString();
month = dateTime.Value.Month.ToString();
day = dateTime.Value.Day.ToString();
}
else
{
year=DateTime.Now.Year.ToString();
month = DateTime.Now.Month.ToString();
day = DateTime.Now.Day.ToString();
}
if (alert == MessageAlertTypeEnum.Alert)
{
//[预警处理提醒] {1}您好,您于{2}年{3}月{4}日触发的{5}预警需及时处理,请尽快核查并修正相关事项。
sendMessage = new string[] { supervisedPerson, year, month, day, msg };
templateId = "2534751";
addSMS.type = "Alert";
}
else if (alert == MessageAlertTypeEnum.Approved)
{
//[审批完成通知] {1}您好,您于{2}年{3}月{4}日提交的{5}申请已完成审批,请及时登录系统查看处理结果。
sendMessage = new string[] { supervisedPerson, year, month, day, msg };
templateId = "2535130";
addSMS.type = "Approved";
}
else if (alert == MessageAlertTypeEnum.ReviewNotification)
{
//[待审批提醒] {1}您好,{2}于{3}年{4}月{5}日提交的{6}申请待您审批,请及时处理。
sendMessage = new string[] { supervisor, supervisedPerson, year, month, day, msg };
templateId = "2535127";
addSMS.type = "ReviewNotification";
}
else
{
//[监管预警通知] {1}您好,被监管人{2}于{3}年{4}月{5}日已触发{6}预警,请尽快核查处理。
sendMessage = new string[] { supervisor, supervisedPerson, year, month, day, msg };
templateId = "2535150";
addSMS.type = "RegulatoryAlert";
}
// 发送短信 // 发送短信
var sendResult = SendSMS(phone, msg); var sendResult = SendSMS(phone, sendMessage, templateId);
addSMS.result = sendResult;
//发送记录入库
var sms = await _appSMSRepository.InsertAsync(addSMS);
return ResultOutput.Ok(true); return ResultOutput.Ok(true);
} }
@ -181,15 +210,24 @@ namespace ATS.NonCustodial.Application.Impl.Admins
/// <summary> /// <summary>
/// 发送短信 /// 发送短信
///【审批完成通知】
//{0}您好,您于{1}提交的{2}申请已完成审批,请及时登录系统查看处理结果。
//【预警处理提醒】
//{0}您好,您于{1}触发的{2}预警需及时处理,请尽快核查并修正相关事项。
//【监管预警通知】
//{0}您好,被监管人{1}已触发{2}预警,请尽快核查处理。
//【待审批提醒】
//{0}您好,{1}于{2}提交的{3}申请待您审批,请及时处理。
/// </summary> /// </summary>
/// <param name="phone"></param> /// <param name="phone">手机号</param>
/// <param name="msg"></param> /// <param name="messages">消息列表</param>
/// <param name="expires"></param> /// <param name="templateId">模版编号</param>
/// <returns></returns> /// <returns></returns>
private string SendSMS(string phone, string msg, int expires = 5) private string SendSMS(string phone, string[] messages, string templateId)
{ {
try try
{ {
var smsConfig = LazyGetRequiredService<SmsConfiguration>();
// 密钥信息从环境变量读取,需要提前在环境变量中设置 TENCENTCLOUD_SECRET_ID 和 TENCENTCLOUD_SECRET_KEY // 密钥信息从环境变量读取,需要提前在环境变量中设置 TENCENTCLOUD_SECRET_ID 和 TENCENTCLOUD_SECRET_KEY
// 使用环境变量方式可以避免密钥硬编码在代码中,提高安全性 // 使用环境变量方式可以避免密钥硬编码在代码中,提高安全性
// 生产环境建议使用更安全的密钥管理方案,如密钥管理系统(KMS)、容器密钥注入等 // 生产环境建议使用更安全的密钥管理方案,如密钥管理系统(KMS)、容器密钥注入等
@ -197,8 +235,8 @@ namespace ATS.NonCustodial.Application.Impl.Admins
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential Credential cred = new Credential
{ {
SecretId = "AKID52ovuoUzINL7g2A4mGYdHhtsfGdmhQv8", SecretId = smsConfig.SecretId,// "AKID52ovuoUzINL7g2A4mGYdHhtsfGdmhQv8",
SecretKey = "96qPlxzta3JL9j5D7oHWXN6f9D9sOiog" SecretKey = smsConfig.SecretKey// "96qPlxzta3JL9j5D7oHWXN6f9D9sOiog"
}; };
// 使用临时密钥示例 // 使用临时密钥示例
/* /*
@ -212,11 +250,13 @@ namespace ATS.NonCustodial.Application.Impl.Admins
ClientProfile clientProfile = new ClientProfile(); ClientProfile clientProfile = new ClientProfile();
// 实例化一个http选项,可选的,没有特殊需求可以跳过 // 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile(); HttpProfile httpProfile = new HttpProfile();
httpProfile.Endpoint = ("sms.tencentcloudapi.com"); //"sms.tencentcloudapi.com"
httpProfile.Endpoint = (smsConfig.Endpoint);
clientProfile.HttpProfile = httpProfile; clientProfile.HttpProfile = httpProfile;
// 实例化要请求产品的client对象,clientProfile是可选的 // 实例化要请求产品的client对象,clientProfile是可选的
SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile); //Region = "ap-guangzhou"
SmsClient client = new SmsClient(cred, smsConfig.Region , clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象 // 实例化一个请求对象,每个接口都会对应一个request对象
SendSmsRequest req = new SendSmsRequest(); SendSmsRequest req = new SendSmsRequest();
@ -228,22 +268,22 @@ namespace ATS.NonCustodial.Application.Impl.Admins
* : https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ * : https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */
/* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */
// 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看
req.SmsSdkAppId = "1401039888"; req.SmsSdkAppId = smsConfig.SmsSdkAppId;// "1401039888";
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */
// 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看 // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看
req.SignName = "成都阿凯思信息技术"; req.SignName = smsConfig.SignName;// "成都阿凯思信息技术";
/* 模板 ID: 必须填写已审核通过的模板 ID */ /* 模板 ID: 必须填写已审核通过的模板 ID */
// 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看 // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看
req.TemplateId = "2524683"; req.TemplateId = templateId;// "2524683";
/* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */ /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */
req.TemplateParamSet = new string[] { msg, expires.ToString() }; req.TemplateParamSet = messages;// new string[] { msg, expires.ToString() };
/* E.164 +[][] /* E.164 +[][]
* +8613711112222 + 8613711112222200*/ * +8613711112222 + 8613711112222200*/
req.PhoneNumberSet = new string[] { "+86" + phone }; req.PhoneNumberSet = new string[] { smsConfig.PhoneNumberSet + phone };
/* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
req.SessionContext = ""; req.SessionContext = "";

22
src/2.services/ATS.NonCustodial.Application/Impl/Business/AppBusinessApplicationService.cs

@ -1,15 +1,19 @@
using ATS.NonCustodial.Application.Base; using ATS.NonCustodial.Application.Base;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.AppDictionaries; using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.AppDictionaries;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.SMS;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User; using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications.Input; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications.Input;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications.Output; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppBusinessApplications.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppCaseManagement; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppCaseManagement;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.Apps.Output; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.Apps.Output;
using ATS.NonCustodial.Application.Impl.Admins;
using ATS.NonCustodial.Application.Impl.Business.IM; using ATS.NonCustodial.Application.Impl.Business.IM;
using ATS.NonCustodial.Domain.Entities.Admins;
using ATS.NonCustodial.Domain.Entities.Business; using ATS.NonCustodial.Domain.Entities.Business;
using ATS.NonCustodial.Domain.Entities.Business.CaseManagements; using ATS.NonCustodial.Domain.Entities.Business.CaseManagements;
using ATS.NonCustodial.Domain.Shared.AggRootEntities.Dtos; using ATS.NonCustodial.Domain.Shared.AggRootEntities.Dtos;
using ATS.NonCustodial.Domain.Shared.Enums;
using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore; using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore;
using ATS.NonCustodial.DynamicApi; using ATS.NonCustodial.DynamicApi;
using ATS.NonCustodial.DynamicApi.Attributes; using ATS.NonCustodial.DynamicApi.Attributes;
@ -42,7 +46,8 @@ namespace ATS.NonCustodial.Application.Impl.Business
private readonly IEfRepository<AppBusinessApplicationViewStatistics, long> _appBusinessApplicationViewStatisticsRepository; private readonly IEfRepository<AppBusinessApplicationViewStatistics, long> _appBusinessApplicationViewStatisticsRepository;
private readonly IAppCaseManagementService _appCaseManagementService; private readonly IAppCaseManagementService _appCaseManagementService;
private readonly IHubContext<NonCustodialHub> _hubContext; private readonly IHubContext<NonCustodialHub> _hubContext;
private readonly IEfRepository<AppUser, long> _appUserRepository;
private readonly ISMSService _smsService;
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@ -65,7 +70,8 @@ namespace ATS.NonCustodial.Application.Impl.Business
IEfRepository<AppCaseSupervisor, long> appCaseSupervisorRepository, IEfRepository<AppCaseSupervisor, long> appCaseSupervisorRepository,
IEfRepository<AppCaseSupervisedPerson, long> appCaseSupervisedPersonRepository, IEfRepository<AppCaseSupervisedPerson, long> appCaseSupervisedPersonRepository,
IUserService userService, IUserService userService,
IEfRepository<AppSupervisedPersonRealTimeLocation, long> appSupervisedPersonRealTimeLocationRepository) IEfRepository<AppUser, long> appUserRepository,
IEfRepository<AppSupervisedPersonRealTimeLocation, long> appSupervisedPersonRealTimeLocationRepository, ISMSService smsService)
: base( : base(
appCaseManagementRepository, appCaseManagementRepository,
appCaseSupervisorRepository, appCaseSupervisorRepository,
@ -78,6 +84,8 @@ namespace ATS.NonCustodial.Application.Impl.Business
_appBusinessApplicationViewStatisticsRepository = appBusinessApplicationViewStatisticsRepository; _appBusinessApplicationViewStatisticsRepository = appBusinessApplicationViewStatisticsRepository;
_appCaseManagementService = appCaseManagementService; _appCaseManagementService = appCaseManagementService;
_hubContext = hubContext; _hubContext = hubContext;
_appUserRepository = appUserRepository;
_smsService = smsService;
} }
#endregion Identity #endregion Identity
@ -290,6 +298,16 @@ namespace ATS.NonCustodial.Application.Impl.Business
await _appBusinessApplicationRepository.UpdateAsync(dataList); await _appBusinessApplicationRepository.UpdateAsync(dataList);
foreach (var item in dataList)
{
var user = await _appUserRepository.AsQueryable(false, true).Where(w => w.Id == item.SupervisedPersonId).ToListAsync();
//发短信给被监管人,提醒查看处理结果
//[审批完成通知] {1}您好,您于{2}年{3}月{4}日提交的{5}申请已完成审批,请及时登录系统查看处理结果。
await _smsService.SendMessageSMS(MessageAlertTypeEnum.Approved, "", user.FirstOrDefault().Phone, item.CreatedTime, item.ApplicationTypeName, "", item.SupervisedPersonName);
}
//返回结果 //返回结果
return ResultOutput.Ok(); return ResultOutput.Ok();
} }

26
src/2.services/ATS.NonCustodial.Application/Impl/Business/AppManagementService.cs

@ -25,6 +25,7 @@ using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServ
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServices.Input; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServices.Input;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServices.Output; using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServices.Output;
using ATS.NonCustodial.Application.Impl.Admins; using ATS.NonCustodial.Application.Impl.Admins;
using ATS.NonCustodial.Application.Impl.Business.CaseManagements;
using ATS.NonCustodial.Application.Impl.Business.IM; using ATS.NonCustodial.Application.Impl.Business.IM;
using ATS.NonCustodial.Domain.Entities.Admins; using ATS.NonCustodial.Domain.Entities.Admins;
using ATS.NonCustodial.Domain.Entities.Business; using ATS.NonCustodial.Domain.Entities.Business;
@ -842,8 +843,21 @@ namespace ATS.NonCustodial.Application.Impl.Business
[HttpPost] [HttpPost]
public async Task<IResultOutput> AddAppBusinessAsync(AppBusinessApplicationCreateOrModifyInput input) public async Task<IResultOutput> AddAppBusinessAsync(AppBusinessApplicationCreateOrModifyInput input)
{ {
//测试发短信流程 //根据案件找监管人,找到多个,均发送消息提醒
// await _smsService.SendMessageSMS("13461916012","您有一条申请待处理,请及时处理"); var currentUserCase = await base.GetCurrentSupervisePersonProcessingCase(User.Id);
var supervisorList = await _appSupervisorRepository
.AsQueryable(false, true)
.Where(w => w.CaseId == currentUserCase.CaseId)
.ToListAsync();
var applicationType = await base.GetDictionariesOutput("application_type", "df");
foreach (var supervisor in supervisorList)
{
var user = await _appUserRepository.AsQueryable(false, true).Where(w => w.Id == supervisor.SupervisorId).ToListAsync();
//发短信给监管人,提醒处理审批
await _smsService.SendMessageSMS(MessageAlertTypeEnum.ReviewNotification, user.FirstOrDefault().UserName, user.FirstOrDefault().Phone, DateTime.Now, applicationType.Name, "", currentUserCase.SupervisedPersonName);
}
return await _appBusinessApplicationService.CreateOrModify(input); return await _appBusinessApplicationService.CreateOrModify(input);
} }
@ -993,9 +1007,11 @@ namespace ATS.NonCustodial.Application.Impl.Business
[AllowAnonymous] [AllowAnonymous]
public async Task<IResultOutput> SubmitBindingApplication(SubmitBindingApplicationInput input) public async Task<IResultOutput> SubmitBindingApplication(SubmitBindingApplicationInput input)
{ {
// bool checkCode = await _smsService.CheckCodeAsync(input.phone, input.checkCode, "CheckCode"); if (!string.IsNullOrEmpty(input.phone))
// if (!checkCode) return ResultOutput.NotOk("无效验证码"); {
bool checkCode = await _smsService.CheckCodeAsync(input.phone, input.checkCode, "CheckCode");
if (!checkCode) return ResultOutput.NotOk("无效验证码");
}
//[1]校验当前账户是否是第一次绑定 //[1]校验当前账户是否是第一次绑定
//if (!await _appSupervisedPersonRepository.AnyAsync(w => w.IdCard == input.IdCard && !w.IsBound)) return ResultOutput.NotOk("当前身份没有被监管,请检查身份证是否输入正确"); //if (!await _appSupervisedPersonRepository.AnyAsync(w => w.IdCard == input.IdCard && !w.IsBound)) return ResultOutput.NotOk("当前身份没有被监管,请检查身份证是否输入正确");
if (!await _appSupervisedPersonRepository.AnyAsync(w => w.IdCard == input.IdCard)) return ResultOutput.NotOk("当前身份没有被监管,请检查身份证是否输入正确"); if (!await _appSupervisedPersonRepository.AnyAsync(w => w.IdCard == input.IdCard)) return ResultOutput.NotOk("当前身份没有被监管,请检查身份证是否输入正确");

14
src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Admins/SMS/ISMSService.cs

@ -25,13 +25,17 @@ namespace ATS.NonCustodial.Application.Contracts.Interfaces.Admins.SMS
/// <returns></returns> /// <returns></returns>
Task<bool> CheckCodeAsync(string phoneNumber, string code, string type = "default"); Task<bool> CheckCodeAsync(string phoneNumber, string code, string type = "default");
/// <summary> /// <summary>
/// 给指定电话发送短信 /// 用于触发给指定人员发送短信
/// </summary> /// </summary>
/// <param name="phone"></param> /// <param name="alert">短信通知类型</param>
/// <param name="msg"></param> /// <param name="supervisor">监管人姓名</param>
/// <param name="type"></param> /// <param name="phone">需要通知的电话</param>
/// <param name="dateTime">发送的日期</param>
/// <param name="msg">触发的消息内容(小于等于6个字)</param>
/// <param name="ipAddress"></param>
/// <param name="supervisedPerson">被监管人姓名</param>
/// <returns></returns> /// <returns></returns>
Task<IResultOutput> SendMessageSMS(string phone, string msg = "", string type = "CheckCode"); Task<IResultOutput> SendMessageSMS(MessageAlertTypeEnum alert, string supervisor, string phone, DateTime? dateTime, string msg = "", string ipAddress = "", string supervisedPerson = "");
/// <summary> /// <summary>
/// 发送前校验 /// 发送前校验

2
src/4.apps/ATS.NonCustodial.Admin.Api/Dockerfile

@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
ENV TZ Asia/Shanghai ENV TZ Asia/Shanghai

27
src/4.apps/ATS.NonCustodial.Admin.Api/configs/appsettings.json

@ -22,8 +22,8 @@
/* Server=ip database= pwd= port=*/ /* Server=ip database= pwd= port=*/
//"AdminAuditLogDbConnection": "Server=192.168.0.78;database=fjy1;uid=root;pwd=jiacai;pooling=true;CharSet=utf8;port=3306;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;", //"AdminAuditLogDbConnection": "Server=192.168.0.78;database=fjy1;uid=root;pwd=jiacai;pooling=true;CharSet=utf8;port=3306;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;",
//"AdminDbConnection": "Server=192.168.0.78;database=fjy1;uid=root;pwd=jiacai;pooling=true;CharSet=utf8;port=3306;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;", //"AdminDbConnection": "Server=192.168.0.78;database=fjy1;uid=root;pwd=jiacai;pooling=true;CharSet=utf8;port=3306;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;",
"AdminAuditLogDbConnection": "Server=localhost;database=fjy_sl;uid=root;pwd=sa@admin;pooling=true;CharSet=utf8;port=3306;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;", "AdminAuditLogDbConnection": "Server=localhost;database=fsl_cs;uid=root;pwd=sa@admin;pooling=true;CharSet=utf8;port=3306;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;",
"AdminDbConnection": "Server=localhost;database=fjy_sl;uid=root;pwd=sa@admin;pooling=true;CharSet=utf8;port=3306;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;" "AdminDbConnection": "Server=localhost;database=fsl_cs;uid=root;pwd=sa@admin;pooling=true;CharSet=utf8;port=3306;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;"
//"AdminAuditLogDbConnection": "Server=soft.scakskj.com;database=fjy;uid=root;pwd=sa@123456;pooling=true;CharSet=utf8;port=5324;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;", //"AdminAuditLogDbConnection": "Server=soft.scakskj.com;database=fjy;uid=root;pwd=sa@123456;pooling=true;CharSet=utf8;port=5324;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;",
// "AdminDbConnection": "Server=soft.scakskj.com;database=fjy;uid=root;pwd=sa@123456;pooling=true;CharSet=utf8;port=5324;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;" // "AdminDbConnection": "Server=soft.scakskj.com;database=fjy;uid=root;pwd=sa@123456;pooling=true;CharSet=utf8;port=5324;SslMode=none;Allow User Variables=True;AllowPublicKeyRetrieval=True;"
@ -201,12 +201,12 @@
//Swagger //Swagger
"SwaggerConfiguration": { "SwaggerConfiguration": {
// //
"Enable": true, "Enable": false,
// //
/* Url["http://localhost:api端口号"] */ /* Url["http://localhost:api端口号"] */
"Url": "http://localhost:8006", "Url": "http://localhost:8006",
"Footer": "\"Copyright<a-icon type=\\\"copyright\\\" /> 2022-<a target=\\\"_blank\\\" href=\\\"https://XXXX\\\">ATS.NonCustodial.Admin</a>\"", "Footer": "\"Copyright<a-icon type=\\\"copyright\\\" /> 2022-<a target=\\\"_blank\\\" href=\\\"https://XXXX\\\">ATS.NonCustodial.Admin</a>\"",
"EnableMiniProfiler": true "EnableMiniProfiler": false
}, },
// //
@ -254,5 +254,24 @@
"AppKey": "SeXpmo90df9INDBVejixG", "AppKey": "SeXpmo90df9INDBVejixG",
"MasterSecret": "0jrX4Yc54V6ehBCRhtSQQ3", "MasterSecret": "0jrX4Yc54V6ehBCRhtSQQ3",
"AppSecret": "uCqaQ6Ts8ZAiQhsMm3Yfx2" "AppSecret": "uCqaQ6Ts8ZAiQhsMm3Yfx2"
},
//
"SmsConfiguration": {
// https://cloud.tencent.com/document/product/1278/85305
// https://console.cloud.tencent.com/cam/capi
"SecretId": "AKID52ovuoUzINL7g2A4mGYdHhtsfGdmhQv8",
"SecretKey": "96qPlxzta3JL9j5D7oHWXN6f9D9sOiog",
//
"Endpoint": "sms.tencentcloudapi.com",
//Region name, such as "ap-guangzhou"
"Region": "ap-guangzhou",
//ID: SdkAppId [] SdkAppId1400006666
"SmsSdkAppId": "1401039888",
//: 使 UTF-8
"SignName": "成都阿凯思信息技术",
// E.164 +[][]
//+8613711112222 +
//8613711112222200
"PhoneNumberSet": "+86"
} }
} }

1
src/5.shared/ATS.NonCustodial.AdminUi/Configurations/AdminServerCollectionExtension.cs

@ -94,6 +94,7 @@ namespace ATS.NonCustodial.AdminUi.Configurations
//个推 //个推
services.AddSingleton(adminUiOptions.TweetsConfigConfiguration); services.AddSingleton(adminUiOptions.TweetsConfigConfiguration);
services.AddSingleton(adminUiOptions.SmsConfiguration);
#region 身份认证授权 #region 身份认证授权

5
src/5.shared/ATS.NonCustodial.AdminUi/Configurations/AdminUiOptions.cs

@ -60,7 +60,7 @@ namespace ATS.NonCustodial.AdminUi.Configurations
/// TweetsConfigConfiguration /// TweetsConfigConfiguration
/// </summary> /// </summary>
public TweetsConfigConfiguration TweetsConfigConfiguration { get; set; } = new TweetsConfigConfiguration(); public TweetsConfigConfiguration TweetsConfigConfiguration { get; set; } = new TweetsConfigConfiguration();
public SmsConfiguration SmsConfiguration { get; set; } = new SmsConfiguration();
/// <summary> /// <summary>
/// TenantConfiguration /// TenantConfiguration
/// </summary> /// </summary>
@ -143,6 +143,7 @@ namespace ATS.NonCustodial.AdminUi.Configurations
configuration.GetSection(nameof(RabbitMqOptions)).Bind(RabbitMqOptions); configuration.GetSection(nameof(RabbitMqOptions)).Bind(RabbitMqOptions);
configuration.GetSection(nameof(SdQuartzCronConfiguration)).Bind(SdQuartzCronConfiguration); configuration.GetSection(nameof(SdQuartzCronConfiguration)).Bind(SdQuartzCronConfiguration);
configuration.GetSection(nameof(TweetsConfigConfiguration)).Bind(TweetsConfigConfiguration); configuration.GetSection(nameof(TweetsConfigConfiguration)).Bind(TweetsConfigConfiguration);
configuration.GetSection(nameof(SmsConfiguration)).Bind(SmsConfiguration);
//注册options //注册options
services.AddSingleton(VarifyCodeConfiguration); services.AddSingleton(VarifyCodeConfiguration);
@ -150,6 +151,8 @@ namespace ATS.NonCustodial.AdminUi.Configurations
services.AddSingleton(UploadConfigConfiguration); services.AddSingleton(UploadConfigConfiguration);
//services.AddSingleton(TweetsConfigConfiguration); //services.AddSingleton(TweetsConfigConfiguration);
services.AddSingleton(AuditLoggingConfiguration); services.AddSingleton(AuditLoggingConfiguration);
services.AddSingleton(SmsConfiguration);
services.AddSingleton(ConnectionStringsConfiguration); services.AddSingleton(ConnectionStringsConfiguration);
} }
} }

34
src/5.shared/ATS.NonCustodial.Domain.Shared/Enums/MessageAlertTypeEnum.cs

@ -0,0 +1,34 @@
using System.ComponentModel;
namespace ATS.NonCustodial.Domain.Shared.Enums
{
/// <summary>
/// 短信通知类型
/// </summary>
public enum MessageAlertTypeEnum
{
/// <summary>
/// 审批完成通知
/// </summary>
[Description("审批完成")]
Approved = 0,
/// <summary>
/// 监管预警通知(用于通知监管人)
/// </summary>
[Description("监管预警")]
RegulatoryAlert = 1,
/// <summary>
/// 审批提醒通知
/// </summary>
[Description("审批提醒")]
ReviewNotification = 2,
/// <summary>
/// 预警处理通知(用于通知被监管人)
/// </summary>
[Description("预警处理")]
Alert = 3
}
}

27
src/5.shared/ATS.NonCustodial.Shared/Configurations/Options/SmsConfiguration.cs

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ATS.NonCustodial.Shared.Configurations.Options
{
public class SmsConfiguration
{
public string SecretId { get; set; }
public string SecretKey { get; set; }
public string Endpoint { get; set; }
public string Region { get; set; }
public string SmsSdkAppId { get; set; }
/// <summary>
/// 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名
/// </summary>
public string SignName { get; set; }
public string PhoneNumberSet { get; set; }
}
}
Loading…
Cancel
Save