using DS.Module.Core;
using DS.WMS.Core.Application.Entity;
using DS.WMS.Core.Application.Interface;
using DS.WMS.Core.Fee.Dtos;
using DS.WMS.Core.Fee.Method;
using DS.WMS.Core.Flow.Dtos;
using DS.WMS.Core.Flow.Interface;
using DS.WMS.Core.Op.Dtos.TaskInteraction;
using DS.WMS.Core.Op.Interface.TaskInteraction;
using Masuit.Tools.Systems;
using Microsoft.Extensions.DependencyInjection;
namespace DS.WMS.Core.Application.Method
{
///
/// 申请单审核服务
///
public abstract class ApplicationAuditService : FeeServiceBase, IApplicationAuditService
where TEntity : ApplicationForm, new()
{
///
/// 适用于当前申请单的审核类型
///
public abstract TaskBaseTypeEnum AuditType { get; }
readonly IClientFlowInstanceService flowService;
readonly ITaskService taskService;
///
/// 初始化
///
///
public ApplicationAuditService(IServiceProvider serviceProvider) : base(serviceProvider)
{
flowService = serviceProvider.GetRequiredService();
taskService = serviceProvider.GetRequiredService();
}
///
/// 一键审核当前登录用户的所有待审核项
///
/// 审批结果:1=通过,2=驳回
/// 备注
///
public async Task AuditAsync(int yesOrNo, string? remark)
{
var recordIds = await GetCurrentFlowsQuery([AuditType]).Select(x => x.BusinessId).ToArrayAsync();
//没有待审批的列表直接返回不再执行后续查询
if (recordIds.Length == 0)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.NoAuditItems));
return await AuditAsync(new AuditRequest { Ids = recordIds, Remark = remark, Result = yesOrNo });
}
///
/// 申请单审核
///
///
///
public async Task AuditAsync(AuditRequest request)
{
var apps = await TenantDb.Queryable().Where(x => request.Ids.Contains(x.Id)).Select(x => new TEntity
{
Id = x.Id,
ApplicationNO = x.ApplicationNO,
Status = x.Status
}).ToListAsync();
if (apps.Count == 0)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.EmptyData));
var result = PreAudit(apps);
if (!result.Succeeded)
return result;
bool hasAuthorized = await taskService.HasAuthorizedAsync();
if (hasAuthorized)
{
result = await taskService.AuditAsync(new TaskAuditRequest
{
Ids = request.Ids,
Remark = request.Remark,
Result = request.Result,
TaskTypeName = AuditType.ToString()
});
if (!result.Succeeded)
return result;
}
else
{
var flows = await flowService.GetInstanceByBSIdAsync(AuditType, null, request.Ids);
if (flows.Count != request.Ids.Length)
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.FlowNotFound));
List list = [];
foreach (var item in flows)
{
result = flowService.AuditFlowInstance(new FlowAuditInfo
{
Instance = item,
Status = request.Result,
AuditNote = request.Remark
});
if (!result.Succeeded)
return result;
}
}
return DataResult.Success;
}
///
/// 在执行审批前调用,用于检查申请单状态
///
/// 申请单
///
protected virtual DataResult PreAudit(List applications)
{
return DataResult.Success;
}
///
/// 将申请单重置为未打印状态
///
/// 申请单ID
///
public async Task SetUnPrinted(params long[] ids)
{
if (typeof(TEntity).IsSubclassOf(typeof(ApplicationForm)))
throw new NotSupportedException($"不支持的类型,泛型参数需要继承自类:{typeof(ApplicationForm).AssemblyQualifiedName}");
int rows = await TenantDb.Updateable()
.SetColumns(nameof(ApplicationForm.IsPrinted), false)
.SetColumns(nameof(ApplicationForm.PrintTimes), 0)
.SetColumns(nameof(ApplicationForm.PrinterId), null)
.SetColumns(nameof(ApplicationForm.PrinterName), null)
.SetColumns(nameof(ApplicationForm.PrintTime), null)
.Where(x => ids.Contains(x.Id)).ExecuteCommandAsync();
return rows > 0 ? DataResult.Success : DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed));
}
///
/// 根据审批结果更新申请单状态
///
/// 回调信息
///
public async Task UpdateStatusAsync(FlowCallback callback)
{
if (callback.AuditType != AuditType)
return DataResult.Failed($"回调工作流类型:{callback.AuditType.GetDescription()} 与实例工作流类型:{AuditType.GetDescription()} 不一致");
var app = await TenantDb.Queryable().Where(x => x.Id == callback.BusinessId)
.Select(x => new TEntity
{
Id = x.Id,
Status = x.Status
}).FirstAsync();
if (app == null)
{
await new ApplicationException($"未能获取ID={callback.BusinessId}的申请单,回调更新失败").LogAsync(Db);
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.EmptyData));
}
DateTime dtNow = DateTime.Now;
app.AuditerId = long.Parse(User.UserId);
app.AuditerName = User.UserName;
app.AuditTime = dtNow;
app.Reason = callback.RejectReason;
await TenantDb.Ado.BeginTranAsync();
try
{
await OnUpdateStatusAsync(callback, app);
if (callback.FlowStatus == FlowStatusEnum.Reject)
{
//await Db.Updateable(new FlowInstance
//{
// Id = callback.InstanceId,
// Deleted = true,
// DeleteBy = 0,
// DeleteTime = DateTime.Now
//}).UpdateColumns(x => new { x.Deleted, x.DeleteBy, x.DeleteTime }).ExecuteCommandAsync();
}
await TenantDb.Ado.CommitTranAsync();
return DataResult.Success;
}
catch (Exception ex)
{
await TenantDb.Ado.RollbackTranAsync();
await ex.LogAsync(Db);
return DataResult.FailedWithDesc(nameof(MultiLanguageConst.Operation_Failed));
}
}
///
/// 在审批完成时调用,用于更新申请单的审批状态
///
/// 回调参数
/// 申请单
///
protected virtual async Task OnUpdateStatusAsync(FlowCallback callback, TEntity application)
{
await TenantDb.Updateable(application).UpdateColumns(x => new
{
x.Status,
x.AuditerId,
x.AuditerName,
x.AuditTime,
x.Reason
}).ExecuteCommandAsync();
}
}
}