@Override
public Page<List<VehicleNested>> searchVehicleBoardByEsPage(VehicleBoardParam vehicleBoardParam) {
Page<List<VehicleNested>> result = new Page<>();
result.setPageNum(vehicleBoardParam.getPage());
result.setPageSize(vehicleBoardParam.getPageSize());
if (vehicleBoardParam == null) {
return result;
}
try {
SearchSourceBuilder searchSourceBuilder = commonService.buildQueryBaseParam(vehicleBoardParam);
String dsl = searchSourceBuilder.toString();
String resultStr = commonService.dslQuery(dsl);
EsResponse<VehicleNested> response = JsonHelper.fromJson(resultStr, new TypeReference<EsResponse<VehicleNested>>(){});
if(response.getSuccess()){
EsObject<VehicleNested> esObject = response.getObj();
Long hitNum = esObject.getHitNum();
if(hitNum == 0){
return result;
}
// 設置總記錄
result.setTotal(hitNum.intValue());
result.setData(esObject.getHits());
}else{
result.setTotal(0);
}
} catch (Exception e) {
return result;
}
return result;
}
public class Page<T> {
private int pageNum;
private int pageSize;
private int total;
private T data;
public Page(){}
public Page(int pageNum, int pageSize, int total){
this.pageNum = pageNum;
this.pageSize = pageSize;
this.total = total;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
public class EsObject<T> {
private Long hitNum;
private Long returnNum;
private Long tookTime;
private List<T> hits;
private Map<String, EsAggregation> aggregations;
public Long getHitNum() {
return hitNum;
}
public void setHitNum(Long hitNum) {
this.hitNum = hitNum;
}
public Long getReturnNum() {
return returnNum;
}
public void setReturnNum(Long returnNum) {
this.returnNum = returnNum;
}
public Long getTookTime() {
return tookTime;
}
public void setTookTime(Long tookTime) {
this.tookTime = tookTime;
}
public List<T> getHits() {
return hits;
}
public void setHits(List<T> hits) {
this.hits = hits;
}
public Map<String, EsAggregation> getAggregations() {
return aggregations;
}
public void setAggregations(Map<String, EsAggregation> aggregations) {
this.aggregations = aggregations;
}
}
public SearchSourceBuilder buildQueryBaseParam(VehicleBoardParam param) {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if(param.getPage() != null && param.getPageSize() != null){
searchSourceBuilder.size(param.getPageSize());
searchSourceBuilder.from((param.getPage() - 1) * param.getPageSize());
}
buildQueryVehicleBoardParam(searchSourceBuilder, param);
return searchSourceBuilder;
}
public void buildQueryVehicleBoardParam(SearchSourceBuilder searchSourceBuilder,VehicleBoardParam param){
// 獲取配置開關
String version = PropertiesManager.instance().getString("es.vehicle.model.upgrade.version", "1.0");
BoolQueryBuilder bool = QueryBuilders.boolQuery();
//車牌號
if(CollectionUtils.isNotEmpty(param.getVehicleCodeList())){
bool.must(QueryBuilders.termsQuery("vehicleCode", param.getVehicleCodeList()));
}
// 車輛標籤
if (StringUtils.isNotBlank(param.getVehicleLabel())) {
if("OTHER".equals(param.getVehicleLabel())){
String tagStr = PropertiesManager.instance().getString("vehicle.query.tag.other", "GF,BT,QY,HX,DD");
if(StringUtils.isNotEmpty(tagStr)){
String[] tags = tagStr.split(",");
for(String tag : tags){
bool.mustNot(QueryBuilders.termQuery("tags", tag));
}
}
}else{
bool.must(QueryBuilders.termQuery("tags", param.getVehicleLabel()));
}
}
// 車長
if (StringUtils.isNotBlank(param.getVehicleLength())) {
bool.must(QueryBuilders.termQuery("vehicleLength", param.getVehicleLength()));
}
// 手機號
if (StringUtils.isNotBlank(param.getMobilePhone())) {
bool.must(QueryBuilders.termQuery("driver.mobilephone", param.getMobilePhone()));
}
// 任務狀態 1:空閒中 2:任務執行中 3:離線
if (StringUtils.isNotBlank(param.getVehicleTaskStatus())) {
if("2".equals(param.getVehicleTaskStatus())){
bool.must(QueryBuilders.existsQuery("curTask"));
}else if("1".equals(param.getVehicleTaskStatus())){
bool.mustNot(QueryBuilders.existsQuery("curTask"));
}else if("3".equals(param.getVehicleTaskStatus())){ // 當前時間 - 10分鐘 與GPS時間比較
Date d = new Date();
long n = d.getTime()-(60*10*1000); // 10 分鐘
d.setTime(n);
bool.must(QueryBuilders.rangeQuery("gps.gpsTm").lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d)));
}
}
// 車隊
if("1.0".equals(version)){
if(param.getMotorcadeId() != null){
bool.must(QueryBuilders.termQuery("motorcade.id", param.getMotorcadeId()));
}
if(param.getMotorcadeType() != null){
bool.must(QueryBuilders.termQuery("motorcade.type", param.getMotorcadeType()));
}
}else {
BoolQueryBuilder motorcadeBoolQueryBuilder = QueryBuilders.boolQuery();
if(param.getMotorcadeId() != null){
motorcadeBoolQueryBuilder.must(QueryBuilders.termQuery("motorcades.id", param.getMotorcadeId()));
}
if(param.getMotorcadeType() != null){
motorcadeBoolQueryBuilder.must(QueryBuilders.termQuery("motorcades.type", param.getMotorcadeType()));
}
if(param.getMotorcadeId() != null || param.getMotorcadeType() != null){
QueryBuilder motorcadeQueryBuilder = QueryBuilders.nestedQuery("motorcades", motorcadeBoolQueryBuilder, ScoreMode.Total);
bool.must(motorcadeQueryBuilder);
}
}
// 招募
if("1.0".equals(version)){
if (StringUtils.isNotBlank(param.getRegisterCityCode())) {
bool.must(QueryBuilders.termQuery("recruit.cityCode", param.getRegisterCityCode()));
}
if (StringUtils.isNotBlank(param.getRegisterCityCode())) {
bool.must(QueryBuilders.termQuery("recruit.cityCode", param.getRegisterCityCode()));
}
bool.must(QueryBuilders.rangeQuery("recruit.lineEffectTm").gte(new SimpleDateFormat("yyyy-MM-dd").format(new Date())+" 00:00:00").lte(new SimpleDateFormat("yyyy-MM-dd").format(new Date())+" 23:59:59"));
}else {
BoolQueryBuilder recruitsBuilder = QueryBuilders.boolQuery();
if (StringUtils.isNotBlank(param.getRegisterCityCode())) {
recruitsBuilder.must(QueryBuilders.termQuery("recruits.cityCode", param.getRegisterCityCode()));
}
recruitsBuilder.must(QueryBuilders.rangeQuery("recruits.lineEffectTm").gte(new SimpleDateFormat("yyyy-MM-dd").format(new Date())+" 00:00:00").lte(new SimpleDateFormat("yyyy-MM-dd").format(new Date())+" 23:59:59"));
QueryBuilder recruitsQueryBuilder = QueryBuilders.nestedQuery("recruits", recruitsBuilder, ScoreMode.Total);
bool.must(recruitsQueryBuilder);
}
searchSourceBuilder.query(QueryBuilders.constantScoreQuery(bool));
}