/// <summary>
 /// 构造函数
 /// </summary>
 public SerialIdDetailResultData(FixedPrefix fixedPrefix, CustomPrefix customPrefix, DateTime createDateTime, string ip, int random)
 {
     FixedPrefix    = fixedPrefix;
     CustomPrefix   = customPrefix;
     CreateDateTime = createDateTime;
     Ip             = ip;
     Random         = random;
 }
        /// <summary>
        /// 会员卡生成规则
        /// </summary>
        /// <param name="fixedPrefix"></param>
        /// <param name="customPrefix"></param>
        /// <returns></returns>
        public static SerialIdResultData GetCard(FixedPrefix fixedPrefix, CustomPrefix customPrefix)
        {
            const string zero           = "0";
            const string defaultLocalIp = "00000000";

            lock (LockObj)
            {
                if (!_beginTimespan.HasValue)//IIS被回收或者首次使用
                {
                    _beginTimespan = Helper.ConvertDateTimeInt(DateTime.Now);
                }
                var successSerialId = string.Empty;
                while (string.IsNullOrEmpty(successSerialId))
                {
                    //获取当前时间戳
                    var timestamp = Helper.ConvertDateTimeInt(DateTime.Now);
                    //判断首次使用的时间与当前时间
                    if ((timestamp - _beginTimespan.Value).Equals(0))
                    {
                        Thread.Sleep(10);
                        continue;
                    }
                    //获取固定前缀
                    var fixPrefix = Helper.GetEnumDesc(fixedPrefix);
                    //用户自定义前缀为空,则为A
                    //获取用户自定义前缀
                    var cpx = Helper.GetEnumDesc(customPrefix);
                    //判断本机IP是否为空,为空则获取
                    if (string.IsNullOrEmpty(_localIp))
                    {
                        _localIp = GetIpAddress();
                    }
                    //获取不到本机IP,则用默认值代替
                    if (string.IsNullOrEmpty(_localIp))
                    {
                        _localIp = defaultLocalIp;
                    }
                    //构造随机种子
                    var seed   = Guid.NewGuid().GetHashCode();
                    var random = new Random(seed);
                    //随机订单号的最后3位
                    var timefix = random.Next(0, 99).ToString(CultureInfo.InvariantCulture);
                    while (timefix.Length < 2)//不足3位前面补0
                    {
                        timefix = zero + timefix;
                    }
                    //构建订单号
                    //转换时间戳为16进制,并替换E为U
                    var time = Convert.ToString(timestamp, 16).ToUpper().Replace('E', 'U');
                    //IP替换E为U
                    var localIp  = _localIp.ToUpper().Replace('E', 'U').Substring(0, 4);
                    var serialId = fixPrefix + cpx + time + localIp + timefix;
                    serialId = serialId.ToLower();
                    //判断是否重复
                    var isDone = SystemCacheHelper.TicketStore(serialId);
                    successSerialId = isDone ? serialId : string.Empty;
                }
                //转为小写
                successSerialId = successSerialId.ToLower();
                var resultData = new SerialIdResultData
                {
                    ResultCode = string.IsNullOrEmpty(_localIp) ? ResultCode.Error : ResultCode.Success,
                    SerialId   = successSerialId
                };
                return(resultData);
            }
        }