DatasharingSubscriber.cs 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318
  1. using DotNetCore.CAP;
  2. using FluentValidation;
  3. using Hotline.Application.CallCenter;
  4. using Hotline.Application.FlowEngine;
  5. using Hotline.Application.OrderApp;
  6. using Hotline.Authentications;
  7. using Hotline.Caching.Interfaces;
  8. using Hotline.Caching.Services;
  9. using Hotline.CallCenter.Calls;
  10. using Hotline.Configurations;
  11. using Hotline.ContingencyManagement;
  12. using Hotline.File;
  13. using Hotline.FlowEngine.WorkflowModules;
  14. using Hotline.FlowEngine.Workflows;
  15. using Hotline.Orders;
  16. using Hotline.OrderTranspond;
  17. using Hotline.Settings;
  18. using Hotline.Settings.TimeLimitDomain;
  19. using Hotline.Share.Dtos;
  20. using Hotline.Share.Dtos.ContingencyManagement;
  21. using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
  22. using Hotline.Share.Dtos.FlowEngine;
  23. using Hotline.Share.Dtos.FlowEngine.Workflow;
  24. using Hotline.Share.Dtos.Order;
  25. using Hotline.Share.Dtos.OrderTranspond;
  26. using Hotline.Share.Dtos.Settings;
  27. using Hotline.Share.Dtos.TrCallCenter;
  28. using Hotline.Share.Enums.FlowEngine;
  29. using Hotline.Share.Enums.Order;
  30. using Hotline.Share.Mq;
  31. using Hotline.Validators.FlowEngine;
  32. using Mapster;
  33. using MapsterMapper;
  34. using Microsoft.AspNetCore.Http;
  35. using Microsoft.AspNetCore.Mvc;
  36. using Microsoft.Extensions.Logging;
  37. using Microsoft.Extensions.Options;
  38. using Newtonsoft.Json;
  39. using SqlSugar;
  40. using XF.Domain.Authentications;
  41. using XF.Domain.Dependency;
  42. using XF.Domain.Exceptions;
  43. using XF.Domain.Repository;
  44. namespace Hotline.Application.Subscribers
  45. {
  46. /// <summary>
  47. /// 订阅来自DataSharing的消息
  48. /// </summary>
  49. public class DataSharingSubscriber : ICapSubscribe, ITransientDependency
  50. {
  51. private readonly IRepository<OrderVisit> _orderVisitRepository;
  52. private readonly IMapper _mapper;
  53. private readonly IOrderRepository _orderRepository;
  54. private readonly IOrderDomainService _orderDomainService;
  55. private readonly ICapPublisher _capPublisher;
  56. private readonly IRepository<OrderDelay> _orderDelayRepository;
  57. private readonly IRepository<OrderSendBack> _orderSendBackRepository;
  58. private readonly IWorkflowApplication _workflowApplication;
  59. private readonly IWorkflowDomainService _workflowDomainService;
  60. private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
  61. private readonly IFileRepository _fileRepository;
  62. private readonly IRepository<OrderUrge> _orderUrgeRepository;
  63. private readonly IRepository<OrderSupervise> _orderSuperviseRepository;
  64. private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
  65. private readonly IOrderScreenRepository _orderScreenRepository;
  66. private readonly IRepository<OrderExtension> _orderExtensionRepository;
  67. private readonly IRepository<SystemDicData> _systemDicDataRepository;
  68. private readonly ISystemOrganizeRepository _systemOrganizeRepository;
  69. private readonly IRepository<TranspondCityRawData> _transpondCityRawDataRepository;
  70. private readonly IRepository<OrderComplement> _orderComplementRepository;
  71. private readonly IOrderApplication _orderApplication;
  72. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  73. private readonly IRepository<OrderWarning> _orderWarningRepository;
  74. private readonly IRepository<OrderRevoke> _orderRevokeRepository;
  75. private readonly IRepository<ContingencyManagementOrders> _contingencyManagementOrdersRepository;
  76. private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
  77. private readonly ICallApplication _callApplication;
  78. private readonly IRepository<OrderPublish> _orderPublishRepository;
  79. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  80. private readonly ICalcExpireTime _expireTime;
  81. private readonly ISessionContextManager _sessionContextManager;
  82. private readonly ILogger<DataSharingSubscriber> _logger;
  83. public DataSharingSubscriber(
  84. IRepository<OrderVisit> orderVisitRepository,
  85. IMapper mapper,
  86. IOrderRepository orderRepository,
  87. IOrderDomainService orderDomainService,
  88. ICapPublisher capPublisher,
  89. IRepository<OrderDelay> orderDelayRepository,
  90. IRepository<OrderSendBack> orderSendBackRepository,
  91. IWorkflowApplication workflowApplication,
  92. IWorkflowDomainService workflowDomainService,
  93. IRepository<WorkflowTrace> workflowTraceRepository,
  94. IRepository<OrderUrge> orderUrgeRepository,
  95. IRepository<OrderSupervise> orderSuperviseRepository,
  96. IRepository<OrderVisitDetail> orderVisitedDetailRepository,
  97. IOrderScreenRepository orderScreenRepository,
  98. IRepository<OrderExtension> orderExtensionRepository,
  99. IFileRepository fileRepository,
  100. IRepository<SystemDicData> systemDicDataRepository,
  101. ISystemOrganizeRepository systemOrganizeRepository,
  102. IRepository<TranspondCityRawData> transpondCityRawDataRepository,
  103. IRepository<OrderComplement> orderComplementRepository,
  104. IOrderApplication orderApplication,
  105. ISystemSettingCacheManager systemSettingCacheManager,
  106. IRepository<OrderWarning> orderWarningRepository,
  107. IRepository<OrderRevoke> orderRevokeRepository,
  108. IRepository<ContingencyManagementOrders> contingencyManagementOrdersRepository,
  109. IOptionsSnapshot<AppConfiguration> appOptions,
  110. ICallApplication callApplication,
  111. IRepository<OrderPublish> orderPublishRepository,
  112. ISystemDicDataCacheManager sysDicDataCacheManager,
  113. ICalcExpireTime expireTime,
  114. ISessionContextManager sessionContextManager,
  115. ILogger<DataSharingSubscriber> logger)
  116. {
  117. _orderSendBackRepository = orderSendBackRepository;
  118. _workflowApplication = workflowApplication;
  119. _workflowDomainService = workflowDomainService;
  120. _workflowTraceRepository = workflowTraceRepository;
  121. _orderUrgeRepository = orderUrgeRepository;
  122. _orderSuperviseRepository = orderSuperviseRepository;
  123. _orderScreenRepository = orderScreenRepository;
  124. _orderExtensionRepository = orderExtensionRepository;
  125. _orderVisitedDetailRepository = orderVisitedDetailRepository;
  126. _orderRepository = orderRepository;
  127. _orderDomainService = orderDomainService;
  128. _fileRepository = fileRepository;
  129. _orderVisitRepository = orderVisitRepository;
  130. _mapper = mapper;
  131. _capPublisher = capPublisher;
  132. _orderDelayRepository = orderDelayRepository;
  133. _systemDicDataRepository = systemDicDataRepository;
  134. _systemOrganizeRepository = systemOrganizeRepository;
  135. _transpondCityRawDataRepository = transpondCityRawDataRepository;
  136. _orderComplementRepository = orderComplementRepository;
  137. _orderApplication = orderApplication;
  138. _systemSettingCacheManager = systemSettingCacheManager;
  139. _orderWarningRepository = orderWarningRepository;
  140. _orderRevokeRepository = orderRevokeRepository;
  141. _contingencyManagementOrdersRepository = contingencyManagementOrdersRepository;
  142. _appOptions = appOptions;
  143. _callApplication = callApplication;
  144. _orderPublishRepository = orderPublishRepository;
  145. _sysDicDataCacheManager = sysDicDataCacheManager;
  146. _expireTime = expireTime;
  147. _sessionContextManager = sessionContextManager;
  148. _logger = logger;
  149. }
  150. /// <summary>
  151. /// 接收工单退回结果
  152. /// </summary>
  153. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderReturnFeedback)]
  154. public async Task RecOrderReturnAsync(OrderSendBackResultDto dto, CancellationToken cancellationToken)
  155. {
  156. var sendBack = await _orderSendBackRepository.GetAsync(p => p.Id == dto.Id && p.State == 0, cancellationToken);
  157. if (sendBack != null)
  158. {
  159. sendBack.Result = dto.Result;
  160. sendBack.Reason = dto.Reason;
  161. sendBack.AuditName = dto.AuditName;
  162. sendBack.AuditOrgName = dto.AuditOrgName;
  163. sendBack.AuditTime = dto.AuditTime;
  164. if (dto.Result == 0)
  165. sendBack.State = 2;
  166. else if (dto.Result == 1)
  167. sendBack.State = 1;
  168. if (dto.Files != null && dto.Files.Any())
  169. {
  170. sendBack.FileJson = await _fileRepository.AddFileAsync(dto.Files, sendBack.Id, string.Empty, cancellationToken);
  171. }
  172. var order = await _orderRepository.GetAsync(sendBack.OrderId, cancellationToken);
  173. if (order is null)
  174. throw new UserFriendlyException("无效工单编号");
  175. if (!string.IsNullOrEmpty(order.WorkflowId))
  176. {
  177. order.Status = EOrderStatus.Handling;
  178. }
  179. else
  180. {
  181. order.Status = EOrderStatus.WaitForAccept;
  182. }
  183. if (dto.Result is 1)
  184. order.ProvinceSendBack = true;
  185. else
  186. order.ProvinceSendBack = false;
  187. await _orderRepository.UpdateAsync(order, cancellationToken);
  188. //if (dto.Result is 1)
  189. //{
  190. //var now = DateTime.Now;
  191. //var handleDuration = order.StartTime.HasValue
  192. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
  193. // now, order.ProcessType is EProcessType.Zhiban)
  194. // : 0;
  195. //var fileDuration = order.CenterToOrgTime.HasValue
  196. // ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  197. // now, order.ProcessType is EProcessType.Zhiban)
  198. // : 0;
  199. //var allDuration = order.StartTime.HasValue
  200. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
  201. // order.ProcessType is EProcessType.Zhiban)
  202. // : 0;
  203. //order.File(now, handleDuration, fileDuration, allDuration);
  204. //await _orderRepository.UpdateAsync(order, cancellationToken);
  205. //var current = SessionContextCreator.CreateSessionContext(dto.Source, _cityBaseConfiguration.Value);
  206. //if (string.IsNullOrEmpty(order.WorkflowId))
  207. //{
  208. // var startDto = new StartWorkflowDto
  209. // {
  210. // DefinitionModuleCode = WorkflowModuleConsts.OrderHandle,
  211. // Title = order.Title,
  212. // Opinion = dto.Reason ?? "省工单同意退回",
  213. // };
  214. // await _workflowApplication.StartToEndAsync(startDto, current, order.Id, order.ExpiredTime,
  215. // cancellationToken);
  216. //}
  217. //else
  218. //{
  219. // //await _workflowApplication.HandleToEndAsync(current, order.WorkflowId, "省工单同意退回", null,
  220. // // EReviewResult.Approval, cancellationToken);
  221. // await _workflowApplication.JumpToEndAsync(current, order.WorkflowId, dto.Reason ?? "省工单同意退回",
  222. // null, order.ExpiredTime, cancellationToken: cancellationToken);
  223. //}
  224. //TODO 工单终止
  225. //}
  226. //else
  227. //{
  228. //}
  229. await _orderSendBackRepository.UpdateAsync(sendBack, cancellationToken);
  230. }
  231. }
  232. /// <summary>
  233. /// 服务工单撤单(省工单下派后撤单)
  234. /// </summary>
  235. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderRevoke)]
  236. public async Task RecCancelOrderAsync(CancelOrderDto dto, CancellationToken cancellationToken)
  237. {
  238. // var order = await _orderRepository.GetAsync(p => p.ReceiveProvinceNo == dto.ProvinceNo, cancellationToken);
  239. var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(p => p.ReceiveProvinceNo == dto.ProvinceNo);
  240. if (order is null)
  241. throw new UserFriendlyException("未查询到工单");
  242. //SessionContextCreator.CreateSessionContext(_sessionContextProvider, dto.Source);
  243. // await _sessionContextCreator.CreateSessionContextAsync(dto.Source, cancellationToken);
  244. _sessionContextManager.ChangeSessionContext(dto.Source);
  245. OrderRevoke orderRevoke = new()
  246. {
  247. OrderId = order.Id,
  248. RevokeTime = DateTime.Parse(dto.RevokeTime),
  249. RevokeType = dto.RevokeType,
  250. RevokeName = dto.RevokeName,
  251. RevokeReasion = dto.Opinion,
  252. CliengGuid = dto.CliengGuid,
  253. IsProRevoke = true,
  254. RevokeTypeName = dto.RevokeType switch
  255. {
  256. "1" => "诉求人已私下解决",
  257. "2" => "诉求内容有误",
  258. "3" => "诉求人信息有误",
  259. "other" => "其它",
  260. _ => "其它",
  261. }
  262. };
  263. await _orderRevokeRepository.AddAsync(orderRevoke, cancellationToken);
  264. //var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
  265. //CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
  266. //计算order 期满时间
  267. ExpiredTimeWithConfig expiredTimeConfig;
  268. if (_appOptions.Value.IsZiGong)
  269. {
  270. //expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, order.StartTime.Value, EFlowDirection.CenterToCenter, order.Adapt<OrderTimeClacInfo>());
  271. expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, EFlowDirection.CenterToCenter,
  272. order.Adapt<OrderTimeClacInfo>());
  273. }
  274. else
  275. {
  276. //期满时间
  277. //expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.AcceptTypeCode);
  278. //expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, order.CenterToOrgTime.Value, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
  279. expiredTimeConfig =
  280. await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
  281. }
  282. _mapper.Map(expiredTimeConfig, order);
  283. await _orderRepository.UpdateAsync(order, cancellationToken);
  284. //宜宾需求:特提至中心(优先派单组无派单组节点就特提至坐席),由派单员归档
  285. if (string.IsNullOrEmpty(order?.WorkflowId))
  286. {
  287. var startDto = new StartWorkflowDto
  288. {
  289. DefinitionModuleCode = WorkflowModuleConsts.OrderHandle,
  290. Title = order.Title,
  291. Opinion = dto.Opinion,
  292. };
  293. await _workflowApplication.StartWorkflowToStartStepAsync(startDto, order.Id, order.ExpiredTime, cancellationToken);
  294. }
  295. else
  296. {
  297. // FlowStepHandler? handler = null;
  298. // var nextHandler = new List<FlowStepHandler>();
  299. // if (_appOptions.Value.IsZiGong)
  300. // {
  301. // // 平均派单
  302. // var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
  303. // if (averageSendOrder)
  304. // {
  305. // handler = await _orderDomainService.AverageOrder(cancellationToken);
  306. // nextHandler = new List<FlowStepHandler> { handler };
  307. // }
  308. // }
  309. //
  310. // StepAssignInfo? stepAssignInfo = null;
  311. // if (handler is not null)
  312. // {
  313. // stepAssignInfo = _mapper.Map<StepAssignInfo>(handler);
  314. // stepAssignInfo.FlowAssignType = EFlowAssignType.User;
  315. // }
  316. //
  317. // var reverseFlowStepAssignInfo = stepAssignInfo is null
  318. // ? new ReverseFlowStepAssignInfo(EReverseFlowStepCreationPolicy.OriginStep)
  319. // : new ReverseFlowStepAssignInfo(EReverseFlowStepCreationPolicy.OriginStepUser, stepAssignInfo);
  320. //var (isPaiDan, workflow) = await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId,
  321. // dto.Opinion, order.Status >= EOrderStatus.Filed, order.ExpiredTime, nextHandler, EHandleMode.Recall, cancellationToken);
  322. var (isPaiDan, workflow) = await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, dto.Opinion,
  323. order.Status >= EOrderStatus.Filed, order.ExpiredTime, EHandleMode.Recall, cancellationToken: cancellationToken);
  324. order.FiledTime = null;
  325. order.Status = isPaiDan ? EOrderStatus.Special : EOrderStatus.WaitForAccept;
  326. order.CurrentStepName = workflow.CurrentStepName;
  327. order.CurrentStepCode = workflow.CurrentStepCode;
  328. order.CurrentStepId = workflow.CurrentStepId;
  329. order.CurrentStepCreateTime = workflow.CurrentStepCreateTime;
  330. order.CurrentHandleTime = workflow.CurrentHandleTime;
  331. order.CurrentHandlerId = workflow.CurrentHandlerId;
  332. order.CurrentHandlerName = workflow.CurrentHandlerName;
  333. order.CurrentHandleOrgName = workflow.CurrentHandleOrgName;
  334. order.CurrentHandleOrgId = workflow.CurrentHandleOrgId;
  335. order.CurrentHandleOrgLevel = workflow.CurrentHandleOrgLevel;
  336. order.CurrentHandleOrgAreaCode = workflow.CurrentHandleOrgAreaCode;
  337. order.CurrentHandleOrgAreaName = workflow.CurrentHandleOrgAreaName;
  338. await _orderRepository.UpdateAsync(order, cancellationToken);
  339. }
  340. //删除甄别、延期、二次办理等数据
  341. await _orderApplication.SpecialNewVerify(order, cancellationToken);
  342. }
  343. /// <summary>
  344. /// 服务工单催单
  345. /// </summary>
  346. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderRemind)]
  347. public async Task RecOrderUrgeAsync(ProvinceOrderUrgeDto dto, CancellationToken cancellationToken)
  348. {
  349. var exists = await _orderUrgeRepository.Queryable()
  350. .AnyAsync(d => d.DsBisId == dto.DsBisId, cancellationToken);
  351. if (exists)
  352. throw new UserFriendlyException($"收到重复催办编号: {dto.DsBisId}");
  353. var centerOrgName = _systemSettingCacheManager.GetSetting(SettingConstants.CenterOrgName)?.SettingValue[0];
  354. var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.CaseSerial).FirstAsync(cancellationToken);
  355. var model = new OrderUrge();
  356. model.InitId();
  357. model.State = 0;
  358. model.CreatorOrgName = "省12345";
  359. model.CrUser = dto.RemindName;
  360. model.ApplyContent = dto.RemindReasion;
  361. model.OrderId = order.Id;
  362. model.OrgId = "001";
  363. model.OrgName = centerOrgName;
  364. model.RemindTime = dto.RemindTime;
  365. model.DsBisId = dto.DsBisId;
  366. //if (!string.IsNullOrEmpty(order.WorkflowId))
  367. //{
  368. // var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
  369. // if (org != null)
  370. // {
  371. // model.OrgId = org.Key;
  372. // model.OrgName = org.Value;
  373. // }
  374. //}
  375. if (!string.IsNullOrEmpty(order.CurrentHandleOrgId) && !string.IsNullOrEmpty(order.CurrentHandleOrgName))
  376. {
  377. model.OrgId = order.CurrentHandleOrgId;
  378. model.OrgName = order.CurrentHandleOrgName;
  379. }
  380. if (dto.Files.Any())
  381. model.FileJson =
  382. await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
  383. await _orderUrgeRepository.AddAsync(model, cancellationToken);
  384. }
  385. /// <summary>
  386. /// 服务工单预警---收到预警给当前办理部门发催办,如果没有办理部门直接催办中心
  387. /// </summary>
  388. /// <param name="dto"></param>
  389. /// <param name="cancellationToken"></param>
  390. /// <returns></returns>
  391. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderWarning)]
  392. public async Task RecWarnInfoAsync(WarningDto dto, CancellationToken cancellationToken)
  393. {
  394. var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.CaseSerial).FirstAsync(cancellationToken);
  395. if (order != null)
  396. {
  397. var centerOrgName = _systemSettingCacheManager.GetSetting(SettingConstants.CenterOrgName)?.SettingValue[0];
  398. var model = new OrderUrge();
  399. model.InitId();
  400. model.State = 0;
  401. model.CreatorOrgName = "省12345";
  402. model.CrUser = "省12345";
  403. model.ApplyContent = dto.WarnRulename + " " + dto.WarnDescribe;
  404. model.OrderId = order.Id;
  405. model.ReplyLimitTime = dto.WarnTimebf;
  406. model.OrgId = "001";
  407. model.OrgName = centerOrgName;
  408. //if (!string.IsNullOrEmpty(order.WorkflowId))
  409. //{
  410. // var org = await _workflowDomainService.FindActualHandlerAsync(order.WorkflowId, cancellationToken);
  411. // if (org != null)
  412. // {
  413. // model.OrgId = org.Key;
  414. // model.OrgName = org.Value;
  415. // }
  416. //}
  417. //model.OrgId = order.CurrentHandleOrgId;
  418. //model.OrgName = order.CurrentHandleOrgName;
  419. if (!string.IsNullOrEmpty(order.CurrentHandleOrgId) && !string.IsNullOrEmpty(order.CurrentHandleOrgName))
  420. {
  421. model.OrgId = order.CurrentHandleOrgId;
  422. model.OrgName = order.CurrentHandleOrgName;
  423. }
  424. await _orderUrgeRepository.AddAsync(model, cancellationToken);
  425. //写入预警
  426. var warning = new OrderWarning()
  427. {
  428. OrderId = order.Id,
  429. WarnRulename = dto.WarnRulename,
  430. WarnDescribe = dto.WarnDescribe,
  431. WarnTimebf = dto.WarnTimebf,
  432. WarnDegree = dto.WarnDegree,
  433. WarnType = dto.WarnType,
  434. WarnDate = dto.WarnDate,
  435. IsProWarn = true
  436. };
  437. await _orderWarningRepository.AddAsync(warning, cancellationToken);
  438. }
  439. }
  440. /// <summary>
  441. /// 督办工单派发接口
  442. /// </summary>
  443. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderSupervise)]
  444. public async Task RecOrderSuperviseAsync(ProvinceSendOrderSuperviseDto dto, CancellationToken cancellationToken)
  445. {
  446. var exists = await _orderSuperviseRepository.Queryable()
  447. .AnyAsync(d => d.SuperviseSerial == dto.ProvinceOrderSuperviseDto.SuperviseSerial, cancellationToken);
  448. if (exists)
  449. throw new UserFriendlyException($"收到重复督办编号: {dto.ProvinceOrderSuperviseDto.SuperviseSerial}");
  450. var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.ProvinceOrderSuperviseDto!.CaseSerial)
  451. .FirstAsync(cancellationToken);
  452. var org = await _systemOrganizeRepository.GetAsync(x => x.Id == order.ActualHandleOrgCode, cancellationToken);
  453. var model = new OrderSupervise();
  454. model.InitId();
  455. model.OrderId = order.Id;
  456. model.ReplyLimitTime = dto.ProvinceOrderSuperviseDto.SuperviseReturnDate;
  457. model.OrgName = org.Name;
  458. model.OrgId = org.Id;
  459. model.LaunchOrgName = dto.ProvinceOrderSuperviseDto.SuperviseSendDept;
  460. model.CrUser = dto.ProvinceOrderSuperviseDto.SupervisePerson;
  461. model.State = 0;
  462. model.Province = true;
  463. model.ApplyContent = dto.ProvinceOrderSuperviseDto.SuperviseContent;
  464. model.SuperviseSerial = dto.ProvinceOrderSuperviseDto.SuperviseSerial;
  465. model.SuperviseTitle = dto.ProvinceOrderSuperviseDto.SuperviseTitle;
  466. model.SuperviseTime = dto.ProvinceOrderSuperviseDto.SuperviseTime;
  467. model.SuperviseType = dto.ProvinceOrderSuperviseDto.SuperviseType;
  468. if (dto.Files.Any())
  469. model.FileJson =
  470. await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
  471. await _orderSuperviseRepository.AddAsync(model, cancellationToken);
  472. }
  473. /// <summary>
  474. /// 服务工单甄别结果
  475. /// </summary>
  476. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderScreen)]
  477. public async Task RecOrderScreenResultAsync(ProvinceSendScreenResultDto dto, CancellationToken cancellationToken)
  478. {
  479. var orderScreen = await _orderScreenRepository.Queryable()
  480. .FirstAsync(x => x.Order.ReceiveProvinceNo == dto.ProvinceScreenResult.CaseSerial &&
  481. x.Status == EScreenStatus.Approval, cancellationToken);
  482. if (orderScreen is null)
  483. throw new UserFriendlyException($"收到ds推送:{EventNames.SharingOrderScreen}, 未查询到甄别数据, 省交办编号:{dto.ProvinceScreenResult.CaseSerial}");
  484. //SessionContextCreator.CreateSessionContext(_sessionContextProvider, dto.Source);
  485. // await _sessionContextCreator.CreateSessionContextAsync(dto.Source, cancellationToken);
  486. _sessionContextManager.ChangeSessionContext(dto.Source);
  487. if (int.Parse(dto.ProvinceScreenResult.AuditResult) == 0)
  488. {
  489. PreviousWorkflowDto previous = new PreviousWorkflowDto();
  490. previous.Opinion = dto.ProvinceScreenResult.AuditOpinion;
  491. previous.WorkflowId = orderScreen.WorkflowId;
  492. await _workflowDomainService.PreviousAsync(previous, cancellationToken: cancellationToken);
  493. }
  494. if (int.Parse(dto.ProvinceScreenResult.AuditResult) > 0)
  495. {
  496. await _workflowApplication.HandleToEndAsync(orderScreen.WorkflowId, dto.ProvinceScreenResult.AuditOpinion, null,
  497. reviewResult: int.Parse(dto.ProvinceScreenResult.AuditResult) == 1
  498. ? Share.Enums.FlowEngine.EReviewResult.Approval
  499. : Share.Enums.FlowEngine.EReviewResult.Failed, cancellationToken: cancellationToken);
  500. orderScreen.Status = int.Parse(dto.ProvinceScreenResult.AuditResult) == 1
  501. ? Share.Enums.Order.EScreenStatus.End
  502. : Share.Enums.Order.EScreenStatus.Refuse;
  503. //if (orderScreen.Status == Share.Enums.Order.EScreenStatus.End)
  504. //{
  505. // var visitDetail = await _orderVisitedDetailRepository.GetAsync(orderScreen.VisitDetailId, cancellationToken);
  506. // if (visitDetail != null)
  507. // {
  508. // var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
  509. // visitDetail.OrgProcessingResults = screenSatisfy;
  510. // visitDetail.OrgHandledAttitude = screenSatisfy;
  511. // await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
  512. // }
  513. //}
  514. orderScreen.ReplyContent = dto.ProvinceScreenResult.AuditOpinion;
  515. orderScreen.AuditName = dto.ProvinceScreenResult.AuditPerson;
  516. orderScreen.AuditOrgName = dto.ProvinceScreenResult.AuditOuname;
  517. orderScreen.AuditTime = dto.ProvinceScreenResult.AuditTime;
  518. if (dto.Files.Any())
  519. orderScreen.FileJson =
  520. await _fileRepository.AddFileAsync(dto.Files, orderScreen.Id, "", cancellationToken);
  521. await _orderScreenRepository.UpdateAsync(orderScreen, cancellationToken);
  522. //多部门甄别回访 省上结果处理
  523. if (orderScreen.Status == Share.Enums.Order.EScreenStatus.End)
  524. {
  525. var visitDetails = await _orderVisitedDetailRepository.Queryable().Where(x => x.OrderVisit.OrderId == orderScreen.OrderId &&
  526. x.VisitTarget == EVisitTarget.Org && (
  527. SqlFunc.JsonField(x.OrgProcessingResults,
  528. "Key") ==
  529. "1" ||
  530. SqlFunc.JsonField(x.OrgProcessingResults,
  531. "Key") ==
  532. "2" ||
  533. SqlFunc.JsonField(x.OrgHandledAttitude,
  534. "Key") ==
  535. "1" ||
  536. SqlFunc.JsonField(x.OrgHandledAttitude,
  537. "Key") ==
  538. "2"
  539. ) && x.Id != orderScreen.VisitDetailId)
  540. .ToListAsync();
  541. foreach (var visitDetail in visitDetails)
  542. {
  543. if (visitDetail != null)
  544. {
  545. var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
  546. visitDetail.OrgProcessingResults = screenSatisfy;
  547. visitDetail.OrgHandledAttitude = screenSatisfy;
  548. await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
  549. }
  550. }
  551. }
  552. }
  553. }
  554. /// <summary>
  555. /// 更新工单受理附件
  556. /// </summary>
  557. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderUpdataFiles)]
  558. public async Task RecOrderUpdateFilesAsync(OrderUpdataFiles dto, CancellationToken cancellationToken)
  559. {
  560. if (dto == null && dto.Files.Any())
  561. {
  562. var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
  563. order.FileJson = await _fileRepository.AddFileAsync(dto.Files, dto.OrderId, "", cancellationToken);
  564. }
  565. }
  566. /// <summary>
  567. /// 省下行回访
  568. /// </summary>
  569. /// <param name="dto"></param>
  570. /// <param name="cancellationToken"></param>
  571. /// <returns></returns>
  572. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderEvlResult)]
  573. public async Task OrderVisitProvince(ProvinceOrderVisitDto dto, CancellationToken cancellationToken)
  574. {
  575. var orderVisit = await _orderVisitRepository.Queryable()
  576. .Includes(x => x.Order)
  577. .Includes(x => x.OrderVisitDetails)
  578. .Where(x => x.Order.ReceiveProvinceNo == dto.ProvinceNo &&
  579. x.VisitState == Share.Enums.Order.EVisitState.WaitForVisit).FirstAsync(cancellationToken);
  580. if (orderVisit != null)
  581. {
  582. //处理评价结果
  583. var processingResult = dto.OrgProcessingResults;
  584. Kv orgProcessingResults = null;
  585. if (!string.IsNullOrEmpty(processingResult))
  586. {
  587. var dicData = await _systemDicDataRepository.GetAsync(x => x.DicTypeCode == SysDicTypeConsts.VisitSatisfaction &&
  588. x.DicDataValue == processingResult, cancellationToken);
  589. if (dicData != null)
  590. {
  591. orgProcessingResults = new Kv();
  592. orgProcessingResults.Key = dicData.DicDataValue;
  593. orgProcessingResults.Value = dicData.DicDataName;
  594. }
  595. if (orgProcessingResults != null)
  596. {
  597. //主表
  598. orderVisit.VisitState = Share.Enums.Order.EVisitState.Visited;
  599. orderVisit.VisitTime = dto.VisitTime;
  600. orderVisit.VisitType = dto.VisitType;
  601. orderVisit.IsCanHandle = orgProcessingResults.Key == "2";
  602. orderVisit.IsCanAiVisit = false;
  603. orderVisit.NowEvaluate = orgProcessingResults;
  604. if (_appOptions.Value.IsZiGong)
  605. {
  606. orderVisit.EmployeeId = _systemSettingCacheManager.DefaultVisitEmployeeId;
  607. }
  608. await _orderVisitRepository.UpdateAsync(orderVisit, cancellationToken);
  609. //子表
  610. for (int i = 0; i < orderVisit.OrderVisitDetails.Count; i++)
  611. {
  612. if (orderVisit.OrderVisitDetails[i].VisitTarget == EVisitTarget.Seat)
  613. {
  614. orderVisit.OrderVisitDetails[i].VoiceEvaluate = (EVoiceEvaluate)int.Parse(orgProcessingResults.Key);
  615. orderVisit.OrderVisitDetails[i].SeatEvaluate = (ESeatEvaluate)int.Parse(orgProcessingResults.Key);
  616. }
  617. else
  618. {
  619. orderVisit.OrderVisitDetails[i].OrgProcessingResults = orgProcessingResults;
  620. }
  621. orderVisit.OrderVisitDetails[i].VisitContent = dto.VisitContent;
  622. orderVisit.OrderVisitDetails[i].ScreenByEndTime = await _orderDomainService.GetScreenByEndTime();
  623. }
  624. await _orderVisitedDetailRepository.UpdateRangeAsync(orderVisit.OrderVisitDetails, cancellationToken);
  625. //工单
  626. orderVisit.Order.Visited(orgProcessingResults.Key, orgProcessingResults.Value);
  627. await _orderRepository.UpdateAsync(orderVisit.Order);
  628. ////处理网站通知差评数据
  629. //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"))
  630. //{
  631. // //包含不满意数据,重新生成新的回访
  632. // var newOrderVisit = _mapper.Map<OrderVisit>(orderVisit);
  633. // newOrderVisit.InitId();
  634. // newOrderVisit.VisitState = EVisitState.NoSatisfiedWaitForVisit;
  635. // newOrderVisit.VisitTime = null;
  636. // newOrderVisit.IsCanHandle = false;
  637. // newOrderVisit.IsCanAiVisit = false;
  638. // newOrderVisit.AiVisitCount = 0;
  639. // await _orderVisitRepository.AddAsync(newOrderVisit, cancellationToken);
  640. // var list = _mapper.Map<List<OrderVisitDetail>>(orderVisit.OrderVisitDetails);
  641. // list.ForEach(x =>
  642. // {
  643. // x.VisitId = newOrderVisit.Id;
  644. // x.VoiceEvaluate = null;
  645. // x.VoiceEvaluate = null;
  646. // x.OrgHandledAttitude = null;
  647. // x.OrgNoSatisfiedReason = null;
  648. // x.OrgProcessingResults = null;
  649. // x.VisitContent = "";
  650. // });
  651. // await _orderVisitedDetailRepository.AddRangeAsync(list, cancellationToken);
  652. //}
  653. }
  654. }
  655. }
  656. else
  657. {
  658. //处理省下行回访
  659. var order = await _orderRepository.Queryable().Where(x => x.ReceiveProvinceNo == dto.ProvinceNo).FirstAsync();
  660. if (order != null && order.Status <= EOrderStatus.Filed)
  661. {
  662. //判断是否有发布数据
  663. var orderPublish = await _orderPublishRepository.Queryable()
  664. .Includes(x => x.Order).Where(x => x.Order.ReceiveProvinceNo == dto.ProvinceNo).FirstAsync(cancellationToken);
  665. if (orderPublish == null)
  666. {
  667. orderPublish = new OrderPublish();
  668. orderPublish.OrderId = order.Id;
  669. orderPublish.No = order.No;
  670. orderPublish.PublishState = false;
  671. orderPublish.ArrangeTitle = order.Title;
  672. orderPublish.ArrangeContent = order.Content;
  673. orderPublish.ArrangeOpinion = order.FileOpinion;
  674. orderPublish.ProPublishState = false;
  675. orderPublish.FeedBackPhone = order.Contact;
  676. orderPublish.CreatorName = order.CenterToOrgHandlerId;
  677. await _orderPublishRepository.AddAsync(orderPublish);
  678. order.Publish(orderPublish.PublishState);
  679. }
  680. orderVisit = new OrderVisit();
  681. orderVisit.No = order.No;
  682. orderVisit.OrderId = order.Id;
  683. orderVisit.PublishTime = DateTime.Now;
  684. orderVisit.IsCanHandle = true;
  685. orderVisit.EmployeeId = order.CenterToOrgHandlerId;
  686. orderVisit.VisitState = EVisitState.None;
  687. orderVisit.VisitTime = dto.VisitTime;
  688. orderVisit.VisitType = dto.VisitType;
  689. orderVisit.IsCanAiVisit = false;
  690. var VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction)
  691. .Where(x => x.DicDataValue == dto.OrgProcessingResults).Select(m => new Kv { Key = m.DicDataValue, Value = m.DicDataName })
  692. .FirstOrDefault();
  693. var satisfy = VisitSatisfaction;
  694. orderVisit.NowEvaluate = satisfy;
  695. string visitId = await _orderVisitRepository.AddAsync(orderVisit);
  696. //新增回访信息
  697. var visitedDetail = new List<OrderVisitDetail>();
  698. //新增坐席回访
  699. var seatDetail = new OrderVisitDetail();
  700. seatDetail.VisitId = visitId;
  701. seatDetail.VisitTarget = EVisitTarget.Seat;
  702. seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
  703. seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
  704. visitedDetail.Add(seatDetail);
  705. //新增部门回访
  706. var orgDetail = new OrderVisitDetail();
  707. orgDetail.VisitId = visitId;
  708. orgDetail.VisitOrgCode = order.ActualHandleOrgCode;
  709. orgDetail.VisitOrgName = order.ActualHandleOrgName;
  710. orgDetail.VisitTarget = EVisitTarget.Org;
  711. orgDetail.ScreenByEndTime = await _orderDomainService.GetScreenByEndTime();
  712. orgDetail.OrgProcessingResults = satisfy;
  713. visitedDetail.Add(orgDetail);
  714. //TODO 自贡办件态度
  715. await _orderVisitedDetailRepository.AddRangeAsync(visitedDetail, cancellationToken);
  716. //order.Visited(satisfy.Key, satisfy.Value);
  717. //order.Status = EOrderStatus.Visited;
  718. //await _orderRepository.UpdateAsync(order, cancellationToken);
  719. }
  720. }
  721. }
  722. /// <summary>
  723. /// 工单回访
  724. /// </summary>
  725. /// <param name="dto"></param>
  726. /// <param name="cancellationToken"></param>
  727. /// <returns></returns>
  728. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderVisitAllOther)]
  729. public async Task OrderVisitWeb(OrderVisitWebDto dto, CancellationToken cancellationToken)
  730. {
  731. await _orderApplication.OrderVisitWeb(dto, cancellationToken);
  732. }
  733. /// <summary>
  734. /// 订阅省工单延期消息
  735. /// </summary>
  736. /// <param name="dto"></param>
  737. /// <param name="cancellationToken"></param>
  738. /// <returns></returns>
  739. [CapSubscribe(Hotline.Share.Mq.EventNames.SharingOrderDelayResult)]
  740. public async Task OrderDelayWeb(ProvinceSendDelayResultDto dto, CancellationToken cancellationToken)
  741. {
  742. var order = await _orderRepository.GetAsync(x => x.ReceiveProvinceNo == dto.No, cancellationToken);
  743. if (order != null)
  744. {
  745. //SessionContextCreator.CreateSessionContext(_sessionContextProvider, dto.Source);
  746. // await _sessionContextCreator.CreateSessionContextAsync(dto.Source, cancellationToken);
  747. _sessionContextManager.ChangeSessionContext(dto.Source);
  748. //查询延期
  749. var orderDelay = await _orderDelayRepository
  750. .GetAsync(x => x.OrderId == order.Id && x.DelayState == EDelayState.Examining, cancellationToken);
  751. if (orderDelay != null)
  752. {
  753. orderDelay.AuditName = dto.AuditName;
  754. orderDelay.AuditOrgName = dto.AuditOrgName;
  755. orderDelay.AuditTime = dto.AuditTime;
  756. orderDelay.AuditOpinion = dto.Opinion;
  757. if (dto.Files != null && dto.Files.Any())
  758. orderDelay.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderDelay.Id, orderDelay.WorkflowId, cancellationToken);
  759. await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
  760. await _workflowApplication.HandleToEndAsync(orderDelay.WorkflowId, dto.Opinion, dto.Files,
  761. reviewResult: dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed, cancellationToken: cancellationToken);
  762. }
  763. }
  764. }
  765. /// <summary>
  766. /// 接收工单处理结果
  767. /// </summary>
  768. [CapSubscribe(EventNames.SharingOrderReultSend)]
  769. public async Task RecOrderResultAsync(OrderResultDto dto, CancellationToken cancellationToken)
  770. {
  771. var order = await _orderRepository.Queryable().Includes(x => x.OrderExtension).FirstAsync(x => x.Id == dto.OrderId, cancellationToken);
  772. if (order is null)
  773. throw new UserFriendlyException($"无效工单编号, orderId: {dto.OrderId}");
  774. if (string.IsNullOrEmpty(order.WorkflowId))
  775. throw new UserFriendlyException($"该工单未开启流程,orderId: {dto.OrderId}");
  776. //if (dto.Files != null && dto.Files.Any())
  777. //{
  778. // order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, order.WorkflowId,
  779. // cancellationToken);
  780. // await _orderRepository.FileAsync(order, cancellationToken);
  781. //}
  782. //var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
  783. //CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
  784. //SessionContextCreator.CreateSessionContext(_sessionContextProvider, dto.Source);
  785. //await _sessionContextCreator.CreateSessionContextAsync(dto.Source, cancellationToken);
  786. _sessionContextManager.ChangeSessionContext(dto.Source);
  787. switch (dto.FinishType)
  788. {
  789. case "0":
  790. //退回
  791. //计算order 期满时间
  792. ExpiredTimeWithConfig expiredTimeConfig;
  793. if (_appOptions.Value.IsZiGong)
  794. {
  795. expiredTimeConfig =
  796. await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, EFlowDirection.CenterToCenter,
  797. order.Adapt<OrderTimeClacInfo>());
  798. }
  799. else
  800. {
  801. //期满时间
  802. //expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.AcceptTypeCode);
  803. expiredTimeConfig =
  804. await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, EFlowDirection.CenterToOrg,
  805. order.Adapt<OrderTimeClacInfo>());
  806. }
  807. _mapper.Map(expiredTimeConfig, order);
  808. //退回:撤回至发起人
  809. //await _workflowDomainService.RecallToStartStepAsync(order.WorkflowId, dto.Opinion, order.Status >= EOrderStatus.Filed,
  810. // order.ExpiredTime, cancellationToken); //todo think是否需要保存附件至省平台办理节点?
  811. //var (isPaiDan, workflow) = await _workflowDomainService.RecallToCenterFirstToSendAsync(
  812. // order.WorkflowId, dto.Opinion, order.Status >= EOrderStatus.Filed,
  813. // order.ExpiredTime, null, EHandleMode.Recall, cancellationToken);
  814. // var reverseFlowStepAssignInfo = new ReverseFlowStepAssignInfo(EReverseFlowStepCreationPolicy.OriginStep);
  815. var handleMode = order.OrderExtension is null ? EHandleMode.Recall : EHandleMode.ProvinceHandlePrevious;
  816. var (isPaiDan, workflow) = await _workflowDomainService.RecallToCenterFirstToSendAsync(order.WorkflowId, dto.Opinion,
  817. order.Status >= EOrderStatus.Filed, order.ExpiredTime, EHandleMode.ProvinceHandlePrevious,
  818. cancellationToken: cancellationToken);
  819. order.Status = isPaiDan ? EOrderStatus.Special : EOrderStatus.WaitForAccept;
  820. order.CurrentStepName = workflow.CurrentStepName;
  821. order.CurrentStepCode = workflow.CurrentStepCode;
  822. order.CurrentStepId = workflow.CurrentStepId;
  823. order.CurrentStepCreateTime = workflow.CurrentStepCreateTime;
  824. order.CurrentHandleTime = workflow.CurrentHandleTime;
  825. order.CurrentHandlerId = workflow.CurrentHandlerId;
  826. order.CurrentHandlerName = workflow.CurrentHandlerName;
  827. order.CurrentHandleOrgName = workflow.CurrentHandleOrgName;
  828. order.CurrentHandleOrgId = workflow.CurrentHandleOrgId;
  829. order.CurrentHandleOrgLevel = workflow.CurrentHandleOrgLevel;
  830. order.CurrentHandleOrgAreaCode = workflow.CurrentHandleOrgAreaCode;
  831. order.CurrentHandleOrgAreaName = workflow.CurrentHandleOrgAreaName;
  832. await _orderRepository.UpdateAsync(order, cancellationToken);
  833. break;
  834. case "1":
  835. //办结:归档
  836. //自贡需求:省12345平台向本地系统第一次推送办理意见时,工单即归档,承办意见取该办理意见;第二次推送办理意见时,工单承办意见需更新为第二次推送的办理意见
  837. if (order.Status >= EOrderStatus.Filed)
  838. {
  839. if (_appOptions.Value.IsZiGong)
  840. {
  841. order.ActualOpinion = dto.Opinion;
  842. }
  843. else
  844. {
  845. order.ActualOpinion += dto.Opinion;
  846. }
  847. order.FileOpinion = order.ActualOpinion;
  848. await _orderRepository.Updateable(order).UpdateColumns(d => d.ActualOpinion).UpdateColumns(d => d.FileOpinion)
  849. .ExecuteCommandAsync(cancellationToken);
  850. await _workflowDomainService.AppendFileOpinionAsync(order.WorkflowId, dto.Opinion, dto.Files, cancellationToken);
  851. }
  852. else
  853. {
  854. await _workflowApplication.HandleToEndAsync(order.WorkflowId, dto.Opinion, dto.Files, expiredTime: order.ExpiredTime,
  855. cancellationToken: cancellationToken);
  856. }
  857. break;
  858. }
  859. //var now = DateTime.Now;
  860. //var handleDuration = order.StartTime.HasValue
  861. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
  862. // now, order.ProcessType is EProcessType.Zhiban)
  863. // : 0;
  864. //var fileDuration = order.CenterToOrgTime.HasValue
  865. // ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
  866. // now, order.ProcessType is EProcessType.Zhiban)
  867. // : 0;
  868. //var allDuration = order.StartTime.HasValue
  869. // ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
  870. // order.ProcessType is EProcessType.Zhiban)
  871. // : 0;
  872. //order.File(now, handleDuration, fileDuration, allDuration);
  873. //await _orderRepository.UpdateAsync(order, cancellationToken);
  874. }
  875. /// <summary>
  876. /// 接收工单扩展信息
  877. /// </summary>
  878. [CapSubscribe(EventNames.SharingOrderExtends)]
  879. public async Task RecOrderExtensionAsync(OrderExtensionDto dto, CancellationToken cancellationToken)
  880. {
  881. var order = await _orderRepository.Queryable()
  882. .FirstAsync(d => d.ReceiveProvinceNo == dto.ProvinceNo, cancellationToken);
  883. var orderExtension = await _orderDomainService.GetOrderExtensionsAsync(dto.ProvinceNo, cancellationToken);
  884. if (orderExtension is null)
  885. {
  886. orderExtension = _mapper.Map<OrderExtension>(dto);
  887. if (order != null)
  888. orderExtension.Id = order.Id;
  889. await _orderExtensionRepository.AddAsync(orderExtension, cancellationToken);
  890. }
  891. else
  892. {
  893. _mapper.Map(dto, orderExtension);
  894. if (order != null)
  895. orderExtension.Id = order.Id;
  896. await _orderExtensionRepository.UpdateAsync(orderExtension, cancellationToken);
  897. }
  898. }
  899. /// <summary>
  900. /// 接收工单办理流程
  901. /// </summary>
  902. [CapSubscribe(EventNames.SharingOrderAddTraces)]
  903. public async Task RecOrderTracesAsync(AddOrderTracesDto dto, CancellationToken cancellationToken)
  904. {
  905. var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
  906. if (order is null)
  907. throw new UserFriendlyException($"未查询到对应工单,orderId: {dto.OrderId}");
  908. if (string.IsNullOrEmpty(order.WorkflowId))
  909. throw new UserFriendlyException($"该工单未开启流程,orderId: {dto.OrderId}");
  910. var steps = dto.Traces.Select(d =>
  911. {
  912. var step = _mapper.Map<WorkflowStep>(d);
  913. step.WorkflowId = order.WorkflowId;
  914. step.WorkflowTrace = _mapper.Map<WorkflowTrace>(step);
  915. return step;
  916. }).ToList();
  917. await _workflowDomainService.AddStepsAsync(order.WorkflowId, steps, cancellationToken);
  918. }
  919. /// <summary>
  920. /// 接收工单补充内容
  921. /// </summary>
  922. [CapSubscribe(EventNames.SharingOrderSupplements)]
  923. public async Task RecOrderSupplementsAsync(AddOrderComplementDto dto, CancellationToken cancellationToken)
  924. {
  925. var order = await _orderRepository.GetAsync(d => d.ReceiveProvinceNo == dto.CaseSerial, cancellationToken);
  926. if (order is null)
  927. throw new UserFriendlyException("无效省工单编号");
  928. dto.OrderId = order.Id;
  929. dto.IsProComplement = true;
  930. await _orderDomainService.AddOrderComplementAsync(dto, cancellationToken);
  931. }
  932. /// <summary>
  933. /// 接收省上上传附件
  934. /// </summary>
  935. /// <param name="dto"></param>
  936. /// <param name="cancellationToken"></param>
  937. /// <returns></returns>
  938. /// <exception cref="UserFriendlyException"></exception>
  939. /// <exception cref="ArgumentOutOfRangeException"></exception>
  940. [CapSubscribe(EventNames.SharingFileInfo)]
  941. public async Task RecFilesAsync(ReceiveFilesFromDsDto dto, CancellationToken cancellationToken)
  942. {
  943. if (dto.Files == null || !dto.Files.Any())
  944. throw new UserFriendlyException("未收到任何附件");
  945. switch (dto.DsBisType)
  946. {
  947. case EDsBisType.AcceptOrder:
  948. var order = await _orderRepository.GetAsync(d => d.ReceiveProvinceNo == dto.ProvinceNo, cancellationToken);
  949. if (order is null)
  950. throw new UserFriendlyException("无效省工单编号");
  951. order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", cancellationToken);
  952. await _orderRepository.UpdateAsync(order, cancellationToken);
  953. break;
  954. case EDsBisType.OrderPreviousResult:
  955. var sendBack = await _orderSendBackRepository.Queryable()
  956. .Where(d => d.Order.ReceiveProvinceNo == dto.ProvinceNo)
  957. .FirstAsync(cancellationToken);
  958. if (sendBack is null)
  959. throw new UserFriendlyException("无效省工单退回编号");
  960. sendBack.FileJson = await _fileRepository.AddFileAsync(dto.Files, sendBack.Id, string.Empty, cancellationToken);
  961. await _orderSendBackRepository.UpdateAsync(sendBack, cancellationToken);
  962. break;
  963. case EDsBisType.SendOrderSupervise:
  964. var orderSupervise = await _orderSuperviseRepository
  965. .GetAsync(d => d.SuperviseSerial == dto.SuperviseId, cancellationToken);
  966. if (orderSupervise is null)
  967. throw new UserFriendlyException("无效省工单督办编号");
  968. orderSupervise.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderSupervise.Id, "", cancellationToken);
  969. await _orderSuperviseRepository.AddAsync(orderSupervise, cancellationToken);
  970. break;
  971. case EDsBisType.SendOrderUrge:
  972. var orderUrge = await _orderUrgeRepository
  973. .GetAsync(d => d.DsBisId == dto.DsBisId, cancellationToken);
  974. if (orderUrge is null)
  975. throw new UserFriendlyException("无效省工单催办业务编号");
  976. orderUrge.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderUrge.Id, "", cancellationToken);
  977. await _orderUrgeRepository.UpdateAsync(orderUrge, cancellationToken);
  978. break;
  979. case EDsBisType.OrderScreenResult:
  980. var orderScreen = await _orderScreenRepository.Queryable()
  981. .Where(x => x.Order.ReceiveProvinceNo == dto.ProvinceNo && x.Status == Share.Enums.Order.EScreenStatus.Approval)
  982. .FirstAsync(cancellationToken);
  983. if (orderScreen is null)
  984. throw new UserFriendlyException("未查询到对应省工单甄别数据");
  985. orderScreen.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderScreen.Id, "", cancellationToken);
  986. await _orderScreenRepository.UpdateAsync(orderScreen, cancellationToken);
  987. break;
  988. case EDsBisType.OrderDelayResult:
  989. var orderDelay = await _orderDelayRepository.Queryable()
  990. .Where(d => d.Order.ReceiveProvinceNo == dto.ProvinceNo && d.DelayState == EDelayState.Examining)
  991. .FirstAsync(cancellationToken);
  992. if (orderDelay is null)
  993. throw new UserFriendlyException($"未查询到延期数据, ProvinceNo: {dto.ProvinceNo}");
  994. if (dto.Files != null && dto.Files.Any())
  995. orderDelay.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderDelay.Id, orderDelay.WorkflowId, cancellationToken);
  996. await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
  997. break;
  998. case EDsBisType.SendOrderComplement:
  999. var complement = await _orderComplementRepository
  1000. .GetAsync(d => d.DsBisId == dto.DsBisId, cancellationToken);
  1001. if (complement is null)
  1002. throw new UserFriendlyException(
  1003. $"未查询到补充信息, ProvinceNo: {dto.ProvinceNo}, DsBisIs: {dto.DsBisId}");
  1004. if (dto.Files.Any()) complement.FileJson = await _fileRepository.AddFileAsync(dto.Files, complement.Id, "", cancellationToken);
  1005. await _orderComplementRepository.UpdateAsync(complement, cancellationToken);
  1006. break;
  1007. case EDsBisType.OrderHandleResult:
  1008. var order1 = await _orderRepository.GetAsync(d => d.ProvinceNo == dto.ProvinceNo, cancellationToken);
  1009. if (order1 is null)
  1010. throw new UserFriendlyException($"无效工单编号, ProvinceNo: {dto.ProvinceNo}");
  1011. if (string.IsNullOrEmpty(order1.WorkflowId))
  1012. throw new UserFriendlyException($"该工单未开启流程,ProvinceNo: {dto.ProvinceNo}");
  1013. await _workflowApplication.UpdateProvinceHandleResultFilesAsync(order1.WorkflowId, dto.Files, cancellationToken);
  1014. break;
  1015. default:
  1016. throw new ArgumentOutOfRangeException();
  1017. }
  1018. }
  1019. /// <summary>
  1020. /// 接收市州互转返回数据
  1021. /// </summary>
  1022. [CapSubscribe(EventNames.SharingOrderTranspondCity)]
  1023. public async Task RecTranspondCityRawDataAsync(TranspondCityRawDataDto dto, CancellationToken cancellationToken)
  1024. {
  1025. var data = await _transpondCityRawDataRepository.GetAsync(p => p.OrderCode == dto.OrderCode && p.Direction == ETranspondDirection.Out,
  1026. cancellationToken);
  1027. if (data != null)
  1028. {
  1029. data.IsSuccess = dto.IsSuccess;
  1030. data.SendTimes = dto.SendTimes;
  1031. data.Result = dto.Result;
  1032. data.NewCode = dto.NewCode;
  1033. await _transpondCityRawDataRepository.UpdateAsync(data, cancellationToken);
  1034. }
  1035. }
  1036. /// <summary>
  1037. /// 接收市州互转接收原始数据
  1038. /// </summary>
  1039. [CapSubscribe(EventNames.SharingOrderReceiveTranspondCity)]
  1040. public async Task RecTranspondCityReceiveRawDataAsync(TranspondCityRawDataDto dto, CancellationToken cancellationToken)
  1041. {
  1042. await _transpondCityRawDataRepository.AddAsync(_mapper.Map<TranspondCityRawData>(dto), cancellationToken);
  1043. }
  1044. /// <summary>
  1045. /// 接收市州互转办理结果
  1046. /// </summary>
  1047. [CapSubscribe(EventNames.SharingOrderReceiveHandleOpinionTranspondCity)]
  1048. public async Task RecTranspondCityReceiveResultAsync(TranspondCityOrderResultDto dto, CancellationToken cancellationToken)
  1049. {
  1050. var cityDataUndertakAdvice = _systemSettingCacheManager.GetSetting(SettingConstants.CityDataUndertakAdvice)?.SettingValue[0];
  1051. if (cityDataUndertakAdvice == "true")
  1052. {
  1053. var order = await _orderRepository.GetAsync(p => p.No == dto.No, cancellationToken);
  1054. if (order != null)
  1055. {
  1056. order.ActualOpinion = dto.Opinion;
  1057. await _orderRepository.UpdateAsync(order, cancellationToken);
  1058. //后面还需要处理流程中的意见
  1059. }
  1060. }
  1061. //修改推送数据办理结果
  1062. var data = await _transpondCityRawDataRepository.GetAsync(p => p.OrderCode == dto.No && p.Direction == ETranspondDirection.Out,
  1063. cancellationToken);
  1064. if (data != null)
  1065. {
  1066. data.ActualOpinion = dto.Opinion;
  1067. await _transpondCityRawDataRepository.UpdateAsync(data, cancellationToken);
  1068. }
  1069. }
  1070. /// <summary>
  1071. /// 应急管理局推送回调
  1072. /// </summary>
  1073. /// <returns></returns>
  1074. [CapSubscribe(EventNames.HotlineOrderContingencyManagementState)]
  1075. public async Task RecHotlineOrderContingencyManagementState(RecOrderStateDto dto, CancellationToken cancellationToken)
  1076. {
  1077. var data = await _contingencyManagementOrdersRepository.GetAsync(p => p.Id == dto.Id, cancellationToken);
  1078. if (data != null && dto.State != data.PushState)
  1079. {
  1080. data.PushState = dto.State;
  1081. await _contingencyManagementOrdersRepository.UpdateAsync(data, cancellationToken);
  1082. }
  1083. }
  1084. /// <summary>
  1085. /// 处理每天办理完成未及时推送办理结果的数据
  1086. /// </summary>
  1087. /// <param name="provinceNos"></param>
  1088. /// <param name="cancellationToken"></param>
  1089. /// <returns></returns>
  1090. [CapSubscribe(EventNames.HotlineFiledOrdersRepublish)]
  1091. public async Task RepublishFiledOrders(List<string> provinceNos, CancellationToken cancellationToken)
  1092. {
  1093. var unpublishOrders = await _orderRepository.Queryable()
  1094. .Where(d => provinceNos.Contains(d.ProvinceNo) &&
  1095. !string.IsNullOrEmpty(d.ProvinceNo) &&
  1096. d.Status >= EOrderStatus.Filed)
  1097. .ToListAsync(cancellationToken);
  1098. foreach (var order in unpublishOrders)
  1099. {
  1100. var trace = await _workflowTraceRepository.Queryable()
  1101. .FirstAsync(d => d.WorkflowId == order.WorkflowId && d.StepType == EStepType.End, cancellationToken);
  1102. var orderFlowDto = new OrderFlowDto
  1103. {
  1104. Order = _mapper.Map<OrderDto>(order),
  1105. WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
  1106. };
  1107. if (order.SourceChannelCode == AppDefaults.SourceChannel.DianHua &&
  1108. !string.IsNullOrEmpty(order.CallId))
  1109. {
  1110. if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.TianRun)
  1111. {
  1112. var callRecord = await _callApplication.GetTianrunCallAsync(order.CallId, cancellationToken);
  1113. if (callRecord != null)
  1114. {
  1115. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
  1116. }
  1117. }
  1118. else if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XingTang)
  1119. {
  1120. var call = await _callApplication.GetCallAsync(order.CallId, cancellationToken);
  1121. if (call is not null)
  1122. orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(call);
  1123. }
  1124. }
  1125. //这里需要判断是否是警情退回
  1126. orderFlowDto.IsNonPoliceReturn = false;
  1127. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: cancellationToken);
  1128. }
  1129. }
  1130. /// <summary>
  1131. /// 随手拍网格员、回复办理结果
  1132. /// </summary>
  1133. /// <param name="dto"></param>
  1134. /// <param name="cancellationToken"></param>
  1135. /// <returns></returns>
  1136. [CapSubscribe(EventNames.TianQueReceiverOpinion)]
  1137. public async Task TianQueReceiverOpinion(TianQueReceiverOpinionDto dto, CancellationToken cancellationToken)
  1138. {
  1139. //todo
  1140. }
  1141. /// <summary>
  1142. /// 天阙推送工单,返回信息
  1143. /// </summary>
  1144. /// <returns></returns>
  1145. [CapSubscribe(EventNames.TianQuePushOrderReceiver)]
  1146. public async Task TianQuePushOrderReceiver(TianQuePushOrderReceiverDto dto, CancellationToken cancellationToken)
  1147. {
  1148. //todo
  1149. }
  1150. /// <summary>
  1151. /// 收到shangring提供未关联callIds
  1152. /// </summary>
  1153. [CapSubscribe(EventNames.RecUnrelationCalls)]
  1154. public async Task RecUnRelationCallIds(List<string> callIds, CancellationToken cancellationToken)
  1155. {
  1156. if (_appOptions.Value.GetDefaultAppScopeConfiguration().CallCenterType == AppDefaults.CallCenterType.XingTang)
  1157. {
  1158. try
  1159. {
  1160. var query = await _orderRepository.Queryable()
  1161. .LeftJoin<CallNative>((o, c) => o.CallId == c.Id)
  1162. .Where((o, c) => !SqlFunc.IsNullOrEmpty(o.CallId) && callIds.Contains(o.CallId))
  1163. .Select((o, c) => new { Order = o, Call = c })
  1164. .ToListAsync(cancellationToken);
  1165. if (!query.Any()) return;
  1166. var orderCalls = query
  1167. .Where(d => !string.IsNullOrEmpty(d.Call.Id))
  1168. .Select(d => new PublishCallRecrodDto
  1169. {
  1170. Order = _mapper.Map<OrderDto>(d.Order),
  1171. TrCallRecordDto = _mapper.Map<TrCallDto>(d.Call)
  1172. }).ToList();
  1173. foreach (var orderCall in orderCalls)
  1174. {
  1175. await _capPublisher.PublishAsync(EventNames.SharingOrderWithCallInfo, orderCall,
  1176. cancellationToken: cancellationToken);
  1177. }
  1178. }
  1179. catch (Exception e)
  1180. {
  1181. _logger.LogError(e.Message);
  1182. }
  1183. }
  1184. }
  1185. /// <summary>
  1186. /// 将未匹配到通话记录的工单处理为QT
  1187. /// </summary>
  1188. /// <param name="orderIds"></param>
  1189. /// <param name="cancellationToken"></param>
  1190. /// <returns></returns>
  1191. [CapSubscribe(EventNames.RecUpdateOrderSourceChannel)]
  1192. public async Task UpdateOrderSourceChannel(List<string> orderIds, CancellationToken cancellationToken)
  1193. {
  1194. if (orderIds != null && orderIds.Any())
  1195. {
  1196. foreach (var item in orderIds)
  1197. {
  1198. var orderData = await _orderRepository.GetAsync(p => p.Id == item || p.ProvinceNo == item, cancellationToken);
  1199. if (orderData != null)
  1200. {
  1201. orderData.SourceChannel = "其他";
  1202. orderData.SourceChannelCode = "QT";
  1203. var orderDto = _mapper.Map<OrderDto>(orderData);
  1204. await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
  1205. cancellationToken: cancellationToken);
  1206. }
  1207. }
  1208. }
  1209. }
  1210. }
  1211. }