diff --git a/business-entity-generator/src/main/java/com/inspur/edp/bef/dtgenerator/core/rtgen/entitygen/method/CreateChildEntityDataGenerator.java b/business-entity-generator/src/main/java/com/inspur/edp/bef/dtgenerator/core/rtgen/entitygen/method/CreateChildEntityDataGenerator.java index 4badaeebba159b8738295e739f041dca6661c785..9972ab58a87e607c894d41f2055b4338509098ff 100644 --- a/business-entity-generator/src/main/java/com/inspur/edp/bef/dtgenerator/core/rtgen/entitygen/method/CreateChildEntityDataGenerator.java +++ b/business-entity-generator/src/main/java/com/inspur/edp/bef/dtgenerator/core/rtgen/entitygen/method/CreateChildEntityDataGenerator.java @@ -26,6 +26,9 @@ import com.inspur.edp.caf.generator.baseInfo.TypeInfo; import com.inspur.edp.caf.generator.method.ClassMethodGenerator; import com.inspur.edp.caf.generator.utils.ExpressionUtils; import com.inspur.edp.cef.designtime.api.IGspCommonField; +import com.inspur.edp.cef.designtime.api.collection.GspAssociationCollection; +import com.inspur.edp.cef.designtime.api.collection.GspFieldCollection; +import com.inspur.edp.cef.designtime.api.element.GspAssociation; import com.inspur.edp.cef.designtime.api.element.GspElementObjectType; import com.inspur.edp.cef.entity.entity.IEntityData; import com.inspur.edp.cef.gencommon.MediateType; @@ -35,8 +38,8 @@ import com.inspur.edp.cef.spi.common.UdtManagerUtil; import com.inspur.edp.das.commonmodel.IGspCommonObject; import com.inspur.edp.udt.designtime.api.entity.SimpleDataTypeDef; import com.inspur.edp.udt.designtime.api.entity.UnifiedDataTypeDef; -import java.util.ArrayList; -import java.util.Map; +import io.iec.edp.caf.commons.utils.CollectionUtils; +import lombok.extern.slf4j.Slf4j; import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.Expression; @@ -49,6 +52,11 @@ import org.eclipse.jdt.core.dom.ThrowStatement; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.VariableDeclarationStatement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +@Slf4j public class CreateChildEntityDataGenerator extends ClassMethodGenerator { private BefEntityImplGenCtx entityImplGenCtx; @@ -178,17 +186,91 @@ public class CreateChildEntityDataGenerator extends ClassMethodGenerator { } } - private void addSetNestedPropertyStatement(IGspCommonObject node, Block block, - IGspCommonField field) { - MethodInvocation methodInvocation = ast.newMethodInvocation(); - methodInvocation.setName(ast.newSimpleName(Utils.getSetterMethodName(field.getLabelID()))); - methodInvocation.setExpression(ast.newSimpleName("data")); - addCreateDataTypeStatement(methodInvocation, field); - block.statements().add(ast.newExpressionStatement(methodInvocation)); + private void addSetNestedPropertyStatement(IGspCommonObject node, Block block, IGspCommonField field) { + if (isAssoUdtWithEnrichedElement(field)) { + //特殊处理包含额外带出字段的关联UDT字段 + //关联UDT会生成对应的类,其属性是各关联带出字段。 + //为了表示额外带出字段的值,有额外带出字段的关联UDT字段,值的类型是关联UDT生成类型的子类。所以在此处对该类型的字段初始化赋值时,必须使用子类类型。 + //作为参考,获取子类的接口类型的SimpleName为:AssoUdtEnrichedDataGenerator.getItemName(field),FullName为:AssoUdtEnrichedDataGenerator.getFullItemName(field); + + //获取UDT子类型 + HashMap> enrichedUdtAssoTypes = entityImplGenCtx.getParentContext().getEnrichedUdtAssoTypes(); + if (enrichedUdtAssoTypes == null) { + throw new IllegalStateException("未找到实体的额外关联UDT的类型信息列表,当前子表编号:" + node.getCode() + ",当前字段:" + field.getLabelID()); + } + HashMap fieldEnrichedUdtAssoTypes = enrichedUdtAssoTypes.get(node.getCode()); + if (fieldEnrichedUdtAssoTypes == null) { + throw new IllegalStateException("未找到子表的额外关联UDT的类型信息,当前子表编号:" + node.getCode() + ",当前字段:" + field.getLabelID()); + } + MediateType enrichedUdtAssoType = fieldEnrichedUdtAssoTypes.get(field.getLabelID()); + if (enrichedUdtAssoType == null) { + throw new IllegalStateException("未找到字段的额外关联UDT的类型信息,当前子表编号:" + node.getCode() + ",当前字段:" + field.getLabelID()); + } + String fullEnrichedUdtAssoTypeName = enrichedUdtAssoType.getFullName(); + + //创建UDT子类对象 + String enrichedUdtDataVarName = field.getLabelID() + "EnrichedData"; + VariableDeclarationFragment variableDeclarationFragment = ast.newVariableDeclarationFragment(); + variableDeclarationFragment.setName(ast.newSimpleName(enrichedUdtDataVarName)); + + ClassInstanceCreation classInstanceCreation = ast.newClassInstanceCreation(); + classInstanceCreation.setType(ast.newSimpleType(ast.newName(fullEnrichedUdtAssoTypeName))); + //使用基础UDT类型对象初始化 + classInstanceCreation.arguments().add(createUdtBasicDataInvocation(field)); + variableDeclarationFragment.setInitializer(classInstanceCreation); + + VariableDeclarationStatement variableDeclarationStatement = ast.newVariableDeclarationStatement(variableDeclarationFragment); + variableDeclarationStatement.setType(ast.newSimpleType(ast.newName(fullEnrichedUdtAssoTypeName))); + block.statements().add(variableDeclarationStatement); + + MethodInvocation methodInvocation = ast.newMethodInvocation(); + methodInvocation.setName(ast.newSimpleName(Utils.getSetterMethodName(field.getLabelID()))); + methodInvocation.setExpression(ast.newSimpleName("data")); + methodInvocation.arguments().add(ast.newSimpleName(enrichedUdtDataVarName)); + block.statements().add(ast.newExpressionStatement(methodInvocation)); + } else { + MethodInvocation methodInvocation = ast.newMethodInvocation(); + methodInvocation.setName(ast.newSimpleName(Utils.getSetterMethodName(field.getLabelID()))); + methodInvocation.setExpression(ast.newSimpleName("data")); + MethodInvocation udtBasicDataInvocation = createUdtBasicDataInvocation(field); + methodInvocation.arguments().add(udtBasicDataInvocation); + block.statements().add(ast.newExpressionStatement(methodInvocation)); + } } - private void addCreateDataTypeStatement(MethodInvocation methodInvocation, - IGspCommonField field) { + /** + * 判断是否是包含额外带出的关联UDT字段 + */ + private boolean isAssoUdtWithEnrichedElement(IGspCommonField field) { + if (!field.getIsUdt()) { + return false; + } + if (field.getObjectType() != GspElementObjectType.Association) { + return false; + } + GspAssociationCollection childAssociations = field.getChildAssociations(); + if (CollectionUtils.isEmpty(childAssociations)) { + return false; + } + + for (GspAssociation childAssociation : childAssociations) { + if (childAssociation == null) { + continue; + } + GspFieldCollection refElementCollection = childAssociation.getRefElementCollection(); + if (CollectionUtils.isEmpty(refElementCollection)) { + continue; + } + for (IGspCommonField refElement : refElementCollection) { + if (refElement != null && !refElement.getIsFromAssoUdt()) { + return true; + } + } + } + return false; + } + + private MethodInvocation createUdtBasicDataInvocation(IGspCommonField field){ UnifiedDataTypeDef udt = entityImplGenCtx.getEntityGenCtx().getProjContext().getCefGenContext() .getMetadataContent(field.getUdtPkgName(), field.getUdtID()); @@ -204,8 +286,7 @@ public class CreateChildEntityDataGenerator extends ClassMethodGenerator { createDataInvocation.arguments().add(defaultValueExpr); } } - - methodInvocation.arguments().add(createDataInvocation); + return createDataInvocation; } private void addMethodCreateManagerExpression(MethodInvocation methodInvocationCreateManager,