Вариант голосового меню для IoB на примере заказа воды

Научил УД заказывать воду в одной известной фирме нашего города. Представленный ниже код это часть моего скрипта для формирования заказа. Через голосовое меню формируется массив данных для заказа, которые используются другим скриптом уже непосредственно для самого заказа на сайте компании.

В массиве menu хранятся пункты голосового меню.
Если вариант ответа предполагает подпункт меню, то последним элементом массива указывается номера меню для подпунктов.

Например:
массив menu[0][1] — [‘Заказываем как обычно?’, ‘да’, ‘нет’, [0,1]], Предполагает для варианта ответа — «нет» подменю с номером 1, при этом меню под номером 1 это номер элемента массива menu[1].

menu = [
    [
        ['Заказываем как обычно?', 'да', 'нет', [0,1]],
        ['На какой день?', 'сегодня', 'завтра'],
        ['На какое время?', 'утро', 'обед', 'вечер'],
        ['Я делаю заказ']
      
    ],
    [   
        ['Какое количество?', '1', '2'],
        ['На какой день?', 'сегодня', 'завтра'],
        ['На какое время?', 'утро', 'обед', 'вечер']
    ]
];
var collect = {
          hours:  {
            1:  '9:00-13:00 (утро)',
            2:  '13:01-17:00 (день)',
            3:  '17:01-21:00 (вечер)',
            4:  '18:01-21:00 (вечер)'
          },
          Product: {
            id:         [1204],
            price:      [190],
            discprice:  [180]
          }
    };
var order = {
      productsid:     1204,
      price:          190,
      discountprice:  180,
      count:          1,
      date:           '16-03-2016',
      hours:          '18:01-21:00 (вечер)',
      periodid:       4
};
////////////////////////////////////
function resultOrder(item, num){
    log('RESULT - ' + result);
    //var order = getState('javascript.0.WaterOrder.order').val;
    var prodid = JSON.parse(getState('javascript.0.WaterOrder.ProductsId').val);
    var price = JSON.parse(getState('javascript.0.WaterOrder.price').val);
    var discprice = JSON.parse(getState('javascript.0.WaterOrder.discountPrice').val);
        
    var date = new Date();
    var day = date.getDate();
    var month = ((date.getMonth()+1)<10?'0':'')+(date.getMonth()+1);
    var year = date.getFullYear();
    
    if (num === 0){
        var datedost;
        if (result[1] === 0){
            // productsid, price, discountprice, count, date, hours, periodid
            datedost = 'сегодня';
            order.date = day+ '-' +month+ '-' +year;
        }
        else if (result[1] === 1){
            datedost = 'завтра';
            order.date = day+1 + '-' +month+ '-' +year;
        }
        if (result[2] === 0){
            order.hours = collect.hours['1'];
            order.periodid = 1;
        }
        else if (result[2] === 1){
            order.hours = collect.hours['2'];
            order.periodid = 2;
        }
        else if (result[2] === 2){
            order.hours = collect.hours['4'];
            order.periodid = 4;
        }
        
        var e = prodid.indexOf(order.productsid);
        if (~e){
            order.price = price[e];
            order.discountprice = discprice[e];
        }
        var per = order.hours.replace(/-/g, ' часов до ');
        setState('sayit.0.tts.text',  'Я заказываю '+ order.count + ' бутыль за '+ order.count * order.price + ' руб. .' + 'Доставка ' + datedost + ' в период с ' + per);
        setState('javascript.0.WaterOrder.order', JSON.stringify(order));
        setState('javascript.0.WaterOrder.Start', true);
    }
    if (num === 1){
        
    }
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
var result = [];
var item;
var num;
var wait;
var сonf;
var flag = false;
var step;
var notFound = 0;
var voice = '';

on({id: 'javascript.0.Voice.Command', change: 'any'}, function (obj) {
    voice = obj.newState.val.toLowerCase();
    VoiceCommands (voice);
});
///////////////////////////////////////
function verify(confirm){
   if (confirm === true){
        var lastAnswer = result[result.length - 1];
        if (lastAnswer === undefined) {
           console.error('No last answer found: ' + JSON.stringify(result));
           return;
        }
        var possibleValues = menu[num][item][menu[num][item].length - 1]; // always last element of submenu
        if (possibleValues === undefined) {
           console.error('No possible values found: ' + JSON.stringify(menu[num][item]));
           return;
        }
        if (typeof possibleValues === 'object' && possibleValues[lastAnswer] !== 0){
            clear();
            item = 0;
            step = 0;
            num = possibleValues[lastAnswer];
            whiles(item, num);
            log('Переходим в подменю меню');
        } else {
            //log('Подтверждение - ' + confirm);
            log('Массив результата - ' + JSON.stringify(result));
            item++;
            if (item >= menu[num].length -1){
                clear();
                resultOrder(item, num);
            } else {
                whiles(item, num);
            }
        }
    } else {
        setState('javascript.0.Voice.menu', false);
        clear();
        setState('sayit.0.tts.text',  'Ошибка! Заказ отменён.');
    }
}
///////////////////////////////////////
function whiles(item, num){
        log('Переменные: num-' + num +' item-'+ item);
        log('menu[num][item]' + menu[num][item]);
        //log('SayIt - ' + menu[num][item][0]);
            var say = menu[num][item].slice();
            if (typeof menu[num][item][menu[num][item].length-1] === 'object'){
                say.pop();
            }
        log('say ' + JSON.stringify(say));
        setState('sayit.0.tts.text',  JSON.stringify(say));
        Confirm(num, item, function (confirm) {
            verify(confirm);
        //setState('sayit.0.tts.text', menu[i][0]);
        });
}
/////////////////////////////////////////////   
function clear(){
    log('Отписались');
    unsubscribe(сonf);
    clearTimeout(wait);
}
///////////////////////////////////////
function Confirm (num, item, callback){
    wait = setTimeout(function() {
        setState('javascript.0.Voice.menu', false);
		//setState('sayit.0.tts.text',  'Заказ отменён по таймауту');
		unsubscribe(сonf);
		callback (false);
	}, 40000);
	сonf = on({id: 'javascript.0.Voice.Command', change: 'any'}, function (obj) {
	    var voice = obj.newState.val.toLowerCase();
	    var Arrphrase = menu[num][item].slice();
	    Arrphrase.splice(0, 1);
	    var el;
	    Arrphrase.forEach(function(itm, i, arr) {
			//log ('i - '+ i +' Ищем в '+voice+ ' - '+ itm+ ' Массив -' + arr);
			if (~voice.indexOf(itm)){
				flag =  true;
				el = i;
			}
			if (i >= Arrphrase.length-1){
			    if (flag){
                    result[step] = el;
                    log('Номер найденного элемента в массиве - ' + el);
                    step++;
                    flag =  false;
                    clear();
                    callback (true);
                } else {
                    flag =  false;
                    if (notFound > 0){
                        clear();
                        callback (false);
                    } else {
                        notFound++;
                        setState('sayit.0.tts.text',  'Не поняла, повторите');
                        clear();
                        Confirm (num, item, function (confirm, cmd) {
                            verify(confirm, menu);
                        });
                        whiles(item, num);
                    }
                }
			}
				    
        });
	});
}
////////////////////////////////////////
function VoiceCommands (voice){
    log('Вся переменная - ' + voice);
    if ((found('закаж') || found('заказ')) && found('вод')){
        setState('javascript.0.Voice.menu', true);
        setTimeout(function() {
            setState('javascript.0.Voice.menu', false);
	    }, 300000);
        setState('javascript.0.WaterOrder.Update', true);
        item = 0;
        num = 0;
        step = 0;
        whiles(item, num);
    }
    if (found('заказ') && found('повтор')){
        setState('sayit.0.tts.text',  'Повторяю заказ');
        setState('javascript.0.WaterOrder.Start', true);
    }
///////
function found (cmd){ 
      cmd = String(cmd);
      if (~voice.indexOf(cmd)){
        return true;
      } else { 
        return false;
      }
    }
}

Отправить ответ

Оставьте первый комментарий!

avatar
wpDiscuz