BiOrderController.cs 163 KB

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