33 分钟以前 8f3bf7050e65fdbe55eaad74fde307c57dab960e
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
package cn.iocoder.yudao.module.bpm.framework.flowable.core.util;
 
import cn.iocoder.yudao.framework.common.core.KeyValue;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
import org.junit.jupiter.api.Test;
 
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
 
/**
 * {@link FlowableUtils} 的单元测试。
 *
 * @author 芋道源码
 */
class FlowableUtilsTest {
 
    @Test
    public void testGetSummary_customSummary_parseDbFormFields() {
        // 准备参数:模拟 DB 中 form_fields 字段,列表里每个元素都是一个 form-create 字段 JSON。
        BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionInfo(dbFormFields(),
                summarySetting(true, "reason", "days", "notExists", "startTime"));
        Map<String, Object> processVariables = processVariables();
 
        // 调用
        List<KeyValue<String, String>> summary = FlowableUtils.getSummary(processDefinitionInfo, processVariables);
 
        // 断言
        assertEquals(Arrays.asList(
                new KeyValue<>("请假原因", "事假"),
                new KeyValue<>("请假天数", "3"),
                new KeyValue<>("开始时间", "2026-05-31 09:00:00")),
                summary);
    }
 
    @Test
    public void testGetSummary_defaultSummary_parseFirstThreeFieldsByFormOrder() {
        // 准备参数:未开启自定义摘要时,默认取表单配置顺序里的前三个真实字段。
        BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionInfo(dbFormFields(), null);
        Map<String, Object> processVariables = processVariables();
 
        // 调用
        List<KeyValue<String, String>> summary = FlowableUtils.getSummary(processDefinitionInfo, processVariables);
 
        // 断言
        assertEquals(Arrays.asList(
                new KeyValue<>("请假原因", "事假"),
                new KeyValue<>("开始时间", "2026-05-31 09:00:00"),
                new KeyValue<>("请假天数", "3")),
                summary);
    }
 
    @Test
    public void testGetSummary_summaryDisabled_useDefaultSummary() {
        // 准备参数:摘要设置存在但未启用时,仍走默认摘要逻辑。
        BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionInfo(dbFormFields(),
                summarySetting(false, "remark"));
        Map<String, Object> processVariables = processVariables();
 
        // 调用
        List<KeyValue<String, String>> summary = FlowableUtils.getSummary(processDefinitionInfo, processVariables);
 
        // 断言
        assertEquals(Arrays.asList(
                new KeyValue<>("请假原因", "事假"),
                new KeyValue<>("开始时间", "2026-05-31 09:00:00"),
                new KeyValue<>("请假天数", "3")),
                summary);
    }
 
    @Test
    public void testGetSummary_displayComponentsOnly_returnEmpty() {
        // 准备参数:分割线、标签、文字等展示组件的 children 是字符串数组,不是表单字段对象。
        BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionInfo(Arrays.asList(
                DIVIDER_FIELD,
                TEXT_FIELD,
                TAG_FIELD), null);
 
        // 调用
        List<KeyValue<String, String>> summary = FlowableUtils.getSummary(processDefinitionInfo,
                Collections.emptyMap());
 
        // 断言
        assertEquals(Collections.emptyList(), summary);
    }
 
    @Test
    public void testGetSummary_notNormalForm_returnNull() {
        // 准备参数
        BpmProcessDefinitionInfoDO processDefinitionInfo = BpmProcessDefinitionInfoDO.builder()
                .formType(BpmModelFormTypeEnum.CUSTOM.getType())
                .build();
 
        // 调用 & 断言
        assertNull(FlowableUtils.getSummary(null, Collections.emptyMap()));
        assertNull(FlowableUtils.getSummary(processDefinitionInfo, Collections.emptyMap()));
    }
 
    private static BpmProcessDefinitionInfoDO processDefinitionInfo(List<String> formFields,
                                                                    BpmModelMetaInfoVO.SummarySetting summarySetting) {
        return BpmProcessDefinitionInfoDO.builder()
                .formType(BpmModelFormTypeEnum.NORMAL.getType())
                .formFields(formFields)
                .summarySetting(summarySetting)
                .build();
    }
 
    private static BpmModelMetaInfoVO.SummarySetting summarySetting(Boolean enable, String... fields) {
        BpmModelMetaInfoVO.SummarySetting summarySetting = new BpmModelMetaInfoVO.SummarySetting();
        summarySetting.setEnable(enable);
        summarySetting.setSummary(Arrays.asList(fields));
        return summarySetting;
    }
 
    private static List<String> dbFormFields() {
        return Arrays.asList(
                DIVIDER_FIELD,
                "{\"type\":\"input\",\"field\":\"reason\",\"title\":\"请假原因\",\"value\":\"\","
                        + "\"props\":{\"type\":\"textarea\",\"placeholder\":\"请输入请假原因\"},"
                        + "\"$required\":\"请输入请假原因\",\"_fc_id\":\"id_F1\",\"_fc_drag_tag\":\"input\","
                        + "\"hidden\":false,\"display\":true}",
                TEXT_FIELD,
                "{\"type\":\"elRow\",\"title\":\"栅格布局\",\"children\":["
                        + "{\"type\":\"elCol\",\"props\":{\"span\":12},\"children\":["
                        + "{\"type\":\"DatePicker\",\"field\":\"startTime\",\"title\":\"开始时间\","
                        + "\"props\":{\"type\":\"datetime\",\"placeholder\":\"请选择开始时间\"},"
                        + "\"_fc_id\":\"id_F2\",\"_fc_drag_tag\":\"datePicker\"}]},"
                        + "\"字段说明\","
                        + "{\"type\":\"elCol\",\"props\":{\"span\":12},\"children\":["
                        + "{\"type\":\"inputNumber\",\"field\":\"days\",\"title\":\"请假天数\","
                        + "\"props\":{\"min\":0,\"precision\":1},\"_fc_id\":\"id_F3\","
                        + "\"_fc_drag_tag\":\"inputNumber\"}]}],\"_fc_id\":\"id_LAYOUT\","
                        + "\"_fc_drag_tag\":\"row\"}",
                TAG_FIELD,
                "{\"type\":\"input\",\"field\":\"remark\",\"title\":\"备注\",\"value\":\"\","
                        + "\"props\":{\"placeholder\":\"请输入备注\"},\"_fc_id\":\"id_F4\","
                        + "\"_fc_drag_tag\":\"input\",\"hidden\":false,\"display\":true}");
    }
 
    private static Map<String, Object> processVariables() {
        Map<String, Object> processVariables = new HashMap<>();
        processVariables.put("reason", "事假");
        processVariables.put("startTime", "2026-05-31 09:00:00");
        processVariables.put("days", 3);
        processVariables.put("remark", "下午到家");
        return processVariables;
    }
 
    private static final String DIVIDER_FIELD = "{\"type\":\"elDivider\",\"children\":[\"基础信息\"],"
            + "\"props\":{\"contentPosition\":\"left\"},\"_fc_id\":\"id_DIVIDER\","
            + "\"_fc_drag_tag\":\"elDivider\"}";
 
    private static final String TEXT_FIELD = "{\"type\":\"div\",\"children\":[\"请按实际情况填写\"],"
            + "\"props\":{\"style\":{\"color\":\"#909399\"}},\"_fc_id\":\"id_TEXT\","
            + "\"_fc_drag_tag\":\"text\"}";
 
    private static final String TAG_FIELD = "{\"type\":\"elTag\",\"children\":[\"重要\"],"
            + "\"props\":{\"type\":\"warning\"},\"_fc_id\":\"id_TAG\",\"_fc_drag_tag\":\"elTag\"}";
 
}