OrderApplication.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.FlowEngine.Workflows;
  3. using Hotline.Orders;
  4. using Hotline.Repository.SqlSugar.Extensions;
  5. using Hotline.Repository.SqlSugar.Ts;
  6. using Hotline.Settings.TimeLimits;
  7. using Hotline.Share.Dtos;
  8. using Hotline.Share.Dtos.FlowEngine;
  9. using Hotline.Share.Dtos.FlowEngine.Workflow;
  10. using Hotline.Share.Dtos.Order;
  11. using Hotline.Share.Dtos.Settings;
  12. using Hotline.Share.Enums.Order;
  13. using Hotline.Share.Enums.Settings;
  14. using Hotline.Tools;
  15. using Hotline.Users;
  16. using MapsterMapper;
  17. using XF.Domain.Constants;
  18. using XF.Domain.Dependency;
  19. using XF.Domain.Entities;
  20. using XF.Domain.Exceptions;
  21. using XF.Domain.Repository;
  22. namespace Hotline.Application.Orders;
  23. public class OrderApplication : IOrderApplication, IScopeDependency
  24. {
  25. private readonly IOrderDomainService _orderDomainService;
  26. private readonly IWorkflowDomainService _workflowDomainService;
  27. private readonly IOrderRepository _orderRepository;
  28. private readonly ITimeLimitDomainService _timeLimitDomainService;
  29. private readonly IMapper _mapper;
  30. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  31. private readonly IRepository<OrderWord> _orderWrodRepository;
  32. private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
  33. public OrderApplication(
  34. IOrderDomainService orderDomainService,
  35. IOrderRepository orderRepository,
  36. IWorkflowDomainService workflowDomainService,
  37. ITimeLimitDomainService timeLimitDomainService,
  38. ISystemSettingCacheManager systemSettingCacheManager,
  39. IMapper mapper,
  40. IRepository<OrderWord> orderWrodRepository,
  41. IRepositoryTextSearch<OrderTs> repositoryts
  42. )
  43. {
  44. _orderDomainService = orderDomainService;
  45. _workflowDomainService = workflowDomainService;
  46. _orderRepository = orderRepository;
  47. _timeLimitDomainService = timeLimitDomainService;
  48. _mapper = mapper;
  49. _systemSettingCacheManager = systemSettingCacheManager;
  50. _orderWrodRepository = orderWrodRepository;
  51. _repositoryts = repositoryts;
  52. }
  53. /// <summary>
  54. /// 更新工单办理期满时间
  55. /// 1.更新工单 2.更新流程 3.推送省平台
  56. /// </summary>
  57. /// <returns></returns>
  58. public async Task DelayOrderExpiredTimeAsync(string orderId, int timeCount, ETimeType timeType, CancellationToken cancellationToken)
  59. {
  60. var order = await _orderDomainService.GetOrderAsync(orderId, cancellationToken: cancellationToken);
  61. var expiredTimeConfig =
  62. _timeLimitDomainService.CalcEndTime(order.ExpiredTime.Value, new TimeConfig(timeCount, timeType));
  63. order.TimeLimit = expiredTimeConfig.TimeText;
  64. order.TimeLimitCount = expiredTimeConfig.Count;
  65. order.TimeLimitUnit = expiredTimeConfig.TimeType;
  66. order.ExpiredTime = expiredTimeConfig.ExpiredTime;
  67. if (string.IsNullOrEmpty(order.WorkflowId))
  68. throw new UserFriendlyException("该工单流程id异常");
  69. var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, cancellationToken: cancellationToken);
  70. await _workflowDomainService.UpdateExpiredTimeAsync(workflow, expiredTimeConfig.ExpiredTime,
  71. expiredTimeConfig.TimeText, expiredTimeConfig.Count, expiredTimeConfig.TimeType, cancellationToken);
  72. await _orderRepository.UpdateAsync(order, cancellationToken);
  73. }
  74. /// <summary>
  75. /// 新增工单办理流程记录
  76. /// </summary>
  77. public async Task AddOrderTracesAsync(string orderId, ICollection<WorkflowTraceDto> traces, CancellationToken cancellationToken)
  78. {
  79. var order = await _orderRepository.GetAsync(orderId, cancellationToken);
  80. if (order is null)
  81. throw new UserFriendlyException("工单不存在");
  82. if (string.IsNullOrEmpty(order.WorkflowId))
  83. throw new UserFriendlyException("工单未开启流程");
  84. await _workflowDomainService.AddTracesAsync(order.WorkflowId, _mapper.Map<List<WorkflowTrace>>(traces),
  85. cancellationToken);
  86. }
  87. /// <summary>
  88. /// 撤销工单
  89. /// </summary>
  90. public async Task CancelOrderAsync(string orderId,string opinion, CancellationToken cancellationToken)
  91. {
  92. var order = await _orderRepository.GetAsync(orderId, cancellationToken);
  93. if (order is null)
  94. throw new UserFriendlyException("工单不存在");
  95. if (!string.IsNullOrEmpty(order.WorkflowId))
  96. {
  97. //结束流程
  98. await _workflowDomainService.TerminateAsync(new TerminateDto
  99. {
  100. WorkflowId = order.WorkflowId,
  101. Opinion = opinion
  102. }, cancellationToken);
  103. }
  104. //归档工单
  105. order.File();
  106. await _orderRepository.UpdateAsync(order, cancellationToken);
  107. }
  108. /// <summary>
  109. /// 即将超期列表
  110. /// </summary>
  111. /// <param name="dto"></param>
  112. /// <param name="cancellationToken"></param>
  113. /// <returns></returns>
  114. public async Task<PagedDto<OrderDto>> GetAboutToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
  115. {
  116. var setting = _systemSettingCacheManager.GetSetting(SettingConstants.OrderAboutToExpire);
  117. var value = setting?.SettingValue[0];
  118. value = string.IsNullOrEmpty(value) ? "0" : value;
  119. DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
  120. stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
  121. DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
  122. var (total, items) = await _orderRepository.Queryable()
  123. .WhereIF(dto.IsProvince.HasValue, x => x.IsProvince == dto.IsProvince)
  124. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword!) || x.No.Contains(dto.Keyword!))
  125. .Where(x => x.ExpiredTime != null &&
  126. x.Status != EOrderStatus.Filed && x.Status != EOrderStatus.Published && x.Status != EOrderStatus.Visited && stTime >= x.ExpiredTime.Value && stTime2 <= x.ExpiredTime.Value)
  127. .OrderByDescending(x => x.CreationTime)
  128. .ToPagedListAsync(dto.PageIndex, dto.PageSize, cancellationToken);
  129. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  130. }
  131. // /// <summary>
  132. // /// 即将超期节点列表
  133. // /// </summary>
  134. // /// <param name="dto"></param>
  135. // /// <param name="cancellationToken"></param>
  136. // /// <returns></returns>
  137. //public async Task<PagedDto<WorkflowOrderDto>> GetAboutToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
  138. //{
  139. // var setting = _systemSettingCacheManager.GetSetting(SettingConstants.OrderAboutToExpire);
  140. // var value = setting?.SettingValue[0];
  141. // value = string.IsNullOrEmpty(value) ? "0" : value;
  142. // DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
  143. // stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
  144. // DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
  145. // RefAsync<int> total = 0;
  146. // var items = await Db.Queryable<Workflow>()
  147. // .LeftJoin<Order>((x, o) => x.ExternalId == o.Id)
  148. // .Where(x => x.ModuleCode == "OrderHandle")
  149. // .WhereIF(dto.IsProvince.HasValue, (x, o) => o.IsProvince == dto.IsProvince)
  150. // .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => o.Title.Contains(dto.Keyword!) || o.No.Contains(dto.Keyword!))
  151. // .Where((x, o) => (int)x.Status < 20 && stTime >= x.ExpiredTime && stTime2 <= x.ExpiredTime)
  152. // .Select((x, o) => new WorkflowOrder { Order = o }, true)
  153. // .OrderByDescending(x => x.CreationTime)
  154. // .ToPageListAsync(dto.PageIndex, dto.PageSize, total, cancellationToken);
  155. // return new PagedDto<WorkflowOrderDto>(total, _mapper.Map<IReadOnlyList<WorkflowOrderDto>>(items));
  156. //}
  157. /// <summary>
  158. /// 已超期列表
  159. /// </summary>
  160. /// <param name="dto"></param>
  161. /// <param name="cancellationToken"></param>
  162. /// <returns></returns>
  163. public async Task<PagedDto<OrderDto>> GetToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
  164. {
  165. DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
  166. var (total, items) = await _orderRepository.Queryable()
  167. .WhereIF(dto.IsProvince.HasValue, x => x.IsProvince == dto.IsProvince)
  168. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword!) || x.No.Contains(dto.Keyword!))
  169. //.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No)
  170. //.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
  171. .Where(x => x.ExpiredTime != null &&
  172. (((x.Status == EOrderStatus.Filed || x.Status == EOrderStatus.Published || x.Status == EOrderStatus.Visited) && x.FiledTime >= x.ExpiredTime) ||
  173. ((x.Status != EOrderStatus.Filed && x.Status != EOrderStatus.Published && x.Status != EOrderStatus.Visited) && stTime >= x.ExpiredTime.Value)))
  174. .OrderByDescending(x => x.CreationTime)
  175. .ToPagedListAsync(dto.PageIndex, dto.PageSize, cancellationToken);
  176. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  177. }
  178. // /// <summary>
  179. // /// 已超期节点列表
  180. // /// </summary>
  181. // /// <param name="dto"></param>
  182. // /// <param name="cancellationToken"></param>
  183. // /// <returns></returns>
  184. // public async Task<PagedDto<WorkflowOrderDto>> GetToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
  185. // {
  186. // DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
  187. //RefAsync<int> total = 0;
  188. //var items= await Db.Queryable<Workflow>()
  189. // .LeftJoin<Order>((x,o)=>x.ExternalId == o.Id)
  190. // .Where(x => x.ModuleCode == "OrderHandle")
  191. // .WhereIF(dto.IsProvince.HasValue, (x, o) => o.IsProvince == dto.IsProvince)
  192. // .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => o.Title.Contains(dto.Keyword!) || o.No.Contains(dto.Keyword!))
  193. // .Where((x,o) => (((int)x.Status >= 20 && x.EndTime >= x.ExpiredTime) || ((int)x.Status < 20 && stTime >= x.ExpiredTime)))
  194. // .Select((x, o) => new WorkflowOrder { Order = o }, true)
  195. // .OrderByDescending(x => x.CreationTime)
  196. // .ToPageListAsync(dto.PageIndex, dto.PageSize, total, cancellationToken);
  197. // return new PagedDto<WorkflowOrderDto>(total, _mapper.Map<IReadOnlyList<WorkflowOrderDto>>(items));
  198. // }
  199. /// <summary>
  200. /// 工单关键字分词
  201. /// </summary>
  202. /// <param name="inputStr"></param>
  203. /// <returns></returns>
  204. public async Task OrderParticiple(string inputStr, string orderId, CancellationToken cancellationToken)
  205. {
  206. var words = await _orderWrodRepository.Queryable().Where(x => x.IsEnable == 1 && x.Classify.Contains("普通标签")).Select(x => x.Tag).ToListAsync(cancellationToken);
  207. var res = new List<string>();
  208. if (words.Any()) res = ParticipleTool.SegMMDouble(inputStr, ref words);
  209. var participles = await _orderWrodRepository.Queryable().In(x => x.Tag, res).ToListAsync(cancellationToken);
  210. if (participles.Any())
  211. {
  212. //关键词
  213. var tags = participles.Select(x => x.Tag).ToList();
  214. var tagsStr = string.Join(",", tags);
  215. await _orderRepository.Updateable().SetColumns(x => x.TagNames == tagsStr).Where(x => x.Id == orderId).ExecuteCommandAsync(cancellationToken);
  216. List<string> synonyms = participles.Select(x => x.Synonym).ToList();
  217. if (synonyms.Any())
  218. {
  219. var synonymsStr = string.Join(",", synonyms);
  220. synonyms = synonymsStr.Split(",").Distinct().ToList();
  221. tags.AddRange(synonyms);
  222. }
  223. var vector = await _orderRepository.Queryable().Where(x => x.Id == orderId).ToListAsync(cancellationToken);
  224. if (vector.Any()) await _repositoryts.UpdateVectorAsync(orderId, tags, cancellationToken);
  225. else await _repositoryts.AddVectorAsync(orderId, DateTime.Now, tags, cancellationToken);
  226. }
  227. }
  228. }