using OpenAuth.App.Base;
using OpenAuth.App.DataCodeRule.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Infrastructure.Extensions;
using Infrastructure.Cache;
using OpenAuth.App.BaseApp.Base;
namespace OpenAuth.App.DataCodeRule
{
///
/// 日期:2024-03-06
/// 描述:编号规则
///
public class CodeRuleApp : SqlSugarBaseApp
{
private ICacheContext _iCache;
public CodeRuleApp(ISugarUnitOfWork unitWork, ICacheContext cacheContext,
ISimpleClient repository)
: base(unitWork, repository, null)
{
_iCache = cacheContext;
}
#region 单据编码处理
///
/// 获得指定模块或者编号的单据号
///
/// 编码
/// 单据号
public async Task GetBillCode(string enCode)
{
string billCode = ""; //单据号
string nextBillCode = "";//单据号
SysCodeRule coderuleentity = await GetEntityByCode(enCode);
if (coderuleentity != null)
{
List codeRuleFormatList = coderuleentity.RuleFormatJson.ToList();
string dateFormatStr = "";
foreach (CodeRuleFormatModel codeRuleFormatEntity in codeRuleFormatList)
{
switch (codeRuleFormatEntity.itemType.ToString())
{
//自定义项
case "0":
billCode += codeRuleFormatEntity.formatStr;
nextBillCode += codeRuleFormatEntity.formatStr;
break;
//日期
case "1":
//日期字符串类型
dateFormatStr += codeRuleFormatEntity.formatStr.Replace("m", "M");
billCode += DateTime.Now.ToString(dateFormatStr);
nextBillCode += DateTime.Now.ToString(dateFormatStr);
break;
//流水号
case "2":
int seedStep = codeRuleFormatEntity.stepValue == null ? 1 : int.Parse(codeRuleFormatEntity.stepValue.ToString());//如果步长为空默认1
int initValue = codeRuleFormatEntity.initValue == null ? 1 : int.Parse(codeRuleFormatEntity.initValue.ToString());//如果初始值为空默认1
int nowSerious = await _iCache.Lock(coderuleentity.RuleId, id => { return GetSeedValue(coderuleentity.RuleId, initValue, seedStep, dateFormatStr); });
//int nowSerious =await codeRuleService.GetSeedValue(coderuleentity.F_RuleId, initValue, seedStep, dateFormatStr);
int nextSerious = nowSerious + seedStep;
// 最大种子已经过期
string seriousStr = new string('0', (int)(codeRuleFormatEntity.formatStr.Length - nowSerious.ToString().Length)) + nowSerious.ToString();
string NextSeriousStr = new string('0', (int)(codeRuleFormatEntity.formatStr.Length - nextSerious.ToString().Length)) + nextSerious.ToString();
billCode += seriousStr;
nextBillCode += NextSeriousStr;
break;
//部门
case "3":
//var userInfo = await CurrentUser();
//DepartmentEntity departmentEntity = await _departmentIBLL.GetEntity(userInfo.F_DepartmentId);
//if (departmentEntity != null)
//{
// if (codeRuleFormatEntity.formatStr == "code")
// {
// billCode += departmentEntity.F_EnCode;
// nextBillCode = nextBillCode + departmentEntity.F_EnCode;
// }
// else
// {
// billCode = billCode + departmentEntity.F_FullName;
// nextBillCode = nextBillCode + departmentEntity.F_FullName;
// }
//}
break;
//公司
case "4":
//var userInfo2 = await CurrentUser();
//CompanyEntity companyEntity = await _companyIBLL.GetEntity(userInfo2.F_CompanyId);
//if (companyEntity != null)
//{
// if (codeRuleFormatEntity.formatStr == "code")
// {
// billCode += companyEntity.F_EnCode;
// nextBillCode += companyEntity.F_EnCode;
// }
// else
// {
// billCode += companyEntity.F_FullName;
// nextBillCode += companyEntity.F_FullName;
// }
//}
break;
//用户
case "5":
//var userInfo3 = await CurrentUser();
//if (codeRuleFormatEntity.formatStr == "code")
//{
// billCode += userInfo3.F_Account;
// nextBillCode += userInfo3.F_Account;
//}
//else
//{
// billCode += userInfo3.F_RealName;
// nextBillCode += userInfo3.F_RealName;
//}
break;
default:
break;
}
}
coderuleentity.CurrentNumber = nextBillCode;
await SaveEntity(coderuleentity.RuleId, coderuleentity);
}
return billCode;
}
///
/// 保存规则表单(新增、修改)
///
/// 主键值
/// 规则实体
///
public async Task SaveEntity(string keyValue, SysCodeRule codeRuleEntity)
{
if (!string.IsNullOrEmpty(keyValue))
{
codeRuleEntity.RuleId = keyValue;
codeRuleEntity.ModifyDate = DateTime.Now;
codeRuleEntity.ModifyUserId = _auth.GetUserId();
codeRuleEntity.ModifyUserName = _auth.GetUserName();
await base.Repository.UpdateAsync(codeRuleEntity);
}
else
{
codeRuleEntity.RuleId = Guid.NewGuid().ToString();
codeRuleEntity.CreateDate = DateTime.Now;
codeRuleEntity.DeleteMark = 0;
codeRuleEntity.EnabledMark = 1;
codeRuleEntity.CreateUserId = _auth.GetUserId();
codeRuleEntity.CreateUserName = _auth.GetUserName();
await base.Repository.InsertAsync(codeRuleEntity);
}
}
///
/// 规则实体
///
/// 规则编码
///
public Task GetEntityByCode(string enCode)
{
return base.Repository.GetFirstAsync(t => t.EnabledMark == 1 && t.DeleteMark == 0 && t.EnCode == enCode);
}
#endregion
#region 单据编码处理
///
/// 获取当前编码规则流程号值
///
///
///
///
///
///
public async Task GetSeedValue(string ruleId, int initValue, int stepNum, string dateFormatStr)
{
int value = 0;
using (SugarDbContext db = base.UnitWork.CreateContext())
{
var codeRuleSeed = await base.Repository.ChangeRepository>().GetFirstAsync(t => t.RuleId == ruleId);
if (codeRuleSeed == null)
{
//说明没有种子,插入一条种子
codeRuleSeed = new SysCodeRuleSeed();
codeRuleSeed.RuleSeedId = Guid.NewGuid().ToString();
codeRuleSeed.CreateDate = DateTime.Now;
codeRuleSeed.ModifyDate = DateTime.Now;
codeRuleSeed.SeedValue = initValue;
codeRuleSeed.RuleId = ruleId;
value = (int)codeRuleSeed.SeedValue;
codeRuleSeed.SeedValue += stepNum;
await db.SysCodeRuleSeed.InsertAsync(codeRuleSeed);
}
else
{
if (dateFormatStr.Contains("dd"))
{
if ((codeRuleSeed.ModifyDate).ToDateString() != DateTime.Now.ToString("yyyy-MM-dd"))
{
codeRuleSeed.SeedValue = initValue;
}
}
else if (dateFormatStr.Contains("mm"))
{
if (((DateTime)codeRuleSeed.ModifyDate).ToString("yyyy-MM") != DateTime.Now.ToString("yyyy-MM"))
{
codeRuleSeed.SeedValue = initValue;
}
}
else if (dateFormatStr.Contains("yy"))
{
if (((DateTime)codeRuleSeed.ModifyDate).ToString("yyyy") != DateTime.Now.ToString("yyyy"))
{
codeRuleSeed.SeedValue = initValue;
}
}
codeRuleSeed.ModifyDate = DateTime.Now;
value = (int)codeRuleSeed.SeedValue;
codeRuleSeed.SeedValue += stepNum;
await db.SysCodeRuleSeed.UpdateAsync(codeRuleSeed);
}
db.Commit();
return value;
}
}
#endregion
}
}