JudicialManagementOrdersController.cs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991
  1. using DocumentFormat.OpenXml.Office2010.Excel;
  2. using Hotline.Api.Filter;
  3. using Hotline.Application.JudicialManagement;
  4. using Hotline.Caching.Interfaces;
  5. using Hotline.File;
  6. using Hotline.JudicialManagement;
  7. using Hotline.Orders;
  8. using Hotline.Repository.SqlSugar.Extensions;
  9. using Hotline.Settings;
  10. using Hotline.Settings.TimeLimits;
  11. using Hotline.Share.Dtos;
  12. using Hotline.Share.Dtos.JudicialManagement;
  13. using Hotline.Share.Dtos.Order;
  14. using Hotline.Share.Enums.JudicialManagement;
  15. using Hotline.Share.Requests;
  16. using Hotline.Tools;
  17. using MapsterMapper;
  18. using Microsoft.AspNetCore.Mvc;
  19. using SqlSugar;
  20. using XF.Domain.Authentications;
  21. using XF.Domain.Exceptions;
  22. using XF.Domain.Repository;
  23. namespace Hotline.Api.Controllers
  24. {
  25. public class JudicialManagementOrdersController : BaseController
  26. {
  27. private readonly IRepository<JudicialComplaintsEventType> _judicialComplaintsEventTypeRepository;
  28. private readonly IRepository<EnforcementHotspot> _enforcementHotspotRepository;
  29. private readonly IMapper _mapper;
  30. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  31. private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
  32. private readonly ISessionContext _sessionContext;
  33. private readonly IRepository<SystemArea> _systemAreaRepository;
  34. private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
  35. private readonly IFileRepository _fileRepository;
  36. private readonly IJudicialManagementOrdersService _judicialManagementOrdersService;
  37. private readonly IRepository<EnforcementOrdersHandler> _enforcementOrdersHandlerRepository;
  38. private readonly IEnforcementApplication _enforcementApplication;
  39. private readonly IRepository<Order> _orderRepository;
  40. private readonly IRepository<LawEnforcementAgencies> _lawEnforcementAgenciesRepository;
  41. /// <summary>
  42. ///
  43. /// </summary>
  44. /// <param name="judicialComplaintsEventTypeRepository"></param>
  45. /// <param name="enforcementHotspotRepository"></param>
  46. /// <param name="mapper"></param>
  47. /// <param name="sysDicDataCacheManager"></param>
  48. /// <param name="systemOrganizeRepository"></param>
  49. /// <param name="sessionContext"></param>
  50. /// <param name="systemAreaRepository"></param>
  51. /// <param name="judicialManagementOrdersRepository"></param>
  52. /// <param name="fileRepository"></param>
  53. /// <param name="judicialManagementOrdersService"></param>
  54. /// <param name="enforcementOrdersHandlerRepository"></param>
  55. /// <param name="enforcementApplication"></param>
  56. /// <param name="orderRepository"></param>
  57. public JudicialManagementOrdersController(
  58. IRepository<JudicialComplaintsEventType> judicialComplaintsEventTypeRepository,
  59. IRepository<EnforcementHotspot> enforcementHotspotRepository,
  60. IMapper mapper,
  61. ISystemDicDataCacheManager sysDicDataCacheManager,
  62. IRepository<SystemOrganize> systemOrganizeRepository,
  63. ISessionContext sessionContext,
  64. IRepository<SystemArea> systemAreaRepository,
  65. IRepository<JudicialManagementOrders> judicialManagementOrdersRepository,
  66. IFileRepository fileRepository,
  67. IJudicialManagementOrdersService judicialManagementOrdersService,
  68. IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository,
  69. IEnforcementApplication enforcementApplication,
  70. IRepository<Order> orderRepository,
  71. IRepository<LawEnforcementAgencies> lawEnforcementAgenciesRepository
  72. )
  73. {
  74. _judicialComplaintsEventTypeRepository = judicialComplaintsEventTypeRepository;
  75. _enforcementHotspotRepository = enforcementHotspotRepository;
  76. _mapper = mapper;
  77. _sysDicDataCacheManager = sysDicDataCacheManager;
  78. _systemOrganizeRepository = systemOrganizeRepository;
  79. _sessionContext = sessionContext;
  80. _systemAreaRepository = systemAreaRepository;
  81. _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
  82. _fileRepository = fileRepository;
  83. _judicialManagementOrdersService = judicialManagementOrdersService;
  84. _enforcementOrdersHandlerRepository = enforcementOrdersHandlerRepository;
  85. _enforcementApplication = enforcementApplication;
  86. _orderRepository = orderRepository;
  87. _lawEnforcementAgenciesRepository = lawEnforcementAgenciesRepository;
  88. }
  89. /// <summary>
  90. /// 新增工单
  91. /// </summary>
  92. /// <param name="dto"></param>
  93. /// <returns></returns>
  94. [HttpPost]
  95. [LogFilter("新增司法工单")]
  96. public async Task<string> Add([FromBody] JudicialManagementAddOrderDto dto)
  97. {
  98. dto.InitAddress();
  99. var order = _mapper.Map<JudicialManagementOrders>(dto);
  100. order.InitId();
  101. if (dto.Files.Any())
  102. order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", HttpContext.RequestAborted);
  103. await _judicialManagementOrdersService.AddAsync(order, true, HttpContext.RequestAborted);
  104. //处理执法部门
  105. if (dto.LawEnforcementAgencies != null && dto.LawEnforcementAgencies.Any())
  106. {
  107. List<LawEnforcementAgencies> lawEnforcementAgencies = new();
  108. foreach (var item in dto.LawEnforcementAgencies)
  109. {
  110. lawEnforcementAgencies.Add(new LawEnforcementAgencies
  111. {
  112. OrderId = order.Id,
  113. OrderNo = order.No,
  114. OrderSoure = EOrderSoure.Enforcement,
  115. OrgCode = item.Value,
  116. OrgName = item.Key
  117. });
  118. }
  119. if (lawEnforcementAgencies != null && lawEnforcementAgencies.Any())
  120. await _lawEnforcementAgenciesRepository.AddRangeAsync(lawEnforcementAgencies, HttpContext.RequestAborted);
  121. }
  122. return order.Id;
  123. }
  124. /// <summary>
  125. /// 更新工单信息
  126. /// </summary>
  127. /// <param name="dto"></param>
  128. /// <returns></returns>
  129. [HttpPut]
  130. [LogFilter("更新司法工单")]
  131. public async Task Update([FromBody] JudicialManagementUpdateOrderDto dto)
  132. {
  133. dto.InitAddress();
  134. var order = await _judicialManagementOrdersRepository.Queryable().FirstAsync(d => d.Id == dto.Id);
  135. if (order == null)
  136. throw UserFriendlyException.SameMessage("无效工单编号");
  137. _mapper.Map(dto, order);
  138. if (dto.Files.Any())
  139. order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", HttpContext.RequestAborted);
  140. else
  141. order.FileJson = new List<Share.Dtos.File.FileJson>();
  142. await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
  143. //处理执法部门
  144. if (dto.LawEnforcementAgencies != null && dto.LawEnforcementAgencies.Any())
  145. {
  146. List<LawEnforcementAgencies> lawEnforcementAgencies = new();
  147. foreach (var item in dto.LawEnforcementAgencies)
  148. {
  149. lawEnforcementAgencies.Add(new LawEnforcementAgencies
  150. {
  151. OrderId = order.Id,
  152. OrderNo = order.No,
  153. OrderSoure = EOrderSoure.Enforcement,
  154. OrgCode = item.Value,
  155. OrgName = item.Key
  156. });
  157. if (lawEnforcementAgencies != null && lawEnforcementAgencies.Any())
  158. {
  159. await _lawEnforcementAgenciesRepository.RemoveAsync(p => p.OrderId == order.Id, false, HttpContext.RequestAborted);
  160. await _lawEnforcementAgenciesRepository.AddRangeAsync(lawEnforcementAgencies, HttpContext.RequestAborted);
  161. }
  162. }
  163. }
  164. }
  165. /// <summary>
  166. /// 启用/禁用
  167. /// </summary>
  168. /// <param name="id"></param>
  169. /// <returns></returns>
  170. [HttpGet]
  171. [LogFilter("启用/禁用司法工单")]
  172. public async Task Update(string id)
  173. {
  174. var order = await _judicialManagementOrdersRepository.GetAsync(id, HttpContext.RequestAborted);
  175. if (order == null)
  176. throw UserFriendlyException.SameMessage("工单查询失败");
  177. if (order.IsItCounted)
  178. order.IsItCounted = false;
  179. else
  180. order.IsItCounted = true;
  181. await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
  182. }
  183. /// <summary>
  184. /// 关联执法部门
  185. /// </summary>
  186. /// <param name="dto"></param>
  187. /// <returns></returns>
  188. [HttpPut("associated_law_enforcement_gencies")]
  189. [LogFilter("关联执法部门")]
  190. public async Task AssociatedLawEnforcementAgencies([FromBody] AssociatedLawEnforcementAgenciesDto dto)
  191. {
  192. if (dto.LawEnforcementAgencies == null || dto.LawEnforcementAgencies.Count == 0)
  193. throw UserFriendlyException.SameMessage("请选择执法部门");
  194. var order = await _judicialManagementOrdersRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  195. if (order == null)
  196. throw UserFriendlyException.SameMessage("工单查询失败");
  197. //处理执法部门
  198. if (dto.LawEnforcementAgencies != null && dto.LawEnforcementAgencies.Any())
  199. {
  200. List<LawEnforcementAgencies> lawEnforcementAgencies = new();
  201. foreach (var item in dto.LawEnforcementAgencies)
  202. {
  203. lawEnforcementAgencies.Add(new LawEnforcementAgencies
  204. {
  205. OrderId = order.Id,
  206. OrderNo = order.No,
  207. OrderSoure = EOrderSoure.Enforcement,
  208. OrgCode = item.Value,
  209. OrgName = item.Key
  210. });
  211. }
  212. if (lawEnforcementAgencies != null && lawEnforcementAgencies.Any())
  213. {
  214. await _lawEnforcementAgenciesRepository.AddRangeAsync(lawEnforcementAgencies, HttpContext.RequestAborted);
  215. order.LawEnforcementAgencies = dto.LawEnforcementAgencies;
  216. await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
  217. }
  218. }
  219. }
  220. /// <summary>
  221. /// 查询工单详情
  222. /// </summary>
  223. /// <param name="id"></param>
  224. /// <returns></returns>
  225. [HttpGet("{id}")]
  226. public async Task<JudicialManagementOrderDto> Get(string id)
  227. {
  228. var order = await _judicialManagementOrdersRepository.Queryable().FirstAsync(d => d.Id == id);
  229. if (order == null)
  230. return new();
  231. var dto = _mapper.Map<JudicialManagementOrderDto>(order);
  232. //如果是12345创建的工单,查询办理信息
  233. if (dto.OrderSoure == EOrderSoure.Hotline)
  234. {
  235. var data = await _orderRepository.GetAsync(p => p.No == order.No, HttpContext.RequestAborted);
  236. if (data != null)
  237. {
  238. dto.CenterToOrgTime = data.CenterToOrgTime;
  239. dto.ActualHandleOrgName = data.ActualHandleOrgName;
  240. dto.ActualHandleTime = data.ActualHandleTime;
  241. dto.TimeLimit = data.TimeLimit;
  242. dto.TimeLimitUnit = data.TimeLimitUnit;
  243. dto.TimeLimitCount = data.TimeLimitCount;
  244. dto.ExpiredTime = data.ExpiredTime;
  245. dto.IsResolved = data.IsResolved;
  246. dto.FileOpinion = data.FileOpinion;
  247. dto.CenterOpinion = data.CenterToOrgOpinion;
  248. }
  249. }
  250. if (dto.FileJson != null && dto.FileJson.Any())
  251. {
  252. var ids = order.FileJson.Select(x => x.Id).ToList();
  253. var files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
  254. dto.Files = files.Where(x => string.IsNullOrEmpty(x.FlowKey)).ToList();
  255. }
  256. return dto;
  257. }
  258. /// <summary>
  259. /// 删除工单
  260. /// </summary>
  261. /// <param name="id"></param>
  262. /// <returns></returns>
  263. [HttpDelete("{id}")]
  264. [LogFilter("删除工单")]
  265. public async Task Remove(string id)
  266. {
  267. var order = await _judicialManagementOrdersRepository.GetAsync(id, HttpContext.RequestAborted);
  268. if (order == null) return;
  269. //if (order.Status != EOrderStatus.WaitForAccept)
  270. // throw UserFriendlyException.SameMessage("非草稿工单不可删除");
  271. await _judicialManagementOrdersRepository.RemoveAsync(order);
  272. }
  273. /// <summary>
  274. /// 受理工单
  275. /// </summary>
  276. /// <param name="dto"></param>
  277. /// <returns></returns>
  278. [HttpGet("getownorderlist")]
  279. public async Task<PagedDto<EnforcementOrderListDto>> GetOwnOrderList([FromQuery] QueryEnforcementOrderNewDto dto)
  280. {
  281. var (total, items) = await _enforcementApplication.GetOwnOrderList(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  282. return new PagedDto<EnforcementOrderListDto>(total, _mapper.Map<List<EnforcementOrderListDto>>(items));
  283. }
  284. /// <summary>
  285. /// 受理工单--导出
  286. /// </summary>
  287. /// <param name="dto"></param>
  288. /// <returns></returns>
  289. [HttpPost("getownorderlist_export")]
  290. public async Task<FileStreamResult> GetOwnOrderListExport([FromBody] ExportExcelDto<QueryEnforcementOrderNewDto> dto)
  291. {
  292. var query = _enforcementApplication.GetOwnOrderList(dto.QueryDto);
  293. List<JudicialManagementOrders> data;
  294. if (dto.IsExportAll)
  295. {
  296. data = await query.ToListAsync(HttpContext.RequestAborted);
  297. }
  298. else
  299. {
  300. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  301. data = items;
  302. }
  303. var dataDtos = _mapper.Map<ICollection<EnforcementOrderListDto>>(data);
  304. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<EnforcementOrderListDto>(dto.ColumnInfos);
  305. var dtos = dataDtos
  306. .Select(stu => _mapper.Map(stu, typeof(EnforcementOrderListDto), dynamicClass))
  307. .Cast<object>()
  308. .ToList();
  309. var stream = ExcelHelper.CreateStream(dtos);
  310. return ExcelStreamResult(stream, "自定义工单数据");
  311. }
  312. /// <summary>
  313. /// 司法行政监督管理工单查询
  314. /// </summary>
  315. /// <param name="dto"></param>
  316. /// <returns></returns>
  317. [HttpGet("getorderlist")]
  318. public async Task<PagedDto<EnforcementOrderListDto>> GetOrderList([FromQuery] QueryEnforcementOrderNewDto dto)
  319. {
  320. var (total, items) = await _enforcementApplication.GetOrderList(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  321. var data = _mapper.Map<List<EnforcementOrderListDto>>(items);
  322. if (_sessionContext.RequiredOrgId == "001188")
  323. {
  324. foreach (var item in data)
  325. {
  326. if (item.IsTheClueTrue.HasValue)
  327. item.IsShowUpdateButton = true;
  328. }
  329. }
  330. return new PagedDto<EnforcementOrderListDto>(total, data);
  331. }
  332. /// <summary>
  333. /// 司法行政监督管理工单查询---导出
  334. /// </summary>
  335. /// <param name="dto"></param>
  336. /// <returns></returns>
  337. [HttpPost("getorderlist_export")]
  338. public async Task<FileStreamResult> GetOrderListExport([FromBody] ExportExcelDto<QueryEnforcementOrderNewDto> dto)
  339. {
  340. var query = _enforcementApplication.GetOrderList(dto.QueryDto);
  341. List<JudicialManagementOrders> data;
  342. if (dto.IsExportAll)
  343. {
  344. data = await query.ToListAsync(HttpContext.RequestAborted);
  345. }
  346. else
  347. {
  348. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  349. data = items;
  350. }
  351. var dataDtos = _mapper.Map<ICollection<EnforcementOrderListDto>>(data);
  352. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<EnforcementOrderListDto>(dto.ColumnInfos);
  353. var dtos = dataDtos
  354. .Select(stu => _mapper.Map(stu, typeof(EnforcementOrderListDto), dynamicClass))
  355. .Cast<object>()
  356. .ToList();
  357. var stream = ExcelHelper.CreateStream(dtos);
  358. return ExcelStreamResult(stream, "工单中心数据");
  359. }
  360. /// <summary>
  361. /// 列表页面基础数据
  362. /// </summary>
  363. /// <returns></returns>
  364. [HttpGet("base-data")]
  365. public async Task<object> BaseData()
  366. {
  367. var orgList = await _systemOrganizeRepository.Queryable().OrderBy(d => d.Id).ToTreeAsync(x => x.Children, it => it.ParentId, null);
  368. var judicialManagementOrg = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.JudicialManagementOrg);
  369. List<SystemOrganize> OrgsOptions = new();
  370. foreach (var item in judicialManagementOrg)
  371. {
  372. var tempOrg = orgList.Find(p => p.Id == item.DicDataValue);
  373. if (tempOrg != null)
  374. OrgsOptions.Add(tempOrg);
  375. }
  376. var listChannelOptions = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel).ToList();
  377. var ChannelOptions = new List<Kv>();
  378. foreach (var item in listChannelOptions)
  379. {
  380. ChannelOptions.Add(new Kv { Key = item.DicDataName, Value = item.DicDataValue });
  381. }
  382. ChannelOptions.Add(new Kv { Key = "自定义", Value = "ZDY" });
  383. var listAcceptTypeOptions = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType).ToList();
  384. var AcceptTypeOptions = new List<Kv>();
  385. foreach (var item in listAcceptTypeOptions)
  386. {
  387. AcceptTypeOptions.Add(new Kv { Key = item.DicDataName, Value = item.DicDataValue });
  388. }
  389. var rsp = new
  390. {
  391. AcceptTypeOptions,
  392. ChannelOptions,
  393. OrgsOptions,
  394. EnforcementHotspot = await _enforcementHotspotRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null, it => it.Id)
  395. };
  396. return rsp;
  397. }
  398. /// <summary>
  399. /// 根据当前部门获取区域
  400. /// </summary>
  401. /// <returns></returns>
  402. [HttpGet("area/tree")]
  403. public async Task<object> GetAreaTree()
  404. {
  405. var areaCode = _sessionContext.OrgAreaCode;
  406. if (string.IsNullOrEmpty(areaCode))
  407. areaCode = "511500";
  408. if (areaCode == "511500")
  409. {
  410. return await _systemAreaRepository.Queryable()
  411. .Where(p => p.Id == "511500" || p.ParentId == "511500")
  412. .Select(p => new
  413. {
  414. p.AreaName,
  415. p.Id
  416. })
  417. .OrderBy(p => p.Id)
  418. .ToListAsync();
  419. }
  420. else
  421. {
  422. return await _systemAreaRepository.Queryable()
  423. .Where(p => p.Id == _sessionContext.OrgAreaCode)
  424. .Select(p => new
  425. {
  426. p.AreaName,
  427. p.Id
  428. })
  429. .OrderBy(p => p.Id)
  430. .ToListAsync();
  431. }
  432. }
  433. /// <summary>
  434. /// 线索核实
  435. /// </summary>
  436. /// <param name="dto"></param>
  437. /// <returns></returns>
  438. [HttpPost("clue_verification")]
  439. public async Task ClueVerificationAsync([FromBody] ClueVerificationDto dto)
  440. {
  441. if (dto.OrderIds == null || dto.OrderIds.Count == 0)
  442. throw UserFriendlyException.SameMessage("工单不能为空");
  443. if (dto.IsTheClueTrue.HasValue && dto.IsTheClueTrue.Value == true)
  444. {
  445. if (string.IsNullOrEmpty(dto.EventTypeId) || string.IsNullOrEmpty(dto.EventTypeName))
  446. throw UserFriendlyException.SameMessage("事项不能为空");
  447. }
  448. foreach (var item in dto.OrderIds)
  449. {
  450. var order = await _judicialManagementOrdersRepository.GetAsync(p => p.Id == item, HttpContext.RequestAborted);
  451. if (order == null)
  452. throw UserFriendlyException.SameMessage("工单查询失败");
  453. order.IsTheClueTrue = dto.IsTheClueTrue;
  454. if (!string.IsNullOrEmpty(dto.EventTypeName))
  455. order.EventTypeName = dto.EventTypeName;
  456. else
  457. order.EventTypeName = "";
  458. if (!string.IsNullOrEmpty(dto.EventTypeSpliceName))
  459. order.EventTypeSpliceName = dto.EventTypeSpliceName;
  460. else
  461. order.EventTypeSpliceName = "";
  462. if (!string.IsNullOrEmpty(dto.EventTypeId))
  463. {
  464. order.EventTypeOneLevelId = dto.EventTypeId.Substring(0, 2);
  465. order.EventTypeId = dto.EventTypeId;
  466. }
  467. else
  468. {
  469. order.EventTypeOneLevelId = "";
  470. order.EventTypeId = "";
  471. }
  472. if (!order.IsTheClueTrue.HasValue || order.IsTheClueTrue.Value == false)
  473. {
  474. order.EventTypeName = "";
  475. order.EventTypeSpliceName = "";
  476. order.EventTypeOneLevelId = "";
  477. order.EventTypeId = "";
  478. }
  479. await _judicialManagementOrdersRepository.UpdateAsync(order, HttpContext.RequestAborted);
  480. }
  481. }
  482. /// <summary>
  483. /// 行政执法活动投诉事项类型- 获取层级分类
  484. /// </summary>
  485. /// <returns></returns>
  486. [HttpGet("treelist")]
  487. public async Task<List<JudicialComplaintsEventType>> GetTreeList()
  488. {
  489. return await _judicialComplaintsEventTypeRepository.Queryable().ToTreeAsync(it => it.Children, it => it.ParentId, null, it => it.Id);
  490. }
  491. /// <summary>
  492. /// 事项分类统计
  493. /// </summary>
  494. /// <param name="StartTime"></param>
  495. /// <param name="EndTime"></param>
  496. /// <param name="Id"></param>
  497. /// <param name="AreaCode"></param>
  498. /// <returns></returns>
  499. [HttpGet("event_classification_statistics")]
  500. public async Task<object> GetEventClassificationStatisticsAsync(DateTime StartTime, DateTime EndTime, string Id, string AreaCode)
  501. {
  502. string areCodeText = "";
  503. if (string.IsNullOrEmpty(AreaCode))
  504. {
  505. if (_sessionContext.OrgAreaCode != "511500")
  506. areCodeText = _sessionContext.OrgAreaCode;
  507. }
  508. else
  509. areCodeText = AreaCode;
  510. var items = await _judicialComplaintsEventTypeRepository.Queryable()
  511. .LeftJoin<JudicialManagementOrders>((x, o) => o.EventTypeSpliceName != null &&
  512. (x.EventTypeName == o.EventTypeSpliceName || o.EventTypeSpliceName.Contains(x.EventTypeName)))
  513. .Where((x, o) => o.CreationTime >= StartTime && o.CreationTime <= EndTime && o.IsItCounted == true)
  514. .WhereIF(!string.IsNullOrEmpty(areCodeText), (x, o) => o.AreaCode.StartsWith(areCodeText))
  515. .Where((x, o) => x.ParentId == Id)
  516. .GroupBy((x, o) => new { x.Id, x.EventTypeName })
  517. .Select((x, o) => new
  518. {
  519. Id = x.Id,
  520. Name = x.EventTypeName,
  521. Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
  522. Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.EventTypeName != o.EventTypeName, 1, 0)) > 0,
  523. })
  524. .MergeTable()
  525. .ToListAsync();
  526. var data = await _judicialManagementOrdersRepository.Queryable()
  527. .Where(d => d.CreationTime >= StartTime && d.CreationTime <= EndTime)
  528. .WhereIF(!string.IsNullOrEmpty(areCodeText), p => p.AreaCode.StartsWith(areCodeText))
  529. .GroupBy(d => d.Id)
  530. .Select(d => new EventClassificationOrderCountDto
  531. {
  532. TheClueIsTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
  533. TheClueIsNotTrue = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
  534. EnforcementOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder.HasValue && d.IsEnforcementOrder.Value == true, 1, 0)),
  535. PassTheBuckOrder = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0)),
  536. ToBeVerified = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue == null, 1, 0)),
  537. })
  538. .ToListAsync();
  539. var orderCount = new
  540. {
  541. TheClueIsTrue = data.Sum(x => x.TheClueIsTrue),
  542. TheClueIsNotTrue = data.Sum(x => x.TheClueIsNotTrue),
  543. EnforcementOrder = data.Sum(x => x.EnforcementOrder),
  544. PassTheBuckOrder = data.Sum(x => x.PassTheBuckOrder),
  545. ToBeVerified = data.Sum(x => x.ToBeVerified)
  546. };
  547. return new { List = items, OrderCount = orderCount };
  548. }
  549. /// <summary>
  550. /// 事项分类统计--明细
  551. /// </summary>
  552. /// <param name="dto"></param>
  553. /// <returns></returns>
  554. [HttpGet("event_classification_statistics_order_list")]
  555. public async Task<PagedDto<EnforcementOrderListDto>> GetEventClassificationStatisticsOrderListAsync([FromQuery] QueryEventClassificationStatisticsDto dto)
  556. {
  557. var (total, items) = await _enforcementApplication.GetEventClassificationStatisticsOrderListAsync(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  558. return new PagedDto<EnforcementOrderListDto>(total, _mapper.Map<List<EnforcementOrderListDto>>(items));
  559. }
  560. /// <summary>
  561. /// 事项分类统计--明细--导出
  562. /// </summary>
  563. /// <param name="dto"></param>
  564. /// <returns></returns>
  565. [HttpPost("event_classification_statistics_order_list_export")]
  566. public async Task<FileStreamResult> GetEventClassificationStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryEventClassificationStatisticsDto> dto)
  567. {
  568. var query = _enforcementApplication.GetEventClassificationStatisticsOrderListAsync(dto.QueryDto);
  569. List<JudicialManagementOrders> data;
  570. if (dto.IsExportAll)
  571. {
  572. data = await query.ToListAsync(HttpContext.RequestAborted);
  573. }
  574. else
  575. {
  576. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  577. data = items;
  578. }
  579. var dataDtos = _mapper.Map<ICollection<EnforcementOrderListDto>>(data);
  580. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<EnforcementOrderListDto>(dto.ColumnInfos);
  581. var dtos = dataDtos
  582. .Select(stu => _mapper.Map(stu, typeof(EnforcementOrderListDto), dynamicClass))
  583. .Cast<object>()
  584. .ToList();
  585. var stream = ExcelHelper.CreateStream(dtos);
  586. return ExcelStreamResult(stream, "事项分类统计明细数据");
  587. }
  588. /// <summary>
  589. /// 执法部门办件统计
  590. /// </summary>
  591. /// <param name="dto"></param>
  592. /// <returns></returns>
  593. [HttpGet("enforcement_departmental_processing_statistics")]
  594. public async Task<List<EmDepartmentalProcessingStatisticsDto>> GetDepartmentalProcessingStatisticsAsync([FromQuery] QueryDepartmentalProcessingStatisticsDto dto)
  595. {
  596. return await _enforcementApplication.GetDepartmentalProcessingStatisticsAsync(dto.StartTime, dto.EndTime).ToListAsync();
  597. }
  598. /// <summary>
  599. /// 执法部门办件统计--导出
  600. /// </summary>
  601. /// <param name="dto"></param>
  602. /// <returns></returns>
  603. [HttpPost("enforcement_departmental_processing_statistics_export")]
  604. public async Task<FileStreamResult> GetDepartmentalProcessingStatisticsExportAsync([FromBody] ExportExcelDto<QueryDepartmentalProcessingStatisticsDto> dto)
  605. {
  606. var list = await _enforcementApplication.GetDepartmentalProcessingStatisticsAsync(dto.QueryDto.StartTime, dto.QueryDto.EndTime).ToListAsync();
  607. list.Add(new EmDepartmentalProcessingStatisticsDto
  608. {
  609. OrgCode = "",
  610. OrgName = "合计",
  611. CountNum = list.Sum(p => p.CountNum),
  612. TheClueIsTrue = list.Sum(p => p.TheClueIsTrue),
  613. TheClueIsNotTrue = list.Sum(p => p.TheClueIsNotTrue),
  614. EnforcementOrder = list.Sum(p => p.EnforcementOrder)
  615. });
  616. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<EmDepartmentalProcessingStatisticsDto>(dto.ColumnInfos);
  617. var dtos = list
  618. .Select(stu => _mapper.Map(stu, typeof(EmDepartmentalProcessingStatisticsDto), dynamicClass))
  619. .Cast<object>()
  620. .ToList();
  621. var stream = ExcelHelper.CreateStream(dtos);
  622. return ExcelStreamResult(stream, "执法部门办件统计数据");
  623. }
  624. /// <summary>
  625. /// 执法部门办件统计---明细
  626. /// </summary>
  627. /// <param name="dto"></param>
  628. /// <returns></returns>
  629. [HttpGet("enforcement_departmental_processing_statistics_order_list")]
  630. public async Task<PagedDto<EnforcementOrderListDto>> GetDepartmentalProcessingStatisticsOrderListAsync([FromQuery] QueryDepartmentalProcessingStatisticsDto dto)
  631. {
  632. var (total, items) = await _enforcementApplication.GetDepartmentalProcessingStatisticsOrderListAsync(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  633. return new PagedDto<EnforcementOrderListDto>(total, items);
  634. }
  635. /// <summary>
  636. /// 执法部门办件统计---明细---导出
  637. /// </summary>
  638. /// <param name="dto"></param>
  639. /// <returns></returns>
  640. [HttpPost("enforcement_departmental_processing_statistics_order_list_export")]
  641. public async Task<FileStreamResult> GetDepartmentalProcessingStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryDepartmentalProcessingStatisticsDto> dto)
  642. {
  643. var query = _enforcementApplication.GetDepartmentalProcessingStatisticsOrderListAsync(dto.QueryDto);
  644. List<EnforcementOrderListDto> data;
  645. if (dto.IsExportAll)
  646. {
  647. data = await query.ToListAsync(HttpContext.RequestAborted);
  648. }
  649. else
  650. {
  651. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  652. data = items;
  653. }
  654. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<EnforcementOrderListDto>(dto.ColumnInfos);
  655. var dtos = data
  656. .Select(stu => _mapper.Map(stu, typeof(EnforcementOrderListDto), dynamicClass))
  657. .Cast<object>()
  658. .ToList();
  659. var stream = ExcelHelper.CreateStream(dtos);
  660. return ExcelStreamResult(stream, "执法部门办件统计明细数据");
  661. }
  662. /// <summary>
  663. /// 区域分类统计
  664. /// </summary>
  665. /// <returns></returns>
  666. [HttpGet("regional_classification_statistics")]
  667. public async Task<object> GetRegionalClassificationStatisticsAsync([FromQuery] QueryRegionalClassificationStatisticsDto dto)
  668. {
  669. return await _enforcementApplication.GetRegionalClassificationStatisticsAsync(dto.StartTime, dto.EndTime).ToListAsync();
  670. }
  671. /// <summary>
  672. /// 区域分类统计--导出
  673. /// </summary>
  674. /// <returns></returns>
  675. [HttpPost("regional_classification_statistics_export")]
  676. public async Task<FileStreamResult> GetRegionalClassificationStatisticsExportAsync([FromBody] ExportExcelDto<QueryRegionalClassificationStatisticsDto> dto)
  677. {
  678. var list = await _enforcementApplication.GetRegionalClassificationStatisticsAsync(dto.QueryDto.StartTime, dto.QueryDto.EndTime).ToListAsync();
  679. list.Add(new RegionalClassificationStatisticsDto()
  680. {
  681. AreaCode = "",
  682. AreaName = "总计",
  683. OrderCountNum = list.Sum(x => x.OrderCountNum),
  684. TheClueIsTrue = list.Sum(x => x.TheClueIsTrue),
  685. TheClueIsNotTrue = list.Sum(x => x.TheClueIsNotTrue),
  686. EnforcementOrder = list.Sum(x => x.EnforcementOrder)
  687. });
  688. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<RegionalClassificationStatisticsDto>(dto.ColumnInfos);
  689. var dtos = list
  690. .Select(stu => _mapper.Map(stu, typeof(RegionalClassificationStatisticsDto), dynamicClass))
  691. .Cast<object>()
  692. .ToList();
  693. var stream = ExcelHelper.CreateStream(dtos);
  694. return ExcelStreamResult(stream, "区域分类统计数据");
  695. }
  696. /// <summary>
  697. /// 区域分类统计---明细
  698. /// </summary>
  699. /// <param name="dto"></param>
  700. /// <returns></returns>
  701. [HttpGet("regional_classification_statistics_order_list")]
  702. public async Task<PagedDto<EnforcementOrderListDto>> GetRegionalClassificationStatisticsOrderListAsync([FromQuery] QueryRegionalClassificationStatisticsDto dto)
  703. {
  704. var (total, items) = await _enforcementApplication.GetRegionalClassificationStatisticsOrderListAsync(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  705. return new PagedDto<EnforcementOrderListDto>(total, _mapper.Map<List<EnforcementOrderListDto>>(items));
  706. }
  707. /// <summary>
  708. /// 区域分类统计---明细---导出
  709. /// </summary>
  710. /// <param name="dto"></param>
  711. /// <returns></returns>
  712. [HttpPost("regional_classification_statistics_order_list_export")]
  713. public async Task<FileStreamResult> GetRegionalClassificationStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryRegionalClassificationStatisticsDto> dto)
  714. {
  715. var query = _enforcementApplication.GetRegionalClassificationStatisticsOrderListAsync(dto.QueryDto);
  716. List<JudicialManagementOrders> data;
  717. if (dto.IsExportAll)
  718. {
  719. data = await query.ToListAsync(HttpContext.RequestAborted);
  720. }
  721. else
  722. {
  723. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  724. data = items;
  725. }
  726. var dataDtos = _mapper.Map<ICollection<EnforcementOrderListDto>>(data);
  727. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<EnforcementOrderListDto>(dto.ColumnInfos);
  728. var dtos = dataDtos
  729. .Select(stu => _mapper.Map(stu, typeof(EnforcementOrderListDto), dynamicClass))
  730. .Cast<object>()
  731. .ToList();
  732. var stream = ExcelHelper.CreateStream(dtos);
  733. return ExcelStreamResult(stream, "区域分类统计明细数据");
  734. }
  735. /// <summary>
  736. /// 部门满意度统计
  737. /// </summary>
  738. /// <param name="dto"></param>
  739. /// <returns></returns>
  740. [HttpGet("enforcement_visit_org_satisfaction_statistics")]
  741. public async Task<object> GetVisitAndOrgSatisfactionStatisticsAsync([FromQuery] QueryOrgSatisfactionStatisticsDto dto)
  742. {
  743. var list = await _enforcementApplication.GetVisitAndOrgSatisfactionStatisticsAsync(dto.StartTime, dto.EndTime, dto.TypeId).ToListAsync();
  744. var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
  745. {
  746. OrgName = "总计",
  747. TotalSumCount = list.Sum(x => x.TotalSumCount),
  748. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  749. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  750. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  751. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  752. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  753. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  754. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  755. };
  756. return new { DataList = list, SumModel = sumModel };
  757. }
  758. /// <summary>
  759. /// 部门满意度统计--导出
  760. /// </summary>
  761. /// <param name="dto"></param>
  762. /// <returns></returns>
  763. [HttpPost("enforcement_visit_org_satisfaction_statistics_export")]
  764. public async Task<object> GetVisitAndOrgSatisfactionStatisticsExportAsync([FromBody] ExportExcelDto<QueryOrgSatisfactionStatisticsDto> dto)
  765. {
  766. var list = await _enforcementApplication.GetVisitAndOrgSatisfactionStatisticsAsync(dto.QueryDto.StartTime, dto.QueryDto.EndTime, dto.QueryDto.TypeId).ToListAsync();
  767. list.Add(new VisitAndOrgSatisfactionStatisticsDto()
  768. {
  769. OrgName = "总计",
  770. TotalSumCount = list.Sum(x => x.TotalSumCount),
  771. VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
  772. SatisfiedCount = list.Sum(x => x.SatisfiedCount),
  773. RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
  774. DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
  775. NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
  776. NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
  777. NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
  778. });
  779. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<VisitAndOrgSatisfactionStatisticsDto>(dto.ColumnInfos);
  780. var dtos = list
  781. .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
  782. .Cast<object>()
  783. .ToList();
  784. var stream = ExcelHelper.CreateStream(dtos);
  785. return ExcelStreamResult(stream, "部门满意度统计数据");
  786. }
  787. /// <summary>
  788. /// 部门满意度统计---明细
  789. /// </summary>
  790. /// <param name="dto"></param>
  791. /// <returns></returns>
  792. [HttpGet("enforcement_visit_org_satisfaction_statistics_order_list")]
  793. public async Task<PagedDto<EnforcementOrgSatisfactionOrderListDto>> GetVisitAndOrgSatisfactionStatisticsOrderListAsync([FromQuery] QueryOrgSatisfactionStatisticsDto dto)
  794. {
  795. var (total, items) = await _enforcementApplication.GetVisitAndOrgSatisfactionStatisticsOrderListAsync(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
  796. return new PagedDto<EnforcementOrgSatisfactionOrderListDto>(total, items);
  797. }
  798. /// <summary>
  799. /// 部门满意度统计---明细---导出
  800. /// </summary>
  801. /// <param name="dto"></param>
  802. /// <returns></returns>
  803. [HttpPost("enforcement_visit_org_satisfaction_statistics_order_list_export")]
  804. public async Task<FileStreamResult> GetVisitAndOrgSatisfactionStatisticsOrderListExportAsync([FromBody] ExportExcelDto<QueryOrgSatisfactionStatisticsDto> dto)
  805. {
  806. var query = _enforcementApplication.GetVisitAndOrgSatisfactionStatisticsOrderListAsync(dto.QueryDto);
  807. List<EnforcementOrgSatisfactionOrderListDto> data;
  808. if (dto.IsExportAll)
  809. {
  810. data = await query.ToListAsync(HttpContext.RequestAborted);
  811. }
  812. else
  813. {
  814. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  815. data = items;
  816. }
  817. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<EnforcementOrgSatisfactionOrderListDto>(dto.ColumnInfos);
  818. var dtos = data
  819. .Select(stu => _mapper.Map(stu, typeof(EnforcementOrgSatisfactionOrderListDto), dynamicClass))
  820. .Cast<object>()
  821. .ToList();
  822. var stream = ExcelHelper.CreateStream(dtos);
  823. return ExcelStreamResult(stream, "部门满意度统计明细数据");
  824. }
  825. ///// <summary>
  826. ///// 处理司法历史工单数据
  827. ///// </summary>
  828. ///// <param name="Year"></param>
  829. ///// <param name="Month"></param>
  830. ///// <returns></returns>
  831. //[HttpGet("add_enforcement_old_order")]
  832. //public async Task AddEnforcementOldOrder(int Year, int Month)
  833. //{
  834. // DateTime StartDate = DateTime.Parse(Year + "-" + Month + "-01 00:00:00");
  835. // DateTime EndDate = StartDate.AddMonths(1).AddSeconds(-1);
  836. // var list = await _orderRepository.Queryable()
  837. // .Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate && p.Status >= EOrderStatus.Filed && p.AcceptTypeCode != "10")
  838. // .Select(p => new EnforcementOldOrder()
  839. // {
  840. // Id = p.Id,
  841. // No = p.No,
  842. // HotspotId = p.HotspotId,
  843. // HandleTime = p.ActualHandleTime,
  844. // OrgLevelOneCode = p.OrgLevelOneCode,
  845. // ActualHandleOrgCode = p.ActualHandleOrgCode
  846. // })
  847. // .ToListAsync();
  848. // if (list != null && list.Count > 0)
  849. // {
  850. // //查询指定热点数据
  851. // var hotList = await _enforcementHotspotRepository.Queryable().ToListAsync();
  852. // //查询指定部门数据
  853. // var JudicialManagementOrg = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.JudicialManagementOrg).ToList();
  854. // foreach (var item in list)
  855. // {
  856. // bool isAdd = false;
  857. // //如果是特定热点写入数据
  858. // if (hotList.Exists(p => p.Id == item.HotspotId))
  859. // isAdd = true;
  860. // if (!string.IsNullOrEmpty(item.OrgLevelOneCode))
  861. // {
  862. // //如果是特定部门办理写入数据
  863. // if (JudicialManagementOrg.Exists(p => p.DicDataValue.Trim() == item.OrgLevelOneCode))
  864. // isAdd = true;
  865. // }
  866. // if (isAdd)
  867. // {
  868. // //是否存在此工单
  869. // if (!await _enforcementOrdersRepository.AnyAsync(p => p.Id == item.Id, HttpContext.RequestAborted))
  870. // {
  871. // // 不存在写入
  872. // EnforcementOrders enforcementOrders = new()
  873. // {
  874. // Id = item.Id,
  875. // OrderNo = item.No,
  876. // IsEnforcementOrder = false,
  877. // IsTheClueTrue = null,
  878. // IsPassTheBuckOrder = false,
  879. // CreationTime = item.HandleTime != null ? item.HandleTime.Value : DateTime.Now
  880. // };
  881. // await _enforcementOrdersRepository.AddAsync(enforcementOrders, HttpContext.RequestAborted);
  882. // }
  883. // }
  884. // }
  885. // }
  886. //}
  887. }
  888. }