Несколько форм в Microsoft Bot framework

У меня две формы. Мне нужно получить доступ к обеим формам на основе пользовательского ввода.

Формы следующие

 internal static IDialog<JObject> BuildTravelForm()
    {
        travelstatus = 1;
        leaveStatus = 0;
        return Chain.From(() => FormDialog.FromForm(TravelForm.BuildForm))
            .Do(async (context, order) =>
            {
                try
                {
                    travelstatus = 0;
                    var completed = await order;
                    string source = (string)completed.GetValue("Question1");
                    string destination = (string)completed.GetValue("Question2");
                    await context.PostAsync("Your travel request is awaiting approval" + " " + "from" + " " + source + " " + "to" + " " + destination);
                }
                catch (Exception)
                {

                    await context.PostAsync("Thank you");
                }
            });
    }

Второй идет так

internal static IDialog<JObject> BuildLeaveForm()
    {
        leaveStatus = 1;
        travelstatus = 0;
        return Chain.From(() => FormDialog.FromForm(LeaveForm.BuildForm))
            .Do(async (context,order)=>
        {
            leaveStatus = 0;
            var completed = await order;
            string startDate = (string)completed.GetValue("Question1");
            string endDate = (string)completed.GetValue("Question2");
            await context.PostAsync("Your leave is applied" + " " + "from" + " " + startDate + " " + "to" + " " + endDate);
        });
    }

Метод контроллера заключается в следующем

 public async Task<Activity> Post([FromBody]Activity activity)
    {

        try
        {
            if (activity.Type == ActivityTypes.Message)
            {
                if (leaveStatus == 1 && travelstatus==0)
                { 
                    //nested if to check intents to follow
                    await Conversation.SendAsync(activity, BuildLeaveForm);
                }
                else if(travelstatus == 1 && leaveStatus==0)
                {
                    await Conversation.SendAsync(activity, BuildTravelForm);
                }
                else
                {
                    ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                    StateClient stateClient = activity.GetStateClient();
                    string replyMessage = "";
                    Luis stluis = await GetEntityFromLUIS(activity.Text);
                    if (stluis.intents.Count() > 0)
                    {
                        Activity reply;
                        ///await Conversation.SendAsync(activity, MakeGreetings);
                        using (var file = Assembly.GetExecutingAssembly().GetManifestResourceStream("Javis_V2.IntentLibrary.json"))
                        {
                            o2 = JObject.Parse(new StreamReader(file).ReadToEnd());
                            string luisIntent = stluis.intents[0].intent;
                            if (luisIntent == "LeaveManager")
                            {
                                await Conversation.SendAsync(activity, BuildLeaveForm);
                            }
                            else if(luisIntent=="TravelManager")
                            {
                                await Conversation.SendAsync(activity, BuildTravelForm);
                            }
                            else
                            {
                                leaveStatus = 0;
                                travelstatus = 0;
                                replyMessage = (string)o2.GetValue(luisIntent);
                                if(replyMessage=="")
                                {
                                    replyMessage = "Sorry! Not getting you";
                                }
                                reply = activity.CreateReply(replyMessage);
                                await connector.Conversations.ReplyToActivityAsync(reply);
                            }
                        }
                    }
                }
            }
            else
            {
                HandleSystemMessage(activity);
            }
            return null;

        }
        catch (Exception exp)
        {
            Debug.WriteLine(exp);
            return null;
        }
    }

Проблема заключается в том, что когда первая форма завершена, и когда вторая форма запускается через luis intent, первая форма появляется. Я ищу что-то без использования диалогов.

Ценится любая помощь.
Спасибо заранее.

1 ответ

  1. Эта строка является проблемой :

       if (leaveStatus == 1 && travelstatus==0)
                    { 
                        //nested if to check intents to follow
                        await Conversation.SendAsync(activity, BuildLeaveForm);
                        await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("Thanks"));
                    }
                    else if(travelstatus == 1 && leaveStatus==0)
                    {
                        await Conversation.SendAsync(activity, BuildTravelForm);
                        await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("Thanks"));
                    }
    

    Если вы видите на вышеуказанном коде, то BuildTravelForm или BuildLeaveForm могут ясно произвести ошибку и закончить ее без вызывать цепную деятельность делают. Если все выполняется хорошо, он вызовет Do в противном случае он просто пропустит его. Таким образом, лучшее место для сброса статуса-после инструкции await, которая будет вызвана после завершения диалога.

    Я сделаю, как это :

       if (leaveStatus == 1 && travelstatus==0)
                    { 
                        //nested if to check intents to follow
                        await Conversation.SendAsync(activity, BuildLeaveForm);
                        travelstatus =0; leaveStatus=0;
                        await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("Thanks"));
                    }
                    else if(travelstatus == 1 && leaveStatus==0)
                    {
                        await Conversation.SendAsync(activity, BuildTravelForm);
                        travelstatus =0; leaveStatus=0;
                        await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("Thanks"));
                    }
    

    Проверьте, хорошо ли он работает.