Files
video-factory/shortdrama/controller/customer_controller.go
T
2026-07-13 16:14:27 +08:00

121 lines
3.3 KiB
Go

package controller
import (
"context"
"errors"
"video-factory/shortdrama/consts/public"
"video-factory/shortdrama/dao"
"video-factory/shortdrama/middleware"
"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 customer struct{}
var Customer = new(customer)
type createCustomerRes struct {
Id int64 `json:"id"`
}
func (c *customer) Create(ctx context.Context, req *dto.CreateCustomerReq) (res *createCustomerRes, err error) {
agentId := req.AgentId
if agentId == 0 {
r := g.RequestFromCtx(ctx)
agentId = middleware.GetUserId(r)
}
user, err := service.AuthService.CreateCustomer(ctx, req.Phone, req.Name, req.Region, agentId)
if err != nil {
return nil, err
}
return &createCustomerRes{Id: user.Id}, nil
}
func (c *customer) List(ctx context.Context, req *dto.ListCustomerReq) (res *dto.ListCustomerRes, err error) {
var list []*entity.User
var total int
if req.AgentId > 0 {
m := g.DB().Model(public.TableNameUser+" u").
InnerJoin(public.TableNameCustomerProfile+" cp", "cp.user_id = u.id").
Where("cp.agent_id", req.AgentId)
if req.Keyword != "" {
m = m.Where("u.name LIKE ? OR u.phone LIKE ?", "%"+req.Keyword+"%", "%"+req.Keyword+"%")
}
total, err = m.Count()
if err != nil {
return nil, err
}
err = m.Page(req.Page, req.PageSize).OrderAsc("u.id").Scan(&list)
} else {
m := g.DB().Model(public.TableNameUser).Where("role", "customer")
if req.Keyword != "" {
m = m.Where("name LIKE ? OR phone LIKE ?", "%"+req.Keyword+"%", "%"+req.Keyword+"%")
}
total, err = m.Count()
if err != nil {
return nil, err
}
err = m.Page(req.Page, req.PageSize).OrderAsc("id").Scan(&list)
}
if err != nil {
return nil, err
}
items := make([]*dto.ListCustomerItem, len(list))
for i, u := range list {
items[i] = &dto.ListCustomerItem{
Id: u.Id,
Phone: u.Phone,
Name: u.Name,
Region: u.Region,
}
cp, _ := dao.CustomerProfile.Get(ctx, u.Id)
if cp != nil {
items[i].Balance = cp.Balance
items[i].AgentId = cp.AgentId
}
if u.CreatedAt != nil {
items[i].CreatedAt = u.CreatedAt.String()
}
}
return &dto.ListCustomerRes{List: items, Total: total, Page: req.Page, PageSize: req.PageSize}, nil
}
func (c *customer) Detail(ctx context.Context, req *struct{ Id int64 }) (res *dto.CustomerDetail, err error) {
user, err := dao.User.GetOne(ctx, req.Id)
if err != nil || user == nil {
return nil, err
}
profile, _ := dao.CustomerProfile.Get(ctx, req.Id)
balance := service.AuthService.GetBalance(ctx, req.Id)
return &dto.CustomerDetail{User: user, Profile: profile, Balance: balance}, nil
}
func (c *customer) Update(ctx context.Context, req *dto.UpdateCustomerReq) (res *struct{}, err error) {
// 检查当前代理商是否过期
r := g.RequestFromCtx(ctx)
agentId := middleware.GetUserId(r)
if ap, _ := dao.AgentProfile.Get(ctx, agentId); ap != nil && ap.ExpiredAt != nil && ap.ExpiredAt.Before(gtime.Now()) {
return nil, errors.New("代理商已过期,无法编辑客户")
}
m := g.Map{}
if req.Phone != "" {
m["phone"] = req.Phone
}
if req.Name != "" {
m["name"] = req.Name
}
if req.Region != "" {
m["region"] = req.Region
}
if len(m) == 0 {
return nil, nil
}
return nil, dao.User.UpdateFields(ctx, req.Id, m)
}