ai_scheduler/internal/services/advice/smart.go

192 lines
5.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/config"
"ai_scheduler/internal/entitys"
"ai_scheduler/internal/pkg"
"github.com/gofiber/fiber/v2"
)
// SmartService 智能策略服务(批次B:四级回复策略 / 主动对话 / 自我迭代)
type SmartService struct {
StrategyBiz *biz.AdviceStrategyBiz
ProactiveBiz *biz.AdviceProactiveBiz
IterateBiz *biz.AdviceIterateBiz
FollowBiz *biz.AdviceFollowBiz
cfg *config.Config
}
func NewSmartService(
strategyBiz *biz.AdviceStrategyBiz,
proactiveBiz *biz.AdviceProactiveBiz,
iterateBiz *biz.AdviceIterateBiz,
followBiz *biz.AdviceFollowBiz,
cfg *config.Config,
) *SmartService {
return &SmartService{
StrategyBiz: strategyBiz,
ProactiveBiz: proactiveBiz,
IterateBiz: iterateBiz,
FollowBiz: followBiz,
cfg: cfg,
}
}
// ReplyTest 策略干跑预览:模拟客户消息返回决策与生成内容(send=true 时实际发送)
func (s *SmartService) ReplyTest(c *fiber.Ctx) error {
req := &entitys.AdvicerStrategyTestReq{}
if err := c.BodyParser(req); err != nil {
return err
}
res, err := s.StrategyBiz.Test(c.UserContext(), req)
return pkg.HandleResponse(c, res, err)
}
// Reply 对客户最新消息手动执行策略(决策→生成→发送)
func (s *SmartService) Reply(c *fiber.Ctx) error {
req := &entitys.AdvicerStrategyTestReq{}
if err := c.BodyParser(req); err != nil {
return err
}
res, err := s.StrategyBiz.Execute(c.UserContext(), req.Wxid, true)
return pkg.HandleResponse(c, res, err)
}
// RegularScan 熟客超时兜底手动触发(忽略总开关)
func (s *SmartService) RegularScan(c *fiber.Ctx) error {
sent, err := s.StrategyBiz.RegularTimeoutScan(c.UserContext(), true)
return pkg.HandleResponse(c, fiber.Map{"sent": sent}, err)
}
// IterateRun 手动触发画像迭代(clientId 可选;force=true 忽略对话闲置等待)
func (s *SmartService) IterateRun(c *fiber.Ctx) error {
req := &entitys.AdvicerIterateRunReq{}
if err := c.BodyParser(req); err != nil {
return err
}
res, err := s.IterateBiz.Run(c.UserContext(), req)
return pkg.HandleResponse(c, res, err)
}
// ProfileRegenerate 画像更新(基于旧画像+聊天记录重新生成动态栏目;clientId/wxid 至少传一)
func (s *SmartService) ProfileRegenerate(c *fiber.Ctx) error {
req := &entitys.AdvicerProfileRegenerateReq{}
if err := c.BodyParser(req); err != nil {
return err
}
res, err := s.IterateBiz.RegenerateProfile(c.UserContext(), req)
return pkg.HandleResponse(c, res, err)
}
// ProactiveScan 主动触达扫描(生日/活动;force=true 时忽略总开关与活跃时段)
func (s *SmartService) ProactiveScan(c *fiber.Ctx) error {
req := &entitys.AdvicerProactiveRunReq{}
if err := c.BodyParser(req); err != nil {
return err
}
res, err := s.ProactiveBiz.Scan(c.UserContext(), req)
return pkg.HandleResponse(c, res, err)
}
// ProactiveSend 手动推送给指定客户(活动/自定义话术)
func (s *SmartService) ProactiveSend(c *fiber.Ctx) error {
req := &entitys.AdvicerProactiveSendReq{}
if err := c.BodyParser(req); err != nil {
return err
}
res, err := s.ProactiveBiz.SendToClient(c.UserContext(), req)
return pkg.HandleResponse(c, res, err)
}
// ActivityPush 活动立即推送(对该活动目标客户群逐人推送)
func (s *SmartService) ActivityPush(c *fiber.Ctx) error {
req := &entitys.AdvicerActivityPushReq{}
if err := c.BodyParser(req); err != nil {
return err
}
res, err := s.ProactiveBiz.PushActivity(c.UserContext(), req)
return pkg.HandleResponse(c, res, err)
}
// ProactiveLog 主动触达记录查询
func (s *SmartService) ProactiveLog(c *fiber.Ctx) error {
req := &entitys.AdvicerProactiveLogListReq{}
if err := c.BodyParser(req); err != nil {
return err
}
list, err := s.ProactiveBiz.LogList(c.UserContext(), req)
return pkg.HandleResponse(c, list, err)
}
// RemindList 定时提醒列表查询
func (s *SmartService) RemindList(c *fiber.Ctx) error {
req := &entitys.AdvicerRemindListReq{}
if err := c.BodyParser(req); err != nil {
return err
}
list, err := s.FollowBiz.RemindList(c.UserContext(), req)
return pkg.HandleResponse(c, list, err)
}
// RemindCreate 手动新增定时提醒
func (s *SmartService) RemindCreate(c *fiber.Ctx) error {
req := &entitys.AdvicerRemindCreateReq{}
if err := c.BodyParser(req); err != nil {
return err
}
id, err := s.FollowBiz.RemindCreate(c.UserContext(), req)
return pkg.HandleResponse(c, fiber.Map{"id": id}, err)
}
// RemindCancel 取消定时提醒
func (s *SmartService) RemindCancel(c *fiber.Ctx) error {
req := &entitys.AdvicerFollowIdReq{}
if err := c.BodyParser(req); err != nil {
return err
}
err := s.FollowBiz.RemindCancel(c.UserContext(), req.Id)
return pkg.HandleResponse(c, nil, err)
}
// LeadList 成交线索列表查询
func (s *SmartService) LeadList(c *fiber.Ctx) error {
req := &entitys.AdvicerDealLeadListReq{}
if err := c.BodyParser(req); err != nil {
return err
}
list, err := s.FollowBiz.LeadList(c.UserContext(), req)
return pkg.HandleResponse(c, list, err)
}
// LeadCreate 手动新增成交线索
func (s *SmartService) LeadCreate(c *fiber.Ctx) error {
req := &entitys.AdvicerDealLeadCreateReq{}
if err := c.BodyParser(req); err != nil {
return err
}
id, err := s.FollowBiz.LeadCreate(c.UserContext(), req)
return pkg.HandleResponse(c, fiber.Map{"id": id}, err)
}
// LeadCancel 取消成交线索
func (s *SmartService) LeadCancel(c *fiber.Ctx) error {
req := &entitys.AdvicerFollowIdReq{}
if err := c.BodyParser(req); err != nil {
return err
}
err := s.FollowBiz.LeadCancel(c.UserContext(), req.Id)
return pkg.HandleResponse(c, nil, err)
}
// LeadComplete 将成交线索标记为已完成(销售手动闭环)
func (s *SmartService) LeadComplete(c *fiber.Ctx) error {
req := &entitys.AdvicerFollowIdReq{}
if err := c.BodyParser(req); err != nil {
return err
}
err := s.FollowBiz.LeadComplete(c.UserContext(), req.Id)
return pkg.HandleResponse(c, nil, err)
}