diff --git a/config/config_env.yaml b/config/config_env.yaml index b0f5953..08315f4 100644 --- a/config/config_env.yaml +++ b/config/config_env.yaml @@ -5,9 +5,12 @@ server: ollama: base_url: "http://192.168.6.115:11434" - model: "qwen3-coder:480b-cloud" - generate_model: "qwen3-coder:480b-cloud" - mapping_model: "deepseek-v3.2:cloud" + model: "qwen3:8b" + generate_model: "qwen3:8b" + mapping_model: "qwen3:8b" + # model: "qwen3-coder:480b-cloud" + # generate_model: "qwen3-coder:480b-cloud" + # mapping_model: "deepseek-v3.2:cloud" vl_model: "qwen2.5vl:7b" timeout: "120s" level: "info" diff --git a/internal/biz/ding_talk_bot.go b/internal/biz/ding_talk_bot.go index 5fbd711..5ae8f27 100644 --- a/internal/biz/ding_talk_bot.go +++ b/internal/biz/ding_talk_bot.go @@ -283,12 +283,31 @@ func (d *DingTalkBotBiz) fallbackToGroupCreation(ctx context.Context, requireDat } } + // 4. 匹配问题类型 + var issueType model.AiIssueType + for _, it := range allIssueTypes { + if it.Name == classification.IssueTypeName { + issueType = it + break + } + } + if sys.SysID == 0 { - // 无法明确系统,询问用户 - statusKey := fmt.Sprintf("ai_bot:session:status:%s", requireData.Req.SenderStaffId) - d.redisCli.Set(ctx, statusKey, "WAITING_FOR_SYS_CONFIRM", time.Hour) - entitys.ResText(requireData.Ch, "", "抱歉,我无法确定您咨询的是哪个系统。请告诉我具体系统名称(如:直连天下系统、货易通系统),以便我为您安排对应的技术支持。") - return nil + + // 判断全局是否存在该规则 + _, found, _ := d.issueImpl.IssueAssignRule.FindOne( + d.issueImpl.WithSysID(0), + d.issueImpl.WithIssueTypeID(issueType.ID), + d.issueImpl.WithStatus(1), + ) + if !found { + // 无法明确系统,且全局无该能力,询问用户 + statusKey := fmt.Sprintf("ai_bot:session:status:%s", requireData.Req.SenderStaffId) + d.redisCli.Set(ctx, statusKey, "WAITING_FOR_SYS_CONFIRM", time.Hour) + entitys.ResText(requireData.Ch, "", "抱歉,我无法确定您咨询的是哪个系统。请告诉我具体系统名称(如:直连天下系统、货易通系统),以便我为您安排对应的技术支持。") + return nil + } + } return d.fallbackToGroupCreationWithSys(ctx, requireData, &sys) @@ -323,8 +342,18 @@ func (d *DingTalkBotBiz) fallbackToGroupCreationWithSys(ctx context.Context, req d.issueImpl.WithStatus(1), ) if !found { - log.Errorf("assign rule not found for sys %s and issue type %s; err: %v", sys.SysName, issueType.Name, err) - return fmt.Errorf("分配规则 %s-%s 不存在", sys.SysName, issueType.Name) + // 创建默认分配规则 - 暂不考虑并发,有唯一索引 + rule = model.AiIssueAssignRule{ + SysID: sys.SysID, + IssueTypeID: issueType.ID, + Status: 1, + } + if err := d.issueImpl.IssueAssignRule.Create(&rule); err != nil { + log.Errorf("create assign rule for sys %s and issue type %s failed; err: %v", sys.SysName, issueType.Name, err) + return fmt.Errorf("创建分配规则 %s-%s 失败", sys.SysName, issueType.Name) + } else { + log.Infof("create assign rule for sys %s and issue type %s success; rule id: %d", sys.SysName, issueType.Name, rule.ID) + } } var staffIds []string diff --git a/internal/biz/do/handle.go b/internal/biz/do/handle.go index 9b705a8..6508a69 100644 --- a/internal/biz/do/handle.go +++ b/internal/biz/do/handle.go @@ -137,10 +137,10 @@ func (r *Handle) ClassifyIssue(ctx context.Context, systems []string, issueTypes 可用问题类型: [%s] 请仅以 JSON 格式回复,包含以下字段: -- sys_name: 系统名称 +- sys_name: 系统名称,若未提及系统关键词,则为"全局" - issue_type_name: 问题类型名称 - summary: 15字以内的问题简述(用于群命名) -- reason: 分类理由`, strings.Join(systems, ", "), strings.Join(issueTypes, ", ")) +- reason: 分类判断理由;系统名称判断理由`, strings.Join(systems, ", "), strings.Join(issueTypes, ", ")) messages := []api.Message{ {Role: "system", Content: systemPrompt},