OrderSecondaryHandlingApplication.cs 31 KB

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