using System;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using Admin.NET.Application.Entity;
namespace Admin.NET.Application
{
///
/// 单据号生成帮助类
///
public class SerialUtilOrder
{
private readonly static object _lockTest = new();
private readonly static object _lockPublic = new();
///
/// 生成编号/单据号-ly
///
///
///
///
///
///
///
public static async Task GetSerialOrder(OrderTypeEnum SerialType,
SqlSugarRepository _repRuleDetailRep,
SqlSugarRepository _repSNRep,
int BusinessType, string OrderNo)
{
string _result = string.Empty;
// _result = GetSerialDetailsOrder(SerialType, _repRuleDetailRep, _repSNRep, BusinessType, OrderNo).Result;
switch (SerialType)
{
case (OrderTypeEnum)SerialTypeEnum.测试编号:
lock (_lockTest)
{
_result = GetSerialDetailsOrder(SerialType, _repRuleDetailRep, _repSNRep, BusinessType, OrderNo).Result;
break;
};
default:
lock (_lockPublic)
{//为了避免多线程出现编号一致的情况,加上锁,此处为公共锁,只用于不频繁生成编号的,若需要频繁生成,请参考上面Test设置单独锁
_result = GetSerialDetailsOrder(SerialType, _repRuleDetailRep, _repSNRep, BusinessType, OrderNo).Result;
break;
}
}
await Task.CompletedTask;
return _result;
}
///
/// 生成编号/单据号 -ly
///
///
///
///
///
///
///
private static async Task GetSerialDetailsOrder(OrderTypeEnum SerialType,
SqlSugarRepository _repRuleDetailRep,
SqlSugarRepository _repSNRep, int BusinessType, string OrderNo)
{
//NoRule var lst =await _repRuleDetailRep.AsQueryable().Where(u => u.OrderType == (int)SerialType).OrderBy(x => x.ItemNo).ToListAsync();
//var lst = await _repRuleDetailRep.AsQueryable().Where(u => u.OrderType == SerialType && u.BusinessType == BusinessType).ToListAsync();
var orderCode = "";
var lst = await _repRuleDetailRep
.GetFirstAsync(u => u.OrderType == SerialType && u.BusinessType == BusinessType && u.IsDisabled == false && u.IsDisabled == false);
if (lst!=null)
{
List values = new List();
// 正则表达式匹配花括号内的内容
string pattern = @"\{(.+?)\}";
MatchCollection matches = Regex.Matches(lst.NoRule, pattern);
foreach (Match match in matches)
{
if (match.Success)
{
string value = match.Groups[1].Value; // 提取花括号内的值
values.Add(value);
}
}
var dateStr = "";
if (values.Contains("yyyy"))
{
dateStr += values[values.IndexOf("yyyy")];
}
if (values.Contains("MM"))
{
dateStr += values[values.IndexOf("MM")];
}
if (values.Contains("dd"))
{
dateStr += values[values.IndexOf("dd")];
}
// 获取当前时间
DateTime currentTime = DateTime.Now;
// 格式化为年月日字符串
string formattedDate = currentTime.ToString(dateStr);
//获取规则最后的自增序列
var serialNo = "";
//根据不同输入的单据类别查询最近一条单号
//如果单据在当前这个年月日下创建过了就从这个单据后面自增
if (OrderNo == null)
{
serialNo = lst.SerialNoStepSize.ToString("D" + lst.SerialNoLength);
orderCode = values[0] + BusinessType.ToString() + formattedDate + serialNo;
}
else if (OrderNo.Contains(formattedDate))
{
serialNo = OrderNo.Substring(OrderNo.Length - lst.SerialNoLength);
int serialNoNum = int.Parse(serialNo);
serialNoNum += lst.SerialNoStepSize;
serialNo = serialNoNum.ToString().PadLeft(lst.SerialNoLength, '0');
//拼接
orderCode = values[0] + BusinessType.ToString() + formattedDate + serialNo;
}
//如果今天没有创建单据那就从最小的开始新增一条
else
{
serialNo = lst.SerialNoStepSize.ToString("D" + lst.SerialNoLength);
orderCode = values[0] + BusinessType.ToString() + formattedDate + serialNo;
}
}
//var ruleArr = lst.NoRule.Replace(',', ',').Split(',').ToList();
//string[] strs = new string[ruleArr.Count];
//WmsConfigSerialSN sl = new WmsConfigSerialSN();
//for (int i = 0; i < ruleArr.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 _repSNRep.InsertAsync(sl);
//if (string.IsNullOrEmpty(WmsConfigSerialSN.ToString()))
//{
// throw Oops.Oh("生成的编号为空");
//}
// return WmsConfigSerialSN.ToString();
return orderCode;
}
}
}