package com.hhwy.qbeqsjy.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONPath; import com.alibaba.fastjson.serializer.SerializerFeature; import com.hhwy.qbeqsjy.common.*; import com.hhwy.qbeqsjy.dao.CtrlDao; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.*; /** * 同行类数据查询业务逻辑 */ @Slf4j @Service public class SameTravelService { @Value("${fwkfpt.type}") private String fwkfptType; @Value("${fwkfpt.policeNo}") private String fwkfptPoliceNo; @Value("${fwkfpt.userId}") private String fwkfptUserId; @Value("${fwkfpt.senderId}") private String fwkfptSenderId; @Value("${fwkfpt.appId}") private String fwkfptAppId; @Value("${fwkfpt.serviceId}") private String fwkfptServiceId; @Value("${fwkfpt.token.url}") private String fwkfptTokenUrl; @Value("${fwkfpt.uniQuery.url}") private String fwkfptUniQueryUrl; @Value("${tx.query.max.count}") private String maxReturnNum; @Value("${clue.code.idCard}") private String clueCodeIdCard; private SnowflakeIdGenerator generator = new SnowflakeIdGenerator(1); private HttpClient httpClient = new HttpClient(); @Autowired private CtrlDao ctrlDao; /** * 调用烽火同行类数据通查服务接口,并将查询结果保存入库 * @param taskId 任务编号 * @param conditionFieldValue 参与条件查询的字段值 * @param resourceIdentifier 参与条件查询的数据资源标识符(烽火盘古平台标准) * @param resourceCode 参与条件查询的数据资源标识符对应的数据资源编码(烽火盘古平台标准) * @return */ public void callFHUniQueryService(String taskId, String conditionFieldValue, String resourceIdentifier, String resourceCode){ // ========== 获取烽火 - 服务开放平台认证token Map tokenMap = getFHUniQueryServiceToken(); String appTokenId = tokenMap.get("appTokenId"); String userTokenId = tokenMap.get("userTokenId"); if(StringUtils.isBlank(appTokenId) || StringUtils.isBlank(userTokenId)){ log.info("【QBEQSJYCTRL - 聚集预警通用查询服务】 获取目标服务认证token失败,操作结束"); return; } // ========== 调用烽火 - 同行类数据通查服务接口 long start = System.currentTimeMillis(); Map headerParamsMap = new HashMap<>(); headerParamsMap.put("Content-Type", Constants.DEFAULT_RSP_TYPE); headerParamsMap.put("app_token", appTokenId); headerParamsMap.put("user_token", userTokenId); headerParamsMap.put("userid", fwkfptUserId); headerParamsMap.put("subid", fwkfptAppId); headerParamsMap.put("serviceid", fwkfptServiceId); headerParamsMap.put("SenderID", fwkfptSenderId); Map reqBody = new HashMap<>(); reqBody.put("From", Constants.AREA_CODE_TJ); reqBody.put("To", Constants.AREA_CODE_TJ); reqBody.put("MessageSequence", TimeTool.timeStampToDateString4(TimeTool.getNowTimeStamp())); Map requestParam = new HashMap<>(); List rspFieldNameList = Arrays.asList(CommonUtil.getConfValueByKey(resourceIdentifier).split(",")); requestParam.put("Condition", rspFieldNameList.get(0) + "='" + conditionFieldValue + "'"); Map otherCondition = new HashMap<>(); otherCondition.put("AsyncBoolean", Constants.STR_NUM_0); otherCondition.put("AsyncIdentity", Constants.STR_NUM_0); otherCondition.put("AsyncOnceReturnNum", maxReturnNum); otherCondition.put("AsyncQuery", ""); otherCondition.put("CallbackID", ""); otherCondition.put("CodeMode", Constants.STR_NUM_0); otherCondition.put("MaxReturnNum", maxReturnNum); otherCondition.put("SortResults", ""); requestParam.put("OtherCondition", otherCondition); List> resourceInfosList = new ArrayList<>(); Map resourceInfoMap = new HashMap<>(); List> dataItemsList = new ArrayList<>(); for (String fieldName : rspFieldNameList) { Map dataItemMap = new HashMap<>(); dataItemMap.put("Fmt", ""); dataItemMap.put("Name", fieldName); dataItemsList.add(dataItemMap); } resourceInfoMap.put("DataItems", dataItemsList); resourceInfoMap.put("ResourceName", resourceIdentifier); resourceInfosList.add(resourceInfoMap); requestParam.put("ResourceInfos", resourceInfosList); reqBody.put("RequestParam", requestParam); String rspStr = httpClient.postResource(fwkfptUniQueryUrl, JSON.toJSONString(reqBody, SerializerFeature.WriteMapNullValue), headerParamsMap); // ========== 解析烽火 - 同行类数据通查服务接口响应信息 JSONObject rspJSONObj = JSON.parseObject(rspStr); List dataList = new ArrayList<>(); if(rspJSONObj != null){ String messageStatus = rspJSONObj.getString("MessageStatus"); if("0200".equals(messageStatus)){ log.info("调用【烽火 - 服务开放平台 # 同行类数据通查服务接口】 服务调用成功,耗时:{}ms", System.currentTimeMillis() - start); JSONObject responseParam = rspJSONObj.getJSONObject("ResponseParam"); JSONArray resourceInfos = responseParam.getJSONArray("ResourceInfos"); if(resourceInfos != null && resourceInfos.size() > 0){ JSONObject jsonObject = resourceInfos.getJSONObject(0); String resName = jsonObject.getString("ResourceName"); JSONArray dataInfo = jsonObject.getJSONArray("DataInfo"); if(dataInfo != null && dataInfo.size() > 0){ // 存在命中数据 JSONArray dataItems = jsonObject.getJSONArray("DataItems"); // 格式化存储预警结果数据,形如:[{"xm": "1", "zjhm": "111"}, {"xm": "2", "zjhm": "222"}, ...] for (Object obj : dataInfo) { JSONArray dataRow = (JSONArray) obj; JSONObject rowData = new JSONObject(); for (int i = 0; i < dataRow.size(); i++) { Object columnValue = dataRow.get(i); JSONObject columnMap = dataItems.getJSONObject(i); String name = columnMap.getString("Name"); rowData.put(name, columnValue); } dataList.add(rowData); } } } } } log.info("【烽火 - 服务开放平台 # 同行类数据通查服务接口 响应数据解析完成】 命中数据量:{}", dataList.size()); // ========== 保存入库同行类业务查询结果数据(入库前需关联补全对应布控任务相关信息) List warningInfoList = new ArrayList<>(); int batchSaveNum = 0; if(dataList.size() > 0){ // 预警状态默认为0(未读) Integer yjzt = 0; // 预警时间 Date yjsj = new Date(); for (JSONObject item : dataList) { // 构造预警信息说明 String yjxxsm = buildYjxxsmByResourceCode(resourceCode, item); // 根据任务编号、线索值、线索类型查询对应的布控任务相关信息(包含任务信息、区域信息、线索信息) List> ctrlTaskInfoList = ctrlDao.queryCtrlTaskInfo(taskId, conditionFieldValue, clueCodeIdCard); if(ctrlTaskInfoList.size() > 0){ Map ctrlTaskInfo = ctrlTaskInfoList.get(0); String rwmc = String.valueOf(ctrlTaskInfo.get("rwmc")); Integer rwlx = (Integer) ctrlTaskInfo.get("rwlx"); String rwlxmc = String.valueOf(ctrlTaskInfo.get("rwlxmc")); String rwdxlxmc = String.valueOf(ctrlTaskInfo.get("rwdxlxmc")); String sqrXm = String.valueOf(ctrlTaskInfo.get("sqr_xm")); String sqrSfzh = String.valueOf(ctrlTaskInfo.get("sqr_sfzh")); String sqrJh = String.valueOf(ctrlTaskInfo.get("sqr_jh")); String sqrDwbm = String.valueOf(ctrlTaskInfo.get("sqr_dwbm")); String sqrDwmc = String.valueOf(ctrlTaskInfo.get("sqr_dwmc")); String yjryXm = String.valueOf(ctrlTaskInfo.get("ryxm")); String yjrySfzh = String.valueOf(ctrlTaskInfo.get("zjhm")); String yjrySjh = String.valueOf(ctrlTaskInfo.get("sjh")); String yjryLb = String.valueOf(ctrlTaskInfo.get("rylb")); String yjryBq = String.valueOf(ctrlTaskInfo.get("rybq")); String gkjb = String.valueOf(ctrlTaskInfo.get("gkjb")); String gkjbmc = String.valueOf(ctrlTaskInfo.get("gkjbmc")); String zrjz = String.valueOf(ctrlTaskInfo.get("zrjz")); String zrmjid = String.valueOf(ctrlTaskInfo.get("zrmjid")); String zrmjxm = String.valueOf(ctrlTaskInfo.get("zrmjxm")); String zrmjjh = String.valueOf(ctrlTaskInfo.get("zrmjjh")); String zrmjlxfs = String.valueOf(ctrlTaskInfo.get("zrmjlxfs")); String zrdwbm = String.valueOf(ctrlTaskInfo.get("zrdwbm")); String zrbmbm = String.valueOf(ctrlTaskInfo.get("zrbmbm")); // 生成预警信息编号 String yjxxbh = String.valueOf(generator.nextId()); 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}); } } if(warningInfoList.size() > 0){ batchSaveNum = ctrlDao.batchInsertWarningInfo(warningInfoList); } } log.info("【QBEQSJYCTRL - 聚集预警通用查询服务】 命中数据量:{},已入库数据量:{}", dataList.size(), batchSaveNum); } /** * 获取烽火 - 服务开放平台认证token * @return */ public Map getFHUniQueryServiceToken(){ Map tokenMap = new HashMap<>(); Map tokenHeaderParamsMap = new HashMap<>(); tokenHeaderParamsMap.put("Content-Type", Constants.URLENCODED_RSP_TYPE); Map userTokenMap = new HashMap<>(); userTokenMap.put("type", fwkfptType); userTokenMap.put("policeNo", fwkfptPoliceNo); userTokenMap.put("userId", fwkfptUserId); Map appTokenMap = new HashMap<>(); appTokenMap.put("appId", fwkfptAppId); appTokenMap.put("userToken", JSON.toJSONString(userTokenMap)); List nameValuePairs = new ArrayList<>(); nameValuePairs.add(new BasicNameValuePair("userToken", JSON.toJSONString(userTokenMap))); nameValuePairs.add(new BasicNameValuePair("appToken", JSON.toJSONString(appTokenMap))); nameValuePairs.add(new BasicNameValuePair("serviceid", fwkfptServiceId)); String rspContent = httpClient.postResourceFWKFPT(fwkfptTokenUrl, nameValuePairs, tokenHeaderParamsMap); JSONObject rspContentJSONObj = JSON.parseObject(rspContent); if(rspContentJSONObj != null){ String appTokenJSONStr = rspContentJSONObj.getString("appTokenId"); String userTokenJSONStr = rspContentJSONObj.getString("userTokenId"); if(StringUtils.isBlank(appTokenJSONStr) || StringUtils.isBlank(userTokenJSONStr)){ String message = rspContentJSONObj.getString("message"); log.error("获取【烽火 - 服务开放平台 # 权限认证令牌】 令牌创建失败,异常信息:{}", message); } else { String appTokenId = JSON.parseObject(appTokenJSONStr).getString("appToken"); String userTokenId = JSON.parseObject(userTokenJSONStr).getString("userToken"); tokenMap.put("appTokenId", appTokenId); tokenMap.put("userTokenId", userTokenId); log.info("获取【烽火 - 服务开放平台 # 权限认证令牌】 令牌创建成功"); } } return tokenMap; } /** * 根据 数据资源编码和对应JSON数据 构造对应预警信息说明 * @param resourceCode * @param data * @return */ public String buildYjxxsmByResourceCode(String resourceCode, JSONObject data){ String yjxxsm = ""; if(Constants.RES_CODE_THC.equals(resourceCode)){ String xm = data.getString("XM"); String zjhm = data.getString("ZJHM"); String zwh = data.getString("ZWH"); String xm2 = data.getString("XM_2"); String zjhm2 = data.getString("ZJHM_2"); String zwh2 = data.getString("ZWH_2"); String facRq = data.getString("FAC_RQ"); String cc = data.getString("CC"); String cxh = data.getString("CXH"); String sfazMc = data.getString("SFAZ_MC"); String ddzMc = data.getString("DDZ_MC"); String flagGx = "0".equals(data.getString("FLAG_GX"))? "邻座" : "前后排"; yjxxsm = xm + "(身份证号:" + zjhm + ",座位号:" + zwh + ")和" + xm2 + "(身份证号:" + zjhm2 + ",座位号:" + zwh2 + ")于" + facRq + "共同乘坐" + cc + "次列车第" + cxh + "号车厢,出发站:" + sfazMc + ",到达站:" + ddzMc + ",位置关系:" + flagGx; } if (Constants.RES_CODE_THB.equals(resourceCode)){ String zjhm = data.getString("FIRST_PER_ZJHM"); String xm = data.getString("FIRST_PER_NAME"); String zjhm2 = data.getString("SECOND_PER_ZJHM"); String xm2 = data.getString("SECOND_PER_NAME"); String cfjcXxdm = data.getString("QFJC_XXDM02"); String ddjcXxdm = data.getString("DDJC_XXDM02"); String cfrq = data.getString("DD_CFA_RQ"); String ddrq = data.getString("DD_DD_RQ"); String gtdpXxbh = data.getString("GTDP_XXBH"); yjxxsm = xm + "(身份证号:" + zjhm + ")和" + xm2 + "(身份证号:" + zjhm2 + ")共同购买航班票,出发机场信息代码:" + cfjcXxdm + ",到达机场信息代码:" + ddjcXxdm + ",出发日期:" + cfrq + ",到达日期:" + ddrq + "共同订票信息编号:" + gtdpXxbh; } if (Constants.RES_CODE_TBG.equals(resourceCode)) { String zjhm = data.getString("ZJHM"); String xm = data.getString("XM"); String zjhm2 = data.getString("ZJHM2"); String xm2 = data.getString("XM2"); String rzlgXxbh = data.getString("RUZ_LVG_XXBH"); // 根据旅馆信息编号关联旅馆名称信息 String rzlgmc = ""; String rzfjh = data.getString("RUZ_FAJ_XXBH"); String rzsj = data.getString("RUZ_JDSJ"); String rzsj2 = data.getString("RUZ_JDSJ2"); yjxxsm = xm + "(身份证号:" + zjhm + ")和" + xm2 + "(身份证号:" + zjhm2 + ")共同入住" + rzlgmc + ",房间号:" + rzfjh + "," + xm + "入住时间:" + rzsj + "," + xm2 + "入住时间:" + rzsj2; } if (Constants.RES_CODE_TWB.equals(resourceCode)) { String zjhm = data.getString("SWR_ZJHM"); String csxxdm = data.getString("YYCS_XXDM02"); String csmc = data.getString("YYCS_MC"); String xm = data.getString("SWR_XM"); String xm2 = data.getString("SWR_XM_2"); String zjhm2 = data.getString("SWR_ZJHM_2"); String swkssj = data.getString("SWSESSION_KSSJ"); String swkssj2 = data.getString("SWSESSION_KSSJ_2"); String swxxzdbh = data.getString("SWSESSION_ZHD_XXBH"); String swxxzdbh2 = data.getString("SWSESSION_ZHD_XXBH_2"); yjxxsm = xm + "(身份证号:" + zjhm + ")和" + xm2 + "(身份证号:" + zjhm2 + ")于" + csmc + "(场所信息代码:" + csxxdm + ")共同上网," + xm + "上网开始时间:" + swkssj + "(上网终端信息编号:"+ swxxzdbh + ")," + xm2 + "上网开始时间:" + swkssj2 + "(上网终端信息编号:"+ swxxzdbh2 + ")"; } if (Constants.RES_CODE_TCTKY.equals(resourceCode)){ String zjhm = data.getString("FIRST_PER_ZJHM"); String xm = data.getString("FIRST_PER_NAME"); String zjhm2 = data.getString("SECOND_PER_ZJHM"); String xm2 = data.getString("SECOND_PER_NAME"); String cczId = data.getString("CHCH_ZHDI_ID"); String cc = data.getString("JP_CC"); String fcjdsj = data.getString("FAC_JDSJ"); String mdzId = data.getString("MDD_ID"); String mdzmc = data.getString("MDD_ZHDI_MC"); yjxxsm = xm + "(身份证号:" + zjhm + ")和" + xm2 + "(身份证号:" + zjhm2 + ")于" + fcjdsj + "共同乘坐" + cc + "长途客车(乘车站ID:" + cczId + "),目的站:" + mdzmc + "(目的站ID:" + mdzId + ")"; } if (Constants.RES_CODE_TMHJG.equals(resourceCode)) { String zjhm = data.getString("ZJHM"); String xm = data.getString("LVK_XM"); String zjhm2 = data.getString("ZJHM_2"); String xm2 = data.getString("LVK_XM_2"); String hbsxh = data.getString("HBA_SXH"); String hbrq = data.getString("HBA_RQ"); String cfjcxxdm = data.getString("QFHZ_SZ_XXDM02"); String cfjcmc = data.getString("QFHZ_MC"); String ddjcxxdm = data.getString("DDHZ_SZ_XXDM02"); String ddjcmc = data.getString("DDHZ_MC"); String lgjdsj = data.getString("LG_JDSJ"); String jgjdsj = data.getString("JIG_JDSJ"); String zwh = data.getString("DQHZ_ZWH"); String zwh2 = data.getString("DQHZ_ZWH_2"); String flagGx = "0".equals(data.getString("FLAG_GX"))? "邻座" : "前后排"; yjxxsm = xm + "(身份证号:" + zjhm + ",座位号:" + zwh + ")和" + xm2 + "(身份证号:" + zjhm2 + ",座位号:" + zwh2 + ")于" + hbrq + "共同乘坐" + hbsxh + "次航班" + ",出发机场:" + cfjcmc + ",到达机场:" + ddjcmc + ",进港时间:" + jgjdsj + ",位置关系:" + flagGx; } if (Constants.RES_CODE_TMHLG.equals(resourceCode)) { String zjhm = data.getString("ZJHM"); String xm = data.getString("LVK_XM"); String zjhm2 = data.getString("ZJHM_2"); String xm2 = data.getString("LVK_XM_2"); String hbsxh = data.getString("HBA_SXH"); String hbrq = data.getString("HBA_RQ"); String cfjcxxdm = data.getString("QFHZ_SZ_XXDM02"); String cfjcmc = data.getString("QFHZ_MC"); String ddjcxxdm = data.getString("DDHZ_SZ_XXDM02"); String ddjcmc = data.getString("DDHZ_MC"); String lgjdsj = data.getString("LG_JDSJ"); String jgjdsj = data.getString("JIG_JDSJ"); String zwh = data.getString("DQHZ_ZWH"); String zwh2 = data.getString("DQHZ_ZWH_2"); String flagGx = "0".equals(data.getString("FLAG_GX"))? "邻座" : "前后排"; yjxxsm = xm + "(身份证号:" + zjhm + ",座位号:" + zwh + ")和" + xm2 + "(身份证号:" + zjhm2 + ",座位号:" + zwh2 + ")于" + hbrq + "共同乘坐" + hbsxh + "次航班" + ",出发机场:" + cfjcmc + ",到达机场:" + ddjcmc + ",离港时间:" + jgjdsj + ",位置关系:" + flagGx; } return yjxxsm; } }