OrderSecondaryHandlingApplication.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. using DotNetCore.CAP;
  2. using Hotline.Application.FlowEngine;
  3. using Hotline.File;
  4. using Hotline.FlowEngine.Workflows;
  5. using Hotline.Orders;
  6. using Hotline.Repository.SqlSugar.Orders;
  7. using Hotline.Settings.TimeLimits;
  8. using Hotline.Share.Dtos;
  9. using Hotline.Share.Dtos.FlowEngine;
  10. using Hotline.Share.Dtos.Order;
  11. using Hotline.Share.Enums.Order;
  12. using MapsterMapper;
  13. using Microsoft.AspNetCore.Http;
  14. using Microsoft.AspNetCore.Mvc;
  15. using SqlSugar;
  16. using System.Threading;
  17. using Hotline.Repository.SqlSugar.Extensions;
  18. using XF.Domain.Authentications;
  19. using XF.Domain.Dependency;
  20. using XF.Domain.Exceptions;
  21. using XF.Domain.Repository;
  22. namespace Hotline.Application.Orders
  23. {
  24. public class OrderSecondaryHandlingApplication : IOrderSecondaryHandlingApplication, IScopeDependency
  25. {
  26. private readonly IMapper _mapper;
  27. private readonly IRepository<OrderSecondaryHandling> _orderSecondaryHandlingRepository;
  28. private readonly IFileRepository _fileRepository;
  29. private readonly IRepository<OrderVisit> _orderVisitRepository;
  30. private readonly ISessionContext _sessionContext;
  31. private readonly IOrderRepository _orderRepository;
  32. private readonly ITimeLimitDomainService _timeLimitDomainService;
  33. private readonly ICapPublisher _capPublisher;
  34. private readonly IWorkflowApplication _workflowApplication;
  35. private readonly IRepository<OrderPublish> _orderPublishRepository;
  36. private readonly IRepository<OrderPublishHistory> _orderPublishHistoryRepository;
  37. private readonly IWorkflowDomainService _workflowDomainService;
  38. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  39. public OrderSecondaryHandlingApplication(
  40. IMapper mapper,
  41. IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
  42. IFileRepository fileRepository,
  43. IRepository<OrderVisit> orderVisitRepository,
  44. ISessionContext sessionContext,
  45. IOrderRepository orderRepository,
  46. ITimeLimitDomainService timeLimitDomainService,
  47. ICapPublisher capPublisher,
  48. IWorkflowApplication workflowApplication,
  49. IRepository<OrderPublish> orderPublishRepository,
  50. IRepository<OrderPublishHistory> orderPublishHistoryRepository,
  51. IWorkflowDomainService workflowDomainService,
  52. IRepository<OrderVisitDetail> orderVisitedDetailRepository
  53. ) {
  54. _mapper = mapper;
  55. _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
  56. _fileRepository = fileRepository;
  57. _orderVisitRepository = orderVisitRepository;
  58. _sessionContext = sessionContext;
  59. _orderRepository = orderRepository;
  60. _timeLimitDomainService = timeLimitDomainService;
  61. _capPublisher = capPublisher;
  62. _workflowApplication = workflowApplication;
  63. _orderPublishRepository = orderPublishRepository;
  64. _orderPublishHistoryRepository = orderPublishHistoryRepository;
  65. _workflowDomainService = workflowDomainService;
  66. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  67. }
  68. /// <summary>
  69. /// 二次办理新增
  70. /// </summary>
  71. /// <returns></returns>
  72. public async Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
  73. {
  74. var model = _mapper.Map<OrderSecondaryHandling>(dto);
  75. if (string.IsNullOrEmpty(dto.Id))
  76. {
  77. model.InitId();
  78. }
  79. else {
  80. model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id , cancellationToken);
  81. model.Content = dto.Content;
  82. }
  83. model.State = ESecondaryHandlingState.Apply;
  84. model.ApplyOrgId = _sessionContext.OrgId;
  85. model.ApplyOrgName = _sessionContext.OrgName;
  86. if (dto.Files.Any())
  87. model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
  88. var visit = await _orderVisitRepository.GetAsync(x => x.Id == dto.VisitId && x.VisitState != EVisitState.None, cancellationToken);
  89. if (visit != null)
  90. {
  91. model.VisitState = visit.VisitState;
  92. visit.VisitState = EVisitState.None;
  93. await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
  94. }
  95. if (!string.IsNullOrEmpty(dto.Id))
  96. {
  97. await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
  98. }
  99. else {
  100. await _orderSecondaryHandlingRepository.AddAsync(model, cancellationToken);
  101. }
  102. }
  103. public async Task SendBackAsync(SendBackOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
  104. {
  105. var model =await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken);
  106. model.State = ESecondaryHandlingState.NotApply;
  107. model.SendBackContent = dto.SendBackContent;
  108. await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
  109. var visit = await _orderVisitRepository.GetAsync(x => x.Id == model.VisitId , cancellationToken);
  110. if (visit != null)
  111. {
  112. visit.VisitState = model.VisitState;
  113. await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
  114. }
  115. }
  116. /// <summary>
  117. /// 二次办理审批
  118. /// </summary>
  119. /// <returns></returns>
  120. public async Task AuditAsync(AuditOrderSecondaryHandlingDto dto, OrderSecondaryHandling model, CancellationToken cancellationToken)
  121. {
  122. model.State = dto.State;
  123. model.AuditContent = dto.AuditContent;
  124. model.AuditId = _sessionContext.UserId;
  125. model.AuditUser = _sessionContext.UserName;
  126. model.AuditTime = DateTime.Now;
  127. if (model.State == ESecondaryHandlingState.End)
  128. {
  129. var order = await _orderRepository.GetAsync(x => x.Id == model.OrderId, cancellationToken);
  130. if (string.IsNullOrEmpty(order.WorkflowId))
  131. throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程信息!");
  132. var step = await _workflowDomainService.FindLastHandleStepAsync(order.WorkflowId, model.ApplyOrgId, cancellationToken);
  133. if (step == null)
  134. throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程节点!");
  135. var recall = new RecallDto
  136. {
  137. WorkflowId = order.WorkflowId!,
  138. NextStepCode = step.Code,
  139. NextStepName = step.Name,
  140. NextHandlers = step.Handlers,
  141. Opinion = dto.AuditContent,
  142. FlowDirection = Share.Enums.FlowEngine.EFlowDirection.CenterToOrg,
  143. HandlerType = step.HandlerType,
  144. BusinessType = step.BusinessType
  145. };
  146. var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
  147. await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime })
  148. .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
  149. var orderDto = _mapper.Map<OrderDto>(order);
  150. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
  151. await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, cancellationToken);
  152. var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == model.OrderId);
  153. if (publish != null)
  154. {
  155. var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
  156. publishHistory.OrderPublishId = publish.Id;
  157. publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
  158. publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
  159. publishHistory.ArrangeContentAfter = publish.ArrangeContent;
  160. publishHistory.ArrangeContentBefor = publish.ArrangeContent;
  161. publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
  162. publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
  163. await _orderPublishHistoryRepository.AddAsync(publishHistory, cancellationToken);
  164. await _orderPublishRepository.RemoveAsync(publish, false, cancellationToken);
  165. }
  166. }
  167. else {
  168. var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == model.OrderId, cancellationToken);
  169. visit.VisitState = model.VisitState;
  170. await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
  171. }
  172. await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
  173. }
  174. /// <summary>
  175. /// 获取申请列表
  176. /// </summary>
  177. /// <returns></returns>
  178. public ISugarQueryable<OrderVisitDetail> ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken)
  179. {
  180. dto.CreationTimeEnd = DateTime.Now;
  181. dto.CreationTimeStart = DateTime.Now;
  182. if (dto.IsHomePage != null && dto.IsHomePage == true)
  183. {
  184. dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
  185. }
  186. var query = _orderVisitedDetailRepository.Queryable(false, true)
  187. .Includes(x => x.OrderVisit)
  188. .Includes(x => x.OrderVisit, y => y.Order)
  189. .Includes(x => x.OrderVisit, y => y.Employee)
  190. .Includes(x=>x.SecondaryHandling)
  191. .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
  192. .Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
  193. .WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true, x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
  194. .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
  195. .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
  196. .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
  197. .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.OrderVisit.Order!.SourceChannelCode! == dto.SourceChannel!)
  198. .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.OrderVisit.Order!.AcceptTypeCode! == dto.AcceptType!)
  199. .WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
  200. .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
  201. .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), x => x.OrderVisit.Order!.ActualHandleOrgName!.Contains(dto.ActualHandleOrgName!))
  202. .WhereIF(dto.ActualHandleTime.HasValue && dto.EndActualHandleTime.HasValue, x => x.OrderVisit.Order!.ActualHandleTime >= dto.ActualHandleTime && x.OrderVisit.Order!.ActualHandleTime <= dto.EndActualHandleTime)
  203. .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue, x => x.OrderVisit.Order!.FiledTime == dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
  204. .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue, x => x.OrderVisit.Order!.CreationTime == dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
  205. .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue, x => x.OrderVisit.VisitTime == dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
  206. .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
  207. .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
  208. .WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
  209. .WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
  210. .Where((x, s) => x.OrderVisit.VisitState != EVisitState.None && x.OrderVisit.IsCanHandle);
  211. if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
  212. {
  213. query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
  214. (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
  215. x.OrderVisit.Order.No.Contains(dto.Keyword!))
  216. .Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode.StartsWith(_sessionContext.OrgId) && (
  217. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
  218. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
  219. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
  220. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
  221. ));
  222. }
  223. else
  224. {
  225. query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
  226. (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
  227. x.OrderVisit.Order.No.Contains(dto.Keyword!))
  228. .Where((x, s) => x.VisitTarget == EVisitTarget.Org && (
  229. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
  230. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
  231. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
  232. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
  233. ));
  234. }
  235. return query.OrderByDescending((x, s) => x.CreationTime);
  236. }
  237. /// <summary>
  238. /// 二次办理列表查询
  239. /// </summary>
  240. /// <returns></returns>
  241. public ISugarQueryable<OrderSecondaryHandling> Query(SecondaryHandlingListDto dto, CancellationToken cancellationToken)
  242. {
  243. return _orderSecondaryHandlingRepository.Queryable()
  244. .Includes(x => x.Order)
  245. .Includes(x => x.VisitDetail)
  246. .Includes(x => x.Visit, d => d.Order)
  247. .Where(x=>x.State> ESecondaryHandlingState.NotApply)
  248. .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
  249. x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!))
  250. .WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply)
  251. .WhereIF(dto.Status is ESecondaryHandlingState.Handled, x => x.State != ESecondaryHandlingState.Apply)
  252. .WhereIF(dto.Status is ESecondaryHandlingState.End, x => x.State == ESecondaryHandlingState.End)
  253. .WhereIF(dto.Status is ESecondaryHandlingState.Refuse, x => x.State == ESecondaryHandlingState.Refuse)
  254. .WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart)
  255. .WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
  256. .WhereIF(!string.IsNullOrEmpty(dto.OrderId), x => x.OrderId == dto.OrderId)
  257. .OrderByDescending(x => x.CreationTime);
  258. }
  259. /// <summary>
  260. /// 获取实体
  261. /// </summary>
  262. /// <returns></returns>
  263. public async Task<OrderSecondaryHandling> Entity(string id, CancellationToken cancellationToken)
  264. {
  265. return await _orderSecondaryHandlingRepository.Queryable()
  266. .FirstAsync(x => x.Id == id, cancellationToken);
  267. }
  268. }
  269. }