TestController.cs 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  1. using DocumentFormat.OpenXml.Drawing.Charts;
  2. using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing;
  3. using DotNetCore.CAP;
  4. using Hotline.Ai.Visit;
  5. using Hotline.Application.CallCenter;
  6. using Hotline.Application.ExportExcel;
  7. using Hotline.Application.FlowEngine;
  8. using Hotline.Application.JudicialManagement;
  9. using Hotline.Application.Orders;
  10. using Hotline.Application.Quality;
  11. using Hotline.Application.StatisticalReport;
  12. using Hotline.Authentications;
  13. using Hotline.Caching.Interfaces;
  14. using Hotline.CallCenter.BlackLists;
  15. using Hotline.CallCenter.Calls;
  16. using Hotline.CallCenter.Configs;
  17. using Hotline.CallCenter.Ivrs;
  18. using Hotline.CallCenter.Tels;
  19. using Hotline.Configurations;
  20. using Hotline.ContingencyManagement;
  21. using Hotline.FlowEngine;
  22. using Hotline.FlowEngine.Definitions;
  23. using Hotline.FlowEngine.Notifications;
  24. using Hotline.FlowEngine.WorkflowModules;
  25. using Hotline.FlowEngine.Workflows;
  26. using Hotline.Import;
  27. using Hotline.JudicialManagement;
  28. using Hotline.Orders;
  29. using Hotline.Realtimes;
  30. using Hotline.Repository.SqlSugar;
  31. using Hotline.Repository.SqlSugar.CallCenter;
  32. using Hotline.Repository.SqlSugar.Ts;
  33. using Hotline.Settings;
  34. using Hotline.Settings.Hotspots;
  35. using Hotline.Settings.TimeLimitDomain;
  36. using Hotline.Settings.TimeLimits;
  37. using Hotline.Share.Dtos;
  38. using Hotline.Share.Dtos.FlowEngine;
  39. using Hotline.Share.Dtos.FlowEngine.Workflow;
  40. using Hotline.Share.Dtos.Order;
  41. using Hotline.Share.Dtos.Realtime;
  42. using Hotline.Share.Dtos.Snapshot;
  43. using Hotline.Share.Dtos.TrCallCenter;
  44. using Hotline.Share.Enums.CallCenter;
  45. using Hotline.Share.Enums.FlowEngine;
  46. using Hotline.Share.Enums.JudicialManagement;
  47. using Hotline.Share.Enums.Order;
  48. using Hotline.Share.Enums.Quality;
  49. using Hotline.Share.Mq;
  50. using Hotline.Users;
  51. using Mapster;
  52. using MapsterMapper;
  53. using MediatR;
  54. using Microsoft.AspNetCore.Authorization;
  55. using Microsoft.AspNetCore.Builder.Extensions;
  56. using Microsoft.AspNetCore.Mvc;
  57. using Microsoft.Extensions.Options;
  58. using MiniExcelLibs;
  59. using Newtonsoft.Json;
  60. using NPOI.POIFS.Crypt.Dsig;
  61. using SqlSugar;
  62. using StackExchange.Redis;
  63. using System.Threading;
  64. using XC.RSAUtil;
  65. using XF.Domain.Authentications;
  66. using XF.Domain.Cache;
  67. using XF.Domain.Exceptions;
  68. using XF.Domain.Filters;
  69. using XF.Domain.Locks;
  70. using XF.Domain.Queues;
  71. using XF.Domain.Repository;
  72. using static System.Runtime.InteropServices.JavaScript.JSType;
  73. using Order = Hotline.Orders.Order;
  74. using Hotline.Share.Dtos.Settings;
  75. using OrderDto = Hotline.Share.Dtos.Order.OrderDto;
  76. using Hotline.Share.Dtos.Home;
  77. using Google.Protobuf.WellKnownTypes;
  78. using Microsoft.AspNetCore.DataProtection;
  79. using Hotline.Share.Tools;
  80. using NETCore.Encrypt;
  81. using Hotline.Ai.Quality;
  82. using Hotline.EventBus;
  83. using Hotline.JudicialManagement.Notifies;
  84. using Hotline.Snapshot.Notifications;
  85. using XF.Domain.Entities;
  86. using Hotline.Repository.SqlSugar.Orders;
  87. namespace Hotline.Api.Controllers;
  88. /// <summary>
  89. ///
  90. /// </summary>
  91. //[AllowAnonymous]
  92. public class TestController : BaseController
  93. {
  94. private readonly ILogger<TestController> _logger;
  95. //private readonly IAuthorizeGenerator _authorizeGenerator;
  96. private readonly IOptionsSnapshot<CallCenterConfiguration> _options;
  97. private readonly ISessionContext _sessionContext;
  98. private readonly IRepository<User> _userRepository;
  99. private readonly ITypedCache<User> _cache;
  100. private readonly IRealtimeService _realtimeService;
  101. private readonly IBlacklistDomainService _blacklistDomainService;
  102. private readonly IIvrDomainService _ivrDomainService;
  103. private readonly ISugarUnitOfWork<HotlineDbContext> _uow;
  104. private readonly IRepository<Identity.Roles.Role> _roleRepository;
  105. private readonly IMediator _mediator;
  106. private readonly IDistributedLock _distributedLock;
  107. private readonly IRepository<OrderUrge> _orderUrgeRepository;
  108. private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
  109. private readonly ITimeLimitDomainService _timeLimitDomainService;
  110. private readonly IWfModuleDomainService _wfModuleDomainService;
  111. private readonly IDaySettingRepository _daySettingRepository;
  112. //private readonly ITrClient _trClient;
  113. private readonly ICapPublisher _capPublisher;
  114. private readonly IQueue _queue;
  115. private readonly IExportApplication _exportApplication;
  116. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  117. private readonly IRepository<WorkflowStep> _workflowStepRepository;
  118. private readonly IWorkflowRepository _workflowRepository;
  119. //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
  120. private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
  121. private readonly IOrderRepository _orderRepository;
  122. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  123. private readonly IQualityApplication _qualityApplication;
  124. private readonly IEnforcementApplication _enforcementApplication;
  125. private readonly IWorkflowDomainService _workflowDomainService;
  126. private readonly IMapper _mapper;
  127. private readonly IOrderReportApplication _orderReportApplication;
  128. private readonly IRepository<EnforcementOrders> _enforcementOrdersRepository;
  129. private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
  130. private readonly IRepository<EnforcementOrdersHandler> _enforcementOrdersHandlerRepository;
  131. private readonly IWorkflowApplication _workflowApplication;
  132. private readonly IRepository<ContingencyManagementHotspot> _contingencyManagementHotspotRepository;
  133. private readonly IRepository<Hotspot> _hotspotRepository;
  134. private readonly IOrderApplication _orderApplication;
  135. private readonly IRepository<Tel> _telRepository;
  136. private readonly IOrderDomainService _orderDomainService;
  137. private readonly ICallApplication _callApplication;
  138. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  139. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  140. //private readonly ITypedCache<List<User>> _cache;
  141. //private readonly ICacheManager<User> _cache;
  142. private readonly ICalcExpireTime _expireTime;
  143. private readonly ICallNativeRepository _callNativeRepository;
  144. private readonly IRepository<OldSendProData> _oldSendProDataRepository;
  145. private readonly IOrderScreenRepository _orderScreenRepository;
  146. private readonly IRepository<OrderVisit> _orderVisitRepository;
  147. private readonly IThirdIdentiyService _thirdIdentiyService;
  148. private readonly IServiceProvider _serviceProvider;
  149. private readonly IRepository<OrderDelay> _orderDelayRepository;
  150. public TestController(
  151. //INewRockClient client,
  152. ILogger<TestController> logger,
  153. //IAuthorizeGenerator authorizeGenerator,
  154. IOptionsSnapshot<CallCenterConfiguration> options,
  155. ISessionContext sessionContext,
  156. IRepository<User> userRepository,
  157. //ICacheManager<User> cache
  158. //ITypedCache<List<User>> cache
  159. ITypedCache<User> cache,
  160. IRealtimeService realtimeService,
  161. IBlacklistDomainService blacklistDomainService,
  162. IIvrDomainService ivrDomainService,
  163. ISugarUnitOfWork<HotlineDbContext> uow,
  164. IRepository<Identity.Roles.Role> roleRepository,
  165. IMediator mediator,
  166. IDistributedLock distributedLock,
  167. IRepository<OrderUrge> orderUrgeRepository,
  168. IRepositoryTextSearch<OrderTs> repositoryts,
  169. ITimeLimitDomainService timeLimitDomainService,
  170. IWfModuleDomainService wfModuleDomainService,
  171. IDaySettingRepository daySettingRepository,
  172. //ITrClient trClient,
  173. ICapPublisher capPublisher,
  174. IQueue queue,
  175. IExportApplication exportApplication,
  176. IRepository<WorkflowTrace> workflowTraceRepository,
  177. IRepository<WorkflowStep> workflowStepRepository,
  178. IWorkflowRepository workflowRepository,
  179. //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
  180. IRepository<SystemOrganize> systemOrganizeRepository,
  181. IOrderRepository orderRepository,
  182. IRepository<TrCallRecord> trCallRecordRepository,
  183. IQualityApplication qualityApplication,
  184. IEnforcementApplication enforcementApplication,
  185. IWorkflowDomainService workflowDomainService,
  186. IMapper mapper,
  187. IOrderApplication orderApplication,
  188. IRepository<Tel> telRepository,
  189. IOrderReportApplication orderReportApplication,
  190. IRepository<EnforcementOrders> enforcementOrdersRepository,
  191. IRepository<JudicialManagementOrders> judicialManagementOrdersRepository,
  192. IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository,
  193. IRepository<ContingencyManagementHotspot> contingencyManagementHotspotRepository,
  194. IRepository<Hotspot> hotspotRepository,
  195. IOrderDomainService orderDomainService,
  196. ICallApplication callApplication,
  197. IOptionsSnapshot<AppConfiguration> appOptions,
  198. ISystemSettingCacheManager systemSettingCacheManager,
  199. ICalcExpireTime expireTime,
  200. IRepository<OrderDelay> orderDelayRepository,
  201. ICallNativeRepository callNativeRepository,
  202. IRepository<OldSendProData> oldSendProDataRepository,
  203. IThirdIdentiyService thirdIdentiyService,
  204. IOrderScreenRepository orderScreenRepository,
  205. IRepository<OrderVisit> orderVisitRepository,
  206. IServiceProvider serviceProvider
  207. )
  208. {
  209. _logger = logger;
  210. //_authorizeGenerator = authorizeGenerator;
  211. _options = options;
  212. _sessionContext = sessionContext;
  213. _userRepository = userRepository;
  214. _cache = cache;
  215. _realtimeService = realtimeService;
  216. _blacklistDomainService = blacklistDomainService;
  217. _ivrDomainService = ivrDomainService;
  218. _uow = uow;
  219. _roleRepository = roleRepository;
  220. _mediator = mediator;
  221. _distributedLock = distributedLock;
  222. _orderUrgeRepository = orderUrgeRepository;
  223. _repositoryts = repositoryts;
  224. _timeLimitDomainService = timeLimitDomainService;
  225. _wfModuleDomainService = wfModuleDomainService;
  226. _daySettingRepository = daySettingRepository;
  227. //_trClient = trClient;
  228. _capPublisher = capPublisher;
  229. _queue = queue;
  230. _exportApplication = exportApplication;
  231. _workflowTraceRepository = workflowTraceRepository;
  232. _workflowStepRepository = workflowStepRepository;
  233. _workflowRepository = workflowRepository;
  234. //_workflowStepHandleRepository = workflowStepHandleRepository;
  235. _systemOrganizeRepository = systemOrganizeRepository;
  236. _orderRepository = orderRepository;
  237. _trCallRecordRepository = trCallRecordRepository;
  238. _qualityApplication = qualityApplication;
  239. _enforcementApplication = enforcementApplication;
  240. _workflowDomainService = workflowDomainService;
  241. _mapper = mapper;
  242. _orderReportApplication = orderReportApplication;
  243. _enforcementOrdersRepository = enforcementOrdersRepository;
  244. _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
  245. _enforcementOrdersHandlerRepository = enforcementOrdersHandlerRepository;
  246. _contingencyManagementHotspotRepository = contingencyManagementHotspotRepository;
  247. _hotspotRepository = hotspotRepository;
  248. _orderApplication = orderApplication;
  249. _telRepository = telRepository;
  250. _orderDomainService = orderDomainService;
  251. _callApplication = callApplication;
  252. _appOptions = appOptions;
  253. _systemSettingCacheManager = systemSettingCacheManager;
  254. _expireTime = expireTime;
  255. _callNativeRepository = callNativeRepository;
  256. _oldSendProDataRepository = oldSendProDataRepository;
  257. _thirdIdentiyService = thirdIdentiyService;
  258. _orderScreenRepository = orderScreenRepository;
  259. _orderVisitRepository = orderVisitRepository;
  260. _serviceProvider = serviceProvider;
  261. _orderDelayRepository = orderDelayRepository;
  262. }
  263. /// <summary>
  264. /// 测试获取电话号码
  265. /// </summary>
  266. /// <returns></returns>
  267. [HttpGet("phonenumber_test")]
  268. [AllowAnonymous]
  269. public async Task GetPhoneNumberTest()
  270. {
  271. await _realtimeService.OrderComplementAsync("08db98a6-29f9-4812-8ccc-c81bc1ab2d12","测试推送消息", HttpContext.RequestAborted);
  272. //var inDto = new ThirdTokenDto
  273. //{
  274. // AppId = _systemSettingCacheManager.WxOpenAppId,
  275. // Secret = _systemSettingCacheManager.WxOpenAppSecret
  276. //};
  277. //return await _thirdIdentiyService.GetPhoneNumberAsync(inDto);
  278. }
  279. /// <summary>
  280. /// 修改泸州省工单编码区域
  281. /// </summary>
  282. /// <returns></returns>
  283. [HttpPost("updateoldsendprodata")]
  284. [AllowAnonymous]
  285. public async Task UpdateOldSendProData()
  286. {
  287. var list = await _oldSendProDataRepository.Queryable().Where(p => p.ProvinceNo.Contains("99511500")).ToListAsync();
  288. if (list != null && list.Any())
  289. {
  290. foreach (var item in list)
  291. {
  292. var prono = item.ProvinceNo;
  293. prono = prono.Replace("99511500", "99510500");
  294. item.NewProvinceNo = prono;
  295. await _oldSendProDataRepository.UpdateAsync(item);
  296. }
  297. }
  298. }
  299. /// <summary>
  300. /// 修改工单省编号
  301. /// </summary>
  302. /// <returns></returns>
  303. [HttpPost("updatesendprodata")]
  304. [AllowAnonymous]
  305. public async Task UpdateSendProData()
  306. {
  307. var list = await _oldSendProDataRepository.Queryable().Where(p => p.ProvinceNo.Contains("99511500")).ToListAsync();
  308. if (list != null && list.Any())
  309. {
  310. foreach (var item in list)
  311. {
  312. var data = await _orderRepository.GetAsync(p => p.Id == item.Id, HttpContext.RequestAborted);
  313. if (data != null)
  314. {
  315. data.ProvinceNo = item.NewProvinceNo;
  316. await _orderRepository.Updateable(data).UpdateColumns(d => d.ProvinceNo).ExecuteCommandAsync(HttpContext.RequestAborted);
  317. }
  318. }
  319. }
  320. }
  321. /// <summary>
  322. /// 从新推送省上数据
  323. /// </summary>
  324. /// <returns></returns>
  325. [HttpGet("sendpushprodata")]
  326. [AllowAnonymous]
  327. public async Task SendPushProData(string provinceNo)
  328. {
  329. //推送 受理信息、结果信息、过程信息、话务信息、回访信息
  330. var list = await _oldSendProDataRepository.Queryable()
  331. .Where(p => p.CreatorName == null)
  332. .WhereIF(!string.IsNullOrEmpty(provinceNo), p => p.ProvinceNo == provinceNo).ToListAsync();
  333. if (list != null && list.Any())
  334. {
  335. foreach (var item in list)
  336. {
  337. var order = await _orderRepository.GetAsync(p => p.Id == item.Id, HttpContext.RequestAborted);
  338. if (order != null)
  339. {
  340. item.CreatorName = item.NewProvinceNo;
  341. await _oldSendProDataRepository.Updateable(item).UpdateColumns(d => d.CreatorName).ExecuteCommandAsync(HttpContext.RequestAborted);
  342. //受理信息
  343. #region 受理信息
  344. //var publishCallRecordDto = new PublishCallRecrodDto() { };
  345. //if (order.SourceChannelCode == AppDefaults.SourceChannel.DianHua &&
  346. // !string.IsNullOrEmpty(order.CallId))
  347. //{
  348. // if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.TianRun)
  349. // {
  350. // var callRecord = await _callApplication.GetTianrunCallAsync(order?.CallId, HttpContext.RequestAborted);
  351. // if (callRecord != null)
  352. // {
  353. // publishCallRecordDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  354. // }
  355. // }
  356. // else if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XingTang)
  357. // {
  358. // var call = await _callApplication.GetCallAsync(order?.CallId, HttpContext.RequestAborted);
  359. // if (call is not null)
  360. // {
  361. // publishCallRecordDto.TrCallRecordDto = _mapper.Map<TrCallDto>(call);
  362. // // 工单开始办理如果获取的通话记录是呼出并且录音文件是空就不推送通话记录
  363. // // 如果 通话记录是呼入, 并且没有录音文件
  364. // if (_systemSettingCacheManager.OrderStartHandlerPushCallIsNull && call.Direction == ECallDirection.Out && !string.IsNullOrEmpty(call.AudioFile))
  365. // {
  366. // publishCallRecordDto.TrCallRecordDto = null;
  367. // }
  368. // }
  369. // }
  370. //}
  371. //publishCallRecordDto.Order = _mapper.Map<OrderDto>(order);
  372. //await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowStarted, publishCallRecordDto,
  373. // cancellationToken: HttpContext.RequestAborted);
  374. #endregion
  375. //结果信息
  376. #region 受理信息、话务信息、结果信息
  377. if (order != null)
  378. {
  379. var trace = await _workflowTraceRepository.Queryable()
  380. .FirstAsync(d => d.WorkflowId == order.WorkflowId && d.StepType == EStepType.End, HttpContext.RequestAborted);
  381. var orderFlowDto = new OrderFlowDto
  382. {
  383. Order = _mapper.Map<OrderDto>(order),
  384. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
  385. };
  386. if (order.SourceChannelCode == AppDefaults.SourceChannel.DianHua &&
  387. !string.IsNullOrEmpty(order.CallId))
  388. {
  389. if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.TianRun)
  390. {
  391. var callRecord = await _callApplication.GetTianrunCallAsync(order?.CallId, HttpContext.RequestAborted);
  392. if (callRecord != null)
  393. {
  394. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  395. }
  396. }
  397. else if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XingTang)
  398. {
  399. var call = await _callApplication.GetCallAsync(order?.CallId, HttpContext.RequestAborted);
  400. if (call is not null)
  401. {
  402. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(call);
  403. // 工单开始办理如果获取的通话记录是呼出并且录音文件是空就不推送通话记录
  404. // 如果 通话记录是呼入, 并且没有录音文件
  405. if (_systemSettingCacheManager.OrderStartHandlerPushCallIsNull && call.Direction == ECallDirection.Out && !string.IsNullOrEmpty(call.AudioFile))
  406. {
  407. orderFlowDto.TrCallRecordDto = null;
  408. }
  409. }
  410. }
  411. }
  412. //这里需要判断是否是警情退回
  413. orderFlowDto.IsNonPoliceReturn = false;
  414. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: HttpContext.RequestAborted);
  415. //_logger.LogWarning($"推送完成: {order.ProvinceNo}");
  416. }
  417. #endregion
  418. //过程信息
  419. #region 过程信息
  420. //查询过程数据
  421. if (order != null)
  422. {
  423. var listStep = await _workflowTraceRepository.Queryable()
  424. .Where(p => p.WorkflowId == order.WorkflowId && p.TraceState == EWorkflowTraceState.Normal).ToListAsync();
  425. if (listStep != null && listStep.Any())
  426. {
  427. foreach (var itemStep in listStep)
  428. {
  429. var orderDto = _mapper.Map<OrderDto>(order);
  430. var flowDto = new OrderFlowDto
  431. {
  432. Order = orderDto,
  433. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(itemStep),
  434. ExpiredTimeChanged = false,
  435. HandlerOrgLevel = itemStep.HandlerOrgId.CalcOrgLevel()
  436. };
  437. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowHandled, flowDto, cancellationToken: HttpContext.RequestAborted);
  438. }
  439. }
  440. }
  441. #endregion
  442. //话务信息
  443. //回访信息
  444. #region 回访信息
  445. if (order != null && order.Status == EOrderStatus.Visited)
  446. {
  447. var listVist = await _orderRepository.Queryable()
  448. .Includes(x => x.OrderVisits.Where(q => q.VisitState == EVisitState.Visited).ToList(), d => d.OrderVisitDetails)
  449. .Where(x => x.Id == item.Id && x.Status == EOrderStatus.Visited).ToListAsync();
  450. foreach (var itemVisit in listVist)
  451. {
  452. try
  453. {
  454. var visit = itemVisit.OrderVisits.FirstOrDefault();
  455. if (visit != null)
  456. {
  457. var visitRemark = visit.OrderVisitDetails.Where(q => q.VisitTarget == EVisitTarget.Org).FirstOrDefault()?.VisitContent;
  458. //推省上
  459. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
  460. new PublishVisitDto()
  461. {
  462. Order = _mapper.Map<OrderDto>(itemVisit),
  463. No = visit.No,
  464. VisitType = visit.VisitType,
  465. VisitName = visit.CreatorName,
  466. VisitTime = visit.VisitTime,
  467. VisitRemark = string.IsNullOrEmpty(visitRemark) == true ? "满意" : visitRemark,
  468. AreaCode = itemVisit.AreaCode!,
  469. SubjectResultSatifyCode = visit.NowEvaluate.Key,
  470. FirstSatisfactionCode = itemVisit.FirstVisitResultCode,
  471. ClientGuid = ""
  472. }, cancellationToken: HttpContext.RequestAborted);
  473. }
  474. }
  475. catch { }
  476. }
  477. }
  478. #endregion
  479. }
  480. }
  481. }
  482. }
  483. [HttpGet("time")]
  484. [AllowAnonymous]
  485. public async Task<OpenResponse> GetTime(string batchId, string taskId)
  486. {
  487. //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662", DateTime.Now,
  488. // new List<string> { "xx", "bb" }, HttpContext.RequestAborted);
  489. //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4663", DateTime.Now,
  490. // new List<string> { "aa", "bb", "cc" }, HttpContext.RequestAborted);
  491. //var result0 = await _repositoryts.SearchAsync(new List<string> { "xx", "aa" }, HttpContext.RequestAborted);
  492. //var result = await _repositoryts.SearchAsync(new List<string> { "bb" }, HttpContext.RequestAborted);
  493. //var result1 = await _repositoryts.SearchAsync(new List<string> { "cc", "bb" }, HttpContext.RequestAborted);
  494. //var result2 = await _repositoryts.SearchAsync(new List<string> { "cc", "xx" }, HttpContext.RequestAborted);
  495. //var result3 = await _repositoryts.SearchAsync(new List<string> { "aa", "bb", "ss" }, HttpContext.RequestAborted);
  496. //await _orderDomainService.SendOverTimeSms(HttpContext.RequestAborted);
  497. //await _repositoryts.UpdateVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662",
  498. // new List<string> { "ss", "bb" }, HttpContext.RequestAborted);
  499. //_uow.Db.Ado.SqlQueryAsync<OrderUrge>("SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat')")
  500. //var tests = _uowWex.Db.Ado.SqlQuery<Test>("select * from view_telinfo_full where IsSynch=@IsSynch", new { IsSynch = 0 });
  501. //var a = _uowWex.Db.Ado.ExecuteCommand("update telinfo set IsSynch=1 where GUID=@CallId", new { CallId = "b1f97f3c-88b6-4f42-b8de-83ed448854b0" });
  502. //var rsp = await _wexClient.QueryTelsAsync(new QueryTelRequest { }, HttpContext.RequestAborted);
  503. //int a = _timeLimitDomainService.CalcWorkTime(DateTime.Now, DateTime.Parse("2023-09-11 16:21:00"));
  504. //int m = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2023-09-19 12:00:00"), DateTime.Parse("2023-09-20 18:00:00"), false);
  505. //var r = _timeLimitDomainService.CalcEndTime(DateTime.Parse("2024-6-06 14:32:47"),"40");
  506. //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Parse("2024-02-29 10:12:33"), Share.Enums.FlowEngine.EFlowDirection.OrgToCenter, "10");
  507. //await _wfModuleDomainService.PersistenceModulesAsync(HttpContext.RequestAborted);
  508. //var rsp = await _daprClient.InvokeMethodAsync<ApiResponse<string>>(HttpMethod.Get, "identity", "api/v1/Test/time", HttpContext.RequestAborted);
  509. //var rsp1 = await _daprClient.InvokeMethodAsync<int, ApiResponse<string>>(HttpMethod.Post, "identity", "api/v1/Test/time1", 222, HttpContext.RequestAborted);
  510. //var a = await _trClient.QueryTelsAsync(new Tr.Sdk.Tels.QueryTelRequest() { }, HttpContext.RequestAborted);
  511. //await _daySettingRepository.IsWorkDay(DateTime.Now);
  512. //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-6-06 14:32:47"), DateTime.Parse("2024-3-22 06:00:00"), false);
  513. //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-24 17:20:00"), DateTime.Parse("2024-3-24 17:21:00"), false);
  514. //await _aiVisitService.QueryAiVisitTask(batchId, taskId, HttpContext.RequestAborted);
  515. //var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
  516. //var r = _timeLimitDomainService.CalcWorkTimeToDecimal(DateTime.Parse("2024-07-09 14:57:51"), DateTime.Parse("2024-07-10 14:20:42"), false);
  517. //var endTime = _timeLimitDomainService
  518. //.CalcEndTime(DateTime.Parse("2024-07-09 14:57:51"), ETimeType.WorkDay, -3, 0, 0);///.EndTime;
  519. //var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 3, 80, 50);
  520. //var t = _timeLimitDomainService.CalcWorkTimeEx(DateTime.Parse("2024-07-22 11:30:00"), DateTime.Parse("2024-07-23 14:00:00"), false);
  521. //var r = await _aiVisitService.QueryAiVisitTaskEx("MTAwMDAx173ASS0kSUAqK2rl2sFGME", "", HttpContext.RequestAborted);
  522. //var r = await _aiVisitService.QueryAiVisitTaskResult(batchId, DateTime.Parse("2024-07-28"), DateTime.Parse("2024-08-01"), HttpContext.RequestAborted);
  523. //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, batchId);
  524. //var r = _timeLimitDomainService.CalcEndTime(DateTime.Parse("2024-09-12 14:45:47"), Share.Enums.Settings.ETimeType.WorkDay, 2, 80, 50);
  525. //_capPublisher.PublishDelay((DateTime.Now.AddMinutes(2) - DateTime.Now), EventNames.OrderRelateCall, "123");
  526. var times = await _expireTime.CalcExpiredTime(DateTime.Parse("2025-01-14 09:45:00"), DateTime.Parse("2025-01-07 09:16:53.691249"), EFlowDirection.CenterToOrg, new OrderTimeClacInfo() { AcceptTypeCode = "20" });
  527. //await _expireTime.CalcWorkTimeToDecimal(visit.VisitTime.Value, DateTime.Now, false);
  528. //var times = await _expireTime.CalcWorkTimeToDecimal(DateTime.Parse("2024-12-16 21:36:27"), DateTime.Parse("2024-12-17 12:47:05"), false);
  529. //var query = _userRepository.Queryable().Where(x => false);
  530. //await _capPublisher.PublishDelay(EventNames.OrderRelateCall, "123", cancellationToken: HttpContext.RequestAborted);
  531. return OpenResponse.Ok(times);
  532. }
  533. /// <summary>
  534. /// 通过工单号重推回访到省上
  535. /// </summary>
  536. /// <param name="Nos"></param>
  537. /// <returns></returns>
  538. [HttpPost("publish-visit-province-no")]
  539. [AllowAnonymous]
  540. public async Task PublishVisitToProvinceByNo(string Nos)
  541. {
  542. Nos = Nos.Trim();
  543. string[] no = Nos.Split(',');
  544. for (int i = 0; i < no.Length; i++)
  545. {
  546. no[i] = no[i].Trim();
  547. }
  548. var list = await _orderRepository.Queryable()
  549. .Includes(x => x.OrderVisits.Where(q => q.VisitState == EVisitState.Visited).ToList(), d => d.OrderVisitDetails)
  550. .Where(x => no.Contains(x.No) && x.Status == EOrderStatus.Visited).ToListAsync();
  551. foreach (var item in list)
  552. {
  553. try
  554. {
  555. var visit = item.OrderVisits.FirstOrDefault();
  556. if (visit != null)
  557. {
  558. var visitRemark = visit.OrderVisitDetails.Where(q => q.VisitTarget == EVisitTarget.Org).FirstOrDefault()?.VisitContent;
  559. //推省上
  560. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
  561. new PublishVisitDto()
  562. {
  563. Order = _mapper.Map<OrderDto>(item),
  564. No = visit.No,
  565. VisitType = visit.VisitType,
  566. VisitName = visit.CreatorName,
  567. VisitTime = visit.VisitTime,
  568. VisitRemark = string.IsNullOrEmpty(visitRemark) == true ? "满意" : visitRemark,
  569. AreaCode = item.AreaCode!,
  570. SubjectResultSatifyCode = visit.NowEvaluate.Key,
  571. FirstSatisfactionCode = item.FirstVisitResultCode,
  572. ClientGuid = ""
  573. }, cancellationToken: HttpContext.RequestAborted);
  574. }
  575. }
  576. catch { }
  577. }
  578. }
  579. /// <summary>
  580. /// 市场监管局数据处理
  581. /// </summary>
  582. /// <param name="file"></param>
  583. /// <returns></returns>
  584. [HttpPost("importmarketsupervision")]
  585. [AllowAnonymous]
  586. public async Task<List<GetCaseReultSendModel>> ImportMarketSupervision(IFormFile file)
  587. {
  588. using (var stream = new MemoryStream())
  589. {
  590. file.CopyTo(stream);
  591. var list = MiniExcel.Query<GetCaseReultSendModel>(stream).ToList();
  592. //Directory.Delete(filePath, true);
  593. return list;
  594. }
  595. }
  596. /// <summary>
  597. /// 推送回访到省上
  598. /// </summary>
  599. /// <returns></returns>
  600. [HttpPost("publishVisitToProvince")]
  601. [AllowAnonymous]
  602. public async Task PublsihVisitToProvince([FromBody] DateTime date)
  603. {
  604. //查询需要推送的数据
  605. var list = await _orderRepository.Queryable()
  606. .Includes(x => x.OrderVisits.Where(q => q.VisitState == EVisitState.Visited).ToList())
  607. .Where(x => x.CreationTime.Date == date.Date && x.Status == EOrderStatus.Visited && x.ProcessType == EProcessType.Zhiban && x.CounterSignType == null).ToListAsync();
  608. foreach (var item in list)
  609. {
  610. var visit = item.OrderVisits.FirstOrDefault();
  611. if (visit != null)
  612. {
  613. //推省上
  614. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
  615. new PublishVisitDto()
  616. {
  617. Order = _mapper.Map<OrderDto>(item),
  618. No = visit.No,
  619. VisitType = visit.VisitType,
  620. VisitName = visit.CreatorName,
  621. VisitTime = visit.VisitTime,
  622. VisitRemark = "满意",
  623. AreaCode = item.AreaCode!,
  624. SubjectResultSatifyCode = "4",
  625. FirstSatisfactionCode = "4",
  626. ClientGuid = ""
  627. }, cancellationToken: HttpContext.RequestAborted);
  628. }
  629. }
  630. }
  631. [HttpGet("addcontingencymanagementhotspot")]
  632. [AllowAnonymous]
  633. public async Task AddContingencyManagementHotspot([FromQuery] string? Id, string? ParentId)
  634. {
  635. if (!string.IsNullOrWhiteSpace(Id))
  636. {
  637. var data = await _hotspotRepository.GetAsync(Id, HttpContext.RequestAborted);
  638. if (data != null)
  639. {
  640. var newdata = _mapper.Map<ContingencyManagementHotspot>(data);
  641. newdata.Id = data.Id;
  642. await _contingencyManagementHotspotRepository.AddAsync(newdata, HttpContext.RequestAborted);
  643. }
  644. }
  645. if (!string.IsNullOrEmpty(ParentId))
  646. {
  647. var data = await _hotspotRepository.Queryable().Where(p => p.ParentId == ParentId).ToListAsync();
  648. if (data != null && data.Count > 0)
  649. {
  650. foreach (var item in data)
  651. {
  652. var newdata = _mapper.Map<ContingencyManagementHotspot>(item);
  653. newdata.Id = item.Id;
  654. await _contingencyManagementHotspotRepository.AddAsync(newdata, HttpContext.RequestAborted);
  655. }
  656. }
  657. }
  658. }
  659. /// <summary>
  660. /// 处理司法工单数据
  661. /// </summary>
  662. /// <param name="StartTime"></param>
  663. /// <param name="EndTime"></param>
  664. /// <returns></returns>
  665. [HttpGet("addjudicial_management_orders")]
  666. [AllowAnonymous]
  667. public async Task AddJudicialManagementOrders(DateTime StartTime, DateTime? EndTime)
  668. {
  669. var list = await _enforcementOrdersRepository.Queryable()
  670. .Includes(x => x.Order)
  671. .Where(x => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.Order.AcceptTypeCode == "35")
  672. .ToListAsync();
  673. foreach (var item in list)
  674. {
  675. var order = item.Order;
  676. if (order != null)
  677. {
  678. var orderData = await _judicialManagementOrdersRepository.GetAsync(p => p.Id == order.Id, HttpContext.RequestAborted);
  679. if (orderData == null)
  680. {
  681. orderData = new JudicialManagementOrders();
  682. //处理工单
  683. _mapper.Map(order, orderData);
  684. orderData.Id = order.Id;
  685. orderData.IsEnforcementOrder = order.IsEnforcementOrder.HasValue ? order.IsEnforcementOrder.Value : false;
  686. orderData.IsTheClueTrue = item.IsTheClueTrue;
  687. orderData.IsPassTheBuckOrder = item.IsPassTheBuckOrder;
  688. orderData.OrderSoure = EOrderSoure.Hotline;
  689. orderData.CreationTime = item.CreationTime;
  690. if (item.EventTypeId == "04" || item.EventTypeId == "05" || item.EventTypeId == "06" || item.EventTypeId == "07" || item.EventTypeId == "08" ||
  691. item.EventTypeId == "0401" || item.EventTypeId == "0501" || item.EventTypeId == "0601" || item.EventTypeId == "0701" || item.EventTypeId == "0801")
  692. {
  693. orderData.EventTypeId = "0901";
  694. orderData.EventTypeName = "其他情形";
  695. orderData.EventTypeSpliceName = "其他类-其他情形";
  696. orderData.EventTypeOneLevelId = "09";
  697. }
  698. else
  699. {
  700. orderData.EventTypeId = item.EventTypeId;
  701. orderData.EventTypeName = item.EventTypeName;
  702. orderData.EventTypeSpliceName = item.EventTypeSpliceName;
  703. orderData.EventTypeOneLevelId = item.EventTypeOneLevelId;
  704. }
  705. List<Kv> kvs = new List<Kv>
  706. {
  707. new Kv { Key = order.OrgLevelOneName, Value = order.OrgLevelOneCode }
  708. };
  709. orderData.EnforcementOrdersHandler = kvs;
  710. await _judicialManagementOrdersRepository.AddAsync(orderData, HttpContext.RequestAborted);
  711. //处理部门
  712. EnforcementOrdersHandler enforcementOrdersHandler = new EnforcementOrdersHandler()
  713. {
  714. OrderId = order.Id,
  715. OrderNo = order.No,
  716. OrderSoure = EOrderSoure.Hotline,
  717. OrgCode = order.OrgLevelOneCode,
  718. OrgName = order.OrgLevelOneName,
  719. CreationTime = order.CreationTime
  720. };
  721. await _enforcementOrdersHandlerRepository.AddAsync(enforcementOrdersHandler, HttpContext.RequestAborted);
  722. }
  723. }
  724. }
  725. }
  726. /// <summary>
  727. /// 计算工单的办理时长
  728. /// </summary>
  729. /// <param name="StartTime"></param>
  730. /// <param name="EndTime"></param>
  731. /// <returns></returns>
  732. [HttpGet("update_order_handle_time")]
  733. [AllowAnonymous]
  734. public async Task UpdateOrderHandleTime(DateTime StartTime, DateTime? EndTime)
  735. {
  736. var list = await _orderRepository.Queryable()
  737. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime && p.Status >= EOrderStatus.Filed)
  738. .Where(p => p.CreationTimeHandleDuration == null || p.CenterToOrgHandleDuration == null)
  739. .ToListAsync();
  740. if (list.Any())
  741. {
  742. foreach (var item in list)
  743. {
  744. var creationTimeHandleDurationWorkday = item.FiledTime.HasValue
  745. ?
  746. //_timeLimitDomainService.CalcWorkTimeEx(
  747. await _expireTime.CalcWorkTimeEx(
  748. item.CreationTime, item.FiledTime.Value,
  749. item.ProcessType is EProcessType.Zhiban)
  750. : 0;
  751. var centerToOrgHandleDurationWorkday = item.FiledTime.HasValue && item.CenterToOrgTime.HasValue
  752. ?
  753. //_timeLimitDomainService.CalcWorkTimeEx(
  754. await _expireTime.CalcWorkTimeEx(
  755. item.CenterToOrgTime.Value, item.FiledTime.Value,
  756. item.ProcessType is EProcessType.Zhiban)
  757. : 0;
  758. item.CreationTimeHandleDurationWorkday = creationTimeHandleDurationWorkday;
  759. item.CenterToOrgHandleDurationWorkday = centerToOrgHandleDurationWorkday;
  760. if (item.FiledTime.HasValue)
  761. {
  762. var count = Math.Round((item.FiledTime - item.CreationTime).Value.TotalSeconds);
  763. item.CreationTimeHandleDuration = count <= 0 ? 1 : count;
  764. }
  765. else
  766. item.CreationTimeHandleDuration = 0;
  767. if (item.FiledTime.HasValue && item.CenterToOrgTime.HasValue)
  768. {
  769. var count = Math.Round((item.FiledTime - item.CenterToOrgTime).Value.TotalSeconds);
  770. item.CenterToOrgHandleDuration = count <= 0 ? 1 : count;
  771. }
  772. else
  773. item.CenterToOrgHandleDuration = 0;
  774. await _orderRepository.UpdateAsync(item, HttpContext.RequestAborted);
  775. }
  776. }
  777. }
  778. [HttpGet("testo")]
  779. [AllowAnonymous]
  780. public async Task<OpenResponse> TestOrigin()
  781. {
  782. var now = DateTime.Now.ToString();
  783. return OpenResponse.Ok(now);
  784. }
  785. [HttpGet("init-orgname")]
  786. [AllowAnonymous]
  787. public async Task InitUserOrgFullName()
  788. {
  789. var list = await _userRepository.Queryable().Where(x => 1 == 1 && string.IsNullOrEmpty(x.FullOrgName)).ToListAsync();
  790. foreach (var item in list)
  791. {
  792. var orgFullName = "";
  793. var orgFullCode = "";
  794. var orgId = item.OrgId;
  795. int strLength = orgId.Length;
  796. int segmentsCount = strLength / 3;
  797. List<string> strings = new List<string>();
  798. for (int i = 0; i < segmentsCount; i++)
  799. {
  800. int startIndex = i * 3;
  801. int length = Math.Min(3, strLength - startIndex);
  802. strings.Add(orgId.Substring(startIndex, length));
  803. }
  804. if (strLength > 3)
  805. {
  806. orgFullCode = strings[0];
  807. strings.Remove(orgFullCode);
  808. }
  809. foreach (var str in strings)
  810. {
  811. orgFullCode = orgFullCode + str;
  812. var org = await _systemOrganizeRepository.GetAsync(orgFullCode);
  813. if (org != null)
  814. {
  815. orgFullName = orgFullName + org.Name + "/";
  816. }
  817. }
  818. if (orgFullName.Length > 0)
  819. {
  820. orgFullName = orgFullName.Remove(orgFullName.Length - 1);
  821. }
  822. item.FullOrgName = orgFullName;
  823. await _userRepository.UpdateAsync(item);
  824. }
  825. }
  826. [HttpPost("import")]
  827. [AllowAnonymous]
  828. public async Task<List<ExcelContent>> Import(IFormFile file)
  829. {
  830. //var FileName = file.FileName;
  831. //var fileExtension = Path.GetExtension(FileName);
  832. ////新文件名
  833. //var newFileName = DateTime.Now.ToString("yyyyMMddhhmmss");
  834. ////文件保存路径
  835. //var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Upload", newFileName);
  836. ////判断路径是否存在
  837. //if (!Directory.Exists(filePath))
  838. //{
  839. // //创建路径
  840. // Directory.CreateDirectory(filePath);
  841. //}
  842. //filePath = Path.Combine(filePath, newFileName+ fileExtension);
  843. using (var stream = new MemoryStream())
  844. {
  845. file.CopyTo(stream);
  846. var list = MiniExcel.Query<ExcelContent>(stream).ToList();
  847. //Directory.Delete(filePath, true);
  848. return list;
  849. }
  850. }
  851. [AllowAnonymous]
  852. [HttpGet("export")]
  853. public async Task<object> Export()
  854. {
  855. List<ExcelContent> list = new List<ExcelContent>();
  856. ExcelContent excelContent = new ExcelContent() { ExternalId = "123123" };
  857. list.Add(excelContent);
  858. return _exportApplication.ExportData<ExcelContent>(list, "demo.xlsx");
  859. }
  860. [HttpGet("pgsql")]
  861. public async Task<string> Pgsql()
  862. {
  863. var role = new Identity.Roles.Role
  864. {
  865. Name = $"test_role_{TimeOnly.FromDateTime(DateTime.Now)}",
  866. DisplayName = "test_role_display",
  867. ClientId = "test"
  868. };
  869. var roleId = await _roleRepository.AddAsync(role, HttpContext.RequestAborted);
  870. role.Description = "Description";
  871. await _roleRepository.UpdateAsync(role, HttpContext.RequestAborted);
  872. return roleId;
  873. }
  874. [AllowAnonymous]
  875. [HttpGet("roles")]
  876. public async Task<List<Identity.Roles.Role>> GetRoles()
  877. {
  878. using var lockManager = new LockManager(_distributedLock, $"{nameof(TestController)}.{nameof(GetRoles)}");
  879. lockManager.InvokeInLock(() => { Console.WriteLine("do something"); }, TimeSpan.FromSeconds(10));
  880. await lockManager.InvokeInLockAsync(
  881. d => _roleRepository.Queryable(includeDeleted: true).ToListAsync(),
  882. TimeSpan.FromSeconds(10),
  883. HttpContext.RequestAborted);
  884. var a = await _roleRepository.Queryable()
  885. //.Where(d => !d.IsDeleted)
  886. .ToListAsync();
  887. //var a = await db.Queryable<Role>().ToListAsync();
  888. var b = await _roleRepository.Queryable(includeDeleted: true).ToListAsync();
  889. return a;
  890. }
  891. //[AllowAnonymous]
  892. [HttpGet("hash")]
  893. public async Task Hash()
  894. {
  895. var s = _sessionContext;
  896. }
  897. /// <summary>
  898. /// signalR测试(method: Ring)
  899. /// </summary>
  900. /// <returns></returns>
  901. [HttpGet("ring")]
  902. public async Task RingTest()
  903. {
  904. await _realtimeService.RingAsync(_sessionContext.RequiredUserId,
  905. new RingDto { Id = new Guid().ToString(), From = _sessionContext.Phone ?? "未知号码", To = "12345" },
  906. HttpContext.RequestAborted);
  907. }
  908. /// <summary>
  909. /// signalR测试(method: Answered)
  910. /// </summary>
  911. /// <returns></returns>
  912. [HttpGet("answered")]
  913. public async Task AnsweredTest()
  914. {
  915. await _realtimeService.AnsweredAsync(_sessionContext.RequiredUserId,
  916. new AnsweredDto() { Id = new Guid().ToString(), From = _sessionContext.Phone ?? "未知号码", To = "12345" },
  917. HttpContext.RequestAborted);
  918. }
  919. /// <summary>
  920. /// signalR测试(method: Bye)
  921. /// </summary>
  922. /// <returns></returns>
  923. [HttpGet("bye")]
  924. public async Task ByeTest()
  925. {
  926. await _realtimeService.ByeAsync(_sessionContext.RequiredUserId, new ByeDto() { Id = new Guid().ToString() },
  927. HttpContext.RequestAborted);
  928. }
  929. [AllowAnonymous]
  930. [HttpGet("t2")]
  931. public async Task<string> GetCacheAllowAnonymous()
  932. {
  933. var systemAdministrator = _systemSettingCacheManager.GetSetting(SettingConstants.SystemAdministrator)?.SettingValue[0];
  934. return systemAdministrator;
  935. }
  936. [HttpGet("t3")]
  937. public async Task<string> GetCacheWithAuth()
  938. {
  939. var systemAdministrator = _systemSettingCacheManager.GetSetting(SettingConstants.SystemAdministrator)?.SettingValue[0];
  940. return systemAdministrator;
  941. }
  942. [HttpGet("t4")]
  943. [AllowAnonymous]
  944. public async Task<string> Test4()
  945. {
  946. var a = await _expireTime.CalcWorkTimeToDecimal(DateTime.Parse("2024-12-17 22:33:22"), DateTime.Parse("2024-12-18 10:29:53"), false);
  947. return DateTime.Now.ToString("O");
  948. }
  949. /// <summary>
  950. /// 批量处理甄别耗时问题
  951. /// </summary>
  952. /// <returns></returns>
  953. [HttpGet("order_screen_timeconsuming")]
  954. [AllowAnonymous]
  955. public async Task OrderScreenTimeConsuming()
  956. {
  957. var screens = await _orderScreenRepository.Queryable().ToListAsync();
  958. foreach (var item in screens)
  959. {
  960. var visit = await _orderVisitRepository.Queryable().Where(x => x.Id == item.VisitId).FirstAsync();
  961. if (visit != null)
  962. {
  963. var time = await _expireTime.CalcWorkTimeToDecimal(visit.VisitTime.Value, item.CreationTime, false);
  964. await _orderScreenRepository.Updateable().SetColumns(x => new OrderScreen { TimeConsuming = time }).Where(x => x.Id == item.Id).ExecuteCommandAsync();
  965. }
  966. }
  967. }
  968. [AllowAnonymous]
  969. [HttpGet("t5")]
  970. public async Task<string> GetUserAllowAnonymous()
  971. {
  972. //var users = await _userRepository.Queryable()
  973. // .FirstAsync(d => d.Name == "xf", HttpContext.RequestAborted);
  974. //return users.Id;
  975. //var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
  976. //CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
  977. //var b = cityBase;
  978. //var a = await _expireTime.GetWorkDay(DateTime.Now);
  979. //自动延期订阅
  980. _capPublisher.PublishDelay(DateTime.Parse("2024-10-14 14:28:00") - DateTime.Now.AddHours(1), EventNames.HotlineOrderAutomaticDelay, new PublishAutomaticDelayDto() { OrderId = "08dcebff-2fae-4c30-824f-fe2ef4d582ae" });
  981. return string.Empty;
  982. }
  983. [HttpGet("t6")]
  984. public async Task<string> GetUserWithAuth()
  985. {
  986. var users = await _userRepository.Queryable()
  987. .FirstAsync(d => d.Name == "xf", HttpContext.RequestAborted);
  988. return users.Id;
  989. }
  990. [HttpGet("rsa")]
  991. public async Task<string> Rsa()
  992. {
  993. var keyList = RsaKeyGenerator.Pkcs1Key(2048, true);
  994. var privateKey = keyList[0];
  995. var publicKey = keyList[1];
  996. return $"{publicKey} \r\n {privateKey}";
  997. }
  998. [AllowAnonymous]
  999. [HttpGet("republish")]
  1000. public async Task Republish()
  1001. {
  1002. var provinceNos = new List<string>
  1003. {
  1004. "RGDH9951150024082950312",
  1005. "RGDH9951150024080750198",
  1006. "RGDH9951150024083050009",
  1007. };
  1008. _logger.LogWarning($"推送数据共:{provinceNos.Count}");
  1009. var unpublishOrders = await _orderRepository.Queryable()
  1010. .Where(d => provinceNos.Contains(d.ProvinceNo) &&
  1011. !string.IsNullOrEmpty(d.ProvinceNo) &&
  1012. d.Status >= EOrderStatus.Filed)
  1013. .ToListAsync(HttpContext.RequestAborted);
  1014. _logger.LogWarning($"准备开始推送:{unpublishOrders.Count}");
  1015. foreach (var order in unpublishOrders)
  1016. {
  1017. var trace = await _workflowTraceRepository.Queryable()
  1018. .FirstAsync(d => d.WorkflowId == order.WorkflowId && d.StepType == EStepType.End,
  1019. HttpContext.RequestAborted);
  1020. var orderFlowDto = new OrderFlowDto
  1021. {
  1022. Order = _mapper.Map<OrderDto>(order),
  1023. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
  1024. };
  1025. if (order.SourceChannelCode == AppDefaults.SourceChannel.DianHua &&
  1026. !string.IsNullOrEmpty(order.CallId))
  1027. {
  1028. if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.TianRun)
  1029. {
  1030. var callRecord = await _callApplication.GetTianrunCallAsync(order.CallId, HttpContext.RequestAborted);
  1031. if (callRecord != null)
  1032. {
  1033. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  1034. }
  1035. }
  1036. else if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XingTang)
  1037. {
  1038. var call = await _callApplication.GetCallAsync(order.CallId, HttpContext.RequestAborted);
  1039. if (call is not null)
  1040. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(call);
  1041. }
  1042. }
  1043. //这里需要判断是否是警情退回
  1044. orderFlowDto.IsNonPoliceReturn = false;
  1045. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: HttpContext.RequestAborted);
  1046. _logger.LogWarning($"推送完成: {order.ProvinceNo}");
  1047. }
  1048. _logger.LogWarning($"推送完成");
  1049. }
  1050. /// <summary>
  1051. /// 自动延期测试
  1052. /// </summary>
  1053. /// <param name="ExpiredTime"></param>
  1054. /// <param name="orderId"></param>
  1055. /// <returns></returns>
  1056. [HttpGet("automatic_delay")]
  1057. [AllowAnonymous]
  1058. public async Task AutomaticDelay(DateTime ExpiredTime, string orderId)
  1059. {
  1060. _capPublisher.PublishDelay(ExpiredTime - DateTime.Now.AddHours(1), EventNames.HotlineOrderAutomaticDelay, new PublishAutomaticDelayDto() { OrderId = orderId });
  1061. }
  1062. /// <summary>
  1063. /// 根据省编号修复工单和通话记录
  1064. /// </summary>
  1065. /// <param name="ProvinceNos">省编号</param>
  1066. /// <returns></returns>
  1067. [HttpPost("push_order_call")]
  1068. [AllowAnonymous]
  1069. public async Task PushOrderCallAsync([FromBody] List<string> ProvinceNos)
  1070. {
  1071. var orders = await _orderRepository.Queryable()
  1072. .Where(m => ProvinceNos.Contains(m.ProvinceNo))
  1073. .ToListAsync();
  1074. foreach (var order in orders)
  1075. {
  1076. var call = await _callNativeRepository.Queryable()
  1077. .Where(m => m.Id == order.CallId)
  1078. .FirstAsync();
  1079. if (call == null) continue;
  1080. var orderDto = order.Adapt<OrderDto>();
  1081. await _capPublisher.PublishAsync(EventNames.HotlineCallConnectWithOrder, new PublishCallRecrodDto()
  1082. {
  1083. Order = orderDto,
  1084. TrCallRecordDto = call.Adapt<TrCallDto>()
  1085. }, cancellationToken: HttpContext.RequestAborted);
  1086. }
  1087. }
  1088. /// <summary>
  1089. /// 老系统数据同步
  1090. /// </summary>
  1091. /// <returns></returns>
  1092. [HttpGet("old_data_synchronization")]
  1093. [AllowAnonymous]
  1094. public async Task oldDataSynchronization([FromQuery] string? no)
  1095. {
  1096. var orders = new List<Order>();
  1097. if (string.IsNullOrEmpty(no))
  1098. {
  1099. orders = await _orderRepository.Queryable().Where(x => x.No.Length == 12 && x.ActualHandleTime == null && x.CenterToOrgTime == null)
  1100. .Where(x => x.CreationTime >= DateTime.Parse("2024-01-01") && x.CreationTime < DateTime.Parse("2024-02-01")).ToListAsync();
  1101. }
  1102. else
  1103. {
  1104. orders = await _orderRepository.Queryable().Where(x => x.No == no).ToListAsync();
  1105. }
  1106. foreach (var order in orders)
  1107. {
  1108. var steps = await _workflowStepRepository.Queryable().Where(x => x.ExternalId == order.Id).ToListAsync();
  1109. var actualHandleStep = steps.Where(x => x.HandlerOrgId == order.ActualHandleOrgCode).OrderByDescending(x => x.CreationTime).FirstOrDefault();
  1110. var CenterToOrgStep = steps.Where(x => x.AssignerOrgId == "001" && x.HandlerOrgId != "001").OrderByDescending(x => x.CreationTime).FirstOrDefault();
  1111. order.ActualHandleTime = actualHandleStep.HandleTime;
  1112. order.CenterToOrgTime = CenterToOrgStep is null ? null : CenterToOrgStep.CreationTime;
  1113. await _orderRepository.Updateable().SetColumns(x => new Order { ActualHandleTime = order.ActualHandleTime, CenterToOrgTime = order.CenterToOrgTime }).Where(x => x.Id == order.Id).ExecuteCommandAsync();
  1114. var now = order.FiledTime.Value;
  1115. var handleDuration = order.StartTime.HasValue
  1116. ? //_timeLimitDomainService.CalcWorkTime(
  1117. await _expireTime.CalcWorkTime(
  1118. order.StartTime.Value,
  1119. now, order.ProcessType is EProcessType.Zhiban)
  1120. : 0;
  1121. var fileDuration = order.CenterToOrgTime.HasValue
  1122. ? // _timeLimitDomainService.CalcWorkTime(
  1123. await _expireTime.CalcWorkTime(
  1124. order.CenterToOrgTime.Value,
  1125. now, order.ProcessType is EProcessType.Zhiban)
  1126. : 0;
  1127. var allDuration = order.StartTime.HasValue
  1128. ?
  1129. //_timeLimitDomainService.CalcWorkTime(
  1130. await _expireTime.CalcWorkTime(
  1131. order.StartTime.Value, now,
  1132. order.ProcessType is EProcessType.Zhiban)
  1133. : 0;
  1134. var creationTimeHandleDurationWorkday = order.ActualHandleTime.HasValue
  1135. ?
  1136. // _timeLimitDomainService.CalcWorkTime(
  1137. await _expireTime.CalcWorkTime(
  1138. order.CreationTime, now,
  1139. order.ProcessType is EProcessType.Zhiban)
  1140. : 0;
  1141. var centerToOrgHandleDurationWorkday = order.ActualHandleTime.HasValue && order.CenterToOrgTime.HasValue
  1142. ?
  1143. // _timeLimitDomainService.CalcWorkTime(
  1144. await _expireTime.CalcWorkTime(
  1145. order.CenterToOrgTime.Value, now,
  1146. order.ProcessType is EProcessType.Zhiban)
  1147. : 0;
  1148. creationTimeHandleDurationWorkday = creationTimeHandleDurationWorkday <= 0 ? 10 : creationTimeHandleDurationWorkday;
  1149. centerToOrgHandleDurationWorkday = centerToOrgHandleDurationWorkday <= 0 ? 10 : centerToOrgHandleDurationWorkday;
  1150. order.File(now, handleDuration, fileDuration, allDuration, creationTimeHandleDurationWorkday, centerToOrgHandleDurationWorkday);
  1151. }
  1152. }
  1153. [HttpGet("aiXingTang")]
  1154. [AllowAnonymous]
  1155. public async Task aiXingTang()
  1156. {
  1157. var aiQualityService = _serviceProvider.GetRequiredService<IAiQualityService>();
  1158. await aiQualityService.CreateAiOrderQualityTask("cs202501030002.mp3", HttpContext.RequestAborted);
  1159. }
  1160. /// <summary>
  1161. /// 加密验证
  1162. /// </summary>
  1163. /// <param name="dto"></param>
  1164. /// <returns></returns>
  1165. [HttpPost("check_token")]
  1166. [AllowAnonymous]
  1167. public async Task<string> CheckAES([FromBody] CheckTokenDto dto)
  1168. {
  1169. var strString = dto.AppId + dto.Timestamp;
  1170. return dto.AppId + EncryptProvider.AESEncrypt(strString, dto.Secret, dto.AppId);
  1171. }
  1172. /// <summary>
  1173. /// 归档handle错误数据处理
  1174. /// </summary>
  1175. /// <returns></returns>
  1176. [HttpGet("end_order_data_dispose")]
  1177. [AllowAnonymous]
  1178. public async Task EndOrderDataDispose(string No, DateTime fileTime)
  1179. {
  1180. var orderNo = await _orderRepository.Queryable().Where(x => x.No == No).FirstAsync(HttpContext.RequestAborted);
  1181. var workflow = await _workflowRepository.Queryable().Where(x => x.ExternalId == orderNo.Id).FirstAsync(HttpContext.RequestAborted);
  1182. var notification = await _workflowStepRepository.Queryable().Includes(x => x.Workflow, w => w.Steps).Where(x => x.ExternalId == orderNo.Id && x.BusinessType == EBusinessType.File && x.StepType == EStepType.End).FirstAsync(HttpContext.RequestAborted);
  1183. var order = await _orderDomainService.GetOrderAsync(orderNo.Id,
  1184. withExtension: true, cancellationToken: HttpContext.RequestAborted);
  1185. //order.CheckIfFiled();
  1186. //order.UpdateHandlingStatus(workflow.IsInCountersign);
  1187. _mapper.Map(workflow, order);
  1188. if (notification != null)
  1189. {
  1190. DateTime now;
  1191. if (notification.HandleTime.HasValue)
  1192. now = notification.HandleTime.Value;
  1193. else
  1194. now = fileTime;// DateTime.Now;
  1195. var handleDuration = order.CenterToOrgTime.HasValue && order.ActualHandleTime.HasValue
  1196. ? // _timeLimitDomainService.CalcWorkTime(
  1197. await _expireTime.CalcWorkTime(
  1198. order.CenterToOrgTime.Value,
  1199. order.ActualHandleTime.Value, order.ProcessType is EProcessType.Zhiban)
  1200. : 0;
  1201. var fileDuration = order.CenterToOrgTime.HasValue
  1202. ? //_timeLimitDomainService.CalcWorkTime(
  1203. await _expireTime.CalcWorkTime(
  1204. order.CenterToOrgTime.Value,
  1205. now, order.ProcessType is EProcessType.Zhiban)
  1206. : 0;
  1207. var allDuration = order.StartTime.HasValue
  1208. ? // _timeLimitDomainService.CalcWorkTime(
  1209. await _expireTime.CalcWorkTime(
  1210. order.StartTime.Value, now,
  1211. order.ProcessType is EProcessType.Zhiban)
  1212. : 0;
  1213. var creationTimeHandleDurationWorkday = order.ActualHandleTime.HasValue
  1214. ? //_timeLimitDomainService.CalcWorkTimeEx(
  1215. await _expireTime.CalcWorkTimeEx(
  1216. order.CreationTime, now,
  1217. order.ProcessType is EProcessType.Zhiban)
  1218. : 0;
  1219. var centerToOrgHandleDurationWorkday = order.ActualHandleTime.HasValue && order.CenterToOrgTime.HasValue
  1220. ? //_timeLimitDomainService.CalcWorkTimeEx(
  1221. await _expireTime.CalcWorkTimeEx(
  1222. order.CenterToOrgTime.Value, now,
  1223. order.ProcessType is EProcessType.Zhiban)
  1224. : 0;
  1225. creationTimeHandleDurationWorkday = creationTimeHandleDurationWorkday <= 0 ? 10 : creationTimeHandleDurationWorkday;
  1226. centerToOrgHandleDurationWorkday = centerToOrgHandleDurationWorkday <= 0 ? 10 : centerToOrgHandleDurationWorkday;
  1227. order.File(now, handleDuration, fileDuration, allDuration, creationTimeHandleDurationWorkday, centerToOrgHandleDurationWorkday);
  1228. order.FileUserId = notification.HandlerId;
  1229. order.FileUserName = notification.HandlerName;
  1230. order.FileUserOrgId = notification.HandlerOrgId;
  1231. order.FileUserOrgName = notification.HandlerOrgName;
  1232. order.FileOrgIsCenter = notification.HandlerOrgIsCenter;
  1233. order.FileOpinion = notification.Opinion;
  1234. //记录冗余归档数据
  1235. if (notification.Workflow.Steps.Any(x => x.BusinessType == Share.Enums.FlowEngine.EBusinessType.Send))
  1236. {
  1237. order.FileUserRole = EFileUserType.Dispatch;
  1238. }
  1239. else
  1240. {
  1241. order.FileUserRole = EFileUserType.Seat;
  1242. }
  1243. if (order.ProcessType == EProcessType.Jiaoban)
  1244. {
  1245. order.FileUserRole = EFileUserType.Org;
  1246. }
  1247. //是否已解决
  1248. order.IsResolved = true;
  1249. await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
  1250. var trace = await _workflowStepRepository.Queryable().Includes(x => x.Workflow, w => w.Steps).Where(x => x.ExternalId == order.Id
  1251. && x.BusinessType == EBusinessType.File && x.StepType == EStepType.End).FirstAsync(HttpContext.RequestAborted);
  1252. var orderFlowDto = new OrderFlowDto
  1253. {
  1254. Order = _mapper.Map<OrderDto>(order),
  1255. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
  1256. };
  1257. //这里需要判断是否是警情退回
  1258. orderFlowDto.IsNonPoliceReturn = false;
  1259. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: HttpContext.RequestAborted);
  1260. }
  1261. }
  1262. /// <summary>
  1263. /// 延期EndHandle错误数据处理
  1264. /// </summary>
  1265. /// <returns></returns>
  1266. [HttpPost("end_order_delay")]
  1267. [AllowAnonymous]
  1268. public async Task EndOrderDelay([FromBody] OrderDelayEndHandleDto dto)
  1269. {
  1270. var delay = await _orderDelayRepository.GetAsync(dto.DelayId);
  1271. if (delay != null)
  1272. {
  1273. //delay.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
  1274. delay.DelayState = dto.IsReviewPass ? EDelayState.Pass : EDelayState.NoPass;
  1275. await _orderDelayRepository.Updateable(delay)
  1276. .UpdateColumns(d => d.DelayState)
  1277. .ExecuteCommandAsync();
  1278. if (dto.IsReviewPass)
  1279. {
  1280. //处理工单延期
  1281. await _orderApplication.DelayOrderExpiredTimeAsync(delay.OrderId, delay.DelayNum,
  1282. delay.DelayUnit, delay.IsProDelay, HttpContext.RequestAborted);
  1283. }
  1284. }
  1285. }
  1286. ///// <summary>
  1287. ///// 重推归档数据(设置超期时间和归档时间)
  1288. ///// </summary>
  1289. ///// <param name="no"></param>
  1290. ///// <param name="expiredTime"></param>
  1291. ///// <param name="filedTime"></param>
  1292. ///// <returns></returns>
  1293. //[HttpGet("repush-order-file")]
  1294. //[AllowAnonymous]
  1295. //public async Task RepushOrderFile(string no, DateTime expiredTime, DateTime filedTime)
  1296. //{
  1297. // var order = await _orderRepository.Queryable()
  1298. // .FirstAsync(d => d.No == no, HttpContext.RequestAborted);
  1299. // var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withTraces: true);
  1300. // var orderFlowDto = new OrderFlowDto
  1301. // {
  1302. // Order = _mapper.Map<OrderDto>(order),
  1303. // WorkflowTrace = _mapper.Map<WorkflowTraceDto>(notification.Trace)
  1304. // };
  1305. // await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: cancellationToken);
  1306. //}
  1307. }