using System.Globalization;
using System.Text;
using Admin.NET.Application.Entity;
namespace Admin.NET.Application
{
///
/// 单据号生成帮助类
///
public class SerialUtil
{
private readonly static object _lockTest = new();
private readonly static object _lockPublic = new();
///
/// 生成编号/单据号
///
///
///
public static async Task GetSerial(SerialTypeEnum SerialType, SqlSugarRepository _repRuleDetailRep, SqlSugarRepository _repSNRep)
{
string _result = string.Empty;
switch (SerialType)
{
case SerialTypeEnum.测试编号:
lock (_lockTest)
{
_result= GetSerialDetails(SerialType, _repRuleDetailRep, _repSNRep).Result;
break;
};
default:
lock (_lockPublic)
{//为了避免多线程出现编号一致的情况,加上锁,此处为公共锁,只用于不频繁生成编号的,若需要频繁生成,请参考上面Test设置单独锁
_result= GetSerialDetails(SerialType, _repRuleDetailRep, _repSNRep).Result;
break;
}
}
await Task.CompletedTask;
return _result;
}
///
/// 生成编号/单据号
///
///
///
private static async Task GetSerialDetails(SerialTypeEnum SerialType, SqlSugarRepository _repRuleDetailRep, SqlSugarRepository _repSNRep)
{
var lst =await _repRuleDetailRep.AsQueryable().Where(u => u.SerialType == (int)SerialType).OrderBy(x => x.ItemNo).ToListAsync();
string[] strs = new string[lst.Count];
WmsConfigSerialSN sl = new WmsConfigSerialSN();
for (int i = 0; i < lst.Count; i++)
{
if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.UD.ToString())
{
strs[i] = lst[i].UserDefine ?? string.Empty;//如果数据源是自定义,则取自定义字段
}
if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.BT.ToString())
{
strs[i] = lst[i].UserDefine ?? string.Empty;//如果数据源是自定义,则取自定义字段
}
if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.Y4.ToString())
{
strs[i] = DateTime.Now.Year.ToString();
}
if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.Y2.ToString())
{
strs[i] = DateTime.Now.Year.ToString().Substring(2, 2);
}
if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.M2.ToString())
{
strs[i] = DateTime.Now.Month.ToString("00");
}
if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.D2.ToString())
{
strs[i] = DateTime.Now.Day.ToString("00");
}
if (lst[i].SourceType.ToUpper() == SerialSourceTypeEnum.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() == SerialSourceTypeEnum.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 =await _repSNRep.AsQueryable().Where(x => x.SerialType == lst[i].SerialType && x.CurrentDate == DateTime.Now.Date)
.OrderByDescending(x => x.Sn).FirstAsync();
if (sn == null)
{
sl.Sn = 1;
}
else
{
sl.Sn = sn.Sn + 1;
}
}
else
{
var sn =await _repSNRep.AsQueryable().Where(x => x.SerialType == lst[i].SerialType).OrderByDescending(x => x.Sn).FirstAsync();
sl.Sn = sn.Sn + 1;
}
strs[i] = sl.Sn.ToString(c);
}
catch (Exception ex)
{
throw ex;
}
sl.CurrentDate = DateTime.Now.Date;
sl.SerialType = lst[i].SerialType;
}
}
StringBuilder WmsConfigSerialSN = new StringBuilder();
foreach (var item in strs)
{
WmsConfigSerialSN.Append(item.ToString());
}
// await sl.InsertAsync();
await _repSNRep.InsertAsync(sl);
//await repositoryBaseSerialSN.Add(sl);
//edm.SaveChanges();
if (string.IsNullOrEmpty(WmsConfigSerialSN.ToString()))
{
throw Oops.Oh("生成的编号为空");
}
return WmsConfigSerialSN.ToString();
}
}
}