BiOrderController.cs 367 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329
  1. using Hotline.Api.Filter;
  2. using Hotline.Application.ExportExcel;
  3. using Hotline.Application.FlowEngine;
  4. using Hotline.Application.OrderApp;
  5. using Hotline.Application.StatisticalReport;
  6. using Hotline.Application.Systems;
  7. using Hotline.Caching.Interfaces;
  8. using Hotline.CallCenter.Calls;
  9. using Hotline.Configurations;
  10. using Hotline.FlowEngine.WorkflowModules;
  11. using Hotline.FlowEngine.Workflows;
  12. using Hotline.KnowledgeBase;
  13. using Hotline.Orders;
  14. using Hotline.Repository.SqlSugar.Extensions;
  15. using Hotline.Schedulings;
  16. using Hotline.SeedData;
  17. using Hotline.Settings;
  18. using Hotline.Settings.Hotspots;
  19. using Hotline.Settings.TimeLimitDomain;
  20. using Hotline.Settings.TimeLimits;
  21. using Hotline.Share.Dtos;
  22. using Hotline.Share.Dtos.Bi;
  23. using Hotline.Share.Dtos.Bigscreen;
  24. using Hotline.Share.Dtos.CallCenter;
  25. using Hotline.Share.Dtos.Order;
  26. using Hotline.Share.Enums.CallCenter;
  27. using Hotline.Share.Enums.FlowEngine;
  28. using Hotline.Share.Enums.Order;
  29. using Hotline.Share.Requests;
  30. using Hotline.Share.Tools;
  31. using Hotline.Tools;
  32. using MapsterMapper;
  33. using Microsoft.AspNetCore.Authorization;
  34. using Microsoft.AspNetCore.Mvc;
  35. using Microsoft.Extensions.Options;
  36. using SqlSugar;
  37. using System.Data;
  38. using XF.Domain.Authentications;
  39. using XF.Domain.Exceptions;
  40. using XF.Domain.Repository;
  41. using XF.Utility.EnumExtensions;
  42. using Hotline.Statistics;
  43. using DocumentFormat.OpenXml.Drawing;
  44. using DocumentFormat.OpenXml.Bibliography;
  45. using NPOI.SS.Formula.Functions;
  46. using Hotline.Share.Dtos.File;
  47. using Hotline.File;
  48. using Hotline.KnowledgeBase;
  49. using DocumentFormat.OpenXml.Vml.Spreadsheet;
  50. using Hotline.Application.OrderApp;
  51. using Hotline.Share.Tools;
  52. using MediatR;
  53. using static Hotline.AppDefaults;
  54. using Hotline.Ai.Visit;
  55. namespace Hotline.Api.Controllers.Bi
  56. {
  57. public class BiOrderController : BaseController
  58. {
  59. private readonly IExportApplication _exportApplication;
  60. private readonly BaseDataApplication _baseDataApplication;
  61. private readonly IOrderRepository _orderRepository;
  62. private readonly IRepository<Hotspot> _hotspotTypeRepository;
  63. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  64. private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
  65. private readonly IRepository<OrderDelay> _orderDelayRepository;
  66. private readonly IMapper _mapper;
  67. private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
  68. private readonly IRepository<OrderSpecial> _orderSpecialRepository;
  69. private readonly IRepository<OrderVisit> _orderVisitRepository;
  70. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  71. private readonly IRepository<OrderPublish> _orderPublishRepository;
  72. private readonly ISystemOrganizeRepository _systemOrganizeRepository;
  73. private readonly IRepository<AiOrderVisitDetail> _aiOrderVisitDetailRepository;
  74. private readonly ISessionContext _sessionContext;
  75. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  76. private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
  77. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  78. private readonly IRepository<WorkflowStep> _workflowStepRepository;
  79. private readonly IRepository<OrderScreen> _orderScreenRepository;
  80. private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
  81. private readonly IOrderApplication _orderApplication;
  82. private readonly IOrderVisitApplication _orderVisitApplication;
  83. //private readonly ITimeLimitDomainService _timeLimitDomainService;
  84. private readonly IOrderReportApplication _orderReportApplication;
  85. private readonly IRepository<SystemArea> _systemAreaRepository;
  86. private readonly IRepository<Hotspot> _hotspotRepository;
  87. private readonly IRepository<SystemDicData> _systemDicDataRepository;
  88. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  89. private readonly ICalcExpireTime _expireTime;
  90. private readonly IWorkflowApplication _workflowApplication;
  91. private readonly ISystemOrganizeRepository _organizeRepository;
  92. private readonly IRepository<CallNative> _callNativeRepository;
  93. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  94. private readonly IRepository<OrderTsDetails> _orderTsDetailsRepository;
  95. private readonly IRepository<KnowledgeQuote> _knowledgeQuoteRepository;
  96. private readonly IRepository<OrderUrge> _orderUrgeRepository;
  97. public BiOrderController(
  98. IOrderRepository orderRepository,
  99. IRepository<Hotspot> hotspotTypeRepository,
  100. ISystemDicDataCacheManager sysDicDataCacheManager,
  101. IRepository<OrderVisitDetail> orderVisitDetailRepository,
  102. IRepository<OrderDelay> orderDelayRepository,
  103. IRepository<WorkflowCountersign> workflowCountersignRepository,
  104. IRepository<OrderSpecial> orderSpecialRepository,
  105. IMapper mapper,
  106. IRepository<OrderVisit> orderVisitRepository,
  107. IRepository<TrCallRecord> trCallRecordRepository,
  108. IRepository<OrderPublish> orderPublishRepository,
  109. ISystemOrganizeRepository systemOrganizeRepository,
  110. IRepository<AiOrderVisitDetail> aiOrderVisitDetailRepository,
  111. ISessionContext sessionContext,
  112. ISystemSettingCacheManager systemSettingCacheManager,
  113. IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
  114. IRepository<WorkflowTrace> workflowTraceRepository,
  115. IRepository<OrderScreen> orderScreenRepository,
  116. IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
  117. IOrderApplication orderApplication,
  118. //ITimeLimitDomainService timeLimitDomainService,
  119. IOrderReportApplication orderReportApplication,
  120. IRepository<SystemArea> systemAreaRepository,
  121. IRepository<Hotspot> hotspotRepository,
  122. IRepository<SystemDicData> systemDicDataRepository,
  123. ISystemDicDataCacheManager systemDicDataCacheManager,
  124. IRepository<WorkflowStep> workflowStepRepository,
  125. IWorkflowApplication workflowApplication,
  126. ICalcExpireTime expireTime,
  127. ISystemOrganizeRepository organizeRepository,
  128. BaseDataApplication baseDataApplication,
  129. IExportApplication exportApplication,
  130. IOrderVisitApplication orderVisitApplication,
  131. IRepository<CallNative> callNativeRepository,
  132. IOptionsSnapshot<AppConfiguration> appOptions,
  133. IRepository<OrderTsDetails> orderTsDetailsRepository,
  134. IRepository<KnowledgeQuote> knowledgeQuoteRepository,
  135. IRepository<OrderUrge> orderUrgeRepository)
  136. {
  137. _orderRepository = orderRepository;
  138. _hotspotTypeRepository = hotspotTypeRepository;
  139. _sysDicDataCacheManager = sysDicDataCacheManager;
  140. _orderVisitDetailRepository = orderVisitDetailRepository;
  141. _orderDelayRepository = orderDelayRepository;
  142. _workflowCountersignRepository = workflowCountersignRepository;
  143. _orderSpecialRepository = orderSpecialRepository;
  144. _mapper = mapper;
  145. _orderVisitRepository = orderVisitRepository;
  146. _trCallRecordRepository = trCallRecordRepository;
  147. _orderPublishRepository = orderPublishRepository;
  148. _systemOrganizeRepository = systemOrganizeRepository;
  149. _aiOrderVisitDetailRepository = aiOrderVisitDetailRepository;
  150. _sessionContext = sessionContext;
  151. _systemSettingCacheManager = systemSettingCacheManager;
  152. _orderSpecialDetailRepository = orderSpecialDetailRepository;
  153. _workflowTraceRepository = workflowTraceRepository;
  154. _orderScreenRepository = orderScreenRepository;
  155. _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
  156. _orderApplication = orderApplication;
  157. //_timeLimitDomainService = timeLimitDomainService;
  158. _orderReportApplication = orderReportApplication;
  159. _systemAreaRepository = systemAreaRepository;
  160. _hotspotRepository = hotspotRepository;
  161. _systemDicDataRepository = systemDicDataRepository;
  162. _systemDicDataCacheManager = systemDicDataCacheManager;
  163. _workflowStepRepository = workflowStepRepository;
  164. _workflowApplication = workflowApplication;
  165. _expireTime = expireTime;
  166. _organizeRepository = organizeRepository;
  167. _baseDataApplication = baseDataApplication;
  168. _exportApplication = exportApplication;
  169. _orderVisitApplication = orderVisitApplication;
  170. _callNativeRepository = callNativeRepository;
  171. _appOptions = appOptions;
  172. _orderTsDetailsRepository = orderTsDetailsRepository;
  173. _knowledgeQuoteRepository = knowledgeQuoteRepository;
  174. _orderUrgeRepository = orderUrgeRepository;
  175. }
  176. /// <summary>
  177. /// 部门发布量统计
  178. /// </summary>
  179. /// <param name="dto"></param>
  180. /// <returns></returns>
  181. [HttpGet("published/statistics/department")]
  182. public async Task<PagedDto<PublishedOrderStatisticsDto>> QueryPublishedOrderDepartmentAsync([FromQuery] QueryOrderPublishStatisticsAllDto dto)
  183. {
  184. var (total, items) = await _orderApplication.QueryPublishedOrderDepartmentAsync(dto, false);
  185. return new PagedDto<PublishedOrderStatisticsDto>(total, _mapper.Map<IReadOnlyList<PublishedOrderStatisticsDto>>(items));
  186. }
  187. /// <summary>
  188. /// 部门发布量统计-导出
  189. /// </summary>
  190. /// <param name="dto"></param>
  191. /// <returns></returns>
  192. [HttpPost("published/statistics/department/export")]
  193. [LogFilterAlpha("导出日志")]
  194. public async Task<FileStreamResult> ExportQueryPublishedOrderDepartmentAsync([FromBody] ExportExcelDto<QueryOrderPublishStatisticsAllDto> dto)
  195. {
  196. var (total, list) = await _orderApplication.QueryPublishedOrderDepartmentAsync(dto.QueryDto, dto.IsExportAll);
  197. if (list != null && list.Count > 0)
  198. {
  199. list.Add(new PublishedOrderStatisticsDto()
  200. {
  201. Name = "合计",
  202. PrivateCount = list.Sum(m => m.PrivateCount),
  203. // TotalCount = list.Sum(p => p.TotalCount),
  204. PublicCount = list.Sum(m => m.PublicCount),
  205. WaitCount = list.Sum(m => m.WaitCount)
  206. });
  207. }
  208. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<PublishedOrderStatisticsDto>(dto.ColumnInfos);
  209. var dtos = list
  210. .Select(stu => _mapper.Map(stu, typeof(PublishedOrderStatisticsDto), dynamicClass))
  211. .Cast<object>()
  212. .ToList();
  213. var stream = ExcelHelper.CreateStream(dtos);
  214. return ExcelStreamResult(stream, "部门发布量统计");
  215. }
  216. /// <summary>
  217. /// 发布量统计
  218. /// </summary>
  219. /// <param name="dto"></param>
  220. /// <returns></returns>
  221. [HttpGet("published/statistics/user")]
  222. public async Task<PagedDto<PublishedOrderStatisticsDto>> QueryPublishedOrderUserAsync([FromQuery] QueryOrderPublishStatisticsDto dto)
  223. {
  224. var (total, list) = await _orderApplication.QueryPublishedOrderAsync(dto, false);
  225. return new PagedDto<PublishedOrderStatisticsDto>(total, _mapper.Map<IReadOnlyList<PublishedOrderStatisticsDto>>(list));
  226. }
  227. /// <summary>
  228. /// 发布量统计-导出
  229. /// </summary>
  230. /// <param name="dto"></param>
  231. /// <returns></returns>
  232. [HttpPost("published/statistics/user/export")]
  233. [LogFilterAlpha("导出日志")]
  234. public async Task<FileStreamResult> ExportQueryPublishedOrder([FromBody] ExportExcelDto<QueryOrderPublishStatisticsDto> dto)
  235. {
  236. var (total, list) = await _orderApplication.QueryPublishedOrderAsync(dto.QueryDto, dto.IsExportAll);
  237. if (list != null && list.Count > 0)
  238. {
  239. list.Add(new PublishedOrderStatisticsDto()
  240. {
  241. Name = "合计",
  242. PrivateCount = list.Sum(m => m.PrivateCount),
  243. //TotalCount = list.Sum(p => p.TotalCount),
  244. PublicCount = list.Sum(m => m.PublicCount),
  245. WaitCount = list.Sum(m => m.WaitCount)
  246. });
  247. }
  248. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<PublishedOrderStatisticsDto>(dto.ColumnInfos);
  249. var dtos = list
  250. .Select(stu => _mapper.Map(stu, typeof(PublishedOrderStatisticsDto), dynamicClass))
  251. .Cast<object>()
  252. .ToList();
  253. var stream = ExcelHelper.CreateStream(dtos);
  254. return ExcelStreamResult(stream, "发布量统计");
  255. }
  256. /// <summary>
  257. /// 发布量统计
  258. /// </summary>
  259. /// <param name="dto"></param>
  260. /// <returns></returns>
  261. [HttpGet("published/statistics")]
  262. public async Task<PublishedOrderStatisticsDto> QueryPublishedOrderAsync([FromQuery] QueryOrderPublishStatisticsAllDto dto)
  263. {
  264. var waitCount = await _orderRepository.Queryable()
  265. .Where(order => order.Status == EOrderStatus.Filed)
  266. .Select(order => SqlFunc.AggregateCount(order.Id))
  267. .FirstAsync();
  268. var publicCount = await _orderPublishRepository.Queryable()
  269. .Where(publish => publish.CreationTime >= dto.StartTime && publish.CreationTime <= dto.EndTime)
  270. .Where(publish => publish.PublishState == true)
  271. .Select(publish => SqlFunc.AggregateCount(publish.Id))
  272. .FirstAsync();
  273. var privateCount = await _orderPublishRepository.Queryable()
  274. .Where(publish => publish.CreationTime >= dto.StartTime && publish.CreationTime <= dto.EndTime)
  275. .Where(publish => publish.PublishState == false)
  276. .Select(publish => SqlFunc.AggregateCount(publish.Id))
  277. .FirstAsync();
  278. return new PublishedOrderStatisticsDto
  279. {
  280. // TotalCount = totalCount,
  281. PrivateCount = privateCount,
  282. PublicCount = publicCount,
  283. WaitCount = waitCount
  284. };
  285. }
  286. /// <summary>
  287. /// 回访来源统计
  288. /// </summary>
  289. /// <returns></returns>
  290. [HttpGet("visit/source")]
  291. public async Task<IList<OrderVisitSourceChannelDto>> QueryOrderVisitSourceChannelAsync([FromQuery] QueryOrderVisitSourceChannelDto dto)
  292. => await _orderApplication.QueryOrderVisitSourceChannelAsync(dto);
  293. /// <summary>
  294. /// 回访来源统计--导出
  295. /// </summary>
  296. /// <returns></returns>
  297. [HttpPost("visit/source/export")]
  298. [LogFilterAlpha("导出日志")]
  299. public async Task<FileStreamResult> QueryOrderVisitSourceChannelExportAsync([FromBody] ExportExcelDto<QueryOrderVisitSourceChannelDto> dto)
  300. {
  301. var list = await _orderApplication.QueryOrderVisitSourceChannelAsync(dto.QueryDto);
  302. return _exportApplication.GetExcelFile(dto, list, "回访来源统计", "SourceChannel");
  303. }
  304. /// <summary>
  305. /// 回访量统计
  306. /// </summary>
  307. /// <returns></returns>
  308. [HttpGet("visit/quantity")]
  309. public async Task<IList<OrderVisitQuantityOutDto>> QueryOrderVisitQuantityAsync([FromQuery] QueryOrderVisitQuantity dto)
  310. => await _orderVisitApplication.QueryOrderVisitQuantityAsync(dto);
  311. /// <summary>
  312. /// 回访量统计--导出
  313. /// </summary>
  314. /// <returns></returns>
  315. [HttpPost("visit/quantity/export")]
  316. [LogFilterAlpha("导出日志")]
  317. public async Task<FileStreamResult> QueryOrderVisitQuantityExportAsync([FromBody] ExportExcelDto<QueryOrderVisitQuantity> dto)
  318. {
  319. var items = await _orderVisitApplication.QueryOrderVisitQuantityAsync(dto.QueryDto);
  320. return _exportApplication.GetExcelFile(dto, items, "回访量统计");
  321. }
  322. /// <summary>
  323. /// 部门超期统计明细
  324. /// </summary>
  325. /// <param name="dto"></param>
  326. /// <returns></returns>
  327. [HttpGet("org_data_list_detail")]
  328. public async Task<PagedDto<OrderDto>> OrgDataListDetail([FromQuery] OrgDataListDetailRequest dto)
  329. {
  330. var quer = _orderApplication.QueryOrgDataListDetail(dto);
  331. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  332. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  333. }
  334. /// <summary>
  335. /// 部门超期统计明细导出
  336. /// </summary>
  337. /// <returns></returns>
  338. [HttpPost("org_data_list_detail/_export")]
  339. [LogFilterAlpha("导出日志")]
  340. public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListDetailRequest> dto)
  341. {
  342. var query = _orderApplication.QueryOrgDataListDetail(dto.QueryDto);
  343. List<Order> data;
  344. if (dto.IsExportAll)
  345. {
  346. data = await query.ToListAsync(HttpContext.RequestAborted);
  347. }
  348. else
  349. {
  350. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  351. data = items;
  352. }
  353. var dataDtos = _mapper.Map<ICollection<OrderDto>>(data);
  354. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  355. var dtos = dataDtos
  356. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  357. .Cast<object>()
  358. .ToList();
  359. var stream = ExcelHelper.CreateStream(dtos);
  360. return ExcelStreamResult(stream, "部门超期统计明细数据");
  361. }
  362. /// <summary>
  363. /// 全量部门超期统计明细
  364. /// </summary>
  365. /// <param name="dto"></param>
  366. /// <returns></returns>
  367. [HttpGet("org_data_list_detail_all")]
  368. public async Task<PagedDto<OrderDto>> OrgDataListDetail([FromQuery] OrgDataListAllDetailRequest dto)
  369. {
  370. var quer = _orderApplication.QueryOrgDataListDetail(dto);
  371. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  372. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  373. }
  374. /// <summary>
  375. /// 部门超期统计明细导出
  376. /// </summary>
  377. /// <returns></returns>
  378. [HttpPost("org_data_list_detail_all/_export")]
  379. [LogFilterAlpha("导出日志")]
  380. public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListAllDetailRequest> dto)
  381. {
  382. var query = _orderApplication.QueryOrgDataListDetail(dto.QueryDto);
  383. List<Order> data;
  384. if (dto.IsExportAll)
  385. {
  386. data = await query.ToListAsync(HttpContext.RequestAborted);
  387. }
  388. else
  389. {
  390. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  391. data = items;
  392. }
  393. var dataDtos = _mapper.Map<ICollection<OrderDto>>(data);
  394. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  395. var dtos = dataDtos
  396. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  397. .Cast<object>()
  398. .ToList();
  399. var stream = ExcelHelper.CreateStream(dtos);
  400. return ExcelStreamResult(stream, "部门超期统计明细数据");
  401. }
  402. /// <summary>
  403. /// 列表页面基础数据
  404. /// </summary>
  405. /// <returns></returns>
  406. [HttpGet("org_data_list_detail_all/base-data")]
  407. public async Task<object> BaseData()
  408. {
  409. var rsp = new
  410. {
  411. OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>()
  412. };
  413. return rsp;
  414. }
  415. /// <summary>
  416. /// 部门超期统计
  417. /// </summary>
  418. /// <param name="dto"></param>
  419. /// <returns></returns>
  420. [HttpGet("org_data_list")]
  421. public async Task<PagedDto<OrderBiOrgDataListVo>> OrgDataList([FromQuery] ReportPagedRequest dto)
  422. {
  423. var query = _orderApplication.QueryOrgDataList(dto);
  424. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  425. items.Add(new OrderBiOrgDataListVo
  426. {
  427. OrgName = "合计",
  428. HandlerExtendedNum = items.Select(s => s.HandlerExtendedNum).Sum(),
  429. CounterHandlerExtendedNum = items.Select(s => s.CounterHandlerExtendedNum).Sum(),
  430. NoHandlerExtendedNum = items.Select(s => s.NoHandlerExtendedNum).Sum(),
  431. CounterNoHandlerExtendedNum = items.Select(s => s.CounterNoHandlerExtendedNum).Sum(),
  432. });
  433. return new PagedDto<OrderBiOrgDataListVo>(total, items);
  434. }
  435. /// <summary>
  436. /// 部门超期统计导出
  437. /// </summary>
  438. /// <returns></returns>
  439. [HttpPost("org_data_list/_export")]
  440. [LogFilterAlpha("导出日志")]
  441. public async Task<FileStreamResult> OrgDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
  442. {
  443. var query = _orderApplication.QueryOrgDataList(dto.QueryDto);
  444. List<OrderBiOrgDataListVo> data;
  445. data = await query.ToListAsync(HttpContext.RequestAborted);
  446. data.Add(new OrderBiOrgDataListVo
  447. {
  448. OrgName = "合计",
  449. HandlerExtendedNum = data.Select(s => s.HandlerExtendedNum).Sum(),
  450. CounterHandlerExtendedNum = data.Select(s => s.CounterHandlerExtendedNum).Sum(),
  451. NoHandlerExtendedNum = data.Select(s => s.NoHandlerExtendedNum).Sum(),
  452. CounterNoHandlerExtendedNum = data.Select(s => s.CounterNoHandlerExtendedNum).Sum(),
  453. });
  454. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderBiOrgDataListVo>(dto.ColumnInfos);
  455. var dtos = data
  456. .Select(stu => _mapper.Map(stu, typeof(OrderBiOrgDataListVo), dynamicClass))
  457. .Cast<object>()
  458. .ToList();
  459. var stream = ExcelHelper.CreateStream(dtos);
  460. return ExcelStreamResult(stream, "部门超期统计数据");
  461. }
  462. /// <summary>
  463. /// 话务员办件统计
  464. /// </summary>
  465. /// <param name="dto"></param>
  466. /// <returns></returns>
  467. [HttpGet("centre_data_list")]
  468. public async Task<List<OrderBiCentreDataListVo>> CentreDataList([FromQuery] ReportPagedRequest dto)
  469. {
  470. var query = _orderApplication.CentreDataList(dto);
  471. var list = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
  472. return list;
  473. }
  474. /// <summary>
  475. /// 话务员办件统计--导出
  476. /// </summary>
  477. /// <param name="dto"></param>
  478. /// <returns></returns>
  479. [HttpPost("centre_data_list_export")]
  480. [LogFilterAlpha("导出日志")]
  481. public async Task<FileStreamResult> CentreDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
  482. {
  483. var query = _orderApplication.CentreDataList(dto.QueryDto);
  484. List<OrderBiCentreDataListVo> data = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.NoCentreCareOf + x.Invalid + x.Repeat) != 0).ToListAsync(HttpContext.RequestAborted);
  485. data.Add(new OrderBiCentreDataListVo
  486. {
  487. UserName = "合计",
  488. CentreArchive = data.Select(s => s.CentreArchive).Sum(),
  489. CentreCareOf = data.Select(s => s.CentreCareOf).Sum(),
  490. NoCentreCareOf = data.Select(s => s.NoCentreCareOf).Sum(),
  491. Invalid = data.Select(s => s.Invalid).Sum(),
  492. Repeat = data.Select(s => s.Repeat).Sum(),
  493. Subtotal = data.Select(s => s.Subtotal).Sum()
  494. });
  495. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderBiCentreDataListVo>(dto.ColumnInfos);
  496. var dtos = data
  497. .Select(stu => _mapper.Map(stu, typeof(OrderBiCentreDataListVo), dynamicClass))
  498. .Cast<object>()
  499. .ToList();
  500. var stream = ExcelHelper.CreateStream(dtos);
  501. return ExcelStreamResult(stream, "话务员办件统计");
  502. }
  503. /// <summary>
  504. /// 工单业务量统计
  505. /// </summary>
  506. /// <param name="dto"></param>
  507. /// <returns></returns>
  508. [HttpGet("order/volume/statistics")]
  509. public async Task<List<OrderVolumeDataListVo>> OrderVolumeStatistics([FromQuery] ReportPagedRequest dto)
  510. {
  511. var query = _orderApplication.OrderVolumeStatistics(dto);
  512. var list = await query.ToListAsync(HttpContext.RequestAborted);
  513. return list.OrderByDescending(p => p.Subtotal).ToList();
  514. }
  515. /// <summary>
  516. /// 工单业务量统计-导出
  517. /// </summary>
  518. /// <param name="dto"></param>
  519. /// <returns></returns>
  520. [HttpPost("order/volume/statistics/export")]
  521. [LogFilterAlpha("导出日志")]
  522. public async Task<FileStreamResult> OrderVolumeStatisticsExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
  523. {
  524. var query = _orderApplication.OrderVolumeStatistics(dto.QueryDto);
  525. List<OrderVolumeDataListVo> data = await query.ToListAsync(HttpContext.RequestAborted);
  526. data = data.OrderByDescending(p => p.Subtotal).ToList();
  527. data.Add(new OrderVolumeDataListVo
  528. {
  529. UserName = "合计",
  530. VisitCenter = data.Select(s => s.VisitCenter).Sum(),
  531. VisitOrg = data.Select(s => s.VisitOrg).Sum(),
  532. PublishCenter = data.Select(s => s.PublishCenter).Sum(),
  533. PublishOrg = data.Select(s => s.PublishOrg).Sum(),
  534. PublishOpen = data.Select(s => s.PublishOpen).Sum(),
  535. DispatchCenter = data.Select(s => s.DispatchCenter).Sum(),
  536. DispatchOrg = data.Select(s => s.DispatchOrg).Sum(),
  537. ReTransact = data.Select(s => s.ReTransact).Sum(),
  538. Subtotal = data.Select(s => s.Subtotal).Sum()
  539. });
  540. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderVolumeDataListVo>(dto.ColumnInfos);
  541. var dtos = data
  542. .Select(stu => _mapper.Map(stu, typeof(OrderVolumeDataListVo), dynamicClass))
  543. .Cast<object>()
  544. .ToList();
  545. var stream = ExcelHelper.CreateStream(dtos);
  546. return ExcelStreamResult(stream, "工单业务量统计");
  547. }
  548. /// <summary>
  549. /// 工单业务量列表
  550. /// </summary>
  551. /// <param name="dto"></param>
  552. /// <returns></returns>
  553. [HttpGet("order/volume/list")]
  554. public async Task<IReadOnlyList<OrderDto>> OrderVolumeList([FromQuery] QueryOrderVolumeDto dto)
  555. {
  556. var orders = await _orderApplication.OrderVolumeList(dto)
  557. .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
  558. var list = _mapper.Map<IReadOnlyList<OrderDto>>(orders);
  559. if (_appOptions.Value.IsLuZhou && !_sessionContext.OrgIsCenter)
  560. list = list.Select(p => p.DataMask(false)).ToList();
  561. return list;
  562. }
  563. /// <summary>
  564. /// 工单业务量列表总数
  565. /// </summary>
  566. [HttpGet("order/volume/list/count")]
  567. public async Task<int> OrderVolumeListCount([FromQuery] QueryOrderVolumeDto dto)
  568. {
  569. var query = _orderApplication.OrderVolumeList(dto);
  570. return await query.CountAsync(HttpContext.RequestAborted);
  571. }
  572. /// <summary>
  573. /// 工单业务量列表导出
  574. /// </summary>
  575. /// <param name="dto"></param>
  576. /// <returns></returns>
  577. [HttpPost("order/volume/list/export")]
  578. [LogFilterAlpha("导出日志")]
  579. public async Task<FileStreamResult> OrderVolumeListExport([FromBody] ExportExcelDto<QueryOrderVolumeDto> dto)
  580. {
  581. var query = _orderApplication.OrderVolumeList(dto.QueryDto);
  582. List<Order> orders;
  583. if (dto.IsExportAll)
  584. {
  585. orders = await query.ToListAsync(HttpContext.RequestAborted);
  586. }
  587. else
  588. {
  589. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  590. orders = items;
  591. }
  592. var orderDtos = _mapper.Map<ICollection<OrderDto>>(orders);
  593. if (_appOptions.Value.IsLuZhou)
  594. orderDtos = orderDtos.Select(p => p.DataMask(false)).ToList();
  595. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  596. var dtos = orderDtos
  597. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  598. .Cast<object>()
  599. .ToList();
  600. var stream = ExcelHelper.CreateStream(dtos);
  601. return ExcelStreamResult(stream, "工单业务量列表");
  602. }
  603. /// <summary>
  604. /// 热点数据小计统计
  605. /// </summary>
  606. /// <param name="dto"></param>
  607. /// <returns></returns>
  608. [HttpGet("hotspot_subtotal_data_list")]
  609. public async Task<PagedDto<HotspotDataLsitVo>> HotspotSubtotalDataLsit([FromQuery] HotspotSubtotalReportPagedRequest dto)
  610. {
  611. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  612. var query = _hotspotTypeRepository.Queryable(false, true)
  613. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotFullName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotFullName)) && o.IsDeleted == false)
  614. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
  615. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
  616. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  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. }).MergeTable();
  626. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  627. return new PagedDto<HotspotDataLsitVo>(total, items);
  628. }
  629. /// <summary>
  630. /// 热点数据统计导出
  631. /// </summary>
  632. /// <param name="dto"></param>
  633. /// <returns></returns>
  634. [HttpPost("hotspot_data_list/export")]
  635. [LogFilterAlpha("导出日志")]
  636. public async Task<FileStreamResult> HotspotDataLsitExprot([FromBody] ExportExcelDto<HotspotReportPagedRequest> dto)
  637. {
  638. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  639. if (dto.QueryDto.Type == 0 && (!dto.QueryDto.ChainStartTime.HasValue || !dto.QueryDto.ChainEndTime.HasValue)) throw UserFriendlyException.SameMessage("请选择环比时间!");
  640. dto.QueryDto.EndTime = dto.QueryDto.EndTime.Value.AddDays(1).AddSeconds(-1);
  641. var IsCenter = _sessionContext.OrgIsCenter;
  642. if (dto.QueryDto.Type == 0)
  643. {
  644. dto.QueryDto.ChainEndTime = dto.QueryDto.ChainEndTime.Value.AddDays(1).AddSeconds(-1);
  645. }
  646. var items = await _hotspotTypeRepository.Queryable(false, true)
  647. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  648. .WhereIF(dto.QueryDto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.QueryDto.StartTime)
  649. .WhereIF(dto.QueryDto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.QueryDto.EndTime)
  650. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Keyword), (x, o) => x.HotSpotName.Contains(dto.QueryDto.Keyword!))
  651. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  652. .Where((x, o) => x.ParentId == dto.QueryDto.Id)
  653. .Where((x, o) => x.IsDeleted == false)
  654. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  655. .Select((x, o) => new HotspotDataLsitVo
  656. {
  657. Id = x.Id,
  658. Name = x.HotSpotName,
  659. Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  660. Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.HotSpotName != o.HotspotName, 1, 0)) > 0,
  661. }).MergeTable().ToListAsync();
  662. var chainStartTime = dto.QueryDto.StartTime;
  663. var chainEndTime = dto.QueryDto.EndTime;
  664. switch (dto.QueryDto.Type)
  665. {
  666. case 1://日
  667. chainStartTime = dto.QueryDto.StartTime.Value.AddDays(-1);
  668. chainEndTime = dto.QueryDto.EndTime.Value.AddDays(-1);
  669. break;
  670. case 2://月
  671. chainStartTime = dto.QueryDto.StartTime.Value.AddMonths(-1);
  672. chainEndTime = dto.QueryDto.EndTime.Value.AddMonths(-1);
  673. break;
  674. case 3://年
  675. chainStartTime = dto.QueryDto.StartTime.Value.AddYears(-1);
  676. chainEndTime = dto.QueryDto.EndTime.Value.AddYears(-1);
  677. break;
  678. case 0:
  679. chainStartTime = dto.QueryDto.ChainStartTime.Value;
  680. chainEndTime = dto.QueryDto.ChainEndTime.Value;
  681. break;
  682. }
  683. var chainItems = await _hotspotTypeRepository.Queryable(false, true)
  684. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  685. .WhereIF(dto.QueryDto.StartTime.HasValue, (x, o) => o.CreationTime >= chainStartTime)
  686. .WhereIF(dto.QueryDto.EndTime.HasValue, (x, o) => o.CreationTime <= chainEndTime)
  687. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Keyword), (x, o) => x.HotSpotName.Contains(dto.QueryDto.Keyword!))
  688. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  689. .Where((x, o) => x.ParentId == dto.QueryDto.Id)
  690. .Where((x, o) => x.IsDeleted == false)
  691. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  692. .Select((x, o) => new
  693. {
  694. Id = x.Id,
  695. ChainNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  696. }).MergeTable().ToListAsync();
  697. var res = (from t1 in items
  698. join t2 in chainItems on t1.Id equals t2.Id into t1_t2
  699. from item in t1_t2.DefaultIfEmpty()
  700. select new HotspotDataLsitVo
  701. {
  702. Id = t1.Id,
  703. Name = t1.Name,
  704. Num = t1.Num,
  705. Sublevel = t1.Sublevel,
  706. Children = new List<HotspotDataLsitVo>(),
  707. ChainNum = t1_t2.Select(x => x.ChainNum).FirstOrDefault(),
  708. ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
  709. ((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%",
  710. }).ToList();
  711. var total = new HotspotDataLsitVo()
  712. {
  713. Id = "0",
  714. Name = "合计",
  715. Num = res.Sum(x => x.Num),
  716. Sublevel = false,
  717. Children = new List<HotspotDataLsitVo>(),
  718. ChainNum = res.Sum(x => x.ChainNum),
  719. 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%"
  720. };
  721. res.Add(total);
  722. List<HotspotDataLsitVo> data;
  723. data = res;
  724. var dataDtos = _mapper.Map<ICollection<HotspotDataLsitVo>>(data);
  725. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<HotspotDataLsitVo>(dto.ColumnInfos);
  726. var dtos = dataDtos
  727. .Select(stu => _mapper.Map(stu, typeof(HotspotDataLsitVo), dynamicClass))
  728. .Cast<object>()
  729. .ToList();
  730. var stream = ExcelHelper.CreateStream(dtos);
  731. return ExcelStreamResult(stream, "热点类型统计");
  732. //return new { List = res, Total = total };
  733. }
  734. /// <summary>
  735. /// 热点数据统计 TODO和前端沟通
  736. /// </summary>
  737. /// <param name="dto"></param>
  738. /// <returns></returns>
  739. [HttpGet("hotspot_data_list")]
  740. public async Task<object> HotspotDataLsit([FromQuery] HotspotReportPagedRequest dto)
  741. {
  742. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  743. if (dto.Type == 0 && (!dto.ChainStartTime.HasValue || !dto.ChainEndTime.HasValue)) throw UserFriendlyException.SameMessage("请选择环比时间!");
  744. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  745. var IsCenter = _sessionContext.OrgIsCenter;
  746. if (dto.Type == 0)
  747. {
  748. dto.ChainEndTime = dto.ChainEndTime.Value.AddDays(1).AddSeconds(-1);
  749. }
  750. var items = await _hotspotTypeRepository.Queryable(false, true)
  751. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  752. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
  753. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
  754. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  755. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  756. .Where((x, o) => x.ParentId == dto.Id)
  757. .Where((x, o) => x.IsDeleted == false)
  758. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  759. .Select((x, o) => new HotspotDataLsitVo
  760. {
  761. Id = x.Id,
  762. Name = x.HotSpotName,
  763. Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  764. Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.HotSpotName != o.HotspotName, 1, 0)) > 0,
  765. }).MergeTable().ToListAsync();
  766. var chainStartTime = dto.StartTime;
  767. var chainEndTime = dto.EndTime;
  768. switch (dto.Type)
  769. {
  770. case 1://日
  771. chainStartTime = dto.StartTime.Value.AddDays(-1);
  772. chainEndTime = dto.EndTime.Value.AddDays(-1);
  773. break;
  774. case 2://月
  775. chainStartTime = dto.StartTime.Value.AddMonths(-1);
  776. chainEndTime = dto.EndTime.Value.AddMonths(-1);
  777. break;
  778. case 3://年
  779. chainStartTime = dto.StartTime.Value.AddYears(-1);
  780. chainEndTime = dto.EndTime.Value.AddYears(-1);
  781. break;
  782. case 0:
  783. chainStartTime = dto.ChainStartTime.Value;
  784. chainEndTime = dto.ChainEndTime.Value;
  785. break;
  786. }
  787. var chainItems = await _hotspotTypeRepository.Queryable(false, true)
  788. .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
  789. .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= chainStartTime)
  790. .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= chainEndTime)
  791. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
  792. .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
  793. .Where((x, o) => x.ParentId == dto.Id)
  794. .Where((x, o) => x.IsDeleted == false)
  795. .GroupBy((x, o) => new { x.Id, x.HotSpotName })
  796. .Select((x, o) => new
  797. {
  798. Id = x.Id,
  799. ChainNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  800. }).MergeTable().ToListAsync();
  801. var res = (from t1 in items
  802. join t2 in chainItems on t1.Id equals t2.Id into t1_t2
  803. from item in t1_t2.DefaultIfEmpty()
  804. select new HotspotDataLsitVo()
  805. {
  806. Id = t1.Id,
  807. Name = t1.Name,
  808. Num = t1.Num,
  809. Sublevel = t1.Sublevel,
  810. Children = new List<HotspotDataLsitVo>(),
  811. ChainNum = t1_t2.Select(x => x.ChainNum).FirstOrDefault(),
  812. ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
  813. ((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%",
  814. }).ToList();
  815. var total = new HotspotDataLsitVo()
  816. {
  817. Id = "0",
  818. Name = "合计",
  819. Num = res.Sum(x => x.Num),
  820. Sublevel = false,
  821. Children = new List<HotspotDataLsitVo>(),
  822. ChainNum = res.Sum(x => x.ChainNum),
  823. 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%"
  824. };
  825. return new { List = res, Total = total };
  826. }
  827. /// <summary>
  828. /// 部门不满意统计--导出
  829. /// </summary>
  830. /// <param name="dto"></param>
  831. /// <returns></returns>
  832. [HttpPost("visit-nosatisfied/export")]
  833. [LogFilterAlpha("导出日志")]
  834. public async Task<FileStreamResult> ExportQueryVisitNoSatisfied([FromBody] QueryVisitNoSatisfiedDto dto)
  835. {
  836. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  837. if (dto.AddColumnName is null || dto.AddColumnName.Count == 0) throw UserFriendlyException.SameMessage("导出字段不能为空");
  838. if (dto.AddColumnName.FirstOrDefault() != "部门名称") throw UserFriendlyException.SameMessage("导出字段第一个必须是'部门名称'");
  839. var (dissatisfiedReason, list) = await _orderReportApplication.QueryVisitNoSatisfiedAsync(dto, _sessionContext.OrgIsCenter);
  840. var dataTable = await _orderReportApplication.ExportQueryVisitNoSatisfiedAsync(dissatisfiedReason, list, dto.AddColumnName);
  841. return ExcelStreamResult(ExcelHelper.CreateStream(dataTable), "回访不满意原因统计");
  842. }
  843. /// <summary>
  844. /// 部门不满意统计
  845. /// 已加验证部门
  846. /// </summary>
  847. /// <param name="dto"></param>
  848. /// <returns></returns>
  849. [HttpGet("visit-nosatisfied")]
  850. public async Task<object> QueryVisitNoSatisfied([FromQuery] QueryVisitNoSatiisfiedRequest dto)
  851. {
  852. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  853. var (dissatisfiedReason, list) = await _orderReportApplication
  854. .QueryVisitNoSatisfiedAsync(_mapper.Map<QueryVisitNoSatisfiedDto>(dto), _sessionContext.OrgIsCenter);
  855. return new { DicReason = dissatisfiedReason, Data = list };
  856. }
  857. /// <summary>
  858. /// 部门不满意统计明细
  859. /// </summary>
  860. /// <param name="dto"></param>
  861. /// <returns></returns>
  862. [HttpGet("visit-nosatisfied-detail")]
  863. public async Task<PagedDto<OrderVisitDetailDto>> BiQueryVisitNoSatisfiedDetail([FromQuery] BiQueryVisitNoSatisfiedDetailDto dto)
  864. {
  865. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  866. var IsCenter = _sessionContext.OrgIsCenter;
  867. var (total, items) = await _orderReportApplication.BiQueryVisitNoSatisfiedDetail(dto)
  868. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  869. return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
  870. }
  871. /// <summary>
  872. /// 部门不满意统计明细--导出
  873. /// </summary>
  874. /// <param name="dto"></param>
  875. /// <returns></returns>
  876. [HttpPost("visit-nosatisfied-detail-export")]
  877. [LogFilterAlpha("导出日志")]
  878. public async Task<FileStreamResult> BiQueryVisitNoSatisfiedDetailExport([FromBody] ExportExcelDto<BiQueryVisitNoSatisfiedDetailDto> dto)
  879. {
  880. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  881. var query = _orderReportApplication.BiQueryVisitNoSatisfiedDetail(dto.QueryDto);
  882. List<OrderVisitDetail> data;
  883. if (dto.IsExportAll)
  884. {
  885. data = await query.ToListAsync(HttpContext.RequestAborted);
  886. }
  887. else
  888. {
  889. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  890. data = items;
  891. }
  892. var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
  893. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderVisitDetailDto>(dto.ColumnInfos);
  894. var dtos = dataDtos
  895. .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
  896. .Cast<object>()
  897. .ToList();
  898. var stream = ExcelHelper.CreateStream(dtos);
  899. return ExcelStreamResult(stream, "部门不满意统计明细");
  900. }
  901. /// <summary>
  902. /// 部门延期统计
  903. /// </summary>
  904. /// <param name="dto"></param>
  905. /// <returns></returns>
  906. [HttpGet("order-delay-data-list")]
  907. public async Task<IReadOnlyList<BiOrderDelayDataDto>> QueryOrderDelayDataList([FromQuery] QueryOrderDelayDataListRequest dto)
  908. {
  909. return await _orderReportApplication.QueryOrderDelayDataList(dto).ToListAsync();
  910. }
  911. /// <summary>
  912. /// 部门延期统计---导出
  913. /// </summary>
  914. /// <param name="dto"></param>
  915. /// <returns></returns>
  916. [HttpPost("order-delay-data-list-export")]
  917. [LogFilterAlpha("导出日志")]
  918. public async Task<FileStreamResult> ExportQueryOrderDelayDataList([FromBody] ExportExcelDto<QueryOrderDelayDataListRequest> dto)
  919. {
  920. var query = _orderReportApplication.QueryOrderDelayDataList(dto.QueryDto);
  921. List<BiOrderDelayDataDto> list;
  922. if (dto.IsExportAll)
  923. {
  924. list = await query.ToListAsync(HttpContext.RequestAborted);
  925. }
  926. else
  927. {
  928. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  929. list = items;
  930. }
  931. list.Add(new BiOrderDelayDataDto()
  932. {
  933. OrgName = "合计",
  934. OrgCode = "",
  935. //AllTotal = list.Sum(p => p.AllTotal),
  936. PassTotal = list.Sum(p => p.PassTotal),
  937. NoPassTotal = list.Sum(p => p.NoPassTotal),
  938. ExaminingTotal = list.Sum(p => p.ExaminingTotal),
  939. WithdrawTotal = list.Sum(p => p.WithdrawTotal)
  940. });
  941. var orderDtos = _mapper.Map<ICollection<BiOrderDelayDataDto>>(list);
  942. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<BiOrderDelayDataDto>(dto.ColumnInfos);
  943. var dtos = orderDtos
  944. .Select(stu => _mapper.Map(stu, typeof(BiOrderDelayDataDto), dynamicClass))
  945. .Cast<object>()
  946. .ToList();
  947. var stream = ExcelHelper.CreateStream(dtos);
  948. return ExcelStreamResult(stream, "部门延期统计数据");
  949. }
  950. /// <summary>
  951. /// 部门延期统计明细
  952. /// </summary>
  953. /// <param name="dto"></param>
  954. /// <returns></returns>
  955. [HttpGet("order-delay-data-detail")]
  956. public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetail([FromQuery] QueryOrderDelayDataDetailRequest dto)
  957. {
  958. var (total, items) = await _orderReportApplication.QueryOrderDelayDataDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  959. return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
  960. }
  961. /// <summary>
  962. /// 部门延期统计明细--导出
  963. /// </summary>
  964. /// <param name="dto"></param>
  965. /// <returns></returns>
  966. [HttpPost("order-delay-data-detail-export")]
  967. [LogFilterAlpha("导出日志")]
  968. public async Task<FileStreamResult> ExportQueryOrderDelayDataDetail([FromBody] ExportExcelDto<QueryOrderDelayDataDetailRequest> dto)
  969. {
  970. var query = _orderReportApplication.QueryOrderDelayDataDetail(dto.QueryDto);
  971. List<OrderDelay> list;
  972. if (dto.IsExportAll)
  973. {
  974. list = await query.ToListAsync(HttpContext.RequestAborted);
  975. }
  976. else
  977. {
  978. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  979. list = items;
  980. }
  981. var orderDtos = _mapper.Map<ICollection<OrderDelayDto>>(list);
  982. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDelayDto>(dto.ColumnInfos);
  983. var dtos = orderDtos
  984. .Select(stu => _mapper.Map(stu, typeof(OrderDelayDto), dynamicClass))
  985. .Cast<object>()
  986. .ToList();
  987. var stream = ExcelHelper.CreateStream(dtos);
  988. return ExcelStreamResult(stream, "部门延期统计明细数据");
  989. }
  990. /// <summary>
  991. /// 部门延期统计明细-单独菜单
  992. /// </summary>
  993. /// <param name="dto"></param>
  994. /// <returns></returns>
  995. [HttpGet("order_delay_detail")]
  996. public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetailAsync([FromQuery] QueryOrderDelayDataDetailRequest dto)
  997. {
  998. var query = _orderDelayRepository.Queryable()
  999. .Includes(x => x.Order)
  1000. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  1001. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  1002. .WhereIF(dto.TypeId != null && dto.TypeId == 1, x => x.Order.IdentityType == EIdentityType.Citizen)
  1003. .WhereIF(dto.TypeId != null && dto.TypeId == 2, x => x.Order.IdentityType == EIdentityType.Enterprise)
  1004. .WhereIF(dto.Type is 1, x => x.DelayState == EDelayState.Pass)
  1005. .WhereIF(dto.Type is 2, x => x.DelayState == EDelayState.NoPass)
  1006. .WhereIF(dto.Type is 3, x => x.DelayState == EDelayState.Examining)
  1007. .WhereIF(dto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
  1008. .MergeTable();
  1009. if (_sessionContext.OrgIsCenter == false)
  1010. query = query.Where(x => x.ApplyOrgCode.StartsWith(_sessionContext.OrgId));
  1011. var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1012. return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
  1013. }
  1014. /// <summary>
  1015. /// 部门延期统计明细-单独菜单 导出
  1016. /// </summary>
  1017. /// <param name="dto"></param>
  1018. /// <returns></returns>
  1019. [HttpPost("order-delay-detail/exprot")]
  1020. public async Task<FileStreamResult> ExportQueryOrderDelayDataDetailAsync([FromBody] ExportExcelDto<QueryOrderDelayDataDetailRequest> dto)
  1021. {
  1022. var query = _orderDelayRepository.Queryable()
  1023. .Includes(x => x.Order)
  1024. .WhereIF(dto.QueryDto.StartTime.HasValue, x => x.CreationTime >= dto.QueryDto.StartTime)
  1025. .WhereIF(dto.QueryDto.EndTime.HasValue, x => x.CreationTime <= dto.QueryDto.EndTime)
  1026. .WhereIF(dto.QueryDto.TypeId != null && dto.QueryDto.TypeId == 1, x => x.Order.IdentityType == EIdentityType.Citizen)
  1027. .WhereIF(dto.QueryDto.TypeId != null && dto.QueryDto.TypeId == 2, x => x.Order.IdentityType == EIdentityType.Enterprise)
  1028. .WhereIF(dto.QueryDto.Type is 1, x => x.DelayState == EDelayState.Pass)
  1029. .WhereIF(dto.QueryDto.Type is 2, x => x.DelayState == EDelayState.NoPass)
  1030. .WhereIF(dto.QueryDto.Type is 3, x => x.DelayState == EDelayState.Examining)
  1031. .WhereIF(dto.QueryDto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
  1032. .MergeTable();
  1033. if (_sessionContext.OrgIsCenter == false)
  1034. query = query.Where(x => x.ApplyOrgCode.StartsWith(_sessionContext.OrgId));
  1035. List<OrderDelay> list;
  1036. if (dto.IsExportAll)
  1037. {
  1038. list = await query.ToListAsync(HttpContext.RequestAborted);
  1039. }
  1040. else
  1041. {
  1042. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1043. list = items;
  1044. }
  1045. var orderDtos = _mapper.Map<ICollection<OrderDelayDto>>(list);
  1046. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDelayDto>(dto.ColumnInfos);
  1047. var dtos = orderDtos
  1048. .Select(stu => _mapper.Map(stu, typeof(OrderDelayDto), dynamicClass))
  1049. .Cast<object>()
  1050. .ToList();
  1051. var stream = ExcelHelper.CreateStream(dtos);
  1052. return ExcelStreamResult(stream, "部门延期统计明细数据");
  1053. }
  1054. /// <summary>
  1055. /// 特提统计
  1056. /// </summary>
  1057. /// <param name="dto"></param>
  1058. /// <returns></returns>
  1059. [HttpGet("special_data_list")]
  1060. public async Task<PagedDto<OrderBiSpecialListVo>> SpecialDataList([FromQuery] ReportPagedRequest dto)
  1061. {
  1062. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  1063. var IsCenter = _sessionContext.OrgIsCenter;
  1064. var query = _orderSpecialRepository.Queryable()
  1065. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  1066. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  1067. .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.RequiredOrgId))
  1068. .GroupBy(x => new { x.Cause })
  1069. .Select(x => new OrderBiSpecialListVo
  1070. {
  1071. Cause = x.Cause,
  1072. OrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  1073. MaxSpecialTime = SqlFunc.AggregateMax(x.CreationTime),
  1074. })
  1075. .MergeTable();
  1076. switch (dto.SortField)
  1077. {
  1078. case "cause":
  1079. query = dto.SortRule is 0 ? query.OrderBy(x => x.Cause) : query.OrderByDescending(x => x.Cause);
  1080. break;
  1081. case "orderNum":
  1082. query = dto.SortRule is 0 ? query.OrderBy(x => x.OrderNum) : query.OrderByDescending(x => x.OrderNum);
  1083. break;
  1084. case "maxSpecialTime":
  1085. query = dto.SortRule is 0 ? query.OrderBy(x => x.MaxSpecialTime) : query.OrderByDescending(x => x.MaxSpecialTime);
  1086. break;
  1087. }
  1088. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  1089. return new PagedDto<OrderBiSpecialListVo>(total, items);
  1090. }
  1091. /// <summary>
  1092. /// 特提统计导出
  1093. /// </summary>
  1094. /// <param name="dto"></param>
  1095. /// <returns></returns>
  1096. [HttpPost("special_data_list/export")]
  1097. [LogFilterAlpha("导出日志")]
  1098. public async Task<FileStreamResult> SpecialDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
  1099. {
  1100. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  1101. var IsCenter = _sessionContext.OrgIsCenter;
  1102. var query = _orderSpecialRepository.Queryable()
  1103. .WhereIF(dto.QueryDto.StartTime.HasValue, x => x.CreationTime >= dto.QueryDto.StartTime)
  1104. .WhereIF(dto.QueryDto.EndTime.HasValue, x => x.CreationTime <= dto.QueryDto.EndTime)
  1105. .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.RequiredOrgId))
  1106. .GroupBy(x => new { x.Cause })
  1107. .Select(x => new OrderBiSpecialListVo
  1108. {
  1109. Cause = x.Cause,
  1110. OrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  1111. MaxSpecialTime = SqlFunc.AggregateMax(x.CreationTime),
  1112. })
  1113. .MergeTable();
  1114. switch (dto.QueryDto.SortField)
  1115. {
  1116. case "cause":
  1117. query = dto.QueryDto.SortRule is 0 ? query.OrderBy(x => x.Cause) : query.OrderByDescending(x => x.Cause);
  1118. break;
  1119. case "orderNum":
  1120. query = dto.QueryDto.SortRule is 0 ? query.OrderBy(x => x.OrderNum) : query.OrderByDescending(x => x.OrderNum);
  1121. break;
  1122. case "maxSpecialTime":
  1123. query = dto.QueryDto.SortRule is 0 ? query.OrderBy(x => x.MaxSpecialTime) : query.OrderByDescending(x => x.MaxSpecialTime);
  1124. break;
  1125. }
  1126. var total = 0;
  1127. var items = new List<OrderBiSpecialListVo>();
  1128. if (dto.IsExportAll)
  1129. {
  1130. items = await query.ToListAsync(HttpContext.RequestAborted);
  1131. }
  1132. else
  1133. {
  1134. (total, items) = await query.ToPagedListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, HttpContext.RequestAborted);
  1135. }
  1136. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderBiSpecialListVo>(dto.ColumnInfos);
  1137. var dtos = _mapper.Map<ICollection<OrderBiSpecialListVo>>(items)
  1138. .Select(stu => _mapper.Map(stu, typeof(OrderBiSpecialListVo), dynamicClass))
  1139. .Cast<object>()
  1140. .ToList();
  1141. var stream = ExcelHelper.CreateStream(dtos);
  1142. return ExcelStreamResult(stream, "特提统计");
  1143. }
  1144. /// <summary>
  1145. /// 获取工单特提信息列表
  1146. /// </summary>
  1147. /// <param name="dto"></param>
  1148. /// <returns></returns>
  1149. [HttpGet("special_data_list/list")]
  1150. public async Task<PagedDto<OrderSpecialDto>> List([FromQuery] OrderSpecialListDto dto)
  1151. {
  1152. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  1153. var IsCenter = _sessionContext.OrgIsCenter;
  1154. var (total, items) = await _orderSpecialRepository.Queryable()
  1155. .Includes(x => x.Order)
  1156. .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
  1157. x => x.Order.No.Contains(dto.Keyword!) || x.Order.Title.Contains(dto.Keyword!))
  1158. .WhereIF(!string.IsNullOrEmpty(dto.Cause),
  1159. x => x.Cause != null && x.Cause.Equals(dto.Cause))
  1160. .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
  1161. .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
  1162. .WhereIF(dto.State.HasValue, x => x.State == dto.State)
  1163. .WhereIF(IsCenter == false, x => x.OrgId.StartsWith(_sessionContext.OrgId))
  1164. .OrderByDescending(x => x.CreationTime)
  1165. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1166. return new PagedDto<OrderSpecialDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDto>>(items));
  1167. }
  1168. /// <summary>
  1169. /// 受理类型前十
  1170. /// </summary>
  1171. /// <param name="dto"></param>
  1172. /// <returns></returns>
  1173. [HttpGet("accept_type_top10_list")]
  1174. public async Task<object> AcceptTypeTop10List([FromQuery] ReportPagedRequest dto)
  1175. {
  1176. var (areaList, returnList, data) = await _orderApplication.AcceptTypeTop10List(dto, false);
  1177. return new { List = areaList, Data = returnList };
  1178. }
  1179. /// <summary>
  1180. /// 受理类型前十导出
  1181. /// </summary>
  1182. /// <param name="dto"></param>
  1183. /// <returns></returns>
  1184. [HttpPost("accept_type_top10_list-export")]
  1185. [LogFilterAlpha("导出日志")]
  1186. public async Task<FileStreamResult> AcceptTypeTop10ListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
  1187. {
  1188. var (areaList, returnList, data) = await _orderApplication.AcceptTypeTop10List(dto.QueryDto, true);
  1189. var stream = ExcelHelper.CreateStream(data);
  1190. return ExcelStreamResult(stream, "受理类型前十统计");
  1191. }
  1192. /// <summary>
  1193. /// 热点类型部门统计
  1194. /// </summary>
  1195. /// <param name="dto"></param>
  1196. /// <returns></returns>
  1197. [HttpGet("hotport-org-statistics")]
  1198. public async Task<object> HotPortJoinOrgStatistics([FromQuery] HotPortJoinOrgStatisticsRequest dto)
  1199. {
  1200. var IsCenter = _sessionContext.OrgIsCenter;
  1201. var (hotSpot, data) = await _orderRepository.HotPortJoinOrgStatistics(dto.StartTime, dto.EndTime, IsCenter, _sessionContext.OrgId);
  1202. return new { hotSpot, data };
  1203. }
  1204. /// <summary>
  1205. /// 热点类型部门统计--导出
  1206. /// </summary>
  1207. /// <param name="dto"></param>
  1208. /// <returns></returns>
  1209. [HttpPost("hotport-org-statistics/export")]
  1210. [LogFilterAlpha("导出日志")]
  1211. public async Task<FileStreamResult> ExportHotPortJoinOrgStatistics([FromBody] ExportHotPortJoinOrgStatisticsRequest dto)
  1212. {
  1213. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
  1214. if (dto.AddColumnName is null || dto.AddColumnName.Count == 0) throw UserFriendlyException.SameMessage("导出字段不能为空");
  1215. if (dto.AddColumnName.FirstOrDefault() != "部门名称") throw UserFriendlyException.SameMessage("导出字段第一个必须是'部门名称'");
  1216. var IsCenter = _sessionContext.OrgIsCenter;
  1217. var (hotSpot, list) = await _orderRepository.HotPortJoinOrgStatistics(dto.StartTime.Value, dto.EndTime.Value, IsCenter, _sessionContext.OrgId);
  1218. var dataTable = await _orderReportApplication.ExportHotPortJoinOrgStatisticsAsync(hotSpot, list, dto.AddColumnName);
  1219. return ExcelStreamResult(ExcelHelper.CreateStream(dataTable), "热点类型部门统计");
  1220. }
  1221. /// <summary>
  1222. /// 热点类型部门统计明细
  1223. /// </summary>
  1224. /// <param name="dto"></param>
  1225. /// <returns></returns>
  1226. [HttpGet("hotport-org-statistics/detail")]
  1227. public async Task<PagedDto<OrderDto>> HotPortJoinOrgStatisticsDetail([FromQuery] HotPortJoinOrgStatisticsRequestDetail dto)
  1228. {
  1229. var (total, items) = await _orderRepository.HotPortJoinOrgStatisticsDetail(dto)
  1230. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1231. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  1232. }
  1233. /// <summary>
  1234. /// 热点类型部门统计明细导出
  1235. /// </summary>
  1236. /// <param name="dto"></param>
  1237. /// <returns></returns>
  1238. [HttpPost("hotport-org-statistics/detail/export")]
  1239. [LogFilterAlpha("导出日志")]
  1240. public async Task<FileStreamResult> HotPortJoinOrgStatisticsDetailExport([FromBody] ExportExcelDto<HotPortJoinOrgStatisticsRequestDetail> dto)
  1241. {
  1242. var query = _orderRepository.HotPortJoinOrgStatisticsDetail(dto.QueryDto);
  1243. List<Order> data;
  1244. if (dto.IsExportAll)
  1245. {
  1246. data = await query.ToListAsync(HttpContext.RequestAborted);
  1247. }
  1248. else
  1249. {
  1250. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1251. data = items;
  1252. }
  1253. var orderDtos = _mapper.Map<IReadOnlyList<OrderDto>>(data);
  1254. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  1255. var dtos = orderDtos
  1256. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  1257. .Cast<object>()
  1258. .ToList();
  1259. var stream = ExcelHelper.CreateStream(dtos);
  1260. return ExcelStreamResult(stream, "热点类型部门统计明细");
  1261. }
  1262. /// <summary>
  1263. /// 回访量统计导出
  1264. /// </summary>
  1265. /// <param name="dto"></param>
  1266. /// <returns></returns>
  1267. [HttpPost("visit-measure-statistics-export")]
  1268. [LogFilterAlpha("导出日志")]
  1269. [AllowAnonymous]
  1270. public async Task<FileStreamResult> VisitMeasureStatisticsExport([FromBody] ExportExcelDto<VisitMeasureStatisticsRequest> dto)
  1271. {
  1272. var query = _orderVisitRepository.Queryable()
  1273. .Includes(x => x.Employee)
  1274. .Where(x => x.VisitTime >= dto.QueryDto.StartTime && x.VisitTime <= dto.QueryDto.EndTime && x.VisitState == EVisitState.Visited)
  1275. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.VisitName), x => x.Employee.Name.Contains(dto.QueryDto.VisitName))
  1276. .GroupBy(x => new { x.EmployeeId, x.Employee.Name })
  1277. .Select(x => new VisitMeasureStatisticsModelDto()
  1278. {
  1279. VisitName = x.Employee.Name,
  1280. CallVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType == EVisitType.CallVisit, 1, 0)),
  1281. ArtificialVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType != EVisitType.CallVisit, 1, 0)),
  1282. SumCount = SqlFunc.AggregateCount(x.EmployeeId)
  1283. });
  1284. var list = await query.ToListAsync();
  1285. //合计
  1286. var SumModel = new VisitMeasureStatisticsModelDto()
  1287. {
  1288. VisitName = "合计",
  1289. CallVisitCount = list.Sum(x => x.CallVisitCount),
  1290. ArtificialVisitCount = list.Sum(x => x.ArtificialVisitCount),
  1291. SumCount = list.Sum(x => x.SumCount)
  1292. };
  1293. list.Add(SumModel);
  1294. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<VisitMeasureStatisticsModelDto>(dto.ColumnInfos);
  1295. var dtos = list
  1296. .Select(stu => _mapper.Map(stu, typeof(VisitMeasureStatisticsModelDto), dynamicClass))
  1297. .Cast<object>()
  1298. .ToList();
  1299. var stream = ExcelHelper.CreateStream(dtos);
  1300. return ExcelStreamResult(stream, "回访量统计");
  1301. }
  1302. /// <summary>
  1303. /// 回访量统计
  1304. /// </summary>
  1305. /// <param name="StartTime"></param>
  1306. /// <param name="EndTime"></param>
  1307. /// <param name="VisitName"></param>
  1308. /// <returns></returns>
  1309. [HttpGet("visit-measure-statistics")]
  1310. public async Task<VisitMeasureStatisticsDto> VisitMeasureStatistics([FromQuery] VisitMeasureStatisticsRequest dto)
  1311. {
  1312. var query = _orderVisitRepository.Queryable()
  1313. .Includes(x => x.Employee)
  1314. .Where(x => x.VisitTime >= dto.StartTime && x.VisitTime <= dto.EndTime && x.VisitState == EVisitState.Visited && x.EmployeeId != "" && x.EmployeeId != null)
  1315. .WhereIF(!string.IsNullOrEmpty(dto.VisitName), x => x.Employee.Name.Contains(dto.VisitName))
  1316. .GroupBy(x => new { x.EmployeeId, x.Employee.Name })
  1317. .Select(x => new VisitMeasureStatisticsModelDto()
  1318. {
  1319. VisitName = x.Employee.Name,
  1320. CallVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType == EVisitType.CallVisit, 1, 0)),
  1321. ArtificialVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType != EVisitType.CallVisit, 1, 0)),
  1322. SumCount = SqlFunc.AggregateCount(x.EmployeeId)
  1323. });
  1324. var list = await query.ToListAsync();
  1325. var returnModel = new VisitMeasureStatisticsDto();
  1326. returnModel.VisitMeasureStatisticsModelList = list;
  1327. //查询AIVisit
  1328. returnModel.AiVisitCount = await _aiOrderVisitDetailRepository.Queryable()
  1329. .Where(x => x.AiVisitTime >= dto.StartTime && x.AiVisitTime <= dto.EndTime && x.IsSuccess != null).CountAsync();
  1330. returnModel.AiVisitSatisfiedCount = await _aiOrderVisitDetailRepository.Queryable()
  1331. //.Includes(x => x.OrderVisit)
  1332. .Where(x => x.AiVisitTime >= dto.StartTime && x.AiVisitTime <= dto.EndTime && x.IsSuccess == true && SqlFunc.JsonField(x.AiOrgProcessingResults, "Key") == "4").CountAsync();
  1333. returnModel.AiVisitNoSatisfiedCount = await _aiOrderVisitDetailRepository.Queryable()
  1334. //.Includes(x => x.OrderVisit)
  1335. .Where(x => x.AiVisitTime >= dto.StartTime && x.AiVisitTime <= dto.EndTime && x.IsSuccess == true && SqlFunc.JsonField(x.AiOrgProcessingResults, "Key") == "2").CountAsync();
  1336. returnModel.AIVisitFailCount = await _aiOrderVisitDetailRepository.Queryable()
  1337. .Where(x => x.AiVisitTime >= dto.StartTime && x.AiVisitTime <= dto.EndTime && x.IsSuccess == false).CountAsync();
  1338. return returnModel;
  1339. }
  1340. /// <summary>
  1341. /// 智能回访不满意明细
  1342. /// </summary>
  1343. /// <param name="dto"></param>
  1344. /// <returns></returns>
  1345. [HttpGet("aivisit-nosatisfied-paeglist")]
  1346. public async Task<PagedDto<AiVisitNoSatisfiedPageListRep>> AiVisitNoSatisfiedPageList([FromQuery] AiVisitNoSatisfiedPageListRequest dto)
  1347. {
  1348. var (total, items) = await _aiOrderVisitDetailRepository.Queryable()
  1349. .Includes(x => x.OrderVisit)
  1350. .Includes(x => x.OrderVisit.Order)
  1351. .Includes(x => x.OrderVisit.OrderVisitDetails)
  1352. .Includes(x => x.OrderVisit.Employee)
  1353. .Where(x => x.AiVisitTime >= dto.StartTime && x.AiVisitTime <= dto.EndTime && x.IsSuccess == true && SqlFunc.JsonField(x.AiOrgProcessingResults, "Key") == "2")
  1354. .WhereIF(!string.IsNullOrEmpty(dto.VisitName), x => x.OrderVisit.Employee.Name.Contains(dto.VisitName))
  1355. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1356. return new PagedDto<AiVisitNoSatisfiedPageListRep>(total, _mapper.Map<IReadOnlyList<AiVisitNoSatisfiedPageListRep>>(items));
  1357. }
  1358. /// <summary>
  1359. /// 热点类型小类统计
  1360. /// </summary>
  1361. /// <param name="StartTime"></param>
  1362. /// <param name="EndTime"></param>
  1363. /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
  1364. /// <returns></returns>
  1365. [HttpGet("hotspot-statistics")]
  1366. public async Task<object> HotspotStatistics([FromQuery] HotspotStatisticsRep dto)
  1367. {
  1368. var IsCenter = _sessionContext.OrgIsCenter;
  1369. if (string.IsNullOrEmpty(dto.HotspotCode))
  1370. {
  1371. var list = await _hotspotTypeRepository.Queryable()
  1372. .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
  1373. .Where((it, o) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && o.Id != null)
  1374. .WhereIF(dto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
  1375. .WhereIF(dto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
  1376. .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  1377. .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")) })
  1378. .Select((it, o) => new
  1379. {
  1380. HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
  1381. SumCount = SqlFunc.AggregateCount(it.HotSpotName)
  1382. })
  1383. .MergeTable()
  1384. .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
  1385. .Select((x, q) => new
  1386. {
  1387. HotspotCode = x.HotspotCode,
  1388. SumCount = x.SumCount,
  1389. HotspotName = q.HotSpotName,
  1390. HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.HotspotCode).Any()
  1391. })
  1392. .ToListAsync();
  1393. return list;
  1394. }
  1395. else
  1396. {
  1397. string count = (dto.HotspotCode.Length + 2).ToString();
  1398. string countx = dto.HotspotCode.Length.ToString();
  1399. var list = await _hotspotTypeRepository.Queryable()
  1400. .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
  1401. .Where((it, o) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && it.ParentId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(countx)) == dto.HotspotCode)
  1402. .WhereIF(dto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
  1403. .WhereIF(dto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
  1404. .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  1405. .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
  1406. .Select((it, o) => new
  1407. {
  1408. HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  1409. SumCount = SqlFunc.AggregateCount(it.HotSpotName)
  1410. })
  1411. .MergeTable()
  1412. .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
  1413. .Select((x, q) => new
  1414. {
  1415. HotspotCode = x.HotspotCode,
  1416. SumCount = x.SumCount,
  1417. HotspotName = q.HotSpotName,
  1418. HasChild = SqlFunc.Subqueryable<Hotspot>().Where(d => d.ParentId == x.HotspotCode).Any()
  1419. })
  1420. .ToListAsync();
  1421. return list;
  1422. }
  1423. }
  1424. /// <summary>
  1425. /// 热点类型小类统计导出
  1426. /// </summary>
  1427. /// <param name="StartTime"></param>
  1428. /// <param name="EndTime"></param>
  1429. /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
  1430. /// <returns></returns>
  1431. [HttpPost("hotspot-statistics/export")]
  1432. [LogFilterAlpha("导出日志")]
  1433. public async Task<FileStreamResult> HotspotStatisticsExprot([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
  1434. {
  1435. DataTable data = new DataTable();
  1436. if (_appOptions.Value.IsLuZhou)
  1437. {
  1438. data = await _orderReportApplication.HotspotStatisticsExprot_LZ(dto);
  1439. }
  1440. else
  1441. {
  1442. var IsCenter = _sessionContext.OrgIsCenter;
  1443. if (string.IsNullOrEmpty(dto.QueryDto.HotspotCode))
  1444. {
  1445. data = await _hotspotTypeRepository.Queryable()
  1446. .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
  1447. .Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && o.Id != null)
  1448. .WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
  1449. .WhereIF(dto.QueryDto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
  1450. .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  1451. .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")) })
  1452. .Select((it, o) => new
  1453. {
  1454. HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
  1455. SumCount = SqlFunc.AggregateCount(it.HotSpotName)
  1456. })
  1457. .MergeTable()
  1458. .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
  1459. .Select((x, q) => new
  1460. {
  1461. SumCount = x.SumCount,
  1462. HotspotName = q.HotSpotName
  1463. })
  1464. .ToDataTableAsync();
  1465. }
  1466. else
  1467. {
  1468. string count = (dto.QueryDto.HotspotCode.Length + 2).ToString();
  1469. string countx = dto.QueryDto.HotspotCode.Length.ToString();
  1470. data = await _hotspotTypeRepository.Queryable()
  1471. .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
  1472. .Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && it.ParentId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(countx)) == dto.QueryDto.HotspotCode)
  1473. .WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
  1474. .WhereIF(dto.QueryDto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
  1475. .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
  1476. .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
  1477. .Select((it, o) => new
  1478. {
  1479. HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  1480. SumCount = SqlFunc.AggregateCount(it.HotSpotName)
  1481. })
  1482. .MergeTable()
  1483. .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
  1484. .Select((x, q) => new
  1485. {
  1486. SumCount = x.SumCount,
  1487. HotspotName = q.HotSpotName,
  1488. })
  1489. .ToDataTableAsync();
  1490. }
  1491. data.Columns["HotspotName"].SetOrdinal(0);
  1492. data.Columns["SumCount"].ColumnName = "分类统计";
  1493. data.Columns["HotspotName"].ColumnName = "热点名称";
  1494. //合计
  1495. DataRow sumRow = data.NewRow();
  1496. sumRow["热点名称"] = "合计";
  1497. decimal totalAmount = 0;
  1498. foreach (DataRow row in data.Rows)
  1499. {
  1500. totalAmount += Convert.ToDecimal(row["分类统计"]);
  1501. }
  1502. sumRow["分类统计"] = totalAmount;
  1503. data.Rows.Add(sumRow);
  1504. }
  1505. var stream = ExcelHelper.CreateStream(data);
  1506. return ExcelStreamResult(stream, "热点类型小类统计");
  1507. }
  1508. /// <summary>
  1509. /// 热点类型小类统计明细
  1510. /// </summary>
  1511. /// <param name="dto"></param>
  1512. /// <returns></returns>
  1513. [HttpGet("hotspot-statistics-detail")]
  1514. public async Task<PagedDto<OrderDto>> HotspotStatisticsDetail([FromQuery] HotspotStatisticsRep dto)
  1515. {
  1516. var (total, items) = await _orderApplication.HotspotStatisticsDetail(dto)
  1517. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1518. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  1519. }
  1520. /// <summary>
  1521. /// 热点类型小类统计明细导出
  1522. /// </summary>
  1523. /// <param name="dto"></param>
  1524. /// <returns></returns>
  1525. [HttpPost("hotspot-statistics-detail/export")]
  1526. [LogFilterAlpha("导出日志")]
  1527. public async Task<FileStreamResult> HotspotStatisticsDetailExport([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
  1528. {
  1529. var query = _orderApplication.HotspotStatisticsDetail(dto.QueryDto);
  1530. List<Order> data;
  1531. if (dto.IsExportAll)
  1532. {
  1533. data = await query.ToListAsync(HttpContext.RequestAborted);
  1534. }
  1535. else
  1536. {
  1537. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1538. data = items;
  1539. }
  1540. var orderDtos = _mapper.Map<IReadOnlyList<OrderDto>>(data);
  1541. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  1542. var dtos = orderDtos
  1543. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  1544. .Cast<object>()
  1545. .ToList();
  1546. var stream = ExcelHelper.CreateStream(dtos);
  1547. return ExcelStreamResult(stream, "热点类型小类统计明细");
  1548. }
  1549. /// <summary>
  1550. /// 部门满意度统计表基础数据
  1551. /// </summary>
  1552. /// <returns></returns>
  1553. [HttpGet("visit-org-satisfaction-statisticsBaseData")]
  1554. public async Task<object> VisitAndOrgSatisfactionStatisticsBaseData()
  1555. {
  1556. return new
  1557. {
  1558. VisitType = EnumExts.GetDescriptions<EVisitType>(),
  1559. };
  1560. }
  1561. /// <summary>
  1562. /// 坐席总体满意度分析
  1563. /// </summary>
  1564. /// <param name="dto"></param>
  1565. /// <returns></returns>
  1566. [HttpGet("seat-satisfaction-statistics")]
  1567. public async Task<List<SeatSatisfactionStatisticsDto>> SeatSatisfactionStatistics([FromQuery] PagedKeywordRequest dto)
  1568. {
  1569. return await _orderApplication.SeatSatisfactionStatistics(dto).ToListAsync();
  1570. }
  1571. /// <summary>
  1572. /// 坐席总体满意度分析导出
  1573. /// </summary>
  1574. /// <param name="dto"></param>
  1575. /// <returns></returns>
  1576. [HttpPost("seat-satisfaction-statistics/export")]
  1577. [LogFilterAlpha("导出日志")]
  1578. public async Task<FileStreamResult> SeatSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
  1579. {
  1580. var query = _orderApplication.SeatSatisfactionStatistics(dto.QueryDto);
  1581. List<SeatSatisfactionStatisticsDto> data;
  1582. if (dto.IsExportAll)
  1583. {
  1584. data = await query.ToListAsync(HttpContext.RequestAborted);
  1585. }
  1586. else
  1587. {
  1588. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1589. data = items;
  1590. }
  1591. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SeatSatisfactionStatisticsDto>(dto.ColumnInfos);
  1592. var dtos = data
  1593. .Select(stu => _mapper.Map(stu, typeof(SeatSatisfactionStatisticsDto), dynamicClass))
  1594. .Cast<object>()
  1595. .ToList();
  1596. var stream = ExcelHelper.CreateStream(dtos);
  1597. return ExcelStreamResult(stream, "坐席总体满意度分析");
  1598. }
  1599. /// <summary>
  1600. /// 坐席总体满意率分析
  1601. /// </summary>
  1602. /// <param name="dto"></param>
  1603. /// <returns></returns>
  1604. [HttpGet("seat-satisfaction-statistics-rate")]
  1605. public async Task<SeatSatisfactionStatisticsEvaluateDto> SeatSatisfactionStatisticsRate([FromQuery] PagedKeywordRequest dto)
  1606. {
  1607. var data = await _orderVisitDetailRepository.Queryable()
  1608. .LeftJoin<OrderVisit>((od, ov) => od.VisitId == ov.Id)
  1609. .LeftJoin<Order>((od, ov, o) => ov.OrderId == o.Id)
  1610. .Where((od, ov, o) => ov.VisitTime >= dto.StartTime.Value && ov.VisitTime <= dto.EndTime.Value && ov.VisitState == EVisitState.Visited
  1611. && od.SeatEvaluate != null && od.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied && od.SeatEvaluate != ESeatEvaluate.Normal
  1612. && od.VisitTarget == EVisitTarget.Seat && o.SourceChannelCode == "RGDH"
  1613. )
  1614. .Select((od, ov, o) => new SeatSatisfactionStatisticsEvaluateDto
  1615. {
  1616. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(od.SeatEvaluate != ESeatEvaluate.NoSatisfied && od.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied, 1, 0)),
  1617. NoSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(od.SeatEvaluate == ESeatEvaluate.NoSatisfied || od.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied, 1, 0))
  1618. })
  1619. .FirstAsync();
  1620. return data;
  1621. }
  1622. /// <summary>
  1623. /// 坐席满意度明细表
  1624. /// </summary>
  1625. /// <param name="dto"></param>
  1626. /// <returns></returns>
  1627. [HttpGet("seat-satisfaction-statistics-list-detail")]
  1628. public async Task<object> SeatSatisfactionStatisticsListDetail([FromQuery] PagedKeywordRequest dto)
  1629. {
  1630. var list = await _orderApplication.SeatSatisfactionStatisticsListDetail(dto).ToListAsync();
  1631. var sumModel = new SeatSatisfactionStatisticsListDetailDto()
  1632. {
  1633. UserName = "合计",
  1634. UserId = "",
  1635. DefaultSatisfied = list.Sum(x => x.DefaultSatisfied),
  1636. VeryNoSatisfied = list.Sum(x => x.VeryNoSatisfied),
  1637. NoSatisfied = list.Sum(x => x.NoSatisfied),
  1638. Normal = list.Sum(x => x.Normal),
  1639. Satisfied = list.Sum(x => x.Satisfied),
  1640. VerySatisfied = list.Sum(x => x.VerySatisfied),
  1641. NoConnect = list.Sum(x => x.NoConnect),
  1642. NoEvaluate = list.Sum(x => x.NoEvaluate),
  1643. };
  1644. return new { List = list, Total = sumModel };
  1645. }
  1646. /// <summary>
  1647. /// 坐席总体满意度分析导出
  1648. /// </summary>
  1649. /// <param name="dto"></param>
  1650. /// <returns></returns>
  1651. [HttpPost("seat-satisfaction-statistics-list-detail/export")]
  1652. [LogFilterAlpha("导出日志")]
  1653. public async Task<FileStreamResult> SeatSatisfactionStatisticsListDetailExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
  1654. {
  1655. var query = _orderApplication.SeatSatisfactionStatisticsListDetail(dto.QueryDto);
  1656. List<SeatSatisfactionStatisticsListDetailDto> data;
  1657. if (dto.IsExportAll)
  1658. {
  1659. data = await query.ToListAsync(HttpContext.RequestAborted);
  1660. }
  1661. else
  1662. {
  1663. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1664. data = items;
  1665. }
  1666. var sumModel = new SeatSatisfactionStatisticsListDetailDto()
  1667. {
  1668. UserName = "合计",
  1669. UserId = "",
  1670. DefaultSatisfied = data.Sum(x => x.DefaultSatisfied),
  1671. VeryNoSatisfied = data.Sum(x => x.VeryNoSatisfied),
  1672. NoSatisfied = data.Sum(x => x.NoSatisfied),
  1673. Normal = data.Sum(x => x.Normal),
  1674. Satisfied = data.Sum(x => x.Satisfied),
  1675. VerySatisfied = data.Sum(x => x.VerySatisfied),
  1676. NoConnect = data.Sum(x => x.NoConnect),
  1677. NoEvaluate = data.Sum(x => x.NoEvaluate),
  1678. };
  1679. data.Add(sumModel);
  1680. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SeatSatisfactionStatisticsListDetailDto>(dto.ColumnInfos);
  1681. var dtos = data
  1682. .Select(stu => _mapper.Map(stu, typeof(SeatSatisfactionStatisticsListDetailDto), dynamicClass))
  1683. .Cast<object>()
  1684. .ToList();
  1685. var stream = ExcelHelper.CreateStream(dtos);
  1686. return ExcelStreamResult(stream, "坐席满意度明细表");
  1687. }
  1688. /// <summary>
  1689. /// 坐席满意度工单明细
  1690. /// </summary>
  1691. /// <param name="dto"></param>
  1692. /// <returns></returns>
  1693. [HttpGet("query-seat-satisfaction-order-visit-list")]
  1694. public async Task<PagedDto<OrderVisitDetailDto>> QuerySeatSatisfactionOrderVisitList([FromQuery] SeatSatisfactionOrderVisitRequest dto)
  1695. {
  1696. var (total, items) = await _orderApplication.QuerySeatSatisfactionOrderVisitList(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1697. return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
  1698. }
  1699. /// <summary>
  1700. /// 坐席满意度工单明细表基础数据
  1701. /// </summary>
  1702. /// <returns></returns>
  1703. [HttpGet("query-seat-satisfaction-base-data")]
  1704. public async Task<object> QuerySeatSatisfactionBaseData()
  1705. {
  1706. var seatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>();
  1707. if (_appOptions.Value.IsZiGong == true)
  1708. {
  1709. seatEvaluate = EnumExtensions.GetEnumKeyValueList<ESeatEvaluate>();
  1710. }
  1711. if (_appOptions.Value.IsZiGong == false)
  1712. {
  1713. seatEvaluate = seatEvaluate.Where(m => new int[] { 1, 3 }.Contains(m.Key) == false).ToList();
  1714. }
  1715. return new
  1716. {
  1717. SeatEvaluate = seatEvaluate
  1718. };
  1719. }
  1720. /// <summary>
  1721. /// 坐席满意度工单明细导出
  1722. /// </summary>
  1723. /// <param name="dto"></param>
  1724. /// <returns></returns>
  1725. [HttpPost("query-seat-satisfaction-order-visit-list/export")]
  1726. [LogFilterAlpha("导出日志")]
  1727. public async Task<FileStreamResult> ExportQuerySeatSatisfactionOrderVisitList([FromBody] ExportExcelDto<SeatSatisfactionOrderVisitRequest> dto)
  1728. {
  1729. var query = _orderApplication.QuerySeatSatisfactionOrderVisitList(dto.QueryDto);
  1730. List<OrderVisitDetail> orders;
  1731. if (dto.IsExportAll)
  1732. {
  1733. orders = await query.ToListAsync(HttpContext.RequestAborted);
  1734. }
  1735. else
  1736. {
  1737. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  1738. orders = items;
  1739. }
  1740. var orderDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(orders);
  1741. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderVisitDetailDto>(dto.ColumnInfos);
  1742. var dtos = orderDtos
  1743. .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
  1744. .Cast<object>()
  1745. .ToList();
  1746. var stream = ExcelHelper.CreateStream(dtos);
  1747. return ExcelStreamResult(stream, "坐席满意度工单明细");
  1748. }
  1749. /// <summary>
  1750. /// 部门满意度统计
  1751. /// </summary>
  1752. /// <param name="dto"></param>
  1753. /// <returns></returns>
  1754. [HttpGet("visit-org-satisfaction-statistics")]
  1755. public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgSatisfactionStatistics([FromQuery] PagedKeywordSonRequest dto)
  1756. {
  1757. var data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto);
  1758. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1759. {
  1760. OrgName = "区县合计",
  1761. TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1762. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1763. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1764. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1765. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1766. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1767. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1768. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1769. NormalCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NormalCount),
  1770. VeryNoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VeryNoSatisfiedCount),
  1771. };
  1772. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1773. {
  1774. OrgName = "市直合计",
  1775. TotalSumCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.TotalSumCount),
  1776. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.VerySatisfiedCount),
  1777. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.SatisfiedCount),
  1778. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.RegardedAsSatisfiedCount),
  1779. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.DefaultSatisfiedCount),
  1780. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoSatisfiedCount),
  1781. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoEvaluateCount),
  1782. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoPutThroughCount),
  1783. NormalCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NormalCount),
  1784. VeryNoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.VeryNoSatisfiedCount),
  1785. };
  1786. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1787. {
  1788. OrgName = "总计",
  1789. TotalSumCount = data.Sum(x => x.TotalSumCount),
  1790. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  1791. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  1792. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  1793. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  1794. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  1795. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  1796. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  1797. NormalCount = data.Sum(x => x.NormalCount),
  1798. VeryNoSatisfiedCount = data.Sum(x => x.VeryNoSatisfiedCount),
  1799. };
  1800. return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = data, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
  1801. }
  1802. /// <summary>
  1803. /// 部门满意度统计导出
  1804. /// </summary>
  1805. /// <param name="dto"></param>
  1806. /// <returns></returns>
  1807. [HttpPost("visit-org-satisfaction-statistics/_export")]
  1808. [LogFilterAlpha("导出日志")]
  1809. public async Task<FileStreamResult> VisitAndOrgSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
  1810. {
  1811. List<VisitAndOrgSatisfactionStatisticsDto> data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto.QueryDto);
  1812. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1813. {
  1814. OrgName = "区县合计",
  1815. TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1816. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1817. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1818. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1819. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1820. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1821. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1822. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1823. NormalCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NormalCount),
  1824. VeryNoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VeryNoSatisfiedCount),
  1825. };
  1826. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1827. {
  1828. OrgName = "市直合计",
  1829. TotalSumCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.TotalSumCount),
  1830. VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.VerySatisfiedCount),
  1831. SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.SatisfiedCount),
  1832. RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.RegardedAsSatisfiedCount),
  1833. DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.DefaultSatisfiedCount),
  1834. NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoSatisfiedCount),
  1835. NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoEvaluateCount),
  1836. NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoPutThroughCount),
  1837. NormalCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NormalCount),
  1838. VeryNoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.VeryNoSatisfiedCount),
  1839. };
  1840. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1841. {
  1842. OrgName = "总计",
  1843. TotalSumCount = data.Sum(x => x.TotalSumCount),
  1844. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  1845. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  1846. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  1847. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  1848. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  1849. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  1850. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  1851. NormalCount = data.Sum(x => x.NormalCount),
  1852. VeryNoSatisfiedCount = data.Sum(x => x.VeryNoSatisfiedCount),
  1853. };
  1854. data.Add(countySumModel);
  1855. data.Add(citySumModel);
  1856. data.Add(sumModel);
  1857. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<VisitAndOrgSatisfactionStatisticsDto>(dto.ColumnInfos);
  1858. var dtos = data
  1859. .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
  1860. .Cast<object>()
  1861. .ToList();
  1862. var stream = ExcelHelper.CreateStream(dtos);
  1863. return ExcelStreamResult(stream, "部门满意度统计数据");
  1864. }
  1865. /// <summary>
  1866. /// 子部门满意度明细
  1867. /// </summary>
  1868. /// <param name="dto"></param>
  1869. /// <returns></returns>
  1870. [HttpGet("visit-org-statisfaction-org-detail")]
  1871. public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgStatisfactionOrgDetail([FromQuery] PagedKeywordSonRequest dto)
  1872. {
  1873. var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto);
  1874. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1875. {
  1876. OrgName = "区县合计",
  1877. TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1878. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1879. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1880. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1881. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1882. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1883. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1884. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1885. NormalCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NormalCount),
  1886. VeryNoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VeryNoSatisfiedCount),
  1887. };
  1888. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1889. {
  1890. OrgName = "市直合计",
  1891. TotalSumCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  1892. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  1893. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  1894. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  1895. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  1896. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  1897. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  1898. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  1899. NormalCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NormalCount),
  1900. VeryNoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VeryNoSatisfiedCount),
  1901. };
  1902. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1903. {
  1904. OrgName = "总计",
  1905. TotalSumCount = list.Sum(x => x.TotalSumCount),
  1906. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  1907. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  1908. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  1909. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  1910. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  1911. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  1912. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  1913. NormalCount = list.Sum(x => x.NormalCount),
  1914. VeryNoSatisfiedCount = list.Sum(x => x.VeryNoSatisfiedCount),
  1915. };
  1916. return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = list, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
  1917. }
  1918. /// <summary>
  1919. /// 部门满意度统计导出
  1920. /// </summary>
  1921. /// <param name="dto"></param>
  1922. /// <returns></returns>
  1923. [HttpPost("visit-org-statisfaction-org-detail/_export")]
  1924. [LogFilterAlpha("导出日志")]
  1925. public async Task<FileStreamResult> VisitAndOrgStatisfactionOrgDetailExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
  1926. {
  1927. var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto.QueryDto);
  1928. var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1929. {
  1930. OrgName = "区县合计",
  1931. TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
  1932. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
  1933. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
  1934. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
  1935. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
  1936. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
  1937. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
  1938. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
  1939. NormalCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NormalCount),
  1940. VeryNoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VeryNoSatisfiedCount),
  1941. };
  1942. var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1943. {
  1944. OrgName = "市直合计",
  1945. TotalSumCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
  1946. VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
  1947. SatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
  1948. RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
  1949. DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
  1950. NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
  1951. NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
  1952. NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
  1953. NormalCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NormalCount),
  1954. VeryNoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VeryNoSatisfiedCount),
  1955. };
  1956. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  1957. {
  1958. OrgName = "总计",
  1959. TotalSumCount = list.Sum(x => x.TotalSumCount),
  1960. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  1961. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  1962. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  1963. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  1964. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  1965. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  1966. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  1967. NormalCount = list.Sum(x => x.NormalCount),
  1968. VeryNoSatisfiedCount = list.Sum(x => x.VeryNoSatisfiedCount),
  1969. };
  1970. list.Add(countySumModel);
  1971. list.Add(citySumModel);
  1972. list.Add(sumModel);
  1973. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<VisitAndOrgSatisfactionStatisticsDto>(dto.ColumnInfos);
  1974. var dtos = list
  1975. .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
  1976. .Cast<object>()
  1977. .ToList();
  1978. var stream = ExcelHelper.CreateStream(dtos);
  1979. return ExcelStreamResult(stream, "部门满意度统计数据");
  1980. }
  1981. /// <summary>
  1982. /// 部门满意度明细
  1983. /// </summary>
  1984. /// <param name="dto"></param>
  1985. /// <returns></returns>
  1986. [HttpGet("visit-org-satisfaction-detail")]
  1987. public async Task<PagedDto<OrgVisitDetailListResp>> VisitAndOrgSatisfactionDetail([FromQuery] VisitAndOrgSatisfactionDetailDto dto)
  1988. {
  1989. //var (total, items) = await _orderApplication.VisitAndOrgSatisfactionDetail(dto)
  1990. var (total, items) = await _orderRepository.VisitAndOrgSatisfactionDetail(dto)
  1991. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  1992. return new PagedDto<OrgVisitDetailListResp>(total, _mapper.Map<IReadOnlyList<OrgVisitDetailListResp>>(items));
  1993. }
  1994. /// <summary>
  1995. /// 部门满意度明细导出
  1996. /// </summary>
  1997. /// <param name="dto"></param>
  1998. /// <returns></returns>
  1999. [HttpPost("visit-org-satisfaction-detail/_export")]
  2000. [LogFilterAlpha("导出日志")]
  2001. public async Task<FileStreamResult> VisitAndOrgSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndOrgSatisfactionDetailDto> dto)
  2002. {
  2003. var query = _orderRepository.VisitAndOrgSatisfactionDetail(dto.QueryDto);
  2004. List<OrgVisitDetailListResp> data;
  2005. if (dto.IsExportAll)
  2006. {
  2007. data = await query.ToListAsync(HttpContext.RequestAborted);
  2008. }
  2009. else
  2010. {
  2011. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  2012. data = items;
  2013. }
  2014. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrgVisitDetailListResp>(dto.ColumnInfos);
  2015. var dtos = data
  2016. .Select(stu => _mapper.Map(stu, typeof(OrgVisitDetailListResp), dynamicClass))
  2017. .Cast<object>()
  2018. .ToList();
  2019. var stream = ExcelHelper.CreateStream(dtos);
  2020. return ExcelStreamResult(stream, "部门满意度明细数据");
  2021. }
  2022. /// <summary>
  2023. /// 中心报表统计--宜宾
  2024. /// </summary>
  2025. /// <param name="StartTime"></param>
  2026. /// <param name="EndTime"></param>
  2027. /// <returns></returns>
  2028. [HttpGet("center_report_forms_statistics")]
  2029. public async Task<CenterReportStatisticsDto> CenterReportFormsStatistics(DateTime StartTime, DateTime EndTime)
  2030. {
  2031. CenterReportStatisticsDto centerReportStatisticsDto = new();
  2032. //信件总量
  2033. int sourceChannelCount = await _orderRepository.Queryable().Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime).CountAsync();
  2034. // 查询工单老数据
  2035. DataTable listOld = null;
  2036. // 查询类型老数据
  2037. DataTable listPurOld = null;
  2038. // 查询部门老数据
  2039. DataTable listCity = null;
  2040. DataTable listCounty = null;
  2041. // 查询老数据详情
  2042. DataTable listInfo = null;
  2043. var oldRun = _systemSettingCacheManager.GetSetting(SettingConstants.IsGetOld)?.SettingValue[0];
  2044. if (oldRun == "true")
  2045. {
  2046. // 查询工单老数据
  2047. listOld = await _orderRepository.CenterReportFormsStatistics(StartTime, EndTime);
  2048. // 查询类型老数据
  2049. listPurOld = await _orderRepository.CenterReportPurTypeStatistics(StartTime, EndTime);
  2050. // 查询部门老数据
  2051. listCity = await _orderRepository.CenterReportDepartStatistics(StartTime, EndTime, "市直部门");
  2052. listCounty = await _orderRepository.CenterReportDepartStatistics(StartTime, EndTime, "区县部门");
  2053. // 查询老数据详情
  2054. listInfo = await _orderRepository.CenterReportNewStatistics(StartTime, EndTime);
  2055. }
  2056. #region 通话记录
  2057. //通话记录
  2058. var callData = await _trCallRecordRepository.Queryable()
  2059. .Where(p => p.CreatedTime >= StartTime && p.CreatedTime <= EndTime && p.Gateway != "82826886" && SqlFunc.Length(p.Gateway) != 4)
  2060. .Select(o => new CenterReportCallDto
  2061. {
  2062. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.On, 1, 0)),//有效
  2063. InTotal = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In, 1, 0)),//呼入总量
  2064. OutTotal = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.Out, 1, 0)),//呼出总量
  2065. InConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.AnsweredTime != null, 1, 0)),//呼入接通量
  2066. OutConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(o.TelNo != "0" && o.CallDirection == ECallDirection.Out && o.AnsweredTime != null, 1, 0)),//呼出接通量
  2067. InvalidCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.NoOn /*&& o.BeginIvrTime.HasValue && o.BeginQueueTime.HasValue && o.BeginRingTime.HasValue*/, 1, 0)), //无效(排除队列挂断和IVR挂断)
  2068. QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.QueueTims > 0 && o.RingTimes == 0 && o.OnState == EOnState.NoOn, 1, 0)), //队列挂断
  2069. 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挂断
  2070. })
  2071. .FirstAsync();
  2072. if (callData != null)
  2073. callData.InvalidCount = callData.InvalidCount - callData.QueueByeCount - callData.IvrByeCount;
  2074. if (listOld != null && listOld.Rows.Count > 0 && callData != null)
  2075. {
  2076. callData.EffectiveCount = callData.EffectiveCount + Convert.ToInt32(listOld.Rows[0]["CallInConn"]); // 有效
  2077. callData.InvalidCount = callData.InvalidCount + Convert.ToInt32(listOld.Rows[0]["CallInNotConn"]); // 无效
  2078. callData.QueueByeCount = callData.QueueByeCount + Convert.ToInt32(listOld.Rows[0]["CallInQueue"]); // 队列挂断
  2079. callData.IvrByeCount = callData.IvrByeCount + Convert.ToInt32(listOld.Rows[0]["CallInIVR"]); // IVR挂断
  2080. }
  2081. centerReportStatisticsDto.CenterReportCall = callData;
  2082. #endregion
  2083. #region 语音分类
  2084. var callTypeDto = await _trCallRecordRepository.Queryable()
  2085. .Where(x => x.CreatedTime >= StartTime && x.CreatedTime <= EndTime && SqlFunc.Length(x.Gateway) > 4 && x.CallDirection == ECallDirection.In)
  2086. .GroupBy(x => x.CreatedTime.ToString("yyyy-MM-dd"))
  2087. .Select(x => new IVRCallTypeDto()
  2088. {
  2089. PersonCallInCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "1", 1, 0)),
  2090. EnterpriseCallInCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.Substring(x.IvrDtmf.Length - 1, 1) == "2", 1, 0)),
  2091. AiCallInCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Gateway == "82826886", 1, 0)),
  2092. }).FirstAsync();
  2093. centerReportStatisticsDto.iVRCallTypeDto = callTypeDto;
  2094. #endregion
  2095. #region 工单
  2096. //工单 信件情况
  2097. var orderData = await _orderRepository.Queryable()
  2098. .LeftJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id)
  2099. .Where((x, so) => x.CreationTime >= StartTime && x.CreationTime <= EndTime)
  2100. .Select((x, so) => new CenterReportOrderDto
  2101. {
  2102. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  2103. InvalidCount = 0,
  2104. CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),
  2105. InProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed, 1, 0)),
  2106. CityAccept = SqlFunc.AggregateSum(SqlFunc.IIF(so.OrgType == EOrgType.City, 1, 0)),
  2107. CountyAccept = SqlFunc.AggregateSum(SqlFunc.IIF(so.OrgType == EOrgType.County, 1, 0)),
  2108. CenterAccept = SqlFunc.AggregateSum(SqlFunc.IIF(so.IsCenter, 1, 0)),
  2109. })
  2110. .FirstAsync();
  2111. if (listOld != null && listOld.Rows.Count > 0 && orderData != null)
  2112. {
  2113. orderData.EffectiveCount = orderData.EffectiveCount + Convert.ToInt32(listOld.Rows[0]["OrderNormalNum"]); // 有效
  2114. orderData.InvalidCount = orderData.InvalidCount + Convert.ToInt32(listOld.Rows[0]["OrderInvalidNum"]); // 无效
  2115. orderData.CompletedCount = orderData.CompletedCount + Convert.ToInt32(listOld.Rows[0]["OrderEndNum"]); // 已办
  2116. orderData.InProgressCount = orderData.InProgressCount + Convert.ToInt32(listOld.Rows[0]["OrderWaitNum"]); // 在办
  2117. }
  2118. if (listInfo != null && listOld.Rows.Count > 0 && orderData != null)
  2119. {
  2120. orderData.CityAccept = orderData.CityAccept + Convert.ToInt32(listInfo.Rows[0]["OrderCityCount"]); // 市级部门受理
  2121. orderData.CountyAccept = orderData.CountyAccept + Convert.ToInt32(listInfo.Rows[0]["OrderCountyCount"]); // 县(区)受理
  2122. orderData.CenterAccept = orderData.CenterAccept + Convert.ToInt32(listInfo.Rows[0]["OrderCenterCount"]); // 12345中心受理
  2123. }
  2124. centerReportStatisticsDto.CenterReportOrder = orderData;
  2125. //工单按时办结情况
  2126. var orderCompletedData = await _orderRepository.Queryable()
  2127. .LeftJoin<SystemOrganize>((x, so) => x.FileUserOrgId == so.Id)
  2128. .Where((x, so) => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.Status >= EOrderStatus.Filed)
  2129. .Select((x, so) => new OrderCompletedDto
  2130. {
  2131. CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),
  2132. ExpiredTimeCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.ActualHandleTime, 1, 0)),//超期已办
  2133. CityExpiredTimeCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.ActualHandleTime && so.OrgType == EOrgType.City, 1, 0)),//市级超期已办
  2134. CountyExpiredTimeCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.ActualHandleTime && so.OrgType == EOrgType.County, 1, 0)),//区县超期已办
  2135. CenterExpiredTimeCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.ActualHandleTime && so.IsCenter, 1, 0)),//中心超期已办
  2136. CityCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && so.OrgType == EOrgType.City, 1, 0)),
  2137. CountyCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && so.OrgType == EOrgType.County, 1, 0)),
  2138. CenterCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && so.IsCenter, 1, 0)),
  2139. })
  2140. .FirstAsync();
  2141. if (listInfo != null && listInfo.Rows.Count > 0 && orderCompletedData != null)
  2142. {
  2143. orderCompletedData.ExpiredTimeCompletedCount = orderCompletedData.ExpiredTimeCompletedCount + Convert.ToInt32(listInfo.Rows[0]["OrderAlready"]) - Convert.ToInt32(listInfo.Rows[0]["CompleteOnTime"]);
  2144. orderCompletedData.CityExpiredTimeCompletedCount = orderCompletedData.CityExpiredTimeCompletedCount + Convert.ToInt32(listInfo.Rows[0]["CityAlready"]) - Convert.ToInt32(listInfo.Rows[0]["CityCompleteOnTime"]);
  2145. orderCompletedData.CountyExpiredTimeCompletedCount = orderCompletedData.CountyExpiredTimeCompletedCount + Convert.ToInt32(listInfo.Rows[0]["CountyAlready"]) - Convert.ToInt32(listInfo.Rows[0]["CountyCompleteOnTime"]);
  2146. orderCompletedData.CenterExpiredTimeCompletedCount = orderCompletedData.CenterExpiredTimeCompletedCount + Convert.ToInt32(listInfo.Rows[0]["CenterAlready"]) - Convert.ToInt32(listInfo.Rows[0]["CenterCompleteOnTime"]);
  2147. orderCompletedData.CityCompletedCount = orderCompletedData.CityCompletedCount + Convert.ToInt32(listInfo.Rows[0]["CityAlready"]);
  2148. orderCompletedData.CountyCompletedCount = orderCompletedData.CountyCompletedCount + Convert.ToInt32(listInfo.Rows[0]["CountyAlready"]);
  2149. orderCompletedData.CenterCompletedCount = orderCompletedData.CenterCompletedCount + Convert.ToInt32(listInfo.Rows[0]["CenterAlready"]);
  2150. }
  2151. centerReportStatisticsDto.OrderCompletedDto = orderCompletedData;
  2152. //工单办理时效
  2153. var orderAgingData = await _orderRepository.Queryable()
  2154. .LeftJoin<SystemOrganize>((x, so) => x.FileUserOrgId == so.Id)
  2155. .Where((x, so) => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.Status >= EOrderStatus.Filed)
  2156. .Select((x, so) => new
  2157. {
  2158. FileOrgIsCenter = x.FileOrgIsCenter.Value,
  2159. CreationTimeHandleDurationWorkday = x.CreationTimeHandleDurationWorkday.HasValue ? x.CreationTimeHandleDurationWorkday : 0,
  2160. CenterToOrgHandleDurationWorkday = x.CenterToOrgHandleDurationWorkday.HasValue ? x.CenterToOrgHandleDurationWorkday : 0,
  2161. OrgType = so.OrgType
  2162. })
  2163. .MergeTable()
  2164. .Select(temp => new OrderAgingDto
  2165. {
  2166. OrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  2167. CompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, temp.CreationTimeHandleDurationWorkday, temp.CenterToOrgHandleDurationWorkday)),
  2168. CityOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.City, 1, 0)),//市级
  2169. CityCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.City, temp.CenterToOrgHandleDurationWorkday, 0)),
  2170. CountyOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.County, 1, 0)),//区县
  2171. CountyCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.County, temp.CenterToOrgHandleDurationWorkday, 0)),
  2172. CenterOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, 1, 0)),//中心
  2173. CenterCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, temp.CreationTimeHandleDurationWorkday, 0)),
  2174. })
  2175. .FirstAsync();
  2176. if (listInfo != null && listInfo.Rows.Count > 0 && orderAgingData != null)
  2177. {
  2178. orderAgingData.OrderCount = orderAgingData.OrderCount + Convert.ToInt32(listInfo.Rows[0]["AllCount"]);
  2179. orderAgingData.CompletedAging = orderAgingData.CompletedAging + Convert.ToInt32(listInfo.Rows[0]["OrderWorkTime"]);
  2180. orderAgingData.CityOrderCount = orderAgingData.CityOrderCount + Convert.ToInt32(listInfo.Rows[0]["OrderCityCount"]);
  2181. orderAgingData.CityCompletedAging = orderAgingData.CityCompletedAging + Convert.ToInt32(listInfo.Rows[0]["CityWorkTime"]);
  2182. orderAgingData.CountyOrderCount = orderAgingData.CountyOrderCount + Convert.ToInt32(listInfo.Rows[0]["OrderCountyCount"]);
  2183. orderAgingData.CountyCompletedAging = orderAgingData.CountyCompletedAging + Convert.ToInt32(listInfo.Rows[0]["CountyWorkTime"]);
  2184. orderAgingData.CenterOrderCount = orderAgingData.CenterOrderCount + Convert.ToInt32(listInfo.Rows[0]["OrderCenterCount"]);
  2185. orderAgingData.CenterCompletedAging = orderAgingData.CenterCompletedAging + Convert.ToInt32(listInfo.Rows[0]["CenterWorkTime"]);
  2186. }
  2187. centerReportStatisticsDto.OrderAgingDto = orderAgingData;
  2188. #endregion
  2189. #region 信件来源
  2190. //信件来源
  2191. var sourceChannelData = await _orderRepository.Queryable()
  2192. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  2193. .Select(it => new
  2194. {
  2195. SourceChannelCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.SourceChannelCode), "QT", it.SourceChannelCode)
  2196. })
  2197. .MergeTable()//将查询出来的结果合并成一个新表
  2198. .GroupBy(it => new { it.SourceChannelCode })//对新表进行分组
  2199. .Select(it => new CenterReportOrderSourceChannelDto
  2200. {
  2201. Code = it.SourceChannelCode,
  2202. CountNum = SqlFunc.AggregateCount(it.SourceChannelCode)
  2203. })
  2204. .ToListAsync();
  2205. List<CenterReportOrderSourceChannelDto> sourceChannel = new()
  2206. {
  2207. new CenterReportOrderSourceChannelDto
  2208. {
  2209. AllCountNum = sourceChannelCount,
  2210. Name = "来源总量",
  2211. Code = "All",
  2212. CountNum = sourceChannelCount
  2213. }
  2214. };
  2215. var sourceChannelDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SourceChannel);
  2216. foreach (var item in sourceChannelDic)
  2217. {
  2218. sourceChannel.Add(new CenterReportOrderSourceChannelDto
  2219. {
  2220. AllCountNum = sourceChannelCount,
  2221. Name = item.DicDataName,
  2222. Code = item.DicTypeCode,
  2223. CountNum = sourceChannelData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
  2224. });
  2225. }
  2226. if (listOld != null && listOld.Rows.Count > 0 && sourceChannel != null)
  2227. {
  2228. foreach (var item in sourceChannel)
  2229. {
  2230. if (item.Code == "All")
  2231. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromAllNum"]); //总量
  2232. else if (item.Code == "YTW")
  2233. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromInternet"]); // 英特网
  2234. else if (item.Code == "RGDH")
  2235. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPhone"]); // 电话
  2236. else if (item.Code == "YBS")
  2237. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformYBS"]); // 宜办事
  2238. else if (item.Code == "QT")
  2239. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromOther"]); // 其他
  2240. else if (item.Code == "ZJ")
  2241. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromSelfBuild"]); // 自建
  2242. else if (item.Code == "WX")
  2243. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromWeChat"]); // 微信
  2244. else if (item.Code == "WB")
  2245. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromWeibo"]); // 微博
  2246. else if (item.Code == "AP")
  2247. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromApp"]); // APP
  2248. else if (item.Code == "ZHYB")
  2249. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromSmartYibin"]); // 智慧宜宾
  2250. else if (item.Code == "ZZPT")
  2251. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformZZ"]); // 综治平台
  2252. else if (item.Code == "S12328")
  2253. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatform12328"]); // 省12328平台
  2254. else if (item.Code == "SZYSM")
  2255. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromMayorNetizen"]); // 市长与市民
  2256. else if (item.Code == "YBRMT")
  2257. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformRMT"]); // 宜宾融媒体
  2258. else if (item.Code == "S12345")
  2259. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformProvince"]); // 省12345平台
  2260. else if (item.Code == "SZMHD")
  2261. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformZMHD"]); // 省政民互动
  2262. else if (item.Code == "SZHZ")
  2263. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformSZHZ"]); // 市州互转
  2264. else if (item.Code == "YB110")
  2265. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatform110"]); // 宜宾110平台
  2266. else if (item.Code == "SMZXBNCS")
  2267. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformBBCS"]); // 市民中心办不成事窗口
  2268. else if (item.Code == "IYB")
  2269. item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformIYB"]); // i宜宾
  2270. }
  2271. }
  2272. centerReportStatisticsDto.CenterReportOrderSourceChannels = sourceChannel;
  2273. #endregion
  2274. #region 信件分类
  2275. //信件来源
  2276. var acceptTypeData = await _orderRepository.Queryable(false, false, false)
  2277. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  2278. .Select(it => new
  2279. {
  2280. AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode),
  2281. FileOrgIsCenter = it.FileOrgIsCenter.HasValue ? it.FileOrgIsCenter : true,
  2282. CreationTimeHandleDurationWorkday = it.CreationTimeHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
  2283. CenterToOrgHandleDurationWorkday = it.CenterToOrgHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
  2284. })
  2285. .MergeTable()//将查询出来的结果合并成一个新表
  2286. .GroupBy(temp => new { temp.AcceptTypeCode })//对新表进行分组
  2287. .Select(temp => new CenterReportOrderSourceChannelDto
  2288. {
  2289. Code = temp.AcceptTypeCode,
  2290. CountNum = SqlFunc.AggregateCount(temp.AcceptTypeCode),
  2291. CompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == true, temp.CreationTimeHandleDurationWorkday, temp.CenterToOrgHandleDurationWorkday))
  2292. })
  2293. .ToListAsync();
  2294. List<CenterReportOrderSourceChannelDto> acceptType = new();
  2295. var acceptTypeDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType);
  2296. foreach (var item in acceptTypeDic)
  2297. {
  2298. acceptType.Add(new CenterReportOrderSourceChannelDto
  2299. {
  2300. AllCountNum = sourceChannelCount,
  2301. Name = item.DicDataName,
  2302. Code = item.DicTypeCode,
  2303. CountNum = acceptTypeData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0,
  2304. CompletedAging = acceptTypeData.Find(p => p.Code == item.DicDataValue)?.CompletedAging ?? 0
  2305. });
  2306. }
  2307. if (listPurOld != null && listPurOld.Rows.Count > 0 && acceptType != null)
  2308. {
  2309. foreach (var item in acceptType)
  2310. {
  2311. if (item.Code == "10")
  2312. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Consult"]); // 咨询
  2313. else if (item.Code == "15")
  2314. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Suggest"]); // 建议
  2315. else if (item.Code == "20")
  2316. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["SeekHelp"]); // 求助
  2317. else if (item.Code == "25")
  2318. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Praise"]); // 表扬
  2319. else if (item.Code == "30")
  2320. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Report"]); // 举报
  2321. else if (item.Code == "35")
  2322. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Complaint"]); // 投诉
  2323. }
  2324. }
  2325. centerReportStatisticsDto.CenterReportOrderAcceptTypes = acceptType;
  2326. #endregion
  2327. #region 信件回访量
  2328. //信件回访量
  2329. CenterReportVisitdDto centerReportVisitd = new()
  2330. {
  2331. Visitd = await _orderVisitRepository.Queryable()
  2332. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState == EVisitState.Visited).CountAsync(),
  2333. WaitVisitd = await _orderVisitRepository.Queryable()
  2334. .Where(x => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited).CountAsync()
  2335. };
  2336. //
  2337. var query = _orderVisitDetailRepository.Queryable()
  2338. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  2339. .LeftJoin<SystemOrganize>((it, o, so) => it.VisitOrgCode == so.Id)
  2340. .Where((it, o, so) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  2341. .Select((it, o, so) => new
  2342. {
  2343. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)),
  2344. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 0, 1)),
  2345. CityDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.City, 1, 0)),
  2346. CitySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.City, 1, 0)),
  2347. CountyDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.County, 1, 0)),
  2348. CountySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.County, 1, 0)),
  2349. CenterDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.IsCenter, 1, 0)),
  2350. CenterSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.IsCenter, 1, 0)),
  2351. OrgDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && !so.IsCenter, 1, 0)),
  2352. OrgSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && !so.IsCenter, 1, 0)),
  2353. });
  2354. Console.Write(query.ToSqlString());
  2355. var data = await query.FirstAsync();
  2356. if (data.Satisfied > 0)
  2357. {
  2358. var count = data.Satisfied + data.Dissatisfied;
  2359. centerReportVisitd.AllRate = Math.Round((data.Satisfied / (double)count) * 100, 2);
  2360. }
  2361. if (data.OrgSatisfied > 0)
  2362. {
  2363. var count = data.OrgSatisfied + data.OrgDissatisfied;
  2364. centerReportVisitd.OrgRate = Math.Round((data.OrgSatisfied / (double)count) * 100, 2);
  2365. }
  2366. if (data.CitySatisfied > 0)
  2367. {
  2368. var count = data.CitySatisfied + data.CityDissatisfied;
  2369. centerReportVisitd.CityRate = Math.Round((data.CitySatisfied / (double)count) * 100, 2);
  2370. }
  2371. if (data.CountySatisfied > 0)
  2372. {
  2373. var count = data.CountySatisfied + data.CountyDissatisfied;
  2374. centerReportVisitd.CountyRate = Math.Round((data.CountySatisfied / (double)count) * 100, 2);
  2375. }
  2376. if (data.CenterSatisfied > 0)
  2377. {
  2378. var count = data.CenterSatisfied + data.CenterDissatisfied;
  2379. centerReportVisitd.CenterRate = Math.Round((data.CenterSatisfied / (double)count) * 100, 2);
  2380. }
  2381. centerReportVisitd.Dissatisfied = data.Dissatisfied;
  2382. centerReportVisitd.CityDissatisfied = data.CityDissatisfied;
  2383. centerReportVisitd.CountyDissatisfied = data.CountyDissatisfied;
  2384. if (listOld != null && listOld.Rows.Count > 0 && centerReportVisitd != null)
  2385. {
  2386. centerReportVisitd.Visitd = centerReportVisitd.Visitd + Convert.ToInt32(listOld.Rows[0]["VisitAlreadyNum"]); // 已回访
  2387. centerReportVisitd.WaitVisitd = centerReportVisitd.WaitVisitd + Convert.ToInt32(listOld.Rows[0]["VisitWaitNum"]); // 待回访
  2388. centerReportVisitd.SeatsRate = Math.Round((centerReportVisitd.SeatsRate + Convert.ToDouble(listOld.Rows[0]["SatisfactionSeat"])) / 2, 2); // 坐席满意度
  2389. centerReportVisitd.OrgRate = Math.Round((centerReportVisitd.OrgRate + Convert.ToDouble(listOld.Rows[0]["SatisfactionDepartment"])) / 2, 2); // 部门满意度
  2390. }
  2391. if (listInfo != null && listInfo.Rows.Count > 0 && centerReportVisitd != null)
  2392. {
  2393. //总体满意率
  2394. centerReportVisitd.AllRate = Math.Round(centerReportVisitd.AllRate + Convert.ToDouble(listInfo.Rows[0]["SatisfactionRate"]) / 2, 2);
  2395. //市级部门满意率
  2396. centerReportVisitd.CityRate = Math.Round(centerReportVisitd.CityRate + Convert.ToDouble(listInfo.Rows[0]["CitySatisfactionRate"]) / 2, 2);
  2397. //县(区)满意率
  2398. centerReportVisitd.CountyRate = Math.Round(centerReportVisitd.CountyRate + Convert.ToDouble(listInfo.Rows[0]["CountySatisfactionRate"]) / 2, 2);
  2399. //不满意件
  2400. centerReportVisitd.Dissatisfied = centerReportVisitd.Dissatisfied + Convert.ToInt32(listInfo.Rows[0]["SatisfactionCount"]);
  2401. //市级部门不满意件
  2402. centerReportVisitd.CityDissatisfied = centerReportVisitd.CityDissatisfied + Convert.ToInt32(listInfo.Rows[0]["CenterSatisfactionCount"]);
  2403. //县(区)不满意件
  2404. centerReportVisitd.CountyDissatisfied = centerReportVisitd.CountyDissatisfied + Convert.ToInt32(listInfo.Rows[0]["CountySatisfactionCount"]);
  2405. }
  2406. //部门
  2407. //var listOrg = await _orderVisitDetailRepository.Queryable()
  2408. // .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  2409. // .Where((it, o) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  2410. // .Select((it, o) => new Satisfaction
  2411. // {
  2412. // Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
  2413. // Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 0, 1)),
  2414. // })
  2415. // .ToListAsync();
  2416. //if (listOrg != null && listOrg.Count > 0)
  2417. //{
  2418. // var SatisfiedCount = listOrg[0].Satisfied + listOrg[0].Satisfied;
  2419. // if (SatisfiedCount > 0 && listOrg[0].Satisfied > 0)
  2420. // centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)SatisfiedCount) * 100, 2);
  2421. //}
  2422. ////if (centerReportVisitd.Visitd > 0 && listOrg != null && listOrg.Count > 0 && listOrg[0].Satisfied > 0)
  2423. ////centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
  2424. ////坐席
  2425. //var listSet = await _orderVisitDetailRepository.Queryable()
  2426. // .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  2427. // .Where((it, o) => it.VisitTarget == EVisitTarget.Seat && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  2428. // .Select((it, o) => new Satisfaction
  2429. // {
  2430. // Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
  2431. // Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
  2432. // }).ToListAsync();
  2433. //if (listSet != null && listSet.Count > 0)
  2434. //{
  2435. // var SatisfiedCount = listSet[0].Satisfied + listSet[0].Satisfied;
  2436. // if (SatisfiedCount > 0 && listSet[0].Satisfied > 0)
  2437. // centerReportVisitd.OrgRate = Math.Round((listSet[0].Satisfied / (double)SatisfiedCount) * 100, 2);
  2438. //}
  2439. //if (centerReportVisitd.Visitd > 0 && listSet != null && listSet.Count > 0 && listSet[0].Satisfied > 0)
  2440. // centerReportVisitd.SeatsRate = Math.Round((listSet[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
  2441. centerReportStatisticsDto.CenterReportVisitd = centerReportVisitd;
  2442. #endregion
  2443. #region 信件分布情况
  2444. //市直部门
  2445. var listOrgStatisticsCityAll = await _orderRepository.Queryable()
  2446. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  2447. .Select(o => new
  2448. {
  2449. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  2450. })
  2451. .MergeTable()
  2452. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  2453. .Where((o, s) => s.OrgType == EOrgType.City || s.OrgType == EOrgType.Province)
  2454. .GroupBy((o, s) => new
  2455. {
  2456. o.OrgCode,
  2457. s.Name
  2458. })
  2459. .Select((o, s) => new OrgStatistics
  2460. {
  2461. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  2462. OrgName = s.Name
  2463. }).ToListAsync();
  2464. if (listCity != null && listOrgStatisticsCityAll != null)
  2465. {
  2466. var arrOrgCode = "";
  2467. foreach (var item in listOrgStatisticsCityAll)
  2468. {
  2469. for (int i = 0; i < listCity.Rows.Count; i++)
  2470. {
  2471. var orgCode1 = item.OrgCode;
  2472. var orgCode2 = listCity.Rows[i]["OrgCode"].ToString();
  2473. if (orgCode1 == orgCode2)
  2474. {
  2475. arrOrgCode += "'" + orgCode1 + "',";
  2476. item.CountNum = item.CountNum + Convert.ToInt32(listCity.Rows[i]["OrderAllNum"]);
  2477. }
  2478. }
  2479. }
  2480. for (int i = 0; i < listCity.Rows.Count; i++)
  2481. {
  2482. var orgCode = listCity.Rows[i]["OrgCode"].ToString();
  2483. if (arrOrgCode.IndexOf("'" + orgCode + "'") == -1)
  2484. {
  2485. listOrgStatisticsCityAll.Add(
  2486. new OrgStatistics
  2487. {
  2488. OrgCode = listCity.Rows[i]["OrgCode"].ToString(),
  2489. OrgName = listCity.Rows[i]["Name"].ToString(),
  2490. CountNum = Convert.ToInt32(listCity.Rows[i]["OrderAllNum"])
  2491. });
  2492. }
  2493. }
  2494. }
  2495. centerReportStatisticsDto.OrgStatisticsCityAll = new OrgStatisticsAll
  2496. {
  2497. OrgStatistics = listOrgStatisticsCityAll
  2498. };
  2499. //区县部门
  2500. var listOrgStatisticsAreaAll = await _orderRepository.Queryable()
  2501. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  2502. .Select(o => new
  2503. {
  2504. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  2505. })
  2506. .MergeTable()
  2507. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  2508. .Where((o, s) => s.OrgType == EOrgType.County)
  2509. .GroupBy((o, s) => new
  2510. {
  2511. o.OrgCode,
  2512. s.Name
  2513. })
  2514. .Select((o, s) => new OrgStatistics
  2515. {
  2516. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  2517. OrgName = s.Name
  2518. }).ToListAsync();
  2519. if (listCounty != null && listOrgStatisticsAreaAll != null)
  2520. {
  2521. var arrOrgCode = "";
  2522. foreach (var item in listOrgStatisticsAreaAll)
  2523. {
  2524. for (int i = 0; i < listCounty.Rows.Count; i++)
  2525. {
  2526. var orgCode1 = item.OrgCode;
  2527. var orgCode2 = listCounty.Rows[i]["OrgCode"].ToString();
  2528. if (orgCode1 == orgCode2)
  2529. {
  2530. arrOrgCode += "'" + orgCode1 + "',";
  2531. item.CountNum = item.CountNum + Convert.ToInt32(listCounty.Rows[i]["OrderAllNum"]);
  2532. }
  2533. }
  2534. }
  2535. for (int i = 0; i < listCounty.Rows.Count; i++)
  2536. {
  2537. var orgCode = listCounty.Rows[i]["OrgCode"].ToString();
  2538. if (arrOrgCode.IndexOf("'" + orgCode + "'") == -1)
  2539. {
  2540. listOrgStatisticsAreaAll.Add(
  2541. new OrgStatistics
  2542. {
  2543. OrgCode = listCounty.Rows[i]["OrgCode"].ToString(),
  2544. OrgName = listCounty.Rows[i]["Name"].ToString(),
  2545. CountNum = Convert.ToInt32(listCounty.Rows[i]["OrderAllNum"])
  2546. });
  2547. }
  2548. }
  2549. }
  2550. centerReportStatisticsDto.OrgStatisticsAreaAll = new OrgStatisticsAll
  2551. {
  2552. OrgStatistics = listOrgStatisticsAreaAll
  2553. };
  2554. #endregion
  2555. #region 企业服务办件情况
  2556. //工单 信件情况
  2557. var enterpriseOrderData = await _orderRepository.Queryable()
  2558. .LeftJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id)
  2559. .Where((x, so) => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.IdentityType == EIdentityType.Enterprise)
  2560. .Select((x, so) => new EnterpriseOrderDto
  2561. {
  2562. InProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed, 1, 0)),
  2563. CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),
  2564. CenterCount = SqlFunc.AggregateSum(SqlFunc.IIF(so.IsCenter, 1, 0)),
  2565. CityCount = SqlFunc.AggregateSum(SqlFunc.IIF(so.OrgType == EOrgType.City, 1, 0)),
  2566. CountyCount = SqlFunc.AggregateSum(SqlFunc.IIF(so.OrgType == EOrgType.County, 1, 0)),
  2567. })
  2568. .FirstAsync();
  2569. var enterpriseOrderDto = await _orderRepository.Queryable()
  2570. .LeftJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id)
  2571. .Where((x, so) => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.IdentityType == EIdentityType.Enterprise)
  2572. .Select((x, so) => new
  2573. {
  2574. FileOrgIsCenter = x.FileOrgIsCenter.Value,
  2575. CreationTimeHandleDurationWorkday = x.CreationTimeHandleDurationWorkday.HasValue ? x.CreationTimeHandleDurationWorkday : 0,
  2576. CenterToOrgHandleDurationWorkday = x.CenterToOrgHandleDurationWorkday.HasValue ? x.CenterToOrgHandleDurationWorkday : 0,
  2577. OrgType = so.OrgType
  2578. })
  2579. .MergeTable()
  2580. .Select(temp => new EnterpriseOrderDto
  2581. {
  2582. OrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
  2583. CompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, temp.CreationTimeHandleDurationWorkday, temp.CenterToOrgHandleDurationWorkday)),
  2584. CityOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.City, 1, 0)),//市级
  2585. CityCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.City, temp.CenterToOrgHandleDurationWorkday, 0)),
  2586. CountyOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.County, 1, 0)),//区县
  2587. CountyCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.County, temp.CenterToOrgHandleDurationWorkday, 0)),
  2588. CenterOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, 1, 0)),//中心
  2589. CenterCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, temp.CreationTimeHandleDurationWorkday, 0)),
  2590. })
  2591. .FirstAsync();
  2592. enterpriseOrderDto.InProgressCount = enterpriseOrderData.InProgressCount;
  2593. enterpriseOrderDto.CompletedCount = enterpriseOrderData.CompletedCount;
  2594. enterpriseOrderDto.CenterCount = enterpriseOrderData.CenterCount;
  2595. enterpriseOrderDto.CityCount = enterpriseOrderData.CityCount;
  2596. enterpriseOrderDto.CountyCount = enterpriseOrderData.CountyCount;
  2597. centerReportStatisticsDto.EnterpriseOrderDto = enterpriseOrderDto;
  2598. var enterpriseOrderDto2 = await _orderVisitDetailRepository.Queryable()
  2599. .Includes(it => it.OrderVisit, ov => ov.Order)
  2600. .LeftJoin<SystemOrganize>((it, so) => it.VisitOrgCode == so.Id)
  2601. .Where((it, so) => it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitTime >= StartTime && it.OrderVisit.VisitTime <= EndTime && it.OrderVisit.VisitState == EVisitState.Visited && it.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
  2602. .GroupBy((it, so) => it.Id)
  2603. .Select((it, so) => new EnterpriseOrderDto
  2604. {
  2605. VisitdCount = SqlFunc.AggregateCount(1),
  2606. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)),
  2607. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2"), 1, 0)),
  2608. CityDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.City, 1, 0)),
  2609. CitySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.City, 1, 0)),
  2610. CountyDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.County, 1, 0)),
  2611. CountySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1") && !(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2") && so.OrgType == EOrgType.County, 1, 0)),
  2612. })
  2613. .ToListAsync();
  2614. if (enterpriseOrderDto2.Any())
  2615. {
  2616. centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount = enterpriseOrderDto2.Sum(x => x.VisitdCount);
  2617. centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied = enterpriseOrderDto2.Sum(x => x.Dissatisfied);
  2618. centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied = enterpriseOrderDto2.Sum(x => x.CityDissatisfied);
  2619. centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied = enterpriseOrderDto2.Sum(x => x.CountyDissatisfied);
  2620. centerReportStatisticsDto.EnterpriseOrderDto.Satisfied = enterpriseOrderDto2.Sum(x => x.Satisfied);
  2621. centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied = enterpriseOrderDto2.Sum(x => x.CitySatisfied);
  2622. centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = enterpriseOrderDto2.Sum(x => x.CountySatisfied);
  2623. }
  2624. if (listInfo != null && listInfo.Rows.Count > 0 && centerReportStatisticsDto.EnterpriseOrderDto != null)
  2625. {
  2626. // 企业办件
  2627. centerReportStatisticsDto.EnterpriseOrderDto.OrderCount = centerReportStatisticsDto.EnterpriseOrderDto.OrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseAllCount"]);
  2628. centerReportStatisticsDto.EnterpriseOrderDto.CompletedAging = centerReportStatisticsDto.EnterpriseOrderDto.CompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseWorkTime"]);
  2629. centerReportStatisticsDto.EnterpriseOrderDto.CityOrderCount = centerReportStatisticsDto.EnterpriseOrderDto.CityOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCity"]);
  2630. centerReportStatisticsDto.EnterpriseOrderDto.CityCompletedAging = centerReportStatisticsDto.EnterpriseOrderDto.CityCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCityWorkTime"]);
  2631. centerReportStatisticsDto.EnterpriseOrderDto.CountyOrderCount = centerReportStatisticsDto.EnterpriseOrderDto.CountyOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCounty"]);
  2632. centerReportStatisticsDto.EnterpriseOrderDto.CountyCompletedAging = centerReportStatisticsDto.EnterpriseOrderDto.CountyCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCountyWorkTime"]);
  2633. centerReportStatisticsDto.EnterpriseOrderDto.CenterOrderCount = centerReportStatisticsDto.EnterpriseOrderDto.CenterOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCenter"]);
  2634. centerReportStatisticsDto.EnterpriseOrderDto.CenterCompletedAging = centerReportStatisticsDto.EnterpriseOrderDto.CenterCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCenterWorkTime"]);
  2635. // 企业满意度
  2636. centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount = centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseVisit"]);
  2637. centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied = centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseDisSatisfaction"]);
  2638. centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied + Convert.ToInt32(listInfo.Rows[0]["CityCount"]) - Convert.ToInt32(listInfo.Rows[0]["CitySatisfactionCount"]);
  2639. centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied + Convert.ToInt32(listInfo.Rows[0]["CountyCount"]) - Convert.ToInt32(listInfo.Rows[0]["CountySatisfactionCount"]);
  2640. centerReportStatisticsDto.EnterpriseOrderDto.Satisfied = centerReportStatisticsDto.EnterpriseOrderDto.Satisfied + Convert.ToInt32(listInfo.Rows[0]["AllCount"]) - Convert.ToInt32(listInfo.Rows[0]["SatisfactionCount"]);
  2641. centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCitySatisfaction"]);
  2642. centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCountySatisfaction"]);
  2643. }
  2644. #endregion
  2645. #region 企业信件分类
  2646. //信件来源
  2647. var enterpriseAcceptTypeData = await _orderRepository.Queryable(false, false, false)
  2648. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime && p.IdentityType == EIdentityType.Enterprise)
  2649. .Select(it => new
  2650. {
  2651. AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode),
  2652. FileOrgIsCenter = it.FileOrgIsCenter.HasValue ? it.FileOrgIsCenter : true,
  2653. CreationTimeHandleDurationWorkday = it.CreationTimeHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
  2654. CenterToOrgHandleDurationWorkday = it.CenterToOrgHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
  2655. })
  2656. .MergeTable()//将查询出来的结果合并成一个新表
  2657. .GroupBy(temp => new { temp.AcceptTypeCode })//对新表进行分组
  2658. .Select(temp => new CenterReportOrderSourceChannelDto
  2659. {
  2660. Code = temp.AcceptTypeCode,
  2661. CountNum = SqlFunc.AggregateCount(temp.AcceptTypeCode),
  2662. CompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == true, temp.CreationTimeHandleDurationWorkday, temp.CenterToOrgHandleDurationWorkday))
  2663. })
  2664. .ToListAsync();
  2665. List<CenterReportOrderSourceChannelDto> enterpriseAcceptType = new();
  2666. var enterpriseAcceptTypeDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType);
  2667. foreach (var item in enterpriseAcceptTypeDic)
  2668. {
  2669. enterpriseAcceptType.Add(new CenterReportOrderSourceChannelDto
  2670. {
  2671. AllCountNum = sourceChannelCount,
  2672. Name = item.DicDataName,
  2673. Code = item.DicTypeCode,
  2674. CountNum = enterpriseAcceptTypeData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0,
  2675. CompletedAging = enterpriseAcceptTypeData.Find(p => p.Code == item.DicDataValue)?.CompletedAging ?? 0
  2676. });
  2677. }
  2678. if (listPurOld != null && listPurOld.Rows.Count > 0 && enterpriseAcceptType != null)
  2679. {
  2680. foreach (var item in enterpriseAcceptType)
  2681. {
  2682. if (item.Code == "10")
  2683. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Consult"]); // 咨询
  2684. else if (item.Code == "15")
  2685. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Suggest"]); // 建议
  2686. else if (item.Code == "20")
  2687. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["SeekHelp"]); // 求助
  2688. else if (item.Code == "25")
  2689. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Praise"]); // 表扬
  2690. else if (item.Code == "30")
  2691. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Report"]); // 举报
  2692. else if (item.Code == "35")
  2693. item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Complaint"]); // 投诉
  2694. }
  2695. }
  2696. centerReportStatisticsDto.EnterpriseCenterReportOrderAcceptTypes = enterpriseAcceptType;
  2697. #endregion
  2698. return centerReportStatisticsDto;
  2699. }
  2700. /// <summary>
  2701. /// 中心报表统计--自贡
  2702. /// </summary>
  2703. /// <param name="StartTime"></param>
  2704. /// <param name="EndTime"></param>
  2705. /// <returns></returns>
  2706. [HttpGet("center_report_forms_statistics_zg")]
  2707. public async Task<CenterReportStatisticsDto> ZgCenterReportFormsStatistics(DateTime StartTime, DateTime EndTime)
  2708. {
  2709. CenterReportStatisticsDto centerReportStatisticsDto = new();
  2710. //信件总量
  2711. int sourceChannelCount = await _orderRepository.Queryable().Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime).CountAsync();
  2712. #region 1、通话记录
  2713. //通话记录
  2714. var callData = await _callNativeRepository.Queryable()
  2715. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  2716. // .Where(p => p.Gateway != "82826886" && SqlFunc.Length(p.Gateway) != 4)
  2717. .Select(p => new CenterReportCallInfoDto
  2718. {
  2719. AllCallCount = SqlFunc.AggregateSum(1),//话务总量
  2720. InTotal = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In, 1, 0)),//呼入总量
  2721. InConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.AnsweredTime != null, 1, 0)),//呼入接通量
  2722. InHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.AnsweredTime == null, 1, 0)),//呼入未接通
  2723. QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.WaitDuration > 0 && p.RingDuration == 0 && p.AnsweredTime == null, 1, 0)), //队列挂断
  2724. IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.BeginIvrTime.HasValue && !p.BeginQueueTime.HasValue && !p.BeginRingTime.HasValue && p.AnsweredTime == null, 1, 0)), //IVR挂断
  2725. OutTotal = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.Out, 1, 0)),//呼出总量
  2726. OutConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(p.TelNo != "0" && p.Direction == ECallDirection.Out && p.AnsweredTime != null, 1, 0)),//呼出接通量
  2727. OutHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(p.TelNo != "0" && p.Direction == ECallDirection.Out && p.AnsweredTime == null, 1, 0)),//呼出未接通
  2728. })
  2729. .FirstAsync();
  2730. centerReportStatisticsDto.CenterReportCallInfoDto = callData;
  2731. #endregion
  2732. #region 2、信件回访量
  2733. //信件回访量
  2734. var centerReportVisitd = await _orderVisitRepository.Queryable()
  2735. .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime)
  2736. .Select(x => new CenterReportVisitdDto
  2737. {
  2738. Visitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited, 1, 0)),//已回访
  2739. CallVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType == EVisitType.CallVisit, 1, 0)),// 已回访--电话
  2740. SmsVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType == EVisitType.SmsVisit, 1, 0)),//已回访--短信
  2741. OtherVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType != EVisitType.CallVisit && x.VisitType != EVisitType.SmsVisit, 1, 0)),//其他回访
  2742. //WaitVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited, 1, 0)),//待回访
  2743. }).FirstAsync();
  2744. var waitVisitd = await _orderVisitRepository.Queryable()
  2745. .Where(x => x.CreationTime >= StartTime && x.CreationTime <= EndTime).Select(x =>
  2746. SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited, 1, 0)) //待回访
  2747. ).FirstAsync();
  2748. centerReportVisitd.WaitVisitd = waitVisitd;
  2749. //部门
  2750. var listOrg = await _orderVisitDetailRepository.Queryable()
  2751. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  2752. .Where((it, o) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  2753. .Select((it, o) => new Satisfaction
  2754. {
  2755. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)),
  2756. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") != "1" && SqlFunc.JsonField(it.OrgProcessingResults, "Key") != "2", 1, 0)),
  2757. })
  2758. .FirstAsync();
  2759. //计算部门满意度
  2760. if (listOrg != null)
  2761. {
  2762. var satisfiedCount = listOrg.Satisfied + listOrg.Dissatisfied;
  2763. if (satisfiedCount > 0 && listOrg.Satisfied > 0)
  2764. centerReportVisitd.OrgRate = Math.Round((listOrg.Satisfied / (double)satisfiedCount) * 100, 2);
  2765. }
  2766. //坐席
  2767. var listSet = await _orderVisitDetailRepository.Queryable()
  2768. .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
  2769. .Where((it, o) => it.VisitTarget == EVisitTarget.Seat && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
  2770. .Select((it, o) => new Satisfaction
  2771. {
  2772. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
  2773. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
  2774. })
  2775. .FirstAsync();
  2776. //计算坐席满意度
  2777. if (listSet != null)
  2778. {
  2779. var satisfiedCount = listSet.Satisfied + listSet.Dissatisfied;
  2780. if (satisfiedCount > 0 && listSet.Satisfied > 0)
  2781. centerReportVisitd.SeatsRate = Math.Round((listSet.Satisfied / (double)satisfiedCount) * 100, 2);
  2782. }
  2783. centerReportStatisticsDto.CenterReportVisitd = centerReportVisitd;
  2784. #endregion
  2785. #region 3、工单
  2786. //工单
  2787. var orderData = await _orderRepository.Queryable()
  2788. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  2789. .Select(x => new CenterReportOrderDto
  2790. {
  2791. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),//有效
  2792. InvalidCount = 0,//无效
  2793. CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),//已办结
  2794. OnTimeCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ExpiredTime > x.ActualHandleTime, 1, 0)),//按时办结
  2795. CenterCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ProcessType == EProcessType.Zhiban, 1, 0)),//中心办结
  2796. OrgCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ProcessType == EProcessType.Jiaoban, 1, 0)),//部门办结
  2797. InProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed, 1, 0)),//在办
  2798. CenterInProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed && x.ProcessType == EProcessType.Zhiban, 1, 0)),//中心在办
  2799. OrgInProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed && x.ProcessType == EProcessType.Jiaoban, 1, 0))//部门在办
  2800. })
  2801. .FirstAsync();
  2802. centerReportStatisticsDto.CenterReportOrder = orderData;
  2803. #endregion
  2804. #region 4、信件来源
  2805. //信件来源
  2806. var sourceChannelData = _orderRepository.Queryable()
  2807. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  2808. .Select(it => new
  2809. {
  2810. SourceChannelCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.SourceChannelCode), "QT", it.SourceChannelCode)
  2811. })
  2812. .MergeTable()//将查询出来的结果合并成一个新表
  2813. .GroupBy(it => new { it.SourceChannelCode })//对新表进行分组
  2814. .Select(it => new CenterReportOrderSourceChannelDto
  2815. {
  2816. Code = it.SourceChannelCode,
  2817. CountNum = SqlFunc.AggregateCount(it.SourceChannelCode)
  2818. });
  2819. var sourceData = await _systemDicDataRepository.Queryable()
  2820. .LeftJoin(sourceChannelData, (s, p) => s.DicDataValue == p.Code)
  2821. .Where((s, p) => s.DicTypeCode == "SourceChannel" && s.IsShow == true)
  2822. .Select((s, p) => new CenterReportOrderSourceChannelDto
  2823. {
  2824. Code = s.DicDataValue,
  2825. Name = s.DicDataName,
  2826. CountNum = p.CountNum
  2827. })
  2828. .ToListAsync();
  2829. centerReportStatisticsDto.CenterReportOrderSourceChannels = sourceData;
  2830. #endregion
  2831. #region 5、信件分类
  2832. //信件来源 AcceptType
  2833. var acceptTypeData = _orderRepository.Queryable(false, false, false)
  2834. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  2835. .Select(it => new
  2836. {
  2837. AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode)
  2838. })
  2839. .MergeTable()//将查询出来的结果合并成一个新表
  2840. .GroupBy(it => new { it.AcceptTypeCode })//对新表进行分组
  2841. .Select(it => new CenterReportOrderSourceChannelDto
  2842. {
  2843. Code = it.AcceptTypeCode,
  2844. CountNum = SqlFunc.AggregateCount(it.AcceptTypeCode)
  2845. });
  2846. var acceptType = await _systemDicDataRepository.Queryable()
  2847. .LeftJoin(acceptTypeData, (s, p) => s.DicDataValue == p.Code)
  2848. .Where((s, p) => s.DicTypeCode == "AcceptType" && s.IsShow == true)
  2849. .Select((s, p) => new CenterReportOrderSourceChannelDto
  2850. {
  2851. AllCountNum = sourceChannelCount,
  2852. Code = s.DicDataValue,
  2853. Name = s.DicDataName,
  2854. CountNum = p.CountNum
  2855. })
  2856. .ToListAsync();
  2857. centerReportStatisticsDto.CenterReportOrderAcceptTypes = acceptType;
  2858. #endregion
  2859. #region 信件分布情况
  2860. //市直部门
  2861. var listOrgStatisticsCityAll = await _orderRepository.Queryable()
  2862. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  2863. .Select(o => new
  2864. {
  2865. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  2866. })
  2867. .MergeTable()
  2868. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  2869. .Where((o, s) => s.OrgType == EOrgType.City || s.OrgType == EOrgType.Province)
  2870. .GroupBy((o, s) => new
  2871. {
  2872. o.OrgCode,
  2873. s.Name
  2874. })
  2875. .Select((o, s) => new OrgStatistics
  2876. {
  2877. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  2878. OrgName = s.Name
  2879. }).ToListAsync();
  2880. centerReportStatisticsDto.OrgStatisticsCityAll = new OrgStatisticsAll
  2881. {
  2882. OrgStatistics = listOrgStatisticsCityAll
  2883. };
  2884. //区县部门
  2885. var listOrgStatisticsAreaAll = await _orderRepository.Queryable()
  2886. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  2887. .Select(o => new
  2888. {
  2889. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  2890. })
  2891. .MergeTable()
  2892. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  2893. .Where((o, s) => s.OrgType == EOrgType.County)
  2894. .GroupBy((o, s) => new
  2895. {
  2896. o.OrgCode,
  2897. s.Name
  2898. })
  2899. .Select((o, s) => new OrgStatistics
  2900. {
  2901. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  2902. OrgName = s.Name
  2903. }).ToListAsync();
  2904. centerReportStatisticsDto.OrgStatisticsAreaAll = new OrgStatisticsAll
  2905. {
  2906. OrgStatistics = listOrgStatisticsAreaAll
  2907. };
  2908. #endregion
  2909. return centerReportStatisticsDto;
  2910. }
  2911. /// <summary>
  2912. /// 中心报表统计--泸州
  2913. /// </summary>
  2914. /// <param name="StartTime">开始时间</param>
  2915. /// <param name="EndTime">结束时间</param>
  2916. /// <param name="IdentityType">来电主体</param>
  2917. /// <returns></returns>
  2918. [HttpGet("center_report_forms_statistics_lz")]
  2919. public async Task<CenterReportStatisticsDto> LzCenterReportFormsStatistics(DateTime StartTime, DateTime EndTime, EIdentityType? IdentityType)
  2920. {
  2921. CenterReportStatisticsDto centerReportStatisticsDto = new();
  2922. //信件总量
  2923. int sourceChannelCount = await _orderRepository.Queryable().Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime).CountAsync();
  2924. #region 1、通话记录
  2925. //通话记录
  2926. var callData = await _callNativeRepository.Queryable()
  2927. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  2928. // .Where(p => p.Gateway != "82826886" && SqlFunc.Length(p.Gateway) != 4)
  2929. .Select(p => new CenterReportCallInfoDto
  2930. {
  2931. AllCallCount = SqlFunc.AggregateSum(1),//话务总量
  2932. InTotal = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In, 1, 0)),//呼入总量
  2933. InConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.AnsweredTime != null, 1, 0)),//呼入接通量
  2934. InHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.AnsweredTime == null, 1, 0)),//呼入未接通
  2935. QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.WaitDuration > 0 && p.RingDuration == 0 && p.AnsweredTime == null, 1, 0)), //队列挂断
  2936. IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.In && p.BeginIvrTime.HasValue && !p.BeginQueueTime.HasValue && !p.BeginRingTime.HasValue && p.AnsweredTime == null, 1, 0)), //IVR挂断
  2937. OutTotal = SqlFunc.AggregateSum(SqlFunc.IIF(p.Direction == ECallDirection.Out, 1, 0)),//呼出总量
  2938. OutConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(p.TelNo != "0" && p.Direction == ECallDirection.Out && p.AnsweredTime != null, 1, 0)),//呼出接通量
  2939. OutHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(p.TelNo != "0" && p.Direction == ECallDirection.Out && p.AnsweredTime == null, 1, 0)),//呼出未接通
  2940. })
  2941. .FirstAsync();
  2942. centerReportStatisticsDto.CenterReportCallInfoDto = callData;
  2943. #endregion
  2944. #region 2、信件回访量
  2945. //信件回访量
  2946. var centerReportVisitd = await _orderVisitRepository.Queryable()
  2947. .LeftJoin<Order>((x, o) => x.OrderId == o.Id)
  2948. .WhereIF(IdentityType.HasValue, (x, o) => o.IdentityType == IdentityType)
  2949. .Where((x, o) => x.VisitTime >= StartTime && x.VisitTime <= EndTime)
  2950. .Select((x, o) => new CenterReportVisitdDto
  2951. {
  2952. Visitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited, 1, 0)),//已回访
  2953. CallVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType == EVisitType.CallVisit, 1, 0)),// 已回访--电话
  2954. SmsVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType == EVisitType.SmsVisit, 1, 0)),//已回访--短信
  2955. OtherVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState == EVisitState.Visited && x.VisitType != EVisitType.CallVisit && x.VisitType != EVisitType.SmsVisit, 1, 0)),//其他回访
  2956. //WaitVisitd = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited, 1, 0)),//待回访
  2957. }).FirstAsync();
  2958. var waitVisitd = await _orderVisitRepository.Queryable()
  2959. .LeftJoin<Order>((x, o) => x.OrderId == o.Id)
  2960. .WhereIF(IdentityType.HasValue, (x, o) => o.IdentityType == IdentityType)
  2961. .Where((x, o) => x.CreationTime >= StartTime && x.CreationTime <= EndTime).Select((x, o) =>
  2962. SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited, 1, 0)) //待回访
  2963. ).FirstAsync();
  2964. centerReportVisitd.WaitVisitd = waitVisitd;
  2965. //部门
  2966. var listOrg = await _orderVisitDetailRepository.Queryable()
  2967. .LeftJoin<OrderVisit>((x, ov) => x.VisitId == ov.Id)
  2968. .LeftJoin<Order>((x, ov, o) => ov.OrderId == o.Id)
  2969. .WhereIF(IdentityType.HasValue, (x, ov, o) => o.IdentityType == IdentityType)
  2970. .Where((x, ov, o) => x.VisitTarget == EVisitTarget.Org && ov.VisitTime >= StartTime && ov.VisitTime <= EndTime && ov.VisitState == EVisitState.Visited)
  2971. .Select((x, ov, o) => new Satisfaction
  2972. {
  2973. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)),
  2974. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") != "1" && SqlFunc.JsonField(x.OrgProcessingResults, "Key") != "2", 1, 0)),
  2975. })
  2976. .FirstAsync();
  2977. //计算部门满意度
  2978. if (listOrg != null)
  2979. {
  2980. centerReportVisitd.Dissatisfied = listOrg.Dissatisfied;
  2981. centerReportVisitd.Satisfied = listOrg.Satisfied;
  2982. var satisfiedCount = listOrg.Satisfied + listOrg.Dissatisfied;
  2983. if (satisfiedCount > 0 && listOrg.Satisfied > 0)
  2984. centerReportVisitd.OrgRate = Math.Round((listOrg.Satisfied / (double)satisfiedCount) * 100, 2);
  2985. }
  2986. //坐席
  2987. var listSet = await _orderVisitDetailRepository.Queryable()
  2988. .LeftJoin<OrderVisit>((x, ov) => x.VisitId == ov.Id)
  2989. .LeftJoin<Order>((x, ov, o) => ov.OrderId == o.Id)
  2990. .WhereIF(IdentityType.HasValue, (x, ov, o) => o.IdentityType == IdentityType)
  2991. .Where((x, ov, o) => x.VisitTarget == EVisitTarget.Seat && ov.VisitTime >= StartTime && ov.VisitTime <= EndTime && ov.VisitState == EVisitState.Visited)
  2992. .Select((x, ov, o) => new Satisfaction
  2993. {
  2994. Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(x.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
  2995. Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(x.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
  2996. })
  2997. .FirstAsync();
  2998. //计算坐席满意度
  2999. if (listSet != null)
  3000. {
  3001. var satisfiedCount = listSet.Satisfied + listSet.Dissatisfied;
  3002. if (satisfiedCount > 0 && listSet.Satisfied > 0)
  3003. centerReportVisitd.SeatsRate = Math.Round((listSet.Satisfied / (double)satisfiedCount) * 100, 2);
  3004. }
  3005. centerReportStatisticsDto.CenterReportVisitd = centerReportVisitd;
  3006. #endregion
  3007. #region 3、工单
  3008. //工单
  3009. var orderData = await _orderRepository.Queryable()
  3010. .WhereIF(IdentityType.HasValue, p => p.IdentityType == IdentityType)
  3011. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  3012. .Select(x => new CenterReportOrderDto
  3013. {
  3014. EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),//有效
  3015. InvalidCount = 0,//无效
  3016. CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),//已办结
  3017. OnTimeCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ExpiredTime > x.ActualHandleTime, 1, 0)),//按时办结
  3018. CenterCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.FileUserOrgId == OrgSeedData.CenterId, 1, 0)),//中心办结
  3019. OrgCompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.FileUserOrgId != OrgSeedData.CenterId, 1, 0)),//部门办结
  3020. InProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed, 1, 0)),//在办
  3021. CenterInProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed && (x.ActualHandleOrgCode == OrgSeedData.CenterId || x.ActualHandleOrgCode == null), 1, 0)),//中心在办
  3022. OrgInProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed && x.ActualHandleOrgCode != OrgSeedData.CenterId && x.ActualHandleOrgCode != null, 1, 0))//部门在办
  3023. })
  3024. .FirstAsync();
  3025. //催办
  3026. var orderUrge = await _orderUrgeRepository.Queryable()
  3027. .LeftJoin<Order>((p, o) => p.OrderId == o.Id)
  3028. .Where((p, o) => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  3029. .WhereIF(IdentityType.HasValue, (p, o) => o.IdentityType == IdentityType).Select((p, o) => p.OrderId).Distinct().CountAsync();
  3030. orderData.orderUrge = orderUrge;
  3031. centerReportStatisticsDto.CenterReportOrder = orderData;
  3032. #endregion
  3033. #region 4、信件来源
  3034. //信件来源
  3035. var sourceChannelData = _orderRepository.Queryable()
  3036. .WhereIF(IdentityType.HasValue, p => p.IdentityType == IdentityType)
  3037. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  3038. .Select(it => new
  3039. {
  3040. SourceChannelCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.SourceChannelCode), "QT", it.SourceChannelCode)
  3041. })
  3042. .MergeTable()//将查询出来的结果合并成一个新表
  3043. .GroupBy(it => new { it.SourceChannelCode })//对新表进行分组
  3044. .Select(it => new CenterReportOrderSourceChannelDto
  3045. {
  3046. Code = it.SourceChannelCode,
  3047. CountNum = SqlFunc.AggregateCount(it.SourceChannelCode)
  3048. });
  3049. var sourceData = await _systemDicDataRepository.Queryable()
  3050. .LeftJoin(sourceChannelData, (s, p) => s.DicDataValue == p.Code)
  3051. .Where((s, p) => s.DicTypeCode == "SourceChannel" && s.IsShow == true)
  3052. .Select((s, p) => new CenterReportOrderSourceChannelDto
  3053. {
  3054. AllCountNum = sourceChannelCount,
  3055. Code = s.DicDataValue,
  3056. Name = s.DicDataName,
  3057. CountNum = p.CountNum
  3058. })
  3059. .ToListAsync();
  3060. centerReportStatisticsDto.CenterReportOrderSourceChannels = sourceData;
  3061. #endregion
  3062. #region 5、信件分类
  3063. //信件来源 AcceptType
  3064. var acceptTypeData = _orderRepository.Queryable(false, false, false)
  3065. .WhereIF(IdentityType.HasValue, p => p.IdentityType == IdentityType)
  3066. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  3067. .Select(it => new
  3068. {
  3069. AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode)
  3070. })
  3071. .MergeTable()//将查询出来的结果合并成一个新表
  3072. .GroupBy(it => new { it.AcceptTypeCode })//对新表进行分组
  3073. .Select(it => new CenterReportOrderSourceChannelDto
  3074. {
  3075. Code = it.AcceptTypeCode,
  3076. CountNum = SqlFunc.AggregateCount(it.AcceptTypeCode)
  3077. });
  3078. var acceptType = await _systemDicDataRepository.Queryable()
  3079. .LeftJoin(acceptTypeData, (s, p) => s.DicDataValue == p.Code)
  3080. .Where((s, p) => s.DicTypeCode == "AcceptType" && s.IsShow == true)
  3081. .Select((s, p) => new CenterReportOrderSourceChannelDto
  3082. {
  3083. AllCountNum = sourceChannelCount,
  3084. Code = s.DicDataValue,
  3085. Name = s.DicDataName,
  3086. CountNum = p.CountNum
  3087. })
  3088. .ToListAsync();
  3089. centerReportStatisticsDto.CenterReportOrderAcceptTypes = acceptType;
  3090. #endregion
  3091. #region 信件分布情况
  3092. //市直部门
  3093. var listOrgStatisticsCityAll = await _orderRepository.Queryable()
  3094. .WhereIF(IdentityType.HasValue, p => p.IdentityType == IdentityType)
  3095. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  3096. .Select(o => new
  3097. {
  3098. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  3099. })
  3100. .MergeTable()
  3101. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  3102. .Where((o, s) => s.OrgType == EOrgType.City || s.OrgType == EOrgType.Province)
  3103. .GroupBy((o, s) => new
  3104. {
  3105. o.OrgCode,
  3106. s.Name
  3107. })
  3108. .Select((o, s) => new OrgStatistics
  3109. {
  3110. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  3111. OrgName = s.Name
  3112. }).ToListAsync();
  3113. centerReportStatisticsDto.OrgStatisticsCityAll = new OrgStatisticsAll
  3114. {
  3115. OrgStatistics = listOrgStatisticsCityAll
  3116. };
  3117. //区县部门
  3118. var listOrgStatisticsAreaAll = await _orderRepository.Queryable()
  3119. .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  3120. .Select(o => new
  3121. {
  3122. OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  3123. })
  3124. .MergeTable()
  3125. .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
  3126. .Where((o, s) => s.OrgType == EOrgType.County)
  3127. .GroupBy((o, s) => new
  3128. {
  3129. o.OrgCode,
  3130. s.Name
  3131. })
  3132. .Select((o, s) => new OrgStatistics
  3133. {
  3134. CountNum = SqlFunc.AggregateCount(o.OrgCode),
  3135. OrgName = s.Name
  3136. }).ToListAsync();
  3137. centerReportStatisticsDto.OrgStatisticsAreaAll = new OrgStatisticsAll
  3138. {
  3139. OrgStatistics = listOrgStatisticsAreaAll
  3140. };
  3141. #endregion
  3142. return centerReportStatisticsDto;
  3143. }
  3144. /// <summary>
  3145. /// 部门受理类型统计周期
  3146. /// </summary>
  3147. /// <param name="dto"></param>
  3148. /// <returns></returns>
  3149. [HttpGet("department_acceptance_type_statistics")]
  3150. public async Task<object> DepartmentAcceptanceTypeStatistics([FromQuery] DepartmentKeyWordRequest dto)
  3151. {
  3152. var items = await _orderReportApplication.DepartmentAcceptanceTypeStatistics(dto).ToListAsync();
  3153. foreach (var item in items)
  3154. {
  3155. item.ZxAllTimes = Math.Round(((double)item.ZxAllTimes / 3600 / 8), 2);
  3156. item.JyAllTimes = Math.Round(((double)item.JyAllTimes / 3600 / 8), 2);
  3157. item.QzAllTimes = Math.Round(((double)item.QzAllTimes / 3600 / 8), 2);
  3158. item.ByAllTimes = Math.Round(((double)item.ByAllTimes / 3600 / 8), 2);
  3159. item.JbAllTimes = Math.Round(((double)item.JbAllTimes / 3600 / 8), 2);
  3160. item.TsAllTimes = Math.Round(((double)item.TsAllTimes / 3600 / 8), 2);
  3161. item.QtAllTimes = Math.Round(((double)item.QtAllTimes / 3600 / 8), 2);
  3162. item.YjAllTimes = Math.Round(((double)item.YjAllTimes / 3600 / 8), 2);
  3163. }
  3164. var total = new DepartmentAcceptanceTypeStatisticsDto
  3165. {
  3166. OrgName = "合计",
  3167. OrgCode = "",
  3168. OrgType = "",
  3169. ZxAllCount = items.Sum(p => p.ZxAllCount),
  3170. ZxAllTimes = Math.Round(items.Sum(p => p.ZxAllTimes).Value, 2),
  3171. ZxAcceptanceTypeCode = "10",
  3172. JyAllCount = items.Sum(p => p.JyAllCount),
  3173. JyAllTimes = Math.Round(items.Sum(p => p.JyAllTimes).Value, 2),
  3174. JyAcceptanceTypeCode = "15",
  3175. QzAllCount = items.Sum(p => p.QzAllCount),
  3176. QzAllTimes = Math.Round(items.Sum(p => p.QzAllTimes).Value, 2),
  3177. QzAcceptanceTypeCode = "20",
  3178. ByAllCount = items.Sum(p => p.ByAllCount),
  3179. ByAllTimes = Math.Round(items.Sum(p => p.ByAllTimes).Value, 2),
  3180. ByAcceptanceTypeCode = "25",
  3181. JbAllCount = items.Sum(p => p.JbAllCount),
  3182. JbAllTimes = Math.Round(items.Sum(p => p.JbAllTimes).Value, 2),
  3183. JbAcceptanceTypeCode = "30",
  3184. TsAllCount = items.Sum(p => p.TsAllCount),
  3185. TsAllTimes = Math.Round(items.Sum(p => p.TsAllTimes).Value, 2),
  3186. TsAcceptanceTypeCode = "35",
  3187. QtAllCount = items.Sum(p => p.QtAllCount),
  3188. QtAllTimes = Math.Round(items.Sum(p => p.QtAllTimes).Value, 2),
  3189. QtAcceptanceTypeCode = "40",
  3190. YjAllCount = items.Sum(p => p.YjAllCount),
  3191. YjAllTimes = Math.Round(items.Sum(p => p.YjAllTimes).Value, 2),
  3192. YjAcceptanceTypeCode = "1"
  3193. };
  3194. return new { List = items, Total = total };
  3195. }
  3196. /// <summary>
  3197. /// 部门受理类型统计周期---导出
  3198. /// </summary>
  3199. /// <param name="dto"></param>
  3200. /// <returns></returns>
  3201. [HttpPost("department_acceptance_type_statistics_export")]
  3202. [LogFilterAlpha("导出日志")]
  3203. public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeStatistics([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
  3204. {
  3205. var query = _orderReportApplication.DepartmentAcceptanceTypeStatistics(dto.QueryDto);
  3206. List<DepartmentAcceptanceTypeStatisticsDto> list;
  3207. if (dto.IsExportAll)
  3208. {
  3209. list = await query.ToListAsync(HttpContext.RequestAborted);
  3210. }
  3211. else
  3212. {
  3213. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3214. list = items;
  3215. }
  3216. foreach (var item in list)
  3217. {
  3218. item.ZxAllTimes = Math.Round(((double)item.ZxAllTimes / 3600 / 8), 2);
  3219. item.JyAllTimes = Math.Round(((double)item.JyAllTimes / 3600 / 8), 2);
  3220. item.QzAllTimes = Math.Round(((double)item.QzAllTimes / 3600 / 8), 2);
  3221. item.ByAllTimes = Math.Round(((double)item.ByAllTimes / 3600 / 8), 2);
  3222. item.JbAllTimes = Math.Round(((double)item.JbAllTimes / 3600 / 8), 2);
  3223. item.TsAllTimes = Math.Round(((double)item.TsAllTimes / 3600 / 8), 2);
  3224. item.QtAllTimes = Math.Round(((double)item.QtAllTimes / 3600 / 8), 2);
  3225. item.YjAllTimes = Math.Round(((double)item.YjAllTimes / 3600 / 8), 2);
  3226. }
  3227. //增加合计
  3228. list.Add(new DepartmentAcceptanceTypeStatisticsDto
  3229. {
  3230. OrgName = "合计",
  3231. OrgCode = "",
  3232. OrgType = "",
  3233. ZxAllCount = list.Sum(p => p.ZxAllCount),
  3234. ZxAllTimes = list.Sum(p => p.ZxAllTimes),
  3235. ZxAcceptanceTypeCode = "10",
  3236. JyAllCount = list.Sum(p => p.JyAllCount),
  3237. JyAllTimes = list.Sum(p => p.JyAllTimes),
  3238. JyAcceptanceTypeCode = "15",
  3239. QzAllCount = list.Sum(p => p.QzAllCount),
  3240. QzAllTimes = list.Sum(p => p.QzAllTimes),
  3241. QzAcceptanceTypeCode = "20",
  3242. ByAllCount = list.Sum(p => p.ByAllCount),
  3243. ByAllTimes = list.Sum(p => p.ByAllTimes),
  3244. ByAcceptanceTypeCode = "25",
  3245. JbAllCount = list.Sum(p => p.JbAllCount),
  3246. JbAllTimes = list.Sum(p => p.JbAllTimes),
  3247. JbAcceptanceTypeCode = "30",
  3248. TsAllCount = list.Sum(p => p.TsAllCount),
  3249. TsAllTimes = list.Sum(p => p.TsAllTimes),
  3250. TsAcceptanceTypeCode = "35",
  3251. QtAllCount = list.Sum(p => p.QtAllCount),
  3252. QtAllTimes = list.Sum(p => p.QtAllTimes),
  3253. QtAcceptanceTypeCode = "40",
  3254. YjAllCount = list.Sum(p => p.YjAllCount),
  3255. YjAllTimes = list.Sum(p => p.YjAllTimes),
  3256. YjAcceptanceTypeCode = "1"
  3257. });
  3258. var orderDtos = _mapper.Map<ICollection<DepartmentAcceptanceTypeStatisticsDto>>(list);
  3259. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<DepartmentAcceptanceTypeStatisticsDto>(dto.ColumnInfos);
  3260. var dtos = orderDtos
  3261. .Select(stu => _mapper.Map(stu, typeof(DepartmentAcceptanceTypeStatisticsDto), dynamicClass))
  3262. .Cast<object>()
  3263. .ToList();
  3264. var stream = ExcelHelper.CreateStream(dtos);
  3265. return ExcelStreamResult(stream, "部门受理类型统计周期数据");
  3266. }
  3267. /// <summary>
  3268. /// 部门受理类型统计周期--明细列表
  3269. /// </summary>
  3270. /// <param name="dto"></param>
  3271. /// <returns></returns>
  3272. [HttpGet("department_acceptance_type_order_list")]
  3273. public async Task<PagedDto<OrderDto>> DepartmentAcceptanceTypeOrderList([FromQuery] DepartmentKeyWordRequest dto)
  3274. {
  3275. var (total, items) = await _orderReportApplication.DepartmentAcceptanceTypeOrderList(dto)
  3276. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  3277. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  3278. }
  3279. /// <summary>
  3280. /// 部门受理类型统计周期--明细列表---导出
  3281. /// </summary>
  3282. /// <param name="dto"></param>
  3283. /// <returns></returns>
  3284. [HttpPost("department_acceptance_type_order_list_export")]
  3285. [LogFilterAlpha("导出日志")]
  3286. public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeOrderList([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
  3287. {
  3288. var query = _orderReportApplication.DepartmentAcceptanceTypeOrderList(dto.QueryDto);
  3289. List<Order> list;
  3290. if (dto.IsExportAll)
  3291. {
  3292. list = await query.ToListAsync(HttpContext.RequestAborted);
  3293. }
  3294. else
  3295. {
  3296. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3297. list = items;
  3298. }
  3299. var orderDtos = _mapper.Map<ICollection<OrderDto>>(list);
  3300. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  3301. var dtos = orderDtos
  3302. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3303. .Cast<object>()
  3304. .ToList();
  3305. var stream = ExcelHelper.CreateStream(dtos);
  3306. return ExcelStreamResult(stream, "部门受理类型统计周期数据");
  3307. }
  3308. /// <summary>
  3309. /// 部门受理类型统计(宜宾功能)
  3310. /// </summary>
  3311. /// <param name="dto"></param>
  3312. /// <returns></returns>
  3313. [HttpGet("department_acceptance_type_statistics_v1")]
  3314. public async Task<object> DepartmentAcceptanceTypeStatisticsV1([FromQuery] DepartmentKeyWordRequest dto)
  3315. {
  3316. var items = await _orderReportApplication.DepartmentAcceptanceTypeStatisticsV1(dto).ToListAsync();
  3317. var countySumModel = new DepartmentAcceptanceTypeStatisticsV1Dto()
  3318. {
  3319. OrgName = "区县合计",
  3320. OrgCode = "",
  3321. OrgTypeText = "",
  3322. ZxAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.ZxAllCount),
  3323. ZxAcceptanceTypeCode = "10",
  3324. JyAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.JyAllCount),
  3325. JyAcceptanceTypeCode = "15",
  3326. QzAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.QzAllCount),
  3327. QzAcceptanceTypeCode = "20",
  3328. ByAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.ByAllCount),
  3329. ByAcceptanceTypeCode = "25",
  3330. JbAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.JbAllCount),
  3331. JbAcceptanceTypeCode = "30",
  3332. TsAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.TsAllCount),
  3333. TsAcceptanceTypeCode = "35",
  3334. QtAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.QtAllCount),
  3335. QtAcceptanceTypeCode = "40",
  3336. YjAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.YjAllCount),
  3337. YjAcceptanceTypeCode = "1",
  3338. HmAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.HmAllCount),
  3339. HmAcceptanceTypeCode = "2",
  3340. DqAllCount = items.Where(x => x.OrgType == EOrgType.County).Sum(p => p.DqAllCount),
  3341. DqAcceptanceTypeCode = "3"
  3342. };
  3343. var citySumModel = new DepartmentAcceptanceTypeStatisticsV1Dto()
  3344. {
  3345. OrgName = "市直合计",
  3346. OrgCode = "",
  3347. OrgTypeText = "",
  3348. ZxAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.ZxAllCount),
  3349. ZxAcceptanceTypeCode = "10",
  3350. JyAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.JyAllCount),
  3351. JyAcceptanceTypeCode = "15",
  3352. QzAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.QzAllCount),
  3353. QzAcceptanceTypeCode = "20",
  3354. ByAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.ByAllCount),
  3355. ByAcceptanceTypeCode = "25",
  3356. JbAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.JbAllCount),
  3357. JbAcceptanceTypeCode = "30",
  3358. TsAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.TsAllCount),
  3359. TsAcceptanceTypeCode = "35",
  3360. QtAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.QtAllCount),
  3361. QtAcceptanceTypeCode = "40",
  3362. YjAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.YjAllCount),
  3363. YjAcceptanceTypeCode = "1",
  3364. HmAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.HmAllCount),
  3365. HmAcceptanceTypeCode = "2",
  3366. DqAllCount = items.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.DqAllCount),
  3367. DqAcceptanceTypeCode = "3"
  3368. };
  3369. var sumModel = new DepartmentAcceptanceTypeStatisticsV1Dto()
  3370. {
  3371. OrgName = "总计",
  3372. OrgCode = "",
  3373. OrgTypeText = "",
  3374. ZxAllCount = items.Sum(p => p.ZxAllCount),
  3375. ZxAcceptanceTypeCode = "10",
  3376. JyAllCount = items.Sum(p => p.JyAllCount),
  3377. JyAcceptanceTypeCode = "15",
  3378. QzAllCount = items.Sum(p => p.QzAllCount),
  3379. QzAcceptanceTypeCode = "20",
  3380. ByAllCount = items.Sum(p => p.ByAllCount),
  3381. ByAcceptanceTypeCode = "25",
  3382. JbAllCount = items.Sum(p => p.JbAllCount),
  3383. JbAcceptanceTypeCode = "30",
  3384. TsAllCount = items.Sum(p => p.TsAllCount),
  3385. TsAcceptanceTypeCode = "35",
  3386. QtAllCount = items.Sum(p => p.QtAllCount),
  3387. QtAcceptanceTypeCode = "40",
  3388. YjAllCount = items.Sum(p => p.YjAllCount),
  3389. YjAcceptanceTypeCode = "1",
  3390. HmAllCount = items.Sum(p => p.HmAllCount),
  3391. HmAcceptanceTypeCode = "2",
  3392. DqAllCount = items.Sum(p => p.DqAllCount),
  3393. DqAcceptanceTypeCode = "3"
  3394. };
  3395. return new { DataList = items, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
  3396. }
  3397. /// <summary>
  3398. /// 部门受理类型统计(宜宾功能)---导出
  3399. /// </summary>
  3400. /// <param name="dto"></param>
  3401. /// <returns></returns>
  3402. [HttpPost("department_acceptance_type_statistics_export_v1")]
  3403. [LogFilterAlpha("导出日志")]
  3404. public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeStatisticsV1([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
  3405. {
  3406. var query = _orderReportApplication.DepartmentAcceptanceTypeStatisticsV1(dto.QueryDto);
  3407. List<DepartmentAcceptanceTypeStatisticsV1Dto> list;
  3408. if (dto.IsExportAll)
  3409. {
  3410. list = await query.ToListAsync(HttpContext.RequestAborted);
  3411. }
  3412. else
  3413. {
  3414. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3415. list = items;
  3416. }
  3417. list.Add(new DepartmentAcceptanceTypeStatisticsV1Dto
  3418. {
  3419. OrgName = "区县合计",
  3420. OrgCode = "",
  3421. OrgTypeText = "",
  3422. ZxAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.ZxAllCount),
  3423. ZxAcceptanceTypeCode = "10",
  3424. JyAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.JyAllCount),
  3425. JyAcceptanceTypeCode = "15",
  3426. QzAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.QzAllCount),
  3427. QzAcceptanceTypeCode = "20",
  3428. ByAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.ByAllCount),
  3429. ByAcceptanceTypeCode = "25",
  3430. JbAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.JbAllCount),
  3431. JbAcceptanceTypeCode = "30",
  3432. TsAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.TsAllCount),
  3433. TsAcceptanceTypeCode = "35",
  3434. QtAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.QtAllCount),
  3435. QtAcceptanceTypeCode = "40",
  3436. YjAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.YjAllCount),
  3437. YjAcceptanceTypeCode = "1",
  3438. HmAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.HmAllCount),
  3439. HmAcceptanceTypeCode = "2",
  3440. DqAllCount = list.Where(x => x.OrgType == EOrgType.County).Sum(p => p.DqAllCount),
  3441. DqAcceptanceTypeCode = "3"
  3442. });
  3443. list.Add(new DepartmentAcceptanceTypeStatisticsV1Dto
  3444. {
  3445. OrgName = "市直合计",
  3446. OrgCode = "",
  3447. OrgTypeText = "",
  3448. ZxAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.ZxAllCount),
  3449. ZxAcceptanceTypeCode = "10",
  3450. JyAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.JyAllCount),
  3451. JyAcceptanceTypeCode = "15",
  3452. QzAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.QzAllCount),
  3453. QzAcceptanceTypeCode = "20",
  3454. ByAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.ByAllCount),
  3455. ByAcceptanceTypeCode = "25",
  3456. JbAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.JbAllCount),
  3457. JbAcceptanceTypeCode = "30",
  3458. TsAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.TsAllCount),
  3459. TsAcceptanceTypeCode = "35",
  3460. QtAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.QtAllCount),
  3461. QtAcceptanceTypeCode = "40",
  3462. YjAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.YjAllCount),
  3463. YjAcceptanceTypeCode = "1",
  3464. HmAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.HmAllCount),
  3465. HmAcceptanceTypeCode = "2",
  3466. DqAllCount = list.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(p => p.DqAllCount),
  3467. DqAcceptanceTypeCode = "3"
  3468. });
  3469. list.Add(new DepartmentAcceptanceTypeStatisticsV1Dto
  3470. {
  3471. OrgName = "总计",
  3472. OrgCode = "",
  3473. OrgTypeText = "",
  3474. ZxAllCount = list.Sum(p => p.ZxAllCount),
  3475. ZxAcceptanceTypeCode = "10",
  3476. JyAllCount = list.Sum(p => p.JyAllCount),
  3477. JyAcceptanceTypeCode = "15",
  3478. QzAllCount = list.Sum(p => p.QzAllCount),
  3479. QzAcceptanceTypeCode = "20",
  3480. ByAllCount = list.Sum(p => p.ByAllCount),
  3481. ByAcceptanceTypeCode = "25",
  3482. JbAllCount = list.Sum(p => p.JbAllCount),
  3483. JbAcceptanceTypeCode = "30",
  3484. TsAllCount = list.Sum(p => p.TsAllCount),
  3485. TsAcceptanceTypeCode = "35",
  3486. QtAllCount = list.Sum(p => p.QtAllCount),
  3487. QtAcceptanceTypeCode = "40",
  3488. YjAllCount = list.Sum(p => p.YjAllCount),
  3489. YjAcceptanceTypeCode = "1",
  3490. HmAllCount = list.Sum(p => p.HmAllCount),
  3491. HmAcceptanceTypeCode = "2",
  3492. DqAllCount = list.Sum(p => p.DqAllCount),
  3493. DqAcceptanceTypeCode = "3"
  3494. });
  3495. var orderDtos = _mapper.Map<ICollection<DepartmentAcceptanceTypeStatisticsV1Dto>>(list);
  3496. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<DepartmentAcceptanceTypeStatisticsV1Dto>(dto.ColumnInfos);
  3497. var dtos = orderDtos
  3498. .Select(stu => _mapper.Map(stu, typeof(DepartmentAcceptanceTypeStatisticsV1Dto), dynamicClass))
  3499. .Cast<object>()
  3500. .ToList();
  3501. var stream = ExcelHelper.CreateStream(dtos);
  3502. return ExcelStreamResult(stream, "部门受理类型统计数据");
  3503. }
  3504. /// <summary>
  3505. /// 部门受理类型统计(宜宾功能)--明细列表
  3506. /// </summary>
  3507. /// <param name="dto"></param>
  3508. /// <returns></returns>
  3509. [HttpGet("department_acceptance_type_order_list_v1")]
  3510. public async Task<PagedDto<OrderDto>> DepartmentAcceptanceTypeOrderListV1([FromQuery] DepartmentKeyWordRequest dto)
  3511. {
  3512. var (total, items) = await _orderReportApplication.DepartmentAcceptanceTypeOrderListV1(dto)
  3513. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  3514. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  3515. }
  3516. /// <summary>
  3517. /// 部门受理类型统计(宜宾功能)--明细列表---导出
  3518. /// </summary>
  3519. /// <param name="dto"></param>
  3520. /// <returns></returns>
  3521. [HttpPost("department_acceptance_type_order_list_export_v1")]
  3522. [LogFilterAlpha("导出日志")]
  3523. public async Task<FileStreamResult> ExportDepartmentAcceptanceTypeOrderListV1([FromBody] ExportExcelDto<DepartmentKeyWordRequest> dto)
  3524. {
  3525. var query = _orderReportApplication.DepartmentAcceptanceTypeOrderListV1(dto.QueryDto);
  3526. List<Order> list;
  3527. if (dto.IsExportAll)
  3528. {
  3529. list = await query.ToListAsync(HttpContext.RequestAborted);
  3530. }
  3531. else
  3532. {
  3533. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  3534. list = items;
  3535. }
  3536. var orderDtos = _mapper.Map<ICollection<OrderDto>>(list);
  3537. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  3538. var dtos = orderDtos
  3539. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3540. .Cast<object>()
  3541. .ToList();
  3542. var stream = ExcelHelper.CreateStream(dtos);
  3543. return ExcelStreamResult(stream, "部门受理类型统计数据");
  3544. }
  3545. /// <summary>
  3546. /// 部门办件统计表
  3547. /// </summary>
  3548. /// <param name="dto"></param>
  3549. /// <returns></returns>
  3550. [HttpGet("departmental_processing_statistics")]
  3551. public async Task<object> DepartmentalProcessingStatistics([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  3552. {
  3553. //联合查询
  3554. //var items = await _orderReportApplication.DepartmentalProcessingStatistics(dto)
  3555. // .ToListAsync();
  3556. var items = new List<DepartmentalProcessingStatisticsDataDto>();
  3557. if (_appOptions.Value.IsLuZhou == true)
  3558. items = await _orderReportApplication.LZDepartmentalProcessingStatisticsNew(dto);
  3559. else
  3560. items = await _orderReportApplication.DepartmentalProcessingStatisticsNew(dto);
  3561. var total = new DepartmentalProcessingStatisticsDataDto
  3562. {
  3563. OrgCode = "",
  3564. OrgName = "合计",
  3565. OrgType = EOrgType.City,
  3566. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  3567. YbOrderCountNum = items.Sum(p => p.YbOrderCountNum),
  3568. ZbOrderCountNum = items.Sum(p => p.ZbOrderCountNum),
  3569. Archived = items.Sum(p => p.Archived),
  3570. ToBeArchived = items.Sum(p => p.ToBeArchived),
  3571. WaitPublished = items.Sum(p => p.WaitPublished),
  3572. PublishedOpen = items.Sum(p => p.PublishedOpen),
  3573. PublishedNoOpen = items.Sum(p => p.PublishedNoOpen),
  3574. YbOverdue = items.Sum(p => p.YbOverdue),
  3575. ZbOverdue = items.Sum(p => p.ZbOverdue),
  3576. CompleteOnTime = items.Sum(p => p.CompleteOnTime),
  3577. HqybOverdue = items.Sum(p => p.HqybOverdue),
  3578. HqzbOverdue = items.Sum(p => p.HqzbOverdue),
  3579. DelayEnd = items.Sum(p => p.DelayEnd),
  3580. DelayWait = items.Sum(p => p.DelayWait),
  3581. OrderDelayCount = items.Sum(p => p.OrderDelayCount),
  3582. ScreenCount = items.Sum(p => p.ScreenCount),
  3583. ScreenApproval = items.Sum(p => p.ScreenApproval),
  3584. ScreenPass = items.Sum(p => p.ScreenPass),
  3585. ScreenNotPass = items.Sum(p => p.ScreenNotPass),
  3586. SatisfactionCount = items.Sum(p => p.SatisfactionCount),
  3587. NotSatisfactionCount = items.Sum(p => p.NotSatisfactionCount)
  3588. };
  3589. return new { List = items, Total = total };
  3590. }
  3591. /// <summary>
  3592. /// 部门办件统计表--导出
  3593. /// </summary>
  3594. /// <param name="dto"></param>
  3595. /// <returns></returns>
  3596. [HttpPost("departmental_processing_statistics_export")]
  3597. [LogFilterAlpha("导出日志")]
  3598. public async Task<FileStreamResult> ExportDepartmentalProcessingStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  3599. {
  3600. var list = new List<DepartmentalProcessingStatisticsDataDto>();
  3601. if (_appOptions.Value.IsLuZhou == true)
  3602. list = await _orderReportApplication.LZDepartmentalProcessingStatisticsNew(dto.QueryDto);
  3603. else
  3604. list = await _orderReportApplication.DepartmentalProcessingStatisticsNew(dto.QueryDto);
  3605. //增加合计
  3606. list.Add(new DepartmentalProcessingStatisticsDataDto
  3607. {
  3608. OrgCode = "",
  3609. OrgName = "合计",
  3610. OrgType = EOrgType.City,
  3611. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  3612. YbOrderCountNum = list.Sum(p => p.YbOrderCountNum),
  3613. ZbOrderCountNum = list.Sum(p => p.ZbOrderCountNum),
  3614. Archived = list.Sum(p => p.Archived),
  3615. ToBeArchived = list.Sum(p => p.ToBeArchived),
  3616. WaitPublished = list.Sum(p => p.WaitPublished),
  3617. PublishedOpen = list.Sum(p => p.PublishedOpen),
  3618. PublishedNoOpen = list.Sum(p => p.PublishedNoOpen),
  3619. YbOverdue = list.Sum(p => p.YbOverdue),
  3620. ZbOverdue = list.Sum(p => p.ZbOverdue),
  3621. CompleteOnTime = list.Sum(p => p.CompleteOnTime),
  3622. HqybOverdue = list.Sum(p => p.HqybOverdue),
  3623. HqzbOverdue = list.Sum(p => p.HqzbOverdue),
  3624. DelayEnd = list.Sum(p => p.DelayEnd),
  3625. DelayWait = list.Sum(p => p.DelayWait),
  3626. OrderDelayCount = list.Sum(p => p.OrderDelayCount),
  3627. ScreenCount = list.Sum(p => p.ScreenCount),
  3628. ScreenApproval = list.Sum(p => p.ScreenApproval),
  3629. ScreenPass = list.Sum(p => p.ScreenPass),
  3630. ScreenNotPass = list.Sum(p => p.ScreenNotPass),
  3631. SatisfactionCount = list.Sum(p => p.SatisfactionCount),
  3632. NotSatisfactionCount = list.Sum(p => p.NotSatisfactionCount)
  3633. });
  3634. var orderDtos = _mapper.Map<ICollection<DepartmentalProcessingStatisticsDataDto>>(list);
  3635. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<DepartmentalProcessingStatisticsDataDto>(dto.ColumnInfos);
  3636. var dtos = orderDtos
  3637. .Select(stu => _mapper.Map(stu, typeof(DepartmentalProcessingStatisticsDataDto), dynamicClass))
  3638. .Cast<object>()
  3639. .ToList();
  3640. var stream = ExcelHelper.CreateStream(dtos);
  3641. return ExcelStreamResult(stream, "部门办件统计表数据");
  3642. }
  3643. /// <summary>
  3644. /// 部门办件统计表--子级
  3645. /// </summary>
  3646. /// <param name="dto"></param>
  3647. /// <returns></returns>
  3648. [HttpGet("departmental_processing_child_statistics")]
  3649. public async Task<object> DepartmentalProcessingChildStatistics([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  3650. {
  3651. var items = new List<DepartmentalProcessingStatisticsDataDto>();
  3652. if (_appOptions.Value.IsLuZhou == true)
  3653. items = await _orderReportApplication.LZDepartmentalProcessingChildStatisticsNew(dto);
  3654. else
  3655. items = await _orderReportApplication.DepartmentalProcessingChildStatisticsNew(dto);
  3656. //计算合计
  3657. var total = new DepartmentalProcessingStatisticsDataDto
  3658. {
  3659. OrgCode = "",
  3660. OrgName = "合计",
  3661. OrgType = EOrgType.City,
  3662. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  3663. YbOrderCountNum = items.Sum(p => p.YbOrderCountNum),
  3664. ZbOrderCountNum = items.Sum(p => p.ZbOrderCountNum),
  3665. Archived = items.Sum(p => p.Archived),
  3666. ToBeArchived = items.Sum(p => p.ToBeArchived),
  3667. WaitPublished = items.Sum(p => p.WaitPublished),
  3668. PublishedOpen = items.Sum(p => p.PublishedOpen),
  3669. PublishedNoOpen = items.Sum(p => p.PublishedNoOpen),
  3670. YbOverdue = items.Sum(p => p.YbOverdue),
  3671. ZbOverdue = items.Sum(p => p.ZbOverdue),
  3672. CompleteOnTime = items.Sum(p => p.CompleteOnTime),
  3673. HqybOverdue = items.Sum(p => p.HqybOverdue),
  3674. HqzbOverdue = items.Sum(p => p.HqzbOverdue),
  3675. DelayEnd = items.Sum(p => p.DelayEnd),
  3676. DelayWait = items.Sum(p => p.DelayWait),
  3677. OrderDelayCount = items.Sum(p => p.OrderDelayCount),
  3678. ScreenCount = items.Sum(p => p.ScreenCount),
  3679. ScreenApproval = items.Sum(p => p.ScreenApproval),
  3680. ScreenPass = items.Sum(p => p.ScreenPass),
  3681. ScreenNotPass = items.Sum(p => p.ScreenNotPass),
  3682. SatisfactionCount = items.Sum(p => p.SatisfactionCount),
  3683. NotSatisfactionCount = items.Sum(p => p.NotSatisfactionCount)
  3684. };
  3685. return new { List = items, Total = total };
  3686. }
  3687. /// <summary>
  3688. /// 部门办件统计表--子级--导出
  3689. /// </summary>
  3690. /// <param name="dto"></param>
  3691. /// <returns></returns>
  3692. [HttpPost("departmental_processing_child_statistics_export")]
  3693. [LogFilterAlpha("导出日志")]
  3694. public async Task<FileStreamResult> ExportDepartmentalProcessingChildStatistics([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  3695. {
  3696. var list = new List<DepartmentalProcessingStatisticsDataDto>();
  3697. if (_appOptions.Value.IsLuZhou == true)
  3698. list = await _orderReportApplication.LZDepartmentalProcessingChildStatisticsNew(dto.QueryDto);
  3699. else
  3700. list = await _orderReportApplication.DepartmentalProcessingChildStatisticsNew(dto.QueryDto);
  3701. //增加合计
  3702. list.Add(new DepartmentalProcessingStatisticsDataDto
  3703. {
  3704. OrgCode = "",
  3705. OrgName = "合计",
  3706. OrgType = EOrgType.City,
  3707. // OrderCountNum = items.Sum(p => p.OrderCountNum),
  3708. YbOrderCountNum = list.Sum(p => p.YbOrderCountNum),
  3709. ZbOrderCountNum = list.Sum(p => p.ZbOrderCountNum),
  3710. Archived = list.Sum(p => p.Archived),
  3711. ToBeArchived = list.Sum(p => p.ToBeArchived),
  3712. WaitPublished = list.Sum(p => p.WaitPublished),
  3713. PublishedOpen = list.Sum(p => p.PublishedOpen),
  3714. PublishedNoOpen = list.Sum(p => p.PublishedNoOpen),
  3715. YbOverdue = list.Sum(p => p.YbOverdue),
  3716. ZbOverdue = list.Sum(p => p.ZbOverdue),
  3717. CompleteOnTime = list.Sum(p => p.CompleteOnTime),
  3718. HqybOverdue = list.Sum(p => p.HqybOverdue),
  3719. HqzbOverdue = list.Sum(p => p.HqzbOverdue),
  3720. DelayEnd = list.Sum(p => p.DelayEnd),
  3721. DelayWait = list.Sum(p => p.DelayWait),
  3722. OrderDelayCount = list.Sum(p => p.OrderDelayCount),
  3723. ScreenCount = list.Sum(p => p.ScreenCount),
  3724. ScreenApproval = list.Sum(p => p.ScreenApproval),
  3725. ScreenPass = list.Sum(p => p.ScreenPass),
  3726. ScreenNotPass = list.Sum(p => p.ScreenNotPass),
  3727. SatisfactionCount = list.Sum(p => p.SatisfactionCount),
  3728. NotSatisfactionCount = list.Sum(p => p.NotSatisfactionCount)
  3729. });
  3730. var orderDtos = _mapper.Map<ICollection<DepartmentalProcessingStatisticsDataDto>>(list);
  3731. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<DepartmentalProcessingStatisticsDataDto>(dto.ColumnInfos);
  3732. var dtos = orderDtos
  3733. .Select(stu => _mapper.Map(stu, typeof(DepartmentalProcessingStatisticsDataDto), dynamicClass))
  3734. .Cast<object>()
  3735. .ToList();
  3736. var stream = ExcelHelper.CreateStream(dtos);
  3737. return ExcelStreamResult(stream, "部门办件统计表数据");
  3738. }
  3739. /// <summary>
  3740. /// 部门办件统计表--明细
  3741. /// </summary>
  3742. /// <param name="dto"></param>
  3743. /// <returns></returns>
  3744. [HttpGet("departmental_processing_statistics_list")]
  3745. public async Task<PagedDto<OrderDto>> GetDepartmentalProcessingStatisticsList([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  3746. {
  3747. RefAsync<int> total = 0;
  3748. ISugarQueryable<SelectOrderId> query;
  3749. if (_appOptions.Value.IsLuZhou == true)
  3750. query = _orderReportApplication.LZGetDepartmentalProcessingStatisticsListNew(dto, HttpContext.RequestAborted);
  3751. else
  3752. query = _orderReportApplication.GetDepartmentalProcessingStatisticsListNew(dto, HttpContext.RequestAborted);
  3753. var queryData = await query
  3754. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  3755. .OrderByIF(string.IsNullOrEmpty(dto.SortField), (x, o) => o.CreationTime, OrderByType.Desc)
  3756. .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, (x, o) => o.StartTime, OrderByType.Asc) //受理时间升序
  3757. .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
  3758. .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, (x, o) => o.ExpiredTime, OrderByType.Asc) //工单期满时间升序
  3759. .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
  3760. .OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, (x, o) => o.FiledTime, OrderByType.Asc)// 办结时间升序
  3761. .OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, (x, o) => o.FiledTime, OrderByType.Desc) //办结时间降序
  3762. .Select((x, o) => new { o })
  3763. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  3764. var dtos = queryData.Select(d =>
  3765. {
  3766. var dto = _mapper.Map<OrderDto>(d.o);
  3767. return dto;
  3768. }).ToList();
  3769. return new PagedDto<OrderDto>(total, dtos);
  3770. }
  3771. /// <summary>
  3772. /// 部门办件统计表--明细--导出
  3773. /// </summary>
  3774. /// <param name="dto"></param>
  3775. /// <returns></returns>
  3776. [HttpPost("departmental_processing_statistics_list_export")]
  3777. [LogFilterAlpha("导出日志")]
  3778. public async Task<FileStreamResult> ExportGetDepartmentalProcessingStatisticsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  3779. {
  3780. ISugarQueryable<SelectOrderId> queryDa;
  3781. if (_appOptions.Value.IsLuZhou == true)
  3782. queryDa = _orderReportApplication.LZGetDepartmentalProcessingStatisticsListNew(dto.QueryDto, HttpContext.RequestAborted);
  3783. else
  3784. queryDa = _orderReportApplication.GetDepartmentalProcessingStatisticsListNew(dto.QueryDto, HttpContext.RequestAborted);
  3785. var query = queryDa
  3786. .LeftJoin<Order>((x, o) => x.Id == o.Id)
  3787. .OrderByIF(string.IsNullOrEmpty(dto.QueryDto.SortField), (x, o) => o.CreationTime, OrderByType.Desc)
  3788. .OrderByIF(dto.QueryDto is { SortField: "startTime", SortRule: 0 }, (x, o) => o.StartTime, OrderByType.Asc) //受理时间升序
  3789. .OrderByIF(dto.QueryDto is { SortField: "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
  3790. .OrderByIF(dto.QueryDto is { SortField: "expiredTime", SortRule: 0 }, (x, o) => o.ExpiredTime, OrderByType.Asc) //工单期满时间升序
  3791. .OrderByIF(dto.QueryDto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
  3792. .OrderByIF(dto.QueryDto is { SortField: "filedTime", SortRule: 0 }, (x, o) => o.FiledTime, OrderByType.Asc)// 办结时间升序
  3793. .OrderByIF(dto.QueryDto is { SortField: "filedTime", SortRule: 1 }, (x, o) => o.FiledTime, OrderByType.Desc) //办结时间降序
  3794. .Select((x, o) => new { o });
  3795. List<OrderDto> list = new List<OrderDto>();
  3796. if (dto.IsExportAll)
  3797. {
  3798. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  3799. list = listData.Select(d =>
  3800. {
  3801. var dto = _mapper.Map<OrderDto>(d.o);
  3802. return dto;
  3803. }).ToList();
  3804. }
  3805. else
  3806. {
  3807. RefAsync<int> total = 0;
  3808. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  3809. list = listData.Select(d =>
  3810. {
  3811. var dto = _mapper.Map<OrderDto>(d.o);
  3812. return dto;
  3813. }).ToList();
  3814. }
  3815. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  3816. var dtos = list
  3817. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3818. .Cast<object>()
  3819. .ToList();
  3820. var stream = ExcelHelper.CreateStream(dtos);
  3821. return ExcelStreamResult(stream, "部门办件统计明细数据");
  3822. }
  3823. /// <summary>
  3824. /// 部门办件统计明细表
  3825. /// </summary>
  3826. /// <param name="dto"></param>
  3827. /// <returns></returns>
  3828. [HttpGet("departmental_processing_statistics_details_list")]
  3829. public async Task<PagedDto<OrderDto>> DepartmentalProcessingStatisticsDetailsList([FromQuery] DepartmentalProcessingStatisticsRequest dto)
  3830. {
  3831. RefAsync<int> total = 0;
  3832. ISugarQueryable<SelectOrderId> query;
  3833. if (_appOptions.Value.IsLuZhou == true)
  3834. query = _orderReportApplication.LZDepartmentalProcessingStatisticsDetailsList(dto);
  3835. else
  3836. query = _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto);
  3837. var queryData = await query.LeftJoin<Order>((x, o) => x.Id == o.Id)
  3838. .OrderByIF(string.IsNullOrEmpty(dto.SortField), (x, o) => o.CreationTime, OrderByType.Desc)
  3839. .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, (x, o) => o.StartTime, OrderByType.Asc) //受理时间升序
  3840. .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
  3841. .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, (x, o) => o.ExpiredTime, OrderByType.Asc) //工单期满时间升序
  3842. .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
  3843. .OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, (x, o) => o.FiledTime, OrderByType.Asc)// 办结时间升序
  3844. .OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, (x, o) => o.FiledTime, OrderByType.Desc) //办结时间降序
  3845. .Select((x, o) => new { o })
  3846. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  3847. var dtos = queryData.Select(d =>
  3848. {
  3849. var dto = _mapper.Map<OrderDto>(d.o);
  3850. return dto;
  3851. }).ToList();
  3852. return new PagedDto<OrderDto>(total, dtos);
  3853. }
  3854. /// <summary>
  3855. /// 部门办件统计明细表--导出
  3856. /// </summary>
  3857. /// <param name="dto"></param>
  3858. /// <returns></returns>
  3859. [HttpPost("departmental_processing_statistics_details_list_export")]
  3860. [LogFilterAlpha("导出日志")]
  3861. public async Task<FileStreamResult> ExportDepartmentalProcessingStatisticsDetailsList([FromBody] ExportExcelDto<DepartmentalProcessingStatisticsRequest> dto)
  3862. {
  3863. ISugarQueryable<SelectOrderId> queryDa;
  3864. if (_appOptions.Value.IsLuZhou == true)
  3865. queryDa = _orderReportApplication.LZDepartmentalProcessingStatisticsDetailsList(dto.QueryDto);
  3866. else
  3867. queryDa = _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto.QueryDto);
  3868. var query = queryDa.LeftJoin<Order>((x, o) => x.Id == o.Id)
  3869. .OrderByIF(string.IsNullOrEmpty(dto.QueryDto.SortField), (x, o) => o.CreationTime, OrderByType.Desc)
  3870. .OrderByIF(dto.QueryDto is { SortField: "startTime", SortRule: 0 }, (x, o) => o.StartTime, OrderByType.Asc) //受理时间升序
  3871. .OrderByIF(dto.QueryDto is { SortField: "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
  3872. .OrderByIF(dto.QueryDto is { SortField: "expiredTime", SortRule: 0 }, (x, o) => o.ExpiredTime, OrderByType.Asc) //工单期满时间升序
  3873. .OrderByIF(dto.QueryDto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
  3874. .OrderByIF(dto.QueryDto is { SortField: "filedTime", SortRule: 0 }, (x, o) => o.FiledTime, OrderByType.Asc)// 办结时间升序
  3875. .OrderByIF(dto.QueryDto is { SortField: "filedTime", SortRule: 1 }, (x, o) => o.FiledTime, OrderByType.Desc) //办结时间降序
  3876. .Select((x, o) => new { o });
  3877. var list = new List<OrderDto>();
  3878. if (dto.IsExportAll)
  3879. {
  3880. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  3881. list = listData.Select(d =>
  3882. {
  3883. var dto = _mapper.Map<OrderDto>(d.o);
  3884. return dto;
  3885. }).ToList();
  3886. }
  3887. else
  3888. {
  3889. RefAsync<int> total = 0;
  3890. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  3891. list = listData.Select(d =>
  3892. {
  3893. var dto = _mapper.Map<OrderDto>(d.o);
  3894. return dto;
  3895. }).ToList();
  3896. }
  3897. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  3898. var dtos = list
  3899. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  3900. .Cast<object>()
  3901. .ToList();
  3902. var stream = ExcelHelper.CreateStream(dtos);
  3903. return ExcelStreamResult(stream, "部门办件统计明细表数据");
  3904. }
  3905. /// <summary>
  3906. /// 高频来电统计
  3907. /// </summary>
  3908. /// <param name="dto"></param>
  3909. /// <returns></returns>
  3910. [HttpGet("high_frequency_call_statistics")]
  3911. public async Task<PagedDto<HighFrequencyCallStatisticsDto>> HighFrequencyCallStatistics([FromQuery] HighFrequencyCallStatisticsRequest dto)
  3912. {
  3913. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  3914. throw UserFriendlyException.SameMessage("请选择时间!");
  3915. int CallCount = 2;
  3916. var HighFrequencyCallStatistics = _systemSettingCacheManager.GetSetting(SettingConstants.HighFrequencyCallStatistics)?.SettingValue[0];
  3917. if (HighFrequencyCallStatistics != null)
  3918. CallCount = int.Parse(HighFrequencyCallStatistics);
  3919. var (total, items) = await _trCallRecordRepository.Queryable()
  3920. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  3921. .Where((p, o) => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime)
  3922. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  3923. .Where((p, o) => p.ExternalId != null && o.Id != null)
  3924. .Where((p, o) => p.CallDirection == ECallDirection.In)
  3925. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNum), (p, o) => p.CPN == dto.PhoneNum)
  3926. .Select((p, o) => new
  3927. {
  3928. p.CPN,
  3929. p.ExternalId
  3930. })
  3931. .MergeTable()
  3932. .GroupBy(p => p.CPN)
  3933. .Select(p => new HighFrequencyCallStatisticsDto
  3934. {
  3935. Callnum = p.CPN,
  3936. OrderCountNum = SqlFunc.AggregateCount(p.CPN),//总量
  3937. })
  3938. .MergeTable()
  3939. .Where(p => p.OrderCountNum >= CallCount)
  3940. .OrderByDescending(p => p.OrderCountNum)
  3941. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  3942. return new PagedDto<HighFrequencyCallStatisticsDto>(total, _mapper.Map<IReadOnlyList<HighFrequencyCallStatisticsDto>>(items));
  3943. }
  3944. /// <summary>
  3945. /// 高频来电统计导出
  3946. /// </summary>
  3947. /// <param name="dto"></param>
  3948. /// <returns></returns>
  3949. [HttpPost("high_frequency_call_statistics/export")]
  3950. [LogFilterAlpha("导出日志")]
  3951. public async Task<FileStreamResult> HighFrequencyCallStatisticsExport([FromBody] ExportExcelDto<HighFrequencyCallStatisticsRequest> dto)
  3952. {
  3953. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue)
  3954. throw UserFriendlyException.SameMessage("请选择时间!");
  3955. int CallCount = 2;
  3956. var HighFrequencyCallStatistics = _systemSettingCacheManager.GetSetting(SettingConstants.HighFrequencyCallStatistics)?.SettingValue[0];
  3957. if (HighFrequencyCallStatistics != null)
  3958. CallCount = int.Parse(HighFrequencyCallStatistics);
  3959. var query = _trCallRecordRepository.Queryable()
  3960. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  3961. .Where((p, o) => p.OverTime >= dto.QueryDto.StartTime && p.OverTime <= dto.QueryDto.EndTime)
  3962. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  3963. .Where((p, o) => p.ExternalId != null && o.Id != null)
  3964. .Where((p, o) => p.CallDirection == ECallDirection.In)
  3965. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.PhoneNum), (p, o) => p.CPN == dto.QueryDto.PhoneNum)
  3966. .Select((p, o) => new
  3967. {
  3968. p.CPN,
  3969. p.ExternalId
  3970. })
  3971. .MergeTable()
  3972. .GroupBy(p => p.CPN)
  3973. .Select(p => new HighFrequencyCallStatisticsDto
  3974. {
  3975. Callnum = p.CPN,
  3976. OrderCountNum = SqlFunc.AggregateCount(p.CPN),//总量
  3977. })
  3978. .MergeTable()
  3979. .Where(p => p.OrderCountNum >= CallCount)
  3980. .OrderByDescending(p => p.OrderCountNum);
  3981. var total = 0;
  3982. var items = new List<HighFrequencyCallStatisticsDto>();
  3983. if (dto.IsExportAll)
  3984. {
  3985. items = await query.ToListAsync(HttpContext.RequestAborted);
  3986. }
  3987. else
  3988. {
  3989. (total, items) = await query.ToPagedListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, HttpContext.RequestAborted);
  3990. }
  3991. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<HighFrequencyCallStatisticsDto>(dto.ColumnInfos);
  3992. var dtos = _mapper.Map<ICollection<HighFrequencyCallStatisticsDto>>(items)
  3993. .Select(stu => _mapper.Map(stu, typeof(HighFrequencyCallStatisticsDto), dynamicClass))
  3994. .Cast<object>()
  3995. .ToList();
  3996. var stream = ExcelHelper.CreateStream(dtos);
  3997. return ExcelStreamResult(stream, "高频来电统计");
  3998. }
  3999. /// <summary>
  4000. /// 高频来电统计列表详情
  4001. /// </summary>
  4002. /// <param name="dto"></param>
  4003. /// <returns></returns>
  4004. [HttpGet("high_frequency_call_statistics_order_list")]
  4005. public async Task<PagedDto<OrderDto>> HighFrequencyCallStatisticsOrderList([FromQuery] HighFrequencyCallStatisticsListRequest dto)
  4006. {
  4007. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  4008. throw UserFriendlyException.SameMessage("请选择时间!");
  4009. if (string.IsNullOrEmpty(dto.FromPhone))
  4010. throw UserFriendlyException.SameMessage("号码不能为空!");
  4011. var data = await _trCallRecordRepository.Queryable()
  4012. .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
  4013. .Where((p, o) => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime)
  4014. .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
  4015. .Where((p, o) => p.ExternalId != null && o.Id != null)
  4016. .Where((p, o) => p.CPN == dto.FromPhone)
  4017. .Where((p, o) => p.CallDirection == ECallDirection.In)
  4018. .Select((p, o) =>
  4019. p.ExternalId
  4020. )
  4021. .ToListAsync();
  4022. var (total, items) = await _orderRepository.Queryable()
  4023. .Includes(x => x.OrderScreens)
  4024. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword!)) //标题
  4025. .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo == dto.ProvinceNo) //省本地编号
  4026. .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No) //工单编码
  4027. .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType)//受理类型
  4028. //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
  4029. .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
  4030. //.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
  4031. //.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
  4032. .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
  4033. .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone == dto.TransferPhone!) //转接号码
  4034. //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
  4035. //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
  4036. //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
  4037. .WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
  4038. .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
  4039. .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
  4040. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
  4041. //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel)) //紧急程度
  4042. .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
  4043. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact == dto.PhoneNo!) //联系电话
  4044. //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
  4045. .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.OrderPushTypes.Any(opt => opt.PushTypeCode == dto.PushTypeCode)) //推送分类
  4046. .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
  4047. .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
  4048. //.WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status)) //工单状态
  4049. .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)//工单状态
  4050. //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
  4051. .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName == dto.ActualHandlerName) //接办人
  4052. .WhereIF(dto.IsScreen == true, d => d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //有甄别
  4053. .WhereIF(dto.IsScreen == false, d => !d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //无甄别
  4054. .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.ActualHandleStepCode == dto.CurrentStepCode) //当前办理节点
  4055. .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
  4056. .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束
  4057. .WhereIF(dto.IsOverTime == true, d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
  4058. .WhereIF(dto.IsOverTime == false, d => (d.ExpiredTime > DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime > d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //否 超期
  4059. .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
  4060. .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
  4061. //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
  4062. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
  4063. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.IsProvince == true)
  4064. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.IsProvince == false)
  4065. .OrderByDescending(d => d.CreationTime)
  4066. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  4067. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  4068. }
  4069. /// <summary>
  4070. /// 高频事项预警
  4071. /// </summary>
  4072. /// <param name="dto"></param>
  4073. /// <returns></returns>
  4074. [HttpGet("highmatter-warning")]
  4075. public async Task<PagedDto<HighMatterWarningDto>> HighMatterWarning([FromQuery] HighMatterWarningRequest dto)
  4076. {
  4077. var filterTitle = _systemSettingCacheManager.GetSetting(SettingConstants.HighMatterWarningFilterTitle).SettingValue;
  4078. var (total, items) = await _orderRepository.Queryable()
  4079. .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
  4080. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  4081. .LeftJoin<SystemArea>((it, o) => it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
  4082. .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.AcceptTypeCode == dto.AcceptType)//受理类型
  4083. .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.Hotspot))//热点类型
  4084. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), x => x.AreaCode == dto.AreaCode)//区域
  4085. .GroupBy((it, o) => new
  4086. {
  4087. it.AcceptTypeCode,
  4088. it.AcceptType,
  4089. it.HotspotId,
  4090. it.HotspotName,
  4091. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  4092. o.AreaName,
  4093. })
  4094. .Having((it, o) => SqlFunc.AggregateCount(it.HotspotName) >= 5)
  4095. .Select((it, o) => new HighMatterWarningDto()
  4096. {
  4097. AcceptTypeCode = it.AcceptTypeCode,
  4098. AcceptType = it.AcceptType,
  4099. AreaName = o.AreaName,
  4100. HotspotName = it.HotspotName,
  4101. HotspotId = it.HotspotId,
  4102. SumCount = SqlFunc.AggregateCount(it.HotspotName),
  4103. Id = SqlFunc.AggregateMin(it.Id),
  4104. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  4105. })
  4106. .MergeTable()
  4107. .LeftJoin<Order>((x, d) => x.Id == d.Id)
  4108. .Select((x, d) => new HighMatterWarningDto()
  4109. {
  4110. AreaName = x.AreaName,
  4111. HotspotName = x.HotspotName,
  4112. HotspotId = x.HotspotId,
  4113. Title = d.Title,
  4114. SumCount = x.SumCount,
  4115. Id = d.Id,
  4116. AcceptTypeCode = x.AcceptTypeCode,
  4117. AcceptType = x.AcceptType,
  4118. AreaCode = x.AreaCode
  4119. })
  4120. .MergeTable()
  4121. .OrderByDescending(d => d.SumCount).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  4122. return new PagedDto<HighMatterWarningDto>(total, _mapper.Map<IReadOnlyList<HighMatterWarningDto>>(items));
  4123. }
  4124. /// <summary>
  4125. /// 高频事项预警
  4126. /// </summary>
  4127. /// <param name="dto"></param>
  4128. /// <returns></returns>
  4129. [HttpPost("highmatter-warning/export")]
  4130. [LogFilterAlpha("导出日志")]
  4131. public async Task<FileStreamResult> HighMatterWarningExport([FromBody] ExportExcelDto<HighMatterWarningRequest> dto)
  4132. {
  4133. var filterTitle = _systemSettingCacheManager.GetSetting(SettingConstants.HighMatterWarningFilterTitle).SettingValue;
  4134. var query = _orderRepository.Queryable()
  4135. .Where(x => x.CreationTime >= dto.QueryDto.StartTime && x.CreationTime <= dto.QueryDto.EndTime)
  4136. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  4137. .LeftJoin<SystemArea>((it, o) => it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
  4138. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.AcceptType), x => x.AcceptTypeCode == dto.QueryDto.AcceptType)//受理类型
  4139. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Hotspot), x => x.HotspotSpliceName != null && x.HotspotSpliceName.Contains(dto.QueryDto.Hotspot))//热点类型
  4140. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.AreaCode), x => x.AreaCode == dto.QueryDto.AreaCode)//区域
  4141. .GroupBy((it, o) => new
  4142. {
  4143. it.AcceptTypeCode,
  4144. it.AcceptType,
  4145. it.HotspotId,
  4146. it.HotspotName,
  4147. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  4148. o.AreaName,
  4149. })
  4150. .Having((it, o) => SqlFunc.AggregateCount(it.HotspotName) >= 5)
  4151. .Select((it, o) => new HighMatterWarningDto()
  4152. {
  4153. AcceptTypeCode = it.AcceptTypeCode,
  4154. AcceptType = it.AcceptType,
  4155. AreaName = o.AreaName,
  4156. HotspotName = it.HotspotName,
  4157. HotspotId = it.HotspotId,
  4158. SumCount = SqlFunc.AggregateCount(it.HotspotName),
  4159. Id = SqlFunc.AggregateMin(it.Id),
  4160. AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  4161. })
  4162. .MergeTable()
  4163. .LeftJoin<Order>((x, d) => x.Id == d.Id)
  4164. .Select((x, d) => new HighMatterWarningDto()
  4165. {
  4166. AreaName = x.AreaName,
  4167. HotspotName = x.HotspotName,
  4168. HotspotId = x.HotspotId,
  4169. Title = d.Title,
  4170. SumCount = x.SumCount,
  4171. Id = d.Id,
  4172. AcceptTypeCode = x.AcceptTypeCode,
  4173. AcceptType = x.AcceptType,
  4174. AreaCode = x.AreaCode
  4175. })
  4176. .MergeTable()
  4177. .OrderByDescending(d => d.SumCount);
  4178. var total = 0;
  4179. var items = new List<HighMatterWarningDto>();
  4180. if (dto.IsExportAll)
  4181. {
  4182. items = await query.ToListAsync(HttpContext.RequestAborted);
  4183. }
  4184. else
  4185. {
  4186. (total, items) = await query.ToPagedListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, HttpContext.RequestAborted);
  4187. }
  4188. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<HighMatterWarningDto>(dto.ColumnInfos);
  4189. var dtos = _mapper.Map<ICollection<HighMatterWarningDto>>(items)
  4190. .Select(stu => _mapper.Map(stu, typeof(HighMatterWarningDto), dynamicClass))
  4191. .Cast<object>()
  4192. .ToList();
  4193. var stream = ExcelHelper.CreateStream(dtos);
  4194. return ExcelStreamResult(stream, "高频事项预警");
  4195. }
  4196. /// <summary>
  4197. /// 高频事项预警明细
  4198. /// </summary>
  4199. /// <param name="dto"></param>
  4200. /// <returns></returns>
  4201. [HttpGet("highmatter-warning-detail")]
  4202. public async Task<PagedDto<OrderDto>> HighMatterWarningDetail([FromQuery] HighMatterWarningDetailRequest dto)
  4203. {
  4204. var filterTitle = _systemSettingCacheManager.GetSetting(SettingConstants.HighMatterWarningFilterTitle).SettingValue;
  4205. var (total, items) = await _orderRepository.Queryable()
  4206. .Includes(x => x.OrderScreens)
  4207. .Where(d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
  4208. .Where(d => d.HotspotId == dto.HotspotId) //热点类型
  4209. .Where(d => d.CreationTime >= dto.StartTime) //受理时间开始
  4210. .Where(d => d.CreationTime <= dto.EndTime) //受理时间结束
  4211. .Where(d => d.AreaCode == dto.AreaCode) //区域
  4212. .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
  4213. .OrderByDescending(d => d.CreationTime)
  4214. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  4215. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  4216. }
  4217. /// <summary>
  4218. /// 回退错件
  4219. /// </summary>
  4220. /// <param name="dto"></param>
  4221. /// <returns></returns>
  4222. [HttpGet("reTransact")]
  4223. public async Task<PagedDto<OrderReTransactVo>> OrderReTransact([FromQuery] QueryOrderReTransactRequest dto)
  4224. {
  4225. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  4226. throw UserFriendlyException.SameMessage("请选择时间!");
  4227. var query = _orderApplication.OrderReTransact(dto);
  4228. var (total, items) = await query
  4229. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  4230. items.Add(new OrderReTransactVo
  4231. {
  4232. OrgName = "合计",
  4233. Num = items.Select(s => s.Num).Sum(),
  4234. });
  4235. return new PagedDto<OrderReTransactVo>(total, _mapper.Map<IReadOnlyList<OrderReTransactVo>>(items));
  4236. }
  4237. /// <summary>
  4238. /// 回退错件导出
  4239. /// </summary>
  4240. /// <returns></returns>
  4241. [HttpPost("reTransact/_export")]
  4242. [LogFilterAlpha("导出日志")]
  4243. public async Task<FileStreamResult> OrderReTransactExport([FromBody] ExportExcelDto<QueryOrderReTransactRequest> dto)
  4244. {
  4245. var query = _orderApplication.OrderReTransact(dto.QueryDto);
  4246. List<OrderReTransactVo> data;
  4247. data = await query.ToListAsync(HttpContext.RequestAborted);
  4248. data.Add(new OrderReTransactVo
  4249. {
  4250. OrgName = "合计",
  4251. Num = data.Select(s => s.Num).Sum(),
  4252. });
  4253. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderReTransactVo>(dto.ColumnInfos);
  4254. var dtos = data
  4255. .Select(stu => _mapper.Map(stu, typeof(OrderReTransactVo), dynamicClass))
  4256. .Cast<object>()
  4257. .ToList();
  4258. var stream = ExcelHelper.CreateStream(dtos);
  4259. return ExcelStreamResult(stream, "回退错件统计数据");
  4260. }
  4261. /// <summary>
  4262. /// 回退错件明细
  4263. /// </summary>
  4264. /// <param name="dto"></param>
  4265. /// <returns></returns>
  4266. [HttpGet("reTransact_detail")]
  4267. public async Task<PagedDto<OrderSpecialDetailDto>> OrderReTransactDetail([FromQuery] QueryOrderReTransactDetailRequest dto)
  4268. {
  4269. var query = _orderApplication.QueryOrderSourceDetail(dto);
  4270. var (total, items) = await
  4271. query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  4272. return new PagedDto<OrderSpecialDetailDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDetailDto>>(items));
  4273. }
  4274. /// <summary>
  4275. /// 回退错件明细导出
  4276. /// </summary>
  4277. /// <returns></returns>
  4278. [HttpPost("reTransact_detail/_export")]
  4279. [LogFilterAlpha("导出日志")]
  4280. public async Task<FileStreamResult> OrderReTransactDetailExport([FromBody] ExportExcelDto<QueryOrderReTransactDetailRequest> dto)
  4281. {
  4282. var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
  4283. List<OrderSpecialDetail> data;
  4284. if (dto.IsExportAll)
  4285. {
  4286. data = await query.ToListAsync(HttpContext.RequestAborted);
  4287. }
  4288. else
  4289. {
  4290. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  4291. data = items;
  4292. }
  4293. var dataDtos = _mapper.Map<ICollection<OrderSpecialDetailDto>>(data);
  4294. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderSpecialDetailDto>(dto.ColumnInfos);
  4295. var dtos = dataDtos
  4296. .Select(stu => _mapper.Map(stu, typeof(OrderSpecialDetailDto), dynamicClass))
  4297. .Cast<object>()
  4298. .ToList();
  4299. var stream = ExcelHelper.CreateStream(dtos);
  4300. return ExcelStreamResult(stream, "回退错件明细列表数据");
  4301. }
  4302. /// <summary>
  4303. /// 获取基本信息
  4304. /// </summary>
  4305. /// <param name="id"></param>
  4306. /// <returns></returns>
  4307. [HttpGet("reTransact_base")]
  4308. public async Task<object> ReTransactBaseData()
  4309. {
  4310. var rsp = new
  4311. {
  4312. ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
  4313. };
  4314. return rsp;
  4315. }
  4316. /// <summary>
  4317. /// 派单量统计
  4318. /// </summary>
  4319. /// <param name="dto"></param>
  4320. /// <returns></returns>
  4321. [HttpGet("send_order_report")]
  4322. public async Task<List<SendOrderReportOutDto>> SendOrderReport([FromQuery] QuerySendOrderRequest dto)
  4323. {
  4324. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  4325. throw UserFriendlyException.SameMessage("请选择时间!");
  4326. return await _orderApplication.SendOrderReportAsync(dto);
  4327. }
  4328. /// <summary>
  4329. /// 派单量统计-导出
  4330. /// </summary>
  4331. /// <param name="dto"></param>
  4332. /// <returns></returns>
  4333. [HttpPost("send_order_report/export")]
  4334. [LogFilterAlpha("导出日志")]
  4335. public async Task<FileStreamResult> ExportSendOrderReport([FromBody] ExportExcelDto<QuerySendOrderRequest> dto)
  4336. {
  4337. if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue)
  4338. throw UserFriendlyException.SameMessage("请选择时间!");
  4339. var list = await _orderApplication.SendOrderReportAsync(dto.QueryDto);
  4340. if (list != null && list.Count > 0)
  4341. {
  4342. list.Add(new SendOrderReportOutDto()
  4343. {
  4344. UserName = "合计",
  4345. SendOrderNum = list.Sum(p => p.SendOrderNum),
  4346. NoSendOrderNum = list.Sum(p => p.NoSendOrderNum),
  4347. ReSendOrderNum = list.Sum(p => p.ReSendOrderNum),
  4348. });
  4349. }
  4350. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SendOrderReportOutDto>(dto.ColumnInfos);
  4351. var dtos = list
  4352. .Select(stu => _mapper.Map(stu, typeof(SendOrderReportOutDto), dynamicClass))
  4353. .Cast<object>()
  4354. .ToList();
  4355. var stream = ExcelHelper.CreateStream(dtos);
  4356. return ExcelStreamResult(stream, "派单量统计");
  4357. }
  4358. /// <summary>
  4359. /// 派单量统计明细
  4360. /// </summary>
  4361. /// <param name="dto"></param>
  4362. /// <returns></returns>
  4363. [HttpGet("send_order_detail_report")]
  4364. public async Task<PagedDto<OrderDto>> QuerySendOrderDetail([FromQuery] QuerySendOrderDetailRequest dto)
  4365. {
  4366. if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
  4367. throw UserFriendlyException.SameMessage("请选择时间!");
  4368. var (total, items) = await _orderApplication.QuerySendOrderDetail(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  4369. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  4370. }
  4371. /// <summary>
  4372. /// 派单量统计明细
  4373. /// </summary>
  4374. /// <returns></returns>
  4375. [HttpPost("send_order_detail_report/_export")]
  4376. [LogFilterAlpha("导出日志")]
  4377. public async Task<FileStreamResult> QuerySendOrderDetailExport([FromBody] ExportExcelDto<QuerySendOrderDetailRequest> dto)
  4378. {
  4379. var query = _orderApplication.QuerySendOrderDetail(dto.QueryDto);
  4380. List<Order> data;
  4381. if (dto.IsExportAll)
  4382. {
  4383. data = await query.ToListAsync(HttpContext.RequestAborted);
  4384. }
  4385. else
  4386. {
  4387. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  4388. data = items;
  4389. }
  4390. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderDto>>(data);
  4391. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  4392. var dtos = secondaryHandlingDtos
  4393. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  4394. .Cast<object>()
  4395. .ToList();
  4396. var stream = ExcelHelper.CreateStream(dtos);
  4397. return ExcelStreamResult(stream, "派单量明细数据");
  4398. }
  4399. /// <summary>
  4400. /// 二次办理统计
  4401. /// </summary>
  4402. /// <param name="dto"></param>
  4403. /// <returns></returns>
  4404. [HttpGet("secondary_handling_report")]
  4405. public async Task<List<SecondaryHandlingVo>> SecondaryHandlingReport([FromQuery] QuerySecondaryHandlingRequest dto)
  4406. {
  4407. var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto, HttpContext.RequestAborted);
  4408. return await query.ToListAsync();
  4409. }
  4410. /// <summary>
  4411. /// 二次办理统计导出
  4412. /// </summary>
  4413. /// <returns></returns>
  4414. [HttpPost("secondary_handling_report/_export")]
  4415. [LogFilterAlpha("导出日志")]
  4416. public async Task<FileStreamResult> SecondaryHandlingReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  4417. {
  4418. var query = _orderSecondaryHandlingApplication.SecondaryHandlingReport(dto.QueryDto, HttpContext.RequestAborted);
  4419. List<SecondaryHandlingVo> secondaryHandling;
  4420. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  4421. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SecondaryHandlingVo>(dto.ColumnInfos);
  4422. var dtos = secondaryHandling
  4423. .Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingVo), dynamicClass))
  4424. .Cast<object>()
  4425. .ToList();
  4426. var stream = ExcelHelper.CreateStream(dtos);
  4427. return ExcelStreamResult(stream, "二次办理统计数据");
  4428. }
  4429. /// <summary>
  4430. /// 二次办理明细
  4431. /// </summary>
  4432. /// <param name="dto"></param>
  4433. /// <returns></returns>
  4434. [HttpGet("secondary_handling_detail_report")]
  4435. public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
  4436. {
  4437. var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto, HttpContext.RequestAborted);
  4438. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  4439. return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
  4440. }
  4441. /// <summary>
  4442. /// 二次办理明细导出
  4443. /// </summary>
  4444. /// <returns></returns>
  4445. [HttpPost("secondary_handling_detail_report/_export")]
  4446. [LogFilterAlpha("导出日志")]
  4447. public async Task<FileStreamResult> SecondaryHandlingDetailReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  4448. {
  4449. var query = _orderSecondaryHandlingApplication.SecondaryHandlingDetailReport(dto.QueryDto, HttpContext.RequestAborted);
  4450. List<OrderSecondaryHandling> secondaryHandling;
  4451. if (dto.IsExportAll)
  4452. {
  4453. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  4454. }
  4455. else
  4456. {
  4457. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  4458. secondaryHandling = items;
  4459. }
  4460. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
  4461. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderSecondaryHandlingDto>(dto.ColumnInfos);
  4462. var dtos = secondaryHandlingDtos
  4463. .Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
  4464. .Cast<object>()
  4465. .ToList();
  4466. var stream = ExcelHelper.CreateStream(dtos);
  4467. return ExcelStreamResult(stream, "二次办理列表数据");
  4468. }
  4469. /// <summary>
  4470. /// 二次办理满意度统计
  4471. /// </summary>
  4472. /// <param name="dto"></param>
  4473. /// <returns></returns>
  4474. [HttpGet("secondary_handling_satisfaction_report")]
  4475. public async Task<List<SecondaryHandlingSatisfactionVo>> SecondaryHandlingSatisfactionReport([FromQuery] QuerySecondaryHandlingRequest dto)
  4476. {
  4477. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto, HttpContext.RequestAborted);
  4478. var list = await query.ToListAsync();
  4479. //总计
  4480. var total = new SecondaryHandlingSatisfactionVo
  4481. {
  4482. OrgId = "",
  4483. OrgName = "总计",
  4484. TotalSumCount = list.Select(x => x.TotalSumCount).Sum(),
  4485. VerySatisfiedCount = list.Select(x => x.VerySatisfiedCount).Sum(),
  4486. SatisfiedCount = list.Select(x => x.SatisfiedCount).Sum(),
  4487. RegardedAsSatisfiedCount = list.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  4488. DefaultSatisfiedCount = list.Select(x => x.DefaultSatisfiedCount).Sum(),
  4489. NoSatisfiedCount = list.Select(x => x.NoSatisfiedCount).Sum(),
  4490. NoEvaluateCount = list.Select(x => x.NoEvaluateCount).Sum(),
  4491. NoPutThroughCount = list.Select(x => x.NoPutThroughCount).Sum(),
  4492. NormalCount = list.Select(x => x.NormalCount).Sum(),//未接通
  4493. VeryNoSatisfiedCount = list.Select(x => x.NormalCount).Sum(),//非常不满意
  4494. };
  4495. list.Add(total);
  4496. //区县合计
  4497. var countyList = list.Where(x => x.OrgType == EOrgType.County).ToList();
  4498. var countyTotal = new SecondaryHandlingSatisfactionVo
  4499. {
  4500. OrgId = "",
  4501. OrgName = "区县合计",
  4502. TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
  4503. VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
  4504. SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
  4505. RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  4506. DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
  4507. NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
  4508. NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
  4509. NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum(),
  4510. NormalCount = countyList.Select(x => x.NormalCount).Sum(),//未接通
  4511. VeryNoSatisfiedCount = countyList.Select(x => x.NormalCount).Sum(),//非常不满意
  4512. };
  4513. list.Add(countyTotal);
  4514. //市直合计
  4515. var cityList = list.Where(x => x.OrgType == EOrgType.City).ToList();
  4516. var cityTotal = new SecondaryHandlingSatisfactionVo
  4517. {
  4518. OrgId = "",
  4519. OrgName = "市直合计",
  4520. TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
  4521. VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
  4522. SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
  4523. RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  4524. DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
  4525. NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
  4526. NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
  4527. NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum(),
  4528. NormalCount = cityList.Select(x => x.NormalCount).Sum(),//未接通
  4529. VeryNoSatisfiedCount = cityList.Select(x => x.NormalCount).Sum(),//非常不满意
  4530. };
  4531. list.Add(cityTotal);
  4532. return list;
  4533. }
  4534. /// <summary>
  4535. /// 二次办理满意度统计导出
  4536. /// </summary>
  4537. /// <returns></returns>
  4538. [HttpPost("secondary_handling_satisfaction_report/_export")]
  4539. [LogFilterAlpha("导出日志")]
  4540. public async Task<FileStreamResult> SecondaryHandlingSatisfactionReportExport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  4541. {
  4542. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionReport(dto.QueryDto, HttpContext.RequestAborted);
  4543. List<SecondaryHandlingSatisfactionVo> secondaryHandling;
  4544. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  4545. //总计
  4546. var total = new SecondaryHandlingSatisfactionVo
  4547. {
  4548. OrgId = "",
  4549. OrgName = "总计",
  4550. TotalSumCount = secondaryHandling.Select(x => x.TotalSumCount).Sum(),
  4551. VerySatisfiedCount = secondaryHandling.Select(x => x.VerySatisfiedCount).Sum(),
  4552. SatisfiedCount = secondaryHandling.Select(x => x.SatisfiedCount).Sum(),
  4553. RegardedAsSatisfiedCount = secondaryHandling.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  4554. DefaultSatisfiedCount = secondaryHandling.Select(x => x.DefaultSatisfiedCount).Sum(),
  4555. NoSatisfiedCount = secondaryHandling.Select(x => x.NoSatisfiedCount).Sum(),
  4556. NoEvaluateCount = secondaryHandling.Select(x => x.NoEvaluateCount).Sum(),
  4557. NoPutThroughCount = secondaryHandling.Select(x => x.NoPutThroughCount).Sum()
  4558. };
  4559. secondaryHandling.Add(total);
  4560. //区县合计
  4561. var countyList = secondaryHandling.Where(x => x.OrgType == EOrgType.County).ToList();
  4562. var countyTotal = new SecondaryHandlingSatisfactionVo
  4563. {
  4564. OrgId = "",
  4565. OrgName = "区县合计",
  4566. TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
  4567. VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
  4568. SatisfiedCount = countyList.Select(x => x.SatisfiedCount).Sum(),
  4569. RegardedAsSatisfiedCount = countyList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  4570. DefaultSatisfiedCount = countyList.Select(x => x.DefaultSatisfiedCount).Sum(),
  4571. NoSatisfiedCount = countyList.Select(x => x.NoSatisfiedCount).Sum(),
  4572. NoEvaluateCount = countyList.Select(x => x.NoEvaluateCount).Sum(),
  4573. NoPutThroughCount = countyList.Select(x => x.NoPutThroughCount).Sum()
  4574. };
  4575. secondaryHandling.Add(countyTotal);
  4576. //市直合计
  4577. var cityList = secondaryHandling.Where(x => x.OrgType == EOrgType.City).ToList();
  4578. var cityTotal = new SecondaryHandlingSatisfactionVo
  4579. {
  4580. OrgId = "",
  4581. OrgName = "市直合计",
  4582. TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
  4583. VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
  4584. SatisfiedCount = cityList.Select(x => x.SatisfiedCount).Sum(),
  4585. RegardedAsSatisfiedCount = cityList.Select(x => x.RegardedAsSatisfiedCount).Sum(),
  4586. DefaultSatisfiedCount = cityList.Select(x => x.DefaultSatisfiedCount).Sum(),
  4587. NoSatisfiedCount = cityList.Select(x => x.NoSatisfiedCount).Sum(),
  4588. NoEvaluateCount = cityList.Select(x => x.NoEvaluateCount).Sum(),
  4589. NoPutThroughCount = cityList.Select(x => x.NoPutThroughCount).Sum()
  4590. };
  4591. secondaryHandling.Add(cityTotal);
  4592. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SecondaryHandlingSatisfactionVo>(dto.ColumnInfos);
  4593. var dtos = secondaryHandling
  4594. .Select(stu => _mapper.Map(stu, typeof(SecondaryHandlingSatisfactionVo), dynamicClass))
  4595. .Cast<object>()
  4596. .ToList();
  4597. var stream = ExcelHelper.CreateStream(dtos);
  4598. return ExcelStreamResult(stream, "二次办理满意度统计数据");
  4599. }
  4600. /// <summary>
  4601. /// 二次办理满意度明细
  4602. /// </summary>
  4603. /// <param name="dto"></param>
  4604. /// <returns></returns>
  4605. [HttpGet("secondary_handling_satisfaction_detail_report")]
  4606. public async Task<PagedDto<OrderSecondaryHandlingDto>> SecondaryHandlingSatisfactionDetailReport([FromQuery] QuerySecondaryHandlingRequest dto)
  4607. {
  4608. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto, HttpContext.RequestAborted);
  4609. var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
  4610. return new PagedDto<OrderSecondaryHandlingDto>(total, _mapper.Map<IReadOnlyList<OrderSecondaryHandlingDto>>(items));
  4611. }
  4612. /// <summary>
  4613. /// 二次办理满意度明细导出
  4614. /// </summary>
  4615. /// <returns></returns>
  4616. [HttpPost("secondary_handling_satisfaction_detail_report/_export")]
  4617. [LogFilterAlpha("导出日志")]
  4618. public async Task<FileStreamResult> SecondaryHandlingSatisfactionDetailReport([FromBody] ExportExcelDto<QuerySecondaryHandlingRequest> dto)
  4619. {
  4620. var query = _orderSecondaryHandlingApplication.SecondaryHandlingSatisfactionDetailReport(dto.QueryDto, HttpContext.RequestAborted);
  4621. List<OrderSecondaryHandling> secondaryHandling;
  4622. if (dto.IsExportAll)
  4623. {
  4624. secondaryHandling = await query.ToListAsync(HttpContext.RequestAborted);
  4625. }
  4626. else
  4627. {
  4628. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  4629. secondaryHandling = items;
  4630. }
  4631. var secondaryHandlingDtos = _mapper.Map<ICollection<OrderSecondaryHandlingDto>>(secondaryHandling);
  4632. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderSecondaryHandlingDto>(dto.ColumnInfos);
  4633. var dtos = secondaryHandlingDtos
  4634. .Select(stu => _mapper.Map(stu, typeof(OrderSecondaryHandlingDto), dynamicClass))
  4635. .Cast<object>()
  4636. .ToList();
  4637. var stream = ExcelHelper.CreateStream(dtos);
  4638. return ExcelStreamResult(stream, "二次办理满意度列表数据");
  4639. }
  4640. /// <summary>
  4641. /// 未签收统计
  4642. /// </summary>
  4643. /// <param name="dto"></param>
  4644. /// <returns></returns>
  4645. [HttpGet("unsigned_order_report")]
  4646. public async Task<PagedDto<UnsignedOrderDto>> UnsignedOrderReport([FromQuery] QueryUnsignedOrdersRequest dto)
  4647. {
  4648. var query = _orderApplication.QueryUnsignedOrders(dto);
  4649. var (total, items) = await query.Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws }).ToPagedListAsync(dto, HttpContext.RequestAborted);
  4650. var itemsVo = _mapper.Map<IReadOnlyList<UnsignedOrderDto>>(items);
  4651. foreach (var item in itemsVo)
  4652. {
  4653. // item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status != EWorkflowStepStatus.WaitForAccept && item.WorkflowStep.AcceptTime.HasValue ? item.WorkflowStep.AcceptTime!.Value : DateTime.Now, false);
  4654. item.UnsignedTime = await _expireTime.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status != EWorkflowStepStatus.WaitForAccept && item.WorkflowStep.AcceptTime.HasValue ? item.WorkflowStep.AcceptTime!.Value : DateTime.Now, false);
  4655. }
  4656. return new PagedDto<UnsignedOrderDto>(total, itemsVo);
  4657. }
  4658. /// <summary>
  4659. /// 未签收统计导出
  4660. /// </summary>
  4661. /// <returns></returns>
  4662. [HttpPost("unsigned_order_report/_export")]
  4663. [LogFilterAlpha("导出日志")]
  4664. public async Task<FileStreamResult> UnsignedOrdersReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
  4665. {
  4666. var query = _orderApplication.QueryUnsignedOrders(dto.QueryDto).Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws });
  4667. List<UnsignedOrder> unsignedOrders;
  4668. if (dto.IsExportAll)
  4669. {
  4670. unsignedOrders = await query.ToListAsync(HttpContext.RequestAborted);
  4671. }
  4672. else
  4673. {
  4674. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  4675. unsignedOrders = items;
  4676. }
  4677. var unsignedOrderDtos = _mapper.Map<ICollection<UnsignedOrderDto>>(unsignedOrders);
  4678. foreach (var item in unsignedOrderDtos)
  4679. {
  4680. // item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(
  4681. item.UnsignedTime = await _expireTime.CalcWorkTimeToHour(
  4682. item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
  4683. }
  4684. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<UnsignedOrderDto>(dto.ColumnInfos);
  4685. var dtos = unsignedOrderDtos
  4686. .Select(stu => _mapper.Map(stu, typeof(UnsignedOrderDto), dynamicClass))
  4687. .Cast<object>()
  4688. .ToList();
  4689. var stream = ExcelHelper.CreateStream(dtos);
  4690. return ExcelStreamResult(stream, "未签收统计列表数据");
  4691. }
  4692. /// <summary>
  4693. /// 信件来源统计
  4694. /// </summary>
  4695. /// <param name="dto"></param>
  4696. /// <returns></returns>
  4697. [HttpGet("order_source_report")]
  4698. public async Task<IReadOnlyList<OrderSourceVo>> QueryOrderSourceReport([FromQuery] QueryOrderSourceRequest dto)
  4699. {
  4700. //var count = await _orderApplication.QueryOrderSource(dto).CountAsync();
  4701. var query = _orderApplication.QueryOrderSource(dto);
  4702. var items = await query.GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id) }).ToListAsync(HttpContext.RequestAborted);
  4703. var count = items.Sum(x => x.Num);
  4704. items.ForEach(x => x.TotalSumCount = count);
  4705. items.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
  4706. return items;
  4707. }
  4708. /// <summary>
  4709. /// 信件来源统计导出
  4710. /// </summary>
  4711. /// <returns></returns>
  4712. [HttpPost("order_source/_export")]
  4713. [LogFilterAlpha("导出日志")]
  4714. public async Task<FileStreamResult> QueryOrderSourceReport([FromBody] ExportExcelDto<QueryOrderSourceRequest> dto)
  4715. {
  4716. //var count = await _orderApplication.QueryOrderSource(dto.QueryDto).CountAsync();
  4717. var query = _orderApplication.QueryOrderSource(dto.QueryDto).GroupBy(d => d.SourceChannel).Select(d => new OrderSourceVo { Source = d.SourceChannel, Num = SqlFunc.AggregateCount(d.Id) });
  4718. List<OrderSourceVo> orderSources;
  4719. if (dto.IsExportAll)
  4720. {
  4721. orderSources = await query.ToListAsync(HttpContext.RequestAborted);
  4722. }
  4723. else
  4724. {
  4725. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  4726. orderSources = items;
  4727. }
  4728. var count = orderSources.Sum(x => x.Num);
  4729. orderSources.ForEach(x => x.TotalSumCount = count);
  4730. orderSources.Add(new OrderSourceVo { Source = "合计", Num = count, TotalSumCount = count });
  4731. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderSourceVo>(dto.ColumnInfos);
  4732. var dtos = orderSources
  4733. .Select(stu => _mapper.Map(stu, typeof(OrderSourceVo), dynamicClass))
  4734. .Cast<object>()
  4735. .ToList();
  4736. var stream = ExcelHelper.CreateStream(dtos);
  4737. return ExcelStreamResult(stream, "信件来源统计数据");
  4738. }
  4739. /// <summary>
  4740. /// 信件来源统计列表
  4741. /// </summary>
  4742. /// <param name="dto"></param>
  4743. /// <returns></returns>
  4744. [HttpGet("order_source_report_list")]
  4745. public async Task<Object> QueryOrderSourceReportList([FromQuery] QueryOrderSourceRequest dto)
  4746. {
  4747. var item = await _orderRepository.OrderSource(dto);
  4748. var titleData = await _systemDicDataRepository.Queryable()
  4749. .Where(p => p.DicTypeCode == "SourceChannel")
  4750. .Select(p => new
  4751. {
  4752. Key = p.DicDataValue,
  4753. Value = p.DicDataName
  4754. }).ToListAsync();
  4755. return new { Item = item, TitleData = titleData };
  4756. }
  4757. /// <summary>
  4758. /// 信件来源统计导出
  4759. /// </summary>
  4760. /// <returns></returns>
  4761. [HttpPost("order_source_list/_export")]
  4762. [LogFilterAlpha("导出日志")]
  4763. public async Task<FileStreamResult> QueryOrderSourceListExport([FromBody] QueryOrderSourceRequest dto)
  4764. {
  4765. var dataTable = await _orderRepository.OrderSourceExport(dto);
  4766. var stream = ExcelHelper.CreateStream(dataTable);
  4767. return ExcelStreamResult(stream, "信件来源统计数据");
  4768. }
  4769. /// <summary>
  4770. /// 信件来源统计明细
  4771. /// </summary>
  4772. /// <param name="dto"></param>
  4773. /// <returns></returns>
  4774. [HttpGet("order_source_detail_report")]
  4775. public async Task<PagedDto<OrderDto>> QueryOrderSourceDetailReport([FromQuery] QueryOrderSourceDetailRequest dto)
  4776. {
  4777. var (total, items) = await _orderApplication.QueryOrderSourceDetail(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  4778. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  4779. }
  4780. /// <summary>
  4781. /// 信件来源统计明细导出
  4782. /// </summary>
  4783. /// <returns></returns>
  4784. [HttpPost("order_source_detail/_export")]
  4785. [LogFilterAlpha("导出日志")]
  4786. public async Task<FileStreamResult> QueryOrderSourceDetailReport([FromBody] ExportExcelDto<QueryOrderSourceDetailRequest> dto)
  4787. {
  4788. var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
  4789. List<Order> orders;
  4790. if (dto.IsExportAll)
  4791. {
  4792. orders = await query.ToListAsync(HttpContext.RequestAborted);
  4793. }
  4794. else
  4795. {
  4796. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  4797. orders = items;
  4798. }
  4799. var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
  4800. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  4801. var dtos = ordersDtos
  4802. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  4803. .Cast<object>()
  4804. .ToList();
  4805. var stream = ExcelHelper.CreateStream(dtos);
  4806. return ExcelStreamResult(stream, "信件来源统计明细数据");
  4807. }
  4808. /// <summary>
  4809. /// 区域分时统计
  4810. /// </summary>
  4811. /// <param name="dto"></param>
  4812. /// <returns></returns>
  4813. [HttpGet("order_area_time")]
  4814. public async Task<object> OrderAreaTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  4815. {
  4816. var item = await _orderRepository.OrderAreaTime(dto);
  4817. var titleData = await _systemAreaRepository.Queryable()
  4818. .Where(p => p.Id.Length == 6 && p.Id != "510000")
  4819. .Select(p => new
  4820. {
  4821. Key = p.Id,
  4822. Value = p.AreaName
  4823. }).ToListAsync();
  4824. return new { Item = item, TitleData = titleData };
  4825. }
  4826. /// <summary>
  4827. /// 区域分时统计-导出
  4828. /// </summary>
  4829. /// <param name="dto"></param>
  4830. /// <returns></returns>
  4831. [HttpPost("order_area_time_export")]
  4832. [LogFilterAlpha("导出日志")]
  4833. public async Task<FileStreamResult> OrderAreaTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  4834. {
  4835. var dataTable = await _orderRepository.OrderAreaTimeExport(dto);
  4836. var stream = ExcelHelper.CreateStream(dataTable);
  4837. return ExcelStreamResult(stream, "区域分时统计数据");
  4838. }
  4839. /// <summary>
  4840. /// 热点类型分时统计
  4841. /// </summary>
  4842. /// <param name="dto"></param>
  4843. /// <returns></returns>
  4844. [HttpGet("order_hotspot_time")]
  4845. public async Task<object> OrderHotspotTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  4846. {
  4847. var item = await _orderRepository.OrderHotspotTime(dto);
  4848. var titleData = await _hotspotRepository.Queryable()
  4849. .Where(p => p.Id.Length == 2 && (p.ParentId == null || p.ParentId == ""))
  4850. .Select(p => new
  4851. {
  4852. Key = p.Id,
  4853. Value = p.HotSpotName
  4854. }).ToListAsync();
  4855. return new { Item = item, TitleData = titleData };
  4856. }
  4857. /// <summary>
  4858. /// 热点类型分时统计-导出
  4859. /// </summary>
  4860. /// <param name="dto"></param>
  4861. /// <returns></returns>
  4862. [HttpPost("order_hotspot_time_export")]
  4863. [LogFilterAlpha("导出日志")]
  4864. public async Task<FileStreamResult> OrderHotspotTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  4865. {
  4866. var dataTable = await _orderRepository.OrderHotspotTimeExport(dto);
  4867. var stream = ExcelHelper.CreateStream(dataTable);
  4868. return ExcelStreamResult(stream, "热点类型分时统计数据");
  4869. }
  4870. /// <summary>
  4871. /// 受理类型分时统计
  4872. /// </summary>
  4873. /// <param name="dto"></param>
  4874. /// <returns></returns>
  4875. [HttpGet("order_acceptance_time")]
  4876. public async Task<object> OrderAcceptanceTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  4877. {
  4878. var titleData = await _systemDicDataRepository.Queryable()
  4879. .Where(p => p.DicTypeCode == "AcceptType")
  4880. .Select(p => new Kv()
  4881. {
  4882. Key = p.DicDataValue,
  4883. Value = p.DicDataName
  4884. }).OrderBy(p => p.Key).ToListAsync();
  4885. var item = await _orderRepository.OrderAcceptanceTime(dto);
  4886. var res = new { Item = item, TitleData = titleData };
  4887. return res;
  4888. }
  4889. /// <summary>
  4890. /// 受理类型分时统计-导出
  4891. /// </summary>
  4892. /// <param name="dto"></param>
  4893. /// <returns></returns>
  4894. [HttpPost("order_acceptance_time_export")]
  4895. [LogFilterAlpha("导出日志")]
  4896. public async Task<FileStreamResult> OrderAcceptanceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  4897. {
  4898. var titleData = await _systemDicDataRepository.Queryable()
  4899. .Where(p => p.DicTypeCode == "AcceptType")
  4900. .Select(p => new Kv()
  4901. {
  4902. Key = p.DicDataValue,
  4903. Value = p.DicDataName
  4904. }).OrderBy(p => p.Key).ToListAsync();
  4905. var dataTable = await _orderRepository.OrderAcceptanceTimeExport(dto, titleData);
  4906. var stream = ExcelHelper.CreateStream(dataTable);
  4907. return ExcelStreamResult(stream, "受理类型分时统计数据");
  4908. }
  4909. /// <summary>
  4910. /// 信件来源分时统计
  4911. /// </summary>
  4912. /// <param name="dto"></param>
  4913. /// <returns></returns>
  4914. [HttpGet("order_source_time")]
  4915. public async Task<object> OrderSourceTime([FromQuery] TimeSharingPagedKeywordRequest dto)
  4916. {
  4917. var item = await _orderRepository.OrderSourceTime(dto);
  4918. var titleData = await _systemDicDataRepository.Queryable()
  4919. .Where(p => p.DicTypeCode == "SourceChannel")
  4920. .Select(p => new
  4921. {
  4922. Key = p.DicDataValue,
  4923. Value = p.DicDataName
  4924. }).ToListAsync();
  4925. return new { Item = item, TitleData = titleData };
  4926. }
  4927. /// <summary>
  4928. /// 信件来源分时统计-导出
  4929. /// </summary>
  4930. /// <param name="dto"></param>
  4931. /// <returns></returns>
  4932. [HttpPost("order_source_time_export")]
  4933. [LogFilterAlpha("导出日志")]
  4934. public async Task<FileStreamResult> OrderSourceTimeExport([FromBody] TimeSharingPagedKeywordRequest dto)
  4935. {
  4936. var dataTable = await _orderRepository.OrderSourceTimeExport(dto);
  4937. var stream = ExcelHelper.CreateStream(dataTable);
  4938. return ExcelStreamResult(stream, "信件来源分时统计数据");
  4939. }
  4940. /// <summary>
  4941. /// 部门满意度明细
  4942. /// </summary>
  4943. /// <param name="dto"></param>
  4944. /// <returns></returns>
  4945. [HttpGet("org-visitdetail-list")]
  4946. public async Task<PagedDto<OrgVisitDetailListResp>> OrgVisitDetailList([FromQuery] OrgVisitDetailListReq dto)
  4947. {
  4948. //var query = _orderReportApplication.OrgVisitDetailList(dto);
  4949. var query = _orderRepository.OrgVisitDetailList(dto);
  4950. var (total, items) = await query.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  4951. return new PagedDto<OrgVisitDetailListResp>(total, _mapper.Map<IReadOnlyList<OrgVisitDetailListResp>>(items));
  4952. }
  4953. /// <summary>
  4954. /// 部门满意度明细页面基础数据
  4955. /// </summary>
  4956. /// <returns></returns>
  4957. [HttpGet("org-visitdetail-list-basedata")]
  4958. public async Task<Dictionary<string, dynamic>> OrgVisitDetailListBaseData()
  4959. {
  4960. IReadOnlyList<SystemOrganize> items;
  4961. if (_sessionContext.OrgIsCenter)
  4962. items = await _systemOrganizeRepository.GetOrgJson();
  4963. else
  4964. items = await _systemOrganizeRepository.GetOrgJsonForUser(_sessionContext.RequiredOrgId); ;
  4965. var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
  4966. var definition = wfModule.Definition;
  4967. var attitudeType = EnumExts.GetDescriptions<EAttitudeType>();
  4968. if (_appOptions.Value.IsZiGong == false)
  4969. {
  4970. attitudeType = attitudeType.Where(m => new int[] { 2 }.Contains(m.Key) == false).ToList();
  4971. }
  4972. return new Dictionary<string, dynamic>
  4973. {
  4974. { "visitSatisfaction", _systemDicDataCacheManager.GetVisitSatisfaction() },
  4975. { "orgsOptions", items },
  4976. { "attitudeType", attitudeType},
  4977. { "visitType",EnumExts.GetDescriptions<EVisitType>() },
  4978. { "channelOptions",_sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel) },
  4979. { "acceptTypeOptions",_sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType)},
  4980. { "orderStatusOptions", EnumExts.GetDescriptions<EOrderStatus>()},
  4981. { "currentStepOptions",definition?.Steps.Select(x => new Kv(x.Code, x.Name))},
  4982. { "visitMananer", _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner) },
  4983. { "orderTags", _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.OrderTag) },
  4984. { "dissatisfiedReason", _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason)},
  4985. };
  4986. }
  4987. /// <summary>
  4988. /// 部门满意度明细导出
  4989. /// </summary>
  4990. /// <param name="dto"></param>
  4991. /// <returns></returns>
  4992. [HttpPost("org-visitdetail-list-export")]
  4993. [LogFilterAlpha("导出日志")]
  4994. public async Task<FileStreamResult> OrgVisitDetailListExport([FromBody] ExportExcelDto<OrgVisitDetailListReq> dto)
  4995. {
  4996. var query = _orderRepository.OrgVisitDetailList(dto.QueryDto);
  4997. List<OrgVisitDetailListResp> orders;
  4998. if (dto.IsExportAll)
  4999. {
  5000. orders = await query.ToListAsync(HttpContext.RequestAborted);
  5001. }
  5002. else
  5003. {
  5004. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5005. orders = items;
  5006. }
  5007. //var ordersDtos = _mapper.Map<ICollection<OrgVisitDetailListResp>>(orders);
  5008. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrgVisitDetailListResp>(dto.ColumnInfos);
  5009. var dtos = orders
  5010. .Select(stu => _mapper.Map(stu, typeof(OrgVisitDetailListResp), dynamicClass))
  5011. .Cast<object>()
  5012. .ToList();
  5013. var stream = ExcelHelper.CreateStream(dtos);
  5014. return ExcelStreamResult(stream, "部门满意度明细");
  5015. }
  5016. /// <summary>
  5017. /// 热点区域统计
  5018. /// </summary>
  5019. /// <param name="dto"></param>
  5020. /// <returns></returns>
  5021. [HttpGet("hotspot-area-statistics")]
  5022. public async Task<object> HotspotAndAreaStatistics([FromQuery] HotspotAndAreaStatisticsReq dto)
  5023. {
  5024. var (areaList, returnList) = await _orderApplication.HotspotAndAreaStatistics(dto);
  5025. return new { AreaList = areaList, Data = returnList };
  5026. }
  5027. /// <summary>
  5028. /// 热点区域统计导出
  5029. /// </summary>
  5030. /// <param name="dto"></param>
  5031. /// <returns></returns>
  5032. [HttpPost("hotspot-area-statistics-export")]
  5033. [LogFilterAlpha("导出日志")]
  5034. public async Task<FileStreamResult> HotspotAndAreaStatisticsExport([FromBody] HotspotAndAreaStatisticsReq dto)
  5035. {
  5036. var returnList = await _orderApplication.HotspotAndAreaStatisticsExport(dto);
  5037. var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
  5038. var stream = ExcelHelper.CreateStream(table);
  5039. return ExcelStreamResult(stream, "热点区域统计");
  5040. }
  5041. /// <summary>
  5042. /// 热点区域明细
  5043. /// </summary>
  5044. /// <param name="dto"></param>
  5045. /// <returns></returns>
  5046. [HttpGet("hotspot-area-statistics-detail")]
  5047. public async Task<PagedDto<HotspotAndAreaStatisticsDetailDto>> HotspotAndAreaStatisticsDetail([FromQuery] HotspotAndAreaStatisticsDetailReq dto)
  5048. {
  5049. var (total, items) = await _orderRepository.HotspotAndAreaStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  5050. return new PagedDto<HotspotAndAreaStatisticsDetailDto>(total, items);
  5051. }
  5052. /// <summary>
  5053. /// 受理类型明细
  5054. /// </summary>
  5055. /// <param name="dto"></param>
  5056. /// <returns></returns>
  5057. [HttpGet("accepttype-statistics-bydate-detail")]
  5058. public async Task<PagedDto<HotspotAndAreaStatisticsDetailDto>> AcceptTypeStatisticsByDateDetail([FromQuery] AcceptTypeStatisticsByDateDetailReq dto)
  5059. {
  5060. var (total, items) = await _orderRepository.AcceptTypeStatisticsByDateDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  5061. return new PagedDto<HotspotAndAreaStatisticsDetailDto>(total, items);
  5062. }
  5063. /// <summary>
  5064. /// 受理类型明细导出
  5065. /// </summary>
  5066. /// <param name="dto"></param>
  5067. /// <returns></returns>
  5068. [HttpPost("accepttype-statistics-bydate-detail-export")]
  5069. [LogFilterAlpha("导出日志")]
  5070. public async Task<FileStreamResult> AcceptTypeStatisticsByDateDetailExport([FromBody] ExportExcelDto<AcceptTypeStatisticsByDateDetailReq> dto)
  5071. {
  5072. var query = _orderRepository.AcceptTypeStatisticsByDateDetail(dto.QueryDto);
  5073. List<HotspotAndAreaStatisticsDetailDto> orders;
  5074. if (dto.IsExportAll)
  5075. {
  5076. orders = await query.ToListAsync(HttpContext.RequestAborted);
  5077. }
  5078. else
  5079. {
  5080. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5081. orders = items;
  5082. }
  5083. var ordersDtos = _mapper.Map<ICollection<HotspotAndAreaStatisticsDetailDto>>(orders);
  5084. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<HotspotAndAreaStatisticsDetailDto>(dto.ColumnInfos);
  5085. var dtos = ordersDtos
  5086. .Select(stu => _mapper.Map(stu, typeof(HotspotAndAreaStatisticsDetailDto), dynamicClass))
  5087. .Cast<object>()
  5088. .ToList();
  5089. var stream = ExcelHelper.CreateStream(dtos);
  5090. return ExcelStreamResult(stream, "受理类型明细");
  5091. }
  5092. /// <summary>
  5093. /// 热点区域明细导出
  5094. /// </summary>
  5095. /// <param name="dto"></param>
  5096. /// <returns></returns>
  5097. [HttpPost("hotspot-area-statistics-detail-export")]
  5098. [LogFilterAlpha("导出日志")]
  5099. public async Task<FileStreamResult> HotspotAndAreaStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAreaStatisticsDetailReq> dto)
  5100. {
  5101. var query = _orderRepository.HotspotAndAreaStatisticsDetail(dto.QueryDto);
  5102. List<HotspotAndAreaStatisticsDetailDto> orders;
  5103. if (dto.IsExportAll)
  5104. {
  5105. orders = await query.ToListAsync(HttpContext.RequestAborted);
  5106. }
  5107. else
  5108. {
  5109. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5110. orders = items;
  5111. }
  5112. var ordersDtos = _mapper.Map<ICollection<HotspotAndAreaStatisticsDetailDto>>(orders);
  5113. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<HotspotAndAreaStatisticsDetailDto>(dto.ColumnInfos);
  5114. var dtos = ordersDtos
  5115. .Select(stu => _mapper.Map(stu, typeof(HotspotAndAreaStatisticsDetailDto), dynamicClass))
  5116. .Cast<object>()
  5117. .ToList();
  5118. var stream = ExcelHelper.CreateStream(dtos);
  5119. return ExcelStreamResult(stream, "热点区域明细");
  5120. }
  5121. /// <summary>
  5122. /// 受理类型统计
  5123. /// </summary>
  5124. /// <param name="dto"></param>
  5125. /// <returns></returns>
  5126. [HttpGet("accepttype-statistics")]
  5127. public async Task<List<AcceptTypeStatisticsDto>> AcceptTypeStatistics([FromQuery] AcceptTypeStatisticsReq dto)
  5128. {
  5129. var list = await _orderReportApplication.AcceptTypeStatistics(dto).ToListAsync();
  5130. int SumCount = list.Sum(x => x.SumCount);
  5131. list.Add(new AcceptTypeStatisticsDto()
  5132. {
  5133. AcceptType = "合计",
  5134. SumCount = SumCount,
  5135. CompletionCount = list.Sum(x => x.CompletionCount),
  5136. VisitCount = list.Sum(x => x.VisitCount)
  5137. });
  5138. list.ForEach(x =>
  5139. {
  5140. x.SumCountRate = SumCount > 0 ? Math.Round((double)x.SumCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
  5141. });
  5142. return list;
  5143. }
  5144. /// <summary>
  5145. /// 受理类型统计-导出
  5146. /// </summary>
  5147. /// <param name="dto"></param>
  5148. /// <returns></returns>
  5149. [HttpPost("accepttype-statistics-export")]
  5150. [LogFilterAlpha("导出日志")]
  5151. public async Task<FileStreamResult> AcceptTypeStatisticsExport([FromBody] ExportExcelDto<AcceptTypeStatisticsReq> dto)
  5152. {
  5153. var list = await _orderReportApplication.AcceptTypeStatistics(dto.QueryDto).ToListAsync();
  5154. int SumCount = list.Sum(x => x.SumCount);
  5155. list.Add(new AcceptTypeStatisticsDto()
  5156. {
  5157. AcceptType = "合计",
  5158. SumCount = SumCount,
  5159. CompletionCount = list.Sum(x => x.CompletionCount),
  5160. VisitCount = list.Sum(x => x.VisitCount)
  5161. });
  5162. list.ForEach(x =>
  5163. {
  5164. x.SumCountRate = SumCount > 0 ? Math.Round((double)x.SumCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
  5165. });
  5166. var orderDtos = _mapper.Map<ICollection<AcceptTypeStatisticsDto>>(list);
  5167. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<AcceptTypeStatisticsDto>(dto.ColumnInfos);
  5168. var dtos = orderDtos
  5169. .Select(stu => _mapper.Map(stu, typeof(AcceptTypeStatisticsDto), dynamicClass))
  5170. .Cast<object>()
  5171. .ToList();
  5172. var stream = ExcelHelper.CreateStream(dtos);
  5173. return ExcelStreamResult(stream, "受理类型统计表数据");
  5174. }
  5175. /// <summary>
  5176. /// 根据时间查询受理类型统计
  5177. /// </summary>
  5178. /// <param name="dto"></param>
  5179. /// <returns></returns>
  5180. [HttpGet("accepttype-statistics-bydate")]
  5181. public async Task<object> AcceptTypeStatisticsByDate([FromQuery] AcceptTypeStatisticsByDateReq dto)
  5182. {
  5183. var (acceptList, items) = await _orderRepository.AcceptTypeStatisticsByDate(dto);
  5184. return new { AcceptType = acceptList, Data = items };
  5185. }
  5186. /// <summary>
  5187. /// 根据时间查询受理类型统计导出
  5188. /// </summary>
  5189. /// <param name="dto"></param>
  5190. /// <returns></returns>
  5191. [HttpPost("accepttype-statistics-bydate-export")]
  5192. [LogFilterAlpha("导出日志")]
  5193. public async Task<FileStreamResult> AcceptTypeStatisticsByDateExport([FromBody] AcceptTypeStatisticsByDateReq dto)
  5194. {
  5195. var returnList = await _orderRepository.AcceptTypeStatisticsByDateExport(dto);
  5196. var table = _orderRepository.InitAcceptTypeTable(returnList, dto.AddColumnName);
  5197. var stream = ExcelHelper.CreateStream(table);
  5198. return ExcelStreamResult(stream, "受理类型时间统计");
  5199. }
  5200. /// <summary>
  5201. /// 下级区域统计
  5202. /// </summary>
  5203. /// <param name="StartTime">开始时间</param>
  5204. /// <param name="EndTime">结束时间</param>
  5205. /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
  5206. /// <param name="AreaCode">上级区域Id</param>
  5207. /// <param name="Line">线路号</param>
  5208. /// <returns></returns>
  5209. [HttpGet("area_subordinate")]
  5210. public async Task<object> AreaSubordinate(DateTime StartTime, DateTime EndTime, int? TypeId, string? AreaCode, string? Line)
  5211. {
  5212. string count = "6";
  5213. if (!string.IsNullOrEmpty(AreaCode) && AreaCode != "511500")
  5214. count = (AreaCode.Length + 2).ToString();
  5215. if (string.IsNullOrEmpty(AreaCode))
  5216. AreaCode = "510000";
  5217. if (AreaCode == "510000")
  5218. {
  5219. var query = _orderRepository.Queryable()
  5220. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  5221. .WhereIF(TypeId != null && TypeId == 1, p => p.IdentityType == EIdentityType.Citizen)
  5222. .WhereIF(TypeId != null && TypeId == 2, p => p.IdentityType == EIdentityType.Enterprise)
  5223. .WhereIF(!string.IsNullOrEmpty(Line), p => p.TransferPhone == Line)
  5224. .Select(p => new
  5225. {
  5226. AreaCode = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  5227. })
  5228. .MergeTable()
  5229. .Select(p => new
  5230. {
  5231. AreaCode = SqlFunc.IIF(p.AreaCode != "519800" && p.AreaCode != "519900", "511500", p.AreaCode)
  5232. }
  5233. ).MergeTable()
  5234. .GroupBy(p => p.AreaCode)
  5235. .Select(p => new
  5236. {
  5237. AreaCode = p.AreaCode,
  5238. SumCount = SqlFunc.AggregateCount(p.AreaCode)
  5239. }
  5240. ).MergeTable();
  5241. var list = await _systemAreaRepository.Queryable()
  5242. .LeftJoin(query, (s, o) => s.Id == o.AreaCode)
  5243. .Where((s, o) => s.ParentId == AreaCode)
  5244. .Select((s, o) => new
  5245. {
  5246. AreaCode = s.Id,
  5247. SumCount = o.SumCount,
  5248. AreaName = s.AreaName,
  5249. HasChild = SqlFunc.Subqueryable<SystemArea>().Where(d => d.ParentId == o.AreaCode).Any()
  5250. })
  5251. .ToListAsync();
  5252. return list;
  5253. }
  5254. else
  5255. {
  5256. var query = _orderRepository.Queryable()
  5257. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  5258. .WhereIF(TypeId != null && TypeId == 1, p => p.IdentityType == EIdentityType.Citizen)
  5259. .WhereIF(TypeId != null && TypeId == 2, p => p.IdentityType == EIdentityType.Enterprise)
  5260. .WhereIF(!string.IsNullOrEmpty(Line), p => p.TransferPhone == Line)
  5261. .GroupBy(p => new { Id = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
  5262. .Select(p => new
  5263. {
  5264. AreaCode = p.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
  5265. SumCount = SqlFunc.AggregateCount(p.AreaCode)
  5266. })
  5267. .MergeTable();
  5268. var list = await _systemAreaRepository.Queryable()
  5269. .LeftJoin(query, (s, o) => s.Id == o.AreaCode)
  5270. .Where((s, o) => s.ParentId == AreaCode)
  5271. .Select((s, o) => new
  5272. {
  5273. AreaCode = s.Id,
  5274. SumCount = o.SumCount,
  5275. AreaName = s.AreaName,
  5276. HasChild = SqlFunc.Subqueryable<SystemArea>().Where(d => d.ParentId == o.AreaCode).Any()
  5277. })
  5278. .ToListAsync();
  5279. return list;
  5280. }
  5281. }
  5282. /// <summary>
  5283. /// 下级区域统计导出
  5284. /// </summary>
  5285. /// <param name="dto"></param>
  5286. /// <returns></returns>
  5287. [HttpPost("area_subordinate/export")]
  5288. [LogFilterAlpha("导出日志")]
  5289. public async Task<FileStreamResult> AreaSubordinateExport([FromBody] ExportExcelDto<AreaSubordinateRequest> dto)
  5290. {
  5291. var StartTime = dto.QueryDto.StartTime;
  5292. var EndTime = dto.QueryDto.EndTime;
  5293. var TypeId = dto.QueryDto.TypeId;
  5294. var Line = dto.QueryDto.Line;
  5295. DataTable data = new DataTable();
  5296. var list = await _systemAreaRepository.Queryable()
  5297. .LeftJoin<Order>((s, o) => o.AreaCode.StartsWith(s.Id))
  5298. .Where((s, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
  5299. .WhereIF(TypeId != null && TypeId == 1, (s, o) => o.IdentityType == EIdentityType.Citizen)
  5300. .WhereIF(TypeId != null && TypeId == 2, (s, o) => o.IdentityType == EIdentityType.Enterprise)
  5301. .WhereIF(!string.IsNullOrEmpty(Line), (s, o) => o.TransferPhone == Line)
  5302. .GroupBy((s, o) => s.Id)
  5303. .OrderBy((s, o) => new { s.Id }, OrderByType.Asc)
  5304. .Select((s, o) => new AreaSubordinateReportRes
  5305. {
  5306. AreaName = s.AreaName,
  5307. SumCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.AreaCode.StartsWith(s.Id), 1, 0))
  5308. })
  5309. .ToListAsync();
  5310. data = list.ToDataTable("areasubordinate");
  5311. //合计
  5312. DataRow sumRow = data.NewRow();
  5313. sumRow["AreaName"] = "合计";
  5314. decimal totalAmount = 0;
  5315. foreach (DataRow row in data.Rows)
  5316. {
  5317. totalAmount += Convert.ToDecimal(row["SumCount"]);
  5318. }
  5319. sumRow["SumCount"] = totalAmount;
  5320. data.Rows.Add(sumRow);
  5321. data.Columns["AreaName"].ColumnName = "区域名称";
  5322. data.Columns["SumCount"].ColumnName = "分类统计";
  5323. var stream = ExcelHelper.CreateStream(data);
  5324. return ExcelStreamResult(stream, "下级区域统计");
  5325. }
  5326. /// <summary>
  5327. /// 热点满意度统计
  5328. /// </summary>
  5329. /// <param name="dto"></param>
  5330. /// <returns></returns>
  5331. [HttpGet("visit-hotspot-satisfaction-statistics")]
  5332. public async Task<Object> VisitAndHotspotSatisfactionStatistics([FromQuery] VisitAndHotspotPagedKeywordRequest dto)
  5333. {
  5334. var data = await _orderApplication.VisitAndHotspotSatisfactionStatistics(dto);
  5335. var sumModel = new VisitAndHotspotSatisfactionStatisticsDto()
  5336. {
  5337. HotspotName = "总计",
  5338. TotalSumCount = data.Sum(x => x.TotalSumCount),
  5339. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  5340. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  5341. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  5342. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  5343. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  5344. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  5345. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  5346. };
  5347. return new { DataList = data, SumModel = sumModel };
  5348. }
  5349. /// <summary>
  5350. /// 热点满意度统计导出
  5351. /// </summary>
  5352. /// <param name="dto"></param>
  5353. /// <returns></returns>
  5354. [HttpPost("visit-hotspot-satisfaction-statistics/_export")]
  5355. [LogFilterAlpha("导出日志")]
  5356. public async Task<FileStreamResult> VisitAndHotspotSatisfactionStatisticsExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
  5357. {
  5358. List<VisitAndHotspotSatisfactionStatisticsDto> data = await _orderApplication.VisitAndHotspotSatisfactionStatistics(dto.QueryDto);
  5359. var sumModel = new VisitAndHotspotSatisfactionStatisticsDto()
  5360. {
  5361. HotspotName = "总计",
  5362. TotalSumCount = data.Sum(x => x.TotalSumCount),
  5363. VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
  5364. SatisfiedCount = data.Sum(x => x.SatisfiedCount),
  5365. RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
  5366. DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
  5367. NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
  5368. NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
  5369. NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
  5370. };
  5371. data.Add(sumModel);
  5372. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<VisitAndHotspotSatisfactionStatisticsDto>(dto.ColumnInfos);
  5373. var dtos = data
  5374. .Select(stu => _mapper.Map(stu, typeof(VisitAndHotspotSatisfactionStatisticsDto), dynamicClass))
  5375. .Cast<object>()
  5376. .ToList();
  5377. var stream = ExcelHelper.CreateStream(dtos);
  5378. return ExcelStreamResult(stream, "热点满意度统计数据");
  5379. }
  5380. /// <summary>
  5381. /// 热点满意度明细
  5382. /// </summary>
  5383. /// <param name="dto"></param>
  5384. /// <returns></returns>
  5385. [HttpGet("visit-hotspot-satisfaction-detail")]
  5386. public async Task<PagedDto<OrderVisitDetailDto>> VisitAndHotspotSatisfactionDetail([FromQuery] VisitAndHotspotPagedKeywordRequest dto)
  5387. {
  5388. var (total, items) = await _orderApplication.VisitAndHotspotSatisfactionDetail(dto)
  5389. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  5390. return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
  5391. }
  5392. /// <summary>
  5393. /// 热点满意度明细导出
  5394. /// </summary>
  5395. /// <param name="dto"></param>
  5396. /// <returns></returns>
  5397. [HttpPost("visit-hotspot-satisfaction-detail/_export")]
  5398. [LogFilterAlpha("导出日志")]
  5399. public async Task<FileStreamResult> VisitAndHotspotSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndHotspotPagedKeywordRequest> dto)
  5400. {
  5401. var query = _orderApplication.VisitAndHotspotSatisfactionDetail(dto.QueryDto);
  5402. List<OrderVisitDetail> data;
  5403. if (dto.IsExportAll)
  5404. {
  5405. data = await query.ToListAsync(HttpContext.RequestAborted);
  5406. }
  5407. else
  5408. {
  5409. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5410. data = items;
  5411. }
  5412. var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
  5413. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderVisitDetailDto>(dto.ColumnInfos);
  5414. var dtos = dataDtos
  5415. .Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
  5416. .Cast<object>()
  5417. .ToList();
  5418. var stream = ExcelHelper.CreateStream(dtos);
  5419. return ExcelStreamResult(stream, "热点满意度明细数据");
  5420. }
  5421. /// <summary>
  5422. /// 热点受理类型统计
  5423. /// </summary>
  5424. /// <param name="dto"></param>
  5425. /// <returns></returns>
  5426. [HttpGet("hotspot-accepttype-statistics")]
  5427. public async Task<object> HotspotAndAcceptTypeStatistics([FromQuery] HotspotAndAcceptTypeStatisticsReq dto)
  5428. {
  5429. var (areaList, returnList) = await _orderApplication.HotspotAndAcceptTypeStatistics(dto);
  5430. return new { AreaList = areaList, Data = returnList };
  5431. }
  5432. /// <summary>
  5433. /// 热点受理类型统计导出
  5434. /// </summary>
  5435. /// <param name="dto"></param>
  5436. /// <returns></returns>
  5437. [HttpPost("hotspot-accepttype-statistics-export")]
  5438. [LogFilterAlpha("导出日志")]
  5439. public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsExport([FromBody] HotspotAndAcceptTypeStatisticsReq dto)
  5440. {
  5441. var returnList = await _orderApplication.HotspotAndAcceptTypeStatisticsExport(dto);
  5442. var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
  5443. var stream = ExcelHelper.CreateStream(table);
  5444. return ExcelStreamResult(stream, "热点受理类型统计");
  5445. }
  5446. /// <summary>
  5447. /// 热点受理类型明细
  5448. /// </summary>
  5449. /// <param name="dto"></param>
  5450. /// <returns></returns>
  5451. [HttpGet("hotspot-accepttype-statistics-detail")]
  5452. public async Task<PagedDto<OrderDto>> HotspotAndAcceptTypeStatisticsDetail([FromQuery] HotspotAndAcceptTypeStatisticsDetailReq dto)
  5453. {
  5454. var (total, items) = await _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  5455. return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
  5456. }
  5457. /// <summary>
  5458. /// 热点受理类型明细导出
  5459. /// </summary>
  5460. /// <param name="dto"></param>
  5461. /// <returns></returns>
  5462. [HttpPost("hotspot-accepttype-statistics-detail-export")]
  5463. [LogFilterAlpha("导出日志")]
  5464. public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAcceptTypeStatisticsDetailReq> dto)
  5465. {
  5466. var query = _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto.QueryDto);
  5467. List<Order> orders;
  5468. if (dto.IsExportAll)
  5469. {
  5470. orders = await query.ToListAsync(HttpContext.RequestAborted);
  5471. }
  5472. else
  5473. {
  5474. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5475. orders = items;
  5476. }
  5477. var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
  5478. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  5479. var dtos = ordersDtos
  5480. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  5481. .Cast<object>()
  5482. .ToList();
  5483. var stream = ExcelHelper.CreateStream(dtos);
  5484. return ExcelStreamResult(stream, "热点受理类型明细");
  5485. }
  5486. /// <summary>
  5487. /// 甄别申请统计
  5488. /// </summary>
  5489. /// <param name="dto"></param>
  5490. /// <returns></returns>
  5491. [HttpGet("screen-apply")]
  5492. public async Task<PagedDto<OrderScreenApplyVo>> OrderScreenApply([FromQuery] OrderScreenApplyPagedRequest dto)
  5493. {
  5494. var (total, items) = await _orderApplication.OrderScreenApply(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  5495. return new PagedDto<OrderScreenApplyVo>(total, items);
  5496. }
  5497. /// <summary>
  5498. /// 甄别申请统计导出
  5499. /// </summary>
  5500. /// <param name="dto"></param>
  5501. /// <returns></returns>
  5502. [HttpPost("screen-apply-export")]
  5503. [LogFilterAlpha("导出日志")]
  5504. public async Task<FileStreamResult> OrderScreenApplyExport([FromBody] ExportExcelDto<OrderScreenApplyPagedRequest> dto)
  5505. {
  5506. var query = _orderApplication.OrderScreenApply(dto.QueryDto);
  5507. List<OrderScreenApplyVo> datas;
  5508. if (dto.IsExportAll)
  5509. {
  5510. datas = await query.ToListAsync(HttpContext.RequestAborted);
  5511. }
  5512. else
  5513. {
  5514. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5515. datas = items;
  5516. }
  5517. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderScreenApplyVo>(dto.ColumnInfos);
  5518. var dtos = datas
  5519. .Select(stu => _mapper.Map(stu, typeof(OrderScreenApplyVo), dynamicClass))
  5520. .Cast<object>()
  5521. .ToList();
  5522. var stream = ExcelHelper.CreateStream(dtos);
  5523. return ExcelStreamResult(stream, "甄别申请统计");
  5524. }
  5525. /// <summary>
  5526. /// 甄别审批统计
  5527. /// </summary>
  5528. /// <param name="dto"></param>
  5529. /// <returns></returns>
  5530. [HttpGet("screen-audit")]
  5531. public async Task<PagedDto<OrderScreenAuditVo>> OrderScreenAudit([FromQuery] OrderScreenAuditPagedRequest dto)
  5532. {
  5533. var (total, items) = await _orderApplication.OrderScreenAudit(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  5534. return new PagedDto<OrderScreenAuditVo>(total, items);
  5535. }
  5536. /// <summary>
  5537. /// 甄别审批统计导出
  5538. /// </summary>
  5539. /// <param name="dto"></param>
  5540. /// <returns></returns>
  5541. [HttpPost("screen-audit-export")]
  5542. [LogFilterAlpha("导出日志")]
  5543. public async Task<FileStreamResult> OrderScreenAuditExport([FromBody] ExportExcelDto<OrderScreenAuditPagedRequest> dto)
  5544. {
  5545. var query = _orderApplication.OrderScreenAudit(dto.QueryDto);
  5546. List<OrderScreenAuditVo> datas;
  5547. if (dto.IsExportAll)
  5548. {
  5549. datas = await query.ToListAsync(HttpContext.RequestAborted);
  5550. }
  5551. else
  5552. {
  5553. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5554. datas = items;
  5555. }
  5556. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderScreenAuditVo>(dto.ColumnInfos);
  5557. var dtos = datas
  5558. .Select(stu => _mapper.Map(stu, typeof(OrderScreenAuditVo), dynamicClass))
  5559. .Cast<object>()
  5560. .ToList();
  5561. var stream = ExcelHelper.CreateStream(dtos);
  5562. return ExcelStreamResult(stream, "甄别审批统计");
  5563. }
  5564. /// <summary>
  5565. /// 未签收统计
  5566. /// </summary>
  5567. /// <param name="dto"></param>
  5568. /// <returns></returns>
  5569. [HttpGet("get_order_nosigen")]
  5570. public async Task<object> GetOrderNoSigen([FromQuery] OrderNoSigenRequestDto dto)
  5571. {
  5572. var items = await _orderReportApplication.GetOrderNoSigen(dto);
  5573. var total = new OrderNoSigenDto
  5574. {
  5575. OrgName = "合计",
  5576. OrgCode = "",
  5577. OrderNoSigen = items.Sum(p => p.OrderNoSigen),
  5578. CounterNoSign = items.Sum(p => p.CounterNoSign)
  5579. };
  5580. return new { List = items, Total = total };
  5581. }
  5582. /// <summary>
  5583. /// 未签收统计--导出
  5584. /// </summary>
  5585. /// <param name="dto"></param>
  5586. /// <returns></returns>
  5587. [HttpPost("get_order_nosigen_export")]
  5588. [LogFilterAlpha("导出日志")]
  5589. public async Task<FileStreamResult> ExportGetOrderNoSigen([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
  5590. {
  5591. var list = await _orderReportApplication.GetOrderNoSigen(dto.QueryDto);
  5592. //增加合计
  5593. list.Add(new OrderNoSigenDto
  5594. {
  5595. OrgName = "合计",
  5596. OrgCode = "",
  5597. OrderNoSigen = list.Sum(p => p.OrderNoSigen),
  5598. CounterNoSign = list.Sum(p => p.CounterNoSign)
  5599. });
  5600. var orderDtos = _mapper.Map<ICollection<OrderNoSigenDto>>(list);
  5601. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderNoSigenDto>(dto.ColumnInfos);
  5602. var dtos = orderDtos
  5603. .Select(stu => _mapper.Map(stu, typeof(OrderNoSigenDto), dynamicClass))
  5604. .Cast<object>()
  5605. .ToList();
  5606. var stream = ExcelHelper.CreateStream(dtos);
  5607. return ExcelStreamResult(stream, "未签收统计数据");
  5608. }
  5609. /// <summary>
  5610. /// 未签收统计--明细
  5611. /// </summary>
  5612. /// <param name="dto"></param>
  5613. /// <returns></returns>
  5614. [HttpGet("get_order_nosigen_detail")]
  5615. public async Task<PagedDto<OrderDto>> GetOrderNoSigenDetail([FromQuery] OrderNoSigenRequestDto dto)
  5616. {
  5617. RefAsync<int> total = 0;
  5618. var queryData = await _orderReportApplication.GetOrderNoSigenDetail(dto)
  5619. .Select(o => new { o })
  5620. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  5621. var dtos = queryData.Select(d =>
  5622. {
  5623. var dto = _mapper.Map<OrderDto>(d.o);
  5624. return dto;
  5625. }).ToList();
  5626. return new PagedDto<OrderDto>(total, dtos);
  5627. }
  5628. /// <summary>
  5629. /// 未签收统计--明细--导出
  5630. /// </summary>
  5631. /// <param name="dto"></param>
  5632. /// <returns></returns>
  5633. [HttpPost("get_order_nosigen_detail_export")]
  5634. [LogFilterAlpha("导出日志")]
  5635. public async Task<FileStreamResult> ExportGetOrderNoSigenDetail([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
  5636. {
  5637. var query = _orderReportApplication.GetOrderNoSigenDetail(dto.QueryDto).Select(o => new { o });
  5638. List<OrderDto> list = new();
  5639. if (dto.IsExportAll)
  5640. {
  5641. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  5642. list = listData.Select(d =>
  5643. {
  5644. var dto = _mapper.Map<OrderDto>(d.o);
  5645. return dto;
  5646. }).ToList();
  5647. }
  5648. else
  5649. {
  5650. RefAsync<int> total = 0;
  5651. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  5652. list = listData.Select(d =>
  5653. {
  5654. var dto = _mapper.Map<OrderDto>(d.o);
  5655. return dto;
  5656. }).ToList();
  5657. }
  5658. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  5659. var dtos = list
  5660. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  5661. .Cast<object>()
  5662. .ToList();
  5663. var stream = ExcelHelper.CreateStream(dtos);
  5664. return ExcelStreamResult(stream, "未签收统计明细数据");
  5665. }
  5666. /// <summary>
  5667. /// 企业专席信件统计
  5668. /// </summary>
  5669. /// <param name="dto"></param>
  5670. /// <returns></returns>
  5671. [HttpGet("get_enterprise_seats_report")]
  5672. public async Task<object> GetEnterpriseSeatsReport([FromQuery] EnterpriseSeatsReportRequestDto dto)
  5673. {
  5674. var items = await _orderReportApplication.GetEnterpriseSeatsReport(dto);
  5675. var total = new EnterpriseSeatsReportDto
  5676. {
  5677. UserName = "合计",
  5678. UserId = "",
  5679. UserNo = "",
  5680. TelCallNum = items.Sum(p => p.TelCallNum),
  5681. OrderNum = items.Sum(p => p.OrderNum),
  5682. };
  5683. return new { List = items, Total = total };
  5684. }
  5685. /// <summary>
  5686. /// 企业专席信件统计--导出
  5687. /// </summary>
  5688. /// <param name="dto"></param>
  5689. /// <returns></returns>
  5690. [HttpPost("get_enterprise_seats_report_export")]
  5691. [LogFilterAlpha("导出日志")]
  5692. public async Task<FileStreamResult> ExportGetEnterpriseSeatsReport([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
  5693. {
  5694. var list = await _orderReportApplication.GetEnterpriseSeatsReport(dto.QueryDto);
  5695. //增加合计
  5696. list.Add(new EnterpriseSeatsReportDto
  5697. {
  5698. UserName = "合计",
  5699. UserId = "",
  5700. UserNo = "",
  5701. TelCallNum = list.Sum(p => p.TelCallNum),
  5702. OrderNum = list.Sum(p => p.OrderNum),
  5703. });
  5704. var orderDtos = _mapper.Map<ICollection<EnterpriseSeatsReportDto>>(list);
  5705. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<EnterpriseSeatsReportDto>(dto.ColumnInfos);
  5706. var dtos = orderDtos
  5707. .Select(stu => _mapper.Map(stu, typeof(EnterpriseSeatsReportDto), dynamicClass))
  5708. .Cast<object>()
  5709. .ToList();
  5710. var stream = ExcelHelper.CreateStream(dtos);
  5711. return ExcelStreamResult(stream, "企业专席信件统计");
  5712. }
  5713. /// <summary>
  5714. /// 企业专席信件统计--明细
  5715. /// </summary>
  5716. /// <param name="dto"></param>
  5717. /// <returns></returns>
  5718. [HttpGet("get_enterprise_seats_report_detail")]
  5719. public async Task<PagedDto<OrderDto>> GetEnterpriseSeatsReportDetail([FromQuery] EnterpriseSeatsReportRequestDto dto)
  5720. {
  5721. RefAsync<int> total = 0;
  5722. var queryData = await _orderReportApplication.GetEnterpriseSeatsReportDetail(dto)
  5723. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  5724. return new PagedDto<OrderDto>(total, _mapper.Map<List<OrderDto>>(queryData));
  5725. }
  5726. /// <summary>
  5727. /// 企业专席信件统计--明细--导出
  5728. /// </summary>
  5729. /// <param name="dto"></param>
  5730. /// <returns></returns>
  5731. [HttpPost("get_enterprise_seats_report_detail_export")]
  5732. [LogFilterAlpha("导出日志")]
  5733. public async Task<FileStreamResult> ExportGetEnterpriseSeatsReportDetail([FromBody] ExportExcelDto<EnterpriseSeatsReportRequestDto> dto)
  5734. {
  5735. var query = _orderReportApplication.GetEnterpriseSeatsReportDetail(dto.QueryDto);
  5736. List<OrderDto> list = new();
  5737. if (dto.IsExportAll)
  5738. {
  5739. var listData = await query.ToListAsync(HttpContext.RequestAborted);
  5740. list = _mapper.Map<List<OrderDto>>(listData);
  5741. }
  5742. else
  5743. {
  5744. RefAsync<int> total = 0;
  5745. var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
  5746. list = _mapper.Map<List<OrderDto>>(listData);
  5747. }
  5748. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  5749. var dtos = list
  5750. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  5751. .Cast<object>()
  5752. .ToList();
  5753. var stream = ExcelHelper.CreateStream(dtos);
  5754. return ExcelStreamResult(stream, "企业专席信件统计");
  5755. }
  5756. /// <summary>
  5757. /// 中心受理统计
  5758. /// </summary>
  5759. /// <param name="dto"></param>
  5760. /// <returns></returns>
  5761. [HttpGet("center-accept")]
  5762. public async Task<List<OrderCenterAcceptVo>> OrderCenterAccept([FromQuery] OrderCenterAcceptPagedRequest dto)
  5763. {
  5764. var items = await _orderApplication.OrderCenterAccept(dto).ToListAsync(HttpContext.RequestAborted);
  5765. items.Add(new OrderCenterAcceptVo
  5766. {
  5767. Time = "合计",
  5768. AcceptNum = items.Sum(p => p.AcceptNum),
  5769. ValidNum = items.Sum(p => p.ValidNum),
  5770. RepetitionNum = items.Sum(p => p.RepetitionNum),
  5771. InvalidNum = items.Sum(p => p.InvalidNum),
  5772. HandleNum = items.Sum(p => p.HandleNum),
  5773. NoHandleNum = items.Sum(p => p.NoHandleNum),
  5774. BackNum = items.Sum(p => p.BackNum),
  5775. DutyDeskNum = items.Sum(p => p.DutyDeskNum),
  5776. });
  5777. return items;
  5778. }
  5779. /// <summary>
  5780. /// 中心受理统计导出
  5781. /// </summary>
  5782. /// <param name="dto"></param>
  5783. /// <returns></returns>
  5784. [HttpPost("center-accept-export")]
  5785. [LogFilterAlpha("导出日志")]
  5786. public async Task<FileStreamResult> OrderCenterAcceptExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  5787. {
  5788. var query = _orderApplication.OrderCenterAccept(dto.QueryDto);
  5789. List<OrderCenterAcceptVo> datas;
  5790. if (dto.IsExportAll)
  5791. {
  5792. datas = await query.ToListAsync(HttpContext.RequestAborted);
  5793. }
  5794. else
  5795. {
  5796. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5797. datas = items;
  5798. }
  5799. datas.Add(new OrderCenterAcceptVo
  5800. {
  5801. Time = "合计",
  5802. AcceptNum = datas.Sum(p => p.AcceptNum),
  5803. ValidNum = datas.Sum(p => p.ValidNum),
  5804. RepetitionNum = datas.Sum(p => p.RepetitionNum),
  5805. InvalidNum = datas.Sum(p => p.InvalidNum),
  5806. HandleNum = datas.Sum(p => p.HandleNum),
  5807. NoHandleNum = datas.Sum(p => p.NoHandleNum),
  5808. BackNum = datas.Sum(p => p.BackNum),
  5809. DutyDeskNum = datas.Sum(p => p.DutyDeskNum),
  5810. });
  5811. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderCenterAcceptVo>(dto.ColumnInfos);
  5812. var dtos = datas
  5813. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptVo), dynamicClass))
  5814. .Cast<object>()
  5815. .ToList();
  5816. var stream = ExcelHelper.CreateStream(dtos);
  5817. return ExcelStreamResult(stream, "中心受理统计");
  5818. }
  5819. /// <summary>
  5820. /// 中心受理值班坐席统计
  5821. /// </summary>
  5822. /// <param name="dto"></param>
  5823. /// <returns></returns>
  5824. [HttpGet("center-accept-user")]
  5825. public async Task<PagedDto<OrderCenterAcceptUserVo>> OrderCenterAcceptUser([FromQuery] OrderCenterAcceptPagedRequest dto)
  5826. {
  5827. var (total, items) = await _orderApplication.OrderCenterAcceptUser(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  5828. return new PagedDto<OrderCenterAcceptUserVo>(total, items);
  5829. }
  5830. /// <summary>
  5831. /// 中心受理值班坐席统计导出
  5832. /// </summary>
  5833. /// <param name="dto"></param>
  5834. /// <returns></returns>
  5835. [HttpPost("center-accept-user-export")]
  5836. [LogFilterAlpha("导出日志")]
  5837. public async Task<FileStreamResult> OrderCenterAcceptUserExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  5838. {
  5839. var query = _orderApplication.OrderCenterAcceptUser(dto.QueryDto);
  5840. List<OrderCenterAcceptUserVo> datas;
  5841. if (dto.IsExportAll)
  5842. {
  5843. datas = await query.ToListAsync(HttpContext.RequestAborted);
  5844. }
  5845. else
  5846. {
  5847. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5848. datas = items;
  5849. }
  5850. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderCenterAcceptUserVo>(dto.ColumnInfos);
  5851. var dtos = datas
  5852. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptUserVo), dynamicClass))
  5853. .Cast<object>()
  5854. .ToList();
  5855. var stream = ExcelHelper.CreateStream(dtos);
  5856. return ExcelStreamResult(stream, "中心受理值班坐席统计");
  5857. }
  5858. /// <summary>
  5859. /// 中心受理时间段统计
  5860. /// </summary>
  5861. /// <param name="dto"></param>
  5862. /// <returns></returns>
  5863. [HttpGet("center-accept-hour")]
  5864. public async Task<List<OrderCenterAcceptHourVo>> OrderCenterAcceptHour([FromQuery] OrderCenterAcceptPagedRequest dto)
  5865. {
  5866. var items = await _orderRepository.OrderCenterAcceptHour(dto).ToListAsync(HttpContext.RequestAborted);
  5867. return items;
  5868. }
  5869. /// <summary>
  5870. /// 中心受理时间段统计导出
  5871. /// </summary>
  5872. /// <param name="dto"></param>
  5873. /// <returns></returns>
  5874. [HttpPost("center-accept-hour-export")]
  5875. [LogFilterAlpha("导出日志")]
  5876. public async Task<FileStreamResult> OrderCenterAcceptHourExport([FromBody] ExportExcelDto<OrderCenterAcceptPagedRequest> dto)
  5877. {
  5878. var query = _orderRepository.OrderCenterAcceptHour(dto.QueryDto);
  5879. List<OrderCenterAcceptHourVo> datas;
  5880. if (dto.IsExportAll)
  5881. {
  5882. datas = await query.ToListAsync(HttpContext.RequestAborted);
  5883. }
  5884. else
  5885. {
  5886. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5887. datas = items;
  5888. }
  5889. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderCenterAcceptHourVo>(dto.ColumnInfos);
  5890. var dtos = datas
  5891. .Select(stu => _mapper.Map(stu, typeof(OrderCenterAcceptHourVo), dynamicClass))
  5892. .Cast<object>()
  5893. .ToList();
  5894. var stream = ExcelHelper.CreateStream(dtos);
  5895. return ExcelStreamResult(stream, "中心受理时间段统计");
  5896. }
  5897. /// <summary>
  5898. /// 数据清单基础数据
  5899. /// </summary>
  5900. /// <returns></returns>
  5901. [HttpGet("order-data-inventory-basedata")]
  5902. public async Task<object> OrderDataInventoryBaseData()
  5903. {
  5904. var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
  5905. var definition = wfModule.Definition;
  5906. return new
  5907. {
  5908. OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
  5909. ChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel),
  5910. ScreenStatusOptions = EnumExts.GetDescriptions<EScreenStatus>(),
  5911. AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
  5912. IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
  5913. FromGenderOptions = EnumExts.GetDescriptions<EGender>(),
  5914. ExpiredStatusOptions = EnumExts.GetDescriptions<EExpiredStatusEx>(),
  5915. PushTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.PushType),
  5916. CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
  5917. OrgsOptions = await _organizeRepository.GetOrgJson(),
  5918. GenderOptions = EnumExts.GetDescriptions<EGender>(),
  5919. };
  5920. }
  5921. /// <summary>
  5922. /// 数据清单
  5923. /// </summary>
  5924. /// <param name="dto"></param>
  5925. /// <returns></returns>
  5926. [HttpGet("order-data-inventory")]
  5927. public async Task<PagedDto<OrderDataInventoryRep>> OrderDataInventory([FromQuery] OrderDataInventoryReq dto)
  5928. {
  5929. var (total, items) = await _orderRepository.OrderDataInventory(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  5930. return new PagedDto<OrderDataInventoryRep>() { Total = total, Items = items };
  5931. }
  5932. /// <summary>
  5933. /// 数据清单导出
  5934. /// </summary>
  5935. /// <param name="dto"></param>
  5936. /// <returns></returns>
  5937. [HttpPost("order-data-inventory-export")]
  5938. [LogFilterAlpha("导出日志")]
  5939. public async Task<FileStreamResult> OrderDataInventoryExport([FromBody] ExportExcelDto<OrderDataInventoryReq> dto)
  5940. {
  5941. var query = _orderRepository.OrderDataInventory(dto.QueryDto);
  5942. List<OrderDataInventoryRep> orders;
  5943. if (dto.IsExportAll)
  5944. {
  5945. orders = await query.ToListAsync(HttpContext.RequestAborted);
  5946. }
  5947. else
  5948. {
  5949. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  5950. orders = items;
  5951. }
  5952. var ordersDtos = _mapper.Map<ICollection<OrderDataInventoryRep>>(orders);
  5953. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDataInventoryRep>(dto.ColumnInfos);
  5954. var dtos = ordersDtos
  5955. .Select(stu => _mapper.Map(stu, typeof(OrderDataInventoryRep), dynamicClass))
  5956. .Cast<object>()
  5957. .ToList();
  5958. var stream = ExcelHelper.CreateStream(dtos);
  5959. return ExcelStreamResult(stream, "数据清单明细");
  5960. }
  5961. #region 智能回访统计
  5962. /// <summary>
  5963. /// 智能回访数据统计
  5964. /// </summary>
  5965. /// <param name="dto"></param>
  5966. /// <returns></returns>
  5967. [HttpGet("aivisit-statistics")]
  5968. public async Task<QueryAiVisitStatisticsResp> QueryAiVisitStatistics([FromQuery] QueryAiVisitStatisticsRequest dto)
  5969. {
  5970. var model = await _orderRepository.QueryAiVisitStatistics(dto);
  5971. return model;
  5972. }
  5973. /// <summary>
  5974. /// 智能回访有效性分析
  5975. /// </summary>
  5976. /// <param name="dto"></param>
  5977. /// <returns></returns>
  5978. [HttpGet("aivisit-effective-analysis")]
  5979. public async Task<QueryAiVisitEffectiveAnalysisResp> QueryAiVisitEffectiveAnalysis([FromQuery] QueryAiVisitStatisticsRequest dto)
  5980. {
  5981. var model = await _orderRepository.QueryAiVisitEffectiveAnalysis(dto);
  5982. return model;
  5983. }
  5984. #endregion
  5985. /// <summary>
  5986. /// 扭转信件统计
  5987. /// </summary>
  5988. /// <param name="dto"></param>
  5989. /// <returns></returns>
  5990. [HttpGet("ordervisit-jude-statistics")]
  5991. public async Task<List<OrderVisitJudeStatisticsRep>> OrderVisitJudeStatistics([FromQuery] OrderVisitJudeStatisticsReq dto)
  5992. {
  5993. var list = await _orderApplication.OrderVisitJudeStatistics(dto).ToListAsync();
  5994. return list;
  5995. }
  5996. /// <summary>
  5997. /// 扭转信件统计
  5998. /// </summary>
  5999. /// <param name="dto"></param>
  6000. /// <returns></returns>
  6001. [HttpPost("ordervisit-jude-statistics-export")]
  6002. [LogFilterAlpha("导出日志")]
  6003. public async Task<FileStreamResult> OrderVisitJudeStatisticsExport([FromBody] ExportExcelDto<OrderVisitJudeStatisticsReq> dto)
  6004. {
  6005. var query = _orderApplication.OrderVisitJudeStatistics(dto.QueryDto);
  6006. List<OrderVisitJudeStatisticsRep> exportList;
  6007. exportList = await query.ToListAsync(HttpContext.RequestAborted);
  6008. var ordersDtos = _mapper.Map<ICollection<OrderVisitJudeStatisticsRep>>(exportList);
  6009. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderVisitJudeStatisticsRep>(dto.ColumnInfos);
  6010. var dtos = ordersDtos
  6011. .Select(stu => _mapper.Map(stu, typeof(OrderVisitJudeStatisticsRep), dynamicClass))
  6012. .Cast<object>()
  6013. .ToList();
  6014. var stream = ExcelHelper.CreateStream(dtos);
  6015. return ExcelStreamResult(stream, "扭转信件统计");
  6016. }
  6017. /// <summary>
  6018. /// 工单热词分析
  6019. /// </summary>
  6020. /// <param name="dto"></param>
  6021. /// <returns></returns>
  6022. [HttpGet("query_order_ts_details_list")]
  6023. public async Task<PagedDto<OrderTsDetailsDto>> QueryOrderTsDetailsList([FromQuery] PagedKeywordRequest dto)
  6024. {
  6025. var (total, items) = await _orderApplication.QueryOrderTsDetailsList(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  6026. return new PagedDto<OrderTsDetailsDto>(total, _mapper.Map<IReadOnlyList<OrderTsDetailsDto>>(items));
  6027. }
  6028. /// <summary>
  6029. /// 工单热词分析导出
  6030. /// </summary>
  6031. /// <param name="dto"></param>
  6032. /// <returns></returns>
  6033. [HttpPost("query_order_ts_details_list/export")]
  6034. [LogFilterAlpha("导出日志")]
  6035. public async Task<FileStreamResult> ExportQueryOrderTsDetailsList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
  6036. {
  6037. var query = _orderApplication.QueryOrderTsDetailsList(dto.QueryDto);
  6038. List<OrderTsDetailsDto> lists;
  6039. if (dto.IsExportAll)
  6040. {
  6041. lists = await query.ToListAsync(HttpContext.RequestAborted);
  6042. }
  6043. else
  6044. {
  6045. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  6046. lists = items;
  6047. }
  6048. var listDtos = _mapper.Map<ICollection<OrderTsDetailsDto>>(lists);
  6049. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderTsDetailsDto>(dto.ColumnInfos);
  6050. var dtos = listDtos
  6051. .Select(stu => _mapper.Map(stu, typeof(OrderTsDetailsDto), dynamicClass))
  6052. .Cast<object>()
  6053. .ToList();
  6054. var stream = ExcelHelper.CreateStream(dtos);
  6055. return ExcelStreamResult(stream, "工单热词分析数据");
  6056. }
  6057. /// <summary>
  6058. /// 根据热词查询工单
  6059. /// </summary>
  6060. /// <param name="KeyWord"></param>
  6061. /// <returns></returns>
  6062. [HttpGet("get_query_order_ts_details_order_list")]
  6063. public async Task<List<OrderTsDetails>> GetQueryOrderTsDetailslOrderList(string KeyWord)
  6064. {
  6065. return await _orderTsDetailsRepository.Queryable()
  6066. .LeftJoin<Order>((ot, o) => ot.OrderId == o.Id)
  6067. .Where((ot, o) => ot.Terms == KeyWord)
  6068. .Select((ot, o) => new OrderTsDetails
  6069. {
  6070. Id = ot.Id,
  6071. Terms = ot.Terms,
  6072. OrderId = o.Id,
  6073. Title = o.Title,
  6074. No = ot.No
  6075. })
  6076. .ToListAsync(HttpContext.RequestAborted);
  6077. }
  6078. /// <summary>
  6079. /// 知识库引用
  6080. /// </summary>
  6081. /// <param name="dto"></param>
  6082. /// <returns></returns>
  6083. [HttpGet("query_knowledge_quote_list")]
  6084. public async Task<PagedDto<OrderTsDetailsDto>> QueryKnowledgeQuoteList([FromQuery] PagedKeywordRequest dto)
  6085. {
  6086. var (total, items) = await _orderApplication.QueryKnowledgeQuoteList(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  6087. return new PagedDto<OrderTsDetailsDto>(total, _mapper.Map<IReadOnlyList<OrderTsDetailsDto>>(items));
  6088. }
  6089. /// <summary>
  6090. /// 知识库引用导出
  6091. /// </summary>
  6092. /// <param name="dto"></param>
  6093. /// <returns></returns>
  6094. [HttpPost("query_knowledge_quote_list/export")]
  6095. [LogFilterAlpha("导出日志")]
  6096. public async Task<FileStreamResult> ExportQueryKnowledgeQuoteList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
  6097. {
  6098. var query = _orderApplication.QueryKnowledgeQuoteList(dto.QueryDto);
  6099. List<OrderTsDetailsDto> lists;
  6100. if (dto.IsExportAll)
  6101. {
  6102. lists = await query.ToListAsync(HttpContext.RequestAborted);
  6103. }
  6104. else
  6105. {
  6106. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  6107. lists = items;
  6108. }
  6109. var listDtos = _mapper.Map<ICollection<OrderTsDetailsDto>>(lists);
  6110. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderTsDetailsDto>(dto.ColumnInfos);
  6111. var dtos = listDtos
  6112. .Select(stu => _mapper.Map(stu, typeof(OrderTsDetailsDto), dynamicClass))
  6113. .Cast<object>()
  6114. .ToList();
  6115. var stream = ExcelHelper.CreateStream(dtos);
  6116. return ExcelStreamResult(stream, "知识库引用数据");
  6117. }
  6118. /// <summary>
  6119. /// 根据知识库引用查询工单
  6120. /// </summary>
  6121. /// <param name="dto"></param>
  6122. /// <returns></returns>
  6123. [HttpGet("get_query_knowledge_quote_order_list")]
  6124. public async Task<List<KnowledgeQuote>> GetQueryKnowledgeQuoteOrderList([FromQuery] PagedKeywordRequest dto)
  6125. {
  6126. return await _knowledgeQuoteRepository.Queryable()
  6127. .LeftJoin<Order>((kn, o) => kn.OrderId == o.Id)
  6128. .Where((kn, o) => kn.KnowledgeId == dto.Keyword && kn.CreationTime >= dto.StartTime && kn.CreationTime <= dto.EndTime)
  6129. .Select((kn, o) => new KnowledgeQuote
  6130. {
  6131. KnowledgeId = kn.Id,
  6132. KnowledgeTitle = o.Title,
  6133. OrderId = o.Id,
  6134. Title = o.Title,
  6135. No = o.No,
  6136. })
  6137. .ToListAsync(HttpContext.RequestAborted);
  6138. }
  6139. /// <summary>
  6140. /// 超期退回统计
  6141. /// </summary>
  6142. /// <param name="dto"></param>
  6143. /// <returns></returns>
  6144. [HttpGet("extended_sendback_statistics")]
  6145. public async Task<List<ExtendedSendBackVo>> ExtendedSendBackStatistics([FromQuery] PagedKeywordRequest dto)
  6146. {
  6147. var quer = _orderApplication.ExtendedSendBackStatistics(dto);
  6148. var list = await quer.ToListAsync(HttpContext.RequestAborted);
  6149. list.Add(new ExtendedSendBackVo()
  6150. {
  6151. OrgName = "合计",
  6152. TotalNum = list.Sum(m => m.TotalNum),
  6153. PassNum = list.Sum(p => p.PassNum),
  6154. NoPassNum = list.Sum(m => m.NoPassNum),
  6155. AuditNum = list.Sum(m => m.AuditNum)
  6156. });
  6157. return list;
  6158. }
  6159. /// <summary>
  6160. /// 超期退回统计导出
  6161. /// </summary>
  6162. /// <returns></returns>
  6163. [HttpPost("extended_sendback_statistics/_export")]
  6164. [LogFilterAlpha("导出日志")]
  6165. public async Task<FileStreamResult> ExtendedSendBackStatisticsExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
  6166. {
  6167. var query = _orderApplication.ExtendedSendBackStatistics(dto.QueryDto);
  6168. List<ExtendedSendBackVo> data;
  6169. data = await query.ToListAsync(HttpContext.RequestAborted);
  6170. data.Add(new ExtendedSendBackVo()
  6171. {
  6172. OrgName = "合计",
  6173. TotalNum = data.Sum(m => m.TotalNum),
  6174. PassNum = data.Sum(p => p.PassNum),
  6175. NoPassNum = data.Sum(m => m.NoPassNum),
  6176. AuditNum = data.Sum(m => m.AuditNum)
  6177. });
  6178. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<ExtendedSendBackVo>(dto.ColumnInfos);
  6179. var dtos = data
  6180. .Select(stu => _mapper.Map(stu, typeof(ExtendedSendBackVo), dynamicClass))
  6181. .Cast<object>()
  6182. .ToList();
  6183. var stream = ExcelHelper.CreateStream(dtos);
  6184. return ExcelStreamResult(stream, "超期退回统计");
  6185. }
  6186. /// <summary>
  6187. /// 超期退回统计明细
  6188. /// </summary>
  6189. /// <param name="dto"></param>
  6190. /// <returns></returns>
  6191. [HttpGet("extended_sendback_detail")]
  6192. public async Task<PagedDto<SendBackDto>> ExtendedSendBackDetail([FromQuery] ExtendedSendBackRequest dto)
  6193. {
  6194. var quer = _orderApplication.ExtendedSendBackDetail(dto);
  6195. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  6196. return new PagedDto<SendBackDto>(total, _mapper.Map<IReadOnlyList<SendBackDto>>(items));
  6197. }
  6198. /// <summary>
  6199. /// 超期退回统计明细导出
  6200. /// </summary>
  6201. /// <returns></returns>
  6202. [HttpPost("extended_sendback_detail/_export")]
  6203. [LogFilterAlpha("导出日志")]
  6204. public async Task<FileStreamResult> ExtendedSendBackDetailExport([FromBody] ExportExcelDto<ExtendedSendBackRequest> dto)
  6205. {
  6206. var query = _orderApplication.ExtendedSendBackDetail(dto.QueryDto);
  6207. List<OrderSendBackAudit> data;
  6208. if (dto.IsExportAll)
  6209. {
  6210. data = await query.ToListAsync(HttpContext.RequestAborted);
  6211. }
  6212. else
  6213. {
  6214. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  6215. data = items;
  6216. }
  6217. var dataDtos = _mapper.Map<ICollection<SendBackDto>>(data);
  6218. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SendBackDto>(dto.ColumnInfos);
  6219. var dtos = dataDtos
  6220. .Select(stu => _mapper.Map(stu, typeof(SendBackDto), dynamicClass))
  6221. .Cast<object>()
  6222. .ToList();
  6223. var stream = ExcelHelper.CreateStream(dtos);
  6224. return ExcelStreamResult(stream, "超期退回统计明细");
  6225. }
  6226. /// <summary>
  6227. /// 列表页面基础数据
  6228. /// </summary>
  6229. /// <returns></returns>
  6230. [HttpGet("extended_sendback_detail/base-data")]
  6231. public async Task<object> ExtendedSendBackDetailBaseData()
  6232. {
  6233. var rsp = new
  6234. {
  6235. AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
  6236. ChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel),
  6237. SendBackAuditState = EnumExts.GetDescriptions<ESendBackAuditState>()
  6238. };
  6239. return rsp;
  6240. }
  6241. /// <summary>
  6242. /// 网上群众路线通报
  6243. /// </summary>
  6244. /// <param name="dto"></param>
  6245. /// <returns></returns>
  6246. [HttpGet("onlinemassline-report")]
  6247. public async Task<List<OnlineMassLineReportRes>> OnlineMassLineReport([FromQuery] OnlineMassLineReportRequest dto)
  6248. {
  6249. var nowList = await _orderRepository.Queryable()
  6250. .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime).ToListAsync();
  6251. var oldList = await _orderRepository.Queryable()
  6252. .Where(x => x.CreationTime >= dto.ChainStartTime && x.CreationTime <= dto.ChainEndTime).ToListAsync();
  6253. var returnList = new List<OnlineMassLineReportRes>();
  6254. //市12345政务服务便民热线
  6255. var Other = new OnlineMassLineReportRes();
  6256. Other.SourceChannel = "市12345政务服务便民热线";
  6257. Other.SumCount = nowList.Where(x => x.IsProvince == false && x.SourceChannelCode != "SZYSM").Count(); //市12345政务服务便民热线
  6258. Other.PreviousCount = oldList.Where(x => x.IsProvince == false && x.SourceChannelCode != "SZYSM").Count(); //市12345政务服务便民热线
  6259. returnList.Add(Other);
  6260. //中国政府网“我向总理说句话”
  6261. var ZGZFW = new OnlineMassLineReportRes();
  6262. ZGZFW.SourceChannel = "中国政府网“我向总理说句话”";
  6263. ZGZFW.SumCount = nowList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("ZGZFW")).Count(); //中国政府网“我向总理说句话”
  6264. ZGZFW.PreviousCount = oldList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("ZGZFW")).Count(); //中国政府网“我向总理说句话”
  6265. returnList.Add(ZGZFW);
  6266. //国家政务服务平台“投诉与建议”
  6267. var GJZWFWPT = new OnlineMassLineReportRes();
  6268. GJZWFWPT.SourceChannel = "国家政务服务平台“投诉与建议”";
  6269. GJZWFWPT.SumCount = nowList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("GJZWFWPT")).Count(); //国家政务服务平台“投诉与建议”
  6270. GJZWFWPT.PreviousCount = oldList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("GJZWFWPT")).Count(); //国家政务服务平台“投诉与建议”
  6271. returnList.Add(GJZWFWPT);
  6272. //省12345政务服务便民热线
  6273. var Province12345 = new OnlineMassLineReportRes();
  6274. Province12345.SourceChannel = "省12345政务服务便民热线";
  6275. Province12345.SumCount = nowList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("GJZWFWPT") == false && x.ReceiveProvinceNo.StartsWith("ZGZFW") == false).Count(); //国家政务服务平台“投诉与建议”
  6276. Province12345.PreviousCount = oldList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("GJZWFWPT") == false && x.ReceiveProvinceNo.StartsWith("ZGZFW") == false).Count(); //国家政务服务平台“投诉与建议”
  6277. returnList.Add(Province12345);
  6278. //市政府网站“市长与网民”
  6279. var SZYSM = new OnlineMassLineReportRes();
  6280. SZYSM.SourceChannel = "市政府网站“市长与网民”";
  6281. SZYSM.SumCount = nowList.Where(x => x.SourceChannelCode == "SZYSM").Count(); //国家政务服务平台“投诉与建议”
  6282. SZYSM.PreviousCount = oldList.Where(x => x.SourceChannelCode == "SZYSM").Count(); //国家政务服务平台“投诉与建议”
  6283. returnList.Add(SZYSM);
  6284. return returnList;
  6285. }
  6286. /// <summary>
  6287. /// 网上群众路线通报导出
  6288. /// </summary>
  6289. /// <param name="dto"></param>
  6290. /// <returns></returns>
  6291. [HttpPost("onlinemassline-report/export")]
  6292. [LogFilterAlpha("导出日志")]
  6293. public async Task<FileStreamResult> OnlineMassLineReportExport([FromBody] ExportExcelDto<OnlineMassLineReportRequest> dto)
  6294. {
  6295. var nowList = await _orderRepository.Queryable()
  6296. .Where(x => x.CreationTime >= dto.QueryDto.StartTime && x.CreationTime <= dto.QueryDto.EndTime).ToListAsync();
  6297. var oldList = await _orderRepository.Queryable()
  6298. .Where(x => x.CreationTime >= dto.QueryDto.ChainStartTime && x.CreationTime <= dto.QueryDto.ChainEndTime).ToListAsync();
  6299. var returnList = new List<OnlineMassLineReportRes>();
  6300. //市12345政务服务便民热线
  6301. var Other = new OnlineMassLineReportRes();
  6302. Other.SourceChannel = "市12345政务服务便民热线";
  6303. Other.SumCount = nowList.Where(x => x.IsProvince == false && x.SourceChannelCode != "SZYSM").Count(); //市12345政务服务便民热线
  6304. Other.PreviousCount = oldList.Where(x => x.IsProvince == false && x.SourceChannelCode != "SZYSM").Count(); //市12345政务服务便民热线
  6305. returnList.Add(Other);
  6306. //中国政府网“我向总理说句话”
  6307. var ZGZFW = new OnlineMassLineReportRes();
  6308. ZGZFW.SourceChannel = "中国政府网“我向总理说句话”";
  6309. ZGZFW.SumCount = nowList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("ZGZFW")).Count(); //中国政府网“我向总理说句话”
  6310. ZGZFW.PreviousCount = oldList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("ZGZFW")).Count(); //中国政府网“我向总理说句话”
  6311. returnList.Add(ZGZFW);
  6312. //国家政务服务平台“投诉与建议”
  6313. var GJZWFWPT = new OnlineMassLineReportRes();
  6314. GJZWFWPT.SourceChannel = "国家政务服务平台“投诉与建议”";
  6315. GJZWFWPT.SumCount = nowList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("GJZWFWPT")).Count(); //国家政务服务平台“投诉与建议”
  6316. GJZWFWPT.PreviousCount = oldList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("GJZWFWPT")).Count(); //国家政务服务平台“投诉与建议”
  6317. returnList.Add(GJZWFWPT);
  6318. //省12345政务服务便民热线
  6319. var Province12345 = new OnlineMassLineReportRes();
  6320. Province12345.SourceChannel = "省12345政务服务便民热线";
  6321. Province12345.SumCount = nowList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("GJZWFWPT") == false && x.ReceiveProvinceNo.StartsWith("ZGZFW") == false).Count(); //国家政务服务平台“投诉与建议”
  6322. Province12345.PreviousCount = oldList.Where(x => x.IsProvince == true && x.ReceiveProvinceNo.StartsWith("GJZWFWPT") == false && x.ReceiveProvinceNo.StartsWith("ZGZFW") == false).Count(); //国家政务服务平台“投诉与建议”
  6323. returnList.Add(Province12345);
  6324. //市政府网站“市长与网民”
  6325. var SZYSM = new OnlineMassLineReportRes();
  6326. SZYSM.SourceChannel = "市政府网站“市长与网民”";
  6327. SZYSM.SumCount = nowList.Where(x => x.SourceChannelCode == "SZYSM").Count(); //国家政务服务平台“投诉与建议”
  6328. SZYSM.PreviousCount = oldList.Where(x => x.SourceChannelCode == "SZYSM").Count(); //国家政务服务平台“投诉与建议”
  6329. returnList.Add(SZYSM);
  6330. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OnlineMassLineReportRes>(dto.ColumnInfos);
  6331. var dtos = _mapper.Map<ICollection<OnlineMassLineReportRes>>(returnList)
  6332. .Select(stu => _mapper.Map(stu, typeof(OnlineMassLineReportRes), dynamicClass))
  6333. .Cast<object>()
  6334. .ToList();
  6335. var stream = ExcelHelper.CreateStream(dtos);
  6336. return ExcelStreamResult(stream, "网上群众路线统计");
  6337. }
  6338. /// <summary>
  6339. /// 部门退回中心统计
  6340. /// </summary>
  6341. /// <param name="dto"></param>
  6342. /// <returns></returns>
  6343. [HttpGet("org_sendback_statistics")]
  6344. public async Task<List<OrgSendBackAuditListVo>> OrgSendBackAuditStatistics([FromQuery] OrgSendBackAuditListDto dto)
  6345. {
  6346. var quer = _orderApplication.OrgSendBackAuditList(dto);
  6347. var list = await quer.ToListAsync(HttpContext.RequestAborted);
  6348. list.Add(new OrgSendBackAuditListVo()
  6349. {
  6350. OrgName = "合计",
  6351. Num = list.Sum(m => m.Num),
  6352. });
  6353. return list;
  6354. }
  6355. /// <summary>
  6356. /// 部门退回中心统计
  6357. /// </summary>
  6358. /// <returns></returns>
  6359. [HttpPost("org_sendback_statistics/_export")]
  6360. [LogFilterAlpha("导出日志")]
  6361. public async Task<FileStreamResult> OrgSendBackAuditStatisticsExport([FromBody] ExportExcelDto<OrgSendBackAuditListDto> dto)
  6362. {
  6363. var query = _orderApplication.OrgSendBackAuditList(dto.QueryDto);
  6364. List<OrgSendBackAuditListVo> data;
  6365. data = await query.ToListAsync(HttpContext.RequestAborted);
  6366. data.Add(new OrgSendBackAuditListVo()
  6367. {
  6368. OrgName = "合计",
  6369. Num = data.Sum(m => m.Num),
  6370. });
  6371. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrgSendBackAuditListVo>(dto.ColumnInfos);
  6372. var dtos = data
  6373. .Select(stu => _mapper.Map(stu, typeof(OrgSendBackAuditListVo), dynamicClass))
  6374. .Cast<object>()
  6375. .ToList();
  6376. var stream = ExcelHelper.CreateStream(dtos);
  6377. return ExcelStreamResult(stream, "部门退回统计");
  6378. }
  6379. /// <summary>
  6380. /// 部门退回中心统计明细
  6381. /// </summary>
  6382. /// <param name="dto"></param>
  6383. /// <returns></returns>
  6384. [HttpGet("org_sendback_detail")]
  6385. public async Task<PagedDto<SendBackDto>> OrgSendBackDetail([FromQuery] OrgSendBackAuditListDto dto)
  6386. {
  6387. var quer = _orderApplication.OrgSendBackAuditDetail(dto);
  6388. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  6389. return new PagedDto<SendBackDto>(total, _mapper.Map<IReadOnlyList<SendBackDto>>(items));
  6390. }
  6391. /// <summary>
  6392. /// 部门退回中心统计明细导出
  6393. /// </summary>
  6394. /// <returns></returns>
  6395. [HttpPost("org_sendback_detail/_export")]
  6396. [LogFilterAlpha("导出日志")]
  6397. public async Task<FileStreamResult> OrgSendBackDetailExport([FromBody] ExportExcelDto<OrgSendBackAuditListDto> dto)
  6398. {
  6399. var query = _orderApplication.OrgSendBackAuditDetail(dto.QueryDto);
  6400. List<OrderSendBackAudit> data;
  6401. if (dto.IsExportAll)
  6402. {
  6403. data = await query.ToListAsync(HttpContext.RequestAborted);
  6404. }
  6405. else
  6406. {
  6407. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  6408. data = items;
  6409. }
  6410. var dataDtos = _mapper.Map<ICollection<SendBackDto>>(data);
  6411. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SendBackDto>(dto.ColumnInfos);
  6412. var dtos = dataDtos
  6413. .Select(stu => _mapper.Map(stu, typeof(SendBackDto), dynamicClass))
  6414. .Cast<object>()
  6415. .ToList();
  6416. var stream = ExcelHelper.CreateStream(dtos);
  6417. return ExcelStreamResult(stream, "部门退回统计明细");
  6418. }
  6419. /// <summary>
  6420. /// 坐席退回中心统计
  6421. /// </summary>
  6422. /// <param name="dto"></param>
  6423. /// <returns></returns>
  6424. [HttpGet("seat_sendback_statistics")]
  6425. public async Task<List<SeatSendBackStatisticsVo>> SeatSendBackStatistics([FromQuery] PagedKeywordRequest dto)
  6426. {
  6427. var quer = _orderApplication.SeatSendBackStatistics(dto);
  6428. var list = await quer.ToListAsync(HttpContext.RequestAborted);
  6429. list.Add(new SeatSendBackStatisticsVo()
  6430. {
  6431. UserName = "合计",
  6432. SendOrderNum = list.Sum(m => m.SendOrderNum),
  6433. SendOrderBackNum = list.Sum(m => m.SendOrderBackNum),
  6434. SendOrderBackNumber = list.Sum(m => m.SendOrderBackNumber),
  6435. CentreFileNum = list.Sum(m => m.CentreFileNum),
  6436. CentreFileBackNum = list.Sum(m => m.CentreFileBackNum),
  6437. CentreFileBackNumber = list.Sum(m => m.CentreFileBackNumber),
  6438. });
  6439. return list;
  6440. }
  6441. /// <summary>
  6442. /// 坐席退回中心统计
  6443. /// </summary>
  6444. /// <returns></returns>
  6445. [HttpPost("seat_sendback_statistics/_export")]
  6446. [LogFilterAlpha("导出日志")]
  6447. public async Task<FileStreamResult> SeatSendBackStatisticsExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
  6448. {
  6449. var query = _orderApplication.SeatSendBackStatistics(dto.QueryDto);
  6450. List<SeatSendBackStatisticsVo> data;
  6451. data = await query.ToListAsync(HttpContext.RequestAborted);
  6452. data.Add(new SeatSendBackStatisticsVo()
  6453. {
  6454. UserName = "合计",
  6455. SendOrderNum = data.Sum(m => m.SendOrderNum),
  6456. SendOrderBackNum = data.Sum(m => m.SendOrderBackNum),
  6457. SendOrderBackNumber = data.Sum(m => m.SendOrderBackNumber),
  6458. CentreFileNum = data.Sum(m => m.CentreFileNum),
  6459. CentreFileBackNum = data.Sum(m => m.CentreFileBackNum),
  6460. CentreFileBackNumber = data.Sum(m => m.CentreFileBackNumber),
  6461. });
  6462. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<SeatSendBackStatisticsVo>(dto.ColumnInfos);
  6463. var dtos = data
  6464. .Select(stu => _mapper.Map(stu, typeof(SeatSendBackStatisticsVo), dynamicClass))
  6465. .Cast<object>()
  6466. .ToList();
  6467. var stream = ExcelHelper.CreateStream(dtos);
  6468. return ExcelStreamResult(stream, "坐席退回统计");
  6469. }
  6470. /// <summary>
  6471. /// 坐席退回统计明细
  6472. /// </summary>
  6473. /// <param name="dto"></param>
  6474. /// <returns></returns>
  6475. [HttpGet("seat_sendback_detail")]
  6476. public async Task<PagedDto<OrderDto>> SeatSendBackStatisticsDetail([FromQuery] SeatSendBackStatisticsDetail dto)
  6477. {
  6478. var quer = _orderApplication.SeatSendBackStatisticsDetail(dto);
  6479. var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
  6480. return new PagedDto<OrderDto>(total, items);
  6481. }
  6482. /// <summary>
  6483. /// 坐席退回统计明细导出
  6484. /// </summary>
  6485. /// <returns></returns>
  6486. [HttpPost("seat_sendback_detail/_export")]
  6487. [LogFilterAlpha("导出日志")]
  6488. public async Task<FileStreamResult> SeatSendBackStatisticsDetailExport([FromBody] ExportExcelDto<SeatSendBackStatisticsDetail> dto)
  6489. {
  6490. var query = _orderApplication.SeatSendBackStatisticsDetail(dto.QueryDto);
  6491. List<OrderDto> data;
  6492. if (dto.IsExportAll)
  6493. {
  6494. data = await query.ToListAsync(HttpContext.RequestAborted);
  6495. }
  6496. else
  6497. {
  6498. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  6499. data = items;
  6500. }
  6501. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<OrderDto>(dto.ColumnInfos);
  6502. var dtos = data
  6503. .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
  6504. .Cast<object>()
  6505. .ToList();
  6506. var stream = ExcelHelper.CreateStream(dtos);
  6507. return ExcelStreamResult(stream, "坐席退回统计明细");
  6508. }
  6509. }
  6510. }