ProvinceReceiver.cs 128 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669
  1. using DataSharing.Application.Validators.HuiJu;
  2. using DataSharing.Application.Validators.XieTong;
  3. using DataSharing.CityStateDataExchange;
  4. using DataSharing.Police110.DaoShu110;
  5. using DataSharing.Province;
  6. using DataSharing.RawData;
  7. using DataSharing.SendTask;
  8. using DataSharing.Share.Consts;
  9. using DataSharing.Share.Dtos;
  10. using DataSharing.Share.Dtos.HotlineWeb;
  11. using DataSharing.Share.Dtos.Province;
  12. using DataSharing.Share.Dtos.Province.Extend;
  13. using DataSharing.Share.Dtos.Province.HuiJu;
  14. using DataSharing.Share.Dtos.Province.XieTong.Knowledge;
  15. using DataSharing.Share.Dtos.Province.XieTong.Receive;
  16. using DataSharing.Share.Dtos.Province.XieTong.Send;
  17. using DataSharing.Share.Dtos.YiBin.Enterprise;
  18. using DataSharing.Share.Enums;
  19. using DotNetCore.CAP;
  20. using Hotline.Share.Dtos.Knowledge;
  21. using Hotline.Share.Dtos.Order;
  22. using Hotline.Share.Dtos.TrCallCenter;
  23. using Hotline.Share.Enums.CallCenter;
  24. using Hotline.Share.Enums.FlowEngine;
  25. using Hotline.Share.Enums.Order;
  26. using MapsterMapper;
  27. using Microsoft.Extensions.Logging;
  28. using System.Security.Cryptography;
  29. using System.Text;
  30. using System.Web;
  31. using XF.Domain.Cache;
  32. using XF.Domain.Dependency;
  33. using XF.Domain.Exceptions;
  34. using XF.Domain.Repository;
  35. namespace DataSharing.Application.Receivers
  36. {
  37. public class ProvinceReceiver : ICapSubscribe, IScopeDependency
  38. {
  39. #region 注入
  40. private readonly IMapper _mapper;
  41. private readonly ILogger<ProvinceReceiver> _logger;
  42. private readonly IRepository<DsPoliceSendChainAlarmDs> _policeSendChainAlarmDsRepository;
  43. private readonly IRepository<DsPoliceSendChainDealDs> _policeSendChainDealDsRepository;
  44. private readonly IRepository<DsSendTask> _dsSendTaskRepository;
  45. private readonly IRepository<DsOrder> _dsOrderRepository;
  46. private readonly IRepository<DsOrderWorkFlow> _dataOrderWorkFlowRepository;
  47. private readonly IRepository<DsKnowledgeRawData> _knowledgeRawDataRepository;
  48. private readonly IChannelConfigurationManager _channelConfigurationManager;
  49. private readonly IRepository<DsSendCaseInfo> _sendCaseInfoRepository;
  50. private readonly ITypedCache<MissedCallModelDto> _missedCallModelCache;
  51. private readonly string MissedCallKey = "missedCallKey_";
  52. private readonly IRepository<DsOrderVisit> _dsOrderVisitRepository;
  53. private readonly IRepository<DsGetCaseBackApply> _getCaseBackApplyRepository;
  54. private readonly ICapPublisher _capPublisher;
  55. private readonly IRepository<DsTelCall> _dsTelCallRepository;
  56. private readonly IRepository<DsReceiveDataExchangeData> _dsReceiveDataExchangeDataRepository;
  57. private readonly ITypedCache<ConfigurationInformationDto> _configurationInformationCache;
  58. private readonly IRepository<DsOrderVisitSend> _dsOrderVisitSendRepository;
  59. private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
  60. private readonly ISharingConfigurationManager _sharingConfigurationManager;
  61. /// <summary>
  62. ///
  63. /// </summary>
  64. /// <param name="mapper"></param>
  65. /// <param name="logger"></param>
  66. /// <param name="policeSendChainAlarmDsRepository"></param>
  67. /// <param name="policeSendChainDealDsRepository"></param>
  68. /// <param name="dsSendTaskRepository"></param>
  69. /// <param name="dsOrderRepository"></param>
  70. /// <param name="dataOrderWorkFlowRepository"></param>
  71. /// <param name="knowledgeRawDataRepository"></param>
  72. /// <param name="channelConfigurationManager"></param>
  73. /// <param name="sendCaseInfoRepository"></param>
  74. /// <param name="missedCallModelCache"></param>
  75. /// <param name="dsOrderVisitRepository"></param>
  76. /// <param name="getCaseBackApplyRepository"></param>
  77. /// <param name="capPublisher"></param>
  78. /// <param name="dsTelCallRepository"></param>
  79. /// <param name="dsReceiveDataExchangeDataRepository"></param>
  80. /// <param name="configurationInformationCache"></param>
  81. /// <param name="dsOrderVisitSendRepository"></param>
  82. /// <param name="dsUserTokenInfoRepository"></param>
  83. public ProvinceReceiver(IMapper mapper, ILogger<ProvinceReceiver> logger,
  84. IRepository<DsPoliceSendChainAlarmDs> policeSendChainAlarmDsRepository,
  85. IRepository<DsPoliceSendChainDealDs> policeSendChainDealDsRepository,
  86. IRepository<DsSendTask> dsSendTaskRepository,
  87. IRepository<DsOrder> dsOrderRepository,
  88. IRepository<DsOrderWorkFlow> dataOrderWorkFlowRepository,
  89. IRepository<DsKnowledgeRawData> knowledgeRawDataRepository,
  90. IChannelConfigurationManager channelConfigurationManager,
  91. IRepository<DsSendCaseInfo> sendCaseInfoRepository,
  92. ITypedCache<MissedCallModelDto> missedCallModelCache,
  93. IRepository<DsOrderVisit> dsOrderVisitRepository,
  94. IRepository<DsGetCaseBackApply> getCaseBackApplyRepository,
  95. ICapPublisher capPublisher,
  96. IRepository<DsTelCall> dsTelCallRepository,
  97. IRepository<DsReceiveDataExchangeData> dsReceiveDataExchangeDataRepository,
  98. ITypedCache<ConfigurationInformationDto> configurationInformationCache,
  99. IRepository<DsOrderVisitSend> dsOrderVisitSendRepository,
  100. IRepository<DsUserTokenInfo> dsUserTokenInfoRepository,
  101. ISharingConfigurationManager sharingConfigurationManager)
  102. {
  103. _mapper = mapper;
  104. _logger = logger;
  105. _policeSendChainAlarmDsRepository = policeSendChainAlarmDsRepository;
  106. _policeSendChainDealDsRepository = policeSendChainDealDsRepository;
  107. _dsSendTaskRepository = dsSendTaskRepository;
  108. _dsOrderRepository = dsOrderRepository;
  109. _dataOrderWorkFlowRepository = dataOrderWorkFlowRepository;
  110. _knowledgeRawDataRepository = knowledgeRawDataRepository;
  111. _channelConfigurationManager = channelConfigurationManager;
  112. _sendCaseInfoRepository = sendCaseInfoRepository;
  113. _missedCallModelCache = missedCallModelCache;
  114. _dsOrderVisitRepository = dsOrderVisitRepository;
  115. _getCaseBackApplyRepository = getCaseBackApplyRepository;
  116. _capPublisher = capPublisher;
  117. _dsTelCallRepository = dsTelCallRepository;
  118. _dsReceiveDataExchangeDataRepository = dsReceiveDataExchangeDataRepository;
  119. _configurationInformationCache = configurationInformationCache;
  120. _dsOrderVisitSendRepository = dsOrderVisitSendRepository;
  121. _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
  122. _sharingConfigurationManager = sharingConfigurationManager;
  123. }
  124. #endregion
  125. #region 协同-第一批次
  126. /// <summary>
  127. /// 退回申请 --已对接---1
  128. /// </summary>
  129. /// <param name="dto"></param>
  130. /// <returns></returns>
  131. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFlowPrevious)]
  132. public async Task GetCaseBackApplyAsync(PublishOrderSendBackDto dtos, CancellationToken cancellationToken)
  133. {
  134. if (dtos != null && dtos.SendDatas != null)
  135. {
  136. //验证数据
  137. foreach (var dto in dtos.SendDatas)
  138. {
  139. var validator = new GetCaseBackApplyValidator();
  140. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  141. if (!validResult.IsValid)
  142. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  143. }
  144. foreach (var dto in dtos.SendDatas)
  145. {
  146. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.Source == ESource.ProvinceStraight || dto.Order.AreaCode.Contains("519"))
  147. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  148. //处理省上的退回申请
  149. if (dto.Order.Source == ESource.ProvinceStraight)
  150. {
  151. var data = _mapper.Map<GetCaseBackApplyInfo>(dto);
  152. data.CliengGuid = dto.SendBack.Id;
  153. var tempData = _mapper.Map<DsGetCaseBackApply>(data);
  154. tempData.OrderSendBackId = dto.SendBack.Id;
  155. var backId = await _getCaseBackApplyRepository.AddAsync(tempData, cancellationToken);
  156. if (!string.IsNullOrEmpty(backId))
  157. {
  158. #region 处理请求参数
  159. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  160. var request = new ProvinceRequest<GetCaseBackApplyInfo>(configProvince.ClientId, configProvince.ClientSecret);
  161. request.SetData(data);
  162. var jsonData = request.ToString();
  163. var url = configProvince.XieTong + "get_case_back_apply";
  164. #endregion
  165. //将待推送数据写入待推送表
  166. await InitPushDataAsync("GetCaseBackApply", "get_case_back_apply", jsonData, data.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  167. //处理附件
  168. await FileDataAsync(dto.SendBack.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken: cancellationToken);
  169. }
  170. }
  171. }
  172. }
  173. }
  174. /// <summary>
  175. /// 服务工单督办过程 --已对接-----1
  176. /// </summary>
  177. /// <param name="dto"></param>
  178. /// <returns></returns>
  179. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderSuperviseCourse)]
  180. public async Task SendSuperviseProcessInfoAsync(PublishSuperviseDto dto, CancellationToken cancellationToken)
  181. {
  182. //工单是省上派下来的,才能进行督办回复
  183. if (dto.Order.Source == ESource.ProvinceStraight)
  184. {
  185. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.Source == ESource.ProvinceStraight || dto.Order.AreaCode.Contains("519"))
  186. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  187. var validator = new SendSuperviseProcessInfoValidator();
  188. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  189. if (!validResult.IsValid)
  190. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  191. var data = _mapper.Map<SendSuperviseProcessInfo>(dto);
  192. data.ReplyOpinion = "已签收";
  193. #region 处理请求参数
  194. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  195. var request = new ProvinceRequest<SendSuperviseProcessInfo>(configProvince.ClientId, configProvince.ClientSecret);
  196. request.SetData(data);
  197. var jsonData = request.ToString();
  198. var url = configProvince.XieTong + "send_supervise_process_info";
  199. #endregion
  200. //将待推送数据写入待推送表
  201. await InitPushDataAsync("SendSuperviseProcessInfo", "send_supervise_process_info", jsonData, dto.Order.ProvinceNo, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  202. }
  203. }
  204. /// <summary>
  205. /// 服务工单督办结果 --已对接----1
  206. /// </summary>
  207. /// <param name="dto"></param>
  208. /// <returns></returns>
  209. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderSuperviseResult)]
  210. public async Task SendSuperviseResultInfoAsync(PublishSuperviseDto dto, CancellationToken cancellationToken)
  211. {
  212. //工单是省上派下来的,才能进行督办回复
  213. if (dto.Order.Source == ESource.ProvinceStraight)
  214. {
  215. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.Source == ESource.ProvinceStraight || dto.Order.AreaCode.Contains("519"))
  216. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  217. var validator = new SendSuperviseResultInfoValidator();
  218. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  219. if (!validResult.IsValid)
  220. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  221. var data = _mapper.Map<SendSuperviseResultInfo>(dto);
  222. data.CliengGuid = dto.Supervise.Id;
  223. #region 处理请求参数
  224. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  225. var request = new ProvinceRequest<SendSuperviseResultInfo>(configProvince.ClientId, configProvince.ClientSecret);
  226. request.SetData(data);
  227. var jsonData = request.ToString();
  228. var url = configProvince.XieTong + "send_supervise_result_info";
  229. #endregion
  230. //将待推送数据写入待推送表
  231. await InitPushDataAsync("SendSuperviseResultInfo", "send_supervise_result_info", jsonData, dto.Order.ProvinceNo, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  232. //处理附件
  233. await FileDataAsync(dto.Supervise.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Supervise, dto.Order.AreaCode, cancellationToken);
  234. }
  235. }
  236. /// <summary>
  237. /// 工单发起甄别 --已对接---1
  238. /// </summary>
  239. /// <param name="dto"></param>
  240. /// <returns></returns>
  241. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderScreenApply)]
  242. public async Task ScreenCaseInfoSendAsync(PublishScreenDto dto, CancellationToken cancellationToken)
  243. {
  244. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.Source == ESource.ProvinceStraight || dto.Order.AreaCode.Contains("519"))
  245. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  246. //如果是省上派下来的工单,才能调发起甄别的接口
  247. if (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince)
  248. {
  249. var validator = new ScreenCaseInfoSendInfoValidator();
  250. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  251. if (!validResult.IsValid)
  252. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  253. var data = _mapper.Map<ScreenCaseInfoSendInfo>(dto);
  254. data.CliengGuid = dto.Screen.Id;
  255. data.ApplyType = dto.Screen.TypeDicName switch
  256. {
  257. "违反法律法规" => "10",
  258. "按正常流程处理" => "20",
  259. _ => "30",
  260. };
  261. #region 处理请求参数
  262. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  263. var request = new ProvinceRequest<ScreenCaseInfoSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
  264. request.SetData(data);
  265. var jsonData = request.ToString();
  266. var url = configProvince.XieTong + "screen_case_info_send";
  267. #endregion
  268. //将待推送数据写入待推送表
  269. await InitPushDataAsync("ScreenCaseInfoSend", "screen_case_info_send", jsonData, data.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  270. //处理附件
  271. await FileDataAsync(dto.Screen.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken: cancellationToken);
  272. }
  273. }
  274. /// <summary>
  275. /// 服务工单申请延时 --已对接---1
  276. /// </summary>
  277. /// <param name="dto"></param>
  278. /// <returns></returns>
  279. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderApplyDelay)]
  280. public async Task DelayCaseInfoSendAsync(PublishOrderDelayDto dto, CancellationToken cancellationToken)
  281. {
  282. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.Source == ESource.ProvinceStraight || dto.Order.AreaCode.Contains("519"))
  283. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  284. var validator = new DelayCaseInfoSendInfoValidator();
  285. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  286. if (!validResult.IsValid)
  287. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  288. var data = _mapper.Map<DelayCaseInfoSendInfo>(dto);
  289. data.CliengGuid = dto.Id;
  290. data.ApplyType = "1";
  291. #region 处理请求参数
  292. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  293. var request = new ProvinceRequest<DelayCaseInfoSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
  294. request.SetData(data);
  295. var jsonData = request.ToString();
  296. var url = configProvince.XieTong + "delay_case_info_send";
  297. #endregion
  298. //将待推送数据写入待推送表
  299. await InitPushDataAsync("DelayCaseInfoSend", "delay_case_info_send", jsonData, data.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  300. //处理附件
  301. await FileDataAsync(dto.FileJson, data.CaseSerial, data.CliengGuid, EMaterialType.Process, data.AreaCode, cancellationToken);
  302. }
  303. #endregion
  304. #region 汇聚-第二批次
  305. /// <summary>
  306. /// 热线工单流程开启 --服务工单受理----1
  307. /// </summary>
  308. /// <param name="dto"></param>
  309. /// <returns></returns>
  310. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFlowStarted)]
  311. public async Task OrderFlowStartedAsync(PublishCallRecrodDto pushdto, CancellationToken cancellationToken)
  312. {
  313. if (string.IsNullOrEmpty(pushdto.Order.AreaCode) || pushdto.Order.AreaCode.Contains("519"))
  314. pushdto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  315. var dto = pushdto.Order;
  316. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  317. //如果不是省上派下来的工单,需要汇聚到省上
  318. if (dto is not null && !dto.IsProvince)
  319. {
  320. var data = InitDataAsync(dto);
  321. var validator = new SubmitCaseInfoValidator();
  322. var validResult = await validator.ValidateAsync(data, cancellationToken);
  323. if (!validResult.IsValid)
  324. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  325. #region 处理请求参数
  326. var request = new ProvinceListRequest<SubmitCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  327. request.SetData(new List<SubmitCaseInfo>() { data });
  328. var jsonData = request.ToString();
  329. var url = configProvince.HuiJu + "submit_case_info";
  330. #endregion
  331. //将待推送数据写入待推送表
  332. await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonData, data.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 10, GenerationTime: pushdto.Order.StartTime, cancellationToken: cancellationToken);
  333. //处理附件
  334. await FileDataAsync(dto.FileJson, dto.ProvinceNo, data.CliengGuid, EMaterialType.Acceptance, data.AreaCode, cancellationToken);
  335. }
  336. //推送当前办理信息
  337. await SubmitCaseProcessFlowAsync(new OrderFlowDto { Order = pushdto.Order, WorkflowTrace = pushdto.WorkflowTrace, ExpiredTimeChanged = false }, cancellationToken);
  338. var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Id, cancellationToken);
  339. //本地保存工单基础数据---存在修改,不存在新增
  340. if (dataOrder == null)
  341. {
  342. dataOrder = new()
  343. {
  344. OrderId = dto.Id,
  345. OrderNo = dto.No,
  346. ProvinceNo = dto.ProvinceNo,
  347. WorkflowId = dto.WorkflowId,
  348. Password = dto.Password,
  349. Title = dto.Title,
  350. FromName = dto.FromName,
  351. Contact = dto.Contact,
  352. Content = dto.Content,
  353. CaseDate = Convert.ToDateTime(dto.CreationTime),
  354. Source = dto.Source.ToString(),
  355. CaseSource = dto.SourceChannel,
  356. CaseSourceCode = dto.SourceChannelCode,
  357. HotspotId = dto.HotspotId,
  358. HotspotName = dto.HotspotName,
  359. HotspotSpliceName = dto.HotspotSpliceName,
  360. ExpiredTime = dto.ExpiredTime,
  361. CaseType = dto.AcceptType,
  362. CaseTypeCode = dto.AcceptTypeCode,
  363. AllDuration = 0,
  364. IsProvince = dto.IsProvince,
  365. HandleState = "办理中",
  366. StartTime = dto.StartTime,
  367. CallId = dto.CallId,
  368. FileJson = _mapper.Map<List<DataSharing.Share.Dtos.FileJson>>(dto.FileJson)
  369. };
  370. await _dsOrderRepository.AddAsync(dataOrder, cancellationToken);
  371. }
  372. else
  373. {
  374. dataOrder.ProvinceNo = dto.ProvinceNo;
  375. dataOrder.WorkflowId = dto.WorkflowId;
  376. dataOrder.Password = dto.Password;
  377. dataOrder.Title = dto.Title;
  378. dataOrder.FromName = dto.FromName;
  379. dataOrder.Contact = dto.Contact;
  380. dataOrder.Content = dto.Content;
  381. dataOrder.CaseDate = Convert.ToDateTime(dto.CreationTime);
  382. dataOrder.Source = dto.Source.ToString();
  383. dataOrder.CaseSource = dto.SourceChannel;
  384. dataOrder.CaseSourceCode = dto.SourceChannelCode;
  385. dataOrder.HotspotId = dto.HotspotId;
  386. dataOrder.HotspotName = dto.HotspotName;
  387. dataOrder.HotspotSpliceName = dto.HotspotSpliceName;
  388. dataOrder.ExpiredTime = dto.ExpiredTime;
  389. dataOrder.CaseType = dto.AcceptType;
  390. dataOrder.CaseTypeCode = dto.AcceptTypeCode;
  391. dataOrder.AllDuration = 0;
  392. dataOrder.IsProvince = dto.IsProvince;
  393. dataOrder.HandleState = "办理中";
  394. dataOrder.StartTime = dto.StartTime;
  395. dataOrder.CallId = dto.CallId;
  396. dataOrder.FileJson = _mapper.Map<List<DataSharing.Share.Dtos.FileJson>>(dto.FileJson);
  397. await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
  398. }
  399. //再次推送通话记录
  400. if (pushdto.TrCallRecordDto is not null)
  401. {
  402. //如果推送工单的时候判断通话记录是否是未接,并且是否已经上传,如果没有咋补再次推送通话记录
  403. var tellCall = await _dsTelCallRepository.AnyAsync(p => p.CallId == pushdto.TrCallRecordDto.CallAccept, cancellationToken);
  404. if (pushdto.TrCallRecordDto.OnState == EOnState.NoOn && !tellCall)
  405. return;
  406. var dataCall = _mapper.Map<SubmitCaseRecordInfo>(pushdto.TrCallRecordDto);
  407. dataCall.AreaCode = dto.AreaCode.Length > 6 ? dto.AreaCode.Substring(0, 6) : dto.AreaCode;
  408. dataCall.CaseSerial = dto.ProvinceNo;
  409. if (string.IsNullOrEmpty(dataCall.AccordUrl))
  410. dataCall.AccordUrl = "";
  411. //处理通话记录时间
  412. SetCallTime(dataCall);
  413. var validator = new SubmitCaseRecordInfoValidator();
  414. var validResult = await validator.ValidateAsync(dataCall, cancellationToken);
  415. if (!validResult.IsValid)
  416. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  417. #region 处理请求参数
  418. var requestCall = new ProvinceListRequest<SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
  419. requestCall.SetData(new List<SubmitCaseRecordInfo>() { dataCall });
  420. var jsonDataCall = requestCall.ToString();
  421. jsonDataCall = jsonDataCall.Replace("0001-01-01 00:00:00", "");
  422. var urlCall = configProvince.HuiJu + "submit_case_record";
  423. //将待推送数据写入待推送表
  424. var taskId = await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", jsonDataCall, dataCall.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 20, GenerationTime: pushdto.Order.StartTime, cancellationToken: cancellationToken);
  425. //本地保存通话记录数据
  426. await InitTelCallData(pushdto.TrCallRecordDto, dto.ProvinceNo, taskId, cancellationToken);
  427. #endregion
  428. }
  429. }
  430. /// <summary>
  431. ///热线工单期满时间变更--推送服务工单受理---1
  432. /// </summary>
  433. /// <param name="dto"></param>
  434. /// <returns></returns>
  435. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate)]
  436. public async Task HotlineOrderFlowRecalledAsync(OrderDto dto, CancellationToken cancellationToken)
  437. {
  438. if (string.IsNullOrEmpty(dto.AreaCode) || dto.AreaCode.Contains("519"))
  439. dto.AreaCode = _sharingConfigurationManager.GetCityCode();
  440. //如果不是省上派下来的工单,需要汇聚到省上
  441. if (!dto.IsProvince)
  442. {
  443. var data = InitDataAsync(dto);
  444. var validator = new SubmitCaseInfoValidator();
  445. var validResult = await validator.ValidateAsync(data, cancellationToken);
  446. if (!validResult.IsValid)
  447. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  448. #region 处理请求参数
  449. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  450. var request = new ProvinceListRequest<SubmitCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  451. request.SetData(new List<SubmitCaseInfo>() { data });
  452. var jsonData = request.ToString();
  453. var url = configProvince.HuiJu + "submit_case_info";
  454. #endregion
  455. //将待推送数据写入待推送表
  456. await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonData, data.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 10, GenerationTime: dto.StartTime, cancellationToken: cancellationToken);
  457. }
  458. //修改工单的期满时间
  459. var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Id, cancellationToken);
  460. if (dataOrder != null)
  461. {
  462. dataOrder.ExpiredTime = dto.ExpiredTime;
  463. await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
  464. }
  465. }
  466. /// <summary>
  467. /// 热线工单办理---服务工单处理/服务工单交办处理过程----1
  468. /// </summary>
  469. /// <param name="dto"></param>
  470. /// <returns></returns>
  471. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFlowHandled)]
  472. public async Task SubmitCaseProcessAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  473. {
  474. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.AreaCode.Contains("519"))
  475. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  476. if (string.IsNullOrEmpty(dto.WorkflowTrace.HandlerOrgAreaCode))
  477. {
  478. dto.WorkflowTrace.HandlerOrgAreaCode = dto.Order.AreaCode;
  479. if (dto.WorkflowTrace.HandlerOrgAreaCode.Length > 6)
  480. dto.WorkflowTrace.HandlerOrgAreaCode = dto.WorkflowTrace.HandlerOrgAreaCode.Substring(0, 6);
  481. }
  482. await SubmitCaseProcessFlowAsync(dto, cancellationToken);
  483. //期满时间变更或者办理节点为话务部,重新推送数据
  484. if ((dto.ExpiredTimeChanged || dto.Order.ActualHandleStepName == "话务部") && !dto.Order.IsProvince)
  485. {
  486. var submitCaseInfo = InitDataAsync(dto.Order);
  487. var validator = new SubmitCaseInfoValidator();
  488. var validResult = await validator.ValidateAsync(submitCaseInfo, cancellationToken);
  489. if (!validResult.IsValid)
  490. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  491. #region 处理请求参数
  492. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  493. var requestSubmitCaseInfo = new ProvinceListRequest<SubmitCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  494. requestSubmitCaseInfo.SetData(new List<SubmitCaseInfo>() { submitCaseInfo });
  495. var jsonDataSubmitCaseInfo = requestSubmitCaseInfo.ToString();
  496. var urlSubmitCaseInfo = configProvince.HuiJu + "submit_case_info";
  497. #endregion
  498. //将待推送数据写入待推送表
  499. await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonDataSubmitCaseInfo, submitCaseInfo.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 10, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  500. //如果话务部派出去,再次上传附件
  501. if (dto.Order.ActualHandleStepName == "话务部")
  502. {
  503. //处理附件
  504. await FileDataAsync(dto.Order.FileJson, dto.Order.ProvinceNo, submitCaseInfo.CliengGuid, EMaterialType.Acceptance, submitCaseInfo.AreaCode, cancellationToken);
  505. }
  506. }
  507. }
  508. /// <summary>
  509. /// 回访完成---服务工单回访评价/服务工单交办评价-----1
  510. /// </summary>
  511. /// <param name="dto"></param>
  512. /// <returns></returns>
  513. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderVisited)]
  514. public async Task SubmitVisitInfoAsync(PublishVisitDto dto, CancellationToken cancellationToken)
  515. {
  516. await SubmitVisitInfoDataAsync(dto, cancellationToken);
  517. }
  518. /// <summary>
  519. /// 甄别通过---服务工单回访评价//服务工单交办评价----1
  520. /// </summary>
  521. /// <param name="dto"></param>
  522. /// <returns></returns>
  523. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed)]
  524. public async Task SubmitOrderScreenSuccessAsync(PublishVisitDto dto, CancellationToken cancellationToken)
  525. {
  526. await SubmitVisitInfoDataAsync(dto, cancellationToken);
  527. }
  528. /// <summary>
  529. ///热线工单归档---服务工单结果/服务工单交办处理结果----1
  530. /// </summary>
  531. /// <param name="dto"></param>
  532. /// <returns></returns>
  533. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFiled)]
  534. public async Task OrderFiledAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  535. {
  536. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.AreaCode.Contains("519"))
  537. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  538. if (string.IsNullOrEmpty(dto.Order.ActualHandleOrgAreaCode))
  539. {
  540. dto.Order.ActualHandleOrgAreaCode = dto.Order.AreaCode;
  541. if (dto.Order.ActualHandleOrgAreaCode.Length > 6)
  542. dto.Order.ActualHandleOrgAreaCode = dto.Order.ActualHandleOrgAreaCode.Substring(0, 6);
  543. }
  544. //先看看需要处理工单数据不
  545. SubmitCaseInfo data = new();
  546. if (dto != null && dto.Order != null && !dto.Order.IsProvince)
  547. {
  548. data = InitDataAsync(dto.Order);
  549. var validator = new SubmitCaseInfoValidator();
  550. var validResult = await validator.ValidateAsync(data, cancellationToken);
  551. if (!validResult.IsValid)
  552. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  553. }
  554. //推送办理记录
  555. dto.ExpiredTimeChanged = false;
  556. await SubmitCaseProcessFlowAsync(dto, cancellationToken);
  557. //判断是否是热线中心
  558. if (!string.IsNullOrEmpty(dto.Order.ActualHandleOrgCode) && dto.Order.ActualHandleOrgCode == "001")
  559. dto.Order.ActualHandleOrgName = "热线中心";
  560. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  561. //IsProvince 如果是false 则推送服务工单受理
  562. if (dto != null && dto.Order != null && !dto.Order.IsProvince)
  563. {
  564. #region 处理请求参数--推送工单数据
  565. var request = new ProvinceListRequest<SubmitCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  566. request.SetData(new List<SubmitCaseInfo>() { data });
  567. var jsonData = request.ToString();
  568. var url = configProvince.HuiJu + "submit_case_info";
  569. #endregion
  570. //将待推送数据写入待推送表
  571. await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonData, data.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 10, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  572. //推送服务工单结果信息-组装110数据
  573. await SubmitCaseResultAsync(dto, cancellationToken);
  574. }
  575. //修改工单基础数据
  576. var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Order.Id, cancellationToken);
  577. if (dataOrder != null)
  578. {
  579. dataOrder.HandleState = "办理完成";
  580. dataOrder.ActualHandleOrgName = dto.Order.ActualHandleOrgName;
  581. dataOrder.ActualHandleOrgCode = dto.Order.ActualHandleOrgCode;
  582. dataOrder.ActualHandlerId = dto.Order.ActualHandlerId;
  583. dataOrder.ActualHandlerName = dto.Order.ActualHandlerName;
  584. dataOrder.ActualOpinion = string.IsNullOrEmpty(dto.Order.ActualOpinion) == false ? dto.Order.ActualOpinion : dto.WorkflowTrace.Opinion;
  585. dataOrder.ActualHandleTime = dto.Order.ActualHandleTime;
  586. dataOrder.AllDuration = dto.Order.AllDuration;
  587. dataOrder.ExpiredTime = dto.Order.ExpiredTime;
  588. await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
  589. }
  590. else
  591. {
  592. var order = dto.Order;
  593. dataOrder = new()
  594. {
  595. OrderId = order.Id,
  596. OrderNo = order.No,
  597. ProvinceNo = order.ProvinceNo,
  598. WorkflowId = order.WorkflowId,
  599. Password = order.Password,
  600. Title = order.Title,
  601. FromName = order.FromName,
  602. Contact = order.Contact,
  603. Content = order.Content,
  604. CaseDate = Convert.ToDateTime(order.CreationTime),
  605. Source = order.Source.ToString(),
  606. CaseSource = order.SourceChannel,
  607. CaseSourceCode = order.SourceChannelCode,
  608. HotspotId = order.HotspotId,
  609. HotspotName = order.HotspotName,
  610. HotspotSpliceName = order.HotspotSpliceName,
  611. ExpiredTime = order.ExpiredTime,
  612. CaseType = order.AcceptType,
  613. CaseTypeCode = order.AcceptTypeCode,
  614. AllDuration = dto.Order.AllDuration,
  615. IsProvince = order.IsProvince,
  616. HandleState = "办理完成",
  617. ActualHandleOrgName = order.ActualHandleOrgName,
  618. ActualHandleOrgCode = order.ActualHandleOrgCode,
  619. ActualHandlerId = order.ActualHandlerId,
  620. ActualHandlerName = order.ActualHandlerName,
  621. ActualOpinion = string.IsNullOrEmpty(order.ActualOpinion) == false ? order.ActualOpinion : dto.WorkflowTrace.Opinion,
  622. ActualHandleTime = order.ActualHandleTime,
  623. StartTime = order.StartTime,
  624. CallId = order.CallId,
  625. FileJson = _mapper.Map<List<DataSharing.Share.Dtos.FileJson>>(order.FileJson)
  626. };
  627. await _dsOrderRepository.AddAsync(dataOrder, cancellationToken);
  628. }
  629. //再次推送通话记录
  630. if (dto.TrCallRecordDto is not null)
  631. {
  632. //如果推送工单的时候判断通话记录是否是未接,并且是否已经上传,如果没有咋补再次推送通话记录
  633. var tellCall = await _dsTelCallRepository.AnyAsync(p => p.CallId == dto.TrCallRecordDto.CallAccept, cancellationToken);
  634. if (dto.TrCallRecordDto.OnState == EOnState.NoOn && !tellCall)
  635. return;
  636. var dataCall = _mapper.Map<SubmitCaseRecordInfo>(dto.TrCallRecordDto);
  637. dataCall.AreaCode = dto.Order.AreaCode.Length > 6 ? dto.Order.AreaCode.Substring(0, 6) : dto.Order.AreaCode;
  638. dataCall.CaseSerial = dto.Order.ProvinceNo;
  639. if (string.IsNullOrEmpty(dataCall.AccordUrl))
  640. dataCall.AccordUrl = "";
  641. //处理通话记录时间
  642. SetCallTime(dataCall);
  643. var validator = new SubmitCaseRecordInfoValidator();
  644. var validResult = await validator.ValidateAsync(dataCall, cancellationToken);
  645. if (!validResult.IsValid)
  646. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  647. #region 处理请求参数
  648. var requestCall = new ProvinceListRequest<SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
  649. requestCall.SetData(new List<SubmitCaseRecordInfo>() { dataCall });
  650. var jsonDataCall = requestCall.ToString();
  651. jsonDataCall = jsonDataCall.Replace("0001-01-01 00:00:00", "");
  652. var urlCall = configProvince.HuiJu + "submit_case_record";
  653. //将待推送数据写入待推送表
  654. var taskId = await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", jsonDataCall, dataCall.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 20, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  655. //本地保存通话记录数据
  656. await InitTelCallData(dto.TrCallRecordDto, dto.Order.ProvinceNo, taskId, cancellationToken);
  657. #endregion
  658. }
  659. //110工单退回,是收到工单后工单直接归档,在选择归档的时候页面勾选非警情退回
  660. if (dto.Order.Source == ESource.Police110 && dto.IsNonPoliceReturn == true)
  661. {
  662. var checkData = await _policeSendChainDealDsRepository.AnyAsync(p => p.AlarmReceiptNumber == dto.Order.ExternalId && p.DisposalType == (int)EDsDisposalType.Return, cancellationToken);
  663. if (!checkData)
  664. {
  665. var dataPolice = new DsPoliceSendChainDealDs()
  666. {
  667. OrderId = dto.Order.Id,
  668. AlarmReceiptNumber = dto.Order.ExternalId,
  669. ReturnName = dto.Order.ActualHandlerName,
  670. ReturnUnit = dto.Order.ActualHandleOrgName,
  671. ReturnOpinion = dto.Order.ActualOpinion,
  672. ReturnTime = dto.Order.ActualHandleTime,
  673. WarehousingTime = DateTime.Now,
  674. DisposalType = 2
  675. };
  676. await _policeSendChainDealDsRepository.AddAsync(dataPolice, cancellationToken);
  677. }
  678. }
  679. //市州互转推送办结结果
  680. if (dto.Order.Source >= ESource.CityDataExchangeLz && dto.Order.Source < ESource.ConvergenceMedia)
  681. await UndertakAdviceAsync(dto.Order, cancellationToken);
  682. }
  683. /// <summary>
  684. /// 挂电话推送----电话记录---1List<CallConnectOrderDto> dtos
  685. /// </summary>
  686. /// <param name="dtos"></param>
  687. /// <returns></returns>
  688. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineCallBye)]
  689. public async Task SubmitCaseRecordAsync(PublishCallRecrodDto dto, CancellationToken cancellationToken)
  690. {
  691. //验证是否需要推送未接数据
  692. if (dto != null && dto.TrCallRecordDto != null && dto.TrCallRecordDto.OnState == EOnState.NoOn && dto.Order == null)
  693. {
  694. if (!await IsPublishMissedCall(dto.TrCallRecordDto, cancellationToken))
  695. return;
  696. }
  697. var data = _mapper.Map<SubmitCaseRecordInfo>(dto.TrCallRecordDto);
  698. if (dto.Order != null)
  699. {
  700. if (string.IsNullOrEmpty(dto.Order.AreaCode))
  701. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  702. else
  703. data.AreaCode = dto.Order.AreaCode;
  704. if (!string.IsNullOrEmpty(dto.Order.ProvinceNo))
  705. data.CaseSerial = dto.Order.ProvinceNo;
  706. }
  707. else
  708. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  709. if (data.AreaCode.Contains("519"))
  710. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  711. if (data.AreaCode.Length > 6)
  712. data.AreaCode = data.AreaCode.Substring(0, 6);
  713. if (string.IsNullOrEmpty(data.CaseSerial))
  714. data.CaseSerial = "";
  715. if (string.IsNullOrEmpty(data.AccordUrl))
  716. data.AccordUrl = "";
  717. //处理通话记录时间
  718. SetCallTime(data);
  719. var validator = new SubmitCaseRecordInfoValidator();
  720. var validResult = await validator.ValidateAsync(data, cancellationToken);
  721. if (!validResult.IsValid)
  722. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  723. #region 处理请求参数
  724. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  725. var request = new ProvinceListRequest<SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
  726. request.SetData(new List<SubmitCaseRecordInfo>() { data });
  727. var jsonData = request.ToString();
  728. jsonData = jsonData.Replace("0001-01-01 00:00:00", "");
  729. var url = configProvince.HuiJu + "submit_case_record";
  730. #endregion
  731. var startTime = dto.Order == null ? dto.TrCallRecordDto.BeginIvrTime : dto.Order.StartTime;
  732. //将待推送数据写入待推送表
  733. var taskId = await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", jsonData, data.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 20, GenerationTime: startTime, cancellationToken: cancellationToken);
  734. //本地保存通话记录数据
  735. await InitTelCallData(dto.TrCallRecordDto, data.CaseSerial, taskId, cancellationToken);
  736. }
  737. /// <summary>
  738. /// 关联工单了推送----电话记录---1
  739. /// </summary>
  740. /// <param name="dto"></param>
  741. /// <returns></returns>
  742. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineCallConnectWithOrder)]
  743. public async Task SubmitCaseRecordOrderAsync(PublishCallRecrodDto dto, CancellationToken cancellationToken)
  744. {
  745. //如果推送工单的时候判断通话记录是否是未接,并且是否已经上传,如果没有咋补再次推送通话记录
  746. var tellCall = await _dsTelCallRepository.AnyAsync(p => p.CallId == dto.TrCallRecordDto.CallAccept, cancellationToken);
  747. if (dto.TrCallRecordDto.OnState == EOnState.NoOn && !tellCall)
  748. return;
  749. var data = _mapper.Map<SubmitCaseRecordInfo>(dto.TrCallRecordDto);
  750. if (dto.Order != null)
  751. {
  752. if (string.IsNullOrEmpty(dto.Order.AreaCode))
  753. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  754. else
  755. data.AreaCode = dto.Order.AreaCode;
  756. if (!string.IsNullOrEmpty(dto.Order.ProvinceNo))
  757. data.CaseSerial = dto.Order.ProvinceNo;
  758. }
  759. else
  760. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  761. if (data.AreaCode.Contains("519"))
  762. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  763. if (data.AreaCode.Length > 6)
  764. data.AreaCode = data.AreaCode.Substring(0, 6);
  765. if (string.IsNullOrEmpty(data.CaseSerial))
  766. data.CaseSerial = "";
  767. if (string.IsNullOrEmpty(data.AccordUrl))
  768. data.AccordUrl = "";
  769. //处理通话记录时间
  770. SetCallTime(data);
  771. var validator = new SubmitCaseRecordInfoValidator();
  772. var validResult = await validator.ValidateAsync(data, cancellationToken);
  773. if (!validResult.IsValid)
  774. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  775. #region 处理请求参数
  776. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  777. var request = new ProvinceListRequest<SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
  778. request.SetData(new List<SubmitCaseRecordInfo>() { data });
  779. var jsonData = request.ToString();
  780. jsonData = jsonData.Replace("0001-01-01 00:00:00", "");
  781. var url = configProvince.HuiJu + "submit_case_record";
  782. #endregion
  783. var startTime = dto.Order == null ? dto.TrCallRecordDto.BeginIvrTime : dto.Order.StartTime;
  784. //将待推送数据写入待推送表
  785. var taskId = await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", jsonData, data.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 20, GenerationTime: startTime, cancellationToken: cancellationToken);
  786. //本地保存通话记录数据
  787. await InitTelCallData(dto.TrCallRecordDto, data.CaseSerial, taskId, cancellationToken);
  788. }
  789. /// <summary>
  790. /// 统计数据
  791. /// </summary>
  792. /// <param name="dto"></param>
  793. /// <returns></returns>
  794. public async Task SubmitCaseTotalAsync(SubmitCaseTotalInfo dto, CancellationToken cancellationToken)
  795. {
  796. #region 处理请求参数
  797. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  798. var request = new ProvinceListRequest<SubmitCaseTotalInfo>(configProvince.ClientId, configProvince.ClientSecret);
  799. request.SetData(new List<SubmitCaseTotalInfo>() { dto });
  800. var jsonData = request.ToString();
  801. var url = configProvince.HuiJu + "submit_case_total";
  802. #endregion
  803. //将待推送数据写入待推送表
  804. await InitPushDataAsync("SubmitCaseTotal", "submit_case_total", jsonData, "", pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  805. }
  806. #endregion
  807. #region 协同-第三批次
  808. /// <summary>
  809. /// 上报补充诉求---需要再次确认
  810. /// </summary>
  811. /// <param name="dto"></param>
  812. /// <returns></returns>
  813. public async Task SupplyCaseInfoSendAsync(SupplyCaseInfoSendInfo dto, CancellationToken cancellationToken)
  814. {
  815. dto.AreaCode = _sharingConfigurationManager.GetCityCode();
  816. dto.CliengGuid = Guid.NewGuid().ToString();
  817. #region 处理请求参数
  818. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  819. var request = new ProvinceRequest<SupplyCaseInfoSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
  820. request.SetData(dto);
  821. var jsonData = request.ToString();
  822. var url = configProvince.XieTong + "supply_case_info_send";
  823. #endregion
  824. //将待推送数据写入待推送表
  825. await InitPushDataAsync("SupplyCaseInfoSend", "supply_case_info_send", jsonData, dto.CaseSerial, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  826. //处理附件
  827. await FileDataAsync(null, dto.CaseSerial, dto.CliengGuid, EMaterialType.Process, dto.AreaCode, cancellationToken);
  828. }
  829. /// <summary>
  830. /// 撤单----1
  831. /// </summary>
  832. /// <param name="dto"></param>
  833. /// <param name="cancellationToken"></param>
  834. /// <returns></returns>
  835. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFlowRecalled)]
  836. public async Task RevokeOrderAsync(PublishSpecialDto dto, CancellationToken cancellationToken)
  837. {
  838. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.AreaCode.Contains("519"))
  839. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  840. //企业服务
  841. if (dto.Special.OrgId == "001181")
  842. {
  843. CancelWorkOrder dsDataWork = new()
  844. {
  845. WorkOrderNo = dto.Order.No,
  846. Reason = dto.Special.Reason
  847. };
  848. var configEnterprise = _sharingConfigurationManager.GetYiBinConfig().Enterprise;
  849. //将待推送数据写入待推送表configEnterprise.AddressUrl +
  850. await InitPushDataAsync("EnterpriseCancelWorkOrder", YbEnterpriseDefaults.PathEnterprisesCancelWorkOrder, System.Text.Json.JsonSerializer.Serialize(dsDataWork), dto.Order.ProvinceNo, platformSource: EPlatformSource.Enterprise, cancellationToken: cancellationToken);
  851. }
  852. //省12345
  853. if (dto.Special.OrgId == "001171" || dto.Special.OrgId == "001178")
  854. {
  855. var validator = new RevokeCaseInfoModelValidator();
  856. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  857. if (!validResult.IsValid)
  858. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  859. RevokeCaseInfoModel dsRevoke = new()
  860. {
  861. CaseSerial = dto.Order.ProvinceNo,
  862. AreaCode = dto.Order.AreaCode,
  863. RevokeTime = dto.Special.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"),
  864. RevokeName = dto.Special.CreatorName,
  865. RevokeReasion = dto.Special.Reason,
  866. CliengGuid = dto.Special.Id
  867. };
  868. if (string.IsNullOrEmpty(dto.Special.Cause))
  869. dsRevoke.RevokeType = "other";
  870. else if (dto.Special.Cause.Contains("内容错误"))
  871. dsRevoke.RevokeType = "2";
  872. else if (dto.Special.Cause == "撤销工单")
  873. dsRevoke.RevokeType = "1";
  874. else
  875. dsRevoke.RevokeType = "other";
  876. #region 处理请求参数
  877. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  878. var request = new ProvinceRequest<RevokeCaseInfoModel>(configProvince.ClientId, configProvince.ClientSecret);
  879. request.SetData(dsRevoke);
  880. var jsonData = request.ToString();
  881. var url = configProvince.XieTong + "revoke_case_info";
  882. #endregion
  883. //将待推送数据写入待推送表
  884. await InitPushDataAsync("SendRevokeCaseInfo", "revoke_case_info", jsonData, dsRevoke.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  885. await FileDataAsync(dto.Special.FileJson, dto.Order.ProvinceNo, dsRevoke.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
  886. }
  887. }
  888. /// <summary>
  889. /// 服务工单催单--已对接----1
  890. /// </summary>
  891. /// <param name="dto"></param>
  892. /// <returns></returns>
  893. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderUrgeInform)]
  894. public async Task SendRemindCaseInfoAsync(PublishUrgeDto dto, CancellationToken cancellationToken)
  895. {
  896. //被催办部门为省上,才能调用接口
  897. if (dto.Urge.OrgId == "001171" || dto.Urge.OrgId == "001178")
  898. {
  899. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.AreaCode.Contains("519"))
  900. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  901. var validator = new RemindCaseInfoValidator();
  902. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  903. if (!validResult.IsValid)
  904. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  905. var data = _mapper.Map<RemindCaseInfoModel>(dto);
  906. data.CliengGuid = dto.Urge.Id;
  907. #region 处理请求参数
  908. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  909. var request = new ProvinceRequest<RemindCaseInfoModel>(configProvince.ClientId, configProvince.ClientSecret);
  910. request.SetData(data);
  911. var jsonData = request.ToString();
  912. var url = configProvince.XieTong + "remind_case_info";
  913. #endregion
  914. //将待推送数据写入待推送表
  915. await InitPushDataAsync("SendRemindCaseInfo", "remind_case_info", jsonData, data.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  916. //处理附件
  917. await FileDataAsync(dto.Urge.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
  918. }
  919. }
  920. /// <summary>
  921. /// 接收发布数据
  922. /// </summary>
  923. /// <param name="dto"></param>
  924. /// <param name="cancellationToken"></param>
  925. /// <returns></returns>
  926. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder)]
  927. public async Task PublishOrderAsync(PublishPublishOrderDto dto, CancellationToken cancellationToken)
  928. {
  929. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.Source == ESource.ProvinceStraight || dto.Order.AreaCode.Contains("519"))
  930. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  931. //修改工单基础数据
  932. var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Order.Id, cancellationToken);
  933. if (dataOrder != null)
  934. {
  935. dataOrder.IsPublish = dto.PublishState == true ? EDsPublishState.Open : EDsPublishState.NotPublic;
  936. dataOrder.PublishDate = dto.CreationTime;
  937. dataOrder.ArrangeTitle = dto.ArrangeTitle;
  938. dataOrder.ArrangeContent = dto.ArrangeContent;
  939. dataOrder.ArrangeOpinion = dto.ArrangeOpinion;
  940. await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
  941. }
  942. //政民互动提交公开数据验证
  943. if (dto.Order.SourceChannelCode == "SZMHD" && dto.ProPublishState == true)
  944. {
  945. var validator = new ZmhdCaseInfoPublicInfoValidator();
  946. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  947. if (!validResult.IsValid)
  948. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  949. }
  950. if (dto.Order.IsProvince && dto.Order.Source == ESource.ProvinceStraight)
  951. {
  952. if (dto.Order.RealCommunicationMode == null)
  953. dto.Order.RealCommunicationMode = ERealCommunicationMode.Phone;
  954. var validator = new CaseResultReceiveValidator();
  955. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  956. if (!validResult.IsValid)
  957. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  958. #region 服务工单交办处理结果
  959. //判断是否是热线中心
  960. if (!string.IsNullOrEmpty(dto.Order.ActualHandleOrgCode) && dto.Order.ActualHandleOrgCode == "001")
  961. dto.Order.ActualHandleOrgName = "热线中心";
  962. ///如果是省上派下来的,直接将区域设置为宜宾市
  963. if (dto.Order.Source == ESource.ProvinceStraight)
  964. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  965. var data = _mapper.Map<GetCaseResultReceiveInfo>(dto.Order);
  966. data.ConcactType = "40";
  967. data.FinishType = "1";
  968. data.HandleTimeLong = (decimal)dto.Order.AllDuration;
  969. data.ConcactType = dto.Order.RealCommunicationMode switch
  970. {
  971. ERealCommunicationMode.Phone => "10",
  972. ERealCommunicationMode.Locale => "20",
  973. _ => "40",
  974. };
  975. data.CliengGuid = Guid.NewGuid().ToString();
  976. //中国政府网的数据处理
  977. if (dto.Order.ProvinceNo.Contains("ZGZFW"))
  978. {
  979. data.Notes = dto.Remark;
  980. data.MsgOpenByArea = dto.ProPublishState == true ? "1" : "0";
  981. data.AreaNotPublicReason = dto.NoPubReason;
  982. data.FeedBackAnswerContent = dto.ArrangeOpinion;
  983. data.FeedBackTel = dto.FeedBackPhone;
  984. data.EventType = "";
  985. data.Eventname = "";
  986. data.ContactFlag = dto.IsContact == true ? "1" : "0";
  987. data.AssessFlag = dto.IsVisited == true ? "1" : "0";
  988. data.AssessContent = dto.EvaluateContent;
  989. if (dto.NetizenEvaluate != null)
  990. {
  991. data.AssessOpinion = dto.NetizenEvaluate.Value;
  992. }
  993. }
  994. #region 处理请求参数
  995. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  996. var request = new ProvinceRequest<GetCaseResultReceiveInfo>(configProvince.ClientId, configProvince.ClientSecret);
  997. request.SetData(data);
  998. var jsonData = request.ToString();
  999. var url = configProvince.XieTong + "get_case_result_receive";
  1000. #endregion
  1001. await InitPushDataAsync("GetCaseResultReceive", "get_case_result_receive", jsonData, data.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  1002. //处理附件
  1003. await FileDataAsync(null, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Result, dto.Order.AreaCode, cancellationToken);
  1004. #endregion
  1005. }
  1006. //政民互动提交公开
  1007. if (dto.Order.SourceChannelCode == "SZMHD" && dto.ProPublishState == true)
  1008. {
  1009. var data = _mapper.Map<ZmhdCaseInfoPublicInfo>(dto);
  1010. #region 处理请求参数
  1011. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1012. var request = new ProvinceRequest<ZmhdCaseInfoPublicInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1013. request.SetData(data);
  1014. var jsonData = request.ToString();
  1015. var url = configProvince.XieTong + "zmhd_case_info_public";
  1016. #endregion
  1017. //将待推送数据写入待推送表
  1018. await InitPushDataAsync("ZmhdCaseInfoPublic", "zmhd_case_info_public", jsonData, data.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  1019. }
  1020. }
  1021. /// <summary>
  1022. /// 接收发布的时候生成的待回访部门数据
  1023. /// </summary>
  1024. /// <param name="dto"></param>
  1025. /// <param name="cancellationToken"></param>
  1026. /// <returns></returns>
  1027. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb)]
  1028. public async Task PublishVisitAllAsync(PublishVisitAllDto dto, CancellationToken cancellationToken)
  1029. {
  1030. if (dto != null)
  1031. {
  1032. List<DsOrderVisit> orderVisits = new List<DsOrderVisit>();
  1033. //1、待回访和已回访要将接收的数据写入库
  1034. //2、其他状态的时候需要将工单的回访状态改成不能回访
  1035. //处理待回访和已回访的数据
  1036. if (dto.VisitState == EVisitState.WaitForVisit || dto.VisitState == EVisitState.Visited)
  1037. {
  1038. if (dto.OrderVisitDetails != null && dto.OrderVisitDetails.Count > 0)
  1039. {
  1040. //组装回访数据
  1041. foreach (var item in dto.OrderVisitDetails)
  1042. {
  1043. DsOrderVisit dsOrderVisit = new()
  1044. {
  1045. OrderId = dto.Order.Id,
  1046. VisitDetailId = item.Id,
  1047. VisitId = item.VisitId,
  1048. VoiceEvaluate = item.VoiceEvaluate.ToString(),
  1049. SeatEvaluate = item.SeatEvaluate.ToString(),
  1050. OrgProcessingResults = _mapper.Map<Kv>(item.OrgProcessingResults),
  1051. OrgNoSatisfiedReason = _mapper.Map<List<Kv>>(item.OrgNoSatisfiedReason),
  1052. OrgHandledAttitude = _mapper.Map<Kv>(item.OrgHandledAttitude),
  1053. VisitContent = item.VisitContent,
  1054. VisitOrgName = item.VisitOrgName,
  1055. VisitOrgCode = item.VisitOrgCode,
  1056. VisitTarget = item.VisitTarget.ToString(),
  1057. VisitType = dto.VisitType.ToString(),
  1058. VisitTime = dto.VisitTime,
  1059. IsEffective = true
  1060. };
  1061. orderVisits.Add(dsOrderVisit);
  1062. }
  1063. //// 方式一: 保留数据
  1064. //var tempList = await _dsOrderVisitRepository.Queryable().Where(p => p.OrderId == dto.Order.Id && p.IsEffective == true).ToListAsync();
  1065. //foreach (var item in tempList)
  1066. //{
  1067. // item.IsEffective = false;
  1068. // await _dsOrderVisitRepository.UpdateAsync(item, cancellationToken);
  1069. //}
  1070. //方式二:直接删除原始数据
  1071. await _dsOrderVisitRepository.RemoveAsync(p => p.OrderId == dto.Order.Id);
  1072. //写入新数据
  1073. await _dsOrderVisitRepository.AddRangeAsync(orderVisits, cancellationToken);
  1074. }
  1075. }
  1076. //处理是否可以评价,如果是
  1077. var orderData = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Order.Id);
  1078. if (orderData is not null)
  1079. {
  1080. var tempState = orderData.VisitTypeState;
  1081. switch (dto.VisitState)
  1082. {
  1083. case EVisitState.WaitForVisit:
  1084. orderData.VisitTypeState = EVisitTypeState.Visit;
  1085. break;
  1086. case EVisitState.Visited:
  1087. orderData.VisitTypeState = EVisitTypeState.Reviewed;
  1088. break;
  1089. case EVisitState.Visiting:
  1090. case EVisitState.NoSatisfiedWaitForVisit:
  1091. case EVisitState.None:
  1092. orderData.VisitTypeState = EVisitTypeState.UnVisit;
  1093. break;
  1094. default:
  1095. break;
  1096. }
  1097. if (tempState != orderData.VisitTypeState)
  1098. await _dsOrderRepository.UpdateAsync(orderData, cancellationToken);
  1099. }
  1100. }
  1101. }
  1102. /// <summary>
  1103. /// 市州互转
  1104. /// </summary>
  1105. /// <param name="dto"></param>
  1106. /// <returns></returns>
  1107. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderTranspondCity)]
  1108. public async Task TranspondCityAsync(OrderDto dto, CancellationToken cancellationToken)
  1109. {
  1110. //泸州市州数据提交
  1111. if (dto.Transpond == true)
  1112. {
  1113. string areaCode = _sharingConfigurationManager.GetCityCode();
  1114. //判断推送市州
  1115. string PlatformSource = "";
  1116. switch (dto.TranspondCityValue)
  1117. {
  1118. case "TranspondCityLZ12345": //转泸州12345
  1119. PlatformSource = "CityDataExchangeLz";
  1120. break;
  1121. case "TranspondCityZG12345"://转自贡12345
  1122. PlatformSource = "CityDataExchangeZG";
  1123. break;
  1124. case "TranspondCityYB12345"://转宜宾12345
  1125. PlatformSource = "CityDataExchangeYB";
  1126. break;
  1127. case "TranspondCityNJ12345"://转内江12345
  1128. PlatformSource = "CityDataExchangeNJ";
  1129. break;
  1130. default:
  1131. break;
  1132. }
  1133. //数据推送
  1134. await InitCityDataAsync(dto, PlatformSource, cancellationToken);
  1135. }
  1136. }
  1137. #endregion
  1138. #region 汇聚-第四批次
  1139. #region 知识库--已对接附件
  1140. /// <summary>
  1141. /// 知识库上报----1
  1142. /// </summary>
  1143. /// <param name="dto"></param>
  1144. /// <returns></returns>
  1145. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineKnowledgeAdd)]
  1146. public async Task GetKnowledgeInfoSendAsync(KnowledgeSendDto dto, CancellationToken cancellationToken)
  1147. {
  1148. var validator = new KnowledgeInfoValidator();
  1149. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  1150. if (!validResult.IsValid)
  1151. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1152. var data = _mapper.Map<KnowledgeInfoSendInfo>(dto);
  1153. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  1154. data.CliengGuid = Guid.NewGuid().ToString();
  1155. if (data.DisableDate == null)//如果没得有失效时间,默认在生效日期上面加10年
  1156. data.DisableDate = data.BeginDate.Value.AddYears(10);
  1157. data.CategoryCode = "01";
  1158. data.CategoryName = "公共服务";
  1159. #region 处理请求参数
  1160. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1161. var request = new ProvinceRequest<KnowledgeInfoSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1162. request.SetData(data);
  1163. var jsonData = request.ToString();
  1164. var url = configProvince.HuiJu + "get_knowledge_info_send";
  1165. #endregion
  1166. //将待推送数据写入待推送表
  1167. await InitPushDataAsync("GetKnowledgeInfoSend", "get_knowledge_info_send", jsonData, data.UID, pathType: EPathType.HuiJu, GenerationTime: dto.CreatDate, cancellationToken: cancellationToken);
  1168. #region 处理知识库原始数据
  1169. //查询原有数据,如果有修改原始数据,没有直接新增
  1170. var dataRaw = await _knowledgeRawDataRepository.GetAsync(p => p.UID == data.UID);
  1171. var raw = _mapper.Map<DsKnowledgeRawData>(data);
  1172. if (dataRaw != null)
  1173. {
  1174. raw.Id = dataRaw.Id;
  1175. await _knowledgeRawDataRepository.UpdateAsync(raw, cancellationToken: cancellationToken);
  1176. }
  1177. else
  1178. await _knowledgeRawDataRepository.AddAsync(raw, cancellationToken: cancellationToken);
  1179. #endregion
  1180. //知识附件处理
  1181. await FileDataAsync(dto.FileJson, dto.UID, data.CliengGuid, EMaterialType.Knowledge, data.AreaCode, cancellationToken);
  1182. }
  1183. /// <summary>
  1184. /// 知识库变更---1
  1185. /// </summary>
  1186. /// <param name="dto"></param>
  1187. /// <returns></returns>
  1188. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineKnowledgeUpdate)]
  1189. public async Task GetKnowledgeInfoUpdateAsync(KnowledgeSendDto dto, CancellationToken cancellationToken)
  1190. {
  1191. var validator = new KnowledgeInfoValidator();
  1192. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  1193. if (!validResult.IsValid)
  1194. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1195. var data = _mapper.Map<GetKnowledgeInfoUpdateInfo>(dto);
  1196. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  1197. data.CliengGuid = Guid.NewGuid().ToString();
  1198. if (data.DisableDate == null)//如果没得有失效时间,默认在生效日期上面加10年
  1199. data.DisableDate = data.BeginDate.Value.AddYears(10);
  1200. data.CategoryCode = "01";
  1201. data.CategoryName = "公共服务";
  1202. #region 处理请求参数
  1203. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1204. var request = new ProvinceRequest<GetKnowledgeInfoUpdateInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1205. request.SetData(data);
  1206. var jsonData = request.ToString();
  1207. var url = configProvince.HuiJu + "get_knowledge_info_update";
  1208. #endregion
  1209. //将待推送数据写入待推送表
  1210. await InitPushDataAsync("GetKnowledgeInfoUpdate", "get_knowledge_info_update", jsonData, data.UID, pathType: EPathType.HuiJu, GenerationTime: dto.CreatDate, cancellationToken: cancellationToken);
  1211. #region 处理知识库原始数据
  1212. //查询原有数据,如果有修改原始数据,没有直接新增
  1213. var dataRaw = await _knowledgeRawDataRepository.GetAsync(p => p.UID == data.UID);
  1214. var raw = _mapper.Map<DsKnowledgeRawData>(data);
  1215. if (dataRaw != null)
  1216. {
  1217. raw.Id = dataRaw.Id;
  1218. await _knowledgeRawDataRepository.UpdateAsync(raw, cancellationToken: cancellationToken);
  1219. }
  1220. else
  1221. await _knowledgeRawDataRepository.AddAsync(raw, cancellationToken: cancellationToken);
  1222. #endregion
  1223. //知识附件处理
  1224. await FileDataAsync(dto.FileJson, dto.UID, data.CliengGuid, EMaterialType.Knowledge, data.AreaCode, cancellationToken);
  1225. }
  1226. /// <summary>
  1227. /// 知识库下架---1
  1228. /// </summary>
  1229. /// <param name="dto"></param>
  1230. /// <returns></returns>
  1231. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineKnowledgeRemove)]
  1232. public async Task GetKnowledgeInfoAbandonAsync(KnowledgeSendDto dto, CancellationToken cancellationToken)
  1233. {
  1234. var validator = new KnowledgeInfoAbandonValidator();
  1235. var validResult = await validator.ValidateAsync(dto, cancellationToken);
  1236. if (!validResult.IsValid)
  1237. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1238. var data = _mapper.Map<GetKnowledgeInfoAbandonInfo>(dto);
  1239. data.AreaCode = _sharingConfigurationManager.GetCityCode();
  1240. data.CategoryCode = "01";
  1241. data.CategoryName = "公共服务";
  1242. #region 处理请求参数
  1243. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1244. var request = new ProvinceRequest<GetKnowledgeInfoAbandonInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1245. request.SetData(data);
  1246. var jsonData = request.ToString();
  1247. var url = configProvince.HuiJu + "get_knowledge_info_abandon";
  1248. #endregion
  1249. //将待推送数据写入待推送表
  1250. await InitPushDataAsync("GetKnowledgeInfoAbandon", "get_knowledge_info_abandon", jsonData, data.UID, pathType: EPathType.HuiJu, GenerationTime: dto.CreatDate, cancellationToken: cancellationToken);
  1251. //知识下架删除原有原始数据
  1252. await _knowledgeRawDataRepository.RemoveAsync(p => p.UID == data.UID, cancellationToken: cancellationToken);
  1253. }
  1254. #endregion
  1255. /// <summary>
  1256. /// 实时服务上报
  1257. /// </summary>
  1258. /// <param name="dto"></param>
  1259. /// <returns></returns>
  1260. public async Task SendRealTimeStatusAsync(SendRealTimeStatusInfo dto, CancellationToken cancellationToken)
  1261. {
  1262. dto.AreaCode = _sharingConfigurationManager.GetCityCode();
  1263. #region 处理请求参数
  1264. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1265. var request = new ProvinceRequest<SendRealTimeStatusInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1266. request.SetData(dto);
  1267. var jsonData = request.ToString();
  1268. var url = configProvince.HuiJu + "sendrealtimestatus";
  1269. #endregion
  1270. await InitPushDataAsync("SendRealTimeStatus", "sendrealtimestatus", jsonData, "", pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  1271. }
  1272. #endregion
  1273. #region 私有方法
  1274. #region 省数据处理
  1275. /// <summary>
  1276. /// 热线工单办理---服务工单处理/服务工单交办处理过程-
  1277. /// </summary>
  1278. /// <param name="dto"></param>
  1279. /// <param name="cancellationToken"></param>
  1280. /// <returns></returns>
  1281. private async Task SubmitCaseProcessFlowAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  1282. {
  1283. //判断是否是热线中心
  1284. if (!string.IsNullOrEmpty(dto.Order.ActualHandleOrgCode) && dto.Order.ActualHandleOrgCode == "001")
  1285. dto.Order.ActualHandleOrgName = "热线中心";
  1286. #region 写本地办理数据-用于查询办理流程
  1287. //写本地办理数据-用于查询办理流程
  1288. var orderWorkFlow = _mapper.Map<DsOrderWorkFlow>(dto.WorkflowTrace);
  1289. orderWorkFlow.OrderId = dto.Order.Id;
  1290. await _dataOrderWorkFlowRepository.AddAsync(orderWorkFlow, cancellationToken);
  1291. #endregion
  1292. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1293. ///如果是省上派下来的,直接将区域设置为宜宾市
  1294. if (dto.Order.Source == ESource.ProvinceStraight)
  1295. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  1296. //省上下来的工单走协同的接口
  1297. if (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince)
  1298. {
  1299. var data = _mapper.Map<GetCaseProcessReceiveInfo>(dto);
  1300. data.TacheName = "70:" + data.DeptName;
  1301. var validator = new GetCaseProcessReceiveInfoValidator();
  1302. var validResult = await validator.ValidateAsync(data, cancellationToken);
  1303. if (!validResult.IsValid)
  1304. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1305. #region 处理请求参数
  1306. var request = new ProvinceRequest<GetCaseProcessReceiveInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1307. request.SetData(data);
  1308. var jsonData = request.ToString();
  1309. var url = configProvince.XieTong + "get_case_process_receive";
  1310. #endregion
  1311. //将待推送数据写入待推送表
  1312. await InitPushDataAsync("GetCaseProcessReceive", "get_case_process_receive", jsonData, data.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  1313. //处理附件
  1314. await FileDataAsync(dto.WorkflowTrace.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
  1315. }
  1316. else //如果不是省上派下来的工单
  1317. {
  1318. //本地工单走市州接口
  1319. var data = _mapper.Map<SubmitCaseProcessInfo>(dto);
  1320. data.TacheName = "70:" + data.DeptName;
  1321. var validator = new SubmitCaseProcessInfoValidator();
  1322. var validResult = await validator.ValidateAsync(data, cancellationToken);
  1323. if (!validResult.IsValid)
  1324. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1325. #region 处理请求参数
  1326. var requestSubmitCaseProcessInfo = new ProvinceListRequest<SubmitCaseProcessInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1327. requestSubmitCaseProcessInfo.SetData(new List<SubmitCaseProcessInfo>() { data });
  1328. var jsonDataSubmitCaseProcessInfo = requestSubmitCaseProcessInfo.ToString();
  1329. var urlSubmitCaseProcessInfo = configProvince.HuiJu + "submit_case_process";
  1330. #endregion
  1331. //将待推送数据写入待推送表
  1332. await InitPushDataAsync("SubmitCaseProcess", "submit_case_process", jsonDataSubmitCaseProcessInfo, data.CaseSerial, pathType: EPathType.HuiJu, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  1333. //处理附件
  1334. await FileDataAsync(dto.WorkflowTrace.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
  1335. }
  1336. //这里判断是否需要往其他平台推送数据
  1337. await OrderDispatchAsync(dto, cancellationToken);
  1338. }
  1339. /// <summary>
  1340. /// 派单是判断需要往第三方推送数据
  1341. /// </summary>
  1342. /// <param name="dto"></param>
  1343. /// <returns></returns>
  1344. private async Task OrderDispatchAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  1345. {
  1346. if (dto.WorkflowTrace.NextHandlers != null && dto.WorkflowTrace.NextHandlers.Count > 0)
  1347. {
  1348. foreach (var item in dto.WorkflowTrace.NextHandlers)
  1349. {
  1350. if (!string.IsNullOrEmpty(item.Key))
  1351. {
  1352. //todo 判断不同地市业务逻辑
  1353. //处理宜宾的推送业务
  1354. if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
  1355. {
  1356. //需要判断是否需要往110推送
  1357. if (item.Key == "001180")
  1358. //写入110本地数据库
  1359. await InitPoliceSendChainAlarmDsAsync(dto.Order, cancellationToken);
  1360. //需要判断是否需要往企业专班提交数据
  1361. if (item.Key == "001181")
  1362. //企业专班提交数据
  1363. await InitEnterpriseDataAsync(dto.Order, cancellationToken);
  1364. //是否向省上派单
  1365. if (item.Key == "001171" || item.Key == "001178")
  1366. await SendCaseInfoDataAsync(dto.Order, cancellationToken);
  1367. //综治平台
  1368. if (item.Key == "001143")
  1369. await InitZzptPlatformsAsync(dto.Order, cancellationToken);
  1370. }
  1371. //处理自贡的推送业务
  1372. if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
  1373. {
  1374. }
  1375. }
  1376. }
  1377. }
  1378. }
  1379. /// <summary>
  1380. /// 服务工单回访评价/服务工单交办评价
  1381. /// </summary>
  1382. /// <param name="dto"></param>
  1383. /// <param name="cancellationToken"></param>
  1384. /// <returns></returns>
  1385. private async Task SubmitVisitInfoDataAsync(PublishVisitDto dto, CancellationToken cancellationToken)
  1386. {
  1387. if (string.IsNullOrEmpty(dto.Order.AreaCode) || dto.Order.AreaCode.Contains("519"))
  1388. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  1389. dto.AreaCode = dto.Order.AreaCode.Length > 6 ? dto.Order.AreaCode.Substring(0, 6) : dto.Order.AreaCode;
  1390. //存在更新,不存在新增
  1391. var visitData = await _dsOrderVisitSendRepository.GetAsync(p => p.OrderId == dto.Order.Id, cancellationToken);
  1392. if (visitData != null)
  1393. {
  1394. visitData.VisitType = dto.VisitType.ToString();
  1395. visitData.VisitName = dto.VisitName;
  1396. visitData.VisitTime = dto.VisitTime;
  1397. visitData.VisitRemark = dto.VisitRemark;
  1398. visitData.SubjectResultSatifyCode = dto.SubjectResultSatifyCode;
  1399. await _dsOrderVisitSendRepository.UpdateAsync(visitData, cancellationToken);
  1400. }
  1401. else
  1402. {
  1403. ///写入推送数据表,用于统计满意度
  1404. visitData = new()
  1405. {
  1406. OrderId = dto.Order.Id,
  1407. OrderNo = dto.No,
  1408. ProvinceNo = dto.Order.ProvinceNo,
  1409. VisitType = dto.VisitType.ToString(),
  1410. VisitName = dto.VisitName,
  1411. VisitTime = dto.VisitTime,
  1412. VisitRemark = dto.VisitRemark,
  1413. SubjectResultSatifyCode = dto.SubjectResultSatifyCode,
  1414. IsProvince = dto.Order.IsProvince,
  1415. Source = dto.Order.Source.ToString()
  1416. };
  1417. await _dsOrderVisitSendRepository.AddAsync(visitData, cancellationToken);
  1418. }
  1419. #region 修改工单基础数据为已评价
  1420. ////修改工单基础数据为已评价
  1421. //var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Order.Id, cancellationToken);
  1422. //if (dataOrder != null)
  1423. //{
  1424. // dataOrder.VisitTypeState = EVisitTypeState.Reviewed;
  1425. // await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
  1426. //}
  1427. #endregion
  1428. var visitType = dto.VisitType switch
  1429. {
  1430. EVisitType.ArtificialVisit => "DH",
  1431. EVisitType.SmsVisit => "DX",
  1432. EVisitType.WebVisit => "WZ",
  1433. EVisitType.WeChatVisit => "WX",
  1434. EVisitType.AppVisit => "AP",
  1435. _ => "DH",
  1436. };
  1437. //将未接通未做评价的默认为满意
  1438. switch (dto.SubjectResultSatifyCode)
  1439. {
  1440. case "5":
  1441. case "4":
  1442. case "2":
  1443. break;
  1444. case "-1":
  1445. case "0":
  1446. dto.SubjectResultSatifyCode = "4";
  1447. break;
  1448. case "6":
  1449. case "7":
  1450. dto.SubjectResultSatifyCode = "3";
  1451. break;
  1452. default:
  1453. dto.SubjectResultSatifyCode = "3";
  1454. break;
  1455. }
  1456. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1457. //如果省上下来的工单走服务工单交办评价接口,不是省上派下来的工单,走服务工单评价接口
  1458. if (dto.Order.IsProvince && dto.Order.Source == ESource.ProvinceStraight)
  1459. {
  1460. var data = _mapper.Map<GetVisitInfoReceiveInfo>(dto);
  1461. data.VisitType = visitType;
  1462. data.CliengGuid = Guid.NewGuid().ToString();
  1463. var validator = new GetVisitInfoReceiveInfoValidator();
  1464. var validResult = await validator.ValidateAsync(data, cancellationToken);
  1465. if (!validResult.IsValid)
  1466. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1467. #region 处理请求参数
  1468. var request = new ProvinceRequest<GetVisitInfoReceiveInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1469. request.SetData(data);
  1470. var jsonData = request.ToString();
  1471. var url = configProvince.XieTong + "get_visit_info_receive";
  1472. #endregion
  1473. //将待推送数据写入待推送表
  1474. await InitPushDataAsync("GetVisitInfoReceive", "get_visit_info_receive", jsonData, data.CaseSerial, pathType: EPathType.XieTong, taskPriority: 5, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  1475. //处理附件
  1476. await FileDataAsync(null, data.CaseSerial, data.CliengGuid, EMaterialType.Visit, data.AreaCode, cancellationToken);
  1477. }
  1478. else
  1479. {
  1480. var data = _mapper.Map<SubmitVisitInfo>(dto);
  1481. data.VisitType = visitType;
  1482. data.CliengGuid = Guid.NewGuid().ToString();
  1483. var validator = new SubmitVisitInfoValidator();
  1484. var validResult = await validator.ValidateAsync(data, cancellationToken);
  1485. if (!validResult.IsValid)
  1486. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1487. #region 处理请求参数
  1488. var request = new ProvinceListRequest<SubmitVisitInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1489. request.SetData(new List<SubmitVisitInfo>() { data });
  1490. var jsonData = request.ToString();
  1491. var url = configProvince.HuiJu + "submit_visit_info";
  1492. #endregion
  1493. //将待推送数据写入待推送表
  1494. await InitPushDataAsync("SubmitVisitInfo", "submit_visit_info", jsonData, data.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 5, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  1495. //处理附件
  1496. await FileDataAsync(null, data.CaseSerial, data.CliengGuid, EMaterialType.Visit, data.AreaCode, cancellationToken);
  1497. //组装处理110数据
  1498. if (dto.Order.Source == ESource.Police110)
  1499. {
  1500. var VisitResult = dto.SubjectResultSatifyCode switch
  1501. {
  1502. "2" => "3",
  1503. "4" or "5" => "1",
  1504. _ => "2",
  1505. };
  1506. var checkData = await _policeSendChainDealDsRepository.GetAsync(p => p.AlarmReceiptNumber == dto.Order.ExternalId && p.DisposalType == (int)EDsDisposalType.Visit, cancellationToken);
  1507. if (checkData == null)
  1508. {
  1509. checkData = new()
  1510. {
  1511. AlarmReceiptNumber = dto?.Order?.ExternalId,
  1512. RevisitTime = dto.VisitTime,
  1513. CheckingContent = dto.VisitRemark,
  1514. VisitContent = dto.VisitRemark,
  1515. VisitResult = VisitResult,
  1516. DisposalType = 3
  1517. };
  1518. await _policeSendChainDealDsRepository.AddAsync(checkData, cancellationToken);
  1519. }
  1520. else
  1521. {
  1522. checkData.AlarmReceiptNumber = dto?.Order?.ExternalId;
  1523. checkData.RevisitTime = dto.VisitTime;
  1524. checkData.CheckingContent = dto.VisitRemark;
  1525. checkData.VisitContent = dto.VisitRemark;
  1526. checkData.VisitResult = VisitResult;
  1527. await _policeSendChainDealDsRepository.UpdateAsync(checkData, cancellationToken);
  1528. }
  1529. }
  1530. }
  1531. }
  1532. /// <summary>
  1533. /// 服务工单结果
  1534. /// </summary>
  1535. /// <param name="dto"></param>
  1536. /// <returns></returns>
  1537. private async Task SubmitCaseResultAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  1538. {
  1539. ///如果是省上派下来的,直接将区域设置为宜宾市
  1540. if (dto.Order.Source == ESource.ProvinceStraight)
  1541. dto.Order.AreaCode = _sharingConfigurationManager.GetCityCode();
  1542. var data = _mapper.Map<SubmitCaseResultInfo>(dto);
  1543. data.ConcactType = "40";
  1544. data.FinishType = "1";
  1545. data.HandleTimeLong = (int)dto.Order.AllDuration;
  1546. data.CliengGuid = Guid.NewGuid().ToString();
  1547. //宜宾工单不超期,如果在推送省上数据时,实际办理时间大于过期时间,则将办理时间改成过期时间减2个小时
  1548. if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
  1549. {
  1550. if (dto.Order.ExpiredTime < dto.Order.ActualHandleTime)
  1551. {
  1552. var finishTime = dto.Order.ExpiredTime.Value.AddHours(-2);
  1553. data.FinishTime = finishTime;
  1554. data.FdBackTime = finishTime;
  1555. }
  1556. }
  1557. var validator = new SubmitCaseResultInfoValidator();
  1558. var validResult = await validator.ValidateAsync(data, cancellationToken);
  1559. if (!validResult.IsValid)
  1560. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1561. #region 处理请求参数
  1562. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1563. var request = new ProvinceListRequest<SubmitCaseResultInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1564. request.SetData(new List<SubmitCaseResultInfo>() { data });
  1565. var jsonData = request.ToString();
  1566. var url = configProvince.HuiJu + "submit_case_result";
  1567. #endregion
  1568. //将待推送数据写入待推送表
  1569. await InitPushDataAsync("SubmitCaseResult", "submit_case_result", jsonData, data.CaseSerial, pathType: EPathType.HuiJu, GenerationTime: dto.Order.StartTime, cancellationToken: cancellationToken);
  1570. //处理附件
  1571. if (dto.WorkflowTrace != null && dto.WorkflowTrace.FileJson != null && dto.WorkflowTrace.FileJson.Count > 0)
  1572. await FileDataAsync(dto.WorkflowTrace.FileJson, data.CaseSerial, data.CliengGuid, EMaterialType.Result, dto.Order.AreaCode, cancellationToken);
  1573. //处理宜宾的推送业务
  1574. if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
  1575. {
  1576. //判断如果是110过来的数据,就组装数据
  1577. //组装110
  1578. if (dto.Order.Source == ESource.Police110 && dto.IsNonPoliceReturn == false)
  1579. {
  1580. await InitPoliceSendChainDealDsAsync(dto, cancellationToken);
  1581. }
  1582. //综治平台推送办理结果
  1583. if (dto.Order.Source == ESource.ZZPT)
  1584. {
  1585. await InitZzptPlatformsDetailAsync(dto, cancellationToken);
  1586. }
  1587. }
  1588. //处理自贡的推送业务
  1589. if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
  1590. {
  1591. }
  1592. }
  1593. /// <summary>
  1594. /// 工单创建数据处理
  1595. /// </summary>
  1596. /// <param name="dto"></param>
  1597. /// <returns></returns>
  1598. private SubmitCaseInfo InitDataAsync(OrderDto dto)
  1599. {
  1600. var submitCaseInfo = _mapper.Map<SubmitCaseInfo>(dto);
  1601. //处理性别
  1602. submitCaseInfo.AppLicantSex = dto.FromGender switch
  1603. {
  1604. EGender.Female => "0",
  1605. EGender.Male => "1",
  1606. EGender.Unknown => "2",
  1607. _ => "2",
  1608. };
  1609. //处理证件类型
  1610. submitCaseInfo.CertifiCateType = dto.LicenceTypeCode switch
  1611. {
  1612. "10" => "10",
  1613. "40" => "20",
  1614. "55" => "30",
  1615. "57" => "40",
  1616. _ => "50",
  1617. };
  1618. //处理紧急程度
  1619. submitCaseInfo.CaseIsUrgent = dto.EmergencyLevel switch
  1620. {
  1621. EEmergencyLevel.QuiteEmergency => "10",
  1622. EEmergencyLevel.Emergency => "20",
  1623. _ => "30",
  1624. };
  1625. //处理诉求类型
  1626. switch (submitCaseInfo.CaseType)
  1627. {
  1628. case "10":
  1629. case "15":
  1630. case "20":
  1631. case "25":
  1632. case "30":
  1633. case "35":
  1634. break;
  1635. default:
  1636. submitCaseInfo.CaseType = "40";
  1637. break;
  1638. }
  1639. submitCaseInfo.CaseValid = "1";
  1640. submitCaseInfo.CaseIsPublic = string.IsNullOrEmpty(submitCaseInfo.CaseIsPublic) == true ? "0" : submitCaseInfo.CaseIsPublic;
  1641. submitCaseInfo.ThemeSerial = "20";
  1642. if (dto.SourceChannelCode == "SZMHD" && dto.IsProvince == false && dto.Source == ESource.ProvinceStraight)
  1643. submitCaseInfo.TrowGuid = "【政民互动直派】";
  1644. switch (dto.SourceChannelCode.ToUpper())
  1645. {
  1646. case "RGDH":
  1647. case "WX":
  1648. case "WB":
  1649. case "AP":
  1650. case "WZ":
  1651. case "YJ":
  1652. case "SCZWFWW":
  1653. case "XCX":
  1654. break;
  1655. default:
  1656. submitCaseInfo.CaseSource = "QT";
  1657. break;
  1658. }
  1659. return submitCaseInfo;
  1660. }
  1661. /// <summary>
  1662. /// 服务工单拓展信息
  1663. /// </summary>
  1664. /// <param name="dto"></param>
  1665. /// <returns></returns>
  1666. private async Task SubmitCaseExtendsAsync(OrderDto dto, CancellationToken cancellationToken)
  1667. {
  1668. var orderExtension = dto.OrderExtension;
  1669. if (orderExtension is null)
  1670. return;
  1671. //工单类型
  1672. string formType = orderExtension.OrderTypeCode;
  1673. //处理为统一的市场监管表单
  1674. if (formType == "scjgjts" || formType == "scjgjjb")
  1675. formType = "scjgj";
  1676. DataSharing.Share.Dtos.Province.HuiJu.SubmitCaseExtendsInfo submitCaseExtendsInfo = new()
  1677. {
  1678. CaseSerial = dto.ProvinceNo,
  1679. FormType = formType
  1680. };
  1681. //处理扩展信息
  1682. switch (formType.ToLower())
  1683. {
  1684. case "yl"://医疗表单
  1685. //转换数据
  1686. submitCaseExtendsInfo.FormMedical = _mapper.Map<FormMedicalInfo>(orderExtension);
  1687. break;
  1688. case "zwfw"://四川政务服务网技术工单
  1689. submitCaseExtendsInfo.FormNetWorktec = _mapper.Map<FormNetWorktecInfo>(orderExtension);
  1690. break;
  1691. case "th"://电视购物及商铺购买退换货工单
  1692. submitCaseExtendsInfo.FormReturnexChange = _mapper.Map<FormReturnexChangeInfo>(orderExtension);
  1693. break;
  1694. case "gsgl"://高速公路工单
  1695. submitCaseExtendsInfo.FormExpressWay = _mapper.Map<FormExpressWayInfo>(orderExtension);
  1696. break;
  1697. case "xjgg"://电视台虚假广告工单
  1698. submitCaseExtendsInfo.FormShamPub = _mapper.Map<FormShamPubInfo>(orderExtension);
  1699. break;
  1700. case "swfwsq"://12366热线诉求交办
  1701. submitCaseExtendsInfo.FormTaxationComplaint = _mapper.Map<FormTaxationComplaintInfo>(orderExtension);
  1702. break;
  1703. case "swfwzx"://12366热线咨询交办
  1704. submitCaseExtendsInfo.FormTaxationConsulting = _mapper.Map<FormTaxationConsultingInfo>(orderExtension);
  1705. break;
  1706. case "jtfwjd"://12328服务监督
  1707. submitCaseExtendsInfo.FormTraffic = _mapper.Map<FormTrafficInfo>(orderExtension);
  1708. break;
  1709. case "yzxf"://邮政业消费者申诉
  1710. submitCaseExtendsInfo.FormPost = _mapper.Map<FormPostInfo>(orderExtension);
  1711. break;
  1712. case "hbjb"://环保举报业务
  1713. submitCaseExtendsInfo.FormEnvironMent = _mapper.Map<FormEnvironMentInfo>(orderExtension);
  1714. break;
  1715. case "scjgj"://12315个性化表单
  1716. var formMarket = _mapper.Map<FormMarketInfo>(orderExtension);
  1717. //转换数据
  1718. switch (orderExtension.OrderTypeCode)
  1719. {
  1720. case "scjgjjb":
  1721. formMarket.Rqsttypy = "25";
  1722. break;
  1723. case "scjgjts":
  1724. formMarket.Rqsttypy = "20";
  1725. foreach (var item in orderExtension.ComplainTypes)
  1726. formMarket.AppealContent += item.Value + ",";
  1727. formMarket.AppealContent = formMarket.AppealContent.TrimEnd(',');
  1728. break;
  1729. default:
  1730. break;
  1731. }
  1732. formMarket.HandDepCode = dto.AcceptorOrgCode;
  1733. formMarket.HandDep = dto.AcceptorOrgName;
  1734. formMarket.Zxgh = dto.AcceptorStaffNo;
  1735. formMarket.AccregperId = dto.AcceptorId;
  1736. formMarket.AccregperName = dto.AcceptorName;
  1737. formMarket.RegTime = Convert.ToDateTime(dto.CreationTime);
  1738. formMarket.CmTime = dto.StartTime;
  1739. submitCaseExtendsInfo.FormMarket = formMarket;
  1740. break;
  1741. default:
  1742. break;
  1743. }
  1744. #region 处理请求参数
  1745. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1746. var request = new ProvinceRequest<DataSharing.Share.Dtos.Province.HuiJu.SubmitCaseExtendsInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1747. request.SetData(submitCaseExtendsInfo);
  1748. var jsonData = request.ToString();
  1749. var url = configProvince.HuiJu + "submit_case_extends";
  1750. #endregion
  1751. //将待推送数据写入待推送表
  1752. await InitPushDataAsync("SubmitCaseExtends", "submit_case_extends", jsonData, submitCaseExtendsInfo.CaseSerial, pathType: EPathType.HuiJu, GenerationTime: dto.StartTime, cancellationToken: cancellationToken);
  1753. }
  1754. /// <summary>
  1755. /// 往省上派单
  1756. /// </summary>
  1757. /// <param name="dto"></param>
  1758. /// <returns></returns>
  1759. private async Task SendCaseInfoDataAsync(OrderDto dto, CancellationToken cancellationToken)
  1760. {
  1761. //先上传拓展信息
  1762. if (dto.OrderExtension != null)
  1763. await SubmitCaseExtendsAsync(dto, cancellationToken);
  1764. //在处理工单信息
  1765. var sendCaseInfo = _mapper.Map<SendCaseInfo>(dto);
  1766. if (dto.OrderExtension != null)
  1767. sendCaseInfo.IsExtends = "1";
  1768. else
  1769. sendCaseInfo.IsExtends = "0";
  1770. #region 处理数据
  1771. //处理性别
  1772. switch (dto.FromGender)
  1773. {
  1774. case EGender.Female:
  1775. sendCaseInfo.AppLicantSex = "0";
  1776. break;
  1777. case EGender.Male:
  1778. sendCaseInfo.AppLicantSex = "1";
  1779. break;
  1780. case EGender.Unknown:
  1781. sendCaseInfo.AppLicantSex = "2";
  1782. break;
  1783. default:
  1784. sendCaseInfo.AppLicantSex = "2";
  1785. break;
  1786. }
  1787. //处理证件类型
  1788. sendCaseInfo.CertifiCateType = dto.LicenceTypeCode switch
  1789. {
  1790. "10" => "10",
  1791. "40" => "20",
  1792. "55" => "30",
  1793. "57" => "40",
  1794. _ => "50",
  1795. };
  1796. //处理紧急程度
  1797. sendCaseInfo.CaseIsUrgent = dto.EmergencyLevel switch
  1798. {
  1799. EEmergencyLevel.QuiteEmergency => "10",
  1800. EEmergencyLevel.Emergency => "20",
  1801. _ => "30",
  1802. };
  1803. //处理诉求类型
  1804. switch (sendCaseInfo.CaseType)
  1805. {
  1806. case "10":
  1807. case "15":
  1808. case "20":
  1809. case "25":
  1810. case "30":
  1811. case "35":
  1812. break;
  1813. default:
  1814. sendCaseInfo.CaseType = "40";
  1815. break;
  1816. }
  1817. #endregion
  1818. switch (dto.SourceChannelCode.ToUpper())
  1819. {
  1820. case "RGDH":
  1821. case "WX":
  1822. case "WB":
  1823. case "AP":
  1824. case "WZ":
  1825. case "YJ":
  1826. case "SCZWFWW":
  1827. case "XCX":
  1828. break;
  1829. default:
  1830. sendCaseInfo.CaseSource = "QT";
  1831. break;
  1832. }
  1833. sendCaseInfo.CaseSource = sendCaseInfo.CaseSource;
  1834. var sendCaseInfoData = _mapper.Map<DsSendCaseInfo>(sendCaseInfo);
  1835. sendCaseInfoData.OrderID = dto.Id;
  1836. sendCaseInfoData.No = dto.No;
  1837. await _sendCaseInfoRepository.AddAsync(sendCaseInfoData, cancellationToken);
  1838. #region 处理请求参数
  1839. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1840. var request = new ProvinceRequest<SendCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1841. request.SetData(sendCaseInfo);
  1842. var jsonData = request.ToString();
  1843. var url = configProvince.HuiJu + "send_case_info";
  1844. #endregion
  1845. //将待推送数据写入待推送表
  1846. await InitPushDataAsync("SendCaseInfo", "send_case_info", jsonData, sendCaseInfo.CaseSerial, pathType: EPathType.XieTong, GenerationTime: dto.StartTime, cancellationToken: cancellationToken);
  1847. //处理附件
  1848. await FileDataAsync(dto.FileJson, dto.ProvinceNo, sendCaseInfoData.CliengGuid, EMaterialType.Acceptance, sendCaseInfoData.AreaCode, cancellationToken);
  1849. }
  1850. /// <summary>
  1851. /// 附件处理
  1852. /// </summary>
  1853. /// <param name="fileJson">附件</param>
  1854. /// <param name="caseSerial">工单编号</param>
  1855. /// <param name="cliengGuid">附件ID</param>
  1856. /// <param name="materialType">附件类型 10:受理材料,20:环节材料,30:结果材料,40:回访评价材料,50:督办材料,60:知识库材料</param>
  1857. /// <param name="areaCode">区域ID</param>
  1858. /// <param name="cancellationToken"></param>
  1859. /// <returns></returns>
  1860. private async Task FileDataAsync(List<Hotline.Share.Dtos.File.FileJson> fileJson, string caseSerial, string cliengGuid, EMaterialType materialType, string areaCode, CancellationToken cancellationToken)
  1861. {
  1862. if (fileJson != null && fileJson.Count > 0)
  1863. {
  1864. //将受到的数据写入本地数据库
  1865. GetCaseMaterialInfoModel materialInfo = new()
  1866. {
  1867. CaseSerial = caseSerial,
  1868. CliengGuid = cliengGuid,
  1869. AreaCode = areaCode.Length > 6 ? areaCode.Substring(0, 6) : areaCode,
  1870. MaterialType = materialType switch
  1871. {
  1872. EMaterialType.Acceptance => "10",
  1873. EMaterialType.Process => "20",
  1874. EMaterialType.Result => "30",
  1875. EMaterialType.Visit => "40",
  1876. EMaterialType.Supervise => "50",
  1877. EMaterialType.Knowledge => "60",
  1878. _ => "20",
  1879. }
  1880. };
  1881. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1882. var request = new ProvinceRequest<GetCaseMaterialInfoModel>(configProvince.ClientId, configProvince.ClientSecret);
  1883. request.SetData(materialInfo);
  1884. var jsonData = request.ToString();
  1885. foreach (var item in fileJson)
  1886. {
  1887. List<FileJson> fileJsons = new() { _mapper.Map<FileJson>(item) };
  1888. //待推送数据写入待推送表
  1889. await InitPushDataAsync("GetCaseMaterialInfo", "get_case_material_info", jsonData, materialInfo.CaseSerial, pathType: EPathType.File, fileJson: fileJsons, cancellationToken: cancellationToken);
  1890. }
  1891. }
  1892. }
  1893. /// <summary>
  1894. /// 处理通话记录队列时间
  1895. /// </summary>
  1896. /// <param name="recordInfo"></param>
  1897. /// <returns></returns>
  1898. private void SetCallTime(SubmitCaseRecordInfo recordInfo)
  1899. {
  1900. // 电话进入顺序 进IVR时间→进队列时间→振铃时间→开始时间→结束时间
  1901. //进入IVR时间为空
  1902. if (recordInfo.InIvr == DateTime.MinValue)
  1903. {
  1904. if (recordInfo.InQueue == DateTime.MinValue)
  1905. {
  1906. if (recordInfo.CallStart == DateTime.MinValue)
  1907. {
  1908. recordInfo.CallStart = recordInfo.CallEnd.AddSeconds(-2);
  1909. }
  1910. recordInfo.InQueue = recordInfo.CallStart.AddSeconds(-2);
  1911. }
  1912. recordInfo.InIvr = recordInfo.InQueue.AddSeconds(-2);
  1913. }
  1914. //进入队列时间为空
  1915. if (recordInfo.InQueue == DateTime.MinValue)
  1916. {
  1917. if (recordInfo.InIvr == DateTime.MinValue)
  1918. {
  1919. if (recordInfo.CallStart == DateTime.MinValue)
  1920. {
  1921. recordInfo.CallStart = recordInfo.CallEnd.AddSeconds(-2);
  1922. }
  1923. recordInfo.InQueue = recordInfo.CallStart.AddSeconds(-2);
  1924. recordInfo.InIvr = recordInfo.InQueue.AddSeconds(-2);
  1925. }
  1926. else
  1927. recordInfo.InQueue = recordInfo.InIvr.AddSeconds(2);
  1928. }
  1929. //振铃时间为空
  1930. if (recordInfo.CallTime == DateTime.MinValue && recordInfo.CallStart != DateTime.MinValue)
  1931. recordInfo.CallTime = recordInfo.CallStart.AddSeconds(-2);
  1932. }
  1933. /// <summary>
  1934. /// 检查是否需要推送未接通话记录
  1935. /// </summary>
  1936. /// <param name="dto"></param>
  1937. /// <param name="cancellationToken"></param>
  1938. /// <returns></returns>
  1939. private async Task<bool> IsPublishMissedCall(TrCallDto dto, CancellationToken cancellationToken)
  1940. {
  1941. var key = MissedCallKey + DateTime.Now.ToString("yyyyMMdd");
  1942. int missedCallCount;
  1943. //获取系统配置
  1944. var configurationInformation = await _configurationInformationCache.GetAsync(ConstantSettings.ConfigurationInformationCacheKey, cancellationToken);
  1945. if (configurationInformation == null)
  1946. {
  1947. //获取配置信息
  1948. var provinceConfiguration = _channelConfigurationManager.GetConfigurationProvince();
  1949. missedCallCount = provinceConfiguration.MissedCallCount;
  1950. }
  1951. else
  1952. missedCallCount = configurationInformation.MissedCallCount;
  1953. var dataCache = await _missedCallModelCache.GetAsync(key, cancellationToken);
  1954. if (dataCache != null)
  1955. {
  1956. //如果存在值,检查是否已经达到推送最大值
  1957. if (!dataCache.IsMax && dataCache.DateTimeList.Count > 0)
  1958. {
  1959. //没有达到最大值
  1960. //检查第一条数据是否匹配当前推送时间
  1961. var list = dataCache.DateTimeList;
  1962. if (list[0] < dto.OverTime)
  1963. {
  1964. //处理数据
  1965. list.RemoveAt(0);
  1966. dataCache.DateTimeList = list;
  1967. //是否推送完成
  1968. if (list == null || list.Count == 0)
  1969. dataCache.IsMax = true;
  1970. //从新写入数据
  1971. await _missedCallModelCache.SetAsync(key, dataCache, TimeSpan.FromDays(1), cancellationToken);
  1972. return true;
  1973. }
  1974. }
  1975. }
  1976. else
  1977. {
  1978. #region 生成时间
  1979. //生成时间
  1980. List<DateTime> timeLists = new();
  1981. Random random = new((int)(DateTime.Now.Ticks));
  1982. for (int i = 0; i < missedCallCount; i++)
  1983. {
  1984. int hour = random.Next(2, 23);
  1985. int minute = random.Next(0, 60);
  1986. int second = random.Next(0, 60);
  1987. string tempStr = string.Format("{0} {1}:{2}:{3}", DateTime.Now.ToString("yyyy-MM-dd"), hour, minute, second);
  1988. DateTime rTime = Convert.ToDateTime(tempStr);
  1989. timeLists.Add(rTime);
  1990. }
  1991. timeLists.Sort();
  1992. #endregion
  1993. if (timeLists[0] < dto.OverTime)
  1994. //处理数据
  1995. timeLists.RemoveAt(0);
  1996. MissedCallModelDto missedCall = new()
  1997. {
  1998. DateTimeList = timeLists
  1999. };
  2000. if (timeLists == null || timeLists.Count == 0)
  2001. missedCall.IsMax = true;
  2002. await _missedCallModelCache.SetAsync(key, missedCall, TimeSpan.FromDays(1), cancellationToken);
  2003. return true;
  2004. }
  2005. return false;
  2006. }
  2007. /// <summary>
  2008. /// 初始化上传通话记录
  2009. /// </summary>
  2010. /// <param name="dto"></param>
  2011. /// <param name="ProvinceNo"></param>
  2012. /// <param name="cancellationToken"></param>
  2013. /// <returns></returns>
  2014. private async Task InitTelCallData(TrCallDto dto, string ProvinceNo, string taskId, CancellationToken cancellationToken)
  2015. {
  2016. var tellCall = await _dsTelCallRepository.GetAsync(p => p.CallId == dto.CallAccept, cancellationToken);
  2017. if (tellCall != null)
  2018. {
  2019. //修改
  2020. _mapper.Map(dto, tellCall);
  2021. tellCall.ProvinceNo = ProvinceNo;
  2022. tellCall.CallId = dto.CallAccept;
  2023. tellCall.TaskId = taskId;
  2024. await _dsTelCallRepository.UpdateAsync(tellCall, cancellationToken);
  2025. }
  2026. else
  2027. {
  2028. //新增
  2029. tellCall = new DsTelCall();
  2030. tellCall = _mapper.Map<DsTelCall>(dto);
  2031. tellCall.ProvinceNo = ProvinceNo;
  2032. tellCall.CallId = dto.CallAccept;
  2033. tellCall.TaskId = taskId;
  2034. await _dsTelCallRepository.AddAsync(tellCall, cancellationToken);
  2035. }
  2036. }
  2037. #endregion
  2038. #region 组装110数据------已提取
  2039. /// <summary>
  2040. /// 组装110数据,12345警情工单推送到110
  2041. /// </summary>
  2042. /// <param name="orderDto"></param>
  2043. /// <returns></returns>
  2044. private async Task InitPoliceSendChainAlarmDsAsync(OrderDto orderDto, CancellationToken cancellationToken)
  2045. {
  2046. var areaCodeDefu = _sharingConfigurationManager.GetCityCode();
  2047. DsPoliceSendChainAlarmDs policeSend = new()
  2048. {
  2049. SerialNumber = orderDto.ExternalId,
  2050. AlarmReceiptNumber = orderDto.ExternalId,
  2051. RegisterNo = orderDto.AcceptorStaffNo,
  2052. CallPoliceNumber = string.IsNullOrEmpty(orderDto.FromPhone) == true ? orderDto.Contact : orderDto.FromPhone,
  2053. CallPoliceName = orderDto.FromName,
  2054. PhoneNumber = orderDto.Contact,
  2055. CallPoliceContent = orderDto.Content,
  2056. PoliceTypeCode = "",
  2057. PoliceTypeName = "",
  2058. JurisdictionalUnitCode = "511500000000",
  2059. JurisdictionalUnitName = "宜宾市公安局",
  2060. JurisdictionalUnitNumber = "0831110",
  2061. AlarmReceivingUnitCode = "",
  2062. AlarmReceivingUnitName = "",
  2063. CallPoliceTime = Convert.ToDateTime(orderDto.CreationTime),
  2064. PushTime = DateTime.Now,
  2065. AlarmReceptionType = "0",
  2066. AreaCode = orderDto.AreaCode.Substring(0, 6),
  2067. CallPoliceAddress = orderDto.FullAddress,
  2068. OrderId = orderDto.Id
  2069. };
  2070. if (string.IsNullOrEmpty(policeSend.AlarmReceiptNumber))
  2071. {
  2072. policeSend.AlarmReceiptNumber = areaCodeDefu + orderDto.No + "12345";
  2073. policeSend.SerialNumber = areaCodeDefu + orderDto.No + "12345";
  2074. }
  2075. //修改外部唯一ID
  2076. var orderData = await _dsOrderRepository.GetAsync(p => p.OrderId == orderDto.Id, cancellationToken);
  2077. if (orderData != null)
  2078. {
  2079. orderData.ExternalId = policeSend.AlarmReceiptNumber;
  2080. await _dsOrderRepository.UpdateAsync(orderData, cancellationToken);
  2081. }
  2082. //查询是否有此工单,如果没有新增此工单
  2083. var data = await _policeSendChainAlarmDsRepository.GetAsync(p => p.OrderId == orderDto.Id, cancellationToken);
  2084. if (data == null)
  2085. await _policeSendChainAlarmDsRepository.AddAsync(policeSend, cancellationToken);
  2086. }
  2087. /// <summary>
  2088. /// 110的非警情工单获取办理信息
  2089. /// </summary>
  2090. /// <param name="dto"></param>
  2091. /// <returns></returns>
  2092. private async Task InitPoliceSendChainDealDsAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  2093. {
  2094. var data = await _policeSendChainDealDsRepository.GetAsync(p => p.OrderId == dto.Order.Id && p.DisposalType == (int)EDsDisposalType.OrderFiled, cancellationToken);
  2095. if (data == null)
  2096. {
  2097. data = new()
  2098. {
  2099. AlarmReceiptNumber = dto.Order.ExternalId,
  2100. FeedbackTime = dto.Order.ActualHandleTime,
  2101. DisposalSituation = dto.Order.ActualOpinion,
  2102. ResultDescription = dto.Order.ActualOpinion,
  2103. FeedbackPersonNumber = dto.Order.ActualHandlerId,
  2104. FeedbackPersonName = dto.Order.ActualHandlerName,
  2105. FeedbackUnitCode = dto.Order.ActualHandleOrgCode,
  2106. FeedbackUnitName = dto.Order.ActualHandleOrgName,
  2107. WarehousingTime = DateTime.Now,
  2108. DisposalType = 1,
  2109. OrderId = dto.Order.Id
  2110. };
  2111. await _policeSendChainDealDsRepository.AddAsync(data, cancellationToken);
  2112. }
  2113. else
  2114. {
  2115. data.AlarmReceiptNumber = dto.Order.ExternalId;
  2116. data.FeedbackTime = dto.Order.ActualHandleTime;
  2117. data.DisposalSituation = dto.Order.ActualOpinion;
  2118. data.ResultDescription = dto.Order.ActualOpinion;
  2119. data.FeedbackPersonNumber = dto.Order.ActualHandlerId;
  2120. data.FeedbackPersonName = dto.Order.ActualHandlerName;
  2121. data.FeedbackUnitCode = dto.Order.ActualHandleOrgCode;
  2122. data.FeedbackUnitName = dto.Order.ActualHandleOrgName;
  2123. data.WarehousingTime = DateTime.Now;
  2124. await _policeSendChainDealDsRepository.UpdateAsync(data, cancellationToken);
  2125. }
  2126. }
  2127. #endregion
  2128. #region 泸州市州数据提交------已提取
  2129. /// <summary>
  2130. /// 泸州市州数据提交
  2131. /// </summary>
  2132. /// <param name="dto"></param>
  2133. /// <param name="platformSource"></param>
  2134. /// <param name="cancellationToken"></param>
  2135. /// <returns></returns>
  2136. private async Task InitCityDataAsync(OrderDto dto, string platformSource, CancellationToken cancellationToken)
  2137. {
  2138. var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == platformSource && p.State == "1", cancellationToken);
  2139. if (userInfo is null)
  2140. return;
  2141. string source = userInfo.PlatformSourceName;
  2142. string secretKey = GetMD5(source + userInfo.AccountSecret);
  2143. var serverName = dto.IdentityType == EIdentityType.Enterprise ? "企业" : "市民";
  2144. Dictionary<string, string> dicParam = new()
  2145. {
  2146. { "Code", secretKey },
  2147. { "FSHCode", dto.No },
  2148. { "ServerName", HttpUtility.UrlEncode(serverName)},
  2149. { "PurTypeName",HttpUtility.UrlEncode(dto.AcceptType) },
  2150. { "ConTypeName",HttpUtility.UrlEncode( dto.HotspotSpliceName)},
  2151. { "Title", HttpUtility.UrlEncode(dto.Title)},
  2152. { "LinkName", HttpUtility.UrlEncode(dto.FromName)},
  2153. { "Gender",dto.FromGender switch
  2154. {
  2155. EGender.Female => "2",
  2156. EGender.Male => "1",
  2157. _ => "0",
  2158. }
  2159. },
  2160. { "Mobile", dto.Contact},
  2161. { "Mail","" },
  2162. { "Address", HttpUtility.UrlEncode( dto.FullAddress )},
  2163. { "Content", HttpUtility.UrlEncode(dto.Content)},
  2164. { "Source",HttpUtility.UrlEncode( source )}
  2165. };
  2166. var config = _sharingConfigurationManager.GetYiBinConfig().CityHandOver;
  2167. if (config == null)
  2168. return;
  2169. string path = "";
  2170. if (config.IsNew)
  2171. path = config.NewPushOrder;
  2172. else
  2173. path = config.PushOrder;
  2174. //写入待推送数据
  2175. await InitPushDataAsync(platformSource, path, System.Text.Json.JsonSerializer.Serialize(dicParam), dto.No, platformSource: EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
  2176. }
  2177. /// <summary>
  2178. /// 办理意见推送
  2179. /// </summary>
  2180. /// <param name="dto"></param>
  2181. /// <param name="cancellationToken"></param>
  2182. /// <returns></returns>
  2183. private async Task UndertakAdviceAsync(OrderDto dto, CancellationToken cancellationToken)
  2184. {
  2185. string areaCode = _sharingConfigurationManager.GetCityCode();
  2186. //判断推送市州
  2187. string platformSource = "";
  2188. switch (areaCode)
  2189. {
  2190. case "510500": //转泸州12345
  2191. platformSource = "CityDataExchangeLz";
  2192. break;
  2193. case "510300"://转自贡12345
  2194. platformSource = "CityDataExchangeZG";
  2195. break;
  2196. case "511500"://转宜宾12345
  2197. platformSource = "CityDataExchangeYB";
  2198. break;
  2199. case "511000"://转内江12345
  2200. platformSource = "CityDataExchangeNJ";
  2201. break;
  2202. default:
  2203. break;
  2204. }
  2205. var userInfoSend = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == platformSource && p.State == "1", cancellationToken);
  2206. if (userInfoSend is null)
  2207. return;
  2208. string source = userInfoSend.PlatformSourceName;
  2209. string secretKey = GetMD5(source + userInfoSend.AccountSecret);
  2210. var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == dto.Source.ToString() && p.State == "1", cancellationToken);
  2211. if (userInfo is null)
  2212. return;
  2213. Dictionary<string, object> dic = new()
  2214. {
  2215. { "Code", secretKey }, //请求Code
  2216. { "SCDRCode", dto.ExternalId }, //工单编号
  2217. { "UndertakAdvice", HttpUtility.UrlEncode(dto.ActualOpinion.Trim()) }, //承办意见
  2218. { "Source", HttpUtility.UrlEncode(source) } //来源
  2219. };
  2220. var config = _sharingConfigurationManager.GetYiBinConfig().CityHandOver;
  2221. if (config == null)
  2222. return;
  2223. string path = "";
  2224. if (config.IsNew)
  2225. path = config.NewPushOpinion;
  2226. else
  2227. path = config.PushOpinion;
  2228. //写入待推送数据
  2229. await InitPushDataAsync(userInfo.PlatformSource, path, System.Text.Json.JsonSerializer.Serialize(dic), dto.No, platformSource: EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
  2230. }
  2231. #endregion
  2232. #region 宜宾企业专班数据提交-----已提取
  2233. /// <summary>
  2234. /// 企业专班数据提交
  2235. /// </summary>
  2236. /// <param name="dto"></param>
  2237. /// <returns></returns>
  2238. private async Task InitEnterpriseDataAsync(OrderDto dto, CancellationToken cancellationToken)
  2239. {
  2240. var enterpriseData = _mapper.Map<PushWorkOrder>(dto);
  2241. var fileJson = _mapper.Map<List<FileJson>>(dto.FileJson);
  2242. //将待推送数据写入待推送表
  2243. await InitPushDataAsync("EnterprisePushWorkOrder", YbEnterpriseDefaults.PathEnterprisesWorkOrder, System.Text.Json.JsonSerializer.Serialize(enterpriseData), dto.ProvinceNo,
  2244. platformSource: EPlatformSource.Enterprise, fileJson: fileJson, cancellationToken: cancellationToken);
  2245. }
  2246. #endregion
  2247. #region 综治平台-----已提取
  2248. /// <summary>
  2249. /// 综治平台--推送工单信息
  2250. /// </summary>
  2251. /// <param name="dto"></param>
  2252. /// <returns></returns>
  2253. private async Task InitZzptPlatformsAsync(OrderDto dto, CancellationToken cancellationToken)
  2254. {
  2255. string fromGender = dto.FromGender switch
  2256. {
  2257. EGender.Female => "2",
  2258. EGender.Male => "1",
  2259. _ => "0",
  2260. };
  2261. string AcceptTypeCode = dto.AcceptTypeCode switch
  2262. {
  2263. "10" => "1",
  2264. "35" => "2",
  2265. "20" => "3",
  2266. "15" => "4",
  2267. "1" => "5",
  2268. _ => "6",
  2269. };
  2270. Dictionary<string, string> dicParam = new()
  2271. {
  2272. { "code", dto.No },
  2273. { "departmentNo", dto.AreaCode },
  2274. { "userName", dto.FromName },
  2275. { "gender", fromGender },
  2276. { "email", "" },
  2277. { "phome", dto.Contact },
  2278. { "address", dto.FullAddress },
  2279. { "type", AcceptTypeCode },
  2280. { "title", dto.Title },
  2281. { "content", dto.Content },
  2282. { "occurDate", Convert.ToDateTime(dto.CreationTime).ToString("yyyy-MM-dd HH:mm:ss") },
  2283. { "remark", "" }
  2284. };
  2285. //写入待推送数据
  2286. await InitPushDataAsync("InitZzptPlatformsAsync", YbEnterpriseDefaults.ZzptPlatformsSendOrder, System.Text.Json.JsonSerializer.Serialize(dicParam), dto.ProvinceNo, platformSource: EPlatformSource.ZZPT, cancellationToken: cancellationToken);
  2287. }
  2288. /// <summary>
  2289. /// 推送办理信息
  2290. /// </summary>
  2291. /// <param name="dto"></param>
  2292. /// <param name="cancellationToken"></param>
  2293. /// <returns></returns>
  2294. private async Task InitZzptPlatformsDetailAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  2295. {
  2296. Dictionary<string, string> dicParam = new()
  2297. {
  2298. { "code", dto.Order.ExternalId },
  2299. { "action", "9" },
  2300. { "user", dto.Order.ActualHandlerName },
  2301. { "date", dto.Order.ActualHandleTime == null ? "" : dto.Order.ActualHandleTime.Value.ToString("yyyy-MM-dd HH:mm:ss") },
  2302. { "result", dto.Order.ActualOpinion }
  2303. };
  2304. //写入待推送数据
  2305. await InitPushDataAsync("InitZzptPlatformsDetailAsync", YbEnterpriseDefaults.ZzptPlatformsSendHandle, System.Text.Json.JsonSerializer.Serialize(dicParam), dto.Order.ProvinceNo, platformSource: EPlatformSource.ZZPT, cancellationToken: cancellationToken);
  2306. }
  2307. #endregion
  2308. #region 初始化待推送数据------已提取
  2309. /// 初始化待推送数据
  2310. /// </summary>
  2311. /// <param name="taskType">任务类型</param>
  2312. /// <param name="path">请求地址</param>
  2313. /// <param name="request">请求参数</param>
  2314. /// <param name="ProvinceNo">省编号</param>
  2315. /// <param name="pathType"></param>
  2316. /// <param name="cancellationToken"></param>
  2317. /// <param name="httpMethod">请求方式</param>
  2318. /// <param name="platformSource">推送平台</param>
  2319. /// <param name="taskPriority">任务优先级(0:最低级别)</param>
  2320. /// <param name="fileJson">附件</param>
  2321. /// <returns></returns>
  2322. private async Task<string> InitPushDataAsync(string taskType, string path, string request, string ProvinceNo,
  2323. string httpMethod = "Post",
  2324. EPlatformSource platformSource = EPlatformSource.Province,
  2325. EPathType pathType = EPathType.Other,
  2326. int taskPriority = 0,
  2327. DateTime? GenerationTime = null,
  2328. List<FileJson>? fileJson = null,
  2329. CancellationToken cancellationToken = default)
  2330. {
  2331. //组装参数
  2332. DsSendTask dsSendTask = new()
  2333. {
  2334. ProvinceNo = ProvinceNo,
  2335. TaskPriority = taskPriority,
  2336. TaskType = taskType,
  2337. HttpMethod = httpMethod,
  2338. Path = path,
  2339. PlatformSource = platformSource,
  2340. FileJson = fileJson,
  2341. Request = request,
  2342. GenerationTime = GenerationTime,
  2343. PathType = pathType
  2344. };
  2345. return await _dsSendTaskRepository.AddAsync(dsSendTask, cancellationToken);
  2346. }
  2347. #endregion
  2348. #region MD5 32位加密
  2349. /// <summary>
  2350. /// MD5 32位加密
  2351. /// </summary>
  2352. /// <param name="myString"></param>
  2353. /// <returns></returns>
  2354. private static string GetMD5(string myString)
  2355. {
  2356. string cl = myString;
  2357. string pwd = "";
  2358. try
  2359. {
  2360. //实例化一个md5对像
  2361. MD5 md5 = MD5.Create();
  2362. // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 
  2363. byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
  2364. // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
  2365. for (int i = 0; i < s.Length; i++)
  2366. {
  2367. // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
  2368. pwd = pwd + s[i].ToString("X2");
  2369. }
  2370. }
  2371. catch (Exception)
  2372. {
  2373. }
  2374. return pwd;
  2375. }
  2376. #endregion
  2377. #endregion
  2378. }
  2379. }