示例编写程序3 根据函数返回的参数值不同运行不同的分支对话流程

延续示例1中的查订单场景,如果想要根据不同的订单号类型,来进行不同的处理逻辑和回复不同的内容,可以在对话流的设计图中进行分支处理。如果当订单为A类订单的时候,可以去查询A类订单的接口,然后进行回复,如果是其他类别订单,则直接进行静态内容的回复。

示例代码

在对话工厂的函数节点中,可以通过打开分支(switch)功能进行对话流程的分支处理。这其中,分支功能的分支判断逻辑都是根据系统内置变量routeVariable的值来执行的。

在“分支判断”函数节点中,打开了分支设置,并且在该节点下游连接了两个节点,如果当订单号是A类订单号时(订单号以“A_”开头),回复A类订单的回复话语,其他订单类别时回复另一种话语。可以看到,分支判断是根据routeVariable的值来判断的,但routeVariable=1时,走标记为“A“的路径,但routeVariable=0时,走标记为“B“的路径。那么,如何对routeVariable进行赋值呢,下面的示例代码中进行了这个操作。代码中通过判断查订单意图的orderId参数,如果订单号以”A_“开头,那么就将routeVariable赋值为1,否值赋值为0。这样就成功的通过自定义代码,对分支逻辑进行了判断。

Node.js

module.exports.handler = function(event, context, callback) {
    /** event structure definition
    {
      // read-only variables
      "environment": "Object",
      "lastOutputForFunction": "String",
      "slotSummary": "Object",

      // read/write variables
      "global": "Object",
      "outputForResponse": "Object",
      "outputForFunction": "String",
      "routeVariable": "String"
    }
    **/
    var arr = "";
    var eventResult = "";
    try {
        var eventObj = JSON.parse(event);
        // add your code here
        var slots = eventObj["slotSummary"];
        var orderId = slots["查订单.orderId"];
        if (orderId.startsWith("A_")) {
            eventObj.routeVariable = '1';
        } else {
            eventObj.routeVariable = '0';
        }
        eventResult = JSON.stringify(eventObj);
        callback(null, eventResult);
    } catch (e) {
        eventResult = JSON.stringify(eventObj);
        callback(null, eventResult);
    }
};

Python

# -*- coding: utf-8 -*-
import logging  
import json

def handler(event, context):
  logger = logging.getLogger()
  logger.info(event)
  eventObj = json.loads(event)

  slots = eventObj["slotSummary"]
  logger.info(slots)
  orderId = slots[u"查订单.orderId"]

  if orderId.startswith("A_"):
    eventObj["routeVariable"] = "1"
  else:
    eventObj["routeVariable"] = "0"

  return eventObj

Java

package com.aliyun.openservices.tcp.example.handler;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;

public class FunctionHandler implements PojoRequestHandler<JSONObject, JSONObject> {
    @Override
    public JSONObject handleRequest(JSONObject eventObj, Context context) {

        /**
         *  eventObj structure definition
         *
         *  read-only variables
         *  "environment": "Object",
         *  "lastOutputForFunction": "String",
         *  "slotSummary": "Object",
         *
         *  read/write variables
         *  "global": "Object",
         *  "outputForResponse": "Object",
         *  "outputForFunction": "String",
         *  "routeVariable": "String"
         */

        JSONObject slots = eventObj.getJSONObject("slotSummary");
        String orderId = slots.getString("查订单.orderId");

        if (orderId.startsWith("A_")) {
            eventObj.put("routeVariable", "1");
        } else {
            eventObj.put("routeVariable", "0");
        }

        return eventObj;
    }
}