package info.aspirecn.cloud.yysj.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import info.aspirecn.cloud.yysj.config.TypeCode2Name; import info.aspirecn.cloud.yysj.entity.Car; import info.aspirecn.cloud.yysj.entity.CarInfo; import info.aspirecn.cloud.yysj.entity.CarQueryParam; import info.aspirecn.cloud.yysj.service.CarSercice; import info.aspirecn.cloud.yysj.utils.Constant; import info.aspirecn.cloud.yysj.utils.DateUtil; import info.aspirecn.cloud.yysj.utils.ElasticSearchUitls; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.*; /** * Email:lixinxu@aspirecn.com * Descrption: */ @Slf4j @Service public class CarSerciceImpl implements CarSercice { /** 主订单索引 */ @Value("${elasticsearch.firstIndex}") private String firstIndex; /** 子订单索引 */ @Value("${elasticsearch.secondIndex}") private String secondIndex; /** 车辆行驶证验证产品编号 */ @Value("${product.drivingLicenseCheckProductId}") private String drivingLicenseCheckProductId; /** 车辆运输许可证验证产品编号 */ @Value("${product.transportationLicenseCheckProductId}") private String transportationLicenseCheckProductId; /** 车辆入网验证产品编号 */ @Value("${product.carIntoTheNetCheckProductId}") private String carIntoTheNetCheckProductId; @Autowired ElasticSearchUitls elasticSearchUitls; @Autowired private ObjectMapper objectMapper; @Autowired private TypeCode2Name typeCode2Name; /** * 查询车辆列表 * * @param carQueryParam */ @Override public Map queryCarList(CarQueryParam carQueryParam) { //数据深度不能大于1000条 if((carQueryParam.getPageNum() * carQueryParam.getPageSize()) > 1000){ return null; } // 创建 Bool 查询构建器 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // 构建查询条件 if(carQueryParam.getUserId() != null && !"".equals(carQueryParam.getUserId())){ boolQueryBuilder.must(QueryBuilders.termsQuery("MG-UserId.keyword",carQueryParam.getUserId())); } if(carQueryParam.getCarNum() != null && !"".equals(carQueryParam.getCarNum())){ boolQueryBuilder.must(QueryBuilders.wildcardQuery("RequestInfo.VehicleNumber.keyword","*"+carQueryParam.getCarNum()+"*")); } if(carQueryParam.getCarNumColor() != null && !"".equals(carQueryParam.getCarNumColor())){ boolQueryBuilder.must(QueryBuilders.termsQuery("RequestInfo.VehiclePlateColorCode.keyword",carQueryParam.getCarNumColor())); } if (carQueryParam.getDrivingLicenseCheck()!= null && !"".equals(carQueryParam.getDrivingLicenseCheck())) { boolQueryBuilder.must(QueryBuilders.termsQuery("Check-Reuslt.result.keyword",carQueryParam.getDrivingLicenseCheck())); boolQueryBuilder.must(QueryBuilders.termsQuery("Check-Reuslt.productId.keyword",drivingLicenseCheckProductId)); } if (carQueryParam.getTransportationLicenseCheck()!= null && !"".equals(carQueryParam.getTransportationLicenseCheck())) { boolQueryBuilder.must(QueryBuilders.termsQuery("Check-Reuslt.result.keyword",carQueryParam.getTransportationLicenseCheck())); boolQueryBuilder.must(QueryBuilders.termsQuery("Check-Reuslt.productId.keyword",transportationLicenseCheckProductId)); } boolQueryBuilder.must(QueryBuilders.termsQuery("URI.keyword","/info_check/carInfo.do")); boolQueryBuilder.filter().add(QueryBuilders.rangeQuery("DateTime") .gte(carQueryParam.getBeginTime()).lte(carQueryParam.getEndTime())); // 构建查询源构建器 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(boolQueryBuilder); searchSourceBuilder.sort("DateTime", SortOrder.DESC); searchSourceBuilder.size(1000); //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段 searchSourceBuilder.fetchSource(new String[]{"RequestInfo.VehicleNumber", "RequestInfo.VehiclePlateColorCode", "RequestInfo.VehicleType", "DateTime", "Check-Reuslt"}, null); // 创建查询请求对象,将查询对象配置到其中 SearchRequest searchRequest = new SearchRequest(firstIndex); searchRequest.source(searchSourceBuilder); // 返回集合 Map resultMap = new HashMap(); List carList = new ArrayList(); int total = 0; //获取数据 SearchHits hits = elasticSearchUitls.getResultHits(searchRequest); if(hits == null){ resultMap.put(Constant.DATA_LIST, carList); resultMap.put(Constant.TOTAL, 0); return resultMap; } //遍历数据, 加上核验结果条件, 计算总数, 分页 for (SearchHit hit : hits) { String json = hit.getSourceAsString(); JSONObject jsonObject = JSONObject.parseObject(json); //获取核验结果 String drivingLicenseCheck = ""; String transportationLicenseCheck = ""; String carIntoTheNetCheck = ""; JSONArray checkResjsonArray = jsonObject.getJSONArray("Check-Reuslt"); for(int i=0; i < checkResjsonArray.size(); i++){ JSONObject checkResObj = checkResjsonArray.getJSONObject(i); if(drivingLicenseCheckProductId.equals(checkResObj.getString("productId"))){ drivingLicenseCheck = checkResObj.getString("result"); } else if(transportationLicenseCheckProductId.equals(checkResObj.getString("productId"))){ transportationLicenseCheck = checkResObj.getString("result"); } else if(carIntoTheNetCheckProductId.equals(checkResObj.getString("productId"))){ carIntoTheNetCheck = checkResObj.getString("result"); } } //判断核验结果 if(carQueryParam.getDrivingLicenseCheck() != null && !"".equals(carQueryParam.getDrivingLicenseCheck()) && !carQueryParam.getDrivingLicenseCheck().equals(drivingLicenseCheck)){ continue; } if(carQueryParam.getTransportationLicenseCheck() != null && !"".equals(carQueryParam.getTransportationLicenseCheck()) && !carQueryParam.getTransportationLicenseCheck().equals(transportationLicenseCheck)){ continue; } if(carQueryParam.getCarIntoTheNetCheck() != null && !"".equals(carQueryParam.getCarIntoTheNetCheck()) && !carQueryParam.getCarIntoTheNetCheck().equals(carIntoTheNetCheck)){ continue; } total++; if(total > ((carQueryParam.getPageNum()-1) * carQueryParam.getPageSize()) && carList.size() < carQueryParam.getPageSize()){ Car car = new Car(); car.setId(hit.getId()); JSONObject riJsonObject = jsonObject.getJSONObject("RequestInfo"); if (riJsonObject!=null) { car.setCarNum(riJsonObject.getString("VehicleNumber")); car.setCarNumColor(riJsonObject.getString("VehiclePlateColorCode")); car.setCarType(typeCode2Name.carTypeCode2Name(riJsonObject.getString("VehicleType"))); } car.setRequestTime(DateUtil.esTime2MySQLTime(jsonObject.getString("DateTime"))); car.setDrivingLicenseCheck(drivingLicenseCheck); car.setTransportationLicenseCheck(transportationLicenseCheck); car.setCarIntoTheNetCheck(carIntoTheNetCheck); carList.add(car); log.debug("车辆信息:{}", car); } } resultMap.put(Constant.DATA_LIST, carList); resultMap.put(Constant.TOTAL, total); return resultMap; } /** * 查询车辆详情 * * @param carId */ @Override public CarInfo queryCarInfo(String carId) { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //搜索方式 根据id查询 searchSourceBuilder.query(QueryBuilders.termsQuery("_id",carId)); //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段 searchSourceBuilder.fetchSource(new String[]{"RequestInfo.VehicleNumber", "RequestInfo.VehiclePlateColorCode", "RequestInfo.VehicleType","RequestInfo.Owner", "RequestInfo.UseCharacter", "RequestInfo.VIN", "RequestInfo.IssuingOrganizations", "RequestInfo.RegisterDate", "RequestInfo.IssueDate", "RequestInfo.VehicleEnergyType", "RequestInfo.VehicleTonnage", "RequestInfo.GrossMass", "RequestInfo.RoadTransportCertificateNumber"},null); //创建查询请求对象,将查询对象配置到其中 SearchRequest searchRequest = new SearchRequest(firstIndex); searchRequest.source(searchSourceBuilder); searchSourceBuilder.size(1); //获取数据 SearchHits hits = elasticSearchUitls.getResultHits(searchRequest); CarInfo carInfo = new CarInfo(); if(hits != null){ for (SearchHit hit : hits) { String json = hit.getSourceAsString(); JSONObject jsonObject = JSONObject.parseObject(json); String resStr = jsonObject.getString("RequestInfo"); try { carInfo = objectMapper.readValue(resStr, CarInfo.class); } catch (JsonProcessingException e) { e.printStackTrace(); } return carInfo; } } return carInfo; } }