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);
}
}
}