ai_scheduler/internal/services/advice/customer_new.go

137 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package advice
import (
"ai_scheduler/internal/biz"
"ai_scheduler/internal/entitys"
"ai_scheduler/internal/pkg"
"ai_scheduler/internal/pkg/wx"
"fmt"
"strings"
"github.com/gofiber/fiber/v2"
)
// CustomerService 微信好友数据服务
type CustomerService struct {
customerBiz *biz.AdviceCustomerBiz
labelBiz *biz.AdviceLabelBiz
projectBiz *biz.AdviceProjectBiz
}
func NewCustomerService(customerBiz *biz.AdviceCustomerBiz, labelBiz *biz.AdviceLabelBiz, projectBiz *biz.AdviceProjectBiz) *CustomerService {
return &CustomerService{customerBiz: customerBiz, labelBiz: labelBiz, projectBiz: projectBiz}
}
// Add 新增单条好友
func (s *CustomerService) Add(c *fiber.Ctx) error {
req := &entitys.AdvicerCustomerAddReq{}
if err := c.BodyParser(req); err != nil {
return err
}
err := s.customerBiz.Add(c.UserContext(), req)
return pkg.HandleResponse(c, nil, err)
}
// List 好友列表查询
func (s *CustomerService) List(c *fiber.Ctx) error {
req := &entitys.AdvicerCustomerListReq{}
if err := c.BodyParser(req); err != nil {
return err
}
list, err := s.customerBiz.List(c.UserContext(), req)
return pkg.HandleResponse(c, list, err)
}
// Del 删除好友
func (s *CustomerService) Del(c *fiber.Ctx) error {
req := &entitys.AdvicerCustomerDelReq{}
if err := c.BodyParser(req); err != nil {
return err
}
err := s.customerBiz.Del(c.UserContext(), req)
return pkg.HandleResponse(c, nil, err)
}
// Diff 好友差集查询(同时返回标签列表)
func (s *CustomerService) Diff(c *fiber.Ctx) error {
req := &entitys.AdvicerCustomerDiffReq{}
if err := c.BodyParser(req); err != nil {
return err
}
diff, err := s.customerBiz.Diff(c.UserContext(), req)
if err != nil {
return pkg.HandleResponse(c, nil, err)
}
// 顺便查询标签列表
if req.SelfWxid != "" {
labels, _ := s.labelBiz.List(c.UserContext(), &entitys.AdvicerLabelListReq{SelfWxid: req.SelfWxid})
if labels != nil {
diff.Labels = labels
}
}
return pkg.HandleResponse(c, diff, nil)
}
// BatchAdd 批量新增好友
func (s *CustomerService) BatchAdd(c *fiber.Ctx) error {
req := &entitys.AdvicerCustomerBatchAddReq{}
if err := c.BodyParser(req); err != nil {
return err
}
err := s.customerBiz.BatchAdd(c.UserContext(), req)
return pkg.HandleResponse(c, nil, err)
}
// BatchUpdate 批量更新已有好友信息
func (s *CustomerService) BatchUpdate(c *fiber.Ctx) error {
req := &entitys.AdvicerCustomerBatchAddReq{}
if err := c.BodyParser(req); err != nil {
return err
}
err := s.customerBiz.BatchUpdate(c.UserContext(), req)
return pkg.HandleResponse(c, nil, err)
}
// UpdateLabels 更新好友标签列表(wx API + DB 一次完成)
func (s *CustomerService) UpdateLabels(c *fiber.Ctx) error {
req := &entitys.AdvicerCustomerUpdateLabelsReq{}
if err := c.BodyParser(req); err != nil {
return err
}
// 1. 查询项目的 wx_token
project, err := s.projectBiz.BaseInfo(req.ProjectId)
if err != nil {
return pkg.HandleResponse(c, nil, err)
}
if project.WxToken == "" {
return pkg.HandleResponse(c, nil, fiber.NewError(fiber.StatusBadRequest, "项目未配置微信接入 Token"))
}
// 2. 调用微信 API 修改好友标签(全量替换)
var wxIds []string
if req.UserName != "" {
wxIds = strings.Split(req.UserName, ",")
}
wxReq := wx.ModifyMemberListReq{
AppId: req.AppId,
LabelIds: req.LabelList,
WxIds: wxIds,
}
var wxRes wx.ModifyMemberListResData
if err := wx.Request(c.UserContext(), project.WxToken, wx.ModifyMemberList, wxReq, &wxRes); err != nil {
return pkg.HandleResponse(c, nil, fmt.Errorf("微信标签修改失败: %w", err))
}
// 3. 更新 DB
if err := s.customerBiz.UpdateLabels(c.UserContext(), &entitys.AdvicerCustomerUpdateLabelsReq{
SelfWxid: req.SelfWxid,
UserName: req.UserName,
LabelList: req.LabelList,
}); err != nil {
return pkg.HandleResponse(c, nil, fmt.Errorf("数据库更新失败: %w", err))
}
return pkg.HandleResponse(c, nil, nil)
}