243 lines
5.3 KiB
Go
243 lines
5.3 KiB
Go
package bus_apis
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gin-gonic/gin/binding"
|
|
"github.com/go-admin-team/go-admin-core/sdk/api"
|
|
"github.com/google/uuid"
|
|
"go-admin/app/admin/models/bus_models"
|
|
"go-admin/app/admin/service/bus_service"
|
|
"go-admin/tools/app"
|
|
"go-admin/tools/crypto"
|
|
"io"
|
|
)
|
|
|
|
type SmsApi struct {
|
|
api.Api
|
|
}
|
|
|
|
// MassImportPhone 导入号码(群发短信)
|
|
// @Summary 导入号码(群发短信)
|
|
// @Tags 短信管理-V1.0.0
|
|
// @Produce json
|
|
// @Accept json
|
|
// @Param file body string true "上传excel文件"
|
|
// @Success 200 {object} bus_models.MassImportPhoneResp
|
|
// @Router /api/v1/sms/mass_import_phone [post]
|
|
func (e SmsApi) MassImportPhone(c *gin.Context) {
|
|
var smsService bus_service.SmsService
|
|
|
|
// 绑定 JSON 数据,获取 secret_key
|
|
err := e.MakeContext(c).
|
|
MakeOrm().
|
|
MakeService(&smsService.Service).
|
|
Errors
|
|
if err != nil {
|
|
e.Logger.Error(err)
|
|
e.Error(500, err, err.Error())
|
|
return
|
|
}
|
|
|
|
// 获取上传的文件
|
|
file, _, err := c.Request.FormFile("file")
|
|
if err != nil {
|
|
e.Logger.Error("获取文件失败:", err)
|
|
e.Error(400, err, "请上传有效的文件")
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
// 读取文件内容并处理
|
|
fileBytes, err := io.ReadAll(file)
|
|
if err != nil {
|
|
e.Logger.Error("读取文件内容失败:", err)
|
|
e.Error(500, err, "读取文件失败")
|
|
return
|
|
}
|
|
|
|
// 使用 SmsService 读取 Excel 文件
|
|
phones, err := smsService.ReadExcelFile(fileBytes)
|
|
if err != nil {
|
|
e.Error(500, err, "读取文件失败")
|
|
return
|
|
}
|
|
|
|
if len(phones) == 0 {
|
|
e.Error(400, nil, "导入的手机号为空")
|
|
return
|
|
}
|
|
|
|
importSerial := uuid.New().String()
|
|
|
|
err = smsService.CachePhonesByShard(importSerial, phones)
|
|
if err != nil {
|
|
e.Error(500, err, "手机号缓存失败")
|
|
return
|
|
}
|
|
|
|
// 返回加密后的数据
|
|
resp := bus_models.MassImportPhoneResp{
|
|
ImportSerialNumber: uuid.New().String(),
|
|
}
|
|
if len(phones) > bus_models.ShowCount {
|
|
resp.List = phones[0:200]
|
|
} else {
|
|
resp.List = phones
|
|
}
|
|
|
|
// 将JSON数据转换为字符串
|
|
plainText, err := json.Marshal(resp)
|
|
if err != nil {
|
|
e.Logger.Error("JSON 序列化失败:", err)
|
|
e.Error(500, err, "数据转换失败")
|
|
return
|
|
}
|
|
|
|
// 使用AES加密手机号
|
|
encryptedData, err := crypto.AESEncryptJson(bus_models.AESKey, string(plainText))
|
|
if err != nil {
|
|
e.Logger.Error("AES 加密失败:", err)
|
|
e.Error(500, err, "加密失败")
|
|
return
|
|
}
|
|
|
|
app.OK(c, encryptedData, "导入成功")
|
|
return
|
|
}
|
|
|
|
func (e SmsApi) SelfImportPhone(c *gin.Context) {
|
|
s := bus_service.ProductService{}
|
|
var req bus_models.ProductListReq
|
|
|
|
err := e.MakeContext(c).
|
|
MakeOrm().
|
|
Bind(&req, binding.JSON).
|
|
MakeService(&s.Service).
|
|
Errors
|
|
if err != nil {
|
|
e.Logger.Error(err)
|
|
e.Error(500, err, err.Error())
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
func (e SmsApi) FileImportPhone(c *gin.Context) {
|
|
s := bus_service.ProductService{}
|
|
var req bus_models.ProductListReq
|
|
|
|
err := e.MakeContext(c).
|
|
MakeOrm().
|
|
Bind(&req, binding.JSON).
|
|
MakeService(&s.Service).
|
|
Errors
|
|
if err != nil {
|
|
e.Logger.Error(err)
|
|
e.Error(500, err, err.Error())
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
func (e SmsApi) ExcelImportPhone(c *gin.Context) {
|
|
s := bus_service.ProductService{}
|
|
var req bus_models.ProductListReq
|
|
|
|
err := e.MakeContext(c).
|
|
MakeOrm().
|
|
Bind(&req, binding.JSON).
|
|
MakeService(&s.Service).
|
|
Errors
|
|
if err != nil {
|
|
e.Logger.Error(err)
|
|
e.Error(500, err, err.Error())
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
func (e SmsApi) ExportMessPhone(c *gin.Context) {
|
|
s := bus_service.ProductService{}
|
|
var req bus_models.ProductListReq
|
|
|
|
err := e.MakeContext(c).
|
|
MakeOrm().
|
|
Bind(&req, binding.JSON).
|
|
MakeService(&s.Service).
|
|
Errors
|
|
if err != nil {
|
|
e.Logger.Error(err)
|
|
e.Error(500, err, err.Error())
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
func (e SmsApi) SendPreCheck(c *gin.Context) {
|
|
s := bus_service.ProductService{}
|
|
var req bus_models.ProductListReq
|
|
|
|
err := e.MakeContext(c).
|
|
MakeOrm().
|
|
Bind(&req, binding.JSON).
|
|
MakeService(&s.Service).
|
|
Errors
|
|
if err != nil {
|
|
e.Logger.Error(err)
|
|
e.Error(500, err, err.Error())
|
|
return
|
|
}
|
|
|
|
}
|
|
|
|
// SendSms 提交发送任务
|
|
// @Summary 提交发送任务
|
|
// @Tags 短信管理-V1.0.0
|
|
// @Produce json
|
|
// @Accept json
|
|
// @Param request body bus_models.SendSmsReq true "提交发送任务模型"
|
|
// @Success 200 {object} app.Response
|
|
// @Router /api/v1/sms/send_sms [post]
|
|
func (e SmsApi) SendSms(c *gin.Context) {
|
|
smsService := bus_service.SmsService{}
|
|
var req bus_models.SendSmsReq
|
|
|
|
err := e.MakeContext(c).
|
|
MakeOrm().
|
|
Bind(&req, binding.JSON).
|
|
MakeService(&smsService.Service).
|
|
Errors
|
|
if err != nil {
|
|
e.Logger.Error(err)
|
|
e.Error(500, err, err.Error())
|
|
return
|
|
}
|
|
|
|
if req.ImportSerialNumber == "" {
|
|
e.Error(400, nil, "import_serial_number 不能为空")
|
|
return
|
|
}
|
|
|
|
// 如果还有额外手机号,直接追加到 Redis 缓存列表
|
|
if len(req.PhoneList) > 0 {
|
|
err := smsService.AppendPhonesToRedis(req.ImportSerialNumber, req.PhoneList)
|
|
if err != nil {
|
|
e.Logger.Error("手机号追加失败:", err)
|
|
e.Error(500, err, "手机号追加失败")
|
|
return
|
|
}
|
|
}
|
|
|
|
// 创建发送任务,使用 redis 缓存中的数据分片处理
|
|
err = smsService.SubmitSmsTaskFromRedis(c.Request.Context(), req.ImportSerialNumber, req.SmsContent)
|
|
if err != nil {
|
|
e.Logger.Error("任务提交失败:", err)
|
|
e.Error(500, err, "短信任务提交失败")
|
|
return
|
|
}
|
|
|
|
app.OK(c, nil, "短信发送任务提交成功")
|
|
return
|
|
}
|