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
}
}