SameTravelService.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. package com.hhwy.qbeqsjy.service;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.alibaba.fastjson.JSONPath;
  6. import com.alibaba.fastjson.serializer.SerializerFeature;
  7. import com.hhwy.qbeqsjy.common.*;
  8. import com.hhwy.qbeqsjy.dao.CtrlDao;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.apache.http.NameValuePair;
  12. import org.apache.http.message.BasicNameValuePair;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Service;
  16. import java.util.*;
  17. /**
  18. * 同行类数据查询业务逻辑
  19. */
  20. @Slf4j
  21. @Service
  22. public class SameTravelService {
  23. @Value("${fwkfpt.type}")
  24. private String fwkfptType;
  25. @Value("${fwkfpt.policeNo}")
  26. private String fwkfptPoliceNo;
  27. @Value("${fwkfpt.userId}")
  28. private String fwkfptUserId;
  29. @Value("${fwkfpt.senderId}")
  30. private String fwkfptSenderId;
  31. @Value("${fwkfpt.appId}")
  32. private String fwkfptAppId;
  33. @Value("${fwkfpt.serviceId}")
  34. private String fwkfptServiceId;
  35. @Value("${fwkfpt.token.url}")
  36. private String fwkfptTokenUrl;
  37. @Value("${fwkfpt.uniQuery.url}")
  38. private String fwkfptUniQueryUrl;
  39. @Value("${tx.query.max.count}")
  40. private String maxReturnNum;
  41. @Value("${clue.code.idCard}")
  42. private String clueCodeIdCard;
  43. private SnowflakeIdGenerator generator = new SnowflakeIdGenerator(1);
  44. private HttpClient httpClient = new HttpClient();
  45. @Autowired
  46. private CtrlDao ctrlDao;
  47. /**
  48. * 调用烽火同行类数据通查服务接口,并将查询结果保存入库
  49. * @param taskId 任务编号
  50. * @param conditionFieldValue 参与条件查询的字段值
  51. * @param resourceIdentifier 参与条件查询的数据资源标识符(烽火盘古平台标准)
  52. * @param resourceCode 参与条件查询的数据资源标识符对应的数据资源编码(烽火盘古平台标准)
  53. * @return
  54. */
  55. public void callFHUniQueryService(String taskId, String conditionFieldValue, String resourceIdentifier, String resourceCode){
  56. // ========== 获取烽火 - 服务开放平台认证token
  57. Map<String, String> tokenMap = getFHUniQueryServiceToken();
  58. String appTokenId = tokenMap.get("appTokenId");
  59. String userTokenId = tokenMap.get("userTokenId");
  60. if(StringUtils.isBlank(appTokenId) || StringUtils.isBlank(userTokenId)){
  61. log.info("【QBEQSJYCTRL - 聚集预警通用查询服务】 获取目标服务认证token失败,操作结束");
  62. return;
  63. }
  64. // ========== 调用烽火 - 同行类数据通查服务接口
  65. long start = System.currentTimeMillis();
  66. Map<String, Object> headerParamsMap = new HashMap<>();
  67. headerParamsMap.put("Content-Type", Constants.DEFAULT_RSP_TYPE);
  68. headerParamsMap.put("app_token", appTokenId);
  69. headerParamsMap.put("user_token", userTokenId);
  70. headerParamsMap.put("userid", fwkfptUserId);
  71. headerParamsMap.put("subid", fwkfptAppId);
  72. headerParamsMap.put("serviceid", fwkfptServiceId);
  73. headerParamsMap.put("SenderID", fwkfptSenderId);
  74. Map<String, Object> reqBody = new HashMap<>();
  75. reqBody.put("From", Constants.AREA_CODE_TJ);
  76. reqBody.put("To", Constants.AREA_CODE_TJ);
  77. reqBody.put("MessageSequence", TimeTool.timeStampToDateString4(TimeTool.getNowTimeStamp()));
  78. Map<String, Object> requestParam = new HashMap<>();
  79. List<String> rspFieldNameList = Arrays.asList(CommonUtil.getConfValueByKey(resourceIdentifier).split(","));
  80. requestParam.put("Condition", rspFieldNameList.get(0) + "='" + conditionFieldValue + "'");
  81. Map<String, Object> otherCondition = new HashMap<>();
  82. otherCondition.put("AsyncBoolean", Constants.STR_NUM_0);
  83. otherCondition.put("AsyncIdentity", Constants.STR_NUM_0);
  84. otherCondition.put("AsyncOnceReturnNum", maxReturnNum);
  85. otherCondition.put("AsyncQuery", "");
  86. otherCondition.put("CallbackID", "");
  87. otherCondition.put("CodeMode", Constants.STR_NUM_0);
  88. otherCondition.put("MaxReturnNum", maxReturnNum);
  89. otherCondition.put("SortResults", "");
  90. requestParam.put("OtherCondition", otherCondition);
  91. List<Map<String, Object>> resourceInfosList = new ArrayList<>();
  92. Map<String, Object> resourceInfoMap = new HashMap<>();
  93. List<Map<String, Object>> dataItemsList = new ArrayList<>();
  94. for (String fieldName : rspFieldNameList) {
  95. Map<String, Object> dataItemMap = new HashMap<>();
  96. dataItemMap.put("Fmt", "");
  97. dataItemMap.put("Name", fieldName);
  98. dataItemsList.add(dataItemMap);
  99. }
  100. resourceInfoMap.put("DataItems", dataItemsList);
  101. resourceInfoMap.put("ResourceName", resourceIdentifier);
  102. resourceInfosList.add(resourceInfoMap);
  103. requestParam.put("ResourceInfos", resourceInfosList);
  104. reqBody.put("RequestParam", requestParam);
  105. String rspStr = httpClient.postResource(fwkfptUniQueryUrl, JSON.toJSONString(reqBody, SerializerFeature.WriteMapNullValue), headerParamsMap);
  106. // ========== 解析烽火 - 同行类数据通查服务接口响应信息
  107. JSONObject rspJSONObj = JSON.parseObject(rspStr);
  108. List<JSONObject> dataList = new ArrayList<>();
  109. if(rspJSONObj != null){
  110. String messageStatus = rspJSONObj.getString("MessageStatus");
  111. if("0200".equals(messageStatus)){
  112. log.info("调用【烽火 - 服务开放平台 # 同行类数据通查服务接口】 服务调用成功,耗时:{}ms", System.currentTimeMillis() - start);
  113. JSONObject responseParam = rspJSONObj.getJSONObject("ResponseParam");
  114. JSONArray resourceInfos = responseParam.getJSONArray("ResourceInfos");
  115. if(resourceInfos != null && resourceInfos.size() > 0){
  116. JSONObject jsonObject = resourceInfos.getJSONObject(0);
  117. String resName = jsonObject.getString("ResourceName");
  118. JSONArray dataInfo = jsonObject.getJSONArray("DataInfo");
  119. if(dataInfo != null && dataInfo.size() > 0){ // 存在命中数据
  120. JSONArray dataItems = jsonObject.getJSONArray("DataItems");
  121. // 格式化存储预警结果数据,形如:[{"xm": "1", "zjhm": "111"}, {"xm": "2", "zjhm": "222"}, ...]
  122. for (Object obj : dataInfo) {
  123. JSONArray dataRow = (JSONArray) obj;
  124. JSONObject rowData = new JSONObject();
  125. for (int i = 0; i < dataRow.size(); i++) {
  126. Object columnValue = dataRow.get(i);
  127. JSONObject columnMap = dataItems.getJSONObject(i);
  128. String name = columnMap.getString("Name");
  129. rowData.put(name, columnValue);
  130. }
  131. dataList.add(rowData);
  132. }
  133. }
  134. }
  135. }
  136. }
  137. log.info("【烽火 - 服务开放平台 # 同行类数据通查服务接口 响应数据解析完成】 命中数据量:{}", dataList.size());
  138. // ========== 保存入库同行类业务查询结果数据(入库前需关联补全对应布控任务相关信息)
  139. List<Object[]> warningInfoList = new ArrayList<>();
  140. int batchSaveNum = 0;
  141. if(dataList.size() > 0){
  142. // 预警状态默认为0(未读)
  143. Integer yjzt = 0;
  144. // 预警时间
  145. Date yjsj = new Date();
  146. for (JSONObject item : dataList) {
  147. // 构造预警信息说明
  148. String yjxxsm = buildYjxxsmByResourceCode(resourceCode, item);
  149. // 根据任务编号、线索值、线索类型查询对应的布控任务相关信息(包含任务信息、区域信息、线索信息)
  150. List<Map<String, Object>> ctrlTaskInfoList = ctrlDao.queryCtrlTaskInfo(taskId, conditionFieldValue, clueCodeIdCard);
  151. if(ctrlTaskInfoList.size() > 0){
  152. Map<String, Object> ctrlTaskInfo = ctrlTaskInfoList.get(0);
  153. String rwmc = String.valueOf(ctrlTaskInfo.get("rwmc"));
  154. Integer rwlx = (Integer) ctrlTaskInfo.get("rwlx");
  155. String rwlxmc = String.valueOf(ctrlTaskInfo.get("rwlxmc"));
  156. String rwdxlxmc = String.valueOf(ctrlTaskInfo.get("rwdxlxmc"));
  157. String sqrXm = String.valueOf(ctrlTaskInfo.get("sqr_xm"));
  158. String sqrSfzh = String.valueOf(ctrlTaskInfo.get("sqr_sfzh"));
  159. String sqrJh = String.valueOf(ctrlTaskInfo.get("sqr_jh"));
  160. String sqrDwbm = String.valueOf(ctrlTaskInfo.get("sqr_dwbm"));
  161. String sqrDwmc = String.valueOf(ctrlTaskInfo.get("sqr_dwmc"));
  162. String yjryXm = String.valueOf(ctrlTaskInfo.get("ryxm"));
  163. String yjrySfzh = String.valueOf(ctrlTaskInfo.get("zjhm"));
  164. String yjrySjh = String.valueOf(ctrlTaskInfo.get("sjh"));
  165. String yjryLb = String.valueOf(ctrlTaskInfo.get("rylb"));
  166. String yjryBq = String.valueOf(ctrlTaskInfo.get("rybq"));
  167. String gkjb = String.valueOf(ctrlTaskInfo.get("gkjb"));
  168. String gkjbmc = String.valueOf(ctrlTaskInfo.get("gkjbmc"));
  169. String zrjz = String.valueOf(ctrlTaskInfo.get("zrjz"));
  170. String zrmjid = String.valueOf(ctrlTaskInfo.get("zrmjid"));
  171. String zrmjxm = String.valueOf(ctrlTaskInfo.get("zrmjxm"));
  172. String zrmjjh = String.valueOf(ctrlTaskInfo.get("zrmjjh"));
  173. String zrmjlxfs = String.valueOf(ctrlTaskInfo.get("zrmjlxfs"));
  174. String zrdwbm = String.valueOf(ctrlTaskInfo.get("zrdwbm"));
  175. String zrbmbm = String.valueOf(ctrlTaskInfo.get("zrbmbm"));
  176. // 生成预警信息编号
  177. String yjxxbh = String.valueOf(generator.nextId());
  178. warningInfoList.add(new Object[]{taskId, rwmc, rwlx, rwlxmc, rwdxlxmc, yjxxbh, yjryXm, yjrySfzh, yjrySjh, yjxxsm, yjzt, Constants.YJZT_WD, yjsj, zrjz, zrmjid, zrmjxm, zrmjjh, zrmjlxfs, zrdwbm, CommonUtil.getConfValueByKey(zrdwbm), zrbmbm, CommonUtil.getConfValueByKey(zrbmbm), sqrXm, sqrSfzh, sqrJh, sqrDwbm, sqrDwmc, yjryLb, yjryBq, gkjb, gkjbmc, resourceCode, yjsj, yjsj});
  179. }
  180. }
  181. if(warningInfoList.size() > 0){
  182. batchSaveNum = ctrlDao.batchInsertWarningInfo(warningInfoList);
  183. }
  184. }
  185. log.info("【QBEQSJYCTRL - 聚集预警通用查询服务】 命中数据量:{},已入库数据量:{}", dataList.size(), batchSaveNum);
  186. }
  187. /**
  188. * 获取烽火 - 服务开放平台认证token
  189. * @return
  190. */
  191. public Map<String, String> getFHUniQueryServiceToken(){
  192. Map<String, String> tokenMap = new HashMap<>();
  193. Map<String, Object> tokenHeaderParamsMap = new HashMap<>();
  194. tokenHeaderParamsMap.put("Content-Type", Constants.URLENCODED_RSP_TYPE);
  195. Map<String, Object> userTokenMap = new HashMap<>();
  196. userTokenMap.put("type", fwkfptType);
  197. userTokenMap.put("policeNo", fwkfptPoliceNo);
  198. userTokenMap.put("userId", fwkfptUserId);
  199. Map<String, Object> appTokenMap = new HashMap<>();
  200. appTokenMap.put("appId", fwkfptAppId);
  201. appTokenMap.put("userToken", JSON.toJSONString(userTokenMap));
  202. List<NameValuePair> nameValuePairs = new ArrayList<>();
  203. nameValuePairs.add(new BasicNameValuePair("userToken", JSON.toJSONString(userTokenMap)));
  204. nameValuePairs.add(new BasicNameValuePair("appToken", JSON.toJSONString(appTokenMap)));
  205. nameValuePairs.add(new BasicNameValuePair("serviceid", fwkfptServiceId));
  206. String rspContent = httpClient.postResourceFWKFPT(fwkfptTokenUrl, nameValuePairs, tokenHeaderParamsMap);
  207. JSONObject rspContentJSONObj = JSON.parseObject(rspContent);
  208. if(rspContentJSONObj != null){
  209. String appTokenJSONStr = rspContentJSONObj.getString("appTokenId");
  210. String userTokenJSONStr = rspContentJSONObj.getString("userTokenId");
  211. if(StringUtils.isBlank(appTokenJSONStr) || StringUtils.isBlank(userTokenJSONStr)){
  212. String message = rspContentJSONObj.getString("message");
  213. log.error("获取【烽火 - 服务开放平台 # 权限认证令牌】 令牌创建失败,异常信息:{}", message);
  214. } else {
  215. String appTokenId = JSON.parseObject(appTokenJSONStr).getString("appToken");
  216. String userTokenId = JSON.parseObject(userTokenJSONStr).getString("userToken");
  217. tokenMap.put("appTokenId", appTokenId);
  218. tokenMap.put("userTokenId", userTokenId);
  219. log.info("获取【烽火 - 服务开放平台 # 权限认证令牌】 令牌创建成功");
  220. }
  221. }
  222. return tokenMap;
  223. }
  224. /**
  225. * 根据 数据资源编码和对应JSON数据 构造对应预警信息说明
  226. * @param resourceCode
  227. * @param data
  228. * @return
  229. */
  230. public String buildYjxxsmByResourceCode(String resourceCode, JSONObject data){
  231. String yjxxsm = "";
  232. if(Constants.RES_CODE_THC.equals(resourceCode)){
  233. String xm = data.getString("XM");
  234. String zjhm = data.getString("ZJHM");
  235. String zwh = data.getString("ZWH");
  236. String xm2 = data.getString("XM_2");
  237. String zjhm2 = data.getString("ZJHM_2");
  238. String zwh2 = data.getString("ZWH_2");
  239. String facRq = data.getString("FAC_RQ");
  240. String cc = data.getString("CC");
  241. String cxh = data.getString("CXH");
  242. String sfazMc = data.getString("SFAZ_MC");
  243. String ddzMc = data.getString("DDZ_MC");
  244. String flagGx = "0".equals(data.getString("FLAG_GX"))? "邻座" : "前后排";
  245. yjxxsm = xm + "(身份证号:" + zjhm + ",座位号:" + zwh + ")和" + xm2 + "(身份证号:" + zjhm2 + ",座位号:" + zwh2 + ")于" + facRq + "共同乘坐" + cc + "次列车第"
  246. + cxh + "号车厢,出发站:" + sfazMc + ",到达站:" + ddzMc + ",位置关系:" + flagGx;
  247. }
  248. if (Constants.RES_CODE_THB.equals(resourceCode)){
  249. String zjhm = data.getString("FIRST_PER_ZJHM");
  250. String xm = data.getString("FIRST_PER_NAME");
  251. String zjhm2 = data.getString("SECOND_PER_ZJHM");
  252. String xm2 = data.getString("SECOND_PER_NAME");
  253. String cfjcXxdm = data.getString("QFJC_XXDM02");
  254. String ddjcXxdm = data.getString("DDJC_XXDM02");
  255. String cfrq = data.getString("DD_CFA_RQ");
  256. String ddrq = data.getString("DD_DD_RQ");
  257. String gtdpXxbh = data.getString("GTDP_XXBH");
  258. yjxxsm = xm + "(身份证号:" + zjhm + ")和" + xm2 + "(身份证号:" + zjhm2 + ")共同购买航班票,出发机场信息代码:" + cfjcXxdm + ",到达机场信息代码:" + ddjcXxdm
  259. + ",出发日期:" + cfrq + ",到达日期:" + ddrq + "共同订票信息编号:" + gtdpXxbh;
  260. }
  261. if (Constants.RES_CODE_TBG.equals(resourceCode)) {
  262. String zjhm = data.getString("ZJHM");
  263. String xm = data.getString("XM");
  264. String zjhm2 = data.getString("ZJHM2");
  265. String xm2 = data.getString("XM2");
  266. String rzlgXxbh = data.getString("RUZ_LVG_XXBH");
  267. // 根据旅馆信息编号关联旅馆名称信息
  268. String rzlgmc = "";
  269. String rzfjh = data.getString("RUZ_FAJ_XXBH");
  270. String rzsj = data.getString("RUZ_JDSJ");
  271. String rzsj2 = data.getString("RUZ_JDSJ2");
  272. yjxxsm = xm + "(身份证号:" + zjhm + ")和" + xm2 + "(身份证号:" + zjhm2 + ")共同入住" + rzlgmc + ",房间号:" + rzfjh + "," + xm + "入住时间:" + rzsj + ","
  273. + xm2 + "入住时间:" + rzsj2;
  274. }
  275. if (Constants.RES_CODE_TWB.equals(resourceCode)) {
  276. String zjhm = data.getString("SWR_ZJHM");
  277. String csxxdm = data.getString("YYCS_XXDM02");
  278. String csmc = data.getString("YYCS_MC");
  279. String xm = data.getString("SWR_XM");
  280. String xm2 = data.getString("SWR_XM_2");
  281. String zjhm2 = data.getString("SWR_ZJHM_2");
  282. String swkssj = data.getString("SWSESSION_KSSJ");
  283. String swkssj2 = data.getString("SWSESSION_KSSJ_2");
  284. String swxxzdbh = data.getString("SWSESSION_ZHD_XXBH");
  285. String swxxzdbh2 = data.getString("SWSESSION_ZHD_XXBH_2");
  286. yjxxsm = xm + "(身份证号:" + zjhm + ")和" + xm2 + "(身份证号:" + zjhm2 + ")于" + csmc + "(场所信息代码:" + csxxdm + ")共同上网," + xm + "上网开始时间:"
  287. + swkssj + "(上网终端信息编号:"+ swxxzdbh + ")," + xm2 + "上网开始时间:" + swkssj2 + "(上网终端信息编号:"+ swxxzdbh2 + ")";
  288. }
  289. if (Constants.RES_CODE_TCTKY.equals(resourceCode)){
  290. String zjhm = data.getString("FIRST_PER_ZJHM");
  291. String xm = data.getString("FIRST_PER_NAME");
  292. String zjhm2 = data.getString("SECOND_PER_ZJHM");
  293. String xm2 = data.getString("SECOND_PER_NAME");
  294. String cczId = data.getString("CHCH_ZHDI_ID");
  295. String cc = data.getString("JP_CC");
  296. String fcjdsj = data.getString("FAC_JDSJ");
  297. String mdzId = data.getString("MDD_ID");
  298. String mdzmc = data.getString("MDD_ZHDI_MC");
  299. yjxxsm = xm + "(身份证号:" + zjhm + ")和" + xm2 + "(身份证号:" + zjhm2 + ")于" + fcjdsj + "共同乘坐" + cc + "长途客车(乘车站ID:" + cczId + "),目的站:"
  300. + mdzmc + "(目的站ID:" + mdzId + ")";
  301. }
  302. if (Constants.RES_CODE_TMHJG.equals(resourceCode)) {
  303. String zjhm = data.getString("ZJHM");
  304. String xm = data.getString("LVK_XM");
  305. String zjhm2 = data.getString("ZJHM_2");
  306. String xm2 = data.getString("LVK_XM_2");
  307. String hbsxh = data.getString("HBA_SXH");
  308. String hbrq = data.getString("HBA_RQ");
  309. String cfjcxxdm = data.getString("QFHZ_SZ_XXDM02");
  310. String cfjcmc = data.getString("QFHZ_MC");
  311. String ddjcxxdm = data.getString("DDHZ_SZ_XXDM02");
  312. String ddjcmc = data.getString("DDHZ_MC");
  313. String lgjdsj = data.getString("LG_JDSJ");
  314. String jgjdsj = data.getString("JIG_JDSJ");
  315. String zwh = data.getString("DQHZ_ZWH");
  316. String zwh2 = data.getString("DQHZ_ZWH_2");
  317. String flagGx = "0".equals(data.getString("FLAG_GX"))? "邻座" : "前后排";
  318. yjxxsm = xm + "(身份证号:" + zjhm + ",座位号:" + zwh + ")和" + xm2 + "(身份证号:" + zjhm2 + ",座位号:" + zwh2 + ")于" + hbrq + "共同乘坐" + hbsxh + "次航班"
  319. + ",出发机场:" + cfjcmc + ",到达机场:" + ddjcmc + ",进港时间:" + jgjdsj + ",位置关系:" + flagGx;
  320. }
  321. if (Constants.RES_CODE_TMHLG.equals(resourceCode)) {
  322. String zjhm = data.getString("ZJHM");
  323. String xm = data.getString("LVK_XM");
  324. String zjhm2 = data.getString("ZJHM_2");
  325. String xm2 = data.getString("LVK_XM_2");
  326. String hbsxh = data.getString("HBA_SXH");
  327. String hbrq = data.getString("HBA_RQ");
  328. String cfjcxxdm = data.getString("QFHZ_SZ_XXDM02");
  329. String cfjcmc = data.getString("QFHZ_MC");
  330. String ddjcxxdm = data.getString("DDHZ_SZ_XXDM02");
  331. String ddjcmc = data.getString("DDHZ_MC");
  332. String lgjdsj = data.getString("LG_JDSJ");
  333. String jgjdsj = data.getString("JIG_JDSJ");
  334. String zwh = data.getString("DQHZ_ZWH");
  335. String zwh2 = data.getString("DQHZ_ZWH_2");
  336. String flagGx = "0".equals(data.getString("FLAG_GX"))? "邻座" : "前后排";
  337. yjxxsm = xm + "(身份证号:" + zjhm + ",座位号:" + zwh + ")和" + xm2 + "(身份证号:" + zjhm2 + ",座位号:" + zwh2 + ")于" + hbrq + "共同乘坐" + hbsxh + "次航班"
  338. + ",出发机场:" + cfjcmc + ",到达机场:" + ddjcmc + ",离港时间:" + jgjdsj + ",位置关系:" + flagGx;
  339. }
  340. return yjxxsm;
  341. }
  342. }