From 464e94f3680375c13f42b5b3a32de07480d0771e Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 19 Nov 2025 19:52:50 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(RDMP-3845)=20-=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=8D=95=E9=80=89=E3=80=81=E5=A4=8D=E9=80=89=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/code/FormInstanceRespCode.java | 2 + .../common/enums/FormFieldTypeEnum.java | 4 ++ ...etProcessInstanceVariablesToObjectCmd.java | 39 ++++++++++++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java index 8b878fffe..aff3e0407 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/FormInstanceRespCode.java @@ -23,6 +23,8 @@ public enum FormInstanceRespCode implements IModuleRespCode { FORM_DATA_PARSE_ERROR_BY_IMAGE("008", "表单图片组件的数据解析异常"), FORM_DATA_PARSE_ERROR_BY_CUSTOM_COMPONENT("009", "表单自定义组件的数据解析异常"), FORM_DATA_PARSE_ERROR_BY_AMOUNT("010", "表单金额组件的数据解析异常"), + FORM_DATA_PARSE_ERROR_BY_CHECKBOX("011", "表单复选框组件的数据解析异常"), + FORM_DATA_PARSE_ERROR_BY_RADIO("012", "表单单选框组件的数据解析异常"), ; private final String code; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FormFieldTypeEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FormFieldTypeEnum.java index 76c13501a..dc61f031b 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FormFieldTypeEnum.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/FormFieldTypeEnum.java @@ -46,6 +46,10 @@ public enum FormFieldTypeEnum { }), decimal("decimal", "小数", new TypeReference>() { }), + checkbox("checkbox", "复选框", new TypeReference>() { + }), + radio("radio", "单选框", new TypeReference() { + }) ; private final String type; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetProcessInstanceVariablesToObjectCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetProcessInstanceVariablesToObjectCmd.java index 15ee7e83c..ede5ce0e5 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetProcessInstanceVariablesToObjectCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetProcessInstanceVariablesToObjectCmd.java @@ -27,6 +27,8 @@ import org.flowable.form.api.FormService; import org.flowable.form.model.FormContainer; import org.flowable.form.model.FormField; import org.flowable.form.model.FormFieldTypes; +import org.flowable.form.model.Option; +import org.flowable.form.model.OptionFormField; import org.flowable.form.model.SimpleFormModel; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -42,6 +44,8 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; +import static cn.axzo.workflow.common.code.FormInstanceRespCode.FORM_DATA_PARSE_ERROR_BY_CHECKBOX; +import static cn.axzo.workflow.common.code.FormInstanceRespCode.FORM_DATA_PARSE_ERROR_BY_RADIO; import static cn.axzo.workflow.common.code.FormModelRespCode.FORM_MODEL_NOT_EXISTS; import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; @@ -75,7 +79,7 @@ public class CustomGetProcessInstanceVariablesToObjectCmd extends AbstractComman private final String processInstanceId; private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); - private static final List SUPPORTED_FORM_TYPES = Lists.newArrayList("input", "date", "textarea", "image", "contacts", "amount", "decimal"); + private static final List SUPPORTED_FORM_TYPES = Lists.newArrayList("input", "date", "textarea", "image", "contacts", "amount", "decimal", "checkbox", "radio"); public CustomGetProcessInstanceVariablesToObjectCmd(String processInstanceId) { this.processInstanceId = processInstanceId; @@ -219,6 +223,39 @@ public class CustomGetProcessInstanceVariablesToObjectCmd extends AbstractComman .type(convert(field.getType())) .build()); } + } else if (Objects.equals(field.getType(), "checkbox")) { + if (field instanceof OptionFormField) { + OptionFormField optionField = (OptionFormField) field; + if (StringUtils.hasText(fieldValue.toString()) + && fieldValue.toString().startsWith("[") + && fieldValue.toString().endsWith("]")) { + List selectedOptions = JSON.parseArray((String) fieldValue, String.class); + List optionNames = optionField.getOptions().stream().filter(i -> selectedOptions.contains(i.getId())).map(Option::getName).collect(Collectors.toList()); + variables.add(VariableObjectDTO.builder() + .key(field.getId()) + .desc(field.getName()) + .value(StringUtils.collectionToCommaDelimitedString(optionNames)) + .type(convert(field.getType())) + .build()); + } + } else { + throw new WorkflowEngineException(FORM_DATA_PARSE_ERROR_BY_CHECKBOX); + } + } else if (Objects.equals(field.getType(), "radio")) { + if (field instanceof OptionFormField) { + OptionFormField optionField = (OptionFormField) field; + if (StringUtils.hasText(fieldValue.toString())) { + List optionNames = optionField.getOptions().stream().filter(i -> Objects.equals(fieldValue, i.getId())).map(Option::getName).collect(Collectors.toList()); + variables.add(VariableObjectDTO.builder() + .key(field.getId()) + .desc(field.getName()) + .value(StringUtils.collectionToCommaDelimitedString(optionNames)) + .type(convert(field.getType())) + .build()); + } + } else { + throw new WorkflowEngineException(FORM_DATA_PARSE_ERROR_BY_RADIO); + } } else { variables.add(VariableObjectDTO.builder() .key(field.getId()) From ce0630f831eb979962cb9c39546821b18ed5f2f3 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 20 Nov 2025 11:03:41 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(RDMP-3845)=20-=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=8D=95=E9=80=89=E3=80=81=E5=A4=8D=E9=80=89=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/form/definition/FormFieldDTO.java | 13 +++++- .../request/form/definition/OptionDTO.java | 24 ++++++++++ ...tomGetFormModelByProcessInstanceIdCmd.java | 46 +++++++++++++++++++ .../web/manage/PrintAdminController.java | 9 ++-- 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/OptionDTO.java create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormModelByProcessInstanceIdCmd.java diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java index 4a07d8a8c..f9462cf2f 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/FormFieldDTO.java @@ -22,7 +22,7 @@ import java.util.Map; public class FormFieldDTO { /** - * 字段类型, 如果是分组:FormContainer,其他表单组件:FormField + * 字段类型, 如果是分组:FormContainer,单选复选组件:OptionFormField,其他表单组件:FormField, */ @ApiModelProperty(value = "表单字段类型") @NotBlank(message = "字段类型不能为空") @@ -41,6 +41,9 @@ public class FormFieldDTO { * { label: "变洽签单", value: "changeSignatureOrder" }, * { label: "通讯录", value: "contacts" }, * { label: "金额", value: "amount" }, + * { label: "复选", value: "checkbox" }, + * { label: "单选", value: "radio" }, + * */ @ApiModelProperty(value = "前端的组件类型") private String type; @@ -76,6 +79,14 @@ public class FormFieldDTO { @ApiModelProperty(value = "该表单字段的其他扩展属性,期望 JSON 格式") private Map params; + /** + * 单选复选框的选项 + *

+ * {@see org.flowable.form.model.OptionFormField} + */ + @ApiModelProperty(value = "单选复选框的选项,配合 fieldType=OptionFormField 使用") + private List options; + /** * 当 fieldType=FormContainer 时,这里的代表内部的集合 */ diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/OptionDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/OptionDTO.java new file mode 100644 index 000000000..4da0a99aa --- /dev/null +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/form/definition/OptionDTO.java @@ -0,0 +1,24 @@ +package cn.axzo.workflow.common.model.request.form.definition; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +/** + * 单选复选框的选项入参模型 + * + * @author wangli + * @since 2025-11-20 10:57 + */ +@ApiModel("单选复选框的选项入参模型") +@Data +public class OptionDTO { + /** + * 选项 ID + */ + private String id; + + /** + * 选项名称 + */ + private String name; +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormModelByProcessInstanceIdCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormModelByProcessInstanceIdCmd.java new file mode 100644 index 000000000..18c8b9e42 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetFormModelByProcessInstanceIdCmd.java @@ -0,0 +1,46 @@ +package cn.axzo.workflow.core.engine.cmd; + +import com.alibaba.fastjson.JSON; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.form.api.FormEngineConfigurationApi; +import org.flowable.form.api.FormInfo; +import org.flowable.form.api.FormInstance; +import org.flowable.form.api.FormRepositoryService; +import org.flowable.form.api.FormService; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + * 通过审批实例 ID 获取对应的表单定义实体的自定义命令 + * + * @author wangli + * @since 2025-11-20 10:18 + */ +public class CustomGetFormModelByProcessInstanceIdCmd extends AbstractCommand implements Serializable { + private final String processInstanceId; + + public CustomGetFormModelByProcessInstanceIdCmd(String processInstanceId) { + this.processInstanceId = processInstanceId; + } + + @Override + public String paramToJsonString() { + Map params = new HashMap<>(); + params.put("processInstanceId", processInstanceId); + return JSON.toJSONString(params); + } + + @Override + public FormInfo executeInternal(CommandContext commandContext) { + FormEngineConfigurationApi formEngineConfiguration = CommandContextUtil.getFormEngineConfiguration(commandContext); + FormService formService = formEngineConfiguration.getFormService(); + + FormInstance formInstance = formService.createFormInstanceQuery().processInstanceId(processInstanceId).singleResult(); + String formDefinitionId = formInstance.getFormDefinitionId(); + FormRepositoryService formRepositoryService = formEngineConfiguration.getFormRepositoryService(); + return formRepositoryService.getFormModelById(formDefinitionId); + } +} diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java index 00cdd9200..e2bebb811 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java @@ -18,6 +18,7 @@ import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLo import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.engine.cmd.CustomGetFormInstanceLatestValuesCmd; +import cn.axzo.workflow.core.engine.cmd.CustomGetFormModelByProcessInstanceIdCmd; import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesCmd; import cn.axzo.workflow.core.service.BpmnProcessDefinitionService; import cn.axzo.workflow.core.service.BpmnProcessInstanceService; @@ -162,6 +163,7 @@ public class PrintAdminController implements PrintAdminApi { bpmnProcessModelService.printTemplateConfig(dto); return success(); } + /** * 获取打印模板中可打印的字段, 或者是 WPS 模板中可配置的变量字段 * @@ -335,16 +337,17 @@ public class PrintAdminController implements PrintAdminApi { // 生成系统字段的变量 generateSystemFieldVariables(processInstanceId, result); + FormInfo formInfo = commandExecutor.execute(new CustomGetFormModelByProcessInstanceIdCmd(processInstanceId)); // 将所有变量都转换成 JSON 对象返回 - convertValueToObject(result); + convertValueToObject(result, formInfo); return success(result); } - private void convertValueToObject(Map result) { + private void convertValueToObject(Map result, FormInfo formInfo) { if (CollectionUtils.isEmpty(result)) { return; } - + Map stringFormFieldMap = ((SimpleFormModel) formInfo.getFormModel()).allFieldsAsMap(); result.forEach((key, value) -> { if (!(value instanceof String)) { return;