192 lines
5.9 KiB
Go
192 lines
5.9 KiB
Go
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)
|
||
}
|