CommonPController.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. using Hotline.CallCenter.Calls;
  2. using Hotline.Orders;
  3. using Hotline.Permissions;
  4. using Hotline.Settings;
  5. using Hotline.Settings.CommonOpinions;
  6. using Hotline.Share.Dtos.Settings;
  7. using Hotline.Share.Enums.FlowEngine;
  8. using MapsterMapper;
  9. using Microsoft.AspNetCore.Mvc;
  10. using MongoDB.Driver;
  11. using SqlSugar;
  12. using System.Reflection.Metadata;
  13. using Hotline.Application.CallCenter;
  14. using Hotline.CallCenter.Configs;
  15. using Hotline.FlowEngine.Workflows;
  16. using Hotline.Settings.TimeLimits;
  17. using Hotline.Share.Enums.CallCenter;
  18. using Hotline.Share.Enums.Order;
  19. using Microsoft.Extensions.Options;
  20. using XF.Domain.Authentications;
  21. using XF.Domain.Exceptions;
  22. using XF.Domain.Repository;
  23. using Hotline.Configurations;
  24. using Hotline.Share.Dtos.Order;
  25. using System.Runtime.InteropServices;
  26. using Lucene.Net.Util;
  27. using NPOI.Util;
  28. using XF.Domain.Entities;
  29. namespace Hotline.Api.Controllers
  30. {
  31. /// <summary>
  32. /// 常用意见接口
  33. /// </summary>
  34. public class CommonPController : BaseController
  35. {
  36. private readonly ISystemCommonOpinionDomainService _commonOpinionDomainService;
  37. private readonly ISystemAreaDomainService _systemAreaDomainService;
  38. private readonly IMapper _mapper;
  39. private readonly ISessionContext _sessionContext;
  40. // private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  41. private readonly IOrderRepository _orderRepository;
  42. private readonly IOrderDelayRepository _orderDelayRepository;
  43. private readonly ITimeLimitDomainService _timeLimitDomainService;
  44. private readonly IOrderScreenRepository _orderScreenRepository;
  45. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  46. private readonly ICallApplication _callApplication;
  47. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  48. private readonly IOrderDomainService _orderDomainService;
  49. private readonly IRepository<OrderVisit> _orderVisitRepository;
  50. private readonly IRepository<OrderSendBackAudit> _orderSendBackAuditRepository;
  51. public CommonPController(
  52. ISystemCommonOpinionDomainService commonOpinionDomainService,
  53. ISystemAreaDomainService systemAreaDomainService,
  54. ISessionContext sessionContext,
  55. // IRepository<TrCallRecord> trCallRecordRepository,
  56. IOrderRepository orderRepository,
  57. IMapper mapper,
  58. IOrderDelayRepository orderDelayRepository,
  59. ITimeLimitDomainService timeLimitDomainService,
  60. IOrderScreenRepository orderScreenRepository,
  61. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  62. ICallApplication callApplication,
  63. IOptionsSnapshot<AppConfiguration> appOptions,
  64. IOrderDomainService orderDomainService,
  65. IRepository<OrderVisit> orderVisitRepository,
  66. IRepository<OrderSendBackAudit> orderSendBackAuditRepository)
  67. {
  68. _commonOpinionDomainService = commonOpinionDomainService;
  69. _systemAreaDomainService = systemAreaDomainService;
  70. _mapper = mapper;
  71. _sessionContext = sessionContext;
  72. // _trCallRecordRepository = trCallRecordRepository;
  73. _orderRepository = orderRepository;
  74. _orderDelayRepository = orderDelayRepository;
  75. _timeLimitDomainService = timeLimitDomainService;
  76. _orderScreenRepository = orderScreenRepository;
  77. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  78. _callApplication = callApplication;
  79. _appOptions = appOptions;
  80. _orderDomainService = orderDomainService;
  81. _orderVisitRepository = orderVisitRepository;
  82. _orderSendBackAuditRepository = orderSendBackAuditRepository;
  83. }
  84. #region 省市区
  85. /// <summary>
  86. /// 获取省市区树形
  87. /// </summary>
  88. /// <returns></returns>
  89. [HttpGet("tree-area")]
  90. [Obsolete("请调用sys/area/tree")]
  91. public async Task<List<SystemArea>> GetAearTree()
  92. {
  93. return await _systemAreaDomainService.GetAreaTree();
  94. }
  95. #endregion
  96. /// <summary>
  97. /// 首页基础数据
  98. /// </summary>
  99. /// <returns></returns>
  100. [HttpGet("home_data")]
  101. public async Task<Object> GetHomeData()
  102. {
  103. var tadayTime = DateTime.Now.ToString("yyyy-MM-dd");
  104. //中心
  105. if (_sessionContext.OrgIsCenter)
  106. {
  107. var orderQuery = _orderRepository.Queryable(false, false, false)
  108. .Includes(o => o.Workflow, w => w.Steps);
  109. //今日来电
  110. // var tadayCalls = await _trCallRecordRepository.Queryable()
  111. // .Where(x => x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && tadayTime.Equals(x.CreatedTime.ToString("yyyy-MM-dd"))).ToListAsync();
  112. // var callNum = tadayCalls.Count();
  113. // var validCallNum = tadayCalls.Where(x => x.Duration > 0 || x.QueueTims > 0 || x.RingTimes > 0).Count();
  114. // //今日接通率
  115. // var answeredNum = tadayCalls.Where(x => x.Duration > 0).Count();
  116. // var answeredRate = validCallNum > 0 ? Math.Round((double.Parse(answeredNum.ToString()) / double.Parse(validCallNum.ToString())) * 100, 2) + "%" : "-";
  117. int callNum = 0, validCallNum = 0, answeredNum = 0;
  118. var answeredRate = string.Empty;
  119. var today = DateTime.Today.Date;
  120. if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.TianRun)
  121. {
  122. var calls = await _callApplication.QueryTianrunCallsAsync(
  123. direction: ECallDirection.In,
  124. callStartTimeStart: today,
  125. callStartTimeEnd: today.AddDays(1).AddSeconds(-1),
  126. cancellationToken: HttpContext.RequestAborted);
  127. callNum = calls.Count();
  128. validCallNum = calls.Where(x => x.Duration > 0 || x.QueueTims > 0 || x.RingTimes > 0).Count();
  129. //今日接通率
  130. answeredNum = calls.Where(x => x.Duration > 0).Count();
  131. answeredRate = validCallNum > 0
  132. ? Math.Round((double.Parse(answeredNum.ToString()) / double.Parse(validCallNum.ToString())) * 100, 2) + "%"
  133. : "-";
  134. }
  135. else if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XingTang)
  136. {
  137. var calls = await _callApplication.QueryCallsAsync(
  138. callStartTimeStart: today,
  139. callStartTimeEnd: today.AddDays(1).AddSeconds(-1),
  140. cancellationToken: HttpContext.RequestAborted);
  141. callNum = calls.Count();
  142. validCallNum = calls.Where(x => x.Duration > 0 || x.WaitDuration > 0 || x.RingDuration > 0).Count();
  143. //今日接通率
  144. answeredNum = calls.Where(x => x.Duration > 0).Count();
  145. answeredRate = validCallNum > 0
  146. ? Math.Round((double.Parse(answeredNum.ToString()) / double.Parse(validCallNum.ToString())) * 100, 2) + "%"
  147. : "-";
  148. }
  149. //今日受理工单
  150. var tadayOrders = await orderQuery
  151. .Where(o => tadayTime.Equals(o.CreationTime.ToString("yyyy-MM-dd"))).ToListAsync();
  152. var orderNum = tadayOrders.Count();
  153. var directlyNum = tadayOrders.Where(o => o.ProcessType == Share.Enums.Order.EProcessType.Zhiban).Count();
  154. return new
  155. {
  156. CallNum = callNum, ValidCallNum = validCallNum, AnsweredNum = answeredNum, AnsweredRate = answeredRate, OrderNum = orderNum,
  157. DirectlyNum = directlyNum
  158. };
  159. }
  160. //部门
  161. //今日待办 tasksOkNum
  162. //var time = DateTime.Parse(tadayTime);
  163. //工单
  164. var order = await _orderRepository.Queryable(hasHandled: false)
  165. .Includes(d => d.OrderSpecials)
  166. .Where(d => d.Status != EOrderStatus.WaitForAccept && d.Status != EOrderStatus.BackToUnAccept && d.Status != EOrderStatus.SpecialToUnAccept && d.Status != EOrderStatus.HandOverToUnAccept)
  167. .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
  168. .Where(d => d.Status != EOrderStatus.BackToProvince && d.Status < EOrderStatus.Filed)
  169. .Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
  170. .GroupBy(o => new { o.Id,o.Status })
  171. .Select(o => new
  172. {
  173. aboutExpire = SqlFunc.AggregateSum(SqlFunc.IIF(DateTime.Now > o.NearlyExpiredTime!.Value && DateTime.Now < o.ExpiredTime!.Value,
  174. 1, 0)),
  175. havExpired = SqlFunc.AggregateSum(SqlFunc.IIF(DateTime.Now > o.ExpiredTime!.Value , 1, 0)),
  176. countersignHandle = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status == EOrderStatus.Countersigning, 1, 0)),
  177. }).ToListAsync();
  178. var aboutExpire = order?.Sum(x=>x.aboutExpire) ?? 0;
  179. var havExpired = order?.Sum(x=>x.havExpired) ?? 0;
  180. var countersignHandle = order?.Sum(x=> x.countersignHandle) ?? 0;
  181. //延期
  182. var delay = await _orderDelayRepository.Queryable(hasHandled: false)
  183. .Where(d => d.DelayState == EDelayState.Examining).CountAsync();
  184. //甄别
  185. var screenAudit = await _orderScreenRepository.Queryable(hasHandled: false)
  186. .Where(x=>x.CreationTime < DateTime.Now && x.CreationTime > DateTime.Now.AddMonths(-2))
  187. .Where(x => (x.Status == EScreenStatus.Apply || x.Status == EScreenStatus.Approval || (x.Status == EScreenStatus.SendBack && x.SendBackApply == false)))
  188. //.Where(d => d.Status == EScreenStatus.Apply)
  189. .CountAsync();
  190. //var workTime = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
  191. var screenHandle = await _orderVisitedDetailRepository.Queryable(false, true)
  192. .Includes(x => x.OrderVisit)
  193. .Includes(x => x.OrderScreens)
  194. .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.SendBackApply == true) || x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false)
  195. .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
  196. .Where(x=> x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode == _sessionContext.OrgId && (
  197. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
  198. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2")).CountAsync();
  199. return new
  200. {
  201. AboutExpire = aboutExpire, HavExpired = havExpired, CountersignHandle = countersignHandle, ScreenAudit = screenAudit, Delay = delay,
  202. ScreenHandle = screenHandle
  203. };
  204. }
  205. /// <summary>
  206. /// 首页基础数据
  207. /// </summary>
  208. /// <returns></returns>
  209. [HttpGet("home_data_new")]
  210. public async Task<Object> GetHomeDataNew()
  211. {
  212. var allList = new List<HomeOrderDto>();
  213. var allNum = 0;
  214. var isAdmin = _orderDomainService.IsCheckAdmin();
  215. var IsCenter = _sessionContext.OrgIsCenter;
  216. if (_sessionContext.OrgIsCenter)
  217. {
  218. //待办
  219. var waitedDataList = await _orderRepository
  220. .Queryable(hasHandled: false, isAdmin: isAdmin)
  221. .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
  222. .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
  223. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
  224. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  225. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
  226. .Any())
  227. .Includes(d => d.OrderSpecials)
  228. .Where(d => d.Status != EOrderStatus.WaitForAccept && d.Status != EOrderStatus.BackToUnAccept && d.Status != EOrderStatus.SpecialToUnAccept && d.Status != EOrderStatus.HandOverToUnAccept)
  229. .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
  230. .Where(d => d.Status != EOrderStatus.BackToProvince && d.Status < EOrderStatus.Filed)
  231. .Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
  232. .OrderByDescending(d => new { d.IsUrgent, d.StartTime })
  233. .Select(d => new HomeOrderDto
  234. {
  235. No = d.No,
  236. OrderId = d.Id,
  237. Title = d.Title,
  238. AcceptType = d.AcceptType,
  239. HotspotName = d.HotspotName,
  240. Type = "Waited",
  241. Time = d.ExpiredTime,
  242. Status = d.Status,
  243. ActualHandleTime = d.ActualHandleTime,
  244. CounterSignType = d.CounterSignType
  245. })
  246. .ToListAsync();
  247. var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning &&
  248. ((x.Time > DateTime.Now && x.Status < EOrderStatus.Filed) || (x.Time > x.ActualHandleTime && x.Status >= EOrderStatus.Filed))).OrderBy(x=> x.Time).Take(40).ToList();
  249. waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
  250. //allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
  251. //allList.AddRange(waitedList);
  252. // 已超期
  253. var waitedExpiredDataList = waitedDataList.Where(x => (x.Time < DateTime.Now && x.Status < EOrderStatus.Filed) ||
  254. (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed)).OrderBy(x=>x.Time).Take(40).ToList();
  255. waitedExpiredDataList = waitedExpiredDataList.Count > 0 ? waitedExpiredDataList.Copy() : waitedExpiredDataList;
  256. waitedExpiredDataList.ForEach(x => x.Type = "WaitedExpired");
  257. //allNum += waitedExpiredDataList.Count;
  258. //allList.AddRange(waitedExpiredDataList);
  259. //回访待办
  260. var visitDataList = await _orderVisitRepository.Queryable()
  261. .Includes(d => d.Order)
  262. .Where(d => d.VisitState == EVisitState.WaitForVisit || d.VisitState == EVisitState.NoSatisfiedWaitForVisit)
  263. .Where(d => d.EmployeeId == _sessionContext.RequiredUserId)
  264. .OrderByDescending(x => x.PublishTime)
  265. .Select(d => new HomeOrderDto
  266. {
  267. No = d.Order.No,
  268. OrderId = d.Order.Id,
  269. Title = d.Order.Title,
  270. AcceptType = d.Order.AcceptType,
  271. HotspotName = d.Order.HotspotName,
  272. Type = "Visit",
  273. Time = d.Order.ExpiredTime,
  274. Status = d.Order.Status,
  275. CounterSignType = d.Order.CounterSignType
  276. })
  277. .Take(40)
  278. .ToListAsync();
  279. //allNum += visitDataList.Count;
  280. //allList.AddRange(visitDataList);
  281. //会签待办
  282. var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).OrderBy(x => x.Time).Take(40).ToList();
  283. signDataList = signDataList.Count > 0 ? signDataList.Copy() : signDataList;
  284. signDataList.ForEach(x => x.Type = "Sign");
  285. //allNum += signDataList.Count;
  286. //allList.AddRange(signDataList);
  287. //延期待审批
  288. var delayDataList = await _orderDelayRepository.Queryable(canView: true, isAdmin: isAdmin)
  289. .Includes(d => d.Order)
  290. .Where(d => d.DelayState == EDelayState.Examining)
  291. .OrderByDescending(d => d.ApplyDelayTime)
  292. .Select(d => new HomeOrderDto
  293. {
  294. No = d.Order.No,
  295. OrderId = d.Order.Id,
  296. Title = d.Order.Title,
  297. AcceptType = d.Order.AcceptType,
  298. HotspotName = d.Order.HotspotName,
  299. Type = "Delay",
  300. Time = d.Order.ExpiredTime,
  301. Status = d.Order.Status,
  302. CounterSignType = d.Order.CounterSignType
  303. }).Take(40)
  304. .ToListAsync();
  305. //allNum += delayDataList.Count;
  306. //allList.AddRange(delayDataList);
  307. //部门即将超期
  308. var nearlyExpiredDataList = await _orderRepository.Queryable(canView: !IsCenter)
  309. .Includes(d => d.OrderDelays)
  310. .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
  311. .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
  312. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
  313. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  314. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
  315. .Any())
  316. .Where(d => d.Status < EOrderStatus.Filed && DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
  317. .OrderBy(d => d.NearlyExpiredTime)
  318. .Select(d => new HomeOrderDto
  319. {
  320. No = d.No,
  321. OrderId = d.Id,
  322. Title = d.Title,
  323. AcceptType = d.AcceptType,
  324. HotspotName = d.HotspotName,
  325. Type = "NearlyExpired",
  326. Time = d.ExpiredTime,
  327. Status = d.Status,
  328. CounterSignType = d.CounterSignType
  329. }).Take(40)
  330. .ToListAsync();
  331. //allNum += nearlyExpiredDataList.Count;
  332. //allList.AddRange(nearlyExpiredDataList);
  333. //甄别待审批
  334. var screenDataList = await _orderScreenRepository.Queryable(hasHandled: !true, isAdmin: isAdmin)
  335. .Includes(d => d.Order)
  336. .Includes(d => d.ScreenDetails.Where(sd => sd.AuditUserId == _sessionContext.UserId).OrderByDescending(sd => sd.AuditTime).Take(1).ToList())
  337. .Where(d => (d.Status == EScreenStatus.Apply || d.Status == EScreenStatus.Approval || (d.Status == EScreenStatus.SendBack && d.SendBackApply == false)))
  338. .Select(d => new HomeOrderDto
  339. {
  340. No = d.Order.No,
  341. OrderId = d.Order.Id,
  342. Title = d.Order.Title,
  343. AcceptType = d.Order.AcceptType,
  344. HotspotName = d.Order.HotspotName,
  345. Type = "Screen",
  346. Time = d.Order.ExpiredTime,
  347. Status = d.Order.Status,
  348. CounterSignType = d.Order.CounterSignType
  349. }).Take(40)
  350. .ToListAsync();
  351. //allNum += screenDataList.Count;
  352. //allList.AddRange(screenDataList);
  353. //退回待审批
  354. var sendBackAuditDataList = await _orderSendBackAuditRepository.Queryable()
  355. .Includes(d => d.Order)
  356. .Where(d => d.State == ESendBackAuditState.Apply)
  357. .WhereIF(_sessionContext.Roles.Contains("role_sysadmin") == false, x => x.SendBackOrgId == _sessionContext.OrgId) // 123 系统管理员;
  358. .OrderByDescending(d => d.CreationTime)
  359. .Select(d => new HomeOrderDto
  360. {
  361. No = d.Order.No,
  362. OrderId = d.Order.Id,
  363. Title = d.Order.Title,
  364. AcceptType = d.Order.AcceptType,
  365. HotspotName = d.Order.HotspotName,
  366. Type = "SendBackAudit",
  367. Time = d.Order.ExpiredTime,
  368. Status = d.Order.Status,
  369. CounterSignType = d.Order.CounterSignType
  370. }).Take(40)
  371. .ToListAsync();
  372. //allNum += sendBackAuditDataList.Count;
  373. //allList.AddRange(sendBackAuditDataList);
  374. return new
  375. {
  376. //AllNum = allNum,
  377. //AllList = allList,
  378. WaitedNum = waitedList.Count > 40 ? 40 : waitedList.Count,
  379. WaitedList = waitedList.Take(40).ToList(),
  380. WaitedExpiredNum = waitedExpiredDataList.Count,
  381. WaitedExpiredList = waitedExpiredDataList,
  382. VisitListNum = visitDataList.Count,
  383. VisitList = visitDataList,
  384. SignDataNum = signDataList.Count,
  385. SignDataList = signDataList,
  386. DelayNum = delayDataList.Count,
  387. DelayDataList = delayDataList,
  388. NearlyExpiredNum = nearlyExpiredDataList.Count,
  389. NearlyExpiredList = nearlyExpiredDataList,
  390. ScreenNum = screenDataList.Count,
  391. ScreenList = screenDataList,
  392. SendBackAuditNum = sendBackAuditDataList.Count,
  393. SendBackAuditList = sendBackAuditDataList
  394. };
  395. }
  396. else
  397. {
  398. //待办
  399. var waitedDataList = await _orderRepository
  400. .Queryable(hasHandled: false, isAdmin: isAdmin)
  401. .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
  402. .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
  403. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
  404. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  405. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
  406. .Any())
  407. .Includes(d => d.OrderSpecials)
  408. .Where(d => d.Status != EOrderStatus.WaitForAccept && d.Status != EOrderStatus.BackToUnAccept && d.Status != EOrderStatus.SpecialToUnAccept && d.Status != EOrderStatus.HandOverToUnAccept)
  409. .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
  410. .Where(d => d.Status != EOrderStatus.BackToProvince && d.Status < EOrderStatus.Filed)
  411. .Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
  412. .OrderByDescending(d => new { d.IsUrgent, d.StartTime })
  413. .Select(d => new HomeOrderDto
  414. {
  415. No = d.No,
  416. OrderId = d.Id,
  417. Title = d.Title,
  418. AcceptType = d.AcceptType,
  419. HotspotName = d.HotspotName,
  420. Type = "Waited",
  421. Time = d.ExpiredTime,
  422. Status = d.Status,
  423. ActualHandleTime = d.ActualHandleTime,
  424. CounterSignType = d.CounterSignType
  425. })
  426. .ToListAsync();
  427. var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning &&
  428. ((x.Time > DateTime.Now && x.Status < EOrderStatus.Filed) || (x.Time > x.ActualHandleTime && x.Status >= EOrderStatus.Filed))).OrderBy(x=>x.Time).Take(40).ToList();
  429. waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
  430. //allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
  431. //allList.AddRange(waitedList);
  432. //已超期
  433. var waitedExpiredDataList = waitedDataList.Where(x => (x.Time < DateTime.Now && x.Status < EOrderStatus.Filed) ||
  434. (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed))
  435. .OrderBy(x=> x.Time).Take(40).ToList();
  436. waitedExpiredDataList = waitedExpiredDataList.Count > 0 ? waitedExpiredDataList.Copy() : waitedExpiredDataList;
  437. waitedExpiredDataList.ForEach(x => x.Type = "WaitedExpired");
  438. //allNum += waitedExpiredDataList.Count;
  439. //allList.AddRange(waitedExpiredDataList);
  440. //会签待办
  441. var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).OrderBy(x => x.Time).Take(40).ToList();
  442. signDataList = signDataList.Count > 0 ? signDataList.Copy() : signDataList;
  443. signDataList.ForEach(x => x.Type = "Sign");
  444. //allNum += signDataList.Count;
  445. //allList.AddRange(signDataList);
  446. //甄别待审批
  447. var screenDataList = await _orderScreenRepository.Queryable(hasHandled: !true, isAdmin: isAdmin)
  448. .Includes(d => d.Order)
  449. .Includes(d => d.ScreenDetails.Where(sd => sd.AuditUserId == _sessionContext.UserId).OrderByDescending(sd => sd.AuditTime).Take(1).ToList())
  450. .Where(d => (d.Status == EScreenStatus.Apply || d.Status == EScreenStatus.Approval || (d.Status == EScreenStatus.SendBack && d.SendBackApply == false)))
  451. .Select(d => new HomeOrderDto
  452. {
  453. No = d.Order.No,
  454. OrderId = d.Order.Id,
  455. Title = d.Order.Title,
  456. AcceptType = d.Order.AcceptType,
  457. HotspotName = d.Order.HotspotName,
  458. Type = "Screen",
  459. Time = d.Order.ExpiredTime,
  460. Status = d.Order.Status,
  461. CounterSignType = d.Order.CounterSignType
  462. }).Take(40)
  463. .ToListAsync();
  464. //allNum += screenDataList.Count;
  465. //allList.AddRange(screenDataList);
  466. //延期待审批
  467. var delayDataList = await _orderDelayRepository.Queryable(canView: true, isAdmin: isAdmin)
  468. .Includes(d => d.Order)
  469. .Where(d => d.DelayState == EDelayState.Examining)
  470. .OrderByDescending(d => d.ApplyDelayTime)
  471. .Select(d => new HomeOrderDto
  472. {
  473. No = d.Order.No,
  474. OrderId = d.Order.Id,
  475. Title = d.Order.Title,
  476. AcceptType = d.Order.AcceptType,
  477. HotspotName = d.Order.HotspotName,
  478. Type = "Delay",
  479. Time = d.Order.ExpiredTime,
  480. Status = d.Order.Status,
  481. CounterSignType = d.Order.CounterSignType
  482. }).Take(40)
  483. .ToListAsync();
  484. //allNum += delayDataList.Count;
  485. //allList.AddRange(delayDataList);
  486. //甄别待申请
  487. var screenApplyDataList = await _orderVisitedDetailRepository.Queryable(false, true)
  488. .Includes(x => x.OrderVisit)
  489. .Includes(x => x.OrderVisit, y => y.Order)
  490. .Includes(x => x.OrderVisit, y => y.Employee)
  491. .Includes(x => x.OrderScreens)
  492. .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.SendBackApply == true) || x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false)
  493. .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
  494. .Where(x => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode == _sessionContext.OrgId && (
  495. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
  496. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
  497. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
  498. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
  499. ))
  500. .OrderByDescending(x => x.CreationTime)
  501. .Select(x => new HomeOrderDto
  502. {
  503. No = x.OrderVisit.Order.No,
  504. OrderId = x.OrderVisit.Order.Id,
  505. Title = x.OrderVisit.Order.Title,
  506. AcceptType = x.OrderVisit.Order.AcceptType,
  507. HotspotName = x.OrderVisit.Order.HotspotName,
  508. Type = "ScreenApply",
  509. Time = x.OrderVisit.Order.ExpiredTime,
  510. Status = x.OrderVisit.Order.Status,
  511. CounterSignType = x.OrderVisit.Order.CounterSignType
  512. }).Take(40).ToListAsync();
  513. //allNum += screenApplyDataList.Count;
  514. //allList.AddRange(screenApplyDataList);
  515. //退回待审批
  516. var sendBackAuditDataList = await _orderSendBackAuditRepository.Queryable()
  517. .Includes(d => d.Order)
  518. .Where(d => d.State == ESendBackAuditState.Apply)
  519. .WhereIF(_sessionContext.Roles.Contains("role_sysadmin") == false, x => x.SendBackOrgId == _sessionContext.OrgId) // 123 系统管理员;
  520. .OrderByDescending(d => d.CreationTime)
  521. .Select(d => new HomeOrderDto
  522. {
  523. No = d.Order.No,
  524. OrderId = d.Order.Id,
  525. Title = d.Order.Title,
  526. AcceptType = d.Order.AcceptType,
  527. HotspotName = d.Order.HotspotName,
  528. Type = "SendBackAudit",
  529. Time = d.Order.ExpiredTime,
  530. Status = d.Order.Status,
  531. CounterSignType = d.Order.CounterSignType
  532. }).Take(40)
  533. .ToListAsync();
  534. //allNum += sendBackAuditDataList.Count;
  535. //allList.AddRange(sendBackAuditDataList);
  536. //部门即将超期
  537. var nearlyExpiredDataList = await _orderRepository.Queryable(canView: !IsCenter)
  538. .Includes(d => d.OrderDelays)
  539. .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
  540. .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
  541. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
  542. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  543. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
  544. .Any())
  545. .Where(d => d.Status < EOrderStatus.Filed && DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
  546. .OrderBy(d => d.NearlyExpiredTime)
  547. .Select(d => new HomeOrderDto
  548. {
  549. No = d.No,
  550. OrderId = d.Id,
  551. Title = d.Title,
  552. AcceptType = d.AcceptType,
  553. HotspotName = d.HotspotName,
  554. Type = "NearlyExpired",
  555. Time = d.ExpiredTime,
  556. Status = d.Status,
  557. CounterSignType = d.CounterSignType
  558. }).Take(40)
  559. .ToListAsync();
  560. return new
  561. {
  562. //AllNum = allNum,
  563. //AllList = allList,
  564. WaitedNum = waitedList.Count > 40 ? 40 : waitedList.Count,
  565. WaitedList = waitedList.Take(40).ToList(),
  566. WaitedExpiredNum = waitedExpiredDataList.Count,
  567. WaitedExpiredList = waitedExpiredDataList,
  568. SignDataNum = signDataList.Count,
  569. SignDataList = signDataList,
  570. ScreenNum = screenDataList.Count,
  571. ScreenList = screenDataList,
  572. DelayNum = delayDataList.Count,
  573. DelayDataList = delayDataList,
  574. ScreenApplyNum = screenApplyDataList.Count,
  575. ScreenApplyList = screenApplyDataList,
  576. SendBackAuditNum = sendBackAuditDataList.Count,
  577. SendBackAuditList = sendBackAuditDataList,
  578. NearlyExpiredNum = nearlyExpiredDataList.Count,
  579. NearlyExpiredList = nearlyExpiredDataList,
  580. };
  581. }
  582. }
  583. }
  584. }