全部产品
阿里云办公

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

更新时间:2018-09-27 13:52:00

场景描述

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

image.png | left | 747x353

示例代码

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

image.png | left | 747x351

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

Node.js

  1. module.exports.handler = function(event, context, callback) {
  2. /** event structure definition
  3. {
  4. // read-only variables
  5. "environment": "Object",
  6. "lastOutputForFunction": "String",
  7. "slotSummary": "Object",
  8. // read/write variables
  9. "global": "Object",
  10. "outputForResponse": "Object",
  11. "outputForFunction": "String",
  12. "routeVariable": "String"
  13. }
  14. **/
  15. var arr = "";
  16. var eventResult = "";
  17. try {
  18. var eventObj = JSON.parse(event);
  19. // add your code here
  20. var slots = eventObj["slotSummary"];
  21. var orderId = slots["查订单.orderId"];
  22. if (orderId.startsWith("A_")) {
  23. eventObj.routeVariable = '1';
  24. } else {
  25. eventObj.routeVariable = '0';
  26. }
  27. eventResult = JSON.stringify(eventObj);
  28. callback(null, eventResult);
  29. } catch (e) {
  30. eventResult = JSON.stringify(eventObj);
  31. callback(null, eventResult);
  32. }
  33. };

Python

  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import json
  4. def handler(event, context):
  5. logger = logging.getLogger()
  6. logger.info(event)
  7. eventObj = json.loads(event)
  8. slots = eventObj["slotSummary"]
  9. logger.info(slots)
  10. orderId = slots[u"查订单.orderId"]
  11. if orderId.startswith("A_"):
  12. eventObj["routeVariable"] = "1"
  13. else:
  14. eventObj["routeVariable"] = "0"
  15. return eventObj

Java

  1. package com.aliyun.openservices.tcp.example.handler;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.aliyun.fc.runtime.Context;
  5. import com.aliyun.fc.runtime.PojoRequestHandler;
  6. public class FunctionHandler implements PojoRequestHandler<JSONObject, JSONObject> {
  7. @Override
  8. public JSONObject handleRequest(JSONObject eventObj, Context context) {
  9. /**
  10. * eventObj structure definition
  11. *
  12. * read-only variables
  13. * "environment": "Object",
  14. * "lastOutputForFunction": "String",
  15. * "slotSummary": "Object",
  16. *
  17. * read/write variables
  18. * "global": "Object",
  19. * "outputForResponse": "Object",
  20. * "outputForFunction": "String",
  21. * "routeVariable": "String"
  22. */
  23. JSONObject slots = eventObj.getJSONObject("slotSummary");
  24. String orderId = slots.getString("查订单.orderId");
  25. if (orderId.startsWith("A_")) {
  26. eventObj.put("routeVariable", "1");
  27. } else {
  28. eventObj.put("routeVariable", "0");
  29. }
  30. return eventObj;
  31. }
  32. }