# 动态逻辑
本系统支持使用 Groovy (opens new window) 语言进行客制化开发, Groovy 语 言是 Java 语言的一个超集,其支持 Java 语言的语法,但增加了更多动态特性,更加适用 于进行领域建模和运行时增强。
提示
如果团队对 Groovy 语言不熟悉,也可以完全使用 Java 语言的语法进行开发,Groovy 与 Java 语言的兼容性非常好。
# 目标读者
本文档的目标读者为:本系统的开发和实施人员
# 动态逻辑定义的结构
动态逻辑可以通过菜单 开发定制
-> 动态逻辑
-> 动态逻辑
进行维护,其包含的相
关属性如下图所示:
针对相关字段,详述如下
# 动态逻辑引擎概述
系统提供了一个动态逻辑引擎,用于在系统中执行动态逻辑,动态逻辑可以是一段 Groovy 代码,也可以是一个外部的操作系统命令,也可以是一个大语言模型的调用等。
动态逻辑引擎 | 描述 | preLogic | DynamicPrompt | postLogic |
---|---|---|---|---|
JASPER_REPORT | 用于渲染 Jasper 报表到 PDF 文件 | 支持 | 不适用 | 支持 |
LLM_ENGINE | 用于请求大语言模型 | 支持 | 支持 | 支持 |
RENDER_LINK | GROOVY_CODE 的别名, 返回一个链接给调用方 | 支持 | 不适用 | 支持 |
OS_COMMAND | 用于执行操作系统命令 | 支持 | 支持 | 支持 |
GROOVY_CODE | 用于执行 Groovy 代码 | 支持 | 不适用 | 支持 |
提示
动态逻辑相关各对象的 name 字段在创建后,即不可修改。
# 动态逻辑开发指南
# 动态逻辑概述
动态逻辑是一种灵活的业务逻辑实现方式,允许开发者根据业务需求定义前处理逻辑、后处理逻辑和 Prompt 模板。通过动态逻辑,您可以轻松实现业务流程的定制化和自动化,提高业务处理的灵活性和效率。
# 定义动态逻辑
在定义动态逻辑时,您需要关注以下几个方面:
- 前处理逻辑 (preLogic): 在主要业务逻辑执行之前进行的逻辑,用于准备数据或进行预处理。
- 后处理逻辑 (postLogic): 在主要业务逻辑执行之后进行的逻辑,用于对结果进行处理或进行后续操作。
- DynamicPrompt 模板: 用于生成动态内容的模板,可以根据前处理逻辑的结果动态渲染。
# 参数传递和结果处理
在动态逻辑的执行过程中,请注意以下几点:
- 前处理结果传递: 前处理逻辑的结果将被传递给后续的 Prompt 渲染和主要业务逻辑,以及后处理逻辑。
- Prompt 渲染: Prompt 模板将根据前处理逻辑的结果和其他输入参数进行渲染,生成动态内容。
- 后处理逻辑参数: 后处理逻辑将接收主要业务逻辑的结果以及其他必要的参数,进行结果处理。
- 返回结果: 最终,动态逻辑的执行结果将被返回给调用者,用于后续的业务流程或展示。
# postLogic 中获取前续处理结果
对于 AI 类型的 DynamicLogic,从 LLM 引擎获取回复后,在 postLogic 后处理逻辑中,可以使用如下的代码,获取 LLM 引擎的回复文本。
// 对于 AI 类型的 DynamicLogic,从 LLM 引擎获取回复后,在 postLogic 后处理逻辑中,可以使用如下的代码,获取 LLM 引擎的回复文本。
// For AI type DynamicLogic, after getting the reply from LLM engine, you can use the following code in the postLogic to get the reply text from LLM engine.
String llmOutput = ((previousLogicResult as Map).get('result') as String)
2
# 实际应用示例
以下是一些具体的业务场景和动态逻辑定义示例:
# 客户信用额度自动调整
业务场景:根据客户的历史交易记录和付款情况,自动调整客户的信用额度。
动态逻辑定义:
- 前处理逻辑(preLogic):查询客户的历史交易记录、付款及逾期情况。
- DynamicPrompt:根据查询结果,生成信用额度调整建议。
- 后处理逻辑(postLogic):根据建议更新客户信用额度,并发送通知。
# 智能工单分配
业务场景:根据工单内容和技术人员的专业领域,自动分配工单。
动态逻辑定义:
- 前处理逻辑:提取工单关键信息,查询可用技术人员及其专业领域。
- DynamicPrompt:根据工单信息和技术人员专业,生成最佳匹配建议。
- 后处理逻辑:执行工单分配,更新系统状态,并通知相关人员。
# 动态定价策略
业务场景:根据市场需求、库存情况和竞争对手价格,动态调整产品价格。
动态逻辑定义:
- 前处理逻辑:收集市场数据、库存信息和竞争对手价格。
- DynamicPrompt:分析数据并生成价格调整建议。
- 后处理逻辑:更新产品价格,同步到销售系统,并通知相关部门。
这些示例展示了动态逻辑如何在不同的业务场景中应用,通过灵活的前处理、DynamicPrompt 和后处理逻辑,实现业务流程的智能化和自动化。
以上指南旨在帮助开发者更好地理解和实现动态逻辑,以满足不同业务场景的需求。在实际 应用中,根据具体的业务需求来定制和优化动态逻辑,可以实现业务流程的灵活性和自动化。
# 动态逻辑类型
以下列出了系统中当前支持的客制化逻辑的类型及其使用场景:
- 库函数:供其他客制化逻辑调用的函数。
- 动态权限:对象的动态创建权限判断、删除和更新权限判断。
- 表单及字段客制化:表单的字段间联动、下拉选项,字段的隐藏与显示等。
- 对象生命周期客制化:对象创建、修改、删除、被访问前后的客制化逻辑注入。
- 动态动作:动态动作的启用逻辑和核心逻辑。
- 定时任务:定时任务的启用逻辑和核心逻辑。
- 仪表盘:仪表盘和小组件的启用逻辑及核心逻辑。
- 过滤器:过滤器的启用逻辑和过滤条件配置。
- 动态服务:动态服务核心逻辑。
- 动态集成:动态集成启用逻辑和核心逻辑。
以下分别对动态逻辑在不同业务场景下的应用进行了详细说明:
# 自定义函数 0.30.0+
自定义函数是由用户自己定义的一段动态逻辑,它可以被其他动态逻辑直接调用。
# 函数调用示例
我们首先需要定义一个名为 Test function
的 Function logic
类型的 DynamicLogic
可以看到我们的逻辑是 a + b
, 这里的 a
和 b
都是调用时需要传入的参数。
接下来我们可以在任意的 DynamicLogic 中调用该函数,下面以一个 DynamicAction 的 CoreLogic 举例子
可以看到左侧出现了我们刚才定义的 Test function
1,点击后右侧代码编辑面板即可出现调用该函数的代码2。其中的 params
为 Map 类型的参数列表,具体调用的代码为
import tech.muyan.utils.BeanContainer
import tech.muyan.api.DynamicFunctionService
// 定义一个 Map 类型的参数列表
Map<String, Object> params = new HashMap<>()
params.put("a", 1)
params.put("b", 2)
// 调用我们刚才定义的函数
// 第一个参数为 DynamicLogic 的名称,第二个参数为调用时传入的参数, 类型为 Map
// 静态方法调用,DynamicFunctionService 是平台内部类,故在 idea 中会找不到该类的定义,但在运行时工作正常
tech.muyan.function.DynamicFunctionService.invoke("Test function", params)
// 或者采用 bean 方式调用
BeanContainer.getBean(DynamicFunctionService.class).invoke("TaskAssignmentLogic", params)
2
3
4
5
6
7
8
9
10
11
12
在这里我们改成如下内容:
可以看到我们传入了 a
和 b
分别为 1
和 2
,接下来我们测试执行该逻辑(DynamicAction CoreLogic 具体的调用方式请参考 Dynamic Action 一节)可以看到返回结果如下
注意
被调用的 Dynamic Logic 的 Logic Type 必须为 Function logic
才能被其他 Dynamic
Logic 用以上方式调用,否则系统会报错: ErrorCode: 15001, ErrorMsg: FunctionNotFound
。