OrderRepository.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.FlowEngine.Workflows;
  3. using Hotline.Orders;
  4. using Hotline.Repository.SqlSugar.DataPermissions;
  5. using Hotline.Repository.SqlSugar.Extensions;
  6. using Hotline.Repository.SqlSugar.Ts;
  7. using Hotline.Settings.TimeLimits;
  8. using Hotline.Share.Dtos;
  9. using Hotline.Share.Dtos.FlowEngine.Workflow;
  10. using Hotline.Share.Dtos.Order;
  11. using Hotline.Share.Enums.Order;
  12. using Hotline.Tools;
  13. using MapsterMapper;
  14. using SqlSugar;
  15. using XF.Domain.Constants;
  16. using XF.Domain.Dependency;
  17. using XF.Domain.Repository;
  18. namespace Hotline.Repository.SqlSugar.Orders
  19. {
  20. public class OrderRepository : BaseRepositoryWorkflow<Order>, IOrderRepository, IScopeDependency
  21. {
  22. private readonly IDataPermissionFilterBuilder _dataPermissionFilterBuilder;
  23. private readonly ITimeLimitDomainService _timeLimitDomainService;
  24. private readonly IMapper _mapper;
  25. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  26. private readonly IRepository<OrderWord> _orderWrodRepository;
  27. private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
  28. public OrderRepository(ISugarUnitOfWork<HotlineDbContext> uow,
  29. IDataPermissionFilterBuilder dataPermissionFilterBuilder,
  30. ITimeLimitDomainService timeLimitDomainService,
  31. IMapper mapper,
  32. ISystemSettingCacheManager systemSettingCacheManager,
  33. IRepository<OrderWord> orderWrodRepository,
  34. IRepositoryTextSearch<OrderTs> repositoryts
  35. ) : base(uow, dataPermissionFilterBuilder)
  36. {
  37. _dataPermissionFilterBuilder = dataPermissionFilterBuilder;
  38. _timeLimitDomainService = timeLimitDomainService;
  39. _mapper = mapper;
  40. _systemSettingCacheManager = systemSettingCacheManager;
  41. _orderWrodRepository = orderWrodRepository;
  42. _repositoryts = repositoryts;
  43. }
  44. public async Task<string> AddOrderNavAsync(Order order, CancellationToken cancellationToken)
  45. {
  46. //弥补AddNav方法没有自动指派到创建人
  47. order.AssignToCreator(_dataPermissionFilterBuilder.DataPermissionManager);
  48. await AddNav(order).Include(d => d.OrderExtension).ExecuteCommandAsync();
  49. return order.Id;
  50. }
  51. /// <summary>
  52. /// 即将超期列表
  53. /// </summary>
  54. /// <param name="dto"></param>
  55. /// <param name="cancellationToken"></param>
  56. /// <returns></returns>
  57. public async Task<PagedDto<OrderDto>> GetAboutToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
  58. {
  59. var setting = _systemSettingCacheManager.GetSetting(SettingConstants.OrderAboutToExpire);
  60. var value = setting?.SettingValue[0];
  61. value = string.IsNullOrEmpty(value) ? "0" : value;
  62. DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
  63. stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
  64. DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
  65. var (total, items) = await Db.Queryable<Order>()
  66. .WhereIF(dto.IsProvince.HasValue, x => x.IsProvince == dto.IsProvince)
  67. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword!) || x.No.Contains(dto.Keyword!))
  68. .Where(x => x.ExpiredTime != null &&
  69. x.Status != EOrderStatus.Filed && x.Status != EOrderStatus.Published && x.Status != EOrderStatus.Visited && stTime >= x.ExpiredTime.Value && stTime2 <= x.ExpiredTime.Value)
  70. .OrderByDescending(x => x.CreationTime)
  71. .ToPagedListAsync(dto.PageIndex, dto.PageSize, cancellationToken);
  72. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  73. }
  74. /// <summary>
  75. /// 即将超期节点列表
  76. /// </summary>
  77. /// <param name="dto"></param>
  78. /// <param name="cancellationToken"></param>
  79. /// <returns></returns>
  80. //public async Task<PagedDto<WorkflowOrderDto>> GetAboutToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
  81. //{
  82. // var setting = _systemSettingCacheManager.GetSetting(SettingConstants.OrderAboutToExpire);
  83. // var value = setting?.SettingValue[0];
  84. // value = string.IsNullOrEmpty(value) ? "0" : value;
  85. // DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
  86. // stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
  87. // DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
  88. // RefAsync<int> total = 0;
  89. // var items = await Db.Queryable<Workflow>()
  90. // .LeftJoin<Order>((x, o) => x.ExternalId == o.Id)
  91. // .Where(x => x.ModuleCode == "OrderHandle")
  92. // .WhereIF(dto.IsProvince.HasValue, (x, o) => o.IsProvince == dto.IsProvince)
  93. // .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => o.Title.Contains(dto.Keyword!) || o.No.Contains(dto.Keyword!))
  94. // .Where((x, o) => (int)x.Status < 20 && stTime >= x.ExpiredTime && stTime2 <= x.ExpiredTime)
  95. // .Select((x, o) => new WorkflowOrder { Order = o }, true)
  96. // .OrderByDescending(x => x.CreationTime)
  97. // .ToPageListAsync(dto.PageIndex, dto.PageSize, total, cancellationToken);
  98. // return new PagedDto<WorkflowOrderDto>(total, _mapper.Map<IReadOnlyList<WorkflowOrderDto>>(items));
  99. //}
  100. /// <summary>
  101. /// 已超期列表
  102. /// </summary>
  103. /// <param name="dto"></param>
  104. /// <param name="cancellationToken"></param>
  105. /// <returns></returns>
  106. public async Task<PagedDto<OrderDto>> GetToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
  107. {
  108. DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
  109. var (total, items) = await Db.Queryable<Order>()
  110. .WhereIF(dto.IsProvince.HasValue, x => x.IsProvince == dto.IsProvince)
  111. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword!) || x.No.Contains(dto.Keyword!))
  112. //.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No)
  113. //.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
  114. .Where(x => x.ExpiredTime != null &&
  115. (((x.Status == EOrderStatus.Filed || x.Status == EOrderStatus.Published || x.Status == EOrderStatus.Visited) && x.FiledTime >= x.ExpiredTime ) ||
  116. ((x.Status != EOrderStatus.Filed && x.Status != EOrderStatus.Published && x.Status != EOrderStatus.Visited) && stTime >= x.ExpiredTime.Value)))
  117. .OrderByDescending(x => x.CreationTime)
  118. .ToPagedListAsync(dto.PageIndex, dto.PageSize, cancellationToken);
  119. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  120. }
  121. // /// <summary>
  122. // /// 已超期节点列表
  123. // /// </summary>
  124. // /// <param name="dto"></param>
  125. // /// <param name="cancellationToken"></param>
  126. // /// <returns></returns>
  127. // public async Task<PagedDto<WorkflowOrderDto>> GetToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
  128. // {
  129. // DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
  130. //RefAsync<int> total = 0;
  131. //var items= await Db.Queryable<Workflow>()
  132. // .LeftJoin<Order>((x,o)=>x.ExternalId == o.Id)
  133. // .Where(x => x.ModuleCode == "OrderHandle")
  134. // .WhereIF(dto.IsProvince.HasValue, (x, o) => o.IsProvince == dto.IsProvince)
  135. // .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => o.Title.Contains(dto.Keyword!) || o.No.Contains(dto.Keyword!))
  136. // .Where((x,o) => (((int)x.Status >= 20 && x.EndTime >= x.ExpiredTime) || ((int)x.Status < 20 && stTime >= x.ExpiredTime)))
  137. // .Select((x, o) => new WorkflowOrder { Order = o }, true)
  138. // .OrderByDescending(x => x.CreationTime)
  139. // .ToPageListAsync(dto.PageIndex, dto.PageSize, total, cancellationToken);
  140. // return new PagedDto<WorkflowOrderDto>(total, _mapper.Map<IReadOnlyList<WorkflowOrderDto>>(items));
  141. // }
  142. /// <summary>
  143. /// 工单词库批量删除
  144. /// </summary>
  145. /// <param name="ids"></param>
  146. /// <param name="cancellationToken"></param>
  147. /// <returns></returns>
  148. public async Task RemoveOrderWrodBatchAsync(List<string> ids, CancellationToken cancellationToken) {
  149. await Db.Deleteable<OrderWord>().In(x=>x.Id,ids).ExecuteCommandAsync(cancellationToken);
  150. }
  151. /// <summary>
  152. /// 工单观察批量删除
  153. /// </summary>
  154. /// <param name="ids"></param>
  155. /// <param name="cancellationToken"></param>
  156. /// <returns></returns>
  157. public async Task RemoveOrderObserveBatchAsync(List<string> ids, CancellationToken cancellationToken)
  158. {
  159. await Db.Deleteable<OrderObserve>().In(x => x.Id, ids).ExecuteCommandAsync(cancellationToken);
  160. }
  161. /// <summary>
  162. /// 工单终结批量删除
  163. /// </summary>
  164. /// <param name="ids"></param>
  165. /// <param name="cancellationToken"></param>
  166. /// <returns></returns>
  167. public async Task RemoveOrderFinalityBatchAsync(List<string> ids, CancellationToken cancellationToken)
  168. {
  169. await Db.Deleteable<OrderFinality>().In(x => x.Id, ids).ExecuteCommandAsync(cancellationToken);
  170. }
  171. /// <summary>
  172. /// 工单关键字分词
  173. /// </summary>
  174. /// <param name="inputStr"></param>
  175. /// <returns></returns>
  176. public async Task OrderParticiple(string inputStr,string orderId, CancellationToken cancellationToken) {
  177. var words =await _orderWrodRepository.Queryable().Where(x => x.IsEnable == 1 && x.Classify.Contains("普通标签")).Select(x=>x.Tag).ToListAsync(cancellationToken);
  178. var res = new List<string>();
  179. if(words.Any()) res = ParticipleTool.SegMMDouble(inputStr, ref words);
  180. var participles = await _orderWrodRepository.Queryable().In(x=>x.Tag,res).ToListAsync(cancellationToken);
  181. if (participles.Any())
  182. {
  183. //关键词
  184. var tags = participles.Select(x=>x.Tag).ToList();
  185. var tagsStr = string.Join(",", tags);
  186. await Db.Updateable<Order>().SetColumns(x=>x.TagNames == tagsStr).Where(x=>x.Id == orderId).ExecuteCommandAsync(cancellationToken);
  187. List<string> synonyms = participles.Select(x => x.Synonym).ToList();
  188. if (synonyms.Any())
  189. {
  190. var synonymsStr = string.Join(",", synonyms);
  191. synonyms = synonymsStr.Split(",").Distinct().ToList();
  192. tags.AddRange(synonyms);
  193. }
  194. var vector = await Db.Queryable<OrderTs>().Where(x=>x.Id == orderId).ToListAsync(cancellationToken);
  195. if (vector.Any()) await _repositoryts.UpdateVectorAsync(orderId, tags, cancellationToken);
  196. else await _repositoryts.AddVectorAsync(orderId, DateTime.Now, tags, cancellationToken);
  197. }
  198. }
  199. public async Task OrderScreenRevisionVisit(string VisitId, bool canHandle, CancellationToken cancellationToken) {
  200. await Db.Updateable<OrderVisit>().SetColumns(x => x.IsCanHandle == canHandle).Where(x=>x.Id == VisitId).ExecuteCommandAsync(cancellationToken);
  201. }
  202. public async Task FileAsync(Order order, CancellationToken cancellationToken)
  203. {
  204. await Db.Updateable<Order>().SetColumns(x=>x.FileJson == order.FileJson).Where(x=>x.Id == order.Id).ExecuteCommandAsync(cancellationToken);
  205. }
  206. }
  207. }