| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- using Admin.NET.Plugin.ApprovalFlow;
- using Admin.NET.Plugin.ApprovalFlow.Service;
- using Admin.NET.Plugin.AiDOP.Entity.S8;
- namespace Admin.NET.Plugin.AiDOP.Service.S8;
- /// <summary>
- /// EXCEPTION_CLOSURE 流程的 Biz 回调(双线合一后已退化为复检审批载体)。
- /// 启动点:S8 提交复检;终态由 S8 业务侧(ApproveVerification/RejectVerification)决定。
- /// 该 handler 只负责维护 ActiveFlowInstanceId 字段,不再改写 e.Status。
- /// </summary>
- public class ExceptionClosureBizHandler : IFlowBizHandler, ITransient
- {
- public string BizType => "EXCEPTION_CLOSURE";
- private readonly SqlSugarRepository<AdoS8Exception> _rep;
- private readonly SqlSugarRepository<AdoS8ExceptionTimeline> _timelineRep;
- public ExceptionClosureBizHandler(
- SqlSugarRepository<AdoS8Exception> rep,
- SqlSugarRepository<AdoS8ExceptionTimeline> timelineRep)
- {
- _rep = rep;
- _timelineRep = timelineRep;
- }
- public async Task OnFlowStarted(long bizId, long instanceId)
- {
- var e = await _rep.GetByIdAsync(bizId) ?? throw new S8BizException("异常不存在");
- e.ActiveFlowInstanceId = instanceId;
- e.ActiveFlowBizType = BizType;
- e.UpdatedAt = DateTime.Now;
- await _rep.UpdateAsync(e);
- await InsertTimelineAsync(e.Id, "VERIFY_FLOW_START", "复检审批流启动", instanceId, null);
- }
- public async Task OnFlowCompleted(long bizId, long instanceId, FlowInstanceStatusEnum finalStatus, long? lastApproverId)
- {
- var e = await _rep.GetByIdAsync(bizId) ?? throw new S8BizException("异常不存在");
- e.ActiveFlowInstanceId = null;
- e.ActiveFlowBizType = null;
- e.UpdatedAt = DateTime.Now;
- await _rep.UpdateAsync(e);
- // 状态由 S8 服务层管控(VERIFY_APPROVED/VERIFY_REJECTED 时间线已写)。
- // 这里只补一条流程级审计标记,便于追溯审批实例终态。
- var label = finalStatus switch
- {
- FlowInstanceStatusEnum.Approved => "复检审批流通过",
- FlowInstanceStatusEnum.Rejected => "复检审批流拒绝",
- FlowInstanceStatusEnum.Cancelled => "复检审批流撤回",
- _ => "复检审批流结束",
- };
- await InsertTimelineAsync(e.Id, "VERIFY_FLOW_END", label, instanceId, lastApproverId);
- }
- public async Task<Dictionary<string, object>> GetBizData(long bizId)
- {
- var e = await _rep.GetByIdAsync(bizId);
- if (e == null) return new Dictionary<string, object>();
- return new Dictionary<string, object>
- {
- ["sceneCode"] = e.SceneCode ?? string.Empty,
- ["factoryCode"] = e.FactoryId.ToString(),
- };
- }
- private async Task InsertTimelineAsync(long exceptionId, string code, string label,
- long? instanceId, long? approverId)
- {
- string? remark = null;
- if (instanceId.HasValue && approverId.HasValue)
- remark = $"审批实例ID: {instanceId},审批人: {approverId}";
- else if (instanceId.HasValue)
- remark = $"审批实例ID: {instanceId}";
- else if (approverId.HasValue)
- remark = $"审批人: {approverId}";
- await _timelineRep.InsertAsync(new AdoS8ExceptionTimeline
- {
- ExceptionId = exceptionId,
- ActionCode = code,
- ActionLabel = label,
- FromStatus = null,
- ToStatus = null,
- OperatorId = approverId,
- ActionRemark = remark,
- CreatedAt = DateTime.Now
- });
- }
- }
|