PoliceDSController.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. using DataSharing.DaoShu110;
  2. using DataSharing.Extensions;
  3. using DataSharing.RawData;
  4. using DataSharing.Share.Dtos;
  5. using DataSharing.Share.Dtos.DaoShu110;
  6. using DotNetCore.CAP;
  7. using Hotline.Api.Sdk;
  8. using MapsterMapper;
  9. using MediatR;
  10. using Microsoft.AspNetCore.Authorization;
  11. using Microsoft.AspNetCore.Mvc;
  12. using Newtonsoft.Json;
  13. using Newtonsoft.Json.Converters;
  14. using System.Net;
  15. using System.Text;
  16. using XF.Domain.Filters;
  17. using XF.Domain.Repository;
  18. namespace DataSharing.Host.Controllers
  19. {
  20. /// <summary>
  21. /// 110
  22. /// </summary>
  23. public class PoliceDSController : BaseController
  24. {
  25. #region 注入
  26. private readonly IMapper _mapper;
  27. private readonly ICapPublisher _capPublisher;
  28. private readonly IMediator _mediator;
  29. private readonly IChannelConfigurationManager _channelConfigurationManager;
  30. private readonly IRepository<DsPoliceSendChainAlarmDs> _dsPoliceSendChainAlarmDsRepository;
  31. private readonly IRepository<DsPoliceSendChainDealDs> _dsPoliceSendChainDealDsRepository;
  32. private readonly IRepository<DsKnowledgeRawData> _dsKnowledgeRawDataRepository;
  33. private readonly IRepository<DsOrder> _dsOrderRepository;
  34. private readonly IRepository<DsReceivePoliceData> _dsReceivePoliceDataRepository;
  35. private readonly IHotlineClient _hotlineClient;
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. /// <param name="mapper"></param>
  40. /// <param name="capPublisher"></param>
  41. /// <param name="mediator"></param>
  42. /// <param name="channelConfigurationManager"></param>
  43. /// <param name="dsPoliceSendChainAlarmDsRepository"></param>
  44. /// <param name="dsPoliceSendChainDealDsRepository"></param>
  45. /// <param name="dsKnowledgeRawDataRepository"></param>
  46. /// <param name="dsOrderRepository"></param>
  47. /// <param name="dsReceivePoliceDataRepository"></param>
  48. /// <param name="hotlineClient"></param>
  49. public PoliceDSController(IMapper mapper,
  50. ICapPublisher capPublisher,
  51. IMediator mediator,
  52. IChannelConfigurationManager channelConfigurationManager,
  53. IRepository<DsPoliceSendChainAlarmDs> dsPoliceSendChainAlarmDsRepository,
  54. IRepository<DsPoliceSendChainDealDs> dsPoliceSendChainDealDsRepository,
  55. IRepository<DsKnowledgeRawData> dsKnowledgeRawDataRepository,
  56. IRepository<DsOrder> dsOrderRepository,
  57. IRepository<DsReceivePoliceData> dsReceivePoliceDataRepository,
  58. IHotlineClient hotlineClient)
  59. {
  60. _mapper = mapper;
  61. _capPublisher = capPublisher;
  62. _mediator = mediator;
  63. _channelConfigurationManager = channelConfigurationManager;
  64. _dsPoliceSendChainAlarmDsRepository = dsPoliceSendChainAlarmDsRepository;
  65. _dsPoliceSendChainDealDsRepository = dsPoliceSendChainDealDsRepository;
  66. _dsKnowledgeRawDataRepository = dsKnowledgeRawDataRepository;
  67. _dsOrderRepository = dsOrderRepository;
  68. _dsReceivePoliceDataRepository = dsReceivePoliceDataRepository;
  69. _hotlineClient = hotlineClient;
  70. }
  71. #endregion
  72. #region receive-工单受理-已完成
  73. /// <summary>
  74. /// 工单受理
  75. /// </summary>
  76. /// <returns></returns>
  77. [HttpPost("service/api/ds/110To12345/chainAlarm")]
  78. [AllowAnonymous]
  79. public async Task<OpenResponse> ChainAlarm_Receive()
  80. {
  81. // 测试JSON
  82. // {"LSH":"510300202304070001202304070001","JJYBH":"1001","JJDBH":"510300202304070001202304070001","BJDH":"13555555555","BJDHYHM":"李四","LXDH":"13555555555","BJDZ":"报警地址","JQLBDM":"","JQLBMC":"","BJNR":"报警内容","GXDWDM":"","GXDWMC":"","GXDWDH":"","BJSJ":"2023-04-07 10:43:17","TSSJ":"2023-04-07 10:43:21","JJDWDM":"12345","JJDWMC":"12345","JJLX":"1","XZQHDM":"510300"}
  83. // 测试Base64
  84. // kKeUhfS8zca5WTA9D2Z7z/GthYLHroPi8jLN2HduG2vK1PCjb56BZ3wLNCiA8V91ARHpOkE50xFdwBJhW+QKB7J2FRjJ6WUrzkKal75G3DCWzl+Fzto+XbkS5U5wUYnII2zSpdo4U6ILrrK2t2u8mFTd1i03+D1Ytv4TlUH5Jwg/xq00AeF/CVhes4+H5PPcxdU/h3KCDMq9Qaoxf6pALQCMBfatQdsDMw4MG0RK5DUbuaCuElOxfCjlDadZTLuVjHWHDw6wWG9sucqN3mrRllxytIDqIsLSdBi1KuCPaW+FhXf5/+v6Eipby8QEXXTPZxOW4m/Kp8cF87+rxBxRE7nIGAjdO2mKDyfiDeipENxKkQs6taTS52U2OG99Prfp+UAU1Uaj69gQ0IShMVqLgnESWhL5b/vIgO2mtYgIIZ7RpwlTuVqVZKxaFfPpjnQtGRFZPDPHVQcqQ7MMT3rjg6/AWVI/Jh7q+pdu18Y6cojl/EGd/XsNVip+uvAeXdCk
  85. var configurationPoliceDS = _channelConfigurationManager.GetConfigurationPoliceDS();
  86. var sm4 = configurationPoliceDS.token1_sm4_mw;
  87. var apiR = new DaoShuDeResponse<string>();
  88. try
  89. {
  90. // 验证dcsm
  91. string dcsmMsg = CheckDcsm(Request.Headers["dcsm"].ToString(), configurationPoliceDS.token1_dcsm);
  92. if (!string.IsNullOrEmpty(dcsmMsg))
  93. {
  94. apiR = DaoShuDeResponse<string>.Failed(dcsmMsg);
  95. }
  96. else
  97. {
  98. string base64String = await GetStreamBase64(HttpContext.Request);
  99. ChainAlarm_DS chainAlarm = new();
  100. if (!string.IsNullOrEmpty(base64String))
  101. {
  102. // 解密:base64通过sm4解密转json
  103. string jsonRes = Sm4Crypto.Decrypt_ECB_Base64(sm4, base64String);
  104. // json 转 实体类
  105. if (!string.IsNullOrEmpty(jsonRes))
  106. chainAlarm = System.Text.Json.JsonSerializer.Deserialize<ChainAlarm_DS>(jsonRes);
  107. await InitRawData("service/api/ds/110To12345/chainAlarm", base64String, jsonRes, chainAlarm?.AlarmReceiptNumber);
  108. }
  109. #region 数据验证
  110. //数据验证
  111. string strResult = chainAlarm.Validate();
  112. if (!IsDate(chainAlarm.CallPoliceTime.ToString()))
  113. strResult = "【报警时间】不是日期格式 yyyy-MM-dd HH:mm:ss";
  114. if (!IsDate(chainAlarm.PushTime.ToString()))
  115. strResult = "【推送时间】不是日期格式 yyyy-MM-dd HH:mm:ss";
  116. #endregion
  117. if (string.IsNullOrEmpty(strResult))
  118. {
  119. //组装业务系统工单数据
  120. Hotline.Share.Dtos.Order.AddOrderDto orderDto = new()
  121. {
  122. ExternalId = chainAlarm.AlarmReceiptNumber,
  123. // AcceptorStaffNo = policeReceive.RegisterNo,
  124. FromPhone = chainAlarm.CallPoliceNumber,
  125. FromName = chainAlarm.CallPoliceName,
  126. Contact = chainAlarm.PhoneNumber,
  127. Content = chainAlarm.CallPoliceContent,
  128. IncidentTime = Convert.ToDateTime(chainAlarm.CallPoliceTime),
  129. AreaCode = chainAlarm.AreaCode,
  130. Street = chainAlarm.CallPoliceAddress,
  131. SourceChannel = "宜宾110平台",
  132. SourceChannelCode = "YB110"
  133. };
  134. //业务系统推送数据
  135. // await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderCreation, orderDto, cancellationToken: HttpContext.RequestAborted);
  136. //调用工单创建接口
  137. var result = await _hotlineClient.ReceiveOrderAsync(orderDto, HttpContext.RequestAborted);
  138. //if (result != null && !string.IsNullOrEmpty(result.Id))
  139. //{
  140. // data.Id = id;
  141. // data.OrderId = result.Id;
  142. // await _policeReceiveChainAlarmDsRepository.UpdateAsync(data, HttpContext.RequestAborted);
  143. // apiR = DaoShuDeResponse<string>.Succeed(null);
  144. //}
  145. //else
  146. // apiR = DaoShuDeResponse<string>.Failed(null);
  147. }
  148. else
  149. apiR = DaoShuDeResponse<string>.Failed(strResult);
  150. }
  151. }
  152. catch (System.Exception)
  153. {
  154. apiR = DaoShuDeResponse<string>.Failed("接口异常");
  155. }
  156. #region 处理返回数据
  157. // 返回数据转Json
  158. string jsonResult = ModelToJson(apiR);
  159. // 加密:json通过sm4加密转base64
  160. string base64 = Sm4Crypto.Encrypt_ECB_Base64(sm4, jsonResult);
  161. var resp = new HttpResponseMessage(HttpStatusCode.OK);
  162. resp.Content = new StringContent(base64, System.Text.Encoding.UTF8, "text/plain");
  163. #endregion
  164. return OpenResponse.Ok(resp);
  165. }
  166. #endregion
  167. #region receive-工单办结
  168. /// <summary>
  169. /// 工单办结
  170. /// </summary>
  171. /// <returns></returns>
  172. [HttpPost("service/api/ds/110To12345/chainDeal")]
  173. [AllowAnonymous]
  174. public async Task<OpenResponse> ChainDeal_Receive()
  175. {
  176. // 测试 办结 {"JJDBH":"510300202304070001202304070001","CZLX":"1","FKSJ":"2023-04-07 10:52:44","CJCZQK":"办理结果","JQCLJGSM":"办理结果","FKYBH":"1001","FKYXM":"1001","FKDWDM":"","FKDWMC":"","HFSJ":"","DHHFHSQK":"","CLJGDM":"","CLJGMC":"","HANDLEUSERNAME":"","HANDLEBMNAME":"","HANDLEOPINION":"","HANDLETIME":"","TSSJ":"2023-04-07 10:53:19"}
  177. // 测试 退回 {"JJDBH":"510300202304070001202304070001","CZLX":"2","FKSJ":"","CJCZQK":"","JQCLJGSM":"","FKYBH":"","FKYXM":"","FKDWDM":"","FKDWMC":"","HFSJ":"","DHHFHSQK":"","CLJGDM":"","CLJGMC":"","HANDLEUSERNAME":"退回人","HANDLEBMNAME":"退回姓名","HANDLEOPINION":"退回原因","HANDLETIME":"2023-04-07 10:53:19","TSSJ":"2023-04-07 10:53:19"}
  178. // 测试 回访 {"JJDBH":"510300202304070001202304070001","CZLX":"3","FKSJ":"","CJCZQK":"","JQCLJGSM":"","FKYBH":"","FKYXM":"","FKDWDM":"","FKDWMC":"","HFSJ":"2023-04-07 10:54:23","DHHFHSQK":"回访情况","CLJGDM":"2","CLJGMC":"回访内容","HANDLEUSERNAME":"","HANDLEBMNAME":"","HANDLEOPINION":"","HANDLETIME":"","TSSJ":"2023-04-07 10:53:19"}
  179. // 测试Base64
  180. // 办结 Jv5JJHwByfD4CXMb1l4PtPsgC6UmNeRfws6mEKz24rackMA28z27tu2GRlIyq0qmbeYeEM0nY783aUxb0jlqSQlk+xtc6cop/CvZI5vczHIsXhtfNozkW/hlx/R43ecuKEvyMzEHwf3EuBZ7jsY1zGuJe61K6YTkmCt6+Xndbd585ZMluNJNIA0qZPbT08jVDiI+wa9ot3HA7AEuDqNxJwfU7NfqoTk6Ml5nnuPkdmp55VKeoLZspAgBflEtFJyppIsN0VQyJkrn+ADQFOPcTpedx5H6+V+2MYM9+5pE/Re17S+s3cA53vWHsf6KhHnCm3M9qtbocu0TtpAEfyMEBQOIRn4pSEJ1i98fpD3xjzuxddkGPOBvhYrh8Tf3IbNTNpNozEda2a0RFmBCQyfzLvEdk4ZK/obYDKncePIRrE3ZtO2QAeAa3H6V532MxcniZJ4mIqHsKShR2Q8uxdsR5Q==
  181. // 退回 Jv5JJHwByfD4CXMb1l4PtPsgC6UmNeRfws6mEKz24rackMA28z27tu2GRlIyq0qm1U2lexAxHJK7Bhoyw7CNiEXjiobQjSKF2RWOrUHZINPed01DQRTw2pIL03EFsrQpEjsslviumN+BTn/cuJQp8zD2ifPclM87jEJfP2EY6D+UGvUfSebT9mMghSo2VaUeqFzlRKpJmcU6XjV7C65zddc8DEXuYzt0zqATyhac9AO3RGB5SEw9MX1olV8WwPgV4h3OkTTVZ+Dq5co/eb28YIBN+Rshjpv82RusV2thgfvudOyCDZcRDbjh6pEdtj/lvVH/BU2cDo3ch17KtzsPE+xkQvJ68zaAnS8f/klQrFrDHlkmTMi6rEa605yUhhPZFz0Jba+Axizil38YbHV9A1YoxoJNjFXIyL90yCMznb4joMQPRRddp5ky/CbT9r0q283gKBdAY6/v+ywPdalFjg==
  182. // 回访 Jv5JJHwByfD4CXMb1l4PtPsgC6UmNeRfws6mEKz24rackMA28z27tu2GRlIyq0qmvLqUgIfd0QkyZbzT0iQZwEXjiobQjSKF2RWOrUHZINPed01DQRTw2pIL03EFsrQpEjsslviumN+BTn/cuJQp8zD2ifPclM87jEJfP2EY6D8cMxuK/4X9pyxRWKIQtLFdh4ieC9bhojhr2XxStPHmDV4c3oNEybczbb7IXsaW2FCGMI4SLF7Z+VXDSpCGpFX+0dyUUQPnoRrgU7wndkn/6VYi2Axm19MBkwK+Wm5v85oVQ1HFptf5leUiSXomF9XCPtgWbLOFzu313JW7WQvjgllM7usjI2mbyGtQ5EMXyOGJ/AmAupELpMYVwjoGAKy6B/GE1HFyPiLAazsUE3jfaLPxn/Gld0Ef2glG1SQ/vakDtyvyoJDE83pYvBesmQMx
  183. var configurationPoliceDS = _channelConfigurationManager.GetConfigurationPoliceDS();
  184. string sm4 = configurationPoliceDS.token4_sm4_mw;
  185. var apiR = new DaoShuDeResponse<string>();
  186. try
  187. {
  188. // 验证dcsm
  189. string dcsmMsg = CheckDcsm(Request.Headers["dcsm"].ToString(), configurationPoliceDS.token4_dcsm);
  190. if (!string.IsNullOrEmpty(dcsmMsg))
  191. {
  192. apiR = DaoShuDeResponse<string>.Failed(dcsmMsg);
  193. }
  194. else
  195. {
  196. ChainDeal_DS chainDeal = new();
  197. string base64String = await GetStreamBase64(HttpContext.Request);
  198. if (!string.IsNullOrEmpty(base64String))
  199. {
  200. // 解密:base64通过sm4解密转json
  201. string jsonRes = Sm4Crypto.Decrypt_ECB_Base64(sm4, base64String);
  202. if (!string.IsNullOrEmpty(jsonRes))
  203. // json 转 实体类
  204. chainDeal = System.Text.Json.JsonSerializer.Deserialize<ChainDeal_DS>(jsonRes);
  205. await InitRawData("service/api/ds/110To12345/chainDeal", base64String, jsonRes, chainDeal?.AlarmReceiptNumber);
  206. }
  207. #region 数据验证
  208. string strResult = chainDeal.Validate();
  209. if (chainDeal.FeedbackTime == "")
  210. chainDeal.FeedbackTime = null;
  211. if (chainDeal.ReturnTime == "")
  212. chainDeal.ReturnTime = null;
  213. if (chainDeal.RevisitTime == "")
  214. chainDeal.RevisitTime = null;
  215. #endregion
  216. if (string.IsNullOrEmpty(strResult))
  217. {
  218. //这里组装数据推送到业务系统
  219. await InitChainDeal(chainDeal);
  220. apiR = DaoShuDeResponse<string>.Succeed(null);
  221. }
  222. else
  223. apiR = DaoShuDeResponse<string>.Failed(null);
  224. }
  225. }
  226. catch (System.Exception)
  227. {
  228. apiR = DaoShuDeResponse<string>.Failed("接口异常");
  229. }
  230. // 返回数据转Json
  231. string jsonResult = ModelToJson(apiR);
  232. // 加密:json通过sm4加密转base64
  233. string base64 = Sm4Crypto.Encrypt_ECB_Base64(sm4, jsonResult);
  234. var resp = new HttpResponseMessage(HttpStatusCode.OK);
  235. resp.Content = new StringContent(base64, System.Text.Encoding.UTF8, "text/plain");
  236. return OpenResponse.Ok(resp);
  237. }
  238. #endregion
  239. #region send-工单受理-已完成
  240. /// <summary>
  241. /// 工单受理
  242. /// </summary>
  243. /// <returns></returns>
  244. [HttpPost("service/api/ds/12345To110/chainAlarm")]
  245. [AllowAnonymous]
  246. public async Task<OpenResponse> ChainAlarm_Send()
  247. {
  248. //{"startDate":"2023-04-01 10:43:17","endDate":"2023-04-17 10:43:17"}
  249. //gzWXSn3A2ZW9u3k9yrHdEqE5zRzto/Rud6LZ6JRJ1k59ou5nWABc8t8fR/sWU89lGweFQMsZkefowEBYzArADnSXjbKwfQj19UoF5RN/0mI=
  250. var configurationPoliceDS = _channelConfigurationManager.GetConfigurationPoliceDS();
  251. string sm4 = configurationPoliceDS.token3_sm4_mw;
  252. var apiR = new DaoShuDeResponse<string>();
  253. try
  254. {
  255. // 验证dcsm
  256. string dcsmMsg = CheckDcsm(Request.Headers["dcsm"].ToString(), configurationPoliceDS.token3_dcsm);
  257. if (!string.IsNullOrEmpty(dcsmMsg))
  258. {
  259. apiR = DaoShuDeResponse<string>.Failed(dcsmMsg);
  260. }
  261. else
  262. {
  263. OpenData openData = new();
  264. string base64String = await GetStreamBase64(HttpContext.Request);
  265. if (!string.IsNullOrEmpty(base64String))
  266. {
  267. // 解密:base64通过sm4解密转json
  268. string jsonRes = Sm4Crypto.Decrypt_ECB_Base64(sm4, base64String);
  269. if (!string.IsNullOrEmpty(jsonRes))
  270. // json 转 实体类
  271. openData = System.Text.Json.JsonSerializer.Deserialize<OpenData>(jsonRes);
  272. await InitRawData("service/api/ds/12345To110/chainAlarm", base64String, jsonRes, openData?.AlarmReceiptNumber);
  273. }
  274. bool bRun = true;
  275. if (string.IsNullOrEmpty(openData.StartDate) || !IsDate(openData.StartDate))
  276. {
  277. bRun = false;
  278. apiR = DaoShuDeResponse<string>.Failed("【创建开始时间】不是日期格式 yyyy-MM-dd HH:mm:ss");
  279. }
  280. if (string.IsNullOrEmpty(openData.EndDate) || !IsDate(openData.EndDate))
  281. {
  282. bRun = false;
  283. apiR = DaoShuDeResponse<string>.Failed("【创建结束时间】不是日期格式 yyyy-MM-dd HH:mm:ss");
  284. }
  285. if (bRun)
  286. {
  287. var listData = await _dsPoliceSendChainAlarmDsRepository.Queryable()
  288. .WhereIF(!string.IsNullOrEmpty(openData.StartDate), p => p.CallPoliceTime >= Convert.ToDateTime(openData.StartDate))
  289. .WhereIF(!string.IsNullOrEmpty(openData.EndDate), p => p.CallPoliceTime >= Convert.ToDateTime(openData.EndDate))
  290. .OrderBy(p => p.CallPoliceTime)
  291. .Take(50)
  292. .ToListAsync();
  293. if (null == listData)
  294. apiR = DaoShuDeResponse<string>.Failed(null);
  295. else
  296. {
  297. var dto = _mapper.Map<IReadOnlyList<ChainAlarm_DS>>(listData);
  298. // 返回数据
  299. apiR = DaoShuDeResponse<string>.Succeed(System.Text.Json.JsonSerializer.Serialize(dto), "调用成功");
  300. }
  301. }
  302. }
  303. }
  304. catch (System.Exception)
  305. {
  306. apiR = DaoShuDeResponse<string>.Failed("接口异常");
  307. }
  308. // 返回数据转Json
  309. string jsonResult = ModelToJson(apiR);
  310. // 加密:json通过sm4加密转base64
  311. string base64 = Sm4Crypto.Encrypt_ECB_Base64(sm4, jsonResult);
  312. var resp = new HttpResponseMessage(HttpStatusCode.OK);
  313. resp.Content = new StringContent(base64, System.Text.Encoding.UTF8, "text/plain");
  314. return OpenResponse.Ok(resp);
  315. }
  316. #endregion
  317. #region send-工单办结
  318. /// <summary>
  319. /// 工单办结
  320. /// </summary>
  321. /// <returns></returns>
  322. [HttpPost("service/api/ds/12345To110/chainDeal")]
  323. [AllowAnonymous]
  324. public async Task<OpenResponse> ChainDeal_Send()
  325. {
  326. // 测试JSON
  327. // {"JJDBH":"510300202304070001202304070001","CZLX":"1"}
  328. // 测试Base64
  329. // 6RB6Hat8dpBfvCTtEpwotd/MlonxdmqZaa3TcLaua/xcjFv1SZJzKZPrhgsux63Gq/DXxtAQ25buLsI1fgFv3g==
  330. var configurationPoliceDS = _channelConfigurationManager.GetConfigurationPoliceDS();
  331. string sm4 = configurationPoliceDS.token2_sm4_mw;
  332. var apiR = new DaoShuDeResponse<string>();
  333. try
  334. {
  335. // 验证dcsm
  336. string dcsmMsg = CheckDcsm(Request.Headers["dcsm"].ToString(), configurationPoliceDS.token2_dcsm);
  337. if (!string.IsNullOrEmpty(dcsmMsg))
  338. {
  339. apiR = DaoShuDeResponse<string>.Failed(dcsmMsg);
  340. }
  341. else
  342. {
  343. string base64String = await GetStreamBase64(HttpContext.Request);
  344. OpenData openData = new();
  345. if (!string.IsNullOrEmpty(base64String))
  346. {
  347. // 解密:base64通过sm4解密转json
  348. string jsonRes = Sm4Crypto.Decrypt_ECB_Base64(sm4, base64String);
  349. if (!string.IsNullOrEmpty(jsonRes))
  350. // json 转 实体类
  351. openData = System.Text.Json.JsonSerializer.Deserialize<OpenData>(jsonRes);
  352. await InitRawData("service/api/ds/12345To110/chainDeal", base64String, jsonRes, openData?.AlarmReceiptNumber);
  353. }
  354. bool bRun = true;
  355. if (!string.IsNullOrEmpty(openData.StartDate) && !IsDate(openData.StartDate))
  356. {
  357. bRun = false;
  358. apiR = DaoShuDeResponse<string>.Failed("【创建开始时间】不是日期格式 yyyy-MM-dd HH:mm:ss");
  359. }
  360. if (!string.IsNullOrEmpty(openData.EndDate) && !IsDate(openData.EndDate))
  361. {
  362. bRun = false;
  363. apiR = DaoShuDeResponse<string>.Failed("【创建结束时间】不是日期格式 yyyy-MM-dd HH:mm:ss");
  364. }
  365. if (bRun)
  366. {
  367. var listData = await _dsPoliceSendChainDealDsRepository.Queryable()
  368. .WhereIF(!string.IsNullOrEmpty(openData.StartDate), p => p.WarehousingTime >= Convert.ToDateTime(openData.StartDate))
  369. .WhereIF(!string.IsNullOrEmpty(openData.EndDate), p => p.WarehousingTime >= Convert.ToDateTime(openData.EndDate))
  370. .WhereIF(!string.IsNullOrEmpty(openData.AlarmReceiptNumber), p => p.AlarmReceiptNumber == openData.AlarmReceiptNumber)
  371. .Where(p => p.DisposalType == openData.DisposalType)
  372. .OrderBy(p => p.WarehousingTime)
  373. .Take(50)
  374. .ToListAsync();
  375. if (null == listData)
  376. apiR = DaoShuDeResponse<string>.Failed(null);
  377. else
  378. {
  379. var dto = _mapper.Map<IReadOnlyList<ChainDeal_DS>>(listData);
  380. // 返回数据
  381. apiR = DaoShuDeResponse<string>.Succeed(System.Text.Json.JsonSerializer.Serialize(dto), "调用成功");
  382. }
  383. }
  384. }
  385. }
  386. catch (System.Exception)
  387. {
  388. apiR = DaoShuDeResponse<string>.Failed("接口异常");
  389. }
  390. // 返回数据转Json
  391. string jsonResult = ModelToJson(apiR);
  392. // 加密:json通过sm4加密转base64
  393. string base64 = Sm4Crypto.Encrypt_ECB_Base64(sm4, jsonResult);
  394. var resp = new HttpResponseMessage(HttpStatusCode.OK);
  395. resp.Content = new StringContent(base64, System.Text.Encoding.UTF8, "text/plain");
  396. return OpenResponse.Ok(resp);
  397. }
  398. #endregion
  399. #region send-知识库列表-已完成
  400. /// <summary>
  401. /// 查询知识库列表
  402. /// </summary>
  403. /// <returns></returns>
  404. [HttpPost("service/api/ds/get_knowledge_info")]
  405. [AllowAnonymous]
  406. public async Task<OpenResponse> Get_Knowledge_Info()
  407. {
  408. // 测试Json
  409. // {"createTimeBegin":"2003-04-07 10:59:14","createTimeEnd":"2023-12-07 10:59:21","keyWord":"市民"}
  410. // {"createTimeBegin":"2003-04-07 10:59:14","createTimeEnd":"2023-12-07 10:59:21","keyWord":""}
  411. // 测试Base64
  412. // sVGPN7BDsKnDLrd6NzrGx+2IH6vVAo6bjGSenIgCJATssZduYxBOLdQi7TVdsBCy7AGk15xjKRVe4AdovL6r49fxDvWjyDlxS8K4qkukEOtYs/VyP6WIdiKQL6PC3i/T
  413. // sVGPN7BDsKnDLrd6NzrGx+2IH6vVAo6bjGSenIgCJATssZduYxBOLdQi7TVdsBCy7AGk15xjKRVe4AdovL6r49fxDvWjyDlxS8K4qkukEOuaeRL4jMcFsN7HoUTHfDrk
  414. var configurationPoliceDS = _channelConfigurationManager.GetConfigurationPoliceDS();
  415. string sm4 = configurationPoliceDS.token5_sm4_mw;
  416. var apiR = new DaoShuDeResponse<string>();
  417. try
  418. {
  419. // 验证dcsm
  420. string dcsmMsg = CheckDcsm(Request.Headers["dcsm"].ToString(), configurationPoliceDS.token5_dcsm);
  421. if (!string.IsNullOrEmpty(dcsmMsg))
  422. {
  423. apiR = DaoShuDeResponse<string>.Failed(dcsmMsg);
  424. }
  425. else
  426. {
  427. string base64String = await GetStreamBase64(HttpContext.Request);
  428. Get_Knowledge get_Knowledge = new Get_Knowledge();
  429. if (!string.IsNullOrEmpty(base64String))
  430. {
  431. // 解密:base64通过sm4解密转json
  432. string jsonRes = Sm4Crypto.Decrypt_ECB_Base64(sm4, base64String);
  433. if (!string.IsNullOrEmpty(jsonRes))
  434. // json 转 实体类
  435. get_Knowledge = System.Text.Json.JsonSerializer.Deserialize<Get_Knowledge>(jsonRes);
  436. await InitRawData("service/api/ds/get_knowledge_info", base64String, jsonRes, null);
  437. }
  438. bool bRun = true;
  439. if (string.IsNullOrEmpty(get_Knowledge.createTimeBegin) || !IsDate(get_Knowledge.createTimeBegin))
  440. {
  441. bRun = false;
  442. apiR = DaoShuDeResponse<string>.Failed("【创建开始时间】不是日期格式 yyyy-MM-dd HH:mm:ss");
  443. }
  444. if (string.IsNullOrEmpty(get_Knowledge.createTimeEnd) || !IsDate(get_Knowledge.createTimeEnd))
  445. {
  446. bRun = false;
  447. apiR = DaoShuDeResponse<string>.Failed("【创建结束时间】不是日期格式 yyyy-MM-dd HH:mm:ss");
  448. }
  449. if (bRun)
  450. {
  451. var listData = await _dsKnowledgeRawDataRepository
  452. .Queryable()
  453. .WhereIF(!string.IsNullOrEmpty(get_Knowledge.createTimeBegin), p => p.CreatDate >= Convert.ToDateTime(get_Knowledge.createTimeBegin))
  454. .WhereIF(!string.IsNullOrEmpty(get_Knowledge.createTimeEnd), p => p.CreatDate <= Convert.ToDateTime(get_Knowledge.createTimeEnd))
  455. .WhereIF(!string.IsNullOrEmpty(get_Knowledge.keyWord), p => p.KName.Contains(get_Knowledge.keyWord))
  456. .OrderByDescending(p => p.CreatDate)
  457. .ToListAsync();
  458. if (null == listData)
  459. apiR = DaoShuDeResponse<string>.Failed(null);
  460. else
  461. {
  462. var dto = _mapper.Map<IReadOnlyList<KnowledgeDto>>(listData);
  463. // 返回数据
  464. apiR = DaoShuDeResponse<string>.Succeed(System.Text.Json.JsonSerializer.Serialize(dto), "调用成功");
  465. }
  466. }
  467. }
  468. }
  469. catch (System.Exception)
  470. {
  471. apiR = DaoShuDeResponse<string>.Failed("接口异常");
  472. }
  473. // 返回数据转Json
  474. string jsonResult = ModelToJson(apiR);
  475. // 加密:json通过sm4加密转base64
  476. string base64 = Sm4Crypto.Encrypt_ECB_Base64(sm4, jsonResult);
  477. var resp = new HttpResponseMessage(HttpStatusCode.OK);
  478. resp.Content = new StringContent(base64, System.Text.Encoding.UTF8, "text/plain");
  479. return OpenResponse.Ok(resp);
  480. }
  481. #endregion
  482. #region send-知识库内容-已完成
  483. /// <summary>
  484. /// 查询知识库内容
  485. /// </summary>
  486. /// <returns></returns>
  487. [HttpPost("service/api/ds/get_knowledge_content")]
  488. [AllowAnonymous]
  489. public async Task<OpenResponse> Get_Knowledge_Content()
  490. {
  491. var configurationPoliceDS = _channelConfigurationManager.GetConfigurationPoliceDS();
  492. string sm4 = configurationPoliceDS.token6_sm4_mw;
  493. var apiR = new DaoShuDeResponse<string>();
  494. try
  495. {
  496. // 验证dcsm
  497. string dcsmMsg = CheckDcsm(Request.Headers["dcsm"].ToString(), configurationPoliceDS.token6_dcsm);
  498. if (!string.IsNullOrEmpty(dcsmMsg))
  499. apiR = DaoShuDeResponse<string>.Failed(dcsmMsg);
  500. else
  501. {
  502. string base64String = await GetStreamBase64(HttpContext.Request);
  503. Get_Knowledge get_Knowledge = new Get_Knowledge();
  504. if (!string.IsNullOrEmpty(base64String))
  505. {
  506. // 解密:base64通过sm4解密转json
  507. string jsonRes = Sm4Crypto.Decrypt_ECB_Base64(sm4, base64String);
  508. if (!string.IsNullOrEmpty(jsonRes))
  509. // json 转 实体类
  510. get_Knowledge = System.Text.Json.JsonSerializer.Deserialize<Get_Knowledge>(jsonRes);
  511. await InitRawData("service/api/ds/get_knowledge_content", base64String, jsonRes, null);
  512. }
  513. if (string.IsNullOrEmpty(get_Knowledge.id))
  514. {
  515. apiR = DaoShuDeResponse<string>.Failed("【知识库ID】不能为空");
  516. }
  517. else
  518. {
  519. var data = await _dsKnowledgeRawDataRepository.GetAsync(p => p.Id == get_Knowledge.id);
  520. if (null == data)
  521. apiR = DaoShuDeResponse<string>.Failed(null);
  522. else
  523. {
  524. var dto = _mapper.Map<KnowledgeContent>(data);
  525. // 返回数据
  526. apiR = DaoShuDeResponse<string>.Succeed(System.Text.Json.JsonSerializer.Serialize(dto), "调用成功");
  527. }
  528. }
  529. }
  530. }
  531. catch (System.Exception)
  532. {
  533. apiR = DaoShuDeResponse<string>.Failed("接口异常");
  534. }
  535. // 返回数据转Json
  536. string jsonResult = ModelToJson(apiR);
  537. // 加密:json通过sm4加密转base64
  538. string base64 = Sm4Crypto.Encrypt_ECB_Base64(sm4, jsonResult);
  539. var resp = new HttpResponseMessage(HttpStatusCode.OK);
  540. resp.Content = new StringContent(base64, System.Text.Encoding.UTF8, "text/plain");
  541. return OpenResponse.Ok(resp);
  542. }
  543. #endregion
  544. #region 私有方法
  545. #region 工单办结
  546. /// <summary>
  547. /// 工单办结
  548. /// </summary>
  549. /// <param name="policeReceiveChainDealDs"></param>
  550. /// <returns></returns>
  551. private async Task InitChainDeal(ChainDeal_DS policeReceiveChainDealDs)
  552. {
  553. var orderData = await _dsOrderRepository.GetAsync(p => p.ExternalId == policeReceiveChainDealDs.AlarmReceiptNumber);
  554. if (orderData is null)
  555. return;
  556. if (policeReceiveChainDealDs.DisposalType == 1)//正常办理
  557. {
  558. Hotline.Share.Dtos.DataSharing.PusherHotlineDto.OrderResultDto orderResultDto = new()
  559. {
  560. OrderId = orderData.OrderId,
  561. FinishType = "1",
  562. Opinion = policeReceiveChainDealDs.DisposalSituation
  563. };
  564. await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReultSend, orderResultDto, cancellationToken: HttpContext.RequestAborted);
  565. }
  566. else if (policeReceiveChainDealDs.DisposalType == 2)//退回
  567. {
  568. Hotline.Share.Dtos.DataSharing.PusherHotlineDto.OrderResultDto orderResultDto = new()
  569. {
  570. OrderId = orderData.OrderId,
  571. FinishType = "0",
  572. Opinion = policeReceiveChainDealDs.ReturnOpinion
  573. };
  574. //向业务系统推送消息
  575. await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReultSend, orderResultDto, cancellationToken: HttpContext.RequestAborted);
  576. }
  577. else if (policeReceiveChainDealDs.DisposalType == 3)//回访
  578. {
  579. Hotline.Share.Dtos.Order.ProvinceOrderVisitDto orderVisitDto = new()
  580. {
  581. ProvinceNo = orderData.ProvinceNo,
  582. VisitTime = Convert.ToDateTime(policeReceiveChainDealDs.RevisitTime),
  583. VisitContent = policeReceiveChainDealDs.VisitContent,
  584. OrgProcessingResults = policeReceiveChainDealDs.VisitResult,
  585. VisitType = Hotline.Share.Enums.Order.EVisitType.ArtificialVisit
  586. };
  587. //向业务系统推送消息
  588. await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderEvlResult, orderVisitDto, cancellationToken: HttpContext.RequestAborted);
  589. }
  590. }
  591. #endregion
  592. #region 写入原始数据
  593. /// <summary>
  594. /// 写入原始数据
  595. /// </summary>
  596. /// <param name="externalId"></param>
  597. /// <param name="serviceInterface"></param>
  598. /// <param name="receiveRawData"></param>
  599. /// <param name="receiveData"></param>
  600. /// <returns></returns>
  601. private async Task InitRawData(string serviceInterface, string receiveRawData, string receiveData, string? externalId)
  602. {
  603. DsReceivePoliceData dsReceivePoliceData = new()
  604. {
  605. ExternalId = externalId,
  606. ServiceInterface = serviceInterface,
  607. ReceiveRawData = receiveRawData,
  608. ReceiveData = receiveData
  609. };
  610. await _dsReceivePoliceDataRepository.AddAsync(dsReceivePoliceData, HttpContext.RequestAborted);
  611. }
  612. #endregion
  613. #region 获取RAW传入的Base64_Json
  614. /// <summary>
  615. /// 获取RAW传入的Base64_Json
  616. /// </summary>
  617. /// <param name="request"></param>
  618. /// <returns></returns>
  619. private static async Task<string> GetStreamBase64(HttpRequest request)
  620. {
  621. string base64String = "";
  622. try
  623. {
  624. request.EnableBuffering();
  625. request.Body.Position = 0;
  626. using (var stream = new StreamReader(request.Body, Encoding.UTF8))
  627. {
  628. base64String = await stream.ReadToEndAsync();
  629. }
  630. }
  631. catch (Exception)
  632. {
  633. }
  634. return base64String;
  635. }
  636. #endregion
  637. #region 验证DCSM是否正确
  638. /// <summary>
  639. /// 验证DCSM是否正确
  640. /// </summary>
  641. /// <param name="headrs"></param>
  642. /// <param name="dcsmIn"></param>
  643. /// <returns></returns>
  644. private static string CheckDcsm(string headrs, string dcsmIn)
  645. {
  646. string result = "";
  647. string dcsm = "";
  648. try
  649. {
  650. dcsm = headrs.ToString();
  651. if (dcsm != dcsmIn)
  652. {
  653. result = "【dcsm】错误";
  654. }
  655. }
  656. catch (System.Exception)
  657. {
  658. result = "【dcsm】不能为空";
  659. }
  660. return result;
  661. }
  662. #endregion
  663. #region 验证日期
  664. private static bool IsDate(string strDate)
  665. {
  666. try
  667. {
  668. if (strDate.Contains('.') == true || strDate.Contains(',') == true)
  669. {
  670. return false;
  671. }
  672. DateTime.Parse(strDate); //不是字符串时会出现异常
  673. return true;
  674. }
  675. catch
  676. {
  677. return false;
  678. }
  679. }
  680. #endregion
  681. #region 转Json
  682. /// <summary>
  683. /// 转Json
  684. /// </summary>
  685. /// <param name="obj"></param>
  686. /// <returns></returns>
  687. private static string ModelToJson(object obj)
  688. {
  689. string jsonstr = "";
  690. try
  691. {
  692. IsoDateTimeConverter timejson = new IsoDateTimeConverter
  693. {
  694. DateTimeFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss"
  695. //如果是年月日的话就是 :DateTimeFormat = "yyyy'-'MM'-'dd" 注意第一个y前面没有单引号 最后一个d后面也没有单引号
  696. };
  697. jsonstr = JsonConvert.SerializeObject(obj, timejson);
  698. }
  699. catch (Exception)
  700. {
  701. }
  702. return jsonstr;
  703. }
  704. #endregion
  705. #endregion
  706. }
  707. }