BiOrderController.cs 152 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031
  1. using Hotline.Application.Orders;
  2. using Hotline.Application.StatisticalReport;
  3. using Hotline.Caching.Interfaces;
  4. using Hotline.CallCenter.Calls;
  5. using Hotline.FlowEngine.Workflows;
  6. using Hotline.Orders;
  7. using Hotline.Repository.SqlSugar.Extensions;
  8. using Hotline.Schedulings;
  9. using Hotline.Settings;
  10. using Hotline.Settings.Hotspots;
  11. using Hotline.Settings.TimeLimits;
  12. using Hotline.Share.Dtos;
  13. using Hotline.Share.Dtos.Ai;
  14. using Hotline.Share.Dtos.Bi;
  15. using Hotline.Share.Dtos.Bigscreen;
  16. using Hotline.Share.Dtos.CallCenter;
  17. using Hotline.Share.Dtos.Order;
  18. using Hotline.Share.Enums.CallCenter;
  19. using Hotline.Share.Enums.FlowEngine;
  20. using Hotline.Share.Enums.Order;
  21. using Hotline.Share.Requests;
  22. using Hotline.Tools;
  23. using MapsterMapper;
  24. using Microsoft.AspNetCore.Mvc;
  25. using MiniExcelLibs;
  26. using SqlSugar;
  27. using System.Data;
  28. using XF.Domain.Authentications;
  29. using XF.Domain.Exceptions;
  30. using XF.Domain.Repository;
  31. using XF.Utility.EnumExtensions;
  32. namespace Hotline.Api.Controllers.Bi
  33. {
  34. public class BiOrderController : BaseController
  35. {
  36. private readonly IOrderRepository _orderRepository;
  37. private readonly IRepository<Hotspot> _hotspotTypeRepository;
  38. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  39. private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
  40. private readonly IRepository<OrderDelay> _orderDelayRepository;
  41. private readonly IMapper _mapper;
  42. private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
  43. private readonly IRepository<OrderSpecial> _orderSpecialRepository;
  44. private readonly IRepository<OrderVisit> _orderVisitRepository;
  45. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  46. private readonly IRepository<OrderPublish> _orderPublishRepository;
  47. private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
  48. private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
  49. private readonly ISessionContext _sessionContext;
  50. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  51. private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
  52. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  53. private readonly IRepository<OrderScreen> _orderScreenRepository;
  54. private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
  55. private readonly IOrderApplication _orderApplication;
  56. private readonly ITimeLimitDomainService _timeLimitDomainService;
  57. private readonly IOrderReportApplication _orderReportApplication;
  58. private readonly IRepository<SystemArea> _systemAreaRepository;
  59. private readonly IRepository<Hotspot> _hotspotRepository;
  60. private readonly IRepository<SystemDicData> _systemDicDataRepository;
  61. public BiOrderController(
  62. IOrderRepository orderRepository,
  63. IRepository<Hotspot> hotspotTypeRepository,
  64. ISystemDicDataCacheManager sysDicDataCacheManager,
  65. IRepository<OrderVisitDetail> orderVisitDetailRepository,
  66. IRepository<OrderDelay> orderDelayRepository,
  67. IRepository<WorkflowCountersign> workflowCountersignRepository,
  68. IRepository<OrderSpecial> orderSpecialRepository,
  69. IMapper mapper,
  70. IRepository<OrderVisit> orderVisitRepository,
  71. IRepository<TrCallRecord> trCallRecordRepository,
  72. IRepository<OrderPublish> orderPublishRepository,
  73. IRepository<SystemOrganize> systemOrganizeRepository,
  74. IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository,
  75. ISessionContext sessionContext,
  76. ISystemSettingCacheManager systemSettingCacheManager,
  77. IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
  78. IRepository<WorkflowTrace> workflowTraceRepository,
  79. IRepository<OrderScreen> orderScreenRepository,
  80. IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
  81. IOrderApplication orderApplication,
  82. ITimeLimitDomainService timeLimitDomainService,
  83. IOrderReportApplication orderReportApplication,
  84. IRepository<SystemArea> systemAreaRepository,
  85. IRepository<Hotspot> hotspotRepository,
  86. IRepository<SystemDicData> systemDicDataRepository
  87. )
  88. {
  89. _orderRepository = orderRepository;
  90. _hotspotTypeRepository = hotspotTypeRepository;
  91. _sysDicDataCacheManager = sysDicDataCacheManager;
  92. _orderVisitDetailRepository = orderVisitDetailRepository;
  93. _orderDelayRepository = orderDelayRepository;
  94. _workflowCountersignRepository = workflowCountersignRepository;
  95. _orderSpecialRepository = orderSpecialRepository;
  96. _mapper = mapper;
  97. _orderVisitRepository = orderVisitRepository;
  98. _trCallRecordRepository = trCallRecordRepository;
  99. _orderPublishRepository = orderPublishRepository;
  100. _systemOrganizeRepository = systemOrganizeRepository;
  101. _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
  102. _sessionContext = sessionContext;
  103. _systemSettingCacheManager = systemSettingCacheManager;
  104. _orderSpecialDetailRepository = orderSpecialDetailRepository;
  105. _workflowTraceRepository = workflowTraceRepository;
  106. _orderScreenRepository = orderScreenRepository;
  107. _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
  108. _orderApplication = orderApplication;
  109. _timeLimitDomainService = timeLimitDomainService;
  110. _orderReportApplication = orderReportApplication;
  111. _systemAreaRepository = systemAreaRepository;
  112. _hotspotRepository = hotspotRepository;
  113. _systemDicDataRepository = systemDicDataRepository;
  114. }
  115. /// <summary>
  116. /// 部门超期统计明细
  117. /// </summary>
  118. /// <param name="dto"></param>
  119. /// <returns></returns>
  120. [HttpGet("org_data_list_detail")]
  121. public async Task<PagedDto<OrderDto>> OrgDataListDetail([FromQuery] OrgDataListDetailRequest dto)
  122. {
  123. var quer = _orderApplication.QueryOrgDataListDetail(dto);
  124. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  125. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  126. }
  127. /// <summary>
  128. /// 部门超期统计明细导出
  129. /// </summary>
  130. /// <returns></returns>
  131. [HttpPost("org_data_list_detail/_export")]
  132. public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListDetailRequest> dto)
  133. {
  134. var query = _orderApplication.QueryOrgDataListDetail(dto.QueryDto);
  135. List<Order> data;
  136. if (dto.IsExportAll)
  137. {
  138. data = await query.ToListAsync(HttpContext.RequestAborted);
  139. }
  140. else
  141. {
  142. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  143. data = items;
  144. }
  145. var dataDtos = _mapper.Map<ICollection<OrderDto>>(data);
  146. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  147. var dtos = dataDtos
  148. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  149. .Cast<object>()
  150. .ToList();
  151. var stream = ExcelHelper.CreateStream(dtos);
  152. return ExcelStreamResult(stream, "部门超期统计明细数据");
  153. }
  154. /// <summary>
  155. /// 全量部门超期统计明细
  156. /// </summary>
  157. /// <param name="dto"></param>
  158. /// <returns></returns>
  159. [HttpGet("org_data_list_detail_all")]
  160. public async Task<PagedDto<OrderDto>> OrgDataListDetail([FromQuery] OrgDataListAllDetailRequest dto)
  161. {
  162. var quer = _orderApplication.QueryOrgDataListDetail(dto);
  163. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  164. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  165. }
  166. /// <summary>
  167. /// 部门超期统计明细导出
  168. /// </summary>
  169. /// <returns></returns>
  170. [HttpPost("org_data_list_detail_all/_export")]
  171. public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListAllDetailRequest> dto)
  172. {
  173. var query = _orderApplication.QueryOrgDataListDetail(dto.QueryDto);
  174. List<Order> data;
  175. if (dto.IsExportAll)
  176. {
  177. data = await query.ToListAsync(HttpContext.RequestAborted);
  178. }
  179. else
  180. {
  181. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  182. data = items;
  183. }
  184. var dataDtos = _mapper.Map<ICollection<OrderDto>>(data);
  185. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  186. var dtos = dataDtos
  187. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  188. .Cast<object>()
  189. .ToList();
  190. var stream = ExcelHelper.CreateStream(dtos);
  191. return ExcelStreamResult(stream, "部门超期统计明细数据");
  192. }
  193. /// <summary>
  194. /// 列表页面基础数据
  195. /// </summary>
  196. /// <returns></returns>
  197. [HttpGet("org_data_list_detail_all/base-data")]
  198. public async Task<object> BaseData()
  199. {
  200. var rsp = new
  201. {
  202. OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>()
  203. };
  204. return rsp;
  205. }
  206. /// <summary>
  207. /// 部门超期统计
  208. /// </summary>
  209. /// <param name="dto"></param>
  210. /// <returns></returns>
  211. [HttpGet("org_data_list")]
  212. public async Task<PagedDto<OrderBiOrgDataListVo>> OrgDataList([FromQuery] ReportPagedRequest dto)
  213. {
  214. var query = _orderApplication.QueryOrgDataList(dto);
  215. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  216. items.Add(new OrderBiOrgDataListVo
  217. {
  218. OrgName = "合计",
  219. HandlerExtendedNum = items.Select(s => s.HandlerExtendedNum).Sum(),
  220. CounterHandlerExtendedNum = items.Select(s => s.CounterHandlerExtendedNum).Sum(),
  221. NoHandlerExtendedNum = items.Select(s => s.NoHandlerExtendedNum).Sum(),
  222. CounterNoHandlerExtendedNum = items.Select(s => s.CounterNoHandlerExtendedNum).Sum(),
  223. });
  224. return new PagedDto<OrderBiOrgDataListVo>(total, items);
  225. }
  226. /// <summary>
  227. /// 部门超期统计导出
  228. /// </summary>
  229. /// <returns></returns>
  230. [HttpPost("org_data_list/_export")]
  231. public async Task<FileStreamResult> OrgDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
  232. {
  233. var query = _orderApplication.QueryOrgDataList(dto.QueryDto);
  234. List<OrderBiOrgDataListVo> data;
  235. data = await query.ToListAsync(HttpContext.RequestAborted);
  236. data.Add(new OrderBiOrgDataListVo
  237. {
  238. OrgName = "合计",
  239. HandlerExtendedNum = data.Select(s => s.HandlerExtendedNum).Sum(),
  240. CounterHandlerExtendedNum = data.Select(s => s.CounterHandlerExtendedNum).Sum(),
  241. NoHandlerExtendedNum = data.Select(s => s.NoHandlerExtendedNum).Sum(),
  242. CounterNoHandlerExtendedNum = data.Select(s => s.CounterNoHandlerExtendedNum).Sum(),
  243. });
  244. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  245. var dtos = data
  246. .Select(stu => _mapper.Map(stu, typeof(OrderBiOrgDataListVo), dynamicClass))
  247. .Cast<object>()
  248. .ToList();
  249. var stream = ExcelHelper.CreateStream(dtos);
  250. return ExcelStreamResult(stream, "部门超期统计数据");
  251. }
  252. /// <summary>
  253. /// 话务员办件统计
  254. /// </summary>
  255. /// <param name="dto"></param>
  256. /// <returns></returns>
  257. [HttpGet("centre_data_list")]
  258. public async Task<List<OrderBiCentreDataListVo>> CentreDataList([FromQuery] ReportPagedRequest dto)
  259. {
  260. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  261. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  262. var query = _orderRepository.Queryable(false, false, false)
  263. .WhereIF(dto.StartTime.HasValue, it => it.CreationTime >= dto.StartTime)
  264. .WhereIF(dto.EndTime.HasValue, it => it.CreationTime <= dto.EndTime)
  265. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), it => it.SignerName.Contains(dto.Keyword!))
  266. .GroupBy(it => new { it.SignerId, it.SignerName })
  267. .Select(it => new OrderBiCentreDataListVo
  268. {
  269. UserName = it.SignerName,
  270. UserId = it.SignerId,
  271. //Subtotal = SqlFunc.AggregateCount(x.AcceptorId),
  272. CentreArchive = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban && it.AcceptType != "无效", 1, 0)), //中心归档件
  273. //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && (it.FileUserRole == EFileUserType.Org || it.FileUserRole == EFileUserType.Dispatch), 1, 0)), //转办信件
  274. CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType != "无效" && (it.ProcessType == EProcessType.Jiaoban || (it.ActualHandleStepName == "派单组" && it.Status < EOrderStatus.Filed) || (it.ActualHandleStepName == "班长审批" && it.Status < EOrderStatus.Filed)), 1, 0)),
  275. NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType != "无效" && (it.Status <= EOrderStatus.SpecialToUnAccept), 1, 0)), //坐席待办 //中心领导?市领导? 是否在统计条件中
  276. //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Jiaoban, 1, 0)),
  277. //NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF((int)x.Status < 300 && x.ExpiredTime > x.FiledTime, 1, 0)),
  278. Invalid = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType == "无效", 1, 0)),
  279. Repeat = SqlFunc.AggregateSum(SqlFunc.IIF(it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0, 1, 0)),
  280. Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF((it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban && it.AcceptType != "无效") || (it.AcceptType != "无效" && (it.ProcessType == EProcessType.Jiaoban || (it.ActualHandleStepName == "派单组" && it.Status < EOrderStatus.Filed) || (it.ActualHandleStepName == "班长审批" && it.Status < EOrderStatus.Filed))) || (it.Status <= EOrderStatus.SpecialToUnAccept) || it.AcceptType == "无效" || (it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0), 1, 0))
  281. }).MergeTable();
  282. switch (dto.SortField)
  283. {
  284. case "centreArchive":
  285. query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreArchive) : query.OrderByDescending(x => x.CentreArchive);
  286. break;
  287. case "centreCareOf":
  288. query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreCareOf) : query.OrderByDescending(x => x.CentreCareOf);
  289. break;
  290. case "noCentreCareOf":
  291. query = dto.SortRule is 0 ? query.OrderBy(x => x.NoCentreCareOf) : query.OrderByDescending(x => x.NoCentreCareOf);
  292. break;
  293. case "invalid":
  294. query = dto.SortRule is 0 ? query.OrderBy(x => x.Invalid) : query.OrderByDescending(x => x.Invalid);
  295. break;
  296. case "repeat":
  297. query = dto.SortRule is 0 ? query.OrderBy(x => x.Repeat) : query.OrderByDescending(x => x.Repeat);
  298. break;
  299. case "subtotal":
  300. query = dto.SortRule is 0 ? query.OrderBy(x => x.Subtotal) : query.OrderByDescending(x => x.Subtotal);
  301. break;
  302. }
  303. if (string.IsNullOrEmpty(dto.SortField))
  304. {
  305. query = query.OrderByDescending(x => x.Subtotal);
  306. }
  307. var list = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
  308. return list;
  309. }
  310. /// <summary>
  311. /// 热点数据小计统计
  312. /// </summary>
  313. /// <param name="dto"></param>
  314. /// <returns></returns>
  315. [HttpGet("hotspot_subtotal_data_list")]
  316. public async Task<PagedDto<HotspotDataLsitVo>> HotspotSubtotalDataLsit([FromQuery] HotspotSubtotalReportPagedRequest dto)
  317. {
  318. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  319. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  320. var query = _hotspotTypeRepository.Queryable(false, true)
  321. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotFullName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotFullName)) && o.IsDeleted == false)
  322. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
  323. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
  324. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  325. .Where((x, o) => x.ParentId == dto.Id)
  326. .Where((x, o) => x.IsDeleted == false)
  327. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  328. .Select((x, o) => new HotspotDataLsitVo
  329. {
  330. Id = x.Id,
  331. Name = x.HotSpotName,
  332. Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  333. }).MergeTable();
  334. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  335. return new PagedDto<HotspotDataLsitVo>(total, items);
  336. }
  337. /// <summary>
  338. /// 热点数据统计
  339. /// </summary>
  340. /// <param name="dto"></param>
  341. /// <returns></returns>
  342. [HttpGet("hotspot_data_list")]
  343. public async Task<object> HotspotDataLsit([FromQuery] HotspotReportPagedRequest dto)
  344. {
  345. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  346. if (dto.Type == 0 && (!dto.ChainStartTime.HasValue || !dto.ChainEndTime.HasValue)) throw UserFriendlyException.SameMessage("请选择环比时间!");
  347. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  348. var IsCenter = _sessionContext.OrgIsCenter;
  349. if (dto.Type == 0)
  350. {
  351. dto.ChainEndTime = dto.ChainEndTime.Value.AddDays(1).AddSeconds(-1);
  352. }
  353. var items = await _hotspotTypeRepository.Queryable(false, true)
  354. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  355. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
  356. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
  357. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  358. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  359. .Where((x, o) => x.ParentId == dto.Id)
  360. .Where((x, o) => x.IsDeleted == false)
  361. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  362. .Select((x, o) => new HotspotDataLsitVo
  363. {
  364. Id = x.Id,
  365. Name = x.HotSpotName,
  366. Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  367. Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.HotSpotName != o.HotspotName, 1, 0)) > 0,
  368. }).MergeTable().ToListAsync();
  369. var chainStartTime = dto.StartTime;
  370. var chainEndTime = dto.EndTime;
  371. switch (dto.Type)
  372. {
  373. case 1://日
  374. chainStartTime = dto.StartTime.Value.AddDays(-1);
  375. chainEndTime = dto.EndTime.Value.AddDays(-1);
  376. break;
  377. case 2://月
  378. chainStartTime = dto.StartTime.Value.AddMonths(-1);
  379. chainEndTime = dto.EndTime.Value.AddMonths(-1);
  380. break;
  381. case 3://年
  382. chainStartTime = dto.StartTime.Value.AddYears(-1);
  383. chainEndTime = dto.EndTime.Value.AddYears(-1);
  384. break;
  385. case 0:
  386. chainStartTime = dto.ChainStartTime.Value;
  387. chainEndTime = dto.ChainEndTime.Value;
  388. break;
  389. }
  390. var chainItems = await _hotspotTypeRepository.Queryable(false, true)
  391. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  392. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= chainStartTime)
  393. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= chainEndTime)
  394. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  395. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  396. .Where((x, o) => x.ParentId == dto.Id)
  397. .Where((x, o) => x.IsDeleted == false)
  398. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  399. .Select((x, o) => new
  400. {
  401. Id = x.Id,
  402. ChainNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  403. }).MergeTable().ToListAsync();
  404. var res = (from t1 in items
  405. join t2 in chainItems on t1.Id equals t2.Id into t1_t2
  406. from item in t1_t2.DefaultIfEmpty()
  407. select new
  408. {
  409. Id = t1.Id,
  410. Name = t1.Name,
  411. Num = t1.Num,
  412. Sublevel = t1.Sublevel,
  413. Children = new List<HotspotDataLsitVo>(),
  414. ChainNum = t1_t2.Select(x => x.ChainNum).FirstOrDefault(),
  415. ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
  416. ((double.Parse(t1.Num.ToString()) - double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString())) / double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString()) * 100).ToString("F2") + "%" : "100.00%",
  417. }).ToList();
  418. var total = new
  419. {
  420. Id = "0",
  421. Name = "合计",
  422. Num = res.Sum(x => x.Num),
  423. Sublevel = false,
  424. Children = new List<HotspotDataLsitVo>(),
  425. ChainNum = res.Sum(x => x.ChainNum),
  426. ChainRate = res.Sum(x => x.ChainNum) > 0 ? ((double.Parse(res.Sum(x => x.Num).ToString()) - double.Parse(res.Sum(x => x.ChainNum).ToString())) / double.Parse(res.Sum(x => x.ChainNum).ToString()) * 100).ToString("F2") + "%" : "100.00%"
  427. };
  428. return new { List = res, Total = total };
  429. }
  430. /// <summary>
  431. /// 部门不满意统计
  432. /// 已加验证部门
  433. /// </summary>
  434. /// <param name="dto"></param>
  435. /// <returns></returns>
  436. [HttpGet("visit-nosatisfied")]
  437. public async Task<object> QueryVisitNoSatisfied([FromQuery] QueryVisitNoSatiisfiedRequest dto)
  438. {
  439. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  440. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  441. var IsCenter = _sessionContext.OrgIsCenter;
  442. var dissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason);
  443. List<dynamic>? list = new List<dynamic>();
  444. //DataTable dt = new DataTable();
  445. foreach (var item in dissatisfiedReason)
  446. {
  447. var table = _orderVisitDetailRepository.Queryable()
  448. .Includes(x => x.OrderVisit)
  449. .Where(x => x.VisitTarget == Share.Enums.Order.EVisitTarget.Org)
  450. .Where(x => x.OrgNoSatisfiedReason != null)
  451. .Where(x => x.OrderVisit.VisitState == EVisitState.Visited)
  452. .Where(x => !string.IsNullOrEmpty(x.VisitOrgName))
  453. .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.VisitOrgName.Contains(dto.OrgName))
  454. .WhereIF(dto.StartTime.HasValue, x => x.OrderVisit.VisitTime >= dto.StartTime.Value)
  455. .WhereIF(dto.EndTime.HasValue, x => x.OrderVisit.VisitTime <= dto.EndTime.Value)
  456. .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  457. .GroupBy(x => new { x.VisitOrgName, x.VisitOrgCode })
  458. .Select(x => new BiVisitNoSatisfiedDto
  459. {
  460. Count = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(x.OrgNoSatisfiedReason, "Key", item.DicDataValue), 1, 0)),
  461. Key = item.DicDataValue,
  462. OrgName = x.VisitOrgName,
  463. OrgCode = x.VisitOrgCode
  464. })
  465. .OrderByDescending(x => x.Count)
  466. //.ToPivotTable(x => x.Key, x => x.OrgName, x => x.Sum(x => x.Count));
  467. .ToPivotList(x => x.Key, x => new { x.OrgCode, x.OrgName }, x => x.Sum(x => x.Count));
  468. list.AddRange(table);
  469. }
  470. return new { DicReason = dissatisfiedReason, Data = list };
  471. }
  472. /// <summary>
  473. /// 部门不满意统计明细
  474. /// </summary>
  475. /// <param name="dto"></param>
  476. /// <returns></returns>
  477. [HttpGet("visit-nosatisfied-detail")]
  478. public async Task<PagedDto<OrderVisitDetailDto>> BiQueryVisitNoSatisfiedDetail([FromQuery] BiQueryVisitNoSatisfiedDetailDto dto)
  479. {
  480. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  481. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  482. var IsCenter = _sessionContext.OrgIsCenter;
  483. var (total, items) = await _orderVisitDetailRepository.Queryable()
  484. .Includes(x => x.OrderVisit, d => d.Order)
  485. .Includes(x => x.OrderVisit, d => d.Employee)
  486. .Where(x => x.VisitOrgCode == dto.OrgCode)
  487. .Where(x => x.OrderVisit.VisitState == EVisitState.Visited)
  488. .Where(x => x.OrderVisit.VisitTime >= dto.StartTime.Value)
  489. .Where(x => x.OrderVisit.VisitTime <= dto.EndTime.Value)
  490. .Where(x => SqlFunc.JsonListObjectAny(x.OrgNoSatisfiedReason, "Key", dto.DissatisfiedKey))
  491. .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  492. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderVisit.Order.No.Contains(dto.Keyword) || x.OrderVisit.Order.Title.Contains(dto.Keyword))
  493. .OrderBy(x => x.OrderVisit.VisitTime)
  494. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  495. return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
  496. }
  497. /// <summary>
  498. /// 部门延期统计
  499. /// </summary>
  500. /// <param name="dto"></param>
  501. /// <returns></returns>
  502. [HttpGet("order-delay-data-list")]
  503. public async Task<IReadOnlyList<BiOrderDelayDataDto>> QueryOrderDelayDataList([FromQuery] QueryOrderDelayDataListRequest dto)
  504. {
  505. return await _orderReportApplication.QueryOrderDelayDataList(dto).ToListAsync();
  506. }
  507. /// <summary>
  508. /// 部门延期统计---导出
  509. /// </summary>
  510. /// <param name="dto"></param>
  511. /// <returns></returns>
  512. [HttpPost("order-delay-data-list-export")]
  513. public async Task<FileStreamResult> ExportQueryOrderDelayDataList([FromBody] ExportExcelDto<QueryOrderDelayDataListRequest> dto)
  514. {
  515. var query = _orderReportApplication.QueryOrderDelayDataList(dto.QueryDto);
  516. List<BiOrderDelayDataDto> list;
  517. if (dto.IsExportAll)
  518. {
  519. list = await query.ToListAsync(HttpContext.RequestAborted);
  520. }
  521. else
  522. {
  523. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  524. list = items;
  525. }
  526. list.Add(new BiOrderDelayDataDto()
  527. {
  528. OrgName = "合计",
  529. OrgCode = "",
  530. AllTotal = list.Sum(p => p.AllTotal),
  531. PassTotal = list.Sum(p => p.PassTotal),
  532. NoPassTotal = list.Sum(p => p.NoPassTotal),
  533. ExaminingTotal = list.Sum(p => p.ExaminingTotal)
  534. });
  535. var orderDtos = _mapper.Map<ICollection<BiOrderDelayDataDto>>(list);
  536. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  537. var dtos = orderDtos
  538. .Select(stu => _mapper.Map(stu, typeof(BiOrderDelayDataDto), dynamicClass))
  539. .Cast<object>()
  540. .ToList();
  541. var stream = ExcelHelper.CreateStream(dtos);
  542. return ExcelStreamResult(stream, "部门延期统计数据");
  543. }
  544. /// <summary>
  545. /// 部门延期统计明细
  546. /// </summary>
  547. /// <param name="dto"></param>
  548. /// <returns></returns>
  549. [HttpGet("order-delay-data-detail")]
  550. public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetail([FromQuery] QueryOrderDelayDataDetailRequest dto)
  551. {
  552. var (total, items) = await _orderReportApplication.QueryOrderDelayDataDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  553. return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
  554. }
  555. /// <summary>
  556. /// 部门延期统计明细--导出
  557. /// </summary>
  558. /// <param name="dto"></param>
  559. /// <returns></returns>
  560. [HttpPost("order-delay-data-detail-export")]
  561. public async Task<FileStreamResult> ExportQueryOrderDelayDataDetail([FromBody] ExportExcelDto<QueryOrderDelayDataDetailRequest> dto)
  562. {
  563. var query = _orderReportApplication.QueryOrderDelayDataDetail(dto.QueryDto);
  564. List<OrderDelay> list;
  565. if (dto.IsExportAll)
  566. {
  567. list = await query.ToListAsync(HttpContext.RequestAborted);
  568. }
  569. else
  570. {
  571. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  572. list = items;
  573. }
  574. var orderDtos = _mapper.Map<ICollection<OrderDelayDto>>(list);
  575. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  576. var dtos = orderDtos
  577. .Select(stu => _mapper.Map(stu, typeof(OrderDelayDto), dynamicClass))
  578. .Cast<object>()
  579. .ToList();
  580. var stream = ExcelHelper.CreateStream(dtos);
  581. return ExcelStreamResult(stream, "部门延期统计明细数据");
  582. }
  583. /// <summary>
  584. /// 特提统计
  585. /// </summary>
  586. /// <param name="dto"></param>
  587. /// <returns></returns>
  588. [HttpGet("special_data_list")]
  589. public async Task<PagedDto<OrderBiSpecialListVo>> SpecialDataList([FromQuery] ReportPagedRequest dto)
  590. {
  591. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  592. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  593. var IsCenter = _sessionContext.OrgIsCenter;
  594. var query = _orderSpecialRepository.Queryable()
  595. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  596. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  597. .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.RequiredOrgId))
  598. .GroupBy(x => new { x.Cause })
  599. .Select(x => new OrderBiSpecialListVo
  600. {
  601. Cause = x.Cause,
  602. OrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  603. MaxSpecialTime = SqlFunc.AggregateMax(x.CreationTime),
  604. })
  605. .MergeTable();
  606. switch (dto.SortField)
  607. {
  608. case "cause":
  609. query = dto.SortRule is 0 ? query.OrderBy(x => x.Cause) : query.OrderByDescending(x => x.Cause);
  610. break;
  611. case "orderNum":
  612. query = dto.SortRule is 0 ? query.OrderBy(x => x.OrderNum) : query.OrderByDescending(x => x.OrderNum);
  613. break;
  614. case "maxSpecialTime":
  615. query = dto.SortRule is 0 ? query.OrderBy(x => x.MaxSpecialTime) : query.OrderByDescending(x => x.MaxSpecialTime);
  616. break;
  617. }
  618. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  619. return new PagedDto<OrderBiSpecialListVo>(total, items);
  620. }
  621. /// <summary>
  622. /// 获取工单特提信息列表
  623. /// </summary>
  624. /// <param name="dto"></param>
  625. /// <returns></returns>
  626. [HttpGet("special_data_list/list")]
  627. public async Task<PagedDto<OrderSpecialDto>> List([FromQuery] OrderSpecialListDto dto)
  628. {
  629. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  630. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  631. var IsCenter = _sessionContext.OrgIsCenter;
  632. var (total, items) = await _orderSpecialRepository.Queryable()
  633. .Includes(x => x.Order)
  634. .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
  635. x => x.Order.No.Contains(dto.Keyword!) || x.Order.Title.Contains(dto.Keyword!))
  636. .WhereIF(!string.IsNullOrEmpty(dto.Cause),
  637. x => x.Cause != null && x.Cause.Equals(dto.Cause))
  638. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  639. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  640. .WhereIF(dto.State.HasValue, x => x.State == dto.State)
  641. .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.OrgId))
  642. .OrderByDescending(x => x.CreationTime)
  643. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  644. return new PagedDto<OrderSpecialDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDto>>(items));
  645. }
  646. /// <summary>
  647. /// 受理类型前十
  648. /// </summary>
  649. /// <param name="dto"></param>
  650. /// <returns></returns>
  651. [HttpGet("accept_type_top10_list")]
  652. public async Task<PagedDto<AcceptTypeTop10Vo>> AcceptTypeTop10List([FromQuery] ReportPagedRequest dto)
  653. {
  654. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  655. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  656. dto.PageIndex = 1;
  657. dto.PageSize = 10;
  658. var IsCenter = _sessionContext.OrgIsCenter;
  659. var query = _orderRepository.Queryable(false, false, false)
  660. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  661. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  662. .WhereIF(IsCenter == false, x => x.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  663. .Select(x => new
  664. {
  665. AcceptType = x.AcceptType,
  666. OneHotspot = SqlFunc.Substring(x.HotspotSpliceName, 0, SqlFunc.CharIndex("-", x.HotspotSpliceName + "-")),
  667. Id = x.Id
  668. }).MergeTable()
  669. .GroupBy(x => new { x.OneHotspot })
  670. .Select(x => new AcceptTypeTop10Vo
  671. {
  672. Name = x.OneHotspot,
  673. ValidAccept = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  674. Consult = SqlFunc.AggregateSum(SqlFunc.IIF("咨询".Equals(x.AcceptType), 1, 0)),
  675. Report = SqlFunc.AggregateSum(SqlFunc.IIF("举报".Equals(x.AcceptType), 1, 0)),
  676. Complaint = SqlFunc.AggregateSum(SqlFunc.IIF("投诉".Equals(x.AcceptType), 1, 0)),
  677. SeekHelp = SqlFunc.AggregateSum(SqlFunc.IIF("求助".Equals(x.AcceptType), 1, 0)),
  678. Suggest = SqlFunc.AggregateSum(SqlFunc.IIF("建议".Equals(x.AcceptType), 1, 0)),
  679. Opinion = SqlFunc.AggregateSum(SqlFunc.IIF("意见".Equals(x.AcceptType), 1, 0)),
  680. Rests = SqlFunc.AggregateSum(SqlFunc.IIF("其他".Equals(x.AcceptType), 1, 0)),
  681. BenefitThePeople = SqlFunc.AggregateSum(SqlFunc.IIF("惠民帮助".Equals(x.AcceptType), 1, 0)),
  682. Praise = SqlFunc.AggregateSum(SqlFunc.IIF("表扬".Equals(x.AcceptType), 1, 0)),
  683. }).MergeTable();
  684. switch (dto.SortField)
  685. {
  686. case "validAccept":
  687. query = dto.SortRule is 0 ? query.OrderBy(x => x.ValidAccept) : query.OrderByDescending(x => x.ValidAccept);
  688. break;
  689. case "consult":
  690. query = dto.SortRule is 0 ? query.OrderBy(x => x.Consult) : query.OrderByDescending(x => x.Consult);
  691. break;
  692. case "report":
  693. query = dto.SortRule is 0 ? query.OrderBy(x => x.Report) : query.OrderByDescending(x => x.Report);
  694. break;
  695. case "complaint":
  696. query = dto.SortRule is 0 ? query.OrderBy(x => x.Complaint) : query.OrderByDescending(x => x.Complaint);
  697. break;
  698. case "seekHelp":
  699. query = dto.SortRule is 0 ? query.OrderBy(x => x.SeekHelp) : query.OrderByDescending(x => x.SeekHelp);
  700. break;
  701. case "suggest":
  702. query = dto.SortRule is 0 ? query.OrderBy(x => x.Suggest) : query.OrderByDescending(x => x.Suggest);
  703. break;
  704. case "opinion":
  705. query = dto.SortRule is 0 ? query.OrderBy(x => x.Opinion) : query.OrderByDescending(x => x.Opinion);
  706. break;
  707. case "rests":
  708. query = dto.SortRule is 0 ? query.OrderBy(x => x.Rests) : query.OrderByDescending(x => x.Rests);
  709. break;
  710. case "benefitThePeople":
  711. query = dto.SortRule is 0 ? query.OrderBy(x => x.BenefitThePeople) : query.OrderByDescending(x => x.BenefitThePeople);
  712. break;
  713. case "praise":
  714. query = dto.SortRule is 0 ? query.OrderBy(x => x.Praise) : query.OrderByDescending(x => x.Praise);
  715. break;
  716. default:
  717. query = query.OrderByDescending(x => x.ValidAccept);
  718. break;
  719. }
  720. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  721. return new PagedDto<AcceptTypeTop10Vo>(total, items);
  722. }
  723. /// <summary>
  724. /// 热点类型部门统计
  725. /// </summary>
  726. /// <param name="dto"></param>
  727. /// <returns></returns>
  728. [HttpGet("hotport-org-statistics")]
  729. public async Task<object> HotPortJoinOrgStatistics([FromQuery] HotPortJoinOrgStatisticsRequest dto)
  730. {
  731. dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
  732. var IsCenter = _sessionContext.OrgIsCenter;
  733. return await _orderRepository.HotPortJoinOrgStatistics(dto.StartTime, dto.EndTime, IsCenter, _sessionContext.OrgId);
  734. }
  735. /// <summary>
  736. /// 回访量统计
  737. /// </summary>
  738. /// <param name="StartTime"></param>
  739. /// <param name="EndTime"></param>
  740. /// <param name="VisitName"></param>
  741. /// <returns></returns>
  742. [HttpGet("visit-measure-statistics")]
  743. public async Task<VisitMeasureStatisticsDto> VisitMeasureStatistics(DateTime StartTime, DateTime EndTime, string? VisitName)
  744. {
  745. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  746. var list = await _orderVisitRepository.Queryable()
  747. .Includes(x => x.Employee)
  748. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState == EVisitState.Visited)
  749. .WhereIF(!string.IsNullOrEmpty(VisitName), x => x.Employee.Name.Contains(VisitName))
  750. .GroupBy(x => new { x.EmployeeId, x.Employee.Name })
  751. .Select(x => new VisitMeasureStatisticsModelDto()
  752. {
  753. VisitName = x.Employee.Name,
  754. CallVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType == EVisitType.CallVisit, 1, 0)),
  755. ArtificialVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType != EVisitType.CallVisit, 1, 0)),
  756. SumCount = SqlFunc.AggregateCount(x.EmployeeId)
  757. })
  758. .ToListAsync();
  759. var returnModel = new VisitMeasureStatisticsDto();
  760. returnModel.VisitMeasureStatisticsModelList = list;
  761. //查询AIVisit
  762. returnModel.AiVisitCount = await _aiOrderVisitDetailRepository.Queryable()
  763. .Where(x => x.AiVisitTime >= StartTime && x.AiVisitTime <= EndTime && x.IsSuccess != null).CountAsync();
  764. returnModel.AiVisitSatisfiedCount = await _aiOrderVisitDetailRepository.Queryable()
  765. .Includes(x => x.OrderVisit)
  766. .Where(x => x.AiVisitTime >= StartTime && x.AiVisitTime <= EndTime && x.IsSuccess == true && SqlFunc.JsonField(x.OrderVisit.NowEvaluate, "Key") != "1" && SqlFunc.JsonField(x.OrderVisit.NowEvaluate, "Key") != "2").CountAsync();
  767. returnModel.AiVisitNoSatisfiedCount = await _aiOrderVisitDetailRepository.Queryable()
  768. .Includes(x => x.OrderVisit)
  769. .Where(x => x.AiVisitTime >= StartTime && x.AiVisitTime <= EndTime && x.IsSuccess == true && SqlFunc.JsonField(x.OrderVisit.NowEvaluate, "Key") == "1" && SqlFunc.JsonField(x.OrderVisit.NowEvaluate, "Key") == "2").CountAsync();
  770. returnModel.AIVisitFailCount = await _aiOrderVisitDetailRepository.Queryable()
  771. .Where(x => x.AiVisitTime >= StartTime && x.AiVisitTime <= EndTime && x.IsSuccess == false).CountAsync();
  772. return returnModel;
  773. }
  774. /// <summary>
  775. /// 热点类型小类统计
  776. /// </summary>
  777. /// <param name="StartTime"></param>
  778. /// <param name="EndTime"></param>
  779. /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
  780. /// <returns></returns>
  781. [HttpGet("hotspot-statistics")]
  782. public async Task<object> HotspotStatistics(DateTime StartTime, DateTime EndTime, int TypeId, string? HotspotCode)
  783. {
  784. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  785. var IsCenter = _sessionContext.OrgIsCenter;
  786. if (string.IsNullOrEmpty(HotspotCode))
  787. {
  788. var list = await _hotspotTypeRepository.Queryable()
  789. .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
  790. .Where((it, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.Id != null)
  791. .WhereIF(TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
  792. .WhereIF(TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
  793. .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  794. .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")) })
  795. .Select((it, o) => new
  796. {
  797. HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
  798. SumCount = SqlFunc.AggregateCount(it.HotSpotName)
  799. })
  800. .MergeTable()
  801. .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
  802. .Select((x, q) => new
  803. {
  804. HotspotCode = x.HotspotCode,
  805. SumCount = x.SumCount,
  806. HotspotName = q.HotSpotName,
  807. HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.HotspotCode).Any()
  808. })
  809. .ToListAsync();
  810. return list;
  811. }
  812. else
  813. {
  814. string count = (HotspotCode.Length + 2).ToString();
  815. string countx = HotspotCode.Length.ToString();
  816. var list = await _hotspotTypeRepository.Queryable()
  817. .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
  818. .Where((it, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && it.ParentId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(countx)) == HotspotCode)
  819. .WhereIF(TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
  820. .WhereIF(TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
  821. .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  822. .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
  823. .Select((it, o) => new
  824. {
  825. HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  826. SumCount = SqlFunc.AggregateCount(it.HotSpotName)
  827. })
  828. .MergeTable()
  829. .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
  830. .Select((x, q) => new
  831. {
  832. HotspotCode = x.HotspotCode,
  833. SumCount = x.SumCount,
  834. HotspotName = q.HotSpotName,
  835. HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.HotspotCode).Any()
  836. })
  837. .ToListAsync();
  838. return list;
  839. }
  840. }
  841. /// <summary>
  842. /// 部门满意度统计
  843. /// </summary>
  844. /// <param name="dto"></param>
  845. /// <returns></returns>
  846. [HttpGet("visit-org-satisfaction-statistics")]
  847. public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgSatisfactionStatistics([FromQuery] PagedKeywordSonRequest dto)
  848. {
  849. var data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto);
  850. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  851. {
  852. OrgName = "区县合计",
  853. TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  854. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  855. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  856. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  857. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  858. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  859. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  860. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  861. };
  862. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  863. {
  864. OrgName = "市直合计",
  865. TotalSumCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  866. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  867. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  868. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  869. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  870. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  871. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  872. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  873. };
  874. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  875. {
  876. OrgName = "总计",
  877. TotalSumCount = data.Sum(x => x.TotalSumCount),
  878. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  879. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  880. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  881. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  882. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  883. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  884. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  885. };
  886. return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = data, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
  887. }
  888. /// <summary>
  889. /// 部门满意度统计导出
  890. /// </summary>
  891. /// <param name="dto"></param>
  892. /// <returns></returns>
  893. [HttpPost("visit-org-satisfaction-statistics/_export")]
  894. public async Task<FileStreamResult> VisitAndOrgSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
  895. {
  896. List<VisitAndOrgSatisfactionStatisticsDto> data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto.QueryDto);
  897. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  898. {
  899. OrgName = "区县合计",
  900. TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  901. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  902. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  903. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  904. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  905. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  906. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  907. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  908. };
  909. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  910. {
  911. OrgName = "市直合计",
  912. TotalSumCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  913. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  914. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  915. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  916. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  917. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  918. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  919. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  920. };
  921. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  922. {
  923. OrgName = "总计",
  924. TotalSumCount = data.Sum(x => x.TotalSumCount),
  925. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  926. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  927. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  928. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  929. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  930. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  931. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  932. };
  933. data.Add(countySumModel);
  934. data.Add(citySumModel);
  935. data.Add(sumModel);
  936. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  937. var dtos = data
  938. .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
  939. .Cast<object>()
  940. .ToList();
  941. var stream = ExcelHelper.CreateStream(dtos);
  942. return ExcelStreamResult(stream, "部门满意度统计数据");
  943. }
  944. /// <summary>
  945. /// 子部门满意度明细
  946. /// </summary>
  947. /// <param name="dto"></param>
  948. /// <returns></returns>
  949. [HttpGet("visit-org-statisfaction-org-detail")]
  950. public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgStatisfactionOrgDetail([FromQuery] PagedKeywordSonRequest dto)
  951. {
  952. var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto);
  953. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  954. {
  955. OrgName = "区县合计",
  956. TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  957. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  958. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  959. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  960. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  961. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  962. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  963. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  964. };
  965. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  966. {
  967. OrgName = "市直合计",
  968. TotalSumCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  969. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  970. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  971. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  972. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  973. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  974. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  975. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  976. };
  977. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  978. {
  979. OrgName = "总计",
  980. TotalSumCount = list.Sum(x => x.TotalSumCount),
  981. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  982. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  983. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  984. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  985. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  986. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  987. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  988. };
  989. return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = list, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
  990. }
  991. /// <summary>
  992. /// 部门满意度统计导出
  993. /// </summary>
  994. /// <param name="dto"></param>
  995. /// <returns></returns>
  996. [HttpPost("visit-org-statisfaction-org-detail/_export")]
  997. public async Task<FileStreamResult> VisitAndOrgStatisfactionOrgDetailExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
  998. {
  999. var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto.QueryDto);
  1000. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1001. {
  1002. OrgName = "区县合计",
  1003. TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1004. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1005. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1006. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1007. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1008. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1009. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1010. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1011. };
  1012. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1013. {
  1014. OrgName = "市直合计",
  1015. TotalSumCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  1016. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  1017. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  1018. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  1019. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  1020. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  1021. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  1022. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  1023. };
  1024. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1025. {
  1026. OrgName = "总计",
  1027. TotalSumCount = list.Sum(x => x.TotalSumCount),
  1028. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  1029. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  1030. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  1031. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  1032. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  1033. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  1034. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  1035. };
  1036. list.Add(countySumModel);
  1037. list.Add(citySumModel);
  1038. list.Add(sumModel);
  1039. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1040. var dtos = list
  1041. .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
  1042. .Cast<object>()
  1043. .ToList();
  1044. var stream = ExcelHelper.CreateStream(dtos);
  1045. return ExcelStreamResult(stream, "部门满意度统计数据");
  1046. }
  1047. /// <summary>
  1048. /// 部门满意度明细
  1049. /// </summary>
  1050. /// <param name="dto"></param>
  1051. /// <returns></returns>
  1052. [HttpGet("visit-org-satisfaction-detail")]
  1053. public async Task<PagedDto<OrderVisitDetailDto>> VisitAndOrgSatisfactionDetail([FromQuery] VisitAndOrgSatisfactionDetailDto dto)
  1054. {
  1055. var (total, items) = await _orderApplication.VisitAndOrgSatisfactionDetail(dto)
  1056. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1057. return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
  1058. }
  1059. /// <summary>
  1060. /// 部门满意度明细导出
  1061. /// </summary>
  1062. /// <param name="dto"></param>
  1063. /// <returns></returns>
  1064. [HttpPost("visit-org-satisfaction-detail/_export")]
  1065. public async Task<FileStreamResult> VisitAndOrgSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndOrgSatisfactionDetailDto> dto)
  1066. {
  1067. var query = _orderApplication.VisitAndOrgSatisfactionDetail(dto.QueryDto);
  1068. List<OrderVisitDetail> data;
  1069. if (dto.IsExportAll)
  1070. {
  1071. data = await query.ToListAsync(HttpContext.RequestAborted);
  1072. }
  1073. else
  1074. {
  1075. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1076. data = items;
  1077. }
  1078. var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
  1079. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1080. var dtos = dataDtos
  1081. .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
  1082. .Cast<object>()
  1083. .ToList();
  1084. var stream = ExcelHelper.CreateStream(dtos);
  1085. return ExcelStreamResult(stream, "部门满意度明细数据");
  1086. }
  1087. /// <summary>
  1088. /// 中心报表统计
  1089. /// </summary>
  1090. /// <param name="StartTime"></param>
  1091. /// <param name="EndTime"></param>
  1092. /// <returns></returns>
  1093. [HttpGet("center_report_forms_statistics")]
  1094. public async Task<CenterReportStatisticsDto> CenterReportFormsStatistics(DateTime StartTime, DateTime EndTime)
  1095. {
  1096. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  1097. CenterReportStatisticsDto centerReportStatisticsDto = new();
  1098. //信件总量
  1099. int sourceChannelCount = await _orderRepository.Queryable().Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime).CountAsync();
  1100. #region 通话记录
  1101. //通话记录
  1102. var callData = await _trCallRecordRepository.Queryable()
  1103. .Where(p => p.CreatedTime >= StartTime && p.CreatedTime <= EndTime && p.Gateway != "82826886" && SqlFunc.Length(p.Gateway) != 4)
  1104. .Select(o => new CenterReportCallDto
  1105. {
  1106. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.On, 1, 0)),//有效
  1107. InvalidCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.NoOn /*&& o.BeginIvrTime.HasValue && o.BeginQueueTime.HasValue && o.BeginRingTime.HasValue*/, 1, 0)), //无效(排除队列挂断和IVR挂断)
  1108. QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.QueueTims > 0 && o.RingTimes == 0 && o.OnState == EOnState.NoOn, 1, 0)), //队列挂断
  1109. IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.BeginIvrTime.HasValue && !o.BeginQueueTime.HasValue && !o.BeginRingTime.HasValue && o.OnState == EOnState.NoOn, 1, 0)), //IVR挂断
  1110. })
  1111. .FirstAsync();
  1112. if (callData != null)
  1113. callData.InvalidCount = callData.InvalidCount - callData.QueueByeCount - callData.IvrByeCount;
  1114. centerReportStatisticsDto.CenterReportCall = callData;
  1115. #endregion
  1116. #region 工单
  1117. //工单
  1118. var orderData = await _orderRepository.Queryable()
  1119. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1120. .Select(x => new CenterReportOrderDto
  1121. {
  1122. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  1123. InvalidCount = 0,
  1124. CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF((int)x.Status >= 300, 1, 0)),
  1125. InProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF((int)x.Status < 300, 1, 0))
  1126. })
  1127. .ToListAsync();
  1128. if (orderData != null && orderData.Count > 0)
  1129. centerReportStatisticsDto.CenterReportOrder = orderData[0];
  1130. #endregion
  1131. #region 信件来源
  1132. //信件来源
  1133. var sourceChannelData = await _orderRepository.Queryable()
  1134. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1135. .Select(it => new
  1136. {
  1137. SourceChannelCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.SourceChannelCode), "QT", it.SourceChannelCode)
  1138. })
  1139. .MergeTable()//将查询出来的结果合并成一个新表
  1140. .GroupBy(it => new { it.SourceChannelCode })//对新表进行分组
  1141. .Select(it => new CenterReportOrderSourceChannelDto
  1142. {
  1143. Code = it.SourceChannelCode,
  1144. CountNum = SqlFunc.AggregateCount(it.SourceChannelCode)
  1145. })
  1146. .ToListAsync();
  1147. List<CenterReportOrderSourceChannelDto> sourceChannel = new()
  1148. {
  1149. new CenterReportOrderSourceChannelDto
  1150. {
  1151. Name = "来源总量",
  1152. Code = "All",
  1153. CountNum = sourceChannelCount
  1154. }
  1155. };
  1156. var sourceChannelDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SourceChannel);
  1157. foreach (var item in sourceChannelDic)
  1158. {
  1159. sourceChannel.Add(new CenterReportOrderSourceChannelDto
  1160. {
  1161. Name = item.DicDataName,
  1162. Code = item.DicTypeCode,
  1163. CountNum = sourceChannelData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
  1164. });
  1165. }
  1166. centerReportStatisticsDto.CenterReportOrderSourceChannels = sourceChannel;
  1167. #endregion
  1168. #region 信件分类
  1169. //信件来源
  1170. var acceptTypeData = await _orderRepository.Queryable(false, false, false)
  1171. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1172. .Select(it => new
  1173. {
  1174. AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode)
  1175. })
  1176. .MergeTable()//将查询出来的结果合并成一个新表
  1177. .GroupBy(it => new { it.AcceptTypeCode })//对新表进行分组
  1178. .Select(it => new CenterReportOrderSourceChannelDto
  1179. {
  1180. Code = it.AcceptTypeCode,
  1181. CountNum = SqlFunc.AggregateCount(it.AcceptTypeCode)
  1182. })
  1183. .ToListAsync();
  1184. List<CenterReportOrderSourceChannelDto> acceptType = new();
  1185. var acceptTypeDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType);
  1186. foreach (var item in acceptTypeDic)
  1187. {
  1188. acceptType.Add(new CenterReportOrderSourceChannelDto
  1189. {
  1190. AllCountNum = sourceChannelCount,
  1191. Name = item.DicDataName,
  1192. Code = item.DicTypeCode,
  1193. CountNum = acceptTypeData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
  1194. });
  1195. }
  1196. centerReportStatisticsDto.CenterReportOrderAcceptTypes = acceptType;
  1197. #endregion
  1198. #region 信件回访量
  1199. //信件回访量
  1200. CenterReportVisitdDto centerReportVisitd = new()
  1201. {
  1202. Visitd = await _orderVisitRepository.Queryable()
  1203. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState == EVisitState.Visited).CountAsync(),
  1204. WaitVisitd = await _orderVisitRepository.Queryable()
  1205. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited).CountAsync()
  1206. };
  1207. //部门
  1208. var listOrg = await _orderVisitDetailRepository.Queryable()
  1209. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  1210. .Where((it, o) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  1211. .Select((it, o) => new Satisfaction
  1212. {
  1213. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
  1214. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 0, 1)),
  1215. })
  1216. .ToListAsync();
  1217. if (listOrg != null && listOrg.Count > 0)
  1218. {
  1219. var SatisfiedCount = listOrg[0].Satisfied + listOrg[0].Satisfied;
  1220. if (SatisfiedCount > 0 && listOrg[0].Satisfied > 0)
  1221. centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)SatisfiedCount) * 100, 2);
  1222. }
  1223. //if (centerReportVisitd.Visitd > 0 && listOrg != null && listOrg.Count > 0 && listOrg[0].Satisfied > 0)
  1224. //centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
  1225. //坐席
  1226. var listSet = await _orderVisitDetailRepository.Queryable()
  1227. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  1228. .Where((it, o) => it.VisitTarget == EVisitTarget.Seat && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  1229. .Select((it, o) => new Satisfaction
  1230. {
  1231. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
  1232. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
  1233. }).ToListAsync();
  1234. if (listSet != null && listSet.Count > 0)
  1235. {
  1236. var SatisfiedCount = listSet[0].Satisfied + listSet[0].Satisfied;
  1237. if (SatisfiedCount > 0 && listSet[0].Satisfied > 0)
  1238. centerReportVisitd.OrgRate = Math.Round((listSet[0].Satisfied / (double)SatisfiedCount) * 100, 2);
  1239. }
  1240. //if (centerReportVisitd.Visitd > 0 && listSet != null && listSet.Count > 0 && listSet[0].Satisfied > 0)
  1241. // centerReportVisitd.SeatsRate = Math.Round((listSet[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
  1242. centerReportStatisticsDto.CenterReportVisitd = centerReportVisitd;
  1243. #endregion
  1244. #region 信件分布情况
  1245. //市直部门
  1246. var listOrgStatisticsCityAll = await _orderRepository.Queryable()
  1247. .LeftJoin<SystemOrganize>((it, o) => it.OrgLevelOneCode == o.Id)
  1248. .Where((it, o) => (o.OrgType == EOrgType.City || o.OrgType == EOrgType.Province) && it.CreationTime >= StartTime && it.CreationTime <= EndTime)
  1249. .GroupBy((it, o) => new
  1250. {
  1251. it.OrgLevelOneCode,
  1252. o.Name
  1253. })
  1254. .Select((it, o) => new OrgStatistics
  1255. {
  1256. CountNum = SqlFunc.AggregateCount(it.OrgLevelOneCode),
  1257. OrgName = it.OrgLevelOneCode == "001" ? "市民热线服务中心" : o.Name
  1258. }).ToListAsync();
  1259. centerReportStatisticsDto.OrgStatisticsCityAll = new OrgStatisticsAll
  1260. {
  1261. OrgStatistics = listOrgStatisticsCityAll
  1262. };
  1263. //区县部门
  1264. var listOrgStatisticsAreaAll = await _orderRepository.Queryable()
  1265. .LeftJoin<SystemOrganize>((it, o) => it.OrgLevelOneCode == o.Id)
  1266. .Where((it, o) => o.OrgType == EOrgType.County && it.CreationTime >= StartTime && it.CreationTime <= EndTime)
  1267. .GroupBy((it, o) => new
  1268. {
  1269. it.OrgLevelOneCode,
  1270. o.Name
  1271. })
  1272. .Select((it, o) => new OrgStatistics
  1273. {
  1274. CountNum = SqlFunc.AggregateCount(it.OrgLevelOneCode),
  1275. OrgName = it.OrgLevelOneCode == "001" ? "市民热线服务中心" : o.Name
  1276. }).ToListAsync();
  1277. centerReportStatisticsDto.OrgStatisticsAreaAll = new OrgStatisticsAll
  1278. {
  1279. OrgStatistics = listOrgStatisticsAreaAll
  1280. };
  1281. #endregion
  1282. return centerReportStatisticsDto;
  1283. }
  1284. /// <summary>
  1285. /// 部门受理类型统计周期
  1286. /// </summary>
  1287. /// <param name="dto"></param>
  1288. /// <returns></returns>
  1289. [HttpGet("department_acceptance_type_statistics")]
  1290. public async Task<object> DepartmentAcceptanceTypeStatistics([FromQuery] DepartmentKeyWordRequest dto)
  1291. {
  1292. var items = await _orderReportApplication.DepartmentAcceptanceTypeStatistics(dto).ToListAsync();
  1293. var total = new DepartmentAcceptanceTypeStatisticsDto
  1294. {
  1295. OrgName = "合计",
  1296. OrgCode = "",
  1297. OrgType = "",
  1298. ZxAllCount = items.Sum(p => p.ZxAllCount),
  1299. ZxAllTimes = items.Sum(p => p.ZxAllTimes),
  1300. ZxAcceptanceTypeCode = "10",
  1301. JyAllCount = items.Sum(p => p.JyAllCount),
  1302. JyAllTimes = items.Sum(p => p.JyAllTimes),
  1303. JyAcceptanceTypeCode = "15",
  1304. QzAllCount = items.Sum(p => p.QzAllCount),
  1305. QzAllTimes = items.Sum(p => p.QzAllTimes),
  1306. QzAcceptanceTypeCode = "20",
  1307. ByAllCount = items.Sum(p => p.ByAllCount),
  1308. ByAllTimes = items.Sum(p => p.ByAllTimes),
  1309. ByAcceptanceTypeCode = "25",
  1310. JbAllCount = items.Sum(p => p.JbAllCount),
  1311. JbAllTimes = items.Sum(p => p.JbAllTimes),
  1312. JbAcceptanceTypeCode = "30",
  1313. TsAllCount = items.Sum(p => p.TsAllCount),
  1314. TsAllTimes = items.Sum(p => p.TsAllTimes),
  1315. TsAcceptanceTypeCode = "35",
  1316. QtAllCount = items.Sum(p => p.QtAllCount),
  1317. QtAllTimes = items.Sum(p => p.QtAllTimes),
  1318. QtAcceptanceTypeCode = "40",
  1319. YjAllCount = items.Sum(p => p.YjAllCount),
  1320. YjAllTimes = items.Sum(p => p.YjAllTimes),
  1321. YjAcceptanceTypeCode = "1"
  1322. };
  1323. return new { List = items, Total = total };
  1324. }
  1325. /// <summary>
  1326. /// 部门受理类型统计周期---导出
  1327. /// </summary>
  1328. /// <param name="dto"></param>
  1329. /// <returns></returns>
  1330. [HttpPost("department_acceptance_type_statistics_export")]
  1331. public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeStatistics([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
  1332. {
  1333. var query = _orderReportApplication.DepartmentAcceptanceTypeStatistics(dto.QueryDto);
  1334. List<DepartmentAcceptanceTypeStatisticsDto> list;
  1335. if (dto.IsExportAll)
  1336. {
  1337. list = await query.ToListAsync(HttpContext.RequestAborted);
  1338. }
  1339. else
  1340. {
  1341. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1342. list = items;
  1343. }
  1344. //增加合计
  1345. list.Add(new DepartmentAcceptanceTypeStatisticsDto
  1346. {
  1347. OrgName = "合计",
  1348. OrgCode = "",
  1349. OrgType = "",
  1350. ZxAllCount = list.Sum(p => p.ZxAllCount),
  1351. ZxAllTimes = list.Sum(p => p.ZxAllTimes),
  1352. ZxAcceptanceTypeCode = "10",
  1353. JyAllCount = list.Sum(p => p.JyAllCount),
  1354. JyAllTimes = list.Sum(p => p.JyAllTimes),
  1355. JyAcceptanceTypeCode = "15",
  1356. QzAllCount = list.Sum(p => p.QzAllCount),
  1357. QzAllTimes = list.Sum(p => p.QzAllTimes),
  1358. QzAcceptanceTypeCode = "20",
  1359. ByAllCount = list.Sum(p => p.ByAllCount),
  1360. ByAllTimes = list.Sum(p => p.ByAllTimes),
  1361. ByAcceptanceTypeCode = "25",
  1362. JbAllCount = list.Sum(p => p.JbAllCount),
  1363. JbAllTimes = list.Sum(p => p.JbAllTimes),
  1364. JbAcceptanceTypeCode = "30",
  1365. TsAllCount = list.Sum(p => p.TsAllCount),
  1366. TsAllTimes = list.Sum(p => p.TsAllTimes),
  1367. TsAcceptanceTypeCode = "35",
  1368. QtAllCount = list.Sum(p => p.QtAllCount),
  1369. QtAllTimes = list.Sum(p => p.QtAllTimes),
  1370. QtAcceptanceTypeCode = "40",
  1371. YjAllCount = list.Sum(p => p.YjAllCount),
  1372. YjAllTimes = list.Sum(p => p.YjAllTimes),
  1373. YjAcceptanceTypeCode = "1"
  1374. });
  1375. var orderDtos = _mapper.Map<ICollection<DepartmentAcceptanceTypeStatisticsDto>>(list);
  1376. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1377. var dtos = orderDtos
  1378. .Select(stu => _mapper.Map(stu, typeof(DepartmentAcceptanceTypeStatisticsDto), dynamicClass))
  1379. .Cast<object>()
  1380. .ToList();
  1381. var stream = ExcelHelper.CreateStream(dtos);
  1382. return ExcelStreamResult(stream, "部门受理类型统计周期数据");
  1383. }
  1384. /// <summary>
  1385. /// 部门受理类型统计周期--明细列表
  1386. /// </summary>
  1387. /// <param name="dto"></param>
  1388. /// <returns></returns>
  1389. [HttpGet("department_acceptance_type_order_list")]
  1390. public async Task<PagedDto<OrderDto>> DepartmentAcceptanceTypeOrderList([FromQuery] DepartmentKeyWordRequest dto)
  1391. {
  1392. var (total, items) = await _orderReportApplication.DepartmentAcceptanceTypeOrderList(dto)
  1393. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  1394. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  1395. }
  1396. /// <summary>
  1397. /// 部门受理类型统计周期--明细列表---导出
  1398. /// </summary>
  1399. /// <param name="dto"></param>
  1400. /// <returns></returns>
  1401. [HttpPost("department_acceptance_type_order_list_export")]
  1402. public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeOrderList([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
  1403. {
  1404. var query = _orderReportApplication.DepartmentAcceptanceTypeOrderList(dto.QueryDto);
  1405. List<Order> list;
  1406. if (dto.IsExportAll)
  1407. {
  1408. list = await query.ToListAsync(HttpContext.RequestAborted);
  1409. }
  1410. else
  1411. {
  1412. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1413. list = items;
  1414. }
  1415. var orderDtos = _mapper.Map<ICollection<OrderDto>>(list);
  1416. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1417. var dtos = orderDtos
  1418. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  1419. .Cast<object>()
  1420. .ToList();
  1421. var stream = ExcelHelper.CreateStream(dtos);
  1422. return ExcelStreamResult(stream, "部门受理类型统计周期数据");
  1423. }
  1424. /// <summary>
  1425. /// 部门办件统计表
  1426. /// </summary>
  1427. /// <param name="dto"></param>
  1428. /// <returns></returns>
  1429. [HttpGet("departmental_processing_statistics")]
  1430. public async Task<object> DepartmentalProcessingStatistics([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  1431. {
  1432. //联合查询
  1433. //var items = await _orderReportApplication.DepartmentalProcessingStatistics(dto)
  1434. // .ToListAsync();
  1435. var items = await _orderReportApplication.DepartmentalProcessingStatisticsNew(dto);
  1436. var total = new DepartmentalProcessingStatisticsDataDto
  1437. {
  1438. OrgCode = "",
  1439. OrgName = "合计",
  1440. OrgType = EOrgType.City,
  1441. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  1442. YbOrderCountNum = items.Sum(p => p.YbOrderCountNum),
  1443. ZbOrderCountNum = items.Sum(p => p.ZbOrderCountNum),
  1444. Archived = items.Sum(p => p.Archived),
  1445. ToBeArchived = items.Sum(p => p.ToBeArchived),
  1446. WaitPublished = items.Sum(p => p.WaitPublished),
  1447. PublishedOpen = items.Sum(p => p.PublishedOpen),
  1448. PublishedNoOpen = items.Sum(p => p.PublishedNoOpen),
  1449. YbOverdue = items.Sum(p => p.YbOverdue),
  1450. ZbOverdue = items.Sum(p => p.ZbOverdue),
  1451. CompleteOnTime = items.Sum(p => p.CompleteOnTime),
  1452. HqybOverdue = items.Sum(p => p.HqybOverdue),
  1453. HqzbOverdue = items.Sum(p => p.HqzbOverdue),
  1454. DelayEnd = items.Sum(p => p.DelayEnd),
  1455. DelayWait = items.Sum(p => p.DelayWait),
  1456. OrderDelayCount = items.Sum(p => p.OrderDelayCount),
  1457. ScreenCount = items.Sum(p => p.ScreenCount),
  1458. ScreenApproval = items.Sum(p => p.ScreenApproval),
  1459. ScreenPass = items.Sum(p => p.ScreenPass),
  1460. ScreenNotPass = items.Sum(p => p.ScreenNotPass),
  1461. SatisfactionCount = items.Sum(p => p.SatisfactionCount),
  1462. NotSatisfactionCount = items.Sum(p => p.NotSatisfactionCount)
  1463. };
  1464. return new { List = items, Total = total };
  1465. }
  1466. /// <summary>
  1467. /// 部门办件统计表--导出
  1468. /// </summary>
  1469. /// <param name="dto"></param>
  1470. /// <returns></returns>
  1471. [HttpPost("departmental_processing_statistics_export")]
  1472. public async Task<FileStreamResult> ExportDepartmentalProcessingStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  1473. {
  1474. var list = await _orderReportApplication.DepartmentalProcessingStatisticsNew(dto.QueryDto);
  1475. //增加合计
  1476. list.Add(new DepartmentalProcessingStatisticsDataDto
  1477. {
  1478. OrgCode = "",
  1479. OrgName = "合计",
  1480. OrgType = EOrgType.City,
  1481. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  1482. YbOrderCountNum = list.Sum(p => p.YbOrderCountNum),
  1483. ZbOrderCountNum = list.Sum(p => p.ZbOrderCountNum),
  1484. Archived = list.Sum(p => p.Archived),
  1485. ToBeArchived = list.Sum(p => p.ToBeArchived),
  1486. WaitPublished = list.Sum(p => p.WaitPublished),
  1487. PublishedOpen = list.Sum(p => p.PublishedOpen),
  1488. PublishedNoOpen = list.Sum(p => p.PublishedNoOpen),
  1489. YbOverdue = list.Sum(p => p.YbOverdue),
  1490. ZbOverdue = list.Sum(p => p.ZbOverdue),
  1491. CompleteOnTime = list.Sum(p => p.CompleteOnTime),
  1492. HqybOverdue = list.Sum(p => p.HqybOverdue),
  1493. HqzbOverdue = list.Sum(p => p.HqzbOverdue),
  1494. DelayEnd = list.Sum(p => p.DelayEnd),
  1495. DelayWait = list.Sum(p => p.DelayWait),
  1496. OrderDelayCount = list.Sum(p => p.OrderDelayCount),
  1497. ScreenCount = list.Sum(p => p.ScreenCount),
  1498. ScreenApproval = list.Sum(p => p.ScreenApproval),
  1499. ScreenPass = list.Sum(p => p.ScreenPass),
  1500. ScreenNotPass = list.Sum(p => p.ScreenNotPass),
  1501. SatisfactionCount = list.Sum(p => p.SatisfactionCount),
  1502. NotSatisfactionCount = list.Sum(p => p.NotSatisfactionCount)
  1503. });
  1504. var orderDtos = _mapper.Map<ICollection<DepartmentalProcessingStatisticsDataDto>>(list);
  1505. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1506. var dtos = orderDtos
  1507. .Select(stu => _mapper.Map(stu, typeof(DepartmentalProcessingStatisticsDataDto), dynamicClass))
  1508. .Cast<object>()
  1509. .ToList();
  1510. var stream = ExcelHelper.CreateStream(dtos);
  1511. return ExcelStreamResult(stream, "部门办件统计表数据");
  1512. }
  1513. /// <summary>
  1514. /// 部门办件统计表--子级
  1515. /// </summary>
  1516. /// <param name="dto"></param>
  1517. /// <returns></returns>
  1518. [HttpGet("departmental_processing_child_statistics")]
  1519. public async Task<object> DepartmentalProcessingChildStatistics([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  1520. {
  1521. var items = await _orderReportApplication.DepartmentalProcessingChildStatisticsNew(dto);
  1522. //计算合计
  1523. var total = new DepartmentalProcessingStatisticsDataDto
  1524. {
  1525. OrgCode = "",
  1526. OrgName = "合计",
  1527. OrgType = EOrgType.City,
  1528. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  1529. YbOrderCountNum = items.Sum(p => p.YbOrderCountNum),
  1530. ZbOrderCountNum = items.Sum(p => p.ZbOrderCountNum),
  1531. Archived = items.Sum(p => p.Archived),
  1532. ToBeArchived = items.Sum(p => p.ToBeArchived),
  1533. WaitPublished = items.Sum(p => p.WaitPublished),
  1534. PublishedOpen = items.Sum(p => p.PublishedOpen),
  1535. PublishedNoOpen = items.Sum(p => p.PublishedNoOpen),
  1536. YbOverdue = items.Sum(p => p.YbOverdue),
  1537. ZbOverdue = items.Sum(p => p.ZbOverdue),
  1538. CompleteOnTime = items.Sum(p => p.CompleteOnTime),
  1539. HqybOverdue = items.Sum(p => p.HqybOverdue),
  1540. HqzbOverdue = items.Sum(p => p.HqzbOverdue),
  1541. DelayEnd = items.Sum(p => p.DelayEnd),
  1542. DelayWait = items.Sum(p => p.DelayWait),
  1543. OrderDelayCount = items.Sum(p => p.OrderDelayCount),
  1544. ScreenCount = items.Sum(p => p.ScreenCount),
  1545. ScreenApproval = items.Sum(p => p.ScreenApproval),
  1546. ScreenPass = items.Sum(p => p.ScreenPass),
  1547. ScreenNotPass = items.Sum(p => p.ScreenNotPass),
  1548. SatisfactionCount = items.Sum(p => p.SatisfactionCount),
  1549. NotSatisfactionCount = items.Sum(p => p.NotSatisfactionCount)
  1550. };
  1551. return new { List = items, Total = total };
  1552. }
  1553. /// <summary>
  1554. /// 部门办件统计表--子级--导出
  1555. /// </summary>
  1556. /// <param name="dto"></param>
  1557. /// <returns></returns>
  1558. [HttpPost("departmental_processing_child_statistics_export")]
  1559. public async Task<FileStreamResult> ExportDepartmentalProcessingChildStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  1560. {
  1561. var list = await _orderReportApplication.DepartmentalProcessingChildStatisticsNew(dto.QueryDto);
  1562. //增加合计
  1563. list.Add(new DepartmentalProcessingStatisticsDataDto
  1564. {
  1565. OrgCode = "",
  1566. OrgName = "合计",
  1567. OrgType = EOrgType.City,
  1568. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  1569. YbOrderCountNum = list.Sum(p => p.YbOrderCountNum),
  1570. ZbOrderCountNum = list.Sum(p => p.ZbOrderCountNum),
  1571. Archived = list.Sum(p => p.Archived),
  1572. ToBeArchived = list.Sum(p => p.ToBeArchived),
  1573. WaitPublished = list.Sum(p => p.WaitPublished),
  1574. PublishedOpen = list.Sum(p => p.PublishedOpen),
  1575. PublishedNoOpen = list.Sum(p => p.PublishedNoOpen),
  1576. YbOverdue = list.Sum(p => p.YbOverdue),
  1577. ZbOverdue = list.Sum(p => p.ZbOverdue),
  1578. CompleteOnTime = list.Sum(p => p.CompleteOnTime),
  1579. HqybOverdue = list.Sum(p => p.HqybOverdue),
  1580. HqzbOverdue = list.Sum(p => p.HqzbOverdue),
  1581. DelayEnd = list.Sum(p => p.DelayEnd),
  1582. DelayWait = list.Sum(p => p.DelayWait),
  1583. OrderDelayCount = list.Sum(p => p.OrderDelayCount),
  1584. ScreenCount = list.Sum(p => p.ScreenCount),
  1585. ScreenApproval = list.Sum(p => p.ScreenApproval),
  1586. ScreenPass = list.Sum(p => p.ScreenPass),
  1587. ScreenNotPass = list.Sum(p => p.ScreenNotPass),
  1588. SatisfactionCount = list.Sum(p => p.SatisfactionCount),
  1589. NotSatisfactionCount = list.Sum(p => p.NotSatisfactionCount)
  1590. });
  1591. var orderDtos = _mapper.Map<ICollection<DepartmentalProcessingStatisticsDataDto>>(list);
  1592. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1593. var dtos = orderDtos
  1594. .Select(stu => _mapper.Map(stu, typeof(DepartmentalProcessingStatisticsDataDto), dynamicClass))
  1595. .Cast<object>()
  1596. .ToList();
  1597. var stream = ExcelHelper.CreateStream(dtos);
  1598. return ExcelStreamResult(stream, "部门办件统计表数据");
  1599. }
  1600. /// <summary>
  1601. /// 部门办件统计表--明细
  1602. /// </summary>
  1603. /// <param name="dto"></param>
  1604. /// <returns></returns>
  1605. [HttpGet("departmental_processing_statistics_list")]
  1606. public async Task<PagedDto<OrderDto>> GetDepartmentalProcessingStatisticsList([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  1607. {
  1608. RefAsync<int> total = 0;
  1609. var queryData = await _orderReportApplication.GetDepartmentalProcessingStatisticsListNew(dto, HttpContext.RequestAborted)
  1610. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  1611. .OrderByDescending((x, o) => o.CreationTime)
  1612. .Select((x, o) => new { o })
  1613. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  1614. var dtos = queryData.Select(d =>
  1615. {
  1616. var dto = _mapper.Map<OrderDto>(d.o);
  1617. return dto;
  1618. }).ToList();
  1619. return new PagedDto<OrderDto>(total, dtos);
  1620. }
  1621. /// <summary>
  1622. /// 部门办件统计表--明细--导出
  1623. /// </summary>
  1624. /// <param name="dto"></param>
  1625. /// <returns></returns>
  1626. [HttpPost("departmental_processing_statistics_list_export")]
  1627. public async Task<FileStreamResult> ExportGetDepartmentalProcessingStatisticsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  1628. {
  1629. var query = _orderReportApplication.GetDepartmentalProcessingStatisticsListNew(dto.QueryDto, HttpContext.RequestAborted)
  1630. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  1631. .OrderByDescending((x, o) => o.CreationTime)
  1632. .Select((x, o) => new { o });
  1633. List<OrderDto> list = new List<OrderDto>();
  1634. if (dto.IsExportAll)
  1635. {
  1636. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  1637. list = listData.Select(d =>
  1638. {
  1639. var dto = _mapper.Map<OrderDto>(d.o);
  1640. return dto;
  1641. }).ToList();
  1642. }
  1643. else
  1644. {
  1645. RefAsync<int> total = 0;
  1646. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  1647. list = listData.Select(d =>
  1648. {
  1649. var dto = _mapper.Map<OrderDto>(d.o);
  1650. return dto;
  1651. }).ToList();
  1652. }
  1653. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1654. var dtos = list
  1655. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  1656. .Cast<object>()
  1657. .ToList();
  1658. var stream = ExcelHelper.CreateStream(dtos);
  1659. return ExcelStreamResult(stream, "部门办件统计明细数据");
  1660. }
  1661. /// <summary>
  1662. /// 部门办件统计明细表
  1663. /// </summary>
  1664. /// <param name="dto"></param>
  1665. /// <returns></returns>
  1666. [HttpGet("departmental_processing_statistics_details_list")]
  1667. public async Task<PagedDto<OrderDto>> DepartmentalProcessingStatisticsDetailsList([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  1668. {
  1669. RefAsync<int> total = 0;
  1670. var queryData = await _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto)
  1671. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  1672. .OrderByDescending((x, o) => o.CreationTime)
  1673. .Select((x, o) => new { o })
  1674. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  1675. var dtos = queryData.Select(d =>
  1676. {
  1677. var dto = _mapper.Map<OrderDto>(d.o);
  1678. return dto;
  1679. }).ToList();
  1680. return new PagedDto<OrderDto>(total, dtos);
  1681. }
  1682. /// <summary>
  1683. /// 部门办件统计明细表--导出
  1684. /// </summary>
  1685. /// <param name="dto"></param>
  1686. /// <returns></returns>
  1687. [HttpGet("departmental_processing_statistics_details_list_export")]
  1688. public async Task<FileStreamResult> ExportDepartmentalProcessingStatisticsDetailsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  1689. {
  1690. var query = _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto.QueryDto)
  1691. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  1692. .OrderByDescending((x, o) => o.CreationTime)
  1693. .Select((x, o) => new { o });
  1694. var list = new List<OrderDto>();
  1695. if (dto.IsExportAll)
  1696. {
  1697. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  1698. list = listData.Select(d =>
  1699. {
  1700. var dto = _mapper.Map<OrderDto>(d.o);
  1701. return dto;
  1702. }).ToList();
  1703. }
  1704. else
  1705. {
  1706. RefAsync<int> total = 0;
  1707. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  1708. list = listData.Select(d =>
  1709. {
  1710. var dto = _mapper.Map<OrderDto>(d.o);
  1711. return dto;
  1712. }).ToList();
  1713. }
  1714. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1715. var dtos = list
  1716. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  1717. .Cast<object>()
  1718. .ToList();
  1719. var stream = ExcelHelper.CreateStream(dtos);
  1720. return ExcelStreamResult(stream, "部门办件统计明细表数据");
  1721. }
  1722. /// <summary>
  1723. /// 高频来电统计
  1724. /// </summary>
  1725. /// <param name="dto"></param>
  1726. /// <returns></returns>
  1727. [HttpGet("high_frequency_call_statistics")]
  1728. public async Task<PagedDto<HighFrequencyCallStatisticsDto>> HighFrequencyCallStatistics([FromQuery] HighFrequencyCallStatisticsRequest dto)
  1729. {
  1730. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  1731. throw UserFriendlyException.SameMessage("请选择时间!");
  1732. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  1733. int CallCount = 2;
  1734. var HighFrequencyCallStatistics = _systemSettingCacheManager.GetSetting(SettingConstants.HighFrequencyCallStatistics)?.SettingValue[0];
  1735. if (HighFrequencyCallStatistics != null)
  1736. CallCount = int.Parse(HighFrequencyCallStatistics);
  1737. var (total, items) = await _trCallRecordRepository.Queryable()
  1738. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  1739. .Where((p, o) => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime)
  1740. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  1741. .Where((p, o) => p.ExternalId != null && o.Id != null)
  1742. .Where((p, o) => p.CallDirection == ECallDirection.In)
  1743. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNum), (p, o) => p.CPN == dto.PhoneNum)
  1744. .Select((p, o) => new
  1745. {
  1746. p.CPN,
  1747. p.ExternalId
  1748. })
  1749. .MergeTable()
  1750. .GroupBy(p => p.CPN)
  1751. .Select(p => new HighFrequencyCallStatisticsDto
  1752. {
  1753. Callnum = p.CPN,
  1754. OrderCountNum = SqlFunc.AggregateCount(p.CPN),//总量
  1755. })
  1756. .MergeTable()
  1757. .Where(p => p.OrderCountNum >= CallCount)
  1758. .OrderByDescending(p => p.OrderCountNum)
  1759. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1760. return new PagedDto<HighFrequencyCallStatisticsDto>(total, _mapper.Map<IReadOnlyList<HighFrequencyCallStatisticsDto>>(items));
  1761. }
  1762. /// <summary>
  1763. /// 高频来电统计列表详情
  1764. /// </summary>
  1765. /// <param name="dto"></param>
  1766. /// <returns></returns>
  1767. [HttpGet("high_frequency_call_statistics_order_list")]
  1768. public async Task<PagedDto<OrderDto>> HighFrequencyCallStatisticsOrderList([FromQuery] HighFrequencyCallStatisticsListRequest dto)
  1769. {
  1770. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  1771. throw UserFriendlyException.SameMessage("请选择时间!");
  1772. if (string.IsNullOrEmpty(dto.FromPhone))
  1773. throw UserFriendlyException.SameMessage("号码不能为空!");
  1774. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  1775. var data = await _trCallRecordRepository.Queryable()
  1776. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  1777. .Where((p, o) => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime)
  1778. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  1779. .Where((p, o) => p.ExternalId != null && o.Id != null)
  1780. .Where((p, o) => p.CPN == dto.FromPhone)
  1781. .Where((p, o) => p.CallDirection == ECallDirection.In)
  1782. .Select((p, o) =>
  1783. p.ExternalId
  1784. )
  1785. .ToListAsync();
  1786. var (total, items) = await _orderRepository.Queryable()
  1787. .Includes(x => x.OrderScreens)
  1788. .Where(p => data.Contains(p.Id))
  1789. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!)) //标题
  1790. .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo.Contains(dto.ProvinceNo)) //省本地编号
  1791. .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
  1792. .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
  1793. .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
  1794. .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
  1795. .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!)) //转接号码
  1796. .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
  1797. .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
  1798. .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
  1799. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
  1800. .WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel)) //紧急程度
  1801. // .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone.Contains(dto.FromPhone)) //来电号码
  1802. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact.Contains(dto.PhoneNo!)) //联系电话
  1803. .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
  1804. .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
  1805. .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
  1806. .WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status)) //工单状态
  1807. .WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
  1808. .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName.Contains(dto.ActualHandlerName)) //接办人
  1809. .WhereIF(dto.IsScreen == true, d => d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //有甄别
  1810. .WhereIF(dto.IsScreen == false, d => !d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //无甄别
  1811. .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.ActualHandleStepCode == dto.CurrentStepCode) //当前办理节点
  1812. .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
  1813. .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束
  1814. .WhereIF(dto.IsOverTime == true, d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
  1815. .WhereIF(dto.IsOverTime == false, d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //否 超期
  1816. .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
  1817. .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName.Contains(dto.FromName)) //来电人姓名
  1818. .WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
  1819. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.IsProvince == true)
  1820. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.IsProvince == false)
  1821. .OrderByDescending(d => d.CreationTime)
  1822. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  1823. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  1824. }
  1825. /// <summary>
  1826. /// 高频事项预警
  1827. /// </summary>
  1828. /// <param name="dto"></param>
  1829. /// <returns></returns>
  1830. [HttpGet("highmatter-warning")]
  1831. public async Task<PagedDto<HighMatterWarningDto>> HighMatterWarning([FromQuery] HighMatterWarningRequest dto)
  1832. {
  1833. dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
  1834. List<string> filterTitle = new List<string>();
  1835. filterTitle.Add("无声");
  1836. filterTitle.Add("骚扰");
  1837. filterTitle.Add("错拨");
  1838. filterTitle.Add("测试");
  1839. var (total, items) = await _orderRepository.Queryable()
  1840. .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
  1841. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  1842. .LeftJoin<SystemArea>((it, o) => it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
  1843. .WhereIF(dto.AreaCodes.Any(), (it, o) => dto.AreaCodes.Contains(it.AreaCode)) //区域
  1844. .WhereIF(dto.HotspotIds.Any(), (it, o) => dto.HotspotIds.Contains(it.HotspotId)) //热点类型
  1845. .WhereIF(dto.AcceptTypeCodes.Any(), (it, o) => dto.AcceptTypeCodes.Contains(it.AcceptTypeCode)) //受理类型
  1846. .GroupBy((it, o) => new
  1847. {
  1848. it.AcceptTypeCode,
  1849. it.AcceptType,
  1850. it.HotspotId,
  1851. it.HotspotName,
  1852. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  1853. o.AreaName,
  1854. })
  1855. .Having((it, o) => SqlFunc.AggregateCount(it.HotspotName) >= 5)
  1856. .Select((it, o) => new HighMatterWarningDto()
  1857. {
  1858. AcceptTypeCode = it.AcceptTypeCode,
  1859. AcceptType = it.AcceptType,
  1860. AreaName = o.AreaName,
  1861. HotspotName = it.HotspotName,
  1862. HotspotId = it.HotspotId,
  1863. SumCount = SqlFunc.AggregateCount(it.HotspotName),
  1864. Id = SqlFunc.AggregateMin(it.Id),
  1865. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  1866. })
  1867. .MergeTable()
  1868. .LeftJoin<Order>((x, d) => x.Id == d.Id)
  1869. .Select((x, d) => new HighMatterWarningDto()
  1870. {
  1871. AreaName = x.AreaName,
  1872. HotspotName = x.HotspotName,
  1873. HotspotId = x.HotspotId,
  1874. Title = d.Title,
  1875. SumCount = x.SumCount,
  1876. Id = d.Id,
  1877. AcceptTypeCode = x.AcceptTypeCode,
  1878. AcceptType = x.AcceptType,
  1879. AreaCode = x.AreaCode
  1880. })
  1881. .MergeTable()
  1882. .OrderByDescending(d => d.SumCount).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1883. return new PagedDto<HighMatterWarningDto>(total, _mapper.Map<IReadOnlyList<HighMatterWarningDto>>(items));
  1884. }
  1885. /// <summary>
  1886. /// 高频事项预警明细
  1887. /// </summary>
  1888. /// <param name="dto"></param>
  1889. /// <returns></returns>
  1890. [HttpGet("highmatter-warning-detail")]
  1891. public async Task<PagedDto<OrderDto>> HighMatterWarningDetail([FromQuery] HighMatterWarningDetailRequest dto)
  1892. {
  1893. dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
  1894. List<string> filterTitle = new List<string>();
  1895. filterTitle.Add("无声");
  1896. filterTitle.Add("骚扰");
  1897. filterTitle.Add("错拨");
  1898. filterTitle.Add("测试");
  1899. var (total, items) = await _orderRepository.Queryable()
  1900. .Includes(x => x.OrderScreens)
  1901. .Where(d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
  1902. .Where(d => d.HotspotId == dto.HotspotId) //热点类型
  1903. .Where(d => d.CreationTime >= dto.StartTime) //受理时间开始
  1904. .Where(d => d.CreationTime <= dto.EndTime) //受理时间结束
  1905. .Where(d => d.AreaCode == dto.AreaCode) //区域
  1906. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  1907. .OrderByDescending(d => d.CreationTime)
  1908. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  1909. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  1910. }
  1911. /// <summary>
  1912. /// 回退错件
  1913. /// </summary>
  1914. /// <param name="dto"></param>
  1915. /// <returns></returns>
  1916. [HttpGet("reTransact")]
  1917. public async Task<PagedDto<OrderReTransactVo>> OrderReTransact([FromQuery] QueryOrderReTransactRequest dto)
  1918. {
  1919. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  1920. throw UserFriendlyException.SameMessage("请选择时间!");
  1921. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  1922. var query = _orderApplication.OrderReTransact(dto);
  1923. var (total, items) = await query
  1924. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  1925. items.Add(new OrderReTransactVo
  1926. {
  1927. OrgName = "合计",
  1928. Num = items.Select(s => s.Num).Sum(),
  1929. });
  1930. return new PagedDto<OrderReTransactVo>(total, _mapper.Map<IReadOnlyList<OrderReTransactVo>>(items));
  1931. }
  1932. /// <summary>
  1933. /// 回退错件导出
  1934. /// </summary>
  1935. /// <returns></returns>
  1936. [HttpPost("reTransact/_export")]
  1937. public async Task<FileStreamResult> OrderReTransactExport([FromBody] ExportExcelDto<QueryOrderReTransactRequest> dto)
  1938. {
  1939. var query = _orderApplication.OrderReTransact(dto.QueryDto);
  1940. List<OrderReTransactVo> data;
  1941. data = await query.ToListAsync(HttpContext.RequestAborted);
  1942. data.Add(new OrderReTransactVo
  1943. {
  1944. OrgName = "合计",
  1945. Num = data.Select(s => s.Num).Sum(),
  1946. });
  1947. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1948. var dtos = data
  1949. .Select(stu => _mapper.Map(stu, typeof(OrderReTransactVo), dynamicClass))
  1950. .Cast<object>()
  1951. .ToList();
  1952. var stream = ExcelHelper.CreateStream(dtos);
  1953. return ExcelStreamResult(stream, "回退错件统计数据");
  1954. }
  1955. /// <summary>
  1956. /// 回退错件明细
  1957. /// </summary>
  1958. /// <param name="dto"></param>
  1959. /// <returns></returns>
  1960. [HttpGet("reTransact_detail")]
  1961. public async Task<PagedDto<OrderSpecialDetailDto>> OrderReTransactDetail([FromQuery] QueryOrderReTransactDetailRequest dto)
  1962. {
  1963. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  1964. throw UserFriendlyException.SameMessage("请选择时间!");
  1965. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  1966. var query = _orderApplication.QueryOrderSourceDetail(dto);
  1967. var (total, items) = await
  1968. query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  1969. return new PagedDto<OrderSpecialDetailDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDetailDto>>(items));
  1970. }
  1971. /// <summary>
  1972. /// 回退错件明细导出
  1973. /// </summary>
  1974. /// <returns></returns>
  1975. [HttpPost("reTransact_detail/_export")]
  1976. public async Task<FileStreamResult> OrderReTransactDetailExport([FromBody] ExportExcelDto<QueryOrderReTransactDetailRequest> dto)
  1977. {
  1978. var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
  1979. List<OrderSpecialDetail> data;
  1980. if (dto.IsExportAll)
  1981. {
  1982. data = await query.ToListAsync(HttpContext.RequestAborted);
  1983. }
  1984. else
  1985. {
  1986. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1987. data = items;
  1988. }
  1989. var dataDtos = _mapper.Map<ICollection<OrderSpecialDetailDto>>(data);
  1990. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1991. var dtos = dataDtos
  1992. .Select(stu => _mapper.Map(stu, typeof(OrderSpecialDetailDto), dynamicClass))
  1993. .Cast<object>()
  1994. .ToList();
  1995. var stream = ExcelHelper.CreateStream(dtos);
  1996. return ExcelStreamResult(stream, "回退错件明细列表数据");
  1997. }
  1998. /// <summary>
  1999. /// 获取基本信息
  2000. /// </summary>
  2001. /// <param name="id"></param>
  2002. /// <returns></returns>
  2003. [HttpGet("reTransact_base")]
  2004. public async Task<object> ReTransactBaseData()
  2005. {
  2006. var rsp = new
  2007. {
  2008. ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
  2009. };
  2010. return rsp;
  2011. }
  2012. /// <summary>
  2013. /// 派单量统计
  2014. /// </summary>
  2015. /// <param name="dto"></param>
  2016. /// <returns></returns>
  2017. [HttpGet("send_order_report")]
  2018. public async Task<object> SendOrderReport([FromQuery] QuerySendOrderRequest dto)
  2019. {
  2020. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2021. throw UserFriendlyException.SameMessage("请选择时间!");
  2022. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  2023. var items = await _workflowTraceRepository.Queryable()
  2024. .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
  2025. //.LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId && wsh.IsActualHandler == true)
  2026. .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
  2027. .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled)
  2028. .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
  2029. .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
  2030. .WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, w, su) => su.UserName == dto.UserName)
  2031. .GroupBy((x, w, su) => new { su.UserId, su.UserName })
  2032. //.Having((x, w, wsh, su) => SqlFunc.AggregateCount(x.WorkflowId) == 1)
  2033. .Select((x, w, su) => new BiOrderSendVo
  2034. {
  2035. UserId = su.UserId,
  2036. UserName = su.UserName,
  2037. SendOrderNum = SqlFunc.AggregateDistinctCount(w.ExternalId),
  2038. NoSendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.HandlerId == null || x.HandlerId == "", 1, 0)),
  2039. }).ToListAsync();
  2040. var items2 = await _workflowTraceRepository.Queryable()
  2041. .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
  2042. //.LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
  2043. .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
  2044. .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled)
  2045. .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
  2046. .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
  2047. .GroupBy((x, w, su) => x.WorkflowId)
  2048. .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
  2049. .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
  2050. .MergeTable()
  2051. .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
  2052. .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
  2053. //.LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
  2054. .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
  2055. .WhereIF(!string.IsNullOrEmpty(dto.UserName), ((a, wt, wf, su) => su.UserName == dto.UserName))
  2056. .GroupBy((a, wt, wf, su) => new { su.UserId, su.UserName })
  2057. .Select((a, wt, wf, su) => new BiOrderSendVo
  2058. {
  2059. UserId = su.UserId,
  2060. UserName = su.UserName,
  2061. SendOrderNum = 0,
  2062. NoSendOrderNum = 0,
  2063. ReSendOrderNum = SqlFunc.AggregateDistinctCount(wf.ExternalId),
  2064. }).ToListAsync();
  2065. var res = (from t1 in items
  2066. join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
  2067. from item in t1_t2.DefaultIfEmpty()
  2068. select new
  2069. {
  2070. UserId = t1.UserId,
  2071. UserName = t1.UserName,
  2072. SendOrderNum = t1.SendOrderNum,
  2073. NoSendOrderNum = t1.NoSendOrderNum,
  2074. ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
  2075. ChainRate = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault() > 0 ?
  2076. ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault().ToString())) / double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%" : "100.00%",
  2077. }).ToList();
  2078. return res;
  2079. }
  2080. /// <summary>
  2081. /// 派单量统计明细
  2082. /// </summary>
  2083. /// <param name="dto"></param>
  2084. /// <returns></returns>
  2085. [HttpGet("send_order_detail_report")]
  2086. public async Task<PagedDto<OrderDto>> QuerySendOrderDetail([FromQuery] QuerySendOrderDetailRequest dto)
  2087. {
  2088. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2089. throw UserFriendlyException.SameMessage("请选择时间!");
  2090. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  2091. var (total, items) = await _workflowTraceRepository.Queryable()
  2092. .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
  2093. //.LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId && wsh.IsActualHandler == true)
  2094. .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
  2095. .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
  2096. .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
  2097. .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
  2098. .Where((x, w, su) => su.UserId == dto.UserId)
  2099. .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", (x, w, su) => x.HandlerId == null || x.HandlerId == "")
  2100. .GroupBy((x, w, su) => w.ExternalId)
  2101. .Select((x, w, su) => new { Id = w.ExternalId })
  2102. .MergeTable()
  2103. .LeftJoin<Order>((a, b) => a.Id == b.Id)
  2104. .Select((a, b) => b)
  2105. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2106. if (dto.TitleCode.ToUpper() == "RESENDORDERNUM")
  2107. {
  2108. (total, items) = await _workflowTraceRepository.Queryable()
  2109. .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
  2110. //.LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
  2111. .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
  2112. .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
  2113. .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
  2114. .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
  2115. .GroupBy((x, w, su) => x.WorkflowId)
  2116. .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
  2117. .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
  2118. .MergeTable()
  2119. .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
  2120. .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
  2121. //.LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
  2122. .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
  2123. .Where((a, wt, wf, su) => su.UserId == dto.UserId)
  2124. .GroupBy((a, wt, wf, su) => wf.ExternalId)
  2125. .Select((a, wt, wf, su) => new { Id = wf.ExternalId })
  2126. .MergeTable()
  2127. .LeftJoin<Order>((a, b) => a.Id == b.Id)
  2128. .Select((a, b) => b)
  2129. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2130. }
  2131. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2132. }
  2133. /// <summary>
  2134. /// 二次办理统计
  2135. /// </summary>
  2136. /// <param name="dto"></param>
  2137. /// <returns></returns>
  2138. [HttpGet("secondary_handling_report")]
  2139. public async Task<List<SecondaryHandlingVo>> SecondaryHandlingReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2140. {
  2141. var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto, HttpContext.RequestAborted);
  2142. return await query.ToListAsync();
  2143. }
  2144. /// <summary>
  2145. /// 二次办理统计导出
  2146. /// </summary>
  2147. /// <returns></returns>
  2148. [HttpPost("secondary_handling_report/_export")]
  2149. public async Task<FileStreamResult> SecondaryHandlingReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2150. {
  2151. var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto.QueryDto, HttpContext.RequestAborted);
  2152. List<SecondaryHandlingVo> secondaryHandling;
  2153. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2154. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2155. var dtos = secondaryHandling
  2156. .Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingVo), dynamicClass))
  2157. .Cast<object>()
  2158. .ToList();
  2159. var stream = ExcelHelper.CreateStream(dtos);
  2160. return ExcelStreamResult(stream, "二次办理统计数据");
  2161. }
  2162. /// <summary>
  2163. /// 二次办理明细
  2164. /// </summary>
  2165. /// <param name="dto"></param>
  2166. /// <returns></returns>
  2167. [HttpGet("secondary_handling_detail_report")]
  2168. public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2169. {
  2170. var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto, HttpContext.RequestAborted);
  2171. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  2172. return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
  2173. }
  2174. /// <summary>
  2175. /// 二次办理明细导出
  2176. /// </summary>
  2177. /// <returns></returns>
  2178. [HttpPost("secondary_handling_detail_report/_export")]
  2179. public async Task<FileStreamResult> SecondaryHandlingDetailReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2180. {
  2181. var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto.QueryDto, HttpContext.RequestAborted);
  2182. List<OrderSecondaryHandling> secondaryHandling;
  2183. if (dto.IsExportAll)
  2184. {
  2185. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2186. }
  2187. else
  2188. {
  2189. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2190. secondaryHandling = items;
  2191. }
  2192. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
  2193. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2194. var dtos = secondaryHandlingDtos
  2195. .Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
  2196. .Cast<object>()
  2197. .ToList();
  2198. var stream = ExcelHelper.CreateStream(dtos);
  2199. return ExcelStreamResult(stream, "二次办理列表数据");
  2200. }
  2201. /// <summary>
  2202. /// 二次办理满意度统计
  2203. /// </summary>
  2204. /// <param name="dto"></param>
  2205. /// <returns></returns>
  2206. [HttpGet("secondary_handling_satisfaction_report")]
  2207. public async Task<List<SecondaryHandlingSatisfactionVo>> SecondaryHandlingSatisfactionReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2208. {
  2209. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto, HttpContext.RequestAborted);
  2210. var list = await query.ToListAsync();
  2211. //总计
  2212. var total = new SecondaryHandlingSatisfactionVo
  2213. {
  2214. OrgId = "0",
  2215. OrgName = "总计",
  2216. TotalSumCount = list.Select(x => x.TotalSumCount).Sum(),
  2217. VerySatisfiedCount = list.Select(x => x.VerySatisfiedCount).Sum(),
  2218. SatisfiedCount = list.Select(x => x.SatisfiedCount).Sum(),
  2219. RegardedAsSatisfiedCount = list.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2220. DefaultSatisfiedCount = list.Select(x => x.DefaultSatisfiedCount).Sum(),
  2221. NoSatisfiedCount = list.Select(x => x.NoSatisfiedCount).Sum(),
  2222. NoEvaluateCount = list.Select(x => x.NoEvaluateCount).Sum(),
  2223. NoPutThroughCount = list.Select(x => x.NoPutThroughCount).Sum()
  2224. };
  2225. list.Add(total);
  2226. //区县合计
  2227. var countyList = list.Where(x => x.OrgType == EOrgType.County).ToList();
  2228. var countyTotal = new SecondaryHandlingSatisfactionVo
  2229. {
  2230. OrgId = "0",
  2231. OrgName = "区县合计",
  2232. TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
  2233. VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
  2234. SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
  2235. RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2236. DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2237. NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
  2238. NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
  2239. NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
  2240. };
  2241. list.Add(countyTotal);
  2242. //市直合计
  2243. var cityList = list.Where(x => x.OrgType == EOrgType.City).ToList();
  2244. var cityTotal = new SecondaryHandlingSatisfactionVo
  2245. {
  2246. OrgId = "0",
  2247. OrgName = "市直合计",
  2248. TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
  2249. VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
  2250. SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
  2251. RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2252. DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2253. NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
  2254. NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
  2255. NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
  2256. };
  2257. list.Add(cityTotal);
  2258. return list;
  2259. }
  2260. /// <summary>
  2261. /// 二次办理满意度统计导出
  2262. /// </summary>
  2263. /// <returns></returns>
  2264. [HttpPost("secondary_handling_satisfaction_report/_export")]
  2265. public async Task<FileStreamResult> SecondaryHandlingSatisfactionReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2266. {
  2267. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto.QueryDto, HttpContext.RequestAborted);
  2268. List<SecondaryHandlingSatisfactionVo> secondaryHandling;
  2269. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2270. //总计
  2271. var total = new SecondaryHandlingSatisfactionVo
  2272. {
  2273. OrgId = "0",
  2274. OrgName = "总计",
  2275. TotalSumCount = secondaryHandling.Select(x => x.TotalSumCount).Sum(),
  2276. VerySatisfiedCount = secondaryHandling.Select(x => x.VerySatisfiedCount).Sum(),
  2277. SatisfiedCount = secondaryHandling.Select(x => x.SatisfiedCount).Sum(),
  2278. RegardedAsSatisfiedCount = secondaryHandling.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2279. DefaultSatisfiedCount = secondaryHandling.Select(x => x.DefaultSatisfiedCount).Sum(),
  2280. NoSatisfiedCount = secondaryHandling.Select(x => x.NoSatisfiedCount).Sum(),
  2281. NoEvaluateCount = secondaryHandling.Select(x => x.NoEvaluateCount).Sum(),
  2282. NoPutThroughCount = secondaryHandling.Select(x => x.NoPutThroughCount).Sum()
  2283. };
  2284. secondaryHandling.Add(total);
  2285. //区县合计
  2286. var countyList = secondaryHandling.Where(x => x.OrgType == EOrgType.County).ToList();
  2287. var countyTotal = new SecondaryHandlingSatisfactionVo
  2288. {
  2289. OrgId = "0",
  2290. OrgName = "区县合计",
  2291. TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
  2292. VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
  2293. SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
  2294. RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2295. DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2296. NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
  2297. NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
  2298. NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
  2299. };
  2300. secondaryHandling.Add(countyTotal);
  2301. //市直合计
  2302. var cityList = secondaryHandling.Where(x => x.OrgType == EOrgType.City).ToList();
  2303. var cityTotal = new SecondaryHandlingSatisfactionVo
  2304. {
  2305. OrgId = "0",
  2306. OrgName = "市直合计",
  2307. TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
  2308. VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
  2309. SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
  2310. RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2311. DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2312. NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
  2313. NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
  2314. NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
  2315. };
  2316. secondaryHandling.Add(cityTotal);
  2317. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2318. var dtos = secondaryHandling
  2319. .Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingSatisfactionVo), dynamicClass))
  2320. .Cast<object>()
  2321. .ToList();
  2322. var stream = ExcelHelper.CreateStream(dtos);
  2323. return ExcelStreamResult(stream, "二次办理满意度统计数据");
  2324. }
  2325. /// <summary>
  2326. /// 二次办理满意度明细
  2327. /// </summary>
  2328. /// <param name="dto"></param>
  2329. /// <returns></returns>
  2330. [HttpGet("secondary_handling_satisfaction_detail_report")]
  2331. public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingSatisfactionDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2332. {
  2333. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto, HttpContext.RequestAborted);
  2334. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  2335. return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
  2336. }
  2337. /// <summary>
  2338. /// 二次办理满意度明细导出
  2339. /// </summary>
  2340. /// <returns></returns>
  2341. [HttpPost("secondary_handling_satisfaction_detail_report/_export")]
  2342. public async Task<FileStreamResult> SecondaryHandlingSatisfactionDetailReport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2343. {
  2344. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto.QueryDto, HttpContext.RequestAborted);
  2345. List<OrderSecondaryHandling> secondaryHandling;
  2346. if (dto.IsExportAll)
  2347. {
  2348. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2349. }
  2350. else
  2351. {
  2352. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2353. secondaryHandling = items;
  2354. }
  2355. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
  2356. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2357. var dtos = secondaryHandlingDtos
  2358. .Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
  2359. .Cast<object>()
  2360. .ToList();
  2361. var stream = ExcelHelper.CreateStream(dtos);
  2362. return ExcelStreamResult(stream, "二次办理满意度列表数据");
  2363. }
  2364. /// <summary>
  2365. /// 未签收统计
  2366. /// </summary>
  2367. /// <param name="dto"></param>
  2368. /// <returns></returns>
  2369. [HttpGet("unsigned_order_report")]
  2370. public async Task<PagedDto<UnsignedOrderDto>> UnsignedOrderReport([FromQuery] QueryUnsignedOrdersRequest dto)
  2371. {
  2372. var query = _orderApplication.QueryUnsignedOrders(dto);
  2373. var (total, items) = await query.Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws }).ToPagedListAsync(dto, HttpContext.RequestAborted);
  2374. var itemsVo = _mapper.Map<IReadOnlyList<UnsignedOrderDto>>(items);
  2375. foreach (var item in itemsVo)
  2376. {
  2377. item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
  2378. }
  2379. return new PagedDto<UnsignedOrderDto>(total, itemsVo);
  2380. }
  2381. /// <summary>
  2382. /// 未签收统计导出
  2383. /// </summary>
  2384. /// <returns></returns>
  2385. [HttpPost("unsigned_order_report/_export")]
  2386. public async Task<FileStreamResult> UnsignedOrdersReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
  2387. {
  2388. var query = _orderApplication.QueryUnsignedOrders(dto.QueryDto).Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws });
  2389. List<UnsignedOrder> unsignedOrders;
  2390. if (dto.IsExportAll)
  2391. {
  2392. unsignedOrders = await query.ToListAsync(HttpContext.RequestAborted);
  2393. }
  2394. else
  2395. {
  2396. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2397. unsignedOrders = items;
  2398. }
  2399. var unsignedOrderDtos = _mapper.Map<ICollection<UnsignedOrderDto>>(unsignedOrders);
  2400. foreach (var item in unsignedOrderDtos)
  2401. {
  2402. item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
  2403. }
  2404. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2405. var dtos = unsignedOrderDtos
  2406. .Select(stu => _mapper.Map(stu, typeof(UnsignedOrderDto), dynamicClass))
  2407. .Cast<object>()
  2408. .ToList();
  2409. var stream = ExcelHelper.CreateStream(dtos);
  2410. return ExcelStreamResult(stream, "未签收统计列表数据");
  2411. }
  2412. /// <summary>
  2413. /// 信件来源统计
  2414. /// </summary>
  2415. /// <param name="dto"></param>
  2416. /// <returns></returns>
  2417. [HttpGet("order_source_report")]
  2418. public async Task<IReadOnlyList<OrderSourceVo>> QueryOrderSourceReport([FromQuery] QueryOrderSourceRequest dto)
  2419. {
  2420. var count = await _orderApplication.QueryOrderSource(dto).CountAsync();
  2421. var query = _orderApplication.QueryOrderSource(dto);
  2422. var items = await query.GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id), TotalSumCount = count }).ToListAsync(HttpContext.RequestAborted);
  2423. items.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
  2424. return items;
  2425. }
  2426. /// <summary>
  2427. /// 信件来源统计导出
  2428. /// </summary>
  2429. /// <returns></returns>
  2430. [HttpPost("order_source/_export")]
  2431. public async Task<FileStreamResult> QueryOrderSourceReport([FromBody] ExportExcelDto<QueryOrderSourceRequest> dto)
  2432. {
  2433. var count = await _orderApplication.QueryOrderSource(dto.QueryDto).CountAsync();
  2434. var query = _orderApplication.QueryOrderSource(dto.QueryDto).GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id), TotalSumCount = count });
  2435. List<OrderSourceVo> orderSources;
  2436. if (dto.IsExportAll)
  2437. {
  2438. orderSources = await query.ToListAsync(HttpContext.RequestAborted);
  2439. }
  2440. else
  2441. {
  2442. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2443. orderSources = items;
  2444. }
  2445. orderSources.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
  2446. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2447. var dtos = orderSources
  2448. .Select(stu => _mapper.Map(stu, typeof(OrderSourceVo), dynamicClass))
  2449. .Cast<object>()
  2450. .ToList();
  2451. var stream = ExcelHelper.CreateStream(dtos);
  2452. return ExcelStreamResult(stream, "信件来源统计数据");
  2453. }
  2454. /// <summary>
  2455. /// 信件来源统计列表
  2456. /// </summary>
  2457. /// <param name="dto"></param>
  2458. /// <returns></returns>
  2459. [HttpGet("order_source_report_list")]
  2460. public async Task<Object> QueryOrderSourceReportList([FromQuery] QueryOrderSourceRequest dto)
  2461. {
  2462. var item = await _orderRepository.OrderSource(dto);
  2463. var titleData = await _systemDicDataRepository.Queryable()
  2464. .Where(p => p.DicTypeCode == "SourceChannel")
  2465. .Select(p => new
  2466. {
  2467. Key = p.DicDataValue,
  2468. Value = p.DicDataName
  2469. }).ToListAsync();
  2470. return new { Item = item, TitleData = titleData };
  2471. }
  2472. /// <summary>
  2473. /// 信件来源统计导出
  2474. /// </summary>
  2475. /// <returns></returns>
  2476. [HttpPost("order_source_list/_export")]
  2477. public async Task<FileStreamResult> QueryOrderSourceListExport([FromBody] QueryOrderSourceRequest dto)
  2478. {
  2479. var dataTable = await _orderRepository.OrderSourceExport(dto);
  2480. var stream = ExcelHelper.CreateStream(dataTable);
  2481. return ExcelStreamResult(stream, "信件来源统计数据");
  2482. }
  2483. /// <summary>
  2484. /// 信件来源统计明细
  2485. /// </summary>
  2486. /// <param name="dto"></param>
  2487. /// <returns></returns>
  2488. [HttpGet("order_source_detail_report")]
  2489. public async Task<PagedDto<OrderDto>> QueryOrderSourceDetailReport([FromQuery] QueryOrderSourceDetailRequest dto)
  2490. {
  2491. var (total, items) = await _orderApplication.QueryOrderSourceDetail(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  2492. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2493. }
  2494. /// <summary>
  2495. /// 信件来源统计明细导出
  2496. /// </summary>
  2497. /// <returns></returns>
  2498. [HttpPost("order_source_detail/_export")]
  2499. public async Task<FileStreamResult> QueryOrderSourceDetailReport([FromBody] ExportExcelDto<QueryOrderSourceDetailRequest> dto)
  2500. {
  2501. var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
  2502. List<Order> orders;
  2503. if (dto.IsExportAll)
  2504. {
  2505. orders = await query.ToListAsync(HttpContext.RequestAborted);
  2506. }
  2507. else
  2508. {
  2509. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2510. orders = items;
  2511. }
  2512. var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
  2513. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2514. var dtos = ordersDtos
  2515. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  2516. .Cast<object>()
  2517. .ToList();
  2518. var stream = ExcelHelper.CreateStream(dtos);
  2519. return ExcelStreamResult(stream, "信件来源统计明细数据");
  2520. }
  2521. /// <summary>
  2522. /// 区域分时统计
  2523. /// </summary>
  2524. /// <param name="dto"></param>
  2525. /// <returns></returns>
  2526. [HttpGet("order_area_time")]
  2527. public async Task<object> OrderAreaTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  2528. {
  2529. var item = await _orderRepository.OrderAreaTime(dto);
  2530. var titleData = await _systemAreaRepository.Queryable()
  2531. .Where(p => p.Id.Length == 6 && p.Id != "510000")
  2532. .Select(p => new
  2533. {
  2534. Key = p.Id,
  2535. Value = p.AreaName
  2536. }).ToListAsync();
  2537. return new { Item = item, TitleData = titleData };
  2538. }
  2539. /// <summary>
  2540. /// 区域分时统计-导出
  2541. /// </summary>
  2542. /// <param name="dto"></param>
  2543. /// <returns></returns>
  2544. [HttpPost("order_area_time_export")]
  2545. public async Task<FileStreamResult> OrderAreaTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  2546. {
  2547. var dataTable = await _orderRepository.OrderAreaTimeExport(dto);
  2548. var stream = ExcelHelper.CreateStream(dataTable);
  2549. return ExcelStreamResult(stream, "区域分时统计数据");
  2550. }
  2551. /// <summary>
  2552. /// 热点类型分时统计
  2553. /// </summary>
  2554. /// <param name="dto"></param>
  2555. /// <returns></returns>
  2556. [HttpGet("order_hotspot_time")]
  2557. public async Task<object> OrderHotspotTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  2558. {
  2559. var item = await _orderRepository.OrderHotspotTime(dto);
  2560. var titleData = await _hotspotRepository.Queryable()
  2561. .Where(p => p.Id.Length == 2 && (p.ParentId == null || p.ParentId == ""))
  2562. .Select(p => new
  2563. {
  2564. Key = p.Id,
  2565. Value = p.HotSpotName
  2566. }).ToListAsync();
  2567. return new { Item = item, TitleData = titleData };
  2568. }
  2569. /// <summary>
  2570. /// 热点类型分时统计-导出
  2571. /// </summary>
  2572. /// <param name="dto"></param>
  2573. /// <returns></returns>
  2574. [HttpPost("order_hotspot_time_export")]
  2575. public async Task<FileStreamResult> OrderHotspotTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  2576. {
  2577. var dataTable = await _orderRepository.OrderHotspotTimeExport(dto);
  2578. var stream = ExcelHelper.CreateStream(dataTable);
  2579. return ExcelStreamResult(stream, "热点类型分时统计数据");
  2580. }
  2581. /// <summary>
  2582. /// 受理类型分时统计
  2583. /// </summary>
  2584. /// <param name="dto"></param>
  2585. /// <returns></returns>
  2586. [HttpGet("order_acceptance_time")]
  2587. public async Task<object> OrderAcceptanceTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  2588. {
  2589. var item = await _orderRepository.OrderAcceptanceTime(dto);
  2590. var titleData = await _systemDicDataRepository.Queryable()
  2591. .Where(p => p.DicTypeCode == "AcceptType")
  2592. .Select(p => new
  2593. {
  2594. Key = p.DicDataValue,
  2595. Value = p.DicDataName
  2596. }).ToListAsync();
  2597. return new { Item = item, TitleData = titleData };
  2598. }
  2599. /// <summary>
  2600. /// 受理类型分时统计-导出
  2601. /// </summary>
  2602. /// <param name="dto"></param>
  2603. /// <returns></returns>
  2604. [HttpPost("order_acceptance_time_export")]
  2605. public async Task<FileStreamResult> OrderAcceptanceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  2606. {
  2607. var dataTable = await _orderRepository.OrderAcceptanceTimeExport(dto);
  2608. var stream = ExcelHelper.CreateStream(dataTable);
  2609. return ExcelStreamResult(stream, "受理类型分时统计数据");
  2610. }
  2611. /// <summary>
  2612. /// 信件来源分时统计
  2613. /// </summary>
  2614. /// <param name="dto"></param>
  2615. /// <returns></returns>
  2616. [HttpGet("order_source_time")]
  2617. public async Task<object> OrderSourceTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  2618. {
  2619. var item = await _orderRepository.OrderSourceTime(dto);
  2620. var titleData = await _systemDicDataRepository.Queryable()
  2621. .Where(p => p.DicTypeCode == "SourceChannel")
  2622. .Select(p => new
  2623. {
  2624. Key = p.DicDataValue,
  2625. Value = p.DicDataName
  2626. }).ToListAsync();
  2627. return new { Item = item, TitleData = titleData };
  2628. }
  2629. /// <summary>
  2630. /// 信件来源分时统计-导出
  2631. /// </summary>
  2632. /// <param name="dto"></param>
  2633. /// <returns></returns>
  2634. [HttpPost("order_source_time_export")]
  2635. public async Task<FileStreamResult> OrderSourceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  2636. {
  2637. var dataTable = await _orderRepository.OrderSourceTimeExport(dto);
  2638. var stream = ExcelHelper.CreateStream(dataTable);
  2639. return ExcelStreamResult(stream, "信件来源分时统计数据");
  2640. }
  2641. /// <summary>
  2642. /// 部门满意度明细
  2643. /// </summary>
  2644. /// <param name="dto"></param>
  2645. /// <returns></returns>
  2646. [HttpGet("org-visitdetail-list")]
  2647. public async Task<PagedDto<OrgVisitDetailListResp>> OrgVisitDetailList([FromQuery] OrgVisitDetailListReq dto)
  2648. {
  2649. var query = _orderRepository.OrgVisitDetailList(dto);
  2650. var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  2651. return new PagedDto<OrgVisitDetailListResp>(total, _mapper.Map<IReadOnlyList<OrgVisitDetailListResp>>(items));
  2652. }
  2653. /// <summary>
  2654. /// 部门满意度明细导出
  2655. /// </summary>
  2656. /// <param name="dto"></param>
  2657. /// <returns></returns>
  2658. [HttpPost("org-visitdetail-list-export")]
  2659. public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
  2660. {
  2661. var query = _orderRepository.OrgVisitDetailList(dto.QueryDto);
  2662. List<OrderVisitDetail> orders;
  2663. if (dto.IsExportAll)
  2664. {
  2665. orders = await query.ToListAsync(HttpContext.RequestAborted);
  2666. }
  2667. else
  2668. {
  2669. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2670. orders = items;
  2671. }
  2672. var ordersDtos = _mapper.Map<ICollection<OrgVisitDetailListResp>>(orders);
  2673. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2674. var dtos = ordersDtos
  2675. .Select(stu => _mapper.Map(stu, typeof(OrgVisitDetailListResp), dynamicClass))
  2676. .Cast<object>()
  2677. .ToList();
  2678. var stream = ExcelHelper.CreateStream(dtos);
  2679. return ExcelStreamResult(stream, "部门满意度明细");
  2680. }
  2681. /// <summary>
  2682. /// 热点区域统计
  2683. /// </summary>
  2684. /// <param name="dto"></param>
  2685. /// <returns></returns>
  2686. [HttpGet("hotspot-area-statistics")]
  2687. public async Task<object> HotspotAndAreaStatistics([FromQuery] HotspotAndAreaStatisticsReq dto)
  2688. {
  2689. dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
  2690. var areaList = await _systemOrganizeRepository.Queryable().Where(x => SqlFunc.Length(x.Id) == 6).ToListAsync();
  2691. List<dynamic> list = new List<dynamic>();
  2692. foreach (var item in areaList)
  2693. {
  2694. var table = await _orderRepository.Queryable()
  2695. .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime < dto.EndTime && x.AreaCode.StartsWith(item.Id))
  2696. .GroupByIF(dto.HotspotLevel == 1, x => new
  2697. {
  2698. HotspotId = x.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2"))
  2699. })
  2700. .GroupByIF(dto.HotspotLevel == 2, x => new
  2701. {
  2702. HotspotId = x.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("4"))
  2703. })
  2704. .GroupByIF(dto.HotspotLevel == 3, x => new
  2705. {
  2706. HotspotId = x.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  2707. })
  2708. .GroupByIF(dto.HotspotLevel == 4, x => new
  2709. {
  2710. HotspotId = x.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("8"))
  2711. })
  2712. .Select(x => new
  2713. {
  2714. HotspotId = SqlFunc.IIF(dto.HotspotLevel == 1, x.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
  2715. SqlFunc.IIF(dto.HotspotLevel == 2, x.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("4")),
  2716. SqlFunc.IIF(dto.HotspotLevel == 3, x.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  2717. SqlFunc.IIF(dto.HotspotLevel == 4, x.HotspotId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("8")), "")))),
  2718. Key = item.Id,
  2719. AreaName = item.AreaName,
  2720. Count = 1//SqlFunc.AggregateSum(SqlFunc.IIF(x.Hotspot.))
  2721. }).ToPivotListAsync(x => x.Key, x => new { x.HotspotId, x.AreaName }, x => x.Sum(x => x.Count));
  2722. list.AddRange(table);
  2723. }
  2724. return new { AreaList = areaList, Data = list };
  2725. }
  2726. }
  2727. }