CommonPController.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  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(hasHandledStep: false, isAdmin: isAdmin)
  221. .Includes(d => d.OrderSpecials)
  222. .Where(d => d.Status != EOrderStatus.WaitForAccept && d.Status != EOrderStatus.BackToUnAccept && d.Status != EOrderStatus.SpecialToUnAccept && d.Status != EOrderStatus.HandOverToUnAccept)
  223. .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
  224. .Where(d => d.Status != EOrderStatus.BackToProvince && d.Status < EOrderStatus.Filed)
  225. .Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
  226. .OrderByDescending(d => new { d.IsUrgent, d.StartTime })
  227. .Select(d => new HomeOrderDto
  228. {
  229. No = d.No,
  230. OrderId = d.Id,
  231. Title = d.Title,
  232. AcceptType = d.AcceptType,
  233. HotspotName = d.HotspotName,
  234. Type = "Waited",
  235. Time = d.ExpiredTime,
  236. Status = d.Status,
  237. ActualHandleTime = d.ActualHandleTime,
  238. NearlyExpiredTime = d.NearlyExpiredTime,
  239. CounterSignType = d.CounterSignType
  240. })
  241. .ToListAsync();
  242. var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning &&
  243. x.Time > DateTime.Now && x.Status < EOrderStatus.Filed && DateTime.Now < x.NearlyExpiredTime
  244. ).OrderBy(x=> x.Time).Take(40).ToList();
  245. waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
  246. //allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
  247. //allList.AddRange(waitedList);
  248. // 已超期
  249. var waitedExpiredDataList = waitedDataList.Where(x => (x.Time < DateTime.Now && x.Status < EOrderStatus.Filed) ||
  250. (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed)).OrderBy(x=>x.Time).Take(40).ToList();
  251. waitedExpiredDataList = waitedExpiredDataList.Count > 0 ? waitedExpiredDataList.Copy() : waitedExpiredDataList;
  252. waitedExpiredDataList.ForEach(x => x.Type = "WaitedExpired");
  253. //allNum += waitedExpiredDataList.Count;
  254. //allList.AddRange(waitedExpiredDataList);
  255. //回访待办
  256. var visitDataList = await _orderVisitRepository.Queryable()
  257. .Includes(d => d.Order)
  258. .Where(d => d.VisitState == EVisitState.WaitForVisit || d.VisitState == EVisitState.NoSatisfiedWaitForVisit)
  259. .Where(d => d.EmployeeId == _sessionContext.RequiredUserId)
  260. .OrderByDescending(x => x.PublishTime)
  261. .Select(d => new HomeOrderDto
  262. {
  263. No = d.Order.No,
  264. OrderId = d.Order.Id,
  265. Title = d.Order.Title,
  266. AcceptType = d.Order.AcceptType,
  267. HotspotName = d.Order.HotspotName,
  268. Type = "Visit",
  269. Time = d.Order.ExpiredTime,
  270. Status = d.Order.Status,
  271. CounterSignType = d.Order.CounterSignType
  272. })
  273. .Take(40)
  274. .ToListAsync();
  275. //allNum += visitDataList.Count;
  276. //allList.AddRange(visitDataList);
  277. //会签待办
  278. var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).OrderBy(x => x.Time).Take(40).ToList();
  279. signDataList = signDataList.Count > 0 ? signDataList.Copy() : signDataList;
  280. signDataList.ForEach(x => x.Type = "Sign");
  281. //allNum += signDataList.Count;
  282. //allList.AddRange(signDataList);
  283. //延期待审批
  284. var delayDataList = await _orderDelayRepository.Queryable(hasHandledStep: false, isAdmin: isAdmin)
  285. .Includes(d => d.Order)
  286. .Where(d => d.DelayState == EDelayState.Examining)
  287. .OrderByDescending(d => d.ApplyDelayTime)
  288. .Select(d => new HomeOrderDto
  289. {
  290. No = d.Order.No,
  291. OrderId = d.Order.Id,
  292. Title = d.Order.Title,
  293. AcceptType = d.Order.AcceptType,
  294. HotspotName = d.Order.HotspotName,
  295. Type = "Delay",
  296. Time = d.Order.ExpiredTime,
  297. Status = d.Order.Status,
  298. CounterSignType = d.Order.CounterSignType
  299. }).Take(40)
  300. .ToListAsync();
  301. //allNum += delayDataList.Count;
  302. //allList.AddRange(delayDataList);
  303. //部门即将超期
  304. var nearlyExpiredDataList = await _orderRepository.Queryable(canView: !IsCenter)
  305. .Includes(d => d.OrderDelays)
  306. .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
  307. .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
  308. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
  309. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  310. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
  311. .Any())
  312. .Where(d => d.Status < EOrderStatus.Filed && DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
  313. .OrderBy(d => d.NearlyExpiredTime)
  314. .Select(d => new HomeOrderDto
  315. {
  316. No = d.No,
  317. OrderId = d.Id,
  318. Title = d.Title,
  319. AcceptType = d.AcceptType,
  320. HotspotName = d.HotspotName,
  321. Type = "NearlyExpired",
  322. Time = d.ExpiredTime,
  323. Status = d.Status,
  324. CounterSignType = d.CounterSignType
  325. }).Take(40)
  326. .ToListAsync();
  327. //allNum += nearlyExpiredDataList.Count;
  328. //allList.AddRange(nearlyExpiredDataList);
  329. //甄别待审批
  330. var screenDataList = await _orderScreenRepository.Queryable(hasHandledStep: false, isAdmin: isAdmin)
  331. .Includes(d => d.Order)
  332. .Includes(d => d.ScreenDetails.Where(sd => sd.AuditUserId == _sessionContext.UserId).OrderByDescending(sd => sd.AuditTime).Take(1).ToList())
  333. .Where(d => (d.Status == EScreenStatus.Apply || d.Status == EScreenStatus.Approval || (d.Status == EScreenStatus.SendBack && d.SendBackApply == false)))
  334. .Select(d => new HomeOrderDto
  335. {
  336. No = d.Order.No,
  337. OrderId = d.Order.Id,
  338. Title = d.Order.Title,
  339. AcceptType = d.Order.AcceptType,
  340. HotspotName = d.Order.HotspotName,
  341. Type = "Screen",
  342. Time = d.Order.ExpiredTime,
  343. Status = d.Order.Status,
  344. CounterSignType = d.Order.CounterSignType
  345. }).Take(40)
  346. .ToListAsync();
  347. //allNum += screenDataList.Count;
  348. //allList.AddRange(screenDataList);
  349. //退回待审批
  350. var sendBackAuditDataList = await _orderSendBackAuditRepository.Queryable()
  351. .Includes(d => d.Order)
  352. .Where(d => d.State == ESendBackAuditState.Apply)
  353. .WhereIF(_sessionContext.Roles.Contains("role_sysadmin") == false, x => x.SendBackOrgId == _sessionContext.OrgId) // 123 系统管理员;
  354. .OrderByDescending(d => d.CreationTime)
  355. .Select(d => new HomeOrderDto
  356. {
  357. No = d.Order.No,
  358. OrderId = d.Order.Id,
  359. Title = d.Order.Title,
  360. AcceptType = d.Order.AcceptType,
  361. HotspotName = d.Order.HotspotName,
  362. Type = "SendBackAudit",
  363. Time = d.Order.ExpiredTime,
  364. Status = d.Order.Status,
  365. CounterSignType = d.Order.CounterSignType
  366. }).Take(40)
  367. .ToListAsync();
  368. //allNum += sendBackAuditDataList.Count;
  369. //allList.AddRange(sendBackAuditDataList);
  370. return new
  371. {
  372. //AllNum = allNum,
  373. //AllList = allList,
  374. WaitedNum = waitedList.Count > 40 ? 40 : waitedList.Count,
  375. WaitedList = waitedList.Take(40).ToList(),
  376. WaitedExpiredNum = waitedExpiredDataList.Count,
  377. WaitedExpiredList = waitedExpiredDataList,
  378. VisitListNum = visitDataList.Count,
  379. VisitList = visitDataList,
  380. SignDataNum = signDataList.Count,
  381. SignDataList = signDataList,
  382. DelayNum = delayDataList.Count,
  383. DelayDataList = delayDataList,
  384. NearlyExpiredNum = nearlyExpiredDataList.Count,
  385. NearlyExpiredList = nearlyExpiredDataList,
  386. ScreenNum = screenDataList.Count,
  387. ScreenList = screenDataList,
  388. SendBackAuditNum = sendBackAuditDataList.Count,
  389. SendBackAuditList = sendBackAuditDataList
  390. };
  391. }
  392. else
  393. {
  394. //待办
  395. var waitedDataList = await _orderRepository
  396. .Queryable(hasHandledStep: false, isAdmin: isAdmin)
  397. .Includes(d => d.OrderSpecials)
  398. .Where(d => d.Status != EOrderStatus.WaitForAccept && d.Status != EOrderStatus.BackToUnAccept && d.Status != EOrderStatus.SpecialToUnAccept && d.Status != EOrderStatus.HandOverToUnAccept)
  399. .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
  400. .Where(d => d.Status != EOrderStatus.BackToProvince && d.Status < EOrderStatus.Filed)
  401. .Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
  402. .OrderByDescending(d => new { d.IsUrgent, d.StartTime })
  403. .Select(d => new HomeOrderDto
  404. {
  405. No = d.No,
  406. OrderId = d.Id,
  407. Title = d.Title,
  408. AcceptType = d.AcceptType,
  409. HotspotName = d.HotspotName,
  410. Type = "Waited",
  411. Time = d.ExpiredTime,
  412. Status = d.Status,
  413. ActualHandleTime = d.ActualHandleTime,
  414. NearlyExpiredTime = d.NearlyExpiredTime,
  415. CounterSignType = d.CounterSignType
  416. })
  417. .ToListAsync();
  418. var waitedList = waitedDataList.Where(x => x.Status != EOrderStatus.Countersigning &&
  419. x.Time > DateTime.Now && x.Status < EOrderStatus.Filed && DateTime.Now < x.NearlyExpiredTime
  420. ).OrderBy(x=>x.Time).Take(40).ToList();
  421. waitedList = waitedList.Count > 0 ? waitedList.Copy() : waitedList;
  422. //allNum += waitedList.Count > 40 ? 40 : waitedList.Count;
  423. //allList.AddRange(waitedList);
  424. //已超期
  425. var waitedExpiredDataList = waitedDataList.Where(x => (x.Time < DateTime.Now && x.Status < EOrderStatus.Filed) ||
  426. (x.Time < x.ActualHandleTime && x.Status >= EOrderStatus.Filed))
  427. .OrderBy(x=> x.Time).Take(40).ToList();
  428. waitedExpiredDataList = waitedExpiredDataList.Count > 0 ? waitedExpiredDataList.Copy() : waitedExpiredDataList;
  429. waitedExpiredDataList.ForEach(x => x.Type = "WaitedExpired");
  430. //allNum += waitedExpiredDataList.Count;
  431. //allList.AddRange(waitedExpiredDataList);
  432. //会签待办
  433. var signDataList = waitedDataList.Where(x => x.Status == EOrderStatus.Countersigning).OrderBy(x => x.Time).Take(40).ToList();
  434. signDataList = signDataList.Count > 0 ? signDataList.Copy() : signDataList;
  435. signDataList.ForEach(x => x.Type = "Sign");
  436. //allNum += signDataList.Count;
  437. //allList.AddRange(signDataList);
  438. //甄别待审批
  439. var screenDataList = await _orderScreenRepository.Queryable(hasHandledStep: false, isAdmin: isAdmin)
  440. .Includes(d => d.Order)
  441. .Includes(d => d.ScreenDetails.Where(sd => sd.AuditUserId == _sessionContext.UserId).OrderByDescending(sd => sd.AuditTime).Take(1).ToList())
  442. .Where(d => (d.Status == EScreenStatus.Apply || d.Status == EScreenStatus.Approval || (d.Status == EScreenStatus.SendBack && d.SendBackApply == false)))
  443. .Select(d => new HomeOrderDto
  444. {
  445. No = d.Order.No,
  446. OrderId = d.Order.Id,
  447. Title = d.Order.Title,
  448. AcceptType = d.Order.AcceptType,
  449. HotspotName = d.Order.HotspotName,
  450. Type = "Screen",
  451. Time = d.Order.ExpiredTime,
  452. Status = d.Order.Status,
  453. CounterSignType = d.Order.CounterSignType
  454. }).Take(40)
  455. .ToListAsync();
  456. //allNum += screenDataList.Count;
  457. //allList.AddRange(screenDataList);
  458. //延期待审批
  459. var delayDataList = await _orderDelayRepository.Queryable(hasHandledStep: false, isAdmin: isAdmin)
  460. .Includes(d => d.Order)
  461. .Where(d => d.DelayState == EDelayState.Examining)
  462. .OrderByDescending(d => d.ApplyDelayTime)
  463. .Select(d => new HomeOrderDto
  464. {
  465. No = d.Order.No,
  466. OrderId = d.Order.Id,
  467. Title = d.Order.Title,
  468. AcceptType = d.Order.AcceptType,
  469. HotspotName = d.Order.HotspotName,
  470. Type = "Delay",
  471. Time = d.Order.ExpiredTime,
  472. Status = d.Order.Status,
  473. CounterSignType = d.Order.CounterSignType
  474. }).Take(40)
  475. .ToListAsync();
  476. //allNum += delayDataList.Count;
  477. //allList.AddRange(delayDataList);
  478. //甄别待申请
  479. var screenApplyDataList = await _orderVisitedDetailRepository.Queryable(false, true)
  480. .Includes(x => x.OrderVisit)
  481. .Includes(x => x.OrderVisit, y => y.Order)
  482. .Includes(x => x.OrderVisit, y => y.Employee)
  483. .Includes(x => x.OrderScreens)
  484. .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)
  485. .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
  486. .Where(x => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode == _sessionContext.OrgId && (
  487. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
  488. SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
  489. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
  490. SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
  491. ))
  492. .OrderByDescending(x => x.CreationTime)
  493. .Select(x => new HomeOrderDto
  494. {
  495. No = x.OrderVisit.Order.No,
  496. OrderId = x.OrderVisit.Order.Id,
  497. Title = x.OrderVisit.Order.Title,
  498. AcceptType = x.OrderVisit.Order.AcceptType,
  499. HotspotName = x.OrderVisit.Order.HotspotName,
  500. Type = "ScreenApply",
  501. Time = x.OrderVisit.Order.ExpiredTime,
  502. Status = x.OrderVisit.Order.Status,
  503. CounterSignType = x.OrderVisit.Order.CounterSignType
  504. }).Take(40).ToListAsync();
  505. //allNum += screenApplyDataList.Count;
  506. //allList.AddRange(screenApplyDataList);
  507. //退回待审批
  508. var sendBackAuditDataList = await _orderSendBackAuditRepository.Queryable()
  509. .Includes(d => d.Order)
  510. .Where(d => d.State == ESendBackAuditState.Apply)
  511. .WhereIF(_sessionContext.Roles.Contains("role_sysadmin") == false, x => x.SendBackOrgId == _sessionContext.OrgId) // 123 系统管理员;
  512. .OrderByDescending(d => d.CreationTime)
  513. .Select(d => new HomeOrderDto
  514. {
  515. No = d.Order.No,
  516. OrderId = d.Order.Id,
  517. Title = d.Order.Title,
  518. AcceptType = d.Order.AcceptType,
  519. HotspotName = d.Order.HotspotName,
  520. Type = "SendBackAudit",
  521. Time = d.Order.ExpiredTime,
  522. Status = d.Order.Status,
  523. CounterSignType = d.Order.CounterSignType
  524. }).Take(40)
  525. .ToListAsync();
  526. //allNum += sendBackAuditDataList.Count;
  527. //allList.AddRange(sendBackAuditDataList);
  528. //部门即将超期
  529. var nearlyExpiredDataList = await _orderRepository.Queryable(canView: !IsCenter)
  530. .Includes(d => d.OrderDelays)
  531. .Where(d => SqlFunc.Subqueryable<WorkflowStep>()
  532. .Where(step => step.ExternalId == d.Id && step.Status != EWorkflowStepStatus.Handled &&
  533. ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
  534. (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
  535. (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))))
  536. .Any())
  537. .Where(d => d.Status < EOrderStatus.Filed && DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
  538. .OrderBy(d => d.NearlyExpiredTime)
  539. .Select(d => new HomeOrderDto
  540. {
  541. No = d.No,
  542. OrderId = d.Id,
  543. Title = d.Title,
  544. AcceptType = d.AcceptType,
  545. HotspotName = d.HotspotName,
  546. Type = "NearlyExpired",
  547. Time = d.ExpiredTime,
  548. Status = d.Status,
  549. CounterSignType = d.CounterSignType
  550. }).Take(40)
  551. .ToListAsync();
  552. return new
  553. {
  554. //AllNum = allNum,
  555. //AllList = allList,
  556. WaitedNum = waitedList.Count > 40 ? 40 : waitedList.Count,
  557. WaitedList = waitedList.Take(40).ToList(),
  558. WaitedExpiredNum = waitedExpiredDataList.Count,
  559. WaitedExpiredList = waitedExpiredDataList,
  560. SignDataNum = signDataList.Count,
  561. SignDataList = signDataList,
  562. ScreenNum = screenDataList.Count,
  563. ScreenList = screenDataList,
  564. DelayNum = delayDataList.Count,
  565. DelayDataList = delayDataList,
  566. ScreenApplyNum = screenApplyDataList.Count,
  567. ScreenApplyList = screenApplyDataList,
  568. SendBackAuditNum = sendBackAuditDataList.Count,
  569. SendBackAuditList = sendBackAuditDataList,
  570. NearlyExpiredNum = nearlyExpiredDataList.Count,
  571. NearlyExpiredList = nearlyExpiredDataList,
  572. };
  573. }
  574. }
  575. }
  576. }