DatasharingSubscriber.cs 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. using DotNetCore.CAP;
  2. using Hotline.Application.CallCenter;
  3. using Hotline.Application.FlowEngine;
  4. using Hotline.Application.Orders;
  5. using Hotline.Authentications;
  6. using Hotline.Caching.Interfaces;
  7. using Hotline.Caching.Services;
  8. using Hotline.Configurations;
  9. using Hotline.ContingencyManagement;
  10. using Hotline.File;
  11. using Hotline.FlowEngine.WorkflowModules;
  12. using Hotline.FlowEngine.Workflows;
  13. using Hotline.Orders;
  14. using Hotline.OrderTranspond;
  15. using Hotline.Settings;
  16. using Hotline.Share.Dtos;
  17. using Hotline.Share.Dtos.ContingencyManagement;
  18. using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
  19. using Hotline.Share.Dtos.FlowEngine;
  20. using Hotline.Share.Dtos.FlowEngine.Workflow;
  21. using Hotline.Share.Dtos.Order;
  22. using Hotline.Share.Dtos.OrderTranspond;
  23. using Hotline.Share.Dtos.TrCallCenter;
  24. using Hotline.Share.Enums.FlowEngine;
  25. using Hotline.Share.Enums.Order;
  26. using Hotline.Share.Mq;
  27. using MapsterMapper;
  28. using Microsoft.AspNetCore.Http;
  29. using Microsoft.Extensions.Options;
  30. using XF.Domain.Authentications;
  31. using XF.Domain.Dependency;
  32. using XF.Domain.Exceptions;
  33. using XF.Domain.Repository;
  34. namespace Hotline.Application.Subscribers
  35. {
  36. /// <summary>
  37. /// 订阅来自DataSharing的消息
  38. /// </summary>
  39. public class DataSharingSubscriber : ICapSubscribe, ITransientDependency
  40. {
  41. private readonly IRepository<OrderVisit> _orderVisitRepository;
  42. private readonly IMapper _mapper;
  43. private readonly IOrderRepository _orderRepository;
  44. private readonly IOrderDomainService _orderDomainService;
  45. private readonly ICapPublisher _capPublisher;
  46. private readonly IRepository<OrderDelay> _orderDelayRepository;
  47. private readonly IRepository<OrderSendBack> _orderSendBackRepository;
  48. private readonly IWorkflowApplication _workflowApplication;
  49. private readonly IWorkflowDomainService _workflowDomainService;
  50. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  51. private readonly IFileRepository _fileRepository;
  52. private readonly IRepository<OrderUrge> _orderUrgeRepository;
  53. private readonly IRepository<OrderSupervise> _orderSuperviseRepository;
  54. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  55. private readonly IOrderScreenRepository _orderScreenRepository;
  56. private readonly IRepository<OrderExtension> _orderExtensionRepository;
  57. private readonly IRepository<SystemDicData> _systemDicDataRepository;
  58. private readonly ISystemOrganizeRepository _systemOrganizeRepository;
  59. private readonly IRepository<TranspondCityRawData> _transpondCityRawDataRepository;
  60. private readonly IRepository<OrderComplement> _orderComplementRepository;
  61. private readonly IOrderApplication _orderApplication;
  62. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  63. private readonly IRepository<OrderWarning> _orderWarningRepository;
  64. private readonly IRepository<OrderRevoke> _orderRevokeRepository;
  65. private readonly IRepository<ContingencyManagementOrders> _contingencyManagementOrdersRepository;
  66. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  67. private readonly ICallApplication _callApplication;
  68. private readonly IRepository<OrderPublish> _orderPublishRepository;
  69. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  70. private readonly IOptions<CityBaseConfiguration> _cityBaseConfiguration;
  71. public DataSharingSubscriber(
  72. IRepository<OrderVisit> orderVisitRepository,
  73. IMapper mapper,
  74. IOrderRepository orderRepository,
  75. IOrderDomainService orderDomainService,
  76. ICapPublisher capPublisher,
  77. IRepository<OrderDelay> orderDelayRepository,
  78. IRepository<OrderSendBack> orderSendBackRepository,
  79. IWorkflowApplication workflowApplication,
  80. IWorkflowDomainService workflowDomainService,
  81. IRepository<WorkflowTrace> workflowTraceRepository,
  82. IRepository<OrderUrge> orderUrgeRepository,
  83. IRepository<OrderSupervise> orderSuperviseRepository,
  84. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  85. IOrderScreenRepository orderScreenRepository,
  86. IRepository<OrderExtension> orderExtensionRepository,
  87. IFileRepository fileRepository,
  88. IRepository<SystemDicData> systemDicDataRepository,
  89. ISystemOrganizeRepository systemOrganizeRepository,
  90. IRepository<TranspondCityRawData> transpondCityRawDataRepository,
  91. IRepository<OrderComplement> orderComplementRepository,
  92. IOrderApplication orderApplication,
  93. ISystemSettingCacheManager systemSettingCacheManager,
  94. IRepository<OrderWarning> orderWarningRepository,
  95. IRepository<OrderRevoke> orderRevokeRepository,
  96. IRepository<ContingencyManagementOrders> contingencyManagementOrdersRepository,
  97. IOptionsSnapshot<AppConfiguration> appOptions,
  98. ICallApplication callApplication,
  99. IRepository<OrderPublish> orderPublishRepository,
  100. ISystemDicDataCacheManager sysDicDataCacheManager,
  101. IOptions<CityBaseConfiguration> cityBaseConfiguration)
  102. {
  103. _orderSendBackRepository = orderSendBackRepository;
  104. _workflowApplication = workflowApplication;
  105. _workflowDomainService = workflowDomainService;
  106. _workflowTraceRepository = workflowTraceRepository;
  107. _orderUrgeRepository = orderUrgeRepository;
  108. _orderSuperviseRepository = orderSuperviseRepository;
  109. _orderScreenRepository = orderScreenRepository;
  110. _orderExtensionRepository = orderExtensionRepository;
  111. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  112. _orderRepository = orderRepository;
  113. _orderDomainService = orderDomainService;
  114. _fileRepository = fileRepository;
  115. _orderVisitRepository = orderVisitRepository;
  116. _mapper = mapper;
  117. _capPublisher = capPublisher;
  118. _orderDelayRepository = orderDelayRepository;
  119. _systemDicDataRepository = systemDicDataRepository;
  120. _systemOrganizeRepository = systemOrganizeRepository;
  121. _transpondCityRawDataRepository = transpondCityRawDataRepository;
  122. _orderComplementRepository = orderComplementRepository;
  123. _orderApplication = orderApplication;
  124. _systemSettingCacheManager = systemSettingCacheManager;
  125. _orderWarningRepository = orderWarningRepository;
  126. _orderRevokeRepository = orderRevokeRepository;
  127. _contingencyManagementOrdersRepository = contingencyManagementOrdersRepository;
  128. _appOptions = appOptions;
  129. _callApplication = callApplication;
  130. _orderPublishRepository = orderPublishRepository;
  131. _sysDicDataCacheManager = sysDicDataCacheManager;
  132. _cityBaseConfiguration = cityBaseConfiguration;
  133. }
  134. /// <summary>
  135. /// 接收工单退回结果
  136. /// </summary>
  137. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderReturnFeedback)]
  138. public async Task RecOrderReturnAsync(OrderSendBackResultDto dto, CancellationToken cancellationToken)
  139. {
  140. var sendBack = await _orderSendBackRepository.GetAsync(p => p.Id == dto.Id && p.State == 0, cancellationToken);
  141. if (sendBack != null)
  142. {
  143. sendBack.Result = dto.Result;
  144. sendBack.Reason = dto.Reason;
  145. sendBack.AuditName = dto.AuditName;
  146. sendBack.AuditOrgName = dto.AuditOrgName;
  147. sendBack.AuditTime = dto.AuditTime;
  148. if (dto.Result == 0)
  149. sendBack.State = 2;
  150. else if (dto.Result == 1)
  151. sendBack.State = 1;
  152. if (dto.Files != null && dto.Files.Any())
  153. {
  154. sendBack.FileJson = await _fileRepository.AddFileAsync(dto.Files, sendBack.Id, string.Empty, cancellationToken);
  155. }
  156. var order = await _orderRepository.GetAsync(sendBack.OrderId, cancellationToken);
  157. if (order is null)
  158. throw new UserFriendlyException("无效工单编号");
  159. if (dto.Result is 1)
  160. {
  161. //var now = DateTime.Now;
  162. //var handleDuration = order.StartTime.HasValue
  163. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
  164. // now, order.ProcessType is EProcessType.Zhiban)
  165. // : 0;
  166. //var fileDuration = order.CenterToOrgTime.HasValue
  167. // ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  168. // now, order.ProcessType is EProcessType.Zhiban)
  169. // : 0;
  170. //var allDuration = order.StartTime.HasValue
  171. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
  172. // order.ProcessType is EProcessType.Zhiban)
  173. // : 0;
  174. //order.File(now, handleDuration, fileDuration, allDuration);
  175. //await _orderRepository.UpdateAsync(order, cancellationToken);
  176. var current = SessionContextCreator.CreateSessionContext(dto.Source, _cityBaseConfiguration.Value);
  177. if (string.IsNullOrEmpty(order.WorkflowId))
  178. {
  179. var startDto = new StartWorkflowDto
  180. {
  181. DefinitionModuleCode = WorkflowModuleConsts.OrderHandle,
  182. Title = order.Title,
  183. Opinion = dto.Reason ?? "省工单同意退回",
  184. };
  185. await _workflowApplication.StartToEndAsync(startDto, current, order.Id, order.ExpiredTime,
  186. cancellationToken);
  187. }
  188. else
  189. {
  190. //await _workflowApplication.HandleToEndAsync(current, order.WorkflowId, "省工单同意退回", null,
  191. // EReviewResult.Approval, cancellationToken);
  192. await _workflowApplication.JumpToEndAsync(current, order.WorkflowId, dto.Reason ?? "省工单同意退回",
  193. null, order.ExpiredTime, cancellationToken: cancellationToken);
  194. }
  195. }
  196. else
  197. {
  198. order.Status = EOrderStatus.WaitForAccept;
  199. await _orderRepository.UpdateAsync(order, cancellationToken);
  200. }
  201. await _orderSendBackRepository.UpdateAsync(sendBack, cancellationToken);
  202. }
  203. }
  204. /// <summary>
  205. /// 服务工单撤单
  206. /// </summary>
  207. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderRevoke)]
  208. public async Task RecCancelOrderAsync(CancelOrderDto dto, CancellationToken cancellationToken)
  209. {
  210. var order = await _orderRepository.GetAsync(p => p.ReceiveProvinceNo == dto.ProvinceNo, cancellationToken);
  211. if (order is null)
  212. throw new UserFriendlyException("未查询到工单");
  213. OrderRevoke orderRevoke = new()
  214. {
  215. OrderId = order.Id,
  216. RevokeTime = DateTime.Parse(dto.RevokeTime),
  217. RevokeType = dto.RevokeType,
  218. RevokeName = dto.RevokeName,
  219. RevokeReasion = dto.Opinion,
  220. CliengGuid = dto.CliengGuid,
  221. IsProRevoke = true,
  222. RevokeTypeName = dto.RevokeType switch
  223. {
  224. "1" => "诉求人已私下解决",
  225. "2" => "诉求内容有误",
  226. "3" => "诉求人信息有误",
  227. "other" => "其它",
  228. _ => "其它",
  229. }
  230. };
  231. await _orderRevokeRepository.AddAsync(orderRevoke, cancellationToken);
  232. var current = SessionContextCreator.CreateSessionContext(dto.Source,_cityBaseConfiguration.Value);
  233. if (string.IsNullOrEmpty(order?.WorkflowId))
  234. {
  235. var startDto = new StartWorkflowDto
  236. {
  237. DefinitionModuleCode = WorkflowModuleConsts.OrderHandle,
  238. Title = order.Title,
  239. Opinion = dto.Opinion,
  240. };
  241. await _workflowApplication.StartToEndAsync(startDto, current, order.Id, order.ExpiredTime,
  242. cancellationToken);
  243. }
  244. else
  245. {
  246. //await _workflowApplication.HandleToEndAsync(current, order.WorkflowId, dto.Opinion, null,
  247. // cancellationToken: cancellationToken);
  248. await _workflowApplication.JumpToEndAsync(current, order.WorkflowId, dto.Opinion, null, order.ExpiredTime,
  249. cancellationToken: cancellationToken);
  250. }
  251. }
  252. /// <summary>
  253. /// 服务工单催单
  254. /// </summary>
  255. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderRemind)]
  256. public async Task RecOrderUrgeAsync(ProvinceOrderUrgeDto dto, CancellationToken cancellationToken)
  257. {
  258. var exists = await _orderUrgeRepository.Queryable()
  259. .AnyAsync(d => d.DsBisId == dto.DsBisId, cancellationToken);
  260. if (exists)
  261. throw new UserFriendlyException($"收到重复催办编号: {dto.DsBisId}");
  262. var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.CaseSerial).FirstAsync(cancellationToken);
  263. var model = new OrderUrge();
  264. model.InitId();
  265. model.State = 0;
  266. model.CreatorOrgName = "省12345";
  267. model.CrUser = dto.RemindName;
  268. model.ApplyContent = dto.RemindReasion;
  269. model.OrderId = order.Id;
  270. model.OrgId = "001";
  271. model.OrgName = "市民热线服务中心";
  272. model.RemindTime = dto.RemindTime;
  273. model.DsBisId = dto.DsBisId;
  274. //if (!string.IsNullOrEmpty(order.WorkflowId))
  275. //{
  276. // var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
  277. // if (org != null)
  278. // {
  279. // model.OrgId = org.Key;
  280. // model.OrgName = org.Value;
  281. // }
  282. //}
  283. if (!string.IsNullOrEmpty(order.CurrentHandleOrgId) && !string.IsNullOrEmpty(order.CurrentHandleOrgName))
  284. {
  285. model.OrgId = order.CurrentHandleOrgId;
  286. model.OrgName = order.CurrentHandleOrgName;
  287. }
  288. if (dto.Files.Any())
  289. model.FileJson =
  290. await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
  291. await _orderUrgeRepository.AddAsync(model, cancellationToken);
  292. }
  293. /// <summary>
  294. /// 服务工单预警---收到预警给当前办理部门发催办,如果没有办理部门直接催办中心
  295. /// </summary>
  296. /// <param name="dto"></param>
  297. /// <param name="cancellationToken"></param>
  298. /// <returns></returns>
  299. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderWarning)]
  300. public async Task RecWarnInfoAsync(WarningDto dto, CancellationToken cancellationToken)
  301. {
  302. var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.CaseSerial).FirstAsync(cancellationToken);
  303. if (order != null)
  304. {
  305. var model = new OrderUrge();
  306. model.InitId();
  307. model.State = 0;
  308. model.CreatorOrgName = "省12345";
  309. model.CrUser = "省12345";
  310. model.ApplyContent = dto.WarnRulename + " " + dto.WarnDescribe;
  311. model.OrderId = order.Id;
  312. model.ReplyLimitTime = dto.WarnTimebf;
  313. model.OrgId = "001";
  314. model.OrgName = "市民热线服务中心";
  315. //if (!string.IsNullOrEmpty(order.WorkflowId))
  316. //{
  317. // var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
  318. // if (org != null)
  319. // {
  320. // model.OrgId = org.Key;
  321. // model.OrgName = org.Value;
  322. // }
  323. //}
  324. //model.OrgId = order.CurrentHandleOrgId;
  325. //model.OrgName = order.CurrentHandleOrgName;
  326. if (!string.IsNullOrEmpty(order.CurrentHandleOrgId) && !string.IsNullOrEmpty(order.CurrentHandleOrgName))
  327. {
  328. model.OrgId = order.CurrentHandleOrgId;
  329. model.OrgName = order.CurrentHandleOrgName;
  330. }
  331. await _orderUrgeRepository.AddAsync(model, cancellationToken);
  332. //写入预警
  333. var warning = new OrderWarning()
  334. {
  335. OrderId = order.Id,
  336. WarnRulename = dto.WarnRulename,
  337. WarnDescribe = dto.WarnDescribe,
  338. WarnTimebf = dto.WarnTimebf,
  339. WarnDegree = dto.WarnDegree,
  340. WarnType = dto.WarnType,
  341. WarnDate = dto.WarnDate,
  342. IsProWarn = true
  343. };
  344. await _orderWarningRepository.AddAsync(warning, cancellationToken);
  345. }
  346. }
  347. /// <summary>
  348. /// 督办工单派发接口
  349. /// </summary>
  350. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderSupervise)]
  351. public async Task RecOrderSuperviseAsync(ProvinceSendOrderSuperviseDto dto, CancellationToken cancellationToken)
  352. {
  353. var exists = await _orderSuperviseRepository.Queryable()
  354. .AnyAsync(d => d.SuperviseSerial == dto.ProvinceOrderSuperviseDto.SuperviseSerial, cancellationToken);
  355. if (exists)
  356. throw new UserFriendlyException($"收到重复督办编号: {dto.ProvinceOrderSuperviseDto.SuperviseSerial}");
  357. var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.ProvinceOrderSuperviseDto!.CaseSerial).FirstAsync(cancellationToken);
  358. var org = await _systemOrganizeRepository.GetAsync(x => x.Id == order.ActualHandleOrgCode, cancellationToken);
  359. var model = new OrderSupervise();
  360. model.InitId();
  361. model.OrderId = order.Id;
  362. model.ReplyLimitTime = dto.ProvinceOrderSuperviseDto.SuperviseReturnDate;
  363. model.OrgName = org.Name;
  364. model.OrgId = org.Id;
  365. model.LaunchOrgName = dto.ProvinceOrderSuperviseDto.SuperviseSendDept;
  366. model.CrUser = dto.ProvinceOrderSuperviseDto.SupervisePerson;
  367. model.State = 0;
  368. model.Province = true;
  369. model.ApplyContent = dto.ProvinceOrderSuperviseDto.SuperviseContent;
  370. model.SuperviseSerial = dto.ProvinceOrderSuperviseDto.SuperviseSerial;
  371. model.SuperviseTitle = dto.ProvinceOrderSuperviseDto.SuperviseTitle;
  372. model.SuperviseTime = dto.ProvinceOrderSuperviseDto.SuperviseTime;
  373. model.SuperviseType = dto.ProvinceOrderSuperviseDto.SuperviseType;
  374. if (dto.Files.Any())
  375. model.FileJson =
  376. await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
  377. await _orderSuperviseRepository.AddAsync(model, cancellationToken);
  378. }
  379. /// <summary>
  380. /// 服务工单甄别结果
  381. /// </summary>
  382. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderScreen)]
  383. public async Task RecOrderScreenResultAsync(ProvinceSendScreenResultDto dto, CancellationToken cancellationToken)
  384. {
  385. //var order = await _orderRepository.Queryable()
  386. // .Where(x => x.ProvinceNo == dto.ProvinceScreenResult!.CaseSerial)
  387. // .FirstAsync(cancellationToken);
  388. //var orderScreen = await _orderScreenRepository.Queryable()
  389. // .Where(x => x.OrderId == order.Id && x.Status == Share.Enums.Order.EScreenStatus.Approval)
  390. // .FirstAsync(cancellationToken);
  391. var orderScreen = await _orderScreenRepository.Queryable()
  392. .Where(x => x.Order.ReceiveProvinceNo == dto.ProvinceScreenResult.CaseSerial &&
  393. x.Status == EScreenStatus.Approval)
  394. .FirstAsync(cancellationToken);
  395. var current = SessionContextCreator.CreateSessionContext(dto.Source,_cityBaseConfiguration.Value);
  396. await _workflowApplication.HandleToEndAsync(current,
  397. orderScreen.WorkflowId, "省上推送甄别结果", null,
  398. dto.ProvinceScreenResult.AuditResult
  399. ? Share.Enums.FlowEngine.EReviewResult.Approval
  400. : Share.Enums.FlowEngine.EReviewResult.Failed, cancellationToken);
  401. orderScreen.Status = dto.ProvinceScreenResult.AuditResult ? Share.Enums.Order.EScreenStatus.End : Share.Enums.Order.EScreenStatus.Refuse;
  402. //if (orderScreen.Status == Share.Enums.Order.EScreenStatus.End)
  403. //{
  404. // var visitDetail = await _orderVisitedDetailRepository.GetAsync(orderScreen.VisitDetailId, cancellationToken);
  405. // if (visitDetail != null)
  406. // {
  407. // var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
  408. // visitDetail.OrgProcessingResults = screenSatisfy;
  409. // visitDetail.OrgHandledAttitude = screenSatisfy;
  410. // await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
  411. // }
  412. //}
  413. orderScreen.ReplyContent = dto.ProvinceScreenResult.AuditOpinion;
  414. orderScreen.AuditName = dto.ProvinceScreenResult.AuditPerson;
  415. orderScreen.AuditOrgName = dto.ProvinceScreenResult.AuditOuname;
  416. orderScreen.AuditTime = dto.ProvinceScreenResult.AuditTime;
  417. if (dto.Files.Any())
  418. orderScreen.FileJson =
  419. await _fileRepository.AddFileAsync(dto.Files, orderScreen.Id, "", cancellationToken);
  420. await _orderScreenRepository.UpdateAsync(orderScreen, cancellationToken);
  421. }
  422. /// <summary>
  423. /// 更新工单受理附件
  424. /// </summary>
  425. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderUpdataFiles)]
  426. public async Task RecOrderUpdateFilesAsync(OrderUpdataFiles dto, CancellationToken cancellationToken)
  427. {
  428. if (dto == null && dto.Files.Any())
  429. {
  430. var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
  431. order.FileJson = await _fileRepository.AddFileAsync(dto.Files, dto.OrderId, "", cancellationToken);
  432. }
  433. }
  434. /// <summary>
  435. /// 省下行回访
  436. /// </summary>
  437. /// <param name="dto"></param>
  438. /// <param name="cancellationToken"></param>
  439. /// <returns></returns>
  440. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderEvlResult)]
  441. public async Task OrderVisitProvince(ProvinceOrderVisitDto dto, CancellationToken cancellationToken)
  442. {
  443. var orderVisit = await _orderVisitRepository.Queryable()
  444. .Includes(x => x.Order)
  445. .Includes(x => x.OrderVisitDetails)
  446. .Where(x => x.Order.ReceiveProvinceNo == dto.ProvinceNo &&
  447. x.VisitState != Share.Enums.Order.EVisitState.None).FirstAsync(cancellationToken);
  448. if (orderVisit != null)
  449. {
  450. //处理评价结果
  451. var processingResult = dto.OrgProcessingResults;
  452. Kv orgProcessingResults = null;
  453. if (!string.IsNullOrEmpty(processingResult))
  454. {
  455. var dicData = await _systemDicDataRepository.GetAsync(x => x.DicTypeCode == SysDicTypeConsts.VisitSatisfaction &&
  456. x.DicDataValue == processingResult, cancellationToken);
  457. if (dicData != null)
  458. {
  459. orgProcessingResults = new Kv();
  460. orgProcessingResults.Key = dicData.DicDataValue;
  461. orgProcessingResults.Value = dicData.DicDataName;
  462. }
  463. if (orgProcessingResults != null)
  464. {
  465. //主表
  466. orderVisit.VisitState = Share.Enums.Order.EVisitState.Visited;
  467. orderVisit.VisitTime = dto.VisitTime;
  468. orderVisit.VisitType = dto.VisitType;
  469. orderVisit.IsCanHandle = orgProcessingResults.Key == "2";
  470. orderVisit.IsCanAiVisit = false;
  471. orderVisit.NowEvaluate = orgProcessingResults;
  472. await _orderVisitRepository.UpdateAsync(orderVisit, cancellationToken);
  473. //子表
  474. for (int i = 0; i < orderVisit.OrderVisitDetails.Count; i++)
  475. {
  476. if (orderVisit.OrderVisitDetails[i].VisitTarget == EVisitTarget.Seat)
  477. {
  478. orderVisit.OrderVisitDetails[i].VoiceEvaluate = (EVoiceEvaluate)int.Parse(orgProcessingResults.Key);
  479. orderVisit.OrderVisitDetails[i].SeatEvaluate = (ESeatEvaluate)int.Parse(orgProcessingResults.Key);
  480. }
  481. else
  482. {
  483. orderVisit.OrderVisitDetails[i].OrgProcessingResults = orgProcessingResults;
  484. }
  485. orderVisit.OrderVisitDetails[i].VisitContent = dto.VisitContent;
  486. }
  487. await _orderVisitedDetailRepository.UpdateRangeAsync(orderVisit.OrderVisitDetails, cancellationToken);
  488. //工单
  489. orderVisit.Order.Visited(orgProcessingResults.Key, orgProcessingResults.Value);
  490. await _orderRepository.UpdateAsync(orderVisit.Order);
  491. ////处理网站通知差评数据
  492. //if (orderVisit.Order.Source == ESource.Hotline && orderVisit.OrderVisitDetails.Any(x => x.OrgHandledAttitude?.Key == "1" || x.OrgHandledAttitude?.Key == "2" || x.OrgProcessingResults?.Key == "1" || x.OrgProcessingResults?.Key == "2"))
  493. //{
  494. // //包含不满意数据,重新生成新的回访
  495. // var newOrderVisit = _mapper.Map<OrderVisit>(orderVisit);
  496. // newOrderVisit.InitId();
  497. // newOrderVisit.VisitState = EVisitState.NoSatisfiedWaitForVisit;
  498. // newOrderVisit.VisitTime = null;
  499. // newOrderVisit.IsCanHandle = false;
  500. // newOrderVisit.IsCanAiVisit = false;
  501. // newOrderVisit.AiVisitCount = 0;
  502. // await _orderVisitRepository.AddAsync(newOrderVisit, cancellationToken);
  503. // var list = _mapper.Map<List<OrderVisitDetail>>(orderVisit.OrderVisitDetails);
  504. // list.ForEach(x =>
  505. // {
  506. // x.VisitId = newOrderVisit.Id;
  507. // x.VoiceEvaluate = null;
  508. // x.VoiceEvaluate = null;
  509. // x.OrgHandledAttitude = null;
  510. // x.OrgNoSatisfiedReason = null;
  511. // x.OrgProcessingResults = null;
  512. // x.VisitContent = "";
  513. // });
  514. // await _orderVisitedDetailRepository.AddRangeAsync(list, cancellationToken);
  515. //}
  516. }
  517. }
  518. }
  519. else
  520. {
  521. //处理省下行回访
  522. var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.ProvinceNo).FirstAsync();
  523. if (order !=null)
  524. {
  525. //判断是否有发布数据
  526. var orderPublish = await _orderPublishRepository.Queryable()
  527. .Includes(x => x.Order).
  528. Where(x => x.Order.ReceiveProvinceNo == dto.ProvinceNo).FirstAsync(cancellationToken);
  529. if (orderPublish == null)
  530. {
  531. orderPublish = new OrderPublish();
  532. orderPublish.OrderId = order.Id;
  533. orderPublish.No = order.No;
  534. orderPublish.PublishState = false;
  535. orderPublish.ArrangeTitle = order.Title;
  536. orderPublish.ArrangeContent = order.Content;
  537. orderPublish.ArrangeOpinion = order.FileOpinion;
  538. orderPublish.ProPublishState = false;
  539. orderPublish.FeedBackPhone = order.Contact;
  540. orderPublish.CreatorName = order.CenterToOrgHandlerId;
  541. await _orderPublishRepository.AddAsync(orderPublish);
  542. order.Publish(orderPublish.PublishState);
  543. }
  544. orderVisit = new OrderVisit();
  545. orderVisit.No = order.No;
  546. orderVisit.OrderId = order.Id;
  547. orderVisit.VisitState = EVisitState.WaitForVisit;
  548. orderVisit.PublishTime = DateTime.Now;
  549. orderVisit.IsCanHandle = true;
  550. orderVisit.EmployeeId = order.CenterToOrgHandlerId;
  551. orderVisit.VisitState = EVisitState.Visited;
  552. orderVisit.VisitTime = dto.VisitTime;
  553. orderVisit.VisitType = dto.VisitType;
  554. orderVisit.IsCanAiVisit = false;
  555. orderVisit.IsCanHandle = false;
  556. var VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue == dto.OrgProcessingResults).Select(m => new Kv { Key = m.DicDataValue, Value = m.DicDataName }).FirstOrDefault();
  557. var satisfy = VisitSatisfaction;
  558. orderVisit.NowEvaluate = satisfy;
  559. string visitId = await _orderVisitRepository.AddAsync(orderVisit);
  560. //新增回访信息
  561. var visitedDetail = new List<OrderVisitDetail>();
  562. //新增坐席回访
  563. var seatDetail = new OrderVisitDetail();
  564. seatDetail.VisitId = visitId;
  565. seatDetail.VisitTarget = EVisitTarget.Seat;
  566. seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
  567. seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
  568. visitedDetail.Add(seatDetail);
  569. //新增部门回访
  570. var orgDetail = new OrderVisitDetail();
  571. orgDetail.VisitId = visitId;
  572. orgDetail.VisitOrgCode = order.ActualHandleOrgCode;
  573. orgDetail.VisitOrgName = order.ActualHandleOrgName;
  574. orgDetail.VisitTarget = EVisitTarget.Org;
  575. orgDetail.OrgProcessingResults = satisfy;
  576. visitedDetail.Add(orgDetail);
  577. //TODO 自贡办件态度
  578. await _orderVisitedDetailRepository.AddRangeAsync(visitedDetail,cancellationToken);
  579. order.Visited(satisfy.Key,satisfy.Value);
  580. order.Status = EOrderStatus.Visited;
  581. await _orderRepository.UpdateAsync(order, cancellationToken);
  582. }
  583. }
  584. }
  585. /// <summary>
  586. /// 工单回访
  587. /// </summary>
  588. /// <param name="dto"></param>
  589. /// <param name="cancellationToken"></param>
  590. /// <returns></returns>
  591. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderVisitAllOther)]
  592. public async Task OrderVisitWeb(OrderVisitWebDto dto, CancellationToken cancellationToken)
  593. {
  594. await _orderApplication.OrderVisitWeb(dto, cancellationToken);
  595. }
  596. /// <summary>
  597. /// 订阅省工单延期消息
  598. /// </summary>
  599. /// <param name="dto"></param>
  600. /// <param name="cancellationToken"></param>
  601. /// <returns></returns>
  602. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderDelayResult)]
  603. public async Task OrderDelayWeb(ProvinceSendDelayResultDto dto, CancellationToken cancellationToken)
  604. {
  605. var order = await _orderRepository.GetAsync(x => x.ReceiveProvinceNo == dto.No, cancellationToken);
  606. if (order != null)
  607. {
  608. //查询延期
  609. var orderDelay = await _orderDelayRepository
  610. .GetAsync(x => x.OrderId == order.Id && x.DelayState == EDelayState.Examining, cancellationToken);
  611. if (orderDelay != null)
  612. {
  613. orderDelay.AuditName = dto.AuditName;
  614. orderDelay.AuditOrgName = dto.AuditOrgName;
  615. orderDelay.AuditTime = dto.AuditTime;
  616. orderDelay.AuditOpinion = dto.Opinion;
  617. if (dto.Files != null && dto.Files.Any())
  618. orderDelay.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderDelay.Id, orderDelay.WorkflowId, cancellationToken);
  619. await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
  620. var current = SessionContextCreator.CreateSessionContext(dto.Source, _cityBaseConfiguration.Value);
  621. await _workflowApplication.HandleToEndAsync(current, orderDelay.WorkflowId, dto.Opinion, dto.Files,
  622. dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed, cancellationToken);
  623. }
  624. }
  625. }
  626. /// <summary>
  627. /// 接收工单处理结果
  628. /// </summary>
  629. [CapSubscribe(EventNames.SharingOrderReultSend)]
  630. public async Task RecOrderResultAsync(OrderResultDto dto, CancellationToken cancellationToken)
  631. {
  632. var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
  633. if (order is null)
  634. throw new UserFriendlyException($"无效工单编号, orderId: {dto.OrderId}");
  635. if (string.IsNullOrEmpty(order.WorkflowId))
  636. throw new UserFriendlyException($"该工单未开启流程,orderId: {dto.OrderId}");
  637. //if (dto.Files != null && dto.Files.Any())
  638. //{
  639. // order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, order.WorkflowId,
  640. // cancellationToken);
  641. // await _orderRepository.FileAsync(order, cancellationToken);
  642. //}
  643. var current = SessionContextCreator.CreateSessionContext(dto.Source, _cityBaseConfiguration.Value);
  644. switch (dto.FinishType)
  645. {
  646. case "0":
  647. //退回:撤回至发起人
  648. await _workflowDomainService.RecallToStartStepAsync(order.WorkflowId, dto.Opinion, current, cancellationToken);//todo think是否需要保存附件至省平台办理节点?
  649. break;
  650. case "1":
  651. //办结:归档
  652. await _workflowApplication.HandleToEndAsync(current, order.WorkflowId, dto.Opinion, dto.Files,
  653. cancellationToken: cancellationToken);
  654. break;
  655. }
  656. //var now = DateTime.Now;
  657. //var handleDuration = order.StartTime.HasValue
  658. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
  659. // now, order.ProcessType is EProcessType.Zhiban)
  660. // : 0;
  661. //var fileDuration = order.CenterToOrgTime.HasValue
  662. // ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  663. // now, order.ProcessType is EProcessType.Zhiban)
  664. // : 0;
  665. //var allDuration = order.StartTime.HasValue
  666. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
  667. // order.ProcessType is EProcessType.Zhiban)
  668. // : 0;
  669. //order.File(now, handleDuration, fileDuration, allDuration);
  670. //await _orderRepository.UpdateAsync(order, cancellationToken);
  671. }
  672. /// <summary>
  673. /// 接收工单扩展信息
  674. /// </summary>
  675. [CapSubscribe(EventNames.SharingOrderExtends)]
  676. public async Task RecOrderExtensionAsync(OrderExtensionDto dto, CancellationToken cancellationToken)
  677. {
  678. var order = await _orderRepository.Queryable()
  679. .FirstAsync(d => d.ReceiveProvinceNo == dto.ProvinceNo, cancellationToken);
  680. var orderExtension = await _orderDomainService.GetOrderExtensionsAsync(dto.ProvinceNo, cancellationToken);
  681. if (orderExtension is null)
  682. {
  683. orderExtension = _mapper.Map<OrderExtension>(dto);
  684. if (order != null)
  685. orderExtension.Id = order.Id;
  686. await _orderExtensionRepository.AddAsync(orderExtension, cancellationToken);
  687. }
  688. else
  689. {
  690. _mapper.Map(dto, orderExtension);
  691. if (order != null)
  692. orderExtension.Id = order.Id;
  693. await _orderExtensionRepository.UpdateAsync(orderExtension, cancellationToken);
  694. }
  695. }
  696. /// <summary>
  697. /// 接收工单办理流程
  698. /// </summary>
  699. [CapSubscribe(EventNames.SharingOrderAddTraces)]
  700. public async Task RecOrderTracesAsync(AddOrderTracesDto dto, CancellationToken cancellationToken)
  701. {
  702. var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
  703. if (order is null)
  704. throw new UserFriendlyException($"未查询到对应工单,orderId: {dto.OrderId}");
  705. if (string.IsNullOrEmpty(order.WorkflowId))
  706. throw new UserFriendlyException($"该工单未开启流程,orderId: {dto.OrderId}");
  707. var traces = dto.Traces.Select(d =>
  708. {
  709. var trace = _mapper.Map<WorkflowTrace>(d);
  710. trace.WorkflowId = order.WorkflowId;
  711. return trace;
  712. }).ToList();
  713. await _workflowDomainService.AddTracesAsync(order.WorkflowId, traces, cancellationToken);
  714. }
  715. /// <summary>
  716. /// 接收工单补充内容
  717. /// </summary>
  718. [CapSubscribe(EventNames.SharingOrderSupplements)]
  719. public async Task RecOrderSupplementsAsync(AddOrderComplementDto dto, CancellationToken cancellationToken)
  720. {
  721. var order = await _orderRepository.GetAsync(d => d.ReceiveProvinceNo == dto.CaseSerial, cancellationToken);
  722. if (order is null)
  723. throw new UserFriendlyException("无效省工单编号");
  724. dto.OrderId = order.Id;
  725. await _orderDomainService.AddOrderComplementAsync(dto, cancellationToken);
  726. }
  727. /// <summary>
  728. /// 接收省上上传附件
  729. /// </summary>
  730. /// <param name="dto"></param>
  731. /// <param name="cancellationToken"></param>
  732. /// <returns></returns>
  733. /// <exception cref="UserFriendlyException"></exception>
  734. /// <exception cref="ArgumentOutOfRangeException"></exception>
  735. [CapSubscribe(EventNames.SharingFileInfo)]
  736. public async Task RecFilesAsync(ReceiveFilesFromDsDto dto, CancellationToken cancellationToken)
  737. {
  738. if (dto.Files == null || !dto.Files.Any())
  739. throw new UserFriendlyException("未收到任何附件");
  740. switch (dto.DsBisType)
  741. {
  742. case EDsBisType.AcceptOrder:
  743. var order = await _orderRepository.GetAsync(d => d.ReceiveProvinceNo == dto.ProvinceNo, cancellationToken);
  744. if (order is null)
  745. throw new UserFriendlyException("无效省工单编号");
  746. order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", cancellationToken);
  747. await _orderRepository.UpdateAsync(order, cancellationToken);
  748. break;
  749. case EDsBisType.OrderPreviousResult:
  750. var sendBack = await _orderSendBackRepository.Queryable()
  751. .Where(d => d.Order.ReceiveProvinceNo == dto.ProvinceNo)
  752. .FirstAsync(cancellationToken);
  753. if (sendBack is null)
  754. throw new UserFriendlyException("无效省工单退回编号");
  755. sendBack.FileJson = await _fileRepository.AddFileAsync(dto.Files, sendBack.Id, string.Empty, cancellationToken);
  756. await _orderSendBackRepository.UpdateAsync(sendBack, cancellationToken);
  757. break;
  758. case EDsBisType.SendOrderSupervise:
  759. var orderSupervise = await _orderSuperviseRepository
  760. .GetAsync(d => d.SuperviseSerial == dto.SuperviseId, cancellationToken);
  761. if (orderSupervise is null)
  762. throw new UserFriendlyException("无效省工单督办编号");
  763. orderSupervise.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderSupervise.Id, "", cancellationToken);
  764. await _orderSuperviseRepository.AddAsync(orderSupervise, cancellationToken);
  765. break;
  766. case EDsBisType.SendOrderUrge:
  767. var orderUrge = await _orderUrgeRepository
  768. .GetAsync(d => d.DsBisId == dto.DsBisId, cancellationToken);
  769. if (orderUrge is null)
  770. throw new UserFriendlyException("无效省工单催办业务编号");
  771. orderUrge.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderUrge.Id, "", cancellationToken);
  772. await _orderUrgeRepository.UpdateAsync(orderUrge, cancellationToken);
  773. break;
  774. case EDsBisType.OrderScreenResult:
  775. var orderScreen = await _orderScreenRepository.Queryable()
  776. .Where(x => x.Order.ReceiveProvinceNo == dto.ProvinceNo && x.Status == Share.Enums.Order.EScreenStatus.Approval)
  777. .FirstAsync(cancellationToken);
  778. if (orderScreen is null)
  779. throw new UserFriendlyException("未查询到对应省工单甄别数据");
  780. orderScreen.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderScreen.Id, "", cancellationToken);
  781. await _orderScreenRepository.UpdateAsync(orderScreen, cancellationToken);
  782. break;
  783. case EDsBisType.OrderDelayResult:
  784. var orderDelay = await _orderDelayRepository.Queryable()
  785. .Where(d => d.Order.ReceiveProvinceNo == dto.ProvinceNo && d.DelayState == EDelayState.Examining)
  786. .FirstAsync(cancellationToken);
  787. if (orderDelay is null)
  788. throw new UserFriendlyException($"未查询到延期数据, ProvinceNo: {dto.ProvinceNo}");
  789. if (dto.Files != null && dto.Files.Any())
  790. orderDelay.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderDelay.Id, orderDelay.WorkflowId, cancellationToken);
  791. await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
  792. break;
  793. case EDsBisType.SendOrderComplement:
  794. var complement = await _orderComplementRepository
  795. .GetAsync(d => d.DsBisId == dto.DsBisId, cancellationToken);
  796. if (complement is null)
  797. throw new UserFriendlyException(
  798. $"未查询到补充信息, ProvinceNo: {dto.ProvinceNo}, DsBisIs: {dto.DsBisId}");
  799. if (dto.Files.Any()) complement.FileJson = await _fileRepository.AddFileAsync(dto.Files, complement.Id, "", cancellationToken);
  800. await _orderComplementRepository.UpdateAsync(complement, cancellationToken);
  801. break;
  802. case EDsBisType.OrderHandleResult:
  803. var order1 = await _orderRepository.GetAsync(d => d.ProvinceNo == dto.ProvinceNo, cancellationToken);
  804. if (order1 is null)
  805. throw new UserFriendlyException($"无效工单编号, ProvinceNo: {dto.ProvinceNo}");
  806. if (string.IsNullOrEmpty(order1.WorkflowId))
  807. throw new UserFriendlyException($"该工单未开启流程,ProvinceNo: {dto.ProvinceNo}");
  808. await _workflowApplication.UpdateProvinceHandleResultFilesAsync(order1.WorkflowId, dto.Files, cancellationToken);
  809. break;
  810. default:
  811. throw new ArgumentOutOfRangeException();
  812. }
  813. }
  814. /// <summary>
  815. /// 接收市州互转返回数据
  816. /// </summary>
  817. [CapSubscribe(EventNames.SharingOrderTranspondCity)]
  818. public async Task RecTranspondCityRawDataAsync(TranspondCityRawDataDto dto, CancellationToken cancellationToken)
  819. {
  820. var data = await _transpondCityRawDataRepository.GetAsync(p => p.OrderCode == dto.OrderCode && p.Direction == ETranspondDirection.Out, cancellationToken);
  821. if (data != null)
  822. {
  823. data.IsSuccess = dto.IsSuccess;
  824. data.SendTimes = dto.SendTimes;
  825. data.Result = dto.Result;
  826. data.NewCode = dto.NewCode;
  827. await _transpondCityRawDataRepository.UpdateAsync(data, cancellationToken);
  828. }
  829. }
  830. /// <summary>
  831. /// 接收市州互转接收原始数据
  832. /// </summary>
  833. [CapSubscribe(EventNames.SharingOrderReceiveTranspondCity)]
  834. public async Task RecTranspondCityReceiveRawDataAsync(TranspondCityRawDataDto dto, CancellationToken cancellationToken)
  835. {
  836. await _transpondCityRawDataRepository.AddAsync(_mapper.Map<TranspondCityRawData>(dto), cancellationToken);
  837. }
  838. /// <summary>
  839. /// 接收市州互转办理结果
  840. /// </summary>
  841. [CapSubscribe(EventNames.SharingOrderReceiveHandleOpinionTranspondCity)]
  842. public async Task RecTranspondCityReceiveResultAsync(TranspondCityOrderResultDto dto, CancellationToken cancellationToken)
  843. {
  844. var cityDataUndertakAdvice = _systemSettingCacheManager.GetSetting(SettingConstants.CityDataUndertakAdvice)?.SettingValue[0];
  845. if (cityDataUndertakAdvice == "true")
  846. {
  847. var order = await _orderRepository.GetAsync(p => p.No == dto.No, cancellationToken);
  848. if (order != null)
  849. {
  850. order.ActualOpinion = dto.Opinion;
  851. await _orderRepository.UpdateAsync(order, cancellationToken);
  852. //后面还需要处理流程中的意见
  853. }
  854. }
  855. //修改推送数据办理结果
  856. var data = await _transpondCityRawDataRepository.GetAsync(p => p.OrderCode == dto.No && p.Direction == ETranspondDirection.Out, cancellationToken);
  857. if (data != null)
  858. {
  859. data.ActualOpinion = dto.Opinion;
  860. await _transpondCityRawDataRepository.UpdateAsync(data, cancellationToken);
  861. }
  862. }
  863. /// <summary>
  864. /// 应急管理局推送回调
  865. /// </summary>
  866. /// <returns></returns>
  867. [CapSubscribe(EventNames.HotlineOrderContingencyManagementState)]
  868. public async Task RecHotlineOrderContingencyManagementState(RecOrderStateDto dto, CancellationToken cancellationToken)
  869. {
  870. var data = await _contingencyManagementOrdersRepository.GetAsync(p => p.Id == dto.Id, cancellationToken);
  871. if (data != null && dto.State != data.PushState)
  872. {
  873. data.PushState = dto.State;
  874. await _contingencyManagementOrdersRepository.UpdateAsync(data, cancellationToken);
  875. }
  876. }
  877. /// <summary>
  878. /// 处理每天办理完成未及时推送办理结果的数据
  879. /// </summary>
  880. /// <param name="provinceNos"></param>
  881. /// <param name="cancellationToken"></param>
  882. /// <returns></returns>
  883. [CapSubscribe(EventNames.HotlineFiledOrdersRepublish)]
  884. public async Task RepublishFiledOrders(List<string> provinceNos, CancellationToken cancellationToken)
  885. {
  886. var unpublishOrders = await _orderRepository.Queryable()
  887. .Where(d => provinceNos.Contains(d.ProvinceNo) &&
  888. !string.IsNullOrEmpty(d.ProvinceNo) &&
  889. d.Status >= EOrderStatus.Filed)
  890. .ToListAsync(cancellationToken);
  891. foreach (var order in unpublishOrders)
  892. {
  893. var trace = await _workflowTraceRepository.Queryable()
  894. .FirstAsync(d => d.WorkflowId == order.WorkflowId && d.StepType == EStepType.End, cancellationToken);
  895. var orderFlowDto = new OrderFlowDto
  896. {
  897. Order = _mapper.Map<OrderDto>(order),
  898. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
  899. };
  900. if (order.SourceChannelCode == AppDefaults.SourceChannel.DianHua &&
  901. !string.IsNullOrEmpty(order.CallId))
  902. {
  903. if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.TianRun)
  904. {
  905. var callRecord = await _callApplication.GetTianrunCallAsync(order.CallId, cancellationToken);
  906. if (callRecord != null)
  907. {
  908. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  909. }
  910. }
  911. else if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XingTang)
  912. {
  913. var call = await _callApplication.GetCallAsync(order.CallId, cancellationToken);
  914. if (call is not null)
  915. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(call);
  916. }
  917. }
  918. //这里需要判断是否是警情退回
  919. orderFlowDto.IsNonPoliceReturn = false;
  920. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: cancellationToken);
  921. }
  922. }
  923. /// <summary>
  924. /// 随手拍网格员、回复办理结果
  925. /// </summary>
  926. /// <param name="dto"></param>
  927. /// <param name="cancellationToken"></param>
  928. /// <returns></returns>
  929. [CapSubscribe(EventNames.TianQueReceiverOpinion)]
  930. public async Task TianQueReceiverOpinion(TianQueReceiverOpinionDto dto, CancellationToken cancellationToken)
  931. {
  932. //todo
  933. }
  934. /// <summary>
  935. /// 天阙推送工单,返回信息
  936. /// </summary>
  937. /// <returns></returns>
  938. [CapSubscribe(EventNames.TianQuePushOrderReceiver)]
  939. public async Task TianQuePushOrderReceiver(TianQuePushOrderReceiverDto dto, CancellationToken cancellationToken)
  940. {
  941. //todo
  942. }
  943. }
  944. }