# 外部代码表

为了在流程表单中使用外部代码表,首先要在IDE中新建外部代码表,然后在字段配置CodeTable中选择这个外部代码表。表单运行时流程引擎服务器会向流程messenger发送FIELD_SUGGESTING事件请求数据,messenger有三种方式可以返回外部代码表数据,以下将举例说明,同时您也可参考外部代码表实现

# 非共享外部代码表

当代码表仅在单个流程中使用的,可通过非共享外部代码表的方式注册到流程messenger上,返回非共享外部代码表数据需要重载getSuggestionData方法来实现

示例 非共享外部代码表
<bean id="sampleMessenger" class="edu.sjtu.messengers.SampleMessenger">
    <property name="workflow" value="test_workflow"/>
    <property name="secret" value="2ec811b"/>
    <!--
       缓存时间(毫秒),缺省3600000,最小60000
    -->
    <property name="timeout" value="600000"/>
    <!--
        注册所有本流程用到的外部代码表
    -->
    <property name="codeTables">
        <list>
            <value>code_table_id</value>
        </list>
    </property>
</bean>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

public class SampleMessenger extends AbstractMessenger {

    @Override
    protected List<? extends CodeItem> getSuggestionData(String code) {
        if ("code_table_id".equals(code)) {
            List<CodeItemImpl> result = new ArrayList<>();
            result.add(new CodeItemImpl("code3", "name3"));
            result.add(new CodeItemImpl("code4", "name4"));
            return result;
        }
        return super.getSuggestionData(code);
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 共享外部代码表

如果一个代码表被多个流程共用,那么可以通过注册共享外部代码表的方式来实现,在代码上要实现CachableDataBuilder<String, List<? extend CodeItem>>接口的类

<bean id="application" class="edu.sjtu.infoplus.applicationToolkit.InfoPlusApplication" factory-method="defaultApplication">
    <property name="service" ref="infoPlusService"/>
    <property name="domain" value="sjtu.edu.cn"/>
    <property name="messengers">
        <list>
            <ref bean="sampleMessenger"/>
        </list>
    </property>
    <!--
        定义共享外部代码表的Builder
    -->
    <property name="sharedCodeTableBuilders">
        <list>
            <bean class="edu.sjtu.messengers.codeTables.SampleSharedCodeTableBuilder"/>
        </list>
    </property>
</bean>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SampleSharedCodeTableBuilder implements CachableDataBuilder<String, List<? extends CodeItem>> {

    // 缓存时间
    @Override
    public long getTimeoutMillis() {
        return 86400000;
    }

    // 代码表code
    @Override
    public String getKey() {
        return "shared_code_table_id";
    }

    @Override
    public List<? extends CodeItem> buildCachableData() {
        List<CodeItemImpl> result = new ArrayList<>();
        result.add(new CodeItemImpl("code1", "name1"));
        result.add(new CodeItemImpl("code2", "name2"));
        return result;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 重载onFieldSuggesting方法

如果SDK设计的外部代码表方法无法满足实际需求,比如数据全集过于庞大,可以重载onFieldSuggesting方法来提供自己的实现,此种方式比较复杂不推荐使用故不举例说明。