TestController.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. using System.Collections.Concurrent;
  2. using System.Data;
  3. using System.IO;
  4. using System.Threading;
  5. using DotNetCore.CAP;
  6. using Fw.Utility.Client;
  7. using Google.Protobuf.WellKnownTypes;
  8. using Hotline.Ai.Visit;
  9. using Hotline.Application.ExportExcel;
  10. using Hotline.Application.JudicialManagement;
  11. using Hotline.Application.Quality;
  12. using Hotline.CallCenter.BlackLists;
  13. using Hotline.CallCenter.Calls;
  14. using Hotline.CallCenter.Devices;
  15. using Hotline.CallCenter.Ivrs;
  16. using Hotline.FlowEngine.WorkflowModules;
  17. using Hotline.FlowEngine.Workflows;
  18. using Hotline.Identity.Roles;
  19. using Hotline.Import;
  20. using Hotline.Orders;
  21. using Hotline.Push.Notifies;
  22. using Hotline.Realtimes;
  23. using Hotline.Repository.SqlSugar;
  24. using Hotline.Repository.SqlSugar.CallCenter;
  25. using Hotline.Repository.SqlSugar.System;
  26. using Hotline.Repository.SqlSugar.Ts;
  27. using Hotline.Settings;
  28. using Hotline.Settings.TimeLimits;
  29. using Hotline.Share.Dtos;
  30. using Hotline.Share.Dtos.FlowEngine;
  31. using Hotline.Share.Dtos.FlowEngine.Workflow;
  32. using Hotline.Share.Dtos.Order;
  33. using Hotline.Share.Dtos.Realtime;
  34. using Hotline.Share.Dtos.SendSms;
  35. using Hotline.Share.Dtos.TrCallCenter;
  36. using Hotline.Share.Enums.FlowEngine;
  37. using Hotline.Share.Enums.Order;
  38. using Hotline.Share.Enums.Push;
  39. using Hotline.Share.Enums.Quality;
  40. using Hotline.Share.Enums.Settings;
  41. using Hotline.Share.Mq;
  42. using Hotline.Tools;
  43. using Hotline.Users;
  44. using MapsterMapper;
  45. using MediatR;
  46. using Microsoft.AspNetCore.Authorization;
  47. using Microsoft.AspNetCore.Components.Routing;
  48. using Microsoft.AspNetCore.Http;
  49. using Microsoft.AspNetCore.Mvc;
  50. using Microsoft.AspNetCore.Routing.Template;
  51. using Microsoft.Extensions.Options;
  52. using MiniExcelLibs;
  53. using NewRock.Sdk;
  54. using NewRock.Sdk.Security;
  55. using SqlSugar;
  56. using SqlSugar.SplitTableExtensions;
  57. using StackExchange.Redis;
  58. using Tr.Sdk;
  59. using XC.RSAUtil;
  60. using XF.Domain.Authentications;
  61. using XF.Domain.Cache;
  62. using XF.Domain.Entities;
  63. using XF.Domain.Exceptions;
  64. using XF.Domain.Filters;
  65. using XF.Domain.Locks;
  66. using XF.Domain.Queues;
  67. using XF.Domain.Repository;
  68. using XF.EasyCaching;
  69. using Order = Hotline.Orders.Order;
  70. namespace Hotline.Api.Controllers;
  71. /// <summary>
  72. ///
  73. /// </summary>
  74. [AllowAnonymous]
  75. public class TestController : BaseController
  76. {
  77. private readonly ILogger<TestController> _logger;
  78. private readonly IAuthorizeGenerator _authorizeGenerator;
  79. private readonly IOptionsSnapshot<CallCenterConfiguration> _options;
  80. private readonly ISessionContext _sessionContext;
  81. private readonly IRepository<User> _userRepository;
  82. private readonly ITypedCache<User> _cache;
  83. private readonly IRealtimeService _realtimeService;
  84. private readonly IBlacklistDomainService _blacklistDomainService;
  85. private readonly IIvrDomainService _ivrDomainService;
  86. private readonly ISugarUnitOfWork<HotlineDbContext> _uow;
  87. private readonly IRepository<Identity.Roles.Role> _roleRepository;
  88. private readonly IMediator _mediator;
  89. private readonly IDistributedLock _distributedLock;
  90. private readonly IRepository<OrderUrge> _orderUrgeRepository;
  91. private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
  92. private readonly ITimeLimitDomainService _timeLimitDomainService;
  93. private readonly IWfModuleDomainService _wfModuleDomainService;
  94. private readonly IDaySettingRepository _daySettingRepository;
  95. private readonly ITrClient _trClient;
  96. private readonly ICapPublisher _capPublisher;
  97. private readonly IQueue _queue;
  98. private readonly IExportApplication _exportApplication;
  99. private readonly IAiVisitService _aiVisitService;
  100. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  101. private readonly IRepository<WorkflowStep> _workflowStepRepository;
  102. private readonly IWorkflowRepository _workflowRepository;
  103. //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
  104. private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
  105. private readonly IOrderRepository _orderRepository;
  106. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  107. private readonly IQualityApplication _qualityApplication;
  108. private readonly IEnforcementApplication _enforcementApplication;
  109. private readonly IMapper _mapper;
  110. private readonly IOptionsSnapshot<SendSmsConfiguration> _sendSmsConfiguration;
  111. //private readonly ITypedCache<List<User>> _cache;
  112. //private readonly ICacheManager<User> _cache;
  113. public TestController(
  114. INewRockClient client,
  115. ILogger<TestController> logger,
  116. IAuthorizeGenerator authorizeGenerator,
  117. IOptionsSnapshot<CallCenterConfiguration> options,
  118. ISessionContext sessionContext,
  119. IRepository<User> userRepository,
  120. //ICacheManager<User> cache
  121. //ITypedCache<List<User>> cache
  122. ITypedCache<User> cache,
  123. IRealtimeService realtimeService,
  124. IBlacklistDomainService blacklistDomainService,
  125. IIvrDomainService ivrDomainService,
  126. ISugarUnitOfWork<HotlineDbContext> uow,
  127. IRepository<Identity.Roles.Role> roleRepository,
  128. IMediator mediator,
  129. IDistributedLock distributedLock,
  130. IRepository<OrderUrge> orderUrgeRepository,
  131. IRepositoryTextSearch<OrderTs> repositoryts,
  132. ITimeLimitDomainService timeLimitDomainService,
  133. IWfModuleDomainService wfModuleDomainService,
  134. IDaySettingRepository daySettingRepository,
  135. ITrClient trClient,
  136. ICapPublisher capPublisher,
  137. IQueue queue,
  138. IExportApplication exportApplication,
  139. IAiVisitService aiVisitService,
  140. IRepository<WorkflowTrace> workflowTraceRepository,
  141. IRepository<WorkflowStep> workflowStepRepository,
  142. IWorkflowRepository workflowRepository,
  143. //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
  144. IRepository<SystemOrganize> systemOrganizeRepository,
  145. IOrderRepository orderRepository,
  146. IRepository<TrCallRecord> trCallRecordRepository,
  147. IQualityApplication qualityApplication,
  148. IEnforcementApplication enforcementApplication,
  149. IMapper mapper,
  150. IOptionsSnapshot<SendSmsConfiguration> sendSmsConfiguration
  151. )
  152. {
  153. _logger = logger;
  154. _authorizeGenerator = authorizeGenerator;
  155. _options = options;
  156. _sessionContext = sessionContext;
  157. _userRepository = userRepository;
  158. _cache = cache;
  159. _realtimeService = realtimeService;
  160. _blacklistDomainService = blacklistDomainService;
  161. _ivrDomainService = ivrDomainService;
  162. _uow = uow;
  163. _roleRepository = roleRepository;
  164. _mediator = mediator;
  165. _distributedLock = distributedLock;
  166. _orderUrgeRepository = orderUrgeRepository;
  167. _repositoryts = repositoryts;
  168. _timeLimitDomainService = timeLimitDomainService;
  169. _wfModuleDomainService = wfModuleDomainService;
  170. _daySettingRepository = daySettingRepository;
  171. _trClient = trClient;
  172. _capPublisher = capPublisher;
  173. _queue = queue;
  174. _exportApplication = exportApplication;
  175. _aiVisitService = aiVisitService;
  176. _workflowTraceRepository = workflowTraceRepository;
  177. _workflowStepRepository = workflowStepRepository;
  178. _workflowRepository = workflowRepository;
  179. //_workflowStepHandleRepository = workflowStepHandleRepository;
  180. _systemOrganizeRepository = systemOrganizeRepository;
  181. _orderRepository = orderRepository;
  182. _trCallRecordRepository = trCallRecordRepository;
  183. _qualityApplication = qualityApplication;
  184. _enforcementApplication = enforcementApplication;
  185. _orderRepository = orderRepository;
  186. _mapper = mapper;
  187. _sendSmsConfiguration = sendSmsConfiguration;
  188. }
  189. [HttpGet("testo111")]
  190. [AllowAnonymous]
  191. public async Task Test111(DateTime StartTime, DateTime? EndTime)
  192. {
  193. var list = await _orderRepository.Queryable()
  194. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime && p.Status >= EOrderStatus.Filed)
  195. .Where(p => p.CreationTimeHandleDuration == null || p.CenterToOrgHandleDuration == null)
  196. .ToListAsync();
  197. if (list.Any())
  198. {
  199. foreach (var item in list)
  200. {
  201. var creationTimeHandleDurationWorkday = item.ActualHandleTime.HasValue
  202. ? _timeLimitDomainService.CalcWorkTime(item.CreationTime, item.ActualHandleTime.Value,
  203. item.ProcessType is EProcessType.Zhiban)
  204. : 0;
  205. var centerToOrgHandleDurationWorkday = item.ActualHandleTime.HasValue && item.CenterToOrgTime.HasValue
  206. ? _timeLimitDomainService.CalcWorkTime(item.CenterToOrgTime.Value, item.ActualHandleTime.Value,
  207. item.ProcessType is EProcessType.Zhiban)
  208. : 0;
  209. item.CreationTimeHandleDurationWorkday = creationTimeHandleDurationWorkday;
  210. item.CenterToOrgHandleDurationWorkday = centerToOrgHandleDurationWorkday;
  211. if (item.ActualHandleTime.HasValue)
  212. {
  213. var count = Math.Round((item.ActualHandleTime - item.CreationTime).Value.TotalSeconds);
  214. item.CreationTimeHandleDuration = count <= 0 ? 1 : count;
  215. }
  216. else
  217. item.CreationTimeHandleDuration = 0;
  218. if (item.ActualHandleTime.HasValue && item.CenterToOrgTime.HasValue)
  219. {
  220. var count = Math.Round((item.ActualHandleTime - item.CenterToOrgTime).Value.TotalSeconds);
  221. item.CenterToOrgHandleDuration = count <= 0 ? 1 : count;
  222. }
  223. else
  224. item.CenterToOrgHandleDuration = 0;
  225. await _orderRepository.UpdateAsync(item, HttpContext.RequestAborted);
  226. }
  227. }
  228. }
  229. [HttpGet("testo")]
  230. [AllowAnonymous]
  231. public async Task<OpenResponse> TestOrigin()
  232. {
  233. var messageDto = new Share.Dtos.Push.MessageDto
  234. {
  235. PushBusiness = EPushBusiness.OrderAccept,
  236. ExternalId = "123456789",
  237. OrderId = "123456789",
  238. PushPlatform = EPushPlatform.Sms,
  239. Remark = " order.Title",
  240. Name = "张三",
  241. TemplateCode = "1005",
  242. Params = new List<string>() { "20240610000022", "12345" },
  243. TelNumber = "15881689499",
  244. };
  245. await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
  246. var t = _sendSmsConfiguration.Value.Url;
  247. var now = DateTime.Now.ToString();
  248. return OpenResponse.Ok(now);
  249. }
  250. [HttpGet("init-orgname")]
  251. [AllowAnonymous]
  252. public async Task InitUserOrgFullName()
  253. {
  254. var list = await _userRepository.Queryable().Where(x => 1 == 1 && string.IsNullOrEmpty(x.FullOrgName)).ToListAsync();
  255. foreach (var item in list)
  256. {
  257. var orgFullName = "";
  258. var orgFullCode = "";
  259. var orgId = item.OrgId;
  260. int strLength = orgId.Length;
  261. int segmentsCount = strLength / 3;
  262. List<string> strings = new List<string>();
  263. for (int i = 0; i < segmentsCount; i++)
  264. {
  265. int startIndex = i * 3;
  266. int length = Math.Min(3, strLength - startIndex);
  267. strings.Add(orgId.Substring(startIndex, length));
  268. }
  269. if (strLength > 3)
  270. {
  271. orgFullCode = strings[0];
  272. strings.Remove(orgFullCode);
  273. }
  274. foreach (var str in strings)
  275. {
  276. orgFullCode = orgFullCode + str;
  277. var org = await _systemOrganizeRepository.GetAsync(orgFullCode);
  278. if (org != null)
  279. {
  280. orgFullName = orgFullName + org.Name + "/";
  281. }
  282. }
  283. if (orgFullName.Length > 0)
  284. {
  285. orgFullName = orgFullName.Remove(orgFullName.Length - 1);
  286. }
  287. item.FullOrgName = orgFullName;
  288. await _userRepository.UpdateAsync(item);
  289. }
  290. }
  291. [HttpPost("import")]
  292. [AllowAnonymous]
  293. public async Task<List<ExcelContent>> Import(IFormFile file)
  294. {
  295. //var FileName = file.FileName;
  296. //var fileExtension = Path.GetExtension(FileName);
  297. ////新文件名
  298. //var newFileName = DateTime.Now.ToString("yyyyMMddhhmmss");
  299. ////文件保存路径
  300. //var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Upload", newFileName);
  301. ////判断路径是否存在
  302. //if (!Directory.Exists(filePath))
  303. //{
  304. // //创建路径
  305. // Directory.CreateDirectory(filePath);
  306. //}
  307. //filePath = Path.Combine(filePath, newFileName+ fileExtension);
  308. using (var stream = new MemoryStream())
  309. {
  310. file.CopyTo(stream);
  311. var list = MiniExcel.Query<ExcelContent>(stream).ToList();
  312. //Directory.Delete(filePath, true);
  313. return list;
  314. }
  315. }
  316. [AllowAnonymous]
  317. [HttpGet("export")]
  318. public async Task<object> Export()
  319. {
  320. List<ExcelContent> list = new List<ExcelContent>();
  321. ExcelContent excelContent = new ExcelContent() { ExternalId = "123123" };
  322. list.Add(excelContent);
  323. return _exportApplication.ExportData<ExcelContent>(list, "demo.xlsx");
  324. }
  325. [HttpGet("time")]
  326. [AllowAnonymous]
  327. public async Task<OpenResponse> GetTime(string batchId, string taskId)
  328. {
  329. //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662", DateTime.Now,
  330. // new List<string> { "xx", "bb" }, HttpContext.RequestAborted);
  331. //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4663", DateTime.Now,
  332. // new List<string> { "aa", "bb", "cc" }, HttpContext.RequestAborted);
  333. var result0 = await _repositoryts.SearchAsync(new List<string> { "xx", "aa" }, HttpContext.RequestAborted);
  334. var result = await _repositoryts.SearchAsync(new List<string> { "bb" }, HttpContext.RequestAborted);
  335. var result1 = await _repositoryts.SearchAsync(new List<string> { "cc", "bb" }, HttpContext.RequestAborted);
  336. var result2 = await _repositoryts.SearchAsync(new List<string> { "cc", "xx" }, HttpContext.RequestAborted);
  337. var result3 = await _repositoryts.SearchAsync(new List<string> { "aa", "bb", "ss" }, HttpContext.RequestAborted);
  338. //await _repositoryts.UpdateVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662",
  339. // new List<string> { "ss", "bb" }, HttpContext.RequestAborted);
  340. //_uow.Db.Ado.SqlQueryAsync<OrderUrge>("SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat')")
  341. //var tests = _uowWex.Db.Ado.SqlQuery<Test>("select * from view_telinfo_full where IsSynch=@IsSynch", new { IsSynch = 0 });
  342. //var a = _uowWex.Db.Ado.ExecuteCommand("update telinfo set IsSynch=1 where GUID=@CallId", new { CallId = "b1f97f3c-88b6-4f42-b8de-83ed448854b0" });
  343. //var rsp = await _wexClient.QueryTelsAsync(new QueryTelRequest { }, HttpContext.RequestAborted);
  344. //int a = _timeLimitDomainService.CalcWorkTime(DateTime.Now, DateTime.Parse("2023-09-11 16:21:00"));
  345. //int m = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2023-09-19 12:00:00"), DateTime.Parse("2023-09-20 18:00:00"), false);
  346. //var r = _timeLimitDomainService.CalcEndTime(DateTime.Parse("2024-6-06 14:32:47"),"40");
  347. //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Parse("2024-02-29 10:12:33"), Share.Enums.FlowEngine.EFlowDirection.OrgToCenter, "10");
  348. //await _wfModuleDomainService.PersistenceModulesAsync(HttpContext.RequestAborted);
  349. //var rsp = await _daprClient.InvokeMethodAsync<ApiResponse<string>>(HttpMethod.Get, "identity", "api/v1/Test/time", HttpContext.RequestAborted);
  350. //var rsp1 = await _daprClient.InvokeMethodAsync<int, ApiResponse<string>>(HttpMethod.Post, "identity", "api/v1/Test/time1", 222, HttpContext.RequestAborted);
  351. //var a = await _trClient.QueryTelsAsync(new Tr.Sdk.Tels.QueryTelRequest() { }, HttpContext.RequestAborted);
  352. //await _daySettingRepository.IsWorkDay(DateTime.Now);
  353. //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-6-06 14:32:47"), DateTime.Parse("2024-3-22 06:00:00"), false);
  354. //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-24 17:20:00"), DateTime.Parse("2024-3-24 17:21:00"), false);
  355. //await _aiVisitService.QueryAiVisitTask(batchId, taskId, HttpContext.RequestAborted);
  356. //var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
  357. //var r = _timeLimitDomainService.CalcWorkTimeToDecimal(DateTime.Parse("2024-05-14 14:41:42"), DateTime.Parse("2024-05-14 14:50:46"), false);
  358. return OpenResponse.Ok(DateTime.Now.ToString("F"));
  359. }
  360. [HttpGet("pgsql")]
  361. public async Task<string> Pgsql()
  362. {
  363. var role = new Identity.Roles.Role
  364. {
  365. Name = $"test_role_{TimeOnly.FromDateTime(DateTime.Now)}",
  366. DisplayName = "test_role_display",
  367. ClientId = "test"
  368. };
  369. var roleId = await _roleRepository.AddAsync(role, HttpContext.RequestAborted);
  370. role.Description = "Description";
  371. await _roleRepository.UpdateAsync(role, HttpContext.RequestAborted);
  372. return roleId;
  373. }
  374. [AllowAnonymous]
  375. [HttpGet("roles")]
  376. public async Task<List<Identity.Roles.Role>> GetRoles()
  377. {
  378. using var lockManager = new LockManager(_distributedLock, $"{nameof(TestController)}.{nameof(GetRoles)}");
  379. lockManager.InvokeInLock(() => { Console.WriteLine("do something"); }, TimeSpan.FromSeconds(10));
  380. await lockManager.InvokeInLockAsync(
  381. d => _roleRepository.Queryable(includeDeleted: true).ToListAsync(),
  382. TimeSpan.FromSeconds(10),
  383. HttpContext.RequestAborted);
  384. var a = await _roleRepository.Queryable()
  385. //.Where(d => !d.IsDeleted)
  386. .ToListAsync();
  387. //var a = await db.Queryable<Role>().ToListAsync();
  388. var b = await _roleRepository.Queryable(includeDeleted: true).ToListAsync();
  389. return a;
  390. }
  391. //[AllowAnonymous]
  392. [HttpGet("hash")]
  393. public async Task Hash()
  394. {
  395. var s = _sessionContext;
  396. }
  397. /// <summary>
  398. /// signalR测试(method: Ring)
  399. /// </summary>
  400. /// <returns></returns>
  401. [HttpGet("ring")]
  402. public async Task RingTest()
  403. {
  404. await _realtimeService.RingAsync(_sessionContext.RequiredUserId,
  405. new RingDto { Id = new Guid().ToString(), From = _sessionContext.Phone ?? "未知号码", To = "12345" },
  406. HttpContext.RequestAborted);
  407. }
  408. /// <summary>
  409. /// signalR测试(method: Answered)
  410. /// </summary>
  411. /// <returns></returns>
  412. [HttpGet("answered")]
  413. public async Task AnsweredTest()
  414. {
  415. await _realtimeService.AnsweredAsync(_sessionContext.RequiredUserId,
  416. new AnsweredDto() { Id = new Guid().ToString(), From = _sessionContext.Phone ?? "未知号码", To = "12345" },
  417. HttpContext.RequestAborted);
  418. }
  419. /// <summary>
  420. /// signalR测试(method: Bye)
  421. /// </summary>
  422. /// <returns></returns>
  423. [HttpGet("bye")]
  424. public async Task ByeTest()
  425. {
  426. await _realtimeService.ByeAsync(_sessionContext.RequiredUserId, new ByeDto() { Id = new Guid().ToString() },
  427. HttpContext.RequestAborted);
  428. }
  429. /// <summary>
  430. ///
  431. /// </summary>
  432. /// <returns></returns>
  433. [AllowAnonymous]
  434. [HttpGet("t2")]
  435. public async Task GetVoiceEndAnswerAsyncTest()
  436. {
  437. //var answer = await _ivrDomainService.GetVoiceEndAnswerAsync("3", HttpContext.RequestAborted);
  438. //Console.WriteLine(answer.Content);
  439. throw new UserFriendlyException(2001, "test");
  440. }
  441. [HttpGet("wfdefine")]
  442. public async Task GetWorkflowDefine([FromQuery] string id)
  443. {
  444. //var query = _workflowTraceRepository.Queryable()
  445. // .LeftJoin<Workflow>((t, w) => t.WorkflowId == w.Id)
  446. // .LeftJoin<Order>((t, w, o) => w.ExternalId == o.Id)
  447. // .Where((t, w, o) => o.No.Length == 14);
  448. //if (!string.IsNullOrEmpty(id))
  449. // query = query.Where(d => d.WorkflowId == id);
  450. //var list = await query
  451. // .Select((t, w, o) => new { t, w, o })
  452. // .ToListAsync(HttpContext.RequestAborted);
  453. //var toUsers = list.Where(d => d.t.FlowAssignType == EFlowAssignType.User).ToList();
  454. //var userIds = toUsers.SelectMany(d => d.t.Handlers).Select(d => d.Key).Distinct().ToList();
  455. //var users = await _userRepository.Queryable()
  456. // .Includes(d => d.Organization)
  457. // .Where(d => userIds.Contains(d.Id))
  458. // .ToListAsync(HttpContext.RequestAborted);
  459. ////var orgTraces = list.Where(d => d.FlowAssignType == EFlowAssignType.Org).ToList();
  460. //var stepHandlers = new List<WorkflowStepHandler>();
  461. //foreach (var toUser in toUsers)
  462. //{
  463. // foreach (var traceHandler in toUser.t.Handlers)
  464. // {
  465. // var user = users.FirstOrDefault(d => d.Id == traceHandler.Key);
  466. // if (user != null)
  467. // stepHandlers.Add(new WorkflowStepHandler
  468. // {
  469. // WorkflowId = toUser.w.Id,
  470. // ExternalId = toUser.w.ExternalId,
  471. // WorkflowStepId = toUser.t.StepId,
  472. // FlowAssignType = toUser.t.FlowAssignType.Value,
  473. // UserId = user.Id,
  474. // Username = user.Name,
  475. // OrgId = user.OrgId,
  476. // OrgName = user.Organization.Name,
  477. // IsActualHandler = user.Id == toUser.t.HandlerId
  478. // });
  479. // }
  480. //}
  481. //var toOrgs = list.Where(d => d.t.FlowAssignType == EFlowAssignType.Org).ToList();
  482. //foreach (var toOrg in toOrgs)
  483. //{
  484. // foreach (var handler in toOrg.t.Handlers)
  485. // {
  486. // stepHandlers.Add(new WorkflowStepHandler
  487. // {
  488. // WorkflowId = toOrg.w.Id,
  489. // ExternalId = toOrg.w.ExternalId,
  490. // WorkflowStepId = toOrg.t.StepId,
  491. // FlowAssignType = toOrg.t.FlowAssignType.Value,
  492. // OrgId = handler.Key,
  493. // OrgName = handler.Value,
  494. // IsActualHandler = handler.Key == toOrg.t.HandlerOrgId
  495. // });
  496. // }
  497. //}
  498. //_logger.LogInformation($"生成handlers: {stepHandlers.Count} 条");
  499. //await _workflowStepHandleRepository.AddRangeAsync(stepHandlers, HttpContext.RequestAborted);
  500. }
  501. /// <summary>
  502. /// 处理FlowAssignType
  503. /// </summary>
  504. /// <returns></returns>
  505. [AllowAnonymous]
  506. [HttpPost("t3")]
  507. public async Task TestExportExcel()
  508. {
  509. var orders = await _orderRepository.Queryable()
  510. //.Includes(d => d.Workflow, x => x.Steps.Where(d => d.BusinessType == EBusinessType.Send))
  511. //.Where(d=>d.Workflow.Steps.Any(d=>d.BusinessType == EBusinessType.Send))
  512. .Where(d => d.Status != EOrderStatus.WaitForAccept && d.CenterToOrgTime == null)
  513. .ToListAsync(HttpContext.RequestAborted);
  514. var orderIds = orders.Select(d => d.Id).ToList();
  515. var steps = await _workflowStepRepository.Queryable()
  516. .Where(d => orderIds.Contains(d.ExternalId) &&
  517. d.BusinessType == EBusinessType.Send &&
  518. d.Status == EWorkflowStepStatus.Handled)
  519. .OrderBy(d => d.CreationTime)
  520. .ToListAsync(HttpContext.RequestAborted);
  521. _logger.LogWarning($"取到steps: {steps.Count} 条");
  522. var updateOrders = new List<Order>();
  523. foreach (var order in orders)
  524. {
  525. var step = steps.Where(d => d.ExternalId == order.Id)
  526. .OrderBy(d => d.CreationTime)
  527. .FirstOrDefault();
  528. if (step is null) continue;
  529. order.CenterToOrgTime = step.HandleTime;
  530. order.CenterToOrgHandlerId = step.HandlerId;
  531. order.CenterToOrgHandlerName = step.HandlerName;
  532. order.CenterToOrgOpinion = step.Opinion;
  533. var handleDuration = order.CenterToOrgTime.HasValue && order.ActualHandleTime.HasValue
  534. ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  535. order.ActualHandleTime.Value, order.ProcessType is EProcessType.Zhiban)
  536. : 0;
  537. var fileDuration = order.CenterToOrgTime.HasValue && order.FiledTime.HasValue
  538. ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  539. order.FiledTime.Value, order.ProcessType is EProcessType.Zhiban)
  540. : 0;
  541. //var allDuration = order.StartTime.HasValue
  542. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, order.FiledTime.Value,
  543. // order.ProcessType is EProcessType.Zhiban)
  544. // : 0;
  545. order.SetHandleDuration();
  546. order.SetFileDuration();
  547. order.HandleDurationWorkday = handleDuration;
  548. order.FileDurationWorkday = fileDuration;
  549. updateOrders.Add(order);
  550. }
  551. _logger.LogWarning($"更新工单:{updateOrders.Count} 条");
  552. await _orderRepository.UpdateRangeAsync(updateOrders, HttpContext.RequestAborted);
  553. }
  554. [AllowAnonymous]
  555. [HttpPost("t4")]
  556. public async Task TestExportExcel1()
  557. {
  558. //var orders = await _orderRepository.Queryable()
  559. // .Includes(d => d.OrderExtension)
  560. // .InnerJoin<Workflow>((o, w) => o.WorkflowId == w.Id)
  561. // .Where((o, w) => o.Status < EOrderStatus.Filed && w.Status == EWorkflowStatus.Completed)
  562. // .ToListAsync(HttpContext.RequestAborted);
  563. //_logger.LogWarning($"order count: {orders.Count}");
  564. //var workflowIds = orders.Select(d => d.WorkflowId).ToList();
  565. //var workflows = await _workflowRepository.Queryable()
  566. // .Includes(d => d.Steps, x => x.WorkflowTrace)
  567. // //.Includes(d=>d.Traces)
  568. // .Where(d => workflowIds.Contains(d.Id))
  569. // .ToListAsync(HttpContext.RequestAborted);
  570. //var updateOrders = new List<Order>();
  571. //foreach (var order in orders)
  572. //{
  573. // var workflow = workflows.First(d => d.Id == order.WorkflowId);
  574. // _mapper.Map(workflow, order);
  575. // var now = DateTime.Now;
  576. // var handleDuration = order.StartTime.HasValue
  577. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
  578. // now, order.ProcessType is EProcessType.Zhiban)
  579. // : 0;
  580. // var fileDuration = order.CenterToOrgTime.HasValue
  581. // ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  582. // now, order.ProcessType is EProcessType.Zhiban)
  583. // : 0;
  584. // var allDuration = order.StartTime.HasValue
  585. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
  586. // order.ProcessType is EProcessType.Zhiban)
  587. // : 0;
  588. // var creationTimeHandleDurationWorkday = order.ActualHandleTime.HasValue
  589. // ? _timeLimitDomainService.CalcWorkTime(order.CreationTime, order.ActualHandleTime.Value,
  590. // order.ProcessType is EProcessType.Zhiban)
  591. // : 0;
  592. // var centerToOrgHandleDurationWorkday = order.ActualHandleTime.HasValue && order.CenterToOrgTime.HasValue
  593. // ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value, order.ActualHandleTime.Value,
  594. // order.ProcessType is EProcessType.Zhiban)
  595. // : 0;
  596. // order.File(now, handleDuration, fileDuration, allDuration, creationTimeHandleDurationWorkday, centerToOrgHandleDurationWorkday);
  597. // var endStep = workflow.Steps.FirstOrDefault(d => d.StepType == EStepType.End);
  598. // //var endTrace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.StepType == EStepType.End)?.WorkflowTrace;
  599. // if (endStep is null)
  600. // {
  601. // _logger.LogWarning($"endStep 为空, orderNo:{order.No}");
  602. // continue;
  603. // }
  604. // var step = workflow.Steps.FirstOrDefault(d => d.Id == endStep.PrevStepId);
  605. // //var trace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.Id == endTrace.PrevStepId)?.WorkflowTrace;
  606. // if (step is null)
  607. // {
  608. // _logger.LogWarning($"step 为空, orderNo:{order.No}");
  609. // continue;
  610. // }
  611. // var trace = step.WorkflowTrace;
  612. // order.FileUserId = trace.HandlerId;
  613. // order.FileUserName = trace.HandlerName;
  614. // order.FileUserOrgId = trace.HandlerOrgId;
  615. // order.FileUserOrgName = trace.HandlerOrgName;
  616. // order.FileOpinion = trace.Opinion;
  617. // //记录冗余归档数据
  618. // if (workflow.Steps.Any(x => x.BusinessType == Share.Enums.FlowEngine.EBusinessType.Send))
  619. // {
  620. // order.FileUserRole = EFileUserType.Dispatch;
  621. // }
  622. // else
  623. // {
  624. // order.FileUserRole = EFileUserType.Seat;
  625. // }
  626. // if (order.ProcessType == EProcessType.Jiaoban)
  627. // {
  628. // order.FileUserRole = EFileUserType.Org;
  629. // }
  630. // //是否已解决
  631. // order.IsResolved = true;//notification.Dto.External == null ? false : notification.Dto.External.IsResolved;
  632. // //await _orderRepository.UpdateAsync(order, cancellationToken);
  633. // updateOrders.Add(order);
  634. // //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken); //由CallAccept改为OtherAccept
  635. // var orderFlowDto = new OrderFlowDto
  636. // {
  637. // Order = _mapper.Map<OrderDto>(order),
  638. // WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
  639. // };
  640. // var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, HttpContext.RequestAborted);
  641. // if (callRecord != null)
  642. // {
  643. // orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  644. // }
  645. // //这里需要判断是否是警情退回
  646. // orderFlowDto.IsNonPoliceReturn = false;//notification.Dto.External == null ? false : notification.Dto.External.IsPoliceReturn;
  647. // await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: HttpContext.RequestAborted);
  648. // //写入质检 针对受理之后直接结束的工单
  649. // await _qualityApplication.AddQualityAsync(EQualitySource.Accepted, order.Id, HttpContext.RequestAborted);
  650. // //司法行政监督管理-工单处理
  651. // await _enforcementApplication.AddEnforcementOrderAsync(order, HttpContext.RequestAborted);
  652. //}
  653. //_logger.LogWarning($"更新orders:{updateOrders.Count}");
  654. //await _orderRepository.UpdateRangeAsync(updateOrders, HttpContext.RequestAborted);
  655. }
  656. [AllowAnonymous]
  657. [HttpGet("t5")]
  658. public async Task Test5()
  659. {
  660. var traces = await _workflowTraceRepository.Queryable()
  661. .Where(d => d.Status == EWorkflowStepStatus.Handled && d.HandlerOrgAreaCode == null)
  662. .ToListAsync(HttpContext.RequestAborted);
  663. var orgIds = traces.Select(d => d.HandlerOrgId).ToList();
  664. var orgs = await _systemOrganizeRepository.Queryable()
  665. .Where(d => orgIds.Contains(d.Id))
  666. .ToListAsync(HttpContext.RequestAborted);
  667. var updateSteps = new List<WorkflowTrace>();
  668. foreach (var trace in traces)
  669. {
  670. var org = orgs.FirstOrDefault(d => d.Id == trace.HandlerOrgId);
  671. if (org == null)
  672. {
  673. _logger.LogWarning($"未找到部门,Id:{trace.HandlerOrgId}");
  674. continue;
  675. }
  676. if (!trace.HandlerOrgIsCenter.HasValue)
  677. trace.HandlerOrgIsCenter = org.IsCenter;
  678. if (string.IsNullOrEmpty(trace.HandlerOrgAreaCode))
  679. trace.HandlerOrgAreaCode = org.AreaCode;
  680. if (string.IsNullOrEmpty(trace.HandlerOrgAreaName))
  681. trace.HandlerOrgAreaName = org.AreaName;
  682. updateSteps.Add(trace);
  683. }
  684. _logger.LogWarning($"更新数据:{updateSteps.Count} 条");
  685. await _workflowTraceRepository.UpdateRangeAsync(updateSteps, HttpContext.RequestAborted);
  686. }
  687. [HttpGet("rsa")]
  688. public async Task<string> Rsa()
  689. {
  690. var keyList = RsaKeyGenerator.Pkcs1Key(2048, true);
  691. var privateKey = keyList[0];
  692. var publicKey = keyList[1];
  693. return $"{publicKey} \r\n {privateKey}";
  694. }
  695. }