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) }