using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using LM.Core.Configuration;
using LM.Core.DBManager;
using LM.Core.DbSqlSugar;
using LM.Core.Enums;
using LM.Core.Extensions;
namespace LM.Core.Extensions
{
public static class IdentityCode
{
///
/// 创建自增单据号
///
///
/// 实体对象
/// 要设置单据号的字段
/// 单据号前缀,如:{TC}{2023}{0001}
/// 排序字段,每天都从第1个号码开始
///
/// 使用示例:
/// Sys_User user= new Sys_User();
/// user.Create(x => x.UserName, "U", x => x.CreateDate);
///
public static string Create(this T entity,
Expression> codeField,
string preCode = "Code",
Expression> dateFieldExpression = null
) where T : class
{
string dateField;
if (dateFieldExpression == null)
{
dateField = AppSetting.CreateMember.DateField;
}
else
{
dateField = dateFieldExpression.GetExpressionPropertyFirst();
}
DateTime dateNow = (DateTime)DateTime.Now.ToString("yyyy-MM-dd").GetDateTime();
var condition = dateField.CreateExpression(dateNow, LinqExpressionType.ThanOrEqual);
var field = codeField.GetExpressionPropertyFirst();
var select = field.GetExpression();
string orderNo = DbManger.Db.Queryable().Where(condition)
.OrderByDescending(codeField)
.Select(select)
.FirstOrDefault()
?.ToString();
string rule = $"{preCode}{DateTime.Now.ToString("yyyyMMdd")}";
if (string.IsNullOrEmpty(orderNo))
{
rule += "0001";
}
else
{
rule += (orderNo.Substring(orderNo.Length - 4).GetInt() + 1).ToString("0000");
}
var property = typeof(T).GetProperty(field);
property.SetValue(entity, rule);
return rule;
}
}
}