# weaver-e9-second-dev-extend
**Repository Path**: yaolilin/weaver-e9-second-dev-extend
## Basic Information
- **Project Name**: weaver-e9-second-dev-extend
- **Description**: 这是一个针对泛微 E9 二次开发的增强套件,针对二次开发提供了一些增强和便捷功能
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-03-23
- **Last Updated**: 2026-03-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#
泛微 E9 二次开发扩展
Second-dev `Extend`
这是一个针对泛微 E9 二次开发的增强套件,针对二次开发提供了一些增强和便捷功能。
注意:这些功能尚属于试验性功能,还未得到充分验证,我还在持续完善,敬请期待
## 如何使用
### 后端部署
有两种方式:
1. 将本项目中的 `weaver-seconddev-extend-1.0.0.jar` 部署到服务器中的 `ecology/WEB-INF/lib` 目录下,重启服务器后即可使用
2. 下载本项目源码,将本项目打成 jar 包后部署到服务器中的 `ecology/WEB-INF/lib` 目录下,重启服务器后即可使用
此外还需要引入一个公共类库的依赖,需下载此依赖的 jar 包,并部署到服务器中的 `ecology/WEB-INF/lib` 目录下,依赖地址:
请查看本人的另一个项目 `weaver-e9-common`, https://gitee.com/yaolilin/weaver-e9-common
### 前端部署
将本项目下的 ecode 文件夹中的 ecode 应用(格式为zip)导入到系统中的 ecode 中,并发布
## 功能说明
### 流程 Action 参数增强
- 可自动获取流程 Action 接口的参数,无需手动添加
- 新增是否必填、描述、默认值信息,便于查看参数信息,在后端中需要配合 `@ActionParam` 注解使用

#### 如何使用
在代码中需要使用 `@ActionParam` 注解来标注参数,不使用该注解在前端中也能自动获取到该参数,
只是会缺乏注解中的一些信息,示例如下:
```java
public class TestAction3 extends AbstractWorkflowAction {
/**
* 传入参数,使用 @ActionParam 进行必填校验
*/
@ActionParam(required = true,displayName = "参数1",desc = "测试参数")
private String param1;
@NotNull
@Override
protected ActionResult doExecute(RequestInfo requestInfo) {
return new ActionResult(true, "成功");
}
}
```
### 流程 Action 高级参数配置
一个类似于 E10 动作流的参数配置,支持 JSON 结构化参数和自定义赋值,后端中可与流程字段解藕,即字段值获取由前端配置,而不是
写死在后端中,特别适合在后端中调用接口,接口参数取流程表单字段值的场景
- 以 JSON 格式定义参数,支持更复杂的参数结构
- 可在后端中将参数转为 java 对象
- 可对参数进行自定义赋值,参数可取表单字段值、流程系统变量以及固定值
- 可获取明细数据,并根据参数类型转化为数组
- 参数由后端定义,前端自动获取参数,前端只需配置参数赋值
- 支持参数必填校验


#### 如何使用
在后端中 Action 创建时需要继承 `AbstractExtendWorkflowAction` 类,并实现方法,该类的范型参数为 Action 传入的
参数类型。
你需要实现 `getActionId()` 方法,来获取 Action 的标识,该标识为流程后端 Action 配置中的接口动作标识,
你可以在当前 Action 中添加参数来获取 Action 标识,就能在流程 Action 配置中将 Action 标识填写到该参数,比如:
```java
@ActionParam(required = true, desc = "Action 标识")
private String actionId;
```
你需要实现 `getParamType()` 方法,来获取 Action 参数的类型,该类型与 `AbstractExtendWorkflowAction` 的范型参数一致,
以便于后端将 JSON 参数转化为 Java 对象。
Action 示例如下:
```java
public class TestAction extends AbstractExtendWorkflowAction {
@ActionParam(required = true, desc = "Action 标识")
private String actionId;
@Override
protected ActionResult doExecute(RequestInfo requestInfo, TestActionParam param) {
if (param == null) {
return new ActionResult(false, "参数为空");
}
return new ActionResult(true);
}
@Override
protected String getActionId() {
return actionId;
}
@Override
public Class getParamType() {
return TestActionParam.class;
}
}
```
**参数对象说明:**
参数对象可作为参数传入 Action 中,对象属性的值会根据前端配置的赋值生成,参数属性可使用 `@ActionParam` 注解标注,来描述参数信息
,支持嵌套对象,参数属性除了支持基本类型外,还支持支持 List 、 Map 参数类型,在前端中将会根据参数类的结构显示参数配置
```java
@Data
public class TestActionParam {
@ActionParam(displayName = "名称",desc = "名称",required = true)
private String name;
@ActionParam(displayName = "数量",desc = "数量",defaultValue = "1")
private Integer num = 1;
@ActionParam(displayName = "用户id列表",desc = "用户id列表")
private List userIds;
@ActionParam(desc = "文档列表")
private List docs;
@ActionParam(desc = "数据")
private InnerObj data;
@ActionParam(desc = "数据列表")
private List dataList;
private String id;
@Data
public static class InnerObj {
private String prOrder;
}
}
```
### 接口管理
接口管理可配置多个接口信息,包括请求路径和请求参数,还可配置请求参数的赋值,便于在后端中调用接口并生成请求参数,采用参数赋值解藕设计,表单字段
值在前端配置,后端无须关心是取哪个接口。
**接口信息配置:**
- 可配置接口路径、请求方法、请求参数等信息
**接口参数映射:**
- 可配置接口参数的赋值,可取流程或建模字段的值
- 可通过后端调用生成接口参数



#### 后端生成接口参数
在前端配置好接口参数映射之后,可在后端传入流程请求id或建模数据id,生成接口请求参数。
后端调用示例:
```java
void generateParamsByConfId_actualTest() {
TestUtil.setLocalServer();
ApiParamGenerator paramGenerator = ApiParamGeneratorImpl.instance();
// 传入接口参数映射配置标识与请求id,生成接口参数,接口参数值将会根据前端配置的参数赋值规则生成
Optional paramOp = paramGenerator.generateParamsByConfId("test", 684684);
ApiParamObject apiParamObject = paramOp.get();
System.out.println("header:"+apiParamObject.getHeader());
System.out.println("body:"+new JSONObject(apiParamObject.getBody()));
}
```
输出:
```
header:{test=2026-01-08, name=项目1, id=1}
body:{"data":{"number":"1,2,3,4","name":"供应商xx","id":684684,"detail":[{"num":"1"},{"num":"2"},{"num":"3"},{"num":"4"}],"done":false}}
```