BiOrderController.cs 217 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536
  1. using Hotline.Application.ExportExcel;
  2. using Hotline.Application.FlowEngine;
  3. using Hotline.Application.Orders;
  4. using Hotline.Application.StatisticalReport;
  5. using Hotline.Application.Systems;
  6. using Hotline.Caching.Interfaces;
  7. using Hotline.CallCenter.Calls;
  8. using Hotline.FlowEngine.WorkflowModules;
  9. using Hotline.FlowEngine.Workflows;
  10. using Hotline.Orders;
  11. using Hotline.Repository.SqlSugar.Extensions;
  12. using Hotline.Schedulings;
  13. using Hotline.SeedData;
  14. using Hotline.Settings;
  15. using Hotline.Settings.Hotspots;
  16. using Hotline.Settings.TimeLimitDomain;
  17. using Hotline.Settings.TimeLimits;
  18. using Hotline.Share.Dtos;
  19. using Hotline.Share.Dtos.Bi;
  20. using Hotline.Share.Dtos.Bigscreen;
  21. using Hotline.Share.Dtos.CallCenter;
  22. using Hotline.Share.Dtos.Order;
  23. using Hotline.Share.Enums.CallCenter;
  24. using Hotline.Share.Enums.FlowEngine;
  25. using Hotline.Share.Enums.Order;
  26. using Hotline.Share.Requests;
  27. using Hotline.Tools;
  28. using MapsterMapper;
  29. using Microsoft.AspNetCore.Mvc;
  30. using SqlSugar;
  31. using System.Data;
  32. using XF.Domain.Authentications;
  33. using XF.Domain.Exceptions;
  34. using XF.Domain.Repository;
  35. using XF.Utility.EnumExtensions;
  36. namespace Hotline.Api.Controllers.Bi
  37. {
  38. public class BiOrderController : BaseController
  39. {
  40. private readonly IExportApplication _exportApplication;
  41. private readonly BaseDataApplication _baseDataApplication;
  42. private readonly IOrderRepository _orderRepository;
  43. private readonly IRepository<Hotspot> _hotspotTypeRepository;
  44. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  45. private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
  46. private readonly IRepository<OrderDelay> _orderDelayRepository;
  47. private readonly IMapper _mapper;
  48. private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
  49. private readonly IRepository<OrderSpecial> _orderSpecialRepository;
  50. private readonly IRepository<OrderVisit> _orderVisitRepository;
  51. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  52. private readonly IRepository<OrderPublish> _orderPublishRepository;
  53. private readonly ISystemOrganizeRepository _systemOrganizeRepository;
  54. private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
  55. private readonly ISessionContext _sessionContext;
  56. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  57. private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
  58. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  59. private readonly IRepository<WorkflowStep> _workflowStepRepository;
  60. private readonly IRepository<OrderScreen> _orderScreenRepository;
  61. private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
  62. private readonly IOrderApplication _orderApplication;
  63. private readonly IOrderVisitApplication _orderVisitApplication;
  64. //private readonly ITimeLimitDomainService _timeLimitDomainService;
  65. private readonly IOrderReportApplication _orderReportApplication;
  66. private readonly IRepository<SystemArea> _systemAreaRepository;
  67. private readonly IRepository<Hotspot> _hotspotRepository;
  68. private readonly IRepository<SystemDicData> _systemDicDataRepository;
  69. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  70. private readonly ICalcExpireTime _expireTime;
  71. private readonly IWorkflowApplication _workflowApplication;
  72. private readonly ISystemOrganizeRepository _organizeRepository;
  73. private readonly IRepository<CallNative> _callNativeRepository;
  74. public BiOrderController(
  75. IOrderRepository orderRepository,
  76. IRepository<Hotspot> hotspotTypeRepository,
  77. ISystemDicDataCacheManager sysDicDataCacheManager,
  78. IRepository<OrderVisitDetail> orderVisitDetailRepository,
  79. IRepository<OrderDelay> orderDelayRepository,
  80. IRepository<WorkflowCountersign> workflowCountersignRepository,
  81. IRepository<OrderSpecial> orderSpecialRepository,
  82. IMapper mapper,
  83. IRepository<OrderVisit> orderVisitRepository,
  84. IRepository<TrCallRecord> trCallRecordRepository,
  85. IRepository<OrderPublish> orderPublishRepository,
  86. ISystemOrganizeRepository systemOrganizeRepository,
  87. IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository,
  88. ISessionContext sessionContext,
  89. ISystemSettingCacheManager systemSettingCacheManager,
  90. IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
  91. IRepository<WorkflowTrace> workflowTraceRepository,
  92. IRepository<OrderScreen> orderScreenRepository,
  93. IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
  94. IOrderApplication orderApplication,
  95. //ITimeLimitDomainService timeLimitDomainService,
  96. IOrderReportApplication orderReportApplication,
  97. IRepository<SystemArea> systemAreaRepository,
  98. IRepository<Hotspot> hotspotRepository,
  99. IRepository<SystemDicData> systemDicDataRepository,
  100. ISystemDicDataCacheManager systemDicDataCacheManager,
  101. IRepository<WorkflowStep> workflowStepRepository,
  102. IWorkflowApplication workflowApplication,
  103. ICalcExpireTime expireTime,
  104. ISystemOrganizeRepository organizeRepository,
  105. BaseDataApplication baseDataApplication,
  106. IExportApplication exportApplication,
  107. IOrderVisitApplication orderVisitApplication,
  108. IRepository<CallNative> callNativeRepository)
  109. {
  110. _orderRepository = orderRepository;
  111. _hotspotTypeRepository = hotspotTypeRepository;
  112. _sysDicDataCacheManager = sysDicDataCacheManager;
  113. _orderVisitDetailRepository = orderVisitDetailRepository;
  114. _orderDelayRepository = orderDelayRepository;
  115. _workflowCountersignRepository = workflowCountersignRepository;
  116. _orderSpecialRepository = orderSpecialRepository;
  117. _mapper = mapper;
  118. _orderVisitRepository = orderVisitRepository;
  119. _trCallRecordRepository = trCallRecordRepository;
  120. _orderPublishRepository = orderPublishRepository;
  121. _systemOrganizeRepository = systemOrganizeRepository;
  122. _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
  123. _sessionContext = sessionContext;
  124. _systemSettingCacheManager = systemSettingCacheManager;
  125. _orderSpecialDetailRepository = orderSpecialDetailRepository;
  126. _workflowTraceRepository = workflowTraceRepository;
  127. _orderScreenRepository = orderScreenRepository;
  128. _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
  129. _orderApplication = orderApplication;
  130. //_timeLimitDomainService = timeLimitDomainService;
  131. _orderReportApplication = orderReportApplication;
  132. _systemAreaRepository = systemAreaRepository;
  133. _hotspotRepository = hotspotRepository;
  134. _systemDicDataRepository = systemDicDataRepository;
  135. _systemDicDataCacheManager = systemDicDataCacheManager;
  136. _workflowStepRepository = workflowStepRepository;
  137. _workflowApplication = workflowApplication;
  138. _expireTime = expireTime;
  139. _organizeRepository = organizeRepository;
  140. _baseDataApplication = baseDataApplication;
  141. _exportApplication = exportApplication;
  142. _orderVisitApplication = orderVisitApplication;
  143. _callNativeRepository = callNativeRepository;
  144. }
  145. /// <summary>
  146. /// 部门发布量统计
  147. /// </summary>
  148. /// <param name="dto"></param>
  149. /// <returns></returns>
  150. [HttpGet("published/statistics/department")]
  151. public async Task<PagedDto<PublishedOrderStatisticsDto>> QueryPublishedOrderDepartmentAsync([FromQuery] QueryOrderPublishStatisticsAllDto dto)
  152. {
  153. var (total, items) = await _orderApplication.QueryPublishedOrderDepartmentAsync(dto, false);
  154. return new PagedDto<PublishedOrderStatisticsDto>(total, _mapper.Map<IReadOnlyList<PublishedOrderStatisticsDto>>(items));
  155. }
  156. /// <summary>
  157. /// 部门发布量统计-导出
  158. /// </summary>
  159. /// <param name="dto"></param>
  160. /// <returns></returns>
  161. [HttpPost("published/statistics/department/export")]
  162. public async Task<FileStreamResult> ExportQueryPublishedOrderDepartmentAsync([FromBody] ExportExcelDto<QueryOrderPublishStatisticsAllDto> dto)
  163. {
  164. var (total, list) = await _orderApplication.QueryPublishedOrderDepartmentAsync(dto.QueryDto, dto.IsExportAll);
  165. if (list != null && list.Count > 0)
  166. {
  167. list.Add(new PublishedOrderStatisticsDto()
  168. {
  169. Name = "合计",
  170. PrivateCount = list.Sum(m => m.PrivateCount),
  171. // TotalCount = list.Sum(p => p.TotalCount),
  172. PublicCount = list.Sum(m => m.PublicCount),
  173. WaitCount = list.Sum(m => m.WaitCount)
  174. });
  175. }
  176. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  177. var dtos = list
  178. .Select(stu => _mapper.Map(stu, typeof(PublishedOrderStatisticsDto), dynamicClass))
  179. .Cast<object>()
  180. .ToList();
  181. var stream = ExcelHelper.CreateStream(dtos);
  182. return ExcelStreamResult(stream, "部门发布量统计");
  183. }
  184. /// <summary>
  185. /// 发布量统计
  186. /// </summary>
  187. /// <param name="dto"></param>
  188. /// <returns></returns>
  189. [HttpGet("published/statistics/user")]
  190. public async Task<PagedDto<PublishedOrderStatisticsDto>> QueryPublishedOrderUserAsync([FromQuery] QueryOrderPublishStatisticsDto dto)
  191. {
  192. var (total, list) = await _orderApplication.QueryPublishedOrderAsync(dto, false);
  193. return new PagedDto<PublishedOrderStatisticsDto>(total, _mapper.Map<IReadOnlyList<PublishedOrderStatisticsDto>>(list));
  194. }
  195. /// <summary>
  196. /// 发布量统计-导出
  197. /// </summary>
  198. /// <param name="dto"></param>
  199. /// <returns></returns>
  200. [HttpPost("published/statistics/user/export")]
  201. public async Task<FileStreamResult> ExportQueryPublishedOrder([FromBody] ExportExcelDto<QueryOrderPublishStatisticsDto> dto)
  202. {
  203. var (total, list) = await _orderApplication.QueryPublishedOrderAsync(dto.QueryDto, dto.IsExportAll);
  204. if (list != null && list.Count > 0)
  205. {
  206. list.Add(new PublishedOrderStatisticsDto()
  207. {
  208. Name = "合计",
  209. PrivateCount = list.Sum(m => m.PrivateCount),
  210. //TotalCount = list.Sum(p => p.TotalCount),
  211. PublicCount = list.Sum(m => m.PublicCount),
  212. WaitCount = list.Sum(m => m.WaitCount)
  213. });
  214. }
  215. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  216. var dtos = list
  217. .Select(stu => _mapper.Map(stu, typeof(PublishedOrderStatisticsDto), dynamicClass))
  218. .Cast<object>()
  219. .ToList();
  220. var stream = ExcelHelper.CreateStream(dtos);
  221. return ExcelStreamResult(stream, "发布量统计");
  222. }
  223. /// <summary>
  224. /// 发布量统计
  225. /// </summary>
  226. /// <param name="dto"></param>
  227. /// <returns></returns>
  228. [HttpGet("published/statistics")]
  229. public async Task<PublishedOrderStatisticsDto> QueryPublishedOrderAsync([FromQuery] QueryOrderPublishStatisticsAllDto dto)
  230. {
  231. var waitCount = await _orderRepository.Queryable()
  232. .Where(order => order.CreationTime >= dto.StartTime && order.CreationTime <= dto.EndTime)
  233. .Where(order => order.Status == EOrderStatus.Filed)
  234. .Select(order => SqlFunc.AggregateCount(order.Id))
  235. .FirstAsync();
  236. var publicCount = await _orderPublishRepository.Queryable()
  237. .Where(publish => publish.CreationTime >= dto.StartTime && publish.CreationTime <= dto.EndTime)
  238. .Where(publish => publish.PublishState == true)
  239. .Select(publish => SqlFunc.AggregateCount(publish.Id))
  240. .FirstAsync();
  241. var privateCount = await _orderPublishRepository.Queryable()
  242. .Where(publish => publish.CreationTime >= dto.StartTime && publish.CreationTime <= dto.EndTime)
  243. .Where(publish => publish.PublishState == false)
  244. .Select(publish => SqlFunc.AggregateCount(publish.Id))
  245. .FirstAsync();
  246. return new PublishedOrderStatisticsDto
  247. {
  248. // TotalCount = totalCount,
  249. PrivateCount = privateCount,
  250. PublicCount = publicCount,
  251. WaitCount = waitCount
  252. };
  253. }
  254. /// <summary>
  255. /// 回访来源统计
  256. /// </summary>
  257. /// <returns></returns>
  258. [HttpGet("visit/source")]
  259. public async Task<IList<OrderVisitSourceChannelDto>> QueryOrderVisitSourceChannelAsync([FromQuery] QueryOrderVisitSourceChannelDto dto)
  260. => await _orderApplication.QueryOrderVisitSourceChannelAsync(dto);
  261. /// <summary>
  262. /// 回访来源统计--导出
  263. /// </summary>
  264. /// <returns></returns>
  265. [HttpPost("visit/source/export")]
  266. public async Task<FileStreamResult> QueryOrderVisitSourceChannelExportAsync([FromBody] ExportExcelDto<QueryOrderVisitSourceChannelDto> dto)
  267. {
  268. var list = await _orderApplication.QueryOrderVisitSourceChannelAsync(dto.QueryDto);
  269. return _exportApplication.GetExcelFile(dto, list, "回访来源统计", "SourceChannel");
  270. }
  271. /// <summary>
  272. /// 回访量统计
  273. /// </summary>
  274. /// <returns></returns>
  275. [HttpGet("visit/quantity")]
  276. public async Task<IList<OrderVisitQuantityOutDto>> QueryOrderVisitQuantityAsync([FromQuery] QueryOrderVisitQuantity dto)
  277. => await _orderVisitApplication.QueryOrderVisitQuantityAsync(dto);
  278. /// <summary>
  279. /// 回访量统计--导出
  280. /// </summary>
  281. /// <returns></returns>
  282. [HttpPost("visit/quantity/export")]
  283. public async Task<FileStreamResult> QueryOrderVisitQuantityExportAsync([FromBody] ExportExcelDto<QueryOrderVisitQuantity> dto)
  284. {
  285. var items = await _orderVisitApplication.QueryOrderVisitQuantityAsync(dto.QueryDto);
  286. return _exportApplication.GetExcelFile(dto, items, "回访量统计");
  287. }
  288. /// <summary>
  289. /// 部门超期统计明细
  290. /// </summary>
  291. /// <param name="dto"></param>
  292. /// <returns></returns>
  293. [HttpGet("org_data_list_detail")]
  294. public async Task<PagedDto<OrderDto>> OrgDataListDetail([FromQuery] OrgDataListDetailRequest dto)
  295. {
  296. var quer = _orderApplication.QueryOrgDataListDetail(dto);
  297. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  298. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  299. }
  300. /// <summary>
  301. /// 部门超期统计明细导出
  302. /// </summary>
  303. /// <returns></returns>
  304. [HttpPost("org_data_list_detail/_export")]
  305. public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListDetailRequest> dto)
  306. {
  307. var query = _orderApplication.QueryOrgDataListDetail(dto.QueryDto);
  308. List<Order> data;
  309. if (dto.IsExportAll)
  310. {
  311. data = await query.ToListAsync(HttpContext.RequestAborted);
  312. }
  313. else
  314. {
  315. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  316. data = items;
  317. }
  318. var dataDtos = _mapper.Map<ICollection<OrderDto>>(data);
  319. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  320. var dtos = dataDtos
  321. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  322. .Cast<object>()
  323. .ToList();
  324. var stream = ExcelHelper.CreateStream(dtos);
  325. return ExcelStreamResult(stream, "部门超期统计明细数据");
  326. }
  327. /// <summary>
  328. /// 全量部门超期统计明细
  329. /// </summary>
  330. /// <param name="dto"></param>
  331. /// <returns></returns>
  332. [HttpGet("org_data_list_detail_all")]
  333. public async Task<PagedDto<OrderDto>> OrgDataListDetail([FromQuery] OrgDataListAllDetailRequest dto)
  334. {
  335. var quer = _orderApplication.QueryOrgDataListDetail(dto);
  336. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  337. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  338. }
  339. /// <summary>
  340. /// 部门超期统计明细导出
  341. /// </summary>
  342. /// <returns></returns>
  343. [HttpPost("org_data_list_detail_all/_export")]
  344. public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListAllDetailRequest> dto)
  345. {
  346. var query = _orderApplication.QueryOrgDataListDetail(dto.QueryDto);
  347. List<Order> data;
  348. if (dto.IsExportAll)
  349. {
  350. data = await query.ToListAsync(HttpContext.RequestAborted);
  351. }
  352. else
  353. {
  354. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  355. data = items;
  356. }
  357. var dataDtos = _mapper.Map<ICollection<OrderDto>>(data);
  358. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  359. var dtos = dataDtos
  360. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  361. .Cast<object>()
  362. .ToList();
  363. var stream = ExcelHelper.CreateStream(dtos);
  364. return ExcelStreamResult(stream, "部门超期统计明细数据");
  365. }
  366. /// <summary>
  367. /// 列表页面基础数据
  368. /// </summary>
  369. /// <returns></returns>
  370. [HttpGet("org_data_list_detail_all/base-data")]
  371. public async Task<object> BaseData()
  372. {
  373. var rsp = new
  374. {
  375. OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>()
  376. };
  377. return rsp;
  378. }
  379. /// <summary>
  380. /// 部门超期统计
  381. /// </summary>
  382. /// <param name="dto"></param>
  383. /// <returns></returns>
  384. [HttpGet("org_data_list")]
  385. public async Task<PagedDto<OrderBiOrgDataListVo>> OrgDataList([FromQuery] ReportPagedRequest dto)
  386. {
  387. var query = _orderApplication.QueryOrgDataList(dto);
  388. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  389. items.Add(new OrderBiOrgDataListVo
  390. {
  391. OrgName = "合计",
  392. HandlerExtendedNum = items.Select(s => s.HandlerExtendedNum).Sum(),
  393. CounterHandlerExtendedNum = items.Select(s => s.CounterHandlerExtendedNum).Sum(),
  394. NoHandlerExtendedNum = items.Select(s => s.NoHandlerExtendedNum).Sum(),
  395. CounterNoHandlerExtendedNum = items.Select(s => s.CounterNoHandlerExtendedNum).Sum(),
  396. });
  397. return new PagedDto<OrderBiOrgDataListVo>(total, items);
  398. }
  399. /// <summary>
  400. /// 部门超期统计导出
  401. /// </summary>
  402. /// <returns></returns>
  403. [HttpPost("org_data_list/_export")]
  404. public async Task<FileStreamResult> OrgDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
  405. {
  406. var query = _orderApplication.QueryOrgDataList(dto.QueryDto);
  407. List<OrderBiOrgDataListVo> data;
  408. data = await query.ToListAsync(HttpContext.RequestAborted);
  409. data.Add(new OrderBiOrgDataListVo
  410. {
  411. OrgName = "合计",
  412. HandlerExtendedNum = data.Select(s => s.HandlerExtendedNum).Sum(),
  413. CounterHandlerExtendedNum = data.Select(s => s.CounterHandlerExtendedNum).Sum(),
  414. NoHandlerExtendedNum = data.Select(s => s.NoHandlerExtendedNum).Sum(),
  415. CounterNoHandlerExtendedNum = data.Select(s => s.CounterNoHandlerExtendedNum).Sum(),
  416. });
  417. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  418. var dtos = data
  419. .Select(stu => _mapper.Map(stu, typeof(OrderBiOrgDataListVo), dynamicClass))
  420. .Cast<object>()
  421. .ToList();
  422. var stream = ExcelHelper.CreateStream(dtos);
  423. return ExcelStreamResult(stream, "部门超期统计数据");
  424. }
  425. /// <summary>
  426. /// 话务员办件统计
  427. /// </summary>
  428. /// <param name="dto"></param>
  429. /// <returns></returns>
  430. [HttpGet("centre_data_list")]
  431. public async Task<List<OrderBiCentreDataListVo>> CentreDataList([FromQuery] ReportPagedRequest dto)
  432. {
  433. var query = _orderApplication.CentreDataList(dto);
  434. var list = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
  435. return list;
  436. }
  437. /// <summary>
  438. /// 话务员办件统计--导出
  439. /// </summary>
  440. /// <param name="dto"></param>
  441. /// <returns></returns>
  442. [HttpPost("centre_data_list_export")]
  443. public async Task<FileStreamResult> CentreDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
  444. {
  445. var query = _orderApplication.CentreDataList(dto.QueryDto);
  446. List<OrderBiCentreDataListVo> data = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
  447. data.Add(new OrderBiCentreDataListVo
  448. {
  449. UserName = "合计",
  450. CentreArchive = data.Select(s => s.CentreArchive).Sum(),
  451. CentreCareOf = data.Select(s => s.CentreCareOf).Sum(),
  452. NoCentreCareOf = data.Select(s => s.NoCentreCareOf).Sum(),
  453. Invalid = data.Select(s => s.Invalid).Sum(),
  454. Repeat = data.Select(s => s.Repeat).Sum(),
  455. Subtotal = data.Select(s => s.Subtotal).Sum()
  456. });
  457. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  458. var dtos = data
  459. .Select(stu => _mapper.Map(stu, typeof(OrderBiCentreDataListVo), dynamicClass))
  460. .Cast<object>()
  461. .ToList();
  462. var stream = ExcelHelper.CreateStream(dtos);
  463. return ExcelStreamResult(stream, "话务员办件统计");
  464. }
  465. /// <summary>
  466. /// 热点数据小计统计
  467. /// </summary>
  468. /// <param name="dto"></param>
  469. /// <returns></returns>
  470. [HttpGet("hotspot_subtotal_data_list")]
  471. public async Task<PagedDto<HotspotDataLsitVo>> HotspotSubtotalDataLsit([FromQuery] HotspotSubtotalReportPagedRequest dto)
  472. {
  473. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  474. var query = _hotspotTypeRepository.Queryable(false, true)
  475. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotFullName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotFullName)) && o.IsDeleted == false)
  476. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
  477. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
  478. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  479. .Where((x, o) => x.ParentId == dto.Id)
  480. .Where((x, o) => x.IsDeleted == false)
  481. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  482. .Select((x, o) => new HotspotDataLsitVo
  483. {
  484. Id = x.Id,
  485. Name = x.HotSpotName,
  486. Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  487. }).MergeTable();
  488. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  489. return new PagedDto<HotspotDataLsitVo>(total, items);
  490. }
  491. /// <summary>
  492. /// 热点数据统计导出
  493. /// </summary>
  494. /// <param name="dto"></param>
  495. /// <returns></returns>
  496. [HttpPost("hotspot_data_list/export")]
  497. public async Task<FileStreamResult> HotspotDataLsitExprot([FromBody] ExportExcelDto<HotspotReportPagedRequest> dto)
  498. {
  499. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  500. if (dto.QueryDto.Type == 0 && (!dto.QueryDto.ChainStartTime.HasValue || !dto.QueryDto.ChainEndTime.HasValue)) throw UserFriendlyException.SameMessage("请选择环比时间!");
  501. dto.QueryDto.EndTime = dto.QueryDto.EndTime.Value.AddDays(1).AddSeconds(-1);
  502. var IsCenter = _sessionContext.OrgIsCenter;
  503. if (dto.QueryDto.Type == 0)
  504. {
  505. dto.QueryDto.ChainEndTime = dto.QueryDto.ChainEndTime.Value.AddDays(1).AddSeconds(-1);
  506. }
  507. var items = await _hotspotTypeRepository.Queryable(false, true)
  508. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  509. .WhereIF(dto.QueryDto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.QueryDto.StartTime)
  510. .WhereIF(dto.QueryDto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.QueryDto.EndTime)
  511. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Keyword), (x, o) => x.HotSpotName.Contains(dto.QueryDto.Keyword!))
  512. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  513. .Where((x, o) => x.ParentId == dto.QueryDto.Id)
  514. .Where((x, o) => x.IsDeleted == false)
  515. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  516. .Select((x, o) => new HotspotDataLsitVo
  517. {
  518. Id = x.Id,
  519. Name = x.HotSpotName,
  520. Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  521. Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.HotSpotName != o.HotspotName, 1, 0)) > 0,
  522. }).MergeTable().ToListAsync();
  523. var chainStartTime = dto.QueryDto.StartTime;
  524. var chainEndTime = dto.QueryDto.EndTime;
  525. switch (dto.QueryDto.Type)
  526. {
  527. case 1://日
  528. chainStartTime = dto.QueryDto.StartTime.Value.AddDays(-1);
  529. chainEndTime = dto.QueryDto.EndTime.Value.AddDays(-1);
  530. break;
  531. case 2://月
  532. chainStartTime = dto.QueryDto.StartTime.Value.AddMonths(-1);
  533. chainEndTime = dto.QueryDto.EndTime.Value.AddMonths(-1);
  534. break;
  535. case 3://年
  536. chainStartTime = dto.QueryDto.StartTime.Value.AddYears(-1);
  537. chainEndTime = dto.QueryDto.EndTime.Value.AddYears(-1);
  538. break;
  539. case 0:
  540. chainStartTime = dto.QueryDto.ChainStartTime.Value;
  541. chainEndTime = dto.QueryDto.ChainEndTime.Value;
  542. break;
  543. }
  544. var chainItems = await _hotspotTypeRepository.Queryable(false, true)
  545. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  546. .WhereIF(dto.QueryDto.StartTime.HasValue, (x, o) => o.CreationTime >= chainStartTime)
  547. .WhereIF(dto.QueryDto.EndTime.HasValue, (x, o) => o.CreationTime <= chainEndTime)
  548. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Keyword), (x, o) => x.HotSpotName.Contains(dto.QueryDto.Keyword!))
  549. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  550. .Where((x, o) => x.ParentId == dto.QueryDto.Id)
  551. .Where((x, o) => x.IsDeleted == false)
  552. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  553. .Select((x, o) => new
  554. {
  555. Id = x.Id,
  556. ChainNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  557. }).MergeTable().ToListAsync();
  558. var res = (from t1 in items
  559. join t2 in chainItems on t1.Id equals t2.Id into t1_t2
  560. from item in t1_t2.DefaultIfEmpty()
  561. select new HotspotDataLsitVo
  562. {
  563. Id = t1.Id,
  564. Name = t1.Name,
  565. Num = t1.Num,
  566. Sublevel = t1.Sublevel,
  567. Children = new List<HotspotDataLsitVo>(),
  568. ChainNum = t1_t2.Select(x => x.ChainNum).FirstOrDefault(),
  569. ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
  570. ((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%",
  571. }).ToList();
  572. var total = new HotspotDataLsitVo()
  573. {
  574. Id = "0",
  575. Name = "合计",
  576. Num = res.Sum(x => x.Num),
  577. Sublevel = false,
  578. Children = new List<HotspotDataLsitVo>(),
  579. ChainNum = res.Sum(x => x.ChainNum),
  580. 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%"
  581. };
  582. res.Add(total);
  583. List<HotspotDataLsitVo> data;
  584. data = res;
  585. var dataDtos = _mapper.Map<ICollection<HotspotDataLsitVo>>(data);
  586. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  587. var dtos = dataDtos
  588. .Select(stu => _mapper.Map(stu, typeof(HotspotDataLsitVo), dynamicClass))
  589. .Cast<object>()
  590. .ToList();
  591. var stream = ExcelHelper.CreateStream(dtos);
  592. return ExcelStreamResult(stream, "热点类型统计");
  593. //return new { List = res, Total = total };
  594. }
  595. /// <summary>
  596. /// 热点数据统计 TODO和前端沟通
  597. /// </summary>
  598. /// <param name="dto"></param>
  599. /// <returns></returns>
  600. [HttpGet("hotspot_data_list")]
  601. public async Task<object> HotspotDataLsit([FromQuery] HotspotReportPagedRequest dto)
  602. {
  603. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  604. if (dto.Type == 0 && (!dto.ChainStartTime.HasValue || !dto.ChainEndTime.HasValue)) throw UserFriendlyException.SameMessage("请选择环比时间!");
  605. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  606. var IsCenter = _sessionContext.OrgIsCenter;
  607. if (dto.Type == 0)
  608. {
  609. dto.ChainEndTime = dto.ChainEndTime.Value.AddDays(1).AddSeconds(-1);
  610. }
  611. var items = await _hotspotTypeRepository.Queryable(false, true)
  612. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  613. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
  614. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
  615. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  616. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  617. .Where((x, o) => x.ParentId == dto.Id)
  618. .Where((x, o) => x.IsDeleted == false)
  619. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  620. .Select((x, o) => new HotspotDataLsitVo
  621. {
  622. Id = x.Id,
  623. Name = x.HotSpotName,
  624. Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  625. Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.HotSpotName != o.HotspotName, 1, 0)) > 0,
  626. }).MergeTable().ToListAsync();
  627. var chainStartTime = dto.StartTime;
  628. var chainEndTime = dto.EndTime;
  629. switch (dto.Type)
  630. {
  631. case 1://日
  632. chainStartTime = dto.StartTime.Value.AddDays(-1);
  633. chainEndTime = dto.EndTime.Value.AddDays(-1);
  634. break;
  635. case 2://月
  636. chainStartTime = dto.StartTime.Value.AddMonths(-1);
  637. chainEndTime = dto.EndTime.Value.AddMonths(-1);
  638. break;
  639. case 3://年
  640. chainStartTime = dto.StartTime.Value.AddYears(-1);
  641. chainEndTime = dto.EndTime.Value.AddYears(-1);
  642. break;
  643. case 0:
  644. chainStartTime = dto.ChainStartTime.Value;
  645. chainEndTime = dto.ChainEndTime.Value;
  646. break;
  647. }
  648. var chainItems = await _hotspotTypeRepository.Queryable(false, true)
  649. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  650. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= chainStartTime)
  651. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= chainEndTime)
  652. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  653. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  654. .Where((x, o) => x.ParentId == dto.Id)
  655. .Where((x, o) => x.IsDeleted == false)
  656. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  657. .Select((x, o) => new
  658. {
  659. Id = x.Id,
  660. ChainNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  661. }).MergeTable().ToListAsync();
  662. var res = (from t1 in items
  663. join t2 in chainItems on t1.Id equals t2.Id into t1_t2
  664. from item in t1_t2.DefaultIfEmpty()
  665. select new HotspotDataLsitVo()
  666. {
  667. Id = t1.Id,
  668. Name = t1.Name,
  669. Num = t1.Num,
  670. Sublevel = t1.Sublevel,
  671. Children = new List<HotspotDataLsitVo>(),
  672. ChainNum = t1_t2.Select(x => x.ChainNum).FirstOrDefault(),
  673. ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
  674. ((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%",
  675. }).ToList();
  676. var total = new HotspotDataLsitVo()
  677. {
  678. Id = "0",
  679. Name = "合计",
  680. Num = res.Sum(x => x.Num),
  681. Sublevel = false,
  682. Children = new List<HotspotDataLsitVo>(),
  683. ChainNum = res.Sum(x => x.ChainNum),
  684. 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%"
  685. };
  686. return new { List = res, Total = total };
  687. }
  688. /// <summary>
  689. /// 部门不满意统计--导出
  690. /// </summary>
  691. /// <param name="dto"></param>
  692. /// <returns></returns>
  693. [HttpPost("visit-nosatisfied/export")]
  694. public async Task<FileStreamResult> ExportQueryVisitNoSatisfied([FromBody] QueryVisitNoSatisfiedDto dto)
  695. {
  696. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  697. if (dto.AddColumnName is null || dto.AddColumnName.Count == 0) throw UserFriendlyException.SameMessage("导出字段不能为空");
  698. if (dto.AddColumnName.FirstOrDefault() != "部门名称") throw UserFriendlyException.SameMessage("导出字段第一个必须是'部门名称'");
  699. var (dissatisfiedReason, list) = await _orderReportApplication.QueryVisitNoSatisfiedAsync(dto, _sessionContext.OrgIsCenter);
  700. var dataTable = await _orderReportApplication.ExportQueryVisitNoSatisfiedAsync(dissatisfiedReason, list, dto.AddColumnName);
  701. return ExcelStreamResult(ExcelHelper.CreateStream(dataTable), "回访不满意原因统计");
  702. }
  703. /// <summary>
  704. /// 部门不满意统计
  705. /// 已加验证部门
  706. /// </summary>
  707. /// <param name="dto"></param>
  708. /// <returns></returns>
  709. [HttpGet("visit-nosatisfied")]
  710. public async Task<object> QueryVisitNoSatisfied([FromQuery] QueryVisitNoSatiisfiedRequest dto)
  711. {
  712. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  713. var (dissatisfiedReason, list) = await _orderReportApplication
  714. .QueryVisitNoSatisfiedAsync(_mapper.Map<QueryVisitNoSatisfiedDto>(dto), _sessionContext.OrgIsCenter);
  715. return new { DicReason = dissatisfiedReason, Data = list };
  716. }
  717. /// <summary>
  718. /// 部门不满意统计明细
  719. /// </summary>
  720. /// <param name="dto"></param>
  721. /// <returns></returns>
  722. [HttpGet("visit-nosatisfied-detail")]
  723. public async Task<PagedDto<OrderVisitDetailDto>> BiQueryVisitNoSatisfiedDetail([FromQuery] BiQueryVisitNoSatisfiedDetailDto dto)
  724. {
  725. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  726. var IsCenter = _sessionContext.OrgIsCenter;
  727. var (total, items) = await _orderReportApplication.BiQueryVisitNoSatisfiedDetail(dto)
  728. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  729. return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
  730. }
  731. /// <summary>
  732. /// 部门不满意统计明细--导出
  733. /// </summary>
  734. /// <param name="dto"></param>
  735. /// <returns></returns>
  736. [HttpPost("visit-nosatisfied-detail-export")]
  737. public async Task<FileStreamResult> BiQueryVisitNoSatisfiedDetailExport([FromBody] ExportExcelDto<BiQueryVisitNoSatisfiedDetailDto> dto)
  738. {
  739. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  740. var query = _orderReportApplication.BiQueryVisitNoSatisfiedDetail(dto.QueryDto);
  741. List<OrderVisitDetail> data;
  742. if (dto.IsExportAll)
  743. {
  744. data = await query.ToListAsync(HttpContext.RequestAborted);
  745. }
  746. else
  747. {
  748. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  749. data = items;
  750. }
  751. var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
  752. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  753. var dtos = dataDtos
  754. .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
  755. .Cast<object>()
  756. .ToList();
  757. var stream = ExcelHelper.CreateStream(dtos);
  758. return ExcelStreamResult(stream, "部门不满意统计明细");
  759. }
  760. /// <summary>
  761. /// 部门延期统计
  762. /// </summary>
  763. /// <param name="dto"></param>
  764. /// <returns></returns>
  765. [HttpGet("order-delay-data-list")]
  766. public async Task<IReadOnlyList<BiOrderDelayDataDto>> QueryOrderDelayDataList([FromQuery] QueryOrderDelayDataListRequest dto)
  767. {
  768. return await _orderReportApplication.QueryOrderDelayDataList(dto).ToListAsync();
  769. }
  770. /// <summary>
  771. /// 部门延期统计---导出
  772. /// </summary>
  773. /// <param name="dto"></param>
  774. /// <returns></returns>
  775. [HttpPost("order-delay-data-list-export")]
  776. public async Task<FileStreamResult> ExportQueryOrderDelayDataList([FromBody] ExportExcelDto<QueryOrderDelayDataListRequest> dto)
  777. {
  778. var query = _orderReportApplication.QueryOrderDelayDataList(dto.QueryDto);
  779. List<BiOrderDelayDataDto> list;
  780. if (dto.IsExportAll)
  781. {
  782. list = await query.ToListAsync(HttpContext.RequestAborted);
  783. }
  784. else
  785. {
  786. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  787. list = items;
  788. }
  789. list.Add(new BiOrderDelayDataDto()
  790. {
  791. OrgName = "合计",
  792. OrgCode = "",
  793. AllTotal = list.Sum(p => p.AllTotal),
  794. PassTotal = list.Sum(p => p.PassTotal),
  795. NoPassTotal = list.Sum(p => p.NoPassTotal),
  796. ExaminingTotal = list.Sum(p => p.ExaminingTotal)
  797. });
  798. var orderDtos = _mapper.Map<ICollection<BiOrderDelayDataDto>>(list);
  799. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  800. var dtos = orderDtos
  801. .Select(stu => _mapper.Map(stu, typeof(BiOrderDelayDataDto), dynamicClass))
  802. .Cast<object>()
  803. .ToList();
  804. var stream = ExcelHelper.CreateStream(dtos);
  805. return ExcelStreamResult(stream, "部门延期统计数据");
  806. }
  807. /// <summary>
  808. /// 部门延期统计明细
  809. /// </summary>
  810. /// <param name="dto"></param>
  811. /// <returns></returns>
  812. [HttpGet("order-delay-data-detail")]
  813. public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetail([FromQuery] QueryOrderDelayDataDetailRequest dto)
  814. {
  815. var (total, items) = await _orderReportApplication.QueryOrderDelayDataDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  816. return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
  817. }
  818. /// <summary>
  819. /// 部门延期统计明细--导出
  820. /// </summary>
  821. /// <param name="dto"></param>
  822. /// <returns></returns>
  823. [HttpPost("order-delay-data-detail-export")]
  824. public async Task<FileStreamResult> ExportQueryOrderDelayDataDetail([FromBody] ExportExcelDto<QueryOrderDelayDataDetailRequest> dto)
  825. {
  826. var query = _orderReportApplication.QueryOrderDelayDataDetail(dto.QueryDto);
  827. List<OrderDelay> list;
  828. if (dto.IsExportAll)
  829. {
  830. list = await query.ToListAsync(HttpContext.RequestAborted);
  831. }
  832. else
  833. {
  834. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  835. list = items;
  836. }
  837. var orderDtos = _mapper.Map<ICollection<OrderDelayDto>>(list);
  838. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  839. var dtos = orderDtos
  840. .Select(stu => _mapper.Map(stu, typeof(OrderDelayDto), dynamicClass))
  841. .Cast<object>()
  842. .ToList();
  843. var stream = ExcelHelper.CreateStream(dtos);
  844. return ExcelStreamResult(stream, "部门延期统计明细数据");
  845. }
  846. /// <summary>
  847. /// 特提统计
  848. /// </summary>
  849. /// <param name="dto"></param>
  850. /// <returns></returns>
  851. [HttpGet("special_data_list")]
  852. public async Task<PagedDto<OrderBiSpecialListVo>> SpecialDataList([FromQuery] ReportPagedRequest dto)
  853. {
  854. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  855. var IsCenter = _sessionContext.OrgIsCenter;
  856. var query = _orderSpecialRepository.Queryable()
  857. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  858. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  859. .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.RequiredOrgId))
  860. .GroupBy(x => new { x.Cause })
  861. .Select(x => new OrderBiSpecialListVo
  862. {
  863. Cause = x.Cause,
  864. OrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  865. MaxSpecialTime = SqlFunc.AggregateMax(x.CreationTime),
  866. })
  867. .MergeTable();
  868. switch (dto.SortField)
  869. {
  870. case "cause":
  871. query = dto.SortRule is 0 ? query.OrderBy(x => x.Cause) : query.OrderByDescending(x => x.Cause);
  872. break;
  873. case "orderNum":
  874. query = dto.SortRule is 0 ? query.OrderBy(x => x.OrderNum) : query.OrderByDescending(x => x.OrderNum);
  875. break;
  876. case "maxSpecialTime":
  877. query = dto.SortRule is 0 ? query.OrderBy(x => x.MaxSpecialTime) : query.OrderByDescending(x => x.MaxSpecialTime);
  878. break;
  879. }
  880. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  881. return new PagedDto<OrderBiSpecialListVo>(total, items);
  882. }
  883. /// <summary>
  884. /// 获取工单特提信息列表
  885. /// </summary>
  886. /// <param name="dto"></param>
  887. /// <returns></returns>
  888. [HttpGet("special_data_list/list")]
  889. public async Task<PagedDto<OrderSpecialDto>> List([FromQuery] OrderSpecialListDto dto)
  890. {
  891. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  892. var IsCenter = _sessionContext.OrgIsCenter;
  893. var (total, items) = await _orderSpecialRepository.Queryable()
  894. .Includes(x => x.Order)
  895. .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
  896. x => x.Order.No.Contains(dto.Keyword!) || x.Order.Title.Contains(dto.Keyword!))
  897. .WhereIF(!string.IsNullOrEmpty(dto.Cause),
  898. x => x.Cause != null && x.Cause.Equals(dto.Cause))
  899. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  900. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  901. .WhereIF(dto.State.HasValue, x => x.State == dto.State)
  902. .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.OrgId))
  903. .OrderByDescending(x => x.CreationTime)
  904. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  905. return new PagedDto<OrderSpecialDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDto>>(items));
  906. }
  907. /// <summary>
  908. /// 受理类型前十
  909. /// </summary>
  910. /// <param name="dto"></param>
  911. /// <returns></returns>
  912. [HttpGet("accept_type_top10_list")]
  913. public async Task<object> AcceptTypeTop10List([FromQuery] ReportPagedRequest dto)
  914. {
  915. var (areaList, returnList,data) = await _orderApplication.AcceptTypeTop10List(dto,false);
  916. return new { List = areaList ,Data = returnList };
  917. }
  918. /// <summary>
  919. /// 受理类型前十导出
  920. /// </summary>
  921. /// <param name="dto"></param>
  922. /// <returns></returns>
  923. [HttpPost("accept_type_top10_list-export")]
  924. public async Task<FileStreamResult> AcceptTypeTop10ListExport([FromBody] ReportPagedRequest dto)
  925. {
  926. var (areaList, returnList,data) = await _orderApplication.AcceptTypeTop10List(dto,true);
  927. var stream = ExcelHelper.CreateStream(data);
  928. return ExcelStreamResult(stream, "受理类型前十统计");
  929. }
  930. /// <summary>
  931. /// 热点类型部门统计
  932. /// </summary>
  933. /// <param name="dto"></param>
  934. /// <returns></returns>
  935. [HttpGet("hotport-org-statistics")]
  936. public async Task<object> HotPortJoinOrgStatistics([FromQuery] HotPortJoinOrgStatisticsRequest dto)
  937. {
  938. var IsCenter = _sessionContext.OrgIsCenter;
  939. return await _orderRepository.HotPortJoinOrgStatistics(dto.StartTime, dto.EndTime, IsCenter, _sessionContext.OrgId);
  940. }
  941. /// <summary>
  942. /// 回访量统计
  943. /// </summary>
  944. /// <param name="StartTime"></param>
  945. /// <param name="EndTime"></param>
  946. /// <param name="VisitName"></param>
  947. /// <returns></returns>
  948. [HttpGet("visit-measure-statistics")]
  949. public async Task<VisitMeasureStatisticsDto> VisitMeasureStatistics(DateTime StartTime, DateTime EndTime, string? VisitName)
  950. {
  951. var list = await _orderVisitRepository.Queryable()
  952. .Includes(x => x.Employee)
  953. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState == EVisitState.Visited)
  954. .WhereIF(!string.IsNullOrEmpty(VisitName), x => x.Employee.Name.Contains(VisitName))
  955. .GroupBy(x => new { x.EmployeeId, x.Employee.Name })
  956. .Select(x => new VisitMeasureStatisticsModelDto()
  957. {
  958. VisitName = x.Employee.Name,
  959. CallVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType == EVisitType.CallVisit, 1, 0)),
  960. ArtificialVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType != EVisitType.CallVisit, 1, 0)),
  961. SumCount = SqlFunc.AggregateCount(x.EmployeeId)
  962. })
  963. .ToListAsync();
  964. var returnModel = new VisitMeasureStatisticsDto();
  965. returnModel.VisitMeasureStatisticsModelList = list;
  966. //查询AIVisit
  967. returnModel.AiVisitCount = await _aiOrderVisitDetailRepository.Queryable()
  968. .Where(x => x.AiVisitTime >= StartTime && x.AiVisitTime <= EndTime && x.IsSuccess != null).CountAsync();
  969. returnModel.AiVisitSatisfiedCount = await _aiOrderVisitDetailRepository.Queryable()
  970. //.Includes(x => x.OrderVisit)
  971. .Where(x => x.AiVisitTime >= StartTime && x.AiVisitTime <= EndTime && x.IsSuccess == true && SqlFunc.JsonField(x.AiOrgProcessingResults, "Key") == "4").CountAsync();
  972. returnModel.AiVisitNoSatisfiedCount = await _aiOrderVisitDetailRepository.Queryable()
  973. //.Includes(x => x.OrderVisit)
  974. .Where(x => x.AiVisitTime >= StartTime && x.AiVisitTime <= EndTime && x.IsSuccess == true && SqlFunc.JsonField(x.AiOrgProcessingResults, "Key") == "2").CountAsync();
  975. returnModel.AIVisitFailCount = await _aiOrderVisitDetailRepository.Queryable()
  976. .Where(x => x.AiVisitTime >= StartTime && x.AiVisitTime <= EndTime && x.IsSuccess == false).CountAsync();
  977. return returnModel;
  978. }
  979. /// <summary>
  980. /// 热点类型小类统计
  981. /// </summary>
  982. /// <param name="StartTime"></param>
  983. /// <param name="EndTime"></param>
  984. /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
  985. /// <returns></returns>
  986. [HttpGet("hotspot-statistics")]
  987. public async Task<object> HotspotStatistics(DateTime StartTime, DateTime EndTime, int TypeId, string? HotspotCode)
  988. {
  989. var IsCenter = _sessionContext.OrgIsCenter;
  990. if (string.IsNullOrEmpty(HotspotCode))
  991. {
  992. var list = await _hotspotTypeRepository.Queryable()
  993. .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
  994. .Where((it, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.Id != null)
  995. .WhereIF(TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
  996. .WhereIF(TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
  997. .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  998. .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")) })
  999. .Select((it, o) => new
  1000. {
  1001. HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
  1002. SumCount = SqlFunc.AggregateCount(it.HotSpotName)
  1003. })
  1004. .MergeTable()
  1005. .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
  1006. .Select((x, q) => new
  1007. {
  1008. HotspotCode = x.HotspotCode,
  1009. SumCount = x.SumCount,
  1010. HotspotName = q.HotSpotName,
  1011. HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.HotspotCode).Any()
  1012. })
  1013. .ToListAsync();
  1014. return list;
  1015. }
  1016. else
  1017. {
  1018. string count = (HotspotCode.Length + 2).ToString();
  1019. string countx = HotspotCode.Length.ToString();
  1020. var list = await _hotspotTypeRepository.Queryable()
  1021. .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
  1022. .Where((it, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && it.ParentId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(countx)) == HotspotCode)
  1023. .WhereIF(TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
  1024. .WhereIF(TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
  1025. .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  1026. .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
  1027. .Select((it, o) => new
  1028. {
  1029. HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  1030. SumCount = SqlFunc.AggregateCount(it.HotSpotName)
  1031. })
  1032. .MergeTable()
  1033. .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
  1034. .Select((x, q) => new
  1035. {
  1036. HotspotCode = x.HotspotCode,
  1037. SumCount = x.SumCount,
  1038. HotspotName = q.HotSpotName,
  1039. HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.HotspotCode).Any()
  1040. })
  1041. .ToListAsync();
  1042. return list;
  1043. }
  1044. }
  1045. /// <summary>
  1046. /// 部门满意度统计
  1047. /// </summary>
  1048. /// <param name="dto"></param>
  1049. /// <returns></returns>
  1050. [HttpGet("visit-org-satisfaction-statistics")]
  1051. public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgSatisfactionStatistics([FromQuery] PagedKeywordSonRequest dto)
  1052. {
  1053. var data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto);
  1054. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1055. {
  1056. OrgName = "区县合计",
  1057. TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1058. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1059. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1060. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1061. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1062. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1063. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1064. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1065. };
  1066. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1067. {
  1068. OrgName = "市直合计",
  1069. TotalSumCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  1070. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  1071. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  1072. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  1073. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  1074. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  1075. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  1076. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  1077. };
  1078. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1079. {
  1080. OrgName = "总计",
  1081. TotalSumCount = data.Sum(x => x.TotalSumCount),
  1082. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  1083. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  1084. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  1085. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  1086. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  1087. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  1088. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  1089. };
  1090. return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = data, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
  1091. }
  1092. /// <summary>
  1093. /// 部门满意度统计导出
  1094. /// </summary>
  1095. /// <param name="dto"></param>
  1096. /// <returns></returns>
  1097. [HttpPost("visit-org-satisfaction-statistics/_export")]
  1098. public async Task<FileStreamResult> VisitAndOrgSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
  1099. {
  1100. List<VisitAndOrgSatisfactionStatisticsDto> data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto.QueryDto);
  1101. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1102. {
  1103. OrgName = "区县合计",
  1104. TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1105. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1106. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1107. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1108. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1109. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1110. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1111. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1112. };
  1113. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1114. {
  1115. OrgName = "市直合计",
  1116. TotalSumCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  1117. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  1118. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  1119. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  1120. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  1121. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  1122. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  1123. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  1124. };
  1125. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1126. {
  1127. OrgName = "总计",
  1128. TotalSumCount = data.Sum(x => x.TotalSumCount),
  1129. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  1130. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  1131. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  1132. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  1133. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  1134. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  1135. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  1136. };
  1137. data.Add(countySumModel);
  1138. data.Add(citySumModel);
  1139. data.Add(sumModel);
  1140. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1141. var dtos = data
  1142. .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
  1143. .Cast<object>()
  1144. .ToList();
  1145. var stream = ExcelHelper.CreateStream(dtos);
  1146. return ExcelStreamResult(stream, "部门满意度统计数据");
  1147. }
  1148. /// <summary>
  1149. /// 子部门满意度明细
  1150. /// </summary>
  1151. /// <param name="dto"></param>
  1152. /// <returns></returns>
  1153. [HttpGet("visit-org-statisfaction-org-detail")]
  1154. public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgStatisfactionOrgDetail([FromQuery] PagedKeywordSonRequest dto)
  1155. {
  1156. var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto);
  1157. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1158. {
  1159. OrgName = "区县合计",
  1160. TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1161. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1162. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1163. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1164. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1165. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1166. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1167. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1168. };
  1169. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1170. {
  1171. OrgName = "市直合计",
  1172. TotalSumCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  1173. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  1174. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  1175. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  1176. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  1177. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  1178. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  1179. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  1180. };
  1181. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1182. {
  1183. OrgName = "总计",
  1184. TotalSumCount = list.Sum(x => x.TotalSumCount),
  1185. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  1186. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  1187. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  1188. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  1189. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  1190. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  1191. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  1192. };
  1193. return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = list, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
  1194. }
  1195. /// <summary>
  1196. /// 部门满意度统计导出
  1197. /// </summary>
  1198. /// <param name="dto"></param>
  1199. /// <returns></returns>
  1200. [HttpPost("visit-org-statisfaction-org-detail/_export")]
  1201. public async Task<FileStreamResult> VisitAndOrgStatisfactionOrgDetailExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
  1202. {
  1203. var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto.QueryDto);
  1204. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1205. {
  1206. OrgName = "区县合计",
  1207. TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1208. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1209. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1210. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1211. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1212. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1213. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1214. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1215. };
  1216. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1217. {
  1218. OrgName = "市直合计",
  1219. TotalSumCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  1220. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  1221. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  1222. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  1223. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  1224. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  1225. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  1226. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  1227. };
  1228. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1229. {
  1230. OrgName = "总计",
  1231. TotalSumCount = list.Sum(x => x.TotalSumCount),
  1232. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  1233. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  1234. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  1235. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  1236. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  1237. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  1238. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  1239. };
  1240. list.Add(countySumModel);
  1241. list.Add(citySumModel);
  1242. list.Add(sumModel);
  1243. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1244. var dtos = list
  1245. .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
  1246. .Cast<object>()
  1247. .ToList();
  1248. var stream = ExcelHelper.CreateStream(dtos);
  1249. return ExcelStreamResult(stream, "部门满意度统计数据");
  1250. }
  1251. /// <summary>
  1252. /// 部门满意度明细
  1253. /// </summary>
  1254. /// <param name="dto"></param>
  1255. /// <returns></returns>
  1256. [HttpGet("visit-org-satisfaction-detail")]
  1257. public async Task<PagedDto<OrgVisitDetailListResp>> VisitAndOrgSatisfactionDetail([FromQuery] VisitAndOrgSatisfactionDetailDto dto)
  1258. {
  1259. //var (total, items) = await _orderApplication.VisitAndOrgSatisfactionDetail(dto)
  1260. var (total, items) = await _orderRepository.VisitAndOrgSatisfactionDetail(dto)
  1261. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1262. return new PagedDto<OrgVisitDetailListResp>(total, _mapper.Map<IReadOnlyList<OrgVisitDetailListResp>>(items));
  1263. }
  1264. /// <summary>
  1265. /// 部门满意度明细导出
  1266. /// </summary>
  1267. /// <param name="dto"></param>
  1268. /// <returns></returns>
  1269. [HttpPost("visit-org-satisfaction-detail/_export")]
  1270. public async Task<FileStreamResult> VisitAndOrgSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndOrgSatisfactionDetailDto> dto)
  1271. {
  1272. var query = _orderRepository.VisitAndOrgSatisfactionDetail(dto.QueryDto);
  1273. List<OrgVisitDetailListResp> data;
  1274. if (dto.IsExportAll)
  1275. {
  1276. data = await query.ToListAsync(HttpContext.RequestAborted);
  1277. }
  1278. else
  1279. {
  1280. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1281. data = items;
  1282. }
  1283. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1284. var dtos = data
  1285. .Select(stu => _mapper.Map(stu, typeof(OrgVisitDetailListResp), dynamicClass))
  1286. .Cast<object>()
  1287. .ToList();
  1288. var stream = ExcelHelper.CreateStream(dtos);
  1289. return ExcelStreamResult(stream, "部门满意度明细数据");
  1290. }
  1291. /// <summary>
  1292. /// 中心报表统计--宜宾
  1293. /// </summary>
  1294. /// <param name="StartTime"></param>
  1295. /// <param name="EndTime"></param>
  1296. /// <returns></returns>
  1297. [HttpGet("center_report_forms_statistics")]
  1298. public async Task<CenterReportStatisticsDto> CenterReportFormsStatistics(DateTime StartTime, DateTime EndTime)
  1299. {
  1300. CenterReportStatisticsDto centerReportStatisticsDto = new();
  1301. //信件总量
  1302. int sourceChannelCount = await _orderRepository.Queryable().Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime).CountAsync();
  1303. #region 通话记录
  1304. //通话记录
  1305. var callData = await _trCallRecordRepository.Queryable()
  1306. .Where(p => p.CreatedTime >= StartTime && p.CreatedTime <= EndTime && p.Gateway != "82826886" && SqlFunc.Length(p.Gateway) != 4)
  1307. .Select(o => new CenterReportCallDto
  1308. {
  1309. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.On, 1, 0)),//有效
  1310. InvalidCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.NoOn /*&& o.BeginIvrTime.HasValue && o.BeginQueueTime.HasValue && o.BeginRingTime.HasValue*/, 1, 0)), //无效(排除队列挂断和IVR挂断)
  1311. QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.QueueTims > 0 && o.RingTimes == 0 && o.OnState == EOnState.NoOn, 1, 0)), //队列挂断
  1312. 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挂断
  1313. })
  1314. .FirstAsync();
  1315. if (callData != null)
  1316. callData.InvalidCount = callData.InvalidCount - callData.QueueByeCount - callData.IvrByeCount;
  1317. centerReportStatisticsDto.CenterReportCall = callData;
  1318. #endregion
  1319. #region 工单
  1320. //工单
  1321. var orderData = await _orderRepository.Queryable()
  1322. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1323. .Select(x => new CenterReportOrderDto
  1324. {
  1325. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  1326. InvalidCount = 0,
  1327. CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),
  1328. InProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed, 1, 0))
  1329. })
  1330. .FirstAsync();
  1331. centerReportStatisticsDto.CenterReportOrder = orderData;
  1332. #endregion
  1333. #region 信件来源
  1334. //信件来源
  1335. var sourceChannelData = await _orderRepository.Queryable()
  1336. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1337. .Select(it => new
  1338. {
  1339. SourceChannelCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.SourceChannelCode), "QT", it.SourceChannelCode)
  1340. })
  1341. .MergeTable()//将查询出来的结果合并成一个新表
  1342. .GroupBy(it => new { it.SourceChannelCode })//对新表进行分组
  1343. .Select(it => new CenterReportOrderSourceChannelDto
  1344. {
  1345. Code = it.SourceChannelCode,
  1346. CountNum = SqlFunc.AggregateCount(it.SourceChannelCode)
  1347. })
  1348. .ToListAsync();
  1349. List<CenterReportOrderSourceChannelDto> sourceChannel = new()
  1350. {
  1351. new CenterReportOrderSourceChannelDto
  1352. {
  1353. Name = "来源总量",
  1354. Code = "All",
  1355. CountNum = sourceChannelCount
  1356. }
  1357. };
  1358. var sourceChannelDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SourceChannel);
  1359. foreach (var item in sourceChannelDic)
  1360. {
  1361. sourceChannel.Add(new CenterReportOrderSourceChannelDto
  1362. {
  1363. Name = item.DicDataName,
  1364. Code = item.DicTypeCode,
  1365. CountNum = sourceChannelData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
  1366. });
  1367. }
  1368. centerReportStatisticsDto.CenterReportOrderSourceChannels = sourceChannel;
  1369. #endregion
  1370. #region 信件分类
  1371. //信件来源
  1372. var acceptTypeData = await _orderRepository.Queryable(false, false, false)
  1373. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1374. .Select(it => new
  1375. {
  1376. AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode)
  1377. })
  1378. .MergeTable()//将查询出来的结果合并成一个新表
  1379. .GroupBy(it => new { it.AcceptTypeCode })//对新表进行分组
  1380. .Select(it => new CenterReportOrderSourceChannelDto
  1381. {
  1382. Code = it.AcceptTypeCode,
  1383. CountNum = SqlFunc.AggregateCount(it.AcceptTypeCode)
  1384. })
  1385. .ToListAsync();
  1386. List<CenterReportOrderSourceChannelDto> acceptType = new();
  1387. var acceptTypeDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType);
  1388. foreach (var item in acceptTypeDic)
  1389. {
  1390. acceptType.Add(new CenterReportOrderSourceChannelDto
  1391. {
  1392. AllCountNum = sourceChannelCount,
  1393. Name = item.DicDataName,
  1394. Code = item.DicTypeCode,
  1395. CountNum = acceptTypeData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
  1396. });
  1397. }
  1398. centerReportStatisticsDto.CenterReportOrderAcceptTypes = acceptType;
  1399. #endregion
  1400. #region 信件回访量
  1401. //信件回访量
  1402. CenterReportVisitdDto centerReportVisitd = new()
  1403. {
  1404. Visitd = await _orderVisitRepository.Queryable()
  1405. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState == EVisitState.Visited).CountAsync(),
  1406. WaitVisitd = await _orderVisitRepository.Queryable()
  1407. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited).CountAsync()
  1408. };
  1409. //部门
  1410. var listOrg = await _orderVisitDetailRepository.Queryable()
  1411. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  1412. .Where((it, o) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  1413. .Select((it, o) => new Satisfaction
  1414. {
  1415. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
  1416. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 0, 1)),
  1417. })
  1418. .ToListAsync();
  1419. if (listOrg != null && listOrg.Count > 0)
  1420. {
  1421. var SatisfiedCount = listOrg[0].Satisfied + listOrg[0].Satisfied;
  1422. if (SatisfiedCount > 0 && listOrg[0].Satisfied > 0)
  1423. centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)SatisfiedCount) * 100, 2);
  1424. }
  1425. //if (centerReportVisitd.Visitd > 0 && listOrg != null && listOrg.Count > 0 && listOrg[0].Satisfied > 0)
  1426. //centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
  1427. //坐席
  1428. var listSet = await _orderVisitDetailRepository.Queryable()
  1429. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  1430. .Where((it, o) => it.VisitTarget == EVisitTarget.Seat && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  1431. .Select((it, o) => new Satisfaction
  1432. {
  1433. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
  1434. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
  1435. }).ToListAsync();
  1436. if (listSet != null && listSet.Count > 0)
  1437. {
  1438. var SatisfiedCount = listSet[0].Satisfied + listSet[0].Satisfied;
  1439. if (SatisfiedCount > 0 && listSet[0].Satisfied > 0)
  1440. centerReportVisitd.OrgRate = Math.Round((listSet[0].Satisfied / (double)SatisfiedCount) * 100, 2);
  1441. }
  1442. //if (centerReportVisitd.Visitd > 0 && listSet != null && listSet.Count > 0 && listSet[0].Satisfied > 0)
  1443. // centerReportVisitd.SeatsRate = Math.Round((listSet[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
  1444. centerReportStatisticsDto.CenterReportVisitd = centerReportVisitd;
  1445. #endregion
  1446. #region 信件分布情况
  1447. //市直部门
  1448. var listOrgStatisticsCityAll = await _orderRepository.Queryable()
  1449. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  1450. .Select(o => new
  1451. {
  1452. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  1453. })
  1454. .MergeTable()
  1455. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  1456. .Where((o, s) => s.OrgType == EOrgType.City || s.OrgType == EOrgType.Province)
  1457. .GroupBy((o, s) => new
  1458. {
  1459. o.OrgCode,
  1460. s.Name
  1461. })
  1462. .Select((o, s) => new OrgStatistics
  1463. {
  1464. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  1465. OrgName = s.Name
  1466. }).ToListAsync();
  1467. centerReportStatisticsDto.OrgStatisticsCityAll = new OrgStatisticsAll
  1468. {
  1469. OrgStatistics = listOrgStatisticsCityAll
  1470. };
  1471. //区县部门
  1472. var listOrgStatisticsAreaAll = await _orderRepository.Queryable()
  1473. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  1474. .Select(o => new
  1475. {
  1476. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  1477. })
  1478. .MergeTable()
  1479. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  1480. .Where((o, s) => s.OrgType == EOrgType.County)
  1481. .GroupBy((o, s) => new
  1482. {
  1483. o.OrgCode,
  1484. s.Name
  1485. })
  1486. .Select((o, s) => new OrgStatistics
  1487. {
  1488. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  1489. OrgName = s.Name
  1490. }).ToListAsync();
  1491. centerReportStatisticsDto.OrgStatisticsAreaAll = new OrgStatisticsAll
  1492. {
  1493. OrgStatistics = listOrgStatisticsAreaAll
  1494. };
  1495. #endregion
  1496. return centerReportStatisticsDto;
  1497. }
  1498. /// <summary>
  1499. /// 中心报表统计--自贡
  1500. /// </summary>
  1501. /// <param name="StartTime"></param>
  1502. /// <param name="EndTime"></param>
  1503. /// <returns></returns>
  1504. [HttpGet("center_report_forms_statistics_zg")]
  1505. public async Task<CenterReportStatisticsDto> ZgCenterReportFormsStatistics(DateTime StartTime, DateTime EndTime)
  1506. {
  1507. CenterReportStatisticsDto centerReportStatisticsDto = new();
  1508. //信件总量
  1509. int sourceChannelCount = await _orderRepository.Queryable().Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime).CountAsync();
  1510. #region 1、通话记录
  1511. //通话记录
  1512. var callData = await _callNativeRepository.Queryable()
  1513. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1514. // .Where(p => p.Gateway != "82826886" && SqlFunc.Length(p.Gateway) != 4)
  1515. .Select(p => new CenterReportCallInfoDto
  1516. {
  1517. AllCallCount = SqlFunc.AggregateSum(1),//话务总量
  1518. InTotal = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In, 1, 0)),//呼入总量
  1519. InConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.AnsweredTime != null, 1, 0)),//呼入接通量
  1520. InHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.AnsweredTime == null, 1, 0)),//呼入未接通
  1521. QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.WaitDuration > 0 && p.RingDuration == 0 && p.AnsweredTime == null, 1, 0)), //队列挂断
  1522. IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.BeginIvrTime.HasValue && !p.BeginQueueTime.HasValue && !p.BeginRingTime.HasValue && p.AnsweredTime == null, 1, 0)), //IVR挂断
  1523. OutTotal = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.Out, 1, 0)),//呼出总量
  1524. OutConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(p.TelNo != "0" && p.Direction == ECallDirection.Out && p.AnsweredTime != null, 1, 0)),//呼出接通量
  1525. OutHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(p.TelNo != "0" && p.Direction == ECallDirection.Out && p.AnsweredTime == null, 1, 0)),//呼出未接通
  1526. })
  1527. .FirstAsync();
  1528. centerReportStatisticsDto.CenterReportCallInfoDto = callData;
  1529. #endregion
  1530. #region 2、信件回访量
  1531. //信件回访量
  1532. var centerReportVisitd = await _orderVisitRepository.Queryable()
  1533. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime)
  1534. .Select(x => new CenterReportVisitdDto
  1535. {
  1536. Visitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited, 1, 0)),//已回访
  1537. CallVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType == EVisitType.CallVisit, 1, 0)),// 已回访--电话
  1538. SmsVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType == EVisitType.SmsVisit, 1, 0)),//已回访--短信
  1539. OtherVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType != EVisitType.CallVisit && x.VisitType != EVisitType.SmsVisit, 1, 0)),//其他回访
  1540. WaitVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited, 1, 0)),//待回访
  1541. }).FirstAsync();
  1542. //部门
  1543. var listOrg = await _orderVisitDetailRepository.Queryable()
  1544. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  1545. .Where((it, o) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  1546. .Select((it, o) => new Satisfaction
  1547. {
  1548. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
  1549. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 0, 1)),
  1550. })
  1551. .FirstAsync();
  1552. //计算部门满意度
  1553. if (listOrg != null)
  1554. {
  1555. var satisfiedCount = listOrg.Satisfied + listOrg.Dissatisfied;
  1556. if (satisfiedCount > 0 && listOrg.Satisfied > 0)
  1557. centerReportVisitd.OrgRate = Math.Round((listOrg.Satisfied / (double)satisfiedCount) * 100, 2);
  1558. }
  1559. //坐席
  1560. var listSet = await _orderVisitDetailRepository.Queryable()
  1561. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  1562. .Where((it, o) => it.VisitTarget == EVisitTarget.Seat && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  1563. .Select((it, o) => new Satisfaction
  1564. {
  1565. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
  1566. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
  1567. })
  1568. .FirstAsync();
  1569. //计算坐席满意度
  1570. if (listSet != null)
  1571. {
  1572. var satisfiedCount = listSet.Satisfied + listSet.Dissatisfied;
  1573. if (satisfiedCount > 0 && listSet.Satisfied > 0)
  1574. centerReportVisitd.OrgRate = Math.Round((listSet.Satisfied / (double)satisfiedCount) * 100, 2);
  1575. }
  1576. centerReportStatisticsDto.CenterReportVisitd = centerReportVisitd;
  1577. #endregion
  1578. #region 3、工单
  1579. //工单
  1580. var orderData = await _orderRepository.Queryable()
  1581. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1582. .Select(x => new CenterReportOrderDto
  1583. {
  1584. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),//有效
  1585. InvalidCount = 0,//无效
  1586. CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),//已办结
  1587. OnTimeCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.ActualHandleTime, 1, 0)),//按时办结
  1588. CenterCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ProcessType == EProcessType.Zhiban, 1, 0)),//中心办结
  1589. OrgCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ProcessType == EProcessType.Jiaoban, 1, 0)),//部门办结
  1590. InProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed, 1, 0)),//在办
  1591. CenterInProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed && x.ProcessType == EProcessType.Zhiban, 1, 0)),//中心在办
  1592. OrgInProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed && x.ProcessType == EProcessType.Jiaoban, 1, 0))//部门在办
  1593. })
  1594. .FirstAsync();
  1595. centerReportStatisticsDto.CenterReportOrder = orderData;
  1596. #endregion
  1597. #region 4、信件来源
  1598. //信件来源
  1599. var sourceChannelData = _orderRepository.Queryable()
  1600. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1601. .Select(it => new
  1602. {
  1603. SourceChannelCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.SourceChannelCode), "QT", it.SourceChannelCode)
  1604. })
  1605. .MergeTable()//将查询出来的结果合并成一个新表
  1606. .GroupBy(it => new { it.SourceChannelCode })//对新表进行分组
  1607. .Select(it => new CenterReportOrderSourceChannelDto
  1608. {
  1609. Code = it.SourceChannelCode,
  1610. CountNum = SqlFunc.AggregateCount(it.SourceChannelCode)
  1611. });
  1612. var sourceData = await _systemDicDataRepository.Queryable()
  1613. .LeftJoin(sourceChannelData, (s, p) => s.DicDataValue == p.Code)
  1614. .Where((s, p) => s.DicTypeCode == "SourceChannel" && s.IsShow == true)
  1615. .Select((s, p) => new CenterReportOrderSourceChannelDto
  1616. {
  1617. Code = s.DicDataValue,
  1618. Name = s.DicDataName,
  1619. CountNum = p.CountNum
  1620. })
  1621. .ToListAsync();
  1622. centerReportStatisticsDto.CenterReportOrderSourceChannels = sourceData;
  1623. #endregion
  1624. #region 5、信件分类
  1625. //信件来源 AcceptType
  1626. var acceptTypeData = _orderRepository.Queryable(false, false, false)
  1627. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  1628. .Select(it => new
  1629. {
  1630. AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode)
  1631. })
  1632. .MergeTable()//将查询出来的结果合并成一个新表
  1633. .GroupBy(it => new { it.AcceptTypeCode })//对新表进行分组
  1634. .Select(it => new CenterReportOrderSourceChannelDto
  1635. {
  1636. Code = it.AcceptTypeCode,
  1637. CountNum = SqlFunc.AggregateCount(it.AcceptTypeCode)
  1638. });
  1639. var acceptType = await _systemDicDataRepository.Queryable()
  1640. .LeftJoin(acceptTypeData, (s, p) => s.DicDataValue == p.Code)
  1641. .Where((s, p) => s.DicTypeCode == "AcceptType" && s.IsShow == true)
  1642. .Select((s, p) => new CenterReportOrderSourceChannelDto
  1643. {
  1644. AllCountNum = sourceChannelCount,
  1645. Code = s.DicDataValue,
  1646. Name = s.DicDataName,
  1647. CountNum = p.CountNum
  1648. })
  1649. .ToListAsync();
  1650. centerReportStatisticsDto.CenterReportOrderAcceptTypes = acceptType;
  1651. #endregion
  1652. #region 信件分布情况
  1653. //市直部门
  1654. var listOrgStatisticsCityAll = await _orderRepository.Queryable()
  1655. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  1656. .Select(o => new
  1657. {
  1658. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  1659. })
  1660. .MergeTable()
  1661. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  1662. .Where((o, s) => s.OrgType == EOrgType.City || s.OrgType == EOrgType.Province)
  1663. .GroupBy((o, s) => new
  1664. {
  1665. o.OrgCode,
  1666. s.Name
  1667. })
  1668. .Select((o, s) => new OrgStatistics
  1669. {
  1670. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  1671. OrgName = s.Name
  1672. }).ToListAsync();
  1673. centerReportStatisticsDto.OrgStatisticsCityAll = new OrgStatisticsAll
  1674. {
  1675. OrgStatistics = listOrgStatisticsCityAll
  1676. };
  1677. //区县部门
  1678. var listOrgStatisticsAreaAll = await _orderRepository.Queryable()
  1679. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  1680. .Select(o => new
  1681. {
  1682. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  1683. })
  1684. .MergeTable()
  1685. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  1686. .Where((o, s) => s.OrgType == EOrgType.County)
  1687. .GroupBy((o, s) => new
  1688. {
  1689. o.OrgCode,
  1690. s.Name
  1691. })
  1692. .Select((o, s) => new OrgStatistics
  1693. {
  1694. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  1695. OrgName = s.Name
  1696. }).ToListAsync();
  1697. centerReportStatisticsDto.OrgStatisticsAreaAll = new OrgStatisticsAll
  1698. {
  1699. OrgStatistics = listOrgStatisticsAreaAll
  1700. };
  1701. #endregion
  1702. return centerReportStatisticsDto;
  1703. }
  1704. /// <summary>
  1705. /// 部门受理类型统计周期
  1706. /// </summary>
  1707. /// <param name="dto"></param>
  1708. /// <returns></returns>
  1709. [HttpGet("department_acceptance_type_statistics")]
  1710. public async Task<object> DepartmentAcceptanceTypeStatistics([FromQuery] DepartmentKeyWordRequest dto)
  1711. {
  1712. var items = await _orderReportApplication.DepartmentAcceptanceTypeStatistics(dto).ToListAsync();
  1713. foreach (var item in items)
  1714. {
  1715. item.ZxAllTimes = Math.Round(((double)item.ZxAllTimes / 3600), 2);
  1716. item.JyAllTimes = Math.Round(((double)item.JyAllTimes / 3600), 2);
  1717. item.QzAllTimes = Math.Round(((double)item.QzAllTimes / 3600), 2);
  1718. item.ByAllTimes = Math.Round(((double)item.ByAllTimes / 3600), 2);
  1719. item.JbAllTimes = Math.Round(((double)item.JbAllTimes / 3600), 2);
  1720. item.TsAllTimes = Math.Round(((double)item.TsAllTimes / 3600), 2);
  1721. item.QtAllTimes = Math.Round(((double)item.QtAllTimes / 3600), 2);
  1722. item.YjAllTimes = Math.Round(((double)item.YjAllTimes / 3600), 2);
  1723. }
  1724. var total = new DepartmentAcceptanceTypeStatisticsDto
  1725. {
  1726. OrgName = "合计",
  1727. OrgCode = "",
  1728. OrgType = "",
  1729. ZxAllCount = items.Sum(p => p.ZxAllCount),
  1730. ZxAllTimes = Math.Round(items.Sum(p => p.ZxAllTimes).Value, 2),
  1731. ZxAcceptanceTypeCode = "10",
  1732. JyAllCount = items.Sum(p => p.JyAllCount),
  1733. JyAllTimes = Math.Round(items.Sum(p => p.JyAllTimes).Value, 2),
  1734. JyAcceptanceTypeCode = "15",
  1735. QzAllCount = items.Sum(p => p.QzAllCount),
  1736. QzAllTimes = Math.Round(items.Sum(p => p.QzAllTimes).Value, 2),
  1737. QzAcceptanceTypeCode = "20",
  1738. ByAllCount = items.Sum(p => p.ByAllCount),
  1739. ByAllTimes = Math.Round(items.Sum(p => p.ByAllTimes).Value, 2),
  1740. ByAcceptanceTypeCode = "25",
  1741. JbAllCount = items.Sum(p => p.JbAllCount),
  1742. JbAllTimes = Math.Round(items.Sum(p => p.JbAllTimes).Value, 2),
  1743. JbAcceptanceTypeCode = "30",
  1744. TsAllCount = items.Sum(p => p.TsAllCount),
  1745. TsAllTimes = Math.Round(items.Sum(p => p.TsAllTimes).Value, 2),
  1746. TsAcceptanceTypeCode = "35",
  1747. QtAllCount = items.Sum(p => p.QtAllCount),
  1748. QtAllTimes = Math.Round(items.Sum(p => p.QtAllTimes).Value, 2),
  1749. QtAcceptanceTypeCode = "40",
  1750. YjAllCount = items.Sum(p => p.YjAllCount),
  1751. YjAllTimes = Math.Round(items.Sum(p => p.YjAllTimes).Value, 2),
  1752. YjAcceptanceTypeCode = "1"
  1753. };
  1754. return new { List = items, Total = total };
  1755. }
  1756. /// <summary>
  1757. /// 部门受理类型统计周期---导出
  1758. /// </summary>
  1759. /// <param name="dto"></param>
  1760. /// <returns></returns>
  1761. [HttpPost("department_acceptance_type_statistics_export")]
  1762. public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeStatistics([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
  1763. {
  1764. var query = _orderReportApplication.DepartmentAcceptanceTypeStatistics(dto.QueryDto);
  1765. List<DepartmentAcceptanceTypeStatisticsDto> list;
  1766. if (dto.IsExportAll)
  1767. {
  1768. list = await query.ToListAsync(HttpContext.RequestAborted);
  1769. }
  1770. else
  1771. {
  1772. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1773. list = items;
  1774. }
  1775. foreach (var item in list)
  1776. {
  1777. item.ZxAllTimes = Math.Round(((double)item.ZxAllTimes / 3600), 2);
  1778. item.JyAllTimes = Math.Round(((double)item.JyAllTimes / 3600), 2);
  1779. item.QzAllTimes = Math.Round(((double)item.QzAllTimes / 3600), 2);
  1780. item.ByAllTimes = Math.Round(((double)item.ByAllTimes / 3600), 2);
  1781. item.JbAllTimes = Math.Round(((double)item.JbAllTimes / 3600), 2);
  1782. item.TsAllTimes = Math.Round(((double)item.TsAllTimes / 3600), 2);
  1783. item.QtAllTimes = Math.Round(((double)item.QtAllTimes / 3600), 2);
  1784. item.YjAllTimes = Math.Round(((double)item.YjAllTimes / 3600), 2);
  1785. }
  1786. //增加合计
  1787. list.Add(new DepartmentAcceptanceTypeStatisticsDto
  1788. {
  1789. OrgName = "合计",
  1790. OrgCode = "",
  1791. OrgType = "",
  1792. ZxAllCount = list.Sum(p => p.ZxAllCount),
  1793. ZxAllTimes = list.Sum(p => p.ZxAllTimes),
  1794. ZxAcceptanceTypeCode = "10",
  1795. JyAllCount = list.Sum(p => p.JyAllCount),
  1796. JyAllTimes = list.Sum(p => p.JyAllTimes),
  1797. JyAcceptanceTypeCode = "15",
  1798. QzAllCount = list.Sum(p => p.QzAllCount),
  1799. QzAllTimes = list.Sum(p => p.QzAllTimes),
  1800. QzAcceptanceTypeCode = "20",
  1801. ByAllCount = list.Sum(p => p.ByAllCount),
  1802. ByAllTimes = list.Sum(p => p.ByAllTimes),
  1803. ByAcceptanceTypeCode = "25",
  1804. JbAllCount = list.Sum(p => p.JbAllCount),
  1805. JbAllTimes = list.Sum(p => p.JbAllTimes),
  1806. JbAcceptanceTypeCode = "30",
  1807. TsAllCount = list.Sum(p => p.TsAllCount),
  1808. TsAllTimes = list.Sum(p => p.TsAllTimes),
  1809. TsAcceptanceTypeCode = "35",
  1810. QtAllCount = list.Sum(p => p.QtAllCount),
  1811. QtAllTimes = list.Sum(p => p.QtAllTimes),
  1812. QtAcceptanceTypeCode = "40",
  1813. YjAllCount = list.Sum(p => p.YjAllCount),
  1814. YjAllTimes = list.Sum(p => p.YjAllTimes),
  1815. YjAcceptanceTypeCode = "1"
  1816. });
  1817. var orderDtos = _mapper.Map<ICollection<DepartmentAcceptanceTypeStatisticsDto>>(list);
  1818. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1819. var dtos = orderDtos
  1820. .Select(stu => _mapper.Map(stu, typeof(DepartmentAcceptanceTypeStatisticsDto), dynamicClass))
  1821. .Cast<object>()
  1822. .ToList();
  1823. var stream = ExcelHelper.CreateStream(dtos);
  1824. return ExcelStreamResult(stream, "部门受理类型统计周期数据");
  1825. }
  1826. /// <summary>
  1827. /// 部门受理类型统计周期--明细列表
  1828. /// </summary>
  1829. /// <param name="dto"></param>
  1830. /// <returns></returns>
  1831. [HttpGet("department_acceptance_type_order_list")]
  1832. public async Task<PagedDto<OrderDto>> DepartmentAcceptanceTypeOrderList([FromQuery] DepartmentKeyWordRequest dto)
  1833. {
  1834. var (total, items) = await _orderReportApplication.DepartmentAcceptanceTypeOrderList(dto)
  1835. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  1836. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  1837. }
  1838. /// <summary>
  1839. /// 部门受理类型统计周期--明细列表---导出
  1840. /// </summary>
  1841. /// <param name="dto"></param>
  1842. /// <returns></returns>
  1843. [HttpPost("department_acceptance_type_order_list_export")]
  1844. public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeOrderList([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
  1845. {
  1846. var query = _orderReportApplication.DepartmentAcceptanceTypeOrderList(dto.QueryDto);
  1847. List<Order> list;
  1848. if (dto.IsExportAll)
  1849. {
  1850. list = await query.ToListAsync(HttpContext.RequestAborted);
  1851. }
  1852. else
  1853. {
  1854. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1855. list = items;
  1856. }
  1857. var orderDtos = _mapper.Map<ICollection<OrderDto>>(list);
  1858. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1859. var dtos = orderDtos
  1860. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  1861. .Cast<object>()
  1862. .ToList();
  1863. var stream = ExcelHelper.CreateStream(dtos);
  1864. return ExcelStreamResult(stream, "部门受理类型统计周期数据");
  1865. }
  1866. /// <summary>
  1867. /// 部门办件统计表
  1868. /// </summary>
  1869. /// <param name="dto"></param>
  1870. /// <returns></returns>
  1871. [HttpGet("departmental_processing_statistics")]
  1872. public async Task<object> DepartmentalProcessingStatistics([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  1873. {
  1874. //联合查询
  1875. //var items = await _orderReportApplication.DepartmentalProcessingStatistics(dto)
  1876. // .ToListAsync();
  1877. var items = await _orderReportApplication.DepartmentalProcessingStatisticsNew(dto);
  1878. var total = new DepartmentalProcessingStatisticsDataDto
  1879. {
  1880. OrgCode = "",
  1881. OrgName = "合计",
  1882. OrgType = EOrgType.City,
  1883. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  1884. YbOrderCountNum = items.Sum(p => p.YbOrderCountNum),
  1885. ZbOrderCountNum = items.Sum(p => p.ZbOrderCountNum),
  1886. Archived = items.Sum(p => p.Archived),
  1887. ToBeArchived = items.Sum(p => p.ToBeArchived),
  1888. WaitPublished = items.Sum(p => p.WaitPublished),
  1889. PublishedOpen = items.Sum(p => p.PublishedOpen),
  1890. PublishedNoOpen = items.Sum(p => p.PublishedNoOpen),
  1891. YbOverdue = items.Sum(p => p.YbOverdue),
  1892. ZbOverdue = items.Sum(p => p.ZbOverdue),
  1893. CompleteOnTime = items.Sum(p => p.CompleteOnTime),
  1894. HqybOverdue = items.Sum(p => p.HqybOverdue),
  1895. HqzbOverdue = items.Sum(p => p.HqzbOverdue),
  1896. DelayEnd = items.Sum(p => p.DelayEnd),
  1897. DelayWait = items.Sum(p => p.DelayWait),
  1898. OrderDelayCount = items.Sum(p => p.OrderDelayCount),
  1899. ScreenCount = items.Sum(p => p.ScreenCount),
  1900. ScreenApproval = items.Sum(p => p.ScreenApproval),
  1901. ScreenPass = items.Sum(p => p.ScreenPass),
  1902. ScreenNotPass = items.Sum(p => p.ScreenNotPass),
  1903. SatisfactionCount = items.Sum(p => p.SatisfactionCount),
  1904. NotSatisfactionCount = items.Sum(p => p.NotSatisfactionCount)
  1905. };
  1906. return new { List = items, Total = total };
  1907. }
  1908. /// <summary>
  1909. /// 部门办件统计表--导出
  1910. /// </summary>
  1911. /// <param name="dto"></param>
  1912. /// <returns></returns>
  1913. [HttpPost("departmental_processing_statistics_export")]
  1914. public async Task<FileStreamResult> ExportDepartmentalProcessingStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  1915. {
  1916. var list = await _orderReportApplication.DepartmentalProcessingStatisticsNew(dto.QueryDto);
  1917. //增加合计
  1918. list.Add(new DepartmentalProcessingStatisticsDataDto
  1919. {
  1920. OrgCode = "",
  1921. OrgName = "合计",
  1922. OrgType = EOrgType.City,
  1923. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  1924. YbOrderCountNum = list.Sum(p => p.YbOrderCountNum),
  1925. ZbOrderCountNum = list.Sum(p => p.ZbOrderCountNum),
  1926. Archived = list.Sum(p => p.Archived),
  1927. ToBeArchived = list.Sum(p => p.ToBeArchived),
  1928. WaitPublished = list.Sum(p => p.WaitPublished),
  1929. PublishedOpen = list.Sum(p => p.PublishedOpen),
  1930. PublishedNoOpen = list.Sum(p => p.PublishedNoOpen),
  1931. YbOverdue = list.Sum(p => p.YbOverdue),
  1932. ZbOverdue = list.Sum(p => p.ZbOverdue),
  1933. CompleteOnTime = list.Sum(p => p.CompleteOnTime),
  1934. HqybOverdue = list.Sum(p => p.HqybOverdue),
  1935. HqzbOverdue = list.Sum(p => p.HqzbOverdue),
  1936. DelayEnd = list.Sum(p => p.DelayEnd),
  1937. DelayWait = list.Sum(p => p.DelayWait),
  1938. OrderDelayCount = list.Sum(p => p.OrderDelayCount),
  1939. ScreenCount = list.Sum(p => p.ScreenCount),
  1940. ScreenApproval = list.Sum(p => p.ScreenApproval),
  1941. ScreenPass = list.Sum(p => p.ScreenPass),
  1942. ScreenNotPass = list.Sum(p => p.ScreenNotPass),
  1943. SatisfactionCount = list.Sum(p => p.SatisfactionCount),
  1944. NotSatisfactionCount = list.Sum(p => p.NotSatisfactionCount)
  1945. });
  1946. var orderDtos = _mapper.Map<ICollection<DepartmentalProcessingStatisticsDataDto>>(list);
  1947. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  1948. var dtos = orderDtos
  1949. .Select(stu => _mapper.Map(stu, typeof(DepartmentalProcessingStatisticsDataDto), 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("departmental_processing_child_statistics")]
  1961. public async Task<object> DepartmentalProcessingChildStatistics([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  1962. {
  1963. var items = await _orderReportApplication.DepartmentalProcessingChildStatisticsNew(dto);
  1964. //计算合计
  1965. var total = new DepartmentalProcessingStatisticsDataDto
  1966. {
  1967. OrgCode = "",
  1968. OrgName = "合计",
  1969. OrgType = EOrgType.City,
  1970. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  1971. YbOrderCountNum = items.Sum(p => p.YbOrderCountNum),
  1972. ZbOrderCountNum = items.Sum(p => p.ZbOrderCountNum),
  1973. Archived = items.Sum(p => p.Archived),
  1974. ToBeArchived = items.Sum(p => p.ToBeArchived),
  1975. WaitPublished = items.Sum(p => p.WaitPublished),
  1976. PublishedOpen = items.Sum(p => p.PublishedOpen),
  1977. PublishedNoOpen = items.Sum(p => p.PublishedNoOpen),
  1978. YbOverdue = items.Sum(p => p.YbOverdue),
  1979. ZbOverdue = items.Sum(p => p.ZbOverdue),
  1980. CompleteOnTime = items.Sum(p => p.CompleteOnTime),
  1981. HqybOverdue = items.Sum(p => p.HqybOverdue),
  1982. HqzbOverdue = items.Sum(p => p.HqzbOverdue),
  1983. DelayEnd = items.Sum(p => p.DelayEnd),
  1984. DelayWait = items.Sum(p => p.DelayWait),
  1985. OrderDelayCount = items.Sum(p => p.OrderDelayCount),
  1986. ScreenCount = items.Sum(p => p.ScreenCount),
  1987. ScreenApproval = items.Sum(p => p.ScreenApproval),
  1988. ScreenPass = items.Sum(p => p.ScreenPass),
  1989. ScreenNotPass = items.Sum(p => p.ScreenNotPass),
  1990. SatisfactionCount = items.Sum(p => p.SatisfactionCount),
  1991. NotSatisfactionCount = items.Sum(p => p.NotSatisfactionCount)
  1992. };
  1993. return new { List = items, Total = total };
  1994. }
  1995. /// <summary>
  1996. /// 部门办件统计表--子级--导出
  1997. /// </summary>
  1998. /// <param name="dto"></param>
  1999. /// <returns></returns>
  2000. [HttpPost("departmental_processing_child_statistics_export")]
  2001. public async Task<FileStreamResult> ExportDepartmentalProcessingChildStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  2002. {
  2003. var list = await _orderReportApplication.DepartmentalProcessingChildStatisticsNew(dto.QueryDto);
  2004. //增加合计
  2005. list.Add(new DepartmentalProcessingStatisticsDataDto
  2006. {
  2007. OrgCode = "",
  2008. OrgName = "合计",
  2009. OrgType = EOrgType.City,
  2010. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  2011. YbOrderCountNum = list.Sum(p => p.YbOrderCountNum),
  2012. ZbOrderCountNum = list.Sum(p => p.ZbOrderCountNum),
  2013. Archived = list.Sum(p => p.Archived),
  2014. ToBeArchived = list.Sum(p => p.ToBeArchived),
  2015. WaitPublished = list.Sum(p => p.WaitPublished),
  2016. PublishedOpen = list.Sum(p => p.PublishedOpen),
  2017. PublishedNoOpen = list.Sum(p => p.PublishedNoOpen),
  2018. YbOverdue = list.Sum(p => p.YbOverdue),
  2019. ZbOverdue = list.Sum(p => p.ZbOverdue),
  2020. CompleteOnTime = list.Sum(p => p.CompleteOnTime),
  2021. HqybOverdue = list.Sum(p => p.HqybOverdue),
  2022. HqzbOverdue = list.Sum(p => p.HqzbOverdue),
  2023. DelayEnd = list.Sum(p => p.DelayEnd),
  2024. DelayWait = list.Sum(p => p.DelayWait),
  2025. OrderDelayCount = list.Sum(p => p.OrderDelayCount),
  2026. ScreenCount = list.Sum(p => p.ScreenCount),
  2027. ScreenApproval = list.Sum(p => p.ScreenApproval),
  2028. ScreenPass = list.Sum(p => p.ScreenPass),
  2029. ScreenNotPass = list.Sum(p => p.ScreenNotPass),
  2030. SatisfactionCount = list.Sum(p => p.SatisfactionCount),
  2031. NotSatisfactionCount = list.Sum(p => p.NotSatisfactionCount)
  2032. });
  2033. var orderDtos = _mapper.Map<ICollection<DepartmentalProcessingStatisticsDataDto>>(list);
  2034. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2035. var dtos = orderDtos
  2036. .Select(stu => _mapper.Map(stu, typeof(DepartmentalProcessingStatisticsDataDto), dynamicClass))
  2037. .Cast<object>()
  2038. .ToList();
  2039. var stream = ExcelHelper.CreateStream(dtos);
  2040. return ExcelStreamResult(stream, "部门办件统计表数据");
  2041. }
  2042. /// <summary>
  2043. /// 部门办件统计表--明细
  2044. /// </summary>
  2045. /// <param name="dto"></param>
  2046. /// <returns></returns>
  2047. [HttpGet("departmental_processing_statistics_list")]
  2048. public async Task<PagedDto<OrderDto>> GetDepartmentalProcessingStatisticsList([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  2049. {
  2050. RefAsync<int> total = 0;
  2051. var queryData = await _orderReportApplication.GetDepartmentalProcessingStatisticsListNew(dto, HttpContext.RequestAborted)
  2052. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  2053. .OrderByDescending((x, o) => o.CreationTime)
  2054. .Select((x, o) => new { o })
  2055. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  2056. var dtos = queryData.Select(d =>
  2057. {
  2058. var dto = _mapper.Map<OrderDto>(d.o);
  2059. return dto;
  2060. }).ToList();
  2061. return new PagedDto<OrderDto>(total, dtos);
  2062. }
  2063. /// <summary>
  2064. /// 部门办件统计表--明细--导出
  2065. /// </summary>
  2066. /// <param name="dto"></param>
  2067. /// <returns></returns>
  2068. [HttpPost("departmental_processing_statistics_list_export")]
  2069. public async Task<FileStreamResult> ExportGetDepartmentalProcessingStatisticsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  2070. {
  2071. var query = _orderReportApplication.GetDepartmentalProcessingStatisticsListNew(dto.QueryDto, HttpContext.RequestAborted)
  2072. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  2073. .OrderByDescending((x, o) => o.CreationTime)
  2074. .Select((x, o) => new { o });
  2075. List<OrderDto> list = new List<OrderDto>();
  2076. if (dto.IsExportAll)
  2077. {
  2078. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  2079. list = listData.Select(d =>
  2080. {
  2081. var dto = _mapper.Map<OrderDto>(d.o);
  2082. return dto;
  2083. }).ToList();
  2084. }
  2085. else
  2086. {
  2087. RefAsync<int> total = 0;
  2088. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  2089. list = listData.Select(d =>
  2090. {
  2091. var dto = _mapper.Map<OrderDto>(d.o);
  2092. return dto;
  2093. }).ToList();
  2094. }
  2095. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2096. var dtos = list
  2097. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  2098. .Cast<object>()
  2099. .ToList();
  2100. var stream = ExcelHelper.CreateStream(dtos);
  2101. return ExcelStreamResult(stream, "部门办件统计明细数据");
  2102. }
  2103. /// <summary>
  2104. /// 部门办件统计明细表
  2105. /// </summary>
  2106. /// <param name="dto"></param>
  2107. /// <returns></returns>
  2108. [HttpGet("departmental_processing_statistics_details_list")]
  2109. public async Task<PagedDto<OrderDto>> DepartmentalProcessingStatisticsDetailsList([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  2110. {
  2111. RefAsync<int> total = 0;
  2112. var queryData = await _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto)
  2113. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  2114. .OrderByDescending((x, o) => o.CreationTime)
  2115. .Select((x, o) => new { o })
  2116. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  2117. var dtos = queryData.Select(d =>
  2118. {
  2119. var dto = _mapper.Map<OrderDto>(d.o);
  2120. return dto;
  2121. }).ToList();
  2122. return new PagedDto<OrderDto>(total, dtos);
  2123. }
  2124. /// <summary>
  2125. /// 部门办件统计明细表--导出
  2126. /// </summary>
  2127. /// <param name="dto"></param>
  2128. /// <returns></returns>
  2129. [HttpPost("departmental_processing_statistics_details_list_export")]
  2130. public async Task<FileStreamResult> ExportDepartmentalProcessingStatisticsDetailsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  2131. {
  2132. var query = _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto.QueryDto)
  2133. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  2134. .OrderByDescending((x, o) => o.CreationTime)
  2135. .Select((x, o) => new { o });
  2136. var list = new List<OrderDto>();
  2137. if (dto.IsExportAll)
  2138. {
  2139. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  2140. list = listData.Select(d =>
  2141. {
  2142. var dto = _mapper.Map<OrderDto>(d.o);
  2143. return dto;
  2144. }).ToList();
  2145. }
  2146. else
  2147. {
  2148. RefAsync<int> total = 0;
  2149. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  2150. list = listData.Select(d =>
  2151. {
  2152. var dto = _mapper.Map<OrderDto>(d.o);
  2153. return dto;
  2154. }).ToList();
  2155. }
  2156. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2157. var dtos = list
  2158. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  2159. .Cast<object>()
  2160. .ToList();
  2161. var stream = ExcelHelper.CreateStream(dtos);
  2162. return ExcelStreamResult(stream, "部门办件统计明细表数据");
  2163. }
  2164. /// <summary>
  2165. /// 高频来电统计
  2166. /// </summary>
  2167. /// <param name="dto"></param>
  2168. /// <returns></returns>
  2169. [HttpGet("high_frequency_call_statistics")]
  2170. public async Task<PagedDto<HighFrequencyCallStatisticsDto>> HighFrequencyCallStatistics([FromQuery] HighFrequencyCallStatisticsRequest dto)
  2171. {
  2172. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2173. throw UserFriendlyException.SameMessage("请选择时间!");
  2174. int CallCount = 2;
  2175. var HighFrequencyCallStatistics = _systemSettingCacheManager.GetSetting(SettingConstants.HighFrequencyCallStatistics)?.SettingValue[0];
  2176. if (HighFrequencyCallStatistics != null)
  2177. CallCount = int.Parse(HighFrequencyCallStatistics);
  2178. var (total, items) = await _trCallRecordRepository.Queryable()
  2179. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  2180. .Where((p, o) => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime)
  2181. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  2182. .Where((p, o) => p.ExternalId != null && o.Id != null)
  2183. .Where((p, o) => p.CallDirection == ECallDirection.In)
  2184. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNum), (p, o) => p.CPN == dto.PhoneNum)
  2185. .Select((p, o) => new
  2186. {
  2187. p.CPN,
  2188. p.ExternalId
  2189. })
  2190. .MergeTable()
  2191. .GroupBy(p => p.CPN)
  2192. .Select(p => new HighFrequencyCallStatisticsDto
  2193. {
  2194. Callnum = p.CPN,
  2195. OrderCountNum = SqlFunc.AggregateCount(p.CPN),//总量
  2196. })
  2197. .MergeTable()
  2198. .Where(p => p.OrderCountNum >= CallCount)
  2199. .OrderByDescending(p => p.OrderCountNum)
  2200. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  2201. return new PagedDto<HighFrequencyCallStatisticsDto>(total, _mapper.Map<IReadOnlyList<HighFrequencyCallStatisticsDto>>(items));
  2202. }
  2203. /// <summary>
  2204. /// 高频来电统计列表详情
  2205. /// </summary>
  2206. /// <param name="dto"></param>
  2207. /// <returns></returns>
  2208. [HttpGet("high_frequency_call_statistics_order_list")]
  2209. public async Task<PagedDto<OrderDto>> HighFrequencyCallStatisticsOrderList([FromQuery] HighFrequencyCallStatisticsListRequest dto)
  2210. {
  2211. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2212. throw UserFriendlyException.SameMessage("请选择时间!");
  2213. if (string.IsNullOrEmpty(dto.FromPhone))
  2214. throw UserFriendlyException.SameMessage("号码不能为空!");
  2215. var data = await _trCallRecordRepository.Queryable()
  2216. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  2217. .Where((p, o) => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime)
  2218. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  2219. .Where((p, o) => p.ExternalId != null && o.Id != null)
  2220. .Where((p, o) => p.CPN == dto.FromPhone)
  2221. .Where((p, o) => p.CallDirection == ECallDirection.In)
  2222. .Select((p, o) =>
  2223. p.ExternalId
  2224. )
  2225. .ToListAsync();
  2226. var (total, items) = await _orderRepository.Queryable()
  2227. .Includes(x => x.OrderScreens)
  2228. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!)) //标题
  2229. .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo == dto.ProvinceNo) //省本地编号
  2230. .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No) //工单编码
  2231. .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType)//受理类型
  2232. //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
  2233. .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
  2234. //.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
  2235. //.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
  2236. .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
  2237. .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone == dto.TransferPhone!) //转接号码
  2238. //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
  2239. //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
  2240. //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
  2241. .WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
  2242. .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
  2243. .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
  2244. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
  2245. //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel)) //紧急程度
  2246. .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
  2247. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact == dto.PhoneNo!) //联系电话
  2248. //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
  2249. .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.OrderPushTypes.Any(opt => opt.PushTypeCode == dto.PushTypeCode)) //推送分类
  2250. .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
  2251. .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
  2252. //.WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status)) //工单状态
  2253. .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)//工单状态
  2254. //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
  2255. .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName == dto.ActualHandlerName) //接办人
  2256. .WhereIF(dto.IsScreen == true, d => d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //有甄别
  2257. .WhereIF(dto.IsScreen == false, d => !d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //无甄别
  2258. .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.ActualHandleStepCode == dto.CurrentStepCode) //当前办理节点
  2259. .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
  2260. .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束
  2261. .WhereIF(dto.IsOverTime == true, d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
  2262. .WhereIF(dto.IsOverTime == false, d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //否 超期
  2263. .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
  2264. .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
  2265. //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
  2266. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
  2267. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.IsProvince == true)
  2268. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.IsProvince == false)
  2269. .OrderByDescending(d => d.CreationTime)
  2270. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2271. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2272. }
  2273. /// <summary>
  2274. /// 高频事项预警
  2275. /// </summary>
  2276. /// <param name="dto"></param>
  2277. /// <returns></returns>
  2278. [HttpGet("highmatter-warning")]
  2279. public async Task<PagedDto<HighMatterWarningDto>> HighMatterWarning([FromQuery] HighMatterWarningRequest dto)
  2280. {
  2281. List<string> filterTitle = new List<string>();
  2282. filterTitle.Add("无声");
  2283. filterTitle.Add("骚扰");
  2284. filterTitle.Add("错拨");
  2285. filterTitle.Add("测试");
  2286. var (total, items) = await _orderRepository.Queryable()
  2287. .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
  2288. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  2289. .LeftJoin<SystemArea>((it, o) => it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
  2290. .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType)//受理类型
  2291. .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot))//热点类型
  2292. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), x => x.AreaCode == dto.AreaCode)//区域
  2293. .GroupBy((it, o) => new
  2294. {
  2295. it.AcceptTypeCode,
  2296. it.AcceptType,
  2297. it.HotspotId,
  2298. it.HotspotName,
  2299. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  2300. o.AreaName,
  2301. })
  2302. .Having((it, o) => SqlFunc.AggregateCount(it.HotspotName) >= 5)
  2303. .Select((it, o) => new HighMatterWarningDto()
  2304. {
  2305. AcceptTypeCode = it.AcceptTypeCode,
  2306. AcceptType = it.AcceptType,
  2307. AreaName = o.AreaName,
  2308. HotspotName = it.HotspotName,
  2309. HotspotId = it.HotspotId,
  2310. SumCount = SqlFunc.AggregateCount(it.HotspotName),
  2311. Id = SqlFunc.AggregateMin(it.Id),
  2312. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  2313. })
  2314. .MergeTable()
  2315. .LeftJoin<Order>((x, d) => x.Id == d.Id)
  2316. .Select((x, d) => new HighMatterWarningDto()
  2317. {
  2318. AreaName = x.AreaName,
  2319. HotspotName = x.HotspotName,
  2320. HotspotId = x.HotspotId,
  2321. Title = d.Title,
  2322. SumCount = x.SumCount,
  2323. Id = d.Id,
  2324. AcceptTypeCode = x.AcceptTypeCode,
  2325. AcceptType = x.AcceptType,
  2326. AreaCode = x.AreaCode
  2327. })
  2328. .MergeTable()
  2329. .OrderByDescending(d => d.SumCount).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  2330. return new PagedDto<HighMatterWarningDto>(total, _mapper.Map<IReadOnlyList<HighMatterWarningDto>>(items));
  2331. }
  2332. /// <summary>
  2333. /// 高频事项预警明细
  2334. /// </summary>
  2335. /// <param name="dto"></param>
  2336. /// <returns></returns>
  2337. [HttpGet("highmatter-warning-detail")]
  2338. public async Task<PagedDto<OrderDto>> HighMatterWarningDetail([FromQuery] HighMatterWarningDetailRequest dto)
  2339. {
  2340. List<string> filterTitle = new List<string>();
  2341. filterTitle.Add("无声");
  2342. filterTitle.Add("骚扰");
  2343. filterTitle.Add("错拨");
  2344. filterTitle.Add("测试");
  2345. var (total, items) = await _orderRepository.Queryable()
  2346. .Includes(x => x.OrderScreens)
  2347. .Where(d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
  2348. .Where(d => d.HotspotId == dto.HotspotId) //热点类型
  2349. .Where(d => d.CreationTime >= dto.StartTime) //受理时间开始
  2350. .Where(d => d.CreationTime <= dto.EndTime) //受理时间结束
  2351. .Where(d => d.AreaCode == dto.AreaCode) //区域
  2352. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  2353. .OrderByDescending(d => d.CreationTime)
  2354. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2355. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2356. }
  2357. /// <summary>
  2358. /// 回退错件
  2359. /// </summary>
  2360. /// <param name="dto"></param>
  2361. /// <returns></returns>
  2362. [HttpGet("reTransact")]
  2363. public async Task<PagedDto<OrderReTransactVo>> OrderReTransact([FromQuery] QueryOrderReTransactRequest dto)
  2364. {
  2365. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2366. throw UserFriendlyException.SameMessage("请选择时间!");
  2367. var query = _orderApplication.OrderReTransact(dto);
  2368. var (total, items) = await query
  2369. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2370. items.Add(new OrderReTransactVo
  2371. {
  2372. OrgName = "合计",
  2373. Num = items.Select(s => s.Num).Sum(),
  2374. });
  2375. return new PagedDto<OrderReTransactVo>(total, _mapper.Map<IReadOnlyList<OrderReTransactVo>>(items));
  2376. }
  2377. /// <summary>
  2378. /// 回退错件导出
  2379. /// </summary>
  2380. /// <returns></returns>
  2381. [HttpPost("reTransact/_export")]
  2382. public async Task<FileStreamResult> OrderReTransactExport([FromBody] ExportExcelDto<QueryOrderReTransactRequest> dto)
  2383. {
  2384. var query = _orderApplication.OrderReTransact(dto.QueryDto);
  2385. List<OrderReTransactVo> data;
  2386. data = await query.ToListAsync(HttpContext.RequestAborted);
  2387. data.Add(new OrderReTransactVo
  2388. {
  2389. OrgName = "合计",
  2390. Num = data.Select(s => s.Num).Sum(),
  2391. });
  2392. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2393. var dtos = data
  2394. .Select(stu => _mapper.Map(stu, typeof(OrderReTransactVo), dynamicClass))
  2395. .Cast<object>()
  2396. .ToList();
  2397. var stream = ExcelHelper.CreateStream(dtos);
  2398. return ExcelStreamResult(stream, "回退错件统计数据");
  2399. }
  2400. /// <summary>
  2401. /// 回退错件明细
  2402. /// </summary>
  2403. /// <param name="dto"></param>
  2404. /// <returns></returns>
  2405. [HttpGet("reTransact_detail")]
  2406. public async Task<PagedDto<OrderSpecialDetailDto>> OrderReTransactDetail([FromQuery] QueryOrderReTransactDetailRequest dto)
  2407. {
  2408. var query = _orderApplication.QueryOrderSourceDetail(dto);
  2409. var (total, items) = await
  2410. query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  2411. return new PagedDto<OrderSpecialDetailDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDetailDto>>(items));
  2412. }
  2413. /// <summary>
  2414. /// 回退错件明细导出
  2415. /// </summary>
  2416. /// <returns></returns>
  2417. [HttpPost("reTransact_detail/_export")]
  2418. public async Task<FileStreamResult> OrderReTransactDetailExport([FromBody] ExportExcelDto<QueryOrderReTransactDetailRequest> dto)
  2419. {
  2420. var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
  2421. List<OrderSpecialDetail> data;
  2422. if (dto.IsExportAll)
  2423. {
  2424. data = await query.ToListAsync(HttpContext.RequestAborted);
  2425. }
  2426. else
  2427. {
  2428. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2429. data = items;
  2430. }
  2431. var dataDtos = _mapper.Map<ICollection<OrderSpecialDetailDto>>(data);
  2432. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2433. var dtos = dataDtos
  2434. .Select(stu => _mapper.Map(stu, typeof(OrderSpecialDetailDto), dynamicClass))
  2435. .Cast<object>()
  2436. .ToList();
  2437. var stream = ExcelHelper.CreateStream(dtos);
  2438. return ExcelStreamResult(stream, "回退错件明细列表数据");
  2439. }
  2440. /// <summary>
  2441. /// 获取基本信息
  2442. /// </summary>
  2443. /// <param name="id"></param>
  2444. /// <returns></returns>
  2445. [HttpGet("reTransact_base")]
  2446. public async Task<object> ReTransactBaseData()
  2447. {
  2448. var rsp = new
  2449. {
  2450. ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
  2451. };
  2452. return rsp;
  2453. }
  2454. /// <summary>
  2455. /// 派单量统计
  2456. /// </summary>
  2457. /// <param name="dto"></param>
  2458. /// <returns></returns>
  2459. [HttpGet("send_order_report")]
  2460. public async Task<List<SendOrderReportOutDto>> SendOrderReport([FromQuery] QuerySendOrderRequest dto)
  2461. {
  2462. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2463. throw UserFriendlyException.SameMessage("请选择时间!");
  2464. return await _orderApplication.SendOrderReportAsync(dto);
  2465. }
  2466. /// <summary>
  2467. /// 派单量统计-导出
  2468. /// </summary>
  2469. /// <param name="dto"></param>
  2470. /// <returns></returns>
  2471. [HttpPost("send_order_report/export")]
  2472. public async Task<FileStreamResult> ExportSendOrderReport([FromBody] ExportExcelDto<QuerySendOrderRequest> dto)
  2473. {
  2474. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue)
  2475. throw UserFriendlyException.SameMessage("请选择时间!");
  2476. var list = await _orderApplication.SendOrderReportAsync(dto.QueryDto);
  2477. if (list != null && list.Count > 0)
  2478. {
  2479. list.Add(new SendOrderReportOutDto()
  2480. {
  2481. UserName = "合计",
  2482. SendOrderNum = list.Sum(p => p.SendOrderNum),
  2483. NoSendOrderNum = list.Sum(p => p.NoSendOrderNum),
  2484. ReSendOrderNum = list.Sum(p => p.ReSendOrderNum),
  2485. });
  2486. }
  2487. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2488. var dtos = list
  2489. .Select(stu => _mapper.Map(stu, typeof(SendOrderReportOutDto), dynamicClass))
  2490. .Cast<object>()
  2491. .ToList();
  2492. var stream = ExcelHelper.CreateStream(dtos);
  2493. return ExcelStreamResult(stream, "派单量统计");
  2494. }
  2495. /// <summary>
  2496. /// 派单量统计明细
  2497. /// </summary>
  2498. /// <param name="dto"></param>
  2499. /// <returns></returns>
  2500. [HttpGet("send_order_detail_report")]
  2501. public async Task<PagedDto<OrderDto>> QuerySendOrderDetail([FromQuery] QuerySendOrderDetailRequest dto)
  2502. {
  2503. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2504. throw UserFriendlyException.SameMessage("请选择时间!");
  2505. var (total, items) = await _workflowTraceRepository.Queryable()
  2506. //.LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
  2507. .InnerJoin<SchedulingUser>((x, su) => x.HandlerId == su.UserId)
  2508. .Where((x, su) => x.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
  2509. .Where((x, su) => x.CreationTime >= dto.StartTime.Value && x.CreationTime <= dto.EndTime.Value && su.UserId == dto.UserId)
  2510. .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", (x, su) => x.Status != EWorkflowStepStatus.Handled)
  2511. .WhereIF(dto.TitleCode.ToUpper() == "SENDORDERNUM", (x, su) => x.Status == EWorkflowStepStatus.Handled)
  2512. .GroupBy((x, su) => x.ExternalId)
  2513. .Select((x, su) => new { Id = x.ExternalId })
  2514. .MergeTable()
  2515. .LeftJoin<Order>((a, b) => a.Id == b.Id)
  2516. .Select((a, b) => b)
  2517. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2518. if (dto.TitleCode.ToUpper() == "RESENDORDERNUM")
  2519. {
  2520. (total, items) = await _workflowTraceRepository.Queryable()
  2521. .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
  2522. //.LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
  2523. .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
  2524. .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled
  2525. && !string.IsNullOrEmpty(x.NextMainHandler) && x.NextMainHandler != OrgSeedData.CenterId)
  2526. .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
  2527. .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
  2528. .GroupBy((x, w, su) => x.WorkflowId)
  2529. .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
  2530. .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
  2531. .MergeTable()
  2532. .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
  2533. .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
  2534. //.LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
  2535. .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
  2536. .Where((a, wt, wf, su) => su.UserId == dto.UserId)
  2537. .GroupBy((a, wt, wf, su) => wf.ExternalId)
  2538. .Select((a, wt, wf, su) => new { Id = wf.ExternalId })
  2539. .MergeTable()
  2540. .LeftJoin<Order>((a, b) => a.Id == b.Id)
  2541. .Select((a, b) => b)
  2542. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2543. }
  2544. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2545. }
  2546. /// <summary>
  2547. /// 二次办理统计
  2548. /// </summary>
  2549. /// <param name="dto"></param>
  2550. /// <returns></returns>
  2551. [HttpGet("secondary_handling_report")]
  2552. public async Task<List<SecondaryHandlingVo>> SecondaryHandlingReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2553. {
  2554. var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto, HttpContext.RequestAborted);
  2555. return await query.ToListAsync();
  2556. }
  2557. /// <summary>
  2558. /// 二次办理统计导出
  2559. /// </summary>
  2560. /// <returns></returns>
  2561. [HttpPost("secondary_handling_report/_export")]
  2562. public async Task<FileStreamResult> SecondaryHandlingReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2563. {
  2564. var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto.QueryDto, HttpContext.RequestAborted);
  2565. List<SecondaryHandlingVo> secondaryHandling;
  2566. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2567. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2568. var dtos = secondaryHandling
  2569. .Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingVo), dynamicClass))
  2570. .Cast<object>()
  2571. .ToList();
  2572. var stream = ExcelHelper.CreateStream(dtos);
  2573. return ExcelStreamResult(stream, "二次办理统计数据");
  2574. }
  2575. /// <summary>
  2576. /// 二次办理明细
  2577. /// </summary>
  2578. /// <param name="dto"></param>
  2579. /// <returns></returns>
  2580. [HttpGet("secondary_handling_detail_report")]
  2581. public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2582. {
  2583. var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto, HttpContext.RequestAborted);
  2584. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  2585. return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
  2586. }
  2587. /// <summary>
  2588. /// 二次办理明细导出
  2589. /// </summary>
  2590. /// <returns></returns>
  2591. [HttpPost("secondary_handling_detail_report/_export")]
  2592. public async Task<FileStreamResult> SecondaryHandlingDetailReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2593. {
  2594. var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto.QueryDto, HttpContext.RequestAborted);
  2595. List<OrderSecondaryHandling> secondaryHandling;
  2596. if (dto.IsExportAll)
  2597. {
  2598. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2599. }
  2600. else
  2601. {
  2602. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2603. secondaryHandling = items;
  2604. }
  2605. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
  2606. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2607. var dtos = secondaryHandlingDtos
  2608. .Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
  2609. .Cast<object>()
  2610. .ToList();
  2611. var stream = ExcelHelper.CreateStream(dtos);
  2612. return ExcelStreamResult(stream, "二次办理列表数据");
  2613. }
  2614. /// <summary>
  2615. /// 二次办理满意度统计
  2616. /// </summary>
  2617. /// <param name="dto"></param>
  2618. /// <returns></returns>
  2619. [HttpGet("secondary_handling_satisfaction_report")]
  2620. public async Task<List<SecondaryHandlingSatisfactionVo>> SecondaryHandlingSatisfactionReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2621. {
  2622. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto, HttpContext.RequestAborted);
  2623. var list = await query.ToListAsync();
  2624. //总计
  2625. var total = new SecondaryHandlingSatisfactionVo
  2626. {
  2627. OrgId = "0",
  2628. OrgName = "总计",
  2629. TotalSumCount = list.Select(x => x.TotalSumCount).Sum(),
  2630. VerySatisfiedCount = list.Select(x => x.VerySatisfiedCount).Sum(),
  2631. SatisfiedCount = list.Select(x => x.SatisfiedCount).Sum(),
  2632. RegardedAsSatisfiedCount = list.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2633. DefaultSatisfiedCount = list.Select(x => x.DefaultSatisfiedCount).Sum(),
  2634. NoSatisfiedCount = list.Select(x => x.NoSatisfiedCount).Sum(),
  2635. NoEvaluateCount = list.Select(x => x.NoEvaluateCount).Sum(),
  2636. NoPutThroughCount = list.Select(x => x.NoPutThroughCount).Sum()
  2637. };
  2638. list.Add(total);
  2639. //区县合计
  2640. var countyList = list.Where(x => x.OrgType == EOrgType.County).ToList();
  2641. var countyTotal = new SecondaryHandlingSatisfactionVo
  2642. {
  2643. OrgId = "0",
  2644. OrgName = "区县合计",
  2645. TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
  2646. VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
  2647. SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
  2648. RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2649. DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2650. NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
  2651. NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
  2652. NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
  2653. };
  2654. list.Add(countyTotal);
  2655. //市直合计
  2656. var cityList = list.Where(x => x.OrgType == EOrgType.City).ToList();
  2657. var cityTotal = new SecondaryHandlingSatisfactionVo
  2658. {
  2659. OrgId = "0",
  2660. OrgName = "市直合计",
  2661. TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
  2662. VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
  2663. SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
  2664. RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2665. DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2666. NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
  2667. NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
  2668. NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
  2669. };
  2670. list.Add(cityTotal);
  2671. return list;
  2672. }
  2673. /// <summary>
  2674. /// 二次办理满意度统计导出
  2675. /// </summary>
  2676. /// <returns></returns>
  2677. [HttpPost("secondary_handling_satisfaction_report/_export")]
  2678. public async Task<FileStreamResult> SecondaryHandlingSatisfactionReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2679. {
  2680. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto.QueryDto, HttpContext.RequestAborted);
  2681. List<SecondaryHandlingSatisfactionVo> secondaryHandling;
  2682. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2683. //总计
  2684. var total = new SecondaryHandlingSatisfactionVo
  2685. {
  2686. OrgId = "0",
  2687. OrgName = "总计",
  2688. TotalSumCount = secondaryHandling.Select(x => x.TotalSumCount).Sum(),
  2689. VerySatisfiedCount = secondaryHandling.Select(x => x.VerySatisfiedCount).Sum(),
  2690. SatisfiedCount = secondaryHandling.Select(x => x.SatisfiedCount).Sum(),
  2691. RegardedAsSatisfiedCount = secondaryHandling.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2692. DefaultSatisfiedCount = secondaryHandling.Select(x => x.DefaultSatisfiedCount).Sum(),
  2693. NoSatisfiedCount = secondaryHandling.Select(x => x.NoSatisfiedCount).Sum(),
  2694. NoEvaluateCount = secondaryHandling.Select(x => x.NoEvaluateCount).Sum(),
  2695. NoPutThroughCount = secondaryHandling.Select(x => x.NoPutThroughCount).Sum()
  2696. };
  2697. secondaryHandling.Add(total);
  2698. //区县合计
  2699. var countyList = secondaryHandling.Where(x => x.OrgType == EOrgType.County).ToList();
  2700. var countyTotal = new SecondaryHandlingSatisfactionVo
  2701. {
  2702. OrgId = "0",
  2703. OrgName = "区县合计",
  2704. TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
  2705. VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
  2706. SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
  2707. RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2708. DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2709. NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
  2710. NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
  2711. NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
  2712. };
  2713. secondaryHandling.Add(countyTotal);
  2714. //市直合计
  2715. var cityList = secondaryHandling.Where(x => x.OrgType == EOrgType.City).ToList();
  2716. var cityTotal = new SecondaryHandlingSatisfactionVo
  2717. {
  2718. OrgId = "0",
  2719. OrgName = "市直合计",
  2720. TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
  2721. VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
  2722. SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
  2723. RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2724. DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2725. NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
  2726. NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
  2727. NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
  2728. };
  2729. secondaryHandling.Add(cityTotal);
  2730. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2731. var dtos = secondaryHandling
  2732. .Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingSatisfactionVo), dynamicClass))
  2733. .Cast<object>()
  2734. .ToList();
  2735. var stream = ExcelHelper.CreateStream(dtos);
  2736. return ExcelStreamResult(stream, "二次办理满意度统计数据");
  2737. }
  2738. /// <summary>
  2739. /// 二次办理满意度明细
  2740. /// </summary>
  2741. /// <param name="dto"></param>
  2742. /// <returns></returns>
  2743. [HttpGet("secondary_handling_satisfaction_detail_report")]
  2744. public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingSatisfactionDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2745. {
  2746. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto, HttpContext.RequestAborted);
  2747. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  2748. return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
  2749. }
  2750. /// <summary>
  2751. /// 二次办理满意度明细导出
  2752. /// </summary>
  2753. /// <returns></returns>
  2754. [HttpPost("secondary_handling_satisfaction_detail_report/_export")]
  2755. public async Task<FileStreamResult> SecondaryHandlingSatisfactionDetailReport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2756. {
  2757. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto.QueryDto, HttpContext.RequestAborted);
  2758. List<OrderSecondaryHandling> secondaryHandling;
  2759. if (dto.IsExportAll)
  2760. {
  2761. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2762. }
  2763. else
  2764. {
  2765. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2766. secondaryHandling = items;
  2767. }
  2768. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
  2769. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2770. var dtos = secondaryHandlingDtos
  2771. .Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
  2772. .Cast<object>()
  2773. .ToList();
  2774. var stream = ExcelHelper.CreateStream(dtos);
  2775. return ExcelStreamResult(stream, "二次办理满意度列表数据");
  2776. }
  2777. /// <summary>
  2778. /// 未签收统计
  2779. /// </summary>
  2780. /// <param name="dto"></param>
  2781. /// <returns></returns>
  2782. [HttpGet("unsigned_order_report")]
  2783. public async Task<PagedDto<UnsignedOrderDto>> UnsignedOrderReport([FromQuery] QueryUnsignedOrdersRequest dto)
  2784. {
  2785. var query = _orderApplication.QueryUnsignedOrders(dto);
  2786. var (total, items) = await query.Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws }).ToPagedListAsync(dto, HttpContext.RequestAborted);
  2787. var itemsVo = _mapper.Map<IReadOnlyList<UnsignedOrderDto>>(items);
  2788. foreach (var item in itemsVo)
  2789. {
  2790. // item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status != EWorkflowStepStatus.WaitForAccept && item.WorkflowStep.AcceptTime.HasValue ? item.WorkflowStep.AcceptTime!.Value : DateTime.Now, false);
  2791. item.UnsignedTime = await _expireTime.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status != EWorkflowStepStatus.WaitForAccept && item.WorkflowStep.AcceptTime.HasValue ? item.WorkflowStep.AcceptTime!.Value : DateTime.Now, false);
  2792. }
  2793. return new PagedDto<UnsignedOrderDto>(total, itemsVo);
  2794. }
  2795. /// <summary>
  2796. /// 未签收统计导出
  2797. /// </summary>
  2798. /// <returns></returns>
  2799. [HttpPost("unsigned_order_report/_export")]
  2800. public async Task<FileStreamResult> UnsignedOrdersReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
  2801. {
  2802. var query = _orderApplication.QueryUnsignedOrders(dto.QueryDto).Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws });
  2803. List<UnsignedOrder> unsignedOrders;
  2804. if (dto.IsExportAll)
  2805. {
  2806. unsignedOrders = await query.ToListAsync(HttpContext.RequestAborted);
  2807. }
  2808. else
  2809. {
  2810. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2811. unsignedOrders = items;
  2812. }
  2813. var unsignedOrderDtos = _mapper.Map<ICollection<UnsignedOrderDto>>(unsignedOrders);
  2814. foreach (var item in unsignedOrderDtos)
  2815. {
  2816. // item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(
  2817. item.UnsignedTime = await _expireTime.CalcWorkTimeToHour(
  2818. item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
  2819. }
  2820. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2821. var dtos = unsignedOrderDtos
  2822. .Select(stu => _mapper.Map(stu, typeof(UnsignedOrderDto), dynamicClass))
  2823. .Cast<object>()
  2824. .ToList();
  2825. var stream = ExcelHelper.CreateStream(dtos);
  2826. return ExcelStreamResult(stream, "未签收统计列表数据");
  2827. }
  2828. /// <summary>
  2829. /// 信件来源统计
  2830. /// </summary>
  2831. /// <param name="dto"></param>
  2832. /// <returns></returns>
  2833. [HttpGet("order_source_report")]
  2834. public async Task<IReadOnlyList<OrderSourceVo>> QueryOrderSourceReport([FromQuery] QueryOrderSourceRequest dto)
  2835. {
  2836. //var count = await _orderApplication.QueryOrderSource(dto).CountAsync();
  2837. var query = _orderApplication.QueryOrderSource(dto);
  2838. var items = await query.GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id) }).ToListAsync(HttpContext.RequestAborted);
  2839. var count = items.Sum(x => x.Num);
  2840. items.ForEach(x => x.TotalSumCount = count);
  2841. items.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
  2842. return items;
  2843. }
  2844. /// <summary>
  2845. /// 信件来源统计导出
  2846. /// </summary>
  2847. /// <returns></returns>
  2848. [HttpPost("order_source/_export")]
  2849. public async Task<FileStreamResult> QueryOrderSourceReport([FromBody] ExportExcelDto<QueryOrderSourceRequest> dto)
  2850. {
  2851. //var count = await _orderApplication.QueryOrderSource(dto.QueryDto).CountAsync();
  2852. var query = _orderApplication.QueryOrderSource(dto.QueryDto).GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id) });
  2853. List<OrderSourceVo> orderSources;
  2854. if (dto.IsExportAll)
  2855. {
  2856. orderSources = await query.ToListAsync(HttpContext.RequestAborted);
  2857. }
  2858. else
  2859. {
  2860. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2861. orderSources = items;
  2862. }
  2863. var count = orderSources.Sum(x => x.Num);
  2864. orderSources.ForEach(x => x.TotalSumCount = count);
  2865. orderSources.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
  2866. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2867. var dtos = orderSources
  2868. .Select(stu => _mapper.Map(stu, typeof(OrderSourceVo), dynamicClass))
  2869. .Cast<object>()
  2870. .ToList();
  2871. var stream = ExcelHelper.CreateStream(dtos);
  2872. return ExcelStreamResult(stream, "信件来源统计数据");
  2873. }
  2874. /// <summary>
  2875. /// 信件来源统计列表
  2876. /// </summary>
  2877. /// <param name="dto"></param>
  2878. /// <returns></returns>
  2879. [HttpGet("order_source_report_list")]
  2880. public async Task<Object> QueryOrderSourceReportList([FromQuery] QueryOrderSourceRequest dto)
  2881. {
  2882. var item = await _orderRepository.OrderSource(dto);
  2883. var titleData = await _systemDicDataRepository.Queryable()
  2884. .Where(p => p.DicTypeCode == "SourceChannel")
  2885. .Select(p => new
  2886. {
  2887. Key = p.DicDataValue,
  2888. Value = p.DicDataName
  2889. }).ToListAsync();
  2890. return new { Item = item, TitleData = titleData };
  2891. }
  2892. /// <summary>
  2893. /// 信件来源统计导出
  2894. /// </summary>
  2895. /// <returns></returns>
  2896. [HttpPost("order_source_list/_export")]
  2897. public async Task<FileStreamResult> QueryOrderSourceListExport([FromBody] QueryOrderSourceRequest dto)
  2898. {
  2899. var dataTable = await _orderRepository.OrderSourceExport(dto);
  2900. var stream = ExcelHelper.CreateStream(dataTable);
  2901. return ExcelStreamResult(stream, "信件来源统计数据");
  2902. }
  2903. /// <summary>
  2904. /// 信件来源统计明细
  2905. /// </summary>
  2906. /// <param name="dto"></param>
  2907. /// <returns></returns>
  2908. [HttpGet("order_source_detail_report")]
  2909. public async Task<PagedDto<OrderDto>> QueryOrderSourceDetailReport([FromQuery] QueryOrderSourceDetailRequest dto)
  2910. {
  2911. var (total, items) = await _orderApplication.QueryOrderSourceDetail(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  2912. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2913. }
  2914. /// <summary>
  2915. /// 信件来源统计明细导出
  2916. /// </summary>
  2917. /// <returns></returns>
  2918. [HttpPost("order_source_detail/_export")]
  2919. public async Task<FileStreamResult> QueryOrderSourceDetailReport([FromBody] ExportExcelDto<QueryOrderSourceDetailRequest> dto)
  2920. {
  2921. var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
  2922. List<Order> orders;
  2923. if (dto.IsExportAll)
  2924. {
  2925. orders = await query.ToListAsync(HttpContext.RequestAborted);
  2926. }
  2927. else
  2928. {
  2929. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2930. orders = items;
  2931. }
  2932. var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
  2933. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2934. var dtos = ordersDtos
  2935. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  2936. .Cast<object>()
  2937. .ToList();
  2938. var stream = ExcelHelper.CreateStream(dtos);
  2939. return ExcelStreamResult(stream, "信件来源统计明细数据");
  2940. }
  2941. /// <summary>
  2942. /// 区域分时统计
  2943. /// </summary>
  2944. /// <param name="dto"></param>
  2945. /// <returns></returns>
  2946. [HttpGet("order_area_time")]
  2947. public async Task<object> OrderAreaTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  2948. {
  2949. var item = await _orderRepository.OrderAreaTime(dto);
  2950. var titleData = await _systemAreaRepository.Queryable()
  2951. .Where(p => p.Id.Length == 6 && p.Id != "510000")
  2952. .Select(p => new
  2953. {
  2954. Key = p.Id,
  2955. Value = p.AreaName
  2956. }).ToListAsync();
  2957. return new { Item = item, TitleData = titleData };
  2958. }
  2959. /// <summary>
  2960. /// 区域分时统计-导出
  2961. /// </summary>
  2962. /// <param name="dto"></param>
  2963. /// <returns></returns>
  2964. [HttpPost("order_area_time_export")]
  2965. public async Task<FileStreamResult> OrderAreaTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  2966. {
  2967. var dataTable = await _orderRepository.OrderAreaTimeExport(dto);
  2968. var stream = ExcelHelper.CreateStream(dataTable);
  2969. return ExcelStreamResult(stream, "区域分时统计数据");
  2970. }
  2971. /// <summary>
  2972. /// 热点类型分时统计
  2973. /// </summary>
  2974. /// <param name="dto"></param>
  2975. /// <returns></returns>
  2976. [HttpGet("order_hotspot_time")]
  2977. public async Task<object> OrderHotspotTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  2978. {
  2979. var item = await _orderRepository.OrderHotspotTime(dto);
  2980. var titleData = await _hotspotRepository.Queryable()
  2981. .Where(p => p.Id.Length == 2 && (p.ParentId == null || p.ParentId == ""))
  2982. .Select(p => new
  2983. {
  2984. Key = p.Id,
  2985. Value = p.HotSpotName
  2986. }).ToListAsync();
  2987. return new { Item = item, TitleData = titleData };
  2988. }
  2989. /// <summary>
  2990. /// 热点类型分时统计-导出
  2991. /// </summary>
  2992. /// <param name="dto"></param>
  2993. /// <returns></returns>
  2994. [HttpPost("order_hotspot_time_export")]
  2995. public async Task<FileStreamResult> OrderHotspotTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  2996. {
  2997. var dataTable = await _orderRepository.OrderHotspotTimeExport(dto);
  2998. var stream = ExcelHelper.CreateStream(dataTable);
  2999. return ExcelStreamResult(stream, "热点类型分时统计数据");
  3000. }
  3001. /// <summary>
  3002. /// 受理类型分时统计
  3003. /// </summary>
  3004. /// <param name="dto"></param>
  3005. /// <returns></returns>
  3006. [HttpGet("order_acceptance_time")]
  3007. public async Task<object> OrderAcceptanceTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  3008. {
  3009. var item = await _orderRepository.OrderAcceptanceTime(dto);
  3010. var titleData = await _systemDicDataRepository.Queryable()
  3011. .Where(p => p.DicTypeCode == "AcceptType")
  3012. .Select(p => new
  3013. {
  3014. Key = p.DicDataValue,
  3015. Value = p.DicDataName
  3016. }).ToListAsync();
  3017. return new { Item = item, TitleData = titleData };
  3018. }
  3019. /// <summary>
  3020. /// 受理类型分时统计-导出
  3021. /// </summary>
  3022. /// <param name="dto"></param>
  3023. /// <returns></returns>
  3024. [HttpPost("order_acceptance_time_export")]
  3025. public async Task<FileStreamResult> OrderAcceptanceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  3026. {
  3027. var dataTable = await _orderRepository.OrderAcceptanceTimeExport(dto);
  3028. var stream = ExcelHelper.CreateStream(dataTable);
  3029. return ExcelStreamResult(stream, "受理类型分时统计数据");
  3030. }
  3031. /// <summary>
  3032. /// 信件来源分时统计
  3033. /// </summary>
  3034. /// <param name="dto"></param>
  3035. /// <returns></returns>
  3036. [HttpGet("order_source_time")]
  3037. public async Task<object> OrderSourceTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  3038. {
  3039. var item = await _orderRepository.OrderSourceTime(dto);
  3040. var titleData = await _systemDicDataRepository.Queryable()
  3041. .Where(p => p.DicTypeCode == "SourceChannel")
  3042. .Select(p => new
  3043. {
  3044. Key = p.DicDataValue,
  3045. Value = p.DicDataName
  3046. }).ToListAsync();
  3047. return new { Item = item, TitleData = titleData };
  3048. }
  3049. /// <summary>
  3050. /// 信件来源分时统计-导出
  3051. /// </summary>
  3052. /// <param name="dto"></param>
  3053. /// <returns></returns>
  3054. [HttpPost("order_source_time_export")]
  3055. public async Task<FileStreamResult> OrderSourceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  3056. {
  3057. var dataTable = await _orderRepository.OrderSourceTimeExport(dto);
  3058. var stream = ExcelHelper.CreateStream(dataTable);
  3059. return ExcelStreamResult(stream, "信件来源分时统计数据");
  3060. }
  3061. /// <summary>
  3062. /// 部门满意度明细
  3063. /// </summary>
  3064. /// <param name="dto"></param>
  3065. /// <returns></returns>
  3066. [HttpGet("org-visitdetail-list")]
  3067. public async Task<PagedDto<OrgVisitDetailListResp>> OrgVisitDetailList([FromQuery] OrgVisitDetailListReq dto)
  3068. {
  3069. //var query = _orderReportApplication.OrgVisitDetailList(dto);
  3070. var query = _orderRepository.OrgVisitDetailList(dto);
  3071. var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3072. return new PagedDto<OrgVisitDetailListResp>(total, _mapper.Map<IReadOnlyList<OrgVisitDetailListResp>>(items));
  3073. }
  3074. /// <summary>
  3075. /// 部门满意度明细页面基础数据
  3076. /// </summary>
  3077. /// <returns></returns>
  3078. [HttpGet("org-visitdetail-list-basedata")]
  3079. public async Task<object> OrgVisitDetailListBaseData()
  3080. {
  3081. return _baseDataApplication
  3082. .VisitSatisfaction()
  3083. .OrgsOptions(_sessionContext)
  3084. .AttitudeType()
  3085. .Build();
  3086. var VisitSatisfaction = _systemDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction);
  3087. if (_sessionContext.OrgIsCenter)
  3088. {
  3089. return new { OrgsOptions = await _systemOrganizeRepository.GetOrgJson(), VisitSatisfaction = VisitSatisfaction };
  3090. }
  3091. else
  3092. {
  3093. return new { OrgsOptions = await _systemOrganizeRepository.GetOrgJsonForUser(_sessionContext.RequiredOrgId), VisitSatisfaction = VisitSatisfaction };
  3094. }
  3095. }
  3096. /// <summary>
  3097. /// 部门满意度明细导出
  3098. /// </summary>
  3099. /// <param name="dto"></param>
  3100. /// <returns></returns>
  3101. [HttpPost("org-visitdetail-list-export")]
  3102. public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
  3103. {
  3104. var query = _orderRepository.OrgVisitDetailList(dto.QueryDto);
  3105. List<OrgVisitDetailListResp> orders;
  3106. if (dto.IsExportAll)
  3107. {
  3108. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3109. }
  3110. else
  3111. {
  3112. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3113. orders = items;
  3114. }
  3115. //var ordersDtos = _mapper.Map<ICollection<OrgVisitDetailListResp>>(orders);
  3116. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3117. var dtos = orders
  3118. .Select(stu => _mapper.Map(stu, typeof(OrgVisitDetailListResp), dynamicClass))
  3119. .Cast<object>()
  3120. .ToList();
  3121. var stream = ExcelHelper.CreateStream(dtos);
  3122. return ExcelStreamResult(stream, "部门满意度明细");
  3123. }
  3124. /// <summary>
  3125. /// 热点区域统计
  3126. /// </summary>
  3127. /// <param name="dto"></param>
  3128. /// <returns></returns>
  3129. [HttpGet("hotspot-area-statistics")]
  3130. public async Task<object> HotspotAndAreaStatistics([FromQuery] HotspotAndAreaStatisticsReq dto)
  3131. {
  3132. var (areaList, returnList) = await _orderApplication.HotspotAndAreaStatistics(dto);
  3133. return new { AreaList = areaList, Data = returnList };
  3134. }
  3135. /// <summary>
  3136. /// 热点区域统计导出
  3137. /// </summary>
  3138. /// <param name="dto"></param>
  3139. /// <returns></returns>
  3140. [HttpPost("hotspot-area-statistics-export")]
  3141. public async Task<FileStreamResult> HotspotAndAreaStatisticsExport([FromBody] HotspotAndAreaStatisticsReq dto)
  3142. {
  3143. var returnList = await _orderApplication.HotspotAndAreaStatisticsExport(dto);
  3144. var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
  3145. var stream = ExcelHelper.CreateStream(table);
  3146. return ExcelStreamResult(stream, "热点区域统计");
  3147. }
  3148. /// <summary>
  3149. /// 热点区域明细
  3150. /// </summary>
  3151. /// <param name="dto"></param>
  3152. /// <returns></returns>
  3153. [HttpGet("hotspot-area-statistics-detail")]
  3154. public async Task<PagedDto<HotspotAndAreaStatisticsDetailDto>> HotspotAndAreaStatisticsDetail([FromQuery] HotspotAndAreaStatisticsDetailReq dto)
  3155. {
  3156. var (total, items) = await _orderRepository.HotspotAndAreaStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3157. return new PagedDto<HotspotAndAreaStatisticsDetailDto>(total, items);
  3158. }
  3159. /// <summary>
  3160. /// 受理类型明细
  3161. /// </summary>
  3162. /// <param name="dto"></param>
  3163. /// <returns></returns>
  3164. [HttpGet("accepttype-statistics-bydate-detail")]
  3165. public async Task<PagedDto<HotspotAndAreaStatisticsDetailDto>> AcceptTypeStatisticsByDateDetail([FromQuery] AcceptTypeStatisticsByDateDetailReq dto)
  3166. {
  3167. var (total, items) = await _orderRepository.AcceptTypeStatisticsByDateDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3168. return new PagedDto<HotspotAndAreaStatisticsDetailDto>(total, items);
  3169. }
  3170. /// <summary>
  3171. /// 受理类型明细导出
  3172. /// </summary>
  3173. /// <param name="dto"></param>
  3174. /// <returns></returns>
  3175. [HttpPost("accepttype-statistics-bydate-detail-export")]
  3176. public async Task<FileStreamResult> AcceptTypeStatisticsByDateDetailExport([FromBody] ExportExcelDto<AcceptTypeStatisticsByDateDetailReq> dto)
  3177. {
  3178. var query = _orderRepository.AcceptTypeStatisticsByDateDetail(dto.QueryDto);
  3179. List<HotspotAndAreaStatisticsDetailDto> orders;
  3180. if (dto.IsExportAll)
  3181. {
  3182. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3183. }
  3184. else
  3185. {
  3186. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3187. orders = items;
  3188. }
  3189. var ordersDtos = _mapper.Map<ICollection<HotspotAndAreaStatisticsDetailDto>>(orders);
  3190. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3191. var dtos = ordersDtos
  3192. .Select(stu => _mapper.Map(stu, typeof(HotspotAndAreaStatisticsDetailDto), dynamicClass))
  3193. .Cast<object>()
  3194. .ToList();
  3195. var stream = ExcelHelper.CreateStream(dtos);
  3196. return ExcelStreamResult(stream, "受理类型明细");
  3197. }
  3198. /// <summary>
  3199. /// 热点区域明细导出
  3200. /// </summary>
  3201. /// <param name="dto"></param>
  3202. /// <returns></returns>
  3203. [HttpPost("hotspot-area-statistics-detail-export")]
  3204. public async Task<FileStreamResult> HotspotAndAreaStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAreaStatisticsDetailReq> dto)
  3205. {
  3206. var query = _orderRepository.HotspotAndAreaStatisticsDetail(dto.QueryDto);
  3207. List<HotspotAndAreaStatisticsDetailDto> orders;
  3208. if (dto.IsExportAll)
  3209. {
  3210. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3211. }
  3212. else
  3213. {
  3214. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3215. orders = items;
  3216. }
  3217. var ordersDtos = _mapper.Map<ICollection<HotspotAndAreaStatisticsDetailDto>>(orders);
  3218. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3219. var dtos = ordersDtos
  3220. .Select(stu => _mapper.Map(stu, typeof(HotspotAndAreaStatisticsDetailDto), dynamicClass))
  3221. .Cast<object>()
  3222. .ToList();
  3223. var stream = ExcelHelper.CreateStream(dtos);
  3224. return ExcelStreamResult(stream, "热点区域明细");
  3225. }
  3226. /// <summary>
  3227. /// 受理类型统计
  3228. /// </summary>
  3229. /// <param name="dto"></param>
  3230. /// <returns></returns>
  3231. [HttpGet("accepttype-statistics")]
  3232. public async Task<List<AcceptTypeStatisticsDto>> AcceptTypeStatistics([FromQuery] AcceptTypeStatisticsReq dto)
  3233. {
  3234. var list = await _orderReportApplication.AcceptTypeStatistics(dto).ToListAsync();
  3235. int SumCount = list.Sum(x => x.SumCount);
  3236. list.Add(new AcceptTypeStatisticsDto()
  3237. {
  3238. AcceptType = "合计",
  3239. SumCount = SumCount,
  3240. CompletionCount = list.Sum(x => x.CompletionCount),
  3241. VisitCount = list.Sum(x => x.VisitCount)
  3242. });
  3243. list.ForEach(x =>
  3244. {
  3245. x.SumCountRate = SumCount > 0 ? Math.Round((double)x.SumCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
  3246. });
  3247. return list;
  3248. }
  3249. /// <summary>
  3250. /// 受理类型统计-导出
  3251. /// </summary>
  3252. /// <param name="dto"></param>
  3253. /// <returns></returns>
  3254. [HttpPost("accepttype-statistics-export")]
  3255. public async Task<FileStreamResult> AcceptTypeStatisticsExport([FromBody] ExportExcelDto<AcceptTypeStatisticsReq> dto)
  3256. {
  3257. var list = await _orderReportApplication.AcceptTypeStatistics(dto.QueryDto).ToListAsync();
  3258. int SumCount = list.Sum(x => x.SumCount);
  3259. list.Add(new AcceptTypeStatisticsDto()
  3260. {
  3261. AcceptType = "合计",
  3262. SumCount = SumCount,
  3263. CompletionCount = list.Sum(x => x.CompletionCount),
  3264. VisitCount = list.Sum(x => x.VisitCount)
  3265. });
  3266. list.ForEach(x =>
  3267. {
  3268. x.SumCountRate = SumCount > 0 ? Math.Round((double)x.SumCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
  3269. });
  3270. var orderDtos = _mapper.Map<ICollection<AcceptTypeStatisticsDto>>(list);
  3271. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3272. var dtos = orderDtos
  3273. .Select(stu => _mapper.Map(stu, typeof(AcceptTypeStatisticsDto), dynamicClass))
  3274. .Cast<object>()
  3275. .ToList();
  3276. var stream = ExcelHelper.CreateStream(dtos);
  3277. return ExcelStreamResult(stream, "受理类型统计表数据");
  3278. }
  3279. /// <summary>
  3280. /// 根据时间查询受理类型统计
  3281. /// </summary>
  3282. /// <param name="dto"></param>
  3283. /// <returns></returns>
  3284. [HttpGet("accepttype-statistics-bydate")]
  3285. public async Task<object> AcceptTypeStatisticsByDate([FromQuery] AcceptTypeStatisticsByDateReq dto)
  3286. {
  3287. var (acceptList, items) = await _orderRepository.AcceptTypeStatisticsByDate(dto);
  3288. return new { AcceptType = acceptList, Data = items };
  3289. }
  3290. /// <summary>
  3291. /// 根据时间查询受理类型统计导出
  3292. /// </summary>
  3293. /// <param name="dto"></param>
  3294. /// <returns></returns>
  3295. [HttpPost("accepttype-statistics-bydate-export")]
  3296. public async Task<FileStreamResult> AcceptTypeStatisticsByDateExport([FromBody] AcceptTypeStatisticsByDateReq dto)
  3297. {
  3298. var returnList = await _orderRepository.AcceptTypeStatisticsByDateExport(dto);
  3299. var table = _orderRepository.InitAcceptTypeTable(returnList, dto.AddColumnName);
  3300. var stream = ExcelHelper.CreateStream(table);
  3301. return ExcelStreamResult(stream, "受理类型时间统计");
  3302. }
  3303. /// <summary>
  3304. /// 下级区域统计
  3305. /// </summary>
  3306. /// <param name="StartTime">开始时间</param>
  3307. /// <param name="EndTime">结束时间</param>
  3308. /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
  3309. /// <param name="AreaCode">上级区域Id</param>
  3310. /// <param name="Line">线路号</param>
  3311. /// <returns></returns>
  3312. [HttpGet("area_subordinate")]
  3313. public async Task<object> AreaSubordinate(DateTime StartTime, DateTime EndTime, int? TypeId, string? AreaCode, string? Line)
  3314. {
  3315. string count = "6";
  3316. if (!string.IsNullOrEmpty(AreaCode) && AreaCode != "511500")
  3317. count = (AreaCode.Length + 2).ToString();
  3318. if (string.IsNullOrEmpty(AreaCode))
  3319. AreaCode = "510000";
  3320. if (AreaCode == "510000")
  3321. {
  3322. var query = _orderRepository.Queryable()
  3323. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  3324. .WhereIF(TypeId != null && TypeId == 1, p => p.IdentityType == EIdentityType.Citizen)
  3325. .WhereIF(TypeId != null && TypeId == 2, p => p.IdentityType == EIdentityType.Enterprise)
  3326. .WhereIF(!string.IsNullOrEmpty(Line), p => p.TransferPhone == Line)
  3327. .Select(p => new
  3328. {
  3329. AreaCode = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  3330. })
  3331. .MergeTable()
  3332. .Select(p => new
  3333. {
  3334. AreaCode = SqlFunc.IIF(p.AreaCode != "519800" && p.AreaCode != "519900", "511500", p.AreaCode)
  3335. }
  3336. ).MergeTable()
  3337. .GroupBy(p => p.AreaCode)
  3338. .Select(p => new
  3339. {
  3340. AreaCode = p.AreaCode,
  3341. SumCount = SqlFunc.AggregateCount(p.AreaCode)
  3342. }
  3343. ).MergeTable();
  3344. var list = await _systemAreaRepository.Queryable()
  3345. .LeftJoin(query, (s, o) => s.Id == o.AreaCode)
  3346. .Where((s, o) => s.ParentId == AreaCode)
  3347. .Select((s, o) => new
  3348. {
  3349. AreaCode = s.Id,
  3350. SumCount = o.SumCount,
  3351. AreaName = s.AreaName,
  3352. HasChild = SqlFunc.Subqueryable<SystemArea>().Where(d => d.ParentId == o.AreaCode).Any()
  3353. })
  3354. .ToListAsync();
  3355. return list;
  3356. }
  3357. else
  3358. {
  3359. var query = _orderRepository.Queryable()
  3360. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  3361. .WhereIF(TypeId != null && TypeId == 1, p => p.IdentityType == EIdentityType.Citizen)
  3362. .WhereIF(TypeId != null && TypeId == 2, p => p.IdentityType == EIdentityType.Enterprise)
  3363. .WhereIF(!string.IsNullOrEmpty(Line), p => p.TransferPhone == Line)
  3364. .GroupBy(p => new { Id = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
  3365. .Select(p => new
  3366. {
  3367. AreaCode = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  3368. SumCount = SqlFunc.AggregateCount(p.AreaCode)
  3369. })
  3370. .MergeTable();
  3371. var list = await _systemAreaRepository.Queryable()
  3372. .LeftJoin(query, (s, o) => s.Id == o.AreaCode)
  3373. .Where((s, o) => s.ParentId == AreaCode)
  3374. .Select((s, o) => new
  3375. {
  3376. AreaCode = s.Id,
  3377. SumCount = o.SumCount,
  3378. AreaName = s.AreaName,
  3379. HasChild = SqlFunc.Subqueryable<SystemArea>().Where(d => d.ParentId == o.AreaCode).Any()
  3380. })
  3381. .ToListAsync();
  3382. return list;
  3383. }
  3384. }
  3385. /// <summary>
  3386. /// 热点满意度统计
  3387. /// </summary>
  3388. /// <param name="dto"></param>
  3389. /// <returns></returns>
  3390. [HttpGet("visit-hotspot-satisfaction-statistics")]
  3391. public async Task<Object> VisitAndHotspotSatisfactionStatistics([FromQuery] VisitAndHotspotPagedKeywordRequest dto)
  3392. {
  3393. var data = await _orderApplication.VisitAndHotspotSatisfactionStatistics(dto);
  3394. var sumModel = new VisitAndHotspotSatisfactionStatisticsDto()
  3395. {
  3396. HotspotName = "总计",
  3397. TotalSumCount = data.Sum(x => x.TotalSumCount),
  3398. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  3399. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  3400. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  3401. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  3402. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  3403. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  3404. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  3405. };
  3406. return new { DataList = data, SumModel = sumModel };
  3407. }
  3408. /// <summary>
  3409. /// 热点满意度统计导出
  3410. /// </summary>
  3411. /// <param name="dto"></param>
  3412. /// <returns></returns>
  3413. [HttpPost("visit-hotspot-satisfaction-statistics/_export")]
  3414. public async Task<FileStreamResult> VisitAndHotspotSatisfactionStatisticsExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
  3415. {
  3416. List<VisitAndHotspotSatisfactionStatisticsDto> data = await _orderApplication.VisitAndHotspotSatisfactionStatistics(dto.QueryDto);
  3417. var sumModel = new VisitAndHotspotSatisfactionStatisticsDto()
  3418. {
  3419. HotspotName = "总计",
  3420. TotalSumCount = data.Sum(x => x.TotalSumCount),
  3421. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  3422. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  3423. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  3424. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  3425. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  3426. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  3427. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  3428. };
  3429. data.Add(sumModel);
  3430. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3431. var dtos = data
  3432. .Select(stu => _mapper.Map(stu, typeof(VisitAndHotspotSatisfactionStatisticsDto), dynamicClass))
  3433. .Cast<object>()
  3434. .ToList();
  3435. var stream = ExcelHelper.CreateStream(dtos);
  3436. return ExcelStreamResult(stream, "热点满意度统计数据");
  3437. }
  3438. /// <summary>
  3439. /// 热点满意度明细
  3440. /// </summary>
  3441. /// <param name="dto"></param>
  3442. /// <returns></returns>
  3443. [HttpGet("visit-hotspot-satisfaction-detail")]
  3444. public async Task<PagedDto<OrderVisitDetailDto>> VisitAndHotspotSatisfactionDetail([FromQuery] VisitAndHotspotPagedKeywordRequest dto)
  3445. {
  3446. var (total, items) = await _orderApplication.VisitAndHotspotSatisfactionDetail(dto)
  3447. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3448. return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
  3449. }
  3450. /// <summary>
  3451. /// 热点满意度明细导出
  3452. /// </summary>
  3453. /// <param name="dto"></param>
  3454. /// <returns></returns>
  3455. [HttpPost("visit-hotspot-satisfaction-detail/_export")]
  3456. public async Task<FileStreamResult> VisitAndHotspotSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
  3457. {
  3458. var query = _orderApplication.VisitAndHotspotSatisfactionDetail(dto.QueryDto);
  3459. List<OrderVisitDetail> data;
  3460. if (dto.IsExportAll)
  3461. {
  3462. data = await query.ToListAsync(HttpContext.RequestAborted);
  3463. }
  3464. else
  3465. {
  3466. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3467. data = items;
  3468. }
  3469. var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
  3470. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3471. var dtos = dataDtos
  3472. .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
  3473. .Cast<object>()
  3474. .ToList();
  3475. var stream = ExcelHelper.CreateStream(dtos);
  3476. return ExcelStreamResult(stream, "热点满意度明细数据");
  3477. }
  3478. /// <summary>
  3479. /// 热点受理类型统计
  3480. /// </summary>
  3481. /// <param name="dto"></param>
  3482. /// <returns></returns>
  3483. [HttpGet("hotspot-accepttype-statistics")]
  3484. public async Task<object> HotspotAndAcceptTypeStatistics([FromQuery] HotspotAndAcceptTypeStatisticsReq dto)
  3485. {
  3486. var (areaList, returnList) = await _orderApplication.HotspotAndAcceptTypeStatistics(dto);
  3487. return new { AreaList = areaList, Data = returnList };
  3488. }
  3489. /// <summary>
  3490. /// 热点受理类型统计导出
  3491. /// </summary>
  3492. /// <param name="dto"></param>
  3493. /// <returns></returns>
  3494. [HttpPost("hotspot-accepttype-statistics-export")]
  3495. public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsExport([FromBody] HotspotAndAcceptTypeStatisticsReq dto)
  3496. {
  3497. var returnList = await _orderApplication.HotspotAndAcceptTypeStatisticsExport(dto);
  3498. var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
  3499. var stream = ExcelHelper.CreateStream(table);
  3500. return ExcelStreamResult(stream, "热点受理类型统计");
  3501. }
  3502. /// <summary>
  3503. /// 热点受理类型明细
  3504. /// </summary>
  3505. /// <param name="dto"></param>
  3506. /// <returns></returns>
  3507. [HttpGet("hotspot-accepttype-statistics-detail")]
  3508. public async Task<PagedDto<OrderDto>> HotspotAndAcceptTypeStatisticsDetail([FromQuery] HotspotAndAcceptTypeStatisticsDetailReq dto)
  3509. {
  3510. var (total, items) = await _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3511. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  3512. }
  3513. /// <summary>
  3514. /// 热点受理类型明细导出
  3515. /// </summary>
  3516. /// <param name="dto"></param>
  3517. /// <returns></returns>
  3518. [HttpPost("hotspot-accepttype-statistics-detail-export")]
  3519. public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAcceptTypeStatisticsDetailReq> dto)
  3520. {
  3521. var query = _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto.QueryDto);
  3522. List<Order> orders;
  3523. if (dto.IsExportAll)
  3524. {
  3525. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3526. }
  3527. else
  3528. {
  3529. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3530. orders = items;
  3531. }
  3532. var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
  3533. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3534. var dtos = ordersDtos
  3535. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3536. .Cast<object>()
  3537. .ToList();
  3538. var stream = ExcelHelper.CreateStream(dtos);
  3539. return ExcelStreamResult(stream, "热点受理类型明细");
  3540. }
  3541. /// <summary>
  3542. /// 甄别申请统计
  3543. /// </summary>
  3544. /// <param name="dto"></param>
  3545. /// <returns></returns>
  3546. [HttpGet("screen-apply")]
  3547. public async Task<PagedDto<OrderScreenApplyVo>> OrderScreenApply([FromQuery] OrderScreenApplyPagedRequest dto)
  3548. {
  3549. var (total, items) = await _orderApplication.OrderScreenApply(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3550. return new PagedDto<OrderScreenApplyVo>(total, items);
  3551. }
  3552. /// <summary>
  3553. /// 甄别申请统计导出
  3554. /// </summary>
  3555. /// <param name="dto"></param>
  3556. /// <returns></returns>
  3557. [HttpPost("screen-apply-export")]
  3558. public async Task<FileStreamResult> OrderScreenApplyExport([FromBody] ExportExcelDto<OrderScreenApplyPagedRequest> dto)
  3559. {
  3560. var query = _orderApplication.OrderScreenApply(dto.QueryDto);
  3561. List<OrderScreenApplyVo> datas;
  3562. if (dto.IsExportAll)
  3563. {
  3564. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3565. }
  3566. else
  3567. {
  3568. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3569. datas = items;
  3570. }
  3571. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3572. var dtos = datas
  3573. .Select(stu => _mapper.Map(stu, typeof(OrderScreenApplyVo), dynamicClass))
  3574. .Cast<object>()
  3575. .ToList();
  3576. var stream = ExcelHelper.CreateStream(dtos);
  3577. return ExcelStreamResult(stream, "甄别申请统计");
  3578. }
  3579. /// <summary>
  3580. /// 甄别审批统计
  3581. /// </summary>
  3582. /// <param name="dto"></param>
  3583. /// <returns></returns>
  3584. [HttpGet("screen-audit")]
  3585. public async Task<PagedDto<OrderScreenAuditVo>> OrderScreenAudit([FromQuery] OrderScreenAuditPagedRequest dto)
  3586. {
  3587. var (total, items) = await _orderApplication.OrderScreenAudit(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3588. return new PagedDto<OrderScreenAuditVo>(total, items);
  3589. }
  3590. /// <summary>
  3591. /// 甄别审批统计导出
  3592. /// </summary>
  3593. /// <param name="dto"></param>
  3594. /// <returns></returns>
  3595. [HttpPost("screen-audit-export")]
  3596. public async Task<FileStreamResult> OrderScreenAuditExport([FromBody] ExportExcelDto<OrderScreenAuditPagedRequest> dto)
  3597. {
  3598. var query = _orderApplication.OrderScreenAudit(dto.QueryDto);
  3599. List<OrderScreenAuditVo> datas;
  3600. if (dto.IsExportAll)
  3601. {
  3602. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3603. }
  3604. else
  3605. {
  3606. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3607. datas = items;
  3608. }
  3609. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3610. var dtos = datas
  3611. .Select(stu => _mapper.Map(stu, typeof(OrderScreenAuditVo), dynamicClass))
  3612. .Cast<object>()
  3613. .ToList();
  3614. var stream = ExcelHelper.CreateStream(dtos);
  3615. return ExcelStreamResult(stream, "甄别审批统计");
  3616. }
  3617. /// <summary>
  3618. /// 未签收统计
  3619. /// </summary>
  3620. /// <param name="dto"></param>
  3621. /// <returns></returns>
  3622. [HttpGet("get_order_nosigen")]
  3623. public async Task<object> GetOrderNoSigen([FromQuery] OrderNoSigenRequestDto dto)
  3624. {
  3625. var items = await _orderReportApplication.GetOrderNoSigen(dto);
  3626. var total = new OrderNoSigenDto
  3627. {
  3628. OrgName = "合计",
  3629. OrgCode = "",
  3630. OrderNoSigen = items.Sum(p => p.OrderNoSigen),
  3631. CounterNoSign = items.Sum(p => p.CounterNoSign)
  3632. };
  3633. return new { List = items, Total = total };
  3634. }
  3635. /// <summary>
  3636. /// 未签收统计--导出
  3637. /// </summary>
  3638. /// <param name="dto"></param>
  3639. /// <returns></returns>
  3640. [HttpPost("get_order_nosigen_export")]
  3641. public async Task<FileStreamResult> ExportGetOrderNoSigen([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
  3642. {
  3643. var list = await _orderReportApplication.GetOrderNoSigen(dto.QueryDto);
  3644. //增加合计
  3645. list.Add(new OrderNoSigenDto
  3646. {
  3647. OrgName = "合计",
  3648. OrgCode = "",
  3649. OrderNoSigen = list.Sum(p => p.OrderNoSigen),
  3650. CounterNoSign = list.Sum(p => p.CounterNoSign)
  3651. });
  3652. var orderDtos = _mapper.Map<ICollection<OrderNoSigenDto>>(list);
  3653. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3654. var dtos = orderDtos
  3655. .Select(stu => _mapper.Map(stu, typeof(OrderNoSigenDto), dynamicClass))
  3656. .Cast<object>()
  3657. .ToList();
  3658. var stream = ExcelHelper.CreateStream(dtos);
  3659. return ExcelStreamResult(stream, "未签收统计数据");
  3660. }
  3661. /// <summary>
  3662. /// 未签收统计--明细
  3663. /// </summary>
  3664. /// <param name="dto"></param>
  3665. /// <returns></returns>
  3666. [HttpGet("get_order_nosigen_detail")]
  3667. public async Task<PagedDto<OrderDto>> GetOrderNoSigenDetail([FromQuery] OrderNoSigenRequestDto dto)
  3668. {
  3669. RefAsync<int> total = 0;
  3670. var queryData = await _orderReportApplication.GetOrderNoSigenDetail(dto)
  3671. .Select(o => new { o })
  3672. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  3673. var dtos = queryData.Select(d =>
  3674. {
  3675. var dto = _mapper.Map<OrderDto>(d.o);
  3676. return dto;
  3677. }).ToList();
  3678. return new PagedDto<OrderDto>(total, dtos);
  3679. }
  3680. /// <summary>
  3681. /// 未签收统计--明细--导出
  3682. /// </summary>
  3683. /// <param name="dto"></param>
  3684. /// <returns></returns>
  3685. [HttpPost("get_order_nosigen_detail_export")]
  3686. public async Task<FileStreamResult> ExportGetOrderNoSigenDetail([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
  3687. {
  3688. var query = _orderReportApplication.GetOrderNoSigenDetail(dto.QueryDto).Select(o => new { o });
  3689. List<OrderDto> list = new();
  3690. if (dto.IsExportAll)
  3691. {
  3692. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  3693. list = listData.Select(d =>
  3694. {
  3695. var dto = _mapper.Map<OrderDto>(d.o);
  3696. return dto;
  3697. }).ToList();
  3698. }
  3699. else
  3700. {
  3701. RefAsync<int> total = 0;
  3702. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  3703. list = listData.Select(d =>
  3704. {
  3705. var dto = _mapper.Map<OrderDto>(d.o);
  3706. return dto;
  3707. }).ToList();
  3708. }
  3709. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3710. var dtos = list
  3711. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3712. .Cast<object>()
  3713. .ToList();
  3714. var stream = ExcelHelper.CreateStream(dtos);
  3715. return ExcelStreamResult(stream, "未签收统计明细数据");
  3716. }
  3717. /// <summary>
  3718. /// 企业专席信件统计
  3719. /// </summary>
  3720. /// <param name="dto"></param>
  3721. /// <returns></returns>
  3722. [HttpGet("get_enterprise_seats_report")]
  3723. public async Task<object> GetEnterpriseSeatsReport([FromQuery] EnterpriseSeatsReportRequestDto dto)
  3724. {
  3725. var items = await _orderReportApplication.GetEnterpriseSeatsReport(dto);
  3726. var total = new EnterpriseSeatsReportDto
  3727. {
  3728. UserName = "合计",
  3729. UserId = "",
  3730. UserNo = "",
  3731. TelCallNum = items.Sum(p => p.TelCallNum),
  3732. OrderNum = items.Sum(p => p.OrderNum),
  3733. };
  3734. return new { List = items, Total = total };
  3735. }
  3736. /// <summary>
  3737. /// 企业专席信件统计--导出
  3738. /// </summary>
  3739. /// <param name="dto"></param>
  3740. /// <returns></returns>
  3741. [HttpPost("get_enterprise_seats_report_export")]
  3742. public async Task<FileStreamResult> ExportGetEnterpriseSeatsReport([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
  3743. {
  3744. var list = await _orderReportApplication.GetEnterpriseSeatsReport(dto.QueryDto);
  3745. //增加合计
  3746. list.Add(new EnterpriseSeatsReportDto
  3747. {
  3748. UserName = "合计",
  3749. UserId = "",
  3750. UserNo = "",
  3751. TelCallNum = list.Sum(p => p.TelCallNum),
  3752. OrderNum = list.Sum(p => p.OrderNum),
  3753. });
  3754. var orderDtos = _mapper.Map<ICollection<EnterpriseSeatsReportDto>>(list);
  3755. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3756. var dtos = orderDtos
  3757. .Select(stu => _mapper.Map(stu, typeof(EnterpriseSeatsReportDto), dynamicClass))
  3758. .Cast<object>()
  3759. .ToList();
  3760. var stream = ExcelHelper.CreateStream(dtos);
  3761. return ExcelStreamResult(stream, "企业专席信件统计");
  3762. }
  3763. /// <summary>
  3764. /// 企业专席信件统计--明细
  3765. /// </summary>
  3766. /// <param name="dto"></param>
  3767. /// <returns></returns>
  3768. [HttpGet("get_enterprise_seats_report_detail")]
  3769. public async Task<PagedDto<OrderDto>> GetEnterpriseSeatsReportDetail([FromQuery] EnterpriseSeatsReportRequestDto dto)
  3770. {
  3771. RefAsync<int> total = 0;
  3772. var queryData = await _orderReportApplication.GetEnterpriseSeatsReportDetail(dto)
  3773. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  3774. return new PagedDto<OrderDto>(total, _mapper.Map<List<OrderDto>>(queryData));
  3775. }
  3776. /// <summary>
  3777. /// 企业专席信件统计--明细--导出
  3778. /// </summary>
  3779. /// <param name="dto"></param>
  3780. /// <returns></returns>
  3781. [HttpPost("get_enterprise_seats_report_detail_export")]
  3782. public async Task<FileStreamResult> ExportGetEnterpriseSeatsReportDetail([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
  3783. {
  3784. var query = _orderReportApplication.GetEnterpriseSeatsReportDetail(dto.QueryDto);
  3785. List<OrderDto> list = new();
  3786. if (dto.IsExportAll)
  3787. {
  3788. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  3789. list = _mapper.Map<List<OrderDto>>(listData);
  3790. }
  3791. else
  3792. {
  3793. RefAsync<int> total = 0;
  3794. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  3795. list = _mapper.Map<List<OrderDto>>(listData);
  3796. }
  3797. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3798. var dtos = list
  3799. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3800. .Cast<object>()
  3801. .ToList();
  3802. var stream = ExcelHelper.CreateStream(dtos);
  3803. return ExcelStreamResult(stream, "企业专席信件统计");
  3804. }
  3805. /// <summary>
  3806. /// 中心受理统计
  3807. /// </summary>
  3808. /// <param name="dto"></param>
  3809. /// <returns></returns>
  3810. [HttpGet("center-accept")]
  3811. public async Task<List<OrderCenterAcceptVo>> OrderCenterAccept([FromQuery] OrderCenterAcceptPagedRequest dto)
  3812. {
  3813. var items = await _orderApplication.OrderCenterAccept(dto).ToListAsync(HttpContext.RequestAborted);
  3814. items.Add(new OrderCenterAcceptVo
  3815. {
  3816. Time = "合计",
  3817. AcceptNum = items.Sum(p => p.AcceptNum),
  3818. ValidNum = items.Sum(p => p.ValidNum),
  3819. RepetitionNum = items.Sum(p => p.RepetitionNum),
  3820. InvalidNum = items.Sum(p => p.InvalidNum),
  3821. HandleNum = items.Sum(p => p.HandleNum),
  3822. NoHandleNum = items.Sum(p => p.NoHandleNum),
  3823. BackNum = items.Sum(p => p.BackNum),
  3824. DutyDeskNum = items.Sum(p => p.DutyDeskNum),
  3825. });
  3826. return items;
  3827. }
  3828. /// <summary>
  3829. /// 中心受理统计导出
  3830. /// </summary>
  3831. /// <param name="dto"></param>
  3832. /// <returns></returns>
  3833. [HttpPost("center-accept-export")]
  3834. public async Task<FileStreamResult> OrderCenterAcceptExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  3835. {
  3836. var query = _orderApplication.OrderCenterAccept(dto.QueryDto);
  3837. List<OrderCenterAcceptVo> datas;
  3838. if (dto.IsExportAll)
  3839. {
  3840. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3841. }
  3842. else
  3843. {
  3844. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3845. datas = items;
  3846. }
  3847. datas.Add(new OrderCenterAcceptVo
  3848. {
  3849. Time = "合计",
  3850. AcceptNum = datas.Sum(p => p.AcceptNum),
  3851. ValidNum = datas.Sum(p => p.ValidNum),
  3852. RepetitionNum = datas.Sum(p => p.RepetitionNum),
  3853. InvalidNum = datas.Sum(p => p.InvalidNum),
  3854. HandleNum = datas.Sum(p => p.HandleNum),
  3855. NoHandleNum = datas.Sum(p => p.NoHandleNum),
  3856. BackNum = datas.Sum(p => p.BackNum),
  3857. DutyDeskNum = datas.Sum(p => p.DutyDeskNum),
  3858. });
  3859. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3860. var dtos = datas
  3861. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptVo), dynamicClass))
  3862. .Cast<object>()
  3863. .ToList();
  3864. var stream = ExcelHelper.CreateStream(dtos);
  3865. return ExcelStreamResult(stream, "中心受理统计");
  3866. }
  3867. /// <summary>
  3868. /// 中心受理值班坐席统计
  3869. /// </summary>
  3870. /// <param name="dto"></param>
  3871. /// <returns></returns>
  3872. [HttpGet("center-accept-user")]
  3873. public async Task<PagedDto<OrderCenterAcceptUserVo>> OrderCenterAcceptUser([FromQuery] OrderCenterAcceptPagedRequest dto)
  3874. {
  3875. var (total, items) = await _orderApplication.OrderCenterAcceptUser(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3876. return new PagedDto<OrderCenterAcceptUserVo>(total, items);
  3877. }
  3878. /// <summary>
  3879. /// 中心受理值班坐席统计导出
  3880. /// </summary>
  3881. /// <param name="dto"></param>
  3882. /// <returns></returns>
  3883. [HttpPost("center-accept-user-export")]
  3884. public async Task<FileStreamResult> OrderCenterAcceptUserExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  3885. {
  3886. var query = _orderApplication.OrderCenterAcceptUser(dto.QueryDto);
  3887. List<OrderCenterAcceptUserVo> datas;
  3888. if (dto.IsExportAll)
  3889. {
  3890. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3891. }
  3892. else
  3893. {
  3894. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3895. datas = items;
  3896. }
  3897. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3898. var dtos = datas
  3899. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptUserVo), dynamicClass))
  3900. .Cast<object>()
  3901. .ToList();
  3902. var stream = ExcelHelper.CreateStream(dtos);
  3903. return ExcelStreamResult(stream, "中心受理值班坐席统计");
  3904. }
  3905. /// <summary>
  3906. /// 中心受理时间段统计
  3907. /// </summary>
  3908. /// <param name="dto"></param>
  3909. /// <returns></returns>
  3910. [HttpGet("center-accept-hour")]
  3911. public async Task<List<OrderCenterAcceptHourVo>> OrderCenterAcceptHour([FromQuery] OrderCenterAcceptPagedRequest dto)
  3912. {
  3913. var items = await _orderRepository.OrderCenterAcceptHour(dto).ToListAsync(HttpContext.RequestAborted);
  3914. return items;
  3915. }
  3916. /// <summary>
  3917. /// 中心受理时间段统计导出
  3918. /// </summary>
  3919. /// <param name="dto"></param>
  3920. /// <returns></returns>
  3921. [HttpPost("center-accept-hour-export")]
  3922. public async Task<FileStreamResult> OrderCenterAcceptHourExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  3923. {
  3924. var query = _orderRepository.OrderCenterAcceptHour(dto.QueryDto);
  3925. List<OrderCenterAcceptHourVo> datas;
  3926. if (dto.IsExportAll)
  3927. {
  3928. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3929. }
  3930. else
  3931. {
  3932. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3933. datas = items;
  3934. }
  3935. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3936. var dtos = datas
  3937. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptHourVo), dynamicClass))
  3938. .Cast<object>()
  3939. .ToList();
  3940. var stream = ExcelHelper.CreateStream(dtos);
  3941. return ExcelStreamResult(stream, "中心受理时间段统计");
  3942. }
  3943. /// <summary>
  3944. /// 数据清单基础数据
  3945. /// </summary>
  3946. /// <returns></returns>
  3947. [HttpGet("order-data-inventory-basedata")]
  3948. public async Task<object> OrderDataInventoryBaseData()
  3949. {
  3950. var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
  3951. var definition = wfModule.Definition;
  3952. return new
  3953. {
  3954. OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
  3955. ChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel),
  3956. ScreenStatusOptions = EnumExts.GetDescriptions<EScreenStatus>(),
  3957. AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
  3958. IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
  3959. FromGenderOptions = EnumExts.GetDescriptions<EGender>(),
  3960. ExpiredStatusOptions = EnumExts.GetDescriptions<EExpiredStatusEx>(),
  3961. PushTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.PushType),
  3962. CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
  3963. OrgsOptions = await _organizeRepository.GetOrgJson(),
  3964. GenderOptions = EnumExts.GetDescriptions<EGender>(),
  3965. };
  3966. }
  3967. /// <summary>
  3968. /// 数据清单
  3969. /// </summary>
  3970. /// <param name="dto"></param>
  3971. /// <returns></returns>
  3972. [HttpGet("order-data-inventory")]
  3973. public async Task<PagedDto<OrderDataInventoryRep>> OrderDataInventory([FromQuery] OrderDataInventoryReq dto)
  3974. {
  3975. var (total, items) = await _orderRepository.OrderDataInventory(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3976. return new PagedDto<OrderDataInventoryRep>() { Total = total, Items = items };
  3977. }
  3978. /// <summary>
  3979. /// 数据清单导出
  3980. /// </summary>
  3981. /// <param name="dto"></param>
  3982. /// <returns></returns>
  3983. [HttpPost("order-data-inventory-export")]
  3984. public async Task<FileStreamResult> OrderDataInventoryExport([FromBody] ExportExcelDto<OrderDataInventoryReq> dto)
  3985. {
  3986. var query = _orderRepository.OrderDataInventory(dto.QueryDto);
  3987. List<OrderDataInventoryRep> orders;
  3988. if (dto.IsExportAll)
  3989. {
  3990. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3991. }
  3992. else
  3993. {
  3994. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3995. orders = items;
  3996. }
  3997. var ordersDtos = _mapper.Map<ICollection<OrderDataInventoryRep>>(orders);
  3998. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3999. var dtos = ordersDtos
  4000. .Select(stu => _mapper.Map(stu, typeof(OrderDataInventoryRep), dynamicClass))
  4001. .Cast<object>()
  4002. .ToList();
  4003. var stream = ExcelHelper.CreateStream(dtos);
  4004. return ExcelStreamResult(stream, "数据清单明细");
  4005. }
  4006. /// <summary>
  4007. /// 扭转信件统计
  4008. /// </summary>
  4009. /// <param name="dto"></param>
  4010. /// <returns></returns>
  4011. [HttpGet("ordervisit-jude-statistics")]
  4012. public async Task<List<OrderVisitJudeStatisticsRep>> OrderVisitJudeStatistics([FromQuery] OrderVisitJudeStatisticsReq dto)
  4013. {
  4014. var list = await _orderApplication.OrderVisitJudeStatistics(dto).ToListAsync();
  4015. return list;
  4016. }
  4017. /// <summary>
  4018. /// 扭转信件统计
  4019. /// </summary>
  4020. /// <param name="dto"></param>
  4021. /// <returns></returns>
  4022. [HttpPost("ordervisit-jude-statistics-export")]
  4023. public async Task<FileStreamResult> OrderVisitJudeStatisticsExport([FromBody] ExportExcelDto<OrderVisitJudeStatisticsReq> dto)
  4024. {
  4025. var query = _orderApplication.OrderVisitJudeStatistics(dto.QueryDto);
  4026. List<OrderVisitJudeStatisticsRep> exportList;
  4027. exportList = await query.ToListAsync(HttpContext.RequestAborted);
  4028. var ordersDtos = _mapper.Map<ICollection<OrderVisitJudeStatisticsRep>>(exportList);
  4029. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  4030. var dtos = ordersDtos
  4031. .Select(stu => _mapper.Map(stu, typeof(OrderVisitJudeStatisticsRep), dynamicClass))
  4032. .Cast<object>()
  4033. .ToList();
  4034. var stream = ExcelHelper.CreateStream(dtos);
  4035. return ExcelStreamResult(stream, "扭转信件统计");
  4036. }
  4037. /// <summary>
  4038. /// 部门延期统计明细-单独菜单
  4039. /// </summary>
  4040. /// <param name="dto"></param>
  4041. /// <returns></returns>
  4042. [HttpGet("order_delay_detail")]
  4043. public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetailAsync([FromQuery] QueryOrderDelayDataDetailRequest dto)
  4044. {
  4045. var query = _orderDelayRepository.Queryable()
  4046. .Includes(x => x.Order)
  4047. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  4048. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  4049. .WhereIF(dto.TypeId != null && dto.TypeId == 1, x => x.Order.IdentityType == EIdentityType.Citizen)
  4050. .WhereIF(dto.TypeId != null && dto.TypeId == 2, x => x.Order.IdentityType == EIdentityType.Enterprise)
  4051. .WhereIF(dto.Type is 1, x => x.DelayState == EDelayState.Pass)
  4052. .WhereIF(dto.Type is 2, x => x.DelayState == EDelayState.NoPass)
  4053. .WhereIF(dto.Type is 3, x => x.DelayState == EDelayState.Examining)
  4054. .WhereIF(dto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
  4055. .MergeTable();
  4056. if (_sessionContext.OrgIsCenter == false)
  4057. query = query.Where(x => x.ApplyOrgCode.StartsWith(_sessionContext.OrgId));
  4058. var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  4059. return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
  4060. }
  4061. }
  4062. }