telco_server/app/admin/apis/bus_apis/a_sms_manage.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
}