Commit 9d9351d066a856f11b9f580bc770b8fc5f95e618
1 parent
d11684c2
【代码评审】Bpm:更多设置-摘要设置
Showing
5 changed files
with
82 additions
and
48 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/model/BpmFormFieldVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormFieldVO.java
| 1 | -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model; | 1 | +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; |
| 2 | 2 | ||
| 3 | import lombok.Data; | 3 | import lombok.Data; |
| 4 | 4 | ||
| 5 | +/** | ||
| 6 | + * 流程表单字段 VO | ||
| 7 | + */ | ||
| 5 | @Data | 8 | @Data |
| 6 | public class BpmFormFieldVO { | 9 | public class BpmFormFieldVO { |
| 7 | 10 | ||
| 11 | + /** | ||
| 12 | + * 字段类型 | ||
| 13 | + */ | ||
| 8 | private String type; | 14 | private String type; |
| 9 | - | 15 | + /** |
| 16 | + * 字段标识 | ||
| 17 | + */ | ||
| 10 | private String field; | 18 | private String field; |
| 11 | - | 19 | + /** |
| 20 | + * 字段标题 | ||
| 21 | + */ | ||
| 12 | private String title; | 22 | private String title; |
| 13 | 23 | ||
| 14 | } | 24 | } |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java
| @@ -20,6 +20,9 @@ public class BpmProcessInstanceRespVO { | @@ -20,6 +20,9 @@ public class BpmProcessInstanceRespVO { | ||
| 20 | @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") | 20 | @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道") |
| 21 | private String name; | 21 | private String name; |
| 22 | 22 | ||
| 23 | + @Schema(description = "流程摘要") | ||
| 24 | + private List<KeyValue<String, String>> summary; // 只有流程表单,才有摘要! | ||
| 25 | + | ||
| 23 | @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 26 | @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 24 | private String category; | 27 | private String category; |
| 25 | @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假") | 28 | @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假") |
| @@ -60,8 +63,6 @@ public class BpmProcessInstanceRespVO { | @@ -60,8 +63,6 @@ public class BpmProcessInstanceRespVO { | ||
| 60 | */ | 63 | */ |
| 61 | private List<Task> tasks; // 仅在流程实例分页才返回 | 64 | private List<Task> tasks; // 仅在流程实例分页才返回 |
| 62 | 65 | ||
| 63 | - private List<KeyValue<String, String>> summary; | ||
| 64 | - | ||
| 65 | @Schema(description = "流程任务") | 66 | @Schema(description = "流程任务") |
| 66 | @Data | 67 | @Data |
| 67 | public static class Task { | 68 | public static class Task { |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java
| @@ -85,8 +85,9 @@ public class BpmTaskRespVO { | @@ -85,8 +85,9 @@ public class BpmTaskRespVO { | ||
| 85 | @Schema(description = "是否填写审批意见", example = "false") | 85 | @Schema(description = "是否填写审批意见", example = "false") |
| 86 | private Boolean reasonRequire; | 86 | private Boolean reasonRequire; |
| 87 | 87 | ||
| 88 | - @Schema(description = "摘要", example = "[]") | ||
| 89 | - private List<KeyValue<String, String>> summary; | 88 | + // TODO @lesan:要不放到 processInstance 里面?因为摘要是流程实例的,不是流程任务的 |
| 89 | + @Schema(description = "流程摘要", example = "[]") | ||
| 90 | + private List<KeyValue<String, String>> summary; // 只有流程表单,才有摘要! | ||
| 90 | 91 | ||
| 91 | @Data | 92 | @Data |
| 92 | @Schema(description = "流程实例") | 93 | @Schema(description = "流程实例") |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.convert.task; | @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.bpm.convert.task; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | -import cn.iocoder.yudao.framework.common.core.KeyValue; | ||
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | 6 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 8 | import cn.iocoder.yudao.framework.common.util.collection.SetUtils; | 7 | import cn.iocoder.yudao.framework.common.util.collection.SetUtils; |
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/FlowableUtils.java
| @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.core.KeyValue; | @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.core.KeyValue; | ||
| 6 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 6 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 7 | import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | 7 | import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; |
| 8 | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; | 8 | import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; |
| 9 | -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmFormFieldVO; | 9 | +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormFieldVO; |
| 10 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; | 10 | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| 11 | import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; | 11 | import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum; |
| 12 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; | 12 | import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants; |
| @@ -193,6 +193,68 @@ public class FlowableUtils { | @@ -193,6 +193,68 @@ public class FlowableUtils { | ||
| 193 | BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES); | 193 | BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_SELECT_ASSIGNEES); |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | + // TODO @lesan:如果值是 null 的情况,可能要调研下飞书、钉钉,是不是不返回哈! | ||
| 197 | + /** | ||
| 198 | + * 获得流程实例的摘要 | ||
| 199 | + * | ||
| 200 | + * 仅有 {@link BpmModelFormTypeEnum#getType()} 表单,才有摘要。 | ||
| 201 | + * 原因是,只有它才有表单项的配置,从而可以根据配置,展示摘要。 | ||
| 202 | + * | ||
| 203 | + * @param processDefinitionInfo 流程定义 | ||
| 204 | + * @param processVariables 流程实例的 variables | ||
| 205 | + * @return 摘要 | ||
| 206 | + */ | ||
| 207 | + public static List<KeyValue<String, String>> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo, | ||
| 208 | + Map<String, Object> processVariables) { | ||
| 209 | + // TODO @lesan:建议 if return,减少 { 层级 | ||
| 210 | + if (ObjectUtil.isNotNull(processDefinitionInfo) | ||
| 211 | + && BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { | ||
| 212 | + List<KeyValue<String, String>> summaryList = new ArrayList<>(); | ||
| 213 | + // TODO @lesan:可以使用 CollUtils.convertMap 简化工作量哈。 | ||
| 214 | + Map<String, BpmFormFieldVO> formFieldsMap = new HashMap<>(); | ||
| 215 | + processDefinitionInfo.getFormFields().forEach(formFieldStr -> { | ||
| 216 | + BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); | ||
| 217 | + if (formField != null) { | ||
| 218 | + formFieldsMap.put(formField.getField(), formField); | ||
| 219 | + } | ||
| 220 | + }); | ||
| 221 | + | ||
| 222 | + // TODO @lesan:这里也可以 if return,还是为了减少括号哈。这样,就可以写注释,情况一:;情况二: | ||
| 223 | + if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) | ||
| 224 | + && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { | ||
| 225 | + // TODO @lesan:这里,也可以通过 CollUtils.convertList 简化哈。 | ||
| 226 | + for (String item : processDefinitionInfo.getSummarySetting().getSummary()) { | ||
| 227 | + BpmFormFieldVO formField = formFieldsMap.get(item); | ||
| 228 | + if (formField != null) { | ||
| 229 | + summaryList.add(new KeyValue<>(formField.getTitle(), | ||
| 230 | + processVariables.getOrDefault(item, "").toString())); | ||
| 231 | + } | ||
| 232 | + } | ||
| 233 | + } else { | ||
| 234 | + // 默认展示前三个 | ||
| 235 | + /* TODO @lesan:stream 简化 | ||
| 236 | + * summaryList.addAll(formFieldsMap.entrySet().stream() | ||
| 237 | + * .limit(3) | ||
| 238 | + * .map(entry -> new KeyValue<>(entry.getValue().getTitle(), | ||
| 239 | + * processVariables.getOrDefault(entry.getValue().getField(), "").toString())) | ||
| 240 | + * .collect(Collectors.toList())); | ||
| 241 | + */ | ||
| 242 | + int j = 0; | ||
| 243 | + for (Map.Entry<String, BpmFormFieldVO> entry : formFieldsMap.entrySet()) { | ||
| 244 | + BpmFormFieldVO formField = entry.getValue(); | ||
| 245 | + if (j > 2) { | ||
| 246 | + break; | ||
| 247 | + } | ||
| 248 | + summaryList.add(new KeyValue<>(formField.getTitle(), | ||
| 249 | + processVariables.getOrDefault(formField.getField(), "").toString())); | ||
| 250 | + j++; | ||
| 251 | + } | ||
| 252 | + } | ||
| 253 | + return summaryList; | ||
| 254 | + } | ||
| 255 | + return null; | ||
| 256 | + } | ||
| 257 | + | ||
| 196 | // ========== Task 相关的工具方法 ========== | 258 | // ========== Task 相关的工具方法 ========== |
| 197 | 259 | ||
| 198 | /** | 260 | /** |
| @@ -279,43 +341,4 @@ public class FlowableUtils { | @@ -279,43 +341,4 @@ public class FlowableUtils { | ||
| 279 | return getExpressionValue(variableContainer, expressionString); | 341 | return getExpressionValue(variableContainer, expressionString); |
| 280 | } | 342 | } |
| 281 | 343 | ||
| 282 | - public static List<KeyValue<String, String>> getSummary(BpmProcessDefinitionInfoDO processDefinitionInfo, | ||
| 283 | - Map<String, Object> processVariables) { | ||
| 284 | - if (ObjectUtil.isNotNull(processDefinitionInfo) | ||
| 285 | - && BpmModelFormTypeEnum.NORMAL.getType().equals(processDefinitionInfo.getFormType())) { | ||
| 286 | - List<KeyValue<String, String>> summaryList = new ArrayList<>(); | ||
| 287 | - Map<String, BpmFormFieldVO> formFieldsMap = new HashMap<>(); | ||
| 288 | - processDefinitionInfo.getFormFields().forEach(formFieldStr -> { | ||
| 289 | - BpmFormFieldVO formField = JsonUtils.parseObject(formFieldStr, BpmFormFieldVO.class); | ||
| 290 | - if (formField != null) { | ||
| 291 | - formFieldsMap.put(formField.getField(), formField); | ||
| 292 | - } | ||
| 293 | - }); | ||
| 294 | - if (ObjectUtil.isNotNull(processDefinitionInfo.getSummarySetting()) | ||
| 295 | - && Boolean.TRUE.equals(processDefinitionInfo.getSummarySetting().getEnable())) { | ||
| 296 | - for (String item : processDefinitionInfo.getSummarySetting().getSummary()) { | ||
| 297 | - BpmFormFieldVO formField = formFieldsMap.get(item); | ||
| 298 | - if (formField != null) { | ||
| 299 | - summaryList.add(new KeyValue<>(formField.getTitle(), | ||
| 300 | - processVariables.getOrDefault(item, "").toString())); | ||
| 301 | - } | ||
| 302 | - } | ||
| 303 | - } else { | ||
| 304 | - // 默认展示前三个 | ||
| 305 | - int j = 0; | ||
| 306 | - for (Map.Entry<String, BpmFormFieldVO> entry : formFieldsMap.entrySet()) { | ||
| 307 | - BpmFormFieldVO formField = entry.getValue(); | ||
| 308 | - if (j > 2) { | ||
| 309 | - break; | ||
| 310 | - } | ||
| 311 | - summaryList.add(new KeyValue<>(formField.getTitle(), | ||
| 312 | - processVariables.getOrDefault(formField.getField(), "").toString())); | ||
| 313 | - j++; | ||
| 314 | - } | ||
| 315 | - } | ||
| 316 | - return summaryList; | ||
| 317 | - } | ||
| 318 | - return null; | ||
| 319 | - } | ||
| 320 | - | ||
| 321 | } | 344 | } |