ProvinceReceiver.cs 94 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013
  1. using DataSharing.Application.Validators;
  2. using DataSharing.DaoShu110;
  3. using DataSharing.Province;
  4. using DataSharing.RawData;
  5. using DataSharing.SendTask;
  6. using DataSharing.Share.Dtos;
  7. using DataSharing.Share.Dtos.Enterprise;
  8. using DataSharing.Share.Dtos.Province;
  9. using DataSharing.Share.Dtos.Province.Extend;
  10. using DataSharing.Share.Dtos.Province.HuiJu;
  11. using DataSharing.Share.Dtos.Province.XieTong.Knowledge;
  12. using DataSharing.Share.Dtos.Province.XieTong.Receive;
  13. using DataSharing.Share.Dtos.Province.XieTong.Send;
  14. using DataSharing.Share.Enums;
  15. using DataSharing.WebPortal;
  16. using DotNetCore.CAP;
  17. using FluentValidation;
  18. using Hotline.Share.Dtos.Knowledge;
  19. using Hotline.Share.Dtos.Order;
  20. using Hotline.Share.Dtos.TrCallCenter;
  21. using Hotline.Share.Enums.CallCenter;
  22. using Hotline.Share.Enums.FlowEngine;
  23. using Hotline.Share.Enums.Order;
  24. using MapsterMapper;
  25. using Microsoft.Extensions.Logging;
  26. using System.Security.Cryptography;
  27. using System.Text;
  28. using XF.Domain.Cache;
  29. using XF.Domain.Dependency;
  30. using XF.Domain.Exceptions;
  31. using XF.Domain.Repository;
  32. using static System.Runtime.InteropServices.JavaScript.JSType;
  33. namespace DataSharing.Application.Receivers
  34. {
  35. public class ProvinceReceiver : ICapSubscribe, IScopeDependency
  36. {
  37. #region 注入
  38. private readonly IMapper _mapper;
  39. private readonly ILogger<ProvinceReceiver> _logger;
  40. private readonly IRepository<DsPoliceSendChainAlarmDs> _policeSendChainAlarmDsRepository;
  41. private readonly IRepository<DsPoliceSendChainDealDs> _policeSendChainDealDsRepository;
  42. private readonly IRepository<DsSendTask> _dsSendTaskRepository;
  43. private readonly IRepository<DsOrder> _dsOrderRepository;
  44. private readonly IRepository<DsOrderWorkFlow> _dataOrderWorkFlowRepository;
  45. private readonly IRepository<DsKnowledgeRawData> _knowledgeRawDataRepository;
  46. private readonly IChannelConfigurationManager _channelConfigurationManager;
  47. private readonly IRepository<DsSendCaseInfo> _sendCaseInfoRepository;
  48. private readonly ITypedCache<MissedCallModelDto> _missedCallModelCache;
  49. private readonly string MissedCallKey = "missedCallKey_";
  50. private readonly IRepository<DsOrderVisit> _dsOrderVisitRepository;
  51. private readonly IRepository<DsGetCaseBackApply> _getCaseBackApplyRepository;
  52. private readonly ICapPublisher _capPublisher;
  53. /// <summary>
  54. ///
  55. /// </summary>
  56. /// <param name="mapper"></param>
  57. /// <param name="logger"></param>
  58. /// <param name="policeSendChainAlarmDsRepository"></param>
  59. /// <param name="policeSendChainDealDsRepository"></param>
  60. /// <param name="dsSendTaskRepository"></param>
  61. /// <param name="dsOrderRepository"></param>
  62. /// <param name="dataOrderWorkFlowRepository"></param>
  63. /// <param name="knowledgeRawDataRepository"></param>
  64. /// <param name="channelConfigurationManager"></param>
  65. /// <param name="sendCaseInfoRepository"></param>
  66. /// <param name="missedCallModelCache"></param>
  67. /// <param name="dsOrderVisitRepository"></param>
  68. /// <param name="getCaseBackApplyRepository"></param>
  69. /// <param name="capPublisher"></param>
  70. public ProvinceReceiver(IMapper mapper, ILogger<ProvinceReceiver> logger,
  71. IRepository<DsPoliceSendChainAlarmDs> policeSendChainAlarmDsRepository,
  72. IRepository<DsPoliceSendChainDealDs> policeSendChainDealDsRepository,
  73. IRepository<DsSendTask> dsSendTaskRepository,
  74. IRepository<DsOrder> dsOrderRepository,
  75. IRepository<DsOrderWorkFlow> dataOrderWorkFlowRepository,
  76. IRepository<DsKnowledgeRawData> knowledgeRawDataRepository,
  77. IChannelConfigurationManager channelConfigurationManager,
  78. IRepository<DsSendCaseInfo> sendCaseInfoRepository,
  79. ITypedCache<MissedCallModelDto> missedCallModelCache,
  80. IRepository<DsOrderVisit> dsOrderVisitRepository,
  81. IRepository<DsGetCaseBackApply> getCaseBackApplyRepository,
  82. ICapPublisher capPublisher)
  83. {
  84. _mapper = mapper;
  85. _logger = logger;
  86. _policeSendChainAlarmDsRepository = policeSendChainAlarmDsRepository;
  87. _policeSendChainDealDsRepository = policeSendChainDealDsRepository;
  88. _dsSendTaskRepository = dsSendTaskRepository;
  89. _dsOrderRepository = dsOrderRepository;
  90. _dataOrderWorkFlowRepository = dataOrderWorkFlowRepository;
  91. _knowledgeRawDataRepository = knowledgeRawDataRepository;
  92. _channelConfigurationManager = channelConfigurationManager;
  93. _sendCaseInfoRepository = sendCaseInfoRepository;
  94. _missedCallModelCache = missedCallModelCache;
  95. _dsOrderVisitRepository = dsOrderVisitRepository;
  96. _getCaseBackApplyRepository = getCaseBackApplyRepository;
  97. _capPublisher = capPublisher;
  98. }
  99. #endregion
  100. #region 协同-第一批次
  101. /// <summary>
  102. /// 退回申请 --已对接---1
  103. /// </summary>
  104. /// <param name="dto"></param>
  105. /// <returns></returns>
  106. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFlowPrevious)]
  107. public async Task GetCaseBackApplyAsync(PublishOrderSendBackDto dtos, CancellationToken cancellationToken)
  108. {
  109. if (dtos != null && dtos.SendDatas != null)
  110. {
  111. foreach (var dto in dtos.SendDatas)
  112. {
  113. //处理110退回事件
  114. if (dto.Order.Source == ESource.Police110)
  115. {
  116. var checkData = await _policeSendChainDealDsRepository.AnyAsync(p => p.AlarmReceiptNumber == dto.Order.ExternalId && p.DisposalType == (int)EDsDisposalType.Return, cancellationToken);
  117. if (!checkData)
  118. {
  119. var data = new DsPoliceSendChainDealDs()
  120. {
  121. OrderId = dto.Order.Id,
  122. AlarmReceiptNumber = dto.Order.ExternalId,
  123. ReturnName = dto.SendBack.CreatorName,
  124. ReturnUnit = dto.SendBack.CreatorOrgName,
  125. ReturnOpinion = dto.SendBack.Content,
  126. ReturnTime = dto.SendBack.CreationTime,
  127. WarehousingTime = DateTime.Now,
  128. DisposalType = 2
  129. };
  130. var id = await _policeSendChainDealDsRepository.AddAsync(data, cancellationToken);
  131. if (!string.IsNullOrEmpty(id))//如果数据新增成功直接调用业务系统退回接口,反馈退回成功
  132. {
  133. var dataBack = new OrderSendBackResultDto()
  134. {
  135. Id = dto.SendBack.Id,
  136. Reason = "",
  137. Result = 1
  138. };
  139. //向业务系统推送消息
  140. await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReturnFeedback, dataBack, cancellationToken: cancellationToken);
  141. } // await _hotlineClient.OrderSendBackResultAsync(new() { Id = dto.SendBack.Id }, default);
  142. }
  143. }
  144. //处理省上的退回申请
  145. if (dto.Order.Source == ESource.ProvinceStraight)
  146. {
  147. var data = _mapper.Map<GetCaseBackApplyInfo>(dto);
  148. data.CliengGuid = dto.SendBack.Id;
  149. var tempData = _mapper.Map<DsGetCaseBackApply>(data);
  150. tempData.OrderSendBackId = dto.SendBack.Id;
  151. var backId = await _getCaseBackApplyRepository.AddAsync(tempData, cancellationToken);
  152. if (!string.IsNullOrEmpty(backId))
  153. {
  154. #region 处理请求参数
  155. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  156. var request = new ProvinceRequest<GetCaseBackApplyInfo>(configProvince.ClientId, configProvince.ClientSecret);
  157. request.SetData(data);
  158. var jsonData = request.ToString();
  159. var url = configProvince.XieTong + "get_case_back_apply";
  160. #endregion
  161. //将待推送数据写入待推送表
  162. await InitPushDataAsync("GetCaseBackApply", "get_case_back_apply", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  163. //处理附件
  164. await FileDataAsync(dto.SendBack.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken: cancellationToken);
  165. }
  166. }
  167. }
  168. }
  169. }
  170. /// <summary>
  171. /// 服务工单督办过程 --已对接-----1
  172. /// </summary>
  173. /// <param name="dto"></param>
  174. /// <returns></returns>
  175. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderSuperviseCourse)]
  176. public async Task SendSuperviseProcessInfoAsync(PublishSuperviseDto dto, CancellationToken cancellationToken)
  177. {
  178. //工单是省上派下来的,才能进行督办回复
  179. if (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince)
  180. {
  181. var data = _mapper.Map<SendSuperviseProcessInfo>(dto);
  182. #region 处理请求参数
  183. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  184. var request = new ProvinceRequest<SendSuperviseProcessInfo>(configProvince.ClientId, configProvince.ClientSecret);
  185. request.SetData(data);
  186. var jsonData = request.ToString();
  187. var url = configProvince.XieTong + "send_supervise_process_info";
  188. #endregion
  189. //将待推送数据写入待推送表
  190. await InitPushDataAsync("SendSuperviseProcessInfo", "send_supervise_process_info", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  191. }
  192. }
  193. /// <summary>
  194. /// 服务工单督办结果 --已对接----1
  195. /// </summary>
  196. /// <param name="dto"></param>
  197. /// <returns></returns>
  198. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderSuperviseResult)]
  199. public async Task SendSuperviseResultInfoAsync(PublishSuperviseDto dto, CancellationToken cancellationToken)
  200. {
  201. //工单是省上派下来的,才能进行督办回复
  202. if (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince)
  203. {
  204. var data = _mapper.Map<SendSuperviseResultInfo>(dto);
  205. data.CliengGuid = dto.Supervise.Id;
  206. #region 处理请求参数
  207. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  208. var request = new ProvinceRequest<SendSuperviseResultInfo>(configProvince.ClientId, configProvince.ClientSecret);
  209. request.SetData(data);
  210. var jsonData = request.ToString();
  211. var url = configProvince.XieTong + "send_supervise_result_info";
  212. #endregion
  213. //将待推送数据写入待推送表
  214. await InitPushDataAsync("SendSuperviseResultInfo", "send_supervise_result_info", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  215. //处理附件
  216. await FileDataAsync(dto.Supervise.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Supervise, dto.Order.AreaCode, cancellationToken);
  217. }
  218. }
  219. /// <summary>
  220. /// 工单发起甄别 --已对接---1
  221. /// </summary>
  222. /// <param name="dto"></param>
  223. /// <returns></returns>
  224. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderScreenApply)]
  225. public async Task ScreenCaseInfoSendAsync(PublishScreenDto dto, CancellationToken cancellationToken)
  226. {
  227. //如果是省上派下来的工单,才能调发起甄别的接口
  228. if (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince)
  229. {
  230. var data = _mapper.Map<ScreenCaseInfoSendInfo>(dto);
  231. data.CliengGuid = dto.Screen.Id;
  232. data.ApplyType = dto.Screen.TypeDicName switch
  233. {
  234. "违反法律法规" => "10",
  235. "按正常流程处理" => "20",
  236. _ => "30",
  237. };
  238. #region 处理请求参数
  239. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  240. var request = new ProvinceRequest<ScreenCaseInfoSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
  241. request.SetData(data);
  242. var jsonData = request.ToString();
  243. var url = configProvince.XieTong + "screen_case_info_send";
  244. #endregion
  245. //将待推送数据写入待推送表
  246. await InitPushDataAsync("ScreenCaseInfoSend", "screen_case_info_send", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  247. //处理附件
  248. await FileDataAsync(dto.Screen.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken: cancellationToken);
  249. }
  250. }
  251. /// <summary>
  252. /// 服务工单申请延时 --已对接---1
  253. /// </summary>
  254. /// <param name="dto"></param>
  255. /// <returns></returns>
  256. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderApplyDelay)]
  257. public async Task DelayCaseInfoSendAsync(PublishOrderDelayDto dto, CancellationToken cancellationToken)
  258. {
  259. var data = _mapper.Map<DelayCaseInfoSendInfo>(dto);
  260. data.CliengGuid = dto.Id;
  261. data.ApplyType = "1";
  262. #region 处理请求参数
  263. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  264. var request = new ProvinceRequest<DelayCaseInfoSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
  265. request.SetData(data);
  266. var jsonData = request.ToString();
  267. var url = configProvince.XieTong + "delay_case_info_send";
  268. #endregion
  269. //将待推送数据写入待推送表
  270. await InitPushDataAsync("DelayCaseInfoSend", "delay_case_info_send", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  271. //处理附件
  272. await FileDataAsync(dto.FileJson, data.CaseSerial, data.CliengGuid, EMaterialType.Process, data.AreaCode, cancellationToken);
  273. }
  274. #endregion
  275. #region 汇聚-第二批次
  276. /// <summary>
  277. /// 热线工单流程开启 --服务工单受理----1
  278. /// </summary>
  279. /// <param name="dto"></param>
  280. /// <returns></returns>
  281. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFlowStarted)]
  282. public async Task OrderFlowStartedAsync(PublishCallRecrodDto pushdto, CancellationToken cancellationToken)
  283. {
  284. var dto = pushdto.Order;
  285. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  286. //如果不是省上派下来的工单,需要汇聚到省上
  287. if (dto is not null && !dto.IsProvince)
  288. {
  289. var data = await InitDataAsync(dto, cancellationToken);
  290. var validator = new SubmitCaseInfoValidator();
  291. var validResult = await validator.ValidateAsync(data, cancellationToken);
  292. if (!validResult.IsValid)
  293. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  294. #region 处理请求参数
  295. var request = new ProvinceListRequest<SubmitCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  296. request.SetData(new List<SubmitCaseInfo>() { data });
  297. var jsonData = request.ToString();
  298. var url = configProvince.HuiJu + "submit_case_info";
  299. #endregion
  300. //将待推送数据写入待推送表
  301. await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonData, pathType: EPathType.HuiJu, taskPriority: 10, cancellationToken: cancellationToken);
  302. //处理附件
  303. await FileDataAsync(dto.FileJson, dto.ProvinceNo, data.CliengGuid, EMaterialType.Acceptance, data.AreaCode, cancellationToken);
  304. }
  305. //再次推送通话记录
  306. if (pushdto.TrCallRecordDto is not null)
  307. {
  308. var dataCall = _mapper.Map<SubmitCaseRecordInfo>(pushdto.TrCallRecordDto);
  309. dataCall.AreaCode = dto.AreaCode;
  310. dataCall.CaseSerial = dto.ProvinceNo;
  311. //处理通话记录时间
  312. SetCallTime(dataCall);
  313. var validator = new SubmitCaseRecordInfoValidator();
  314. var validResult = await validator.ValidateAsync(dataCall, cancellationToken);
  315. if (!validResult.IsValid)
  316. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  317. #region 处理请求参数
  318. var requestCall = new ProvinceListRequest<SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
  319. requestCall.SetData(new List<SubmitCaseRecordInfo>() { dataCall });
  320. var jsonDataCall = requestCall.ToString();
  321. var urlCall = configProvince.HuiJu + "submit_case_record";
  322. //将待推送数据写入待推送表
  323. await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", jsonDataCall, pathType: EPathType.HuiJu, taskPriority: 20, cancellationToken: cancellationToken);
  324. #endregion
  325. }
  326. //推送当前办理信息
  327. await SubmitCaseProcessFlowAsync(new OrderFlowDto { Order = pushdto.Order, WorkflowTrace = pushdto.WorkflowTrace, ExpiredTimeChanged = false }, cancellationToken);
  328. //本地保存工单基础数据
  329. if (!await _dsOrderRepository.AnyAsync(p => p.OrderId == dto.Id, cancellationToken))
  330. {
  331. DsOrder dataOrder = new()
  332. {
  333. OrderId = dto.Id,
  334. OrderNo = dto.No,
  335. ProvinceNo = dto.ProvinceNo,
  336. WorkflowId = dto.WorkflowId,
  337. Password = dto.Password,
  338. Title = dto.Title,
  339. FromName = dto.FromName,
  340. Contact = dto.Contact,
  341. Content = dto.Content,
  342. CaseDate = Convert.ToDateTime(dto.CreationTime),
  343. Source = dto.Source.ToString(),
  344. CaseSource = dto.SourceChannel,
  345. CaseSourceCode = dto.SourceChannelCode,
  346. HotspotId = dto.HotspotId,
  347. HotspotName = dto.HotspotName,
  348. HotspotSpliceName = dto.HotspotSpliceName,
  349. ExpiredTime = dto.ExpiredTime,
  350. CaseType = dto.AcceptType,
  351. CaseTypeCode = dto.AcceptTypeCode,
  352. AllDuration = 0,
  353. IsProvince = dto.IsProvince,
  354. HandleState = "办理中",
  355. FileJson = _mapper.Map<List<FileJson>>(dto.FileJson)
  356. };
  357. await _dsOrderRepository.AddAsync(dataOrder, cancellationToken);
  358. }
  359. }
  360. /// <summary>
  361. ///热线工单期满时间变更--推送服务工单受理---1
  362. /// </summary>
  363. /// <param name="dto"></param>
  364. /// <returns></returns>
  365. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate)]
  366. public async Task HotlineOrderFlowRecalledAsync(OrderDto dto, CancellationToken cancellationToken)
  367. {
  368. //如果不是省上派下来的工单,需要汇聚到省上
  369. if (!dto.IsProvince)
  370. {
  371. var data = await InitDataAsync(dto, cancellationToken);
  372. var validator = new SubmitCaseInfoValidator();
  373. var validResult = await validator.ValidateAsync(data, cancellationToken);
  374. if (!validResult.IsValid)
  375. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  376. #region 处理请求参数
  377. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  378. var request = new ProvinceListRequest<SubmitCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  379. request.SetData(new List<SubmitCaseInfo>() { data });
  380. var jsonData = request.ToString();
  381. var url = configProvince.HuiJu + "submit_case_info";
  382. #endregion
  383. //将待推送数据写入待推送表
  384. await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonData, pathType: EPathType.HuiJu, taskPriority: 10, cancellationToken: cancellationToken);
  385. }
  386. }
  387. /// <summary>
  388. /// 热线工单办理---服务工单处理/服务工单交办处理过程----1
  389. /// </summary>
  390. /// <param name="dto"></param>
  391. /// <returns></returns>
  392. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFlowHandled)]
  393. public async Task SubmitCaseProcessAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  394. {
  395. await SubmitCaseProcessFlowAsync(dto, cancellationToken);
  396. //期满时间变更或者办理节点为话务部,重新推送数据
  397. if (dto.ExpiredTimeChanged || dto.Order.ActualHandleStepName == "话务部")
  398. {
  399. var submitCaseInfo = await InitDataAsync(dto.Order, cancellationToken);
  400. var validator = new SubmitCaseInfoValidator();
  401. var validResult = await validator.ValidateAsync(submitCaseInfo, cancellationToken);
  402. if (!validResult.IsValid)
  403. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  404. #region 处理请求参数
  405. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  406. var requestSubmitCaseInfo = new ProvinceListRequest<SubmitCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  407. requestSubmitCaseInfo.SetData(new List<SubmitCaseInfo>() { submitCaseInfo });
  408. var jsonDataSubmitCaseInfo = requestSubmitCaseInfo.ToString();
  409. var urlSubmitCaseInfo = configProvince.HuiJu + "submit_case_info";
  410. #endregion
  411. //将待推送数据写入待推送表
  412. await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonDataSubmitCaseInfo, pathType: EPathType.HuiJu, taskPriority: 10, cancellationToken: cancellationToken);
  413. //如果话务部派出去,再次上传附件
  414. if (dto.Order.ActualHandleStepName == "话务部")
  415. {
  416. //处理附件
  417. await FileDataAsync(dto.Order.FileJson, dto.Order.ProvinceNo, submitCaseInfo.CliengGuid, EMaterialType.Acceptance, submitCaseInfo.AreaCode, cancellationToken);
  418. }
  419. }
  420. }
  421. /// <summary>
  422. /// 回访完成---服务工单回访评价/服务工单交办评价-----1
  423. /// </summary>
  424. /// <param name="dto"></param>
  425. /// <returns></returns>
  426. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderVisited)]
  427. public async Task SubmitVisitInfoAsync(PublishVisitDto dto, CancellationToken cancellationToken)
  428. {
  429. await SubmitVisitInfoDataAsync(dto, cancellationToken);
  430. }
  431. /// <summary>
  432. /// 甄别通过---服务工单回访评价//服务工单交办评价----1
  433. /// </summary>
  434. /// <param name="dto"></param>
  435. /// <returns></returns>
  436. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed)]
  437. public async Task SubmitOrderScreenSuccessAsync(PublishVisitDto dto, CancellationToken cancellationToken)
  438. {
  439. await SubmitVisitInfoDataAsync(dto, cancellationToken);
  440. }
  441. /// <summary>
  442. ///热线工单归档---服务工单结果/服务工单交办处理结果----1
  443. /// </summary>
  444. /// <param name="dto"></param>
  445. /// <returns></returns>
  446. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFiled)]
  447. public async Task OrderFiledAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  448. {
  449. //推送办理记录
  450. dto.ExpiredTimeChanged = false;
  451. await SubmitCaseProcessFlowAsync(dto, cancellationToken);
  452. //判断是否是热线中心
  453. if (!string.IsNullOrEmpty(dto.Order.ActualHandleOrgCode) && dto.Order.ActualHandleOrgCode == "001")
  454. dto.Order.ActualHandleOrgName = "热线中心";
  455. //IsProvince 如果是false 则推送服务工单受理
  456. if (dto != null && dto.Order != null && !dto.Order.IsProvince)
  457. {
  458. var data = await InitDataAsync(dto.Order, cancellationToken);
  459. var validator = new SubmitCaseInfoValidator();
  460. var validResult = await validator.ValidateAsync(data, cancellationToken);
  461. if (!validResult.IsValid)
  462. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  463. #region 处理请求参数
  464. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  465. var request = new ProvinceListRequest<SubmitCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  466. request.SetData(new List<SubmitCaseInfo>() { data });
  467. var jsonData = request.ToString();
  468. var url = configProvince.HuiJu + "submit_case_info";
  469. #endregion
  470. //将待推送数据写入待推送表
  471. await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonData, pathType: EPathType.HuiJu, taskPriority: 10, cancellationToken: cancellationToken);
  472. //推送服务工单结果信息-组装110数据
  473. await SubmitCaseResultAsync(dto, cancellationToken);
  474. }
  475. //修改工单基础数据
  476. var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Order.Id, cancellationToken);
  477. if (dataOrder != null)
  478. {
  479. dataOrder.HandleState = "办理完成";
  480. dataOrder.ActualHandleOrgName = dto.WorkflowTrace.HandlerOrgName;
  481. dataOrder.ActualHandleOrgCode = dto.WorkflowTrace.HandlerOrgAreaCode;
  482. dataOrder.ActualOpinion = dto.WorkflowTrace.Opinion;
  483. dataOrder.ActualHandleTime = dto.WorkflowTrace.HandleTime;
  484. await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
  485. }
  486. }
  487. /// <summary>
  488. /// 挂电话推送----电话记录---1List<CallConnectOrderDto> dtos
  489. /// </summary>
  490. /// <param name="dtos"></param>
  491. /// <returns></returns>
  492. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineCallBye)]
  493. public async Task SubmitCaseRecordAsync(PublishCallRecrodDto dto, CancellationToken cancellationToken)
  494. {
  495. //验证是否需要推送未接数据
  496. if (dto != null && dto.TrCallRecordDto != null && dto.TrCallRecordDto.OnState == EOnState.NoOn)
  497. {
  498. if (!await IsPublishMissedCall(dto.TrCallRecordDto, cancellationToken))
  499. return;
  500. }
  501. var data = _mapper.Map<SubmitCaseRecordInfo>(dto.TrCallRecordDto);
  502. if (dto.Order != null)
  503. {
  504. data.AreaCode = dto.Order.AreaCode;
  505. if (!string.IsNullOrEmpty(dto.Order.ProvinceNo))
  506. data.CaseSerial = dto.Order.ProvinceNo;
  507. }
  508. else
  509. data.AreaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
  510. //处理通话记录时间
  511. SetCallTime(data);
  512. var validator = new SubmitCaseRecordInfoValidator();
  513. var validResult = await validator.ValidateAsync(data, cancellationToken);
  514. if (!validResult.IsValid)
  515. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  516. #region 处理请求参数
  517. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  518. var request = new ProvinceListRequest<SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
  519. request.SetData(new List<SubmitCaseRecordInfo>() { data });
  520. var jsonData = request.ToString();
  521. var url = configProvince.HuiJu + "submit_case_record";
  522. #endregion
  523. //将待推送数据写入待推送表
  524. await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", jsonData, pathType: EPathType.HuiJu, taskPriority: 20, cancellationToken: cancellationToken);
  525. }
  526. /// <summary>
  527. /// 关联工单了推送----电话记录---1
  528. /// </summary>
  529. /// <param name="dto"></param>
  530. /// <returns></returns>
  531. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineCallConnectWithOrder)]
  532. public async Task SubmitCaseRecordOrderAsync(PublishCallRecrodDto dto, CancellationToken cancellationToken)
  533. {
  534. var data = _mapper.Map<SubmitCaseRecordInfo>(dto.TrCallRecordDto);
  535. if (dto.Order != null)
  536. {
  537. data.AreaCode = dto.Order.AreaCode;
  538. if (!string.IsNullOrEmpty(dto.Order.ProvinceNo))
  539. data.CaseSerial = dto.Order.ProvinceNo;
  540. }
  541. else
  542. data.AreaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
  543. //处理通话记录时间
  544. SetCallTime(data);
  545. var validator = new SubmitCaseRecordInfoValidator();
  546. var validResult = await validator.ValidateAsync(data, cancellationToken);
  547. if (!validResult.IsValid)
  548. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  549. #region 处理请求参数
  550. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  551. var request = new ProvinceListRequest<SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
  552. request.SetData(new List<SubmitCaseRecordInfo>() { data });
  553. var jsonData = request.ToString();
  554. var url = configProvince.HuiJu + "submit_case_record";
  555. #endregion
  556. //将待推送数据写入待推送表
  557. await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", jsonData, pathType: EPathType.HuiJu, taskPriority: 20, cancellationToken: cancellationToken);
  558. }
  559. /// <summary>
  560. /// 统计数据
  561. /// </summary>
  562. /// <param name="dto"></param>
  563. /// <returns></returns>
  564. public async Task SubmitCaseTotalAsync(SubmitCaseTotalInfo dto, CancellationToken cancellationToken)
  565. {
  566. #region 处理请求参数
  567. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  568. var request = new ProvinceListRequest<SubmitCaseTotalInfo>(configProvince.ClientId, configProvince.ClientSecret);
  569. request.SetData(new List<SubmitCaseTotalInfo>() { dto });
  570. var jsonData = request.ToString();
  571. var url = configProvince.HuiJu + "submit_case_total";
  572. #endregion
  573. //将待推送数据写入待推送表
  574. await InitPushDataAsync("SubmitCaseTotal", "submit_case_total", jsonData, pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  575. }
  576. #endregion
  577. #region 协同-第三批次
  578. /// <summary>
  579. /// 上报补充诉求---需要再次确认
  580. /// </summary>
  581. /// <param name="dto"></param>
  582. /// <returns></returns>
  583. public async Task SupplyCaseInfoSendAsync(SupplyCaseInfoSendInfo dto, CancellationToken cancellationToken)
  584. {
  585. dto.AreaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
  586. dto.CliengGuid = Guid.NewGuid().ToString();
  587. #region 处理请求参数
  588. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  589. var request = new ProvinceRequest<SupplyCaseInfoSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
  590. request.SetData(dto);
  591. var jsonData = request.ToString();
  592. var url = configProvince.XieTong + "supply_case_info_send";
  593. #endregion
  594. //将待推送数据写入待推送表
  595. await InitPushDataAsync("SupplyCaseInfoSend", "supply_case_info_send", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  596. //处理附件
  597. await FileDataAsync(null, dto.CaseSerial, dto.CliengGuid, EMaterialType.Process, dto.AreaCode, cancellationToken);
  598. }
  599. /// <summary>
  600. /// 撤单----1
  601. /// </summary>
  602. /// <param name="dto"></param>
  603. /// <param name="cancellationToken"></param>
  604. /// <returns></returns>
  605. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderFlowRecalled)]
  606. public async Task RevokeOrderAsync(PublishSpecialDto dto, CancellationToken cancellationToken)
  607. {
  608. //企业服务
  609. if (dto.Special.OrgId == "001180")
  610. {
  611. CancelWorkOrder dsDataWork = new()
  612. {
  613. WorkOrderNo = dto.Order.No,
  614. Reason = dto.Special.Reason
  615. };
  616. var configEnterprise = _channelConfigurationManager.GetConfigurationEnterprise();
  617. //将待推送数据写入待推送表configEnterprise.AddressUrl +
  618. await InitPushDataAsync("EnterpriseCancelWorkOrder", "platform/12345/cancelWorkOrder", System.Text.Json.JsonSerializer.Serialize(dsDataWork), platformSource: EPlatformSource.Enterprise, cancellationToken: cancellationToken);
  619. }
  620. //省12345
  621. if (dto.Special.OrgId == "001170" || dto.Special.OrgId == "001177")
  622. {
  623. RevokeCaseInfoModel dsRevoke = new()
  624. {
  625. CaseSerial = dto.Order.ProvinceNo,
  626. AreaCode = dto.Order.AreaCode,
  627. RevokeTime = dto.Special.CreationTime,
  628. RevokeName = dto.Special.CreatorName,
  629. RevokeReasion = dto.Special.Reason,
  630. CliengGuid = Guid.NewGuid().ToString()
  631. };
  632. if (string.IsNullOrEmpty(dto.Special.Cause))
  633. dsRevoke.RevokeType = "other";
  634. else if (dto.Special.Cause.Contains("内容错误"))
  635. dsRevoke.RevokeType = "2";
  636. else if (dto.Special.Cause == "撤销工单")
  637. dsRevoke.RevokeType = "1";
  638. else
  639. dsRevoke.RevokeType = "other";
  640. #region 处理请求参数
  641. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  642. var request = new ProvinceRequest<RevokeCaseInfoModel>(configProvince.ClientId, configProvince.ClientSecret);
  643. request.SetData(dsRevoke);
  644. var jsonData = request.ToString();
  645. var url = configProvince.XieTong + "revoke_case_info";
  646. #endregion
  647. //将待推送数据写入待推送表
  648. await InitPushDataAsync("SendRevokeCaseInfo", "revoke_case_info", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  649. await FileDataAsync(dto.Special.FileJson, dto.Order.ProvinceNo, dsRevoke.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
  650. }
  651. }
  652. /// <summary>
  653. /// 服务工单催单--已对接----1
  654. /// </summary>
  655. /// <param name="dto"></param>
  656. /// <returns></returns>
  657. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderUrgeInform)]
  658. public async Task SendRemindCaseInfoAsync(PublishUrgeDto dto, CancellationToken cancellationToken)
  659. {
  660. //被催办部门为省上,才能调用接口
  661. if (dto.Urge.OrgId == "001170" || dto.Urge.OrgId == "001177")
  662. {
  663. var data = _mapper.Map<RemindCaseInfoModel>(dto);
  664. data.CliengGuid = dto.Urge.Id;
  665. #region 处理请求参数
  666. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  667. var request = new ProvinceRequest<RemindCaseInfoModel>(configProvince.ClientId, configProvince.ClientSecret);
  668. request.SetData(data);
  669. var jsonData = request.ToString();
  670. var url = configProvince.XieTong + "remind_case_info";
  671. #endregion
  672. //将待推送数据写入待推送表
  673. await InitPushDataAsync("SendRemindCaseInfo", "remind_case_info", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  674. //处理附件
  675. await FileDataAsync(dto.Urge.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
  676. }
  677. }
  678. /// <summary>
  679. /// 接收发布数据
  680. /// </summary>
  681. /// <param name="dto"></param>
  682. /// <param name="cancellationToken"></param>
  683. /// <returns></returns>
  684. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder)]
  685. public async Task PublishOrderAsync(PublishPublishOrderDto dto, CancellationToken cancellationToken)
  686. {
  687. if (dto.Order.IsProvince && dto.Order.Source == ESource.ProvinceStraight)
  688. {
  689. #region 服务工单交办处理结果
  690. //判断是否是热线中心
  691. if (!string.IsNullOrEmpty(dto.Order.ActualHandleOrgCode) && dto.Order.ActualHandleOrgCode == "001")
  692. dto.Order.ActualHandleOrgName = "热线中心";
  693. var data = _mapper.Map<GetCaseResultReceiveInfo>(dto.Order);
  694. data.ConcactType = "40";
  695. data.FinishType = "1";
  696. data.HandleTimeLong = (decimal)dto.Order.AllDuration;
  697. data.ConcactType = dto.Order.RealCommunicationMode switch
  698. {
  699. ERealCommunicationMode.Phone => "10",
  700. ERealCommunicationMode.Locale => "20",
  701. _ => "40",
  702. };
  703. data.CliengGuid = Guid.NewGuid().ToString();
  704. //中国政府网的数据处理
  705. if (dto.Order.ProvinceNo.Contains("ZGZFW"))
  706. {
  707. data.Notes = dto.Remark;
  708. data.MsgOpenByArea = dto.ProPublishState == true ? "1" : "0";
  709. data.AreaNotPublicReason = dto.NoPubReason;
  710. data.FeedBackAnswerContent = dto.ArrangeOpinion;
  711. data.FeedBackTel = dto.FeedBackPhone;
  712. data.EventType = "";
  713. data.Eventname = "";
  714. data.ContactFlag = dto.IsContact == true ? "1" : "0";
  715. data.AssessFlag = dto.IsVisited == true ? "1" : "0";
  716. data.AssessContent = dto.EvaluateContent;
  717. if (dto.NetizenEvaluate != null)
  718. {
  719. data.AssessOpinion = dto.NetizenEvaluate.Value;
  720. }
  721. }
  722. #region 处理请求参数
  723. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  724. var request = new ProvinceRequest<GetCaseResultReceiveInfo>(configProvince.ClientId, configProvince.ClientSecret);
  725. request.SetData(data);
  726. var jsonData = request.ToString();
  727. var url = configProvince.XieTong + "get_case_result_receive";
  728. #endregion
  729. await InitPushDataAsync("GetCaseResultReceive", "get_case_result_receive", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  730. //处理附件
  731. await FileDataAsync(null, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Result, dto.Order.AreaCode, cancellationToken);
  732. #endregion
  733. }
  734. //政民互动提交公开
  735. if (dto.Order.SourceChannelCode == "SZMHD" && dto.ProPublishState == true)
  736. {
  737. var data = _mapper.Map<ZmhdCaseInfoPublicInfo>(dto);
  738. #region 处理请求参数
  739. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  740. var request = new ProvinceRequest<ZmhdCaseInfoPublicInfo>(configProvince.ClientId, configProvince.ClientSecret);
  741. request.SetData(data);
  742. var jsonData = request.ToString();
  743. var url = configProvince.XieTong + "zmhd_case_info_public";
  744. #endregion
  745. //将待推送数据写入待推送表
  746. await InitPushDataAsync("ZmhdCaseInfoPublic", "zmhd_case_info_public", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  747. }
  748. }
  749. /// <summary>
  750. /// 接收发布的时候生成的待回访部门数据
  751. /// </summary>
  752. /// <param name="dto"></param>
  753. /// <param name="cancellationToken"></param>
  754. /// <returns></returns>
  755. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb)]
  756. public async Task PublishVisitAllAsync(PublishVisitAllDto dto, CancellationToken cancellationToken)
  757. {
  758. if (dto != null)
  759. {
  760. List<DsOrderVisit> orderVisits = new List<DsOrderVisit>();
  761. //1、待回访和已回访要将接收的数据写入库
  762. //2、其他状态的时候需要将工单的回访状态改成不能回访
  763. //处理待回访和已回访的数据
  764. if (dto.VisitState == EVisitState.WaitForVisit || dto.VisitState == EVisitState.Visited)
  765. {
  766. if (dto.OrderVisitDetails != null && dto.OrderVisitDetails.Count > 0)
  767. {
  768. //组装回访数据
  769. foreach (var item in dto.OrderVisitDetails)
  770. {
  771. DsOrderVisit dsOrderVisit = new()
  772. {
  773. OrderId = dto.Order.Id,
  774. VisitDetailId = item.Id,
  775. VisitId = item.VisitId,
  776. VoiceEvaluate = item.VoiceEvaluate.ToString(),
  777. SeatEvaluate = item.SeatEvaluate.ToString(),
  778. OrgProcessingResults = _mapper.Map<Kv>(item.OrgProcessingResults),
  779. OrgNoSatisfiedReason = _mapper.Map<List<Kv>>(item.OrgNoSatisfiedReason),
  780. OrgHandledAttitude = _mapper.Map<Kv>(item.OrgHandledAttitude),
  781. VisitContent = item.VisitContent,
  782. VisitOrgName = item.VisitOrgName,
  783. VisitOrgCode = item.VisitOrgCode,
  784. VisitTarget = item.VisitTarget.ToString(),
  785. VisitType = dto.VisitType.ToString(),
  786. VisitTime = dto.VisitTime,
  787. IsEffective = true
  788. };
  789. orderVisits.Add(dsOrderVisit);
  790. }
  791. //// 方式一: 保留数据
  792. //var tempList = await _dsOrderVisitRepository.Queryable().Where(p => p.OrderId == dto.Order.Id && p.IsEffective == true).ToListAsync();
  793. //foreach (var item in tempList)
  794. //{
  795. // item.IsEffective = false;
  796. // await _dsOrderVisitRepository.UpdateAsync(item, cancellationToken);
  797. //}
  798. //方式二:直接删除原始数据
  799. await _dsOrderVisitRepository.RemoveAsync(p => p.OrderId == dto.Order.Id);
  800. //写入新数据
  801. await _dsOrderVisitRepository.AddRangeAsync(orderVisits, cancellationToken);
  802. }
  803. }
  804. //处理是否可以评价,如果是
  805. var orderData = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Order.Id);
  806. if (orderData is not null)
  807. {
  808. var tempState = orderData.VisitTypeState;
  809. switch (dto.VisitState)
  810. {
  811. case EVisitState.WaitForVisit:
  812. orderData.VisitTypeState = EVisitTypeState.Visit;
  813. break;
  814. case EVisitState.Visited:
  815. orderData.VisitTypeState = EVisitTypeState.Reviewed;
  816. break;
  817. case EVisitState.Visiting:
  818. case EVisitState.NoSatisfiedWaitForVisit:
  819. case EVisitState.None:
  820. orderData.VisitTypeState = EVisitTypeState.UnVisit;
  821. break;
  822. default:
  823. break;
  824. }
  825. if (tempState != orderData.VisitTypeState)
  826. await _dsOrderRepository.UpdateAsync(orderData, cancellationToken);
  827. }
  828. }
  829. }
  830. #endregion
  831. #region 协同-第四批次
  832. #region 知识库--已对接附件
  833. /// <summary>
  834. /// 知识库上报----1
  835. /// </summary>
  836. /// <param name="dto"></param>
  837. /// <returns></returns>
  838. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineKnowledgeAdd)]
  839. public async Task GetKnowledgeInfoSendAsync(KnowledgeSendDto dto, CancellationToken cancellationToken)
  840. {
  841. var data = _mapper.Map<KnowledgeInfoSendInfo>(dto);
  842. data.AreaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
  843. data.CliengGuid = Guid.NewGuid().ToString();
  844. if (data.DisableDate == null)//如果没得有失效时间,默认在生效日期上面加10年
  845. data.DisableDate = data.BeginDate.Value.AddYears(10);
  846. #region 处理请求参数
  847. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  848. var request = new ProvinceRequest<KnowledgeInfoSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
  849. request.SetData(data);
  850. var jsonData = request.ToString();
  851. var url = configProvince.HuiJu + "get_knowledge_info_send";
  852. #endregion
  853. //将待推送数据写入待推送表
  854. await InitPushDataAsync("GetKnowledgeInfoSend", "get_knowledge_info_send", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  855. #region 处理知识库原始数据
  856. //查询原有数据,如果有修改原始数据,没有直接新增
  857. var dataRaw = await _knowledgeRawDataRepository.GetAsync(p => p.UID == data.UID);
  858. var raw = _mapper.Map<DsKnowledgeRawData>(data);
  859. if (dataRaw != null)
  860. {
  861. raw.Id = dataRaw.Id;
  862. await _knowledgeRawDataRepository.UpdateAsync(raw, cancellationToken: cancellationToken);
  863. }
  864. else
  865. await _knowledgeRawDataRepository.AddAsync(raw, cancellationToken: cancellationToken);
  866. #endregion
  867. //知识附件处理
  868. await FileDataAsync(dto.FileJson, dto.UID, data.CliengGuid, EMaterialType.Knowledge, data.AreaCode, cancellationToken);
  869. }
  870. /// <summary>
  871. /// 知识库变更---1
  872. /// </summary>
  873. /// <param name="dto"></param>
  874. /// <returns></returns>
  875. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineKnowledgeUpdate)]
  876. public async Task GetKnowledgeInfoUpdateAsync(KnowledgeSendDto dto, CancellationToken cancellationToken)
  877. {
  878. var data = _mapper.Map<GetKnowledgeInfoUpdateInfo>(dto);
  879. data.AreaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
  880. data.CliengGuid = Guid.NewGuid().ToString();
  881. if (data.DisableDate == null)//如果没得有失效时间,默认在生效日期上面加10年
  882. data.DisableDate = data.BeginDate.Value.AddYears(10);
  883. #region 处理请求参数
  884. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  885. var request = new ProvinceRequest<GetKnowledgeInfoUpdateInfo>(configProvince.ClientId, configProvince.ClientSecret);
  886. request.SetData(data);
  887. var jsonData = request.ToString();
  888. var url = configProvince.HuiJu + "get_knowledge_info_update";
  889. #endregion
  890. //将待推送数据写入待推送表
  891. await InitPushDataAsync("GetKnowledgeInfoUpdate", "get_knowledge_info_update", jsonData, pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  892. #region 处理知识库原始数据
  893. //查询原有数据,如果有修改原始数据,没有直接新增
  894. var dataRaw = await _knowledgeRawDataRepository.GetAsync(p => p.UID == data.UID);
  895. var raw = _mapper.Map<DsKnowledgeRawData>(data);
  896. if (dataRaw != null)
  897. {
  898. raw.Id = dataRaw.Id;
  899. await _knowledgeRawDataRepository.UpdateAsync(raw, cancellationToken: cancellationToken);
  900. }
  901. else
  902. await _knowledgeRawDataRepository.AddAsync(raw, cancellationToken: cancellationToken);
  903. #endregion
  904. //知识附件处理
  905. await FileDataAsync(dto.FileJson, dto.UID, data.CliengGuid, EMaterialType.Knowledge, data.AreaCode, cancellationToken);
  906. }
  907. /// <summary>
  908. /// 知识库下架---1
  909. /// </summary>
  910. /// <param name="dto"></param>
  911. /// <returns></returns>
  912. [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineKnowledgeRemove)]
  913. public async Task GetKnowledgeInfoAbandonAsync(KnowledgeSendDto dto, CancellationToken cancellationToken)
  914. {
  915. var data = _mapper.Map<GetKnowledgeInfoAbandonInfo>(dto);
  916. data.AreaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
  917. #region 处理请求参数
  918. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  919. var request = new ProvinceRequest<GetKnowledgeInfoAbandonInfo>(configProvince.ClientId, configProvince.ClientSecret);
  920. request.SetData(data);
  921. var jsonData = request.ToString();
  922. var url = configProvince.HuiJu + "get_knowledge_info_abandon";
  923. #endregion
  924. //将待推送数据写入待推送表
  925. await InitPushDataAsync("GetKnowledgeInfoAbandon", "get_knowledge_info_abandon", jsonData, pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  926. //知识下架删除原有原始数据
  927. await _knowledgeRawDataRepository.RemoveAsync(p => p.UID == data.UID, cancellationToken: cancellationToken);
  928. }
  929. #endregion
  930. /// <summary>
  931. /// 实时服务上报
  932. /// </summary>
  933. /// <param name="dto"></param>
  934. /// <returns></returns>
  935. public async Task SendRealTimeStatusAsync(SendRealTimeStatusInfo dto, CancellationToken cancellationToken)
  936. {
  937. dto.AreaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
  938. #region 处理请求参数
  939. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  940. var request = new ProvinceRequest<SendRealTimeStatusInfo>(configProvince.ClientId, configProvince.ClientSecret);
  941. request.SetData(dto);
  942. var jsonData = request.ToString();
  943. var url = configProvince.HuiJu + "sendrealtimestatus";
  944. #endregion
  945. await InitPushDataAsync("SendRealTimeStatus", "sendrealtimestatus", jsonData, pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  946. }
  947. #endregion
  948. #region 私有方法
  949. #region 省数据处理
  950. /// <summary>
  951. /// 热线工单办理---服务工单处理/服务工单交办处理过程-
  952. /// </summary>
  953. /// <param name="dto"></param>
  954. /// <param name="cancellationToken"></param>
  955. /// <returns></returns>
  956. private async Task SubmitCaseProcessFlowAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  957. {
  958. //判断是否是热线中心
  959. if (!string.IsNullOrEmpty(dto.Order.ActualHandleOrgCode) && dto.Order.ActualHandleOrgCode == "001")
  960. dto.Order.ActualHandleOrgName = "热线中心";
  961. #region 写本地办理数据-用于查询办理流程
  962. //写本地办理数据-用于查询办理流程
  963. var orderWorkFlow = _mapper.Map<DsOrderWorkFlow>(dto.WorkflowTrace);
  964. orderWorkFlow.OrderId = dto.Order.Id;
  965. await _dataOrderWorkFlowRepository.AddAsync(orderWorkFlow, cancellationToken);
  966. #endregion
  967. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  968. //省上下来的工单走协同的接口
  969. if (dto.Order.Source == ESource.ProvinceStraight && dto.Order.IsProvince)
  970. {
  971. var data = _mapper.Map<GetCaseProcessReceiveInfo>(dto);
  972. data.TacheName = "70:" + data.DeptName;
  973. var validator = new GetCaseProcessReceiveInfoValidator();
  974. var validResult = await validator.ValidateAsync(data, cancellationToken);
  975. if (!validResult.IsValid)
  976. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  977. #region 处理请求参数
  978. var request = new ProvinceRequest<GetCaseProcessReceiveInfo>(configProvince.ClientId, configProvince.ClientSecret);
  979. request.SetData(data);
  980. var jsonData = request.ToString();
  981. var url = configProvince.XieTong + "get_case_process_receive";
  982. #endregion
  983. //将待推送数据写入待推送表
  984. await InitPushDataAsync("GetCaseProcessReceive", "get_case_process_receive", jsonData, pathType: EPathType.XieTong, cancellationToken: cancellationToken);
  985. //处理附件
  986. await FileDataAsync(dto.WorkflowTrace.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
  987. }
  988. else //如果不是省上派下来的工单
  989. {
  990. //本地工单走市州接口
  991. var data = _mapper.Map<SubmitCaseProcessInfo>(dto);
  992. data.TacheName = "70:" + data.DeptName;
  993. var validator = new SubmitCaseProcessInfoValidator();
  994. var validResult = await validator.ValidateAsync(data, cancellationToken);
  995. if (!validResult.IsValid)
  996. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  997. #region 处理请求参数
  998. var requestSubmitCaseProcessInfo = new ProvinceListRequest<SubmitCaseProcessInfo>(configProvince.ClientId, configProvince.ClientSecret);
  999. requestSubmitCaseProcessInfo.SetData(new List<SubmitCaseProcessInfo>() { data });
  1000. var jsonDataSubmitCaseProcessInfo = requestSubmitCaseProcessInfo.ToString();
  1001. var urlSubmitCaseProcessInfo = configProvince.HuiJu + "submit_case_process";
  1002. #endregion
  1003. //将待推送数据写入待推送表
  1004. await InitPushDataAsync("SubmitCaseProcess", "submit_case_process", jsonDataSubmitCaseProcessInfo, pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  1005. //处理附件
  1006. await FileDataAsync(dto.WorkflowTrace.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
  1007. }
  1008. //这里判断是否需要往其他平台推送数据
  1009. await OrderDispatchAsync(dto, cancellationToken);
  1010. }
  1011. /// <summary>
  1012. /// 派单是判断需要往第三方推送数据
  1013. /// </summary>
  1014. /// <param name="dto"></param>
  1015. /// <returns></returns>
  1016. private async Task OrderDispatchAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  1017. {
  1018. if (dto.WorkflowTrace.NextHandlers != null && dto.WorkflowTrace.NextHandlers.Count > 0)
  1019. {
  1020. foreach (var item in dto.WorkflowTrace.NextHandlers)
  1021. {
  1022. if (!string.IsNullOrEmpty(item.Key))
  1023. {
  1024. //需要判断是否需要往110推送
  1025. if (item.Key == "001179")
  1026. //写入110本地数据库
  1027. await InitPoliceSendChainAlarmDsAsync(dto.Order, cancellationToken);
  1028. //需要判断是否需要往宜宾等地市州推送数据
  1029. if (item.Key == "001187")
  1030. //市州数据提交
  1031. await InitCityDataYBAsync(dto.Order, cancellationToken);
  1032. //需要判断是否需要往企业专班提交数据
  1033. if (item.Key == "001180")
  1034. //企业专班提交数据
  1035. await InitEnterpriseDataAsync(dto.Order, cancellationToken);
  1036. //是否向省上派单
  1037. if (item.Key == "001170" || item.Key == "001177")
  1038. await SendCaseInfoDataAsync(dto.Order, cancellationToken);
  1039. }
  1040. }
  1041. }
  1042. }
  1043. /// <summary>
  1044. /// 服务工单回访评价/服务工单交办评价
  1045. /// </summary>
  1046. /// <param name="dto"></param>
  1047. /// <param name="cancellationToken"></param>
  1048. /// <returns></returns>
  1049. private async Task SubmitVisitInfoDataAsync(PublishVisitDto dto, CancellationToken cancellationToken)
  1050. {
  1051. #region 修改工单基础数据为已评价
  1052. ////修改工单基础数据为已评价
  1053. //var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Order.Id, cancellationToken);
  1054. //if (dataOrder != null)
  1055. //{
  1056. // dataOrder.VisitTypeState = EVisitTypeState.Reviewed;
  1057. // await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
  1058. //}
  1059. #endregion
  1060. string visitType = "";
  1061. switch (dto.VisitType)
  1062. {
  1063. case EVisitType.ArtificialVisit:
  1064. visitType = "DH";
  1065. break;
  1066. case EVisitType.SmsVisit:
  1067. visitType = "DX";
  1068. break;
  1069. case EVisitType.WebVisit:
  1070. visitType = "WZ";
  1071. break;
  1072. case EVisitType.WeChatVisit:
  1073. visitType = "WX";
  1074. break;
  1075. case EVisitType.AppVisit:
  1076. visitType = "AP";
  1077. break;
  1078. default:
  1079. break;
  1080. }
  1081. //将未接通未做评价的默认为满意
  1082. switch (dto.SubjectResultSatifyCode)
  1083. {
  1084. case "1":
  1085. case "2":
  1086. case "3":
  1087. case "4":
  1088. case "5":
  1089. break;
  1090. default:
  1091. dto.SubjectResultSatifyCode = "3";
  1092. break;
  1093. }
  1094. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1095. //如果省上下来的工单走服务工单交办评价接口,不是省上派下来的工单,走服务工单评价接口
  1096. if (dto.Order.IsProvince && dto.Order.Source == ESource.ProvinceStraight)
  1097. {
  1098. var data = _mapper.Map<GetVisitInfoReceiveInfo>(dto);
  1099. data.VisitType = visitType;
  1100. data.CliengGuid = Guid.NewGuid().ToString();
  1101. var validator = new GetVisitInfoReceiveInfoValidator();
  1102. var validResult = await validator.ValidateAsync(data, cancellationToken);
  1103. if (!validResult.IsValid)
  1104. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1105. #region 处理请求参数
  1106. var request = new ProvinceRequest<GetVisitInfoReceiveInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1107. request.SetData(data);
  1108. var jsonData = request.ToString();
  1109. var url = configProvince.XieTong + "get_visit_info_receive";
  1110. #endregion
  1111. //将待推送数据写入待推送表
  1112. await InitPushDataAsync("GetVisitInfoReceive", "get_visit_info_receive", jsonData, pathType: EPathType.XieTong, taskPriority: 5, cancellationToken: cancellationToken);
  1113. //处理附件
  1114. await FileDataAsync(null, data.CaseSerial, data.CliengGuid, EMaterialType.Visit, data.AreaCode, cancellationToken);
  1115. }
  1116. else
  1117. {
  1118. var data = _mapper.Map<SubmitVisitInfo>(dto);
  1119. data.VisitType = visitType;
  1120. data.CliengGuid = Guid.NewGuid().ToString();
  1121. var validator = new SubmitVisitInfoValidator();
  1122. var validResult = await validator.ValidateAsync(data, cancellationToken);
  1123. if (!validResult.IsValid)
  1124. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1125. #region 处理请求参数
  1126. var request = new ProvinceListRequest<SubmitVisitInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1127. request.SetData(new List<SubmitVisitInfo>() { data });
  1128. var jsonData = request.ToString();
  1129. var url = configProvince.HuiJu + "submit_visit_info";
  1130. #endregion
  1131. //将待推送数据写入待推送表
  1132. await InitPushDataAsync("SubmitVisitInfo", "submit_visit_info", jsonData, pathType: EPathType.HuiJu, taskPriority: 5, cancellationToken: cancellationToken);
  1133. //处理附件
  1134. await FileDataAsync(null, data.CaseSerial, data.CliengGuid, EMaterialType.Visit, data.AreaCode, cancellationToken);
  1135. //组装处理110数据
  1136. if (dto.Order.Source == ESource.Police110)
  1137. {
  1138. var checkData = await _policeSendChainDealDsRepository.GetAsync(p => p.AlarmReceiptNumber == dto.Order.ExternalId && p.DisposalType == (int)EDsDisposalType.Visit, cancellationToken);
  1139. if (checkData == null)
  1140. {
  1141. checkData = new()
  1142. {
  1143. AlarmReceiptNumber = dto?.Order?.ExternalId,
  1144. RevisitTime = dto.VisitTime,
  1145. CheckingContent = dto.VisitRemark,
  1146. VisitContent = dto.VisitRemark,
  1147. VisitResult = dto.SubjectResultSatifyCode + "",
  1148. DisposalType = 3
  1149. };
  1150. await _policeSendChainDealDsRepository.AddAsync(checkData, cancellationToken);
  1151. }
  1152. else
  1153. {
  1154. checkData.AlarmReceiptNumber = dto?.Order?.ExternalId;
  1155. checkData.RevisitTime = dto.VisitTime;
  1156. checkData.CheckingContent = dto.VisitRemark;
  1157. checkData.VisitContent = dto.VisitRemark;
  1158. checkData.VisitResult = dto.SubjectResultSatifyCode + "";
  1159. await _policeSendChainDealDsRepository.UpdateAsync(checkData, cancellationToken);
  1160. }
  1161. }
  1162. }
  1163. }
  1164. /// <summary>
  1165. /// 服务工单结果
  1166. /// </summary>
  1167. /// <param name="dto"></param>
  1168. /// <returns></returns>
  1169. private async Task SubmitCaseResultAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  1170. {
  1171. var data = _mapper.Map<SubmitCaseResultInfo>(dto);
  1172. data.ConcactType = "40";
  1173. data.FinishType = "1";
  1174. data.HandleTimeLong = (int)dto.Order.AllDuration;
  1175. data.CliengGuid = Guid.NewGuid().ToString();
  1176. //宜宾工单不超期,如果在推送省上数据时,实际办理时间大于过期时间,则将办理时间改成过期时间减2个小时
  1177. if (dto.Order.ExpiredTime < dto.Order.ActualHandleTime)
  1178. {
  1179. var finishTime = dto.Order.ExpiredTime.Value.AddHours(-2);
  1180. data.FinishTime = finishTime;
  1181. data.FdBackTime = finishTime;
  1182. }
  1183. var validator = new SubmitCaseResultInfoValidator();
  1184. var validResult = await validator.ValidateAsync(data, cancellationToken);
  1185. if (!validResult.IsValid)
  1186. throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
  1187. #region 处理请求参数
  1188. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1189. var request = new ProvinceListRequest<SubmitCaseResultInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1190. request.SetData(new List<SubmitCaseResultInfo>() { data });
  1191. var jsonData = request.ToString();
  1192. var url = configProvince.HuiJu + "submit_case_result";
  1193. #endregion
  1194. //将待推送数据写入待推送表
  1195. await InitPushDataAsync("SubmitCaseResult", "submit_case_result", jsonData, pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  1196. //处理附件
  1197. if (dto.WorkflowTrace != null && dto.WorkflowTrace.FileJson != null && dto.WorkflowTrace.FileJson.Count > 0)
  1198. await FileDataAsync(dto.WorkflowTrace.FileJson, data.CaseSerial, data.CliengGuid, EMaterialType.Result, dto.Order.AreaCode, cancellationToken);
  1199. //判断如果是110过来的数据,就组装数据
  1200. //组装110
  1201. if (dto.Order.Source == ESource.Police110)
  1202. {
  1203. await InitPoliceSendChainDealDsAsync(dto, cancellationToken);
  1204. }
  1205. }
  1206. /// <summary>
  1207. /// 工单创建数据处理
  1208. /// </summary>
  1209. /// <param name="dto"></param>
  1210. /// <returns></returns>
  1211. private async Task<SubmitCaseInfo> InitDataAsync(OrderDto dto, CancellationToken cancellationToken)
  1212. {
  1213. var submitCaseInfo = _mapper.Map<SubmitCaseInfo>(dto);
  1214. //处理性别
  1215. submitCaseInfo.AppLicantSex = dto.FromGender switch
  1216. {
  1217. EGender.Female => "0",
  1218. EGender.Male => "1",
  1219. EGender.Unknown => "2",
  1220. _ => "2",
  1221. };
  1222. //处理证件类型
  1223. submitCaseInfo.CertifiCateType = dto.LicenceTypeCode switch
  1224. {
  1225. "10" => "10",
  1226. "40" => "20",
  1227. "55" => "30",
  1228. "57" => "40",
  1229. _ => "50",
  1230. };
  1231. //处理紧急程度
  1232. submitCaseInfo.CaseIsUrgent = dto.EmergencyLevel switch
  1233. {
  1234. EEmergencyLevel.QuiteEmergency => "10",
  1235. EEmergencyLevel.Emergency => "20",
  1236. _ => "30",
  1237. };
  1238. //处理诉求类型
  1239. switch (submitCaseInfo.CaseType)
  1240. {
  1241. case "10":
  1242. case "15":
  1243. case "20":
  1244. case "25":
  1245. case "30":
  1246. case "35":
  1247. break;
  1248. default:
  1249. submitCaseInfo.CaseType = "40";
  1250. break;
  1251. }
  1252. submitCaseInfo.CaseValid = "1";
  1253. submitCaseInfo.CaseIsPublic = string.IsNullOrEmpty(submitCaseInfo.CaseIsPublic) == true ? "0" : submitCaseInfo.CaseIsPublic;
  1254. submitCaseInfo.ThemeSerial = "05";
  1255. if (dto.SourceChannelCode == "SZMHD" && dto.IsProvince == false && dto.Source == ESource.ProvinceStraight)
  1256. submitCaseInfo.TrowGuid = "【政民互动直派】";
  1257. switch (dto.SourceChannelCode.ToUpper())
  1258. {
  1259. case "RGDH":
  1260. case "WX":
  1261. case "WB":
  1262. case "AP":
  1263. case "WZ":
  1264. case "YJ":
  1265. case "SCZWFWW":
  1266. case "XCX":
  1267. break;
  1268. default:
  1269. submitCaseInfo.CaseSource = "QT";
  1270. break;
  1271. }
  1272. return submitCaseInfo;
  1273. }
  1274. /// <summary>
  1275. /// 服务工单拓展信息
  1276. /// </summary>
  1277. /// <param name="dto"></param>
  1278. /// <returns></returns>
  1279. private async Task SubmitCaseExtendsAsync(OrderDto dto, CancellationToken cancellationToken)
  1280. {
  1281. var orderExtension = dto.OrderExtension;
  1282. if (orderExtension is null)
  1283. return;
  1284. //工单类型
  1285. string formType = orderExtension.OrderTypeCode;
  1286. //处理为统一的市场监管表单
  1287. if (formType == "scjgjts" || formType == "scjgjjb")
  1288. formType = "scjgj";
  1289. DataSharing.Share.Dtos.Province.HuiJu.SubmitCaseExtendsInfo submitCaseExtendsInfo = new()
  1290. {
  1291. CaseSerial = dto.ProvinceNo,
  1292. FormType = formType
  1293. };
  1294. //处理扩展信息
  1295. switch (formType.ToLower())
  1296. {
  1297. case "yl"://医疗表单
  1298. //转换数据
  1299. submitCaseExtendsInfo.FormMedical = _mapper.Map<FormMedicalInfo>(orderExtension);
  1300. break;
  1301. case "zwfw"://四川政务服务网技术工单
  1302. submitCaseExtendsInfo.FormNetWorktec = _mapper.Map<FormNetWorktecInfo>(orderExtension);
  1303. break;
  1304. case "th"://电视购物及商铺购买退换货工单
  1305. submitCaseExtendsInfo.FormReturnexChange = _mapper.Map<FormReturnexChangeInfo>(orderExtension);
  1306. break;
  1307. case "gsgl"://高速公路工单
  1308. submitCaseExtendsInfo.FormExpressWay = _mapper.Map<FormExpressWayInfo>(orderExtension);
  1309. break;
  1310. case "xjgg"://电视台虚假广告工单
  1311. submitCaseExtendsInfo.FormShamPub = _mapper.Map<FormShamPubInfo>(orderExtension);
  1312. break;
  1313. case "swfwsq"://12366热线诉求交办
  1314. submitCaseExtendsInfo.FormTaxationComplaint = _mapper.Map<FormTaxationComplaintInfo>(orderExtension);
  1315. break;
  1316. case "swfwzx"://12366热线咨询交办
  1317. submitCaseExtendsInfo.FormTaxationConsulting = _mapper.Map<FormTaxationConsultingInfo>(orderExtension);
  1318. break;
  1319. case "jtfwjd"://12328服务监督
  1320. submitCaseExtendsInfo.FormTraffic = _mapper.Map<FormTrafficInfo>(orderExtension);
  1321. break;
  1322. case "yzxf"://邮政业消费者申诉
  1323. submitCaseExtendsInfo.FormPost = _mapper.Map<FormPostInfo>(orderExtension);
  1324. break;
  1325. case "hbjb"://环保举报业务
  1326. submitCaseExtendsInfo.FormEnvironMent = _mapper.Map<FormEnvironMentInfo>(orderExtension);
  1327. break;
  1328. case "scjgj"://12315个性化表单
  1329. var formMarket = _mapper.Map<FormMarketInfo>(orderExtension);
  1330. //转换数据
  1331. switch (orderExtension.OrderTypeCode)
  1332. {
  1333. case "scjgjjb":
  1334. formMarket.Rqsttypy = "25";
  1335. break;
  1336. case "scjgjts":
  1337. formMarket.Rqsttypy = "20";
  1338. foreach (var item in orderExtension.ComplainTypes)
  1339. formMarket.AppealContent += item.Value + ",";
  1340. formMarket.AppealContent = formMarket.AppealContent.TrimEnd(',');
  1341. break;
  1342. default:
  1343. break;
  1344. }
  1345. formMarket.HandDepCode = dto.AcceptorOrgCode;
  1346. formMarket.HandDep = dto.AcceptorOrgName;
  1347. formMarket.Zxgh = dto.AcceptorStaffNo;
  1348. formMarket.AccregperId = dto.AcceptorId;
  1349. formMarket.AccregperName = dto.AcceptorName;
  1350. formMarket.RegTime = Convert.ToDateTime(dto.CreationTime);
  1351. formMarket.CmTime = dto.StartTime;
  1352. submitCaseExtendsInfo.FormMarket = formMarket;
  1353. break;
  1354. default:
  1355. break;
  1356. }
  1357. #region 处理请求参数
  1358. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1359. var request = new ProvinceRequest<DataSharing.Share.Dtos.Province.HuiJu.SubmitCaseExtendsInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1360. request.SetData(submitCaseExtendsInfo);
  1361. var jsonData = request.ToString();
  1362. var url = configProvince.HuiJu + "submit_case_extends";
  1363. #endregion
  1364. //将待推送数据写入待推送表
  1365. await InitPushDataAsync("SubmitCaseExtends", "submit_case_extends", jsonData, pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  1366. }
  1367. /// <summary>
  1368. /// 往省上派单
  1369. /// </summary>
  1370. /// <param name="dto"></param>
  1371. /// <returns></returns>
  1372. private async Task SendCaseInfoDataAsync(OrderDto dto, CancellationToken cancellationToken)
  1373. {
  1374. //先上传拓展信息
  1375. if (dto.OrderExtension != null)
  1376. await SubmitCaseExtendsAsync(dto, cancellationToken);
  1377. //在处理工单信息
  1378. var sendCaseInfo = _mapper.Map<SendCaseInfo>(dto);
  1379. if (dto.OrderExtension != null)
  1380. sendCaseInfo.IsExtends = "1";
  1381. else
  1382. sendCaseInfo.IsExtends = "0";
  1383. #region 处理数据
  1384. //处理性别
  1385. switch (dto.FromGender)
  1386. {
  1387. case EGender.Female:
  1388. sendCaseInfo.AppLicantSex = "0";
  1389. break;
  1390. case EGender.Male:
  1391. sendCaseInfo.AppLicantSex = "1";
  1392. break;
  1393. case EGender.Unknown:
  1394. sendCaseInfo.AppLicantSex = "2";
  1395. break;
  1396. default:
  1397. sendCaseInfo.AppLicantSex = "2";
  1398. break;
  1399. }
  1400. //处理证件类型
  1401. sendCaseInfo.CertifiCateType = dto.LicenceTypeCode switch
  1402. {
  1403. "10" => "10",
  1404. "40" => "20",
  1405. "55" => "30",
  1406. "57" => "40",
  1407. _ => "50",
  1408. };
  1409. //处理紧急程度
  1410. sendCaseInfo.CaseIsUrgent = dto.EmergencyLevel switch
  1411. {
  1412. EEmergencyLevel.QuiteEmergency => "10",
  1413. EEmergencyLevel.Emergency => "20",
  1414. _ => "30",
  1415. };
  1416. //处理诉求类型
  1417. switch (sendCaseInfo.CaseType)
  1418. {
  1419. case "10":
  1420. case "15":
  1421. case "20":
  1422. case "25":
  1423. case "30":
  1424. case "35":
  1425. break;
  1426. default:
  1427. sendCaseInfo.CaseType = "40";
  1428. break;
  1429. }
  1430. #endregion
  1431. switch (dto.SourceChannelCode.ToUpper())
  1432. {
  1433. case "RGDH":
  1434. case "WX":
  1435. case "WB":
  1436. case "AP":
  1437. case "WZ":
  1438. case "YJ":
  1439. case "SCZWFWW":
  1440. case "XCX":
  1441. break;
  1442. default:
  1443. sendCaseInfo.CaseSource = "QT";
  1444. break;
  1445. }
  1446. sendCaseInfo.CaseSource = sendCaseInfo.CaseSource;
  1447. var sendCaseInfoData = _mapper.Map<DsSendCaseInfo>(sendCaseInfo);
  1448. sendCaseInfoData.OrderID = dto.Id;
  1449. sendCaseInfoData.No = dto.No;
  1450. await _sendCaseInfoRepository.AddAsync(sendCaseInfoData, cancellationToken);
  1451. #region 处理请求参数
  1452. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  1453. var request = new ProvinceRequest<SendCaseInfo>(configProvince.ClientId, configProvince.ClientSecret);
  1454. request.SetData(sendCaseInfo);
  1455. var jsonData = request.ToString();
  1456. var url = configProvince.HuiJu + "send_case_info";
  1457. #endregion
  1458. //将待推送数据写入待推送表
  1459. await InitPushDataAsync("SendCaseInfo", "send_case_info", jsonData, pathType: EPathType.HuiJu, cancellationToken: cancellationToken);
  1460. //处理附件
  1461. //await FileDataAsync(dto.FileJson, dto.ProvinceNo, sendCaseInfoData.CliengGuid, EMaterialType.Acceptance, sendCaseInfoData.AreaCode, cancellationToken);
  1462. }
  1463. /// <summary>
  1464. /// 附件处理
  1465. /// </summary>
  1466. /// <param name="fileJson">附件</param>
  1467. /// <param name="caseSerial">工单编号</param>
  1468. /// <param name="cliengGuid">附件ID</param>
  1469. /// <param name="materialType">附件类型 10:受理材料,20:环节材料,30:结果材料,40:回访评价材料,50:督办材料,60:知识库材料</param>
  1470. /// <param name="areaCode">区域ID</param>
  1471. /// <param name="cancellationToken"></param>
  1472. /// <returns></returns>
  1473. private async Task FileDataAsync(List<Hotline.Share.Dtos.File.FileJson> fileJson, string caseSerial, string cliengGuid, EMaterialType materialType, string areaCode, CancellationToken cancellationToken)
  1474. {
  1475. if (fileJson != null && fileJson.Count > 0)
  1476. {
  1477. //将受到的数据写入本地数据库
  1478. GetCaseMaterialInfoModel materialInfo = new()
  1479. {
  1480. CaseSerial = caseSerial,
  1481. CliengGuid = cliengGuid,
  1482. AreaCode = areaCode,
  1483. MaterialType = materialType switch
  1484. {
  1485. EMaterialType.Acceptance => "10",
  1486. EMaterialType.Process => "20",
  1487. EMaterialType.Result => "30",
  1488. EMaterialType.Visit => "40",
  1489. EMaterialType.Supervise => "50",
  1490. EMaterialType.Knowledge => "60",
  1491. _ => "20",
  1492. }
  1493. };
  1494. foreach (var item in fileJson)
  1495. {
  1496. List<FileJson> fileJsons = new() { _mapper.Map<FileJson>(item) };
  1497. //待推送数据写入待推送表
  1498. await InitPushDataAsync("GetCaseMaterialInfo", "get_case_material_info", System.Text.Json.JsonSerializer.Serialize(materialInfo), pathType: EPathType.File, fileJson: fileJsons, cancellationToken: cancellationToken);
  1499. }
  1500. }
  1501. }
  1502. /// <summary>
  1503. /// 处理通话记录队列时间
  1504. /// </summary>
  1505. /// <param name="recordInfo"></param>
  1506. /// <returns></returns>
  1507. private void SetCallTime(SubmitCaseRecordInfo recordInfo)
  1508. {
  1509. // 电话进入顺序 进IVR时间→进队列时间→振铃时间→开始时间→结束时间
  1510. //进入IVR时间为空
  1511. if (recordInfo.InIvr == null)
  1512. {
  1513. if (recordInfo.InQueue == null)
  1514. {
  1515. recordInfo.InQueue = recordInfo.CallStart.Value.AddSeconds(-2);
  1516. }
  1517. recordInfo.InIvr = recordInfo.InQueue.Value.AddSeconds(-2);
  1518. }
  1519. //进入队列时间为空
  1520. if (recordInfo.InQueue == null)
  1521. {
  1522. if (recordInfo.InIvr == null)
  1523. {
  1524. recordInfo.InQueue = recordInfo.CallStart.Value.AddSeconds(-2);
  1525. recordInfo.InIvr = recordInfo.InQueue.Value.AddSeconds(-2);
  1526. }
  1527. else
  1528. recordInfo.InQueue = recordInfo.InIvr.Value.AddSeconds(2);
  1529. }
  1530. //振铃时间为空
  1531. if (recordInfo.CallTime == null && recordInfo.CallStart != null)
  1532. recordInfo.CallTime = recordInfo.CallStart.Value.AddSeconds(-2);
  1533. }
  1534. /// <summary>
  1535. /// 检查是否需要推送未接通话记录
  1536. /// </summary>
  1537. /// <param name="dto"></param>
  1538. /// <param name="cancellationToken"></param>
  1539. /// <returns></returns>
  1540. private async Task<bool> IsPublishMissedCall(TrCallDto dto, CancellationToken cancellationToken)
  1541. {
  1542. var key = MissedCallKey + DateTime.Now.ToString("yyyyMMdd");
  1543. var provinceConfiguration = _channelConfigurationManager.GetConfigurationProvince();
  1544. var missedCallCount = provinceConfiguration.MissedCallCount;
  1545. var dataCache = await _missedCallModelCache.GetAsync(key, cancellationToken);
  1546. if (dataCache != null)
  1547. {
  1548. //如果存在值,检查是否已经达到推送最大值
  1549. if (!dataCache.IsMax && dataCache.DateTimeList.Count > 0)
  1550. {
  1551. //没有达到最大值
  1552. //检查第一条数据是否匹配当前推送时间
  1553. var list = dataCache.DateTimeList;
  1554. if (list[0] < dto.AnsweredTime)
  1555. {
  1556. //处理数据
  1557. list.RemoveAt(0);
  1558. dataCache.DateTimeList = list;
  1559. //是否推送完成
  1560. if (list == null || list.Count == 0)
  1561. dataCache.IsMax = true;
  1562. //从新写入数据
  1563. await _missedCallModelCache.SetAsync(key, dataCache, TimeSpan.FromDays(1), cancellationToken);
  1564. return true;
  1565. }
  1566. }
  1567. }
  1568. else
  1569. {
  1570. #region 生成时间
  1571. //生成时间
  1572. List<DateTime> timeLists = new();
  1573. Random random = new((int)(DateTime.Now.Ticks));
  1574. for (int i = 0; i < missedCallCount; i++)
  1575. {
  1576. int hour = random.Next(2, 23);
  1577. int minute = random.Next(0, 60);
  1578. int second = random.Next(0, 60);
  1579. string tempStr = string.Format("{0} {1}:{2}:{3}", DateTime.Now.ToString("yyyy-MM-dd"), hour, minute, second);
  1580. DateTime rTime = Convert.ToDateTime(tempStr);
  1581. timeLists.Add(rTime);
  1582. }
  1583. timeLists.Sort();
  1584. #endregion
  1585. if (timeLists[0] < dto.AnsweredTime)
  1586. //处理数据
  1587. timeLists.RemoveAt(0);
  1588. MissedCallModelDto missedCall = new()
  1589. {
  1590. DateTimeList = timeLists
  1591. };
  1592. if (timeLists == null || timeLists.Count == 0)
  1593. missedCall.IsMax = true;
  1594. await _missedCallModelCache.SetAsync(key, missedCall, TimeSpan.FromDays(1), cancellationToken);
  1595. return true;
  1596. }
  1597. return false;
  1598. }
  1599. #endregion
  1600. #region 组装110数据
  1601. /// <summary>
  1602. /// 组装110数据,12345警情工单推送到110
  1603. /// </summary>
  1604. /// <param name="orderDto"></param>
  1605. /// <returns></returns>
  1606. private async Task InitPoliceSendChainAlarmDsAsync(OrderDto orderDto, CancellationToken cancellationToken)
  1607. {
  1608. DsPoliceSendChainAlarmDs policeSend = new()
  1609. {
  1610. SerialNumber = orderDto.ExternalId,
  1611. AlarmReceiptNumber = orderDto.ExternalId,
  1612. RegisterNo = orderDto.AcceptorStaffNo,
  1613. CallPoliceNumber = orderDto.FromPhone,
  1614. CallPoliceName = orderDto.FromName,
  1615. PhoneNumber = orderDto.Contact,
  1616. CallPoliceContent = orderDto.Content,
  1617. PoliceTypeCode = "",
  1618. PoliceTypeName = "",
  1619. JurisdictionalUnitCode = "511500000000",
  1620. JurisdictionalUnitName = "宜宾市公安局",
  1621. JurisdictionalUnitNumber = "0831110",
  1622. AlarmReceivingUnitCode = "",
  1623. AlarmReceivingUnitName = "",
  1624. CallPoliceTime = Convert.ToDateTime(orderDto.CreationTime),
  1625. PushTime = DateTime.Now,
  1626. AlarmReceptionType = "0",
  1627. AreaCode = orderDto.AreaCode,
  1628. CallPoliceAddress = orderDto.FullAddress,
  1629. OrderId = orderDto.Id
  1630. };
  1631. if (string.IsNullOrEmpty(policeSend.AlarmReceiptNumber))
  1632. {
  1633. policeSend.AlarmReceiptNumber = orderDto.AreaCode + orderDto.No + "12345";
  1634. policeSend.SerialNumber = orderDto.AreaCode + orderDto.No + "12345";
  1635. }
  1636. //修改外部唯一ID
  1637. var orderData = await _dsOrderRepository.GetAsync(p => p.OrderId == orderDto.Id, cancellationToken);
  1638. if (orderData != null)
  1639. {
  1640. orderData.ExternalId = policeSend.AlarmReceiptNumber;
  1641. await _dsOrderRepository.UpdateAsync(orderData, cancellationToken);
  1642. }
  1643. //查询是否有此工单,如果没有新增此工单
  1644. var data = await _policeSendChainAlarmDsRepository.GetAsync(p => p.OrderId == orderDto.Id, cancellationToken);
  1645. if (data == null)
  1646. await _policeSendChainAlarmDsRepository.AddAsync(policeSend, cancellationToken);
  1647. }
  1648. /// <summary>
  1649. /// 110的非警情工单获取办理信息
  1650. /// </summary>
  1651. /// <param name="dto"></param>
  1652. /// <returns></returns>
  1653. private async Task InitPoliceSendChainDealDsAsync(OrderFlowDto dto, CancellationToken cancellationToken)
  1654. {
  1655. var data = await _policeSendChainDealDsRepository.GetAsync(p => p.OrderId == dto.Order.Id && p.DisposalType == (int)EDsDisposalType.OrderFiled, cancellationToken);
  1656. if (data == null)
  1657. {
  1658. data = new()
  1659. {
  1660. AlarmReceiptNumber = dto.Order.ExternalId,
  1661. FeedbackTime = dto.Order.ActualHandleTime,
  1662. DisposalSituation = dto.Order.ActualOpinion,
  1663. ResultDescription = dto.Order.ActualOpinion,
  1664. FeedbackPersonNumber = dto.Order.ActualHandlerId,
  1665. FeedbackPersonName = dto.Order.ActualHandlerName,
  1666. FeedbackUnitCode = dto.Order.ActualHandleOrgCode,
  1667. FeedbackUnitName = dto.Order.ActualHandleOrgName,
  1668. WarehousingTime = DateTime.Now,
  1669. DisposalType = 1,
  1670. OrderId = dto.Order.Id
  1671. };
  1672. await _policeSendChainDealDsRepository.AddAsync(data, cancellationToken);
  1673. }
  1674. else
  1675. {
  1676. data.AlarmReceiptNumber = dto.Order.ExternalId;
  1677. data.FeedbackTime = dto.Order.ActualHandleTime;
  1678. data.DisposalSituation = dto.Order.ActualOpinion;
  1679. data.ResultDescription = dto.Order.ActualOpinion;
  1680. data.FeedbackPersonNumber = dto.Order.ActualHandlerId;
  1681. data.FeedbackPersonName = dto.Order.ActualHandlerName;
  1682. data.FeedbackUnitCode = dto.Order.ActualHandleOrgCode;
  1683. data.FeedbackUnitName = dto.Order.ActualHandleOrgName;
  1684. data.WarehousingTime = DateTime.Now;
  1685. await _policeSendChainDealDsRepository.UpdateAsync(data, cancellationToken);
  1686. }
  1687. }
  1688. #endregion
  1689. #region 宜宾泸州市州数据提交
  1690. /// <summary>
  1691. /// 宜宾泸州市州数据提交
  1692. /// </summary>
  1693. /// <param name="dto"></param>
  1694. /// <returns></returns>
  1695. private async Task InitCityDataYBAsync(OrderDto dto, CancellationToken cancellationToken)
  1696. {
  1697. var cityHandOver = _channelConfigurationManager.GetConfigurationCityHandOver();
  1698. string source = cityHandOver.SendCityName;
  1699. string secretKey = GetMD5(source + cityHandOver.SecretKey);
  1700. string fromGender = dto.FromGender switch
  1701. {
  1702. EGender.Female => "2",
  1703. EGender.Male => "1",
  1704. _ => "0",
  1705. };
  1706. Dictionary<string, string> dicParam = new()
  1707. {
  1708. { "Code", secretKey },
  1709. { "FSHCode", dto.No },
  1710. { "ServerName", dto.IdentityType == EIdentityType.Enterprise ? "1" : "0"},
  1711. { "PurTypeName",dto.AcceptType },
  1712. { "ConTypeName", dto.HotspotSpliceName},
  1713. { "Title", dto.Title},
  1714. { "LinkName", dto.FromName},
  1715. { "Gender",fromGender},
  1716. { "Mobile", dto.Contact},
  1717. { "Mail","" },
  1718. { "Address", dto.Address },
  1719. { "Content", dto.Content},
  1720. { "Source",source }
  1721. };
  1722. //写入待推送数据
  1723. await InitPushDataAsync("InitCityDataYB", "CityHandOver.asmx/FlowWrite", System.Text.Json.JsonSerializer.Serialize(dicParam), platformSource: EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
  1724. }
  1725. #endregion
  1726. #region 宜宾企业专班数据提交
  1727. /// <summary>
  1728. /// 企业专班数据提交
  1729. /// </summary>
  1730. /// <param name="dto"></param>
  1731. /// <returns></returns>
  1732. private async Task InitEnterpriseDataAsync(OrderDto dto, CancellationToken cancellationToken)
  1733. {
  1734. var enterpriseData = _mapper.Map<PushWorkOrder>(dto);
  1735. var fileJson = _mapper.Map<List<FileJson>>(dto.FileJson);
  1736. var configEnterprise = _channelConfigurationManager.GetConfigurationEnterprise();
  1737. //将待推送数据写入待推送表
  1738. await InitPushDataAsync("EnterprisePushWorkOrder", "platform/12345/pushWorkOrder", System.Text.Json.JsonSerializer.Serialize(enterpriseData), platformSource: EPlatformSource.Enterprise, fileJson: fileJson, cancellationToken: cancellationToken);
  1739. }
  1740. #endregion
  1741. #region 初始化待推送数据
  1742. /// 初始化待推送数据
  1743. /// </summary>
  1744. /// <param name="taskType">任务类型</param>
  1745. /// <param name="path">请求地址</param>
  1746. /// <param name="request">请求参数</param>
  1747. /// <param name="pathType"></param>
  1748. /// <param name="cancellationToken"></param>
  1749. /// <param name="httpMethod">请求方式</param>
  1750. /// <param name="platformSource">推送平台</param>
  1751. /// <param name="taskPriority">任务优先级(0:最低级别)</param>
  1752. /// <param name="fileJson">附件</param>
  1753. /// <returns></returns>
  1754. private async Task InitPushDataAsync(string taskType, string path, string request,
  1755. string httpMethod = "Post",
  1756. EPlatformSource platformSource = EPlatformSource.Province,
  1757. EPathType pathType = EPathType.Other,
  1758. int taskPriority = 0,
  1759. List<FileJson>? fileJson = null,
  1760. CancellationToken cancellationToken = default)
  1761. {
  1762. //组装参数
  1763. DsSendTask dsSendTask = new()
  1764. {
  1765. TaskPriority = taskPriority,
  1766. TaskType = taskType,
  1767. HttpMethod = httpMethod,
  1768. Path = path,
  1769. PlatformSource = platformSource,
  1770. FileJson = fileJson,
  1771. Request = request,
  1772. PathType = pathType
  1773. };
  1774. await _dsSendTaskRepository.AddAsync(dsSendTask, cancellationToken);
  1775. }
  1776. #endregion
  1777. #region MD5 32位加密
  1778. /// <summary>
  1779. /// MD5 32位加密
  1780. /// </summary>
  1781. /// <param name="myString"></param>
  1782. /// <returns></returns>
  1783. private static string GetMD5(string myString)
  1784. {
  1785. string cl = myString;
  1786. string pwd = "";
  1787. try
  1788. {
  1789. //实例化一个md5对像
  1790. MD5 md5 = MD5.Create();
  1791. // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 
  1792. byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
  1793. // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
  1794. for (int i = 0; i < s.Length; i++)
  1795. {
  1796. // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
  1797. pwd = pwd + s[i].ToString("X2");
  1798. }
  1799. }
  1800. catch (Exception)
  1801. {
  1802. }
  1803. return pwd;
  1804. }
  1805. #endregion
  1806. #endregion
  1807. }
  1808. }