本文介绍如何通过工作流 ASW 编排云函数,快速完成订单数据的处理。
工作原理
- 工作流调用函数获取一定时间段内的订单数据,对数据进行预处理。
- 将预处理的数据交给 Map 迭代任务处理:每个订单进行数据处理后,分别写到不同的数据库表中,或者绘制成图表展示。
操作步骤
创建工作流程需要首先创建一个状态机,通过编排状态机的不同元件,改变状态机结构,从而实现用户自定义的功能集合。
简单三步即可完成:创建云函数 → 创建工作流 → 运行状态机
Step 1:创建云函数
创建 GetOrder 函数
- 登录 云函数控制台,单击左侧导航栏的【函数服务】。
- 在主界面上方函数服务区域选择广州,并单击【新建】,进入函数创建流程。
- 在新建函数页面,基本信息中填写以下信息:
- 函数名称:GetOrder。
- 运行环境:Nodejs10.15。
- 创建方式:选择空白函数,单击【下一步】进入函数配置。
- 在函数配置页面中的 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};
};
- 单击【保存】,则成功创建了云函数
创建 ProcessOrder 函数
参考【创建 GetOrder 函数】的方式,创建 ProcessOrder 函数,代码如下:
代码语言:javascript复制'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 函数,代码如下:
代码语言:javascript复制'use strict';
exports.main_handler = async (event, context) => {
console.log("this is goodsSold function");
//一些写入数据库或者图表展示操作
console.log(event);
return "GoodsSold success";
};
创建 Income 函数
参考【创建 GetOrder 函数】的方式,创建 Income 函数,代码如下:
代码语言:javascript复制'use strict';
exports.main_handler = async (event, context) => {
console.log("this is income function");
//一些写入数据库或者图表展示操作
console.log(event);
return "Income success";
};
创建 SalesReturn 函数
参考【创建 GetOrder 函数】的方式,创建 SalesReturn 函数,代码如下:
代码语言:javascript复制'use strict';
exports.main_handler = async (event, context) => {
console.log("this is salesReturn function");
//一些写入数据库或者图表展示操作
console.log(event);
return "SalesReturn success";
};
Step 2:创建工作流
- 登录 应用与编排服务流控制台。
- 在状态机页面,单击【新建】,进入创建工作流页面中,选择使用【代码创建】:
- 直接在代码编辑框中粘贴以下 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
}
}
}
- 单击右上角【下一步】,进入保存界面,输入状态机名称,运行角色选择【新建角色】,类型选择【标准状态机】,单击右上角【完成】,在状态机列表页可以看到创建好的状态机。
使用已有角色需要先创建角色,并给角色授权相关策略,操作详情参考 运行角色。
Step 3:运行状态机
状态机创建完成后,您可以在登录后的主页面查看创建好的状态机。
- 单击需要运行的状态机的【名称】,进入状态机。
- 您可以在界面中看到状态机的基本信息。单击【工作流执行】下的【开始执行】 。
- 在弹出的“输入”窗口中,以 JSON 格式输入状态机需要的输入内容。例如:
{"comment": "invoke workflow"}
- 单击【确定】,完成状态执行后,可以在详情页查看执行结果:
- 滑动至页面最下方,在【执行历史记录】条目下,您可以查看子节点的运行情况。
上述步骤介绍了一个订单数据处理场景的基本工作流流程。
真实的业务场景中每个 Task 节点会涉及配置一些相关参数信息,例如做参数传递、异常重试和错误捕获处理等,更多详情参考 状态机语言。
申请试用 ASW
ASW 目前处于公测阶段,公测阶段免费提供服务。欢迎提出产品改进建议,反馈采纳后即可获得腾讯萌新短鹅公仔!
立即申请公测,我们将会在 3 个工作日内完成审批,并通过短信和站内信通知您,感谢您的支持。