Skip to content

Commit ba90d08

Browse files
authored
Merge pull request #56 from codingapi/dev
update script design
2 parents cc2d18d + 1facac4 commit ba90d08

5 files changed

Lines changed: 92 additions & 5 deletions

File tree

designs/groovy-script/DESiGN.md

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Groovy Script 脚本设计规范
22

3+
示例脚本
4+
```
5+
// @CUSTOM_SCRIPT
6+
// @SCRIPT_TITLE 这是一个示例脚本
7+
// @SCRIPT_META {name:"name"}
8+
def run(request){
9+
return "Hello, ${request.name}!"
10+
}
11+
```
12+
313
## 脚本的实例写法如下
414
```
515
def run(request){
@@ -9,7 +19,7 @@ def run(request){
919

1020
## 脚本规范
1121
request对象,根据脚本的不同,起传递的request对象也不同。
12-
return语句,return语句根据脚本的不同,起返回的对象也不同
22+
return语句,return语句根据脚本的不同,对应返回的对象也不同
1323

1424
## 开发规范
1525
为了让脚本可以更好的呈现和使用,脚本的配置分为两种模式,一种是可视化配置模式,一种是代码配置模式。
@@ -40,4 +50,16 @@ def run(request){
4050
return "Hello, ${request.name}!"
4151
}
4252
```
43-
上述的脚本在编辑器中就会以“这是一个示例脚本”来展示,而不是以代码的方式来展示。
53+
上述的脚本在编辑器中就会以“这是一个示例脚本”来展示,而不是以代码的方式来展示。
54+
55+
56+
## 脚本元数据
57+
在可视化呈现的过程中,界面不仅要能够解析脚本的标题,还需要可以正常的在可视化界面上呈现内容,为此通过@SCRIPT_META来标注界面展示的meta数据格式。
58+
meta的数据是json格式的数据。
59+
60+
```
61+
// @SCRIPT_META {name:"name"}
62+
def run(request){
63+
return "Hello, ${request.name}!"
64+
}
65+
```

frontend/packages/flow-pc/flow-pc-design/src/components/script/typings/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ export const CUSTOM_SCRIPT = '@CUSTOM_SCRIPT';
44
/** 脚本标题标记 */
55
export const SCRIPT_TITLE = '@SCRIPT_TITLE';
66

7+
8+
/** 脚本元数据标记 */
9+
export const SCRIPT_META = '@SCRIPT_META';
10+
711
/**
812
* Groovy脚本类型枚举
913
*/

frontend/packages/flow-pc/flow-pc-design/src/components/script/utils/convertor.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {CUSTOM_SCRIPT,SCRIPT_TITLE,GroovyVariableMapping} from "@/components/script/typings";
1+
import {CUSTOM_SCRIPT, SCRIPT_TITLE, GroovyVariableMapping, SCRIPT_META} from "@/components/script/typings";
22
import {GroovyFormatter} from "@/components/script/utils/format";
33

44
/**
@@ -64,6 +64,34 @@ export class GroovyScriptConvertorUtil {
6464
}
6565

6666

67+
/**
68+
* 获取脚本中的元数据
69+
* @param script
70+
*/
71+
public static getScriptMeta(script: string): string {
72+
const titleMatch = script.match(new RegExp(`//\\s*${SCRIPT_META}\\s*(.+)`));
73+
if (titleMatch) {
74+
return titleMatch[1].trim();
75+
}
76+
return '';
77+
}
78+
79+
80+
/**
81+
* 更新脚本中的元数据内容,如果不存在则添加
82+
* @param script
83+
* @param meta
84+
*/
85+
public static updateScriptMeta(script: string, meta: string): string {
86+
const metaComment = `// ${SCRIPT_META} ${meta}`;
87+
if (GroovyScriptConvertorUtil.getScriptTitle(script)) {
88+
return script.replace(new RegExp(`//\\s*${SCRIPT_META}\\s*.+`), metaComment);
89+
} else {
90+
return `${metaComment}\n${script}`;
91+
}
92+
}
93+
94+
6795
/**
6896
* 清除脚本中的注释
6997
* @param script

frontend/packages/flow-pc/flow-pc-design/tests/script/utils/convertor-node-title.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
import {
77
NodeTitleVariableAdapter
88
} from "@/components/script/services/variable/node-title";
9+
import {GroovyScriptConvertorUtil} from "@/components/script/utils/convertor";
910

1011
describe('NodeTitleGroovyConvertor', () => {
1112

@@ -38,6 +39,7 @@ describe('NodeTitleGroovyConvertor', () => {
3839
describe('toExpression', () => {
3940
it('node title script to expression', () => {
4041
const script = `
42+
// @SCRIPT_TITLE 您有一条待办消息\${当前操作人ID}\${当前操作人ID}\${流程创建人}\${是否管理员}
4143
def run(request){
4244
return "您有一条待办消息" + request.getOperatorId() + request.getOperatorId() + request.getCreatorName() + request.getIsFlowManager()
4345
}
@@ -59,7 +61,8 @@ def run(request){
5961
`
6062
const nodeTitleGroovyConvertor = new NodeTitleGroovyConvertor(script, nodeTitleVariableAdapter.getVariables());
6163
const result = nodeTitleGroovyConvertor.resetExpression('你有一条${当前操作人}的${流程标题}待办消息 【${当前节点}】')
62-
expect(result).toEqual(script);
64+
const title = GroovyScriptConvertorUtil.getScriptTitle(result);
65+
expect(title).toEqual("你有一条${当前操作人}的${流程标题}待办消息 【${当前节点}】");
6366
});
6467
});
6568
});

frontend/packages/flow-pc/flow-pc-design/tests/script/utils/convertor-utils.test.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {describe, expect, it} from '@rstest/core';
2-
import {GroovyScriptConvertorUtil} from "@/components/script/services/convertor/utils";
2+
import {GroovyScriptConvertorUtil} from "@/components/script/utils/convertor";
33

44
describe('GroovyScriptUtil', () => {
55

@@ -52,4 +52,34 @@ def run(request){
5252
expect(title).toEqual(`这就是一个实例的标题`);
5353
});
5454
});
55+
56+
57+
describe('getScriptMeta', () => {
58+
it('get groovy script meta', () => {
59+
const script = `
60+
// @SCRIPT_TITLE 这是一个实例的标题
61+
// @SCRIPT_META {name:"name"}
62+
def run(request){
63+
return "你有一条" + request.getOperatorName() + "的" + request.getWorkflowTitle() + "待办消息 【" + request.getNodeName() + "】"
64+
}`
65+
const result = GroovyScriptConvertorUtil.getScriptMeta(script)
66+
expect(result).toEqual(`{name:"name"}`);
67+
});
68+
});
69+
70+
71+
describe('updateScriptMeta', () => {
72+
it('update groovy script meta', () => {
73+
const script = `
74+
// @SCRIPT_TITLE 这是一个实例的标题
75+
// @SCRIPT_META {name:"name"}
76+
def run(request){
77+
return "你有一条" + request.getOperatorName() + "的" + request.getWorkflowTitle() + "待办消息 【" + request.getNodeName() + "】"
78+
}`
79+
const result = GroovyScriptConvertorUtil.updateScriptMeta(script,'{name:"test"}');
80+
console.log(result);
81+
const title = GroovyScriptConvertorUtil.getScriptMeta(result)
82+
expect(title).toEqual(`{name:"test"}`);
83+
});
84+
});
5585
});

0 commit comments

Comments
 (0)