Как проверить, существует ли в моей базе данных поле подсказки в моем боте Flowform

Я создаю бота, используя Bot Framework, в веб-канале и прямой линии. У меня есть диалоговое окно, которое вызывает некоторые формы (форма потока).

Я должен запросить для каждой формы номер контракта и некоторые другие данные. Как сохранить только один раз номер контракта и перейти к другому полю и ответить на правильный ответ для этого номера контракта пользователя.

  • я пытался спросить в попрошайничестве номер контракта и имя человека и проверить, совпадают ли они ... если да, чтобы позволить пользователю использовать бота ... но я не могу найти правильный логический код.

Не могли бы вы помочь мне с какой-либо идеей, как запросить только один раз номер контракта и использовать его во всех моих диалогах и формах? Ниже мой код:

MessagesController.cs:

public class MessagesController : ApiController
{  
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
        Activity isTypingReply = activity.CreateReply();
        isTypingReply.Type = ActivityTypes.Typing;
        await connector.Conversations.ReplyToActivityAsync(isTypingReply);

        if (activity.Type == ActivityTypes.Message)
        {
            activity.Locale = "en-US";
            Helpers.SaveActivityDataToDB(activity);
            await Conversation.SendAsync(activity, () => new LuisDialog());
        }
        else
        {
            HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

Luis.cs

[LuisIntent("Greeting")]
public async Task Greeting(IDialogContext context, LuisResult result)
{
    await context.SayAsync(text: "Welcome");
}

[LuisIntent("balance")]
public async Task balance(IDialogContext context, LuisResult result)
{
    var balanca = new FormDialog<BalanceForm>(
        new BalanceForm(),
        BalanceForm.BuildForm,
        FormOptions.PromptInStart,
        result.Entities);
    context.Call<BalanceForm>(balanca, BalanceCompleted);
}

private async Task BalanceCompleted(IDialogContext context, IAwaitable<BalanceForm> result)
{
    BalanceForm form = null;
    try
    {
        form = await result;
    }
    catch (OperationCanceledException)
    {
    }

    if (form == null)
    {
        await context.PostAsync("Try again please!");
    }
    else
    {
        //call the LossForm service to complete the form fill
        var message = $"Thnx";
        await context.PostAsync(message);
    }
    context.Wait(this.MessageReceived);
}

BalanceForm.cs

[Serializable]
public class BalanceForm
{
    [Prompt("What is your contract number?")]
    public string contract;

    public static IForm<BalanceForm> BuildForm()
    {
        OnCompletionAsyncDelegate<BalanceForm> wrapUpRequest = async 
        (context, state) =>
        {
            using (BotModelDataContext BotDb = new BotModelDataContext())
            {
                //search in database 

                string wrapUpMessage = "Dear " + house.Firstname + "," + "your  balance is " + house.Balance;
                await context.PostAsync(wrapUpMessage);       
            };
            return new FormBuilder<BalanceForm>()
                .Message("We have to ask you some information")
                .Field(nameof(contract))
                .OnCompletion(wrapUpRequest)
                //.Confirm("Are you sure: Yes or No ")
                .Build();
        }
    }
}

person Community    schedule 04.09.2018    source источник


Ответы (1)


Не могли бы вы помочь мне с какой-либо идеей, как запросить только один раз номер контракта и использовать его во всех моих диалогах и формах?

В соответствии с вашим требованием я создаю образец, запрашивающий у пользователя номер контракта, и сохраняю значение в UserData, чтобы я мог получить номер контракта, предоставленный пользователем, из UserData в дочернем диалог(и). Следующий пример кода предназначен для справки.

В корневом диалоге:

[Serializable]
public class RootDialog : IDialog<object>
{
    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;

        // calculate something for us to return
        int length = (activity.Text ?? string.Empty).Length;

        var contractnumber = "";

        if (!context.UserData.TryGetValue<string>("contract_number", out contractnumber))
        {
            //prompt for contract number

            PromptDialog.Text(
            context: context,
            resume: AfterGetContractNumber,
            prompt: "Please provide your contract number.",
            retry: "Please try again."
        );
        }
        else
        {
            await context.Forward(new BaiscLuisDialog(), AfterLuisDialog, context.Activity, CancellationToken.None);

        }
    }

    private async Task AfterGetContractNumber(IDialogContext context, IAwaitable<string> result)
    {
        string contractnumber = await result;

        context.UserData.SetValue<string>("contract_number", contractnumber);

        await context.PostAsync($"OK, received your contract number: {contractnumber}.");

        context.Done(this);
    }


    private async Task AfterLuisDialog(IDialogContext context, IAwaitable<object> result)
    {
        context.Wait(MessageReceivedAsync);
    }
}

В диалоговом окне BaiscLuis:

[LuisIntent("balance")]
public async Task BalanceIntent(IDialogContext context, LuisResult result)
{
    //call BalanceForm
    //and pass contract number that user provided to BalanceForm contract_number
    var balanca = new Microsoft.Bot.Builder.FormFlow.FormDialog<BalanceForm>(new BalanceForm() { contract_number = context.UserData.GetValue<string>("contract_number") }, 
        BalanceForm.BuildForm, 
        Microsoft.Bot.Builder.FormFlow.FormOptions.PromptInStart, 
        result.Entities);

    context.Call<BalanceForm>(balanca, BalanceCompleted);
}

private async Task BalanceCompleted(IDialogContext context, IAwaitable<BalanceForm> result)
{
    context.Wait(MessageReceived);
}

В BalanceForm:

[Serializable]
public class BalanceForm
{
    public string contract_number;

    [Prompt("What is your contract number?")]
    public string contract;

    public string your_other_field;
    public static IForm<BalanceForm> BuildForm()
    {
        OnCompletionAsyncDelegate<BalanceForm> wrapUpRequest = async
        (context, state) =>
        {
            //using (BotModelDataContext BotDb = new BotModelDataContext())
            //{
            //    //search in database 

            //    string wrapUpMessage = "Dear " + house.Firstname + "," + "your  balance is " + house.Balance;
            //    await context.PostAsync(wrapUpMessage);
            //};

            //your code logic here

            var contractnumber = "";

            context.UserData.TryGetValue<string>("contract_number", out contractnumber);

            string wrapUpMessage = " Form completed! Your contract number is " + contractnumber;
            var replymes = context.MakeMessage();
            replymes.Text = wrapUpMessage;

            await context.PostAsync(replymes);
        };

        return new FormBuilder<BalanceForm>()
            .Message("We have to ask you some information")
            .Field(new FieldReflector<BalanceForm>(nameof(contract)).SetActive(state => state.contract_number == null))
            .Field(nameof(your_other_field))
            .OnCompletion(wrapUpRequest)
            //.Confirm("Are you sure: Yes or No ")
            .Build();
    }
}

Результат проверки:

введите здесь описание изображения

person Fei Han    schedule 05.09.2018