TestController.cs 60 KB

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