ProvinceService.cs 116 KB

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