using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.FriendlyException;
using System.Globalization;
using System.Text;
using Admin.NET.Core;
namespace Admin.NET.Application
{
///
/// 单据号生成帮助类
///
public class SerialUtil
{
private readonly static object _lockTest = new();
private readonly static object _lockPublic = new();
///
/// 生成编号/单据号
///
///
///
public static async Task GetSerial(EnumSerialType SerialType)
{
switch (SerialType)
{
case EnumSerialType.测试编号:
lock (_lockTest)
{
return GetSerialDetails(SerialType).Result;
};
default:
lock (_lockPublic)
{//为了避免多线程出现编号一致的情况,加上锁,此处为公共锁,只用于不频繁生成编号的,若需要频繁生成,请参考上面Test设置单独锁
return GetSerialDetails(SerialType).Result;
}
}
}
///
/// 生成编号/单据号
///
///
///
private static async Task GetSerialDetails(EnumSerialType SerialType)
{
// 泛型仓储
var repositoryBaseSerialRuleDetail = Db.GetRepository();
var repositoryBaseSerialSN = Db.GetRepository();
var lst = repositoryBaseSerialRuleDetail.Where(x => x.SerialType == (int)SerialType)
.OrderBy(x => x.ItemNo).ToList();
string[] strs = new string[lst.Count];
BaseSerialSN sl = new BaseSerialSN();
for (int i = 0; i < lst.Count; i++)
{
if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.UD.ToString())
{
strs[i] = lst[i].UserDefine ?? string.Empty;//如果数据源是自定义,则取自定义字段
}
if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.Y4.ToString())
{
strs[i] = DateTime.Now.Year.ToString();
}
if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.Y2.ToString())
{
strs[i] = DateTime.Now.Year.ToString().Substring(2, 2);
}
if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.M2.ToString())
{
strs[i] = DateTime.Now.Month.ToString("00");
}
if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.D2.ToString())
{
strs[i] = DateTime.Now.Day.ToString("00");
}
if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.W2.ToString())
{
GregorianCalendar gc = new GregorianCalendar();
int week = gc.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
strs[i] = "W" + week.ToString();
}
if (lst[i].SourceType.ToUpper() == EnumSerialSourceType.SN.ToString())
{
int cout = lst[i].SerialLength;
string c = string.Empty;
for (int j = 0; j < cout; j++)
{
c += "0";
}
try
{
if (lst[i].GetData.HasValue && lst[i].GetData == 1)
{
var sn = repositoryBaseSerialSN.Where(x => x.SerialType == lst[i].SerialType && x.CurrentDate == DateTime.Now.Date)
.OrderByDescending(x => x.Sn).First();
sl.Sn = sn.Sn + 1;
}
else
{
var sn = repositoryBaseSerialSN.Where(x => x.SerialType == lst[i].SerialType)
.OrderByDescending(x => x.Sn).First();
sl.Sn = sn.Sn + 1;
}
strs[i] = sl.Sn.ToString(c);
}
catch (Exception ex)
{
strs[i] = 1.ToString(c);
sl.Sn = 1;
}
sl.CurrentDate = DateTime.Now.Date;
sl.SerialType = lst[i].SerialType;
}
}
StringBuilder BaseSerialSN = new StringBuilder();
foreach (var item in strs)
{
BaseSerialSN.Append(item.ToString());
}
await sl.InsertAsync();
//await repositoryBaseSerialSN.Add(sl);
//edm.SaveChanges();
if (string.IsNullOrEmpty(BaseSerialSN.ToString()))
{
throw Oops.Oh("生成的编号为空");
}
return BaseSerialSN.ToString();
}
}
}