OrderDelayApplication.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. using Hotline.FlowEngine.Workflows;
  2. using Hotline.Share.Dtos.FlowEngine;
  3. using Hotline.Share.Dtos.FlowEngine.Workflow;
  4. using Hotline.Share.Dtos.Order.OrderDelay;
  5. using Hotline.Share.Enums.FlowEngine;
  6. using MapsterMapper;
  7. using Microsoft.AspNetCore.Http;
  8. using System.Threading;
  9. using Hotline.Authentications;
  10. using Hotline.BatchTask;
  11. using Hotline.Orders;
  12. using Hotline.Share.Dtos.BatchTask;
  13. using Hotline.Share.Dtos.Order;
  14. using Hotline.Share.Enums.BatchTask;
  15. using Hotline.Share.Enums.Order;
  16. using SqlSugar;
  17. using XF.Domain.Authentications;
  18. using XF.Domain.Dependency;
  19. using XF.Domain.Entities;
  20. using XF.Domain.Exceptions;
  21. namespace Hotline.Application.OrderApp.OrderDelayApp;
  22. public class OrderDelayApplication : IOrderDelayApplication, IScopeDependency
  23. {
  24. private readonly IOrderDomainService _orderDomainService;
  25. private readonly IOrderDelayRepository _orderDelayRepository;
  26. private readonly IWorkflowDomainService _workflowDomainService;
  27. private readonly IApptaskDomainService _apptaskDomainService;
  28. private readonly ISessionContext _sessionContext;
  29. private readonly IMapper _mapper;
  30. public OrderDelayApplication(
  31. IOrderDomainService orderDomainService,
  32. IOrderDelayRepository orderDelayRepository,
  33. IWorkflowDomainService workflowDomainService,
  34. IApptaskDomainService apptaskDomainService,
  35. ISessionContext sessionContext,
  36. IMapper mapper)
  37. {
  38. _orderDomainService = orderDomainService;
  39. _orderDelayRepository = orderDelayRepository;
  40. _workflowDomainService = workflowDomainService;
  41. _apptaskDomainService = apptaskDomainService;
  42. _sessionContext = sessionContext;
  43. _mapper = mapper;
  44. }
  45. /// <summary>
  46. /// 查询延期待审批列表
  47. /// </summary>
  48. /// <returns></returns>
  49. public ISugarQueryable<OrderDelay> QueryWaited(DelayListDto dto)
  50. {
  51. var isAdmin = _orderDomainService.IsCheckAdmin();
  52. var hasHandled = dto.IsApply.HasValue && dto.IsApply.Value;
  53. var query = _orderDelayRepository.Queryable()
  54. .Includes(d => d.WorkflowSteps.Where(step =>
  55. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
  56. step.HandlerId == _sessionContext.RequiredUserId) ||
  57. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
  58. step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  59. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
  60. _sessionContext.Roles.Contains(step.RoleId)) ||
  61. (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) &&
  62. _sessionContext.Roles.Contains(step.RoleId)
  63. && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
  64. .OrderByDescending(step => step.CreationTime)
  65. .Take(1)
  66. .ToList()
  67. );
  68. if (!isAdmin)
  69. {
  70. if (hasHandled)
  71. {
  72. query.Where(d => d.WorkflowSteps
  73. .Any(step =>
  74. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
  75. step.HandlerId == _sessionContext.RequiredUserId) ||
  76. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
  77. step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  78. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
  79. _sessionContext.Roles.Contains(step.RoleId)) ||
  80. (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) &&
  81. _sessionContext.Roles.Contains(step.RoleId)
  82. && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
  83. && step.Status == EWorkflowStepStatus.Handled));
  84. }
  85. else
  86. {
  87. query.Where(d => d.WorkflowSteps
  88. .Any(step =>
  89. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) &&
  90. step.HandlerId == _sessionContext.RequiredUserId) ||
  91. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) &&
  92. step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  93. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
  94. _sessionContext.Roles.Contains(step.RoleId)) ||
  95. (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) &&
  96. _sessionContext.Roles.Contains(step.RoleId)
  97. && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
  98. && step.Status < EWorkflowStepStatus.Handled));
  99. }
  100. }
  101. query.Includes(d => d.Order)
  102. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
  103. .WhereIF(dto.IsApply == false, d => d.DelayState == EDelayState.Examining)
  104. .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Order.No.Contains(dto.No)) //工单编号
  105. .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, d => d.Order.IsProvince == true) //是否省工单
  106. .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == false, d => d.Order.IsProvince == false)
  107. .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Order.Title.Contains(dto.Title)) //工单标题
  108. .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.Order.SourceChannelCode == dto.Channel) //来源渠道
  109. .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart) //受理时间Start
  110. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd) //受理时间End
  111. .WhereIF(!string.IsNullOrEmpty(dto.AcceptorName), d => d.Order.AcceptorName == dto.AcceptorName!) //受理人
  112. .WhereIF(!string.IsNullOrEmpty(dto.Hotspot),
  113. d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot)) //热点
  114. .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.Order.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
  115. .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
  116. .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), d => d.Order.CurrentHandleOrgName.Contains(dto.CurrentHandleOrgName)) //接办部门
  117. .WhereIF(dto.CurrentHandleTimeStart.HasValue, d => d.Order.CurrentHandleTime >= dto.CurrentHandleTimeStart) //接办时间Start
  118. .WhereIF(dto.CurrentHandleTimeEnd.HasValue, d => d.Order.CurrentHandleTime <= dto.CurrentHandleTimeEnd) //接办时间End
  119. .WhereIF(dto.ApplyTimeStart.HasValue, d => d.CreationTime >= dto.ApplyTimeStart) //延期申请时间Start
  120. .WhereIF(dto.ApplyTimeEnd.HasValue, d => d.CreationTime <= dto.ApplyTimeEnd) //延期申请时间End
  121. .WhereIF(!string.IsNullOrEmpty(dto.ApplyName), d => d.CreatorName.Contains(dto.ApplyName)) //延期申请人
  122. .WhereIF(!string.IsNullOrEmpty(dto.ApplyOrgName), d => d.CreatorOrgName.Contains(dto.ApplyOrgName)) //延期申请部门
  123. .WhereIF(dto.DelayNum.HasValue, d => d.DelayNum == dto.DelayNum) //延期申请时限
  124. .WhereIF(dto.DelayUnit.HasValue, d => d.DelayUnit == dto.DelayUnit) //延期申请单位
  125. .WhereIF(!string.IsNullOrEmpty(dto.DelayReason), d => d.DelayReason.Contains(dto.DelayReason)) //申请理由
  126. .WhereIF(dto.BeforeDelayStart.HasValue, d => d.BeforeDelay >= dto.BeforeDelayStart) //申请前期满时间Start
  127. .WhereIF(dto.BeforeDelayEnd.HasValue, d => d.BeforeDelay <= dto.BeforeDelayEnd) //申请前期满时间End
  128. .OrderByDescending(d => d.ApplyDelayTime)
  129. ;
  130. return query;
  131. }
  132. /// <summary>
  133. /// 延期审核
  134. /// </summary>
  135. /// <param name="request"></param>
  136. /// <param name="cancellation"></param>
  137. /// <returns></returns>
  138. public async Task ReviewAsync(OrderDelayReviewRequest request, CancellationToken cancellation)
  139. {
  140. /*
  141. * 查询delay
  142. * 查询workflow
  143. * 查询当前节点(待受理or待办理)
  144. * 查询nextStep(_workflowApplication.GetNextStepsAsync)
  145. * 非省工单删除省审批节点
  146. *!_sessionContext.OrgIsCenter && currentStep.Name != "中心初审"删除中心终审
  147. * 从nextStep中查找与dto传入的nextStepName相同的节点,workflow.NextStepCode = step.Key;workflow.NextStepName = step.Value;
  148. * 通过:nextAsync,不同意:rejectAsync
  149. * endhandler:
  150. * 1.更新orderDelay.DelayState
  151. * 2.审批通过:
  152. * a.更新工单办理期满时间(_orderApplication.DelayOrderExpiredTimeAsync)
  153. * b.更新工单未办理节点的期满时间(_workflowDomainService.UpdateUnhandleExpiredTimeAsync)
  154. * c.cap publish EventNames.HotlineOrderExpiredTimeUpdate
  155. */
  156. request.NextWorkflow.ReviewResult = request.IsPass ? EReviewResult.Approval : EReviewResult.Failed;
  157. if (request.IsPass)
  158. {
  159. await _workflowDomainService.NextAsync(request.NextWorkflow, cancellationToken: cancellation);
  160. }
  161. else
  162. {
  163. var reject = _mapper.Map<RejectDto>(request.NextWorkflow);
  164. await _workflowDomainService.RejectAsync(reject, cancellation);
  165. }
  166. }
  167. /// <summary>
  168. /// 延期批量审核
  169. /// </summary>
  170. /// <returns></returns>
  171. public async Task BatchReviewAsync(BatchOrderDelayReviewRequest request, CancellationToken cancellation)
  172. {
  173. var delayIds = request.DelayWithStepIds.Select(d => d.DelayId).Distinct().ToList();
  174. var delays = await _orderDelayRepository.Queryable()
  175. .Where(d => delayIds.Contains(d.Id))
  176. .ToListAsync(cancellation);
  177. var apptaskItems = new List<AddApptaskItemRequest>();
  178. var req = new OrderDelayReviewWithSessionRequest
  179. {
  180. SessionContext = (FakeSessionContext)_sessionContext,
  181. IsPass = request.IsPass,
  182. NextWorkflow = request.NextWorkflow
  183. };
  184. foreach (var delay in delays)
  185. {
  186. req.NextWorkflow.StepId = request.DelayWithStepIds.First(d => d.DelayId == delay.Id).StepId;
  187. apptaskItems.Add(new AddApptaskItemRequest
  188. {
  189. BusinessId = delay.Id,
  190. TaskParams = req
  191. });
  192. }
  193. var taskId = await _apptaskDomainService.AddAsync(new AddApptaskRequest
  194. {
  195. TaskType = ETaskType.OrderDelay,
  196. Priority = 0,
  197. ApptaskItems = apptaskItems
  198. }, cancellation);
  199. if (!string.IsNullOrEmpty(taskId))
  200. {
  201. foreach (var orderDelay in delays)
  202. {
  203. orderDelay.DelayState = EDelayState.BatchProcessing;
  204. }
  205. await _orderDelayRepository.Updateable(delays)
  206. .UpdateColumns(d=>new {d.DelayState})
  207. .ExecuteCommandAsync(cancellation);
  208. }
  209. }
  210. }