3

简单三步,通过工作流(ASW)快速完成订单数据处理

 3 years ago
source link: https://serverlesscloud.cn/best-practice/2021-01-28-asw-order
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

简单三步,通过工作流(ASW)快速完成订单数据处理

发布于: 2021-1-28
归档于:

标签:Serverless工作流 ASW

本文介绍如何通过工作流 ASW 编排云函数,快速完成订单数据的处理。

  1. 工作流调用函数获取一定时间段内的订单数据,对数据进行预处理。
  2. 将预处理的数据交给 Map 迭代任务处理:每个订单进行数据处理后,分别写到不同的数据库表中,或者绘制成图表展示。

12a4bf778b5a8e9361f1afa61973d8de.svg

创建工作流程需要首先创建一个状态机,通过编排状态机的不同元件,改变状态机结构,从而实现用户自定义的功能集合。

简单三步即可完成:创建云函数 → 创建工作流 → 运行状态机

Step 1:创建云函数

创建 GetOrder 函数

  1. 登录 云函数控制台,单击左侧导航栏的【函数服务】。
  2. 在主界面上方函数服务区域选择广州,并单击【新建】,进入函数创建流程。
  3. 在新建函数页面,基本信息中填写以下信息:

    • 函数名称:GetOrder。
    • 运行环境:Nodejs10.15。
    • 创建方式:选择空白函数,单击【下一步】进入函数配置。
  4. 在函数配置页面中的 Cloud Studio 窗格中,删除原有代码,复制如下所示的代码:
   'use strict';
   exports.main_handler = async (event, context) => {
       console.log("this is get order function");
       # 您可以通过api请求获取真实的订单数据,样例中数据方便模拟工作流执行
          var orderlist = [
           {
               "orderId":"202012200001",
               "goodsId":"1004",
               "goodsName":"橘子#1004",
               "unit":"件",
               "specific":"5斤一箱",
               "linePrice":100,
               "salePrice":90,
               "costPrice":80,
               "number":30,
   			"isVoucher":1,
   			"voucherPrice":2,
   			"voucherId":"3dr55678hj",
   			"isDiscount":1,
   			"discountPrice":3,
   			"carriage": 8,
   			"receiver":"susu",
   			"phone":"18633567898",
   			"address":"深圳市南山区腾讯大厦20楼",
   			"createTime":"2020-12-20 10:00:00",
   			"payTime":"2020-12-20 11:00:00",
   			"payMethod":1, 
   			"payOrder":"202012201100003940",
   			"orderStatus":3,
   			"deliveryTime":"2020-12-21 11:00:00",
   			"finishTime":"2020-12-25 11:00:00",
   			"deliveryOrder":"ZT12345789d786",
   			"isReturn":1,
   			"returnId":"2020122600012",
               "returnNumber":2,	
           },
   		 {
               "orderId":"202012200001",
               "goodsId":"2001",
               "goodsName":"梨子#2001",
               "unit":"件",
               "specific":"6斤一箱",
               "linePrice":150,
               "salePrice":120,
               "costPrice":90,
               "number":20,
   			"isVoucher":1,
   			"voucherPrice":3,
   			"voucherId":"3dr55678hj",
   			"isDiscount":1,
   			"discountPrice":5,
   			"carriage": 0,
   			"receiver":"susu",
   			"phone":"18633567898",
   			"address":"深圳市南山区腾讯大厦20楼",
   			"createTime":"2020-12-20 10:00:00",
   			"payTime":"2020-12-20 11:00:00",
   			"payMethod":1, 
   			"payOrder":"202012201100003940",
   			"orderStatus":3,
   			"deliveryTime":"2020-12-21 11:00:00",
   			"finishTime":"2020-12-25 11:00:00",
   			"deliveryOrder":"ZT12345789d786",
   			"isReturn":0,
   			"returnId":"",
               "returnNumber":0,		
           },
   		{
               "orderId":"202012200001",
               "goodsId":"3005",
               "goodsName":"香蕉#3005",
               "unit":"件",
               "specific":"10斤一箱",
               "linePrice":180,
               "salePrice":150,
               "costPrice":98,
               "number":6,
   			"isVoucher":1,
   			"voucherPrice":8,
   			"voucherId":"3dr55678hj",
   			"isDiscount":1,
   			"discountPrice":20,
   			"carriage": 0,
   			"receiver":"susu",
   			"phone":"18633567898",
   			"address":"深圳市南山区腾讯大厦20楼",
   			"createTime":"2020-12-20 10:00:00",
   			"payTime":"2020-12-20 11:00:00",
   			"payMethod":1, 
   			"payOrder":"202012201100003940",
   			"orderStatus":3,
   			"deliveryTime":"2020-12-21 11:00:00",
   			"finishTime":"2020-12-25 11:00:00",
   			"deliveryOrder":"ZT12345789d786",
   			"isReturn":1,
   			"returnId":"2020122600013",
               "returnNumber":3,		
           }
       ];
       
       return {"orderList":orderlist};
   };
  1. 单击【保存】,则成功创建了云函数

创建 ProcessOrder 函数

参考【创建 GetOrder 函数】的方式,创建 ProcessOrder 函数,代码如下:

'use strict';
exports.main_handler = async (event, context) => {
    console.log("this is processOrder function");
    var order = event;
    #数据处理
    var income = order["salePrice"]-order["costPrice"];
    var goodsInfo = {"goodsId":order["goodId"],"goodsName":order["goodsName"],"number":order["number"]};
    var incomeInfo = {"goodsId":order["goodId"],"goodsName":order["goodsName"],"number":order["number"],"income":income};
   return {
        "goodsInfo":goodsInfo,
        "incomeInfo":incomeInfo,
        "salesInfo":salesInfo
    };
}

创建 GoodsSold 函数

参考【创建 GetOrder 函数】的方式,创建 GoodsSold 函数,代码如下:

'use strict';
exports.main_handler = async (event, context) => {
    console.log("this is goodsSold function");
    //一些写入数据库或者图表展示操作
    console.log(event);
    return "GoodsSold success";
};

创建 Income 函数

参考【创建 GetOrder 函数】的方式,创建 Income 函数,代码如下:

'use strict';
exports.main_handler = async (event, context) => {
    console.log("this is income function");
    //一些写入数据库或者图表展示操作
    console.log(event);
    return "Income success";
};

创建 SalesReturn 函数

参考【创建 GetOrder 函数】的方式,创建 SalesReturn 函数,代码如下:

'use strict';
exports.main_handler = async (event, context) => {
    console.log("this is salesReturn function");
    //一些写入数据库或者图表展示操作
    console.log(event);
    return "SalesReturn success";
};

Step 2:创建工作流

  1. 登录 应用与编排服务流控制台
  2. 在状态机页面,单击【新建】,进入创建工作流页面中,选择使用【代码创建】:

d6f96a674e5f105e3c38ecaea01ebcf6.png

  1. 直接在代码编辑框中粘贴以下 TCSL 代码:
   {
     "Comment": "订单处理",
     "StartAt": "GetOrder",
     "States": {
       "GetOrder": {
         "Type": "Task",
         "Comment": "拉取数据",
         "Resource": "qrn:qcs:asw:ap-guangzhou:12345678:sdk:json:qcloud:scf:Invoke/GetOrder",
         "Next": "MapProcess"
       },
       "MapProcess": {
         "Type": "Map",
         "ItemsPath": "$.orderList",
         "MaxConcurrency": 6,
         "Iterator": {
           "StartAt": "ProcessOrder",
           "States": {
             "ProcessOrder": {
               "Type": "Task",
               "Resource": "qrn:qcs:asw:ap-guangzhou:12345678:sdk:json:qcloud:scf:Invoke/ProcessOrder",
               "Next": "ParallelDataProcess"
             },
             "ParallelDataProcess": {
               "Type": "Parallel",
               "End": true,
               "Branches": [
                 {
                   "StartAt": "GoodsSold",
                   "States": {
                     "GoodsSold": {
                       "InputPath": "$.goodsInfo",
                       "Type": "Task",
                       "Resource": "qrn:qcs:asw:ap-guangzhou:12345678:sdk:json:qcloud:scf:Invoke/GoodsSold",
                       "End": true
                     }
                   }
                 },
                 {
                   "StartAt": "Income",
                   "States": {
                     "Income": {
                       "InputPath": "$.incomeInfo",
                       "Type": "Task",
                       "Resource": "qrn:qcs:asw:ap-guangzhou:12345678:sdk:json:qcloud:scf:Invoke/Income",
                       "End": true
                     }
                   }
                 },
                 {
                   "StartAt": "SalesReturn",
                   "States": {
                     "SalesReturn": {
                       "InputPath": "$.salesInfo",
                       "Type": "Task",
                       "Resource": "qrn:qcs:asw:ap-guangzhou:12345678:sdk:json:qcloud:scf:Invoke/SalesReturn",
                       "End": true
                     }
                   }
                 }
               ]
             }
           }
         },
         "End": true
       }
     }
   }
  1. 单击右上角【下一步】,进入保存界面,输入状态机名称,运行角色选择【新建角色】,类型选择【标准状态机】,单击右上角【完成】,在状态机列表页可以看到创建好的状态机。

3178bc63ffb10fabf85f2fe35506acf1.png

使用已有角色需要先创建角色,并给角色授权相关策略,操作详情参考 运行角色

Step 3:运行状态机

状态机创建完成后,您可以在登录后的主页面查看创建好的状态机。

  1. 单击需要运行的状态机的【名称】,进入状态机。

7f883e833a57b7a64cb47f222448d3b7.png

  1. 您可以在界面中看到状态机的基本信息。单击【工作流执行】下的【开始执行】 。

66c0b73cd16ef3717001a4d08e313a5d.png

  1. 在弹出的“输入”窗口中,以 JSON 格式输入状态机需要的输入内容。例如:
{"comment": "invoke workflow"}
  1. 单击【确定】,完成状态执行后,可以在详情页查看执行结果:

8fa4fb697ca6f31a97d2bebbb725acf4.png

  1. 滑动至页面最下方,在【执行历史记录】条目下,您可以查看子节点的运行情况。

上述步骤介绍了一个订单数据处理场景的基本工作流流程。

真实的业务场景中每个 Task 节点会涉及配置一些相关参数信息,例如做参数传递、异常重试和错误捕获处理等,更多详情参考 状态机语言

申请试用 ASW

ASW 目前处于公测阶段,公测阶段免费提供服务。欢迎提出产品改进建议,反馈采纳后即可获得腾讯萌新短鹅公仔!

7453713b86498abeed1cf9c0e47a5c9d.jpg

反馈入口

立即申请公测,我们将会在 3 个工作日内完成审批,并通过短信和站内信通知您,感谢您的支持。


传送门:

欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK