OrderRevocationController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. using Hotline.Application.FlowEngine;
  2. using Hotline.Caching.Interfaces;
  3. using Hotline.Configurations;
  4. using Hotline.FlowEngine.WorkflowModules;
  5. using Hotline.FlowEngine.Workflows;
  6. using Hotline.Orders;
  7. using Hotline.Push.Notifies;
  8. using Hotline.SeedData;
  9. using Hotline.Settings;
  10. using Hotline.Share.Dtos.FlowEngine;
  11. using Hotline.Share.Dtos.FlowEngine.Workflow;
  12. using Hotline.Share.Dtos.Order;
  13. using Hotline.Share.Enums.FlowEngine;
  14. using Hotline.Share.Enums.Order;
  15. using Hotline.Share.Enums.Push;
  16. using Hotline.Users;
  17. using MapsterMapper;
  18. using MediatR;
  19. using Microsoft.AspNetCore.Mvc;
  20. using Microsoft.Extensions.Options;
  21. using MongoDB.Driver;
  22. using XF.Domain.Authentications;
  23. using XF.Domain.Exceptions;
  24. using XF.Domain.Repository;
  25. namespace Hotline.Api.Controllers
  26. {
  27. public class OrderRevocationController : BaseController
  28. {
  29. private readonly IMapper _mapper;
  30. private readonly IRepository<OrderRevocation> _orderRevocationRepository;
  31. private readonly IRepository<Order> _orderRepository;
  32. private readonly ISessionContext _sessionContext;
  33. private readonly IWorkflowApplication _workflowApplication;
  34. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  35. private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
  36. private readonly IRepository<User> _userRepository;
  37. private readonly IMediator _mediator;
  38. private readonly IWorkflowDomainService _workflowDomainService;
  39. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  40. public OrderRevocationController(IMapper mapper,
  41. IRepository<OrderRevocation> orderRevocationRepository,
  42. IRepository<Order> orderRepository,
  43. ISessionContext sessionContext,
  44. IWorkflowApplication workflowApplication,
  45. ISystemSettingCacheManager systemSettingCacheManager,
  46. IRepository<SystemOrganize> systemOrganizeRepository,
  47. IRepository<User> userRepository,
  48. IMediator mediator,
  49. IWorkflowDomainService workflowDomainService,
  50. IOptionsSnapshot<AppConfiguration> appOptions)
  51. {
  52. _mapper = mapper;
  53. _orderRevocationRepository = orderRevocationRepository;
  54. _orderRepository = orderRepository;
  55. _sessionContext = sessionContext;
  56. _workflowApplication = workflowApplication;
  57. _systemSettingCacheManager = systemSettingCacheManager;
  58. _systemOrganizeRepository = systemOrganizeRepository;
  59. _userRepository = userRepository;
  60. _mediator = mediator;
  61. _workflowDomainService = workflowDomainService;
  62. _appOptions = appOptions;
  63. }
  64. /// <summary>
  65. /// 撤销件处理
  66. /// </summary>
  67. /// <param name="dto"></param>
  68. /// <returns></returns>
  69. [HttpPost("add_order_revocation")]
  70. public async Task<OrderRevocationResponseDto> AddOrderRevocation([FromBody] OrderRevocationDto dto)
  71. {
  72. if (!dto.Ids.Any())
  73. throw UserFriendlyException.SameMessage("请选择需要撤销的记录!");
  74. if (string.IsNullOrEmpty(dto.RevocationReason))
  75. throw UserFriendlyException.SameMessage("撤销说明不能为空!");
  76. int successNum = 0;
  77. int errorNum = 0;
  78. foreach (var item in dto.Ids)
  79. {
  80. var order = await _orderRepository.GetAsync(p => p.Id == item, HttpContext.RequestAborted);
  81. if (order != null)
  82. {
  83. //工单状态为会签中、退回审批中、特提审批中、已归档,则不能撤销
  84. if (order.Status == EOrderStatus.Countersigning
  85. || order.Status == EOrderStatus.SendBackAudit
  86. || order.Status == EOrderStatus.SpecialAudit
  87. || order.Status >= EOrderStatus.Filed)
  88. {
  89. errorNum++;
  90. }
  91. else
  92. {
  93. //添加撤销件
  94. OrderRevocation orderRevocation = new()
  95. {
  96. OrderId = order.Id,
  97. No = order.No,
  98. RevocationReason = dto.RevocationReason,
  99. IsSendSms = dto.IsSendSms,
  100. };
  101. var id = await _orderRevocationRepository.AddAsync(orderRevocation, HttpContext.RequestAborted);
  102. if (!string.IsNullOrEmpty(id))
  103. {
  104. #region 处理短信业务
  105. //如果需要发短信、处理短信业务
  106. if (dto.IsSendSms && !string.IsNullOrEmpty(order.WorkflowId))
  107. {
  108. //查询当前工单的实际办理节点,如果在热线中心不处理,如果在部门需要更新期满时间
  109. var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true,
  110. cancellationToken: HttpContext.RequestAborted);
  111. var nowWorkflow = workflow.Steps.Where(p =>
  112. p.Id == order.ActualHandleStepId && p.BusinessType >= EBusinessType.Department &&
  113. p.BusinessType <= EBusinessType.DepartmentLeader).FirstOrDefault();
  114. //在部门才需要发送短信
  115. if (nowWorkflow != null && order.CenterToOrgTime.HasValue)
  116. {
  117. //处理短信业务
  118. var acceptSmsRoleIds = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
  119. //查询部门所有账号
  120. var userlist = await _userRepository.Queryable().Where(x =>
  121. x.OrgId == order.CurrentHandleOrgId && !string.IsNullOrEmpty(x.PhoneNo) &&
  122. x.Roles.Any(d => acceptSmsRoleIds.Contains(d.Id))).ToListAsync();
  123. //发送短信
  124. foreach (var user in userlist)
  125. {
  126. var messageDto = new Share.Dtos.Push.MessageDto
  127. {
  128. PushBusiness = EPushBusiness.OrderRevocationSms,
  129. PushPlatform = EPushPlatform.Sms,
  130. Name = user.Name,
  131. TemplateCode = "1016",
  132. Params = new List<string>() { order.No },
  133. TelNumber = user.PhoneNo,
  134. };
  135. await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
  136. }
  137. }
  138. }
  139. #endregion
  140. #region 处理流程业务
  141. //处理流程业务
  142. //如果开启了流程直接归档,如果没开启流程,开启流程到归档
  143. if (string.IsNullOrEmpty(order.WorkflowId))
  144. {
  145. var startDto = new StartWorkflowDto
  146. {
  147. DefinitionModuleCode = WorkflowModuleConsts.OrderHandle,
  148. Title = order.Title,
  149. Opinion = dto.RevocationReason,
  150. };
  151. // await _workflowApplication.StartToEndAsync(startDto, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
  152. await _workflowDomainService.StartToEndAsync(startDto, order.Id, order.ExpiredTime, HttpContext.RequestAborted);
  153. }
  154. else
  155. {
  156. if (_appOptions.Value.IsLuZhou)
  157. {
  158. await _workflowDomainService.RecallToStartStepAsync(order.WorkflowId, dto.RevocationReason, order.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Revocation, cancellationToken: HttpContext.RequestAborted);
  159. }
  160. await _workflowDomainService.JumpToEndAsync(_sessionContext, order.WorkflowId, dto.RevocationReason,null, order.ExpiredTime, cancellationToken: HttpContext.RequestAborted);
  161. }
  162. #endregion
  163. #region 处理工单的一级部门和实际办理部门
  164. //处理工单的一级部门和实际办理部门
  165. var org = await _systemOrganizeRepository.GetAsync(p => p.Id == OrgSeedData.CenterId, HttpContext.RequestAborted);
  166. order.ActualHandleOrgAreaCode = org?.AreaCode;
  167. order.ActualHandleOrgAreaName = org?.AreaName;
  168. order.ActualHandleOrgCode = OrgSeedData.CenterId;
  169. order.ActualHandleOrgName = OrgSeedData.CenterName;
  170. order.OrgLevelOneCode = OrgSeedData.CenterId;
  171. order.OrgLevelOneName = OrgSeedData.CenterName;
  172. order.ActualHandlerName = _sessionContext.UserName;
  173. order.ActualHandleTime = DateTime.Now;
  174. order.ActualHandlerId = _sessionContext.UserId;
  175. await _orderRepository.Updateable(order).UpdateColumns(it => new
  176. {
  177. it.ActualHandleOrgName,
  178. it.ActualHandleOrgCode,
  179. it.OrgLevelOneCode,
  180. it.OrgLevelOneName,
  181. it.ActualHandleOrgAreaCode,
  182. it.ActualHandleOrgAreaName,
  183. it.ActualHandlerName,
  184. it.ActualHandleTime,
  185. it.ActualHandlerId
  186. }).ExecuteCommandAsync();
  187. #endregion
  188. successNum++;
  189. }
  190. else
  191. errorNum++;
  192. }
  193. }
  194. else
  195. {
  196. errorNum++;
  197. }
  198. }
  199. OrderRevocationResponseDto responseDto = new OrderRevocationResponseDto()
  200. {
  201. ErrorNum = errorNum,
  202. SuccessNum = successNum,
  203. };
  204. return responseDto;
  205. }
  206. }
  207. }