ProvinceService.cs 113 KB

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