Compare commits
	
		
			5 Commits
		
	
	
		
			fbdf54603b
			...
			master
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9a954cedc0 | |||
| 1f2b337642 | |||
| f3ca87fb54 | |||
| 68f3105dff | |||
| f170d4ea3b | 
@ -116,6 +116,12 @@ func (e TmPlatform) Insert(c *gin.Context) {
 | 
				
			|||||||
		e.Error(500, err, err.Error())
 | 
							e.Error(500, err, err.Error())
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err1 := req.Validate(); err1 != nil {
 | 
				
			||||||
 | 
							e.Error(500, err1, err1.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 设置创建人
 | 
						// 设置创建人
 | 
				
			||||||
	req.SetCreateBy(user.GetUserId(c))
 | 
						req.SetCreateBy(user.GetUserId(c))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -152,6 +158,12 @@ func (e TmPlatform) Update(c *gin.Context) {
 | 
				
			|||||||
		e.Error(500, err, err.Error())
 | 
							e.Error(500, err, err.Error())
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err1 := req.Validate(); err1 != nil {
 | 
				
			||||||
 | 
							e.Error(500, err1, err1.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req.SetUpdateBy(user.GetUserId(c))
 | 
						req.SetUpdateBy(user.GetUserId(c))
 | 
				
			||||||
	p := actions.GetPermissionFromContext(c)
 | 
						p := actions.GetPermissionFromContext(c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -190,3 +190,28 @@ func (e TmPlatformAccount) Delete(c *gin.Context) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	e.OK(req.GetId(), "删除成功")
 | 
						e.OK(req.GetId(), "删除成功")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// checkRemain 查询剩余翻译条数
 | 
				
			||||||
 | 
					func (e TmPlatformAccount) QueryRemain(c *gin.Context) {
 | 
				
			||||||
 | 
						req := dto.TmPlatformAccountQueryRemainReq{}
 | 
				
			||||||
 | 
						s := service.TmPlatformAccount{}
 | 
				
			||||||
 | 
						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)
 | 
				
			||||||
 | 
						err = s.QueryRemain(&req, p)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Error(500, err, fmt.Sprintf("查询剩余翻译条数失败,\r\n失败信息 %s", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						e.OK(nil, "查询成功")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -47,7 +47,7 @@ func (e TmRechargeLog) GetPage(c *gin.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// 创建充值订单
 | 
					// 创建充值订单
 | 
				
			||||||
func (e TmRechargeLog) CreateOrder(c *gin.Context) {
 | 
					func (e TmRechargeLog) CreateOrder(c *gin.Context) {
 | 
				
			||||||
	req := dto.TmRechargeCreateOrderReq{}
 | 
						req := dto.CustomCreateOrderReq{}
 | 
				
			||||||
	s := service.TmRechargeLog{}
 | 
						s := service.TmRechargeLog{}
 | 
				
			||||||
	err := e.MakeContext(c).
 | 
						err := e.MakeContext(c).
 | 
				
			||||||
		MakeOrm().
 | 
							MakeOrm().
 | 
				
			||||||
@ -60,15 +60,22 @@ func (e TmRechargeLog) CreateOrder(c *gin.Context) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						userId := user.GetUserId(c)
 | 
				
			||||||
	apiKey := c.GetString("apiKey")
 | 
						apiKey := c.GetString("apiKey")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	code := s.CreateOrder(&req, apiKey)
 | 
						if code := req.Validate(); code != statuscode.Success {
 | 
				
			||||||
 | 
							e.Error(code, nil, statuscode.ErrorMessage[code])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req.UserId = userId
 | 
				
			||||||
 | 
						resp := dto.CustomCreateOrderResp{}
 | 
				
			||||||
 | 
						code := s.CreateOrder(&req, &resp, apiKey)
 | 
				
			||||||
	if code != statuscode.Success {
 | 
						if code != statuscode.Success {
 | 
				
			||||||
		e.OK(code, statuscode.ErrorMessage[code])
 | 
							e.Error(code, nil, statuscode.ErrorMessage[code])
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	e.OK(nil, "success")
 | 
						e.OK(resp, "success")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 后台充值
 | 
					// 后台充值
 | 
				
			||||||
@ -103,6 +110,29 @@ func (e TmRechargeLog) ManagerRecharge(c *gin.Context) {
 | 
				
			|||||||
	e.OK(nil, "充值成功")
 | 
						e.OK(nil, "充值成功")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 后台扣除
 | 
				
			||||||
 | 
					func (e TmRechargeLog) ManagerDeduct(c *gin.Context) {
 | 
				
			||||||
 | 
						s := service.TmRechargeLog{}
 | 
				
			||||||
 | 
						req := dto.TmRechargeManageDeductReq{}
 | 
				
			||||||
 | 
						err := e.MakeContext(c).
 | 
				
			||||||
 | 
							MakeOrm().
 | 
				
			||||||
 | 
							Bind(&req).
 | 
				
			||||||
 | 
							MakeService(&s.Service).
 | 
				
			||||||
 | 
							Errors
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Error(500, err, "")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = s.ManagerDeduct(&req)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Error(500, err, "")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						e.OK(nil, "扣除成功")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 获取即将过期充值记录
 | 
					// 获取即将过期充值记录
 | 
				
			||||||
func (e TmMember) GetMemberAdvent(c *gin.Context) {
 | 
					func (e TmMember) GetMemberAdvent(c *gin.Context) {
 | 
				
			||||||
	s := service.TmRechargeLog{}
 | 
						s := service.TmRechargeLog{}
 | 
				
			||||||
@ -129,3 +159,28 @@ func (e TmMember) GetMemberAdvent(c *gin.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	e.OK(datas, "success")
 | 
						e.OK(datas, "success")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 获取充值订单详情
 | 
				
			||||||
 | 
					func (e *TmRechargeLog) GetOrderInfo(c *gin.Context) {
 | 
				
			||||||
 | 
						req := dto.TmRechargeLogGetOrderInfoReq{}
 | 
				
			||||||
 | 
						s := service.TmRechargeLog{}
 | 
				
			||||||
 | 
						err := e.MakeContext(c).
 | 
				
			||||||
 | 
							MakeOrm().
 | 
				
			||||||
 | 
							Bind(&req).
 | 
				
			||||||
 | 
							MakeService(&s.Service).
 | 
				
			||||||
 | 
							Errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Error(500, err, "")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp := dto.TmRechargeLogGetOrderInfoResp{}
 | 
				
			||||||
 | 
						err = s.GetOrderInfo(&req, &resp)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Error(500, nil, err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						e.OK(resp, "success")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										221
									
								
								app/admin/apis/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								app/admin/apis/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,221 @@
 | 
				
			|||||||
 | 
					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"
 | 
				
			||||||
 | 
						"go-admin/common/statuscode"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackage struct {
 | 
				
			||||||
 | 
						api.Api
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetPage 获取tm_recharge_package列表
 | 
				
			||||||
 | 
					// @Summary 获取tm_recharge_package列表
 | 
				
			||||||
 | 
					// @Description 获取tm_recharge_package列表
 | 
				
			||||||
 | 
					// @Tags tm_recharge_package
 | 
				
			||||||
 | 
					// @Param platformId query int64 false "平台id"
 | 
				
			||||||
 | 
					// @Param status query int64 false "状态 1-启用 2-禁用"
 | 
				
			||||||
 | 
					// @Param pageSize query int false "页条数"
 | 
				
			||||||
 | 
					// @Param pageIndex query int false "页码"
 | 
				
			||||||
 | 
					// @Success 200 {object} response.Response{data=response.Page{list=[]models.TmRechargePackage}} "{"code": 200, "data": [...]}"
 | 
				
			||||||
 | 
					// @Router /api/v1/tm-recharge-package [get]
 | 
				
			||||||
 | 
					// @Security Bearer
 | 
				
			||||||
 | 
					func (e TmRechargePackage) GetPage(c *gin.Context) {
 | 
				
			||||||
 | 
						req := dto.TmRechargePackageGetPageReq{}
 | 
				
			||||||
 | 
						s := service.TmRechargePackage{}
 | 
				
			||||||
 | 
						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.TmRechargePackage, 0)
 | 
				
			||||||
 | 
						var count int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = s.GetPage(&req, p, &list, &count)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Error(500, err, fmt.Sprintf("获取tm_recharge_package失败,\r\n失败信息 %s", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Get 获取tm_recharge_package
 | 
				
			||||||
 | 
					// @Summary 获取tm_recharge_package
 | 
				
			||||||
 | 
					// @Description 获取tm_recharge_package
 | 
				
			||||||
 | 
					// @Tags tm_recharge_package
 | 
				
			||||||
 | 
					// @Param id path int false "id"
 | 
				
			||||||
 | 
					// @Success 200 {object} response.Response{data=models.TmRechargePackage} "{"code": 200, "data": [...]}"
 | 
				
			||||||
 | 
					// @Router /api/v1/tm-recharge-package/{id} [get]
 | 
				
			||||||
 | 
					// @Security Bearer
 | 
				
			||||||
 | 
					func (e TmRechargePackage) Get(c *gin.Context) {
 | 
				
			||||||
 | 
						req := dto.TmRechargePackageGetReq{}
 | 
				
			||||||
 | 
						s := service.TmRechargePackage{}
 | 
				
			||||||
 | 
						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.TmRechargePackage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p := actions.GetPermissionFromContext(c)
 | 
				
			||||||
 | 
						err = s.Get(&req, p, &object)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Error(500, err, fmt.Sprintf("获取tm_recharge_package失败,\r\n失败信息 %s", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						e.OK(object, "查询成功")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Insert 创建tm_recharge_package
 | 
				
			||||||
 | 
					// @Summary 创建tm_recharge_package
 | 
				
			||||||
 | 
					// @Description 创建tm_recharge_package
 | 
				
			||||||
 | 
					// @Tags tm_recharge_package
 | 
				
			||||||
 | 
					// @Accept application/json
 | 
				
			||||||
 | 
					// @Product application/json
 | 
				
			||||||
 | 
					// @Param data body dto.TmRechargePackageInsertReq true "data"
 | 
				
			||||||
 | 
					// @Success 200 {object} response.Response	"{"code": 200, "message": "添加成功"}"
 | 
				
			||||||
 | 
					// @Router /api/v1/tm-recharge-package [post]
 | 
				
			||||||
 | 
					// @Security Bearer
 | 
				
			||||||
 | 
					func (e TmRechargePackage) Insert(c *gin.Context) {
 | 
				
			||||||
 | 
						req := dto.TmRechargePackageInsertReq{}
 | 
				
			||||||
 | 
						s := service.TmRechargePackage{}
 | 
				
			||||||
 | 
						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("创建tm_recharge_package失败,\r\n失败信息 %s", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						e.OK(req.GetId(), "创建成功")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Update 修改tm_recharge_package
 | 
				
			||||||
 | 
					// @Summary 修改tm_recharge_package
 | 
				
			||||||
 | 
					// @Description 修改tm_recharge_package
 | 
				
			||||||
 | 
					// @Tags tm_recharge_package
 | 
				
			||||||
 | 
					// @Accept application/json
 | 
				
			||||||
 | 
					// @Product application/json
 | 
				
			||||||
 | 
					// @Param id path int true "id"
 | 
				
			||||||
 | 
					// @Param data body dto.TmRechargePackageUpdateReq true "body"
 | 
				
			||||||
 | 
					// @Success 200 {object} response.Response	"{"code": 200, "message": "修改成功"}"
 | 
				
			||||||
 | 
					// @Router /api/v1/tm-recharge-package/{id} [put]
 | 
				
			||||||
 | 
					// @Security Bearer
 | 
				
			||||||
 | 
					func (e TmRechargePackage) Update(c *gin.Context) {
 | 
				
			||||||
 | 
						req := dto.TmRechargePackageUpdateReq{}
 | 
				
			||||||
 | 
						s := service.TmRechargePackage{}
 | 
				
			||||||
 | 
						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("修改tm_recharge_package失败,\r\n失败信息 %s", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						e.OK(req.GetId(), "修改成功")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Delete 删除tm_recharge_package
 | 
				
			||||||
 | 
					// @Summary 删除tm_recharge_package
 | 
				
			||||||
 | 
					// @Description 删除tm_recharge_package
 | 
				
			||||||
 | 
					// @Tags tm_recharge_package
 | 
				
			||||||
 | 
					// @Param data body dto.TmRechargePackageDeleteReq true "body"
 | 
				
			||||||
 | 
					// @Success 200 {object} response.Response	"{"code": 200, "message": "删除成功"}"
 | 
				
			||||||
 | 
					// @Router /api/v1/tm-recharge-package [delete]
 | 
				
			||||||
 | 
					// @Security Bearer
 | 
				
			||||||
 | 
					func (e TmRechargePackage) Delete(c *gin.Context) {
 | 
				
			||||||
 | 
						s := service.TmRechargePackage{}
 | 
				
			||||||
 | 
						req := dto.TmRechargePackageDeleteReq{}
 | 
				
			||||||
 | 
						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("删除tm_recharge_package失败,\r\n失败信息 %s", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						e.OK(req.GetId(), "删除成功")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetFrontList 获取前端列表
 | 
				
			||||||
 | 
					func (e TmRechargePackage) GetFrontList(c *gin.Context) {
 | 
				
			||||||
 | 
						req := dto.TmRechargePackageGetListReq{}
 | 
				
			||||||
 | 
						s := service.TmRechargePackage{}
 | 
				
			||||||
 | 
						err := e.MakeContext(c).
 | 
				
			||||||
 | 
							MakeOrm().
 | 
				
			||||||
 | 
							Bind(&req).
 | 
				
			||||||
 | 
							MakeService(&s.Service).
 | 
				
			||||||
 | 
							Errors
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Logger.Error(err)
 | 
				
			||||||
 | 
							e.Error(statuscode.ServerError, nil, statuscode.ErrorMessage[statuscode.ServerError])
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						userId := user.GetUserId(c)
 | 
				
			||||||
 | 
						list := make([]dto.TmRechargePackageGetListResp, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						code := s.GetFrontList(&req, userId, &list)
 | 
				
			||||||
 | 
						if code != statuscode.Success {
 | 
				
			||||||
 | 
							e.Error(code, nil, statuscode.ErrorMessage[code])
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						e.OK(list, "success")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -16,7 +16,7 @@ type Translate struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 公开翻译接口
 | 
					// 公开翻译接口
 | 
				
			||||||
func (e *Translate) Translate(c *gin.Context) {
 | 
					func (e Translate) Translate(c *gin.Context) {
 | 
				
			||||||
	req := dto.TranslateReq{}
 | 
						req := dto.TranslateReq{}
 | 
				
			||||||
	s := service.TranslatorService{}
 | 
						s := service.TranslatorService{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -42,7 +42,7 @@ func (e *Translate) Translate(c *gin.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if code != statuscode.Success {
 | 
						if code != statuscode.Success {
 | 
				
			||||||
		e.Logger.Error(err)
 | 
							e.Logger.Error(err)
 | 
				
			||||||
		e.OK(code, statuscode.ErrorMessage[code])
 | 
							e.Error(code, nil, statuscode.ErrorMessage[code])
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -50,7 +50,7 @@ func (e *Translate) Translate(c *gin.Context) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 获取个人翻译统计
 | 
					// 获取个人翻译统计
 | 
				
			||||||
func (e *Translate) GetTranslateStatistic(c *gin.Context) {
 | 
					func (e Translate) GetTranslateStatistic(c *gin.Context) {
 | 
				
			||||||
	req := dto.TranslateStatisticReq{}
 | 
						req := dto.TranslateStatisticReq{}
 | 
				
			||||||
	s := service.TmMember{}
 | 
						s := service.TmMember{}
 | 
				
			||||||
	err := e.MakeContext(c).
 | 
						err := e.MakeContext(c).
 | 
				
			||||||
 | 
				
			|||||||
@ -9,13 +9,15 @@ import (
 | 
				
			|||||||
type TmPlatform struct {
 | 
					type TmPlatform struct {
 | 
				
			||||||
	models.Model
 | 
						models.Model
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Name        string          `json:"name" gorm:"type:varchar(20);comment:平台名称"`
 | 
						Name           string          `json:"name" gorm:"type:varchar(20);comment:平台名称"`
 | 
				
			||||||
	ShowName    string          `json:"showName" gorm:"type:varchar(20);comment:展示名称"`
 | 
						ShowName       string          `json:"showName" gorm:"type:varchar(20);comment:展示名称"`
 | 
				
			||||||
	ApiBaseUrl  string          `json:"apiBaseUrl" gorm:"type:varchar(500);comment:平台接口地址"`
 | 
						ApiBaseUrl     string          `json:"apiBaseUrl" gorm:"type:varchar(500);comment:平台接口地址"`
 | 
				
			||||||
	Description string          `json:"description" gorm:"type:varchar(255);comment:描述"`
 | 
						Description    string          `json:"description" gorm:"type:varchar(255);comment:描述"`
 | 
				
			||||||
	Code        string          `json:"code" gorm:"type:varchar(20);comment:平台编码(字典 tm_platform)"`
 | 
						Code           string          `json:"code" gorm:"type:varchar(20);comment:平台编码(字典 tm_platform)"`
 | 
				
			||||||
	Character   string          `json:"character" gorm:"type:int;comment:字符数"`
 | 
						Character      int             `json:"character" gorm:"type:int;comment:字符数"`
 | 
				
			||||||
	Price       decimal.Decimal `json:"price" gorm:"type:decimal(10,2);comment:单价"`
 | 
						Price          decimal.Decimal `json:"price" gorm:"type:decimal(10,2);comment:单价"`
 | 
				
			||||||
 | 
						BlockChain     string          `json:"blockChain" gorm:"type:varchar(20);comment:区块链(全小写)"`
 | 
				
			||||||
 | 
						ReceiveAddress string          `json:"receiveAddress" gorm:"type:varchar(100);comment:接收地址"`
 | 
				
			||||||
	models.ModelTime
 | 
						models.ModelTime
 | 
				
			||||||
	models.ControlBy
 | 
						models.ControlBy
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -10,19 +10,20 @@ import (
 | 
				
			|||||||
type TmRechargeLog struct {
 | 
					type TmRechargeLog struct {
 | 
				
			||||||
	models.Model
 | 
						models.Model
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Type           int             `json:"type" gorm:"column:type;type:tinyint;not null;comment:类型 1-充值 2-后台充值 3-赠送"`
 | 
						Type            int             `json:"type" gorm:"column:type;type:tinyint;not null;comment:类型 1-充值 2-后台充值 3-赠送"`
 | 
				
			||||||
	OrderNo        string          `json:"orderNo" gorm:"column:order_no;type:varchar(36);not null;comment:订单号"`
 | 
						OrderNo         string          `json:"orderNo" gorm:"column:order_no;type:varchar(36);not null;comment:订单号"`
 | 
				
			||||||
	UserId         int             `json:"userId" gorm:"column:user_id;type:bigint;not null;comment:用户id"`
 | 
						UserId          int             `json:"userId" gorm:"column:user_id;type:bigint;not null;comment:用户id"`
 | 
				
			||||||
	MemberId       int             `json:"memberId" gorm:"column:member_id;type:bigint;not null;comment:翻译用户id"`
 | 
						MemberId        int             `json:"memberId" gorm:"column:member_id;type:bigint;not null;comment:翻译用户id"`
 | 
				
			||||||
	PlatformId     int             `json:"platformId" gorm:"column:platform_id;type:bigint;not null;comment:平台id"`
 | 
						PlatformId      int             `json:"platformId" gorm:"column:platform_id;type:bigint;not null;comment:平台id"`
 | 
				
			||||||
	Status         int             `json:"status" gorm:"column:status;type:tinyint;not null;comment:状态 1-待支付 2-已支付 3-已取消 4-申请退款 5-已退款 6-已过期"`
 | 
						Status          int             `json:"status" gorm:"column:status;type:tinyint;not null;comment:状态 1-待支付 2-已支付 3-已取消 4-申请退款 5-已退款 6-已过期"`
 | 
				
			||||||
	TotalChars     int             `json:"totalChars" gorm:"column:total_chars;type:bigint;not null;comment:充值字符数"`
 | 
						TotalChars      int             `json:"totalChars" gorm:"column:total_chars;type:bigint;not null;comment:充值字符数"`
 | 
				
			||||||
	TxHash         string          `json:"txHash" gorm:"column:tx_hash;type:varchar(64);comment:交易hash"`
 | 
						TxHash          string          `json:"txHash" gorm:"column:tx_hash;type:varchar(64);comment:交易hash"`
 | 
				
			||||||
	Amount         decimal.Decimal `json:"amount" gorm:"column:amount;type:decimal(10,6);not null;comment:充值金额U"`
 | 
						Amount          decimal.Decimal `json:"amount" gorm:"column:amount;type:decimal(10,6);not null;comment:充值金额U"`
 | 
				
			||||||
	ReceiveChannel string          `json:"receiveChannel" gorm:"column:receive_channel;type:varchar(100);not null;comment:充值渠道"`
 | 
						ReceiveChannel  string          `json:"receiveChannel" gorm:"column:receive_channel;type:varchar(100);not null;comment:充值渠道"`
 | 
				
			||||||
	ReceiveAddress string          `json:"receiveAddress" gorm:"column:receive_address;type:varchar(100);not null;comment:充值地址"`
 | 
						ReceiveAddress  string          `json:"receiveAddress" gorm:"column:receive_address;type:varchar(100);not null;comment:充值地址"`
 | 
				
			||||||
	PayTime        *time.Time      `json:"payTime" gorm:"column:pay_time;type:datetime;comment:支付时间"`
 | 
						PayTime         *time.Time      `json:"payTime" gorm:"column:pay_time;type:datetime;comment:支付时间"`
 | 
				
			||||||
	ExpireAt       time.Time       `json:"expireAt" gorm:"column:expire_at;type:datetime;not null;comment:过期时间"`
 | 
						ExpireAt        time.Time       `json:"expireAt" gorm:"column:expire_at;type:datetime;not null;comment:过期时间"`
 | 
				
			||||||
 | 
						OrderExpireTime *time.Time      `json:"orderExpireTime" gorm:"column:order_expire_time;type:datetime;comment:订单过期时间"`
 | 
				
			||||||
	models.ModelTime
 | 
						models.ModelTime
 | 
				
			||||||
	models.ControlBy
 | 
						models.ControlBy
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										30
									
								
								app/admin/models/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								app/admin/models/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"go-admin/common/models"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/shopspring/decimal"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackage struct {
 | 
				
			||||||
 | 
						models.Model
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PlatformId int             `json:"platformId" gorm:"type:bigint;comment:平台id"`
 | 
				
			||||||
 | 
						Amount     decimal.Decimal `json:"amount" gorm:"type:decimal(10,6);comment:套餐金额(U)"`
 | 
				
			||||||
 | 
						Status     int             `json:"status" gorm:"type:tinyint;comment:状态 1-启用 2-禁用"`
 | 
				
			||||||
 | 
						models.ModelTime
 | 
				
			||||||
 | 
						models.ControlBy
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (TmRechargePackage) TableName() string {
 | 
				
			||||||
 | 
						return "tm_recharge_package"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *TmRechargePackage) Generate() models.ActiveRecord {
 | 
				
			||||||
 | 
						o := *e
 | 
				
			||||||
 | 
						return &o
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *TmRechargePackage) GetId() interface{} {
 | 
				
			||||||
 | 
						return e.Id
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -26,8 +26,9 @@ func registerTmMemberRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddl
 | 
				
			|||||||
		r.DELETE("", api.Delete)
 | 
							r.DELETE("", api.Delete)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// r.POST("recharge", actions.PermissionAction(), api.Recharge)  //字符充值
 | 
							// r.POST("recharge", actions.PermissionAction(), api.Recharge)  //字符充值
 | 
				
			||||||
		r.POST("manager-recharge", actions.PermissionAction(), rechargeApi.ManagerRecharge)
 | 
							r.POST("manager-recharge", actions.PermissionAction(), rechargeApi.ManagerRecharge) //手动充值
 | 
				
			||||||
		r.PUT("status", actions.PermissionAction(), api.ChangeStatus) //状态变更
 | 
							r.PUT("manager-deduct", actions.PermissionAction(), rechargeApi.ManagerDeduct)      //手动扣除
 | 
				
			||||||
 | 
							r.PUT("status", actions.PermissionAction(), api.ChangeStatus)                       //状态变更
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r2 := v1.Group("/tm-member").Use(authMiddleware.MiddlewareFunc())
 | 
						r2 := v1.Group("/tm-member").Use(authMiddleware.MiddlewareFunc())
 | 
				
			||||||
@ -35,5 +36,8 @@ func registerTmMemberRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddl
 | 
				
			|||||||
		r2.GET("/api-key", api.GetMyApiKey)
 | 
							r2.GET("/api-key", api.GetMyApiKey)
 | 
				
			||||||
		r2.GET("platforms", api.GetPlatforms)
 | 
							r2.GET("platforms", api.GetPlatforms)
 | 
				
			||||||
		r2.GET("member-advent", api.GetMemberAdvent) //获取用户即将过期的充值信息
 | 
							r2.GET("member-advent", api.GetMemberAdvent) //获取用户即将过期的充值信息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							r2.POST("recharge", rechargeApi.CreateOrder) //用户发起充值
 | 
				
			||||||
 | 
							r2.GET("order", rechargeApi.GetOrderInfo)    //获取充值订单信息
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,8 +5,8 @@ import (
 | 
				
			|||||||
	jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
 | 
						jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go-admin/app/admin/apis"
 | 
						"go-admin/app/admin/apis"
 | 
				
			||||||
	"go-admin/common/middleware"
 | 
					 | 
				
			||||||
	"go-admin/common/actions"
 | 
						"go-admin/common/actions"
 | 
				
			||||||
 | 
						"go-admin/common/middleware"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
@ -23,5 +23,7 @@ func registerTmPlatformAccountRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi
 | 
				
			|||||||
		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.PUT("query-remain/:id", actions.PermissionAction(), api.QueryRemain) //查询平台剩余字符
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										27
									
								
								app/admin/router/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								app/admin/router/tm_recharge_package.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, registerTmRechargePackageRouter)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// registerTmRechargePackageRouter
 | 
				
			||||||
 | 
					func registerTmRechargePackageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
 | 
				
			||||||
 | 
						api := apis.TmRechargePackage{}
 | 
				
			||||||
 | 
						r := v1.Group("/tm-recharge-package").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)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,9 +1,11 @@
 | 
				
			|||||||
package dto
 | 
					package dto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
	"go-admin/app/admin/models"
 | 
						"go-admin/app/admin/models"
 | 
				
			||||||
	"go-admin/common/dto"
 | 
						"go-admin/common/dto"
 | 
				
			||||||
	common "go-admin/common/models"
 | 
						common "go-admin/common/models"
 | 
				
			||||||
 | 
						"go-admin/utils/chainhelper"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/shopspring/decimal"
 | 
						"github.com/shopspring/decimal"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@ -40,17 +42,43 @@ func (m *TmPlatformGetPageReq) GetNeedSearch() interface{} {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TmPlatformInsertReq struct {
 | 
					type TmPlatformInsertReq struct {
 | 
				
			||||||
	Id          int             `json:"-" comment:"平台id"` // 平台id
 | 
						Id             int             `json:"-" comment:"平台id"` // 平台id
 | 
				
			||||||
	Name        string          `json:"name" comment:"平台名称"`
 | 
						Name           string          `json:"name" comment:"平台名称"`
 | 
				
			||||||
	ShowName    string          `json:"showName" comment:"展示名称"`
 | 
						ShowName       string          `json:"showName" comment:"展示名称"`
 | 
				
			||||||
	ApiBaseUrl  string          `json:"apiBaseUrl" comment:"平台接口地址"`
 | 
						ApiBaseUrl     string          `json:"apiBaseUrl" comment:"平台接口地址"`
 | 
				
			||||||
	Description string          `json:"description" comment:"描述"`
 | 
						Description    string          `json:"description" comment:"描述"`
 | 
				
			||||||
	Code        string          `json:"code" comment:"平台编码(字典 tm_platform)"`
 | 
						Code           string          `json:"code" comment:"平台编码(字典 tm_platform)"`
 | 
				
			||||||
	Character   string          `json:"character" comment:"字符数"`
 | 
						Character      int             `json:"character" comment:"字符数"`
 | 
				
			||||||
	Price       decimal.Decimal `json:"price" comment:"单价"`
 | 
						Price          decimal.Decimal `json:"price" comment:"单价"`
 | 
				
			||||||
 | 
						BlockChain     string          `json:"blockChain" comment:"链区块"`
 | 
				
			||||||
 | 
						ReceiveAddress string          `json:"receiveAddress" comment:"接收地址"`
 | 
				
			||||||
	common.ControlBy
 | 
						common.ControlBy
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *TmPlatformInsertReq) Validate() error {
 | 
				
			||||||
 | 
						if s.BlockChain == "" {
 | 
				
			||||||
 | 
							return errors.New("收款区块不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s.ReceiveAddress == "" {
 | 
				
			||||||
 | 
							return errors.New("接收地址不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s.Name == "" {
 | 
				
			||||||
 | 
							return errors.New("平台名称不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s.ShowName == "" {
 | 
				
			||||||
 | 
							return errors.New("展示名称不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s.Code == "" {
 | 
				
			||||||
 | 
							return errors.New("平台编码不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return chainhelper.JudgeChainAddress(s.BlockChain, s.ReceiveAddress)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *TmPlatformInsertReq) Generate(model *models.TmPlatform) {
 | 
					func (s *TmPlatformInsertReq) Generate(model *models.TmPlatform) {
 | 
				
			||||||
	if s.Id == 0 {
 | 
						if s.Id == 0 {
 | 
				
			||||||
		model.Model = common.Model{Id: s.Id}
 | 
							model.Model = common.Model{Id: s.Id}
 | 
				
			||||||
@ -63,6 +91,8 @@ func (s *TmPlatformInsertReq) Generate(model *models.TmPlatform) {
 | 
				
			|||||||
	model.Character = s.Character
 | 
						model.Character = s.Character
 | 
				
			||||||
	model.Price = s.Price
 | 
						model.Price = s.Price
 | 
				
			||||||
	model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
 | 
						model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
 | 
				
			||||||
 | 
						model.BlockChain = s.BlockChain
 | 
				
			||||||
 | 
						model.ReceiveAddress = s.ReceiveAddress
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *TmPlatformInsertReq) GetId() interface{} {
 | 
					func (s *TmPlatformInsertReq) GetId() interface{} {
 | 
				
			||||||
@ -77,17 +107,43 @@ type TmPlatformListResp struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TmPlatformUpdateReq struct {
 | 
					type TmPlatformUpdateReq struct {
 | 
				
			||||||
	Id          int             `uri:"id" comment:"平台id"` // 平台id
 | 
						Id             int             `uri:"id" comment:"平台id"` // 平台id
 | 
				
			||||||
	Name        string          `json:"name" comment:"平台名称"`
 | 
						Name           string          `json:"name" comment:"平台名称"`
 | 
				
			||||||
	ShowName    string          `json:"showName" comment:"展示名称"`
 | 
						ShowName       string          `json:"showName" comment:"展示名称"`
 | 
				
			||||||
	ApiBaseUrl  string          `json:"apiBaseUrl" comment:"平台接口地址"`
 | 
						ApiBaseUrl     string          `json:"apiBaseUrl" comment:"平台接口地址"`
 | 
				
			||||||
	Description string          `json:"description" comment:"描述"`
 | 
						Description    string          `json:"description" comment:"描述"`
 | 
				
			||||||
	Code        string          `json:"code" comment:"平台编码(字典 tm_platform)"`
 | 
						Code           string          `json:"code" comment:"平台编码(字典 tm_platform)"`
 | 
				
			||||||
	Character   string          `json:"character" comment:"字符数"`
 | 
						Character      int             `json:"character" comment:"字符数"`
 | 
				
			||||||
	Price       decimal.Decimal `json:"price" comment:"单价"`
 | 
						Price          decimal.Decimal `json:"price" comment:"单价"`
 | 
				
			||||||
 | 
						BlockChain     string          `json:"blockChain" comment:"链区块"`
 | 
				
			||||||
 | 
						ReceiveAddress string          `json:"receiveAddress" comment:"接收地址"`
 | 
				
			||||||
	common.ControlBy
 | 
						common.ControlBy
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *TmPlatformUpdateReq) Validate() error {
 | 
				
			||||||
 | 
						if s.BlockChain == "" {
 | 
				
			||||||
 | 
							return errors.New("收款区块不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s.ReceiveAddress == "" {
 | 
				
			||||||
 | 
							return errors.New("接收地址不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s.Name == "" {
 | 
				
			||||||
 | 
							return errors.New("平台名称不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s.ShowName == "" {
 | 
				
			||||||
 | 
							return errors.New("展示名称不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s.Code == "" {
 | 
				
			||||||
 | 
							return errors.New("平台编码不能为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return chainhelper.JudgeChainAddress(s.BlockChain, s.ReceiveAddress)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *TmPlatformUpdateReq) Generate(model *models.TmPlatform) {
 | 
					func (s *TmPlatformUpdateReq) Generate(model *models.TmPlatform) {
 | 
				
			||||||
	if s.Id == 0 {
 | 
						if s.Id == 0 {
 | 
				
			||||||
		model.Model = common.Model{Id: s.Id}
 | 
							model.Model = common.Model{Id: s.Id}
 | 
				
			||||||
@ -100,6 +156,8 @@ func (s *TmPlatformUpdateReq) Generate(model *models.TmPlatform) {
 | 
				
			|||||||
	model.Character = s.Character
 | 
						model.Character = s.Character
 | 
				
			||||||
	model.Price = s.Price
 | 
						model.Price = s.Price
 | 
				
			||||||
	model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
 | 
						model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
 | 
				
			||||||
 | 
						model.BlockChain = s.BlockChain
 | 
				
			||||||
 | 
						model.ReceiveAddress = s.ReceiveAddress
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *TmPlatformUpdateReq) GetId() interface{} {
 | 
					func (s *TmPlatformUpdateReq) GetId() interface{} {
 | 
				
			||||||
 | 
				
			|||||||
@ -95,3 +95,7 @@ type TmPlatformAccountDeleteReq struct {
 | 
				
			|||||||
func (s *TmPlatformAccountDeleteReq) GetId() interface{} {
 | 
					func (s *TmPlatformAccountDeleteReq) GetId() interface{} {
 | 
				
			||||||
	return s.Ids
 | 
						return s.Ids
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmPlatformAccountQueryRemainReq struct {
 | 
				
			||||||
 | 
						Id int `uri:"id"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,6 +5,7 @@ import (
 | 
				
			|||||||
	"go-admin/app/admin/models"
 | 
						"go-admin/app/admin/models"
 | 
				
			||||||
	"go-admin/common/dto"
 | 
						"go-admin/common/dto"
 | 
				
			||||||
	common "go-admin/common/models"
 | 
						common "go-admin/common/models"
 | 
				
			||||||
 | 
						"go-admin/common/statuscode"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/shopspring/decimal"
 | 
						"github.com/shopspring/decimal"
 | 
				
			||||||
@ -93,7 +94,7 @@ type TmRechargeLogResp struct {
 | 
				
			|||||||
	CreatedAt      string          `json:"createdAt"`
 | 
						CreatedAt      string          `json:"createdAt"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 用户充值订单创建请求参数
 | 
					// 后台-用户充值订单创建请求参数
 | 
				
			||||||
type TmRechargeCreateOrderReq struct {
 | 
					type TmRechargeCreateOrderReq struct {
 | 
				
			||||||
	Type           int             `json:"type" comment:"充值类型 1-用户充值 2-平台充值"`
 | 
						Type           int             `json:"type" comment:"充值类型 1-用户充值 2-平台充值"`
 | 
				
			||||||
	MemberId       int             `json:"memberId" comment:"会员id"`
 | 
						MemberId       int             `json:"memberId" comment:"会员id"`
 | 
				
			||||||
@ -108,6 +109,62 @@ type TmRechargeCreateOrderReq struct {
 | 
				
			|||||||
	common.ControlBy
 | 
						common.ControlBy
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 后台扣除字符
 | 
				
			||||||
 | 
					type TmRechargeManageDeductReq struct {
 | 
				
			||||||
 | 
						MemberId   int             `json:"memberId" comment:"会员id"`
 | 
				
			||||||
 | 
						UserId     int             `json:"userId" comment:"用户id"`
 | 
				
			||||||
 | 
						PlatformId int             `json:"platformId" comment:"平台id"`
 | 
				
			||||||
 | 
						TotalChars decimal.Decimal `json:"totalChars" comment:"扣减字符"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *TmRechargeManageDeductReq) Generate(entity *models.TmRechargeLog) error {
 | 
				
			||||||
 | 
						if entity == nil {
 | 
				
			||||||
 | 
							entity = &models.TmRechargeLog{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e.MemberId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("会员不存在")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e.PlatformId <= 0 {
 | 
				
			||||||
 | 
							return errors.New("平台不存在")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						entity.MemberId = e.MemberId
 | 
				
			||||||
 | 
						entity.UserId = e.UserId
 | 
				
			||||||
 | 
						entity.PlatformId = e.PlatformId
 | 
				
			||||||
 | 
						entity.Type = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 用户充值订单创建请求参数
 | 
				
			||||||
 | 
					type CustomCreateOrderReq struct {
 | 
				
			||||||
 | 
						UserId     int `json:"userId" comment:"用户id"`
 | 
				
			||||||
 | 
						PlatformId int `json:"platformId" comment:"平台id"`
 | 
				
			||||||
 | 
						Count      int `json:"count" comment:"购买数量"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *CustomCreateOrderReq) Validate() int {
 | 
				
			||||||
 | 
						if e.Count <= 0 {
 | 
				
			||||||
 | 
							return statuscode.RechargeNumberMustBeGreaterThanZero
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e.PlatformId <= 0 {
 | 
				
			||||||
 | 
							return statuscode.PlatformNotSupport
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return statuscode.Success
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CustomCreateOrderResp struct {
 | 
				
			||||||
 | 
						OrderNo        string `json:"orderNo"`
 | 
				
			||||||
 | 
						Amount         string `json:"amount"`
 | 
				
			||||||
 | 
						BlockChain     string `json:"blockChain"`
 | 
				
			||||||
 | 
						ReceiveAddress string `json:"receiveAddress"`
 | 
				
			||||||
 | 
						ExpireUnix     int64  `json:"expireUnix" comment:"过期时间戳 秒"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e *TmRechargeCreateOrderReq) Validate() error {
 | 
					func (e *TmRechargeCreateOrderReq) Validate() error {
 | 
				
			||||||
	if e.ExpireDays <= 0 {
 | 
						if e.ExpireDays <= 0 {
 | 
				
			||||||
		return errors.New("过期天数必须大于0")
 | 
							return errors.New("过期天数必须大于0")
 | 
				
			||||||
@ -163,3 +220,35 @@ type TmRechargeLogFrontResp struct {
 | 
				
			|||||||
	TotalCharater  int    `json:"totalCharater"`
 | 
						TotalCharater  int    `json:"totalCharater"`
 | 
				
			||||||
	RemainCharater int    `json:"remainCharater"`
 | 
						RemainCharater int    `json:"remainCharater"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TRC20Transfer 结构体用于解析 TRC20 转账记录
 | 
				
			||||||
 | 
					type TRC20Transfer struct {
 | 
				
			||||||
 | 
						TransactionID string `json:"transaction_id"`
 | 
				
			||||||
 | 
						BlockNumber   int64  `json:"block_number"`
 | 
				
			||||||
 | 
						Timestamp     int64  `json:"block_timestamp"`
 | 
				
			||||||
 | 
						FromAddress   string `json:"from"`
 | 
				
			||||||
 | 
						ToAddress     string `json:"to"`
 | 
				
			||||||
 | 
						Value         string `json:"value"`
 | 
				
			||||||
 | 
						TokenInfo     struct {
 | 
				
			||||||
 | 
							Symbol   string `json:"symbol"`
 | 
				
			||||||
 | 
							Address  string `json:"address"`
 | 
				
			||||||
 | 
							Decimals int    `json:"decimals"`
 | 
				
			||||||
 | 
						} `json:"token_info"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargeCallbackReq struct {
 | 
				
			||||||
 | 
						PayableAmount decimal.Decimal `json:"payable_amount"`
 | 
				
			||||||
 | 
						FromAddress   string          `json:"from_address"`
 | 
				
			||||||
 | 
						ToAddress     string          `json:"to_address"`
 | 
				
			||||||
 | 
						TxHash        string          `json:"tx_hash"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargeLogGetOrderInfoReq struct {
 | 
				
			||||||
 | 
						OrderNo string `json:"orderNo" form:"orderNo" query:"orderNo" comment:"订单号"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargeLogGetOrderInfoResp struct {
 | 
				
			||||||
 | 
						Id      int    `json:"id"`
 | 
				
			||||||
 | 
						OrderNo string `json:"orderNo"`
 | 
				
			||||||
 | 
						Status  int    `json:"status"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										104
									
								
								app/admin/service/dto/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								app/admin/service/dto/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
				
			|||||||
 | 
					package dto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"go-admin/app/admin/models"
 | 
				
			||||||
 | 
						"go-admin/common/dto"
 | 
				
			||||||
 | 
						common "go-admin/common/models"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/shopspring/decimal"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackageGetPageReq struct {
 | 
				
			||||||
 | 
						dto.Pagination `search:"-"`
 | 
				
			||||||
 | 
						PlatformId     int64 `form:"platformId"  search:"type:exact;column:platform_id;table:tm_recharge_package" comment:"平台id"`
 | 
				
			||||||
 | 
						Status         int64 `form:"status"  search:"type:exact;column:status;table:tm_recharge_package" comment:"状态 1-启用 2-禁用"`
 | 
				
			||||||
 | 
						TmRechargePackageOrder
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackageOrder struct {
 | 
				
			||||||
 | 
						Id         string `form:"idOrder"  search:"type:order;column:id;table:tm_recharge_package"`
 | 
				
			||||||
 | 
						PlatformId string `form:"platformIdOrder"  search:"type:order;column:platform_id;table:tm_recharge_package"`
 | 
				
			||||||
 | 
						Amount     string `form:"amountOrder"  search:"type:order;column:amount;table:tm_recharge_package"`
 | 
				
			||||||
 | 
						Status     string `form:"statusOrder"  search:"type:order;column:status;table:tm_recharge_package"`
 | 
				
			||||||
 | 
						CreateBy   string `form:"createByOrder"  search:"type:order;column:create_by;table:tm_recharge_package"`
 | 
				
			||||||
 | 
						UpdateBy   string `form:"updateByOrder"  search:"type:order;column:update_by;table:tm_recharge_package"`
 | 
				
			||||||
 | 
						CreatedAt  string `form:"createdAtOrder"  search:"type:order;column:created_at;table:tm_recharge_package"`
 | 
				
			||||||
 | 
						UpdatedAt  string `form:"updatedAtOrder"  search:"type:order;column:updated_at;table:tm_recharge_package"`
 | 
				
			||||||
 | 
						DeletedAt  string `form:"deletedAtOrder"  search:"type:order;column:deleted_at;table:tm_recharge_package"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (m *TmRechargePackageGetPageReq) GetNeedSearch() interface{} {
 | 
				
			||||||
 | 
						return *m
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackageInsertReq struct {
 | 
				
			||||||
 | 
						Id         int             `json:"-" comment:"主键id"` // 主键id
 | 
				
			||||||
 | 
						PlatformId int             `json:"platformId" comment:"平台id"`
 | 
				
			||||||
 | 
						Amount     decimal.Decimal `json:"amount" comment:"套餐金额(U)"`
 | 
				
			||||||
 | 
						Status     int             `json:"status" comment:"状态 1-启用 2-禁用"`
 | 
				
			||||||
 | 
						common.ControlBy
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *TmRechargePackageInsertReq) Generate(model *models.TmRechargePackage) {
 | 
				
			||||||
 | 
						if s.Id == 0 {
 | 
				
			||||||
 | 
							model.Model = common.Model{Id: s.Id}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						model.PlatformId = s.PlatformId
 | 
				
			||||||
 | 
						model.Amount = s.Amount
 | 
				
			||||||
 | 
						model.Status = s.Status
 | 
				
			||||||
 | 
						model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *TmRechargePackageInsertReq) GetId() interface{} {
 | 
				
			||||||
 | 
						return s.Id
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackageUpdateReq struct {
 | 
				
			||||||
 | 
						Id         int             `uri:"id" comment:"主键id"` // 主键id
 | 
				
			||||||
 | 
						PlatformId int             `json:"platformId" comment:"平台id"`
 | 
				
			||||||
 | 
						Amount     decimal.Decimal `json:"amount" comment:"套餐金额(U)"`
 | 
				
			||||||
 | 
						Status     int             `json:"status" comment:"状态 1-启用 2-禁用"`
 | 
				
			||||||
 | 
						common.ControlBy
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *TmRechargePackageUpdateReq) Generate(model *models.TmRechargePackage) {
 | 
				
			||||||
 | 
						if s.Id == 0 {
 | 
				
			||||||
 | 
							model.Model = common.Model{Id: s.Id}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						model.PlatformId = s.PlatformId
 | 
				
			||||||
 | 
						model.Amount = s.Amount
 | 
				
			||||||
 | 
						model.Status = s.Status
 | 
				
			||||||
 | 
						model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *TmRechargePackageUpdateReq) GetId() interface{} {
 | 
				
			||||||
 | 
						return s.Id
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TmRechargePackageGetReq 功能获取请求参数
 | 
				
			||||||
 | 
					type TmRechargePackageGetReq struct {
 | 
				
			||||||
 | 
						Id int `uri:"id"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *TmRechargePackageGetReq) GetId() interface{} {
 | 
				
			||||||
 | 
						return s.Id
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TmRechargePackageDeleteReq 功能删除请求参数
 | 
				
			||||||
 | 
					type TmRechargePackageDeleteReq struct {
 | 
				
			||||||
 | 
						Ids []int `json:"ids"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *TmRechargePackageDeleteReq) GetId() interface{} {
 | 
				
			||||||
 | 
						return s.Ids
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackageGetListReq struct {
 | 
				
			||||||
 | 
						PlatformId int `form:"platformId"  comment:"平台id"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackageGetListResp struct {
 | 
				
			||||||
 | 
						Id         int             `json:"id" comment:"主键id"` // 主键id
 | 
				
			||||||
 | 
						PlatformId int             `json:"platformId" comment:"平台id"`
 | 
				
			||||||
 | 
						Amount     decimal.Decimal `json:"amount" comment:"套餐金额(U)"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -66,3 +66,11 @@ type TranslateUserInfoResp struct {
 | 
				
			|||||||
	UserApiKey  string `json:"userApiKey" comment:"用户API Key"`
 | 
						UserApiKey  string `json:"userApiKey" comment:"用户API Key"`
 | 
				
			||||||
	RemainChars int    `json:"remainChars" comment:"剩余可翻译字符数"`
 | 
						RemainChars int    `json:"remainChars" comment:"剩余可翻译字符数"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DenosiTranslateRequest struct {
 | 
				
			||||||
 | 
						Model       string    `json:"model"`
 | 
				
			||||||
 | 
						Messages    []Message `json:"messages"`
 | 
				
			||||||
 | 
						Temperature float64   `json:"temperature"`
 | 
				
			||||||
 | 
						MaxTokens   int       `json:"max_tokens"`
 | 
				
			||||||
 | 
						Stream      bool      `json:"stream"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					-- KEYS[1] = locked_payment_amounts
 | 
				
			||||||
 | 
					-- KEYS[2] = locked_payment_expire_queue
 | 
				
			||||||
 | 
					-- ARGV[1] = amount(字符串)
 | 
				
			||||||
 | 
					-- ARGV[2] = expire_ts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if redis.call("HEXISTS", KEYS[1], ARGV[1]) == 1 then
 | 
				
			||||||
 | 
					  return 0
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					redis.call("HSET", KEYS[1], ARGV[1], ARGV[2])
 | 
				
			||||||
 | 
					redis.call("ZADD", KEYS[2], ARGV[2], ARGV[1])
 | 
				
			||||||
 | 
					return 1
 | 
				
			||||||
@ -0,0 +1,80 @@
 | 
				
			|||||||
 | 
					package receiveaddressmanager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-redis/redis/v8"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func LockAmount(ctx context.Context, rdb *redis.Client, amount string, ttl time.Duration) (bool, error) {
 | 
				
			||||||
 | 
						lockKey := "locked_payment_amounts"
 | 
				
			||||||
 | 
						queueKey := "locked_payment_expire_queue"
 | 
				
			||||||
 | 
						expireTs := time.Now().Add(ttl).Unix()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						script := `
 | 
				
			||||||
 | 
						if redis.call("HEXISTS", KEYS[1], ARGV[1]) == 1 then return 0 end
 | 
				
			||||||
 | 
						redis.call("HSET", KEYS[1], ARGV[1], ARGV[2])
 | 
				
			||||||
 | 
						redis.call("ZADD", KEYS[2], ARGV[2], ARGV[1])
 | 
				
			||||||
 | 
						return 1
 | 
				
			||||||
 | 
						`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ok, err := rdb.Eval(ctx, script, []string{lockKey, queueKey}, amount, expireTs).Bool()
 | 
				
			||||||
 | 
						return ok, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 金额分配逻辑
 | 
				
			||||||
 | 
					func AllocatePaymentAmount(ctx context.Context, rdb *redis.Client, baseAmount float64, timeInterval int) (string, error) {
 | 
				
			||||||
 | 
						ttl := time.Duration(timeInterval+1) * time.Minute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := 0; i < 100; i++ {
 | 
				
			||||||
 | 
							amount := baseAmount + float64(i)*0.0001
 | 
				
			||||||
 | 
							amountStr := fmt.Sprintf("%.4f", amount)
 | 
				
			||||||
 | 
							ok, err := LockAmount(ctx, rdb, amountStr, ttl)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return "", err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ok {
 | 
				
			||||||
 | 
								return amountStr, nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return "", errors.New("无法锁定可用金额,请稍后再试")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 清理过期锁
 | 
				
			||||||
 | 
					func CleanExpiredAmountLocks(ctx context.Context, rdb *redis.Client) error {
 | 
				
			||||||
 | 
						now := time.Now().Unix()
 | 
				
			||||||
 | 
						zsetKey := "locked_payment_expire_queue"
 | 
				
			||||||
 | 
						hashKey := "locked_payment_amounts"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						amounts, err := rdb.ZRangeByScore(ctx, zsetKey, &redis.ZRangeBy{
 | 
				
			||||||
 | 
							Min: "-inf",
 | 
				
			||||||
 | 
							Max: fmt.Sprintf("%d", now),
 | 
				
			||||||
 | 
						}).Result()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(amounts) == 0 {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 删除已过期锁
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := rdb.HDel(ctx, hashKey, amounts...).Result(); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if _, err := rdb.ZRem(ctx, zsetKey, stringSliceToInterface(amounts)...).Result(); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func stringSliceToInterface(slice []string) []interface{} {
 | 
				
			||||||
 | 
						result := make([]interface{}, len(slice))
 | 
				
			||||||
 | 
						for i, v := range slice {
 | 
				
			||||||
 | 
							result[i] = v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return result
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -21,6 +21,128 @@ type TmPlatformAccount struct {
 | 
				
			|||||||
	service.Service
 | 
						service.Service
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e TmPlatformAccount) QueryRemain(req *dto.TmPlatformAccountQueryRemainReq, p *actions.DataPermission) error {
 | 
				
			||||||
 | 
						var entity models.TmPlatformAccount
 | 
				
			||||||
 | 
						err := e.Orm.Model(&entity).
 | 
				
			||||||
 | 
							Scopes(
 | 
				
			||||||
 | 
								actions.Permission(entity.TableName(), p),
 | 
				
			||||||
 | 
							).
 | 
				
			||||||
 | 
							First(&entity, req.Id).Error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return errors.New("查看对象不存在或无权查看")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = e.SyncPlatformAccount(entity)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *TmPlatformAccount) SyncPlatformAccount(entity models.TmPlatformAccount) error {
 | 
				
			||||||
 | 
						platformService := TmPlatform{Service: e.Service}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						platform, err := platformService.GetById(entity.PlatformId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("获取翻译平台消息失败 %v", err)
 | 
				
			||||||
 | 
							return errors.New("获取翻译平台消息失败")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						provider := map[string]interface{}{
 | 
				
			||||||
 | 
							entity.PlatformKey: map[string]interface{}{
 | 
				
			||||||
 | 
								"apiKey":   entity.ApiKey,
 | 
				
			||||||
 | 
								"endpoint": platform.ApiBaseUrl,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						config := TranslatorServiceConfig{
 | 
				
			||||||
 | 
							DefaultProvider: platform.Code,
 | 
				
			||||||
 | 
							ProviderConfigs: provider,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						translator, err := NewTranslatorService(&config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("创建翻译服务失败 %v", err)
 | 
				
			||||||
 | 
							return errors.New("创建翻译服务失败")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						remainCount, err := translator.providers[entity.PlatformKey].GetRemainCount()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("获取翻译平台剩余字符失败 %v", err)
 | 
				
			||||||
 | 
							return errors.New("获取翻译平台剩余字符失败")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if remainCount > 0 {
 | 
				
			||||||
 | 
							key := fmt.Sprintf(rediskey.TM_PLATEFORM_ACCOUNT_REMAIN_KEY, entity.PlatformKey, entity.ApiKey)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							redishelper.DefaultRedis.SetString(key, strconv.Itoa(remainCount))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// //如果为禁用则写入队列
 | 
				
			||||||
 | 
							// if entity.Status == 2 {
 | 
				
			||||||
 | 
							// 	listKey := fmt.Sprintf(rediskey.TM_PLATFORM_ACCOUNT_LIST_KEY, entity.PlatformKey)
 | 
				
			||||||
 | 
							// 	vals, err := redishelper.DefaultRedis.GetAllList(listKey)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 	if err != nil {
 | 
				
			||||||
 | 
							// 		e.Log.Errorf("获取redis列表失败 %v", err)
 | 
				
			||||||
 | 
							// 		return errors.New("获取redis列表失败")
 | 
				
			||||||
 | 
							// 	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 	item := models.TmPlatformAccount{}
 | 
				
			||||||
 | 
							// 	hasData := false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 	for _, val := range vals {
 | 
				
			||||||
 | 
							// 		sonic.UnmarshalString(val, &item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 		if item.ApiKey == entity.ApiKey {
 | 
				
			||||||
 | 
							// 			hasData = true
 | 
				
			||||||
 | 
							// 			break
 | 
				
			||||||
 | 
							// 		}
 | 
				
			||||||
 | 
							// 	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 	if !hasData {
 | 
				
			||||||
 | 
							// 		entity.Status = 1
 | 
				
			||||||
 | 
							// 		val, err := sonic.MarshalString(entity)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 		if err != nil {
 | 
				
			||||||
 | 
							// 			return err
 | 
				
			||||||
 | 
							// 		}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 		err = e.Orm.Transaction(func(tx *gorm.DB) error {
 | 
				
			||||||
 | 
							// 			if err1 := redishelper.DefaultRedis.RPushList(listKey, val); err1 != nil {
 | 
				
			||||||
 | 
							// 				return err
 | 
				
			||||||
 | 
							// 			}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 			if err1 := tx.Model(entity).Update("status", 1).Error; err1 != nil {
 | 
				
			||||||
 | 
							// 				return err1
 | 
				
			||||||
 | 
							// 			}
 | 
				
			||||||
 | 
							// 			return nil
 | 
				
			||||||
 | 
							// 		})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 		return nil
 | 
				
			||||||
 | 
							// 	}
 | 
				
			||||||
 | 
							// }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 同步所有第三方账号余额
 | 
				
			||||||
 | 
					func (e *TmPlatformAccount) SyncAll() error {
 | 
				
			||||||
 | 
						var datas []models.TmPlatformAccount
 | 
				
			||||||
 | 
						e.Orm.Model(&models.TmPlatformAccount{}).Where("status =1").Find(&datas)
 | 
				
			||||||
 | 
						platformService := TmPlatform{}
 | 
				
			||||||
 | 
						platformService.Orm = e.Orm
 | 
				
			||||||
 | 
						platformService.Log = e.Log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, item := range datas {
 | 
				
			||||||
 | 
							if err := e.SyncPlatformAccount(item); err != nil {
 | 
				
			||||||
 | 
								e.Log.Errorf("同步平台账号余额 密钥:%s 失败 %v", item.ApiKey, err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetPage 获取TmPlatformAccount列表
 | 
					// GetPage 获取TmPlatformAccount列表
 | 
				
			||||||
func (e *TmPlatformAccount) GetPage(c *dto.TmPlatformAccountGetPageReq, p *actions.DataPermission, list *[]models.TmPlatformAccount, count *int64) error {
 | 
					func (e *TmPlatformAccount) GetPage(c *dto.TmPlatformAccountGetPageReq, p *actions.DataPermission, list *[]models.TmPlatformAccount, count *int64) error {
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
@ -38,6 +160,18 @@ func (e *TmPlatformAccount) GetPage(c *dto.TmPlatformAccountGetPageReq, p *actio
 | 
				
			|||||||
		e.Log.Errorf("TmPlatformAccountService GetPage error:%s \r\n", err)
 | 
							e.Log.Errorf("TmPlatformAccountService GetPage error:%s \r\n", err)
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if list != nil {
 | 
				
			||||||
 | 
							for index, item := range *list {
 | 
				
			||||||
 | 
								keu := fmt.Sprintf(rediskey.TM_PLATEFORM_ACCOUNT_REMAIN_KEY, item.PlatformKey, item.ApiKey)
 | 
				
			||||||
 | 
								val, err := redishelper.DefaultRedis.GetString(keu)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								(*list)[index].RemainChars, _ = strconv.Atoi(val)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -7,16 +7,22 @@ import (
 | 
				
			|||||||
	"go-admin/app/admin/models"
 | 
						"go-admin/app/admin/models"
 | 
				
			||||||
	"go-admin/app/admin/service/dto"
 | 
						"go-admin/app/admin/service/dto"
 | 
				
			||||||
	"go-admin/app/admin/service/quota_manager"
 | 
						"go-admin/app/admin/service/quota_manager"
 | 
				
			||||||
 | 
						receiveaddressmanager "go-admin/app/admin/service/receive_address_manager"
 | 
				
			||||||
	"go-admin/common/actions"
 | 
						"go-admin/common/actions"
 | 
				
			||||||
	cDto "go-admin/common/dto"
 | 
						cDto "go-admin/common/dto"
 | 
				
			||||||
 | 
						rediskey "go-admin/common/redis_key"
 | 
				
			||||||
	"go-admin/common/statuscode"
 | 
						"go-admin/common/statuscode"
 | 
				
			||||||
	"go-admin/utils/redishelper"
 | 
						"go-admin/utils/redishelper"
 | 
				
			||||||
	"go-admin/utils/utility"
 | 
						"go-admin/utils/utility"
 | 
				
			||||||
	"sort"
 | 
						"sort"
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/bytedance/sonic"
 | 
				
			||||||
	"github.com/go-admin-team/go-admin-core/sdk/service"
 | 
						"github.com/go-admin-team/go-admin-core/sdk/service"
 | 
				
			||||||
 | 
						"github.com/go-redis/redis/v8"
 | 
				
			||||||
 | 
						"github.com/shopspring/decimal"
 | 
				
			||||||
	"gorm.io/gorm"
 | 
						"gorm.io/gorm"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -24,6 +30,42 @@ type TmRechargeLog struct {
 | 
				
			|||||||
	service.Service
 | 
						service.Service
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e TmRechargeLog) GetOrderInfo(req *dto.TmRechargeLogGetOrderInfoReq, resp *dto.TmRechargeLogGetOrderInfoResp) error {
 | 
				
			||||||
 | 
						var data models.TmRechargeLog
 | 
				
			||||||
 | 
						if err := e.Orm.Model(&models.TmRechargeLog{}).
 | 
				
			||||||
 | 
							Where("order_no =?", req.OrderNo).
 | 
				
			||||||
 | 
							First(&data).Error; err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("TmRechargeLogService GetOrderInfo error:%s \r\n", err)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp.Id = data.Id
 | 
				
			||||||
 | 
						resp.OrderNo = data.OrderNo
 | 
				
			||||||
 | 
						resp.Status = data.Status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 清理过期订单
 | 
				
			||||||
 | 
					func (e TmRechargeLog) CleanExpiredOrder() error {
 | 
				
			||||||
 | 
						expireTime := time.Now().Add(5 * time.Minute)
 | 
				
			||||||
 | 
						ctx := context.Background()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := e.Orm.Transaction(func(tx *gorm.DB) error {
 | 
				
			||||||
 | 
							if err1 := tx.Model(&models.TmRechargeLog{}).Where("order_expire_time <? and status =1", expireTime).Updates(map[string]interface{}{"status": 6, "updated_at": time.Now()}).Error; err1 != nil {
 | 
				
			||||||
 | 
								return err1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err1 := receiveaddressmanager.CleanExpiredAmountLocks(ctx, redishelper.DefaultRedis.GetClient()); err1 != nil {
 | 
				
			||||||
 | 
								return err1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 首页获取即将过期的数据
 | 
					// 首页获取即将过期的数据
 | 
				
			||||||
func (e *TmRechargeLog) GetMemberAdvent(req *dto.TmRechargeLogFrontReq, resp *[]dto.TmRechargeLogFrontResp, userId int) int {
 | 
					func (e *TmRechargeLog) GetMemberAdvent(req *dto.TmRechargeLogFrontReq, resp *[]dto.TmRechargeLogFrontResp, userId int) int {
 | 
				
			||||||
	var datas []models.TmRechargeLog
 | 
						var datas []models.TmRechargeLog
 | 
				
			||||||
@ -64,7 +106,7 @@ func (e *TmRechargeLog) GetMemberAdvent(req *dto.TmRechargeLogFrontReq, resp *[]
 | 
				
			|||||||
func (e *TmRechargeLog) ManagerRecharge(req *dto.TmRechargeCreateOrderReq, p *actions.DataPermission) error {
 | 
					func (e *TmRechargeLog) ManagerRecharge(req *dto.TmRechargeCreateOrderReq, p *actions.DataPermission) error {
 | 
				
			||||||
	ctx := context.Background()
 | 
						ctx := context.Background()
 | 
				
			||||||
	var data models.TmRechargeLog
 | 
						var data models.TmRechargeLog
 | 
				
			||||||
	member, platform, memberPlatform, code := e.CreateOrderJudge(req)
 | 
						member, platform, _, code := e.CreateOrderJudge(req.MemberId, req.PlatformId)
 | 
				
			||||||
	if code != statuscode.Success {
 | 
						if code != statuscode.Success {
 | 
				
			||||||
		return errors.New(statuscode.ErrorMessage[code])
 | 
							return errors.New(statuscode.ErrorMessage[code])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -75,6 +117,7 @@ func (e *TmRechargeLog) ManagerRecharge(req *dto.TmRechargeCreateOrderReq, p *ac
 | 
				
			|||||||
	data.Type = 2
 | 
						data.Type = 2
 | 
				
			||||||
	data.Status = 2
 | 
						data.Status = 2
 | 
				
			||||||
	data.UserId = member.UserId
 | 
						data.UserId = member.UserId
 | 
				
			||||||
 | 
						data.MemberId = member.Id
 | 
				
			||||||
	data.ExpireAt = time.Now().AddDate(0, 0, req.ExpireDays)
 | 
						data.ExpireAt = time.Now().AddDate(0, 0, req.ExpireDays)
 | 
				
			||||||
	data.PayTime = &now
 | 
						data.PayTime = &now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -92,10 +135,10 @@ func (e *TmRechargeLog) ManagerRecharge(req *dto.TmRechargeCreateOrderReq, p *ac
 | 
				
			|||||||
			return err1
 | 
								return err1
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//更新用户翻译可用字符
 | 
							// //更新用户翻译可用字符
 | 
				
			||||||
		if err1 := tx.Model(&models.TmMemberPlatform{}).Where("id =?", memberPlatform.Id).Update("remaining_character", data.TotalChars).Error; err1 != nil {
 | 
							// if err1 := tx.Model(&models.TmMemberPlatform{}).Where("id =?", memberPlatform.Id).Update("remaining_character", data.TotalChars).Error; err1 != nil {
 | 
				
			||||||
			return err1
 | 
							// 	return err1
 | 
				
			||||||
		}
 | 
							// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//写入可用字符
 | 
							//写入可用字符
 | 
				
			||||||
		if err1 := qmgr.AddQuota(ctx, member.ApiKey, platform.Code, rechargeData); err1 != nil {
 | 
							if err1 := qmgr.AddQuota(ctx, member.ApiKey, platform.Code, rechargeData); err1 != nil {
 | 
				
			||||||
@ -108,11 +151,50 @@ func (e *TmRechargeLog) ManagerRecharge(req *dto.TmRechargeCreateOrderReq, p *ac
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 后台扣除字符
 | 
				
			||||||
 | 
					func (e *TmRechargeLog) ManagerDeduct(req *dto.TmRechargeManageDeductReq) error {
 | 
				
			||||||
 | 
						ctx := context.Background()
 | 
				
			||||||
 | 
						var data models.TmRechargeLog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						member, platform, _, code := e.CreateOrderJudge(req.MemberId, req.PlatformId)
 | 
				
			||||||
 | 
						if code != statuscode.Success {
 | 
				
			||||||
 | 
							return errors.New(statuscode.ErrorMessage[code])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req.Generate(&data)
 | 
				
			||||||
 | 
						now := time.Now()
 | 
				
			||||||
 | 
						data.OrderNo = utility.GenerateTraceID()
 | 
				
			||||||
 | 
						data.Status = 2
 | 
				
			||||||
 | 
						data.UserId = member.UserId
 | 
				
			||||||
 | 
						data.ExpireAt = time.Now().AddDate(0, 0, 30)
 | 
				
			||||||
 | 
						data.PayTime = &now
 | 
				
			||||||
 | 
						data.TotalChars = int(req.TotalChars.Mul(decimal.NewFromInt(10000)).IntPart())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						qmgr := quota_manager.NewQuotaManager(redishelper.DefaultRedis.GetClient())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 事务处理
 | 
				
			||||||
 | 
						err := e.Orm.Transaction(func(tx *gorm.DB) error {
 | 
				
			||||||
 | 
							//写入充值记录
 | 
				
			||||||
 | 
							if err1 := e.Orm.Create(&data).Error; err1 != nil {
 | 
				
			||||||
 | 
								return err1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//写入可用字符
 | 
				
			||||||
 | 
							if _, err1 := qmgr.Deduct(ctx, member.ApiKey, platform.Code, int64(data.TotalChars)); err1 != nil {
 | 
				
			||||||
 | 
								return err1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 新增充值校验
 | 
					// 新增充值校验
 | 
				
			||||||
func (e *TmRechargeLog) CreateOrderJudge(req *dto.TmRechargeCreateOrderReq) (models.TmMember, *models.TmPlatform, models.TmMemberPlatform, int) {
 | 
					func (e *TmRechargeLog) CreateOrderJudge(memberId int, platformId int) (models.TmMember, *models.TmPlatform, models.TmMemberPlatform, int) {
 | 
				
			||||||
	memberService := TmMember{Service: e.Service}
 | 
						memberService := TmMember{Service: e.Service}
 | 
				
			||||||
	member := models.TmMember{}
 | 
						member := models.TmMember{}
 | 
				
			||||||
	if err := memberService.GetById(req.MemberId, &member); err != nil {
 | 
						if err := memberService.GetById(memberId, &member); err != nil {
 | 
				
			||||||
		return models.TmMember{}, nil, models.TmMemberPlatform{}, statuscode.NotFindMember
 | 
							return models.TmMember{}, nil, models.TmMemberPlatform{}, statuscode.NotFindMember
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -121,7 +203,7 @@ func (e *TmRechargeLog) CreateOrderJudge(req *dto.TmRechargeCreateOrderReq) (mod
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	platformService := TmPlatform{Service: e.Service}
 | 
						platformService := TmPlatform{Service: e.Service}
 | 
				
			||||||
	platform, err := platformService.GetById(req.PlatformId)
 | 
						platform, err := platformService.GetById(platformId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		e.Log.Errorf("获取平台信息失败:%s \r\n", err.Error())
 | 
							e.Log.Errorf("获取平台信息失败:%s \r\n", err.Error())
 | 
				
			||||||
@ -132,10 +214,15 @@ func (e *TmRechargeLog) CreateOrderJudge(req *dto.TmRechargeCreateOrderReq) (mod
 | 
				
			|||||||
		return models.TmMember{}, nil, models.TmMemberPlatform{}, statuscode.PlatformNotSupport
 | 
							return models.TmMember{}, nil, models.TmMemberPlatform{}, statuscode.PlatformNotSupport
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if platform.BlockChain == "" || platform.ReceiveAddress == "" {
 | 
				
			||||||
 | 
							e.Log.Error("翻译平台未配置收款信息")
 | 
				
			||||||
 | 
							return models.TmMember{}, nil, models.TmMemberPlatform{}, statuscode.PlatformNotSupport
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memberPlatformService := TmMemberPlatform{Service: e.Service}
 | 
						memberPlatformService := TmMemberPlatform{Service: e.Service}
 | 
				
			||||||
	memberPlatform, err := memberPlatformService.GetOrInsert(&dto.TmRechargeLogInsertOrUpdateReq{
 | 
						memberPlatform, err := memberPlatformService.GetOrInsert(&dto.TmRechargeLogInsertOrUpdateReq{
 | 
				
			||||||
		MemberId:    req.MemberId,
 | 
							MemberId:    memberId,
 | 
				
			||||||
		PlatformId:  req.PlatformId,
 | 
							PlatformId:  platformId,
 | 
				
			||||||
		PlatformKey: platform.Code,
 | 
							PlatformKey: platform.Code,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -149,28 +236,221 @@ func (e *TmRechargeLog) CreateOrderJudge(req *dto.TmRechargeCreateOrderReq) (mod
 | 
				
			|||||||
	return member, platform, memberPlatform, statuscode.Success
 | 
						return member, platform, memberPlatform, statuscode.Success
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 用户发起充值
 | 
					// 用户自己发起充值
 | 
				
			||||||
// return code
 | 
					// return code
 | 
				
			||||||
func (e TmRechargeLog) CreateOrder(req *dto.TmRechargeCreateOrderReq, apiKey string) int {
 | 
					func (e TmRechargeLog) CreateOrder(req *dto.CustomCreateOrderReq, resp *dto.CustomCreateOrderResp, apiKey string) int {
 | 
				
			||||||
	// ctx := context.Background()
 | 
						ctx := context.Background()
 | 
				
			||||||
	// var data models.TmRechargeLog
 | 
						var amountStr string
 | 
				
			||||||
	// member, platform, memberPlatform, code := e.CreateOrderJudge(req)
 | 
						// var errReturn bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if code != statuscode.Success {
 | 
						//todo 如果没有成功取消金额锁
 | 
				
			||||||
	// 	return code
 | 
						// defer func() {
 | 
				
			||||||
	// }
 | 
						// 	if amountStr != "" && errReturn {
 | 
				
			||||||
	// req.Generate(&data)
 | 
					
 | 
				
			||||||
	// now := time.Now()
 | 
						// 	}
 | 
				
			||||||
	// data.OrderNo = utility.GenerateTraceID()
 | 
						// }()
 | 
				
			||||||
	// data.Type = 1
 | 
					
 | 
				
			||||||
	// data.Status = 1
 | 
						memberService := TmMember{Service: e.Service}
 | 
				
			||||||
	// data.UserId = member.UserId
 | 
						member := models.TmMember{}
 | 
				
			||||||
	// data.ExpireAt = time.Now().AddDate(0, 0, 30)
 | 
						if err1 := memberService.GetByUserId(req.UserId, &member); err1 != nil {
 | 
				
			||||||
	// data.PaymentTime = &now
 | 
							e.Log.Errorf("获取翻译用户失败 :%v", err1)
 | 
				
			||||||
 | 
							return statuscode.NotFindMember
 | 
				
			||||||
 | 
						} else if member.Id == 0 {
 | 
				
			||||||
 | 
							e.Log.Errorf("获取翻译用户失败 用户不存在")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						configService := SysConfig{Service: e.Service}
 | 
				
			||||||
 | 
						config := dto.GetSysConfigByKEYForServiceResp{}
 | 
				
			||||||
 | 
						orderExpireConfig := dto.GetSysConfigByKEYForServiceResp{}
 | 
				
			||||||
 | 
						configReq := dto.SysConfigByKeyReq{}
 | 
				
			||||||
 | 
						orderExpireConfigReq := dto.SysConfigByKeyReq{}
 | 
				
			||||||
 | 
						configReq.ConfigKey = "trx_receive_address"
 | 
				
			||||||
 | 
						orderExpireConfigReq.ConfigKey = "order_expire_minute"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := configService.GetWithKey(&configReq, &config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("获取配置信息失败:%s \r\n", err.Error())
 | 
				
			||||||
 | 
							return statuscode.ServerError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := configService.GetWithKey(&orderExpireConfigReq, &orderExpireConfig); err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("获取订单过期时间配置失败 %v", err)
 | 
				
			||||||
 | 
							return statuscode.ServerError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						timeInterval, err := strconv.Atoi(orderExpireConfig.ConfigValue)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("获取订单过期时间失败 %v", err)
 | 
				
			||||||
 | 
							return statuscode.ServerError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, platform, _, code := e.CreateOrderJudge(member.Id, req.PlatformId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if code != statuscode.Success {
 | 
				
			||||||
 | 
							return code
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						createReq := dto.TmRechargeCreateOrderReq{}
 | 
				
			||||||
 | 
						createReq.MemberId = member.Id
 | 
				
			||||||
 | 
						createReq.Amount = platform.Price.Mul(decimal.NewFromInt(int64(req.Count)))
 | 
				
			||||||
 | 
						createReq.PlatformId = req.PlatformId
 | 
				
			||||||
 | 
						createReq.ReceiveAddress = platform.ReceiveAddress
 | 
				
			||||||
 | 
						createReq.ReceiveChannel = platform.BlockChain
 | 
				
			||||||
 | 
						createReq.Type = 1
 | 
				
			||||||
 | 
						createReq.UserId = req.UserId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						amountStr, err = receiveaddressmanager.AllocatePaymentAmount(ctx, redishelper.DefaultRedis.GetClient(), createReq.Amount.InexactFloat64(), timeInterval)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("分配可用金额失败:%v \r\n", err)
 | 
				
			||||||
 | 
							return statuscode.ServerError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						createReq.Amount, err = decimal.NewFromString(amountStr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("转换可用金额失败:%v \r\n", err)
 | 
				
			||||||
 | 
							return statuscode.ServerError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data := models.TmRechargeLog{}
 | 
				
			||||||
 | 
						data.Amount = createReq.Amount
 | 
				
			||||||
 | 
						platformCharacter := int64(platform.Character * 1000000)
 | 
				
			||||||
 | 
						data.TotalChars = int(createReq.Amount.Div(platform.Price).Mul(decimal.NewFromInt(platformCharacter)).IntPart())
 | 
				
			||||||
 | 
						now := time.Now()
 | 
				
			||||||
 | 
						data.OrderNo = utility.GenerateTraceID()
 | 
				
			||||||
 | 
						data.Type = createReq.Type
 | 
				
			||||||
 | 
						data.Status = 1
 | 
				
			||||||
 | 
						data.UserId = member.UserId
 | 
				
			||||||
 | 
						data.MemberId = member.Id
 | 
				
			||||||
 | 
						data.PlatformId = platform.Id
 | 
				
			||||||
 | 
						data.ReceiveAddress = createReq.ReceiveAddress
 | 
				
			||||||
 | 
						data.ReceiveChannel = createReq.ReceiveChannel
 | 
				
			||||||
 | 
						orderExpireDruation := time.Duration(timeInterval) * time.Minute
 | 
				
			||||||
 | 
						orderExpireTime := time.Now().Add(orderExpireDruation)
 | 
				
			||||||
 | 
						data.OrderExpireTime = &orderExpireTime
 | 
				
			||||||
 | 
						data.ExpireAt = time.Now().AddDate(0, 0, 30)
 | 
				
			||||||
 | 
						data.PayTime = &now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cacheExpireDuration := time.Duration(timeInterval+1) * time.Minute
 | 
				
			||||||
 | 
						key := fmt.Sprintf(rediskey.TM_RECHARGE_PRE_ORDER, amountStr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = e.Orm.Transaction(func(tx *gorm.DB) error {
 | 
				
			||||||
 | 
							if err1 := e.Orm.Model(&models.TmRechargeLog{}).Save(&data).Error; err1 != nil {
 | 
				
			||||||
 | 
								e.Log.Errorf("发起充值记录失败 error:%s \r\n", err1)
 | 
				
			||||||
 | 
								return err1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err1 := redishelper.DefaultRedis.SetStringExpire(key, data.OrderNo, cacheExpireDuration); err1 != nil {
 | 
				
			||||||
 | 
								e.Log.Errorf("设置预充值订单缓存失败 error:%s \r\n")
 | 
				
			||||||
 | 
								return err1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return statuscode.ServerError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp.Amount = data.Amount.String()
 | 
				
			||||||
 | 
						resp.ReceiveAddress = data.ReceiveAddress
 | 
				
			||||||
 | 
						resp.OrderNo = data.OrderNo
 | 
				
			||||||
 | 
						resp.BlockChain = strings.ToUpper(data.ReceiveChannel)
 | 
				
			||||||
 | 
						resp.ExpireUnix = data.OrderExpireTime.Unix()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return statuscode.Success
 | 
						return statuscode.Success
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 充值回调
 | 
				
			||||||
 | 
					func (e *TmRechargeLog) PayCallBack(logs *[]dto.TmRechargeCallbackReq) error {
 | 
				
			||||||
 | 
						now := time.Now()
 | 
				
			||||||
 | 
						qmgr := quota_manager.NewQuotaManager(redishelper.DefaultRedis.GetClient())
 | 
				
			||||||
 | 
						ctx := context.Background()
 | 
				
			||||||
 | 
						memberService := TmMember{Service: e.Service}
 | 
				
			||||||
 | 
						platformService := TmPlatform{Service: e.Service}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, log := range *logs {
 | 
				
			||||||
 | 
							amountStr := log.PayableAmount.StringFixed(4)
 | 
				
			||||||
 | 
							key := fmt.Sprintf(rediskey.TM_RECHARGE_PRE_ORDER, amountStr)
 | 
				
			||||||
 | 
							orderNo, err := redishelper.DefaultRedis.GetString(key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								if err != redis.Nil {
 | 
				
			||||||
 | 
									e.Log.Errorf("获取预充值订单失败 error:%s \r\n", err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var count int64
 | 
				
			||||||
 | 
							e.Orm.Model(&models.TmRechargeLog{}).Where("tx_hash = ?", log.TxHash).Count(&count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if count > 0 {
 | 
				
			||||||
 | 
								e.Log.Errorf("订单已存在:%s \r\n", log.TxHash)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var data models.TmRechargeLog
 | 
				
			||||||
 | 
							if err := e.Orm.Model(&models.TmRechargeLog{}).Where("order_no = ?", orderNo).First(&data).Error; err != nil {
 | 
				
			||||||
 | 
								e.Log.Errorf("获取充值记录失败 error:%s \r\n", err)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if data.Status == 1 {
 | 
				
			||||||
 | 
								data.TxHash = log.TxHash
 | 
				
			||||||
 | 
								data.Status = 2
 | 
				
			||||||
 | 
								data.PayTime = &now
 | 
				
			||||||
 | 
								data.ExpireAt = time.Now().AddDate(0, 0, 30)
 | 
				
			||||||
 | 
								member := models.TmMember{}
 | 
				
			||||||
 | 
								err := memberService.GetById(data.MemberId, &member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									e.Log.Errorf("获取用户信息失败 error:%s \r\n", err)
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								platform, err := platformService.GetById(data.PlatformId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									e.Log.Errorf("获取平台信息失败 error:%s \r\n", err)
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								rechargeData := quota_manager.QuotaRecharge{
 | 
				
			||||||
 | 
									QuotaID:  data.OrderNo,
 | 
				
			||||||
 | 
									Amount:   int64(data.TotalChars),
 | 
				
			||||||
 | 
									ExpireAt: data.ExpireAt.Unix(),
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								err = e.Orm.Transaction(func(tx *gorm.DB) error {
 | 
				
			||||||
 | 
									if err1 := tx.Model(&models.TmRechargeLog{}).Where("id =?", data.Id).Updates(map[string]interface{}{"tx_hash": log.TxHash, "status": 2, "pay_time": now}).Error; err1 != nil {
 | 
				
			||||||
 | 
										e.Log.Errorf("发起充值记录失败 error:%s \r\n", err1)
 | 
				
			||||||
 | 
										return err1
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									//写入可用字符
 | 
				
			||||||
 | 
									if err1 := qmgr.AddQuota(ctx, member.ApiKey, platform.Code, rechargeData); err1 != nil {
 | 
				
			||||||
 | 
										return err1
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									return nil
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									e.Log.Errorf("写入可用字符失败 error:%s \r\n", err)
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								e.Log.Errorf("订单状态异常:%s 状态:%d\r\n", orderNo, data.Status)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err := redishelper.DefaultRedis.DeleteString(key); err != nil {
 | 
				
			||||||
 | 
								e.Log.Errorf("删除预充值订单缓存失败 error:%s \r\n", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 分页查询
 | 
					// 分页查询
 | 
				
			||||||
func (e *TmRechargeLog) GetPage(req *dto.TmRechargeLogGetPageReq, p *actions.DataPermission, datas *[]dto.TmRechargeLogResp, count *int64) error {
 | 
					func (e *TmRechargeLog) GetPage(req *dto.TmRechargeLogGetPageReq, p *actions.DataPermission, datas *[]dto.TmRechargeLogResp, count *int64) error {
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
@ -203,3 +483,28 @@ func (e *TmRechargeLog) GetRemainByOrderNo(orderNo string) (int, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return strconv.Atoi(val)
 | 
						return strconv.Atoi(val)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *TmRechargeLog) GetPlatforms() ([]models.TmPlatform, error) {
 | 
				
			||||||
 | 
						key1 := fmt.Sprintf(rediskey.TM_PLATFORM_KEY, "*")
 | 
				
			||||||
 | 
						scankeys, err := redishelper.DefaultRedis.ScanKeys(key1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						platforms := make([]models.TmPlatform, 0)
 | 
				
			||||||
 | 
						for _, key := range scankeys {
 | 
				
			||||||
 | 
							val, err := redishelper.DefaultRedis.GetString(key)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var platform models.TmPlatform
 | 
				
			||||||
 | 
							sonic.Unmarshal([]byte(val), &platform)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if platform.Id > 0 {
 | 
				
			||||||
 | 
								platforms = append(platforms, platform)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return platforms, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										134
									
								
								app/admin/service/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								app/admin/service/tm_recharge_package.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,134 @@
 | 
				
			|||||||
 | 
					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"
 | 
				
			||||||
 | 
						"go-admin/common/statuscode"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TmRechargePackage struct {
 | 
				
			||||||
 | 
						service.Service
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 获取前端查看的金额
 | 
				
			||||||
 | 
					func (e TmRechargePackage) GetFrontList(req *dto.TmRechargePackageGetListReq, userId int, resp *[]dto.TmRechargePackageGetListResp) int {
 | 
				
			||||||
 | 
						var datas []models.TmRechargePackage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := e.Orm.Model(&models.TmRechargePackage{}).
 | 
				
			||||||
 | 
							Where("platform_id =?", req.PlatformId).
 | 
				
			||||||
 | 
							Find(&datas).Error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("TmRechargePackageService GetFrontList error:%s \r\n", err)
 | 
				
			||||||
 | 
							return statuscode.ServerError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, data := range datas {
 | 
				
			||||||
 | 
							respData := dto.TmRechargePackageGetListResp{
 | 
				
			||||||
 | 
								Id:         data.Id,
 | 
				
			||||||
 | 
								PlatformId: data.PlatformId,
 | 
				
			||||||
 | 
								Amount:     data.Amount,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							*resp = append(*resp, respData)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return statuscode.Success
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetPage 获取TmRechargePackage列表
 | 
				
			||||||
 | 
					func (e *TmRechargePackage) GetPage(c *dto.TmRechargePackageGetPageReq, p *actions.DataPermission, list *[]models.TmRechargePackage, count *int64) error {
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						var data models.TmRechargePackage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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("TmRechargePackageService GetPage error:%s \r\n", err)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Get 获取TmRechargePackage对象
 | 
				
			||||||
 | 
					func (e *TmRechargePackage) Get(d *dto.TmRechargePackageGetReq, p *actions.DataPermission, model *models.TmRechargePackage) error {
 | 
				
			||||||
 | 
						var data models.TmRechargePackage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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 GetTmRechargePackage error:%s \r\n", err)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("db error:%s", err)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Insert 创建TmRechargePackage对象
 | 
				
			||||||
 | 
					func (e *TmRechargePackage) Insert(c *dto.TmRechargePackageInsertReq) error {
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						var data models.TmRechargePackage
 | 
				
			||||||
 | 
						c.Generate(&data)
 | 
				
			||||||
 | 
						err = e.Orm.Create(&data).Error
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							e.Log.Errorf("TmRechargePackageService Insert error:%s \r\n", err)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Update 修改TmRechargePackage对象
 | 
				
			||||||
 | 
					func (e *TmRechargePackage) Update(c *dto.TmRechargePackageUpdateReq, p *actions.DataPermission) error {
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						var data = models.TmRechargePackage{}
 | 
				
			||||||
 | 
						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("TmRechargePackageService Save error:%s \r\n", err)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if db.RowsAffected == 0 {
 | 
				
			||||||
 | 
							return errors.New("无权更新该数据")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Remove 删除TmRechargePackage
 | 
				
			||||||
 | 
					func (e *TmRechargePackage) Remove(d *dto.TmRechargePackageDeleteReq, p *actions.DataPermission) error {
 | 
				
			||||||
 | 
						var data models.TmRechargePackage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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 RemoveTmRechargePackage error:%s \r\n", err)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if db.RowsAffected == 0 {
 | 
				
			||||||
 | 
							return errors.New("无权删除该数据")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -4,7 +4,6 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"go-admin/app/admin/service/dto"
 | 
						"go-admin/app/admin/service/dto"
 | 
				
			||||||
	"go-admin/utils/httphelper"
 | 
						"go-admin/utils/httphelper"
 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -63,8 +62,12 @@ func (e *DeeplTranslator) Translate(text string, sourceLang, targetLang string)
 | 
				
			|||||||
		"Authorization": fmt.Sprintf("DeepL-Auth-Key %s", e.config.ApiKey),
 | 
							"Authorization": fmt.Sprintf("DeepL-Auth-Key %s", e.config.ApiKey),
 | 
				
			||||||
		"Content-Type":  "application/json",
 | 
							"Content-Type":  "application/json",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if sourceLang != "" || strings.ToLower(sourceLang) == "auto" {
 | 
					
 | 
				
			||||||
 | 
						switch sourceLang {
 | 
				
			||||||
 | 
						case "", "auto", "AUTO":
 | 
				
			||||||
		requestBody["source_lang"] = ""
 | 
							requestBody["source_lang"] = ""
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							requestBody["source_lang"] = sourceLang
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var responseData deeplTranslationResponse
 | 
						var responseData deeplTranslationResponse
 | 
				
			||||||
 | 
				
			|||||||
@ -31,3 +31,32 @@ func TestDeepSeekTranslator(t *testing.T) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	fmt.Println(result)
 | 
						fmt.Println(result)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 测试DeepSeekTranslator方法
 | 
				
			||||||
 | 
					func TestDenosiTranslator(t *testing.T) {
 | 
				
			||||||
 | 
						config := TranslatorServiceConfig{
 | 
				
			||||||
 | 
							DefaultProvider: "denosi",
 | 
				
			||||||
 | 
							ProviderConfigs: map[string]interface{}{
 | 
				
			||||||
 | 
								"denosi": map[string]interface{}{
 | 
				
			||||||
 | 
									"apiKey":   "sk-PRXfCgLAefqo6jeYsJhKCU6hw5gmxkfNAOjISSQfOeHxqDw4",
 | 
				
			||||||
 | 
									"endpoint": "https://api.denosi.com/v1/chat/completions",
 | 
				
			||||||
 | 
									"model":    "gpt-4o-mini",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						service, err := NewTranslatorService(&config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Sprintln("报错:", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result, err := service.providers["denosi"].Translate("成吉思汗", "zh", "fr")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Sprintln("报错:", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fmt.Println(result)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										112
									
								
								app/admin/service/translator_denosi.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								app/admin/service/translator_denosi.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,112 @@
 | 
				
			|||||||
 | 
					package service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"go-admin/app/admin/service/dto"
 | 
				
			||||||
 | 
						"go-admin/utils/httphelper"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/bytedance/sonic"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DenosiTranslatorConfig struct {
 | 
				
			||||||
 | 
						ApiKey    string `json:"apiKey"`
 | 
				
			||||||
 | 
						ApiSecret string `json:"apiSecret"`
 | 
				
			||||||
 | 
						Endpoint  string `json:"endpoint"`
 | 
				
			||||||
 | 
						Model     string `json:"model"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DenosiTranslator struct {
 | 
				
			||||||
 | 
						config *DenosiTranslatorConfig
 | 
				
			||||||
 | 
						client *httphelper.HTTPClient
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 初始化适配器实例
 | 
				
			||||||
 | 
					func NewDenosiTranslator(config *DenosiTranslatorConfig) *DenosiTranslator {
 | 
				
			||||||
 | 
						defaultHeaders := map[string]string{
 | 
				
			||||||
 | 
							"Content-Type": "application/json",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						httpClient := httphelper.NewHTTPClient(
 | 
				
			||||||
 | 
							15*time.Second,
 | 
				
			||||||
 | 
							config.Endpoint,
 | 
				
			||||||
 | 
							defaultHeaders,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &DenosiTranslator{
 | 
				
			||||||
 | 
							config: config,
 | 
				
			||||||
 | 
							client: httpClient,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 翻译
 | 
				
			||||||
 | 
					func (e *DenosiTranslator) Translate(text string, source string, target string) (*dto.TranslateResult, error) {
 | 
				
			||||||
 | 
						// TODO: 实现Deepseek API调用
 | 
				
			||||||
 | 
						result := dto.TranslateResult{}
 | 
				
			||||||
 | 
						reqBody := dto.DenosiTranslateRequest{
 | 
				
			||||||
 | 
							Model:  e.config.Model, // v3 fast模型
 | 
				
			||||||
 | 
							Stream: false,
 | 
				
			||||||
 | 
							Messages: []dto.Message{
 | 
				
			||||||
 | 
								{Role: "system", Content: fmt.Sprintf("你是翻译专家,将内容从%s翻译为%s,仅返回翻译结果", source, target)},
 | 
				
			||||||
 | 
								{Role: "user", Content: fmt.Sprintf("翻译:%s", text)},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Temperature: 0,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data, err := sonic.Marshal(reqBody)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return &result, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req, err := http.NewRequest("POST", e.config.Endpoint, bytes.NewBuffer(data))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return &result, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						req.Header.Set("Authorization", "Bearer "+e.config.ApiKey)
 | 
				
			||||||
 | 
						req.Header.Set("Content-Type", "application/json")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						client := &http.Client{Timeout: 10 * time.Second}
 | 
				
			||||||
 | 
						resp, err := client.Do(req)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return &result, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer resp.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						body, _ := ioutil.ReadAll(resp.Body)
 | 
				
			||||||
 | 
						fmt.Println(string(body))
 | 
				
			||||||
 | 
						if resp.StatusCode != 200 {
 | 
				
			||||||
 | 
							return &result, fmt.Errorf("Denosi error: %s", string(body))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var dsResp dto.DeepSeekResponse
 | 
				
			||||||
 | 
						err = json.Unmarshal(body, &dsResp)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return &result, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(dsResp.Choices) == 0 {
 | 
				
			||||||
 | 
							return &result, fmt.Errorf("no translation result from Denosi")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result.TranslatedText = dsResp.Choices[0].Message.Content
 | 
				
			||||||
 | 
						result.SourceLanguage = source
 | 
				
			||||||
 | 
						result.TargetLanguage = target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *DenosiTranslator) GetRemainCount() (int, error) {
 | 
				
			||||||
 | 
						// TODO: 实现Deepseek API调用
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 返回服务商
 | 
				
			||||||
 | 
					func (e *DenosiTranslator) GetPlatform() string {
 | 
				
			||||||
 | 
						return "denosi"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -6,15 +6,12 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"go-admin/app/admin/models"
 | 
						"go-admin/app/admin/models"
 | 
				
			||||||
	"go-admin/app/admin/service/dto"
 | 
						"go-admin/app/admin/service/dto"
 | 
				
			||||||
	"go-admin/common/mq"
 | 
					 | 
				
			||||||
	rediskey "go-admin/common/redis_key"
 | 
						rediskey "go-admin/common/redis_key"
 | 
				
			||||||
	"go-admin/common/statuscode"
 | 
						"go-admin/common/statuscode"
 | 
				
			||||||
	"go-admin/utils/redishelper"
 | 
						"go-admin/utils/redishelper"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
	"unicode/utf8"
 | 
						"unicode/utf8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	commonDto "go-admin/common/dto"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/bytedance/sonic"
 | 
						"github.com/bytedance/sonic"
 | 
				
			||||||
	"github.com/go-admin-team/go-admin-core/logger"
 | 
						"github.com/go-admin-team/go-admin-core/logger"
 | 
				
			||||||
	"github.com/go-admin-team/go-admin-core/sdk/service"
 | 
						"github.com/go-admin-team/go-admin-core/sdk/service"
 | 
				
			||||||
@ -37,6 +34,9 @@ type TranslatorToolService struct {
 | 
				
			|||||||
	service.Service
 | 
						service.Service
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var UnSportPlatformErr = errors.New("平台不支持")
 | 
				
			||||||
 | 
					var TransUnMarshalConfigErr = errors.New("翻译服务商配置解析失败")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewTranslatorService 创建翻译服务实例
 | 
					// NewTranslatorService 创建翻译服务实例
 | 
				
			||||||
func NewTranslatorService(cfg *TranslatorServiceConfig) (*TranslatorService, error) {
 | 
					func NewTranslatorService(cfg *TranslatorServiceConfig) (*TranslatorService, error) {
 | 
				
			||||||
	svc := &TranslatorService{
 | 
						svc := &TranslatorService{
 | 
				
			||||||
@ -50,30 +50,51 @@ func NewTranslatorService(cfg *TranslatorServiceConfig) (*TranslatorService, err
 | 
				
			|||||||
		var newAdapter Translator
 | 
							var newAdapter Translator
 | 
				
			||||||
		switch providerName {
 | 
							switch providerName {
 | 
				
			||||||
		case "google":
 | 
							case "google":
 | 
				
			||||||
			googleCfgBytes, _ := json.Marshal(providerCfg) // 假设配置是map[string]interface{},需要转换
 | 
								googleCfgBytes, _ := json.Marshal(providerCfg)
 | 
				
			||||||
			var googleCfg GoogleTranslatorConfig
 | 
								var googleCfg GoogleTranslatorConfig
 | 
				
			||||||
			if err := json.Unmarshal(googleCfgBytes, &googleCfg); err != nil {
 | 
								if err := json.Unmarshal(googleCfgBytes, &googleCfg); err != nil {
 | 
				
			||||||
				return nil, errors.Wrapf(err, "failed to unmarshal config for GoogleTranslate")
 | 
									logger.Error("failed to unmarshal config for GoogleTranslate")
 | 
				
			||||||
 | 
									return nil, TransUnMarshalConfigErr
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			newAdapter = NewGoogleTranslator(&googleCfg)
 | 
								newAdapter = NewGoogleTranslator(&googleCfg)
 | 
				
			||||||
		// case "BaiduTranslate":
 | 
					 | 
				
			||||||
		// 	// newAdapter = adapter.NewBaiduTranslator(...)
 | 
					 | 
				
			||||||
		case "deepseek":
 | 
							case "deepseek":
 | 
				
			||||||
			deepseekCfgBytes, _ := json.Marshal(providerCfg) // 假设配置是map[string]interface{},需要转换
 | 
								deepseekCfgBytes, _ := json.Marshal(providerCfg)
 | 
				
			||||||
			var deepseekCfg DeepseekTranslatorConfig
 | 
								var deepseekCfg DeepseekTranslatorConfig
 | 
				
			||||||
			if err := json.Unmarshal(deepseekCfgBytes, &deepseekCfg); err != nil {
 | 
								if err := json.Unmarshal(deepseekCfgBytes, &deepseekCfg); err != nil {
 | 
				
			||||||
				return nil, errors.Wrapf(err, "failed to unmarshal config for DeepseekTranslator")
 | 
									logger.Error(err, "failed to unmarshal config for DeepseekTranslator")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									return nil, TransUnMarshalConfigErr
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			newAdapter = NewDeepseekTranslator(&deepseekCfg)
 | 
								newAdapter = NewDeepseekTranslator(&deepseekCfg)
 | 
				
			||||||
		case "deepl", "deepl_free":
 | 
							case "deepl", "deepl_free":
 | 
				
			||||||
			deeplCfgBytes, _ := json.Marshal(providerCfg) // 假设配置是map[string]interface{},需要转换
 | 
								deeplCfgBytes, _ := json.Marshal(providerCfg)
 | 
				
			||||||
			var deeplCfg DeeplTranslatorConfig
 | 
								var deeplCfg DeeplTranslatorConfig
 | 
				
			||||||
			if err := json.Unmarshal(deeplCfgBytes, &deeplCfg); err != nil {
 | 
								if err := json.Unmarshal(deeplCfgBytes, &deeplCfg); err != nil {
 | 
				
			||||||
				return nil, errors.Wrapf(err, "failed to unmarshal config for DeepLTranslator")
 | 
									logger.Error("failed to unmarshal config for DeepLTranslator")
 | 
				
			||||||
 | 
									return nil, TransUnMarshalConfigErr
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			newAdapter = NewDeeplTranslator(&deeplCfg)
 | 
								newAdapter = NewDeeplTranslator(&deeplCfg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//翻译之家
 | 
				
			||||||
 | 
							case "deepl_trans", "google_trans", "baidu_trans", "youdao_trans", "bing_trans", "huoshan_trans", "chatgpt-4o_trans", "yandex_trans":
 | 
				
			||||||
 | 
								transCfgBytes, _ := json.Marshal(providerCfg)
 | 
				
			||||||
 | 
								var transCfg TransTranslatorConfig
 | 
				
			||||||
 | 
								if err := json.Unmarshal(transCfgBytes, &transCfg); err != nil {
 | 
				
			||||||
 | 
									logger.Error("failed to unmarshal config for Translator")
 | 
				
			||||||
 | 
									return nil, TransUnMarshalConfigErr
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								newAdapter = NewTransTranslator(&transCfg)
 | 
				
			||||||
 | 
							case "denosi":
 | 
				
			||||||
 | 
								transCfgBytes, _ := json.Marshal(providerCfg)
 | 
				
			||||||
 | 
								var transCfg DenosiTranslatorConfig
 | 
				
			||||||
 | 
								if err := json.Unmarshal(transCfgBytes, &transCfg); err != nil {
 | 
				
			||||||
 | 
									logger.Error("failed to unmarshal config for Translator")
 | 
				
			||||||
 | 
									return nil, TransUnMarshalConfigErr
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								newAdapter = NewDenosiTranslator(&transCfg)
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return nil, errors.Errorf("unsupported translation provider: %s", providerName)
 | 
								return nil, UnSportPlatformErr
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		svc.RegisterProvider(providerName, newAdapter)
 | 
							svc.RegisterProvider(providerName, newAdapter)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -149,7 +170,7 @@ func (s *TranslatorService) TranslateJudge(req *dto.TranslateReq, apiKey string)
 | 
				
			|||||||
		platformConfigInterface := Translator.config.ProviderConfigs[req.Platform]
 | 
							platformConfigInterface := Translator.config.ProviderConfigs[req.Platform]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// 尝试将 interface{} 断言为 map[string]interface{}
 | 
							// 尝试将 interface{} 断言为 map[string]interface{}
 | 
				
			||||||
		if mapData, ok := platformConfigInterface.(map[string]interface{}); !ok {
 | 
							if mapData, ok := platformConfigInterface.(map[string]interface{}); ok {
 | 
				
			||||||
			tmPlatformAccount.DecrRemainBy(req.Platform, mapData["apiKey"].(string), count)
 | 
								tmPlatformAccount.DecrRemainBy(req.Platform, mapData["apiKey"].(string), count)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -157,6 +178,7 @@ func (s *TranslatorService) TranslateJudge(req *dto.TranslateReq, apiKey string)
 | 
				
			|||||||
		redishelper.DefaultRedis.IncrBy(fmt.Sprintf(rediskey.TM_MEMBER_DAILY_COUNT, date, apiKey, req.Platform), int64(count))
 | 
							redishelper.DefaultRedis.IncrBy(fmt.Sprintf(rediskey.TM_MEMBER_DAILY_COUNT, date, apiKey, req.Platform), int64(count))
 | 
				
			||||||
		//每日统计保留三天
 | 
							//每日统计保留三天
 | 
				
			||||||
		redishelper.DefaultRedis.Expire(fmt.Sprintf(rediskey.TM_MEMBER_DAILY_COUNT, date, apiKey, req.Platform), 3*24*time.Hour)
 | 
							redishelper.DefaultRedis.Expire(fmt.Sprintf(rediskey.TM_MEMBER_DAILY_COUNT, date, apiKey, req.Platform), 3*24*time.Hour)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		tmMemberService.RefundQuote(ctx, apiKey, req.Platform, &decyDatas)
 | 
							tmMemberService.RefundQuote(ctx, apiKey, req.Platform, &decyDatas)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -200,40 +222,36 @@ func (s *TranslatorService) GetTranslator(platform string) (translator *Translat
 | 
				
			|||||||
		ProviderConfigs: configs,
 | 
							ProviderConfigs: configs,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch platform {
 | 
						translator, err = NewTranslatorService(&cfg)
 | 
				
			||||||
	case "deepl", "deepl_free", "deepseek":
 | 
					 | 
				
			||||||
		translator, err = NewTranslatorService(&cfg)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
			s.Log.Errorf("failed to create translator service: %s", err)
 | 
							switch err {
 | 
				
			||||||
 | 
							case UnSportPlatformErr:
 | 
				
			||||||
 | 
								code = statuscode.PlatformNotSupport
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
			code = statuscode.ServerError
 | 
								code = statuscode.ServerError
 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
		code = statuscode.Success
 | 
							code = statuscode.Success
 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		code = statuscode.PlatformNotSupport
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 从 Redis List 顺序取出一个账号,使用后放回队尾,模拟轮询
 | 
					// 从 Redis List 顺序取出一个账号,使用后放回队尾,模拟轮询
 | 
				
			||||||
func (s *TranslatorService) GetNextAccount(platformCode string) (*models.TmPlatformAccount, error) {
 | 
					func (s *TranslatorService) GetNextAccount(platformCode string) (*models.TmPlatformAccount, error) {
 | 
				
			||||||
	var val string
 | 
						var val string
 | 
				
			||||||
	var err error
 | 
						var err error
 | 
				
			||||||
	var remain int
 | 
						// var remain int
 | 
				
			||||||
	key := fmt.Sprintf(rediskey.TM_PLATFORM_ACCOUNT_LIST_KEY, platformCode)
 | 
						key := fmt.Sprintf(rediskey.TM_PLATFORM_ACCOUNT_LIST_KEY, platformCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	retries := []time.Duration{100 * time.Millisecond, 200 * time.Millisecond, 300 * time.Millisecond}
 | 
						retries := []time.Duration{100 * time.Millisecond, 200 * time.Millisecond, 300 * time.Millisecond}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	defer func() {
 | 
						defer func() {
 | 
				
			||||||
		if val != "" {
 | 
							if val != "" {
 | 
				
			||||||
			if remain > 0 {
 | 
								// 放回队尾,继续轮询机制
 | 
				
			||||||
				// 放回队尾,继续轮询机制
 | 
								if err := redishelper.DefaultRedis.RPushList(key, val); err != nil {
 | 
				
			||||||
				if err := redishelper.DefaultRedis.RPushList(key, val); err != nil {
 | 
									s.Log.Errorf("failed to push account back to queue: %v", err)
 | 
				
			||||||
					s.Log.Errorf("failed to push account back to queue: %v", err)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
@ -254,35 +272,36 @@ func (s *TranslatorService) GetNextAccount(platformCode string) (*models.TmPlatf
 | 
				
			|||||||
		return nil, errors.New("failed to get account from queue after multiple retries: " + err.Error())
 | 
							return nil, errors.New("failed to get account from queue after multiple retries: " + err.Error())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	accountService := TmPlatformAccount{Service: s.Service}
 | 
						// accountService := TmPlatformAccount{Service: s.Service}
 | 
				
			||||||
	account := models.TmPlatformAccount{}
 | 
						account := models.TmPlatformAccount{}
 | 
				
			||||||
	sonic.UnmarshalString(val, &account)
 | 
						sonic.UnmarshalString(val, &account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch platformCode {
 | 
						// switch platformCode {
 | 
				
			||||||
	case "deepseek":
 | 
						// case "deepseek":
 | 
				
			||||||
		remain = 999999
 | 
						// 	remain = 999999
 | 
				
			||||||
	default:
 | 
						// default:
 | 
				
			||||||
		remain, _ = accountService.GetRemainCount(platformCode, account.ApiKey)
 | 
						// 	remain, _ = accountService.GetRemainCount(platformCode, account.ApiKey)
 | 
				
			||||||
	}
 | 
						// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//取消限制
 | 
				
			||||||
	// 如果剩余字符数 <= 0,跳过该账号,不放回队列,并更新数据库状态
 | 
						// 如果剩余字符数 <= 0,跳过该账号,不放回队列,并更新数据库状态
 | 
				
			||||||
	if remain <= 0 {
 | 
						// if remain <= 0 {
 | 
				
			||||||
		event := commonDto.ExhaustedAccountMessage{
 | 
						// 	event := commonDto.ExhaustedAccountMessage{
 | 
				
			||||||
			Id:       account.Id,
 | 
						// 		Id:       account.Id,
 | 
				
			||||||
			Platform: platformCode,
 | 
						// 		Platform: platformCode,
 | 
				
			||||||
		}
 | 
						// 	}
 | 
				
			||||||
		payload, _ := sonic.Marshal(event)
 | 
						// 	payload, _ := sonic.Marshal(event)
 | 
				
			||||||
		err = mq.MQ.Publish( // default exchange
 | 
						// 	err = mq.MQ.Publish( // default exchange
 | 
				
			||||||
			"account_exhausted_queue",
 | 
						// 		"account_exhausted_queue",
 | 
				
			||||||
			payload,
 | 
						// 		payload,
 | 
				
			||||||
		)
 | 
						// 	)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err != nil {
 | 
						// 	if err != nil {
 | 
				
			||||||
			s.Log.Errorf("发送账号耗尽通知失败:%v", err)
 | 
						// 		s.Log.Errorf("发送账号耗尽通知失败:%v", err)
 | 
				
			||||||
		}
 | 
						// 	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return nil, errors.New("account exhausted and removed from queue")
 | 
						// 	return nil, errors.New("account exhausted and removed from queue")
 | 
				
			||||||
	}
 | 
						// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &account, nil
 | 
						return &account, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										108
									
								
								app/admin/service/translator_trans.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								app/admin/service/translator_trans.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					package service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"go-admin/app/admin/service/dto"
 | 
				
			||||||
 | 
						"go-admin/utils/httphelper"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 翻译之家
 | 
				
			||||||
 | 
					type TransTranslator struct {
 | 
				
			||||||
 | 
						config *TransTranslatorConfig
 | 
				
			||||||
 | 
						client *httphelper.HTTPClient
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TransTranslatorConfig struct {
 | 
				
			||||||
 | 
						ApiKey    string `json:"apiKey"`
 | 
				
			||||||
 | 
						ApiSecret string `json:"apiSecret"`
 | 
				
			||||||
 | 
						Endpoint  string `json:"endpoint"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TransTranslatorResponse[T any] struct {
 | 
				
			||||||
 | 
						Code    int    `json:"code"`
 | 
				
			||||||
 | 
						Message string `json:"message"`
 | 
				
			||||||
 | 
						Data    T      `json:"data"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 剩余字符数
 | 
				
			||||||
 | 
					type TransTranslatorResponseNumData struct {
 | 
				
			||||||
 | 
						UseNum int `json:"use_num" comment:"总字符"`
 | 
				
			||||||
 | 
						IsUsed int `json:"is_used" comment:"已用字符"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 翻译内容
 | 
				
			||||||
 | 
					type TransTranslatorResponseData struct {
 | 
				
			||||||
 | 
						Text string `json:"text"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 翻译之家
 | 
				
			||||||
 | 
					func NewTransTranslator(config *TransTranslatorConfig) *TransTranslator {
 | 
				
			||||||
 | 
						defaultHeaders := map[string]string{
 | 
				
			||||||
 | 
							"Content-Type": "application/json",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						httpClient := httphelper.NewHTTPClient(
 | 
				
			||||||
 | 
							15*time.Second,
 | 
				
			||||||
 | 
							config.Endpoint,
 | 
				
			||||||
 | 
							defaultHeaders,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &TransTranslator{
 | 
				
			||||||
 | 
							config: config,
 | 
				
			||||||
 | 
							client: httpClient,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 翻译
 | 
				
			||||||
 | 
					func (e *TransTranslator) Translate(text string, sourceLang, targetLang string) (*dto.TranslateResult, error) {
 | 
				
			||||||
 | 
						result := dto.TranslateResult{}
 | 
				
			||||||
 | 
						responseData := TransTranslatorResponse[TransTranslatorResponseData]{}
 | 
				
			||||||
 | 
						route := fmt.Sprintf("/api/index/translate?token=%s", e.config.ApiKey)
 | 
				
			||||||
 | 
						params := map[string]string{
 | 
				
			||||||
 | 
							"keywords":       text,
 | 
				
			||||||
 | 
							"sourceLanguage": sourceLang,
 | 
				
			||||||
 | 
							"targetLanguage": targetLang,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Deepl API 翻译通常是 POST 请求到 /v2/translate
 | 
				
			||||||
 | 
						err := e.client.Post(route, params, nil, &responseData)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return &result, fmt.Errorf("翻译请求出错: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if responseData.Code != 1 {
 | 
				
			||||||
 | 
							return &result, fmt.Errorf("翻译失败,错误代码: %d msg: %s", responseData.Code, responseData.Message)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if responseData.Data.Text != "" {
 | 
				
			||||||
 | 
							result.TranslatedText = responseData.Data.Text
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return &result, fmt.Errorf("翻译失败,返回数据为空")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *TransTranslator) GetRemainCount() (int, error) {
 | 
				
			||||||
 | 
						responseData := TransTranslatorResponse[TransTranslatorResponseNumData]{}
 | 
				
			||||||
 | 
						route := fmt.Sprintf("/api/index/getUserNums?token=%s", e.config.ApiKey)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Deepl API 翻译通常是 POST 请求到 /v2/translate
 | 
				
			||||||
 | 
						err := e.client.Get(route, nil, &responseData)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, fmt.Errorf("翻译请求出错: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if responseData.Code != 1 {
 | 
				
			||||||
 | 
							return 0, fmt.Errorf("翻译失败,错误代码: %d msg: %s", responseData.Code, responseData.Message)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result := responseData.Data.UseNum - responseData.Data.IsUsed
 | 
				
			||||||
 | 
						return result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 获取服务商
 | 
				
			||||||
 | 
					func (t *TransTranslator) GetPlatform() string {
 | 
				
			||||||
 | 
						return "trans"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -10,9 +10,12 @@ import (
 | 
				
			|||||||
// 字典 key 可以配置到 自动任务 调用目标 中;
 | 
					// 字典 key 可以配置到 自动任务 调用目标 中;
 | 
				
			||||||
func InitJob() {
 | 
					func InitJob() {
 | 
				
			||||||
	jobList = map[string]JobExec{
 | 
						jobList = map[string]JobExec{
 | 
				
			||||||
		"ExamplesOne":   ExamplesOne{},
 | 
							"ExamplesOne":          ExamplesOne{},
 | 
				
			||||||
		"DailyJob":      DailyJob{},
 | 
							"DailyJob":             DailyJob{},
 | 
				
			||||||
		"RemainCharJob": RemainCharJob{},
 | 
							"RemainCharJob":        RemainCharJob{},
 | 
				
			||||||
 | 
							"CleanExpiredOrderJob": CleanExpiredOrderJob{},
 | 
				
			||||||
 | 
							"TrxPaymentJob":        TrxPaymentJob{},
 | 
				
			||||||
 | 
							"SyncRemainCharJob":    SyncRemainCharJob{},
 | 
				
			||||||
		// ...
 | 
							// ...
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,11 +2,12 @@ package jobs
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						models2 "go-admin/app/jobs/models"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log "github.com/go-admin-team/go-admin-core/logger"
 | 
						log "github.com/go-admin-team/go-admin-core/logger"
 | 
				
			||||||
	"github.com/go-admin-team/go-admin-core/sdk"
 | 
						"github.com/go-admin-team/go-admin-core/sdk"
 | 
				
			||||||
	models2 "go-admin/app/jobs/models"
 | 
					 | 
				
			||||||
	"gorm.io/gorm"
 | 
						"gorm.io/gorm"
 | 
				
			||||||
	"time"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/robfig/cron/v3"
 | 
						"github.com/robfig/cron/v3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -59,7 +60,7 @@ func (e *ExecJob) Run() {
 | 
				
			|||||||
	//TODO: 待完善部分
 | 
						//TODO: 待完善部分
 | 
				
			||||||
	//str := time.Now().Format(timeFormat) + " [INFO] JobCore " + string(e.EntryId) + "exec success , spend :" + latencyTime.String()
 | 
						//str := time.Now().Format(timeFormat) + " [INFO] JobCore " + string(e.EntryId) + "exec success , spend :" + latencyTime.String()
 | 
				
			||||||
	//ws.SendAll(str)
 | 
						//ws.SendAll(str)
 | 
				
			||||||
	log.Info("[Job] JobCore %s exec success , spend :%v", e.Name, latencyTime)
 | 
						log.Infof("[Job] JobCore %s exec success , spend :%v", e.Name, latencyTime)
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,30 @@ type DailyJob struct{}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type RemainCharJob struct{}
 | 
					type RemainCharJob struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CleanExpiredOrderJob struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 同步剩余字符
 | 
				
			||||||
 | 
					type SyncRemainCharJob struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 定时同步第三方用量
 | 
				
			||||||
 | 
					func (t SyncRemainCharJob) Exec(arg interface{}) error {
 | 
				
			||||||
 | 
						platformAccountService := service.TmPlatformAccount{}
 | 
				
			||||||
 | 
						platformAccountService.Orm = GetDb()
 | 
				
			||||||
 | 
						platformAccountService.Log = logger.NewHelper(logger.DefaultLogger)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return platformAccountService.SyncAll()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 清理过期订单
 | 
				
			||||||
 | 
					func (t CleanExpiredOrderJob) Exec(arg interface{}) error {
 | 
				
			||||||
 | 
						// expireTime := time.Now().Add(5 * time.Minute)
 | 
				
			||||||
 | 
						rechargeLogService := service.TmRechargeLog{}
 | 
				
			||||||
 | 
						rechargeLogService.Orm = GetDb()
 | 
				
			||||||
 | 
						rechargeLogService.Log = logger.NewHelper(logger.DefaultLogger)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return rechargeLogService.CleanExpiredOrder()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 剩余字符统计
 | 
					// 剩余字符统计
 | 
				
			||||||
func (t RemainCharJob) Exec(arg interface{}) error {
 | 
					func (t RemainCharJob) Exec(arg interface{}) error {
 | 
				
			||||||
	memberService := service.TmMember{}
 | 
						memberService := service.TmMember{}
 | 
				
			||||||
 | 
				
			|||||||
@ -36,3 +36,37 @@ func TestRemainTranslate(t *testing.T) {
 | 
				
			|||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestClean(t *testing.T) {
 | 
				
			||||||
 | 
						dsn := "root:123456@tcp(127.0.0.1:3306)/aggregate_translate?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"
 | 
				
			||||||
 | 
						db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
 | 
				
			||||||
 | 
						sdk.Runtime.SetDb("default", db)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						redishelper.InitDefaultRedis("127.0.0.1:6379", "", 1)
 | 
				
			||||||
 | 
						redishelper.InitLockRedisConn("127.0.0.1:6379", "", "1")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						job := CleanExpiredOrderJob{}
 | 
				
			||||||
 | 
						if err := job.Exec(nil); err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestSyncPlatformAccountChar(t *testing.T) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						initSetting()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						job := SyncRemainCharJob{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := job.Exec(nil); err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func initSetting() {
 | 
				
			||||||
 | 
						dsn := "root:123456@tcp(127.0.0.1:3306)/aggregate_translate?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"
 | 
				
			||||||
 | 
						db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
 | 
				
			||||||
 | 
						sdk.Runtime.SetDb("default", db)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						redishelper.InitDefaultRedis("127.0.0.1:6379", "", 1)
 | 
				
			||||||
 | 
						redishelper.InitLockRedisConn("127.0.0.1:6379", "", "1")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										158
									
								
								app/jobs/trxpayment_job.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								app/jobs/trxpayment_job.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,158 @@
 | 
				
			|||||||
 | 
					package jobs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"go-admin/app/admin/service"
 | 
				
			||||||
 | 
						"go-admin/app/admin/service/dto"
 | 
				
			||||||
 | 
						rediskey "go-admin/common/redis_key"
 | 
				
			||||||
 | 
						"go-admin/config"
 | 
				
			||||||
 | 
						"go-admin/utils/redishelper"
 | 
				
			||||||
 | 
						"go-admin/utils/utility"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-admin-team/go-admin-core/logger"
 | 
				
			||||||
 | 
						"github.com/shopspring/decimal"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TrxPaymentJob struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// tronGridURL         = "https://api.trongrid.io"            // TronGrid API 地址
 | 
				
			||||||
 | 
						UsdtContractAddress = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t" //TRX USDT 合约地址
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// trx 链上支付定时查询
 | 
				
			||||||
 | 
					func (j TrxPaymentJob) Exec(arg interface{}) error {
 | 
				
			||||||
 | 
						configService := service.SysConfig{}
 | 
				
			||||||
 | 
						configService.Orm = GetDb()
 | 
				
			||||||
 | 
						req := dto.SysConfigByKeyReq{}
 | 
				
			||||||
 | 
						req.ConfigKey = "trx_receive_address"
 | 
				
			||||||
 | 
						configData := dto.GetSysConfigByKEYForServiceResp{}
 | 
				
			||||||
 | 
						configService.GetWithKey(&req, &configData)
 | 
				
			||||||
 | 
						if configData.ConfigValue == "" {
 | 
				
			||||||
 | 
							logger.Error("查询地址为空")
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						key := fmt.Sprintf(rediskey.TM_RECHARGE_PRE_ORDER, "*")
 | 
				
			||||||
 | 
						keys, err := redishelper.DefaultRedis.ScanKeys(key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							logger.Error("查询redis key失败", err)
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(keys) == 0 {
 | 
				
			||||||
 | 
							logger.Info("没有待处理订单")
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rechargeService := service.TmRechargeLog{}
 | 
				
			||||||
 | 
						rechargeService.Orm = GetDb()
 | 
				
			||||||
 | 
						rechargeService.Log = logger.NewHelper(logger.DefaultLogger)
 | 
				
			||||||
 | 
						platforms, err := rechargeService.GetPlatforms()
 | 
				
			||||||
 | 
						toAddresss := []string{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							logger.Error("查询平台失败", err)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, platform := range platforms {
 | 
				
			||||||
 | 
							if strings.ToLower(platform.BlockChain) == "trx" && !utility.ContainsString(toAddresss, platform.ReceiveAddress) {
 | 
				
			||||||
 | 
								toAddresss = append(toAddresss, platform.ReceiveAddress)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						startTime := time.Now().UnixMilli()
 | 
				
			||||||
 | 
						endTime := time.Now().Add(-1 * time.Hour).UnixMilli()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, toAddress := range toAddresss {
 | 
				
			||||||
 | 
							transfers, err := GetTRC20Transfers(UsdtContractAddress, toAddress, endTime, startTime)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								logger.Error("查询失败", err)
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							logs := make([]dto.TmRechargeCallbackReq, 0)
 | 
				
			||||||
 | 
							item := dto.TmRechargeCallbackReq{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for _, transfer := range transfers {
 | 
				
			||||||
 | 
								if transfer.TransactionID == "" || transfer.ToAddress != toAddress {
 | 
				
			||||||
 | 
									logger.Infof("跳出插入 ", transfer)
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//实际金额
 | 
				
			||||||
 | 
								payableAmount := utility.StringToDecimal(transfer.Value).Div(decimal.NewFromInt(10).Pow(decimal.NewFromInt(int64(transfer.TokenInfo.Decimals)))).Truncate(6)
 | 
				
			||||||
 | 
								item.TxHash = transfer.TransactionID
 | 
				
			||||||
 | 
								item.PayableAmount = payableAmount
 | 
				
			||||||
 | 
								item.FromAddress = transfer.FromAddress
 | 
				
			||||||
 | 
								item.ToAddress = transfer.ToAddress
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if utility.ContainsString(toAddresss, item.ToAddress) {
 | 
				
			||||||
 | 
									logs = append(logs, item)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									logger.Infof("没有写入logs ", item)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(logs) > 0 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								err := rechargeService.PayCallBack(&logs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									logger.Error("执行完毕,err:", err.Error())
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// logger.Infof("接收地址:%s 合约地址:%s 无数据", toAddress, UsdtContractAddress)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetTRC20Transfers 获取指定 TRC20 代币的交易记录
 | 
				
			||||||
 | 
					func GetTRC20Transfers(contractAddress, accountAddress string, minTimestamp, maxTimestamp int64) ([]dto.TRC20Transfer, error) {
 | 
				
			||||||
 | 
						url := fmt.Sprintf("%s/v1/accounts/%s/transactions/trc20?contract_address=%s", config.ExtConfig.TrxGridUrl, accountAddress, contractAddress)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if minTimestamp > 0 {
 | 
				
			||||||
 | 
							url += fmt.Sprintf("&min_timestamp=%d", minTimestamp)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if maxTimestamp > 0 {
 | 
				
			||||||
 | 
							url += fmt.Sprintf("&max_timestamp=%d", maxTimestamp)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// logger.Info("查询地址:", url)
 | 
				
			||||||
 | 
						req, err := http.NewRequest("GET", url, nil)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("failed to create request: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 设置请求头(包含 TronGrid API Key)
 | 
				
			||||||
 | 
						req.Header.Set("Accept", "*/*")
 | 
				
			||||||
 | 
						req.Header.Set("TRON-PRO-API-KEY", config.ExtConfig.TronApiKey) // 从配置读取 API Key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						client := &http.Client{}
 | 
				
			||||||
 | 
						resp, err := client.Do(req)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("failed to send request: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer resp.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						body, err := io.ReadAll(resp.Body)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("failed to read response body: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var result struct {
 | 
				
			||||||
 | 
							Data []dto.TRC20Transfer `json:"data"`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// logger.Info("查询结果:", string(body))
 | 
				
			||||||
 | 
						if err := json.Unmarshal(body, &result); err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("failed to unmarshal response: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return result.Data, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										28
									
								
								app/jobs/trxpayment_job_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/jobs/trxpayment_job_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					package jobs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"go-admin/config"
 | 
				
			||||||
 | 
						"go-admin/utils/redishelper"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-admin-team/go-admin-core/sdk"
 | 
				
			||||||
 | 
						"gorm.io/driver/mysql"
 | 
				
			||||||
 | 
						"gorm.io/gorm"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestTrxPaymentJob(t *testing.T) {
 | 
				
			||||||
 | 
						dsn := "root:123456@tcp(127.0.0.1:3306)/aggregate_translate?charset=utf8mb4&parseTime=True&loc=Local&timeout=1000ms"
 | 
				
			||||||
 | 
						db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
 | 
				
			||||||
 | 
						sdk.Runtime.SetDb("default", db)
 | 
				
			||||||
 | 
						config.ExtConfig.TrxGridUrl = "https://api.trongrid.io"
 | 
				
			||||||
 | 
						redishelper.InitDefaultRedis("127.0.0.1:6379", "", 1)
 | 
				
			||||||
 | 
						redishelper.InitLockRedisConn("127.0.0.1:6379", "", "1")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						trxPaymentJob := TrxPaymentJob{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := trxPaymentJob.Exec(nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -227,8 +227,8 @@ func initRouter() {
 | 
				
			|||||||
		r.Use(handler.TlsHandler())
 | 
							r.Use(handler.TlsHandler())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	//r.Use(middleware.Metrics())
 | 
						//r.Use(middleware.Metrics())
 | 
				
			||||||
	r.Use(common.Sentinel()).
 | 
						// r.Use(common.Sentinel()).
 | 
				
			||||||
		Use(common.RequestId(pkg.TrafficKey)).
 | 
						r.Use(common.RequestId(pkg.TrafficKey)).
 | 
				
			||||||
		Use(api.SetRequestLogger)
 | 
							Use(api.SetRequestLogger)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	common.InitMiddleware(r)
 | 
						common.InitMiddleware(r)
 | 
				
			||||||
 | 
				
			|||||||
@ -12,3 +12,8 @@ const (
 | 
				
			|||||||
	//用户剩余翻译字符数 {key} 只有前缀
 | 
						//用户剩余翻译字符数 {key} 只有前缀
 | 
				
			||||||
	TM_MEMBER_REMAIN_COUNT_PURE = "tm_member_remain_count"
 | 
						TM_MEMBER_REMAIN_COUNT_PURE = "tm_member_remain_count"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						//用户充值预订单 {amount}
 | 
				
			||||||
 | 
						TM_RECHARGE_PRE_ORDER = "tm_recharge_pre_order:%s"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
				
			|||||||
@ -10,19 +10,20 @@ type Response struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var ErrorMessage = map[int]string{
 | 
					var ErrorMessage = map[int]string{
 | 
				
			||||||
	Success:                  "success",
 | 
						Success:                             "success",
 | 
				
			||||||
	Unauthorized:             "unauthorized",
 | 
						Unauthorized:                        "unauthorized",
 | 
				
			||||||
	ServerError:              "server error",
 | 
						ServerError:                         "server error",
 | 
				
			||||||
	NotFound:                 "not found",
 | 
						NotFound:                            "not found",
 | 
				
			||||||
	Forbidden:                "forbidden",
 | 
						Forbidden:                           "forbidden",
 | 
				
			||||||
	InvalidParams:            "invalid params",
 | 
						InvalidParams:                       "invalid params",
 | 
				
			||||||
	InSufficRemainChar:       "insufficent remain char",
 | 
						InSufficRemainChar:                  "insufficent remain char",
 | 
				
			||||||
	PlatformNotSupport:       "platform not support",
 | 
						PlatformNotSupport:                  "platform not support",
 | 
				
			||||||
	TransactionNotAvailable:  "transaction not available",
 | 
						TransactionNotAvailable:             "transaction not available",
 | 
				
			||||||
	ApiUnauthorized:          "api unauthorized",
 | 
						ApiUnauthorized:                     "api unauthorized",
 | 
				
			||||||
	NotFindMember:            "not find member",
 | 
						NotFindMember:                       "not find member",
 | 
				
			||||||
	NotFindApiKey:            "not find api key",
 | 
						NotFindApiKey:                       "not find api key",
 | 
				
			||||||
	MemberPlatformNotSupport: "member platform not support",
 | 
						MemberPlatformNotSupport:            "member platform not support",
 | 
				
			||||||
 | 
						RechargeNumberMustBeGreaterThanZero: "The recharge quantity must be greater than 0",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@ -44,4 +45,8 @@ const (
 | 
				
			|||||||
	NotFindMember            = 30001 //未找到用户
 | 
						NotFindMember            = 30001 //未找到用户
 | 
				
			||||||
	NotFindApiKey            = 30002 //未找到api key
 | 
						NotFindApiKey            = 30002 //未找到api key
 | 
				
			||||||
	MemberPlatformNotSupport = 30003 //用户平台不支持
 | 
						MemberPlatformNotSupport = 30003 //用户平台不支持
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//================ 充值相关 ===============
 | 
				
			||||||
 | 
						RechargeNumberMustBeGreaterThanZero = 40001 //充值数量必须大于0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
				
			|||||||
@ -10,8 +10,10 @@ var ExtConfig Extend
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// 使用方法: config.ExtConfig......即可!!
 | 
					// 使用方法: config.ExtConfig......即可!!
 | 
				
			||||||
type Extend struct {
 | 
					type Extend struct {
 | 
				
			||||||
	AMap AMap // 这里配置对应配置文件的结构即可
 | 
						AMap       AMap // 这里配置对应配置文件的结构即可
 | 
				
			||||||
	Mq   MqConfig
 | 
						Mq         MqConfig
 | 
				
			||||||
 | 
						TrxGridUrl string `yaml:"trxGridUrl"`
 | 
				
			||||||
 | 
						TronApiKey string `yaml:"tronApiKey"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type AMap struct {
 | 
					type AMap struct {
 | 
				
			||||||
 | 
				
			|||||||
@ -53,6 +53,9 @@ settings:
 | 
				
			|||||||
      username: admin
 | 
					      username: admin
 | 
				
			||||||
      password: '123456'
 | 
					      password: '123456'
 | 
				
			||||||
      pass: "123456"
 | 
					      pass: "123456"
 | 
				
			||||||
 | 
					    #trx api
 | 
				
			||||||
 | 
					    trxGridUrl: "https://api.trongrid.io"
 | 
				
			||||||
 | 
					    tronApiKey: "223c129e-73f5-470f-9464-f9969846c134"
 | 
				
			||||||
  cache:
 | 
					  cache:
 | 
				
			||||||
    redis:
 | 
					    redis:
 | 
				
			||||||
      addr: 127.0.0.1:6379
 | 
					      addr: 127.0.0.1:6379
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										35
									
								
								utils/chainhelper/chainhelper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								utils/chainhelper/chainhelper.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					package chainhelper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"regexp"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 比较钱包地址格式
 | 
				
			||||||
 | 
					func JudgeChainAddress(chain, walletAddress string) error {
 | 
				
			||||||
 | 
						switch chain {
 | 
				
			||||||
 | 
						case "trx":
 | 
				
			||||||
 | 
							return validateTronAddress(walletAddress)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return errors.New("invalid chain")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func validateTronAddress(address string) error {
 | 
				
			||||||
 | 
						// TRON 地址通常以 'T' 开头,并且是 34 个字符的 Base58Check 编码
 | 
				
			||||||
 | 
						// 这是一个简化的检查,最佳实践是使用专门的 Tron 地址验证库来包含校验和验证
 | 
				
			||||||
 | 
						if len(address) != 34 {
 | 
				
			||||||
 | 
							return errors.New("Tron 钱包地址长度不正确")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if address[0] != 'T' {
 | 
				
			||||||
 | 
							return errors.New("Tron 钱包地址长度不正确,必须以 'T'开头")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查字符集
 | 
				
			||||||
 | 
						matched, _ := regexp.MatchString("^[T][1-9a-zA-Z]{33}$", address)
 | 
				
			||||||
 | 
						if !matched {
 | 
				
			||||||
 | 
							return errors.New("TRON 钱包地址格式不正确")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										44
									
								
								utils/utility/safego.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								utils/utility/safego.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					package utility
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
 | 
						"runtime/debug"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-admin-team/go-admin-core/logger"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SafeGo 安全地启动一个 goroutine,捕获 panic
 | 
				
			||||||
 | 
					func SafeGo(fn func()) {
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							defer func() {
 | 
				
			||||||
 | 
								if r := recover(); r != nil {
 | 
				
			||||||
 | 
									// 记录 Goroutine ID、panic 信息和堆栈
 | 
				
			||||||
 | 
									logger.Error(fmt.Sprintf("Recovered from panic in Goroutine %s: %v\nStack Trace:\n%s", GetGoroutineID(), r, string(debug.Stack())))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
							fn()
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 获取 Goroutine ID
 | 
				
			||||||
 | 
					func GetGoroutineID() string {
 | 
				
			||||||
 | 
						buf := make([]byte, 64)
 | 
				
			||||||
 | 
						n := runtime.Stack(buf, false)
 | 
				
			||||||
 | 
						stack := string(buf[:n])
 | 
				
			||||||
 | 
						// 提取 Goroutine ID
 | 
				
			||||||
 | 
						id := strings.Split(stack, " ")[1]
 | 
				
			||||||
 | 
						return id
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SafeGoParam[T any](fn func(T), param T) {
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							defer func() {
 | 
				
			||||||
 | 
								if r := recover(); r != nil {
 | 
				
			||||||
 | 
									logger.Error(fmt.Sprintf(" SafeGoParam Recovered from panic in Goroutine %s: %v\nStack Trace:\n%s", GetGoroutineID(), r, string(debug.Stack())))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}()
 | 
				
			||||||
 | 
							fn(param) // 执行传入的函数
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -27,3 +27,13 @@ func ContainsInt(arr []int, v int) bool {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ContainsString(arr []string, v string) bool {
 | 
				
			||||||
 | 
						for _, a := range arr {
 | 
				
			||||||
 | 
							if a == v {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,10 @@
 | 
				
			|||||||
package utility
 | 
					package utility
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "strings"
 | 
					import (
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/shopspring/decimal"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DesensitizeGeneric 通用脱敏函数:
 | 
					// DesensitizeGeneric 通用脱敏函数:
 | 
				
			||||||
// startReserveCount: 从字符串开头保留的字符数
 | 
					// startReserveCount: 从字符串开头保留的字符数
 | 
				
			||||||
@ -61,3 +65,14 @@ func DesensitizeGeneric(text string, startReserveCount int, endReserveCount int,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return sb.String()
 | 
						return sb.String()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func StringToDecimal(val string) decimal.Decimal {
 | 
				
			||||||
 | 
						cleanedNum := strings.TrimRight(val, "\x00")         // 去除空字符
 | 
				
			||||||
 | 
						cleanedNum = strings.TrimSpace(cleanedNum)           // 去除空格
 | 
				
			||||||
 | 
						cleanedNum = strings.ReplaceAll(cleanedNum, ",", "") // 去除逗号
 | 
				
			||||||
 | 
						d, err := decimal.NewFromString(cleanedNum)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return decimal.Zero
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return d
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user