You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

246 lines
11 KiB
C#

5 months ago
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
{
/// <summary>
/// 日期2024-03-06
/// 描述:编号规则
/// </summary>
public class CodeRuleApp : SqlSugarBaseApp<Repository.Domain.SysCodeRule, SugarDbContext>
{
private ICacheContext _iCache;
public CodeRuleApp(ISugarUnitOfWork<SugarDbContext> unitWork, ICacheContext cacheContext,
ISimpleClient<Repository.Domain.SysCodeRule> repository)
: base(unitWork, repository, null)
{
_iCache = cacheContext;
}
#region 单据编码处理
/// <summary>
/// 获得指定模块或者编号的单据号
/// </summary>
/// <param name="enCode">编码</param>
/// <returns>单据号</returns>
public async Task<string> GetBillCode(string enCode)
{
string billCode = ""; //单据号
string nextBillCode = "";//单据号
SysCodeRule coderuleentity = await GetEntityByCode(enCode);
if (coderuleentity != null)
{
List<CodeRuleFormatModel> codeRuleFormatList = coderuleentity.RuleFormatJson.ToList<CodeRuleFormatModel>();
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<int>(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;
}
/// <summary>
/// 保存规则表单(新增、修改)
/// </summary>
/// <param name="keyValue">主键值</param>
/// <param name="codeRuleEntity">规则实体</param>
/// <returns></returns>
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);
}
}
/// <summary>
/// 规则实体
/// </summary>
/// <param name="enCode">规则编码</param>
/// <returns></returns>
public Task<SysCodeRule> GetEntityByCode(string enCode)
{
return base.Repository.GetFirstAsync(t => t.EnabledMark == 1 && t.DeleteMark == 0 && t.EnCode == enCode);
}
#endregion
#region 单据编码处理
/// <summary>
/// 获取当前编码规则流程号值
/// </summary>
/// <param name="ruleId"></param>
/// <param name="initValue"></param>
/// <param name="stepNum"></param>
/// <param name="dateFormatStr"></param>
/// <returns></returns>
public async Task<int> GetSeedValue(string ruleId, int initValue, int stepNum, string dateFormatStr)
{
int value = 0;
using (SugarDbContext db = base.UnitWork.CreateContext())
{
var codeRuleSeed = await base.Repository.ChangeRepository<SugarRepositiry<SysCodeRuleSeed>>().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
}
}