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 }