f
This commit is contained in:
@@ -2,6 +2,7 @@ package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
"qnc-server/app/main/api/internal/svc"
|
||||
"qnc-server/app/main/api/internal/types"
|
||||
@@ -27,20 +28,46 @@ func NewAdminGetAgentCommissionListLogic(ctx context.Context, svcCtx *svc.Servic
|
||||
|
||||
func (l *AdminGetAgentCommissionListLogic) AdminGetAgentCommissionList(req *types.AdminGetAgentCommissionListReq) (resp *types.AdminGetAgentCommissionListResp, err error) {
|
||||
builder := l.svcCtx.AgentCommissionModel.SelectBuilder()
|
||||
|
||||
// 按 agent_code 筛选:先查出 agent_id
|
||||
if req.AgentCode != nil && *req.AgentCode != "" {
|
||||
agentCodeInt, parseErr := strconv.ParseInt(*req.AgentCode, 10, 64)
|
||||
if parseErr == nil {
|
||||
agent, findErr := l.svcCtx.AgentModel.FindOneByAgentCode(l.ctx, agentCodeInt)
|
||||
if findErr == nil && agent != nil {
|
||||
builder = builder.Where(squirrel.Eq{"agent_id": agent.Id})
|
||||
} else {
|
||||
// 找不到对应代理,返回空列表
|
||||
return &types.AdminGetAgentCommissionListResp{Total: 0, Items: []types.AgentCommissionListItem{}}, nil
|
||||
}
|
||||
} else {
|
||||
return &types.AdminGetAgentCommissionListResp{Total: 0, Items: []types.AgentCommissionListItem{}}, nil
|
||||
}
|
||||
}
|
||||
|
||||
// 按 order_no 筛选:先查出 order_id
|
||||
if req.OrderNo != nil && *req.OrderNo != "" {
|
||||
order, findErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *req.OrderNo)
|
||||
if findErr == nil && order != nil {
|
||||
builder = builder.Where(squirrel.Eq{"order_id": order.Id})
|
||||
} else {
|
||||
return &types.AdminGetAgentCommissionListResp{Total: 0, Items: []types.AgentCommissionListItem{}}, nil
|
||||
}
|
||||
}
|
||||
|
||||
if req.AgentId != nil {
|
||||
builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId})
|
||||
}
|
||||
if req.Status != nil {
|
||||
builder = builder.Where(squirrel.Eq{"status": *req.Status})
|
||||
}
|
||||
// 产品名称筛选功能已移除,如需可按product_id筛选
|
||||
|
||||
list, total, err := l.svcCtx.AgentCommissionModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 批量查product_name
|
||||
// 批量查 product_name
|
||||
productIds := make(map[string]struct{})
|
||||
for _, v := range list {
|
||||
productIds[v.ProductId] = struct{}{}
|
||||
@@ -58,11 +85,38 @@ func (l *AdminGetAgentCommissionListLogic) AdminGetAgentCommissionList(req *type
|
||||
}
|
||||
}
|
||||
|
||||
// 批量查 agent_code
|
||||
agentIds := make([]string, 0, len(list))
|
||||
for _, v := range list {
|
||||
if v.AgentId != "" {
|
||||
agentIds = append(agentIds, v.AgentId)
|
||||
}
|
||||
}
|
||||
agentCodeMap := batchAgentCodesByIds(l.ctx, l.svcCtx, agentIds)
|
||||
|
||||
// 批量查 order_no
|
||||
orderIds := make([]string, 0, len(list))
|
||||
for _, v := range list {
|
||||
if v.OrderId != "" {
|
||||
orderIds = append(orderIds, v.OrderId)
|
||||
}
|
||||
}
|
||||
orderNoMap := make(map[string]string)
|
||||
if len(orderIds) > 0 {
|
||||
orderBuilder := l.svcCtx.OrderModel.SelectBuilder().Where(squirrel.Eq{"id": orderIds})
|
||||
orders, _ := l.svcCtx.OrderModel.FindAll(l.ctx, orderBuilder, "")
|
||||
for _, o := range orders {
|
||||
orderNoMap[o.Id] = o.OrderNo
|
||||
}
|
||||
}
|
||||
|
||||
items := make([]types.AgentCommissionListItem, 0, len(list))
|
||||
for _, v := range list {
|
||||
item := types.AgentCommissionListItem{}
|
||||
_ = copier.Copy(&item, v)
|
||||
item.AgentCode = agentCodeMap[v.AgentId]
|
||||
item.ProductName = productNameMap[v.ProductId]
|
||||
item.OrderNo = orderNoMap[v.OrderId]
|
||||
item.CreateTime = v.CreateTime.Format("2006-01-02 15:04:05")
|
||||
items = append(items, item)
|
||||
}
|
||||
|
||||
@@ -2,9 +2,12 @@ package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"qnc-server/app/main/api/internal/svc"
|
||||
"qnc-server/app/main/api/internal/types"
|
||||
"qnc-server/common/globalkey"
|
||||
|
||||
"github.com/Masterminds/squirrel"
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
@@ -29,6 +32,16 @@ func (l *AdminGetAgentLinkListLogic) AdminGetAgentLinkList(req *types.AdminGetAg
|
||||
if req.AgentId != nil {
|
||||
builder = builder.Where("agent_id = ?", *req.AgentId)
|
||||
}
|
||||
if req.AgentCode != nil && strings.TrimSpace(*req.AgentCode) != "" {
|
||||
var agentCode int64
|
||||
if _, err := fmt.Sscanf(strings.TrimSpace(*req.AgentCode), "%d", &agentCode); err == nil {
|
||||
builder = builder.Where(
|
||||
"agent_id IN (SELECT id FROM agent WHERE agent_code = ? AND del_state = ?)",
|
||||
agentCode,
|
||||
globalkey.DelStateNo,
|
||||
)
|
||||
}
|
||||
}
|
||||
if req.LinkIdentifier != nil && *req.LinkIdentifier != "" {
|
||||
builder = builder.Where("link_identifier = ?", *req.LinkIdentifier)
|
||||
}
|
||||
@@ -60,11 +73,20 @@ func (l *AdminGetAgentLinkListLogic) AdminGetAgentLinkList(req *types.AdminGetAg
|
||||
}
|
||||
}
|
||||
|
||||
agentIds := make([]string, 0, len(links))
|
||||
for _, link := range links {
|
||||
if link.AgentId != "" {
|
||||
agentIds = append(agentIds, link.AgentId)
|
||||
}
|
||||
}
|
||||
agentCodeMap := batchAgentCodesByIds(l.ctx, l.svcCtx, agentIds)
|
||||
|
||||
items := make([]types.AgentLinkListItem, 0, len(links))
|
||||
for _, link := range links {
|
||||
items = append(items, types.AgentLinkListItem{
|
||||
Id: link.Id,
|
||||
AgentId: link.AgentId,
|
||||
AgentCode: agentCodeMap[link.AgentId],
|
||||
ProductId: link.ProductId,
|
||||
ProductName: productNameMap[link.ProductId],
|
||||
SetPrice: link.SetPrice,
|
||||
|
||||
@@ -3,9 +3,12 @@ package admin_agent
|
||||
import (
|
||||
"context"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"qnc-server/app/main/api/internal/svc"
|
||||
"qnc-server/app/main/api/internal/types"
|
||||
"qnc-server/common/globalkey"
|
||||
"qnc-server/common/xerr"
|
||||
"qnc-server/pkg/lzkit/crypto"
|
||||
|
||||
@@ -31,26 +34,52 @@ func NewAdminGetAgentListLogic(ctx context.Context, svcCtx *svc.ServiceContext)
|
||||
func (l *AdminGetAgentListLogic) AdminGetAgentList(req *types.AdminGetAgentListReq) (resp *types.AdminGetAgentListResp, err error) {
|
||||
builder := l.svcCtx.AgentModel.SelectBuilder()
|
||||
|
||||
// 如果传入TeamLeaderId,则查找该团队首领下的所有代理
|
||||
if req.TeamLeaderId != nil {
|
||||
builder = builder.Where(squirrel.Eq{"team_leader_id": *req.TeamLeaderId})
|
||||
}
|
||||
if req.Level != nil {
|
||||
builder = builder.Where(squirrel.Eq{"level": *req.Level})
|
||||
}
|
||||
if req.Mobile != nil && *req.Mobile != "" {
|
||||
// 加密手机号进行查询
|
||||
encryptedMobile, err := crypto.EncryptMobile(*req.Mobile, l.svcCtx.Config.Encrypt.SecretKey)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err)
|
||||
exactByAgentId := req.AgentId != nil && *req.AgentId != ""
|
||||
if exactByAgentId {
|
||||
builder = builder.Where(squirrel.Eq{"id": *req.AgentId})
|
||||
} else {
|
||||
// 如果传入TeamLeaderId,则查找该团队首领下的直属代理(不含首领本人:钻石等业务会把 team_leader_id 写成自己)
|
||||
if req.TeamLeaderId != nil && *req.TeamLeaderId != "" {
|
||||
tl := *req.TeamLeaderId
|
||||
builder = builder.Where(squirrel.Eq{"team_leader_id": tl})
|
||||
builder = builder.Where(squirrel.NotEq{"id": tl})
|
||||
}
|
||||
if req.Level != nil {
|
||||
builder = builder.Where(squirrel.Eq{"level": *req.Level})
|
||||
}
|
||||
if req.Mobile != nil && *req.Mobile != "" {
|
||||
// 加密手机号进行查询
|
||||
encryptedMobile, err := crypto.EncryptMobile(*req.Mobile, l.svcCtx.Config.Encrypt.SecretKey)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "加密手机号失败: %v", err)
|
||||
}
|
||||
builder = builder.Where(squirrel.Eq{"mobile": encryptedMobile})
|
||||
}
|
||||
if req.Region != nil && *req.Region != "" {
|
||||
// 注意:region字段现在是可选的,查询时需要处理NULL值
|
||||
// 如果region字段是NULL,使用IS NULL查询;否则使用等值查询
|
||||
// 这里简化处理,直接使用等值查询(如果数据库中有NULL值,需要特殊处理)
|
||||
builder = builder.Where(squirrel.Eq{"region": *req.Region})
|
||||
}
|
||||
if req.AgentCode != nil && *req.AgentCode != "" {
|
||||
// 将字符串转换为int64
|
||||
var agentCode int64
|
||||
if _, err := fmt.Sscanf(*req.AgentCode, "%d", &agentCode); err == nil {
|
||||
builder = builder.Where(squirrel.Eq{"agent_code": agentCode})
|
||||
}
|
||||
}
|
||||
builder = builder.Where(squirrel.Eq{"mobile": encryptedMobile})
|
||||
}
|
||||
if req.Region != nil && *req.Region != "" {
|
||||
// 注意:region字段现在是可选的,查询时需要处理NULL值
|
||||
// 如果region字段是NULL,使用IS NULL查询;否则使用等值查询
|
||||
// 这里简化处理,直接使用等值查询(如果数据库中有NULL值,需要特殊处理)
|
||||
builder = builder.Where(squirrel.Eq{"region": *req.Region})
|
||||
|
||||
if req.RealName != nil && strings.TrimSpace(*req.RealName) != "" {
|
||||
name := strings.TrimSpace(*req.RealName)
|
||||
likePattern := "%" + name + "%"
|
||||
builder = builder.Where(`EXISTS (
|
||||
SELECT 1 FROM agent_real_name arn
|
||||
WHERE arn.agent_id = agent.id
|
||||
AND arn.del_state = ?
|
||||
AND arn.verify_time IS NOT NULL
|
||||
AND arn.name LIKE ?
|
||||
)`, globalkey.DelStateNo, likePattern)
|
||||
}
|
||||
|
||||
agents, total, err := l.svcCtx.AgentModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "id DESC")
|
||||
@@ -58,6 +87,17 @@ func (l *AdminGetAgentListLogic) AdminGetAgentList(req *types.AdminGetAgentListR
|
||||
return nil, err
|
||||
}
|
||||
|
||||
leaderIds := make([]string, 0, len(agents))
|
||||
for _, a := range agents {
|
||||
if a.Id != "" {
|
||||
leaderIds = append(leaderIds, a.Id)
|
||||
}
|
||||
}
|
||||
subCountByLeader, err := l.svcCtx.AgentModel.CountSubordinatesByTeamLeaderIds(l.ctx, leaderIds)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "统计直属下级数量失败: %v", err)
|
||||
}
|
||||
|
||||
items := make([]types.AgentListItem, 0, len(agents))
|
||||
|
||||
for _, agent := range agents {
|
||||
@@ -117,17 +157,18 @@ func (l *AdminGetAgentListLogic) AdminGetAgentList(req *types.AdminGetAgentListR
|
||||
}
|
||||
|
||||
item := types.AgentListItem{
|
||||
Id: agent.Id,
|
||||
UserId: agent.UserId,
|
||||
Level: agent.Level,
|
||||
LevelName: levelName,
|
||||
Region: region,
|
||||
Mobile: agent.Mobile,
|
||||
RealName: realName,
|
||||
IdCard: idCardPlain,
|
||||
WechatId: wechatId,
|
||||
TeamLeaderId: teamLeaderId,
|
||||
AgentCode: agent.AgentCode,
|
||||
Id: agent.Id,
|
||||
UserId: agent.UserId,
|
||||
Level: agent.Level,
|
||||
LevelName: levelName,
|
||||
Region: region,
|
||||
Mobile: agent.Mobile,
|
||||
RealName: realName,
|
||||
IdCard: idCardPlain,
|
||||
WechatId: wechatId,
|
||||
TeamLeaderId: teamLeaderId,
|
||||
SubordinateCount: subCountByLeader[agent.Id],
|
||||
AgentCode: agent.AgentCode,
|
||||
Balance: 0,
|
||||
TotalEarnings: 0,
|
||||
FrozenBalance: 0,
|
||||
|
||||
@@ -2,6 +2,8 @@ package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
"qnc-server/common/globalkey"
|
||||
"qnc-server/common/xerr"
|
||||
|
||||
@@ -28,21 +30,57 @@ func NewAdminGetAgentOrderListLogic(ctx context.Context, svcCtx *svc.ServiceCont
|
||||
}
|
||||
}
|
||||
|
||||
func emptyAgentOrderListResp() *types.AdminGetAgentOrderListResp {
|
||||
return &types.AdminGetAgentOrderListResp{
|
||||
Total: 0,
|
||||
Items: []types.AgentOrderListItem{},
|
||||
}
|
||||
}
|
||||
|
||||
func (l *AdminGetAgentOrderListLogic) AdminGetAgentOrderList(req *types.AdminGetAgentOrderListReq) (resp *types.AdminGetAgentOrderListResp, err error) {
|
||||
builder := l.svcCtx.AgentOrderModel.SelectBuilder().
|
||||
Where("del_state = ?", globalkey.DelStateNo)
|
||||
|
||||
if req.AgentId != nil {
|
||||
if req.AgentId != nil && *req.AgentId != "" {
|
||||
builder = builder.Where("agent_id = ?", *req.AgentId)
|
||||
}
|
||||
if req.OrderId != nil {
|
||||
|
||||
if req.AgentCode != nil && *req.AgentCode != "" {
|
||||
code, parseErr := strconv.ParseInt(*req.AgentCode, 10, 64)
|
||||
if parseErr != nil {
|
||||
return emptyAgentOrderListResp(), nil
|
||||
}
|
||||
agent, findErr := l.svcCtx.AgentModel.FindOneByAgentCode(l.ctx, code)
|
||||
if findErr != nil || agent == nil {
|
||||
return emptyAgentOrderListResp(), nil
|
||||
}
|
||||
builder = builder.Where("agent_id = ?", agent.Id)
|
||||
}
|
||||
|
||||
if req.OrderId != nil && *req.OrderId != "" {
|
||||
builder = builder.Where("order_id = ?", *req.OrderId)
|
||||
}
|
||||
|
||||
if req.OrderNo != nil && *req.OrderNo != "" {
|
||||
o, findErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *req.OrderNo)
|
||||
if findErr != nil || o == nil {
|
||||
return emptyAgentOrderListResp(), nil
|
||||
}
|
||||
builder = builder.Where("order_id = ?", o.Id)
|
||||
}
|
||||
|
||||
if req.ProcessStatus != nil {
|
||||
builder = builder.Where("process_status = ?", *req.ProcessStatus)
|
||||
}
|
||||
|
||||
// 分页查询
|
||||
if req.OrderStatus != nil && *req.OrderStatus != "" {
|
||||
builder = builder.Where(squirrel.Expr(
|
||||
"order_id IN (SELECT id FROM `order` WHERE status = ? AND del_state = ?)",
|
||||
*req.OrderStatus,
|
||||
globalkey.DelStateNo,
|
||||
))
|
||||
}
|
||||
|
||||
page := req.Page
|
||||
if page <= 0 {
|
||||
page = 1
|
||||
@@ -57,7 +95,6 @@ func (l *AdminGetAgentOrderListLogic) AdminGetAgentOrderList(req *types.AdminGet
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理订单列表失败, %v", err)
|
||||
}
|
||||
|
||||
// 批量查询产品名称
|
||||
productIdSet := make(map[string]struct{})
|
||||
for _, order := range orders {
|
||||
productIdSet[order.ProductId] = struct{}{}
|
||||
@@ -74,13 +111,50 @@ func (l *AdminGetAgentOrderListLogic) AdminGetAgentOrderList(req *types.AdminGet
|
||||
}
|
||||
}
|
||||
|
||||
// 组装响应
|
||||
agentIds := make([]string, 0, len(orders))
|
||||
orderIds := make([]string, 0, len(orders))
|
||||
for _, order := range orders {
|
||||
if order.AgentId != "" {
|
||||
agentIds = append(agentIds, order.AgentId)
|
||||
}
|
||||
if order.OrderId != "" {
|
||||
orderIds = append(orderIds, order.OrderId)
|
||||
}
|
||||
}
|
||||
agentCodeMap := batchAgentCodesByIds(l.ctx, l.svcCtx, agentIds)
|
||||
|
||||
orderNoMap := make(map[string]string)
|
||||
orderStatusMap := make(map[string]string)
|
||||
if len(orderIds) > 0 {
|
||||
uniq := make([]string, 0, len(orderIds))
|
||||
seen := make(map[string]struct{}, len(orderIds))
|
||||
for _, id := range orderIds {
|
||||
if id == "" {
|
||||
continue
|
||||
}
|
||||
if _, ok := seen[id]; ok {
|
||||
continue
|
||||
}
|
||||
seen[id] = struct{}{}
|
||||
uniq = append(uniq, id)
|
||||
}
|
||||
if len(uniq) > 0 {
|
||||
os, _ := l.svcCtx.OrderModel.FindAll(l.ctx, l.svcCtx.OrderModel.SelectBuilder().Where(squirrel.Eq{"id": uniq}), "")
|
||||
for _, o := range os {
|
||||
orderNoMap[o.Id] = o.OrderNo
|
||||
orderStatusMap[o.Id] = o.Status
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
items := make([]types.AgentOrderListItem, 0, len(orders))
|
||||
for _, order := range orders {
|
||||
items = append(items, types.AgentOrderListItem{
|
||||
Id: order.Id,
|
||||
AgentId: order.AgentId,
|
||||
AgentCode: agentCodeMap[order.AgentId],
|
||||
OrderId: order.OrderId,
|
||||
OrderNo: orderNoMap[order.OrderId],
|
||||
ProductId: order.ProductId,
|
||||
ProductName: productNameMap[order.ProductId],
|
||||
OrderAmount: order.OrderAmount,
|
||||
@@ -89,6 +163,7 @@ func (l *AdminGetAgentOrderListLogic) AdminGetAgentOrderList(req *types.AdminGet
|
||||
PriceCost: order.PriceCost,
|
||||
AgentProfit: order.AgentProfit,
|
||||
ProcessStatus: order.ProcessStatus,
|
||||
OrderStatus: orderStatusMap[order.OrderId],
|
||||
CreateTime: order.CreateTime.Format("2006-01-02 15:04:05"),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
"qnc-server/app/main/api/internal/svc"
|
||||
"qnc-server/app/main/api/internal/types"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
)
|
||||
|
||||
type AdminGetAgentOrderSettlementLogic struct {
|
||||
logx.Logger
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
}
|
||||
|
||||
func NewAdminGetAgentOrderSettlementLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentOrderSettlementLogic {
|
||||
return &AdminGetAgentOrderSettlementLogic{
|
||||
Logger: logx.WithContext(ctx),
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *AdminGetAgentOrderSettlementLogic) AdminGetAgentOrderSettlement(req *types.AdminGetAgentOrderSettlementReq) (resp *types.AdminGetAgentOrderSettlementResp, err error) {
|
||||
empty := &types.AdminGetAgentOrderSettlementResp{
|
||||
Commissions: []types.AgentCommissionListItem{},
|
||||
Rebates: []types.AgentRebateListItem{},
|
||||
}
|
||||
if req.OrderNo == "" {
|
||||
return empty, nil
|
||||
}
|
||||
on := req.OrderNo
|
||||
page := int64(1)
|
||||
pageSize := int64(200)
|
||||
|
||||
var wg sync.WaitGroup
|
||||
var mu sync.Mutex
|
||||
var cResp *types.AdminGetAgentCommissionListResp
|
||||
var cErr error
|
||||
var rResp *types.AdminGetAgentRebateListResp
|
||||
var rErr error
|
||||
|
||||
wg.Add(2)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
resp, e := NewAdminGetAgentCommissionListLogic(l.ctx, l.svcCtx).AdminGetAgentCommissionList(
|
||||
&types.AdminGetAgentCommissionListReq{
|
||||
Page: page,
|
||||
PageSize: pageSize,
|
||||
OrderNo: &on,
|
||||
},
|
||||
)
|
||||
mu.Lock()
|
||||
cResp, cErr = resp, e
|
||||
mu.Unlock()
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
resp, e := NewAdminGetAgentRebateListLogic(l.ctx, l.svcCtx).AdminGetAgentRebateList(
|
||||
&types.AdminGetAgentRebateListReq{
|
||||
Page: page,
|
||||
PageSize: pageSize,
|
||||
OrderNo: &on,
|
||||
},
|
||||
)
|
||||
mu.Lock()
|
||||
rResp, rErr = resp, e
|
||||
mu.Unlock()
|
||||
}()
|
||||
wg.Wait()
|
||||
if cErr != nil {
|
||||
return nil, cErr
|
||||
}
|
||||
if rErr != nil {
|
||||
return nil, rErr
|
||||
}
|
||||
if cResp == nil {
|
||||
cResp = &types.AdminGetAgentCommissionListResp{Items: []types.AgentCommissionListItem{}}
|
||||
}
|
||||
if rResp == nil {
|
||||
rResp = &types.AdminGetAgentRebateListResp{Items: []types.AgentRebateListItem{}}
|
||||
}
|
||||
commissions := cResp.Items
|
||||
if commissions == nil {
|
||||
commissions = []types.AgentCommissionListItem{}
|
||||
}
|
||||
rebates := rResp.Items
|
||||
if rebates == nil {
|
||||
rebates = []types.AgentRebateListItem{}
|
||||
}
|
||||
return &types.AdminGetAgentOrderSettlementResp{
|
||||
Commissions: commissions,
|
||||
Rebates: rebates,
|
||||
}, nil
|
||||
}
|
||||
@@ -60,6 +60,14 @@ func (l *AdminGetAgentRealNameListLogic) AdminGetAgentRealNameList(req *types.Ad
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询实名认证列表失败, %v", err)
|
||||
}
|
||||
|
||||
agentIds := make([]string, 0, len(realNames))
|
||||
for _, realName := range realNames {
|
||||
if realName.AgentId != "" {
|
||||
agentIds = append(agentIds, realName.AgentId)
|
||||
}
|
||||
}
|
||||
agentCodeMap := batchAgentCodesByIds(l.ctx, l.svcCtx, agentIds)
|
||||
|
||||
// 组装响应
|
||||
items := make([]types.AgentRealNameListItem, 0, len(realNames))
|
||||
for _, realName := range realNames {
|
||||
@@ -100,6 +108,7 @@ func (l *AdminGetAgentRealNameListLogic) AdminGetAgentRealNameList(req *types.Ad
|
||||
item := types.AgentRealNameListItem{
|
||||
Id: realName.Id,
|
||||
AgentId: realName.AgentId,
|
||||
AgentCode: agentCodeMap[realName.AgentId],
|
||||
Name: realName.Name,
|
||||
IdCard: idCard,
|
||||
Mobile: mobile,
|
||||
|
||||
@@ -2,6 +2,8 @@ package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
"qnc-server/common/globalkey"
|
||||
"qnc-server/common/xerr"
|
||||
|
||||
@@ -35,9 +37,47 @@ func (l *AdminGetAgentRebateListLogic) AdminGetAgentRebateList(req *types.AdminG
|
||||
if req.AgentId != nil {
|
||||
builder = builder.Where("agent_id = ?", *req.AgentId)
|
||||
}
|
||||
if req.SourceAgentId != nil {
|
||||
builder = builder.Where("source_agent_id = ?", *req.SourceAgentId)
|
||||
|
||||
// 按 agent_code 筛选:先查出 agent_id
|
||||
if req.AgentCode != nil && *req.AgentCode != "" {
|
||||
agentCodeInt, parseErr := strconv.ParseInt(*req.AgentCode, 10, 64)
|
||||
if parseErr == nil {
|
||||
agent, findErr := l.svcCtx.AgentModel.FindOneByAgentCode(l.ctx, agentCodeInt)
|
||||
if findErr == nil && agent != nil {
|
||||
builder = builder.Where("agent_id = ?", agent.Id)
|
||||
} else {
|
||||
return &types.AdminGetAgentRebateListResp{Total: 0, Items: []types.AgentRebateListItem{}}, nil
|
||||
}
|
||||
} else {
|
||||
return &types.AdminGetAgentRebateListResp{Total: 0, Items: []types.AgentRebateListItem{}}, nil
|
||||
}
|
||||
}
|
||||
|
||||
// 按 source_agent_code 筛选:先查出 source_agent_id
|
||||
if req.SourceAgentCode != nil && *req.SourceAgentCode != "" {
|
||||
sourceAgentCodeInt, parseErr := strconv.ParseInt(*req.SourceAgentCode, 10, 64)
|
||||
if parseErr == nil {
|
||||
agent, findErr := l.svcCtx.AgentModel.FindOneByAgentCode(l.ctx, sourceAgentCodeInt)
|
||||
if findErr == nil && agent != nil {
|
||||
builder = builder.Where("source_agent_id = ?", agent.Id)
|
||||
} else {
|
||||
return &types.AdminGetAgentRebateListResp{Total: 0, Items: []types.AgentRebateListItem{}}, nil
|
||||
}
|
||||
} else {
|
||||
return &types.AdminGetAgentRebateListResp{Total: 0, Items: []types.AgentRebateListItem{}}, nil
|
||||
}
|
||||
}
|
||||
|
||||
// 按 order_no 筛选:先查出 order_id
|
||||
if req.OrderNo != nil && *req.OrderNo != "" {
|
||||
order, findErr := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, *req.OrderNo)
|
||||
if findErr == nil && order != nil {
|
||||
builder = builder.Where("order_id = ?", order.Id)
|
||||
} else {
|
||||
return &types.AdminGetAgentRebateListResp{Total: 0, Items: []types.AgentRebateListItem{}}, nil
|
||||
}
|
||||
}
|
||||
|
||||
if req.RebateType != nil {
|
||||
builder = builder.Where("rebate_type = ?", *req.RebateType)
|
||||
}
|
||||
@@ -74,17 +114,48 @@ func (l *AdminGetAgentRebateListLogic) AdminGetAgentRebateList(req *types.AdminG
|
||||
}
|
||||
}
|
||||
|
||||
agentIds := make([]string, 0, len(rebates)*2)
|
||||
for _, rebate := range rebates {
|
||||
if rebate.AgentId != "" {
|
||||
agentIds = append(agentIds, rebate.AgentId)
|
||||
}
|
||||
if rebate.SourceAgentId != "" {
|
||||
agentIds = append(agentIds, rebate.SourceAgentId)
|
||||
}
|
||||
}
|
||||
agentCodeMap := batchAgentCodesByIds(l.ctx, l.svcCtx, agentIds)
|
||||
|
||||
// 批量查 order_no
|
||||
orderIds := make([]string, 0, len(rebates))
|
||||
for _, rebate := range rebates {
|
||||
if rebate.OrderId != "" {
|
||||
orderIds = append(orderIds, rebate.OrderId)
|
||||
}
|
||||
}
|
||||
orderNoMap := make(map[string]string)
|
||||
if len(orderIds) > 0 {
|
||||
orderBuilder := l.svcCtx.OrderModel.SelectBuilder().Where(squirrel.Eq{"id": orderIds})
|
||||
orders, _ := l.svcCtx.OrderModel.FindAll(l.ctx, orderBuilder, "")
|
||||
for _, o := range orders {
|
||||
orderNoMap[o.Id] = o.OrderNo
|
||||
}
|
||||
}
|
||||
|
||||
// 组装响应
|
||||
items := make([]types.AgentRebateListItem, 0, len(rebates))
|
||||
for _, rebate := range rebates {
|
||||
items = append(items, types.AgentRebateListItem{
|
||||
Id: rebate.Id,
|
||||
AgentId: rebate.AgentId,
|
||||
SourceAgentId: rebate.SourceAgentId,
|
||||
OrderId: rebate.OrderId,
|
||||
RebateType: rebate.RebateType,
|
||||
Amount: rebate.RebateAmount,
|
||||
CreateTime: rebate.CreateTime.Format("2006-01-02 15:04:05"),
|
||||
Id: rebate.Id,
|
||||
AgentId: rebate.AgentId,
|
||||
AgentCode: agentCodeMap[rebate.AgentId],
|
||||
SourceAgentId: rebate.SourceAgentId,
|
||||
SourceAgentCode: agentCodeMap[rebate.SourceAgentId],
|
||||
OrderId: rebate.OrderId,
|
||||
OrderNo: orderNoMap[rebate.OrderId],
|
||||
RebateType: rebate.RebateType,
|
||||
Amount: rebate.RebateAmount,
|
||||
Status: rebate.Status,
|
||||
CreateTime: rebate.CreateTime.Format("2006-01-02 15:04:05"),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,207 @@
|
||||
package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sort"
|
||||
|
||||
"qnc-server/app/main/api/internal/svc"
|
||||
"qnc-server/app/main/api/internal/types"
|
||||
"qnc-server/app/main/model"
|
||||
"qnc-server/common/globalkey"
|
||||
"qnc-server/common/xerr"
|
||||
"qnc-server/pkg/lzkit/crypto"
|
||||
|
||||
"github.com/Masterminds/squirrel"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
)
|
||||
|
||||
type AdminGetAgentTeamTreeLogic struct {
|
||||
logx.Logger
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
}
|
||||
|
||||
func NewAdminGetAgentTeamTreeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminGetAgentTeamTreeLogic {
|
||||
return &AdminGetAgentTeamTreeLogic{
|
||||
Logger: logx.WithContext(ctx),
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
}
|
||||
}
|
||||
|
||||
func resolveDiamondTeamRootId(agent *model.Agent) string {
|
||||
if agent.TeamLeaderId.Valid && agent.TeamLeaderId.String != "" && agent.TeamLeaderId.String != agent.Id {
|
||||
return agent.TeamLeaderId.String
|
||||
}
|
||||
return agent.Id
|
||||
}
|
||||
|
||||
func levelName(lv int64) string {
|
||||
switch lv {
|
||||
case 1:
|
||||
return "普通"
|
||||
case 2:
|
||||
return "黄金"
|
||||
case 3:
|
||||
return "钻石"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
func (l *AdminGetAgentTeamTreeLogic) AdminGetAgentTeamTree(req *types.AdminGetAgentTeamTreeReq) (resp *types.AdminGetAgentTeamTreeResp, err error) {
|
||||
if req.AgentId == "" {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("agent_id 不能为空"), "")
|
||||
}
|
||||
|
||||
anchor, err := l.svcCtx.AgentModel.FindOne(l.ctx, req.AgentId)
|
||||
if err != nil {
|
||||
if errors.Is(err, model.ErrNotFound) {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("代理不存在"), "")
|
||||
}
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理失败: %v", err)
|
||||
}
|
||||
|
||||
teamRootId := resolveDiamondTeamRootId(anchor)
|
||||
|
||||
builder := l.svcCtx.AgentModel.SelectBuilder().
|
||||
Where("del_state = ?", globalkey.DelStateNo).
|
||||
Where(squirrel.Or{
|
||||
squirrel.Eq{"id": teamRootId},
|
||||
squirrel.And{
|
||||
squirrel.Eq{"team_leader_id": teamRootId},
|
||||
squirrel.NotEq{"id": teamRootId},
|
||||
},
|
||||
})
|
||||
|
||||
members, err := l.svcCtx.AgentModel.FindAll(l.ctx, builder, "")
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询团队成员失败: %v", err)
|
||||
}
|
||||
|
||||
agentById := make(map[string]*model.Agent, len(members)+1)
|
||||
memberIDs := make([]string, 0, len(members)+1)
|
||||
anchorInTeam := false
|
||||
for _, m := range members {
|
||||
agentById[m.Id] = m
|
||||
memberIDs = append(memberIDs, m.Id)
|
||||
if m.Id == anchor.Id {
|
||||
anchorInTeam = true
|
||||
}
|
||||
}
|
||||
if !anchorInTeam {
|
||||
agentById[anchor.Id] = anchor
|
||||
memberIDs = append(memberIDs, anchor.Id)
|
||||
members = append(members, anchor)
|
||||
}
|
||||
|
||||
relBuilder := l.svcCtx.AgentRelationModel.SelectBuilder().
|
||||
Where("relation_type = ? AND del_state = ?", 1, globalkey.DelStateNo).
|
||||
Where(squirrel.Eq{"parent_id": memberIDs}).
|
||||
Where(squirrel.Eq{"child_id": memberIDs})
|
||||
|
||||
relations, err := l.svcCtx.AgentRelationModel.FindAll(l.ctx, relBuilder, "")
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询邀请关系失败: %v", err)
|
||||
}
|
||||
|
||||
childSet := make(map[string]map[string]struct{})
|
||||
addEdge := func(parentId, childId string) {
|
||||
if parentId == "" || childId == "" || parentId == childId {
|
||||
return
|
||||
}
|
||||
if _, ok := agentById[parentId]; !ok {
|
||||
return
|
||||
}
|
||||
if _, ok := agentById[childId]; !ok {
|
||||
return
|
||||
}
|
||||
if childSet[parentId] == nil {
|
||||
childSet[parentId] = make(map[string]struct{})
|
||||
}
|
||||
childSet[parentId][childId] = struct{}{}
|
||||
}
|
||||
|
||||
for _, r := range relations {
|
||||
addEdge(r.ParentId, r.ChildId)
|
||||
}
|
||||
|
||||
reachable := map[string]bool{teamRootId: true}
|
||||
var walkReach func(string)
|
||||
walkReach = func(id string) {
|
||||
for cid := range childSet[id] {
|
||||
if reachable[cid] {
|
||||
continue
|
||||
}
|
||||
reachable[cid] = true
|
||||
walkReach(cid)
|
||||
}
|
||||
}
|
||||
walkReach(teamRootId)
|
||||
|
||||
for _, m := range members {
|
||||
if m.Id == teamRootId {
|
||||
continue
|
||||
}
|
||||
if !reachable[m.Id] {
|
||||
addEdge(teamRootId, m.Id)
|
||||
if !reachable[m.Id] {
|
||||
reachable[m.Id] = true
|
||||
walkReach(m.Id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
childrenMap := make(map[string][]string)
|
||||
for pid, set := range childSet {
|
||||
slice := make([]string, 0, len(set))
|
||||
for cid := range set {
|
||||
slice = append(slice, cid)
|
||||
}
|
||||
sort.Slice(slice, func(i, j int) bool {
|
||||
return agentById[slice[i]].AgentCode < agentById[slice[j]].AgentCode
|
||||
})
|
||||
childrenMap[pid] = slice
|
||||
}
|
||||
|
||||
var build func(string) (types.AgentTeamTreeNode, error)
|
||||
build = func(agentId string) (types.AgentTeamTreeNode, error) {
|
||||
ag := agentById[agentId]
|
||||
if ag == nil {
|
||||
return types.AgentTeamTreeNode{}, errors.New("missing agent in tree")
|
||||
}
|
||||
mobile := ag.Mobile
|
||||
mobile, err = crypto.DecryptMobile(mobile, l.svcCtx.Config.Encrypt.SecretKey)
|
||||
if err != nil {
|
||||
return types.AgentTeamTreeNode{}, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "解密手机号失败: %v", err)
|
||||
}
|
||||
|
||||
node := types.AgentTeamTreeNode{
|
||||
Id: ag.Id,
|
||||
AgentCode: ag.AgentCode,
|
||||
Level: ag.Level,
|
||||
LevelName: levelName(ag.Level),
|
||||
Mobile: mobile,
|
||||
IsAnchor: ag.Id == anchor.Id,
|
||||
Children: []types.AgentTeamTreeNode{},
|
||||
}
|
||||
|
||||
kids := childrenMap[agentId]
|
||||
for _, cid := range kids {
|
||||
childNode, err := build(cid)
|
||||
if err != nil {
|
||||
return types.AgentTeamTreeNode{}, err
|
||||
}
|
||||
node.Children = append(node.Children, childNode)
|
||||
}
|
||||
return node, nil
|
||||
}
|
||||
|
||||
root, err := build(teamRootId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &types.AdminGetAgentTeamTreeResp{Root: root}, nil
|
||||
}
|
||||
@@ -2,6 +2,8 @@ package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
"qnc-server/common/globalkey"
|
||||
"qnc-server/common/xerr"
|
||||
|
||||
@@ -31,9 +33,26 @@ func (l *AdminGetAgentUpgradeListLogic) AdminGetAgentUpgradeList(req *types.Admi
|
||||
builder := l.svcCtx.AgentUpgradeModel.SelectBuilder().
|
||||
Where("del_state = ?", globalkey.DelStateNo)
|
||||
|
||||
if req.AgentId != nil {
|
||||
if req.AgentCode != nil && *req.AgentCode != "" {
|
||||
agentCodeInt, parseErr := strconv.ParseInt(*req.AgentCode, 10, 64)
|
||||
if parseErr != nil {
|
||||
return &types.AdminGetAgentUpgradeListResp{
|
||||
Total: 0,
|
||||
Items: []types.AgentUpgradeListItem{},
|
||||
}, nil
|
||||
}
|
||||
agent, findErr := l.svcCtx.AgentModel.FindOneByAgentCode(l.ctx, agentCodeInt)
|
||||
if findErr != nil || agent == nil {
|
||||
return &types.AdminGetAgentUpgradeListResp{
|
||||
Total: 0,
|
||||
Items: []types.AgentUpgradeListItem{},
|
||||
}, nil
|
||||
}
|
||||
builder = builder.Where("agent_id = ?", agent.Id)
|
||||
} else if req.AgentId != nil && *req.AgentId != "" {
|
||||
builder = builder.Where("agent_id = ?", *req.AgentId)
|
||||
}
|
||||
|
||||
if req.UpgradeType != nil {
|
||||
builder = builder.Where("upgrade_type = ?", *req.UpgradeType)
|
||||
}
|
||||
@@ -56,12 +75,21 @@ func (l *AdminGetAgentUpgradeListLogic) AdminGetAgentUpgradeList(req *types.Admi
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询升级记录列表失败, %v", err)
|
||||
}
|
||||
|
||||
agentIds := make([]string, 0, len(upgrades))
|
||||
for _, upgrade := range upgrades {
|
||||
if upgrade.AgentId != "" {
|
||||
agentIds = append(agentIds, upgrade.AgentId)
|
||||
}
|
||||
}
|
||||
agentCodeMap := batchAgentCodesByIds(l.ctx, l.svcCtx, agentIds)
|
||||
|
||||
// 组装响应
|
||||
items := make([]types.AgentUpgradeListItem, 0, len(upgrades))
|
||||
for _, upgrade := range upgrades {
|
||||
items = append(items, types.AgentUpgradeListItem{
|
||||
Id: upgrade.Id,
|
||||
AgentId: upgrade.AgentId,
|
||||
AgentCode: agentCodeMap[upgrade.AgentId],
|
||||
FromLevel: upgrade.FromLevel,
|
||||
ToLevel: upgrade.ToLevel,
|
||||
UpgradeType: upgrade.UpgradeType,
|
||||
|
||||
@@ -2,9 +2,13 @@ package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"qnc-server/app/main/api/internal/svc"
|
||||
"qnc-server/app/main/api/internal/types"
|
||||
"qnc-server/common/globalkey"
|
||||
|
||||
"github.com/Masterminds/squirrel"
|
||||
"github.com/jinzhu/copier"
|
||||
@@ -27,23 +31,60 @@ func NewAdminGetAgentWithdrawalListLogic(ctx context.Context, svcCtx *svc.Servic
|
||||
|
||||
func (l *AdminGetAgentWithdrawalListLogic) AdminGetAgentWithdrawalList(req *types.AdminGetAgentWithdrawalListReq) (resp *types.AdminGetAgentWithdrawalListResp, err error) {
|
||||
builder := l.svcCtx.AgentWithdrawalModel.SelectBuilder()
|
||||
if req.AgentId != nil {
|
||||
builder = builder.Where(squirrel.Eq{"agent_id": *req.AgentId})
|
||||
if req.AgentId != nil && strings.TrimSpace(*req.AgentId) != "" {
|
||||
builder = builder.Where(squirrel.Eq{"agent_id": strings.TrimSpace(*req.AgentId)})
|
||||
}
|
||||
if req.Status != nil {
|
||||
builder = builder.Where(squirrel.Eq{"status": *req.Status})
|
||||
if req.AgentCode != nil && strings.TrimSpace(*req.AgentCode) != "" {
|
||||
var code int64
|
||||
if _, scanErr := fmt.Sscanf(strings.TrimSpace(*req.AgentCode), "%d", &code); scanErr == nil {
|
||||
builder = builder.Where(
|
||||
"agent_id IN (SELECT id FROM agent WHERE agent_code = ? AND del_state = ?)",
|
||||
code,
|
||||
globalkey.DelStateNo,
|
||||
)
|
||||
}
|
||||
}
|
||||
if req.WithdrawNo != nil && *req.WithdrawNo != "" {
|
||||
builder = builder.Where(squirrel.Eq{"withdraw_no": *req.WithdrawNo})
|
||||
if strings.TrimSpace(req.Status) != "" {
|
||||
st, perr := strconv.ParseInt(strings.TrimSpace(req.Status), 10, 64)
|
||||
if perr == nil {
|
||||
builder = builder.Where(squirrel.Eq{"status": st})
|
||||
}
|
||||
}
|
||||
if strings.TrimSpace(req.WithdrawalType) != "" {
|
||||
wt, perr := strconv.ParseInt(strings.TrimSpace(req.WithdrawalType), 10, 64)
|
||||
if perr == nil {
|
||||
builder = builder.Where(squirrel.Eq{"withdrawal_type": wt})
|
||||
}
|
||||
}
|
||||
if req.WithdrawNo != nil && strings.TrimSpace(*req.WithdrawNo) != "" {
|
||||
pat := "%" + strings.TrimSpace(*req.WithdrawNo) + "%"
|
||||
builder = builder.Where("withdraw_no LIKE ?", pat)
|
||||
}
|
||||
if req.PayeeAccount != nil && strings.TrimSpace(*req.PayeeAccount) != "" {
|
||||
pat := "%" + strings.TrimSpace(*req.PayeeAccount) + "%"
|
||||
builder = builder.Where("payee_account LIKE ?", pat)
|
||||
}
|
||||
if req.PayeeName != nil && strings.TrimSpace(*req.PayeeName) != "" {
|
||||
pat := "%" + strings.TrimSpace(*req.PayeeName) + "%"
|
||||
builder = builder.Where("payee_name LIKE ?", pat)
|
||||
}
|
||||
list, total, err := l.svcCtx.AgentWithdrawalModel.FindPageListByPageWithTotal(l.ctx, builder, req.Page, req.PageSize, "create_time DESC")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
agentIds := make([]string, 0, len(list))
|
||||
for _, v := range list {
|
||||
if v.AgentId != "" {
|
||||
agentIds = append(agentIds, v.AgentId)
|
||||
}
|
||||
}
|
||||
agentCodeMap := batchAgentCodesByIds(l.ctx, l.svcCtx, agentIds)
|
||||
|
||||
items := make([]types.AgentWithdrawalListItem, 0, len(list))
|
||||
for _, v := range list {
|
||||
item := types.AgentWithdrawalListItem{}
|
||||
_ = copier.Copy(&item, v)
|
||||
item.AgentCode = agentCodeMap[v.AgentId]
|
||||
item.Remark = ""
|
||||
if v.Remark.Valid {
|
||||
item.Remark = v.Remark.String
|
||||
|
||||
@@ -2,6 +2,9 @@ package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"qnc-server/common/globalkey"
|
||||
"qnc-server/common/xerr"
|
||||
"qnc-server/pkg/lzkit/crypto"
|
||||
@@ -34,22 +37,18 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet
|
||||
builder := l.svcCtx.AgentInviteCodeModel.SelectBuilder().
|
||||
Where("del_state = ?", globalkey.DelStateNo)
|
||||
|
||||
if req.Code != nil && *req.Code != "" {
|
||||
builder = builder.Where("code = ?", *req.Code)
|
||||
}
|
||||
if req.AgentId != nil && *req.AgentId != "" {
|
||||
if *req.AgentId == "0" {
|
||||
// agent_id = 0 表示查询平台发放的邀请码(agent_id为NULL)
|
||||
builder = builder.Where("agent_id IS NULL")
|
||||
} else {
|
||||
builder = builder.Where("agent_id = ?", *req.AgentId)
|
||||
}
|
||||
if req.Code != nil && strings.TrimSpace(*req.Code) != "" {
|
||||
pat := "%" + strings.TrimSpace(*req.Code) + "%"
|
||||
builder = builder.Where("code LIKE ?", pat)
|
||||
}
|
||||
if req.TargetLevel != nil {
|
||||
builder = builder.Where("target_level = ?", *req.TargetLevel)
|
||||
}
|
||||
if req.Status != nil {
|
||||
builder = builder.Where("status = ?", *req.Status)
|
||||
if strings.TrimSpace(req.Status) != "" {
|
||||
st, perr := strconv.ParseInt(strings.TrimSpace(req.Status), 10, 64)
|
||||
if perr == nil {
|
||||
builder = builder.Where("status = ?", st)
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 分页查询
|
||||
@@ -58,15 +57,19 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询邀请码列表失败, %v", err)
|
||||
}
|
||||
|
||||
// 3. 批量查询代理信息(用于显示代理手机号)
|
||||
// 3. 批量查询代理信息(用于显示代理手机号、代理编号)
|
||||
agentIds := make(map[string]struct{})
|
||||
for _, v := range list {
|
||||
if v.AgentId.Valid && v.AgentId.String != "" {
|
||||
agentIds[v.AgentId.String] = struct{}{}
|
||||
}
|
||||
if v.UsedAgentId.Valid && v.UsedAgentId.String != "" {
|
||||
agentIds[v.UsedAgentId.String] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
agentMobileMap := make(map[string]string)
|
||||
agentCodeMap := make(map[string]int64)
|
||||
if len(agentIds) > 0 {
|
||||
agentIdList := make([]string, 0, len(agentIds))
|
||||
for id := range agentIds {
|
||||
@@ -75,6 +78,7 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet
|
||||
agents, _ := l.svcCtx.AgentModel.FindAll(l.ctx, l.svcCtx.AgentModel.SelectBuilder().Where(squirrel.Eq{"id": agentIdList}), "")
|
||||
secretKey := l.svcCtx.Config.Encrypt.SecretKey
|
||||
for _, agent := range agents {
|
||||
agentCodeMap[agent.Id] = agent.AgentCode
|
||||
mobile, decErr := crypto.DecryptMobile(agent.Mobile, secretKey)
|
||||
if decErr == nil {
|
||||
agentMobileMap[agent.Id] = mobile
|
||||
@@ -100,6 +104,7 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet
|
||||
if v.AgentId.Valid {
|
||||
item.AgentId = v.AgentId.String
|
||||
item.AgentMobile = agentMobileMap[v.AgentId.String]
|
||||
item.AgentCode = agentCodeMap[v.AgentId.String]
|
||||
}
|
||||
|
||||
if v.UsedUserId.Valid {
|
||||
@@ -107,6 +112,7 @@ func (l *AdminGetInviteCodeListLogic) AdminGetInviteCodeList(req *types.AdminGet
|
||||
}
|
||||
if v.UsedAgentId.Valid {
|
||||
item.UsedAgentId = v.UsedAgentId.String
|
||||
item.UsedAgentCode = agentCodeMap[v.UsedAgentId.String]
|
||||
}
|
||||
if v.UsedTime.Valid {
|
||||
item.UsedTime = v.UsedTime.Time.Format("2006-01-02 15:04:05")
|
||||
|
||||
@@ -163,12 +163,9 @@ func (l *AdminUpdateAgentConfigLogic) AdminUpdateAgentConfig(req *types.AdminUpd
|
||||
if err := updateConfig("commission_freeze_threshold", &req.CommissionFreeze.Threshold); err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新佣金冻结阈值失败, %v", err)
|
||||
}
|
||||
// 更新解冻天数(整数类型)
|
||||
if req.CommissionFreeze.Days > 0 {
|
||||
daysFloat := float64(req.CommissionFreeze.Days)
|
||||
if err := updateConfig("commission_freeze_days", &daysFloat); err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新佣金冻结解冻天数失败, %v", err)
|
||||
}
|
||||
daysFloat := float64(req.CommissionFreeze.Days)
|
||||
if err := updateConfig("commission_freeze_days", &daysFloat); err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "更新佣金冻结解冻天数失败, %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"qnc-server/app/main/api/internal/svc"
|
||||
|
||||
"github.com/Masterminds/squirrel"
|
||||
)
|
||||
|
||||
// batchAgentCodesByIds 按代理主键批量查询 agent_code,用于列表软关联展示。
|
||||
func batchAgentCodesByIds(ctx context.Context, svcCtx *svc.ServiceContext, ids []string) map[string]int64 {
|
||||
out := make(map[string]int64)
|
||||
uniq := make([]string, 0, len(ids))
|
||||
seen := make(map[string]struct{}, len(ids))
|
||||
for _, id := range ids {
|
||||
if id == "" {
|
||||
continue
|
||||
}
|
||||
if _, ok := seen[id]; ok {
|
||||
continue
|
||||
}
|
||||
seen[id] = struct{}{}
|
||||
uniq = append(uniq, id)
|
||||
}
|
||||
if len(uniq) == 0 {
|
||||
return out
|
||||
}
|
||||
agents, err := svcCtx.AgentModel.FindAll(ctx, svcCtx.AgentModel.SelectBuilder().Where(squirrel.Eq{"id": uniq}), "")
|
||||
if err != nil {
|
||||
return out
|
||||
}
|
||||
for _, a := range agents {
|
||||
out[a.Id] = a.AgentCode
|
||||
}
|
||||
return out
|
||||
}
|
||||
Reference in New Issue
Block a user