using System;
|
using System.Globalization;
|
using System.Text;
|
using System.Text.RegularExpressions;
|
using Admin.NET.Application.Entity;
|
|
namespace Admin.NET.Application
|
{
|
/// <summary>
|
/// 单据号生成帮助类
|
/// </summary>
|
public class SerialUtilOrder
|
{
|
private readonly static object _lockTest = new();
|
private readonly static object _lockPublic = new();
|
|
|
|
/// <summary>
|
/// 生成编号/单据号-ly
|
/// </summary>
|
/// <param name="SerialType"></param>
|
/// <param name="_repRuleDetailRep"></param>
|
/// <param name="_repSNRep"></param>
|
/// <param name="BusinessType"></param>
|
/// <param name="OrderNo"></param>
|
/// <returns></returns>
|
public static async Task<string> GetSerialOrder(OrderTypeEnum SerialType,
|
SqlSugarRepository<WmsConfigNoRule> _repRuleDetailRep,
|
SqlSugarRepository<WmsConfigSerialSN> _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;
|
}
|
/// <summary>
|
/// 生成编号/单据号 -ly
|
/// </summary>
|
/// <param name="SerialType"></param>
|
/// <param name="_repRuleDetailRep"></param>
|
/// <param name="_repSNRep"></param>
|
/// <param name="BusinessType"></param>
|
/// <param name="OrderNo"></param>
|
/// <returns></returns>
|
private static async Task<string> GetSerialDetailsOrder(OrderTypeEnum SerialType,
|
SqlSugarRepository<WmsConfigNoRule> _repRuleDetailRep,
|
SqlSugarRepository<WmsConfigSerialSN> _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<string> values = new List<string>();
|
|
// 正则表达式匹配花括号内的内容
|
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;
|
}
|
}
|
}
|