137 lines
3.9 KiB
Go
137 lines
3.9 KiB
Go
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)
|
||
}
|