EnforcementOrderController.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. using Hotline.Application.FlowEngine;
  2. using Hotline.Caching.Interfaces;
  3. using Hotline.FlowEngine.WorkflowModules;
  4. using Hotline.JudicialManagement;
  5. using Hotline.Orders;
  6. using Hotline.Repository.SqlSugar.Extensions;
  7. using Hotline.Settings;
  8. using Hotline.Settings.TimeLimits;
  9. using Hotline.Share.Dtos;
  10. using Hotline.Share.Dtos.JudicialManagement;
  11. using Hotline.Share.Dtos.Order;
  12. using Hotline.Share.Enums.Order;
  13. using MapsterMapper;
  14. using Microsoft.AspNetCore.Authorization;
  15. using Microsoft.AspNetCore.Mvc;
  16. using Org.BouncyCastle.Utilities;
  17. using Polly.Caching;
  18. using SqlSugar;
  19. using XF.Domain.Authentications;
  20. using XF.Domain.Exceptions;
  21. using XF.Domain.Repository;
  22. using XF.Utility.EnumExtensions;
  23. namespace Hotline.Api.Controllers
  24. {
  25. public class EnforcementOrderController : BaseController
  26. {
  27. private readonly IRepository<EnforcementOrderHander> _enforcementOrderHanderRepository;
  28. private readonly IRepository<EnforcementOrders> _enforcementOrdersRepository;
  29. private readonly IRepository<JudicialComplaintsEventType> _judicialComplaintsEventTypeRepository;
  30. private readonly IRepository<EnforcementHotspot> _enforcementHotspotRepository;
  31. private readonly IMapper _mapper;
  32. private readonly IWorkflowApplication _workflowApplication;
  33. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  34. private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
  35. private readonly ISessionContext _sessionContext;
  36. private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
  37. private readonly IRepository<SystemArea> _systemAreaRepository;
  38. public EnforcementOrderController(IRepository<EnforcementOrderHander> enforcementOrderHanderRepository,
  39. IRepository<EnforcementOrders> enforcementOrdersRepository,
  40. IRepository<JudicialComplaintsEventType> judicialComplaintsEventTypeRepository,
  41. IRepository<EnforcementHotspot> enforcementHotspotRepository,
  42. IMapper mapper,
  43. IWorkflowApplication workflowApplication,
  44. ISystemDicDataCacheManager sysDicDataCacheManager,
  45. IRepository<SystemOrganize> systemOrganizeRepository,
  46. ISessionContext sessionContext,
  47. IRepository<OrderVisitDetail> orderVisitDetailRepository,
  48. IRepository<SystemArea> systemAreaRepository)
  49. {
  50. _enforcementOrderHanderRepository = enforcementOrderHanderRepository;
  51. _enforcementOrdersRepository = enforcementOrdersRepository;
  52. _judicialComplaintsEventTypeRepository = judicialComplaintsEventTypeRepository;
  53. _enforcementHotspotRepository = enforcementHotspotRepository;
  54. _mapper = mapper;
  55. _workflowApplication = workflowApplication;
  56. _sysDicDataCacheManager = sysDicDataCacheManager;
  57. _systemOrganizeRepository = systemOrganizeRepository;
  58. _sessionContext = sessionContext;
  59. _orderVisitDetailRepository = orderVisitDetailRepository;
  60. _systemAreaRepository = systemAreaRepository;
  61. }
  62. /// <summary>
  63. /// 司法行政监督管理工单查询
  64. /// </summary>
  65. /// <param name="dto"></param>
  66. /// <returns></returns>
  67. [HttpGet("getorderlist")]
  68. public async Task<PagedDto<EnforcementOrderListDto>> GetOrderList([FromQuery] QueryEnforcementOrderDto dto)
  69. {
  70. var (total, items) = await _enforcementOrdersRepository.Queryable()
  71. .Includes(x => x.Order)
  72. .Where(d => d.Order.Id != null)
  73. .WhereIF(dto.IsEnforcementOrder.HasValue, d => d.IsEnforcementOrder == dto.IsEnforcementOrder)//是否行政执法类
  74. .WhereIF(dto.IsPassTheBuckOrder.HasValue, d => d.IsPassTheBuckOrder == dto.IsPassTheBuckOrder)//是否推诿
  75. .WhereIF(dto.IsTheClueTrue.HasValue, d => d.IsTheClueTrue == dto.IsTheClueTrue)//线索是否属实
  76. .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => dto.EventTypeId == d.EventTypeId)//事项分类
  77. .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Order.Title.Contains(dto.Title!)) //标题
  78. .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.Order.ProvinceNo.Contains(dto.ProvinceNo)) //省本地编号
  79. .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.Order.No.Contains(dto.No)) //工单编码
  80. .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.Order.AcceptTypeCode)) //受理类型
  81. .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.Order.SourceChannelCode)) //来源渠道
  82. .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.Order.HotspotId)) //热点类型
  83. .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.Order.TransferPhone.Contains(dto.TransferPhone!)) //转接号码
  84. .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.Order.ActualHandleOrgCode)) //接办部门
  85. .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.Order.AcceptorName.Contains(dto.NameOrNo!) || d.Order.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
  86. .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart) //受理时间开始
  87. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd) //受理时间结束
  88. .WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.Order.EmergencyLevel)) //紧急程度
  89. .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.Order.FromPhone.Contains(dto.FromPhone)) //来电号码
  90. .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Order.Contact.Contains(dto.PhoneNo!)) //联系电话
  91. .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.Order.PushTypeCode == dto.PushTypeCode) //推送分类
  92. .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.Order.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
  93. .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.Order.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
  94. .WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Order.Status)) //工单状态
  95. .WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Order.Status <= EOrderStatus.SpecialToUnAccept)
  96. .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.Order.ActualHandlerName.Contains(dto.ActualHandlerName)) //接办人
  97. .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.Order.ActualHandleStepCode == dto.CurrentStepCode) //当前办理节点
  98. .WhereIF(dto.ActualHandleTimeStart.HasValue, d => d.Order.ActualHandleTime >= dto.ActualHandleTimeStart) //办结时间开始
  99. .WhereIF(dto.ActualHandleTimeEnd.HasValue, d => d.Order.ActualHandleTime <= dto.ActualHandleTimeEnd) //办结时间结束
  100. .WhereIF(dto.IsOverTime == true, d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) || (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期
  101. .WhereIF(dto.IsOverTime == false, d => (d.Order.ExpiredTime > DateTime.Now && d.Order.Status < EOrderStatus.Filed) || (d.Order.ExpiredTime > d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //否 超期
  102. .WhereIF(dto.IdentityType != null, d => d.Order.IdentityType == dto.IdentityType) //来电主体
  103. .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.Order.FromName.Contains(dto.FromName)) //来电人姓名
  104. .WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.Order.AreaCode)) //区域
  105. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, x => x.Order.IsProvince == true)
  106. .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, x => x.Order.IsProvince == false)
  107. .OrderByDescending(d => d.CreationTime)
  108. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  109. var data = _mapper.Map<List<EnforcementOrderListDto>>(items);
  110. if (_sessionContext.RequiredOrgId == "001188")
  111. {
  112. foreach (var item in data)
  113. {
  114. if (item.IsTheClueTrue.HasValue)
  115. item.IsShowUpdateButton = true;
  116. }
  117. }
  118. return new PagedDto<EnforcementOrderListDto>(total, data);
  119. }
  120. /// <summary>
  121. /// 列表页面基础数据
  122. /// </summary>
  123. /// <returns></returns>
  124. [HttpGet("base-data")]
  125. public async Task<object> BaseData()
  126. {
  127. var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
  128. var definition = wfModule.Definition;
  129. var orgList = await _systemOrganizeRepository.Queryable().OrderBy(d => d.Id).ToTreeAsync(x => x.Children, it => it.ParentId, null);
  130. var judicialManagementOrg = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.JudicialManagementOrg);
  131. List<SystemOrganize> OrgsOptions = new();
  132. foreach (var item in judicialManagementOrg)
  133. {
  134. var tempOrg = orgList.Find(p => p.Id == item.DicDataValue);
  135. if (tempOrg != null)
  136. OrgsOptions.Add(tempOrg);
  137. }
  138. var rsp = new
  139. {
  140. AcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
  141. ChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel),
  142. OrgsOptions,
  143. EmergencyLevelOptions = EnumExts.GetDescriptions<EEmergencyLevel>(),
  144. PushTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.PushType),
  145. OrderStatusOptions = EnumExts.GetDescriptions<EOrderStatus>(),
  146. CurrentStepOptions = definition?.Steps.Select(x => new Kv(x.Code, x.Name)),
  147. IdentityTypeOptions = EnumExts.GetDescriptions<EIdentityType>(),
  148. EnforcementHotspot = await _enforcementHotspotRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null, it => it.Id)
  149. };
  150. return rsp;
  151. }
  152. /// <summary>
  153. /// 获取区域信息
  154. /// </summary>
  155. /// <returns></returns>
  156. [HttpGet("get_system_area")]
  157. public async Task<object> GetSystemAreaAsync()
  158. {
  159. return await _systemAreaRepository.Queryable()
  160. .Where(p => p.Id == "511500" || p.ParentId == "511500")
  161. .Select(p => new
  162. {
  163. p.AreaName,
  164. p.Id
  165. })
  166. .OrderBy(p => p.Id)
  167. .ToListAsync();
  168. }
  169. /// <summary>
  170. /// 线索核实
  171. /// </summary>
  172. /// <param name="dto"></param>
  173. /// <returns></returns>
  174. [HttpPost("clue_verification")]
  175. public async Task ClueVerificationAsync([FromBody] ClueVerificationDto dto)
  176. {
  177. if (dto.OrderIds == null || dto.OrderIds.Count == 0)
  178. throw UserFriendlyException.SameMessage("工单不能为空");
  179. if (dto.IsTheClueTrue.HasValue && dto.IsTheClueTrue.Value == true)
  180. {
  181. if (string.IsNullOrEmpty(dto.EventTypeId) || string.IsNullOrEmpty(dto.EventTypeName))
  182. throw UserFriendlyException.SameMessage("事项不能为空");
  183. }
  184. foreach (var item in dto.OrderIds)
  185. {
  186. var order = await _enforcementOrdersRepository.GetAsync(p => p.Id == item, HttpContext.RequestAborted);
  187. if (order == null)
  188. throw UserFriendlyException.SameMessage("工单查询失败");
  189. order.IsTheClueTrue = dto.IsTheClueTrue;
  190. if (!string.IsNullOrEmpty(dto.EventTypeName))
  191. order.EventTypeName = dto.EventTypeName;
  192. else
  193. order.EventTypeName = null;
  194. if (!string.IsNullOrEmpty(dto.EventTypeSpliceName))
  195. order.EventTypeSpliceName = dto.EventTypeSpliceName;
  196. else
  197. order.EventTypeSpliceName = null;
  198. if (!string.IsNullOrEmpty(dto.EventTypeId))
  199. {
  200. order.EventTypeOneLevelId = dto.EventTypeId.Substring(0, 2);
  201. order.EventTypeId = dto.EventTypeId;
  202. }
  203. else
  204. {
  205. order.EventTypeOneLevelId = null;
  206. order.EventTypeId = null;
  207. }
  208. await _enforcementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
  209. }
  210. }
  211. /// <summary>
  212. /// 行政执法活动投诉事项类型- 获取层级分类
  213. /// </summary>
  214. /// <returns></returns>
  215. [HttpGet("treelist")]
  216. public async Task<List<JudicialComplaintsEventType>> GetTreeList()
  217. {
  218. return await _judicialComplaintsEventTypeRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null, it => it.Id);
  219. }
  220. /// <summary>
  221. /// 事项分类统计
  222. /// </summary>
  223. /// <param name="StartDate"></param>
  224. /// <param name="EndDate"></param>
  225. /// <param name="Id"></param>
  226. /// <param name="AreaCode"></param>
  227. /// <returns></returns>
  228. [HttpGet("event_classification_statistics")]
  229. public async Task<object> GetEventClassificationStatisticsAsync(DateTime StartDate, DateTime EndDate, string Id, string AreaCode)
  230. {
  231. EndDate = EndDate.AddDays(1).AddSeconds(-1);
  232. var items = await _judicialComplaintsEventTypeRepository.Queryable()
  233. .LeftJoin<EnforcementOrders>((x, o) => o.EventTypeSpliceName != null && (x.EventTypeName == o.EventTypeSpliceName || o.EventTypeSpliceName.Contains(x.EventTypeName)))
  234. .LeftJoin<Order>((x, o, p) => p.Id == o.Id)
  235. .Where((x, o, p) => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
  236. .WhereIF(!string.IsNullOrEmpty(AreaCode), (x, o, p) => p.AreaCode == AreaCode)
  237. .Where((x, o, p) => x.ParentId == Id)
  238. .GroupBy((x, o, p) => new { x.Id, x.EventTypeName })
  239. .Select((x, o, p) => new
  240. {
  241. Id = x.Id,
  242. Name = x.EventTypeName,
  243. Num = SqlFunc.AggregateSum(SqlFunc.IIF(p.Id != null, 1, 0)),
  244. Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.EventTypeName != o.EventTypeName, 1, 0)) > 0,
  245. })
  246. .MergeTable()
  247. .ToListAsync();
  248. var total = new
  249. {
  250. Id = "0",
  251. Name = "合计",
  252. Num = items.Sum(x => x.Num),
  253. Sublevel = false
  254. };
  255. var data = await _enforcementOrdersRepository.Queryable()
  256. .Includes(x => x.Order)
  257. .Where(d => d.Order.Id != null)
  258. .Where(d => d.Order.CreationTime >= StartDate && d.Order.CreationTime <= EndDate)
  259. .GroupBy(d => d.Id)
  260. .Select(d => new EventClassificationOrderCountDto
  261. {
  262. TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
  263. TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
  264. EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder, 1, 0)),
  265. PassTheBuckOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0))
  266. })
  267. .ToListAsync();
  268. var orderCount = new
  269. {
  270. TheClueIsTrue = data.Sum(x => x.TheClueIsTrue),
  271. TheClueIsNotTrue = data.Sum(x => x.TheClueIsNotTrue),
  272. EnforcementOrder = data.Sum(x => x.EnforcementOrder),
  273. PassTheBuckOrder = data.Sum(x => x.PassTheBuckOrder),
  274. };
  275. return new { List = items, Total = total, OrderCount = orderCount };
  276. }
  277. /// <summary>
  278. /// 事项分类统计--明细
  279. /// </summary>
  280. /// <param name="dto"></param>
  281. /// <returns></returns>
  282. [HttpGet("event_classification_statistics_order_list")]
  283. public async Task<PagedDto<EnforcementOrderListDto>> GetEventClassificationStatisticsOrderListAsync([FromQuery] QueryEventClassificationStatisticsDto dto)
  284. {
  285. dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
  286. var (total, items) = await _enforcementOrdersRepository.Queryable()
  287. .Includes(x => x.Order)
  288. .Where(d => d.Order.Id != null)
  289. .Where(d => d.Order.CreationTime >= dto.StartDate && d.Order.CreationTime <= dto.EndDate)
  290. .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => d.EventTypeId == dto.EventTypeId)
  291. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.Order.AreaCode == dto.AreaCode)
  292. .OrderByDescending(d => d.CreationTime)
  293. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  294. return new PagedDto<EnforcementOrderListDto>(total, _mapper.Map<List<EnforcementOrderListDto>>(items));
  295. }
  296. /// <summary>
  297. /// 执法部门办件统计
  298. /// </summary>
  299. /// <param name="StartDate"></param>
  300. /// <param name="EndDate"></param>
  301. /// <returns></returns>
  302. [HttpGet("enforcement_departmental_processing_statistics")]
  303. public async Task<object> GetDepartmentalProcessingStatisticsAsync(DateTime StartDate, DateTime EndDate)
  304. {
  305. EndDate = EndDate.AddDays(1).AddSeconds(-1);
  306. var data = await _enforcementOrdersRepository.Queryable()
  307. .Includes(x => x.Order)
  308. .Where(d => d.Order.Id != null)
  309. .Where(d => d.Order.CreationTime >= StartDate && d.Order.CreationTime <= EndDate)
  310. .GroupBy(d => new
  311. {
  312. OrgCode = d.Order.OrgLevelOneCode,
  313. OrgName = d.Order.OrgLevelOneName
  314. })
  315. .Select(d => new
  316. {
  317. OrgCode = d.Order.OrgLevelOneCode,
  318. OrgName = d.Order.OrgLevelOneName,
  319. CountNum = SqlFunc.AggregateCount(d.Order.OrgLevelOneCode),
  320. TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
  321. TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
  322. EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder, 1, 0))
  323. })
  324. .ToListAsync();
  325. return data;
  326. }
  327. /// <summary>
  328. /// 执法部门办件统计---子级
  329. /// </summary>
  330. /// <param name="StartDate"></param>
  331. /// <param name="EndDate"></param>
  332. /// <param name="OrgCode"></param>
  333. /// <returns></returns>
  334. [HttpGet("enforcement_departmental_processing_statistics_child")]
  335. public async Task<object> GetDepartmentalProcessingStatisticsChildAsync(DateTime StartDate, DateTime EndDate, string OrgCode)
  336. {
  337. EndDate = EndDate.AddDays(1).AddSeconds(-1);
  338. if (string.IsNullOrEmpty(OrgCode))
  339. throw UserFriendlyException.SameMessage("部门code不能为空!");
  340. var data = await _enforcementOrdersRepository.Queryable()
  341. .Includes(x => x.Order)
  342. .Where(d => d.Order.Id != null)
  343. .Where(d => d.Order.CreationTime >= StartDate && d.Order.CreationTime <= EndDate)
  344. .WhereIF(OrgCode == "001", d => d.Order.ActualHandleOrgCode == OrgCode)
  345. .WhereIF(OrgCode != "001", d => d.Order.ActualHandleOrgCode.StartsWith(OrgCode))
  346. .GroupBy(d => new
  347. {
  348. OrgCode = d.Order.ActualHandleOrgCode,
  349. OrgName = d.Order.ActualHandleOrgName
  350. })
  351. .Select(d => new
  352. {
  353. OrgCode = d.Order.ActualHandleOrgCode,
  354. OrgName = d.Order.ActualHandleOrgName,
  355. CountNum = SqlFunc.AggregateCount(d.Order.ActualHandleOrgCode),
  356. TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
  357. TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
  358. EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder, 1, 0)),
  359. })
  360. .ToListAsync();
  361. return data;
  362. }
  363. /// <summary>
  364. /// 执法部门办件统计---明细
  365. /// </summary>
  366. /// <param name="dto"></param>
  367. /// <returns></returns>
  368. [HttpGet("enforcement_departmental_processing_statistics_order_list")]
  369. public async Task<PagedDto<EnforcementOrderListDto>> GetDepartmentalProcessingStatisticsOrderListAsync([FromQuery] QueryDepartmentalProcessingStatisticsDto dto)
  370. {
  371. dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
  372. var (total, items) = await _enforcementOrdersRepository.Queryable()
  373. .Includes(x => x.Order)
  374. .Where(d => d.Order.Id != null)
  375. .Where(d => d.Order.CreationTime >= dto.StartDate && d.Order.CreationTime <= dto.EndDate)
  376. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", d => d.Order.ActualHandleOrgCode == dto.OrgCode)
  377. .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", d => d.Order.ActualHandleOrgCode.StartsWith(dto.OrgCode))
  378. .WhereIF(dto.TheClueIsTrue == true, d => d.IsTheClueTrue == true)
  379. .WhereIF(dto.TheClueIsNotTrue == true, d => d.IsTheClueTrue == false)
  380. .WhereIF(dto.EnforcementOrder == true, d => d.IsEnforcementOrder == true)
  381. .OrderByDescending(d => d.CreationTime)
  382. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  383. return new PagedDto<EnforcementOrderListDto>(total, _mapper.Map<List<EnforcementOrderListDto>>(items));
  384. }
  385. /// <summary>
  386. /// 区域分类统计
  387. /// </summary>
  388. /// <returns></returns>
  389. [HttpGet("regional_classification_statistics")]
  390. public async Task<object> GetRegionalClassificationStatisticsAsync(DateTime StartDate, DateTime EndDate)
  391. {
  392. EndDate = EndDate.AddDays(1).AddSeconds(-1);
  393. var list = await _enforcementOrdersRepository.Queryable()
  394. .Includes(x => x.Order)
  395. .Where(x => x.Order.Id != null)
  396. .Where(x => x.Order.CreationTime >= StartDate && x.Order.CreationTime <= EndDate)
  397. .LeftJoin<SystemArea>((x, o) => x.Order.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
  398. .Where((x, o) => x.Order.Status >= EOrderStatus.Filed)
  399. .GroupBy((x, o) => new
  400. {
  401. AreaCode = x.Order.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  402. o.AreaName,
  403. })
  404. .Select((x, o) => new
  405. {
  406. AreaCode = x.Order.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  407. AreaName = o.AreaName,
  408. OrderCountNum = SqlFunc.AggregateCount(x.Order.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
  409. TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsTheClueTrue.HasValue && x.IsTheClueTrue.Value == true, 1, 0)),
  410. TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsTheClueTrue.HasValue && x.IsTheClueTrue.Value == false, 1, 0)),
  411. EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(x.IsEnforcementOrder, 1, 0))
  412. }).MergeTable()
  413. .Where(x => x.AreaCode != "519800" && x.AreaCode != "519900")
  414. .OrderByDescending(it => it.OrderCountNum)
  415. .ToListAsync();
  416. return list;
  417. }
  418. /// <summary>
  419. /// 区域分类统计---明细
  420. /// </summary>
  421. /// <param name="dto"></param>
  422. /// <returns></returns>
  423. [HttpGet("regional_classification_statistics_order_list")]
  424. public async Task<PagedDto<EnforcementOrderListDto>> GetRegionalClassificationStatisticsOrderListAsync([FromQuery] QueryRegionalClassificationStatisticsDto dto)
  425. {
  426. dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
  427. var (total, items) = await _enforcementOrdersRepository.Queryable()
  428. .Includes(x => x.Order)
  429. .Where(d => d.Order.Id != null)
  430. .Where(d => d.Order.CreationTime >= dto.StartDate && d.Order.CreationTime <= dto.EndDate)
  431. .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.Order.AreaCode == dto.AreaCode)
  432. .WhereIF(dto.TheClueIsTrue == true, d => d.IsTheClueTrue == true)
  433. .WhereIF(dto.TheClueIsNotTrue == true, d => d.IsTheClueTrue == false)
  434. .WhereIF(dto.EnforcementOrder == true, d => d.IsEnforcementOrder == true)
  435. .OrderByDescending(d => d.CreationTime)
  436. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  437. return new PagedDto<EnforcementOrderListDto>(total, _mapper.Map<List<EnforcementOrderListDto>>(items));
  438. }
  439. /// <summary>
  440. /// 部门满意度统计
  441. /// </summary>
  442. /// <param name="StartDate"></param>
  443. /// <param name="EndDate"></param>
  444. /// <param name="TypeId">1:办件结果 2:办件态度</param>
  445. /// <returns></returns>
  446. [HttpGet("enforcement_visit_org_satisfaction_statistics")]
  447. public async Task<object> GetVisitAndOrgSatisfactionStatisticsAsync(DateTime StartDate, DateTime EndDate, int TypeId)
  448. {
  449. EndDate = EndDate.AddDays(1).AddSeconds(-1);
  450. var list = await _enforcementOrdersRepository.Queryable()
  451. .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
  452. .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
  453. .Where((x, o, p) => o.VisitTime >= StartDate && o.VisitTime <= EndDate && p.VisitTarget == EVisitTarget.Org && o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode))
  454. .GroupBy((x, o, p) => new
  455. {
  456. VisitOrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  457. })
  458. .Select((x, o, p) => new VisitAndOrgSatisfactionStatisticsDto()
  459. {
  460. OrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  461. TotalSumCount = SqlFunc.AggregateCount(p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
  462. VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
  463. SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
  464. RegardedAsSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
  465. DefaultSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
  466. NoSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
  467. NoEvaluateCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
  468. NoPutThroughCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
  469. })
  470. .MergeTable()
  471. .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
  472. .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
  473. {
  474. OrgName = o.Name,
  475. OrgCode = it.OrgCode,
  476. OrgType = o.OrgType,
  477. TotalSumCount = it.TotalSumCount,
  478. VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
  479. SatisfiedCount = it.SatisfiedCount, //满意数
  480. RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
  481. DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
  482. NoSatisfiedCount = it.NoSatisfiedCount,//不满意
  483. NoEvaluateCount = it.NoEvaluateCount,//未做评价
  484. NoPutThroughCount = it.NoPutThroughCount,//未接通
  485. })
  486. .ToListAsync();
  487. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  488. {
  489. OrgName = "总计",
  490. TotalSumCount = list.Sum(x => x.TotalSumCount),
  491. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  492. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  493. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  494. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  495. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  496. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  497. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  498. };
  499. return new { DataList = list, SumModel = sumModel };
  500. }
  501. /// <summary>
  502. /// 部门满意度统计----子级
  503. /// </summary>
  504. /// <param name="StartDate"></param>
  505. /// <param name="EndDate"></param>
  506. /// <param name="TypeId">1:办件结果 2:办件态度</param>
  507. /// <param name="OrgCode"></param>
  508. /// <returns></returns>
  509. [HttpGet("enforcement_visit_org_satisfaction_statistics_child")]
  510. public async Task<object> GetVisitAndOrgSatisfactionStatisticsChildAsync(DateTime StartDate, DateTime EndDate, int TypeId, string OrgCode)
  511. {
  512. EndDate = EndDate.AddDays(1).AddSeconds(-1);
  513. var list = await _enforcementOrdersRepository.Queryable()
  514. .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
  515. .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
  516. .Where((x, o, p) => o.VisitTime >= StartDate && o.VisitTime <= EndDate && p.VisitTarget == EVisitTarget.Org && o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode))
  517. .GroupBy((x, o, p) => new
  518. {
  519. VisitOrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
  520. })
  521. .Select((x, o, p) => new VisitAndOrgSatisfactionStatisticsDto()
  522. {
  523. OrgCode = p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
  524. TotalSumCount = SqlFunc.AggregateCount(p.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
  525. VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
  526. SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
  527. RegardedAsSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
  528. DefaultSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
  529. NoSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
  530. NoEvaluateCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
  531. NoPutThroughCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(p.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
  532. })
  533. .MergeTable()
  534. .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
  535. .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
  536. {
  537. OrgName = o.Name,
  538. OrgCode = it.OrgCode,
  539. OrgType = o.OrgType,
  540. TotalSumCount = it.TotalSumCount,
  541. VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
  542. SatisfiedCount = it.SatisfiedCount, //满意数
  543. RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
  544. DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
  545. NoSatisfiedCount = it.NoSatisfiedCount,//不满意
  546. NoEvaluateCount = it.NoEvaluateCount,//未做评价
  547. NoPutThroughCount = it.NoPutThroughCount,//未接通
  548. })
  549. .ToListAsync();
  550. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  551. {
  552. OrgName = "总计",
  553. TotalSumCount = list.Sum(x => x.TotalSumCount),
  554. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  555. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  556. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  557. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  558. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  559. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  560. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  561. };
  562. return new { DataList = list, SumModel = sumModel };
  563. }
  564. }
  565. }