PoliceDSController.cs 42 KB

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