ProvinceService.cs 98 KB

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