【068】根据扩展字段的显示名称反向获取编码
侧边栏壁纸
  • 累计撰写 70 篇文章
  • 累计收到 2 条评论

【068】根据扩展字段的显示名称反向获取编码

竹秋廿九
2026-01-30 / 0 评论 / 4 阅读 / 正在检测是否收录...
根据实体全称、公私有段、段序号、私有段的名称值、组织ID、数据中心组织ID查找出这个私有段(值集)

SQL执行存储过程

因为很多时候调用存储过程都是通用代码调用,所以需要当前登录组织跟数据中心组织两个组织编码,因为私有段是实体值集类型的时候,对应实体可能不维护在当前组织而是在数据中心
比如供应商值集很多时候都是在数据中心,存储过程SH_GetFlexFieldCodeByName内部会先按照当前组织ID查找,没找到就按照数据中心查找
DECLARE @ResultCode NVARCHAR(500)     -- 用于接收返回的编码
DECLARE @Name NVARCHAR(500) = N'维生素EC颗粒'

EXEC [dbo].[SH_GetFlexFieldCodeByName] 
    @FullName = 'UFIDA.U9.CBO.SCM.Item.ItemMaster', -- 实体全称
    @ContextValue = 'Private',  -- 上下文: 'Public' (公有段) 或 'Private' (私有段)
    @DNumber = 14, -- 段号: 对应 PrivateDescSeg14
    @Name = @Name, -- 要查找的显示名称 (注意加 N 前缀防止乱码)
    @Org = 1002406210000526, -- 当前组织
    @CenterOrg = 1002406210000054, -- 数据中心组织 (需要数据中心组织是因为比如供应商档案可能不在当前组织,在数据中心)
    @ResultCode = @ResultCode OUTPUT -- 标记为输出参数

SELECT @ResultCode AS [FoundCode] --如果不为NULL,说明找到了对应的编码

示例(自定义值集)

料品私有段14,自定义值集项目大类

image.png

image.png

示例(实体值集)

料品私有段15,实体类型值集项目

image.png

image.png

示例(自定义枚举)

部门私有段1,枚举类型的值集

image.png

image.png

代码调用存储过程

orgID可以赋值Base.Context.LoginOrg.ID
centerOrgId可以读取配置也可以写死(一般数据中心ID不会发生变化)
fullName可以使用实体.EntityRes.BE_FullName,比如 ItemMaster.EntityRes.BE_FullName
/// <summary>
/// 根据扩展字段的显示名称反向获取编码
/// </summary>
public static string GetCodeFromSP(string fullName, string context, int dNumber, string name, long orgId, long centerOrgId)
{
    DataParamList pars = new DataParamList
    {
        DataParamFactory.CreateInput("FullName", fullName),
        DataParamFactory.CreateInput("ContextValue", context),
        DataParamFactory.CreateInput("DNumber", dNumber, DbType.Int32),
        DataParamFactory.CreateInput("Name", name),
        DataParamFactory.CreateInput("Org", orgId, DbType.Int64),
        DataParamFactory.CreateInput("CenterOrg", centerOrgId, DbType.Int64),
        DataParamFactory.CreateOutput("ResultCode", DbType.String)
    };

    DataAccessor.RunSP("SH_GetFlexFieldCodeByName", pars);

    if (pars["ResultCode"].Value != null && pars["ResultCode"].Value != DBNull.Value)
    {
        return pars["ResultCode"].Value.ToString();
    }
    return null;
}

调用示例

long orgId = Base.Context.LoginOrg.ID; // 当前登录组织ID
long centerOrgId = OpenApiConfig.GetInt64("CenterOrgId", 0); // 数据中心ID(读取配置)
string 值集值编码 = GetCodeFromSP(ItemMaster.EntityRes.BE_FullName, "Private", 14, "值集值名称", orgId, centerOrgId);

存储过程SH_GetFlexFieldCodeByName

/****** Object:  StoredProcedure [dbo].[SH_GetFlexFieldCodeByName]    Script Date: 2026/01/30 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT 1 FROM sysobjects WHERE id = object_id(N'[dbo].[SH_GetFlexFieldCodeByName]') AND xtype = 'P' )
BEGIN
    DROP PROCEDURE [dbo].[SH_GetFlexFieldCodeByName]
END
GO

/*
功能:根据扩展字段的显示名称反向获取存储编码 (Name -> Code)
应用场景:接口传入“名称”,系统自动转换为“编码”存入 Pub/Pri 字段
*/
CREATE PROC [dbo].[SH_GetFlexFieldCodeByName]
(
    @FullName VARCHAR(100),      -- 宿主实体的全名 (如 UFIDA.U9.CBO.SCM.Item.ItemMaster)
    @ContextValue VARCHAR(80),   -- 上下文 (Public 或 Global/Private)
    @DNumber INT,                -- 段号 (1-50 或 1-30)
    @Name NVARCHAR(500),         -- 要查找的名称值
    @Org BIGINT = 0,             -- 当前组织ID
    @CenterOrg BIGINT = 0,       -- 数据中心组织ID (用于兜底查找)
    @ResultCode NVARCHAR(500) OUTPUT -- 【输出参数】找到的编码
)
AS
BEGIN
    SET NOCOUNT ON;
    SET @ResultCode = NULL;

    -- 如果名称为空,无需查找
    IF ISNULL(@Name, '') = '' RETURN;

    -- 0. 参数标准化处理
    IF @ContextValue = 'Private' SET @ContextValue = 'Global';

    -- 1. 变量定义
    DECLARE @IsPublicSeg BIT
    DECLARE @RealNumber INT
    
    IF @ContextValue = 'Public'
    BEGIN
        SET @IsPublicSeg = 1
        SET @RealNumber = @DNumber
    END
    ELSE
    BEGIN
        SET @IsPublicSeg = 0
        SET @RealNumber = @DNumber
    END

    -- 2. 获取该段的定义信息
    DECLARE @ValidateEnum INT
    DECLARE @ValueType INT
    DECLARE @ValueSetDefID BIGINT

    SELECT 
        @ValidateEnum = E.ValidateType,
        @ValueType = E.ValueType,
        @ValueSetDefID = E.ID
    FROM UBF_MD_Class A
    INNER JOIN Base_DescFlexFieldDef B ON A.Local_ID = B.EntityType
    INNER JOIN Base_DescFlexContext C ON B.ID = C.DescFlexFieldDef
    INNER JOIN Base_DescFlexSegment D ON C.ID = D.DescFlexContext
    INNER JOIN base_valuesetdef E ON D.ValueSetDef = E.ID
    WHERE A.FullName = @FullName
      AND C.ContextValue = @ContextValue
      AND D.Number = @DNumber

    IF @ValidateEnum IS NULL RETURN;

    -- 3. 根据校验类型分别处理
    
    ----------------------------------------------------------------
    -- 类型 1: 实体引用 (Entity) - 包含回退逻辑
    ----------------------------------------------------------------
    IF @ValidateEnum = 1 
    BEGIN
        DECLARE @TargetTableName NVARCHAR(100)
        DECLARE @CodeColName NVARCHAR(100)
        DECLARE @NameColName NVARCHAR(100)
        DECLARE @NameIsGlob BIT
        DECLARE @HasOrgColumn INT
        DECLARE @BaseSQL NVARCHAR(MAX) -- 基础查询语句
        DECLARE @FinalSQL NVARCHAR(MAX)
        DECLARE @ParamDef NVARCHAR(500)

        -- 获取目标实体对应的表名、编码列、名称列信息
        SELECT 
            @TargetTableName = cc.DefaultTableName,
            @CodeColName = codeAtt.Name,
            @NameColName = NameAtt.Name,
            @NameIsGlob = NameAtt.IsGlobalization
        FROM base_valuesetdef a 
        LEFT JOIN UBF_MD_Class cc ON a.EntityType = cc.Local_ID
        LEFT JOIN UBF_MD_Attribute codeAtt ON a.CodeAttribute = codeAtt.Local_ID
        LEFT JOIN UBF_MD_Attribute NameAtt ON a.NameAttribute = NameAtt.Local_ID
        WHERE a.ID = @ValueSetDefID

        IF @TargetTableName IS NOT NULL AND @CodeColName IS NOT NULL AND @NameColName IS NOT NULL
        BEGIN
            -- 检查目标表是否有 Org 字段
            SELECT @HasOrgColumn = COUNT(1) FROM sys.columns WHERE object_id = OBJECT_ID(@TargetTableName) AND name = 'Org'

            -- 构建基础查询 SQL (不包含 Org 条件)
            SET @BaseSQL = 'SELECT TOP 1 @Out = A.[' + @CodeColName + '] FROM ' + @TargetTableName + ' A '

            IF @NameIsGlob = 1
            BEGIN
                SET @BaseSQL = @BaseSQL + ' INNER JOIN ' + @TargetTableName + '_Trl B ON A.ID = B.ID '
                SET @BaseSQL = @BaseSQL + ' WHERE B.[' + @NameColName + '] = @InName '
            END
            ELSE
            BEGIN
                SET @BaseSQL = @BaseSQL + ' WHERE A.[' + @NameColName + '] = @InName '
            END

            SET @ParamDef = N'@InName NVARCHAR(500), @InOrg BIGINT, @Out NVARCHAR(500) OUTPUT';

            -- A. 尝试在当前组织查找
            IF @HasOrgColumn > 0 AND @Org > 0
            BEGIN
                SET @FinalSQL = @BaseSQL + ' AND A.Org = @InOrg '
                EXEC sp_executesql @FinalSQL, @ParamDef, @InName = @Name, @InOrg = @Org, @Out = @ResultCode OUTPUT;
            END
            ELSE
            BEGIN
                -- 如果表没有Org字段,直接查即可,不需要过滤组织
                EXEC sp_executesql @BaseSQL, @ParamDef, @InName = @Name, @InOrg = 0, @Out = @ResultCode OUTPUT;
            END

            -- B. 兜底逻辑:如果没找到,且表有Org字段,且提供了不同的中心组织ID
            IF @ResultCode IS NULL AND @HasOrgColumn > 0 AND @CenterOrg > 0 AND @CenterOrg <> @Org
            BEGIN
                SET @FinalSQL = @BaseSQL + ' AND A.Org = @InOrg '
                -- 这里传入 @CenterOrg 作为 @InOrg 参数
                EXEC sp_executesql @FinalSQL, @ParamDef, @InName = @Name, @InOrg = @CenterOrg, @Out = @ResultCode OUTPUT;
            END
        END
    END

    ----------------------------------------------------------------
    -- 类型 4: 枚举 (Enum)
    ----------------------------------------------------------------
    ELSE IF @ValidateEnum = 4 
    BEGIN
        SELECT TOP 1 @ResultCode = ev.Code
        FROM base_valuesetdef a 
        INNER JOIN UBF_MD_Class cc ON a.EnumType = cc.Local_ID
        INNER JOIN UBF_Sys_ExtEnumType extType ON extType.UID = cc.ID
        INNER JOIN UBF_Sys_ExtEnumValue ev ON extType.ID = ev.ExtEnumType
        INNER JOIN UBF_Sys_ExtEnumValue_Trl evt ON ev.ID = evt.ID
        WHERE a.ID = @ValueSetDefID
          AND evt.Name = @Name
    END

    ----------------------------------------------------------------
    -- 类型 3: 自定义值集 (Custom)
    ----------------------------------------------------------------
    ELSE IF @ValidateEnum = 3 
    BEGIN
        DECLARE @CustomSQL NVARCHAR(MAX)
        DECLARE @CustomParam NVARCHAR(500)

        SET @CustomSQL = N'SELECT TOP 1 @Out = Code FROM dbo.f_getdefinevalue(@InFull, @InNum, @InCtx) WHERE Name = @InName'
        SET @CustomParam = N'@InFull VARCHAR(100), @InNum INT, @InCtx VARCHAR(80), @InName NVARCHAR(500), @Out NVARCHAR(500) OUTPUT'

        EXEC sp_executesql @CustomSQL, @CustomParam, 
             @InFull = @FullName, @InNum = @DNumber, @InCtx = @ContextValue, @InName = @Name, 
             @Out = @ResultCode OUTPUT
    END

    ----------------------------------------------------------------
    -- 类型 2: 无档案/简单值 (Simple)
    ----------------------------------------------------------------
    ELSE IF @ValidateEnum = 2
    BEGIN
        IF @ValueType = 5 
        BEGIN
            IF @Name = '是' OR @Name = '√' OR @Name = 'Yes' OR @Name = 'True' OR @Name = '1'
                SET @ResultCode = 'True'
            ELSE
                SET @ResultCode = 'False'
        END
        ELSE
        BEGIN
            SET @ResultCode = @Name
        END
    END
END
GO

扩展 - 接口自动查询并赋值

配置文件读取:【069】配置文件读取 - 月光一线

调用示例

reqInfo.PubPriDt是PubPriSVData
// 客户
var cusDto = new ISV.Customer.CustomerDTOData();
// ......客户Dto赋值
cusDto.DescFlexField = Utils.SetDescFlex(cusDto.DescFlexField, reqInfo.PubPriDt, Customer.EntityRes.BE_FullName);
// 客户位置
var siteDto = new ISV.Customer.CustomerSiteDTOData();
// ......客户位置Dto赋值
siteDto.DescFlexField = Utils.SetDescFlex(siteDto.DescFlexField, siteInfo.PubPriDt, CustomerSite.EntityRes.BE_FullName);

Utils

using System.Collections.Generic;
using UFIDA.U9.Base.FlexField.DescFlexField;
using UFIDA.U9.Base.Profile;
using UFIDA.U9.Base.Profile.Proxy;
using UFIDA.U9.SH.LogServiceBP.Proxy;
using UFIDA.U9.SH.OPENAPISV.Model;
using UFSoft.UBF.Util.Context;

namespace UFIDA.U9.SH.OPENAPISV.Common
{
    /// <summary>
    /// 工具类
    /// </summary>
    public static class Utils
    {

        /// <summary>
        /// 扩展字段赋值
        /// </summary>
        /// <param name="descFlexField"></param>
        /// <param name="pubPriDt"></param>
        /// <param name="entityFullName">设置扩展段的实体名称</param>
        /// <returns></returns>
        public static DescFlexSegments SetDescFlex(DescFlexSegments descFlexField, PubPriSVData pubPriDt, string entityFullName)
        {
            long orgId = Base.Context.LoginOrg.ID; // 当前登录组织ID
            long centerOrgId = OpenApiConfig.GetInt64("CenterOrgId", 0); // 数据中心ID
            return FlexFieldExtensions.SetDescFlexSmart(descFlexField, pubPriDt, entityFullName, orgId, centerOrgId);
        }

        /// <summary>
        /// 扩展字段赋值
        /// </summary>
        /// <param name="descFlexField"></param>
        /// <param name="pubPriDt"></param>
        /// <param name="entityFullName">设置扩展段的实体名称</param>
        /// <returns></returns>
        public static DescFlexSegmentsData SetDescFlex(DescFlexSegmentsData descFlexField, PubPriSVData pubPriDt, string entityFullName)
        {
            long orgId = Base.Context.LoginOrg.ID; // 当前登录组织ID
            long centerOrgId = OpenApiConfig.GetInt64("CenterOrgId", 0); // 数据中心ID
            return FlexFieldExtensions.SetDescFlexSmart(descFlexField, pubPriDt, entityFullName, orgId, centerOrgId);
        }

FlexFieldExtensions

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Linq.Expressions;
using UFIDA.U9.SH.OPENAPISV.Model;
using UFSoft.UBF.Util.DataAccess;

namespace UFIDA.U9.SH.OPENAPISV.Common
{
    /// <summary>
    /// 扩展字段赋值工具类 (性能优化版)
    /// </summary>
    public static class FlexFieldExtensions
    {
        // 缓存编译后的赋值委托 (T target, PubPriSVData source)
        private static readonly ConcurrentDictionary<Type, Action<object, PubPriSVData>> _assignmentCache
            = new ConcurrentDictionary<Type, Action<object, PubPriSVData>>();

        // [核心优化] 缓存名称解析的元数据和访问器,避免运行时的 GetProperty 反射
        private static readonly List<FlexFieldResolver> _resolvers = new List<FlexFieldResolver>();

        /// <summary>
        /// 静态构造函数,初始化所有字段的访问委托 (只执行一次)
        /// </summary>
        static FlexFieldExtensions()
        {
            InitializeResolvers();
        }

        #region 内部结构定义

        /// <summary>
        /// 字段解析器元数据
        /// </summary>
        private class FlexFieldResolver
        {
            public string Context { get; set; } // "Public" or "Private"
            public int Number { get; set; }
            public string FullName { get; set; } // 字段描述,用于报错

            // 快速访问委托
            public Func<PubPriSVData, string> GetCode { get; set; }     // 读取 Code (用于优先判断)
            public Func<PubPriSVData, string> GetName { get; set; }     // 读取 _Name
            public Action<PubPriSVData, string> SetCode { get; set; }   // 写入 Code
        }

        #endregion

        #region 静态初始化逻辑

        private static void InitializeResolvers()
        {
            // 预编译 50 个公有段
            for (int i = 1; i <= 50; i++)
            {
                _resolvers.Add(BuildResolver("Public", i));
            }

            // 预编译 30 个私有段
            for (int i = 1; i <= 30; i++)
            {
                _resolvers.Add(BuildResolver("Private", i));
            }
        }

        private static FlexFieldResolver BuildResolver(string context, int index)
        {
            string prefix = context == "Public" ? "Pub" : "Pri";

            var sourceParam = Expression.Parameter(typeof(PubPriSVData), "s");
            var valueParam = Expression.Parameter(typeof(string), "v");

            // 1. 构建 GetCode 委托: (s) => s.Pub1
            var codeProp = typeof(PubPriSVData).GetProperty($"{prefix}{index}");
            var getCodeFunc = Expression.Lambda<Func<PubPriSVData, string>>(
                Expression.Property(sourceParam, codeProp), sourceParam).Compile();

            // 2. 构建 GetName 委托: (s) => s.Pub1_Name
            var nameProp = typeof(PubPriSVData).GetProperty($"{prefix}{index}_Name");
            var getNameFunc = Expression.Lambda<Func<PubPriSVData, string>>(
                Expression.Property(sourceParam, nameProp), sourceParam).Compile();

            // 3. 构建 SetCode 委托: (s, v) => s.Pub1 = v
            var setCodeAction = Expression.Lambda<Action<PubPriSVData, string>>(
                Expression.Assign(Expression.Property(sourceParam, codeProp), valueParam),
                sourceParam, valueParam).Compile();

            return new FlexFieldResolver
            {
                Context = context,
                Number = index,
                FullName = $"{context}DescSeg{index}",
                GetCode = getCodeFunc,
                GetName = getNameFunc,
                SetCode = setCodeAction
            };
        }

        #endregion

        #region 公开方法

        /// <summary>
        /// 智能扩展字段赋值核心方法 (泛型)
        /// </summary>
        public static T SetDescFlexSmart<T>(T target, PubPriSVData source) where T : class, new()
        {
            if (source == null) return target;
            if (target == null) target = new T();

            var action = _assignmentCache.GetOrAdd(typeof(T), t => BuildMapper(t));
            action(target, source);

            return target;
        }

        /// <summary>
        /// 智能扩展字段赋值核心方法 (带名称解析功能)
        /// </summary>
        public static T SetDescFlexSmart<T>(T target, PubPriSVData source, string entityFullName, long orgId, long centerOrgId = 0) where T : class, new()
        {
            if (source == null) return target;

            // 1. 执行名称解析 (使用优化后的逻辑)
            ResolveFlexFieldCodes(source, entityFullName, orgId, centerOrgId);

            // 2. 调用原有逻辑进行赋值
            return SetDescFlexSmart(target, source);
        }

        #endregion

        #region 解析逻辑 (优化版)

        /// <summary>
        /// 解析 PubPriSVData 中的 Name 字段
        /// </summary>
        private static void ResolveFlexFieldCodes(PubPriSVData source, string entityFullName, long orgId, long centerOrgId)
        {
            // 直接读取一次全局配置
            bool ignoreCheck = source.IgnoreNameCheck;

            // 直接遍历预编译好的解析器列表
            foreach (var resolver in _resolvers)
            {
                // 1. 优先检查 Code 是否已有值 (如果有,直接跳过解析,以Code为准)
                string existingCode = resolver.GetCode(source);
                if (!string.IsNullOrEmpty(existingCode)) continue;

                // 2. 快速读取 Name (委托调用)
                string nameVal = resolver.GetName(source);

                // 3. 如果 Name 为空,立即跳过
                if (string.IsNullOrEmpty(nameVal)) continue;

                // 4. 只有当确实有值且无Code时,才执行数据库调用
                string code = GetCodeFromSP(entityFullName, resolver.Context, resolver.Number, nameVal, orgId, centerOrgId);

                // 5. 回填 Code
                if (!string.IsNullOrEmpty(code))
                {
                    resolver.SetCode(source, code);
                }
                else
                {
                    // 6. 校验逻辑 (根据全局 IgnoreNameCheck 决定)
                    if (!ignoreCheck)
                    {
                        throw new SHApiCustException($"扩展字段解析失败: 无法根据名称 '{nameVal}' 找到对应的编码。\n字段: {resolver.FullName}\n实体: {entityFullName}\n组织: {orgId}{(centerOrgId > 0 ? "/" + centerOrgId : "")}");
                    }
                }
            }
        }

        /// <summary>
        /// 使用 U9 DataAccessor 调用存储过程
        /// </summary>
        private static string GetCodeFromSP(string fullName, string context, int dNumber, string name, long orgId, long centerOrgId)
        {
            DataParamList pars = new DataParamList
            {
                DataParamFactory.CreateInput("FullName", fullName),
                DataParamFactory.CreateInput("ContextValue", context),
                DataParamFactory.CreateInput("DNumber", dNumber, DbType.Int32),
                DataParamFactory.CreateInput("Name", name),
                DataParamFactory.CreateInput("Org", orgId, DbType.Int64),
                DataParamFactory.CreateInput("CenterOrg", centerOrgId, DbType.Int64),
                DataParamFactory.CreateOutput("ResultCode", DbType.String)
            };

            // 注意:DataAccessor.RunSP 内部通常会管理连接池
            DataAccessor.RunSP("SH_GetFlexFieldCodeByName", pars);

            if (pars["ResultCode"].Value != null && pars["ResultCode"].Value != DBNull.Value)
            {
                return pars["ResultCode"].Value.ToString();
            }
            return null;
        }

        #endregion

        #region 赋值逻辑 (原有的表达式树构建)

        private static Action<object, PubPriSVData> BuildMapper(Type targetType)
        {
            var targetParam = Expression.Parameter(typeof(object), "target");
            var sourceParam = Expression.Parameter(typeof(PubPriSVData), "source");
            var castTarget = Expression.Convert(targetParam, targetType);
            var statements = new List<Expression>();

            for (int i = 1; i <= 30; i++)
            {
                AddMapping(statements, castTarget, sourceParam, targetType, $"Pri{i}", $"PrivateDescSeg{i}");
            }
            for (int i = 1; i <= 50; i++)
            {
                AddMapping(statements, castTarget, sourceParam, targetType, $"Pub{i}", $"PubDescSeg{i}");
            }

            var block = Expression.Block(statements);
            return Expression.Lambda<Action<object, PubPriSVData>>(block, targetParam, sourceParam).Compile();
        }

        private static void AddMapping(List<Expression> statements, Expression target, ParameterExpression source, Type targetType, string sourcePropName, string targetPropName)
        {
            var sourceProp = typeof(PubPriSVData).GetProperty(sourcePropName);
            var targetProp = targetType.GetProperty(targetPropName);

            if (sourceProp != null && targetProp != null)
            {
                var sourceValue = Expression.Property(source, sourceProp);
                var isNullOrEmptyMethod = typeof(string).GetMethod(nameof(string.IsNullOrEmpty));
                var check = Expression.Not(Expression.Call(isNullOrEmptyMethod, sourceValue));
                var assign = Expression.Assign(Expression.Property(target, targetProp), sourceValue);
                statements.Add(Expression.IfThen(check, assign));
            }
        }

        #endregion
    }
}

公私有段定义Model文件PubPriSVData

namespace UFIDA.U9.SH.OPENAPISV.Model
{
    /// <summary>
    /// 公私扩展字段 (带名称解析支持)
    /// </summary>
    public class PubPriSVData
    {
        /// <summary>
        /// 全局控制:是否忽略名称校验
        /// <para>True: 当根据Name查不到Code时,忽略错误继续执行 (结果可能为空)</para>
        /// <para>False (默认): 当根据Name查不到Code时,抛出异常</para>
        /// </summary>
        public bool IgnoreNameCheck { get; set; }

        #region  共有段 (Pub1 - Pub50)

        /// <summary>共有段1</summary>
        public string Pub1 { get; set; }
        /// <summary>共有段1-名称</summary>
        public string Pub1_Name { get; set; }

        public string Pub2 { get; set; }
        public string Pub2_Name { get; set; }

        public string Pub3 { get; set; }
        public string Pub3_Name { get; set; }

        public string Pub4 { get; set; }
        public string Pub4_Name { get; set; }

        public string Pub5 { get; set; }
        public string Pub5_Name { get; set; }

        public string Pub6 { get; set; }
        public string Pub6_Name { get; set; }

        public string Pub7 { get; set; }
        public string Pub7_Name { get; set; }

        public string Pub8 { get; set; }
        public string Pub8_Name { get; set; }

        public string Pub9 { get; set; }
        public string Pub9_Name { get; set; }

        public string Pub10 { get; set; }
        public string Pub10_Name { get; set; }

        public string Pub11 { get; set; }
        public string Pub11_Name { get; set; }

        public string Pub12 { get; set; }
        public string Pub12_Name { get; set; }

        public string Pub13 { get; set; }
        public string Pub13_Name { get; set; }

        public string Pub14 { get; set; }
        public string Pub14_Name { get; set; }

        public string Pub15 { get; set; }
        public string Pub15_Name { get; set; }

        public string Pub16 { get; set; }
        public string Pub16_Name { get; set; }

        public string Pub17 { get; set; }
        public string Pub17_Name { get; set; }

        public string Pub18 { get; set; }
        public string Pub18_Name { get; set; }

        public string Pub19 { get; set; }
        public string Pub19_Name { get; set; }

        public string Pub20 { get; set; }
        public string Pub20_Name { get; set; }

        public string Pub21 { get; set; }
        public string Pub21_Name { get; set; }

        public string Pub22 { get; set; }
        public string Pub22_Name { get; set; }

        public string Pub23 { get; set; }
        public string Pub23_Name { get; set; }

        public string Pub24 { get; set; }
        public string Pub24_Name { get; set; }

        public string Pub25 { get; set; }
        public string Pub25_Name { get; set; }

        public string Pub26 { get; set; }
        public string Pub26_Name { get; set; }

        public string Pub27 { get; set; }
        public string Pub27_Name { get; set; }

        public string Pub28 { get; set; }
        public string Pub28_Name { get; set; }

        public string Pub29 { get; set; }
        public string Pub29_Name { get; set; }

        public string Pub30 { get; set; }
        public string Pub30_Name { get; set; }

        public string Pub31 { get; set; }
        public string Pub31_Name { get; set; }

        public string Pub32 { get; set; }
        public string Pub32_Name { get; set; }

        public string Pub33 { get; set; }
        public string Pub33_Name { get; set; }

        public string Pub34 { get; set; }
        public string Pub34_Name { get; set; }

        public string Pub35 { get; set; }
        public string Pub35_Name { get; set; }

        public string Pub36 { get; set; }
        public string Pub36_Name { get; set; }

        public string Pub37 { get; set; }
        public string Pub37_Name { get; set; }

        public string Pub38 { get; set; }
        public string Pub38_Name { get; set; }

        public string Pub39 { get; set; }
        public string Pub39_Name { get; set; }

        public string Pub40 { get; set; }
        public string Pub40_Name { get; set; }

        public string Pub41 { get; set; }
        public string Pub41_Name { get; set; }

        public string Pub42 { get; set; }
        public string Pub42_Name { get; set; }

        public string Pub43 { get; set; }
        public string Pub43_Name { get; set; }

        public string Pub44 { get; set; }
        public string Pub44_Name { get; set; }

        public string Pub45 { get; set; }
        public string Pub45_Name { get; set; }

        public string Pub46 { get; set; }
        public string Pub46_Name { get; set; }

        public string Pub47 { get; set; }
        public string Pub47_Name { get; set; }

        public string Pub48 { get; set; }
        public string Pub48_Name { get; set; }

        public string Pub49 { get; set; }
        public string Pub49_Name { get; set; }

        public string Pub50 { get; set; }
        public string Pub50_Name { get; set; }

        #endregion

        #region  私有段 (Pri1 - Pri30)

        /// <summary>私有段1</summary>
        public string Pri1 { get; set; }
        /// <summary>私有段1-名称</summary>
        public string Pri1_Name { get; set; }

        public string Pri2 { get; set; }
        public string Pri2_Name { get; set; }

        public string Pri3 { get; set; }
        public string Pri3_Name { get; set; }

        public string Pri4 { get; set; }
        public string Pri4_Name { get; set; }

        public string Pri5 { get; set; }
        public string Pri5_Name { get; set; }

        public string Pri6 { get; set; }
        public string Pri6_Name { get; set; }

        public string Pri7 { get; set; }
        public string Pri7_Name { get; set; }

        public string Pri8 { get; set; }
        public string Pri8_Name { get; set; }

        public string Pri9 { get; set; }
        public string Pri9_Name { get; set; }

        public string Pri10 { get; set; }
        public string Pri10_Name { get; set; }

        public string Pri11 { get; set; }
        public string Pri11_Name { get; set; }

        public string Pri12 { get; set; }
        public string Pri12_Name { get; set; }

        public string Pri13 { get; set; }
        public string Pri13_Name { get; set; }

        public string Pri14 { get; set; }
        public string Pri14_Name { get; set; }

        public string Pri15 { get; set; }
        public string Pri15_Name { get; set; }

        public string Pri16 { get; set; }
        public string Pri16_Name { get; set; }

        public string Pri17 { get; set; }
        public string Pri17_Name { get; set; }

        public string Pri18 { get; set; }
        public string Pri18_Name { get; set; }

        public string Pri19 { get; set; }
        public string Pri19_Name { get; set; }

        public string Pri20 { get; set; }
        public string Pri20_Name { get; set; }

        public string Pri21 { get; set; }
        public string Pri21_Name { get; set; }

        public string Pri22 { get; set; }
        public string Pri22_Name { get; set; }

        public string Pri23 { get; set; }
        public string Pri23_Name { get; set; }

        public string Pri24 { get; set; }
        public string Pri24_Name { get; set; }

        public string Pri25 { get; set; }
        public string Pri25_Name { get; set; }

        public string Pri26 { get; set; }
        public string Pri26_Name { get; set; }

        public string Pri27 { get; set; }
        public string Pri27_Name { get; set; }

        public string Pri28 { get; set; }
        public string Pri28_Name { get; set; }

        public string Pri29 { get; set; }
        public string Pri29_Name { get; set; }

        public string Pri30 { get; set; }
        public string Pri30_Name { get; set; }

        #endregion
    }
}
0

评论 (0)

取消