using HslCommunication.Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace HslCommunication.BasicFramework { /******************************************************************************************** * * 一个高度灵活的流水号生成的类,允许根据指定规则加上时间数据进行生成 * * 根据保存机制进行优化,必须做到好并发量 * ********************************************************************************************/ /// /// 一个用于自动流水号生成的类,必须指定保存的文件,实时保存来确认安全 /// public sealed class SoftNumericalOrder : SoftFileSaveBase { #region Constructor /// /// 实例化一个流水号生成的对象 /// /// 流水号的头文本 /// 流水号带的时间信息 /// 流水号数字的标准长度,不够补0 /// 流水号存储的文本位置 public SoftNumericalOrder( string textHead, string timeFormate, int numberLength, string fileSavePath ) { LogHeaderText = "SoftNumericalOrder"; TextHead = textHead; TimeFormate = timeFormate; NumberLength = numberLength; FileSavePath = fileSavePath; LoadByFile( ); AsyncCoordinator = new HslAsyncCoordinator( ( ) => { if (!string.IsNullOrEmpty( FileSavePath )) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter( FileSavePath, false, Encoding.Default )) { sw.Write( CurrentIndex ); } } } ); } #endregion #region Private Member /// /// 当前的生成序列号 /// private long CurrentIndex = 0; /// /// 流水号的文本头 /// private string TextHead = string.Empty; /// /// 时间格式默认年月日 /// private string TimeFormate = "yyyyMMdd"; /// /// 流水号数字应该显示的长度 /// private int NumberLength = 5; #endregion #region Public Method /// /// 获取流水号的值 /// /// public override string ToSaveString( ) { return CurrentIndex.ToString( ); } /// /// 加载流水号 /// /// public override void LoadByString( string content ) { CurrentIndex = Convert.ToInt64( content ); } /// /// 清除流水号计数,进行重新计数 /// public void ClearNumericalOrder( ) { Interlocked.Exchange( ref CurrentIndex, 0 ); AsyncCoordinator.StartOperaterInfomation( ); } /// /// 获取流水号数据 /// /// public string GetNumericalOrder( ) { long number = Interlocked.Increment( ref CurrentIndex ); AsyncCoordinator.StartOperaterInfomation( ); if (string.IsNullOrEmpty( TimeFormate )) { return TextHead + number.ToString( ).PadLeft( NumberLength, '0' ); } else { return TextHead + DateTime.Now.ToString( TimeFormate ) + number.ToString( ).PadLeft( NumberLength, '0' ); } } /// /// 获取流水号数据 /// /// 指定一个新的文本头 /// public string GetNumericalOrder( string textHead ) { long number = Interlocked.Increment( ref CurrentIndex ); AsyncCoordinator.StartOperaterInfomation( ); if (string.IsNullOrEmpty( TimeFormate )) { return textHead + number.ToString( ).PadLeft( NumberLength, '0' ); } else { return textHead + DateTime.Now.ToString( TimeFormate ) + number.ToString( ).PadLeft( NumberLength, '0' ); } } /// /// 单纯的获取数字形式的流水号 /// /// public long GetLongOrder( ) { long number = Interlocked.Increment( ref CurrentIndex ); AsyncCoordinator.StartOperaterInfomation( ); return number; } #endregion #region 高性能存储块 /// /// 高性能存储块 /// private HslAsyncCoordinator AsyncCoordinator { get; set; } #endregion } /// /// 一个简单的不持久化的序号自增类,采用线程安全实现,并允许指定最大数字,到达后清空从指定数开始 /// public sealed class SoftIncrementCount { #region Constructor /// /// 实例化一个自增信息的对象,包括最大值 /// /// 数据的最大值,必须指定 /// 数据的起始值,默认为0 public SoftIncrementCount( long max, long start = 0 ) { this.start = start; this.max = max; current = start; hybirdLock = new SimpleHybirdLock( ); } #endregion #region Private Member private long start = 0; private long current = 0; private long max = long.MaxValue; private SimpleHybirdLock hybirdLock; #endregion #region Public Method /// /// 获取自增信息 /// /// public long GetCurrentValue( ) { long value = 0; hybirdLock.Enter( ); value = current; current++; if (current > max) { current = 0; } hybirdLock.Leave( ); return value; } #endregion } }