feat: wecom curd

This commit is contained in:
zzw
2026-08-31 11:10:15 +08:00
parent 53d203ee14
commit d618ac32b0
37 changed files with 2707 additions and 33 deletions
@@ -0,0 +1,141 @@
package logic
import (
"context"
"strconv"
"lone-services/pkg/modelbase"
"lone-services/pkg/rpcclient"
"lone-services/pkg/utils"
"lone-services/pkg/validate"
sale "lone-services/rpc/sale/pb"
wecom "lone-services/rpc/wecom/pb"
"lone-services/services/wecom/internal/dao"
"lone-services/services/wecom/internal/model"
"lone-services/services/wecom/internal/svc"
"lone-services/services/wecom/validator"
"github.com/zeromicro/go-zero/core/logx"
)
type ItemsUsersLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewItemsUsersLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ItemsUsersLogic {
return &ItemsUsersLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *ItemsUsersLogic) ItemsUsers(in *wecom.ItemsUserReq) (*wecom.Response, error) {
var req validator.ItemsUserValidator
if msg := validate.ValidateFromProto(in, &req); msg != utils.StringEmpty {
return outResponse(utils.ErrorParams, msg), nil
}
page := int(req.Page)
size := int(req.PageSize)
if page < utils.NumberOne {
page = modelbase.DefaultPage
}
if size < utils.NumberOne {
size = modelbase.DefaultSize
}
w := modelbase.Params{
Eq: map[string]string{},
Like: map[string]string{},
Order: "id desc",
Page: page,
Size: size,
}
if req.Type > utils.NumberZero {
w.Eq["type"] = strconv.FormatUint(uint64(req.Type), utils.NumberTen)
}
w.Eq["status"] = strconv.FormatUint(uint64(dao.StatusEnabled), utils.NumberTen)
if req.Name != utils.StringEmpty {
w.Like["name LIKE ?"] = "%" + req.Name + "%"
}
var rows []dao.WecomUser
result, err := model.UserModel{}.Init().Page(w, &rows)
if err != nil {
l.Errorf("wecom items users: %v", err)
return failResponse(utils.Fail), nil
}
saleNames, err := l.fetchSaleNames(rows)
if err != nil {
l.Errorf("wecom items fetch sale names: %v", err)
return failResponse(utils.Fail), nil
}
items := make([]dao.UserListItem, 0, len(rows))
for _, row := range rows {
mobile := utils.StringEmpty
if dec, dErr := utils.DecryptPhone(row.Mobile); dErr == nil {
mobile = utils.DecryptPhoneReplace(dec)
}
// 管理员人员未获取到
bizName := utils.StringEmpty
if row.Type == dao.UserTypeSale {
bizName = saleNames[row.UserId]
}
items = append(items, dao.UserListItem{
Id: row.Id,
UserId: row.UserId,
Type: row.Type,
TypeText: typeText(row.Type),
Name: row.Name,
Mobile: mobile,
OriginMobile: row.Mobile,
Avatar: row.Avatar,
Status: row.Status,
BizName: bizName,
WecomUserId: row.WecomUserId,
CreatedAt: row.CreatedAt.Format(),
})
}
return okResponse(map[string]any{
"count": result.Count,
"items": items,
}), nil
}
func (l *ItemsUsersLogic) fetchSaleNames(rows []dao.WecomUser) (map[int64]string, error) {
result := make(map[int64]string)
seen := make(map[int64]struct{})
ids := make([]int64, 0)
for _, row := range rows {
if row.Type != dao.UserTypeSale || row.UserId < utils.NumberOne {
continue
}
if _, ok := seen[row.UserId]; ok {
continue
}
seen[row.UserId] = struct{}{}
ids = append(ids, row.UserId)
}
if len(ids) < utils.NumberOne {
return result, nil
}
cli, err := rpcclient.Get(l.svcCtx.SaleSvcName)
if err != nil {
return nil, err
}
res, err := sale.NewSaleClient(cli.Conn()).NamesByIds(l.ctx, &sale.NamesByIdsReq{Ids: ids})
if err != nil {
return nil, err
}
for _, item := range res.GetItems() {
result[item.GetId()] = item.GetName()
}
return result, nil
}