Общий вопрос и ответ UCMA

Я работаю над приложением рабочего процесса UCMA 3.0 и пытаюсь генерировать запросы в нашу систему управления клиентами, позволяя конечным пользователям получать данные о конкретных клиентах с помощью голоса или мгновенных сообщений. Мне было интересно, кто-нибудь знает, как создать общий вопрос-ответ с помощью UCMA, который позволяет общий ввод. Я знаю, что могу настроить ожидаемые входные данные и грамматику, но с параметрами двух прописных букв и вероятностью того, что конечный пользователь будет знать точное имя клиента (или номер клиента, если на то пошло), я бы предпочел разрешить пользователю введите часть имени, а затем выполните поиск в базе данных списка имен, которые могут соответствовать критериям. Кто-нибудь знает способ и имеет пример кода, который мог бы позволить мне сделать это, если это возможно?


person Samuel Bronchetti    schedule 20.02.2013    source источник


Ответы (1)


У меня была та же проблема, и мне пришлось написать пользовательское действие для захвата общего ввода от пользователя. Это требует некоторой работы, чтобы подготовить его к производству. Обратите внимание на стильный перехват system.exception в нескольких местах, а также создание исключения, если ввод не получен в течение периода ожидания, вместо повторного запроса пользователя. Также нет регулярного выражения на пользовательском вводе...

InstanceDependencyProperty — это еще что-то, что разочаровывало в Workflow. Без использования InstanceDependencyProperties вы не сможете получить какие-либо результаты после завершения действия.

Надеюсь это поможет!

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading;

using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.Runtime;
using Microsoft.Rtc.Collaboration;
using Microsoft.Rtc.Workflow.Activities;
using Microsoft.Rtc.Workflow.Common;


namespace ActivityLibrary
{
    public partial class CaptureIMInput : Activity, IInstanceDependencyContainer
    {
        #region Private member variables
        private CallProvider _callProvider;
        private Timer _maximumTimer;
        private string _imText;
        private bool messageReceived = false;
        private bool _maximumTimerElapsed = false;
        #endregion

        public CaptureIMInput()
        {
            InitializeComponent();
            _instanceDependencyProperties = new Dictionary<string, object>();
        }

        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            try
            {
                this._callProvider = Utilities.GetCallProviderFromParent<InstantMessagingCall>(this);
                InstantMessagingCall call = (InstantMessagingCall)this._callProvider.Call;

                try
                {

                    if (call.State == CallState.Established)
                    {
                        call.Flow.EndSendInstantMessage(call.Flow.BeginSendInstantMessage(MainPrompt, null, null));
                        _maximumTimer = new Timer(new TimerCallback(OnMaximumTimerFired), null, MaximumPrompt, new TimeSpan(0, 0, 0, 0, -1));
                        call.Flow.MessageReceived += this.InstantMessagingFlow_MessageReceived;
                        while (!messageReceived)
                            {
                                if (_maximumTimerElapsed)
                                    throw new TimeoutException("User input was not detected within alloted time");
                            }
                        if (!string.IsNullOrEmpty(_imText))
                        {
                            IMText = _imText;
                            {
                                this.Stop();
                                return ActivityExecutionStatus.Closed;
                            }
                        }
                    }

                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return ActivityExecutionStatus.Closed;
        }

        protected override ActivityExecutionStatus Cancel(ActivityExecutionContext executionContext)
        {
            this.Stop(); //Clean up timer
            return ActivityExecutionStatus.Canceling;
        }

        private void Stop()
        {
            if (_maximumTimer != null)
            {
                _maximumTimer.Dispose();
                _maximumTimer = null;
            }
        }

        private void InstantMessagingFlow_MessageReceived(object sender, InstantMessageReceivedEventArgs e)
        {
            //Can't set dependencyproperties directly from sub-thread
            _imText = e.TextBody;
            //Mark bool so main while loop exits
            messageReceived = true;
        }

        //Callback to 
        private void OnMaximumTimerFired(object state)
        {
            _maximumTimerElapsed = true;
        }


        #region InstanceDependency dictionary
        private Dictionary<string, object> _instanceDependencyProperties;
        [Browsable(false)]
        public Dictionary<string, object> InstanceDependencyProperties
        {
            get { return _instanceDependencyProperties; }
        }
        #endregion

        #region Maximum Prompt Timeout
        [NonSerialized]
        private static readonly InstanceDependencyProperty MaximumPromptProperty = InstanceDependencyProperty.Register("MaximumPrompt", typeof(TimeSpan), typeof(CaptureIMInput), new TimeSpan(0, 0, 30));

        [TypeConverter(typeof(TimeSpanConverter))]
        public TimeSpan MaximumPrompt
        {
            get
            {
                if (base.DesignMode)
                    return (TimeSpan)InstanceDependencyHelper.GetValue<CaptureIMInput>(this, MaximumPromptProperty);
                else
                    return (TimeSpan)InstanceDependencyHelper.GetValue<CaptureIMInput>(this, this.WorkflowInstanceId, MaximumPromptProperty);
            }
            set
            {
                if (base.DesignMode)
                    InstanceDependencyHelper.SetValue<CaptureIMInput>(this, MaximumPromptProperty, value);
                else
                    InstanceDependencyHelper.SetValue<CaptureIMInput>(this, this.WorkflowInstanceId, MaximumPromptProperty, value);
            }
        }
        #endregion

        #region MainPrompt
        public static DependencyProperty MainPromptProperty =
            DependencyProperty.Register("MainPrompt", typeof(string), typeof(CaptureIMInput));

        [ValidationOption(ValidationOption.Required)]
        public string MainPrompt
        {
            get
            {
                return (string)base.GetValue(MainPromptProperty);
            }
            set
            {
                base.SetValue(MainPromptProperty, value);
            }
        }
        #endregion

        #region Instant Message Text
        public static InstanceDependencyProperty IMTextProperty =
            InstanceDependencyProperty.Register("IMText",
                typeof(string),
                typeof(CaptureIMInput));

        [Description("InstantMessaging Text from user")]
        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public string IMText
        {
            get
            {
                if (base.DesignMode) return ((string)InstanceDependencyHelper.GetValue<CaptureIMInput>(this, CaptureIMInput.IMTextProperty));
                else return ((string)(InstanceDependencyHelper.GetValue<CaptureIMInput>(this, this.WorkflowInstanceId, CaptureIMInput.IMTextProperty)));
            }
            set
            {
                if (base.DesignMode) InstanceDependencyHelper.SetValue<CaptureIMInput>(this, CaptureIMInput.IMTextProperty, value);
                else InstanceDependencyHelper.SetValue<CaptureIMInput>(this, this.WorkflowInstanceId, CaptureIMInput.IMTextProperty, value);
            }
        }
        #endregion

    }
}
person Freakin    schedule 14.03.2013