1、自动续费
This commit is contained in:
@ -429,7 +429,7 @@ func (e MemberProxy) UserRenewal(c *gin.Context) {
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e.Logger.Error(err)
|
e.Logger.Error(err)
|
||||||
e.Error(500, nil, "server error")
|
e.Error(500, nil, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -469,3 +469,30 @@ func (e MemberProxy) ChangeAutoRenewal(c *gin.Context) {
|
|||||||
|
|
||||||
e.OK(nil, "success")
|
e.OK(nil, "success")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 删除自己的代理
|
||||||
|
func (e MemberProxy) DeleteMyProxy(c *gin.Context) {
|
||||||
|
req := dto.MemberProxyDeleteMyProxyReq{}
|
||||||
|
s := service.MemberProxy{}
|
||||||
|
err := e.MakeContext(c).
|
||||||
|
MakeOrm().
|
||||||
|
Bind(&req).
|
||||||
|
MakeService(&s.Service).
|
||||||
|
Errors
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
e.Logger.Error(err)
|
||||||
|
e.Error(500, nil, "server error")
|
||||||
|
}
|
||||||
|
|
||||||
|
userId := user.GetUserId(c)
|
||||||
|
err = s.DeleteMyProxy(&req, userId)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
e.Logger.Error(err)
|
||||||
|
e.Error(500, nil, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
e.OK(nil, "success")
|
||||||
|
}
|
||||||
|
|||||||
@ -377,3 +377,30 @@ func (e SmsPhone) CancelNumber(c *gin.Context) {
|
|||||||
|
|
||||||
e.OK(nil, "取消号码成功")
|
e.OK(nil, "取消号码成功")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 修改自动续费状态
|
||||||
|
func (e SmsPhone) ChangeAutoRenew(c *gin.Context) {
|
||||||
|
req := dto.SmsPhoneChangeAutoRenewReq{}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
userId := user.GetUserId(c)
|
||||||
|
|
||||||
|
code := s.ChangeAutoRenew(&req, userId)
|
||||||
|
|
||||||
|
if code != statuscode.Success {
|
||||||
|
e.Error(code, nil, statuscode.GetMsg(code, "zh"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
e.OK(nil, "修改自动续费状态成功")
|
||||||
|
}
|
||||||
|
|||||||
192
app/admin/apis/sms_renewal_log.go
Normal file
192
app/admin/apis/sms_renewal_log.go
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
package apis
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/go-admin-team/go-admin-core/sdk/api"
|
||||||
|
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
|
||||||
|
_ "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
|
||||||
|
|
||||||
|
"go-admin/app/admin/models"
|
||||||
|
"go-admin/app/admin/service"
|
||||||
|
"go-admin/app/admin/service/dto"
|
||||||
|
"go-admin/common/actions"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SmsRenewalLog struct {
|
||||||
|
api.Api
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPage 获取短信续期记录列表
|
||||||
|
// @Summary 获取短信续期记录列表
|
||||||
|
// @Description 获取短信续期记录列表
|
||||||
|
// @Tags 短信续期记录
|
||||||
|
// @Param type query int64 false "类型 0-长效 1-短效"
|
||||||
|
// @Param pageSize query int false "页条数"
|
||||||
|
// @Param pageIndex query int false "页码"
|
||||||
|
// @Success 200 {object} response.Response{data=response.Page{list=[]models.SmsRenewalLog}} "{"code": 200, "data": [...]}"
|
||||||
|
// @Router /api/v1/sms-renewal-log [get]
|
||||||
|
// @Security Bearer
|
||||||
|
func (e SmsRenewalLog) GetPage(c *gin.Context) {
|
||||||
|
req := dto.SmsRenewalLogGetPageReq{}
|
||||||
|
s := service.SmsRenewalLog{}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
p := actions.GetPermissionFromContext(c)
|
||||||
|
list := make([]models.SmsRenewalLog, 0)
|
||||||
|
var count int64
|
||||||
|
|
||||||
|
err = s.GetPage(&req, p, &list, &count)
|
||||||
|
if err != nil {
|
||||||
|
e.Error(500, err, fmt.Sprintf("获取短信续期记录失败,\r\n失败信息 %s", err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get 获取短信续期记录
|
||||||
|
// @Summary 获取短信续期记录
|
||||||
|
// @Description 获取短信续期记录
|
||||||
|
// @Tags 短信续期记录
|
||||||
|
// @Param id path int false "id"
|
||||||
|
// @Success 200 {object} response.Response{data=models.SmsRenewalLog} "{"code": 200, "data": [...]}"
|
||||||
|
// @Router /api/v1/sms-renewal-log/{id} [get]
|
||||||
|
// @Security Bearer
|
||||||
|
func (e SmsRenewalLog) Get(c *gin.Context) {
|
||||||
|
req := dto.SmsRenewalLogGetReq{}
|
||||||
|
s := service.SmsRenewalLog{}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
var object models.SmsRenewalLog
|
||||||
|
|
||||||
|
p := actions.GetPermissionFromContext(c)
|
||||||
|
err = s.Get(&req, p, &object)
|
||||||
|
if err != nil {
|
||||||
|
e.Error(500, err, fmt.Sprintf("获取短信续期记录失败,\r\n失败信息 %s", err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
e.OK( object, "查询成功")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert 创建短信续期记录
|
||||||
|
// @Summary 创建短信续期记录
|
||||||
|
// @Description 创建短信续期记录
|
||||||
|
// @Tags 短信续期记录
|
||||||
|
// @Accept application/json
|
||||||
|
// @Product application/json
|
||||||
|
// @Param data body dto.SmsRenewalLogInsertReq true "data"
|
||||||
|
// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}"
|
||||||
|
// @Router /api/v1/sms-renewal-log [post]
|
||||||
|
// @Security Bearer
|
||||||
|
func (e SmsRenewalLog) Insert(c *gin.Context) {
|
||||||
|
req := dto.SmsRenewalLogInsertReq{}
|
||||||
|
s := service.SmsRenewalLog{}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
// 设置创建人
|
||||||
|
req.SetCreateBy(user.GetUserId(c))
|
||||||
|
|
||||||
|
err = s.Insert(&req)
|
||||||
|
if err != nil {
|
||||||
|
e.Error(500, err, fmt.Sprintf("创建短信续期记录失败,\r\n失败信息 %s", err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
e.OK(req.GetId(), "创建成功")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 修改短信续期记录
|
||||||
|
// @Summary 修改短信续期记录
|
||||||
|
// @Description 修改短信续期记录
|
||||||
|
// @Tags 短信续期记录
|
||||||
|
// @Accept application/json
|
||||||
|
// @Product application/json
|
||||||
|
// @Param id path int true "id"
|
||||||
|
// @Param data body dto.SmsRenewalLogUpdateReq true "body"
|
||||||
|
// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}"
|
||||||
|
// @Router /api/v1/sms-renewal-log/{id} [put]
|
||||||
|
// @Security Bearer
|
||||||
|
func (e SmsRenewalLog) Update(c *gin.Context) {
|
||||||
|
req := dto.SmsRenewalLogUpdateReq{}
|
||||||
|
s := service.SmsRenewalLog{}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
req.SetUpdateBy(user.GetUserId(c))
|
||||||
|
p := actions.GetPermissionFromContext(c)
|
||||||
|
|
||||||
|
err = s.Update(&req, p)
|
||||||
|
if err != nil {
|
||||||
|
e.Error(500, err, fmt.Sprintf("修改短信续期记录失败,\r\n失败信息 %s", err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
e.OK( req.GetId(), "修改成功")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete 删除短信续期记录
|
||||||
|
// @Summary 删除短信续期记录
|
||||||
|
// @Description 删除短信续期记录
|
||||||
|
// @Tags 短信续期记录
|
||||||
|
// @Param data body dto.SmsRenewalLogDeleteReq true "body"
|
||||||
|
// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}"
|
||||||
|
// @Router /api/v1/sms-renewal-log [delete]
|
||||||
|
// @Security Bearer
|
||||||
|
func (e SmsRenewalLog) Delete(c *gin.Context) {
|
||||||
|
s := service.SmsRenewalLog{}
|
||||||
|
req := dto.SmsRenewalLogDeleteReq{}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
// req.SetUpdateBy(user.GetUserId(c))
|
||||||
|
p := actions.GetPermissionFromContext(c)
|
||||||
|
|
||||||
|
err = s.Remove(&req, p)
|
||||||
|
if err != nil {
|
||||||
|
e.Error(500, err, fmt.Sprintf("删除短信续期记录失败,\r\n失败信息 %s", err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
e.OK( req.GetId(), "删除成功")
|
||||||
|
}
|
||||||
@ -24,6 +24,7 @@ type SmsPhone struct {
|
|||||||
ExpireTime *time.Time `json:"expireTime" gorm:"type:datetime;comment:过期时间"`
|
ExpireTime *time.Time `json:"expireTime" gorm:"type:datetime;comment:过期时间"`
|
||||||
Actived int `json:"actived" gorm:"type:tinyint;comment:是否激活(长期租赁如果第一次没接收到验证码 则不会激活号码) 1-未激活 2-已激活 3-已失效"`
|
Actived int `json:"actived" gorm:"type:tinyint;comment:是否激活(长期租赁如果第一次没接收到验证码 则不会激活号码) 1-未激活 2-已激活 3-已失效"`
|
||||||
Price decimal.Decimal `json:"price" gorm:"type:decimal(10,2);comment:价格"`
|
Price decimal.Decimal `json:"price" gorm:"type:decimal(10,2);comment:价格"`
|
||||||
|
AutoRenewal int `json:"autoRenewal" gorm:"type:tinyint;comment:是否自动续费 1-自动续费 2-手动续费"`
|
||||||
models.ModelTime
|
models.ModelTime
|
||||||
models.ControlBy
|
models.ControlBy
|
||||||
}
|
}
|
||||||
|
|||||||
35
app/admin/models/sms_renewal_log.go
Normal file
35
app/admin/models/sms_renewal_log.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go-admin/common/models"
|
||||||
|
|
||||||
|
"github.com/shopspring/decimal"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SmsRenewalLog struct {
|
||||||
|
models.Model
|
||||||
|
|
||||||
|
PhoneId int `json:"phoneId" gorm:"type:bigint;comment:号码id"`
|
||||||
|
Type int `json:"type" gorm:"type:tinyint;comment:类型 0-长效 1-短效"`
|
||||||
|
UserId int `json:"userId" gorm:"type:bigint;comment:用户id"`
|
||||||
|
Amount decimal.Decimal `json:"amount" gorm:"type:decimal(10,2);comment:扣费金额"`
|
||||||
|
BeforeTime time.Time `json:"beforeTime" gorm:"type:datetime;comment:续费前过期时间"`
|
||||||
|
Period int `json:"period" gorm:"type:int;comment:时间段"`
|
||||||
|
models.ModelTime
|
||||||
|
models.ControlBy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (SmsRenewalLog) TableName() string {
|
||||||
|
return "sms_renewal_log"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *SmsRenewalLog) Generate() models.ActiveRecord {
|
||||||
|
o := *e
|
||||||
|
return &o
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *SmsRenewalLog) GetId() interface{} {
|
||||||
|
return e.Id
|
||||||
|
}
|
||||||
@ -28,6 +28,8 @@ func registerMemberProxyRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMi
|
|||||||
r2.POST("reset-generate-proxy", api.ResetGenerateProxy) //重置流量代理账号
|
r2.POST("reset-generate-proxy", api.ResetGenerateProxy) //重置流量代理账号
|
||||||
r2.POST("user-renewal", api.UserRenewal) //用户续费
|
r2.POST("user-renewal", api.UserRenewal) //用户续费
|
||||||
r2.POST("change-auto-renewal", api.ChangeAutoRenewal) //修改自动续费
|
r2.POST("change-auto-renewal", api.ChangeAutoRenewal) //修改自动续费
|
||||||
|
|
||||||
|
r2.DELETE("my", api.DeleteMyProxy) //删除我的代理
|
||||||
}
|
}
|
||||||
|
|
||||||
r := v1.Group("/member-proxy").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
|
r := v1.Group("/member-proxy").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
|
||||||
|
|||||||
@ -25,6 +25,7 @@ func registerSmsPhoneRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddl
|
|||||||
r1.POST("weakUp", api.WeakUp) // 新增号码
|
r1.POST("weakUp", api.WeakUp) // 新增号码
|
||||||
r1.DELETE("my-number", api.DeleteMyNumber) // 删除自己的号码
|
r1.DELETE("my-number", api.DeleteMyNumber) // 删除自己的号码
|
||||||
r1.PUT("cancel", api.CancelNumber) //取消号码
|
r1.PUT("cancel", api.CancelNumber) //取消号码
|
||||||
|
r1.PUT("auto-renewal", api.ChangeAutoRenew) //修改自动续费状态
|
||||||
}
|
}
|
||||||
|
|
||||||
r := v1.Group("/sms-phone").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
|
r := v1.Group("/sms-phone").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
|
||||||
|
|||||||
27
app/admin/router/sms_renewal_log.go
Normal file
27
app/admin/router/sms_renewal_log.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package router
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
|
||||||
|
|
||||||
|
"go-admin/app/admin/apis"
|
||||||
|
"go-admin/common/middleware"
|
||||||
|
"go-admin/common/actions"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
routerCheckRole = append(routerCheckRole, registerSmsRenewalLogRouter)
|
||||||
|
}
|
||||||
|
|
||||||
|
// registerSmsRenewalLogRouter
|
||||||
|
func registerSmsRenewalLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
|
||||||
|
api := apis.SmsRenewalLog{}
|
||||||
|
r := v1.Group("/sms-renewal-log").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
|
||||||
|
{
|
||||||
|
r.GET("", actions.PermissionAction(), api.GetPage)
|
||||||
|
r.GET("/:id", actions.PermissionAction(), api.Get)
|
||||||
|
r.POST("", api.Insert)
|
||||||
|
r.PUT("/:id", actions.PermissionAction(), api.Update)
|
||||||
|
r.DELETE("", api.Delete)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -249,6 +249,47 @@ func (e *CliProxyService) GetUserIpList(page int, limit int, lang, code string)
|
|||||||
return resp.Data, nil
|
return resp.Data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 续期静态ip
|
||||||
|
func (e *CliProxyService) Renewal(ip string, day int) error {
|
||||||
|
url := "/api/static/renewal"
|
||||||
|
key, err := e.GetKey()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
e.Log.Errorf("获取key失败 %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
headers, _ := GetHeaders()
|
||||||
|
client := httphelper.NewHTTPClient(10*time.Second, config.ExtConfig.CliproxyApiUrl, headers)
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
writer := multipart.NewWriter(&buf)
|
||||||
|
// 添加字段
|
||||||
|
_ = writer.WriteField("lang", "en")
|
||||||
|
_ = writer.WriteField("ip", ip)
|
||||||
|
_ = writer.WriteField("day", strconv.Itoa(day))
|
||||||
|
_ = writer.WriteField("key", key)
|
||||||
|
|
||||||
|
writer.Close()
|
||||||
|
resp := dto.CliProxyResultResp[dto.CliProxyUserListResp]{}
|
||||||
|
contentType := writer.FormDataContentType()
|
||||||
|
err = client.PostWithContentType(url, &buf, contentType, nil, &resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if resp.Code != 0 {
|
||||||
|
if resp.Code == 300 {
|
||||||
|
e.Log.Errorf("key 失效 code:%d", resp.Code)
|
||||||
|
return errors.New("key 失效")
|
||||||
|
}
|
||||||
|
e.Log.Errorf("请求失败 params:%v err: %v", nil, resp.Msg)
|
||||||
|
return errors.New(resp.Msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// 获取私钥
|
// 获取私钥
|
||||||
func (e *CliProxyService) GetKey() (string, error) {
|
func (e *CliProxyService) GetKey() (string, error) {
|
||||||
sysConfigService := SysConfig{Service: e.Service}
|
sysConfigService := SysConfig{Service: e.Service}
|
||||||
@ -264,6 +305,86 @@ func (e *CliProxyService) GetKey() (string, error) {
|
|||||||
return configResp.ConfigValue, nil
|
return configResp.ConfigValue, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取token
|
||||||
|
func (e *CliProxyService) GetToken() (string, error) {
|
||||||
|
val, _ := redishelper.DefaultRedis.GetString(rediskey.CliProxyTokenPrefix)
|
||||||
|
|
||||||
|
if val != "" {
|
||||||
|
resp := dto.CliProxySigninResp{}
|
||||||
|
sonic.UnmarshalString(val, &resp)
|
||||||
|
|
||||||
|
if resp.Token != "" {
|
||||||
|
return resp.Token, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := e.resetToken()
|
||||||
|
if err != nil {
|
||||||
|
return resp.Token, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp.Token, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 充值token
|
||||||
|
func (e *CliProxyService) resetToken() (dto.CliProxySigninResp, error) {
|
||||||
|
configService := SysConfig{}
|
||||||
|
configService.Orm = e.Orm
|
||||||
|
configService.Log = e.Log
|
||||||
|
configReq := dto.SysConfigByKeyReq{
|
||||||
|
ConfigKey: "proxy_dash_email",
|
||||||
|
}
|
||||||
|
configResp := dto.GetSysConfigByKEYForServiceResp{}
|
||||||
|
passwordConfigReq := dto.SysConfigByKeyReq{
|
||||||
|
ConfigKey: "proxy_dash_password",
|
||||||
|
}
|
||||||
|
passwordConfigResp := dto.GetSysConfigByKEYForServiceResp{}
|
||||||
|
if err := configService.GetWithKey(&configReq, &configResp); err != nil {
|
||||||
|
return dto.CliProxySigninResp{}, err
|
||||||
|
}
|
||||||
|
if err := configService.GetWithKey(&passwordConfigReq, &passwordConfigResp); err != nil {
|
||||||
|
return dto.CliProxySigninResp{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp := dto.CliProxyResultResp[dto.CliProxySigninResp]{}
|
||||||
|
api := "/v1/signin"
|
||||||
|
headers, _ := GetHeaders()
|
||||||
|
client := httphelper.NewHTTPClient(10*time.Second, config.ExtConfig.CliproxyApiUrl, headers)
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
writer := multipart.NewWriter(&buf)
|
||||||
|
// 添加字段
|
||||||
|
_ = writer.WriteField("lang", "en")
|
||||||
|
_ = writer.WriteField("email", configResp.ConfigValue)
|
||||||
|
_ = writer.WriteField("pwd", passwordConfigResp.ConfigValue)
|
||||||
|
|
||||||
|
writer.Close()
|
||||||
|
|
||||||
|
contentType := writer.FormDataContentType()
|
||||||
|
err := client.PostWithContentType(api, &buf, contentType, nil, &resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return dto.CliProxySigninResp{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.Code != 0 || resp.Data.Token == "" {
|
||||||
|
return dto.CliProxySigninResp{}, errors.New(resp.Msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
val, err := sonic.MarshalString(resp.Data)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return dto.CliProxySigninResp{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if val != "" {
|
||||||
|
if err := redishelper.DefaultRedis.SetString(rediskey.CliProxyTokenPrefix, val); err != nil {
|
||||||
|
return dto.CliProxySigninResp{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resp.Data, nil
|
||||||
|
}
|
||||||
|
|
||||||
// 获取线路
|
// 获取线路
|
||||||
func (e *CliProxyService) GetTrafficServer(req *dto.MemberProxyGetTrafficServerReq) ([]dto.CliProxyTrafficServerResp, error) {
|
func (e *CliProxyService) GetTrafficServer(req *dto.MemberProxyGetTrafficServerReq) ([]dto.CliProxyTrafficServerResp, error) {
|
||||||
api := "/v1/traffic/server"
|
api := "/v1/traffic/server"
|
||||||
@ -271,10 +392,10 @@ func (e *CliProxyService) GetTrafficServer(req *dto.MemberProxyGetTrafficServerR
|
|||||||
client := httphelper.NewHTTPClient(10*time.Second, config.ExtConfig.CliproxyApiUrl, headers)
|
client := httphelper.NewHTTPClient(10*time.Second, config.ExtConfig.CliproxyApiUrl, headers)
|
||||||
resp := dto.CliProxyResultResp[[]dto.CliProxyTrafficServerResp]{}
|
resp := dto.CliProxyResultResp[[]dto.CliProxyTrafficServerResp]{}
|
||||||
|
|
||||||
key, err := e.GetKey()
|
token, err := e.GetToken()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e.Log.Errorf("获取key失败 %v", err)
|
e.Log.Errorf("获取token失败 %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,7 +403,7 @@ func (e *CliProxyService) GetTrafficServer(req *dto.MemberProxyGetTrafficServerR
|
|||||||
writer := multipart.NewWriter(&buf)
|
writer := multipart.NewWriter(&buf)
|
||||||
// 添加字段
|
// 添加字段
|
||||||
_ = writer.WriteField("lang", "en")
|
_ = writer.WriteField("lang", "en")
|
||||||
_ = writer.WriteField("key", key)
|
_ = writer.WriteField("token", token)
|
||||||
|
|
||||||
writer.Close()
|
writer.Close()
|
||||||
|
|
||||||
|
|||||||
@ -101,3 +101,7 @@ type MemberProxyChangeAutoRenewalReq struct {
|
|||||||
ProxyId int `json:"proxyId"`
|
ProxyId int `json:"proxyId"`
|
||||||
AutoRenewal bool `json:"autoRenewal"`
|
AutoRenewal bool `json:"autoRenewal"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MemberProxyDeleteMyProxyReq struct {
|
||||||
|
Id int `json:"id"`
|
||||||
|
}
|
||||||
|
|||||||
@ -167,3 +167,8 @@ func (s *DeleteMyNumberReq) Validate() error {
|
|||||||
type SmsPhoneCancelNumberReq struct {
|
type SmsPhoneCancelNumberReq struct {
|
||||||
Id int `json:"id" comment:"短信号码id"`
|
Id int `json:"id" comment:"短信号码id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SmsPhoneChangeAutoRenewReq struct {
|
||||||
|
Id int `json:"id" comment:"短信号码id"`
|
||||||
|
AutoRenew int `json:"autoRenew" comment:"是否自动续费 1-不自动续费 2-自动续费"`
|
||||||
|
}
|
||||||
|
|||||||
110
app/admin/service/dto/sms_renewal_log.go
Normal file
110
app/admin/service/dto/sms_renewal_log.go
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
package dto
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go-admin/app/admin/models"
|
||||||
|
"go-admin/common/dto"
|
||||||
|
common "go-admin/common/models"
|
||||||
|
|
||||||
|
"github.com/shopspring/decimal"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SmsRenewalLogGetPageReq struct {
|
||||||
|
dto.Pagination `search:"-"`
|
||||||
|
Type int64 `form:"type" search:"type:exact;column:type;table:sms_renewal_log" comment:"类型 0-长效 1-短效"`
|
||||||
|
SmsRenewalLogOrder
|
||||||
|
}
|
||||||
|
|
||||||
|
type SmsRenewalLogOrder struct {
|
||||||
|
Id string `form:"idOrder" search:"type:order;column:id;table:sms_renewal_log"`
|
||||||
|
PhoneId string `form:"phoneIdOrder" search:"type:order;column:phone_id;table:sms_renewal_log"`
|
||||||
|
Type string `form:"typeOrder" search:"type:order;column:type;table:sms_renewal_log"`
|
||||||
|
UserId string `form:"userIdOrder" search:"type:order;column:user_id;table:sms_renewal_log"`
|
||||||
|
Amount string `form:"amountOrder" search:"type:order;column:amount;table:sms_renewal_log"`
|
||||||
|
BeforeTime string `form:"beforeTimeOrder" search:"type:order;column:before_time;table:sms_renewal_log"`
|
||||||
|
Period string `form:"periodOrder" search:"type:order;column:period;table:sms_renewal_log"`
|
||||||
|
CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:sms_renewal_log"`
|
||||||
|
UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:sms_renewal_log"`
|
||||||
|
DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:sms_renewal_log"`
|
||||||
|
CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:sms_renewal_log"`
|
||||||
|
UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:sms_renewal_log"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SmsRenewalLogGetPageReq) GetNeedSearch() interface{} {
|
||||||
|
return *m
|
||||||
|
}
|
||||||
|
|
||||||
|
type SmsRenewalLogInsertReq struct {
|
||||||
|
Id int `json:"-" comment:"主键id"` // 主键id
|
||||||
|
PhoneId int `json:"phoneId" comment:"号码id"`
|
||||||
|
Type int `json:"type" comment:"类型 0-长效 1-短效"`
|
||||||
|
UserId int `json:"userId" comment:"用户id"`
|
||||||
|
Amount decimal.Decimal `json:"amount" comment:"扣费金额"`
|
||||||
|
BeforeTime time.Time `json:"beforeTime" comment:"续费前过期时间"`
|
||||||
|
Period int `json:"period" comment:"时间段"`
|
||||||
|
common.ControlBy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmsRenewalLogInsertReq) Generate(model *models.SmsRenewalLog) {
|
||||||
|
if s.Id == 0 {
|
||||||
|
model.Model = common.Model{Id: s.Id}
|
||||||
|
}
|
||||||
|
model.PhoneId = s.PhoneId
|
||||||
|
model.Type = s.Type
|
||||||
|
model.UserId = s.UserId
|
||||||
|
model.Amount = s.Amount
|
||||||
|
model.BeforeTime = s.BeforeTime
|
||||||
|
model.Period = s.Period
|
||||||
|
model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmsRenewalLogInsertReq) GetId() interface{} {
|
||||||
|
return s.Id
|
||||||
|
}
|
||||||
|
|
||||||
|
type SmsRenewalLogUpdateReq struct {
|
||||||
|
Id int `uri:"id" comment:"主键id"` // 主键id
|
||||||
|
PhoneId int `json:"phoneId" comment:"号码id"`
|
||||||
|
Type int `json:"type" comment:"类型 0-长效 1-短效"`
|
||||||
|
UserId int `json:"userId" comment:"用户id"`
|
||||||
|
Amount decimal.Decimal `json:"amount" comment:"扣费金额"`
|
||||||
|
BeforeTime time.Time `json:"beforeTime" comment:"续费前过期时间"`
|
||||||
|
Period int `json:"period" comment:"时间段"`
|
||||||
|
common.ControlBy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmsRenewalLogUpdateReq) Generate(model *models.SmsRenewalLog) {
|
||||||
|
if s.Id == 0 {
|
||||||
|
model.Model = common.Model{Id: s.Id}
|
||||||
|
}
|
||||||
|
model.PhoneId = s.PhoneId
|
||||||
|
model.Type = s.Type
|
||||||
|
model.UserId = s.UserId
|
||||||
|
model.Amount = s.Amount
|
||||||
|
model.BeforeTime = s.BeforeTime
|
||||||
|
model.Period = s.Period
|
||||||
|
model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmsRenewalLogUpdateReq) GetId() interface{} {
|
||||||
|
return s.Id
|
||||||
|
}
|
||||||
|
|
||||||
|
// SmsRenewalLogGetReq 功能获取请求参数
|
||||||
|
type SmsRenewalLogGetReq struct {
|
||||||
|
Id int `uri:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmsRenewalLogGetReq) GetId() interface{} {
|
||||||
|
return s.Id
|
||||||
|
}
|
||||||
|
|
||||||
|
// SmsRenewalLogDeleteReq 功能删除请求参数
|
||||||
|
type SmsRenewalLogDeleteReq struct {
|
||||||
|
Ids []int `json:"ids"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *SmsRenewalLogDeleteReq) GetId() interface{} {
|
||||||
|
return s.Ids
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-admin-team/go-admin-core/sdk/service"
|
"github.com/go-admin-team/go-admin-core/sdk/service"
|
||||||
@ -20,6 +21,25 @@ type MemberProxy struct {
|
|||||||
service.Service
|
service.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 删除个人代理
|
||||||
|
func (e MemberProxy) DeleteMyProxy(req *dto.MemberProxyDeleteMyProxyReq, userId int) error {
|
||||||
|
var data models.MemberProxy
|
||||||
|
if err := e.Orm.Model(&data).Where("id =? and user_id =?", req.Id, userId).First(&data).Error; err != nil {
|
||||||
|
e.Log.Errorf("删除代理失败 记录不存在 %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Expired.After(time.Now()) {
|
||||||
|
return errors.New("该代理还未到期")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := e.Orm.Model(&data).Delete(&data, data.GetId()).Error; err != nil {
|
||||||
|
e.Log.Errorf("删除代理失败 err:%v", err.Error())
|
||||||
|
return errors.New("删除失败")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// 切换自动续状态
|
// 切换自动续状态
|
||||||
func (e MemberProxy) ChangeAutoRenewal(req *dto.MemberProxyChangeAutoRenewalReq, userId int) error {
|
func (e MemberProxy) ChangeAutoRenewal(req *dto.MemberProxyChangeAutoRenewalReq, userId int) error {
|
||||||
var data models.MemberProxy
|
var data models.MemberProxy
|
||||||
@ -64,7 +84,7 @@ func (e MemberProxy) GetAutoRenewalProxys() ([]models.MemberProxy, error) {
|
|||||||
endDate := time.Now().Add(24 * time.Hour)
|
endDate := time.Now().Add(24 * time.Hour)
|
||||||
startDate := time.Now()
|
startDate := time.Now()
|
||||||
|
|
||||||
if err := e.Orm.Model(&models.MemberProxy{}).Where("status =1 and auto_renewal =1 and expired BETWEEN ? AND ?", startDate, endDate).Select("id,type,user_id,expired").Find(&datas).Error; err != nil {
|
if err := e.Orm.Model(&models.MemberProxy{}).Where("status =1 and auto_renewal =1 and expired BETWEEN ? AND ?", startDate, endDate).Select("id,type,user_id,ip,expired").Find(&datas).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return datas, nil
|
return datas, nil
|
||||||
@ -142,12 +162,13 @@ func (e MemberProxy) GetMyProxy(req *dto.MemberProxyGetMyProxyReq, resp *[]dto.M
|
|||||||
respItem.UserName = item.UserName
|
respItem.UserName = item.UserName
|
||||||
respItem.Expired = item.Expired
|
respItem.Expired = item.Expired
|
||||||
respItem.Status = item.Status
|
respItem.Status = item.Status
|
||||||
|
respItem.Password = item.Password
|
||||||
|
|
||||||
if item.AutoRenewal == 1 {
|
if item.AutoRenewal == 1 {
|
||||||
respItem.AutoRenewal = true
|
respItem.AutoRenewal = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if cliProxyConfig.ConfigValue != "" {
|
if cliProxyConfig.ConfigValue != "" && item.Password == "" {
|
||||||
respItem.Password = cliProxyConfig.ConfigValue
|
respItem.Password = cliProxyConfig.ConfigValue
|
||||||
}
|
}
|
||||||
*resp = append(*resp, respItem)
|
*resp = append(*resp, respItem)
|
||||||
@ -264,13 +285,24 @@ func (e *MemberProxy) CreateProxy(req *dto.MemberProxyInsertReq, userId int) (de
|
|||||||
return balance, errors.New("余额不足")
|
return balance, errors.New("余额不足")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
configService := SysConfig{Service: e.Service}
|
||||||
|
cliProxyConfig := dto.GetSysConfigByKEYForServiceResp{}
|
||||||
|
configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: "traffic_proxy_effective_day"}, &cliProxyConfig)
|
||||||
|
|
||||||
|
if cliProxyConfig.ConfigValue == "" {
|
||||||
|
e.Log.Error("获取动态ip默认时长失败")
|
||||||
|
return balance, errors.New("server error")
|
||||||
|
}
|
||||||
|
|
||||||
|
hour, _ := strconv.Atoi(cliProxyConfig.ConfigValue)
|
||||||
data.Type = 2
|
data.Type = 2
|
||||||
data.Day = 30
|
// data.Day = day
|
||||||
data.UserId = userId
|
data.UserId = userId
|
||||||
data.SessionType = "Sticky IP"
|
data.SessionType = "Sticky IP"
|
||||||
data.UserName = userName
|
data.UserName = userName
|
||||||
data.Status = 1
|
data.Status = 1
|
||||||
data.Expired = time.Now().AddDate(0, 0, 30)
|
period := time.Duration(hour) * time.Hour
|
||||||
|
data.Expired = time.Now().Add(period)
|
||||||
|
|
||||||
err = e.Orm.Transaction(func(tx *gorm.DB) error {
|
err = e.Orm.Transaction(func(tx *gorm.DB) error {
|
||||||
if err1 := tx.Create(&data).Error; err1 != nil {
|
if err1 := tx.Create(&data).Error; err1 != nil {
|
||||||
|
|||||||
@ -31,7 +31,7 @@ func (e *MemberRenewalLog) AutoRenewal() error {
|
|||||||
balanceService := MemberBalance{Service: e.Service}
|
balanceService := MemberBalance{Service: e.Service}
|
||||||
configService := SysConfig{Service: e.Service}
|
configService := SysConfig{Service: e.Service}
|
||||||
configResp := dto.GetSysConfigByKEYForServiceResp{}
|
configResp := dto.GetSysConfigByKEYForServiceResp{}
|
||||||
configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: "deduction_standard"}, &configResp)
|
configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: "ip_renew_deduction_standard"}, &configResp)
|
||||||
|
|
||||||
if configResp.ConfigValue == "" {
|
if configResp.ConfigValue == "" {
|
||||||
e.Log.Error("没有设置扣费标准,不自动续期")
|
e.Log.Error("没有设置扣费标准,不自动续期")
|
||||||
@ -70,7 +70,7 @@ func (e *MemberRenewalLog) AutoRenewal() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, proxy := range autoProxys {
|
for _, proxy := range autoProxys {
|
||||||
if proxy.Type == 1 {
|
if proxy.Type == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,17 +96,33 @@ func (e *MemberRenewalLog) DoRenewal(proxy models.MemberProxy, amount decimal.De
|
|||||||
renewalLog.Amount = amount
|
renewalLog.Amount = amount
|
||||||
renewalLog.Day = 30
|
renewalLog.Day = 30
|
||||||
renewalLog.ProxyId = proxy.Id
|
renewalLog.ProxyId = proxy.Id
|
||||||
|
cliproxyService := CliProxyService{Service: e.Service}
|
||||||
|
|
||||||
err := e.Orm.Transaction(func(tx *gorm.DB) error {
|
err := e.Orm.Transaction(func(tx *gorm.DB) error {
|
||||||
if err := tx.Save(&renewalLog).Error; err != nil {
|
if err := tx.Save(&renewalLog).Error; err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tx.Exec("UPDATE member_balance SET balance = balance -? WHERE user_id =? AND balance >= ?", amount, proxy.UserId, amount).Error; err != nil {
|
db := tx.Exec("UPDATE member_balance SET balance = balance -? WHERE user_id =? AND balance >= ?", amount, proxy.UserId, amount)
|
||||||
return err
|
|
||||||
|
if db.RowsAffected != 1 {
|
||||||
|
e.Log.Errorf("续费扣费失败,ip:%s,err:%s", proxy.Ip, "余额不足")
|
||||||
|
return errors.New("余额不足")
|
||||||
|
}
|
||||||
|
|
||||||
|
if db.Error != nil {
|
||||||
|
e.Log.Errorf("续费扣费失败,ip:%s,err:%s", proxy.Ip, db.Error.Error())
|
||||||
|
return db.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tx.Model(&proxy).Update("expired", proxy.Expired.AddDate(0, 0, 30)).Error; err != nil {
|
if err := tx.Model(&proxy).Update("expired", proxy.Expired.AddDate(0, 0, 30)).Error; err != nil {
|
||||||
|
e.Log.Errorf("续费修改过期时间失败,ip:%s,err:%s", proxy.Ip, err.Error())
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := cliproxyService.Renewal(proxy.Ip, 30); err != nil {
|
||||||
|
e.Log.Errorf("续费失败,ip:%s,err:%s", proxy.Ip, err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,17 +135,17 @@ func (e *MemberRenewalLog) DoRenewal(proxy models.MemberProxy, amount decimal.De
|
|||||||
func (e *MemberRenewalLog) UserRenewal(req *dto.MemberProxyUserRenewalReq, userId int) (decimal.Decimal, error) {
|
func (e *MemberRenewalLog) UserRenewal(req *dto.MemberProxyUserRenewalReq, userId int) (decimal.Decimal, error) {
|
||||||
configService := SysConfig{Service: e.Service}
|
configService := SysConfig{Service: e.Service}
|
||||||
configResp := dto.GetSysConfigByKEYForServiceResp{}
|
configResp := dto.GetSysConfigByKEYForServiceResp{}
|
||||||
configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: "deduction_standard"}, &configResp)
|
configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: "ip_renew_deduction_standard"}, &configResp)
|
||||||
|
|
||||||
if configResp.ConfigValue == "" {
|
if configResp.ConfigValue == "" {
|
||||||
e.Log.Error("没有设置扣费标准,不自动续期")
|
e.Log.Error("没有设置扣费标准,无法续期")
|
||||||
return decimal.Zero, nil
|
return decimal.Zero, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
amount, err := decimal.NewFromString(configResp.ConfigValue)
|
amount, err := decimal.NewFromString(configResp.ConfigValue)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e.Log.Error("扣费标准设置错误,不自动续期")
|
e.Log.Error("扣费标准设置错误,无法续期")
|
||||||
return decimal.Zero, errors.New("续费失败,请联系管理员")
|
return decimal.Zero, errors.New("续费失败,请联系管理员")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,8 +165,8 @@ func (e *MemberRenewalLog) UserRenewal(req *dto.MemberProxyUserRenewalReq, userI
|
|||||||
return balance, errors.New("代理不存在")
|
return balance, errors.New("代理不存在")
|
||||||
}
|
}
|
||||||
|
|
||||||
if proxy.Type == 1 {
|
if proxy.Type == 0 {
|
||||||
return balance, errors.New("长效ip不支持续费")
|
return balance, errors.New("短效ip不支持续费")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = e.DoRenewal(proxy, amount)
|
err = e.DoRenewal(proxy, amount)
|
||||||
|
|||||||
@ -208,7 +208,8 @@ func (e *SmsPhone) GetNumber(req *dto.GetNumberReq, userId int) (decimal.Decimal
|
|||||||
|
|
||||||
smsPhone.Price = price
|
smsPhone.Price = price
|
||||||
if req.Type == 1 {
|
if req.Type == 1 {
|
||||||
now = now.AddDate(0, req.Period, 0)
|
days := req.Period * 30
|
||||||
|
now = now.AddDate(0, 0, days)
|
||||||
smsPhone.ExpireTime = &now
|
smsPhone.ExpireTime = &now
|
||||||
} else {
|
} else {
|
||||||
now = now.Add(time.Minute * time.Duration(serviceItem.ExpirationMinutes))
|
now = now.Add(time.Minute * time.Duration(serviceItem.ExpirationMinutes))
|
||||||
@ -556,6 +557,135 @@ func (e *SmsPhone) CancelRental(activationId int) int {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 自动续期
|
||||||
|
func (e SmsServices) AutoRenewal() error {
|
||||||
|
var datas []models.SmsPhone
|
||||||
|
var data models.SmsPhone
|
||||||
|
startTime := time.Now().Add(-24 * time.Hour)
|
||||||
|
endTime := time.Now().Add(24 * time.Hour)
|
||||||
|
|
||||||
|
configService := SysConfig{Service: e.Service}
|
||||||
|
configResp := dto.GetSysConfigByKEYForServiceResp{}
|
||||||
|
configService.GetWithKey(&dto.SysConfigByKeyReq{ConfigKey: "long_number_renew_deduction_standard"}, &configResp)
|
||||||
|
|
||||||
|
if configResp.ConfigValue == "" {
|
||||||
|
e.Log.Errorf("获取续费价格失败")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
price, _ := decimal.NewFromString(configResp.ConfigValue)
|
||||||
|
if price.IsZero() {
|
||||||
|
e.Log.Errorf("获取续费价格失败")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := e.Orm.Model(&models.SmsPhone{}).Where("auto_renewal =1 and type =1 and actived =2 and expire_time >=? and expire_time <?", startTime, endTime).Find(&datas).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range datas {
|
||||||
|
renewLog := models.SmsRenewalLog{}
|
||||||
|
renewLog.UserId = item.UserId
|
||||||
|
renewLog.PhoneId = item.Id
|
||||||
|
renewLog.Type = item.Type
|
||||||
|
renewLog.Amount = price
|
||||||
|
renewLog.BeforeTime = *item.ExpireTime
|
||||||
|
renewLog.Period = 30
|
||||||
|
|
||||||
|
if err := e.Orm.Transaction(func(tx *gorm.DB) error {
|
||||||
|
db := tx.Exec("UPDATE member_balance set balance = balance - ? where user_id = ? and balance >= ?", price, item.UserId, price)
|
||||||
|
|
||||||
|
if db.Error != nil {
|
||||||
|
return db.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
if db.RowsAffected == 0 {
|
||||||
|
return errors.New("余额不足")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err1 := tx.Create(&renewLog).Error; err1 != nil {
|
||||||
|
|
||||||
|
return errors.New("创建续费日志失败")
|
||||||
|
}
|
||||||
|
|
||||||
|
newExpireTime := item.ExpireTime.AddDate(0, 0, 30)
|
||||||
|
if err1 := tx.Model(data).Where("id =?", item.Id).Update("expire_time", newExpireTime).Error; err1 != nil {
|
||||||
|
return err1
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}); err != nil {
|
||||||
|
e.Log.Errorf("自动续期失败:%s", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeAutoRenew 修改自动续期
|
||||||
|
func (e *SmsPhone) ChangeAutoRenew(req *dto.SmsPhoneChangeAutoRenewReq, userId int) int {
|
||||||
|
var data models.SmsPhone
|
||||||
|
|
||||||
|
if err := e.Orm.Model(data).Where("id =? and user_id =?", req.Id, userId).First(&data).Error; err != nil {
|
||||||
|
e.Log.Errorf("修改自动续期 数据不存在 id:%d err:%s", req.Id, err.Error())
|
||||||
|
return statuscode.SmsNotExisted
|
||||||
|
}
|
||||||
|
|
||||||
|
// 短期租赁不支持自动续期
|
||||||
|
if data.Type == 0 {
|
||||||
|
return statuscode.SmsNotAutoRenew
|
||||||
|
}
|
||||||
|
|
||||||
|
status := false
|
||||||
|
changeAutoRenewal := 2
|
||||||
|
if req.AutoRenew == 1 {
|
||||||
|
status = true
|
||||||
|
changeAutoRenewal = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
data.AutoRenewal = req.AutoRenew
|
||||||
|
code := e.ChangeAutoRenewForApi(data.ActivationId, status)
|
||||||
|
|
||||||
|
if code != statuscode.Success {
|
||||||
|
return statuscode.ServerError
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := e.Orm.Model(&data).Update("auto_renewal", changeAutoRenewal).Error; err != nil {
|
||||||
|
e.Log.Errorf("修改自动续期失败 id:%d, status:%t", data.ActivationId, status)
|
||||||
|
}
|
||||||
|
|
||||||
|
return statuscode.Success
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeAutoRenew 修改自动续期
|
||||||
|
// activationId 短信id
|
||||||
|
// status 状态
|
||||||
|
func (e *SmsPhone) ChangeAutoRenewForApi(activationId int, status bool) int {
|
||||||
|
key, err := GetApiKey(e)
|
||||||
|
|
||||||
|
if err != statuscode.Success {
|
||||||
|
e.Log.Errorf("查询sms api请求失败 %d", activationId)
|
||||||
|
return statuscode.ServerError
|
||||||
|
}
|
||||||
|
|
||||||
|
url := fmt.Sprintf("?api_key=%s&action=setAutoRenew&id=%d&value=%t", key.ConfigValue, activationId, status)
|
||||||
|
client := httphelper.NewHTTPClient(10*time.Second, config.ExtConfig.DaisysmsUrl, nil)
|
||||||
|
bytes, err1 := client.GetRaw(url, nil)
|
||||||
|
|
||||||
|
if err1 != nil {
|
||||||
|
e.Log.Errorf("租赁请求失败 %s", err1.Error())
|
||||||
|
return statuscode.ServerError
|
||||||
|
}
|
||||||
|
|
||||||
|
content := string(bytes)
|
||||||
|
|
||||||
|
if content == "OK" {
|
||||||
|
return statuscode.Success
|
||||||
|
} else {
|
||||||
|
e.Log.Errorf("修改自动续期请求失败 id:%d, status:%t, %s", activationId, status, content)
|
||||||
|
return statuscode.ServerError
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GetPage 获取SmsPhone列表
|
// GetPage 获取SmsPhone列表
|
||||||
func (e *SmsPhone) GetPage(c *dto.SmsPhoneGetPageReq, p *actions.DataPermission, list *[]models.SmsPhone, count *int64) error {
|
func (e *SmsPhone) GetPage(c *dto.SmsPhoneGetPageReq, p *actions.DataPermission, list *[]models.SmsPhone, count *int64) error {
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
109
app/admin/service/sms_renewal_log.go
Normal file
109
app/admin/service/sms_renewal_log.go
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/go-admin-team/go-admin-core/sdk/service"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
"go-admin/app/admin/models"
|
||||||
|
"go-admin/app/admin/service/dto"
|
||||||
|
"go-admin/common/actions"
|
||||||
|
cDto "go-admin/common/dto"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SmsRenewalLog struct {
|
||||||
|
service.Service
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPage 获取SmsRenewalLog列表
|
||||||
|
func (e *SmsRenewalLog) GetPage(c *dto.SmsRenewalLogGetPageReq, p *actions.DataPermission, list *[]models.SmsRenewalLog, count *int64) error {
|
||||||
|
var err error
|
||||||
|
var data models.SmsRenewalLog
|
||||||
|
|
||||||
|
err = e.Orm.Model(&data).
|
||||||
|
Scopes(
|
||||||
|
cDto.MakeCondition(c.GetNeedSearch()),
|
||||||
|
cDto.Paginate(c.GetPageSize(), c.GetPageIndex()),
|
||||||
|
actions.Permission(data.TableName(), p),
|
||||||
|
).
|
||||||
|
Find(list).Limit(-1).Offset(-1).
|
||||||
|
Count(count).Error
|
||||||
|
if err != nil {
|
||||||
|
e.Log.Errorf("SmsRenewalLogService GetPage error:%s \r\n", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get 获取SmsRenewalLog对象
|
||||||
|
func (e *SmsRenewalLog) Get(d *dto.SmsRenewalLogGetReq, p *actions.DataPermission, model *models.SmsRenewalLog) error {
|
||||||
|
var data models.SmsRenewalLog
|
||||||
|
|
||||||
|
err := e.Orm.Model(&data).
|
||||||
|
Scopes(
|
||||||
|
actions.Permission(data.TableName(), p),
|
||||||
|
).
|
||||||
|
First(model, d.GetId()).Error
|
||||||
|
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
err = errors.New("查看对象不存在或无权查看")
|
||||||
|
e.Log.Errorf("Service GetSmsRenewalLog error:%s \r\n", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
e.Log.Errorf("db error:%s", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert 创建SmsRenewalLog对象
|
||||||
|
func (e *SmsRenewalLog) Insert(c *dto.SmsRenewalLogInsertReq) error {
|
||||||
|
var err error
|
||||||
|
var data models.SmsRenewalLog
|
||||||
|
c.Generate(&data)
|
||||||
|
err = e.Orm.Create(&data).Error
|
||||||
|
if err != nil {
|
||||||
|
e.Log.Errorf("SmsRenewalLogService Insert error:%s \r\n", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 修改SmsRenewalLog对象
|
||||||
|
func (e *SmsRenewalLog) Update(c *dto.SmsRenewalLogUpdateReq, p *actions.DataPermission) error {
|
||||||
|
var err error
|
||||||
|
var data = models.SmsRenewalLog{}
|
||||||
|
e.Orm.Scopes(
|
||||||
|
actions.Permission(data.TableName(), p),
|
||||||
|
).First(&data, c.GetId())
|
||||||
|
c.Generate(&data)
|
||||||
|
|
||||||
|
db := e.Orm.Save(&data)
|
||||||
|
if err = db.Error; err != nil {
|
||||||
|
e.Log.Errorf("SmsRenewalLogService Save error:%s \r\n", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if db.RowsAffected == 0 {
|
||||||
|
return errors.New("无权更新该数据")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove 删除SmsRenewalLog
|
||||||
|
func (e *SmsRenewalLog) Remove(d *dto.SmsRenewalLogDeleteReq, p *actions.DataPermission) error {
|
||||||
|
var data models.SmsRenewalLog
|
||||||
|
|
||||||
|
db := e.Orm.Model(&data).
|
||||||
|
Scopes(
|
||||||
|
actions.Permission(data.TableName(), p),
|
||||||
|
).Delete(&data, d.GetId())
|
||||||
|
if err := db.Error; err != nil {
|
||||||
|
e.Log.Errorf("Service RemoveSmsRenewalLog error:%s \r\n", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if db.RowsAffected == 0 {
|
||||||
|
return errors.New("无权删除该数据")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -76,13 +76,13 @@ func (e *SysConfig) Update(c *dto.SysConfigControl) error {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if c.ConfigKey == "proxy_dash_email" || c.ConfigKey == "proxy_dash_password" {
|
if c.ConfigKey == "proxy_dash_email" || c.ConfigKey == "proxy_dash_password" {
|
||||||
// e.Log.Info("更新了邮箱或密码,刷新token")
|
e.Log.Info("更新了邮箱或密码,刷新token")
|
||||||
// proxyService := CliProxyService{Service: e.Service}
|
proxyService := CliProxyService{Service: e.Service}
|
||||||
// if _, err := proxyService.resetToken(); err != nil {
|
if _, err := proxyService.resetToken(); err != nil {
|
||||||
// e.Log.Errorf("修改配置重置token失败:%s", err)
|
e.Log.Errorf("修改配置重置token失败:%s", err)
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,10 +13,11 @@ func InitJob() {
|
|||||||
"ExamplesOne": ExamplesOne{},
|
"ExamplesOne": ExamplesOne{},
|
||||||
"TrxPaymentJob": TrxPaymentJob{},
|
"TrxPaymentJob": TrxPaymentJob{},
|
||||||
"CliProxyTrafficsJob": CliProxyJob{},
|
"CliProxyTrafficsJob": CliProxyJob{},
|
||||||
"RenewalJob": RenewalJob{},
|
"RenewalJob": RenewalJob{}, //长效ip定时续期
|
||||||
"ExpireProxyJob": ExpireProxyJob{},
|
"ExpireProxyJob": ExpireProxyJob{}, //定时过期代理
|
||||||
"CleanExpiredOrderJob": CleanExpiredOrderJob{},
|
"CleanExpiredOrderJob": CleanExpiredOrderJob{}, //清理过期订单
|
||||||
"SmsJob": SmsJob{},
|
"SmsJob": SmsJob{}, //短信定时查询验证码
|
||||||
|
"SmsRenewalJob": SmsRenewalJob{}, //短信定时自动续期
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type RenewalJob struct{}
|
type RenewalJob struct{}
|
||||||
|
type SmsRenewalJob struct{}
|
||||||
type ExpireProxyJob struct{}
|
type ExpireProxyJob struct{}
|
||||||
|
|
||||||
// 定时续期任务
|
// 定时续期任务
|
||||||
@ -18,6 +19,15 @@ func (j RenewalJob) Exec(args interface{}) error {
|
|||||||
return memberRenewalService.AutoRenewal()
|
return memberRenewalService.AutoRenewal()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 定时短信续期任务
|
||||||
|
func (j SmsRenewalJob) Exec(args interface{}) error {
|
||||||
|
smsService := service.SmsServices{}
|
||||||
|
smsService.Orm = GetDb()
|
||||||
|
smsService.Log = logger.NewHelper(logger.DefaultLogger)
|
||||||
|
|
||||||
|
return smsService.AutoRenewal()
|
||||||
|
}
|
||||||
|
|
||||||
// 过期任务
|
// 过期任务
|
||||||
func (j ExpireProxyJob) Exec(args interface{}) error {
|
func (j ExpireProxyJob) Exec(args interface{}) error {
|
||||||
memberRenewalService := service.MemberRenewalLog{}
|
memberRenewalService := service.MemberRenewalLog{}
|
||||||
|
|||||||
19
app/jobs/proxy_job_test.go
Normal file
19
app/jobs/proxy_job_test.go
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package jobs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go-admin/config"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestProxyJob(t *testing.T) {
|
||||||
|
initSetting()
|
||||||
|
config.ExtConfig.CliproxyUrl = "https://f.cliproxy.com"
|
||||||
|
config.ExtConfig.CliproxyApiUrl = "https://api.cliproxy.com"
|
||||||
|
config.ExtConfig.DaisysmsUrl = "https://daisysms.com/stubs/handler_api.php"
|
||||||
|
|
||||||
|
renewJob := RenewalJob{}
|
||||||
|
|
||||||
|
if err := renewJob.Exec(nil); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -14,3 +14,14 @@ func TestSendSMS(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 短信自动续期
|
||||||
|
func TestSmsRenew(t *testing.T) {
|
||||||
|
initSetting()
|
||||||
|
config.ExtConfig.DaisysmsUrl = "https://daisysms.com/stubs/handler_api.php"
|
||||||
|
job := SmsRenewalJob{}
|
||||||
|
|
||||||
|
if err := job.Exec(nil); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
8
common/global/config_key.go
Normal file
8
common/global/config_key.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package global
|
||||||
|
|
||||||
|
//ConfigKey
|
||||||
|
const (
|
||||||
|
流量代理有效天数 = "traffic_proxy_effective_day"
|
||||||
|
长效号码续费标准 = "long_number_renew_deduction_standard"
|
||||||
|
长效IP续费kk扣除标准 = "ip_renew_deduction_standard"
|
||||||
|
)
|
||||||
@ -22,6 +22,7 @@ var StatusCodeZh = map[int]string{
|
|||||||
SmsLongNumWaitCode: "短信验证码_长效号码已唤醒",
|
SmsLongNumWaitCode: "短信验证码_长效号码已唤醒",
|
||||||
SmsNotExisted: "号码不存在",
|
SmsNotExisted: "号码不存在",
|
||||||
SmsNotExpired: "号码未过期无法删除",
|
SmsNotExpired: "号码未过期无法删除",
|
||||||
|
SmsNotAutoRenew: "短效号码无法自动续期",
|
||||||
}
|
}
|
||||||
|
|
||||||
var StatusCodeEn = map[int]string{
|
var StatusCodeEn = map[int]string{
|
||||||
@ -46,6 +47,7 @@ var StatusCodeEn = map[int]string{
|
|||||||
SmsLongNumWaitCode: "sms code long num wake up",
|
SmsLongNumWaitCode: "sms code long num wake up",
|
||||||
SmsNotExisted: "number not exist",
|
SmsNotExisted: "number not exist",
|
||||||
SmsNotExpired: "number not expired, can not delete",
|
SmsNotExpired: "number not expired, can not delete",
|
||||||
|
SmsNotAutoRenew: "num can not auto renew",
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetMsg(code int, lang string) string {
|
func GetMsg(code int, lang string) string {
|
||||||
@ -103,4 +105,6 @@ const (
|
|||||||
SmsNotExisted = 20018
|
SmsNotExisted = 20018
|
||||||
//号码未过期无法删除
|
//号码未过期无法删除
|
||||||
SmsNotExpired = 20019
|
SmsNotExpired = 20019
|
||||||
|
//短效号码无法自动续期
|
||||||
|
SmsNotAutoRenew = 20020
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user