using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Filter; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.Extras.Thirdparty.Sms; using JNPF.FriendlyException; using JNPF.Systems.Entitys.Dto.SmsTemplate; using JNPF.Systems.Entitys.Dto.SysConfig; using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; namespace JNPF.Systems; /// /// base_sms_template服务. /// [ApiDescriptionSettings(Tag = "System", Name = "SmsTemplate", Order = 200)] [Route("api/system/[controller]")] public class SmsTemplateService : ISmsTemplateService, IDynamicApiController, ITransient { /// /// 服务基础仓储. /// private readonly ISqlSugarRepository _repository; /// /// 系统配置服务. /// private readonly ISysConfigService _sysConfigService; /// /// 用户管理. /// private readonly IUserManager _userManager; /// /// 初始化一个类型的新实例. /// public SmsTemplateService( ISqlSugarRepository repository, ISysConfigService sysConfigService, IUserManager userManager) { _repository = repository; _sysConfigService = sysConfigService; _userManager = userManager; } #region Get /// /// 获取base_sms_template列表. /// /// 请求参数. /// [HttpGet("")] public async Task GetList([FromQuery] SmsTemplateListQueryInput input) { var data = await _repository.AsSugarClient().Queryable((a, b) => new JoinQueryInfos(JoinType.Left, a.CreatorUserId == b.Id)) .WhereIF(!string.IsNullOrEmpty(input.keyword), a => a.FullName.Contains(input.keyword) || a.TemplateId.Contains(input.keyword)) .Where(a => a.DeleteMark == null) .OrderBy(a => a.CreatorTime, OrderByType.Desc).OrderByIF(!string.IsNullOrEmpty(input.keyword), a => a.LastModifyTime, OrderByType.Desc) .Select((a, b) => new SmsTemplateListOutput { id = a.Id, company = SqlFunc.IIF(a.Company == 1, "阿里", "腾讯"), templateId = a.TemplateId, signContent = a.SignContent, enabledMark = a.EnabledMark, fullName = a.FullName, enCode = a.EnCode, creatorTime = a.CreatorTime, lastModifyTime = a.LastModifyTime, creatorUser = SqlFunc.MergeString(b.RealName, "/", b.Account), }).ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } /// /// 获取base_sms_template列表. /// /// [HttpGet("Selector")] public async Task GetSelector([FromQuery] PageInputBase input) { var data = await _repository.AsSugarClient().Queryable((a, b) => new JoinQueryInfos(JoinType.Left, a.CreatorUserId == b.Id)) .WhereIF(!string.IsNullOrEmpty(input.keyword), a => a.FullName.Contains(input.keyword) || a.TemplateId.Contains(input.keyword)) .Where(a => a.DeleteMark == null && a.EnabledMark == 1) .OrderBy(a => a.CreatorTime, OrderByType.Desc) .Select((a, b) => new SmsTemplateListOutput { id = a.Id, company = SqlFunc.IIF(a.Company == 1, "阿里", "腾讯"), templateId = a.TemplateId, signContent = a.SignContent, enabledMark = a.EnabledMark, fullName = a.FullName, enCode = a.EnCode, creatorTime = a.CreatorTime, lastModifyTime = a.LastModifyTime, creatorUser = SqlFunc.MergeString(b.RealName, "/", b.Account), }).ToPagedListAsync(input.currentPage, input.pageSize); return PageResult.SqlSugarPageResult(data); } /// /// 获取base_sms_template. /// /// 参数. /// [HttpGet("{id}")] public async Task GetInfo(string id) { return (await _repository.GetFirstAsync(p => p.Id == id && p.DeleteMark == null)).Adapt(); } /// /// 获取模板字段. /// /// 主键值. /// [HttpGet("getTemplate/{id}")] public async Task GetTemplate(string id) { var sysconfig = await _sysConfigService.GetInfo(); var entity = await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null); var smsModel = new SmsParameterInfo() { keyId = entity.Company == 1 ? sysconfig.aliAccessKey : sysconfig.tencentSecretId, keySecret = entity.Company == 1 ? sysconfig.aliSecret : sysconfig.tencentSecretKey, domain = entity.Endpoint, templateId = entity.TemplateId, region = entity.Region, }; try { if (entity.Company == 1) return SmsUtil.GetTemplateByAli(smsModel); else return SmsUtil.GetTemplateByTencent(smsModel); } catch (Exception ex) { throw Oops.Oh(ErrorCode.D7004); } } #endregion #region Post /// /// 新建base_sms_template. /// /// 参数. /// [HttpPost("")] public async Task Create([FromBody] SmsTemplateCrInput input) { if (await _repository.IsAnyAsync(x => x.EnCode == input.enCode && x.DeleteMark == null)) throw Oops.Oh(ErrorCode.COM1004); var entity = input.Adapt(); var isOk = await _repository.AsInsertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync(); if (!(isOk > 0)) throw Oops.Oh(ErrorCode.COM1000); } /// /// 更新base_sms_template. /// /// 主键. /// 参数. /// [HttpPut("{id}")] public async Task Update(string id, [FromBody] SmsTemplateUpInput input) { if (await _repository.IsAnyAsync(x => x.Id != id && x.EnCode == input.enCode && x.DeleteMark == null)) throw Oops.Oh(ErrorCode.COM1004); var entity = input.Adapt(); var isOk = await _repository.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandHasChangeAsync(); if (!isOk) throw Oops.Oh(ErrorCode.COM1001); } /// /// 删除base_sms_template. /// /// [HttpDelete("{id}")] public async Task Delete(string id) { var entity = await _repository.GetFirstAsync(p => p.Id.Equals(id)); _ = entity ?? throw Oops.Oh(ErrorCode.COM1005); var isOk = await _repository.AsUpdateable(entity).CallEntityMethod(m => m.Delete()).UpdateColumns(it => new { it.DeleteMark, it.DeleteTime, it.DeleteUserId }).ExecuteCommandHasChangeAsync(); if (!isOk) throw Oops.Oh(ErrorCode.COM1002); } /// /// 修改单据规则状态. /// /// 主键值. /// [HttpPut("{id}/Actions/State")] public async Task ActionsState_Api(string id) { var isOk = await _repository.AsUpdateable().SetColumns(it => new SmsTemplateEntity() { EnabledMark = SqlFunc.IIF(it.EnabledMark == 1, 0, 1), LastModifyUserId = _userManager.UserId, LastModifyTime = SqlFunc.GetDate() }).Where(it => it.Id.Equals(id)).ExecuteCommandHasChangeAsync(); if (!isOk) throw Oops.Oh(ErrorCode.COM1003); } /// /// 获取模板字段. /// /// /// [HttpPost("getTemplate")] public async Task GetTemplate([FromBody] SmsTemplateCrInput input) { var sysconfig = await _sysConfigService.GetInfo(); var smsModel = new SmsParameterInfo() { keyId = input.company == 1 ? sysconfig.aliAccessKey : sysconfig.tencentSecretId, keySecret = input.company == 1 ? sysconfig.aliSecret : sysconfig.tencentSecretKey, domain = input.endpoint, templateId = input.templateId, region = input.region, }; try { if (input.company == 1) return SmsUtil.GetTemplateByAli(smsModel); else return SmsUtil.GetTemplateByTencent(smsModel); } catch (Exception ex) { throw Oops.Oh(ErrorCode.D7004); } } /// /// 测试发送. /// /// 请求参数. /// [HttpPost("testSent")] public async Task SendTest([FromBody] SmsTemplateSendTestInput input) { var sysconfig = await _sysConfigService.GetInfo(); var smsModel = new SmsParameterInfo() { keyId = input.company == 1 ? sysconfig.aliAccessKey : sysconfig.tencentSecretId, keySecret = input.company == 1 ? sysconfig.aliSecret : sysconfig.tencentSecretKey, region = input.region, domain = input.endpoint, templateId = input.templateId, signName = input.signContent }; var msg = string.Empty; if (input.company == 1) { smsModel.mobileAli = input.phoneNumbers; smsModel.templateParamAli = input.parameters.ToJsonString(); msg = SmsUtil.SendSmsByAli(smsModel); } else { smsModel.mobileTx = new string[] { input.phoneNumbers }; List mList = new List(); foreach (string data in input.parameters.Values) { mList.Add(data); } smsModel.appId = sysconfig.tencentAppId; smsModel.templateParamTx = mList.ToArray(); msg = SmsUtil.SendSmsByTencent(smsModel); } if (msg.Equals("短信发送失败")) throw Oops.Oh(ErrorCode.D7005); } #endregion /// /// 获取短信模板字段. /// /// /// [NonAction] public async Task> GetSmsTemplateFields(string id) { var entity = await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null); var sysconfig = await _sysConfigService.GetInfo(); var smsModel = new SmsParameterInfo() { keyId = entity.Company == 1 ? sysconfig.aliAccessKey : sysconfig.tencentSecretId, keySecret = entity.Company == 1 ? sysconfig.aliSecret : sysconfig.tencentSecretKey, region = entity.Region, domain = entity.Endpoint, templateId = entity.TemplateId }; try { if (entity.Company == 1) return SmsUtil.GetTemplateByAli(smsModel); else return SmsUtil.GetTemplateByTencent(smsModel); } catch (Exception ex) { throw Oops.Oh(ErrorCode.D7004); } } /// /// 工作流发送短信. /// /// /// /// /// /// [NonAction] public async Task FlowTaskSend(string id, SysConfigOutput sysconfig, List phoneNumbers, Dictionary parameters) { var entity = await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null); var smsModel = new SmsParameterInfo() { keyId = entity.Company == 1 ? sysconfig.aliAccessKey : sysconfig.tencentSecretId, keySecret = entity.Company == 1 ? sysconfig.aliSecret : sysconfig.tencentSecretKey, region = entity.Region, domain = entity.Endpoint, templateId = entity.TemplateId, signName = entity.SignContent }; if (entity.Company == 1) { smsModel.mobileAli = string.Join(",", phoneNumbers); smsModel.templateParamAli = parameters.ToJsonString(); SmsUtil.SendSmsByAli(smsModel); } else { smsModel.mobileTx = phoneNumbers.ToArray(); List mList = new List(); var fields = await GetSmsTemplateFields(id); foreach (string item in fields) { if (parameters.ContainsKey(item)) mList.Add(parameters[item]); } smsModel.templateParamTx = mList.ToArray(); SmsUtil.SendSmsByTencent(smsModel); } } }