# 初始化

在前面的章节我们已经小试牛刀,实现了onInstanceStarting事件,不过只是打印了一句Start!,现在让我们实际做一些有意义的事吧。

# 初始数据

一般我们在INSTANCE_STARTING事件中会初始化一些表单数据,当然有些字段的初始数据也可以用字段配置初始值来实现,但是当我们需要从业务系统中获取一些数据填充表单时简单的初始值配置就满足不了需求了。

作为演示,这里我们只是简单设置一下请假类型的初始值为事假。为了实现这一点,我们首先要建立表单对象。我们可以点下图中的java链接自动获取表单对象,如果您已经设置好了所有字段的数据类型后就可以进行了,如果字段的描述信息也配置了,那么这将出现在自动产生的表单对象上。

点击链接后的页面中会有请假流程的2个表单对象类,我们把内容复制下来建立这2个类即可。

/** 请假主表单对象 */
public class Leave
{
	/** 申请人 */
	private InfoPlusUser applicant;
	public InfoPlusUser getApplicant() {
		return this.applicant;
	}
	public void setApplicant(InfoPlusUser applicant) {
		this.applicant = applicant;
	}
	/** 请假开始日期 */
	private Date beginDate;
	public Date getBeginDate() {
		return this.beginDate;
	}
	public void setBeginDate(Date beginDate) {
		this.beginDate = beginDate;
	}
	/** 请假结束日期 */
	private Date endDate;
	public Date getEndDate() {
		return this.endDate;
	}
	public void setEndDate(Date endDate) {
		this.endDate = endDate;
	}
	/** 请假事由 */
	private String reason;
	public String getReason() {
		return this.reason;
	}
	public void setReason(String reason) {
		this.reason = reason;
	}
	/** 请假类型 */
	private CodeItem type;
	public CodeItem getType() {
		return this.type;
	}
	public void setType(CodeItem type) {
		this.type = type;
	}

	private List<LeaveTrip> trip;
	public List<LeaveTrip> getTrip() {
		return this.trip;
	}
	public void setTrip(List<LeaveTrip> trip) {
		this.trip = trip;
	}
}

/** 出差行程对象 */
public class LeaveTrip
{
	/** 行程日期 */
	private Date tripDate;
	public Date getTripDate() {
		return this.tripDate;
	}
	public void setTripDate(Date tripDate) {
		this.tripDate = tripDate;
	}
	/** 行程简述 */
	private String tripDescription;
	public String getTripDescription() {
		return this.tripDescription;
	}
	public void setTripDescription(String tripDescription) {
		this.tripDescription = tripDescription;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

现在我们需要将请假类型设为事假了,请假类型字段是Code类型,配置的是一个内部代码表example_leave_type

我们到代码表 (opens new window)页面里找到这个内部代码example_leave_type (opens new window),其中事假的代码是01,那么我们就需要在starting事件中把这个代码值赋到表单对象上去。

完整的starting事件代码

public class QuickStartMessenger  extends AbstractMessenger  {
    @Override
    public InfoPlusResponse onInstanceStarting(InfoPlusEvent e) {
        System.out.println("start!");
        Leave form = e.toBean(Leave.class);
        form.setType(new CodeItemImpl("01","事假"));
        return new InfoPlusResponse(e, form);
    }
}
1
2
3
4
5
6
7
8
9

从以上代码可以看到InfoPlusEvent上有一个重要方法toBean,这个方法可以将事件对象中包含的数据转化成表单对象。

Leave form = e.toBean(Leave.class);
1

表单对象上对字段赋值比较好理解,我们new了一个代码值为01的CodeItem对象,并将之赋给type字段。这里有个地方需要注意,我们的SDK里只有CodeItem接口,开发者需实现这个接口,我们的案例项目中有2个版本的实现,开发者也可以自行复制(精简版 (opens new window)完整版 (opens new window))。

form.setType(new CodeItemImpl("01","事假"));
1

事件的最后返回了一个InfoPlusResponse,这个用InfoPlusEvent对象以及我们的表单对象为参数构造,返回后表单上就会显示初值事假了。

return new InfoPlusResponse(e, form);
1

# 发起参数

有时候需求是要产生几个发起请假流程的链接,有的链接发起后类型初始值是事假,有的链接发起后类型初始值是病假,那该如何实现呢?

首先看一下发起链接是什么,我们在IDE里右键点击图中的红色虫子按钮复制链接地址

可以看到发起链接是https://form.sjtu.edu.cn/infoplus/form/b3e4cd5d-4e1b-11ee-b107-fa163e3336bd/start?release=false&entrust=true ,其中路径中的id是这个流程的版本,其实可以用流程代码infoplus_example_quick_start替换,entrust=true表示需要模拟调试,release=false表示发起一个测试实例,我们在交我办大厅里的实际链接其实就是https://form.sjtu.edu.cn/infoplus/form/infoplus_example_quick_start/start?release=true。当然现在这个案例流程并没有正式上线所以release参数应该还是false,现在在此基础上再加上一个type参数,那么现在链接是https://form.sjtu.edu.cn/infoplus/form/infoplus_example_quick_start/start?release=false&type=02,这个链接其实就是想发起后表单的初始值是类型代码为02的病假。为了处理这个查询参数type,我们需要在starting事件里处理一下。

public class QuickStartMessenger  extends AbstractMessenger  {
    @Override
    public InfoPlusResponse onInstanceStarting(InfoPlusEvent e) {
        System.out.println("start!");
        Leave form = e.toBean(Leave.class);
        if (StringUtils.isNotEmpty(e.getCustomUrlParameter("type"))) {
            form.setType(new CodeItemImpl(e.getCustomUrlParameter("type"), ""));
        } else {
            form.setType(new CodeItemImpl("01", "事假"));
        }
        return new InfoPlusResponse(e, form);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

InfoPlusEvent对象上有一个getCustomUrlParameter方法获取查询参数,我们将获取的参数构造type字段

form.setType(new CodeItemImpl(e.getCustomUrlParameter("type"),""));
1

也许你会奇怪为什么这里构造CodeItem的时候只需要code参数,不需要name参数,那是因为example_leave_type是一个内部代码,平台处理Messenger传回的数据时会根据设定的内部代码补全这个代码名称。现在用带着type=02的发起链接发起新流程后会看到请假类型已经初始化为病假。

# 案例地址

download 流程链接
download 主表单模版
download Messenger代码