HotlineWebController.cs 83 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696
  1. using DataSharing.CityStateDataExchange;
  2. using DataSharing.FwDataExchange;
  3. using DataSharing.HotlineWeb;
  4. using DataSharing.Police110.DaoShu110;
  5. using DataSharing.Province;
  6. using DataSharing.Province.SendTask;
  7. using DataSharing.Province.SendTask.ProvinceOther;
  8. using DataSharing.Province.SendTask.SubmitCaseInfo;
  9. using DataSharing.Province.SendTask.SubmitCaseProcess;
  10. using DataSharing.Province.SendTask.SubmitCaseRecord;
  11. using DataSharing.Province.SendTask.SubmitCaseResult;
  12. using DataSharing.RawData;
  13. using DataSharing.SendTask;
  14. using DataSharing.SendTask.OtherPlatforms;
  15. using DataSharing.Share.Consts;
  16. using DataSharing.Share.Dtos;
  17. using DataSharing.Share.Dtos.Common;
  18. using DataSharing.Share.Dtos.FwDataExchange;
  19. using DataSharing.Share.Dtos.HotlineSetting;
  20. using DataSharing.Share.Dtos.HotlineWeb;
  21. using DataSharing.Share.Enums;
  22. using DataSharing.Share.Requests;
  23. using DataSharing.YiBin.ConvergenceMedia;
  24. using DataSharing.YiBin.Enterprise;
  25. using DotNetCore.CAP;
  26. using Hotline.Share.Dtos;
  27. using Hotline.Share.Dtos.Order;
  28. using MapsterMapper;
  29. using MediatR;
  30. using Microsoft.AspNetCore.Authorization;
  31. using Microsoft.AspNetCore.Mvc;
  32. using SqlSugar;
  33. using StackExchange.Redis;
  34. using System.Security.Cryptography;
  35. using System.Text;
  36. using XC.RSAUtil;
  37. using XF.Domain.Cache;
  38. using XF.Domain.Exceptions;
  39. using XF.Domain.Repository;
  40. namespace DataSharing.Host.Controllers
  41. {
  42. /// <summary>
  43. ///
  44. /// </summary>
  45. public class HotlineWebController : BaseController
  46. {
  47. #region 注入
  48. private const string PublicKey = @"-----BEGIN PUBLIC KEY-----
  49. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgw+/x6IQPkH0A4eoF63j
  50. kLThsOXWyNBdcL9LATGy/G1yTHOr1RyKJB//iNug+V8DIoIHuFTlhgLHDbSqxvRW
  51. MONxIIF289riS6bDI4Ox/pFmOfmElFRk0lKGihaTE2Aefd6g/N+RfLLaHWztY+/v
  52. oVeDTiOIw9y3tokIxjKwuJ/mQ66MkKh78AqQjjSD/3jcBP8ZhMyCJOK9XQcqvhD6
  53. WBFWkxlAqKOWggDU7YohfrbNkg3bd0oGE6zCE2EHhkcQbzGCh3lu1zf4TfKMXD+P
  54. Prr5JWDNYQTXFQklqgae+Puge7xxZGYRoi5YpIUnkQGm6zpPxhIOdxlz+Yb5geSJ
  55. UQIDAQAB
  56. -----END PUBLIC KEY-----";
  57. private const string PrivateKey = @"-----BEGIN RSA PRIVATE KEY-----
  58. MIIEowIBAAKCAQEAgw+/x6IQPkH0A4eoF63jkLThsOXWyNBdcL9LATGy/G1yTHOr
  59. 1RyKJB//iNug+V8DIoIHuFTlhgLHDbSqxvRWMONxIIF289riS6bDI4Ox/pFmOfmE
  60. lFRk0lKGihaTE2Aefd6g/N+RfLLaHWztY+/voVeDTiOIw9y3tokIxjKwuJ/mQ66M
  61. kKh78AqQjjSD/3jcBP8ZhMyCJOK9XQcqvhD6WBFWkxlAqKOWggDU7YohfrbNkg3b
  62. d0oGE6zCE2EHhkcQbzGCh3lu1zf4TfKMXD+PPrr5JWDNYQTXFQklqgae+Puge7xx
  63. ZGYRoi5YpIUnkQGm6zpPxhIOdxlz+Yb5geSJUQIDAQABAoIBAAe+312BKUbsp0BV
  64. fOyCqoTLqTJHBcBneWY86pte9bjaZQYPU1PsdF452o8a38gXwpErBcwcjwCyWv48
  65. iQKUv8qdiSWGe+Jh3hGM1lKGfsyl3i3wnlJqgcI2U1zc2a4BoREHnmm4yBnfs2lI
  66. HegpRCG7u3cGPZfJtxJyxdHPfsc3wk8sXt+Byqkuym87l0a8wEF7b33f2hP2R7m/
  67. 37qYvTaGX3yN4s1rssQ3wBEfHEsesQmrQrEkRIUnWfgpkH3FdR5T1V4USC6GhM6x
  68. sIxqwBBYLL2LhVcNEifegqHtLZOw0VfUfpvoKnH5omSjUP5X+c8dmY9KPoKGpYFT
  69. l09fiRMCgYEAwSAmJr8G/xOCPtkRZ9qpxOwAeqA9iEhB3ViIydESrYMZGUaIKAWV
  70. ofOuDIdaMgW/2hyQtJasAnlX87Za7iODcBAMMAPSNiLEXk9nHWO+Xw/oMakgS5Dg
  71. uE2J02Bn4KFTCGALtfo70A40kkikkR2UdD4RG6j+DgI2JxxrCgaKiIMCgYEArbrv
  72. cvJs62LlvOFdVCY3mWEJkoBbStHGq2GdtZ5Rx9oNqiy3j/xT7Wav061OPCaC2rcd
  73. ALEH7AA3JJtAMr6QRv3HYyd2NIrlqS6pn4tInIpqlarrnVkkOk0WhsWVkScQJyx6
  74. eLKQ24zEF3wHslrRpHcclCWjtQ52TmWOuUvy9psCgYAWw6BbntbHSFho6hNIJ5kt
  75. Uhg4XB0ErGe/HIl7KH7IHxTdStgPx6C8p0mTxnyWOuFDZ2yTLNN3sy/v1UXgniUH
  76. F40oN7sWkICPEVL5PuGYuPpIqEPbRGeIsfMWDF4SN1HfQdr/h1B3lMUTnSZwyIjQ
  77. LuS7Wu8fXZlegNYJJ3462wKBgE5TSF9vktGw/djhVj15GXoKONGXExGxcDuWQA9A
  78. +Kf81EpT7NJ6tbADquPpb6tIxZgsFGRabDLnifT0FcaLCesnwXwfr3hS4uYaxpjK
  79. qAsDkLg3nhCLvvyWAsDyVdNiZDL1J6ZBA3Qoi8P2xFWSApB+ryDPs3YOtiH0QZui
  80. 9UBfAoGBAIQ2uv4J7ql++EpNNtLzOhTEpyjWS+qRSZRRXfKN2lm7e7czOsSpKIJx
  81. Q9PP8NTEmKqdI3WVFYqW/OlOFC6sjiscTOOn9Tc5Mrcn8ocCjAPjkhkCCVRMiJnv
  82. jxrWXHbT1FB6DqkdOnBbQqS1Azqz5HxLlSyEK3F60e3SgB5iZsDZ
  83. -----END RSA PRIVATE KEY-----";
  84. private readonly IMapper _mapper;
  85. private readonly IMediator _mediator;
  86. private readonly ICapPublisher _capPublisher;
  87. private readonly IRepository<DsOrderSend> _dsOrderSendRepository;
  88. private readonly IRepository<DsTelCall> _dsTelCallRepository;
  89. private readonly IRepository<ConfigurationInformation> _configurationInformationRepository;
  90. private readonly ITypedCache<ConfigurationInformationDto> _configurationInformationCache;
  91. private readonly IRepository<DsOrderVisitSend> _dsOrderVisitSendRepository;
  92. private readonly IRepository<DsKnowledgeRawData> _knowledgeRawDataRepository;
  93. private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
  94. private readonly IRepository<DsWaitSendTaskProvinceOther> _waitSendTaskProvinceOtherRepository;
  95. private readonly IRepository<DsSendTaskProvinceOther> _sendTaskProvinceOtherRepository;
  96. private readonly IRepository<DsWaitSendTaskSubmitCaseInfo> _waitSendTaskSubmitCaseInfoRepository;
  97. private readonly IRepository<DsSendTaskSubmitCaseInfo> _sendTaskSubmitCaseInfoRepository;
  98. private readonly IRepository<DsWaitSendTaskSubmitCaseProcess> _waitSendTaskSubmitCaseProcessRepository;
  99. private readonly IRepository<DsSendTaskSubmitCaseProcess> _sendTaskSubmitCaseProcessRepository;
  100. private readonly IRepository<DsWaitSendTaskSubmitCaseRecord> _waitSendTaskSubmitCaseRecordRepository;
  101. private readonly IRepository<DsSendTaskSubmitCaseRecord> _sendTaskSubmitCaseRecordRepository;
  102. private readonly IRepository<DsWaitSendTaskSubmitCaseResult> _waitSendTaskSubmitCaseResultRepository;
  103. private readonly IRepository<DsSendTaskSubmitCaseResult> _sendTaskSubmitCaseResultRepository;
  104. private readonly IWaitSendTaskRepository _waitSendTaskRepository;
  105. private readonly IRepository<DsSendTaskDetailInfo> _sendTaskDetailInfoRepository;
  106. private readonly IRepository<DsWaitSendTaskOtherPlatforms> _waitSendTaskOtherPlatformsRepository;
  107. private readonly IRepository<DsSendTaskOtherPlatforms> _sendTaskOtherPlatformsRepository;
  108. private readonly IInitPushDataService _initPushDataService;
  109. private readonly IRepository<DsSendTask> _taskRepository;
  110. private readonly IRepository<DsSendTaskInfo> _taskInfoRepository;
  111. private readonly IRepository<DsOrder> _dsOrderRepository;
  112. private readonly IRepository<SendHotlineErrorData> _sendHotlineErrorDataRepository;
  113. private readonly FwClient _fwClient;
  114. private readonly ISharingConfigurationManager _sharingConfigurationManager;
  115. private readonly IRepository<UserOperationLog> _userOperationLogRepository;
  116. private readonly IRepository<SendFwErrorData> _sendFwErrorDataRepository;
  117. private readonly IRepository<DsGetCaseMaterialInfo> _getCaseMaterialInfoRepository;
  118. private readonly IRepository<DsReceiveDataExchangeData> _dsReceiveDataExchangeDataRepository;
  119. private readonly IRepository<DsReceiveEnterpriseData> _dsReceiveEnterpriseDataRepository;
  120. private readonly IRepository<DsReceiveMediaData> _dsReceiveMediaDataRepository;
  121. private readonly IRepository<DsReceivePoliceData> _dsReceivePoliceDataRepository;
  122. public HotlineWebController(IMapper mapper,
  123. IMediator mediator,
  124. ICapPublisher capPublisher,
  125. IRepository<DsOrderSend> dsOrderSendRepository,
  126. IRepository<DsTelCall> dsTelCallRepository,
  127. IRepository<ConfigurationInformation> configurationInformationRepository,
  128. ITypedCache<ConfigurationInformationDto> configurationInformationCache,
  129. IRepository<DsOrderVisitSend> dsOrderVisitSendRepository,
  130. IRepository<DsKnowledgeRawData> knowledgeRawDataRepository,
  131. IRepository<DsUserTokenInfo> dsUserTokenInfoRepository,
  132. IRepository<DsWaitSendTaskProvinceOther> waitSendTaskProvinceOtherRepository,
  133. IRepository<DsSendTaskProvinceOther> sendTaskProvinceOtherRepository,
  134. IRepository<DsWaitSendTaskSubmitCaseInfo> waitSendTaskSubmitCaseInfoRepository,
  135. IRepository<DsSendTaskSubmitCaseInfo> sendTaskSubmitCaseInfoRepository,
  136. IRepository<DsWaitSendTaskSubmitCaseProcess> waitSendTaskSubmitCaseProcessRepository,
  137. IRepository<DsSendTaskSubmitCaseProcess> sendTaskSubmitCaseProcessRepository,
  138. IRepository<DsWaitSendTaskSubmitCaseRecord> waitSendTaskSubmitCaseRecordRepository,
  139. IRepository<DsSendTaskSubmitCaseRecord> sendTaskSubmitCaseRecordRepository,
  140. IRepository<DsWaitSendTaskSubmitCaseResult> waitSendTaskSubmitCaseResultRepository,
  141. IRepository<DsSendTaskSubmitCaseResult> sendTaskSubmitCaseResultRepository,
  142. IWaitSendTaskRepository waitSendTaskRepository,
  143. IRepository<DsSendTaskDetailInfo> sendTaskDetailInfoRepository,
  144. IRepository<DsWaitSendTaskOtherPlatforms> waitSendTaskOtherPlatformsRepository,
  145. IRepository<DsSendTaskOtherPlatforms> sendTaskOtherPlatformsRepository,
  146. IInitPushDataService initPushDataService,
  147. IRepository<DsSendTask> taskRepository,
  148. IRepository<DsSendTaskInfo> taskInfoRepository,
  149. IRepository<DsOrder> dsOrderRepository,
  150. IRepository<SendHotlineErrorData> sendHotlineErrorDataRepository,
  151. FwClient fwClient,
  152. ISharingConfigurationManager sharingConfigurationManager,
  153. IRepository<UserOperationLog> userOperationLogRepository,
  154. IRepository<SendFwErrorData> sendFwErrorDataRepository,
  155. IRepository<DsGetCaseMaterialInfo> getCaseMaterialInfoRepository,
  156. IRepository<DsReceiveDataExchangeData> dsReceiveDataExchangeDataRepository,
  157. IRepository<DsReceiveEnterpriseData> dsReceiveEnterpriseDataRepository,
  158. IRepository<DsReceiveMediaData> dsReceiveMediaDataRepository,
  159. IRepository<DsReceivePoliceData> dsReceivePoliceDataRepository
  160. )
  161. {
  162. _mapper = mapper;
  163. _mediator = mediator;
  164. _capPublisher = capPublisher;
  165. _dsOrderSendRepository = dsOrderSendRepository;
  166. _dsTelCallRepository = dsTelCallRepository;
  167. _configurationInformationRepository = configurationInformationRepository;
  168. _configurationInformationCache = configurationInformationCache;
  169. _dsOrderVisitSendRepository = dsOrderVisitSendRepository;
  170. _knowledgeRawDataRepository = knowledgeRawDataRepository;
  171. _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
  172. _waitSendTaskProvinceOtherRepository = waitSendTaskProvinceOtherRepository;
  173. _sendTaskProvinceOtherRepository = sendTaskProvinceOtherRepository;
  174. _waitSendTaskSubmitCaseInfoRepository = waitSendTaskSubmitCaseInfoRepository;
  175. _sendTaskSubmitCaseInfoRepository = sendTaskSubmitCaseInfoRepository;
  176. _waitSendTaskSubmitCaseProcessRepository = waitSendTaskSubmitCaseProcessRepository;
  177. _sendTaskSubmitCaseProcessRepository = sendTaskSubmitCaseProcessRepository;
  178. _waitSendTaskSubmitCaseRecordRepository = waitSendTaskSubmitCaseRecordRepository;
  179. _sendTaskSubmitCaseRecordRepository = sendTaskSubmitCaseRecordRepository;
  180. _waitSendTaskSubmitCaseResultRepository = waitSendTaskSubmitCaseResultRepository;
  181. _sendTaskSubmitCaseResultRepository = sendTaskSubmitCaseResultRepository;
  182. _waitSendTaskRepository = waitSendTaskRepository;
  183. _sendTaskDetailInfoRepository = sendTaskDetailInfoRepository;
  184. _waitSendTaskOtherPlatformsRepository = waitSendTaskOtherPlatformsRepository;
  185. _sendTaskOtherPlatformsRepository = sendTaskOtherPlatformsRepository;
  186. _initPushDataService = initPushDataService;
  187. _taskRepository = taskRepository;
  188. _taskInfoRepository = taskInfoRepository;
  189. _dsOrderRepository = dsOrderRepository;
  190. _sendHotlineErrorDataRepository = sendHotlineErrorDataRepository;
  191. _fwClient = fwClient;
  192. _sharingConfigurationManager = sharingConfigurationManager;
  193. _userOperationLogRepository = userOperationLogRepository;
  194. _sendFwErrorDataRepository = sendFwErrorDataRepository;
  195. _getCaseMaterialInfoRepository = getCaseMaterialInfoRepository;
  196. _dsReceiveDataExchangeDataRepository = dsReceiveDataExchangeDataRepository;
  197. _dsReceiveEnterpriseDataRepository = dsReceiveEnterpriseDataRepository;
  198. _dsReceiveMediaDataRepository = dsReceiveMediaDataRepository;
  199. _dsReceivePoliceDataRepository = dsReceivePoliceDataRepository;
  200. }
  201. #endregion
  202. #region 数据推送查询统计---旧版
  203. /// <summary>
  204. /// 查询推送任务
  205. /// </summary>
  206. /// <param name="dto"></param>
  207. /// <returns></returns>
  208. [HttpGet("getdssendtask")]
  209. [AllowAnonymous]
  210. public async Task<PagedDto<DsSendTaskDto>> GetDsSendTask([FromQuery] QuerySendTaskDto dto)
  211. {
  212. //数据查询
  213. RefAsync<int> total = 0;
  214. var items = await _taskRepository.Queryable()
  215. .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
  216. .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
  217. .WhereIF(!string.IsNullOrEmpty(dto.Id), p => p.Id == dto.Id)
  218. .WhereIF(dto.IsSuccess.HasValue, p => p.IsSuccess == dto.IsSuccess)
  219. .OrderByDescending(p => p.CreationTime)
  220. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  221. return new PagedDto<DsSendTaskDto>(total, _mapper.Map<List<DsSendTaskDto>>(items));
  222. }
  223. /// <summary>
  224. /// 查询任务推送明细
  225. /// </summary>
  226. /// <param name="dto"></param>
  227. /// <returns></returns>
  228. [HttpGet("getdssendtaskinfo")]
  229. [AllowAnonymous]
  230. public async Task<PagedDto<DsSendTaskInfo>> GetDsSendTaskInfo([FromQuery] QuerySendTaskDto dto)
  231. {
  232. //数据查询
  233. RefAsync<int> total = 0;
  234. var items = await _taskInfoRepository.Queryable()
  235. .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
  236. .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
  237. .WhereIF(!string.IsNullOrEmpty(dto.Id), p => p.TaskId == dto.Id)
  238. .WhereIF(dto.IsSuccess.HasValue, p => p.IsSuccess == dto.IsSuccess)
  239. .OrderByDescending(p => p.CreationTime)
  240. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  241. return new PagedDto<DsSendTaskInfo>(total, items);
  242. }
  243. /// <summary>
  244. /// 根据ID从新推送
  245. /// </summary>
  246. /// <param name="id">推送任务Id</param>
  247. /// <returns></returns>
  248. [HttpGet("fromnewtasksend")]
  249. [AllowAnonymous]
  250. public async Task FromNewTaskSend(string id)
  251. {
  252. var dto = await _taskRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
  253. if (dto != null)
  254. {
  255. dto.IsSuccess = false;
  256. dto.SendTimes = 1;
  257. await _taskRepository.UpdateAsync(dto, HttpContext.RequestAborted);
  258. }
  259. // await _pusherProviderService.SendProvinceDataPusher(dto, HttpContext.RequestAborted);
  260. }
  261. /// <summary>
  262. /// 修改状态为已推送,防止错误数据一直请求
  263. /// </summary>
  264. /// <param name="id"></param>
  265. /// <returns></returns>
  266. [HttpGet("updatetasksendstate")]
  267. [AllowAnonymous]
  268. public async Task UpdateTaskSendState(string id)
  269. {
  270. var dto = await _taskRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
  271. if (dto != null)
  272. {
  273. dto.SendTimes = 7;
  274. await _taskRepository.UpdateAsync(dto, HttpContext.RequestAborted);
  275. }
  276. }
  277. /// <summary>
  278. /// 查询工单及时上传列表
  279. /// </summary>
  280. /// <param name="dto"></param>
  281. /// <returns></returns>
  282. [HttpGet("getorderlist")]
  283. [AllowAnonymous]
  284. public async Task<PagedDto<object>> GetOrderlist([FromQuery] QuerySendTaskDto dto)
  285. {
  286. if (!dto.StartTime.HasValue)
  287. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  288. if (!dto.EndTime.HasValue)
  289. dto.EndTime = dto.StartTime.Value.AddDays(1).AddSeconds(-1);
  290. else
  291. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  292. //数据查询
  293. RefAsync<int> total = 0;
  294. var items = await _dsOrderRepository.Queryable()
  295. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  296. .Where(p => p.FirstSendProvinceTime != null)
  297. .Where(p => p.StartTime != null)
  298. .Select(p => new
  299. {
  300. p.OrderId,
  301. p.OrderNo,
  302. p.ProvinceNo,
  303. p.WorkflowId,
  304. p.ExternalId,
  305. p.Password,
  306. p.Title,
  307. p.FromName,
  308. p.Contact,
  309. p.Content,
  310. p.CaseDate,
  311. p.StartTime,
  312. p.CallId,
  313. p.FirstSendProvinceTime,
  314. p.LastSendProvinceTime,
  315. p.CaseSource,
  316. p.CaseSourceCode,
  317. p.HotspotId,
  318. p.HotspotName,
  319. p.HotspotSpliceName,
  320. p.ExpiredTime,
  321. p.CaseType,
  322. p.CaseTypeCode,
  323. p.CreationTime
  324. })
  325. .MergeTable()
  326. .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == true, p => SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) <= 180)//及时上传
  327. .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == false, p => SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) > 180)//不及时上传
  328. .OrderByDescending(p => p.CreationTime)
  329. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  330. return new PagedDto<object>(total, items);
  331. }
  332. /// <summary>
  333. /// 查询通话记录及时上传列表
  334. /// </summary>
  335. /// <param name="dto"></param>
  336. /// <returns></returns>
  337. [HttpGet("getcalllist")]
  338. [AllowAnonymous]
  339. public async Task<PagedDto<object>> GetCalllist([FromQuery] QuerySendTaskDto dto)
  340. {
  341. if (!dto.StartTime.HasValue)
  342. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  343. if (!dto.EndTime.HasValue)
  344. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  345. RefAsync<int> total = 0;
  346. var items = await _dsTelCallRepository.Queryable()
  347. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  348. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  349. .Where(p => p.FirstSendProvinceTime != null)
  350. .Where(p => p.OverTime != null)
  351. .Select(p => new
  352. {
  353. p.CallId,
  354. p.CPN,
  355. p.CDPN,
  356. p.CallDirection,
  357. p.TelNo,
  358. p.UserName,
  359. p.BeginIvrTime,
  360. p.EndIvrTime,
  361. p.BeginQueueTime,
  362. p.EndQueueTime,
  363. p.BeginRingTime,
  364. p.EndRingTimg,
  365. p.AnsweredTime,
  366. p.OverTime,
  367. p.Duration,
  368. p.RingTimes,
  369. p.QueueTims,
  370. p.OnState,
  371. p.RecordingFileUrl,
  372. p.ProvinceNo,
  373. p.FirstSendProvinceTime,
  374. p.LastSendProvinceTime,
  375. p.TaskId,
  376. p.CreationTime
  377. })
  378. .MergeTable()
  379. .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == true, p => SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) <= 180)//及时
  380. .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == false, p => SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) > 180)//不及时
  381. .OrderByDescending(p => p.CreationTime)
  382. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  383. return new PagedDto<object>(total, items);
  384. }
  385. /// <summary>
  386. /// 查询没匹配到通话记录的电话来源工单
  387. /// </summary>
  388. /// <param name="dto"></param>
  389. /// <returns></returns>
  390. [HttpGet("getordermatchingcall")]
  391. [AllowAnonymous]
  392. public async Task<PagedDto<DsOrder>> GetOrderMatchingCall([FromQuery] QuerySendTaskDto dto)
  393. {
  394. if (!dto.StartTime.HasValue)
  395. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  396. if (!dto.EndTime.HasValue)
  397. dto.EndTime = dto.StartTime.Value.AddDays(1).AddSeconds(-1);
  398. else
  399. dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
  400. RefAsync<int> total = 0;
  401. var items = await _dsOrderRepository.Queryable()
  402. .LeftJoin<DsTelCall>((p, o) => p.CallId == o.CallId)
  403. .Where((p, o) => p.FirstSendProvinceTime >= dto.StartTime && p.FirstSendProvinceTime <= dto.EndTime && p.CaseSourceCode == "RGDH")
  404. .Where((p, o) => p.FirstSendProvinceTime.HasValue)
  405. .Where((p, o) => o.CallId == null)
  406. .OrderByDescending((p, o) => p.CreationTime)
  407. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  408. return new PagedDto<DsOrder>(total, _mapper.Map<IReadOnlyList<DsOrder>>(items));
  409. }
  410. /// <summary>
  411. /// 及时率查询
  412. /// </summary>
  413. /// <param name="StartTime"></param>
  414. /// <param name="EndTime"></param>
  415. /// <returns></returns>
  416. [HttpGet("calculateuploadrate")]
  417. [AllowAnonymous]
  418. public async Task<CalculateUploadRateDto> CalculateUploadRate(DateTime StartTime, DateTime EndTime)
  419. {
  420. EndTime = EndTime.AddDays(1).AddSeconds(-1);
  421. CalculateUploadRateDto calculateUploadRateDto = new();
  422. //工单
  423. var orderRate = await _dsOrderRepository.Queryable()
  424. .LeftJoin<DsTelCall>((p, o) => p.CallId == o.CallId)
  425. .Where((p, o) => p.CreationTime >= StartTime && p.CreationTime <= EndTime && p.FirstSendProvinceTime >= StartTime && p.FirstSendProvinceTime <= EndTime)
  426. .Where((p, o) => p.FirstSendProvinceTime.HasValue)
  427. .Where((p, o) => p.StartTime.HasValue)
  428. .Select((p, o) => new
  429. {
  430. p.OrderId,
  431. p.StartTime,
  432. p.FirstSendProvinceTime,
  433. p.CaseSourceCode,
  434. o.CallId,
  435. p.HandleState,
  436. p.ExpiredTime,
  437. p.ActualHandleTime
  438. }).MergeTable()
  439. .Select(p => new CalculateUploadRateDto
  440. {
  441. OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OrderId != null, 1, 0)),//总工单数
  442. OrderTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) <= 180, 1, 0)),//及时
  443. OrderNotTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) > 180, 1, 0)),//为及时
  444. RGDHOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH", 1, 0)),
  445. ContainTel = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH" && p.CallId != null, 1, 0)),//匹配数
  446. NotContainTel = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH" && p.CallId == null, 1, 0)),//未匹配数
  447. HandleEndOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.HandleState == "办理完成", 1, 0)),//办结件数
  448. HandleEndOrderOnTime = SqlFunc.AggregateSum(SqlFunc.IIF(p.HandleState == "办理完成" && p.ExpiredTime > p.ActualHandleTime, 1, 0)),//按时办结件数
  449. })
  450. .ToListAsync();
  451. //电话
  452. var callRate = await _dsTelCallRepository.Queryable()
  453. .Where(p => p.OverTime >= StartTime && p.OverTime <= EndTime && p.FirstSendProvinceTime >= StartTime && p.FirstSendProvinceTime <= EndTime)
  454. .Where(p => p.FirstSendProvinceTime.HasValue)
  455. .Where(p => p.OverTime.HasValue)
  456. .Select(p => new
  457. {
  458. p.CallId,
  459. p.OverTime,
  460. p.FirstSendProvinceTime,
  461. p.OnState
  462. })
  463. .MergeTable()
  464. .Select(p => new CalculateUploadRateDto
  465. {
  466. TelCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.CallId != null, 1, 0)),//总电话数
  467. TelTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) <= 180, 1, 0)),//及时
  468. TelNotTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) > 180, 1, 0)),//为及时
  469. TelConnectCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OnState == "On", 1, 0)),//接通数量
  470. TelNotConnectCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OnState != "On", 1, 0)),//未接通数量
  471. })
  472. .ToListAsync();
  473. //回访
  474. var visitList = await _dsOrderVisitSendRepository.Queryable()
  475. .Where(p => p.VisitTime >= StartTime && p.VisitTime <= EndTime && p.IsProvince == false && p.FirstSendProvinceTime >= StartTime && p.FirstSendProvinceTime <= EndTime)
  476. .Select(p => new
  477. {
  478. p.SubjectResultSatifyCode,
  479. p.VisitTime,
  480. p.IsProvince,
  481. p.Source,
  482. p.ProvinceNo
  483. })
  484. .MergeTable()
  485. .Select(p => new CalculateUploadRateDto
  486. {
  487. VisitCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null, 1, 0)),//回访总量
  488. SatisfactionCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null && p.SubjectResultSatifyCode != "2", 1, 0)),//满意数量
  489. NotSatisfiedCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null && p.SubjectResultSatifyCode == "2", 1, 0)),//不满意数量
  490. })
  491. .ToListAsync();
  492. //查询知识总量
  493. calculateUploadRateDto.KnowledgeCount = await _knowledgeRawDataRepository.Queryable()
  494. .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
  495. .CountAsync();
  496. //修改知识库量-以第一次上传成功的记录为准
  497. calculateUploadRateDto.UpdateKnowledgeCount = await _taskRepository.Queryable()
  498. .Where(p => p.FirstTime >= StartTime && p.FirstTime <= EndTime && p.TaskType == "GetKnowledgeInfoUpdate")
  499. .Select(p => new
  500. {
  501. p.Id,
  502. RowID = SqlFunc.RowNumber($"{p.CreationTime} asc ")
  503. })
  504. .MergeTable()
  505. .Where(p => p.RowID == 1)
  506. .CountAsync();
  507. //工单
  508. if (orderRate != null && orderRate.Count > 0)
  509. {
  510. var orderRateData = orderRate[0];
  511. calculateUploadRateDto.OrderCountNum = orderRateData.OrderCountNum;
  512. calculateUploadRateDto.OrderTimely = orderRateData.OrderTimely;
  513. calculateUploadRateDto.OrderNotTimely = orderRateData.OrderNotTimely;
  514. calculateUploadRateDto.RGDHOrderCount = orderRateData.RGDHOrderCount;
  515. calculateUploadRateDto.ContainTel = orderRateData.ContainTel;
  516. calculateUploadRateDto.NotContainTel = orderRateData.NotContainTel;
  517. calculateUploadRateDto.HandleEndOrderNum = orderRateData.HandleEndOrderNum;
  518. calculateUploadRateDto.HandleEndOrderOnTime = orderRateData.HandleEndOrderOnTime;
  519. }
  520. //电话
  521. if (callRate != null && callRate.Count > 0)
  522. {
  523. var callRateData = callRate[0];
  524. calculateUploadRateDto.TelCountNum = callRateData.TelCountNum;
  525. calculateUploadRateDto.TelTimely = callRateData.TelTimely;
  526. calculateUploadRateDto.TelNotTimely = callRateData.TelNotTimely;
  527. calculateUploadRateDto.TelConnectCountNum = callRateData.TelConnectCountNum;
  528. calculateUploadRateDto.TelNotConnectCountNum = callRateData.TelNotConnectCountNum;
  529. }
  530. //回访
  531. if (visitList != null && visitList.Count > 0)
  532. {
  533. var visitRateData = visitList[0];
  534. calculateUploadRateDto.VisitCountNum = visitRateData.VisitCountNum;
  535. calculateUploadRateDto.SatisfactionCountNum = visitRateData.SatisfactionCountNum;
  536. calculateUploadRateDto.NotSatisfiedCountNum = visitRateData.NotSatisfiedCountNum;
  537. }
  538. return calculateUploadRateDto;
  539. }
  540. #endregion
  541. #region 数据推送查询统计---最新
  542. #region 推送任务
  543. /// <summary>
  544. /// 省平台待推送数据
  545. /// </summary>
  546. /// <param name="dto"></param>
  547. /// <returns></returns>
  548. [HttpGet("getprovincewaitsendtasklist")]
  549. [AllowAnonymous]
  550. public async Task<PagedDto<DsWaitSendTaskDto>> GetProvinceWaitSendTaskList([FromQuery] QuerySendTaskDto dto)
  551. {
  552. if (!dto.StartTime.HasValue)
  553. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  554. if (!dto.EndTime.HasValue)
  555. dto.EndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  556. #region 其他接口
  557. //其他接口
  558. var waitSendTaskProvinceOther = _waitSendTaskProvinceOtherRepository.Queryable()
  559. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  560. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  561. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  562. .Select(p => new DsWaitSendTaskDto
  563. {
  564. Id = p.Id,
  565. ProvinceNo = p.ProvinceNo,
  566. FirstTime = p.FirstTime,
  567. LastTime = p.LastTime,
  568. SendTimes = p.SendTimes,
  569. PlatformSource = EPlatformSource.Province,
  570. TaskType = p.TaskType,
  571. HttpMethod = p.HttpMethod,
  572. Path = p.Path,
  573. Request = p.Request,
  574. PathType = p.PathType,
  575. GenerationTime = p.GenerationTime,
  576. CreationTime = p.CreationTime,
  577. State = p.State
  578. })
  579. .MergeTable();
  580. #endregion
  581. #region 服务工单受理
  582. //服务工单受理
  583. var waitSendTaskSubmitCaseInfo = _waitSendTaskSubmitCaseInfoRepository.Queryable()
  584. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  585. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  586. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  587. .Select(p => new DsWaitSendTaskDto
  588. {
  589. Id = p.Id,
  590. ProvinceNo = p.ProvinceNo,
  591. FirstTime = p.FirstTime,
  592. LastTime = p.LastTime,
  593. SendTimes = p.SendTimes,
  594. PlatformSource = EPlatformSource.Province,
  595. TaskType = p.TaskType,
  596. HttpMethod = p.HttpMethod,
  597. Path = p.Path,
  598. Request = p.Request,
  599. PathType = p.PathType,
  600. GenerationTime = p.GenerationTime,
  601. CreationTime = p.CreationTime,
  602. State = p.State
  603. })
  604. .MergeTable();
  605. #endregion
  606. #region 服务工单处理过程
  607. //服务工单处理过程
  608. var waitSendTaskSubmitCaseProcess = _waitSendTaskSubmitCaseProcessRepository.Queryable()
  609. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  610. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  611. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  612. .Select(p => new DsWaitSendTaskDto
  613. {
  614. Id = p.Id,
  615. ProvinceNo = p.ProvinceNo,
  616. FirstTime = p.FirstTime,
  617. LastTime = p.LastTime,
  618. SendTimes = p.SendTimes,
  619. PlatformSource = EPlatformSource.Province,
  620. TaskType = p.TaskType,
  621. HttpMethod = p.HttpMethod,
  622. Path = p.Path,
  623. Request = p.Request,
  624. PathType = p.PathType,
  625. GenerationTime = p.GenerationTime,
  626. CreationTime = p.CreationTime,
  627. State = p.State
  628. })
  629. .MergeTable();
  630. #endregion
  631. #region 电话记录
  632. //电话记录
  633. var waitSendTaskSubmitCaseRecord = _waitSendTaskSubmitCaseRecordRepository.Queryable()
  634. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  635. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  636. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  637. .Select(p => new DsWaitSendTaskDto
  638. {
  639. Id = p.Id,
  640. ProvinceNo = p.ProvinceNo,
  641. FirstTime = p.FirstTime,
  642. LastTime = p.LastTime,
  643. SendTimes = p.SendTimes,
  644. PlatformSource = EPlatformSource.Province,
  645. TaskType = p.TaskType,
  646. HttpMethod = p.HttpMethod,
  647. Path = p.Path,
  648. Request = p.Request,
  649. PathType = p.PathType,
  650. GenerationTime = p.GenerationTime,
  651. CreationTime = p.CreationTime,
  652. State = p.State
  653. })
  654. .MergeTable();
  655. #endregion
  656. #region 服务工单处理结果
  657. //服务工单处理结果
  658. var waitSendTaskSubmitCaseResult = _waitSendTaskSubmitCaseResultRepository.Queryable()
  659. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  660. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  661. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  662. .Select(p => new DsWaitSendTaskDto
  663. {
  664. Id = p.Id,
  665. ProvinceNo = p.ProvinceNo,
  666. FirstTime = p.FirstTime,
  667. LastTime = p.LastTime,
  668. SendTimes = p.SendTimes,
  669. PlatformSource = EPlatformSource.Province,
  670. TaskType = p.TaskType,
  671. HttpMethod = p.HttpMethod,
  672. Path = p.Path,
  673. Request = p.Request,
  674. PathType = p.PathType,
  675. GenerationTime = p.GenerationTime,
  676. CreationTime = p.CreationTime,
  677. State = p.State
  678. })
  679. .MergeTable();
  680. #endregion
  681. //连表查询数据
  682. RefAsync<int> total = 0;
  683. var items = await _waitSendTaskRepository.UnionAll(waitSendTaskProvinceOther, waitSendTaskSubmitCaseInfo, waitSendTaskSubmitCaseProcess,
  684. waitSendTaskSubmitCaseRecord, waitSendTaskSubmitCaseResult).MergeTable()
  685. .OrderBy(p => p.CreationTime)
  686. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  687. return new PagedDto<DsWaitSendTaskDto>(total, _mapper.Map<List<DsWaitSendTaskDto>>(items));
  688. }
  689. /// <summary>
  690. /// 其他平台待推送数据
  691. /// </summary>
  692. /// <param name="dto"></param>
  693. /// <returns></returns>
  694. [HttpGet("getotherplatformswaitsendtasklist")]
  695. [AllowAnonymous]
  696. public async Task<PagedDto<DsWaitSendTaskDto>> GetOtherPlatformsWaitSendTaskList([FromQuery] QuerySendTaskDto dto)
  697. {
  698. if (!dto.StartTime.HasValue)
  699. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  700. if (!dto.EndTime.HasValue)
  701. dto.EndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  702. RefAsync<int> total = 0;
  703. //其他平台
  704. var items = await _waitSendTaskOtherPlatformsRepository.Queryable()
  705. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  706. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  707. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  708. .Select(p => new DsWaitSendTaskDto
  709. {
  710. Id = p.Id,
  711. ProvinceNo = p.ProvinceNo,
  712. FirstTime = p.FirstTime,
  713. LastTime = p.LastTime,
  714. SendTimes = p.SendTimes,
  715. PlatformSource = p.PlatformSource,
  716. TaskType = p.TaskType,
  717. HttpMethod = p.HttpMethod,
  718. Path = p.Path,
  719. Request = p.Request,
  720. PathType = p.PathType,
  721. GenerationTime = p.GenerationTime,
  722. CreationTime = p.CreationTime
  723. })
  724. .MergeTable()
  725. .OrderBy(p => p.CreationTime)
  726. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  727. return new PagedDto<DsWaitSendTaskDto>(total, _mapper.Map<List<DsWaitSendTaskDto>>(items));
  728. }
  729. /// <summary>
  730. /// 查询任务推送明细
  731. /// </summary>
  732. /// <param name="dto"></param>
  733. /// <returns></returns>
  734. [HttpGet("getdssenddetailtaskinfo")]
  735. [AllowAnonymous]
  736. public async Task<PagedDto<DsSendTaskDetailInfo>> GetDsSendDetailTaskInfo([FromQuery] QuerySendTaskDto dto)
  737. {
  738. //数据查询
  739. RefAsync<int> total = 0;
  740. var items = await _sendTaskDetailInfoRepository.Queryable()
  741. .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
  742. .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
  743. .WhereIF(!string.IsNullOrEmpty(dto.Id), p => p.TaskId == dto.Id)
  744. .WhereIF(dto.IsSuccess.HasValue, p => p.IsSuccess == dto.IsSuccess)
  745. .OrderByDescending(p => p.CreationTime)
  746. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  747. return new PagedDto<DsSendTaskDetailInfo>(total, items);
  748. }
  749. /// <summary>
  750. /// 查询已推送任务 查询类型 1:服务工单受理,2、电话记录,3、服务工单处理过程,4、服务工单处理结果,5、省平台其他推送,6、其他平台
  751. /// </summary>
  752. /// <param name="dto"></param>
  753. /// <returns></returns>
  754. [HttpGet("getdssendendtask")]
  755. [AllowAnonymous]
  756. public async Task<PagedDto<DsEndSendTaskDto>> GetDsSendEndTask([FromQuery] QuerySendTaskDto dto)
  757. {
  758. if (!dto.StartTime.HasValue)
  759. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  760. if (!dto.EndTime.HasValue)
  761. dto.EndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  762. //数据查询
  763. RefAsync<int> total = 0;
  764. //服务工单受理
  765. if (dto.SelectType == "1")
  766. {
  767. //服务工单受理
  768. var items = await _sendTaskSubmitCaseInfoRepository.Queryable()
  769. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  770. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  771. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  772. .Select(p => new DsEndSendTaskDto
  773. {
  774. Id = p.Id,
  775. ProvinceNo = p.ProvinceNo,
  776. FirstTime = p.FirstTime,
  777. LastTime = p.LastTime,
  778. SendTimes = p.SendTimes,
  779. PlatformSource = EPlatformSource.Province,
  780. TaskType = p.TaskType,
  781. HttpMethod = p.HttpMethod,
  782. Path = p.Path,
  783. Request = p.Request,
  784. PathType = p.PathType,
  785. GenerationTime = p.GenerationTime,
  786. CreationTime = p.CreationTime,
  787. IsSuccess = p.IsSuccess,
  788. ExpiredTime= p.ExpiredTime
  789. })
  790. .MergeTable()
  791. .OrderByDescending(p => p.CreationTime)
  792. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  793. return new PagedDto<DsEndSendTaskDto>(total, _mapper.Map<List<DsEndSendTaskDto>>(items));
  794. }
  795. //电话记录
  796. if (dto.SelectType == "2")
  797. {
  798. //电话记录
  799. var items = await _sendTaskSubmitCaseRecordRepository.Queryable()
  800. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  801. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  802. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  803. .Select(p => new DsEndSendTaskDto
  804. {
  805. Id = p.Id,
  806. ProvinceNo = p.ProvinceNo,
  807. FirstTime = p.FirstTime,
  808. LastTime = p.LastTime,
  809. SendTimes = p.SendTimes,
  810. PlatformSource = EPlatformSource.Province,
  811. TaskType = p.TaskType,
  812. HttpMethod = p.HttpMethod,
  813. Path = p.Path,
  814. Request = p.Request,
  815. PathType = p.PathType,
  816. GenerationTime = p.GenerationTime,
  817. CreationTime = p.CreationTime,
  818. IsSuccess = p.IsSuccess
  819. })
  820. .MergeTable()
  821. .OrderByDescending(p => p.CreationTime)
  822. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  823. return new PagedDto<DsEndSendTaskDto>(total, _mapper.Map<List<DsEndSendTaskDto>>(items));
  824. }
  825. //服务工单处理过程
  826. if (dto.SelectType == "3")
  827. {
  828. //服务工单处理过程
  829. var items = await _sendTaskSubmitCaseProcessRepository.Queryable()
  830. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  831. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  832. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  833. .Select(p => new DsEndSendTaskDto
  834. {
  835. Id = p.Id,
  836. ProvinceNo = p.ProvinceNo,
  837. FirstTime = p.FirstTime,
  838. LastTime = p.LastTime,
  839. SendTimes = p.SendTimes,
  840. PlatformSource = EPlatformSource.Province,
  841. TaskType = p.TaskType,
  842. HttpMethod = p.HttpMethod,
  843. Path = p.Path,
  844. Request = p.Request,
  845. PathType = p.PathType,
  846. GenerationTime = p.GenerationTime,
  847. CreationTime = p.CreationTime,
  848. IsSuccess = p.IsSuccess
  849. })
  850. .OrderByDescending(p => p.CreationTime)
  851. .MergeTable().ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  852. return new PagedDto<DsEndSendTaskDto>(total, _mapper.Map<List<DsEndSendTaskDto>>(items));
  853. }
  854. //服务工单处理结果
  855. if (dto.SelectType == "4")
  856. {
  857. //服务工单处理结果
  858. var items = await _sendTaskSubmitCaseResultRepository.Queryable()
  859. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  860. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  861. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  862. .Select(p => new DsEndSendTaskDto
  863. {
  864. Id = p.Id,
  865. ProvinceNo = p.ProvinceNo,
  866. FirstTime = p.FirstTime,
  867. LastTime = p.LastTime,
  868. SendTimes = p.SendTimes,
  869. PlatformSource = EPlatformSource.Province,
  870. TaskType = p.TaskType,
  871. HttpMethod = p.HttpMethod,
  872. Path = p.Path,
  873. Request = p.Request,
  874. PathType = p.PathType,
  875. GenerationTime = p.GenerationTime,
  876. CreationTime = p.CreationTime,
  877. IsSuccess = p.IsSuccess,
  878. ExpiredTime = p.ExpiredTime,
  879. FiledTime=p.FiledTime
  880. })
  881. .OrderByDescending(p => p.CreationTime)
  882. .MergeTable().ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  883. return new PagedDto<DsEndSendTaskDto>(total, _mapper.Map<List<DsEndSendTaskDto>>(items));
  884. }
  885. //其他接口
  886. if (dto.SelectType == "5")
  887. {
  888. //其他接口
  889. var items = await _sendTaskProvinceOtherRepository.Queryable()
  890. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  891. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  892. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  893. .Select(p => new DsEndSendTaskDto
  894. {
  895. Id = p.Id,
  896. ProvinceNo = p.ProvinceNo,
  897. FirstTime = p.FirstTime,
  898. LastTime = p.LastTime,
  899. SendTimes = p.SendTimes,
  900. PlatformSource = EPlatformSource.Province,
  901. TaskType = p.TaskType,
  902. HttpMethod = p.HttpMethod,
  903. Path = p.Path,
  904. Request = p.Request,
  905. PathType = p.PathType,
  906. GenerationTime = p.GenerationTime,
  907. CreationTime = p.CreationTime,
  908. IsSuccess = p.IsSuccess
  909. })
  910. .OrderByDescending(p => p.CreationTime)
  911. .MergeTable().ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  912. return new PagedDto<DsEndSendTaskDto>(total, _mapper.Map<List<DsEndSendTaskDto>>(items));
  913. }
  914. //其他平台
  915. if (dto.SelectType == "6")
  916. {
  917. //其他平台
  918. var items = await _sendTaskOtherPlatformsRepository.Queryable()
  919. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  920. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  921. .WhereIF(!string.IsNullOrEmpty(dto.Path), p => p.Path == dto.Path)
  922. .Select(p => new DsEndSendTaskDto
  923. {
  924. Id = p.Id,
  925. ProvinceNo = p.ProvinceNo,
  926. FirstTime = p.FirstTime,
  927. LastTime = p.LastTime,
  928. SendTimes = p.SendTimes,
  929. PlatformSource = p.PlatformSource,
  930. TaskType = p.TaskType,
  931. HttpMethod = p.HttpMethod,
  932. Path = p.Path,
  933. Request = p.Request,
  934. PathType = p.PathType,
  935. GenerationTime = p.GenerationTime,
  936. CreationTime = p.CreationTime,
  937. IsSuccess = p.IsSuccess
  938. })
  939. .MergeTable()
  940. .OrderBy(p => p.CreationTime)
  941. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  942. return new PagedDto<DsEndSendTaskDto>(total, _mapper.Map<List<DsEndSendTaskDto>>(items));
  943. }
  944. return new PagedDto<DsEndSendTaskDto>(total, null);
  945. }
  946. /// <summary>
  947. /// 根据ID从新推送
  948. /// </summary>
  949. /// <param name="Id">推送任务Id</param>
  950. /// <param name="Type">类型 1:服务工单受理,2、电话记录,3、服务工单处理过程,4、服务工单处理结果,5、省平台其他推送,6、其他平台</param>
  951. /// <returns></returns>
  952. [HttpGet("addnewtasksendbyid")]
  953. [AllowAnonymous]
  954. public async Task AddNewTaskSendById(string Id, string Type)
  955. {
  956. if (string.IsNullOrEmpty(Id) || string.IsNullOrEmpty(Type))
  957. throw UserFriendlyException.SameMessage("参数无效");
  958. var userInfo = Request.Headers["userinfo"].ToString();
  959. if (string.IsNullOrEmpty(userInfo))
  960. throw UserFriendlyException.SameMessage("用户信息获取失败");
  961. var pkcs1 = new RsaPkcs1Util(Encoding.UTF8, PublicKey, PrivateKey);
  962. var info = pkcs1.Decrypt(userInfo, RSAEncryptionPadding.Pkcs1);
  963. if (info == null)
  964. throw UserFriendlyException.SameMessage("用户信息获取失败");
  965. var user = System.Text.Json.JsonSerializer.Deserialize<UserInfo>(info);
  966. if (user == null)
  967. throw UserFriendlyException.SameMessage("用户信息获取失败");
  968. //写入操作记录
  969. UserOperationLog operationLog = new()
  970. {
  971. DataId = Id,
  972. PlatformSource = EPlatformSource.Province,
  973. UserId = user.UserId,
  974. UserName = user.UserName,
  975. OrgCode = user.OrgCode,
  976. OrgName = user.OrgName
  977. };
  978. string resultId = "";
  979. //服务工单受理
  980. if (Type == "1")
  981. {
  982. var data = await _sendTaskSubmitCaseInfoRepository.GetAsync(Id, HttpContext.RequestAborted);
  983. if (data != null)
  984. {
  985. operationLog.ReceiveServiceInterface = data.TaskType;
  986. operationLog.Path = data.Path;
  987. operationLog.RequestData = data.Request;
  988. resultId = await _initPushDataService.InitDsSendTaskSubmitCaseInfo(data.ProvinceNo, data.Request, data.RequestData, data.GenerationTime, HttpContext.RequestAborted);
  989. }
  990. }
  991. //电话记录
  992. if (Type == "2")
  993. {
  994. var data = await _sendTaskSubmitCaseRecordRepository.GetAsync(Id, HttpContext.RequestAborted);
  995. if (data != null)
  996. {
  997. operationLog.ReceiveServiceInterface = data.TaskType;
  998. operationLog.Path = data.Path;
  999. operationLog.RequestData = data.Request;
  1000. resultId = await _initPushDataService.InitDsSendTaskSubmitCaseRecord(data.ProvinceNo, data.Request, data.RequestData, data.GenerationTime, HttpContext.RequestAborted);
  1001. }
  1002. }
  1003. //服务工单处理过程
  1004. if (Type == "3")
  1005. {
  1006. var data = await _sendTaskSubmitCaseProcessRepository.GetAsync(Id, HttpContext.RequestAborted);
  1007. if (data != null)
  1008. {
  1009. operationLog.ReceiveServiceInterface = data.TaskType;
  1010. operationLog.Path = data.Path;
  1011. operationLog.RequestData = data.Request;
  1012. resultId = await _initPushDataService.InitDsSendTaskSubmitCaseProcess(data.ProvinceNo, data.Request, data.RequestData, data.GenerationTime, HttpContext.RequestAborted);
  1013. }
  1014. }
  1015. //服务工单处理结果
  1016. if (Type == "4")
  1017. {
  1018. var data = await _sendTaskSubmitCaseResultRepository.GetAsync(Id, HttpContext.RequestAborted);
  1019. if (data != null)
  1020. {
  1021. operationLog.ReceiveServiceInterface = data.TaskType;
  1022. operationLog.Path = data.Path;
  1023. operationLog.RequestData = data.Request;
  1024. resultId = await _initPushDataService.InitDsSendTaskSubmitCaseResult(data.ProvinceNo, data.Request, data.RequestData, data.GenerationTime, HttpContext.RequestAborted);
  1025. }
  1026. }
  1027. //其他接口
  1028. if (Type == "5")
  1029. {
  1030. var data = await _sendTaskProvinceOtherRepository.GetAsync(Id, HttpContext.RequestAborted);
  1031. if (data != null)
  1032. {
  1033. operationLog.ReceiveServiceInterface = data.TaskType;
  1034. operationLog.Path = data.Path;
  1035. operationLog.RequestData = data.Request;
  1036. resultId = await _initPushDataService.InitDsSendTaskProvinceOther(data.TaskType, data.Path, data.ProvinceNo, data.Request, data.RequestData, data.HttpMethod, data.PathType.Value, data.FileJson, data.GenerationTime, HttpContext.RequestAborted);
  1037. }
  1038. }
  1039. //其他平台
  1040. if (Type == "6")
  1041. {
  1042. var data = await _sendTaskOtherPlatformsRepository.GetAsync(Id, HttpContext.RequestAborted);
  1043. if (data != null)
  1044. {
  1045. operationLog.ReceiveServiceInterface = data.TaskType;
  1046. operationLog.Path = data.Path;
  1047. operationLog.RequestData = data.Request;
  1048. resultId = await _initPushDataService.InitDsSendTaskOtherPlatforms(data.TaskType, data.Path, data.ProvinceNo, data.Request, data.RequestData, data.PlatformSource, data.HttpMethod, data.PathType.Value, data.FileJson, data.GenerationTime, HttpContext.RequestAborted);
  1049. }
  1050. }
  1051. operationLog.NewDataId = resultId;
  1052. await _userOperationLogRepository.AddAsync(operationLog, HttpContext.RequestAborted);
  1053. if (string.IsNullOrEmpty(resultId))
  1054. throw UserFriendlyException.SameMessage("重新推送失败");
  1055. }
  1056. #endregion
  1057. #region 及时性
  1058. /// <summary>
  1059. /// 查询工单及时上传列表
  1060. /// </summary>
  1061. /// <param name="dto"></param>
  1062. /// <returns></returns>
  1063. [HttpGet("getordertimelylist")]
  1064. [AllowAnonymous]
  1065. public async Task<PagedDto<object>> GetOrderTimelyList([FromQuery] QuerySendTaskDto dto)
  1066. {
  1067. if (!dto.StartTime.HasValue)
  1068. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  1069. if (!dto.EndTime.HasValue)
  1070. dto.EndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  1071. //数据查询
  1072. RefAsync<int> total = 0;
  1073. var items = await _dsOrderSendRepository.Queryable()
  1074. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  1075. .Where(p => p.FirstSendProvinceTime.HasValue && p.StartTime.HasValue)
  1076. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  1077. .Select(p => new
  1078. {
  1079. p.OrderId,
  1080. p.OrderNo,
  1081. p.ProvinceNo,
  1082. p.CaseDate,
  1083. p.StartTime,
  1084. p.CallId,
  1085. p.FirstSendProvinceTime,
  1086. p.LastSendProvinceTime,
  1087. p.CaseSource,
  1088. p.CaseSourceCode,
  1089. p.ExpiredTime,
  1090. p.CreationTime
  1091. })
  1092. .MergeTable()
  1093. .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == true, p => SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) <= 180)//及时上传
  1094. .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == false, p => SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) > 180)//不及时上传
  1095. .OrderByDescending(p => p.CreationTime)
  1096. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  1097. return new PagedDto<object>(total, items);
  1098. }
  1099. /// <summary>
  1100. /// 查询没匹配到通话记录的电话来源工单
  1101. /// </summary>
  1102. /// <param name="dto"></param>
  1103. /// <returns></returns>
  1104. [HttpGet("getordermatchingcalllist")]
  1105. [AllowAnonymous]
  1106. public async Task<PagedDto<DsOrderSend>> GetOrderMatchingCallList([FromQuery] QuerySendTaskDto dto)
  1107. {
  1108. if (!dto.StartTime.HasValue)
  1109. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  1110. if (!dto.EndTime.HasValue)
  1111. dto.EndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  1112. RefAsync<int> total = 0;
  1113. var items = await _dsOrderSendRepository.Queryable()
  1114. .LeftJoin<DsTelCall>((p, o) => p.CallId == o.CallId)
  1115. .Where((p, o) => p.FirstSendProvinceTime >= dto.StartTime && p.FirstSendProvinceTime <= dto.EndTime && p.CaseSourceCode == "RGDH")
  1116. .Where((p, o) => p.FirstSendProvinceTime.HasValue)
  1117. .Where((p, o) => o.CallId == null || o.CallId == "")
  1118. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.ProvinceNo == dto.CaseSerial)
  1119. .OrderByDescending((p, o) => p.CreationTime)
  1120. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  1121. return new PagedDto<DsOrderSend>(total, _mapper.Map<IReadOnlyList<DsOrderSend>>(items));
  1122. }
  1123. /// <summary>
  1124. /// 及时率查询
  1125. /// </summary>
  1126. /// <param name="dto"></param>
  1127. /// <returns></returns>
  1128. [HttpGet("getcalculateuploadrate")]
  1129. [AllowAnonymous]
  1130. public async Task<CalculateUploadRateDto> GetCalculateUploadRate([FromQuery] QuerySendTaskDto dto)
  1131. {
  1132. if (!dto.StartTime.HasValue)
  1133. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  1134. if (!dto.EndTime.HasValue)
  1135. dto.EndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  1136. CalculateUploadRateDto calculateUploadRateDto = new();
  1137. //工单
  1138. var orderRate = await _dsOrderSendRepository.Queryable()
  1139. .LeftJoin<DsTelCall>((p, o) => p.CallId == o.CallId)
  1140. .Where((p, o) => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime && p.FirstSendProvinceTime >= dto.StartTime && p.FirstSendProvinceTime <= dto.EndTime)
  1141. .Where((p, o) => p.FirstSendProvinceTime.HasValue && p.StartTime.HasValue)
  1142. .Select((p, o) => new
  1143. {
  1144. p.OrderId,
  1145. p.StartTime,
  1146. p.FirstSendProvinceTime,
  1147. p.CaseSourceCode,
  1148. o.CallId,
  1149. p.HandleState,
  1150. p.ExpiredTime,
  1151. p.ActualHandleTime
  1152. }).MergeTable()
  1153. .Select(p => new CalculateUploadRateDto
  1154. {
  1155. OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OrderId != null, 1, 0)),//总工单数
  1156. OrderTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) <= 180, 1, 0)),//及时
  1157. OrderNotTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) > 180, 1, 0)),//为及时
  1158. RGDHOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH", 1, 0)),
  1159. ContainTel = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH" && p.CallId != null, 1, 0)),//匹配数
  1160. NotContainTel = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH" && p.CallId == null, 1, 0)),//未匹配数
  1161. HandleEndOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.HandleState == "办理完成", 1, 0)),//办结件数
  1162. HandleEndOrderOnTime = SqlFunc.AggregateSum(SqlFunc.IIF(p.HandleState == "办理完成" && p.ExpiredTime > p.ActualHandleTime, 1, 0)),//按时办结件数
  1163. })
  1164. .FirstAsync();
  1165. //电话
  1166. var callRate = await _dsTelCallRepository.Queryable()
  1167. .Where(p => p.OverTime >= dto.StartTime && p.OverTime <= dto.EndTime && p.FirstSendProvinceTime >= dto.StartTime && p.FirstSendProvinceTime <= dto.EndTime)
  1168. .Where(p => p.FirstSendProvinceTime.HasValue && p.OverTime.HasValue)
  1169. .Select(p => new
  1170. {
  1171. p.CallId,
  1172. p.OverTime,
  1173. p.FirstSendProvinceTime,
  1174. p.OnState
  1175. })
  1176. .MergeTable()
  1177. .Select(p => new CalculateUploadRateDto
  1178. {
  1179. TelCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.CallId != null, 1, 0)),//总电话数
  1180. TelTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) <= 180, 1, 0)),//及时
  1181. TelNotTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) > 180, 1, 0)),//为及时
  1182. TelConnectCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OnState == "On", 1, 0)),//接通数量
  1183. TelNotConnectCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OnState != "On", 1, 0)),//未接通数量
  1184. })
  1185. .FirstAsync();
  1186. //回访
  1187. var visitList = await _dsOrderVisitSendRepository.Queryable()
  1188. .Where(p => p.VisitTime >= dto.StartTime && p.VisitTime <= dto.EndTime && p.IsProvince == false && p.FirstSendProvinceTime >= dto.StartTime && p.FirstSendProvinceTime <= dto.EndTime)
  1189. .Select(p => new
  1190. {
  1191. p.SubjectResultSatifyCode,
  1192. p.VisitTime,
  1193. p.IsProvince,
  1194. p.Source,
  1195. p.ProvinceNo
  1196. })
  1197. .MergeTable()
  1198. .Select(p => new CalculateUploadRateDto
  1199. {
  1200. VisitCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null, 1, 0)),//回访总量
  1201. SatisfactionCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null && p.SubjectResultSatifyCode != "2", 1, 0)),//满意数量
  1202. NotSatisfiedCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null && p.SubjectResultSatifyCode == "2", 1, 0)),//不满意数量
  1203. })
  1204. .FirstAsync();
  1205. //查询知识总量
  1206. calculateUploadRateDto.KnowledgeCount = await _knowledgeRawDataRepository.Queryable()
  1207. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  1208. .CountAsync();
  1209. //修改知识库量-以第一次上传成功的记录为准
  1210. calculateUploadRateDto.UpdateKnowledgeCount = await _waitSendTaskProvinceOtherRepository.Queryable()
  1211. .Where(p => p.FirstTime >= dto.StartTime && p.FirstTime <= dto.EndTime && p.TaskType == "GetKnowledgeInfoUpdate")
  1212. .Select(p => new
  1213. {
  1214. p.Id,
  1215. RowID = SqlFunc.RowNumber($"{p.CreationTime} asc ")
  1216. })
  1217. .MergeTable()
  1218. .Where(p => p.RowID == 1)
  1219. .CountAsync();
  1220. //工单
  1221. if (orderRate != null)
  1222. {
  1223. calculateUploadRateDto.OrderCountNum = orderRate.OrderCountNum;
  1224. calculateUploadRateDto.OrderTimely = orderRate.OrderTimely;
  1225. calculateUploadRateDto.OrderNotTimely = orderRate.OrderNotTimely;
  1226. calculateUploadRateDto.RGDHOrderCount = orderRate.RGDHOrderCount;
  1227. calculateUploadRateDto.ContainTel = orderRate.ContainTel;
  1228. calculateUploadRateDto.NotContainTel = orderRate.NotContainTel;
  1229. calculateUploadRateDto.HandleEndOrderNum = orderRate.HandleEndOrderNum;
  1230. calculateUploadRateDto.HandleEndOrderOnTime = orderRate.HandleEndOrderOnTime;
  1231. }
  1232. //电话
  1233. if (callRate != null)
  1234. {
  1235. calculateUploadRateDto.TelCountNum = callRate.TelCountNum;
  1236. calculateUploadRateDto.TelTimely = callRate.TelTimely;
  1237. calculateUploadRateDto.TelNotTimely = callRate.TelNotTimely;
  1238. calculateUploadRateDto.TelConnectCountNum = callRate.TelConnectCountNum;
  1239. calculateUploadRateDto.TelNotConnectCountNum = callRate.TelNotConnectCountNum;
  1240. }
  1241. //回访
  1242. if (visitList != null)
  1243. {
  1244. calculateUploadRateDto.VisitCountNum = visitList.VisitCountNum;
  1245. calculateUploadRateDto.SatisfactionCountNum = visitList.SatisfactionCountNum;
  1246. calculateUploadRateDto.NotSatisfiedCountNum = visitList.NotSatisfiedCountNum;
  1247. }
  1248. return calculateUploadRateDto;
  1249. }
  1250. #endregion
  1251. #endregion
  1252. #region 系统配置
  1253. /// <summary>
  1254. /// 上传数据系统配置-查询详情
  1255. /// </summary>
  1256. /// <returns></returns>
  1257. [AllowAnonymous]
  1258. [HttpGet("info-configurationinformation")]
  1259. public async Task<ConfigurationInformation> GetStandard()
  1260. {
  1261. var sandard = await _configurationInformationRepository.Queryable().FirstAsync();
  1262. if (sandard == null)
  1263. {
  1264. ConfigurationInformation configuration = new()
  1265. {
  1266. CrntSeatNum = 0,
  1267. CrntTelNum = 0,
  1268. SeatNum = 0,
  1269. SeatHwyNum = 0,
  1270. MissedCallCount = 0
  1271. };
  1272. var Id = await _configurationInformationRepository.AddAsync(configuration, HttpContext.RequestAborted);
  1273. return await _configurationInformationRepository.GetAsync(Id, HttpContext.RequestAborted);
  1274. }
  1275. return sandard;
  1276. }
  1277. /// <summary>
  1278. /// 上传数据系统配置-修改
  1279. /// </summary>
  1280. /// <param name="dto"></param>
  1281. /// <returns></returns>
  1282. [AllowAnonymous]
  1283. [HttpPut("update-configurationinformation")]
  1284. public async Task UpdateStandard([FromBody] ConfigurationInformationDto dto)
  1285. {
  1286. var standard = await _configurationInformationRepository.GetAsync(dto.Id);
  1287. if (standard != null)
  1288. {
  1289. _mapper.Map(dto, standard);
  1290. await _configurationInformationRepository.UpdateAsync(standard, HttpContext.RequestAborted);
  1291. await _configurationInformationCache.GetOrSetAsync(ConstantSettings.ConfigurationInformationCacheKey, dto, cancellationToken: HttpContext.RequestAborted);
  1292. }
  1293. }
  1294. #endregion
  1295. #region 对接平台用户管理
  1296. /// <summary>
  1297. /// 对接平台用户管理
  1298. /// </summary>
  1299. /// <param name="dto"></param>
  1300. /// <returns></returns>
  1301. [HttpPost("adduserinfo")]
  1302. [AllowAnonymous]
  1303. public async Task AddUserInfo([FromBody] AddUserInfoDto dto)
  1304. {
  1305. var tokenInfo = _mapper.Map<DsUserTokenInfo>(dto);
  1306. if (string.IsNullOrEmpty(tokenInfo.AuthIP))
  1307. tokenInfo.AuthIP = "*";
  1308. await _dsUserTokenInfoRepository.AddAsync(tokenInfo, HttpContext.RequestAborted);
  1309. }
  1310. /// <summary>
  1311. /// 查询对接平台用户信息
  1312. /// </summary>
  1313. /// <param name="dto"></param>
  1314. /// <returns></returns>
  1315. [HttpGet("get-user-info-list")]
  1316. [AllowAnonymous]
  1317. public async Task<PagedDto<DsUserTokenInfo>> GetUserInfoList([FromQuery] PagedKeywordRequest dto)
  1318. {
  1319. RefAsync<int> total = 0;
  1320. var items = await _dsUserTokenInfoRepository.Queryable()
  1321. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.PlatformSourceName.Contains(dto.Keyword))
  1322. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  1323. return new PagedDto<DsUserTokenInfo>(total, items);
  1324. }
  1325. #endregion
  1326. #region 推送业务系统失败
  1327. /// <summary>
  1328. /// 查询推送业务系统失败数据
  1329. /// </summary>
  1330. /// <param name="dto"></param>
  1331. /// <returns></returns>
  1332. [HttpGet("getsendhotlineerrordata")]
  1333. [AllowAnonymous]
  1334. public async Task<PagedDto<SendHotlineErrorData>> GetSendHotlineErrorData([FromQuery] QuerySendTaskDto dto)
  1335. {
  1336. if (!dto.StartTime.HasValue)
  1337. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
  1338. if (!dto.EndTime.HasValue)
  1339. dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
  1340. //数据查询
  1341. RefAsync<int> total = 0;
  1342. var items = await _sendHotlineErrorDataRepository.Queryable()
  1343. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  1344. .OrderBy(p => p.CreationTime)
  1345. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  1346. return new PagedDto<SendHotlineErrorData>(total, items);
  1347. }
  1348. /// <summary>
  1349. /// 从新推送
  1350. /// </summary>
  1351. /// <param name="Id"></param>
  1352. /// <returns></returns>
  1353. [HttpGet("pushfromhotlinedata")]
  1354. [AllowAnonymous]
  1355. public async Task PushFromHotlineData(string Id)
  1356. {
  1357. var data = await _sendHotlineErrorDataRepository.GetAsync(p => p.Id == Id, HttpContext.RequestAborted);
  1358. if (data == null)
  1359. throw UserFriendlyException.SameMessage("重新推送失败");
  1360. var userInfo = Request.Headers["userinfo"].ToString();
  1361. if (string.IsNullOrEmpty(userInfo))
  1362. throw UserFriendlyException.SameMessage("用户信息获取失败");
  1363. var pkcs1 = new RsaPkcs1Util(Encoding.UTF8, PublicKey, PrivateKey);
  1364. var info = pkcs1.Decrypt(userInfo, RSAEncryptionPadding.Pkcs1);
  1365. if (info == null)
  1366. throw UserFriendlyException.SameMessage("用户信息获取失败");
  1367. var user = System.Text.Json.JsonSerializer.Deserialize<UserInfo>(info);
  1368. if (user == null)
  1369. throw UserFriendlyException.SameMessage("用户信息获取失败");
  1370. bool isSuccess = true;
  1371. string error = "";
  1372. //调用工单创建接口
  1373. try
  1374. {
  1375. //推业务系统
  1376. if (data.ReceiveServiceInterface == "rest/receive_case_info")
  1377. {
  1378. var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>(data.Path, data.HttpMethod, data.RequestData);
  1379. if (result == null || result.code != 0)
  1380. {
  1381. isSuccess = false;
  1382. error = result?.message;
  1383. }
  1384. }
  1385. //推旧系统
  1386. if (data.ReceiveServiceInterface == "SendOldHotlineData")
  1387. {
  1388. ConfigurationSendDataOld configSendDataOld = new();
  1389. if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
  1390. configSendDataOld = _sharingConfigurationManager.GetYiBinConfig().SendDataOld;
  1391. else if (_sharingConfigurationManager.IsCity(ConfigurationConsts.ZiGong))
  1392. configSendDataOld = _sharingConfigurationManager.GetZiGongConfig().SendDataOld;
  1393. //var configSendDataOld = _sharingConfigurationManager.GetYiBinConfig().SendDataOld;
  1394. //先验证是否开启推送
  1395. if (configSendDataOld == null || !configSendDataOld.IsSend)
  1396. return;
  1397. var url = configSendDataOld.AddressUrl + data.Path;
  1398. var response = await _fwClient.RequestAsync<FwResponse>(url, data.HttpMethod, data.RequestData, HttpContext.RequestAborted);
  1399. if (response == null && response.code != 1)
  1400. {
  1401. isSuccess = false;
  1402. error = response?.msg;
  1403. }
  1404. }
  1405. }
  1406. catch (Exception ex)
  1407. {
  1408. isSuccess = false;
  1409. error = ex.Message;
  1410. }
  1411. //写入操作记录
  1412. UserOperationLog operationLog = new()
  1413. {
  1414. DataId = data.Id,
  1415. NewDataId = data.Id,
  1416. PlatformSource = EPlatformSource.Hotline,
  1417. ReceiveServiceInterface = data.ReceiveServiceInterface,
  1418. Path = data.Path,
  1419. RequestData = data.RequestData,
  1420. UserId = user.UserId,
  1421. UserName = user.UserName,
  1422. OrgCode = user.OrgCode,
  1423. OrgName = user.OrgName
  1424. };
  1425. await _userOperationLogRepository.AddAsync(operationLog, HttpContext.RequestAborted);
  1426. //推送失败添加
  1427. if (!isSuccess)
  1428. {
  1429. data.SendTimes = data.SendTimes + 1;
  1430. data.ErrorMessage = error;
  1431. await _sendHotlineErrorDataRepository.UpdateAsync(data, HttpContext.RequestAborted);
  1432. }
  1433. else
  1434. {
  1435. await _sendHotlineErrorDataRepository.RemoveAsync(data, cancellationToken: HttpContext.RequestAborted);
  1436. await _sendFwErrorDataRepository.RemoveAsync(p => p.Id == data.DataId, cancellationToken: HttpContext.RequestAborted);
  1437. }
  1438. }
  1439. #endregion
  1440. #region 省查询
  1441. /// <summary>
  1442. /// 查询附件信息
  1443. /// </summary>
  1444. /// <param name="dto"></param>
  1445. /// <returns></returns>
  1446. [HttpGet("getcasematerialinfolist")]
  1447. [AllowAnonymous]
  1448. public async Task<PagedDto<DsGetCaseMaterialInfo>> GetCaseMaterialInfoList([FromQuery] QueryCaseMaterialInfoDto dto)
  1449. {
  1450. RefAsync<int> total = 0;
  1451. var items = await _getCaseMaterialInfoRepository.Queryable()
  1452. .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime.Value)
  1453. .WhereIF(dto.EndTime.HasValue, p => p.CreationTime >= dto.EndTime.Value)
  1454. .WhereIF(!string.IsNullOrEmpty(dto.CaseSerial), p => p.CaseSerial == dto.CaseSerial)
  1455. .OrderByDescending(p => p.CreationTime)
  1456. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  1457. return new PagedDto<DsGetCaseMaterialInfo>(total, items);
  1458. }
  1459. /// <summary>
  1460. /// 修改工单来源推送省平台
  1461. /// </summary>
  1462. /// <returns></returns>
  1463. [HttpGet("updateordersource")]
  1464. [AllowAnonymous]
  1465. public async Task UpdateOrderSourceAsync()
  1466. {
  1467. //查询数据
  1468. var items = await _dsOrderSendRepository.Queryable()
  1469. .LeftJoin<DsTelCall>((p, o) => p.CallId == o.CallId)
  1470. .Where((p, o) => p.FirstSendProvinceTime >= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"))
  1471. && p.FirstSendProvinceTime <= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")) && p.CaseSourceCode == "RGDH")
  1472. .Where((p, o) => p.FirstSendProvinceTime.HasValue && p.HandleState == "办理完成")
  1473. .Where((p, o) => o.CallId == null || o.CallId == "")
  1474. .OrderByDescending((p, o) => p.CreationTime)
  1475. .ToListAsync();
  1476. //处理数据
  1477. if (items != null && items.Any())
  1478. {
  1479. // _logger.LogWarning("读取到条数:" + "--------------" + items.Count);
  1480. List<string> Ids = [];
  1481. foreach (var item in items)
  1482. {
  1483. Ids.Add(item.OrderId);
  1484. }
  1485. //推送数据
  1486. if (Ids != null && Ids.Count > 0)
  1487. {
  1488. UpdateOrderSourceChannelDto data = new()
  1489. {
  1490. Ids = Ids,
  1491. IsPush = true
  1492. };
  1493. await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/update-order-sourcechannel", "Post", System.Text.Json.JsonSerializer.Serialize(data));
  1494. }
  1495. }
  1496. }
  1497. #endregion
  1498. /// <summary>
  1499. /// 查询接收到的原始数据
  1500. /// </summary>
  1501. /// <param name="dto"></param>
  1502. /// <returns></returns>
  1503. [HttpGet("get_receive_raw_data")]
  1504. [AllowAnonymous]
  1505. public async Task<PagedDto<ReceiveRawDataDto>> GetReceiveRawData([FromQuery] ReportPagedRequest dto)
  1506. {
  1507. //市州数据交换原始数据
  1508. var queryDataExchangeData = _dsReceiveDataExchangeDataRepository.Queryable()
  1509. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  1510. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.ExternalId.Contains(dto.Keyword))
  1511. .Select(p => new ReceiveRawDataDto
  1512. {
  1513. OrderNo = p.ExternalId,
  1514. RawData = p.ReceiveData,
  1515. PlatformsName = p.PlatformsName,
  1516. ServiceInterface = p.ServiceInterface,
  1517. CreationTime = p.CreationTime
  1518. })
  1519. .MergeTable();
  1520. //企业专班原始数据
  1521. var queryEnterpriseData = _dsReceiveEnterpriseDataRepository.Queryable()
  1522. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  1523. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.ExternalId.Contains(dto.Keyword))
  1524. .Select(p => new ReceiveRawDataDto
  1525. {
  1526. OrderNo = p.ExternalId,
  1527. RawData = p.ReceiveData,
  1528. PlatformsName = "企业专班",
  1529. ServiceInterface = p.ServiceInterface,
  1530. CreationTime = p.CreationTime
  1531. })
  1532. .MergeTable();
  1533. //融媒体等原始数据
  1534. var queryMediaData = _dsReceiveMediaDataRepository.Queryable()
  1535. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  1536. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.OrderCode.Contains(dto.Keyword))
  1537. .Select(p => new ReceiveRawDataDto
  1538. {
  1539. OrderNo = p.OrderCode,
  1540. RawData = p.ReceiveData,
  1541. PlatformsName = p.PlatformsName,
  1542. ServiceInterface = p.ServiceInterface,
  1543. CreationTime = p.CreationTime
  1544. })
  1545. .MergeTable();
  1546. //110平台
  1547. var queryPoliceData = _dsReceivePoliceDataRepository.Queryable()
  1548. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  1549. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.ExternalId.Contains(dto.Keyword))
  1550. .Select(p => new ReceiveRawDataDto
  1551. {
  1552. OrderNo = p.ExternalId,
  1553. RawData = p.ReceiveData,
  1554. PlatformsName = "110平台",
  1555. ServiceInterface = p.ServiceInterface,
  1556. CreationTime = p.CreationTime
  1557. })
  1558. .MergeTable();
  1559. //连表查询数据
  1560. RefAsync<int> total = 0;
  1561. var items = await _waitSendTaskRepository.UnionAll(queryDataExchangeData, queryEnterpriseData, queryMediaData, queryPoliceData).MergeTable()
  1562. .OrderBy(p => p.CreationTime)
  1563. .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
  1564. if (items != null)
  1565. {
  1566. foreach (var item in items)
  1567. {
  1568. item.RawData = System.Text.RegularExpressions.Regex.Unescape(item.RawData);
  1569. }
  1570. }
  1571. return new PagedDto<ReceiveRawDataDto>(total, items);
  1572. }
  1573. }
  1574. }