场景:创建的订单号有固定的前缀,中级为年月日,后缀流水三位,如‘VD20190802001’,如果各位需求不一样可以稍微修改下方法实现。
//线程锁,保证并发时不会产生重复的订单号
private static readonly object SequenceLock = new object();
/// <summary>
/// 获取单号
/// </summary>
/// <param name="preString">指定前缀</param>
/// <param name="tableName">生成单号的表名</param>
/// <returns></returns>
public static string GetNewOrderNO(string preString,string tableName)
{
lock(SequenceLock)
{
string result = "";
string sql = string.Format(@"Select max(ID) from {0}", tableName);
//连接数据库查找最大的订单号
string curid = Pub_DB.OracleDataAccess.ExecuteScalar(ConnfigSetting.GetShipUserConStr(), sql).ToString();
if (string.IsNullOrEmpty(curid))
{
curid = preString + DateTime.Now.ToString("yyyyMMdd") + "000";
}
string maxid = curid.Substring(curid.Length - 3, 3);
string maxdate = curid.Substring(preString.Length, 8);
if (DateTime.Now.ToString("yyyyMMdd") == maxdate)
{
result = preString + maxdate + (Convert.ToInt16(maxid) + 1).ToString("000");
}
else
{
result = preString + DateTime.Now.ToString("yyyyMMdd") + "001";
}
return result;
}
}