package com.hhwy.qbeqsjy.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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.apache.kafka.common.protocol.types.Field; 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 resourceCode 参与条件查询的数据资源标识符对应的数据资源编码(烽火盘古平台标准) * @param resourceIdentifier 参与条件查询的数据资源标识符(烽火盘古平台标准) * @return */ public void callFHUniQueryService(String taskId, String conditionFieldValue, String resourceCode, String resourceIdentifier){ // ========== 获取烽火 - 服务开放平台认证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); // log.info("请求体:{}", JSON.toJSONString(reqBody, SerializerFeature.WriteMapNullValue)); String rspStr = httpClient.postResource(fwkfptUniQueryUrl, JSON.toJSONString(reqBody, SerializerFeature.WriteMapNullValue), headerParamsMap); // log.info("响应内容:{}", rspStr); // ========== 解析烽火 - 同行类数据通查服务接口响应信息 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; // 预警类型默认为2(聚集预警) Integer yjlx = 2; // 预警时间 Date yjsj = new Date(); for (JSONObject item : dataList) { // 根据数据资源编码构造对应预警信息说明 Map jjyjDataMap = 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, jjyjDataMap.get("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, jjyjDataMap.get("jd"), jjyjDataMap.get("wd"), yjsj, yjsj, jjyjDataMap.get("yjflryXm"), jjyjDataMap.get("yjglrySfzh"), jjyjDataMap.get("yjglrySjh"), jjyjDataMap.get("yjqymc"), jjyjDataMap.get("yjcsmc"), yjlx, Constants.YJLX_JJYJ}); } } 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 Map buildYjxxsmByResourceCode(String resourceCode, JSONObject data){ Map jjyjDataMap = new HashMap<>(); StringBuilder yjxxsm = new StringBuilder(); // 同火车 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.append(xm); yjxxsm.append("(身份证号:"); yjxxsm.append(zjhm); yjxxsm.append(",座位号:"); yjxxsm.append(zwh); yjxxsm.append(")和"); yjxxsm.append(xm2); yjxxsm.append("(身份证号:"); yjxxsm.append(zjhm2); yjxxsm.append(",座位号:"); yjxxsm.append(zwh2); yjxxsm.append(")于"); yjxxsm.append(facRq); yjxxsm.append("共同乘坐"); yjxxsm.append(cc); yjxxsm.append("次列车第"); yjxxsm.append(cxh); yjxxsm.append("号车厢,出发站:"); yjxxsm.append(sfazMc); yjxxsm.append(",到达站:"); yjxxsm.append(ddzMc); yjxxsm.append(",位置关系:"); yjxxsm.append(flagGx); jjyjDataMap.put("yjxxsm", yjxxsm.toString()); jjyjDataMap.put("yjglryXm", xm2); jjyjDataMap.put("yjglrySfzh", zjhm2); jjyjDataMap.put("yjglrySjh", null); } // 同航班 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 cfjcmc = CommonUtil.getConfValueByKey(cfjcXxdm); String ddjcXxdm = data.getString("DDJC_XXDM02"); String ddjcmc = CommonUtil.getConfValueByKey(ddjcXxdm); String cfrq = data.getString("DD_CFA_RQ"); String ddrq = data.getString("DD_DD_RQ"); String gtdpXxbh = data.getString("GTDP_XXBH"); yjxxsm.append(xm); yjxxsm.append("(身份证号:"); yjxxsm.append(zjhm); yjxxsm.append(")和"); yjxxsm.append(xm2); yjxxsm.append("(身份证号:"); yjxxsm.append(zjhm2); yjxxsm.append(")共同购买航班票,出发机场:"); yjxxsm.append(cfjcmc); yjxxsm.append(",到达机场:"); yjxxsm.append(ddjcmc); yjxxsm.append(",出发日期:"); yjxxsm.append(cfrq); yjxxsm.append(",到达日期:"); yjxxsm.append(ddrq); yjxxsm.append(",共同订票信息编号:"); yjxxsm.append(gtdpXxbh); jjyjDataMap.put("yjxxsm", yjxxsm.toString()); jjyjDataMap.put("yjglryXm", xm2); jjyjDataMap.put("yjglrySfzh", zjhm2); jjyjDataMap.put("yjglrySjh", null); } // 同宾馆 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[] rzlgxxArr = new String[]{}; String jd84 = ""; // 经度(84坐标系) String wd84 = ""; // 纬度(84坐标系) try { rzlgxxArr = CommonUtil.getConfValueByKey(rzlgXxbh).split("@"); jd84 = rzlgxxArr[2]; wd84 = rzlgxxArr[3]; } catch (Exception e){ log.error("当前旅馆信息编号暂无对应名称和地址信息,旅馆信息编号:{}", rzlgXxbh); } String rzfjh = data.getString("RUZ_FAJ_XXBH"); String rzsj = data.getString("RUZ_JDSJ"); String rzsj2 = data.getString("RUZ_JDSJ2"); yjxxsm.append(xm); yjxxsm.append("(身份证号:"); yjxxsm.append(zjhm); yjxxsm.append(")和"); yjxxsm.append(xm2); yjxxsm.append("(身份证号:"); yjxxsm.append(zjhm2); yjxxsm.append(")共同入住旅馆,旅馆信息编号:"); yjxxsm.append(rzlgXxbh); yjxxsm.append(",旅馆名称:"); if(rzlgxxArr.length == 0){ yjxxsm.append("暂无"); } else { yjxxsm.append(rzlgxxArr[0]); // 旅馆名称 } yjxxsm.append(",房间号:"); yjxxsm.append(rzfjh); yjxxsm.append(","); yjxxsm.append(xm); yjxxsm.append("入住时间:"); yjxxsm.append(TimeTool.timeStampToDateString(TimeTool.dateStringToTimeStamp3(rzsj))); yjxxsm.append(","); yjxxsm.append(xm2); yjxxsm.append("入住时间:"); yjxxsm.append(TimeTool.timeStampToDateString(TimeTool.dateStringToTimeStamp3(rzsj2))); yjxxsm.append(",旅馆地址:"); if(rzlgxxArr.length == 0){ yjxxsm.append("暂无"); } else { yjxxsm.append(rzlgxxArr[1]); // 旅馆地址 if(StringUtils.isNotBlank(jd84) && StringUtils.isNotBlank(wd84) && !"null".equals(jd84) && !"null".equals(wd84)){ yjxxsm.append(",位置坐标("); yjxxsm.append(jd84); yjxxsm.append(","); yjxxsm.append(wd84); yjxxsm.append(")"); } } jjyjDataMap.put("yjxxsm", yjxxsm.toString()); jjyjDataMap.put("jd", jd84); jjyjDataMap.put("wd", wd84); jjyjDataMap.put("yjglryXm", xm2); jjyjDataMap.put("yjglrySfzh", zjhm2); jjyjDataMap.put("yjglrySjh", null); jjyjDataMap.put("yjqymc", null); jjyjDataMap.put("yjcsmc", rzlgxxArr[0]); } // 同长途客运 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.append(xm); yjxxsm.append("(身份证号:"); yjxxsm.append(zjhm); yjxxsm.append(")和"); yjxxsm.append(xm2); yjxxsm.append("(身份证号:"); yjxxsm.append(zjhm2); yjxxsm.append(")于"); yjxxsm.append(fcjdsj); yjxxsm.append("共同乘坐"); yjxxsm.append(cc); yjxxsm.append("次长途客车(乘车站ID:"); yjxxsm.append(cczId); yjxxsm.append("),目的站:"); yjxxsm.append(mdzmc); yjxxsm.append("(目的站ID:"); yjxxsm.append(mdzId); yjxxsm.append(")"); jjyjDataMap.put("yjxxsm", yjxxsm.toString()); jjyjDataMap.put("yjglryXm", xm2); jjyjDataMap.put("yjglrySfzh", zjhm2); jjyjDataMap.put("yjglrySjh", null); } // 同民航进港 /*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 jjyjDataMap; } }