S8DecisionService.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Admin.NET.Plugin.AiDOP.Dto.S8;
  2. using Admin.NET.Plugin.AiDOP.Entity.S8;
  3. namespace Admin.NET.Plugin.AiDOP.Service.S8;
  4. public class S8DecisionService : ITransient
  5. {
  6. private readonly SqlSugarRepository<AdoS8ExceptionTimeline> _timelineRep;
  7. private readonly SqlSugarRepository<AdoS8DecisionRecord> _decisionRep;
  8. private readonly SqlSugarRepository<AdoS8Evidence> _evidenceRep;
  9. private readonly SqlSugarRepository<AdoS8Exception> _exceptionRep;
  10. public S8DecisionService(
  11. SqlSugarRepository<AdoS8ExceptionTimeline> timelineRep,
  12. SqlSugarRepository<AdoS8DecisionRecord> decisionRep,
  13. SqlSugarRepository<AdoS8Evidence> evidenceRep,
  14. SqlSugarRepository<AdoS8Exception> exceptionRep)
  15. {
  16. _timelineRep = timelineRep;
  17. _decisionRep = decisionRep;
  18. _evidenceRep = evidenceRep;
  19. _exceptionRep = exceptionRep;
  20. }
  21. /// <summary>
  22. /// S8-TENANT-FACTORY-P0-CLOSURE-1:时间线 / 决策 / 证据三张子表无自有 tenant_id / factory_id 列,
  23. /// 归属只能由父异常派生。调用方必须先用本方法确认父异常在可信作用域内,不在则按「资源不存在」处理,
  24. /// 不得直接用裸 exceptionId 读取子资源。
  25. /// </summary>
  26. public Task<bool> IsExceptionInScopeAsync(long exceptionId, long tenantId, long factoryId) =>
  27. _exceptionRep.AsQueryable()
  28. .Where(e => e.Id == exceptionId && e.TenantId == tenantId && e.FactoryId == factoryId && !e.IsDeleted)
  29. .AnyAsync();
  30. public async Task<List<AdoS8TimelineItemDto>> GetTimelineAsync(long exceptionId) =>
  31. await _timelineRep.AsQueryable()
  32. .Where(x => x.ExceptionId == exceptionId)
  33. .OrderBy(x => x.CreatedAt)
  34. .Select(x => new AdoS8TimelineItemDto
  35. {
  36. Id = x.Id,
  37. ActionCode = x.ActionCode,
  38. ActionLabel = x.ActionLabel,
  39. FromStatus = x.FromStatus,
  40. ToStatus = x.ToStatus,
  41. OperatorId = x.OperatorId,
  42. OperatorName = x.OperatorName,
  43. ActionRemark = x.ActionRemark,
  44. CreatedAt = x.CreatedAt
  45. })
  46. .ToListAsync();
  47. public async Task<List<AdoS8DecisionItemDto>> GetDecisionsAsync(long exceptionId) =>
  48. await _decisionRep.AsQueryable()
  49. .Where(x => x.ExceptionId == exceptionId && !x.IsDeleted)
  50. .OrderBy(x => x.DecisionTime)
  51. .Select(x => new AdoS8DecisionItemDto
  52. {
  53. Id = x.Id,
  54. DecisionType = x.DecisionType,
  55. DecisionMakerId = x.DecisionMakerId,
  56. DecisionMakerName = x.DecisionMakerName,
  57. DecisionBasis = x.DecisionBasis,
  58. DecisionResult = x.DecisionResult,
  59. DecisionRemark = x.DecisionRemark,
  60. DecisionTime = x.DecisionTime
  61. })
  62. .ToListAsync();
  63. public async Task<List<AdoS8EvidenceItemDto>> GetEvidencesAsync(long exceptionId) =>
  64. await _evidenceRep.AsQueryable()
  65. .Where(x => x.ExceptionId == exceptionId && !x.IsDeleted)
  66. .OrderBy(x => x.UploadedAt)
  67. .Select(x => new AdoS8EvidenceItemDto
  68. {
  69. Id = x.Id,
  70. EvidenceType = x.EvidenceType,
  71. FileName = x.FileName,
  72. FileUrl = x.FileUrl,
  73. SourceSystem = x.SourceSystem,
  74. UploadedBy = x.UploadedBy,
  75. UploadedAt = x.UploadedAt
  76. })
  77. .ToListAsync();
  78. }