Files
video-factory/shortdrama/controller/agent_controller.go
T
2026-07-13 18:00:40 +08:00

144 lines
4.1 KiB
Go

package controller
import (
"context"
"video-factory/shortdrama/consts/public"
"video-factory/shortdrama/dao"
"video-factory/shortdrama/model/dto"
"video-factory/shortdrama/model/entity"
"video-factory/shortdrama/service"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
)
type agent struct{}
var Agent = new(agent)
type createAgentRes struct {
Id int64 `json:"id"`
}
func (c *agent) Create(ctx context.Context, req *dto.CreateAgentReq) (res *createAgentRes, err error) {
user, err := service.AuthService.CreateAgent(ctx, req.Username, req.Password, req.Phone, req.Name, req.Region, req.TierId, req.RegionProtected)
if err != nil {
return nil, err
}
return &createAgentRes{Id: user.Id}, nil
}
func (c *agent) List(ctx context.Context, req *dto.ListAgentReq) (res *dto.ListAgentRes, err error) {
m := g.DB().Model(public.TableNameUser+" u").
LeftJoin(public.TableNameAgentProfile+" ap", "ap.user_id = u.id").
LeftJoin(public.TableNameAgentTier+" at", "at.id = ap.tier_id").
Where("u.role", "agent")
if req.Keyword != "" {
m = m.Where("u.name LIKE ? OR u.username LIKE ? OR u.phone LIKE ?", "%"+req.Keyword+"%", "%"+req.Keyword+"%", "%"+req.Keyword+"%")
}
total, err := m.Count()
if err != nil {
return nil, err
}
type agentRow struct {
Id int64 `orm:"id"`
Username string `orm:"username"`
Phone string `orm:"phone"`
Name string `orm:"name"`
Region string `orm:"region"`
TierId int64 `orm:"tier_id"`
TierName string `orm:"tier_name"`
ExpiredAt *gtime.Time `orm:"expired_at"`
}
var rows []*agentRow
err = m.Fields(
"u.id", "u.username", "u.phone", "u.name", "u.region",
"ap.tier_id", "at.name AS tier_name", "ap.expired_at",
).Page(req.Page, req.PageSize).OrderAsc("u.id").Scan(&rows)
if err != nil {
return nil, err
}
list := make([]*dto.ListAgentItem, len(rows))
for i, r := range rows {
list[i] = &dto.ListAgentItem{
User: &entity.User{
Id: r.Id,
Username: r.Username,
Phone: r.Phone,
Name: r.Name,
Region: r.Region,
ExpiredAt: r.ExpiredAt,
},
TierId: r.TierId,
TierName: r.TierName,
}
}
return &dto.ListAgentRes{List: list, Total: total, Page: req.Page, PageSize: req.PageSize}, nil
}
func (c *agent) Update(ctx context.Context, req *dto.UpdateAgentReq) (res *struct{}, err error) {
if req.Name != "" {
m := g.Map{
"name": req.Name,
"region": req.Region,
}
if req.Phone != "" {
m["phone"] = req.Phone
}
if err := dao.User.UpdateFields(ctx, req.Id, m); err != nil {
return nil, err
}
}
if req.TierId > 0 {
ap, _ := dao.AgentProfile.Get(ctx, req.Id)
tier, err := dao.AgentTier.GetOne(ctx, req.TierId)
if err != nil || tier == nil {
return nil, err
}
if ap != nil {
ap.TierId = req.TierId
ap.MaxCustomers = tier.MaxCustomers
return nil, dao.AgentProfile.Update(ctx, ap)
}
}
return nil, nil
}
func (c *agent) Renew(ctx context.Context, req *dto.RenewAgentReq) (res *struct{}, err error) {
return nil, service.AuthService.RenewAgent(ctx, req.AgentId, req.TierId)
}
// CreateRenewOrder 创建续费订单并立即完成续费
func (c *agent) CreateRenewOrder(ctx context.Context, req *dto.CreateRenewOrderReq) (res *dto.CreateRenewOrderRes, err error) {
order, err := service.PaymentService.CreateRenewalOrder(ctx, req.AgentId, req.TierId, req.Duration)
if err != nil {
return nil, err
}
// 内部续费,直接确认收款
if err := service.PaymentService.ConfirmOffline(ctx, order.OrderNo); err != nil {
return nil, err
}
return &dto.CreateRenewOrderRes{
OrderNo: order.OrderNo,
Amount: order.Amount,
Status: "success",
}, nil
}
type getAgentDetailRes struct {
User *entity.User `json:"user"`
Profile *entity.AgentProfile `json:"profile"`
}
func (c *agent) Get(ctx context.Context, req *struct{ Id int64 }) (res *getAgentDetailRes, err error) {
user, err := dao.User.GetOne(ctx, req.Id)
if err != nil || user == nil {
return nil, err
}
profile, _ := dao.AgentProfile.Get(ctx, req.Id)
return &getAgentDetailRes{User: user, Profile: profile}, nil
}