OrderScreenNextWorkflowHandler.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using DotNetCore.CAP;
  2. using Hotline.Configurations;
  3. using Hotline.File;
  4. using Hotline.FlowEngine.Notifications;
  5. using Hotline.FlowEngine.WorkflowModules;
  6. using Hotline.Orders;
  7. using Hotline.Share.Dtos.Order;
  8. using Hotline.Share.Enums.Order;
  9. using Hotline.Share.Mq;
  10. using MapsterMapper;
  11. using MediatR;
  12. using Microsoft.AspNetCore.Http;
  13. using Microsoft.Extensions.Options;
  14. using XF.Domain.Authentications;
  15. using XF.Domain.Extensions;
  16. using XF.Domain.Repository;
  17. namespace Hotline.Application.Orders.Handlers.OrderScreenHandler;
  18. public class OrderScreenNextWorkflowHandler : INotificationHandler<NextStepNotify>
  19. {
  20. private readonly ICapPublisher _capPublisher;
  21. private readonly IMapper _mapper;
  22. private readonly IOrderScreenRepository _orderScreenRepository;
  23. private readonly ISessionContext _sessionContext;
  24. private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
  25. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  26. private readonly IFileRepository _fileRepository;
  27. public OrderScreenNextWorkflowHandler(
  28. ICapPublisher capPublisher,
  29. IMapper mapper,
  30. IOrderScreenRepository orderScreenRepository,
  31. ISessionContext sessionContext,
  32. IOptionsSnapshot<AppConfiguration> appOptions,
  33. IRepository<OrderScreenDetail> orderScreenDetailRepository,
  34. IFileRepository fileRepository)
  35. {
  36. _capPublisher = capPublisher;
  37. _mapper = mapper;
  38. _orderScreenRepository = orderScreenRepository;
  39. _sessionContext = sessionContext;
  40. _orderScreenDetailRepository = orderScreenDetailRepository;
  41. _appOptions = appOptions;
  42. _fileRepository = fileRepository;
  43. }
  44. /// <summary>Handles a notification</summary>
  45. /// <param name="notification">The notification</param>
  46. /// <param name="cancellationToken">Cancellation token</param>
  47. public async Task Handle(NextStepNotify notification, CancellationToken cancellationToken)
  48. {
  49. if (notification.Workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
  50. {
  51. var workflow = notification.Workflow;
  52. var nextTag = notification.NextStepDefine.Tag.TryDeserialize<DefinitionTag>();
  53. var screen = await _orderScreenRepository.Queryable().Includes(x => x.Order)
  54. .Where(x => x.Id == workflow.ExternalId).FirstAsync(cancellationToken);
  55. if (screen != null)
  56. {
  57. screen.Status = EScreenStatus.Approval;
  58. screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  59. //如果下个节点是省审批,则修改为省甄别
  60. if (nextTag is not null && nextTag.Type == TagDefaults.TagType.Org && nextTag.Value == TagDefaults.TagValue.Province)
  61. screen.IsProScreen = true;
  62. await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
  63. }
  64. if (nextTag is not null && nextTag.Type == TagDefaults.TagType.Org)
  65. {
  66. switch (nextTag.Value)
  67. {
  68. case TagDefaults.TagValue.Province:
  69. if (screen != null)
  70. {
  71. var screenDto = _mapper.Map<OrderScreenListDto>(screen);
  72. if (screen.Order != null && screen.Order.Source == ESource.ProvinceStraight)
  73. {
  74. var screenOrderDto = _mapper.Map<OrderDto>(screen.Order);
  75. //省件甄别--以省审批前一个节点整理的甄别意见为准推送省上 宜宾
  76. if (_appOptions.Value.IsYiBin)
  77. {
  78. screenDto.Content = notification.Dto.Opinion;
  79. screenDto.Files = new List<Share.Dtos.File.FileDto>();
  80. screenDto.FileJson = screenDto.ProvinceFileJson;
  81. if (screenDto.ProvinceFileJson != null && screenDto.ProvinceFileJson.Any())
  82. {
  83. var fileIds = screenDto.ProvinceFileJson.Select(x => x.Id).ToList();
  84. screenDto.Files = await _fileRepository.GetFilesAsync(fileIds, cancellationToken);
  85. }
  86. }
  87. if (_appOptions.Value.IsLuZhou)
  88. {
  89. screenDto.Content = notification.Dto.Opinion;
  90. }
  91. //推省上
  92. _capPublisher.Publish(EventNames.HotlineOrderScreenApply, new PublishScreenDto()
  93. {
  94. Order = screenOrderDto,
  95. Screen = screenDto,
  96. ClientGuid = ""
  97. });
  98. }
  99. }
  100. break;
  101. }
  102. }
  103. OrderScreenDetail detail = new OrderScreenDetail
  104. {
  105. ScreenId = screen.Id
  106. };
  107. detail.Audit(_sessionContext.UserId, _sessionContext.UserName, _sessionContext.OrgId, _sessionContext.OrgName, 1);
  108. await _orderScreenDetailRepository.AddAsync(detail, cancellationToken);
  109. }
  110. }
  111. }