BiOrderController.cs 220 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551
  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. .OrderByIF(string.IsNullOrEmpty(dto.SortField), (x, o) => o.CreationTime, OrderByType.Desc)
  2054. .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, (x, o) => o.StartTime, OrderByType.Asc) //受理时间升序
  2055. .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
  2056. .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, (x, o) => o.ExpiredTime, OrderByType.Asc) //工单期满时间升序
  2057. .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
  2058. .OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, (x, o) => o.FiledTime, OrderByType.Asc)// 办结时间升序
  2059. .OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, (x, o) => o.FiledTime, OrderByType.Desc) //办结时间降序
  2060. .Select((x, o) => new { o })
  2061. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  2062. var dtos = queryData.Select(d =>
  2063. {
  2064. var dto = _mapper.Map<OrderDto>(d.o);
  2065. return dto;
  2066. }).ToList();
  2067. return new PagedDto<OrderDto>(total, dtos);
  2068. }
  2069. /// <summary>
  2070. /// 部门办件统计表--明细--导出
  2071. /// </summary>
  2072. /// <param name="dto"></param>
  2073. /// <returns></returns>
  2074. [HttpPost("departmental_processing_statistics_list_export")]
  2075. public async Task<FileStreamResult> ExportGetDepartmentalProcessingStatisticsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  2076. {
  2077. var query = _orderReportApplication.GetDepartmentalProcessingStatisticsListNew(dto.QueryDto, HttpContext.RequestAborted)
  2078. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  2079. .OrderByIF(string.IsNullOrEmpty(dto.QueryDto.SortField), (x, o) => o.CreationTime, OrderByType.Desc)
  2080. .OrderByIF(dto.QueryDto is { SortField: "startTime", SortRule: 0 }, (x, o) => o.StartTime, OrderByType.Asc) //受理时间升序
  2081. .OrderByIF(dto.QueryDto is { SortField: "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
  2082. .OrderByIF(dto.QueryDto is { SortField: "expiredTime", SortRule: 0 }, (x, o) => o.ExpiredTime, OrderByType.Asc) //工单期满时间升序
  2083. .OrderByIF(dto.QueryDto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
  2084. .OrderByIF(dto.QueryDto is { SortField: "filedTime", SortRule: 0 }, (x, o) => o.FiledTime, OrderByType.Asc)// 办结时间升序
  2085. .OrderByIF(dto.QueryDto is { SortField: "filedTime", SortRule: 1 }, (x, o) => o.FiledTime, OrderByType.Desc) //办结时间降序
  2086. .Select((x, o) => new { o });
  2087. List<OrderDto> list = new List<OrderDto>();
  2088. if (dto.IsExportAll)
  2089. {
  2090. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  2091. list = listData.Select(d =>
  2092. {
  2093. var dto = _mapper.Map<OrderDto>(d.o);
  2094. return dto;
  2095. }).ToList();
  2096. }
  2097. else
  2098. {
  2099. RefAsync<int> total = 0;
  2100. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  2101. list = listData.Select(d =>
  2102. {
  2103. var dto = _mapper.Map<OrderDto>(d.o);
  2104. return dto;
  2105. }).ToList();
  2106. }
  2107. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2108. var dtos = list
  2109. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  2110. .Cast<object>()
  2111. .ToList();
  2112. var stream = ExcelHelper.CreateStream(dtos);
  2113. return ExcelStreamResult(stream, "部门办件统计明细数据");
  2114. }
  2115. /// <summary>
  2116. /// 部门办件统计明细表
  2117. /// </summary>
  2118. /// <param name="dto"></param>
  2119. /// <returns></returns>
  2120. [HttpGet("departmental_processing_statistics_details_list")]
  2121. public async Task<PagedDto<OrderDto>> DepartmentalProcessingStatisticsDetailsList([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  2122. {
  2123. RefAsync<int> total = 0;
  2124. var queryData = await _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto)
  2125. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  2126. .OrderByIF(string.IsNullOrEmpty(dto.SortField),(x,o)=> o.CreationTime,OrderByType.Desc)
  2127. .OrderByIF(dto is { SortField : "startTime", SortRule :0 },(x,o)=> o.StartTime,OrderByType.Asc) //受理时间升序
  2128. .OrderByIF(dto is { SortField : "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
  2129. .OrderByIF(dto is { SortField: "expiredTime", SortRule:0 },(x,o)=> o.ExpiredTime,OrderByType.Asc) //工单期满时间升序
  2130. .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
  2131. .OrderByIF(dto is { SortField: "filedTime",SortRule:0 },(x,o)=> o.FiledTime,OrderByType.Asc)// 办结时间升序
  2132. .OrderByIF(dto is { SortField: "filedTime",SortRule:1 },(x,o)=> o.FiledTime,OrderByType.Desc) //办结时间降序
  2133. .Select((x, o) => new { o })
  2134. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  2135. var dtos = queryData.Select(d =>
  2136. {
  2137. var dto = _mapper.Map<OrderDto>(d.o);
  2138. return dto;
  2139. }).ToList();
  2140. return new PagedDto<OrderDto>(total, dtos);
  2141. }
  2142. /// <summary>
  2143. /// 部门办件统计明细表--导出
  2144. /// </summary>
  2145. /// <param name="dto"></param>
  2146. /// <returns></returns>
  2147. [HttpPost("departmental_processing_statistics_details_list_export")]
  2148. public async Task<FileStreamResult> ExportDepartmentalProcessingStatisticsDetailsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  2149. {
  2150. var query = _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto.QueryDto)
  2151. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  2152. .OrderByIF(string.IsNullOrEmpty(dto.QueryDto.SortField), (x, o) => o.CreationTime, OrderByType.Desc)
  2153. .OrderByIF(dto.QueryDto is { SortField: "startTime", SortRule: 0 }, (x, o) => o.StartTime, OrderByType.Asc) //受理时间升序
  2154. .OrderByIF(dto.QueryDto is { SortField: "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
  2155. .OrderByIF(dto.QueryDto is { SortField: "expiredTime", SortRule: 0 }, (x, o) => o.ExpiredTime, OrderByType.Asc) //工单期满时间升序
  2156. .OrderByIF(dto.QueryDto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
  2157. .OrderByIF(dto.QueryDto is { SortField: "filedTime", SortRule: 0 }, (x, o) => o.FiledTime, OrderByType.Asc)// 办结时间升序
  2158. .OrderByIF(dto.QueryDto is { SortField: "filedTime", SortRule: 1 }, (x, o) => o.FiledTime, OrderByType.Desc) //办结时间降序
  2159. .Select((x, o) => new { o });
  2160. var list = new List<OrderDto>();
  2161. if (dto.IsExportAll)
  2162. {
  2163. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  2164. list = listData.Select(d =>
  2165. {
  2166. var dto = _mapper.Map<OrderDto>(d.o);
  2167. return dto;
  2168. }).ToList();
  2169. }
  2170. else
  2171. {
  2172. RefAsync<int> total = 0;
  2173. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  2174. list = listData.Select(d =>
  2175. {
  2176. var dto = _mapper.Map<OrderDto>(d.o);
  2177. return dto;
  2178. }).ToList();
  2179. }
  2180. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2181. var dtos = list
  2182. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  2183. .Cast<object>()
  2184. .ToList();
  2185. var stream = ExcelHelper.CreateStream(dtos);
  2186. return ExcelStreamResult(stream, "部门办件统计明细表数据");
  2187. }
  2188. /// <summary>
  2189. /// 高频来电统计
  2190. /// </summary>
  2191. /// <param name="dto"></param>
  2192. /// <returns></returns>
  2193. [HttpGet("high_frequency_call_statistics")]
  2194. public async Task<PagedDto<HighFrequencyCallStatisticsDto>> HighFrequencyCallStatistics([FromQuery] HighFrequencyCallStatisticsRequest dto)
  2195. {
  2196. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2197. throw UserFriendlyException.SameMessage("请选择时间!");
  2198. int CallCount = 2;
  2199. var HighFrequencyCallStatistics = _systemSettingCacheManager.GetSetting(SettingConstants.HighFrequencyCallStatistics)?.SettingValue[0];
  2200. if (HighFrequencyCallStatistics != null)
  2201. CallCount = int.Parse(HighFrequencyCallStatistics);
  2202. var (total, items) = await _trCallRecordRepository.Queryable()
  2203. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  2204. .Where((p, o) => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime)
  2205. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  2206. .Where((p, o) => p.ExternalId != null && o.Id != null)
  2207. .Where((p, o) => p.CallDirection == ECallDirection.In)
  2208. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNum), (p, o) => p.CPN == dto.PhoneNum)
  2209. .Select((p, o) => new
  2210. {
  2211. p.CPN,
  2212. p.ExternalId
  2213. })
  2214. .MergeTable()
  2215. .GroupBy(p => p.CPN)
  2216. .Select(p => new HighFrequencyCallStatisticsDto
  2217. {
  2218. Callnum = p.CPN,
  2219. OrderCountNum = SqlFunc.AggregateCount(p.CPN),//总量
  2220. })
  2221. .MergeTable()
  2222. .Where(p => p.OrderCountNum >= CallCount)
  2223. .OrderByDescending(p => p.OrderCountNum)
  2224. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  2225. return new PagedDto<HighFrequencyCallStatisticsDto>(total, _mapper.Map<IReadOnlyList<HighFrequencyCallStatisticsDto>>(items));
  2226. }
  2227. /// <summary>
  2228. /// 高频来电统计列表详情
  2229. /// </summary>
  2230. /// <param name="dto"></param>
  2231. /// <returns></returns>
  2232. [HttpGet("high_frequency_call_statistics_order_list")]
  2233. public async Task<PagedDto<OrderDto>> HighFrequencyCallStatisticsOrderList([FromQuery] HighFrequencyCallStatisticsListRequest dto)
  2234. {
  2235. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2236. throw UserFriendlyException.SameMessage("请选择时间!");
  2237. if (string.IsNullOrEmpty(dto.FromPhone))
  2238. throw UserFriendlyException.SameMessage("号码不能为空!");
  2239. var data = await _trCallRecordRepository.Queryable()
  2240. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  2241. .Where((p, o) => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime)
  2242. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  2243. .Where((p, o) => p.ExternalId != null && o.Id != null)
  2244. .Where((p, o) => p.CPN == dto.FromPhone)
  2245. .Where((p, o) => p.CallDirection == ECallDirection.In)
  2246. .Select((p, o) =>
  2247. p.ExternalId
  2248. )
  2249. .ToListAsync();
  2250. var (total, items) = await _orderRepository.Queryable()
  2251. .Includes(x => x.OrderScreens)
  2252. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!)) //标题
  2253. .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo == dto.ProvinceNo) //省本地编号
  2254. .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No) //工单编码
  2255. .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType)//受理类型
  2256. //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
  2257. .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
  2258. //.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
  2259. //.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
  2260. .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
  2261. .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone == dto.TransferPhone!) //转接号码
  2262. //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
  2263. //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
  2264. //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
  2265. .WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
  2266. .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
  2267. .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
  2268. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
  2269. //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel)) //紧急程度
  2270. .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
  2271. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact == dto.PhoneNo!) //联系电话
  2272. //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
  2273. .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.OrderPushTypes.Any(opt => opt.PushTypeCode == dto.PushTypeCode)) //推送分类
  2274. .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
  2275. .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
  2276. //.WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status)) //工单状态
  2277. .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)//工单状态
  2278. //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
  2279. .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName == dto.ActualHandlerName) //接办人
  2280. .WhereIF(dto.IsScreen == true, d => d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //有甄别
  2281. .WhereIF(dto.IsScreen == false, d => !d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //无甄别
  2282. .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.ActualHandleStepCode == dto.CurrentStepCode) //当前办理节点
  2283. .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
  2284. .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束
  2285. .WhereIF(dto.IsOverTime == true, d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
  2286. .WhereIF(dto.IsOverTime == false, d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //否 超期
  2287. .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
  2288. .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
  2289. //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
  2290. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
  2291. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.IsProvince == true)
  2292. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.IsProvince == false)
  2293. .OrderByDescending(d => d.CreationTime)
  2294. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2295. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2296. }
  2297. /// <summary>
  2298. /// 高频事项预警
  2299. /// </summary>
  2300. /// <param name="dto"></param>
  2301. /// <returns></returns>
  2302. [HttpGet("highmatter-warning")]
  2303. public async Task<PagedDto<HighMatterWarningDto>> HighMatterWarning([FromQuery] HighMatterWarningRequest dto)
  2304. {
  2305. List<string> filterTitle = new List<string>();
  2306. filterTitle.Add("无声");
  2307. filterTitle.Add("骚扰");
  2308. filterTitle.Add("错拨");
  2309. filterTitle.Add("测试");
  2310. var (total, items) = await _orderRepository.Queryable()
  2311. .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
  2312. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  2313. .LeftJoin<SystemArea>((it, o) => it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
  2314. .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType)//受理类型
  2315. .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot))//热点类型
  2316. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), x => x.AreaCode == dto.AreaCode)//区域
  2317. .GroupBy((it, o) => new
  2318. {
  2319. it.AcceptTypeCode,
  2320. it.AcceptType,
  2321. it.HotspotId,
  2322. it.HotspotName,
  2323. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  2324. o.AreaName,
  2325. })
  2326. .Having((it, o) => SqlFunc.AggregateCount(it.HotspotName) >= 5)
  2327. .Select((it, o) => new HighMatterWarningDto()
  2328. {
  2329. AcceptTypeCode = it.AcceptTypeCode,
  2330. AcceptType = it.AcceptType,
  2331. AreaName = o.AreaName,
  2332. HotspotName = it.HotspotName,
  2333. HotspotId = it.HotspotId,
  2334. SumCount = SqlFunc.AggregateCount(it.HotspotName),
  2335. Id = SqlFunc.AggregateMin(it.Id),
  2336. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  2337. })
  2338. .MergeTable()
  2339. .LeftJoin<Order>((x, d) => x.Id == d.Id)
  2340. .Select((x, d) => new HighMatterWarningDto()
  2341. {
  2342. AreaName = x.AreaName,
  2343. HotspotName = x.HotspotName,
  2344. HotspotId = x.HotspotId,
  2345. Title = d.Title,
  2346. SumCount = x.SumCount,
  2347. Id = d.Id,
  2348. AcceptTypeCode = x.AcceptTypeCode,
  2349. AcceptType = x.AcceptType,
  2350. AreaCode = x.AreaCode
  2351. })
  2352. .MergeTable()
  2353. .OrderByDescending(d => d.SumCount).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  2354. return new PagedDto<HighMatterWarningDto>(total, _mapper.Map<IReadOnlyList<HighMatterWarningDto>>(items));
  2355. }
  2356. /// <summary>
  2357. /// 高频事项预警明细
  2358. /// </summary>
  2359. /// <param name="dto"></param>
  2360. /// <returns></returns>
  2361. [HttpGet("highmatter-warning-detail")]
  2362. public async Task<PagedDto<OrderDto>> HighMatterWarningDetail([FromQuery] HighMatterWarningDetailRequest dto)
  2363. {
  2364. List<string> filterTitle = new List<string>();
  2365. filterTitle.Add("无声");
  2366. filterTitle.Add("骚扰");
  2367. filterTitle.Add("错拨");
  2368. filterTitle.Add("测试");
  2369. var (total, items) = await _orderRepository.Queryable()
  2370. .Includes(x => x.OrderScreens)
  2371. .Where(d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
  2372. .Where(d => d.HotspotId == dto.HotspotId) //热点类型
  2373. .Where(d => d.CreationTime >= dto.StartTime) //受理时间开始
  2374. .Where(d => d.CreationTime <= dto.EndTime) //受理时间结束
  2375. .Where(d => d.AreaCode == dto.AreaCode) //区域
  2376. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  2377. .OrderByDescending(d => d.CreationTime)
  2378. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2379. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2380. }
  2381. /// <summary>
  2382. /// 回退错件
  2383. /// </summary>
  2384. /// <param name="dto"></param>
  2385. /// <returns></returns>
  2386. [HttpGet("reTransact")]
  2387. public async Task<PagedDto<OrderReTransactVo>> OrderReTransact([FromQuery] QueryOrderReTransactRequest dto)
  2388. {
  2389. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2390. throw UserFriendlyException.SameMessage("请选择时间!");
  2391. var query = _orderApplication.OrderReTransact(dto);
  2392. var (total, items) = await query
  2393. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2394. items.Add(new OrderReTransactVo
  2395. {
  2396. OrgName = "合计",
  2397. Num = items.Select(s => s.Num).Sum(),
  2398. });
  2399. return new PagedDto<OrderReTransactVo>(total, _mapper.Map<IReadOnlyList<OrderReTransactVo>>(items));
  2400. }
  2401. /// <summary>
  2402. /// 回退错件导出
  2403. /// </summary>
  2404. /// <returns></returns>
  2405. [HttpPost("reTransact/_export")]
  2406. public async Task<FileStreamResult> OrderReTransactExport([FromBody] ExportExcelDto<QueryOrderReTransactRequest> dto)
  2407. {
  2408. var query = _orderApplication.OrderReTransact(dto.QueryDto);
  2409. List<OrderReTransactVo> data;
  2410. data = await query.ToListAsync(HttpContext.RequestAborted);
  2411. data.Add(new OrderReTransactVo
  2412. {
  2413. OrgName = "合计",
  2414. Num = data.Select(s => s.Num).Sum(),
  2415. });
  2416. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2417. var dtos = data
  2418. .Select(stu => _mapper.Map(stu, typeof(OrderReTransactVo), dynamicClass))
  2419. .Cast<object>()
  2420. .ToList();
  2421. var stream = ExcelHelper.CreateStream(dtos);
  2422. return ExcelStreamResult(stream, "回退错件统计数据");
  2423. }
  2424. /// <summary>
  2425. /// 回退错件明细
  2426. /// </summary>
  2427. /// <param name="dto"></param>
  2428. /// <returns></returns>
  2429. [HttpGet("reTransact_detail")]
  2430. public async Task<PagedDto<OrderSpecialDetailDto>> OrderReTransactDetail([FromQuery] QueryOrderReTransactDetailRequest dto)
  2431. {
  2432. var query = _orderApplication.QueryOrderSourceDetail(dto);
  2433. var (total, items) = await
  2434. query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  2435. return new PagedDto<OrderSpecialDetailDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDetailDto>>(items));
  2436. }
  2437. /// <summary>
  2438. /// 回退错件明细导出
  2439. /// </summary>
  2440. /// <returns></returns>
  2441. [HttpPost("reTransact_detail/_export")]
  2442. public async Task<FileStreamResult> OrderReTransactDetailExport([FromBody] ExportExcelDto<QueryOrderReTransactDetailRequest> dto)
  2443. {
  2444. var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
  2445. List<OrderSpecialDetail> data;
  2446. if (dto.IsExportAll)
  2447. {
  2448. data = await query.ToListAsync(HttpContext.RequestAborted);
  2449. }
  2450. else
  2451. {
  2452. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2453. data = items;
  2454. }
  2455. var dataDtos = _mapper.Map<ICollection<OrderSpecialDetailDto>>(data);
  2456. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2457. var dtos = dataDtos
  2458. .Select(stu => _mapper.Map(stu, typeof(OrderSpecialDetailDto), dynamicClass))
  2459. .Cast<object>()
  2460. .ToList();
  2461. var stream = ExcelHelper.CreateStream(dtos);
  2462. return ExcelStreamResult(stream, "回退错件明细列表数据");
  2463. }
  2464. /// <summary>
  2465. /// 获取基本信息
  2466. /// </summary>
  2467. /// <param name="id"></param>
  2468. /// <returns></returns>
  2469. [HttpGet("reTransact_base")]
  2470. public async Task<object> ReTransactBaseData()
  2471. {
  2472. var rsp = new
  2473. {
  2474. ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
  2475. };
  2476. return rsp;
  2477. }
  2478. /// <summary>
  2479. /// 派单量统计
  2480. /// </summary>
  2481. /// <param name="dto"></param>
  2482. /// <returns></returns>
  2483. [HttpGet("send_order_report")]
  2484. public async Task<List<SendOrderReportOutDto>> SendOrderReport([FromQuery] QuerySendOrderRequest dto)
  2485. {
  2486. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2487. throw UserFriendlyException.SameMessage("请选择时间!");
  2488. return await _orderApplication.SendOrderReportAsync(dto);
  2489. }
  2490. /// <summary>
  2491. /// 派单量统计-导出
  2492. /// </summary>
  2493. /// <param name="dto"></param>
  2494. /// <returns></returns>
  2495. [HttpPost("send_order_report/export")]
  2496. public async Task<FileStreamResult> ExportSendOrderReport([FromBody] ExportExcelDto<QuerySendOrderRequest> dto)
  2497. {
  2498. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue)
  2499. throw UserFriendlyException.SameMessage("请选择时间!");
  2500. var list = await _orderApplication.SendOrderReportAsync(dto.QueryDto);
  2501. if (list != null && list.Count > 0)
  2502. {
  2503. list.Add(new SendOrderReportOutDto()
  2504. {
  2505. UserName = "合计",
  2506. SendOrderNum = list.Sum(p => p.SendOrderNum),
  2507. NoSendOrderNum = list.Sum(p => p.NoSendOrderNum),
  2508. ReSendOrderNum = list.Sum(p => p.ReSendOrderNum),
  2509. });
  2510. }
  2511. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2512. var dtos = list
  2513. .Select(stu => _mapper.Map(stu, typeof(SendOrderReportOutDto), dynamicClass))
  2514. .Cast<object>()
  2515. .ToList();
  2516. var stream = ExcelHelper.CreateStream(dtos);
  2517. return ExcelStreamResult(stream, "派单量统计");
  2518. }
  2519. /// <summary>
  2520. /// 派单量统计明细
  2521. /// </summary>
  2522. /// <param name="dto"></param>
  2523. /// <returns></returns>
  2524. [HttpGet("send_order_detail_report")]
  2525. public async Task<PagedDto<OrderDto>> QuerySendOrderDetail([FromQuery] QuerySendOrderDetailRequest dto)
  2526. {
  2527. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  2528. throw UserFriendlyException.SameMessage("请选择时间!");
  2529. var (total, items) = await _workflowTraceRepository.Queryable()
  2530. //.LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
  2531. .InnerJoin<SchedulingUser>((x, su) => x.HandlerId == su.UserId)
  2532. .Where((x, su) => x.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
  2533. .Where((x, su) => x.CreationTime >= dto.StartTime.Value && x.CreationTime <= dto.EndTime.Value && su.UserId == dto.UserId)
  2534. .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", (x, su) => x.Status != EWorkflowStepStatus.Handled)
  2535. .WhereIF(dto.TitleCode.ToUpper() == "SENDORDERNUM", (x, su) => x.Status == EWorkflowStepStatus.Handled)
  2536. .GroupBy((x, su) => x.ExternalId)
  2537. .Select((x, su) => new { Id = x.ExternalId })
  2538. .MergeTable()
  2539. .LeftJoin<Order>((a, b) => a.Id == b.Id)
  2540. .Select((a, b) => b)
  2541. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2542. if (dto.TitleCode.ToUpper() == "RESENDORDERNUM")
  2543. {
  2544. (total, items) = await _workflowTraceRepository.Queryable()
  2545. .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
  2546. //.LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
  2547. .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
  2548. .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled
  2549. && !string.IsNullOrEmpty(x.NextMainHandler) && x.NextMainHandler != OrgSeedData.CenterId)
  2550. .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
  2551. .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
  2552. .GroupBy((x, w, su) => x.WorkflowId)
  2553. .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
  2554. .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
  2555. .MergeTable()
  2556. .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
  2557. .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
  2558. //.LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
  2559. .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
  2560. .Where((a, wt, wf, su) => su.UserId == dto.UserId)
  2561. .GroupBy((a, wt, wf, su) => wf.ExternalId)
  2562. .Select((a, wt, wf, su) => new { Id = wf.ExternalId })
  2563. .MergeTable()
  2564. .LeftJoin<Order>((a, b) => a.Id == b.Id)
  2565. .Select((a, b) => b)
  2566. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  2567. }
  2568. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2569. }
  2570. /// <summary>
  2571. /// 二次办理统计
  2572. /// </summary>
  2573. /// <param name="dto"></param>
  2574. /// <returns></returns>
  2575. [HttpGet("secondary_handling_report")]
  2576. public async Task<List<SecondaryHandlingVo>> SecondaryHandlingReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2577. {
  2578. var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto, HttpContext.RequestAborted);
  2579. return await query.ToListAsync();
  2580. }
  2581. /// <summary>
  2582. /// 二次办理统计导出
  2583. /// </summary>
  2584. /// <returns></returns>
  2585. [HttpPost("secondary_handling_report/_export")]
  2586. public async Task<FileStreamResult> SecondaryHandlingReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2587. {
  2588. var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto.QueryDto, HttpContext.RequestAborted);
  2589. List<SecondaryHandlingVo> secondaryHandling;
  2590. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2591. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2592. var dtos = secondaryHandling
  2593. .Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingVo), dynamicClass))
  2594. .Cast<object>()
  2595. .ToList();
  2596. var stream = ExcelHelper.CreateStream(dtos);
  2597. return ExcelStreamResult(stream, "二次办理统计数据");
  2598. }
  2599. /// <summary>
  2600. /// 二次办理明细
  2601. /// </summary>
  2602. /// <param name="dto"></param>
  2603. /// <returns></returns>
  2604. [HttpGet("secondary_handling_detail_report")]
  2605. public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2606. {
  2607. var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto, HttpContext.RequestAborted);
  2608. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  2609. return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
  2610. }
  2611. /// <summary>
  2612. /// 二次办理明细导出
  2613. /// </summary>
  2614. /// <returns></returns>
  2615. [HttpPost("secondary_handling_detail_report/_export")]
  2616. public async Task<FileStreamResult> SecondaryHandlingDetailReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2617. {
  2618. var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto.QueryDto, HttpContext.RequestAborted);
  2619. List<OrderSecondaryHandling> secondaryHandling;
  2620. if (dto.IsExportAll)
  2621. {
  2622. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2623. }
  2624. else
  2625. {
  2626. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2627. secondaryHandling = items;
  2628. }
  2629. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
  2630. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2631. var dtos = secondaryHandlingDtos
  2632. .Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
  2633. .Cast<object>()
  2634. .ToList();
  2635. var stream = ExcelHelper.CreateStream(dtos);
  2636. return ExcelStreamResult(stream, "二次办理列表数据");
  2637. }
  2638. /// <summary>
  2639. /// 二次办理满意度统计
  2640. /// </summary>
  2641. /// <param name="dto"></param>
  2642. /// <returns></returns>
  2643. [HttpGet("secondary_handling_satisfaction_report")]
  2644. public async Task<List<SecondaryHandlingSatisfactionVo>> SecondaryHandlingSatisfactionReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2645. {
  2646. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto, HttpContext.RequestAborted);
  2647. var list = await query.ToListAsync();
  2648. //总计
  2649. var total = new SecondaryHandlingSatisfactionVo
  2650. {
  2651. OrgId = "0",
  2652. OrgName = "总计",
  2653. TotalSumCount = list.Select(x => x.TotalSumCount).Sum(),
  2654. VerySatisfiedCount = list.Select(x => x.VerySatisfiedCount).Sum(),
  2655. SatisfiedCount = list.Select(x => x.SatisfiedCount).Sum(),
  2656. RegardedAsSatisfiedCount = list.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2657. DefaultSatisfiedCount = list.Select(x => x.DefaultSatisfiedCount).Sum(),
  2658. NoSatisfiedCount = list.Select(x => x.NoSatisfiedCount).Sum(),
  2659. NoEvaluateCount = list.Select(x => x.NoEvaluateCount).Sum(),
  2660. NoPutThroughCount = list.Select(x => x.NoPutThroughCount).Sum()
  2661. };
  2662. list.Add(total);
  2663. //区县合计
  2664. var countyList = list.Where(x => x.OrgType == EOrgType.County).ToList();
  2665. var countyTotal = new SecondaryHandlingSatisfactionVo
  2666. {
  2667. OrgId = "0",
  2668. OrgName = "区县合计",
  2669. TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
  2670. VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
  2671. SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
  2672. RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2673. DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2674. NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
  2675. NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
  2676. NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
  2677. };
  2678. list.Add(countyTotal);
  2679. //市直合计
  2680. var cityList = list.Where(x => x.OrgType == EOrgType.City).ToList();
  2681. var cityTotal = new SecondaryHandlingSatisfactionVo
  2682. {
  2683. OrgId = "0",
  2684. OrgName = "市直合计",
  2685. TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
  2686. VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
  2687. SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
  2688. RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2689. DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2690. NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
  2691. NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
  2692. NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
  2693. };
  2694. list.Add(cityTotal);
  2695. return list;
  2696. }
  2697. /// <summary>
  2698. /// 二次办理满意度统计导出
  2699. /// </summary>
  2700. /// <returns></returns>
  2701. [HttpPost("secondary_handling_satisfaction_report/_export")]
  2702. public async Task<FileStreamResult> SecondaryHandlingSatisfactionReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2703. {
  2704. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto.QueryDto, HttpContext.RequestAborted);
  2705. List<SecondaryHandlingSatisfactionVo> secondaryHandling;
  2706. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2707. //总计
  2708. var total = new SecondaryHandlingSatisfactionVo
  2709. {
  2710. OrgId = "0",
  2711. OrgName = "总计",
  2712. TotalSumCount = secondaryHandling.Select(x => x.TotalSumCount).Sum(),
  2713. VerySatisfiedCount = secondaryHandling.Select(x => x.VerySatisfiedCount).Sum(),
  2714. SatisfiedCount = secondaryHandling.Select(x => x.SatisfiedCount).Sum(),
  2715. RegardedAsSatisfiedCount = secondaryHandling.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2716. DefaultSatisfiedCount = secondaryHandling.Select(x => x.DefaultSatisfiedCount).Sum(),
  2717. NoSatisfiedCount = secondaryHandling.Select(x => x.NoSatisfiedCount).Sum(),
  2718. NoEvaluateCount = secondaryHandling.Select(x => x.NoEvaluateCount).Sum(),
  2719. NoPutThroughCount = secondaryHandling.Select(x => x.NoPutThroughCount).Sum()
  2720. };
  2721. secondaryHandling.Add(total);
  2722. //区县合计
  2723. var countyList = secondaryHandling.Where(x => x.OrgType == EOrgType.County).ToList();
  2724. var countyTotal = new SecondaryHandlingSatisfactionVo
  2725. {
  2726. OrgId = "0",
  2727. OrgName = "区县合计",
  2728. TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
  2729. VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
  2730. SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
  2731. RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2732. DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2733. NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
  2734. NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
  2735. NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
  2736. };
  2737. secondaryHandling.Add(countyTotal);
  2738. //市直合计
  2739. var cityList = secondaryHandling.Where(x => x.OrgType == EOrgType.City).ToList();
  2740. var cityTotal = new SecondaryHandlingSatisfactionVo
  2741. {
  2742. OrgId = "0",
  2743. OrgName = "市直合计",
  2744. TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
  2745. VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
  2746. SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
  2747. RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  2748. DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
  2749. NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
  2750. NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
  2751. NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
  2752. };
  2753. secondaryHandling.Add(cityTotal);
  2754. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2755. var dtos = secondaryHandling
  2756. .Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingSatisfactionVo), dynamicClass))
  2757. .Cast<object>()
  2758. .ToList();
  2759. var stream = ExcelHelper.CreateStream(dtos);
  2760. return ExcelStreamResult(stream, "二次办理满意度统计数据");
  2761. }
  2762. /// <summary>
  2763. /// 二次办理满意度明细
  2764. /// </summary>
  2765. /// <param name="dto"></param>
  2766. /// <returns></returns>
  2767. [HttpGet("secondary_handling_satisfaction_detail_report")]
  2768. public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingSatisfactionDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
  2769. {
  2770. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto, HttpContext.RequestAborted);
  2771. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  2772. return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
  2773. }
  2774. /// <summary>
  2775. /// 二次办理满意度明细导出
  2776. /// </summary>
  2777. /// <returns></returns>
  2778. [HttpPost("secondary_handling_satisfaction_detail_report/_export")]
  2779. public async Task<FileStreamResult> SecondaryHandlingSatisfactionDetailReport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  2780. {
  2781. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto.QueryDto, HttpContext.RequestAborted);
  2782. List<OrderSecondaryHandling> secondaryHandling;
  2783. if (dto.IsExportAll)
  2784. {
  2785. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  2786. }
  2787. else
  2788. {
  2789. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2790. secondaryHandling = items;
  2791. }
  2792. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
  2793. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2794. var dtos = secondaryHandlingDtos
  2795. .Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
  2796. .Cast<object>()
  2797. .ToList();
  2798. var stream = ExcelHelper.CreateStream(dtos);
  2799. return ExcelStreamResult(stream, "二次办理满意度列表数据");
  2800. }
  2801. /// <summary>
  2802. /// 未签收统计
  2803. /// </summary>
  2804. /// <param name="dto"></param>
  2805. /// <returns></returns>
  2806. [HttpGet("unsigned_order_report")]
  2807. public async Task<PagedDto<UnsignedOrderDto>> UnsignedOrderReport([FromQuery] QueryUnsignedOrdersRequest dto)
  2808. {
  2809. var query = _orderApplication.QueryUnsignedOrders(dto);
  2810. var (total, items) = await query.Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws }).ToPagedListAsync(dto, HttpContext.RequestAborted);
  2811. var itemsVo = _mapper.Map<IReadOnlyList<UnsignedOrderDto>>(items);
  2812. foreach (var item in itemsVo)
  2813. {
  2814. // item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status != EWorkflowStepStatus.WaitForAccept && item.WorkflowStep.AcceptTime.HasValue ? item.WorkflowStep.AcceptTime!.Value : DateTime.Now, false);
  2815. item.UnsignedTime = await _expireTime.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status != EWorkflowStepStatus.WaitForAccept && item.WorkflowStep.AcceptTime.HasValue ? item.WorkflowStep.AcceptTime!.Value : DateTime.Now, false);
  2816. }
  2817. return new PagedDto<UnsignedOrderDto>(total, itemsVo);
  2818. }
  2819. /// <summary>
  2820. /// 未签收统计导出
  2821. /// </summary>
  2822. /// <returns></returns>
  2823. [HttpPost("unsigned_order_report/_export")]
  2824. public async Task<FileStreamResult> UnsignedOrdersReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
  2825. {
  2826. var query = _orderApplication.QueryUnsignedOrders(dto.QueryDto).Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws });
  2827. List<UnsignedOrder> unsignedOrders;
  2828. if (dto.IsExportAll)
  2829. {
  2830. unsignedOrders = await query.ToListAsync(HttpContext.RequestAborted);
  2831. }
  2832. else
  2833. {
  2834. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2835. unsignedOrders = items;
  2836. }
  2837. var unsignedOrderDtos = _mapper.Map<ICollection<UnsignedOrderDto>>(unsignedOrders);
  2838. foreach (var item in unsignedOrderDtos)
  2839. {
  2840. // item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(
  2841. item.UnsignedTime = await _expireTime.CalcWorkTimeToHour(
  2842. item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
  2843. }
  2844. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2845. var dtos = unsignedOrderDtos
  2846. .Select(stu => _mapper.Map(stu, typeof(UnsignedOrderDto), dynamicClass))
  2847. .Cast<object>()
  2848. .ToList();
  2849. var stream = ExcelHelper.CreateStream(dtos);
  2850. return ExcelStreamResult(stream, "未签收统计列表数据");
  2851. }
  2852. /// <summary>
  2853. /// 信件来源统计
  2854. /// </summary>
  2855. /// <param name="dto"></param>
  2856. /// <returns></returns>
  2857. [HttpGet("order_source_report")]
  2858. public async Task<IReadOnlyList<OrderSourceVo>> QueryOrderSourceReport([FromQuery] QueryOrderSourceRequest dto)
  2859. {
  2860. //var count = await _orderApplication.QueryOrderSource(dto).CountAsync();
  2861. var query = _orderApplication.QueryOrderSource(dto);
  2862. var items = await query.GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id) }).ToListAsync(HttpContext.RequestAborted);
  2863. var count = items.Sum(x => x.Num);
  2864. items.ForEach(x => x.TotalSumCount = count);
  2865. items.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
  2866. return items;
  2867. }
  2868. /// <summary>
  2869. /// 信件来源统计导出
  2870. /// </summary>
  2871. /// <returns></returns>
  2872. [HttpPost("order_source/_export")]
  2873. public async Task<FileStreamResult> QueryOrderSourceReport([FromBody] ExportExcelDto<QueryOrderSourceRequest> dto)
  2874. {
  2875. //var count = await _orderApplication.QueryOrderSource(dto.QueryDto).CountAsync();
  2876. var query = _orderApplication.QueryOrderSource(dto.QueryDto).GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id) });
  2877. List<OrderSourceVo> orderSources;
  2878. if (dto.IsExportAll)
  2879. {
  2880. orderSources = await query.ToListAsync(HttpContext.RequestAborted);
  2881. }
  2882. else
  2883. {
  2884. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2885. orderSources = items;
  2886. }
  2887. var count = orderSources.Sum(x => x.Num);
  2888. orderSources.ForEach(x => x.TotalSumCount = count);
  2889. orderSources.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
  2890. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2891. var dtos = orderSources
  2892. .Select(stu => _mapper.Map(stu, typeof(OrderSourceVo), dynamicClass))
  2893. .Cast<object>()
  2894. .ToList();
  2895. var stream = ExcelHelper.CreateStream(dtos);
  2896. return ExcelStreamResult(stream, "信件来源统计数据");
  2897. }
  2898. /// <summary>
  2899. /// 信件来源统计列表
  2900. /// </summary>
  2901. /// <param name="dto"></param>
  2902. /// <returns></returns>
  2903. [HttpGet("order_source_report_list")]
  2904. public async Task<Object> QueryOrderSourceReportList([FromQuery] QueryOrderSourceRequest dto)
  2905. {
  2906. var item = await _orderRepository.OrderSource(dto);
  2907. var titleData = await _systemDicDataRepository.Queryable()
  2908. .Where(p => p.DicTypeCode == "SourceChannel")
  2909. .Select(p => new
  2910. {
  2911. Key = p.DicDataValue,
  2912. Value = p.DicDataName
  2913. }).ToListAsync();
  2914. return new { Item = item, TitleData = titleData };
  2915. }
  2916. /// <summary>
  2917. /// 信件来源统计导出
  2918. /// </summary>
  2919. /// <returns></returns>
  2920. [HttpPost("order_source_list/_export")]
  2921. public async Task<FileStreamResult> QueryOrderSourceListExport([FromBody] QueryOrderSourceRequest dto)
  2922. {
  2923. var dataTable = await _orderRepository.OrderSourceExport(dto);
  2924. var stream = ExcelHelper.CreateStream(dataTable);
  2925. return ExcelStreamResult(stream, "信件来源统计数据");
  2926. }
  2927. /// <summary>
  2928. /// 信件来源统计明细
  2929. /// </summary>
  2930. /// <param name="dto"></param>
  2931. /// <returns></returns>
  2932. [HttpGet("order_source_detail_report")]
  2933. public async Task<PagedDto<OrderDto>> QueryOrderSourceDetailReport([FromQuery] QueryOrderSourceDetailRequest dto)
  2934. {
  2935. var (total, items) = await _orderApplication.QueryOrderSourceDetail(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  2936. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  2937. }
  2938. /// <summary>
  2939. /// 信件来源统计明细导出
  2940. /// </summary>
  2941. /// <returns></returns>
  2942. [HttpPost("order_source_detail/_export")]
  2943. public async Task<FileStreamResult> QueryOrderSourceDetailReport([FromBody] ExportExcelDto<QueryOrderSourceDetailRequest> dto)
  2944. {
  2945. var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
  2946. List<Order> orders;
  2947. if (dto.IsExportAll)
  2948. {
  2949. orders = await query.ToListAsync(HttpContext.RequestAborted);
  2950. }
  2951. else
  2952. {
  2953. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2954. orders = items;
  2955. }
  2956. var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
  2957. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  2958. var dtos = ordersDtos
  2959. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  2960. .Cast<object>()
  2961. .ToList();
  2962. var stream = ExcelHelper.CreateStream(dtos);
  2963. return ExcelStreamResult(stream, "信件来源统计明细数据");
  2964. }
  2965. /// <summary>
  2966. /// 区域分时统计
  2967. /// </summary>
  2968. /// <param name="dto"></param>
  2969. /// <returns></returns>
  2970. [HttpGet("order_area_time")]
  2971. public async Task<object> OrderAreaTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  2972. {
  2973. var item = await _orderRepository.OrderAreaTime(dto);
  2974. var titleData = await _systemAreaRepository.Queryable()
  2975. .Where(p => p.Id.Length == 6 && p.Id != "510000")
  2976. .Select(p => new
  2977. {
  2978. Key = p.Id,
  2979. Value = p.AreaName
  2980. }).ToListAsync();
  2981. return new { Item = item, TitleData = titleData };
  2982. }
  2983. /// <summary>
  2984. /// 区域分时统计-导出
  2985. /// </summary>
  2986. /// <param name="dto"></param>
  2987. /// <returns></returns>
  2988. [HttpPost("order_area_time_export")]
  2989. public async Task<FileStreamResult> OrderAreaTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  2990. {
  2991. var dataTable = await _orderRepository.OrderAreaTimeExport(dto);
  2992. var stream = ExcelHelper.CreateStream(dataTable);
  2993. return ExcelStreamResult(stream, "区域分时统计数据");
  2994. }
  2995. /// <summary>
  2996. /// 热点类型分时统计
  2997. /// </summary>
  2998. /// <param name="dto"></param>
  2999. /// <returns></returns>
  3000. [HttpGet("order_hotspot_time")]
  3001. public async Task<object> OrderHotspotTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  3002. {
  3003. var item = await _orderRepository.OrderHotspotTime(dto);
  3004. var titleData = await _hotspotRepository.Queryable()
  3005. .Where(p => p.Id.Length == 2 && (p.ParentId == null || p.ParentId == ""))
  3006. .Select(p => new
  3007. {
  3008. Key = p.Id,
  3009. Value = p.HotSpotName
  3010. }).ToListAsync();
  3011. return new { Item = item, TitleData = titleData };
  3012. }
  3013. /// <summary>
  3014. /// 热点类型分时统计-导出
  3015. /// </summary>
  3016. /// <param name="dto"></param>
  3017. /// <returns></returns>
  3018. [HttpPost("order_hotspot_time_export")]
  3019. public async Task<FileStreamResult> OrderHotspotTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  3020. {
  3021. var dataTable = await _orderRepository.OrderHotspotTimeExport(dto);
  3022. var stream = ExcelHelper.CreateStream(dataTable);
  3023. return ExcelStreamResult(stream, "热点类型分时统计数据");
  3024. }
  3025. /// <summary>
  3026. /// 受理类型分时统计
  3027. /// </summary>
  3028. /// <param name="dto"></param>
  3029. /// <returns></returns>
  3030. [HttpGet("order_acceptance_time")]
  3031. public async Task<object> OrderAcceptanceTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  3032. {
  3033. var item = await _orderRepository.OrderAcceptanceTime(dto);
  3034. var titleData = await _systemDicDataRepository.Queryable()
  3035. .Where(p => p.DicTypeCode == "AcceptType")
  3036. .Select(p => new
  3037. {
  3038. Key = p.DicDataValue,
  3039. Value = p.DicDataName
  3040. }).ToListAsync();
  3041. return new { Item = item, TitleData = titleData };
  3042. }
  3043. /// <summary>
  3044. /// 受理类型分时统计-导出
  3045. /// </summary>
  3046. /// <param name="dto"></param>
  3047. /// <returns></returns>
  3048. [HttpPost("order_acceptance_time_export")]
  3049. public async Task<FileStreamResult> OrderAcceptanceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  3050. {
  3051. var dataTable = await _orderRepository.OrderAcceptanceTimeExport(dto);
  3052. var stream = ExcelHelper.CreateStream(dataTable);
  3053. return ExcelStreamResult(stream, "受理类型分时统计数据");
  3054. }
  3055. /// <summary>
  3056. /// 信件来源分时统计
  3057. /// </summary>
  3058. /// <param name="dto"></param>
  3059. /// <returns></returns>
  3060. [HttpGet("order_source_time")]
  3061. public async Task<object> OrderSourceTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  3062. {
  3063. var item = await _orderRepository.OrderSourceTime(dto);
  3064. var titleData = await _systemDicDataRepository.Queryable()
  3065. .Where(p => p.DicTypeCode == "SourceChannel")
  3066. .Select(p => new
  3067. {
  3068. Key = p.DicDataValue,
  3069. Value = p.DicDataName
  3070. }).ToListAsync();
  3071. return new { Item = item, TitleData = titleData };
  3072. }
  3073. /// <summary>
  3074. /// 信件来源分时统计-导出
  3075. /// </summary>
  3076. /// <param name="dto"></param>
  3077. /// <returns></returns>
  3078. [HttpPost("order_source_time_export")]
  3079. public async Task<FileStreamResult> OrderSourceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  3080. {
  3081. var dataTable = await _orderRepository.OrderSourceTimeExport(dto);
  3082. var stream = ExcelHelper.CreateStream(dataTable);
  3083. return ExcelStreamResult(stream, "信件来源分时统计数据");
  3084. }
  3085. /// <summary>
  3086. /// 部门满意度明细
  3087. /// </summary>
  3088. /// <param name="dto"></param>
  3089. /// <returns></returns>
  3090. [HttpGet("org-visitdetail-list")]
  3091. public async Task<PagedDto<OrgVisitDetailListResp>> OrgVisitDetailList([FromQuery] OrgVisitDetailListReq dto)
  3092. {
  3093. //var query = _orderReportApplication.OrgVisitDetailList(dto);
  3094. var query = _orderRepository.OrgVisitDetailList(dto);
  3095. var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3096. return new PagedDto<OrgVisitDetailListResp>(total, _mapper.Map<IReadOnlyList<OrgVisitDetailListResp>>(items));
  3097. }
  3098. /// <summary>
  3099. /// 部门满意度明细页面基础数据
  3100. /// </summary>
  3101. /// <returns></returns>
  3102. [HttpGet("org-visitdetail-list-basedata")]
  3103. public Dictionary<string, dynamic> OrgVisitDetailListBaseData()
  3104. {
  3105. return _baseDataApplication
  3106. .VisitSatisfaction()
  3107. .OrgsOptions(_sessionContext)
  3108. .AttitudeType()
  3109. .Build();
  3110. }
  3111. /// <summary>
  3112. /// 部门满意度明细导出
  3113. /// </summary>
  3114. /// <param name="dto"></param>
  3115. /// <returns></returns>
  3116. [HttpPost("org-visitdetail-list-export")]
  3117. public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
  3118. {
  3119. var query = _orderRepository.OrgVisitDetailList(dto.QueryDto);
  3120. List<OrgVisitDetailListResp> orders;
  3121. if (dto.IsExportAll)
  3122. {
  3123. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3124. }
  3125. else
  3126. {
  3127. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3128. orders = items;
  3129. }
  3130. //var ordersDtos = _mapper.Map<ICollection<OrgVisitDetailListResp>>(orders);
  3131. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3132. var dtos = orders
  3133. .Select(stu => _mapper.Map(stu, typeof(OrgVisitDetailListResp), dynamicClass))
  3134. .Cast<object>()
  3135. .ToList();
  3136. var stream = ExcelHelper.CreateStream(dtos);
  3137. return ExcelStreamResult(stream, "部门满意度明细");
  3138. }
  3139. /// <summary>
  3140. /// 热点区域统计
  3141. /// </summary>
  3142. /// <param name="dto"></param>
  3143. /// <returns></returns>
  3144. [HttpGet("hotspot-area-statistics")]
  3145. public async Task<object> HotspotAndAreaStatistics([FromQuery] HotspotAndAreaStatisticsReq dto)
  3146. {
  3147. var (areaList, returnList) = await _orderApplication.HotspotAndAreaStatistics(dto);
  3148. return new { AreaList = areaList, Data = returnList };
  3149. }
  3150. /// <summary>
  3151. /// 热点区域统计导出
  3152. /// </summary>
  3153. /// <param name="dto"></param>
  3154. /// <returns></returns>
  3155. [HttpPost("hotspot-area-statistics-export")]
  3156. public async Task<FileStreamResult> HotspotAndAreaStatisticsExport([FromBody] HotspotAndAreaStatisticsReq dto)
  3157. {
  3158. var returnList = await _orderApplication.HotspotAndAreaStatisticsExport(dto);
  3159. var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
  3160. var stream = ExcelHelper.CreateStream(table);
  3161. return ExcelStreamResult(stream, "热点区域统计");
  3162. }
  3163. /// <summary>
  3164. /// 热点区域明细
  3165. /// </summary>
  3166. /// <param name="dto"></param>
  3167. /// <returns></returns>
  3168. [HttpGet("hotspot-area-statistics-detail")]
  3169. public async Task<PagedDto<HotspotAndAreaStatisticsDetailDto>> HotspotAndAreaStatisticsDetail([FromQuery] HotspotAndAreaStatisticsDetailReq dto)
  3170. {
  3171. var (total, items) = await _orderRepository.HotspotAndAreaStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3172. return new PagedDto<HotspotAndAreaStatisticsDetailDto>(total, items);
  3173. }
  3174. /// <summary>
  3175. /// 受理类型明细
  3176. /// </summary>
  3177. /// <param name="dto"></param>
  3178. /// <returns></returns>
  3179. [HttpGet("accepttype-statistics-bydate-detail")]
  3180. public async Task<PagedDto<HotspotAndAreaStatisticsDetailDto>> AcceptTypeStatisticsByDateDetail([FromQuery] AcceptTypeStatisticsByDateDetailReq dto)
  3181. {
  3182. var (total, items) = await _orderRepository.AcceptTypeStatisticsByDateDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3183. return new PagedDto<HotspotAndAreaStatisticsDetailDto>(total, items);
  3184. }
  3185. /// <summary>
  3186. /// 受理类型明细导出
  3187. /// </summary>
  3188. /// <param name="dto"></param>
  3189. /// <returns></returns>
  3190. [HttpPost("accepttype-statistics-bydate-detail-export")]
  3191. public async Task<FileStreamResult> AcceptTypeStatisticsByDateDetailExport([FromBody] ExportExcelDto<AcceptTypeStatisticsByDateDetailReq> dto)
  3192. {
  3193. var query = _orderRepository.AcceptTypeStatisticsByDateDetail(dto.QueryDto);
  3194. List<HotspotAndAreaStatisticsDetailDto> orders;
  3195. if (dto.IsExportAll)
  3196. {
  3197. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3198. }
  3199. else
  3200. {
  3201. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3202. orders = items;
  3203. }
  3204. var ordersDtos = _mapper.Map<ICollection<HotspotAndAreaStatisticsDetailDto>>(orders);
  3205. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3206. var dtos = ordersDtos
  3207. .Select(stu => _mapper.Map(stu, typeof(HotspotAndAreaStatisticsDetailDto), dynamicClass))
  3208. .Cast<object>()
  3209. .ToList();
  3210. var stream = ExcelHelper.CreateStream(dtos);
  3211. return ExcelStreamResult(stream, "受理类型明细");
  3212. }
  3213. /// <summary>
  3214. /// 热点区域明细导出
  3215. /// </summary>
  3216. /// <param name="dto"></param>
  3217. /// <returns></returns>
  3218. [HttpPost("hotspot-area-statistics-detail-export")]
  3219. public async Task<FileStreamResult> HotspotAndAreaStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAreaStatisticsDetailReq> dto)
  3220. {
  3221. var query = _orderRepository.HotspotAndAreaStatisticsDetail(dto.QueryDto);
  3222. List<HotspotAndAreaStatisticsDetailDto> orders;
  3223. if (dto.IsExportAll)
  3224. {
  3225. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3226. }
  3227. else
  3228. {
  3229. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3230. orders = items;
  3231. }
  3232. var ordersDtos = _mapper.Map<ICollection<HotspotAndAreaStatisticsDetailDto>>(orders);
  3233. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3234. var dtos = ordersDtos
  3235. .Select(stu => _mapper.Map(stu, typeof(HotspotAndAreaStatisticsDetailDto), dynamicClass))
  3236. .Cast<object>()
  3237. .ToList();
  3238. var stream = ExcelHelper.CreateStream(dtos);
  3239. return ExcelStreamResult(stream, "热点区域明细");
  3240. }
  3241. /// <summary>
  3242. /// 受理类型统计
  3243. /// </summary>
  3244. /// <param name="dto"></param>
  3245. /// <returns></returns>
  3246. [HttpGet("accepttype-statistics")]
  3247. public async Task<List<AcceptTypeStatisticsDto>> AcceptTypeStatistics([FromQuery] AcceptTypeStatisticsReq dto)
  3248. {
  3249. var list = await _orderReportApplication.AcceptTypeStatistics(dto).ToListAsync();
  3250. int SumCount = list.Sum(x => x.SumCount);
  3251. list.Add(new AcceptTypeStatisticsDto()
  3252. {
  3253. AcceptType = "合计",
  3254. SumCount = SumCount,
  3255. CompletionCount = list.Sum(x => x.CompletionCount),
  3256. VisitCount = list.Sum(x => x.VisitCount)
  3257. });
  3258. list.ForEach(x =>
  3259. {
  3260. x.SumCountRate = SumCount > 0 ? Math.Round((double)x.SumCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
  3261. });
  3262. return list;
  3263. }
  3264. /// <summary>
  3265. /// 受理类型统计-导出
  3266. /// </summary>
  3267. /// <param name="dto"></param>
  3268. /// <returns></returns>
  3269. [HttpPost("accepttype-statistics-export")]
  3270. public async Task<FileStreamResult> AcceptTypeStatisticsExport([FromBody] ExportExcelDto<AcceptTypeStatisticsReq> dto)
  3271. {
  3272. var list = await _orderReportApplication.AcceptTypeStatistics(dto.QueryDto).ToListAsync();
  3273. int SumCount = list.Sum(x => x.SumCount);
  3274. list.Add(new AcceptTypeStatisticsDto()
  3275. {
  3276. AcceptType = "合计",
  3277. SumCount = SumCount,
  3278. CompletionCount = list.Sum(x => x.CompletionCount),
  3279. VisitCount = list.Sum(x => x.VisitCount)
  3280. });
  3281. list.ForEach(x =>
  3282. {
  3283. x.SumCountRate = SumCount > 0 ? Math.Round((double)x.SumCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
  3284. });
  3285. var orderDtos = _mapper.Map<ICollection<AcceptTypeStatisticsDto>>(list);
  3286. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3287. var dtos = orderDtos
  3288. .Select(stu => _mapper.Map(stu, typeof(AcceptTypeStatisticsDto), dynamicClass))
  3289. .Cast<object>()
  3290. .ToList();
  3291. var stream = ExcelHelper.CreateStream(dtos);
  3292. return ExcelStreamResult(stream, "受理类型统计表数据");
  3293. }
  3294. /// <summary>
  3295. /// 根据时间查询受理类型统计
  3296. /// </summary>
  3297. /// <param name="dto"></param>
  3298. /// <returns></returns>
  3299. [HttpGet("accepttype-statistics-bydate")]
  3300. public async Task<object> AcceptTypeStatisticsByDate([FromQuery] AcceptTypeStatisticsByDateReq dto)
  3301. {
  3302. var (acceptList, items) = await _orderRepository.AcceptTypeStatisticsByDate(dto);
  3303. return new { AcceptType = acceptList, Data = items };
  3304. }
  3305. /// <summary>
  3306. /// 根据时间查询受理类型统计导出
  3307. /// </summary>
  3308. /// <param name="dto"></param>
  3309. /// <returns></returns>
  3310. [HttpPost("accepttype-statistics-bydate-export")]
  3311. public async Task<FileStreamResult> AcceptTypeStatisticsByDateExport([FromBody] AcceptTypeStatisticsByDateReq dto)
  3312. {
  3313. var returnList = await _orderRepository.AcceptTypeStatisticsByDateExport(dto);
  3314. var table = _orderRepository.InitAcceptTypeTable(returnList, dto.AddColumnName);
  3315. var stream = ExcelHelper.CreateStream(table);
  3316. return ExcelStreamResult(stream, "受理类型时间统计");
  3317. }
  3318. /// <summary>
  3319. /// 下级区域统计
  3320. /// </summary>
  3321. /// <param name="StartTime">开始时间</param>
  3322. /// <param name="EndTime">结束时间</param>
  3323. /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
  3324. /// <param name="AreaCode">上级区域Id</param>
  3325. /// <param name="Line">线路号</param>
  3326. /// <returns></returns>
  3327. [HttpGet("area_subordinate")]
  3328. public async Task<object> AreaSubordinate(DateTime StartTime, DateTime EndTime, int? TypeId, string? AreaCode, string? Line)
  3329. {
  3330. string count = "6";
  3331. if (!string.IsNullOrEmpty(AreaCode) && AreaCode != "511500")
  3332. count = (AreaCode.Length + 2).ToString();
  3333. if (string.IsNullOrEmpty(AreaCode))
  3334. AreaCode = "510000";
  3335. if (AreaCode == "510000")
  3336. {
  3337. var query = _orderRepository.Queryable()
  3338. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  3339. .WhereIF(TypeId != null && TypeId == 1, p => p.IdentityType == EIdentityType.Citizen)
  3340. .WhereIF(TypeId != null && TypeId == 2, p => p.IdentityType == EIdentityType.Enterprise)
  3341. .WhereIF(!string.IsNullOrEmpty(Line), p => p.TransferPhone == Line)
  3342. .Select(p => new
  3343. {
  3344. AreaCode = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  3345. })
  3346. .MergeTable()
  3347. .Select(p => new
  3348. {
  3349. AreaCode = SqlFunc.IIF(p.AreaCode != "519800" && p.AreaCode != "519900", "511500", p.AreaCode)
  3350. }
  3351. ).MergeTable()
  3352. .GroupBy(p => p.AreaCode)
  3353. .Select(p => new
  3354. {
  3355. AreaCode = p.AreaCode,
  3356. SumCount = SqlFunc.AggregateCount(p.AreaCode)
  3357. }
  3358. ).MergeTable();
  3359. var list = await _systemAreaRepository.Queryable()
  3360. .LeftJoin(query, (s, o) => s.Id == o.AreaCode)
  3361. .Where((s, o) => s.ParentId == AreaCode)
  3362. .Select((s, o) => new
  3363. {
  3364. AreaCode = s.Id,
  3365. SumCount = o.SumCount,
  3366. AreaName = s.AreaName,
  3367. HasChild = SqlFunc.Subqueryable<SystemArea>().Where(d => d.ParentId == o.AreaCode).Any()
  3368. })
  3369. .ToListAsync();
  3370. return list;
  3371. }
  3372. else
  3373. {
  3374. var query = _orderRepository.Queryable()
  3375. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  3376. .WhereIF(TypeId != null && TypeId == 1, p => p.IdentityType == EIdentityType.Citizen)
  3377. .WhereIF(TypeId != null && TypeId == 2, p => p.IdentityType == EIdentityType.Enterprise)
  3378. .WhereIF(!string.IsNullOrEmpty(Line), p => p.TransferPhone == Line)
  3379. .GroupBy(p => new { Id = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
  3380. .Select(p => new
  3381. {
  3382. AreaCode = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  3383. SumCount = SqlFunc.AggregateCount(p.AreaCode)
  3384. })
  3385. .MergeTable();
  3386. var list = await _systemAreaRepository.Queryable()
  3387. .LeftJoin(query, (s, o) => s.Id == o.AreaCode)
  3388. .Where((s, o) => s.ParentId == AreaCode)
  3389. .Select((s, o) => new
  3390. {
  3391. AreaCode = s.Id,
  3392. SumCount = o.SumCount,
  3393. AreaName = s.AreaName,
  3394. HasChild = SqlFunc.Subqueryable<SystemArea>().Where(d => d.ParentId == o.AreaCode).Any()
  3395. })
  3396. .ToListAsync();
  3397. return list;
  3398. }
  3399. }
  3400. /// <summary>
  3401. /// 热点满意度统计
  3402. /// </summary>
  3403. /// <param name="dto"></param>
  3404. /// <returns></returns>
  3405. [HttpGet("visit-hotspot-satisfaction-statistics")]
  3406. public async Task<Object> VisitAndHotspotSatisfactionStatistics([FromQuery] VisitAndHotspotPagedKeywordRequest dto)
  3407. {
  3408. var data = await _orderApplication.VisitAndHotspotSatisfactionStatistics(dto);
  3409. var sumModel = new VisitAndHotspotSatisfactionStatisticsDto()
  3410. {
  3411. HotspotName = "总计",
  3412. TotalSumCount = data.Sum(x => x.TotalSumCount),
  3413. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  3414. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  3415. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  3416. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  3417. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  3418. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  3419. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  3420. };
  3421. return new { DataList = data, SumModel = sumModel };
  3422. }
  3423. /// <summary>
  3424. /// 热点满意度统计导出
  3425. /// </summary>
  3426. /// <param name="dto"></param>
  3427. /// <returns></returns>
  3428. [HttpPost("visit-hotspot-satisfaction-statistics/_export")]
  3429. public async Task<FileStreamResult> VisitAndHotspotSatisfactionStatisticsExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
  3430. {
  3431. List<VisitAndHotspotSatisfactionStatisticsDto> data = await _orderApplication.VisitAndHotspotSatisfactionStatistics(dto.QueryDto);
  3432. var sumModel = new VisitAndHotspotSatisfactionStatisticsDto()
  3433. {
  3434. HotspotName = "总计",
  3435. TotalSumCount = data.Sum(x => x.TotalSumCount),
  3436. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  3437. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  3438. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  3439. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  3440. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  3441. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  3442. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  3443. };
  3444. data.Add(sumModel);
  3445. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3446. var dtos = data
  3447. .Select(stu => _mapper.Map(stu, typeof(VisitAndHotspotSatisfactionStatisticsDto), dynamicClass))
  3448. .Cast<object>()
  3449. .ToList();
  3450. var stream = ExcelHelper.CreateStream(dtos);
  3451. return ExcelStreamResult(stream, "热点满意度统计数据");
  3452. }
  3453. /// <summary>
  3454. /// 热点满意度明细
  3455. /// </summary>
  3456. /// <param name="dto"></param>
  3457. /// <returns></returns>
  3458. [HttpGet("visit-hotspot-satisfaction-detail")]
  3459. public async Task<PagedDto<OrderVisitDetailDto>> VisitAndHotspotSatisfactionDetail([FromQuery] VisitAndHotspotPagedKeywordRequest dto)
  3460. {
  3461. var (total, items) = await _orderApplication.VisitAndHotspotSatisfactionDetail(dto)
  3462. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3463. return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
  3464. }
  3465. /// <summary>
  3466. /// 热点满意度明细导出
  3467. /// </summary>
  3468. /// <param name="dto"></param>
  3469. /// <returns></returns>
  3470. [HttpPost("visit-hotspot-satisfaction-detail/_export")]
  3471. public async Task<FileStreamResult> VisitAndHotspotSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
  3472. {
  3473. var query = _orderApplication.VisitAndHotspotSatisfactionDetail(dto.QueryDto);
  3474. List<OrderVisitDetail> data;
  3475. if (dto.IsExportAll)
  3476. {
  3477. data = await query.ToListAsync(HttpContext.RequestAborted);
  3478. }
  3479. else
  3480. {
  3481. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3482. data = items;
  3483. }
  3484. var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
  3485. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3486. var dtos = dataDtos
  3487. .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
  3488. .Cast<object>()
  3489. .ToList();
  3490. var stream = ExcelHelper.CreateStream(dtos);
  3491. return ExcelStreamResult(stream, "热点满意度明细数据");
  3492. }
  3493. /// <summary>
  3494. /// 热点受理类型统计
  3495. /// </summary>
  3496. /// <param name="dto"></param>
  3497. /// <returns></returns>
  3498. [HttpGet("hotspot-accepttype-statistics")]
  3499. public async Task<object> HotspotAndAcceptTypeStatistics([FromQuery] HotspotAndAcceptTypeStatisticsReq dto)
  3500. {
  3501. var (areaList, returnList) = await _orderApplication.HotspotAndAcceptTypeStatistics(dto);
  3502. return new { AreaList = areaList, Data = returnList };
  3503. }
  3504. /// <summary>
  3505. /// 热点受理类型统计导出
  3506. /// </summary>
  3507. /// <param name="dto"></param>
  3508. /// <returns></returns>
  3509. [HttpPost("hotspot-accepttype-statistics-export")]
  3510. public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsExport([FromBody] HotspotAndAcceptTypeStatisticsReq dto)
  3511. {
  3512. var returnList = await _orderApplication.HotspotAndAcceptTypeStatisticsExport(dto);
  3513. var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
  3514. var stream = ExcelHelper.CreateStream(table);
  3515. return ExcelStreamResult(stream, "热点受理类型统计");
  3516. }
  3517. /// <summary>
  3518. /// 热点受理类型明细
  3519. /// </summary>
  3520. /// <param name="dto"></param>
  3521. /// <returns></returns>
  3522. [HttpGet("hotspot-accepttype-statistics-detail")]
  3523. public async Task<PagedDto<OrderDto>> HotspotAndAcceptTypeStatisticsDetail([FromQuery] HotspotAndAcceptTypeStatisticsDetailReq dto)
  3524. {
  3525. var (total, items) = await _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3526. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  3527. }
  3528. /// <summary>
  3529. /// 热点受理类型明细导出
  3530. /// </summary>
  3531. /// <param name="dto"></param>
  3532. /// <returns></returns>
  3533. [HttpPost("hotspot-accepttype-statistics-detail-export")]
  3534. public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAcceptTypeStatisticsDetailReq> dto)
  3535. {
  3536. var query = _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto.QueryDto);
  3537. List<Order> orders;
  3538. if (dto.IsExportAll)
  3539. {
  3540. orders = await query.ToListAsync(HttpContext.RequestAborted);
  3541. }
  3542. else
  3543. {
  3544. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3545. orders = items;
  3546. }
  3547. var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
  3548. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3549. var dtos = ordersDtos
  3550. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3551. .Cast<object>()
  3552. .ToList();
  3553. var stream = ExcelHelper.CreateStream(dtos);
  3554. return ExcelStreamResult(stream, "热点受理类型明细");
  3555. }
  3556. /// <summary>
  3557. /// 甄别申请统计
  3558. /// </summary>
  3559. /// <param name="dto"></param>
  3560. /// <returns></returns>
  3561. [HttpGet("screen-apply")]
  3562. public async Task<PagedDto<OrderScreenApplyVo>> OrderScreenApply([FromQuery] OrderScreenApplyPagedRequest dto)
  3563. {
  3564. var (total, items) = await _orderApplication.OrderScreenApply(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3565. return new PagedDto<OrderScreenApplyVo>(total, items);
  3566. }
  3567. /// <summary>
  3568. /// 甄别申请统计导出
  3569. /// </summary>
  3570. /// <param name="dto"></param>
  3571. /// <returns></returns>
  3572. [HttpPost("screen-apply-export")]
  3573. public async Task<FileStreamResult> OrderScreenApplyExport([FromBody] ExportExcelDto<OrderScreenApplyPagedRequest> dto)
  3574. {
  3575. var query = _orderApplication.OrderScreenApply(dto.QueryDto);
  3576. List<OrderScreenApplyVo> datas;
  3577. if (dto.IsExportAll)
  3578. {
  3579. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3580. }
  3581. else
  3582. {
  3583. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3584. datas = items;
  3585. }
  3586. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3587. var dtos = datas
  3588. .Select(stu => _mapper.Map(stu, typeof(OrderScreenApplyVo), dynamicClass))
  3589. .Cast<object>()
  3590. .ToList();
  3591. var stream = ExcelHelper.CreateStream(dtos);
  3592. return ExcelStreamResult(stream, "甄别申请统计");
  3593. }
  3594. /// <summary>
  3595. /// 甄别审批统计
  3596. /// </summary>
  3597. /// <param name="dto"></param>
  3598. /// <returns></returns>
  3599. [HttpGet("screen-audit")]
  3600. public async Task<PagedDto<OrderScreenAuditVo>> OrderScreenAudit([FromQuery] OrderScreenAuditPagedRequest dto)
  3601. {
  3602. var (total, items) = await _orderApplication.OrderScreenAudit(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3603. return new PagedDto<OrderScreenAuditVo>(total, items);
  3604. }
  3605. /// <summary>
  3606. /// 甄别审批统计导出
  3607. /// </summary>
  3608. /// <param name="dto"></param>
  3609. /// <returns></returns>
  3610. [HttpPost("screen-audit-export")]
  3611. public async Task<FileStreamResult> OrderScreenAuditExport([FromBody] ExportExcelDto<OrderScreenAuditPagedRequest> dto)
  3612. {
  3613. var query = _orderApplication.OrderScreenAudit(dto.QueryDto);
  3614. List<OrderScreenAuditVo> datas;
  3615. if (dto.IsExportAll)
  3616. {
  3617. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3618. }
  3619. else
  3620. {
  3621. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3622. datas = items;
  3623. }
  3624. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3625. var dtos = datas
  3626. .Select(stu => _mapper.Map(stu, typeof(OrderScreenAuditVo), dynamicClass))
  3627. .Cast<object>()
  3628. .ToList();
  3629. var stream = ExcelHelper.CreateStream(dtos);
  3630. return ExcelStreamResult(stream, "甄别审批统计");
  3631. }
  3632. /// <summary>
  3633. /// 未签收统计
  3634. /// </summary>
  3635. /// <param name="dto"></param>
  3636. /// <returns></returns>
  3637. [HttpGet("get_order_nosigen")]
  3638. public async Task<object> GetOrderNoSigen([FromQuery] OrderNoSigenRequestDto dto)
  3639. {
  3640. var items = await _orderReportApplication.GetOrderNoSigen(dto);
  3641. var total = new OrderNoSigenDto
  3642. {
  3643. OrgName = "合计",
  3644. OrgCode = "",
  3645. OrderNoSigen = items.Sum(p => p.OrderNoSigen),
  3646. CounterNoSign = items.Sum(p => p.CounterNoSign)
  3647. };
  3648. return new { List = items, Total = total };
  3649. }
  3650. /// <summary>
  3651. /// 未签收统计--导出
  3652. /// </summary>
  3653. /// <param name="dto"></param>
  3654. /// <returns></returns>
  3655. [HttpPost("get_order_nosigen_export")]
  3656. public async Task<FileStreamResult> ExportGetOrderNoSigen([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
  3657. {
  3658. var list = await _orderReportApplication.GetOrderNoSigen(dto.QueryDto);
  3659. //增加合计
  3660. list.Add(new OrderNoSigenDto
  3661. {
  3662. OrgName = "合计",
  3663. OrgCode = "",
  3664. OrderNoSigen = list.Sum(p => p.OrderNoSigen),
  3665. CounterNoSign = list.Sum(p => p.CounterNoSign)
  3666. });
  3667. var orderDtos = _mapper.Map<ICollection<OrderNoSigenDto>>(list);
  3668. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3669. var dtos = orderDtos
  3670. .Select(stu => _mapper.Map(stu, typeof(OrderNoSigenDto), dynamicClass))
  3671. .Cast<object>()
  3672. .ToList();
  3673. var stream = ExcelHelper.CreateStream(dtos);
  3674. return ExcelStreamResult(stream, "未签收统计数据");
  3675. }
  3676. /// <summary>
  3677. /// 未签收统计--明细
  3678. /// </summary>
  3679. /// <param name="dto"></param>
  3680. /// <returns></returns>
  3681. [HttpGet("get_order_nosigen_detail")]
  3682. public async Task<PagedDto<OrderDto>> GetOrderNoSigenDetail([FromQuery] OrderNoSigenRequestDto dto)
  3683. {
  3684. RefAsync<int> total = 0;
  3685. var queryData = await _orderReportApplication.GetOrderNoSigenDetail(dto)
  3686. .Select(o => new { o })
  3687. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  3688. var dtos = queryData.Select(d =>
  3689. {
  3690. var dto = _mapper.Map<OrderDto>(d.o);
  3691. return dto;
  3692. }).ToList();
  3693. return new PagedDto<OrderDto>(total, dtos);
  3694. }
  3695. /// <summary>
  3696. /// 未签收统计--明细--导出
  3697. /// </summary>
  3698. /// <param name="dto"></param>
  3699. /// <returns></returns>
  3700. [HttpPost("get_order_nosigen_detail_export")]
  3701. public async Task<FileStreamResult> ExportGetOrderNoSigenDetail([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
  3702. {
  3703. var query = _orderReportApplication.GetOrderNoSigenDetail(dto.QueryDto).Select(o => new { o });
  3704. List<OrderDto> list = new();
  3705. if (dto.IsExportAll)
  3706. {
  3707. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  3708. list = listData.Select(d =>
  3709. {
  3710. var dto = _mapper.Map<OrderDto>(d.o);
  3711. return dto;
  3712. }).ToList();
  3713. }
  3714. else
  3715. {
  3716. RefAsync<int> total = 0;
  3717. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  3718. list = listData.Select(d =>
  3719. {
  3720. var dto = _mapper.Map<OrderDto>(d.o);
  3721. return dto;
  3722. }).ToList();
  3723. }
  3724. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3725. var dtos = list
  3726. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3727. .Cast<object>()
  3728. .ToList();
  3729. var stream = ExcelHelper.CreateStream(dtos);
  3730. return ExcelStreamResult(stream, "未签收统计明细数据");
  3731. }
  3732. /// <summary>
  3733. /// 企业专席信件统计
  3734. /// </summary>
  3735. /// <param name="dto"></param>
  3736. /// <returns></returns>
  3737. [HttpGet("get_enterprise_seats_report")]
  3738. public async Task<object> GetEnterpriseSeatsReport([FromQuery] EnterpriseSeatsReportRequestDto dto)
  3739. {
  3740. var items = await _orderReportApplication.GetEnterpriseSeatsReport(dto);
  3741. var total = new EnterpriseSeatsReportDto
  3742. {
  3743. UserName = "合计",
  3744. UserId = "",
  3745. UserNo = "",
  3746. TelCallNum = items.Sum(p => p.TelCallNum),
  3747. OrderNum = items.Sum(p => p.OrderNum),
  3748. };
  3749. return new { List = items, Total = total };
  3750. }
  3751. /// <summary>
  3752. /// 企业专席信件统计--导出
  3753. /// </summary>
  3754. /// <param name="dto"></param>
  3755. /// <returns></returns>
  3756. [HttpPost("get_enterprise_seats_report_export")]
  3757. public async Task<FileStreamResult> ExportGetEnterpriseSeatsReport([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
  3758. {
  3759. var list = await _orderReportApplication.GetEnterpriseSeatsReport(dto.QueryDto);
  3760. //增加合计
  3761. list.Add(new EnterpriseSeatsReportDto
  3762. {
  3763. UserName = "合计",
  3764. UserId = "",
  3765. UserNo = "",
  3766. TelCallNum = list.Sum(p => p.TelCallNum),
  3767. OrderNum = list.Sum(p => p.OrderNum),
  3768. });
  3769. var orderDtos = _mapper.Map<ICollection<EnterpriseSeatsReportDto>>(list);
  3770. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3771. var dtos = orderDtos
  3772. .Select(stu => _mapper.Map(stu, typeof(EnterpriseSeatsReportDto), dynamicClass))
  3773. .Cast<object>()
  3774. .ToList();
  3775. var stream = ExcelHelper.CreateStream(dtos);
  3776. return ExcelStreamResult(stream, "企业专席信件统计");
  3777. }
  3778. /// <summary>
  3779. /// 企业专席信件统计--明细
  3780. /// </summary>
  3781. /// <param name="dto"></param>
  3782. /// <returns></returns>
  3783. [HttpGet("get_enterprise_seats_report_detail")]
  3784. public async Task<PagedDto<OrderDto>> GetEnterpriseSeatsReportDetail([FromQuery] EnterpriseSeatsReportRequestDto dto)
  3785. {
  3786. RefAsync<int> total = 0;
  3787. var queryData = await _orderReportApplication.GetEnterpriseSeatsReportDetail(dto)
  3788. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  3789. return new PagedDto<OrderDto>(total, _mapper.Map<List<OrderDto>>(queryData));
  3790. }
  3791. /// <summary>
  3792. /// 企业专席信件统计--明细--导出
  3793. /// </summary>
  3794. /// <param name="dto"></param>
  3795. /// <returns></returns>
  3796. [HttpPost("get_enterprise_seats_report_detail_export")]
  3797. public async Task<FileStreamResult> ExportGetEnterpriseSeatsReportDetail([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
  3798. {
  3799. var query = _orderReportApplication.GetEnterpriseSeatsReportDetail(dto.QueryDto);
  3800. List<OrderDto> list = new();
  3801. if (dto.IsExportAll)
  3802. {
  3803. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  3804. list = _mapper.Map<List<OrderDto>>(listData);
  3805. }
  3806. else
  3807. {
  3808. RefAsync<int> total = 0;
  3809. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  3810. list = _mapper.Map<List<OrderDto>>(listData);
  3811. }
  3812. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3813. var dtos = list
  3814. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3815. .Cast<object>()
  3816. .ToList();
  3817. var stream = ExcelHelper.CreateStream(dtos);
  3818. return ExcelStreamResult(stream, "企业专席信件统计");
  3819. }
  3820. /// <summary>
  3821. /// 中心受理统计
  3822. /// </summary>
  3823. /// <param name="dto"></param>
  3824. /// <returns></returns>
  3825. [HttpGet("center-accept")]
  3826. public async Task<List<OrderCenterAcceptVo>> OrderCenterAccept([FromQuery] OrderCenterAcceptPagedRequest dto)
  3827. {
  3828. var items = await _orderApplication.OrderCenterAccept(dto).ToListAsync(HttpContext.RequestAborted);
  3829. items.Add(new OrderCenterAcceptVo
  3830. {
  3831. Time = "合计",
  3832. AcceptNum = items.Sum(p => p.AcceptNum),
  3833. ValidNum = items.Sum(p => p.ValidNum),
  3834. RepetitionNum = items.Sum(p => p.RepetitionNum),
  3835. InvalidNum = items.Sum(p => p.InvalidNum),
  3836. HandleNum = items.Sum(p => p.HandleNum),
  3837. NoHandleNum = items.Sum(p => p.NoHandleNum),
  3838. BackNum = items.Sum(p => p.BackNum),
  3839. DutyDeskNum = items.Sum(p => p.DutyDeskNum),
  3840. });
  3841. return items;
  3842. }
  3843. /// <summary>
  3844. /// 中心受理统计导出
  3845. /// </summary>
  3846. /// <param name="dto"></param>
  3847. /// <returns></returns>
  3848. [HttpPost("center-accept-export")]
  3849. public async Task<FileStreamResult> OrderCenterAcceptExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  3850. {
  3851. var query = _orderApplication.OrderCenterAccept(dto.QueryDto);
  3852. List<OrderCenterAcceptVo> datas;
  3853. if (dto.IsExportAll)
  3854. {
  3855. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3856. }
  3857. else
  3858. {
  3859. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3860. datas = items;
  3861. }
  3862. datas.Add(new OrderCenterAcceptVo
  3863. {
  3864. Time = "合计",
  3865. AcceptNum = datas.Sum(p => p.AcceptNum),
  3866. ValidNum = datas.Sum(p => p.ValidNum),
  3867. RepetitionNum = datas.Sum(p => p.RepetitionNum),
  3868. InvalidNum = datas.Sum(p => p.InvalidNum),
  3869. HandleNum = datas.Sum(p => p.HandleNum),
  3870. NoHandleNum = datas.Sum(p => p.NoHandleNum),
  3871. BackNum = datas.Sum(p => p.BackNum),
  3872. DutyDeskNum = datas.Sum(p => p.DutyDeskNum),
  3873. });
  3874. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3875. var dtos = datas
  3876. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptVo), dynamicClass))
  3877. .Cast<object>()
  3878. .ToList();
  3879. var stream = ExcelHelper.CreateStream(dtos);
  3880. return ExcelStreamResult(stream, "中心受理统计");
  3881. }
  3882. /// <summary>
  3883. /// 中心受理值班坐席统计
  3884. /// </summary>
  3885. /// <param name="dto"></param>
  3886. /// <returns></returns>
  3887. [HttpGet("center-accept-user")]
  3888. public async Task<PagedDto<OrderCenterAcceptUserVo>> OrderCenterAcceptUser([FromQuery] OrderCenterAcceptPagedRequest dto)
  3889. {
  3890. var (total, items) = await _orderApplication.OrderCenterAcceptUser(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3891. return new PagedDto<OrderCenterAcceptUserVo>(total, items);
  3892. }
  3893. /// <summary>
  3894. /// 中心受理值班坐席统计导出
  3895. /// </summary>
  3896. /// <param name="dto"></param>
  3897. /// <returns></returns>
  3898. [HttpPost("center-accept-user-export")]
  3899. public async Task<FileStreamResult> OrderCenterAcceptUserExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  3900. {
  3901. var query = _orderApplication.OrderCenterAcceptUser(dto.QueryDto);
  3902. List<OrderCenterAcceptUserVo> datas;
  3903. if (dto.IsExportAll)
  3904. {
  3905. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3906. }
  3907. else
  3908. {
  3909. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3910. datas = items;
  3911. }
  3912. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3913. var dtos = datas
  3914. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptUserVo), dynamicClass))
  3915. .Cast<object>()
  3916. .ToList();
  3917. var stream = ExcelHelper.CreateStream(dtos);
  3918. return ExcelStreamResult(stream, "中心受理值班坐席统计");
  3919. }
  3920. /// <summary>
  3921. /// 中心受理时间段统计
  3922. /// </summary>
  3923. /// <param name="dto"></param>
  3924. /// <returns></returns>
  3925. [HttpGet("center-accept-hour")]
  3926. public async Task<List<OrderCenterAcceptHourVo>> OrderCenterAcceptHour([FromQuery] OrderCenterAcceptPagedRequest dto)
  3927. {
  3928. var items = await _orderRepository.OrderCenterAcceptHour(dto).ToListAsync(HttpContext.RequestAborted);
  3929. return items;
  3930. }
  3931. /// <summary>
  3932. /// 中心受理时间段统计导出
  3933. /// </summary>
  3934. /// <param name="dto"></param>
  3935. /// <returns></returns>
  3936. [HttpPost("center-accept-hour-export")]
  3937. public async Task<FileStreamResult> OrderCenterAcceptHourExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  3938. {
  3939. var query = _orderRepository.OrderCenterAcceptHour(dto.QueryDto);
  3940. List<OrderCenterAcceptHourVo> datas;
  3941. if (dto.IsExportAll)
  3942. {
  3943. datas = await query.ToListAsync(HttpContext.RequestAborted);
  3944. }
  3945. else
  3946. {
  3947. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3948. datas = items;
  3949. }
  3950. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  3951. var dtos = datas
  3952. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptHourVo), dynamicClass))
  3953. .Cast<object>()
  3954. .ToList();
  3955. var stream = ExcelHelper.CreateStream(dtos);
  3956. return ExcelStreamResult(stream, "中心受理时间段统计");
  3957. }
  3958. /// <summary>
  3959. /// 数据清单基础数据
  3960. /// </summary>
  3961. /// <returns></returns>
  3962. [HttpGet("order-data-inventory-basedata")]
  3963. public async Task<object> OrderDataInventoryBaseData()
  3964. {
  3965. var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
  3966. var definition = wfModule.Definition;
  3967. return new
  3968. {
  3969. OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
  3970. ChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel),
  3971. ScreenStatusOptions = EnumExts.GetDescriptions<EScreenStatus>(),
  3972. AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
  3973. IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
  3974. FromGenderOptions = EnumExts.GetDescriptions<EGender>(),
  3975. ExpiredStatusOptions = EnumExts.GetDescriptions<EExpiredStatusEx>(),
  3976. PushTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.PushType),
  3977. CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
  3978. OrgsOptions = await _organizeRepository.GetOrgJson(),
  3979. GenderOptions = EnumExts.GetDescriptions<EGender>(),
  3980. };
  3981. }
  3982. /// <summary>
  3983. /// 数据清单
  3984. /// </summary>
  3985. /// <param name="dto"></param>
  3986. /// <returns></returns>
  3987. [HttpGet("order-data-inventory")]
  3988. public async Task<PagedDto<OrderDataInventoryRep>> OrderDataInventory([FromQuery] OrderDataInventoryReq dto)
  3989. {
  3990. var (total, items) = await _orderRepository.OrderDataInventory(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3991. return new PagedDto<OrderDataInventoryRep>() { Total = total, Items = items };
  3992. }
  3993. /// <summary>
  3994. /// 数据清单导出
  3995. /// </summary>
  3996. /// <param name="dto"></param>
  3997. /// <returns></returns>
  3998. [HttpPost("order-data-inventory-export")]
  3999. public async Task<FileStreamResult> OrderDataInventoryExport([FromBody] ExportExcelDto<OrderDataInventoryReq> dto)
  4000. {
  4001. var query = _orderRepository.OrderDataInventory(dto.QueryDto);
  4002. List<OrderDataInventoryRep> orders;
  4003. if (dto.IsExportAll)
  4004. {
  4005. orders = await query.ToListAsync(HttpContext.RequestAborted);
  4006. }
  4007. else
  4008. {
  4009. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  4010. orders = items;
  4011. }
  4012. var ordersDtos = _mapper.Map<ICollection<OrderDataInventoryRep>>(orders);
  4013. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  4014. var dtos = ordersDtos
  4015. .Select(stu => _mapper.Map(stu, typeof(OrderDataInventoryRep), dynamicClass))
  4016. .Cast<object>()
  4017. .ToList();
  4018. var stream = ExcelHelper.CreateStream(dtos);
  4019. return ExcelStreamResult(stream, "数据清单明细");
  4020. }
  4021. /// <summary>
  4022. /// 扭转信件统计
  4023. /// </summary>
  4024. /// <param name="dto"></param>
  4025. /// <returns></returns>
  4026. [HttpGet("ordervisit-jude-statistics")]
  4027. public async Task<List<OrderVisitJudeStatisticsRep>> OrderVisitJudeStatistics([FromQuery] OrderVisitJudeStatisticsReq dto)
  4028. {
  4029. var list = await _orderApplication.OrderVisitJudeStatistics(dto).ToListAsync();
  4030. return list;
  4031. }
  4032. /// <summary>
  4033. /// 扭转信件统计
  4034. /// </summary>
  4035. /// <param name="dto"></param>
  4036. /// <returns></returns>
  4037. [HttpPost("ordervisit-jude-statistics-export")]
  4038. public async Task<FileStreamResult> OrderVisitJudeStatisticsExport([FromBody] ExportExcelDto<OrderVisitJudeStatisticsReq> dto)
  4039. {
  4040. var query = _orderApplication.OrderVisitJudeStatistics(dto.QueryDto);
  4041. List<OrderVisitJudeStatisticsRep> exportList;
  4042. exportList = await query.ToListAsync(HttpContext.RequestAborted);
  4043. var ordersDtos = _mapper.Map<ICollection<OrderVisitJudeStatisticsRep>>(exportList);
  4044. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
  4045. var dtos = ordersDtos
  4046. .Select(stu => _mapper.Map(stu, typeof(OrderVisitJudeStatisticsRep), dynamicClass))
  4047. .Cast<object>()
  4048. .ToList();
  4049. var stream = ExcelHelper.CreateStream(dtos);
  4050. return ExcelStreamResult(stream, "扭转信件统计");
  4051. }
  4052. /// <summary>
  4053. /// 部门延期统计明细-单独菜单
  4054. /// </summary>
  4055. /// <param name="dto"></param>
  4056. /// <returns></returns>
  4057. [HttpGet("order_delay_detail")]
  4058. public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetailAsync([FromQuery] QueryOrderDelayDataDetailRequest dto)
  4059. {
  4060. var query = _orderDelayRepository.Queryable()
  4061. .Includes(x => x.Order)
  4062. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  4063. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  4064. .WhereIF(dto.TypeId != null && dto.TypeId == 1, x => x.Order.IdentityType == EIdentityType.Citizen)
  4065. .WhereIF(dto.TypeId != null && dto.TypeId == 2, x => x.Order.IdentityType == EIdentityType.Enterprise)
  4066. .WhereIF(dto.Type is 1, x => x.DelayState == EDelayState.Pass)
  4067. .WhereIF(dto.Type is 2, x => x.DelayState == EDelayState.NoPass)
  4068. .WhereIF(dto.Type is 3, x => x.DelayState == EDelayState.Examining)
  4069. .WhereIF(dto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
  4070. .MergeTable();
  4071. if (_sessionContext.OrgIsCenter == false)
  4072. query = query.Where(x => x.ApplyOrgCode.StartsWith(_sessionContext.OrgId));
  4073. var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  4074. return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
  4075. }
  4076. }
  4077. }