TestController.cs 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. using System.Collections.Concurrent;
  2. using System.Data;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Threading;
  6. using DotNetCore.CAP;
  7. using Fw.Utility.Client;
  8. using Google.Protobuf.WellKnownTypes;
  9. using Hotline.Ai.Visit;
  10. using Hotline.Application.ExportExcel;
  11. using Hotline.Application.FlowEngine;
  12. using Hotline.Application.JudicialManagement;
  13. using Hotline.Application.Orders;
  14. using Hotline.Application.Quality;
  15. using Hotline.Application.StatisticalReport;
  16. using Hotline.Authentications;
  17. using Hotline.CallCenter.BlackLists;
  18. using Hotline.CallCenter.Calls;
  19. using Hotline.CallCenter.Configs;
  20. using Hotline.CallCenter.Devices;
  21. using Hotline.CallCenter.Ivrs;
  22. using Hotline.ContingencyManagement;
  23. using Hotline.FlowEngine;
  24. using Hotline.FlowEngine.Definitions;
  25. using Hotline.FlowEngine.Notifications;
  26. using Hotline.FlowEngine.WorkflowModules;
  27. using Hotline.FlowEngine.Workflows;
  28. using Hotline.Identity.Roles;
  29. using Hotline.Import;
  30. using Hotline.JudicialManagement;
  31. using Hotline.Orders;
  32. using Hotline.Push.Notifies;
  33. using Hotline.Realtimes;
  34. using Hotline.Repository.SqlSugar;
  35. using Hotline.Repository.SqlSugar.CallCenter;
  36. using Hotline.Repository.SqlSugar.System;
  37. using Hotline.Repository.SqlSugar.Ts;
  38. using Hotline.Settings;
  39. using Hotline.Settings.Hotspots;
  40. using Hotline.Settings.TimeLimits;
  41. using Hotline.Share.Dtos;
  42. using Hotline.Share.Dtos.FlowEngine;
  43. using Hotline.Share.Dtos.FlowEngine.Workflow;
  44. using Hotline.Share.Dtos.Order;
  45. using Hotline.Share.Dtos.Realtime;
  46. using Hotline.Share.Dtos.SendSms;
  47. using Hotline.Share.Dtos.TrCallCenter;
  48. using Hotline.Share.Enums.FlowEngine;
  49. using Hotline.Share.Enums.JudicialManagement;
  50. using Hotline.Share.Enums.Order;
  51. using Hotline.Share.Enums.Push;
  52. using Hotline.Share.Enums.Quality;
  53. using Hotline.Share.Enums.Settings;
  54. using Hotline.Share.Mq;
  55. using Hotline.Share.Requests;
  56. using Hotline.Tools;
  57. using Hotline.Users;
  58. using MapsterMapper;
  59. using MediatR;
  60. using Microsoft.AspNetCore.Authorization;
  61. using Microsoft.AspNetCore.Components.Routing;
  62. using Microsoft.AspNetCore.Http;
  63. using Microsoft.AspNetCore.Mvc;
  64. using Microsoft.AspNetCore.Routing.Template;
  65. using Microsoft.Extensions.Options;
  66. using MiniExcelLibs;
  67. using MongoDB.Driver;
  68. using NewRock.Sdk;
  69. using NewRock.Sdk.Security;
  70. using SqlSugar;
  71. using SqlSugar.SplitTableExtensions;
  72. using StackExchange.Redis;
  73. using Tr.Sdk;
  74. using XC.RSAUtil;
  75. using XF.Domain.Authentications;
  76. using XF.Domain.Cache;
  77. using XF.Domain.Entities;
  78. using XF.Domain.Exceptions;
  79. using XF.Domain.Filters;
  80. using XF.Domain.Locks;
  81. using XF.Domain.Queues;
  82. using XF.Domain.Repository;
  83. using XF.EasyCaching;
  84. using Order = Hotline.Orders.Order;
  85. namespace Hotline.Api.Controllers;
  86. /// <summary>
  87. ///
  88. /// </summary>
  89. //[AllowAnonymous]
  90. public class TestController : BaseController
  91. {
  92. private readonly ILogger<TestController> _logger;
  93. private readonly IAuthorizeGenerator _authorizeGenerator;
  94. private readonly IOptionsSnapshot<CallCenterConfiguration> _options;
  95. private readonly ISessionContext _sessionContext;
  96. private readonly IRepository<User> _userRepository;
  97. private readonly ITypedCache<User> _cache;
  98. private readonly IRealtimeService _realtimeService;
  99. private readonly IBlacklistDomainService _blacklistDomainService;
  100. private readonly IIvrDomainService _ivrDomainService;
  101. private readonly ISugarUnitOfWork<HotlineDbContext> _uow;
  102. private readonly IRepository<Identity.Roles.Role> _roleRepository;
  103. private readonly IMediator _mediator;
  104. private readonly IDistributedLock _distributedLock;
  105. private readonly IRepository<OrderUrge> _orderUrgeRepository;
  106. private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
  107. private readonly ITimeLimitDomainService _timeLimitDomainService;
  108. private readonly IWfModuleDomainService _wfModuleDomainService;
  109. private readonly IDaySettingRepository _daySettingRepository;
  110. //private readonly ITrClient _trClient;
  111. private readonly ICapPublisher _capPublisher;
  112. private readonly IQueue _queue;
  113. private readonly IExportApplication _exportApplication;
  114. private readonly IAiVisitService _aiVisitService;
  115. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  116. private readonly IRepository<WorkflowStep> _workflowStepRepository;
  117. private readonly IWorkflowRepository _workflowRepository;
  118. //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
  119. private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
  120. private readonly IOrderRepository _orderRepository;
  121. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  122. private readonly IQualityApplication _qualityApplication;
  123. private readonly IEnforcementApplication _enforcementApplication;
  124. private readonly IWorkflowDomainService _workflowDomainService;
  125. private readonly IMapper _mapper;
  126. private readonly IOptionsSnapshot<SendSmsConfiguration> _sendSmsConfiguration;
  127. private readonly IOrderReportApplication _orderReportApplication;
  128. private readonly IRepository<EnforcementOrders> _enforcementOrdersRepository;
  129. private readonly IRepository<JudicialManagementOrders> _judicialManagementOrdersRepository;
  130. private readonly IRepository<EnforcementOrdersHandler> _enforcementOrdersHandlerRepository;
  131. private readonly IWorkflowApplication _workflowApplication;
  132. private readonly IRepository<ContingencyManagementHotspot> _contingencyManagementHotspotRepository;
  133. private readonly IRepository<Hotspot> _hotspotRepository;
  134. private readonly IOrderApplication _orderApplication;
  135. //private readonly ITypedCache<List<User>> _cache;
  136. //private readonly ICacheManager<User> _cache;
  137. public TestController(
  138. INewRockClient client,
  139. ILogger<TestController> logger,
  140. IAuthorizeGenerator authorizeGenerator,
  141. IOptionsSnapshot<CallCenterConfiguration> options,
  142. ISessionContext sessionContext,
  143. IRepository<User> userRepository,
  144. //ICacheManager<User> cache
  145. //ITypedCache<List<User>> cache
  146. ITypedCache<User> cache,
  147. IRealtimeService realtimeService,
  148. IBlacklistDomainService blacklistDomainService,
  149. IIvrDomainService ivrDomainService,
  150. ISugarUnitOfWork<HotlineDbContext> uow,
  151. IRepository<Identity.Roles.Role> roleRepository,
  152. IMediator mediator,
  153. IDistributedLock distributedLock,
  154. IRepository<OrderUrge> orderUrgeRepository,
  155. IRepositoryTextSearch<OrderTs> repositoryts,
  156. ITimeLimitDomainService timeLimitDomainService,
  157. IWfModuleDomainService wfModuleDomainService,
  158. IDaySettingRepository daySettingRepository,
  159. //ITrClient trClient,
  160. ICapPublisher capPublisher,
  161. IQueue queue,
  162. IExportApplication exportApplication,
  163. IAiVisitService aiVisitService,
  164. IRepository<WorkflowTrace> workflowTraceRepository,
  165. IRepository<WorkflowStep> workflowStepRepository,
  166. IWorkflowRepository workflowRepository,
  167. //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
  168. IRepository<SystemOrganize> systemOrganizeRepository,
  169. IOrderRepository orderRepository,
  170. IRepository<TrCallRecord> trCallRecordRepository,
  171. IQualityApplication qualityApplication,
  172. IEnforcementApplication enforcementApplication,
  173. IWorkflowDomainService workflowDomainService,
  174. IMapper mapper,
  175. IOrderApplication orderApplication,
  176. IOptionsSnapshot<SendSmsConfiguration> sendSmsConfiguration,
  177. IOrderReportApplication orderReportApplication,
  178. IRepository<EnforcementOrders> enforcementOrdersRepository,
  179. IRepository<JudicialManagementOrders> judicialManagementOrdersRepository,
  180. IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository,
  181. IRepository<ContingencyManagementHotspot> contingencyManagementHotspotRepository,
  182. IRepository<Hotspot> hotspotRepository
  183. )
  184. {
  185. _logger = logger;
  186. _authorizeGenerator = authorizeGenerator;
  187. _options = options;
  188. _sessionContext = sessionContext;
  189. _userRepository = userRepository;
  190. _cache = cache;
  191. _realtimeService = realtimeService;
  192. _blacklistDomainService = blacklistDomainService;
  193. _ivrDomainService = ivrDomainService;
  194. _uow = uow;
  195. _roleRepository = roleRepository;
  196. _mediator = mediator;
  197. _distributedLock = distributedLock;
  198. _orderUrgeRepository = orderUrgeRepository;
  199. _repositoryts = repositoryts;
  200. _timeLimitDomainService = timeLimitDomainService;
  201. _wfModuleDomainService = wfModuleDomainService;
  202. _daySettingRepository = daySettingRepository;
  203. //_trClient = trClient;
  204. _capPublisher = capPublisher;
  205. _queue = queue;
  206. _exportApplication = exportApplication;
  207. _aiVisitService = aiVisitService;
  208. _workflowTraceRepository = workflowTraceRepository;
  209. _workflowStepRepository = workflowStepRepository;
  210. _workflowRepository = workflowRepository;
  211. //_workflowStepHandleRepository = workflowStepHandleRepository;
  212. _systemOrganizeRepository = systemOrganizeRepository;
  213. _orderRepository = orderRepository;
  214. _trCallRecordRepository = trCallRecordRepository;
  215. _qualityApplication = qualityApplication;
  216. _enforcementApplication = enforcementApplication;
  217. _workflowDomainService = workflowDomainService;
  218. _orderRepository = orderRepository;
  219. _mapper = mapper;
  220. _sendSmsConfiguration = sendSmsConfiguration;
  221. _orderReportApplication = orderReportApplication;
  222. _enforcementOrdersRepository = enforcementOrdersRepository;
  223. _judicialManagementOrdersRepository = judicialManagementOrdersRepository;
  224. _enforcementOrdersHandlerRepository = enforcementOrdersHandlerRepository;
  225. _contingencyManagementHotspotRepository = contingencyManagementHotspotRepository;
  226. _hotspotRepository = hotspotRepository;
  227. _orderApplication = orderApplication;
  228. }
  229. /// <summary>
  230. /// 推送回访到省上
  231. /// </summary>
  232. /// <returns></returns>
  233. [HttpPost("publishVisitToProvince")]
  234. [AllowAnonymous]
  235. public async Task PublsihVisitToProvince([FromBody]DateTime date)
  236. {
  237. //查询需要推送的数据
  238. var list = await _orderRepository.Queryable()
  239. .Includes(x=>x.OrderVisits.Where(q=>q.VisitState== EVisitState.Visited).ToList())
  240. .Where(x => x.CreationTime.Date == date.Date && x.Status == EOrderStatus.Visited && x.ProcessType == EProcessType.Zhiban && x.CounterSignType == null).ToListAsync();
  241. foreach (var item in list)
  242. {
  243. var visit = item.OrderVisits.FirstOrDefault();
  244. if (visit!=null)
  245. {
  246. //推省上
  247. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
  248. new PublishVisitDto()
  249. {
  250. Order = _mapper.Map<OrderDto>(item),
  251. No = visit.No,
  252. VisitType = visit.VisitType,
  253. VisitName = visit.CreatorName,
  254. VisitTime = visit.VisitTime,
  255. VisitRemark = "满意",
  256. AreaCode = item.AreaCode!,
  257. SubjectResultSatifyCode = "4",
  258. FirstSatisfactionCode = "4",
  259. ClientGuid = ""
  260. }, cancellationToken: HttpContext.RequestAborted);
  261. }
  262. }
  263. }
  264. [HttpGet("addcontingencymanagementhotspot")]
  265. [AllowAnonymous]
  266. public async Task AddContingencyManagementHotspot([FromQuery] string? Id,string? ParentId)
  267. {
  268. if (!string.IsNullOrWhiteSpace(Id))
  269. {
  270. var data = await _hotspotRepository.GetAsync(Id, HttpContext.RequestAborted);
  271. if(data != null)
  272. {
  273. var newdata = _mapper.Map<ContingencyManagementHotspot>(data);
  274. newdata.Id = data.Id;
  275. await _contingencyManagementHotspotRepository.AddAsync(newdata, HttpContext.RequestAborted);
  276. }
  277. }
  278. if (!string.IsNullOrEmpty(ParentId))
  279. {
  280. var data = await _hotspotRepository.Queryable().Where(p=>p.ParentId==ParentId).ToListAsync();
  281. if (data != null&&data.Count>0)
  282. {
  283. foreach (var item in data)
  284. {
  285. var newdata = _mapper.Map<ContingencyManagementHotspot>(item);
  286. newdata.Id = item.Id;
  287. await _contingencyManagementHotspotRepository.AddAsync(newdata, HttpContext.RequestAborted);
  288. }
  289. }
  290. }
  291. }
  292. /// <summary>
  293. /// 处理司法工单数据
  294. /// </summary>
  295. /// <param name="StartTime"></param>
  296. /// <param name="EndTime"></param>
  297. /// <returns></returns>
  298. [HttpGet("addjudicial_management_orders")]
  299. [AllowAnonymous]
  300. public async Task AddJudicialManagementOrders(DateTime StartTime, DateTime? EndTime)
  301. {
  302. var list = await _enforcementOrdersRepository.Queryable()
  303. .Includes(x => x.Order)
  304. .Where(x => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.Order.AcceptTypeCode == "35")
  305. .ToListAsync();
  306. foreach (var item in list)
  307. {
  308. var order = item.Order;
  309. if (order != null)
  310. {
  311. var orderData = await _judicialManagementOrdersRepository.GetAsync(p => p.Id == order.Id, HttpContext.RequestAborted);
  312. if (orderData == null)
  313. {
  314. orderData = new JudicialManagementOrders();
  315. //处理工单
  316. _mapper.Map(order, orderData);
  317. orderData.Id = order.Id;
  318. orderData.IsEnforcementOrder = order.IsEnforcementOrder.HasValue ? order.IsEnforcementOrder.Value : false;
  319. orderData.IsTheClueTrue = item.IsTheClueTrue;
  320. orderData.IsPassTheBuckOrder = item.IsPassTheBuckOrder;
  321. orderData.OrderSoure = EOrderSoure.Hotline;
  322. orderData.CreationTime = item.CreationTime;
  323. if (item.EventTypeId == "04" || item.EventTypeId == "05" || item.EventTypeId == "06" || item.EventTypeId == "07" || item.EventTypeId == "08" ||
  324. item.EventTypeId == "0401" || item.EventTypeId == "0501" || item.EventTypeId == "0601" || item.EventTypeId == "0701" || item.EventTypeId == "0801")
  325. {
  326. orderData.EventTypeId = "0901";
  327. orderData.EventTypeName = "其他情形";
  328. orderData.EventTypeSpliceName = "其他类-其他情形";
  329. orderData.EventTypeOneLevelId = "09";
  330. }
  331. else
  332. {
  333. orderData.EventTypeId = item.EventTypeId;
  334. orderData.EventTypeName = item.EventTypeName;
  335. orderData.EventTypeSpliceName = item.EventTypeSpliceName;
  336. orderData.EventTypeOneLevelId = item.EventTypeOneLevelId;
  337. }
  338. List<Kv> kvs = new List<Kv>
  339. {
  340. new Kv { Key = order.OrgLevelOneName, Value = order.OrgLevelOneCode }
  341. };
  342. orderData.EnforcementOrdersHandler = kvs;
  343. await _judicialManagementOrdersRepository.AddAsync(orderData, HttpContext.RequestAborted);
  344. //处理部门
  345. EnforcementOrdersHandler enforcementOrdersHandler = new EnforcementOrdersHandler()
  346. {
  347. OrderId = order.Id,
  348. OrderNo = order.No,
  349. OrderSoure = EOrderSoure.Hotline,
  350. OrgCode = order.OrgLevelOneCode,
  351. OrgName = order.OrgLevelOneName,
  352. CreationTime = order.CreationTime
  353. };
  354. await _enforcementOrdersHandlerRepository.AddAsync(enforcementOrdersHandler, HttpContext.RequestAborted);
  355. }
  356. }
  357. }
  358. }
  359. /// <summary>
  360. /// 计算工单的办理时长
  361. /// </summary>
  362. /// <param name="StartTime"></param>
  363. /// <param name="EndTime"></param>
  364. /// <returns></returns>
  365. [HttpGet("update_order_handle_time")]
  366. [AllowAnonymous]
  367. public async Task UpdateOrderHandleTime(DateTime StartTime, DateTime? EndTime)
  368. {
  369. var list = await _orderRepository.Queryable()
  370. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime && p.Status >= EOrderStatus.Filed)
  371. .Where(p => p.CreationTimeHandleDuration == null || p.CenterToOrgHandleDuration == null)
  372. .ToListAsync();
  373. if (list.Any())
  374. {
  375. foreach (var item in list)
  376. {
  377. var creationTimeHandleDurationWorkday = item.FiledTime.HasValue
  378. ? _timeLimitDomainService.CalcWorkTimeEx(item.CreationTime, item.FiledTime.Value,
  379. item.ProcessType is EProcessType.Zhiban)
  380. : 0;
  381. var centerToOrgHandleDurationWorkday = item.FiledTime.HasValue && item.CenterToOrgTime.HasValue
  382. ? _timeLimitDomainService.CalcWorkTimeEx(item.CenterToOrgTime.Value, item.FiledTime.Value,
  383. item.ProcessType is EProcessType.Zhiban)
  384. : 0;
  385. item.CreationTimeHandleDurationWorkday = creationTimeHandleDurationWorkday;
  386. item.CenterToOrgHandleDurationWorkday = centerToOrgHandleDurationWorkday;
  387. if (item.FiledTime.HasValue)
  388. {
  389. var count = Math.Round((item.FiledTime - item.CreationTime).Value.TotalSeconds);
  390. item.CreationTimeHandleDuration = count <= 0 ? 1 : count;
  391. }
  392. else
  393. item.CreationTimeHandleDuration = 0;
  394. if (item.FiledTime.HasValue && item.CenterToOrgTime.HasValue)
  395. {
  396. var count = Math.Round((item.FiledTime - item.CenterToOrgTime).Value.TotalSeconds);
  397. item.CenterToOrgHandleDuration = count <= 0 ? 1 : count;
  398. }
  399. else
  400. item.CenterToOrgHandleDuration = 0;
  401. await _orderRepository.UpdateAsync(item, HttpContext.RequestAborted);
  402. }
  403. }
  404. }
  405. [HttpGet("testo")]
  406. [AllowAnonymous]
  407. public async Task<OpenResponse> TestOrigin()
  408. {
  409. var messageDto = new Share.Dtos.Push.MessageDto
  410. {
  411. PushBusiness = EPushBusiness.OrderAccept,
  412. ExternalId = "123456789",
  413. OrderId = "123456789",
  414. PushPlatform = EPushPlatform.Sms,
  415. Remark = " order.Title",
  416. Name = "张三",
  417. TemplateCode = "1005",
  418. Params = new List<string>() { "20240610000022", "12345" },
  419. TelNumber = "15881689499",
  420. };
  421. await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
  422. var t = _sendSmsConfiguration.Value.Url;
  423. var now = DateTime.Now.ToString();
  424. return OpenResponse.Ok(now);
  425. }
  426. [HttpGet("init-orgname")]
  427. [AllowAnonymous]
  428. public async Task InitUserOrgFullName()
  429. {
  430. var list = await _userRepository.Queryable().Where(x => 1 == 1 && string.IsNullOrEmpty(x.FullOrgName)).ToListAsync();
  431. foreach (var item in list)
  432. {
  433. var orgFullName = "";
  434. var orgFullCode = "";
  435. var orgId = item.OrgId;
  436. int strLength = orgId.Length;
  437. int segmentsCount = strLength / 3;
  438. List<string> strings = new List<string>();
  439. for (int i = 0; i < segmentsCount; i++)
  440. {
  441. int startIndex = i * 3;
  442. int length = Math.Min(3, strLength - startIndex);
  443. strings.Add(orgId.Substring(startIndex, length));
  444. }
  445. if (strLength > 3)
  446. {
  447. orgFullCode = strings[0];
  448. strings.Remove(orgFullCode);
  449. }
  450. foreach (var str in strings)
  451. {
  452. orgFullCode = orgFullCode + str;
  453. var org = await _systemOrganizeRepository.GetAsync(orgFullCode);
  454. if (org != null)
  455. {
  456. orgFullName = orgFullName + org.Name + "/";
  457. }
  458. }
  459. if (orgFullName.Length > 0)
  460. {
  461. orgFullName = orgFullName.Remove(orgFullName.Length - 1);
  462. }
  463. item.FullOrgName = orgFullName;
  464. await _userRepository.UpdateAsync(item);
  465. }
  466. }
  467. [HttpPost("import")]
  468. [AllowAnonymous]
  469. public async Task<List<ExcelContent>> Import(IFormFile file)
  470. {
  471. //var FileName = file.FileName;
  472. //var fileExtension = Path.GetExtension(FileName);
  473. ////新文件名
  474. //var newFileName = DateTime.Now.ToString("yyyyMMddhhmmss");
  475. ////文件保存路径
  476. //var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Upload", newFileName);
  477. ////判断路径是否存在
  478. //if (!Directory.Exists(filePath))
  479. //{
  480. // //创建路径
  481. // Directory.CreateDirectory(filePath);
  482. //}
  483. //filePath = Path.Combine(filePath, newFileName+ fileExtension);
  484. using (var stream = new MemoryStream())
  485. {
  486. file.CopyTo(stream);
  487. var list = MiniExcel.Query<ExcelContent>(stream).ToList();
  488. //Directory.Delete(filePath, true);
  489. return list;
  490. }
  491. }
  492. [AllowAnonymous]
  493. [HttpGet("export")]
  494. public async Task<object> Export()
  495. {
  496. List<ExcelContent> list = new List<ExcelContent>();
  497. ExcelContent excelContent = new ExcelContent() { ExternalId = "123123" };
  498. list.Add(excelContent);
  499. return _exportApplication.ExportData<ExcelContent>(list, "demo.xlsx");
  500. }
  501. [HttpGet("time")]
  502. [AllowAnonymous]
  503. public async Task<OpenResponse> GetTime(string batchId, string taskId)
  504. {
  505. //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662", DateTime.Now,
  506. // new List<string> { "xx", "bb" }, HttpContext.RequestAborted);
  507. //await _repositoryts.AddVectorAsync("f595e730-909a-45e4-9138-a84bf15f4663", DateTime.Now,
  508. // new List<string> { "aa", "bb", "cc" }, HttpContext.RequestAborted);
  509. var result0 = await _repositoryts.SearchAsync(new List<string> { "xx", "aa" }, HttpContext.RequestAborted);
  510. var result = await _repositoryts.SearchAsync(new List<string> { "bb" }, HttpContext.RequestAborted);
  511. var result1 = await _repositoryts.SearchAsync(new List<string> { "cc", "bb" }, HttpContext.RequestAborted);
  512. var result2 = await _repositoryts.SearchAsync(new List<string> { "cc", "xx" }, HttpContext.RequestAborted);
  513. var result3 = await _repositoryts.SearchAsync(new List<string> { "aa", "bb", "ss" }, HttpContext.RequestAborted);
  514. //await _repositoryts.UpdateVectorAsync("f595e730-909a-45e4-9138-a84bf15f4662",
  515. // new List<string> { "ss", "bb" }, HttpContext.RequestAborted);
  516. //_uow.Db.Ado.SqlQueryAsync<OrderUrge>("SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat')")
  517. //var tests = _uowWex.Db.Ado.SqlQuery<Test>("select * from view_telinfo_full where IsSynch=@IsSynch", new { IsSynch = 0 });
  518. //var a = _uowWex.Db.Ado.ExecuteCommand("update telinfo set IsSynch=1 where GUID=@CallId", new { CallId = "b1f97f3c-88b6-4f42-b8de-83ed448854b0" });
  519. //var rsp = await _wexClient.QueryTelsAsync(new QueryTelRequest { }, HttpContext.RequestAborted);
  520. //int a = _timeLimitDomainService.CalcWorkTime(DateTime.Now, DateTime.Parse("2023-09-11 16:21:00"));
  521. //int m = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2023-09-19 12:00:00"), DateTime.Parse("2023-09-20 18:00:00"), false);
  522. //var r = _timeLimitDomainService.CalcEndTime(DateTime.Parse("2024-6-06 14:32:47"),"40");
  523. //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Parse("2024-02-29 10:12:33"), Share.Enums.FlowEngine.EFlowDirection.OrgToCenter, "10");
  524. //await _wfModuleDomainService.PersistenceModulesAsync(HttpContext.RequestAborted);
  525. //var rsp = await _daprClient.InvokeMethodAsync<ApiResponse<string>>(HttpMethod.Get, "identity", "api/v1/Test/time", HttpContext.RequestAborted);
  526. //var rsp1 = await _daprClient.InvokeMethodAsync<int, ApiResponse<string>>(HttpMethod.Post, "identity", "api/v1/Test/time1", 222, HttpContext.RequestAborted);
  527. //var a = await _trClient.QueryTelsAsync(new Tr.Sdk.Tels.QueryTelRequest() { }, HttpContext.RequestAborted);
  528. //await _daySettingRepository.IsWorkDay(DateTime.Now);
  529. //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-6-06 14:32:47"), DateTime.Parse("2024-3-22 06:00:00"), false);
  530. //var r = _timeLimitDomainService.CalcWorkTime(DateTime.Parse("2024-3-24 17:20:00"), DateTime.Parse("2024-3-24 17:21:00"), false);
  531. //await _aiVisitService.QueryAiVisitTask(batchId, taskId, HttpContext.RequestAborted);
  532. //var r = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
  533. //var r = _timeLimitDomainService.CalcWorkTimeToDecimal(DateTime.Parse("2024-07-09 14:57:51"), DateTime.Parse("2024-07-10 14:20:42"), false);
  534. //var endTime = _timeLimitDomainService
  535. //.CalcEndTime(DateTime.Parse("2024-07-09 14:57:51"), ETimeType.WorkDay, -3, 0, 0);///.EndTime;
  536. //var timeResult = _timeLimitDomainService.CalcEndTime(DateTime.Now, ETimeType.WorkDay, 3, 80, 50);
  537. //var t = _timeLimitDomainService.CalcWorkTimeEx(DateTime.Parse("2024-07-22 11:30:00"), DateTime.Parse("2024-07-23 14:00:00"), false);
  538. //var r = await _aiVisitService.QueryAiVisitTaskEx("MTAwMDAx173ASS0kSUAqK2rl2sFGME", "", HttpContext.RequestAborted);
  539. var r = await _aiVisitService.QueryAiVisitTaskResult(batchId, DateTime.Parse("2024-07-28"), DateTime.Parse("2024-08-01"), HttpContext.RequestAborted);
  540. return OpenResponse.Ok(DateTime.Now.ToString("F"));
  541. }
  542. [HttpGet("pgsql")]
  543. public async Task<string> Pgsql()
  544. {
  545. var role = new Identity.Roles.Role
  546. {
  547. Name = $"test_role_{TimeOnly.FromDateTime(DateTime.Now)}",
  548. DisplayName = "test_role_display",
  549. ClientId = "test"
  550. };
  551. var roleId = await _roleRepository.AddAsync(role, HttpContext.RequestAborted);
  552. role.Description = "Description";
  553. await _roleRepository.UpdateAsync(role, HttpContext.RequestAborted);
  554. return roleId;
  555. }
  556. [AllowAnonymous]
  557. [HttpGet("roles")]
  558. public async Task<List<Identity.Roles.Role>> GetRoles()
  559. {
  560. using var lockManager = new LockManager(_distributedLock, $"{nameof(TestController)}.{nameof(GetRoles)}");
  561. lockManager.InvokeInLock(() => { Console.WriteLine("do something"); }, TimeSpan.FromSeconds(10));
  562. await lockManager.InvokeInLockAsync(
  563. d => _roleRepository.Queryable(includeDeleted: true).ToListAsync(),
  564. TimeSpan.FromSeconds(10),
  565. HttpContext.RequestAborted);
  566. var a = await _roleRepository.Queryable()
  567. //.Where(d => !d.IsDeleted)
  568. .ToListAsync();
  569. //var a = await db.Queryable<Role>().ToListAsync();
  570. var b = await _roleRepository.Queryable(includeDeleted: true).ToListAsync();
  571. return a;
  572. }
  573. //[AllowAnonymous]
  574. [HttpGet("hash")]
  575. public async Task Hash()
  576. {
  577. var s = _sessionContext;
  578. }
  579. /// <summary>
  580. /// signalR测试(method: Ring)
  581. /// </summary>
  582. /// <returns></returns>
  583. [HttpGet("ring")]
  584. public async Task RingTest()
  585. {
  586. await _realtimeService.RingAsync(_sessionContext.RequiredUserId,
  587. new RingDto { Id = new Guid().ToString(), From = _sessionContext.Phone ?? "未知号码", To = "12345" },
  588. HttpContext.RequestAborted);
  589. }
  590. /// <summary>
  591. /// signalR测试(method: Answered)
  592. /// </summary>
  593. /// <returns></returns>
  594. [HttpGet("answered")]
  595. public async Task AnsweredTest()
  596. {
  597. await _realtimeService.AnsweredAsync(_sessionContext.RequiredUserId,
  598. new AnsweredDto() { Id = new Guid().ToString(), From = _sessionContext.Phone ?? "未知号码", To = "12345" },
  599. HttpContext.RequestAborted);
  600. }
  601. /// <summary>
  602. /// signalR测试(method: Bye)
  603. /// </summary>
  604. /// <returns></returns>
  605. [HttpGet("bye")]
  606. public async Task ByeTest()
  607. {
  608. await _realtimeService.ByeAsync(_sessionContext.RequiredUserId, new ByeDto() { Id = new Guid().ToString() },
  609. HttpContext.RequestAborted);
  610. }
  611. /// <summary>
  612. ///
  613. /// </summary>
  614. /// <returns></returns>
  615. [AllowAnonymous]
  616. [HttpGet("t2")]
  617. public async Task GetVoiceEndAnswerAsyncTest()
  618. {
  619. //var answer = await _ivrDomainService.GetVoiceEndAnswerAsync("3", HttpContext.RequestAborted);
  620. //Console.WriteLine(answer.Content);
  621. throw new UserFriendlyException(2001, "test");
  622. }
  623. [HttpGet("wfdefine")]
  624. public async Task GetWorkflowDefine([FromQuery] string id)
  625. {
  626. //var query = _workflowTraceRepository.Queryable()
  627. // .LeftJoin<Workflow>((t, w) => t.WorkflowId == w.Id)
  628. // .LeftJoin<Order>((t, w, o) => w.ExternalId == o.Id)
  629. // .Where((t, w, o) => o.No.Length == 14);
  630. //if (!string.IsNullOrEmpty(id))
  631. // query = query.Where(d => d.WorkflowId == id);
  632. //var list = await query
  633. // .Select((t, w, o) => new { t, w, o })
  634. // .ToListAsync(HttpContext.RequestAborted);
  635. //var toUsers = list.Where(d => d.t.FlowAssignType == EFlowAssignType.User).ToList();
  636. //var userIds = toUsers.SelectMany(d => d.t.Handlers).Select(d => d.Key).Distinct().ToList();
  637. //var users = await _userRepository.Queryable()
  638. // .Includes(d => d.Organization)
  639. // .Where(d => userIds.Contains(d.Id))
  640. // .ToListAsync(HttpContext.RequestAborted);
  641. ////var orgTraces = list.Where(d => d.FlowAssignType == EFlowAssignType.Org).ToList();
  642. //var stepHandlers = new List<WorkflowStepHandler>();
  643. //foreach (var toUser in toUsers)
  644. //{
  645. // foreach (var traceHandler in toUser.t.Handlers)
  646. // {
  647. // var user = users.FirstOrDefault(d => d.Id == traceHandler.Key);
  648. // if (user != null)
  649. // stepHandlers.Add(new WorkflowStepHandler
  650. // {
  651. // WorkflowId = toUser.w.Id,
  652. // ExternalId = toUser.w.ExternalId,
  653. // WorkflowStepId = toUser.t.StepId,
  654. // FlowAssignType = toUser.t.FlowAssignType.Value,
  655. // UserId = user.Id,
  656. // Username = user.Name,
  657. // OrgId = user.OrgId,
  658. // OrgName = user.Organization.Name,
  659. // IsActualHandler = user.Id == toUser.t.HandlerId
  660. // });
  661. // }
  662. //}
  663. //var toOrgs = list.Where(d => d.t.FlowAssignType == EFlowAssignType.Org).ToList();
  664. //foreach (var toOrg in toOrgs)
  665. //{
  666. // foreach (var handler in toOrg.t.Handlers)
  667. // {
  668. // stepHandlers.Add(new WorkflowStepHandler
  669. // {
  670. // WorkflowId = toOrg.w.Id,
  671. // ExternalId = toOrg.w.ExternalId,
  672. // WorkflowStepId = toOrg.t.StepId,
  673. // FlowAssignType = toOrg.t.FlowAssignType.Value,
  674. // OrgId = handler.Key,
  675. // OrgName = handler.Value,
  676. // IsActualHandler = handler.Key == toOrg.t.HandlerOrgId
  677. // });
  678. // }
  679. //}
  680. //_logger.LogInformation($"生成handlers: {stepHandlers.Count} 条");
  681. //await _workflowStepHandleRepository.AddRangeAsync(stepHandlers, HttpContext.RequestAborted);
  682. }
  683. /// <summary>
  684. /// 处理FlowAssignType
  685. /// </summary>
  686. /// <returns></returns>
  687. [AllowAnonymous]
  688. [HttpPost("t3")]
  689. public async Task TestExportExcel()
  690. {
  691. var orders = await _orderRepository.Queryable()
  692. //.Includes(d => d.Workflow, x => x.Steps.Where(d => d.BusinessType == EBusinessType.Send))
  693. //.Where(d=>d.Workflow.Steps.Any(d=>d.BusinessType == EBusinessType.Send))
  694. .Where(d => d.Status != EOrderStatus.WaitForAccept && d.CenterToOrgTime == null)
  695. .ToListAsync(HttpContext.RequestAborted);
  696. var orderIds = orders.Select(d => d.Id).ToList();
  697. var steps = await _workflowStepRepository.Queryable()
  698. .Where(d => orderIds.Contains(d.ExternalId) &&
  699. d.BusinessType == EBusinessType.Send &&
  700. d.Status == EWorkflowStepStatus.Handled)
  701. .OrderBy(d => d.CreationTime)
  702. .ToListAsync(HttpContext.RequestAborted);
  703. _logger.LogWarning($"取到steps: {steps.Count} 条");
  704. var updateOrders = new List<Order>();
  705. foreach (var order in orders)
  706. {
  707. var step = steps.Where(d => d.ExternalId == order.Id)
  708. .OrderBy(d => d.CreationTime)
  709. .FirstOrDefault();
  710. if (step is null) continue;
  711. order.CenterToOrgTime = step.HandleTime;
  712. order.CenterToOrgHandlerId = step.HandlerId;
  713. order.CenterToOrgHandlerName = step.HandlerName;
  714. order.CenterToOrgOpinion = step.Opinion;
  715. var handleDuration = order.CenterToOrgTime.HasValue && order.ActualHandleTime.HasValue
  716. ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  717. order.ActualHandleTime.Value, order.ProcessType is EProcessType.Zhiban)
  718. : 0;
  719. var fileDuration = order.CenterToOrgTime.HasValue && order.FiledTime.HasValue
  720. ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  721. order.FiledTime.Value, order.ProcessType is EProcessType.Zhiban)
  722. : 0;
  723. //var allDuration = order.StartTime.HasValue
  724. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, order.FiledTime.Value,
  725. // order.ProcessType is EProcessType.Zhiban)
  726. // : 0;
  727. order.SetHandleDuration();
  728. order.SetFileDuration();
  729. order.HandleDurationWorkday = handleDuration;
  730. order.FileDurationWorkday = fileDuration;
  731. updateOrders.Add(order);
  732. }
  733. _logger.LogWarning($"更新工单:{updateOrders.Count} 条");
  734. await _orderRepository.UpdateRangeAsync(updateOrders, HttpContext.RequestAborted);
  735. }
  736. [AllowAnonymous]
  737. [HttpPost("t4")]
  738. public async Task TestExportExcel1()
  739. {
  740. var numbers = new List<string>
  741. {
  742. "20240623000180",
  743. "20240622000097",
  744. "20240621000055",
  745. "20240622000185",
  746. "20240623000025",
  747. "20240621000099",
  748. "20240621000270",
  749. "20240622000060",
  750. "20240621000144",
  751. };
  752. var orders = await _orderRepository.Queryable()
  753. .Includes(d => d.OrderExtension)
  754. .Where(d => numbers.Contains(d.No))
  755. .ToListAsync(HttpContext.RequestAborted);
  756. _logger.LogWarning($"order count: {orders.Count}");
  757. var workflowIds = orders.Select(d => d.WorkflowId).ToList();
  758. var workflows = await _workflowRepository.Queryable()
  759. .Includes(d => d.Steps, x => x.WorkflowTrace)
  760. .Where(d => workflowIds.Contains(d.Id))
  761. .ToListAsync(HttpContext.RequestAborted);
  762. //var workflowIds = orders.Select(d => d.WorkflowId).ToList();
  763. //var workflows = await _workflowRepository.Queryable()
  764. // .Includes(d => d.Steps, x => x.WorkflowTrace)
  765. // //.Includes(d=>d.Traces)
  766. // .Where(d => workflowIds.Contains(d.Id))
  767. // .ToListAsync(HttpContext.RequestAborted);
  768. var updateOrders = new List<Order>();
  769. foreach (var order in orders)
  770. {
  771. var workflow = workflows.First(d => d.Id == order.WorkflowId);
  772. _mapper.Map(workflow, order);
  773. var now = order.FiledTime.Value;//DateTime.Now;
  774. var handleDuration = order.StartTime.HasValue
  775. ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
  776. now, order.ProcessType is EProcessType.Zhiban)
  777. : 0;
  778. var fileDuration = order.CenterToOrgTime.HasValue
  779. ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  780. now, order.ProcessType is EProcessType.Zhiban)
  781. : 0;
  782. var allDuration = order.StartTime.HasValue
  783. ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
  784. order.ProcessType is EProcessType.Zhiban)
  785. : 0;
  786. var creationTimeHandleDurationWorkday = order.ActualHandleTime.HasValue
  787. ? _timeLimitDomainService.CalcWorkTime(order.CreationTime, now,
  788. order.ProcessType is EProcessType.Zhiban)
  789. : 0;
  790. var centerToOrgHandleDurationWorkday = order.ActualHandleTime.HasValue && order.CenterToOrgTime.HasValue
  791. ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value, now,
  792. order.ProcessType is EProcessType.Zhiban)
  793. : 0;
  794. //order.File(now, handleDuration, fileDuration, allDuration, creationTimeHandleDurationWorkday, centerToOrgHandleDurationWorkday);
  795. order.HandleDurationWorkday = handleDuration;
  796. order.FileDurationWorkday = fileDuration;
  797. order.AllDurationWorkday = allDuration;
  798. order.CreationTimeHandleDurationWorkday = creationTimeHandleDurationWorkday;
  799. order.CenterToOrgHandleDurationWorkday = centerToOrgHandleDurationWorkday;
  800. //计算实际办结时长
  801. order.SetHandleDuration();
  802. order.SetFileDuration();
  803. order.SetAllDuration();
  804. order.SetCreationTimeHandleDurationWorkday();
  805. order.SetCenterToOrgHandleDurationWorkday();
  806. var endStep = workflow.Steps.FirstOrDefault(d => d.StepType == EStepType.End);
  807. //var endTrace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.StepType == EStepType.End)?.WorkflowTrace;
  808. if (endStep is null)
  809. {
  810. _logger.LogWarning($"endStep 为空, orderNo:{order.No}");
  811. continue;
  812. }
  813. var step = workflow.Steps.FirstOrDefault(d => d.Id == endStep.PrevStepId);
  814. //var trace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.Id == endTrace.PrevStepId)?.WorkflowTrace;
  815. if (step is null)
  816. {
  817. _logger.LogWarning($"step 为空, orderNo:{order.No}");
  818. continue;
  819. }
  820. var trace = step.WorkflowTrace;
  821. order.FileUserId = trace.HandlerId;
  822. order.FileUserName = trace.HandlerName;
  823. order.FileUserOrgId = trace.HandlerOrgId;
  824. order.FileUserOrgName = trace.HandlerOrgName;
  825. order.FileOpinion = trace.Opinion;
  826. //记录冗余归档数据
  827. if (workflow.Steps.Any(x => x.BusinessType == Share.Enums.FlowEngine.EBusinessType.Send))
  828. {
  829. order.FileUserRole = EFileUserType.Dispatch;
  830. }
  831. else
  832. {
  833. order.FileUserRole = EFileUserType.Seat;
  834. }
  835. if (order.ProcessType == EProcessType.Jiaoban)
  836. {
  837. order.FileUserRole = EFileUserType.Org;
  838. }
  839. ////是否已解决
  840. //order.IsResolved = true;//notification.Dto.External == null ? false : notification.Dto.External.IsResolved;
  841. //await _orderRepository.UpdateAsync(order, cancellationToken);
  842. updateOrders.Add(order);
  843. //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken); //由CallAccept改为OtherAccept
  844. var orderFlowDto = new OrderFlowDto
  845. {
  846. Order = _mapper.Map<OrderDto>(order),
  847. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
  848. };
  849. var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, HttpContext.RequestAborted);
  850. if (callRecord != null)
  851. {
  852. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  853. }
  854. //这里需要判断是否是警情退回
  855. orderFlowDto.IsNonPoliceReturn = false;//notification.Dto.External == null ? false : notification.Dto.External.IsPoliceReturn;
  856. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: HttpContext.RequestAborted);
  857. //写入质检 针对受理之后直接结束的工单
  858. await _qualityApplication.AddQualityAsync(EQualitySource.Accepted, order.Id, HttpContext.RequestAborted);
  859. //司法行政监督管理-工单处理
  860. //await _enforcementApplication.AddEnforcementOrderAsync(order, HttpContext.RequestAborted);
  861. }
  862. //_logger.LogWarning($"更新orders:{updateOrders.Count}");
  863. //await _orderRepository.UpdateRangeAsync(updateOrders, HttpContext.RequestAborted);
  864. }
  865. [AllowAnonymous]
  866. [HttpGet("t5")]
  867. public async Task Test5()
  868. {
  869. var query = _orderRepository.Queryable()
  870. .Includes(d => d.Workflow, x => x.Steps)
  871. .Where(d => d.Status >= EOrderStatus.Filed &&
  872. d.CurrentStepId == null)
  873. .OrderBy(d => d.Id);
  874. var size = 1000;
  875. var count = await query.CountAsync(HttpContext.RequestAborted);
  876. _logger.LogWarning($"共计 {count} 条");
  877. var batchs = (int)Math.Ceiling(Convert.ToDouble(count) / size);
  878. for (int i = 0; i < batchs; i++)
  879. {
  880. _logger.LogWarning($"第 {i} 批次开始");
  881. var orders = await query
  882. .Skip(i * size)
  883. .Take(size)
  884. .ToListAsync(HttpContext.RequestAborted);
  885. foreach (var order in orders)
  886. {
  887. if (order.No.Trim().Length != 14)
  888. {
  889. order.CurrentStepId = order.ActualHandleStepId;
  890. order.CurrentStepCode = order.ActualHandleStepCode;
  891. order.CurrentStepName = order.ActualHandleStepName;
  892. order.CurrentStepCreateTime = order.ActualHandleStepCreateTime;
  893. order.CurrentStepAcceptTime = order.ActualHandleStepAcceptTime;
  894. order.CurrentHandleTime = order.ActualHandleTime;
  895. order.CurrentHandlerId = order.ActualHandlerId;
  896. order.CurrentHandlerName = order.ActualHandlerName;
  897. order.CurrentHandleOrgName = order.ActualHandleOrgName;
  898. order.CurrentHandleOrgId = order.ActualHandleOrgCode;
  899. order.CurrentHandleOrgAreaCode = order.ActualHandleOrgAreaCode;
  900. order.CurrentHandleOrgAreaName = order.ActualHandleOrgAreaName;
  901. }
  902. else
  903. {
  904. if (order.CounterSignType != null)
  905. {
  906. order.Workflow.CurrentStepId = order.Workflow.ActualHandleStepId;
  907. order.Workflow.CurrentStepCode = order.Workflow.ActualHandleStepCode;
  908. order.Workflow.CurrentStepName = order.Workflow.ActualHandleStepName;
  909. order.Workflow.CurrentStepCreateTime = order.Workflow.ActualHandleStepCreateTime;
  910. order.Workflow.CurrentStepAcceptTime = order.Workflow.ActualHandleStepAcceptTime;
  911. order.Workflow.CurrentHandleTime = order.Workflow.ActualHandleTime;
  912. order.Workflow.CurrentHandlerId = order.Workflow.ActualHandlerId;
  913. order.Workflow.CurrentHandlerName = order.Workflow.ActualHandlerName;
  914. order.Workflow.CurrentHandleOrgName = order.Workflow.ActualHandleOrgName;
  915. order.Workflow.CurrentHandleOrgId = order.Workflow.ActualHandleOrgCode;
  916. order.Workflow.CurrentHandleOrgAreaCode = order.Workflow.ActualHandleOrgAreaCode;
  917. order.Workflow.CurrentHandleOrgAreaName = order.Workflow.ActualHandleOrgAreaName;
  918. order.CurrentStepId = order.Workflow.ActualHandleStepId;
  919. order.CurrentStepCode = order.Workflow.ActualHandleStepCode;
  920. order.CurrentStepName = order.Workflow.ActualHandleStepName;
  921. order.CurrentStepCreateTime = order.Workflow.ActualHandleStepCreateTime;
  922. order.CurrentStepAcceptTime = order.Workflow.ActualHandleStepAcceptTime;
  923. order.CurrentHandleTime = order.Workflow.ActualHandleTime;
  924. order.CurrentHandlerId = order.Workflow.ActualHandlerId;
  925. order.CurrentHandlerName = order.Workflow.ActualHandlerName;
  926. order.CurrentHandleOrgName = order.Workflow.ActualHandleOrgName;
  927. order.CurrentHandleOrgId = order.Workflow.ActualHandleOrgCode;
  928. order.CurrentHandleOrgAreaCode = order.Workflow.ActualHandleOrgAreaCode;
  929. order.CurrentHandleOrgAreaName = order.Workflow.ActualHandleOrgAreaName;
  930. }
  931. else
  932. {
  933. var endStep = order.Workflow.Steps.FirstOrDefault(d => d.StepType == EStepType.End);
  934. if (endStep is null) continue;
  935. var preStep = order.Workflow.Steps.FirstOrDefault(d => d.Id == endStep.PrevStepId);
  936. if (preStep is null) continue;
  937. order.Workflow.CurrentStepId = preStep.Id;
  938. order.Workflow.CurrentStepCode = preStep.Code;
  939. order.Workflow.CurrentStepName = preStep.Name;
  940. order.Workflow.CurrentStepCreateTime = preStep.CreationTime;
  941. order.Workflow.CurrentStepAcceptTime = preStep.AcceptTime;
  942. order.Workflow.CurrentHandleTime = preStep.HandleTime;
  943. order.Workflow.CurrentHandlerId = preStep.HandlerId;
  944. order.Workflow.CurrentHandlerName = preStep.HandlerName;
  945. order.Workflow.CurrentHandleOrgName = preStep.HandlerOrgName;
  946. order.Workflow.CurrentHandleOrgId = preStep.HandlerOrgId;
  947. order.Workflow.CurrentHandleOrgAreaCode = preStep.HandlerOrgAreaCode;
  948. order.Workflow.CurrentHandleOrgAreaName = preStep.HandlerOrgAreaName;
  949. order.CurrentStepId = order.Workflow.ActualHandleStepId;
  950. order.CurrentStepCode = order.Workflow.ActualHandleStepCode;
  951. order.CurrentStepName = order.Workflow.ActualHandleStepName;
  952. order.CurrentStepCreateTime = order.Workflow.ActualHandleStepCreateTime;
  953. order.CurrentStepAcceptTime = order.Workflow.ActualHandleStepAcceptTime;
  954. order.CurrentHandleTime = order.Workflow.ActualHandleTime;
  955. order.CurrentHandlerId = order.Workflow.ActualHandlerId;
  956. order.CurrentHandlerName = order.Workflow.ActualHandlerName;
  957. order.CurrentHandleOrgName = order.Workflow.ActualHandleOrgName;
  958. order.CurrentHandleOrgId = order.Workflow.ActualHandleOrgCode;
  959. order.CurrentHandleOrgAreaCode = order.Workflow.ActualHandleOrgAreaCode;
  960. order.CurrentHandleOrgAreaName = order.Workflow.ActualHandleOrgAreaName;
  961. }
  962. }
  963. }
  964. _logger.LogWarning($"更新数据:{orders.Count} 条");
  965. await _orderRepository.UpdateNav(orders)
  966. .Include(d => d.Workflow)
  967. .ExecuteCommandAsync();
  968. }
  969. //await _workflowTraceRepository.UpdateRangeAsync(updateSteps, HttpContext.RequestAborted);
  970. }
  971. [HttpGet("rsa")]
  972. public async Task<string> Rsa()
  973. {
  974. var keyList = RsaKeyGenerator.Pkcs1Key(2048, true);
  975. var privateKey = keyList[0];
  976. var publicKey = keyList[1];
  977. return $"{publicKey} \r\n {privateKey}";
  978. }
  979. /// <summary>
  980. /// 处理工单流程错误数据 话务部直接归档件 没有归档节点
  981. /// </summary>
  982. /// <param name="StartTime"></param>
  983. /// <param name="EndTime"></param>
  984. /// <returns></returns>
  985. [HttpGet("oders_workflow_step")]
  986. [AllowAnonymous]
  987. public async Task AddJudicialManagementOrders()
  988. {
  989. var steps = await _workflowStepRepository.Queryable()
  990. .LeftJoin<Order>((ws, d) => ws.ExternalId == d.Id)
  991. .Where((ws, d) => d.Status == EOrderStatus.Handling && ws.NextStepCode == "end" && ws.Status == EWorkflowStepStatus.Handled && ws.StepType == EStepType.Start)
  992. .ToListAsync(HttpContext.RequestAborted);
  993. _logger.LogInformation($"取到数据 {steps.Count} 条");
  994. foreach (var item in steps)
  995. {
  996. ///组装数据
  997. //Workflow workflow
  998. Workflow workflow = await _workflowDomainService.GetWorkflowAsync(item.WorkflowId, withDefine: true, withSteps: true,
  999. cancellationToken: HttpContext.RequestAborted);
  1000. //WorkflowStep startStep
  1001. var startStep = workflow.Steps.FirstOrDefault(x => x.StepType == EStepType.Start);
  1002. if (startStep is null) continue;
  1003. //BasicWorkflowDto dto
  1004. BasicWorkflowDto dto = new BasicWorkflowDto
  1005. {
  1006. NextStepCode = "end",
  1007. NextStepName = "结束",
  1008. BackToCountersignEnd = false,
  1009. FlowDirection = null,
  1010. HandlerType = 0,
  1011. StepType = 0,
  1012. NextHandlers = new List<FlowStepHandler>(),
  1013. IsSms = false,
  1014. NextMainHandler = "",
  1015. IsStartCountersign = false,
  1016. External = new External
  1017. {
  1018. TimeLimit = null,
  1019. TimeLimitUnit = null,
  1020. IsPoliceReturn = false,
  1021. IsResolved = false,
  1022. },
  1023. BusinessType = EBusinessType.File,
  1024. ReviewResult = 0,
  1025. Remark = null,
  1026. Opinion = startStep.Opinion,
  1027. Files = new List<Share.Dtos.File.FileDto>()
  1028. };
  1029. //ISessionContext current
  1030. ISessionContext current = new ProvinceSessionContext
  1031. {
  1032. //UserId = startStep.HandlerId,
  1033. //UserName = startStep.HandlerName,
  1034. OrgId = startStep.HandlerOrgId,
  1035. OrgName = startStep.HandlerOrgName,
  1036. OrgAreaCode = startStep.HandlerOrgAreaCode,
  1037. OrgAreaName = startStep.HandlerOrgAreaName,
  1038. OrgLevel = 1
  1039. };
  1040. //StepDefine firstStepDefine
  1041. StepDefine firstStepDefine = workflow.WorkflowDefinition.FindStepDefine(startStep.NextStepCode);
  1042. //FlowAssignInfo flowAssignInfo
  1043. ////如果发起会签需检查是否支持发起会签
  1044. //var startStepDefine = workflow.WorkflowDefinition.FindStartStepDefine();
  1045. //下一节点是否为动态节点
  1046. var isNextDynamic = false;
  1047. FlowAssignInfo flowAssignInfo =
  1048. await _workflowApplication.GetNextStepFlowAssignInfoAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, HttpContext.RequestAborted);
  1049. //DateTime? expiredTime
  1050. DateTime? expiredTime = startStep.StepExpiredTime;
  1051. ///
  1052. await _mediator.Publish(
  1053. new StartWorkflowNotify(workflow, dto, flowAssignInfo, startStep.WorkflowTrace), HttpContext.RequestAborted);
  1054. //firstStep是否为end,t: 实际办理节点为startStep, 并且handlerId赋值 f: 实际办理节点为firstStep, handlerId未赋值
  1055. workflow.UpdateActualStepWhenHandle(startStep,
  1056. current.RequiredUserId, current.UserName,
  1057. current.RequiredOrgId, current.OrgName,
  1058. current.OrgAreaCode, current.OrgAreaName,
  1059. current.OrgLevel);
  1060. workflow.UpdateCurrentStepWhenHandle(startStep,
  1061. current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
  1062. var endTrace = await _workflowDomainService.EndAsync(workflow, dto, firstStepDefine,
  1063. startStep, current, expiredTime, HttpContext.RequestAborted);
  1064. }
  1065. _logger.LogInformation($"处理完成");
  1066. }
  1067. /// <summary>
  1068. /// 处理工单流程错误数据 话务部直接归档件 没有归档节点
  1069. /// </summary>
  1070. /// <param name="StartTime"></param>
  1071. /// <param name="EndTime"></param>
  1072. /// <returns></returns>
  1073. [HttpGet("order_participle")]
  1074. [AllowAnonymous]
  1075. public async Task OrderParticiple() {
  1076. await _orderApplication.OrderParticiple("7月16日,刘先生看到兴文县县城第二人民医院对面新石海药业有限公司广场店药店套刷医保基金,将顾客不能刷统筹的药品替换为其他可以使用统筹的药品进行刷卡结算。\n 希望部门进行查处。", "1", DateTime.Now, HttpContext.RequestAborted);
  1077. }
  1078. }