From 8e287b3f24708e21e967bfef51370ed183eb9c33 Mon Sep 17 00:00:00 2001 From: wangli Date: Mon, 4 Aug 2025 20:39:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(REQ-4624)=20-=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=A1=A8=E5=8D=95=E5=AE=9E=E4=BE=8B=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/FormFieldTypeEnum.java | 66 ++++++++++++++++++- .../service/impl/FormCoreServiceImpl.java | 3 +- 2 files changed, 67 insertions(+), 2 deletions(-) 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 45ab85b1f..c8e0f7b29 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 @@ -2,9 +2,12 @@ package cn.axzo.workflow.common.enums; import cn.axzo.workflow.common.model.dto.UploadFieldDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; -import com.alibaba.fastjson.TypeReference; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -72,4 +75,65 @@ public enum FormFieldTypeEnum { .findAny() .orElse(null); } + + public static Object parseValue(String type, Object fieldValue, Map fieldParams) { + FormFieldTypeEnum fieldType = valueOfType(type); + if (fieldType == null) { + return null; + } + TypeReference typeReference = fieldType.getTypeReference(); + if (typeReference == null || typeReference.getType() == null) { + return fieldValue; + } + if (fieldValue == null) { + return null; + } + ObjectMapper objectMapper = new ObjectMapper(); + try { + // 如果已经是目标类型,直接返回 + if (objectMapper.constructType(typeReference.getType()).getRawClass().isInstance(fieldValue)) { + return fieldValue; + } + // 先转为字符串再反序列化 + String json = objectMapper.writeValueAsString(fieldValue); + Object defaultValue = handleDefault(fieldParams, json, fieldType); + if (Objects.isNull(defaultValue)) { + return fieldValue; + } + if (Objects.equals(type, "decimal")) { + // 特殊处理 decimal 类型,确保返回的 Map 包含 unit 字段 + Map decimalMap = (Map) defaultValue; + decimalMap.put("value", fieldValue); + decimalMap.put("unit", fieldParams.getOrDefault("unit", "")); + return decimalMap; + } + return objectMapper.readValue(json, typeReference); + } catch (Exception e) { + throw new RuntimeException("字段值解析失败: " + fieldValue, e); + } + } + + private static Object handleDefault(Map fieldParams, String json, FormFieldTypeEnum fieldType) { + if (Objects.equals("[]", json)) { + switch (fieldType) { + case upload: + case image: + case customComponent: + case taskOrder: + case rectifyOrder: + case changeSignatureOrder: + case contacts: + // 对于这些类型,返回空列表而不是空字符串 + return Collections.emptyList(); + case decimal: + HashMap map = new HashMap<>(); + map.put("value", 0); + map.put("unit", fieldParams.getOrDefault("unit", "")); + return map; + default: + return ""; + } + } + return null; + } } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormCoreServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormCoreServiceImpl.java index 9f39b6948..00e3d3c3f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormCoreServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/FormCoreServiceImpl.java @@ -39,6 +39,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import java.text.Normalizer; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -169,7 +170,7 @@ public class FormCoreServiceImpl implements FormCoreService { formDataVO.setFieldId(field.getId()); formDataVO.setFieldType(FormFieldTypeEnum.valueOfType(field.getType())); // TODO 根据不同数据类型,进行数据转码 - formDataVO.setFieldValue(field.getValue()); + formDataVO.setFieldValue(FormFieldTypeEnum.parseValue(field.getType(), field.getValue(), field.getParams())); formDataList.add(formDataVO); } }