Files
tnb.server/system/Tnb.Systems/System/BillRuleService.cs
2024-07-03 17:06:02 +08:00

367 lines
13 KiB
C#

using System.Text;
using Aop.Api.Domain;
using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Core.Manager.Files;
using JNPF.Common.Enums;
using JNPF.Common.Filter;
using JNPF.Common.Manager;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.LinqBuilder;
using JNPF.Logging.Attributes;
using JNPF.Systems.Entitys.Dto.BillRule;
using JNPF.Systems.Entitys.Dto.System.BillRule;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using Mapster;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using NPOI.SS.Formula.Functions;
using SqlSugar;
namespace JNPF.Systems;
/// <summary>
/// 单据规则.
/// </summary>
[ApiDescriptionSettings(Tag = "System", Name = "BillRule", Order = 200)]
[Route("api/system/[controller]")]
public class BillRuleService : IBillRullService, IDynamicApiController, ITransient
{
/// <summary>
/// 服务基础仓储.
/// </summary>
private readonly ISqlSugarRepository<BillRuleEntity> _repository;
/// <summary>
/// 文件服务.
/// </summary>
private readonly IFileManager _fileManager;
/// <summary>
/// 缓存管理器.
/// </summary>
private readonly ICacheManager _cacheManager;
/// <summary>
/// 用户管理.
/// </summary>
private readonly IUserManager _userManager;
/// <summary>
/// 初始化一个<see cref="BillRuleService"/>类型的新实例.
/// </summary>
public BillRuleService(
ISqlSugarRepository<BillRuleEntity> repository,
ICacheManager cacheManager,
IUserManager userManager,
IFileManager fileManager)
{
_repository = repository;
_cacheManager = cacheManager;
_userManager = userManager;
_fileManager = fileManager;
}
#region Get
/// <summary>
/// 列表.
/// </summary>
/// <returns></returns>
[HttpGet("Selector")]
public async Task<dynamic> GetSelector([FromQuery] BillRuleListQueryInput input)
{
var list = await _repository.AsSugarClient().Queryable<BillRuleEntity, UserEntity>((a, b) => new JoinQueryInfos(JoinType.Left, b.Id == a.CreatorUserId))
.Where(a => a.DeleteMark == null && a.EnabledMark == 1)
.WhereIF(!string.IsNullOrEmpty(input.categoryId), a => a.Category == input.categoryId)
.WhereIF(!string.IsNullOrEmpty(input.keyword), a => a.FullName.Contains(input.keyword) || a.EnCode.Contains(input.keyword))
.OrderBy(a => a.SortCode).OrderBy(a => a.CreatorTime, OrderByType.Desc)
.Select((a, b) => new BillRuleListOutput
{
id = a.Id,
lastModifyTime = a.LastModifyTime,
enabledMark = a.EnabledMark,
creatorUser = SqlFunc.MergeString(b.RealName, "/", b.Account),
fullName = a.FullName,
enCode = a.EnCode,
outputNumber = a.OutputNumber,
digit = a.Digit,
startNumber = a.StartNumber,
sortCode = a.SortCode,
creatorTime = a.CreatorTime
}).ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult<BillRuleListOutput>.SqlSugarPageResult(list);
}
/// <summary>
/// 获取单据规则列表(带分页).
/// </summary>
/// <param name="input">请求参数.</param>
/// <returns></returns>
[HttpGet("")]
[OperateLog("单据规则", "查询")]
public async Task<dynamic> GetList([FromQuery] BillRuleListQueryInput input)
{
var list = await _repository.AsSugarClient().Queryable<BillRuleEntity, UserEntity, DictionaryDataEntity>((a, b, c) => new JoinQueryInfos(JoinType.Left, a.CreatorUserId == b.Id, JoinType.Left, a.Category == c.Id))
.Where(a => a.DeleteMark == null)
.WhereIF(!string.IsNullOrEmpty(input.categoryId), a => a.Category == input.categoryId)
.WhereIF(!string.IsNullOrEmpty(input.keyword), a => a.FullName.Contains(input.keyword) || a.EnCode.Contains(input.keyword))
.Select((a, b, c) => new BillRuleListOutput
{
id = a.Id,
lastModifyTime = a.LastModifyTime,
enabledMark = a.EnabledMark,
creatorUser = SqlFunc.MergeString(b.RealName, "/", b.Account),
fullName = a.FullName,
enCode = a.EnCode,
outputNumber = a.OutputNumber,
digit = a.Digit,
startNumber = a.StartNumber,
sortCode = a.SortCode,
creatorTime = a.CreatorTime,
category = c.FullName
}).MergeTable()
.OrderBy(a => a.sortCode).OrderBy(a => a.creatorTime, OrderByType.Desc)
.OrderByIF(!string.IsNullOrEmpty(input.keyword), a => a.lastModifyTime, OrderByType.Desc).ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult<BillRuleListOutput>.SqlSugarPageResult(list);
}
/// <summary>
/// 获取单据流水号(工作流程调用).
/// </summary>
/// <param name="enCode">编码.</param>
/// <returns></returns>
[HttpGet("BillNumber/{enCode}")]
public async Task<dynamic> GetBillNumber(string enCode)
{
return await GetBillNumber(enCode, true);
}
/// <summary>
/// 信息.
/// </summary>
/// <param name="id">主键.</param>
/// <returns></returns>
[HttpGet("{id}")]
public async Task<dynamic> GetInfo(string id)
{
return (await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null)).Adapt<BillRuleInfoOutput>();
}
/// <summary>
/// 导出.
/// </summary>
/// <param name="id">主键.</param>
/// <returns></returns>
[HttpGet("{id}/Action/Export")]
public async Task<dynamic> ActionsExport(string id)
{
var data = await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null);
var jsonStr = data.ToJsonString();
return await _fileManager.Export(jsonStr, data.FullName, ExportFileType.bb);
}
#endregion
#region Post
/// <summary>
/// 新建.
/// </summary>
/// <param name="input">实体对象.</param>
/// <returns></returns>
[HttpPost("")]
[OperateLog("单据规则", "新增")]
public async Task Create([FromBody] BillRuleCrInput input)
{
if (await _repository.IsAnyAsync(x => (x.EnCode == input.enCode || x.FullName == input.fullName) && x.DeleteMark == null))
throw Oops.Oh(ErrorCode.COM1004);
var entity = input.Adapt<BillRuleEntity>();
var isOk = await _repository.AsInsertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
if (isOk < 1)
throw Oops.Oh(ErrorCode.COM1000);
}
/// <summary>
/// 修改.
/// </summary>
/// <param name="id">主键值.</param>
/// <param name="input">实体对象.</param>
/// <returns></returns>
[HttpPut("{id}")]
[OperateLog("单据规则", "修改")]
public async Task Update(string id, [FromBody] BillRuleUpInput input)
{
if (await _repository.IsAnyAsync(x => x.Id != id && (x.EnCode == input.enCode || x.FullName == input.fullName) && x.DeleteMark == null))
throw Oops.Oh(ErrorCode.COM1004);
var entity = input.Adapt<BillRuleEntity>();
var isOk = await _repository.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandHasChangeAsync();
if (!isOk)
throw Oops.Oh(ErrorCode.COM1001);
}
/// <summary>
/// 删除.
/// </summary>
/// <param name="id">主键.</param>
/// <returns></returns>
[HttpDelete("{id}")]
[OperateLog("单据规则", "删除")]
public async Task Delete(string id)
{
var entity = await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null);
if (entity == null)
throw Oops.Oh(ErrorCode.COM1005);
if (!string.IsNullOrEmpty(entity.OutputNumber))
throw Oops.Oh(ErrorCode.BR0001);
var isOk = await _repository.AsUpdateable(entity).CallEntityMethod(m => m.Delete()).UpdateColumns(it => new { it.DeleteMark, it.DeleteTime, it.DeleteUserId }).ExecuteCommandHasChangeAsync();
if (!isOk)
throw Oops.Oh(ErrorCode.COM1002);
}
/// <summary>
/// 修改单据规则状态.
/// </summary>
/// <param name="id">主键值.</param>
/// <returns></returns>
[HttpPut("{id}/Actions/State")]
public async Task ActionsState(string id)
{
var isOk = await _repository.AsUpdateable().SetColumns(it => new BillRuleEntity()
{
EnabledMark = SqlFunc.IIF(it.EnabledMark == 1, 0, 1),
LastModifyUserId = _userManager.UserId,
LastModifyTime = SqlFunc.GetDate()
}).Where(it => it.Id.Equals(id)).ExecuteCommandHasChangeAsync();
if (!isOk)
throw Oops.Oh(ErrorCode.COM1003);
}
/// <summary>
/// 导入.
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpPost("Action/Import")]
public async Task ActionsImport(IFormFile file)
{
var fileType = Path.GetExtension(file.FileName).Replace(".", string.Empty);
if (!fileType.ToLower().Equals(ExportFileType.bb.ToString()))
throw Oops.Oh(ErrorCode.D3006);
var josn = _fileManager.Import(file);
var data = josn.ToObject<BillRuleEntity>();
if (data == null || data.Prefix.IsNullOrEmpty())
throw Oops.Oh(ErrorCode.D3006);
var isOk = await _repository.AsSugarClient().Storageable(data).ExecuteCommandAsync();
if (isOk < 1)
throw Oops.Oh(ErrorCode.D3008);
}
#endregion
#region PublicMethod
/// <summary>
/// 获取流水号.
/// </summary>
/// <param name="enCode">流水编码.</param>
/// <param name="isCache">是否缓存:每个用户会自动占用一个流水号,这个刷新页面也不会跳号.</param>
/// <returns></returns>
[NonAction]
public async Task<string> GetBillNumber(string enCode, bool isCache = false)
{
try
{
string cacheKey = string.Format("{0}{1}_{2}", CommonConst.CACHEKEYBILLRULE, _userManager.TenantId, _userManager.UserId + enCode);
string strNumber = string.Empty;
if (isCache)
{
if (!_cacheManager.Exists(cacheKey))
{
strNumber = await GetNumber(enCode);
await _cacheManager.SetAsync(cacheKey, strNumber, new TimeSpan(0, 3, 0));
}
else
{
strNumber = await _cacheManager.GetAsync(cacheKey);
}
}
else
{
strNumber = await GetNumber(enCode);
_cacheManager.Set(cacheKey, strNumber, new TimeSpan(0, 3, 0));
}
return strNumber;
}
catch(Exception ex)
{
Logging.Log.Error("【GetBillNumber】" + ex.Message);
Logging.Log.Error("【GetBillNumber】" + ex.StackTrace);
throw;
}
}
#endregion
#region PrivateMethod
/// <summary>
/// 获取流水号.
/// </summary>
/// <param name="enCode"></param>
/// <returns></returns>
private async Task<string> GetNumber(string enCode)
{
ISqlSugarClient db = _repository.CopyNew();
StringBuilder strNumber = new StringBuilder();
var entity = db.Queryable<BillRuleEntity>().Where(m => m.EnCode == enCode && m.DeleteMark == null).ToList()[0];
//var entity = await _repository.GetFirstAsync(m => m.EnCode == enCode && m.DeleteMark == null);
if (entity != null)
{
// 处理隔天流水号归0
if (entity.OutputNumber != null)
{
var serialDate = entity.OutputNumber.Remove(entity.OutputNumber.Length - (int)entity.Digit).Replace(entity.Prefix, string.Empty);
var thisDate = entity.DateFormat == "no" ? string.Empty : DateTime.Now.ToString(entity.DateFormat);
if (serialDate != thisDate)
{
entity.ThisNumber = 0;
}
else
{
entity.ThisNumber++;
}
}
else
{
entity.ThisNumber = 0;
}
// 拼接单据编码
// 前缀
strNumber.Append(entity.Prefix);
if (entity.DateFormat != "no")
strNumber.Append(DateTime.Now.ToString(entity.DateFormat)); // 日期格式
var number = int.Parse(entity.StartNumber) + entity.ThisNumber;
strNumber.Append(number.ToString().PadLeft((int)entity.Digit, '0')); // 流水号
entity.OutputNumber = strNumber.ToString();
var str = strNumber.ToString();
// 更新流水号
await db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandHasChangeAsync();
}
else
{
strNumber.Append("单据规则不存在");
}
return strNumber.ToString();
}
#endregion
}