/// <summary>
        /// 单据状态跟踪描述信息。
        /// </summary>
        /// <param name="docType"></param>
        /// <param name="docEntityInfo">单据对应的实体对象</param>
        /// <param name="remark"></param>
        /// <param name="operateType"></param>
        public DocStateTraceInfo(string docType, MB.Orm.Common.BaseModel docEntityInfo, string remark, DocOperateType operateType)
        {
            _DOC_TYPE = docType;
            _OP_STATE = operateType;
            _REMARK   = remark;

            MB.Orm.Mapping.Att.ModelMapAttribute att = Attribute.GetCustomAttribute(docEntityInfo.GetType(), typeof(MB.Orm.Mapping.Att.ModelMapAttribute)) as MB.Orm.Mapping.Att.ModelMapAttribute;
            if (att == null)
            {
                throw new MB.Util.APPException("在进行DocStateTrace 时对应的实体对象需要配置 MB.Orm.Mapping.Att.ModelMapAttribute", MB.Util.APPMessageType.SysErrInfo);
            }

            _OBJECT_TABLE_NAME = att.TableName;
            _DOC_ID            = MB.Util.MyReflection.Instance.InvokePropertyForGet <int>(docEntityInfo, "ID");
            _DOC_ORG_SATE      = MB.Util.MyReflection.Instance.InvokePropertyForGet <int>(docEntityInfo, "DOC_STATE");

            _OP_USER_CODE = MB.WcfService.MessageHeaderHelper.GetCurrentLoginUser().USER_CODE;
        }
        /// <summary>
        /// 获取数据对象的主键。
        /// </summary>
        /// <param name="baseRule"></param>
        /// <param name="dataInfo"></param>
        /// <returns></returns>
        public object GetObjectKeyValue(IBaseRule baseRule, ObjectDataInfo dataInfo)
        {
            string keyName = null;

            if (dataInfo.DataInDocType != null)
            {
                ObjectDataMappingAttribute mappingAtt = AttributeConfigHelper.Instance.GetObjectDataMappingAttribute(dataInfo.DataInDocType);
                if (mappingAtt != null)
                {
                    keyName = mappingAtt.KeyName;
                }
            }
            bool isEntity = dataInfo.ObjectData.GetType().IsSubclassOf(typeof(MB.Orm.Common.BaseModel));

            if (string.IsNullOrEmpty(keyName) && isEntity)
            {
                MB.Orm.Mapping.Att.ModelMapAttribute tattr = Attribute.GetCustomAttribute(dataInfo.ObjectData.GetType(), typeof(MB.Orm.Mapping.Att.ModelMapAttribute)) as MB.Orm.Mapping.Att.ModelMapAttribute;
                string[] keys = tattr.PrimaryKeys;

                if (keys != null && keys.Length > 0)
                {
                    MB.Util.TraceEx.Assert(keys.Length > 1, "业务类:" + baseRule.GetType().FullName + " 主表对象的键值配置不能存在联合主键!");
                }
                keyName = keys[0];
            }
            if (string.IsNullOrEmpty(keyName))
            {
                throw new MB.Util.APPException("业务类:" + baseRule.GetType().FullName + " 的主表对象的主键信息没有配置!", MB.Util.APPMessageType.SysErrInfo);
            }

            if (isEntity)
            {
                return(MB.Util.MyReflection.Instance.InvokePropertyForGet(dataInfo.ObjectData, keyName));
            }
            else if ((dataInfo.ObjectData as DataRow) != null)
            {
                return((dataInfo.ObjectData as DataRow)[keyName]);
            }
            else
            {
                throw new MB.Util.APPException("获取业务类:" + baseRule.GetType().FullName + " 的主表对象的键值有误!", MB.Util.APPMessageType.SysErrInfo);
            }
        }