Compare commits
	
		
			2 Commits
		
	
	
		
			cbefd85f25
			...
			996cd27fcb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 996cd27fcb | |||
| 9c826f4966 | 
| @ -12,6 +12,8 @@ import ( | |||||||
| 	"go-admin/app/admin/service" | 	"go-admin/app/admin/service" | ||||||
| 	"go-admin/app/admin/service/dto" | 	"go-admin/app/admin/service/dto" | ||||||
| 	"go-admin/common/actions" | 	"go-admin/common/actions" | ||||||
|  | 	"go-admin/common/middleware" | ||||||
|  | 	"go-admin/common/statuscode" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type SmsAbnormalNumber struct { | type SmsAbnormalNumber struct { | ||||||
| @ -212,3 +214,101 @@ func (e SmsAbnormalNumber) SyncState(c *gin.Context) { | |||||||
| 	} | 	} | ||||||
| 	e.OK(nil, "同步成功") | 	e.OK(nil, "同步成功") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 重用号码 | ||||||
|  | func (e SmsAbnormalNumber) ReUseAbnormalNumber(c *gin.Context) { | ||||||
|  | 	req := dto.ReUseAbnormalNumberReq{} | ||||||
|  | 	s := service.SmsAbnormalNumber{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	lang := "en" | ||||||
|  | 	userId, err := middleware.GetUserIdByApiKey(c) | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(statuscode.Unauthorized, nil, statuscode.GetMsg(statuscode.Unauthorized, lang)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	resp, code := s.ReUseAbnormalNumber(userId, &req) | ||||||
|  |  | ||||||
|  | 	if code != statuscode.Success { | ||||||
|  | 		e.Error(code, nil, statuscode.GetMsg(code, lang)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(resp, "success") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 清空数据 | ||||||
|  | func (e SmsAbnormalNumber) Clean(c *gin.Context) { | ||||||
|  | 	s := service.SmsAbnormalNumber{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	lang := "en" | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(statuscode.Unauthorized, nil, statuscode.GetMsg(statuscode.Unauthorized, lang)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = s.Clean() | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("清除数据失败\r\n失败信息 %s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(nil, "success") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 批量取消 | ||||||
|  | func (e SmsAbnormalNumber) BatchCancel(c *gin.Context) { | ||||||
|  | 	req := dto.BatchCancelAbnormalNumberReq{} | ||||||
|  | 	s := service.SmsAbnormalNumber{} | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	lang := "en" | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(statuscode.Unauthorized, nil, statuscode.GetMsg(statuscode.Unauthorized, lang)) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = s.BatchCancel(&req) | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Error(500, err, fmt.Sprintf("批量取消异常号码统计失败,\r\n失败信息 %s", err.Error())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(nil, "success") | ||||||
|  | } | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package apis | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/api" | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
| @ -747,3 +748,35 @@ func (e SmsPhone) OpenWeakUp(c *gin.Context) { | |||||||
|  |  | ||||||
| 	e.OK(resp, "success") | 	e.OK(resp, "success") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 手动续费 | ||||||
|  | func (e SmsPhone) ManualRenewal(c *gin.Context) { | ||||||
|  | 	req := dto.ManualRenewalReq{} | ||||||
|  | 	s := service.SmsPhone{} | ||||||
|  |  | ||||||
|  | 	err := e.MakeContext(c). | ||||||
|  | 		MakeOrm(). | ||||||
|  | 		Bind(&req). | ||||||
|  | 		MakeService(&s.Service). | ||||||
|  | 		Errors | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	errorIds, err := s.ManualRenewal(req.ActivationIds) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Logger.Error(err) | ||||||
|  | 		e.Error(500, err, err.Error()) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var data string | ||||||
|  |  | ||||||
|  | 	if len(errorIds) > 0 { | ||||||
|  | 		data = strings.Join(errorIds, ",") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	e.OK(data, "success") | ||||||
|  | } | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package apis | package apis | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|     "fmt" | 	"fmt" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/api" | 	"github.com/go-admin-team/go-admin-core/sdk/api" | ||||||
| @ -29,27 +29,27 @@ type SmsRenewalLog struct { | |||||||
| // @Router /api/v1/sms-renewal-log [get] | // @Router /api/v1/sms-renewal-log [get] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e SmsRenewalLog) GetPage(c *gin.Context) { | func (e SmsRenewalLog) GetPage(c *gin.Context) { | ||||||
|     req := dto.SmsRenewalLogGetPageReq{} | 	req := dto.SmsRenewalLogGetPageReq{} | ||||||
|     s := service.SmsRenewalLog{} | 	s := service.SmsRenewalLog{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|    	if err != nil { | 	if err != nil { | ||||||
|    		e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|    		e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|    		return | 		return | ||||||
|    	} | 	} | ||||||
|  |  | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
| 	list := make([]models.SmsRenewalLog, 0) | 	list := make([]dto.SmsRenewalLogResp, 0) | ||||||
| 	var count int64 | 	var count int64 | ||||||
|  |  | ||||||
| 	err = s.GetPage(&req, p, &list, &count) | 	err = s.GetPage(&req, p, &list, &count) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("获取短信续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("获取短信续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | 	e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") | ||||||
| @ -66,7 +66,7 @@ func (e SmsRenewalLog) GetPage(c *gin.Context) { | |||||||
| func (e SmsRenewalLog) Get(c *gin.Context) { | func (e SmsRenewalLog) Get(c *gin.Context) { | ||||||
| 	req := dto.SmsRenewalLogGetReq{} | 	req := dto.SmsRenewalLogGetReq{} | ||||||
| 	s := service.SmsRenewalLog{} | 	s := service.SmsRenewalLog{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
| 		MakeOrm(). | 		MakeOrm(). | ||||||
| 		Bind(&req). | 		Bind(&req). | ||||||
| 		MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
| @ -82,10 +82,10 @@ func (e SmsRenewalLog) Get(c *gin.Context) { | |||||||
| 	err = s.Get(&req, p, &object) | 	err = s.Get(&req, p, &object) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("获取短信续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("获取短信续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.OK( object, "查询成功") | 	e.OK(object, "查询成功") | ||||||
| } | } | ||||||
|  |  | ||||||
| // Insert 创建短信续期记录 | // Insert 创建短信续期记录 | ||||||
| @ -99,25 +99,25 @@ func (e SmsRenewalLog) Get(c *gin.Context) { | |||||||
| // @Router /api/v1/sms-renewal-log [post] | // @Router /api/v1/sms-renewal-log [post] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e SmsRenewalLog) Insert(c *gin.Context) { | func (e SmsRenewalLog) Insert(c *gin.Context) { | ||||||
|     req := dto.SmsRenewalLogInsertReq{} | 	req := dto.SmsRenewalLogInsertReq{} | ||||||
|     s := service.SmsRenewalLog{} | 	s := service.SmsRenewalLog{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
| 	// 设置创建人 | 	// 设置创建人 | ||||||
| 	req.SetCreateBy(user.GetUserId(c)) | 	req.SetCreateBy(user.GetUserId(c)) | ||||||
|  |  | ||||||
| 	err = s.Insert(&req) | 	err = s.Insert(&req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("创建短信续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("创建短信续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.OK(req.GetId(), "创建成功") | 	e.OK(req.GetId(), "创建成功") | ||||||
| @ -135,27 +135,27 @@ func (e SmsRenewalLog) Insert(c *gin.Context) { | |||||||
| // @Router /api/v1/sms-renewal-log/{id} [put] | // @Router /api/v1/sms-renewal-log/{id} [put] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e SmsRenewalLog) Update(c *gin.Context) { | func (e SmsRenewalLog) Update(c *gin.Context) { | ||||||
|     req := dto.SmsRenewalLogUpdateReq{} | 	req := dto.SmsRenewalLogUpdateReq{} | ||||||
|     s := service.SmsRenewalLog{} | 	s := service.SmsRenewalLog{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
| 	req.SetUpdateBy(user.GetUserId(c)) | 	req.SetUpdateBy(user.GetUserId(c)) | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
|  |  | ||||||
| 	err = s.Update(&req, p) | 	err = s.Update(&req, p) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("修改短信续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("修改短信续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
| 	e.OK( req.GetId(), "修改成功") | 	e.OK(req.GetId(), "修改成功") | ||||||
| } | } | ||||||
|  |  | ||||||
| // Delete 删除短信续期记录 | // Delete 删除短信续期记录 | ||||||
| @ -167,18 +167,18 @@ func (e SmsRenewalLog) Update(c *gin.Context) { | |||||||
| // @Router /api/v1/sms-renewal-log [delete] | // @Router /api/v1/sms-renewal-log [delete] | ||||||
| // @Security Bearer | // @Security Bearer | ||||||
| func (e SmsRenewalLog) Delete(c *gin.Context) { | func (e SmsRenewalLog) Delete(c *gin.Context) { | ||||||
|     s := service.SmsRenewalLog{} | 	s := service.SmsRenewalLog{} | ||||||
|     req := dto.SmsRenewalLogDeleteReq{} | 	req := dto.SmsRenewalLogDeleteReq{} | ||||||
|     err := e.MakeContext(c). | 	err := e.MakeContext(c). | ||||||
|         MakeOrm(). | 		MakeOrm(). | ||||||
|         Bind(&req). | 		Bind(&req). | ||||||
|         MakeService(&s.Service). | 		MakeService(&s.Service). | ||||||
|         Errors | 		Errors | ||||||
|     if err != nil { | 	if err != nil { | ||||||
|         e.Logger.Error(err) | 		e.Logger.Error(err) | ||||||
|         e.Error(500, err, err.Error()) | 		e.Error(500, err, err.Error()) | ||||||
|         return | 		return | ||||||
|     } | 	} | ||||||
|  |  | ||||||
| 	// req.SetUpdateBy(user.GetUserId(c)) | 	// req.SetUpdateBy(user.GetUserId(c)) | ||||||
| 	p := actions.GetPermissionFromContext(c) | 	p := actions.GetPermissionFromContext(c) | ||||||
| @ -186,7 +186,7 @@ func (e SmsRenewalLog) Delete(c *gin.Context) { | |||||||
| 	err = s.Remove(&req, p) | 	err = s.Remove(&req, p) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Error(500, err, fmt.Sprintf("删除短信续期记录失败,\r\n失败信息 %s", err.Error())) | 		e.Error(500, err, fmt.Sprintf("删除短信续期记录失败,\r\n失败信息 %s", err.Error())) | ||||||
|         return | 		return | ||||||
| 	} | 	} | ||||||
| 	e.OK( req.GetId(), "删除成功") | 	e.OK(req.GetId(), "删除成功") | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,23 +1,26 @@ | |||||||
| package models | package models | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  |  | ||||||
| 	"go-admin/common/models" | 	"go-admin/common/models" | ||||||
|  | 	"time" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type SmsAbnormalNumber struct { | type SmsAbnormalNumber struct { | ||||||
|     models.Model | 	models.Model | ||||||
|      |  | ||||||
|     Account string `json:"account" gorm:"type:varchar(255);comment:账号"`  | 	Account      string    `json:"account" gorm:"type:varchar(255);comment:账号"` | ||||||
|     PlatformCode string `json:"platformCode" gorm:"type:varchar(20);comment:平台code"`  | 	PlatformCode string    `json:"platformCode" gorm:"type:varchar(20);comment:平台code"` | ||||||
|     Phone string `json:"phone" gorm:"type:varchar(30);comment:电话号码"`  | 	ApiKey       string    `json:"apiKey" gorm:"type:varchar(255);comment:api key"` | ||||||
|     models.ModelTime | 	Phone        string    `json:"phone" gorm:"type:varchar(30);comment:电话号码"` | ||||||
|     models.ControlBy | 	ActivationId string    `json:"activationId" gorm:"type:varchar(255);comment:激活id"` | ||||||
|  | 	ReceivedTime time.Time `json:"receivedTime" gorm:"type:datetime;comment:接收号码时间"` | ||||||
|  | 	Reused       int       `json:"reused" gorm:"type:tinyint(1);default:2;comment:是否重用 1-是 2-否"` | ||||||
|  | 	models.ModelTime | ||||||
|  | 	models.ControlBy | ||||||
| } | } | ||||||
|  |  | ||||||
| func (SmsAbnormalNumber) TableName() string { | func (SmsAbnormalNumber) TableName() string { | ||||||
|     return "sms_abnormal_number" | 	return "sms_abnormal_number" | ||||||
| } | } | ||||||
|  |  | ||||||
| func (e *SmsAbnormalNumber) Generate() models.ActiveRecord { | func (e *SmsAbnormalNumber) Generate() models.ActiveRecord { | ||||||
| @ -27,4 +30,4 @@ func (e *SmsAbnormalNumber) Generate() models.ActiveRecord { | |||||||
|  |  | ||||||
| func (e *SmsAbnormalNumber) GetId() interface{} { | func (e *SmsAbnormalNumber) GetId() interface{} { | ||||||
| 	return e.Id | 	return e.Id | ||||||
| } | } | ||||||
|  | |||||||
| @ -12,11 +12,14 @@ type SmsRenewalLog struct { | |||||||
| 	models.Model | 	models.Model | ||||||
|  |  | ||||||
| 	PhoneId    int             `json:"phoneId" gorm:"type:bigint;comment:号码id"` | 	PhoneId    int             `json:"phoneId" gorm:"type:bigint;comment:号码id"` | ||||||
|  | 	Phone      string          `json:"phone" gorm:"type:varchar(50);comment:号码"` | ||||||
| 	Type       int             `json:"type" gorm:"type:tinyint;comment:类型 0-长效 1-短效"` | 	Type       int             `json:"type" gorm:"type:tinyint;comment:类型 0-长效 1-短效"` | ||||||
|  | 	Category   int             `json:"category" gorm:"type:tinyint;comment:类别 1-购买号码 2-续费号码"` | ||||||
| 	UserId     int             `json:"userId" gorm:"type:bigint;comment:用户id"` | 	UserId     int             `json:"userId" gorm:"type:bigint;comment:用户id"` | ||||||
| 	Amount     decimal.Decimal `json:"amount" gorm:"type:decimal(10,2);comment:扣费金额"` | 	Amount     decimal.Decimal `json:"amount" gorm:"type:decimal(10,2);comment:扣费金额"` | ||||||
| 	BeforeTime time.Time       `json:"beforeTime" gorm:"type:datetime;comment:续费前过期时间"` | 	BeforeTime time.Time       `json:"beforeTime" gorm:"type:datetime;comment:续费前过期时间"` | ||||||
| 	Period     int             `json:"period" gorm:"type:int;comment:时间段"` | 	Period     int             `json:"period" gorm:"type:int;comment:时间段"` | ||||||
|  | 	Username   string          `json:"username" gorm:"->"` | ||||||
| 	models.ModelTime | 	models.ModelTime | ||||||
| 	models.ControlBy | 	models.ControlBy | ||||||
| } | } | ||||||
|  | |||||||
| @ -16,14 +16,22 @@ func init() { | |||||||
| // registerSmsAbnormalNumberRouter | // registerSmsAbnormalNumberRouter | ||||||
| func registerSmsAbnormalNumberRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | func registerSmsAbnormalNumberRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { | ||||||
| 	api := apis.SmsAbnormalNumber{} | 	api := apis.SmsAbnormalNumber{} | ||||||
| 	r := v1.Group("/sms-abnormal-number").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) | 	r := v1.Group("/sms-abnormal-number"). | ||||||
|  | 		Use(authMiddleware.MiddlewareFunc()). | ||||||
|  | 		Use(middleware.AuthCheckRole()) | ||||||
| 	{ | 	{ | ||||||
| 		r.GET("", actions.PermissionAction(), api.GetPage) | 		r.GET("", actions.PermissionAction(), api.GetPage) | ||||||
| 		r.GET("/:id", actions.PermissionAction(), api.Get) | 		r.GET("/:id", actions.PermissionAction(), api.Get) | ||||||
| 		r.POST("", api.Insert) | 		r.POST("", api.Insert) | ||||||
| 		r.PUT("/:id", actions.PermissionAction(), api.Update) | 		r.PUT("/:id", actions.PermissionAction(), api.Update) | ||||||
| 		r.DELETE("", api.Delete) | 		r.DELETE("", api.Delete) | ||||||
|  | 		r.DELETE("clear", actions.PermissionAction(), api.Clean) | ||||||
|  | 		r.PUT("/batch-cancel", actions.PermissionAction(), api.BatchCancel) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 		r.POST("/sync-state", api.SyncState) //同步差异 | 	r1 := v1.Group("/sms-abnormal-number") | ||||||
|  | 	{ | ||||||
|  | 		r1.POST("/sync-state", api.SyncState)     //同步差异 | ||||||
|  | 		r1.PUT("/reuse", api.ReUseAbnormalNumber) //重用号码 | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -45,6 +45,7 @@ func registerSmsPhoneRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddl | |||||||
| 		r.GET("/:id", actions.PermissionAction(), api.Get) | 		r.GET("/:id", actions.PermissionAction(), api.Get) | ||||||
| 		r.POST("", api.Insert) | 		r.POST("", api.Insert) | ||||||
| 		r.PUT("/:id", actions.PermissionAction(), api.Update) | 		r.PUT("/:id", actions.PermissionAction(), api.Update) | ||||||
|  | 		r.PUT("/manual-renewal", api.ManualRenewal) | ||||||
| 		r.DELETE("", api.Delete) | 		r.DELETE("", api.Delete) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | |||||||
| @ -221,3 +221,18 @@ type OpenWakeUpReq struct { | |||||||
| 	PlatformCode string `json:"platformCode" comment:"短信平台"` | 	PlatformCode string `json:"platformCode" comment:"短信平台"` | ||||||
| 	ActivationId string `json:"activationId" comment:"平台id"` | 	ActivationId string `json:"activationId" comment:"平台id"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type ReUseAbnormalNumberReq struct { | ||||||
|  | 	BeginTime    int64  `json:"beginTime" comment:"开始时间"` | ||||||
|  | 	PlatformCode string `json:"platformCode" comment:"短信平台"` | ||||||
|  | 	ServiceCode  string `json:"serviceCode" comment:"服务code"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 批量取消 | ||||||
|  | type BatchCancelAbnormalNumberReq struct { | ||||||
|  | 	Ids []int `json:"ids" comment:"短信号码id"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type ManualRenewalReq struct { | ||||||
|  | 	ActivationIds []string `json:"activationIds" comment:"激活码id"` | ||||||
|  | } | ||||||
|  | |||||||
| @ -12,7 +12,9 @@ import ( | |||||||
|  |  | ||||||
| type SmsRenewalLogGetPageReq struct { | type SmsRenewalLogGetPageReq struct { | ||||||
| 	dto.Pagination `search:"-"` | 	dto.Pagination `search:"-"` | ||||||
| 	Type           int64 `form:"type"  search:"type:exact;column:type;table:sms_renewal_log" comment:"类型 0-长效 1-短效"` | 	Type           int64  `form:"type"  search:"type:exact;column:type;table:sms_renewal_log" comment:"类型 0-长效 1-短效"` | ||||||
|  | 	Category       int    `form:"category"  search:"type:exact;column:category;table:sms_renewal_log" comment:"类别 0-普通续费 1-号码补偿"` | ||||||
|  | 	UserName       string `form:"userName" search:"-"` | ||||||
| 	SmsRenewalLogOrder | 	SmsRenewalLogOrder | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -108,3 +110,19 @@ type SmsRenewalLogDeleteReq struct { | |||||||
| func (s *SmsRenewalLogDeleteReq) GetId() interface{} { | func (s *SmsRenewalLogDeleteReq) GetId() interface{} { | ||||||
| 	return s.Ids | 	return s.Ids | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type SmsRenewalLogResp struct { | ||||||
|  | 	Id         int             `json:"id" comment:"主键id"` // 主键id | ||||||
|  | 	PhoneId    int             `json:"phoneId" comment:"号码id"` | ||||||
|  | 	Phone      string          `json:"phone" comment:"电话号码"` | ||||||
|  | 	Type       int             `json:"type" comment:"类型 0-长效 1-短效"` | ||||||
|  | 	Category   int             `json:"category" comment:"类别 1-购买 2-续期"` | ||||||
|  | 	UserId     int             `json:"userId" comment:"用户id"` | ||||||
|  | 	Amount     decimal.Decimal `json:"amount" comment:"扣费金额"` | ||||||
|  | 	BeforeTime time.Time       `json:"beforeTime" comment:"续费前过期时间"` | ||||||
|  | 	Period     int             `json:"period" comment:"时间(天)"` | ||||||
|  | 	CreatedAt  time.Time       `json:"createdAt" comment:"创建时间"` | ||||||
|  | 	// UpdatedAt  time.Time       `json:"updatedAt" comment:"更新时间"` | ||||||
|  | 	// DeletedAt  time.Time       `json:"deletedAt" comment:"删除时间"` | ||||||
|  | 	UserName string `json:"username" comment:"用户名"` | ||||||
|  | } | ||||||
|  | |||||||
| @ -131,6 +131,7 @@ type VerificationDTO struct { | |||||||
| 	Reuse       ReuseInfo        `json:"reuse"` | 	Reuse       ReuseInfo        `json:"reuse"` | ||||||
| 	Sale        TextVerifiedResp `json:"sale"` | 	Sale        TextVerifiedResp `json:"sale"` | ||||||
| 	ServiceName string           `json:"serviceName"` | 	ServiceName string           `json:"serviceName"` | ||||||
|  | 	ApiKey      string           `json:"apiKey"` | ||||||
| 	// State 表示验证或服务的当前状态。 | 	// State 表示验证或服务的当前状态。 | ||||||
| 	// 状态是以下枚举值之一,代表了从创建到完成或取消的生命周期: | 	// 状态是以下枚举值之一,代表了从创建到完成或取消的生命周期: | ||||||
| 	// * verificationPending: 正在等待验证码。 | 	// * verificationPending: 正在等待验证码。 | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ import ( | |||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/go-admin-team/go-admin-core/sdk/service" | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
|  | 	"github.com/shopspring/decimal" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
| @ -12,12 +13,193 @@ import ( | |||||||
| 	"go-admin/common/actions" | 	"go-admin/common/actions" | ||||||
| 	cDto "go-admin/common/dto" | 	cDto "go-admin/common/dto" | ||||||
| 	"go-admin/common/global" | 	"go-admin/common/global" | ||||||
|  | 	"go-admin/common/statuscode" | ||||||
|  | 	"go-admin/utils/utility" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type SmsAbnormalNumber struct { | type SmsAbnormalNumber struct { | ||||||
| 	service.Service | 	service.Service | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (e *SmsAbnormalNumber) Clean() error { | ||||||
|  | 	if err := e.Orm.Exec("truncate table sms_abnormal_number").Error; err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 批量取消 | ||||||
|  | func (e *SmsAbnormalNumber) BatchCancel(req *dto.BatchCancelAbnormalNumberReq) error { | ||||||
|  | 	var datas []models.SmsAbnormalNumber | ||||||
|  |  | ||||||
|  | 	if err := e.Orm.Model(&models.SmsAbnormalNumber{}).Where("id in ?", req.Ids).Find(&datas).Error; err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	utility.SafeGo(func() { | ||||||
|  | 		CancelFunc(e, datas) | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func CancelFunc(e *SmsAbnormalNumber, datas []models.SmsAbnormalNumber) { | ||||||
|  | 	phoneService := SmsPhone{Service: e.Service} | ||||||
|  | 	for _, item := range datas { | ||||||
|  | 		phoneService.ChangeAutoRenewManage(item.PlatformCode, item.ApiKey, item.ActivationId, false) | ||||||
|  |  | ||||||
|  | 		time.Sleep(200 * time.Millisecond) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 重用号码 | ||||||
|  | func (e *SmsAbnormalNumber) ReUseAbnormalNumber(userId int, req *dto.ReUseAbnormalNumberReq) (dto.OpenGetNumberResp, int) { | ||||||
|  | 	resp := dto.OpenGetNumberResp{} | ||||||
|  | 	balanceService := MemberBalance{Service: e.Service} | ||||||
|  | 	config := dto.GetSysConfigByKEYForServiceResp{} | ||||||
|  | 	configReq := dto.SysConfigByKeyReq{} | ||||||
|  | 	configService := SysConfig{Service: e.Service} | ||||||
|  | 	smsServices := SmsServices{Service: e.Service} | ||||||
|  | 	var price decimal.Decimal | ||||||
|  | 	serviceItem, err := smsServices.GetByCode(req.PlatformCode, req.ServiceCode) | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("短信服务报错:%v", err) | ||||||
|  | 		return resp, statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if serviceItem.Code == "" { | ||||||
|  | 		e.Log.Error("短信服务不存在") | ||||||
|  | 		return resp, statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	switch { | ||||||
|  | 	case req.PlatformCode == global.SmsPlatformDaisysms: | ||||||
|  | 		price = serviceItem.LongPrice | ||||||
|  | 		configReq.ConfigKey = "long_number_premium_daisysms" | ||||||
|  | 	case req.PlatformCode == global.SmsPlatformTextVerified: | ||||||
|  | 		price = serviceItem.LongPrice | ||||||
|  | 		configReq.ConfigKey = "long_number_premium_textverified" | ||||||
|  | 	} | ||||||
|  | 	err = configService.GetWithKey(&configReq, &config) | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		return resp, statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if config.ConfigValue == "" { | ||||||
|  | 		e.Log.Errorf("短期长期租赁浮动百分比不能为空") | ||||||
|  | 		return resp, statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	percent, err := decimal.NewFromString(config.ConfigValue) | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("短期或长期租赁费用格式错误") | ||||||
|  | 		return resp, statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	price = price.Mul(decimal.NewFromInt(100).Add(percent)).Div(decimal.NewFromInt(100)) | ||||||
|  |  | ||||||
|  | 	if price.Cmp(decimal.Zero) <= 0 { | ||||||
|  | 		e.Log.Errorf("短期或长期租赁费用不能小于等于0") | ||||||
|  | 		return resp, statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	balance := balanceService.GetBalance(userId) | ||||||
|  |  | ||||||
|  | 	if balance.LessThan(price) { | ||||||
|  | 		e.Log.Error("余额不足") | ||||||
|  | 		return resp, statuscode.BalanceNotEnough | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	abnomarlNumber, err := e.GetReused(req.PlatformCode, req.BeginTime) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return resp, statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	expireTime := abnomarlNumber.ReceivedTime.AddDate(0, 0, 30) | ||||||
|  | 	startTime := time.Now() | ||||||
|  | 	endTime := startTime | ||||||
|  | 	smsPhone := models.SmsPhone{} | ||||||
|  | 	smsPhone.PlatformCode = req.PlatformCode | ||||||
|  | 	smsPhone.Phone = abnomarlNumber.Phone | ||||||
|  | 	smsPhone.UserId = userId | ||||||
|  | 	smsPhone.Service = serviceItem.Name | ||||||
|  | 	smsPhone.ServiceCode = req.ServiceCode | ||||||
|  | 	smsPhone.Type = 1 | ||||||
|  | 	smsPhone.Period = 1 | ||||||
|  | 	smsPhone.ActivationId = abnomarlNumber.ActivationId | ||||||
|  | 	smsPhone.MessageId = abnomarlNumber.ActivationId | ||||||
|  | 	smsPhone.NewActivationId = abnomarlNumber.ActivationId | ||||||
|  | 	smsPhone.Actived = 1 | ||||||
|  | 	smsPhone.StartTime = &startTime | ||||||
|  | 	smsPhone.EndTime = &endTime | ||||||
|  | 	// smsPhone.ApiKey = apiInfo.ApiKey | ||||||
|  |  | ||||||
|  | 	smsPhone.Price = price | ||||||
|  | 	smsPhone.ExpireTime = &expireTime | ||||||
|  |  | ||||||
|  | 	//平台不允许取消 | ||||||
|  | 	if req.PlatformCode == global.SmsPlatformTextVerified { | ||||||
|  | 		smsPhone.Actived = 2 | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	smsPhone.Status = 1 | ||||||
|  |  | ||||||
|  | 	err = e.Orm.Transaction(func(tx *gorm.DB) error { | ||||||
|  | 		if err1 := tx.Save(&smsPhone).Error; err1 != nil { | ||||||
|  | 			e.Log.Errorf("获取手机号失败", err1) | ||||||
|  | 			return err1 | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if err1 := tx.Exec("UPDATE member_balance SET balance = balance -? WHERE user_id =?", price, userId).Error; err1 != nil { | ||||||
|  | 			e.Log.Errorf("更新余额失败", err1) | ||||||
|  | 			return err1 | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return nil | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		return resp, statuscode.ServerError | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	resp.ActivationId = smsPhone.NewActivationId | ||||||
|  | 	resp.ExpireTime = smsPhone.ExpireTime | ||||||
|  | 	resp.Number = smsPhone.Phone | ||||||
|  | 	resp.StartTime = smsPhone.StartTime | ||||||
|  | 	resp.EndTime = smsPhone.EndTime | ||||||
|  |  | ||||||
|  | 	return resp, statuscode.Success | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 获取重用 | ||||||
|  | func (e *SmsAbnormalNumber) GetReused(platformCode string, beginTime int64) (models.SmsAbnormalNumber, error) { | ||||||
|  | 	var smsAbnormalNumber models.SmsAbnormalNumber | ||||||
|  | 	query := e.Orm.Model(&smsAbnormalNumber). | ||||||
|  | 		Where("platform_code = ? AND reused = ?", platformCode, 2) | ||||||
|  |  | ||||||
|  | 	if beginTime > 0 { | ||||||
|  | 		query.Where("received_time >= ?", time.Unix(beginTime, 0)) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err := query.Order("received_time asc").First(&smsAbnormalNumber).Error | ||||||
|  | 	if err != nil { | ||||||
|  | 		e.Log.Errorf("SmsAbnormalNumberService GetReused error:%s \r\n", err) | ||||||
|  | 		return smsAbnormalNumber, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err := e.Orm.Model(&models.SmsAbnormalNumber{}). | ||||||
|  | 		Where("id = ?", smsAbnormalNumber.Id). | ||||||
|  | 		Update("reused", 1).Error; err != nil { | ||||||
|  | 		e.Log.Errorf("SmsAbnormalNumberService GetReused error:%s \r\n", err) | ||||||
|  | 		return smsAbnormalNumber, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return smsAbnormalNumber, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // GetPage 获取SmsAbnormalNumber列表 | // GetPage 获取SmsAbnormalNumber列表 | ||||||
| func (e *SmsAbnormalNumber) GetPage(c *dto.SmsAbnormalNumberGetPageReq, p *actions.DataPermission, list *[]models.SmsAbnormalNumber, count *int64) error { | func (e *SmsAbnormalNumber) GetPage(c *dto.SmsAbnormalNumberGetPageReq, p *actions.DataPermission, list *[]models.SmsAbnormalNumber, count *int64) error { | ||||||
| 	var err error | 	var err error | ||||||
| @ -151,7 +333,6 @@ func (e *SmsAbnormalNumber) SyncState() error { | |||||||
|  |  | ||||||
| 				return nil | 				return nil | ||||||
| 			}) | 			}) | ||||||
|  |  | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				e.Log.Errorf("同步后保存差异数据失败 %v", err) | 				e.Log.Errorf("同步后保存差异数据失败 %v", err) | ||||||
| 			} | 			} | ||||||
| @ -187,6 +368,9 @@ func (e *SmsAbnormalNumber) findMissingNumbers(platformNumbers map[string][]dto. | |||||||
| 					PlatformCode: global.SmsPlatformTextVerified, | 					PlatformCode: global.SmsPlatformTextVerified, | ||||||
| 					Account:      account, | 					Account:      account, | ||||||
| 					Phone:        v.Number, | 					Phone:        v.Number, | ||||||
|  | 					ActivationId: v.ID, | ||||||
|  | 					ReceivedTime: v.CreatedAt, | ||||||
|  | 					ApiKey:       v.ApiKey, | ||||||
| 				}) | 				}) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -83,6 +83,11 @@ func (e *SmsPhone) CancelNumber(req *dto.SmsPhoneCancelNumberReq, userId int) in | |||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				e.Log.Errorf("取消租赁后修改失败, %s", err) | 				e.Log.Errorf("取消租赁后修改失败, %s", err) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			if err1 := e.Orm. | ||||||
|  | 				Where("phone_id = ?", data.Id).Delete(&models.SmsRenewalLog{}).Error; err1 != nil { | ||||||
|  | 				e.Log.Errorf("更新短信号码续费日志失败, %s", err1) | ||||||
|  | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			e.Log.Errorf("取消租赁失败, %s", code) | 			e.Log.Errorf("取消租赁失败, %s", code) | ||||||
| 			return code | 			return code | ||||||
| @ -203,7 +208,7 @@ func (e *SmsPhone) WeakUpManage(req *models.SmsPhone, apiInfo *dto.SmsPlatformKe | |||||||
| 		return strconv.Itoa(id), "", nil, nil, code | 		return strconv.Itoa(id), "", nil, nil, code | ||||||
| 	case global.SmsPlatformTextVerified: | 	case global.SmsPlatformTextVerified: | ||||||
| 		service := SmsTextVerified{Service: e.Service} | 		service := SmsTextVerified{Service: e.Service} | ||||||
| 		resp, code := service.getExtraActivation(req.NewActivationId, apiInfo) | 		resp, code := service.getExtraActivation(req.NewActivationId, apiInfo, 0) | ||||||
| 		return resp.ReservationId, resp.Id, resp.UsageWindowStart, resp.UsageWindowEnd, code | 		return resp.ReservationId, resp.Id, resp.UsageWindowStart, resp.UsageWindowEnd, code | ||||||
| 	default: | 	default: | ||||||
| 		return "", "", nil, nil, statuscode.SmsPlatformUnavailable | 		return "", "", nil, nil, statuscode.SmsPlatformUnavailable | ||||||
| @ -393,6 +398,20 @@ func (e *SmsPhone) DoGetNumber(balanceService *MemberBalance, req *dto.GetNumber | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	log := models.SmsRenewalLog{} | ||||||
|  | 	log.PhoneId = smsPhone.Id | ||||||
|  | 	log.Phone = smsPhone.Phone | ||||||
|  | 	log.Type = smsPhone.Type | ||||||
|  | 	log.Category = 1 | ||||||
|  | 	log.UserId = userId | ||||||
|  | 	log.Amount = price | ||||||
|  | 	log.BeforeTime = time.Now() | ||||||
|  | 	log.Period = req.Period * 30 | ||||||
|  |  | ||||||
|  | 	if err := e.Orm.Save(&log).Error; err != nil { | ||||||
|  | 		e.Log.Errorf("保存短信续费日志失败,phone_id:%d, %s", smsPhone.Id, err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return balance, smsPhone, statuscode.Success | 	return balance, smsPhone, statuscode.Success | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -594,6 +613,39 @@ func (e *SmsPhone) AutoRenewal() error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // 手动续费 | ||||||
|  | func (e *SmsPhone) ManualRenewal(activationIds []string) ([]string, error) { | ||||||
|  | 	if len(activationIds) == 0 { | ||||||
|  | 		return nil, errors.New("activationIds 不能为空") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var errorIds []string | ||||||
|  | 	var expiredPhones []models.SmsPhone | ||||||
|  |  | ||||||
|  | 	// 查询所有到期号码 | ||||||
|  | 	if err := e.Orm.Model(&models.SmsPhone{}). | ||||||
|  | 		Where("activation_id IN ? and expire_time < ?", activationIds, time.Now()). | ||||||
|  | 		Find(&expiredPhones).Error; err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 获取服务配置映射 | ||||||
|  | 	serviceMap, premiumMap, err := e.getRenewalConfigs() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// 处理每个到期号码 | ||||||
|  | 	for _, phone := range expiredPhones { | ||||||
|  | 		if err := e.processPhoneRenewal(phone, serviceMap, premiumMap); err != nil { | ||||||
|  | 			e.Log.Errorf("处理号码续费失败 [PhoneID: %d]: %v", phone.Id, err) | ||||||
|  | 			errorIds = append(errorIds, fmt.Sprintf("处理号码续费失败 [PhoneID: %d]: %v", phone.Id, err)) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return errorIds, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // getExpiredPhones 获取即将到期的自动续费号码 | // getExpiredPhones 获取即将到期的自动续费号码 | ||||||
| func (e *SmsPhone) getExpiredPhones() ([]models.SmsPhone, error) { | func (e *SmsPhone) getExpiredPhones() ([]models.SmsPhone, error) { | ||||||
| 	var phones []models.SmsPhone | 	var phones []models.SmsPhone | ||||||
| @ -667,6 +719,8 @@ func (e *SmsPhone) calculateRenewalPrice(basePrice decimal.Decimal, platformCode | |||||||
| func (e *SmsPhone) createRenewalLog(phone models.SmsPhone, amount decimal.Decimal) models.SmsRenewalLog { | func (e *SmsPhone) createRenewalLog(phone models.SmsPhone, amount decimal.Decimal) models.SmsRenewalLog { | ||||||
| 	return models.SmsRenewalLog{ | 	return models.SmsRenewalLog{ | ||||||
| 		UserId:     phone.UserId, | 		UserId:     phone.UserId, | ||||||
|  | 		Phone:      phone.Phone, | ||||||
|  | 		Category:   2, | ||||||
| 		PhoneId:    phone.Id, | 		PhoneId:    phone.Id, | ||||||
| 		Type:       phone.Type, | 		Type:       phone.Type, | ||||||
| 		Amount:     amount, | 		Amount:     amount, | ||||||
| @ -707,8 +761,7 @@ func (e *SmsPhone) executeRenewalTransaction(phone models.SmsPhone, price decima | |||||||
| 		return nil | 		return nil | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	if err.Error() == "余额不足" { | 	if err != nil && err.Error() == "余额不足" { | ||||||
|  |  | ||||||
| 		return e.handleInsufficientBalance(phone) | 		return e.handleInsufficientBalance(phone) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ package service | |||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
|  |  | ||||||
|     "github.com/go-admin-team/go-admin-core/sdk/service" | 	"github.com/go-admin-team/go-admin-core/sdk/service" | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
|  |  | ||||||
| 	"go-admin/app/admin/models" | 	"go-admin/app/admin/models" | ||||||
| @ -17,22 +17,42 @@ type SmsRenewalLog struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // GetPage 获取SmsRenewalLog列表 | // GetPage 获取SmsRenewalLog列表 | ||||||
| func (e *SmsRenewalLog) GetPage(c *dto.SmsRenewalLogGetPageReq, p *actions.DataPermission, list *[]models.SmsRenewalLog, count *int64) error { | func (e *SmsRenewalLog) GetPage(c *dto.SmsRenewalLogGetPageReq, p *actions.DataPermission, list *[]dto.SmsRenewalLogResp, count *int64) error { | ||||||
| 	var err error | 	var err error | ||||||
| 	var data models.SmsRenewalLog | 	var data models.SmsRenewalLog | ||||||
|  | 	var datas []models.SmsRenewalLog | ||||||
| 	err = e.Orm.Model(&data). | 	query := e.Orm.Model(&data). | ||||||
|  | 		Joins("left join sys_user on sys_user.user_id = sms_renewal_log.user_id"). | ||||||
| 		Scopes( | 		Scopes( | ||||||
| 			cDto.MakeCondition(c.GetNeedSearch()), | 			cDto.MakeCondition(c.GetNeedSearch()), | ||||||
| 			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), | 			cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), | ||||||
| 			actions.Permission(data.TableName(), p), | 			actions.Permission(data.TableName(), p), | ||||||
| 		). | 		) | ||||||
| 		Find(list).Limit(-1).Offset(-1). |  | ||||||
|  | 	if c.UserName != "" { | ||||||
|  | 		query = query.Where("sys_user.username LIKE ?", "%"+c.UserName+"%") | ||||||
|  | 	} | ||||||
|  | 	err = query.Select("sms_renewal_log.*, sys_user.username").Find(&datas).Limit(-1).Offset(-1). | ||||||
| 		Count(count).Error | 		Count(count).Error | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Log.Errorf("SmsRenewalLogService GetPage error:%s \r\n", err) | 		e.Log.Errorf("SmsRenewalLogService GetPage error:%s \r\n", err) | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	for _, v := range datas { | ||||||
|  | 		*list = append(*list, dto.SmsRenewalLogResp{ | ||||||
|  | 			Id:         v.Id, | ||||||
|  | 			UserId:     v.UserId, | ||||||
|  | 			Category:   v.Category, | ||||||
|  | 			Phone:      v.Phone, | ||||||
|  | 			Amount:     v.Amount, | ||||||
|  | 			BeforeTime: v.BeforeTime, | ||||||
|  | 			Period:     v.Period, | ||||||
|  | 			CreatedAt:  v.CreatedAt, | ||||||
|  | 			UserName:   v.Username, | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -59,9 +79,9 @@ func (e *SmsRenewalLog) Get(d *dto.SmsRenewalLogGetReq, p *actions.DataPermissio | |||||||
|  |  | ||||||
| // Insert 创建SmsRenewalLog对象 | // Insert 创建SmsRenewalLog对象 | ||||||
| func (e *SmsRenewalLog) Insert(c *dto.SmsRenewalLogInsertReq) error { | func (e *SmsRenewalLog) Insert(c *dto.SmsRenewalLogInsertReq) error { | ||||||
|     var err error | 	var err error | ||||||
|     var data models.SmsRenewalLog | 	var data models.SmsRenewalLog | ||||||
|     c.Generate(&data) | 	c.Generate(&data) | ||||||
| 	err = e.Orm.Create(&data).Error | 	err = e.Orm.Create(&data).Error | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Log.Errorf("SmsRenewalLogService Insert error:%s \r\n", err) | 		e.Log.Errorf("SmsRenewalLogService Insert error:%s \r\n", err) | ||||||
| @ -72,22 +92,22 @@ func (e *SmsRenewalLog) Insert(c *dto.SmsRenewalLogInsertReq) error { | |||||||
|  |  | ||||||
| // Update 修改SmsRenewalLog对象 | // Update 修改SmsRenewalLog对象 | ||||||
| func (e *SmsRenewalLog) Update(c *dto.SmsRenewalLogUpdateReq, p *actions.DataPermission) error { | func (e *SmsRenewalLog) Update(c *dto.SmsRenewalLogUpdateReq, p *actions.DataPermission) error { | ||||||
|     var err error | 	var err error | ||||||
|     var data = models.SmsRenewalLog{} | 	var data = models.SmsRenewalLog{} | ||||||
|     e.Orm.Scopes( | 	e.Orm.Scopes( | ||||||
|             actions.Permission(data.TableName(), p), | 		actions.Permission(data.TableName(), p), | ||||||
|         ).First(&data, c.GetId()) | 	).First(&data, c.GetId()) | ||||||
|     c.Generate(&data) | 	c.Generate(&data) | ||||||
|  |  | ||||||
|     db := e.Orm.Save(&data) | 	db := e.Orm.Save(&data) | ||||||
|     if err = db.Error; err != nil { | 	if err = db.Error; err != nil { | ||||||
|         e.Log.Errorf("SmsRenewalLogService Save error:%s \r\n", err) | 		e.Log.Errorf("SmsRenewalLogService Save error:%s \r\n", err) | ||||||
|         return err | 		return err | ||||||
|     } | 	} | ||||||
|     if db.RowsAffected == 0 { | 	if db.RowsAffected == 0 { | ||||||
|         return errors.New("无权更新该数据") | 		return errors.New("无权更新该数据") | ||||||
|     } | 	} | ||||||
|     return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Remove 删除SmsRenewalLog | // Remove 删除SmsRenewalLog | ||||||
| @ -99,11 +119,11 @@ func (e *SmsRenewalLog) Remove(d *dto.SmsRenewalLogDeleteReq, p *actions.DataPer | |||||||
| 			actions.Permission(data.TableName(), p), | 			actions.Permission(data.TableName(), p), | ||||||
| 		).Delete(&data, d.GetId()) | 		).Delete(&data, d.GetId()) | ||||||
| 	if err := db.Error; err != nil { | 	if err := db.Error; err != nil { | ||||||
|         e.Log.Errorf("Service RemoveSmsRenewalLog error:%s \r\n", err) | 		e.Log.Errorf("Service RemoveSmsRenewalLog error:%s \r\n", err) | ||||||
|         return err | 		return err | ||||||
|     } | 	} | ||||||
|     if db.RowsAffected == 0 { | 	if db.RowsAffected == 0 { | ||||||
|         return errors.New("无权删除该数据") | 		return errors.New("无权删除该数据") | ||||||
|     } | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | |||||||
| @ -372,16 +372,19 @@ func (e *SmsTextVerified) GetNumberAndWakeUp(tye int, serviceCode string, price | |||||||
| 		return resp, code | 		return resp, code | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	wakeUpResp, code := e.getExtraActivation(resp.Id, apiInfo) | 	wakeUpResp, code := e.getExtraActivation(resp.Id, apiInfo, 0) | ||||||
|  |  | ||||||
| 	if code != statuscode.Success { | 	if code != statuscode.Success { | ||||||
| 		return resp, code | 		//唤醒失败不退出 | ||||||
|  | 		now := time.Now() | ||||||
|  | 		resp.StartTime = &now | ||||||
|  | 		resp.EndTime = &now | ||||||
|  | 	} else { | ||||||
|  | 		resp.MessageId = wakeUpResp.Id | ||||||
|  | 		resp.StartTime = wakeUpResp.UsageWindowStart | ||||||
|  | 		resp.EndTime = wakeUpResp.UsageWindowEnd | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	resp.MessageId = wakeUpResp.Id |  | ||||||
| 	resp.StartTime = wakeUpResp.UsageWindowStart |  | ||||||
| 	resp.EndTime = wakeUpResp.UsageWindowEnd |  | ||||||
|  |  | ||||||
| 	return resp, code | 	return resp, code | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -579,7 +582,7 @@ func (e *SmsTextVerified) GetRentalDetail(id string, apiInfo *dto.SmsPlatformKey | |||||||
|  |  | ||||||
| // 唤醒号码 | // 唤醒号码 | ||||||
| // returns activationId,messageId,startTime(可用开始时间),endTime(可用结束时间), code, | // returns activationId,messageId,startTime(可用开始时间),endTime(可用结束时间), code, | ||||||
| func (e SmsTextVerified) getExtraActivation(id string, apiInfo *dto.SmsPlatformKeyQueueDto) (dto.TextVerifiedWakeUpResp, int) { | func (e SmsTextVerified) getExtraActivation(id string, apiInfo *dto.SmsPlatformKeyQueueDto, retry int) (dto.TextVerifiedWakeUpResp, int) { | ||||||
| 	client, code := e.GetTextVerifiedAuthClient(apiInfo) | 	client, code := e.GetTextVerifiedAuthClient(apiInfo) | ||||||
| 	result := dto.TextVerifiedWakeUpResp{} | 	result := dto.TextVerifiedWakeUpResp{} | ||||||
|  |  | ||||||
| @ -598,8 +601,13 @@ func (e SmsTextVerified) getExtraActivation(id string, apiInfo *dto.SmsPlatformK | |||||||
| 	status, err := client.Post(wakeUp, req, headers, &resp) | 	status, err := client.Post(wakeUp, req, headers, &resp) | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		e.Log.Errorf("唤醒号码失败 id:%s error: %v", id, err) | 		if strings.Contains(err.Error(), "Line is currently busy. Please try this line again later") && retry < 3 { | ||||||
| 		return result, statuscode.ServerError | 			time.Sleep(300 * time.Millisecond) | ||||||
|  | 			return e.getExtraActivation(id, apiInfo, retry+1) | ||||||
|  | 		} else { | ||||||
|  | 			e.Log.Errorf("唤醒号码失败 id:%s error: %v", id, err) | ||||||
|  | 			return result, statuscode.ServerError | ||||||
|  | 		} | ||||||
| 	} else if status == http.StatusCreated || status == http.StatusOK { | 	} else if status == http.StatusCreated || status == http.StatusOK { | ||||||
| 		if resp.Method != "" && resp.Href != "" { | 		if resp.Method != "" && resp.Href != "" { | ||||||
| 			bytes, err := e.doRequest(&resp, apiInfo) | 			bytes, err := e.doRequest(&resp, apiInfo) | ||||||
| @ -1030,6 +1038,7 @@ func (e *SmsTextVerified) GetNumbers(apiInfo *dto.SmsPlatformKeyQueueDto) ([]dto | |||||||
| 		// 添加第一页数据 | 		// 添加第一页数据 | ||||||
| 		for _, item := range resp.Data { | 		for _, item := range resp.Data { | ||||||
| 			item.Number = "1" + item.Number | 			item.Number = "1" + item.Number | ||||||
|  | 			item.ApiKey = apiInfo.ApiKey | ||||||
|  |  | ||||||
| 			result = append(result, item) | 			result = append(result, item) | ||||||
| 		} | 		} | ||||||
| @ -1074,6 +1083,7 @@ func (e *SmsTextVerified) fetchPaginatedData(nextLink *dto.TextVerifiedResp, api | |||||||
|  |  | ||||||
| 		for _, item := range nextResp.Data { | 		for _, item := range nextResp.Data { | ||||||
| 			item.Number = "1" + item.Number | 			item.Number = "1" + item.Number | ||||||
|  | 			item.ApiKey = apiInfo.ApiKey | ||||||
| 			result = append(result, item) | 			result = append(result, item) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user