PoliceDSController.cs 37 KB

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