2020-09-02 18:35:03 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* context 上下文便捷操作函数
|
|
|
|
|
|
*
|
|
|
|
|
|
*/
|
|
|
|
|
|
var common = {
|
|
|
|
|
|
/* *********** private function begin *********** */
|
|
|
|
|
|
|
2021-03-30 11:52:12 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 获取上下文中客户端请求对象
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
*/
|
2020-09-02 18:35:03 +08:00
|
|
|
|
getInputReq: function (ctx){
|
|
|
|
|
|
if(!ctx || !ctx['input'] || !ctx['input']['request']){
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
return ctx['input']['request']
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2021-03-30 11:52:12 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 获取上下文步骤中请求接口的请求对象
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名称 【必填】
|
|
|
|
|
|
* @param {*} requestName 请求名称 【必填】
|
|
|
|
|
|
*/
|
2020-09-02 18:35:03 +08:00
|
|
|
|
getStepReq: function (ctx, stepName, requestName){
|
|
|
|
|
|
if(!ctx || !stepName || !requestName){
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
if(!ctx[stepName] || !ctx[stepName]['requests'] || !ctx[stepName]['requests'][requestName] ||
|
|
|
|
|
|
!ctx[stepName]['requests'][requestName]['request']){
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
return ctx[stepName]['requests'][requestName]['request'];
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2021-03-30 11:52:12 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 获取上下文步骤中请求接口的响应对象
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名称 【必填】
|
|
|
|
|
|
* @param {*} requestName 请求名称 【必填】
|
|
|
|
|
|
*/
|
2020-09-02 18:35:03 +08:00
|
|
|
|
getStepResp: function (ctx, stepName, requestName){
|
|
|
|
|
|
if(!ctx || !stepName || !requestName){
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
if(!ctx[stepName] || !ctx[stepName]['requests'] || !ctx[stepName]['requests'][requestName] ||
|
|
|
|
|
|
!ctx[stepName]['requests'][requestName]['response']){
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
return ctx[stepName]['requests'][requestName]['response'];
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/* *********** private function end *********** */
|
|
|
|
|
|
|
|
|
|
|
|
/* *********** input begin ************ */
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取客户端请求头
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头
|
|
|
|
|
|
*/
|
|
|
|
|
|
getInputReqHeader: function (ctx, headerName){
|
|
|
|
|
|
var req = this.getInputReq(ctx);
|
|
|
|
|
|
var headers = req['headers'] || {};
|
2021-03-30 11:52:12 +08:00
|
|
|
|
return headerName ? headers[headerName.toUpperCase()] : headers;
|
2020-09-02 18:35:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取客户端URL请求参数(query string)
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} paramName URL参数名 【选填】,不传时返回所有请求参数
|
|
|
|
|
|
*/
|
|
|
|
|
|
getInputReqParam: function (ctx, paramName){
|
|
|
|
|
|
var req = this.getInputReq(ctx);
|
|
|
|
|
|
var params = req['params'] || {};
|
|
|
|
|
|
return paramName ? params[paramName] : params;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取客户端请求体
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} field 字段名 【选填】,不传时返回整个请求体
|
|
|
|
|
|
*/
|
|
|
|
|
|
getInputReqBody: function (ctx, field){
|
|
|
|
|
|
var req = this.getInputReq(ctx);
|
|
|
|
|
|
var body = req['body'] || {};
|
|
|
|
|
|
return field ? body[field] : body;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取返回给客户端的响应头
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头
|
|
|
|
|
|
*/
|
|
|
|
|
|
getInputRespHeader: function (ctx, headerName){
|
|
|
|
|
|
var req = this.getInputReq(ctx);
|
|
|
|
|
|
var headers = req['headers'] || {};
|
2021-03-30 11:52:12 +08:00
|
|
|
|
return headerName ? headers[headerName.toUpperCase()] : headers;
|
2020-09-02 18:35:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取返回给客户端的响应体
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} field 字段名 【选填】,不传时返回整个响应体
|
|
|
|
|
|
*/
|
|
|
|
|
|
getInputRespBody: function (ctx, field){
|
|
|
|
|
|
var req = this.getInputReq(ctx);
|
|
|
|
|
|
var body = req['body'] || {};
|
|
|
|
|
|
return field ? body[field] : body;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/* *********** input begin ************ */
|
|
|
|
|
|
|
|
|
|
|
|
/* *********** step request begin ************ */
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取步骤中调用的接口的请求头
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名【必填】
|
|
|
|
|
|
* @param {*} requestName 请求的接口名 【必填】
|
|
|
|
|
|
* @param {*} headerName 请求头字段名 【选填】,不传时返回所有请求头
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStepReqHeader: function (ctx, stepName, requestName, headerName){
|
|
|
|
|
|
var req = this.getStepReq(ctx, stepName, requestName);
|
|
|
|
|
|
var headers = req['headers'] || {};
|
2021-03-30 11:52:12 +08:00
|
|
|
|
return headerName ? headers[headerName.toUpperCase()] : headers;
|
2020-09-02 18:35:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取步骤中调用的接口的URL参数
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名【必填】
|
|
|
|
|
|
* @param {*} requestName 请求的接口名 【必填】
|
|
|
|
|
|
* @param {*} paramName URL参数名 【选填】,不传时返回所有URL参数
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStepReqParam: function (ctx, stepName, requestName, paramName){
|
|
|
|
|
|
var req = this.getStepReq(ctx, stepName, requestName);
|
|
|
|
|
|
var params = req['params'] || {};
|
|
|
|
|
|
return paramName ? params[paramName] : params;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取步骤中调用的接口的请求体
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名【必填】
|
|
|
|
|
|
* @param {*} requestName 请求的接口名 【必填】
|
|
|
|
|
|
* @param {*} field 字段名 【选填】,不传时返回整个请求体
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStepReqBody: function (ctx, stepName, requestName, field){
|
|
|
|
|
|
var req = this.getStepReq(ctx, stepName, requestName);
|
|
|
|
|
|
var body = req['body'] || {};
|
|
|
|
|
|
return field ? body[field] : body;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取步骤中调用的接口的响应头
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名【必填】
|
|
|
|
|
|
* @param {*} requestName 请求的接口名 【必填】
|
|
|
|
|
|
* @param {*} headerName 响应头字段名 【选填】,不传时返回所有响应头
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStepRespHeader: function (ctx, stepName, requestName, headerName){
|
|
|
|
|
|
var resp = this.getStepResp(ctx, stepName, requestName);
|
|
|
|
|
|
var headers = resp['headers'] || {};
|
2021-03-30 11:52:12 +08:00
|
|
|
|
return headerName ? headers[headerName.toUpperCase()] : headers;
|
2020-09-02 18:35:03 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取步骤中调用的接口的响应头
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名【必填】
|
|
|
|
|
|
* @param {*} requestName 请求的接口名 【必填】
|
|
|
|
|
|
* @param {*} field 字段名 【选填】,不传时返回整个响应头
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStepRespBody: function (ctx, stepName, requestName, field){
|
|
|
|
|
|
var resp = this.getStepResp(ctx, stepName, requestName);
|
|
|
|
|
|
var body = resp['body'] || {};
|
|
|
|
|
|
return field ? body[field] : body;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取步骤结果
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名【必填】
|
|
|
|
|
|
* @param {*} field 字段名 【选填】,不传时返回整个步骤结果对象
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStepResult: function (ctx, stepName, field){
|
|
|
|
|
|
if(!ctx || !stepName || !ctx[stepName]){
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
var result = ctx[stepName]['result'] || {};
|
|
|
|
|
|
return field ? result[field] : result;
|
2021-07-16 17:24:51 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取步骤循环结果
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名【必填】
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStepCircle: function (ctx, stepName){
|
|
|
|
|
|
if(!ctx || !stepName || !ctx[stepName]){
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 返回循环结果数组
|
|
|
|
|
|
return ctx[stepName]['circle'];
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取请求的循环结果
|
|
|
|
|
|
* @param {*} ctx 上下文 【必填】
|
|
|
|
|
|
* @param {*} stepName 步骤名【必填】
|
|
|
|
|
|
*/
|
|
|
|
|
|
getRequestCircle: function (ctx, stepName, requestName){
|
|
|
|
|
|
if(!ctx || !stepName || !requestName){
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(!ctx[stepName] || !ctx[stepName]['requests'] || !ctx[stepName]['requests'][requestName] ||
|
|
|
|
|
|
!ctx[stepName]['requests'][requestName]['request']){
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 返回循环结果数组
|
|
|
|
|
|
return ctx[stepName]['requests'][requestName]['circle'];
|
2020-09-02 18:35:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* *********** step request end ************ */
|
|
|
|
|
|
|
|
|
|
|
|
,/**
|
|
|
|
|
|
** 乘法函数,用来得到精确的乘法结果
|
|
|
|
|
|
** 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
|
|
|
|
|
|
** 调用:accMul(arg1,arg2)
|
|
|
|
|
|
** 返回值:arg1乘以 arg2的精确结果
|
|
|
|
|
|
**/
|
|
|
|
|
|
accMul:function (arg1, arg2) {
|
|
|
|
|
|
var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
|
|
|
|
|
|
try {
|
|
|
|
|
|
m += s1.split(".")[1].length;
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
|
|
|
m += s2.split(".")[1].length;
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
}
|
|
|
|
|
|
return Number(s1.replace(".", "")) * Number(s2.replace(".", ""))
|
|
|
|
|
|
/ Math.pow(10, m);
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
** 除法函数,用来得到精确的除法结果
|
|
|
|
|
|
** 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
|
|
|
|
|
|
** 调用:accDiv(arg1,arg2)
|
|
|
|
|
|
** 返回值:arg1除以arg2的精确结果
|
|
|
|
|
|
**/
|
|
|
|
|
|
accDiv:function (arg1, arg2) {
|
|
|
|
|
|
var t1 = 0, t2 = 0, r1, r2;
|
|
|
|
|
|
try {
|
|
|
|
|
|
t1 = arg1.toString().split(".")[1].length;
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
|
|
|
t2 = arg2.toString().split(".")[1].length;
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
}
|
|
|
|
|
|
with (Math) {
|
|
|
|
|
|
r1 = Number(arg1.toString().replace(".", ""));
|
|
|
|
|
|
r2 = Number(arg2.toString().replace(".", ""));
|
|
|
|
|
|
return (r1 / r2) * pow(10, t2 - t1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|