OrderSecondaryHandlingApplication.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  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. using Hotline.Share.Requests;
  23. using Hotline.Settings;
  24. using Novacode;
  25. using Hotline.Share.Enums.FlowEngine;
  26. using Hotline.Settings.TimeLimitDomain;
  27. namespace Hotline.Application.Orders
  28. {
  29. public class OrderSecondaryHandlingApplication : IOrderSecondaryHandlingApplication, IScopeDependency
  30. {
  31. private readonly IMapper _mapper;
  32. private readonly IRepository<OrderSecondaryHandling> _orderSecondaryHandlingRepository;
  33. private readonly IFileRepository _fileRepository;
  34. private readonly IRepository<OrderVisit> _orderVisitRepository;
  35. private readonly ISessionContext _sessionContext;
  36. private readonly IOrderRepository _orderRepository;
  37. private readonly ITimeLimitDomainService _timeLimitDomainService;
  38. private readonly ICalcExpireTime _expireTime;
  39. private readonly ICapPublisher _capPublisher;
  40. private readonly IWorkflowApplication _workflowApplication;
  41. private readonly IRepository<OrderPublish> _orderPublishRepository;
  42. private readonly IRepository<OrderPublishHistory> _orderPublishHistoryRepository;
  43. private readonly IWorkflowDomainService _workflowDomainService;
  44. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  45. private readonly IOrderDomainService _orderDomainService;
  46. public OrderSecondaryHandlingApplication(
  47. IMapper mapper,
  48. IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
  49. IFileRepository fileRepository,
  50. IRepository<OrderVisit> orderVisitRepository,
  51. ISessionContext sessionContext,
  52. IOrderRepository orderRepository,
  53. ITimeLimitDomainService timeLimitDomainService,
  54. ICapPublisher capPublisher,
  55. IWorkflowApplication workflowApplication,
  56. IRepository<OrderPublish> orderPublishRepository,
  57. IRepository<OrderPublishHistory> orderPublishHistoryRepository,
  58. IWorkflowDomainService workflowDomainService,
  59. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  60. IOrderDomainService orderDomainService
  61. ,
  62. ICalcExpireTime expireTime)
  63. {
  64. _mapper = mapper;
  65. _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
  66. _fileRepository = fileRepository;
  67. _orderVisitRepository = orderVisitRepository;
  68. _sessionContext = sessionContext;
  69. _orderRepository = orderRepository;
  70. _timeLimitDomainService = timeLimitDomainService;
  71. _capPublisher = capPublisher;
  72. _workflowApplication = workflowApplication;
  73. _orderPublishRepository = orderPublishRepository;
  74. _orderPublishHistoryRepository = orderPublishHistoryRepository;
  75. _workflowDomainService = workflowDomainService;
  76. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  77. _orderDomainService = orderDomainService;
  78. _expireTime = expireTime;
  79. }
  80. /// <summary>
  81. /// 二次办理新增
  82. /// </summary>
  83. /// <returns></returns>
  84. public async Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
  85. {
  86. var model = _mapper.Map<OrderSecondaryHandling>(dto);
  87. if (string.IsNullOrEmpty(dto.Id))
  88. {
  89. model.InitId();
  90. }
  91. else
  92. {
  93. model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken);
  94. model.Content = dto.Content;
  95. }
  96. model.State = ESecondaryHandlingState.Apply;
  97. model.ApplyOrgId = _sessionContext.OrgId;
  98. model.ApplyOrgName = _sessionContext.OrgName;
  99. if (dto.Files.Any())
  100. model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
  101. var visit = await _orderVisitRepository.GetAsync(x => x.Id == dto.VisitId && x.VisitState != EVisitState.None, cancellationToken);
  102. if (visit != null)
  103. {
  104. model.VisitState = visit.VisitState;
  105. //visit.VisitState = EVisitState.None;
  106. visit.IsCanHandle = false;
  107. await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
  108. }
  109. if (!string.IsNullOrEmpty(dto.Id))
  110. {
  111. await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
  112. }
  113. else
  114. {
  115. await _orderSecondaryHandlingRepository.AddAsync(model, cancellationToken);
  116. }
  117. }
  118. public async Task SendBackAsync(SendBackOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
  119. {
  120. var model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken);
  121. model.State = ESecondaryHandlingState.NotApply;
  122. model.SendBackContent = dto.SendBackContent;
  123. model.AuditUser = _sessionContext.UserName;
  124. model.AuditTime = DateTime.Now;
  125. model.SendBackNum = model.SendBackNum is null ? 1 : model.SendBackNum + 1;
  126. await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
  127. var visit = await _orderVisitRepository.GetAsync(x => x.Id == model.VisitId, cancellationToken);
  128. if (visit != null)
  129. {
  130. //visit.VisitState = model.VisitState;
  131. visit.IsCanHandle = true;
  132. await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
  133. }
  134. }
  135. /// <summary>
  136. /// 二次办理审批
  137. /// </summary>
  138. /// <returns></returns>
  139. public async Task AuditAsync(AuditOrderSecondaryHandlingDto dto, OrderSecondaryHandling model, CancellationToken cancellationToken)
  140. {
  141. model.State = dto.State;
  142. model.AuditContent = dto.AuditContent;
  143. model.AuditId = _sessionContext.UserId;
  144. model.AuditUser = _sessionContext.UserName;
  145. model.AuditTime = DateTime.Now;
  146. var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == model.OrderId, cancellationToken);
  147. if (model.State == ESecondaryHandlingState.End)
  148. {
  149. var order = await _orderRepository.GetAsync(x => x.Id == model.OrderId, cancellationToken);
  150. if (string.IsNullOrEmpty(order.WorkflowId))
  151. throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程信息!");
  152. var step = order.CounterSignType == ECounterSignType.Department ?
  153. await _workflowDomainService.FindTopHandleStepAsync(order.WorkflowId, cancellationToken) : await _workflowDomainService.FindLastHandleStepAsync(order.WorkflowId, model.ApplyOrgId, cancellationToken);
  154. if (step == null)
  155. throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程节点!");
  156. var recall = new RecallDto
  157. {
  158. WorkflowId = order.WorkflowId!,
  159. NextStepCode = step.Code,
  160. NextStepName = step.Name,
  161. NextHandlers = new List<FlowStepHandler> { step.GetWorkflowStepHandler() },
  162. Opinion = dto.AuditContent,
  163. FlowDirection = Share.Enums.FlowEngine.EFlowDirection.CenterToOrg,
  164. HandlerType = step.HandlerType,
  165. BusinessType = step.BusinessType
  166. };
  167. var reTransactNum = order.ReTransactNum is null ? 1 : order.ReTransactNum + 1;
  168. //var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
  169. var expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
  170. var processType = step.FlowDirection == EFlowDirection.OrgToCenter || step.FlowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;
  171. var isOrderFiled = order.Status >= EOrderStatus.Filed;
  172. await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ReTransactNum = reTransactNum, ProcessType = processType, Status = EOrderStatus.Handling })
  173. .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
  174. var orderDto = _mapper.Map<OrderDto>(order);
  175. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
  176. var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == model.OrderId);
  177. if (publish != null)
  178. {
  179. var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
  180. publishHistory.OrderPublishId = publish.Id;
  181. publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
  182. publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
  183. publishHistory.ArrangeContentAfter = publish.ArrangeContent;
  184. publishHistory.ArrangeContentBefor = publish.ArrangeContent;
  185. publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
  186. publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
  187. await _orderPublishHistoryRepository.AddAsync(publishHistory, cancellationToken);
  188. await _orderPublishRepository.RemoveAsync(publish, false, cancellationToken);
  189. }
  190. await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, isOrderFiled, EWorkflowTraceType.SecondHandle, cancellationToken);
  191. visit.VisitState = EVisitState.None;
  192. await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
  193. }
  194. else
  195. {
  196. visit.IsCanHandle = true;
  197. await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
  198. }
  199. await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
  200. }
  201. /// <summary>
  202. /// 获取申请列表
  203. /// </summary>
  204. /// <returns></returns>
  205. public ISugarQueryable<OrderVisitDetail> ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken)
  206. {
  207. //dto.CreationTimeEnd = DateTime.Now;
  208. ////dto.CreationTimeStart = DateTime.Now;
  209. //dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
  210. var isAdmin = _orderDomainService.IsCheckAdmin();
  211. var query = _orderVisitedDetailRepository.Queryable(false, true)
  212. .Includes(x => x.OrderVisit)
  213. .Includes(x => x.OrderVisit, y => y.Order)
  214. .Includes(x => x.OrderVisit, y => y.Employee)
  215. .Includes(x => x.SecondaryHandling)
  216. .Where(x => x.OrderVisit.Order.IsProvince == false)
  217. .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
  218. .Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
  219. //.Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
  220. .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
  221. .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
  222. .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
  223. .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.OrderVisit.Order!.SourceChannelCode! == dto.SourceChannel!)
  224. .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.OrderVisit.Order!.AcceptTypeCode! == dto.AcceptType!)
  225. .WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
  226. .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
  227. .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), x => x.OrderVisit.Order!.CurrentHandleOrgName!.Contains(dto.CurrentHandleOrgName!))
  228. .WhereIF(dto.CurrentHandleTime.HasValue && dto.EndCurrentHandleTime.HasValue, x => x.OrderVisit.Order!.ActualHandleTime >= dto.CurrentHandleTime && x.OrderVisit.Order!.ActualHandleTime <= dto.EndCurrentHandleTime)
  229. .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue, x => x.OrderVisit.Order!.FiledTime >= dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
  230. .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue, x => x.OrderVisit.Order!.CreationTime >= dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
  231. .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue, x => x.OrderVisit.VisitTime >= dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
  232. .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
  233. .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
  234. .WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
  235. .WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
  236. .Where((x, s) => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
  237. .WhereIF(!isAdmin, (x, s) => (x.OrderVisit.Order.CounterSignType == ECounterSignType.Department || x.OrderVisit.Order.CounterSignType == null) && x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
  238. ;
  239. if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
  240. {
  241. query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
  242. (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
  243. x.OrderVisit.Order.No.Contains(dto.Keyword!))
  244. .Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode.StartsWith(_sessionContext.OrgId) && (
  245. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
  246. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
  247. || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
  248. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
  249. ));
  250. }
  251. else
  252. {
  253. query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
  254. (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
  255. x.OrderVisit.Order.No.Contains(dto.Keyword!))
  256. .Where((x, s) => x.VisitTarget == EVisitTarget.Org && (
  257. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
  258. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
  259. || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
  260. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
  261. ));
  262. }
  263. return query.OrderByDescending((x, s) => x.CreationTime);
  264. }
  265. /// <summary>
  266. /// 二次办理列表查询
  267. /// </summary>
  268. /// <returns></returns>
  269. public ISugarQueryable<OrderSecondaryHandling> Query(SecondaryHandlingListDto dto, CancellationToken cancellationToken)
  270. {
  271. if (dto.CreationTimeEnd.HasValue)
  272. dto.CreationTimeEnd = dto.CreationTimeEnd.Value.AddDays(1).AddSeconds(-1);
  273. var quer = _orderSecondaryHandlingRepository.Queryable()
  274. .Includes(x => x.Order)
  275. .Includes(x => x.VisitDetail)
  276. .Includes(x => x.Visit, d => d.Order)
  277. .Where(x => x.State > ESecondaryHandlingState.NotApply)
  278. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!))
  279. .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Visit.Order.Title.Contains(dto.Title!))
  280. .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Visit.Order.No.Contains(dto.No!))
  281. .WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply)
  282. .WhereIF(dto.Status is ESecondaryHandlingState.Handled, x => x.State != ESecondaryHandlingState.Apply)
  283. .WhereIF(dto.Status is ESecondaryHandlingState.End || dto.Status is ESecondaryHandlingState.Refuse || dto.Status is ESecondaryHandlingState.NotApply, x => x.State == dto.Status)
  284. .WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart)
  285. .WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
  286. .WhereIF(!string.IsNullOrEmpty(dto.OrderId), x => x.OrderId == dto.OrderId);
  287. if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
  288. {
  289. quer.Where(x => x.ApplyOrgId.StartsWith(_sessionContext.OrgId));
  290. }
  291. return quer.OrderByDescending(x => x.CreationTime);
  292. }
  293. /// <summary>
  294. /// 获取实体
  295. /// </summary>
  296. /// <returns></returns>
  297. public async Task<OrderSecondaryHandling> Entity(string id, CancellationToken cancellationToken)
  298. {
  299. return await _orderSecondaryHandlingRepository.Queryable()
  300. .FirstAsync(x => x.Id == id, cancellationToken);
  301. }
  302. /// <summary>
  303. /// 二次办理统计
  304. /// </summary>
  305. /// <param name="dto"></param>
  306. /// <returns></returns>
  307. public ISugarQueryable<SecondaryHandlingVo> SecondaryHandlingReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
  308. {
  309. if (dto.EndTime.HasValue)
  310. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  311. return _orderSecondaryHandlingRepository.Queryable()
  312. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  313. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  314. .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
  315. .Where(x => x.State == ESecondaryHandlingState.End)
  316. .GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
  317. .Select(x => new SecondaryHandlingVo
  318. {
  319. OrgId = x.ApplyOrgId,
  320. OrgName = x.ApplyOrgName,
  321. Num = SqlFunc.AggregateCount(x.Id)
  322. })
  323. .OrderByIF(dto.SortRule is 0, x => x.Num, OrderByType.Asc)
  324. .OrderByIF(dto.SortRule is 1, x => x.Num, OrderByType.Desc);
  325. }
  326. /// <summary>
  327. /// 二次办理统计明细
  328. /// </summary>
  329. /// <param name="dto"></param>
  330. /// <returns></returns>
  331. public ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
  332. {
  333. if (dto.EndTime.HasValue)
  334. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  335. return _orderSecondaryHandlingRepository.Queryable()
  336. .Includes(x => x.Order)
  337. .Includes(x => x.Visit)
  338. .Includes(x => x.VisitDetail)
  339. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  340. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  341. .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
  342. .Where(x => x.ApplyOrgId == dto.OrgId)
  343. .Where(x => x.State == ESecondaryHandlingState.End);
  344. }
  345. /// <summary>
  346. /// 二次办理满意度统计
  347. /// </summary>
  348. /// <param name="dto"></param>
  349. /// <returns></returns>
  350. public ISugarQueryable<SecondaryHandlingSatisfactionVo> SecondaryHandlingSatisfactionReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
  351. {
  352. if (dto.EndTime.HasValue)
  353. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  354. return _orderSecondaryHandlingRepository.Queryable()
  355. .Includes(x => x.Order)
  356. .Includes(x => x.Visit)
  357. .Includes(x => x.VisitDetail)
  358. .Includes(x => x.Order, o => o.CallRecord)
  359. .LeftJoin<SystemOrganize>((x, o) => x.ApplyOrgId == o.Id)
  360. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  361. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  362. .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
  363. .WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
  364. .GroupBy((x, o) => new { x.ApplyOrgId, x.ApplyOrgName, o.OrgType })
  365. .Select((x, o) => new SecondaryHandlingSatisfactionVo()
  366. {
  367. OrgId = x.ApplyOrgId,
  368. OrgName = x.ApplyOrgName,
  369. OrgType = o.OrgType,
  370. TotalSumCount = SqlFunc.AggregateCount(x.Id),
  371. VerySatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
  372. SatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
  373. RegardedAsSatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
  374. DefaultSatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
  375. NoSatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
  376. NoEvaluateCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
  377. NoPutThroughCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
  378. });
  379. }
  380. /// <summary>
  381. /// 二次办理满意度统计明细
  382. /// </summary>
  383. /// <param name="dto"></param>
  384. /// <returns></returns>
  385. public ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingSatisfactionDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
  386. {
  387. var key = string.Empty;
  388. if (dto.EndTime.HasValue)
  389. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  390. if (!string.IsNullOrEmpty(dto.Header))
  391. {
  392. switch (dto.Header)
  393. {
  394. case "verySatisfiedCount":
  395. key = "5";
  396. break;
  397. case "satisfiedCount":
  398. key = "4";
  399. break;
  400. case "regardedAsSatisfiedCount":
  401. key = "-1";
  402. break;
  403. case "defaultSatisfiedCount":
  404. key = "0";
  405. break;
  406. case "noSatisfiedCount":
  407. key = "2";
  408. break;
  409. case "noEvaluateCount":
  410. key = "7";
  411. break;
  412. case "noPutThroughCount":
  413. key = "6";
  414. break;
  415. }
  416. }
  417. return _orderSecondaryHandlingRepository.Queryable()
  418. .Includes(x => x.Order)
  419. .Includes(x => x.Visit)
  420. .Includes(x => x.VisitDetail)
  421. .Includes(x => x.Order, o => o.CallRecord)
  422. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  423. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  424. .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
  425. .WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
  426. .WhereIF(dto.VisitTypeId is 1 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == key)
  427. .WhereIF(dto.VisitTypeId is 2 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == key)
  428. .Where(x => x.ApplyOrgId == dto.OrgId)
  429. .Where(x => x.State == ESecondaryHandlingState.End);
  430. }
  431. }
  432. }