Bläddra i källkod

Merge branch 'dev' of yeshijie/wlyy2.0 into dev

叶仕杰 4 år sedan
förälder
incheckning
5589bd169b

+ 1 - 0
common/common-request-mapping/src/main/java/com/yihu/jw/rm/iot/IotRequestMapping.java

@ -65,6 +65,7 @@ public class IotRequestMapping {
        public static final String updateData = "updateData";
        public static final String iHealthDataSearch = "iHealthDataSearch";
        public static final String deleteData = "deleteData";
        public static final String searchList = "searchList";
    }
    /**

+ 127 - 0
common/common-rest-model-es/src/main/java/iot/device/DataBodySignsVO.java

@ -0,0 +1,127 @@
package iot.device;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
/**
 * 体征数据实体类,新的标准的数据格式
 * @author ysj on 2020/06/24.
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
@ApiModel
public class DataBodySignsVO {
    @ApiModelProperty(value = "数据来源",example = "iHealth",hidden = true)
    private String data_source; //数据来源
    @ApiModelProperty(value = "设备序列码",example = "65746176875",hidden = true)
    private String sn;          //设备序列码
    @ApiModelProperty(value = "设备数据识别代码",example = "1/0",hidden = true)
    private String ext_code;    //设备A,B键,取值为0,1,代表绑定不同的用户,
    @ApiModelProperty(value = "设备名称",example = "血压计",hidden = true)
    private String device_name; //设备名称
    @ApiModelProperty(value = "设备型号",example = "",hidden = true)
    private String device_model;//设备型号
    private List<MeasureDataVO> measure_data;    //设备所测量的数据内容
    private List<PositionDataVO> position_data;    //设备所测量的数据内容
    @ApiModelProperty(value = "身份证号",example = "350122198601145513",hidden = true)
    private String idcard;      //设备绑定的用户身份证号
    @ApiModelProperty(value = "身份证类型",example = "1",hidden = true)
    private String idcard_type;      //设备绑定的用户身份证号
    @ApiModelProperty(value = "用户名",example = "谢挺盛",hidden = true)
    private String username;    //用户名
    @ApiModelProperty(value = "用户code",example = "443a196ef8744536a531260eb26c05d7",hidden = true)
    private String usercode;    //用户在系统中的code,唯一识别
    public String getData_source() {
        return data_source;
    }
    public void setData_source(String data_source) {
        this.data_source = data_source;
    }
    public String getSn() {
        return sn;
    }
    public void setSn(String sn) {
        this.sn = sn;
    }
    public String getExt_code() {
        return ext_code;
    }
    public void setExt_code(String ext_code) {
        this.ext_code = ext_code;
    }
    public String getDevice_name() {
        return device_name;
    }
    public void setDevice_name(String device_name) {
        this.device_name = device_name;
    }
    public String getDevice_model() {
        return device_model;
    }
    public void setDevice_model(String device_model) {
        this.device_model = device_model;
    }
    public List<MeasureDataVO> getMeasure_data() {
        return measure_data;
    }
    public void setMeasure_data(List<MeasureDataVO> measure_data) {
        this.measure_data = measure_data;
    }
    public List<PositionDataVO> getPosition_data() {
        return position_data;
    }
    public void setPosition_data(List<PositionDataVO> position_data) {
        this.position_data = position_data;
    }
    public String getIdcard() {
        return idcard;
    }
    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }
    public String getIdcard_type() {
        return idcard_type;
    }
    public void setIdcard_type(String idcard_type) {
        this.idcard_type = idcard_type;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUsercode() {
        return usercode;
    }
    public void setUsercode(String usercode) {
        this.usercode = usercode;
    }
}

+ 80 - 0
common/common-rest-model-es/src/main/java/iot/device/MeasureDataVO.java

@ -0,0 +1,80 @@
package iot.device;
/**
 *  @author ysj on 2020/06/24.
 */
public class MeasureDataVO {
    private String type;//体征类型
    private String measure_time;//测量时间
    private String sign_name;//体征指标名称
    private String sign_value;//体征指标值
    private String sign_unit;//体征指标单位
    private String explain;//测量结果的解释分析
    private String filepath;// 测量附件
    private String reference;//测量结果参考标准
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getMeasure_time() {
        return measure_time;
    }
    public void setMeasure_time(String measure_time) {
        this.measure_time = measure_time;
    }
    public String getSign_name() {
        return sign_name;
    }
    public void setSign_name(String sign_name) {
        this.sign_name = sign_name;
    }
    public String getSign_value() {
        return sign_value;
    }
    public void setSign_value(String sign_value) {
        this.sign_value = sign_value;
    }
    public String getSign_unit() {
        return sign_unit;
    }
    public void setSign_unit(String sign_unit) {
        this.sign_unit = sign_unit;
    }
    public String getExplain() {
        return explain;
    }
    public void setExplain(String explain) {
        this.explain = explain;
    }
    public String getFilepath() {
        return filepath;
    }
    public void setFilepath(String filepath) {
        this.filepath = filepath;
    }
    public String getReference() {
        return reference;
    }
    public void setReference(String reference) {
        this.reference = reference;
    }
}

+ 37 - 0
common/common-rest-model-es/src/main/java/iot/device/PositionDataVO.java

@ -0,0 +1,37 @@
package iot.device;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
/**
 * @author ysj on 2020/06/24.
 */
public class PositionDataVO {
    private GeoPoint location;//坐标 lat lon
    private String altitude; //海拨
    private String position; //位置描述,例如几号病房几床
    public GeoPoint getLocation() {
        return location;
    }
    public void setLocation(GeoPoint location) {
        this.location = location;
    }
    public String getAltitude() {
        return altitude;
    }
    public void setAltitude(String altitude) {
        this.altitude = altitude;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }
}

+ 68 - 4
svr/svr-iot/src/main/java/com/yihu/iot/controller/third/ThirdDataInputController.java

@ -1,5 +1,6 @@
package com.yihu.iot.controller.third;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yihu.iot.aop.IntefaceLogRequired;
import com.yihu.iot.datainput.service.DataInputService;
@ -14,10 +15,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
@ -52,6 +50,39 @@ public class ThirdDataInputController {
        }
    }
    @GetMapping(value = IotRequestMapping.ThirdOpen.searchList)
    @ApiOperation(value = "查询数据,分页", notes = "根据条件查询数据,分页")
    @IntefaceLogRequired
    public MixEnvelop searchList(
            @ApiParam(name="startTime",value="开始时间",defaultValue = "")
            @RequestParam(value="startTime",required = false) String startTime,
            @ApiParam(name="endTime",value="结束时间",defaultValue = "")
            @RequestParam(value="endTime",required = false) String endTime,
            @ApiParam(name="sn",value="设备sn",defaultValue = "")
            @RequestParam(value="sn",required = false) String sn,
            @ApiParam(name="ext_code",value="地区",defaultValue = "")
            @RequestParam(value="ext_code",required = false) String ext_code,
            @ApiParam(name="idcard",value="身份证",defaultValue = "")
            @RequestParam(value="idcard",required = true) String idcard,
            @ApiParam(name="page",value="第几页",defaultValue = "")
            @RequestParam(value="page",required = false) Integer page,
            @ApiParam(name="size",value="页面大小",defaultValue = "")
            @RequestParam(value="size",required = false) Integer size,
            @ApiParam(name="itemCode",value="体征指标代码",defaultValue = "")
            @RequestParam(value="itemCode",required = false) String itemCode) throws IOException {
        try{
            if(page==null){
                page = 1;
            }
            if(size==null){
                size = 10;
            }
            return dataSearchService.getDataToBean(startTime,endTime,sn,ext_code,idcard,page,size,itemCode);
        } catch (ApiException e){
            return MixEnvelop.getError(e.getMessage(), e.getErrorCode());
        }
    }
    @PostMapping(value = IotRequestMapping.ThirdOpen.uploadData)
    @ApiOperation(value = "体征数据上传", notes = "数据上传入库")
    @IntefaceLogRequired
@ -87,4 +118,37 @@ public class ThirdDataInputController {
        return MixEnvelop.getSuccess(DataRequestMapping.DataInput.message_success, result.getString("msg"));
    }
    /**
     * 添加条件
     * 参数格式:[{"andOr":"and|or","condition":">|=|<|>=|<=|?","field":"<field>","value":"<value>"},<{...}>]
     * @param andOr
     * @param field
     * @param condition
     * @param value
     * @param jsonArray
     */
    private void field(String andOr,String field,String condition,String value,JSONArray jsonArray){
        JSONObject json = new JSONObject();
        json.put("andOr",andOr);
        json.put("field",field);
        json.put("condition",condition);
        json.put("value",value);
        jsonArray.add(json);
    }
    /**
     * 排序[{"key1":{"order":"asc|desc"}},{"key2":{"order":"asc|desc"}}]
     * @param jsonArray
     * @param key
     * @param order
     */
    private void sort(JSONArray jsonArray,String key,String order){
        JSONObject json = new JSONObject();
        json.put("order",order);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put(key,json);
        jsonArray.add(jsonObject);
    }
}

+ 50 - 5
svr/svr-iot/src/main/java/com/yihu/iot/datainput/service/DataSearchService.java

@ -7,6 +7,7 @@ import com.yihu.iot.datainput.util.ConstantUtils;
import com.yihu.iot.service.common.ElasticSearchQueryGenerator;
import com.yihu.jw.restmodel.iot.datainput.DataBodySignsVO;
import com.yihu.jw.restmodel.iot.datainput.WeRunDataVO;
import com.yihu.jw.restmodel.web.MixEnvelop;
import com.yihu.jw.util.date.DateUtil;
import io.searchbox.core.SearchResult;
import org.apache.commons.lang.StringUtils;
@ -21,6 +22,9 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static com.yihu.iot.datainput.util.ConstantUtils.esIndex;
import static com.yihu.iot.datainput.util.ConstantUtils.esType;
//import com.yihu.base.hbase.HBaseHelper;
//import org.apache.hadoop.hbase.Cell;
//import org.apache.hadoop.hbase.client.Result;
@ -33,10 +37,51 @@ public class DataSearchService {
    @Autowired
    private ElasticSearchHelper elasticSearchHelper;
    @Autowired
    private ElasticSearchQueryGenerator elasticSearchQueryGenerator;
    /**
     * 体征数据查询,数据转为视图展示VO类
     * @param startTime
     * @return
     */
    public MixEnvelop getDataToBean(String startTime, String endTime, String sn, String ext_code,
                                    String idcard, Integer page, Integer size, String itemCode) throws IOException {
        logger.info("load data from elasticsearch start:" + org.apache.http.client.utils.DateUtils.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss));
        String sql = "select * from "+ esIndex + " where idcard = '"+idcard+"' ";
        String countSql = "select count(*) count from "+ esIndex + " where idcard = '"+idcard+"' ";
        if(StringUtils.isNotEmpty(startTime)){
            sql += " and measure_data.measure_time>='"+startTime+"'";
            countSql += " and measure_data.measure_time>='"+startTime+"'";
        }
        if(StringUtils.isNotEmpty(endTime)){
            sql += " and measure_data.measure_time<='"+endTime+"'";
            countSql += " and measure_data.measure_time<='"+endTime+"'";
        }
        if(StringUtils.isNotEmpty(sn)){
            sql += " and sn='"+sn+"'";
            countSql += " and sn='"+sn+"'";
        }
        if(StringUtils.isNotEmpty(ext_code)){
            sql += " and ext_code='"+ext_code+"'";
            countSql += " and ext_code='"+ext_code+"'";
        }
        if(StringUtils.isNotEmpty(itemCode)){
            sql += " and measure_data.sign_name='"+itemCode+"'";
            countSql += " and measure_data.sign_name='"+itemCode+"'";
        }
        sql+=" order by measure_data.measure_time desc limit "+(page-1)*size+","+size;
        List<iot.device.DataBodySignsVO> list = elasticSearchQueryGenerator.excute(sql, iot.device.DataBodySignsVO.class, ConstantUtils.esIndex, ConstantUtils.esType);
        Long count = elasticSearchQueryGenerator.excuteForLong(countSql,ConstantUtils.esType,ConstantUtils.esIndex);
        return MixEnvelop.getSuccessListWithPage("success",list,page,size,count);
    }
//    @Autowired
//    private HBaseHelper hBaseHelper;
@ -45,7 +90,7 @@ public class DataSearchService {
        JSONObject resultJsonObj = new JSONObject();
        JSONArray  resultArray = new JSONArray();
        SearchSourceBuilder query = elasticSearchQueryGenerator.getQueryBuilder("data",jsonData);
        SearchResult esResult = elasticSearchHelper.search(ConstantUtils.esIndex,ConstantUtils.esType,query.toString());
        SearchResult esResult = elasticSearchHelper.search(esIndex, esType,query.toString());
        if(esResult.getTotal() == 0){
            return "";
        }
@ -99,7 +144,7 @@ public class DataSearchService {
        String _id = "";
        try {
            //将该rid的文档取出来
            SearchResult searchResult = elasticSearchHelper.search(ConstantUtils.esIndex, ConstantUtils.esType, queryString.toString());
            SearchResult searchResult = elasticSearchHelper.search(esIndex, esType, queryString.toString());
            params.remove("rid");
            _id = getEsId(searchResult.getJsonString());
            String resultSource = searchResult.getSourceAsString();
@ -125,7 +170,7 @@ public class DataSearchService {
//        boolean bool = elastricSearchHelper.update(ConstantUtils.esIndex, ConstantUtils.esType, _id, updateObj.toJSONString());
//        Update update = new Update();
//        update.
        boolean bool = elasticSearchHelper.update(ConstantUtils.esIndex, ConstantUtils.esType, _id, resultObject);
        boolean bool = elasticSearchHelper.update(esIndex, esType, _id, resultObject);
        return String.valueOf(bool);
    }
@ -202,7 +247,7 @@ public class DataSearchService {
        }
        logger.info("load data from elasticsearch start:" + org.apache.http.client.utils.DateUtils.formatDate(new Date(), DateUtil.yyyy_MM_dd_HH_mm_ss));
        SearchSourceBuilder query = elasticSearchQueryGenerator.getQueryBuilder("data",jsonData);
        SearchResult esResult = elasticSearchHelper.search(ConstantUtils.esIndex,ConstantUtils.esType,query.toString());
        SearchResult esResult = elasticSearchHelper.search(esIndex, esType,query.toString());
        if(null== esResult || esResult.getTotal()==null || esResult.getTotal() == 0){
            return result;
        }

+ 263 - 2
svr/svr-iot/src/main/java/com/yihu/iot/service/common/ElasticSearchQueryGenerator.java

@ -1,30 +1,52 @@
package com.yihu.iot.service.common;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yihu.elasticsearch.ElasticSearchPool;
import com.yihu.iot.datainput.enums.DataTypeEnum;
import com.yihu.iot.datainput.service.DataStandardConvertService;
import com.yihu.jw.datainput.Data;
import com.yihu.jw.datainput.StepInfoDO;
import org.apache.commons.lang.StringUtils;
//import org.apache.hadoop.hbase.util.CollectionUtils;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.nlpcn.es4sql.domain.Select;
import org.nlpcn.es4sql.jdbc.ObjectResult;
import org.nlpcn.es4sql.jdbc.ObjectResultsExtractor;
import org.nlpcn.es4sql.parse.ElasticSqlExprParser;
import org.nlpcn.es4sql.parse.SqlParser;
import org.nlpcn.es4sql.query.AggregationQueryAction;
import org.nlpcn.es4sql.query.DefaultQueryAction;
import org.nlpcn.es4sql.query.SqlElasticSearchRequestBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*;
//import org.apache.hadoop.hbase.util.CollectionUtils;
@Component
public class ElasticSearchQueryGenerator {
    private Logger logger = LoggerFactory.getLogger(ElasticSearchQueryGenerator.class);
    private static Map<String,Set<String>> fieldsMap = new HashMap<>();
    @Autowired
    private ElasticSearchPool elasticSearchPool;
    @PostConstruct
    public static void init(){
@ -42,6 +64,245 @@ public class ElasticSearchQueryGenerator {
        fieldsMap.put("stepInfoList",fieldsSet2);
    }
    public Long excuteForLong(String sql, String esType, String esIndex) {
        try {
            SQLExprParser parser = new ElasticSqlExprParser(sql);
            SQLExpr expr = parser.expr();
            SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
            Select select = null;
            select = new SqlParser().parseSelect(queryExpr);
            //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
            AggregationQueryAction action = null;
            DefaultQueryAction queryAction = null;
            SqlElasticSearchRequestBuilder requestBuilder = null;
            if (select.isAgg) {
                //包含计算的的排序分组的
                action = new AggregationQueryAction(elasticSearchPool.getClient(), select);
                requestBuilder = action.explain();
            } else {
                //封装成自己的Select对象
                queryAction = new DefaultQueryAction(elasticSearchPool.getClient(), select);
                requestBuilder = queryAction.explain();
            }
            SearchResponse response = (SearchResponse) requestBuilder.get();
            ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(response.getAggregations(), true);
            Long Longvalue = ((Double) temp.getLines().get(0).get(0)).longValue();
            return Longvalue;
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        return 0L;
    }
    public List excute(String sql, Class clazz, String esType, String esIndex) {
        List saveModels = new ArrayList<>();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXX");
        SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            //解决 group by之后默认是200的问题
            if (sql.toLowerCase().contains("group by")) {
                sql = sql + " limit 0,2000";
            }
            SQLExprParser parser = new ElasticSqlExprParser(sql);
            SQLExpr expr = parser.expr();
            SQLQueryExpr queryExpr = (SQLQueryExpr) expr;
            Select select = null;
            select = new SqlParser().parseSelect(queryExpr);
            //通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
            AggregationQueryAction action = null;
            DefaultQueryAction queryAction = null;
            SqlElasticSearchRequestBuilder requestBuilder = null;
            if (select.isAgg) {
                //包含计算的的排序分组的
                action = new AggregationQueryAction(elasticSearchPool.getClient(), select);
                requestBuilder = action.explain();
            } else {
                //封装成自己的Select对象
                queryAction = new DefaultQueryAction(elasticSearchPool.getClient(), select);
                requestBuilder = queryAction.explain();
            }
            SearchResponse response = (SearchResponse) requestBuilder.get();
            Object queryResult = null;
            if (sql.toUpperCase().indexOf("GROUP") != -1 || sql.toUpperCase().indexOf("SUM") != -1 || select.isAgg) {
                queryResult = response.getAggregations();
            } else {
                queryResult = response.getHits();
            }
            ObjectResult temp = new ObjectResultsExtractor(true, true, true).extractResults(queryResult, true);
            List<String> heads = temp.getHeaders();
            temp.getLines().forEach(one -> {
                Object saveModel = null;
                try {
                    saveModel = clazz.newInstance();
                } catch (Exception e) {
                    logger.error(e.getMessage());
                }
                for (int i = 0; i < one.size(); i++) {
                    try {
                        String key = null;
                        Object value = one.get(i);
                        if (heads.get(i).startsWith("_")) {
                            if(heads.get(i).contains("_id")){
                                clazz.getMethod("setId", String.class).invoke(saveModel, value);
                            }
                            continue;
                        }
                        key = "set" + UpFirstStr(heads.get(i));
                        if (heads.get(i).contains("quotaDate") || heads.get(i).contains("createTime") || heads.get(i).contains("date_histogram") || heads.get(i).contains("czrq")) {
                            if (heads.get(i).contains("date_histogram")) {
                                key = "setQuotaDate";
                            }
                            if(heads.get(i).contains("czrq") && one.get(i) == null ){
                                continue;
                            }
                            try {
                                //yyyy-MM-dd'T'HH:mm:ssXX
                                value = dateFormat.parse(String.valueOf(one.get(i)));
                            } catch (Exception e) {
                                //yyyy-MM-dd HH:mm:ss
                                try {
                                    value = dateFormat1.parse(String.valueOf(one.get(i)));
                                }catch (Exception e1){
                                    Timestamp ts = new Timestamp(Long.parseLong(String.valueOf(one.get(i))));
                                    try {
                                        Date date = new Date();
                                        date = ts;
                                        value =date;
                                    } catch (Exception e2) {
                                        value = String.valueOf(one.get(i));
                                    }
                                }
                            }
//                            value = DateUtil.strToDate(String.valueOf(value).replace("T00:00:00+0800", " 00:00:00"), "yyyy-MM-dd HH:mm:ss");
                        }
                        if (value instanceof String) {
                            clazz.getMethod(key, String.class).invoke(saveModel, value);
                        } else if (value instanceof Integer) {
                            Field field = clazz.getDeclaredField(heads.get(i));
                            if(field.getGenericType().getTypeName().equals("java.lang.Long")) {
                                clazz.getMethod(key, Long.class).invoke(saveModel, Long.valueOf(value + ""));
                            } else {
                                clazz.getMethod(key, Integer.class).invoke(saveModel, value);
                            }
                        } else if (value instanceof Double) {
                            clazz.getMethod(key, Double.class).invoke(saveModel, value);
                        } else if (value instanceof java.util.Date) {
                            clazz.getMethod(key, java.util.Date.class).invoke(saveModel, value);
                        } else if (value instanceof java.util.List) {
                            Field field = clazz.getDeclaredField(heads.get(i));
                            if(field.getGenericType().getTypeName().equals("java.util.Set<java.lang.String>")){
                                Set<String> set = new HashSet<>();
                                for(Object s : (ArrayList) value){
                                    set.add(s + "");
                                }
                                clazz.getMethod(key, java.util.Set.class).invoke(saveModel, set);
                            }else {
                                clazz.getMethod(key, java.util.List.class).invoke(saveModel, value);
                            }
                        }
                    } catch (Exception e) {
                        logger.warn(e.getMessage());
                    }
                }
                saveModels.add(saveModel);
            });
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
        return saveModels;
    }
    /**
     * 首字母大写
     *
     * @param str
     * @return
     */
    private String UpFirstStr(String str) {
        return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());
    }
    /**
     * 构造es查询参数
     * @param jsonData
     *
    {
    "filter":[{"andOr":"and|or","condition":">|=|<|>=|<=|?","field":"<filed>","value":"<value>"},<{...}>],
    - 参数说明:andOr跟数据库的中的AND和OR相似;condition指条件匹配程度,?相当于数据库中的like;filed指检索的字段;value为检索的值
    "page":1,  - 参数格式:页码,默认1,int类型 不需要分页,传""
    "size":10, - 参数格式:条数,默认10,int类型 不需要分页,传""
    "sort":[
    {"key":{"order":"asc|desc"}}, - 参数格式:排序, key要排序的字段,order固定,取值asc或desc,不需要排序,传""
    {"key":{"order":"asc|desc"}}
    ]
    }
     * @return
     */
    public SearchSourceBuilder getQueryBuilder(String nestedPath, String jsonData,String measureData) {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //什么都不传的情况下,构造查询所有的语句
        if(StringUtils.isEmpty(jsonData)){
            MatchAllQueryBuilder allQueryBuilder = QueryBuilders.matchAllQuery();
            return searchSourceBuilder.query(allQueryBuilder);
        }
        JSONObject json = JSONObject.parseObject(jsonData);
        List<Map<String, Object>> filter = (List)json.getJSONArray("filter");
        int page = json.getIntValue("page") == 0 ? 1:json.getIntValue("page"); //从第一页开始
        int size = json.getIntValue("size") == 0 ? 1:json.getIntValue("size"); //默认值为1,最少获取一条记录
        JSONArray sort = json.getJSONArray("sort");
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder = getBoolQueryBuilder(nestedPath,jsonData,false);//非嵌套的数据查询不需要nested
        searchSourceBuilder.from((page -1)*size);
        searchSourceBuilder.size(size);
        //排序
        if(!CollectionUtils.isEmpty(sort)){
            for(Object obj:sort){
                JSONObject object = JSONObject.parseObject(obj.toString());
                FieldSortBuilder fieldSortBuilder = null;
                for(String key:object.keySet()){
                    if(!CollectionUtils.isEmpty(fieldsMap.get(nestedPath)) && fieldsMap.get(nestedPath).contains(key)){
                        fieldSortBuilder = new FieldSortBuilder("measure_data." + key);
                    }else{
                        fieldSortBuilder = new FieldSortBuilder(key);
                    }
                    JSONObject sortValue = object.getJSONObject(key);
                    if(StringUtils.equalsIgnoreCase(SortOrder.ASC.toString(),sortValue.getString("order"))){
                        fieldSortBuilder.order(SortOrder.ASC);
                    }else if(StringUtils.equalsIgnoreCase(SortOrder.DESC.toString(),sortValue.getString("order"))){
                        fieldSortBuilder.order(SortOrder.DESC);
                    }
                    fieldSortBuilder.setNestedPath("measure_data");
                    searchSourceBuilder.sort(fieldSortBuilder);
                }
            }
        }
        if(StringUtils.isNotEmpty(nestedPath)){
            NestedQueryBuilder nestedQueryBuilder = getNestedBuilder(nestedPath,jsonData);//嵌套的数据查询
            QueryFilterBuilder filterBuilder = QueryBuilders.queryFilter(nestedQueryBuilder);
            QueryBuilder filteredQueryBuilder = QueryBuilders.filteredQuery(boolQueryBuilder,filterBuilder);
            searchSourceBuilder.query(filteredQueryBuilder);
        }else{
            searchSourceBuilder.query(boolQueryBuilder);
        }
        return searchSourceBuilder;
    }
    /**
     * 构造es查询参数
     * @param jsonData

+ 3 - 3
svr/svr-iot/src/main/java/com/yihu/iot/service/platform/IotInterfaceLogService.java

@ -68,14 +68,14 @@ public class IotInterfaceLogService extends BaseJpaService<IotInterfaceLogDO, Io
     */
    public MixEnvelop<IotInterfaceLogVO,IotInterfaceLogVO> findAll(Integer page, Integer size,String name) throws ParseException {
        StringBuffer sql = new StringBuffer("SELECT * FROM (select * from iot_interface_log c where 1=1  ORDER BY c.time desc) b   ");
        StringBuffer countSql = new StringBuffer("SELECT COUNT(b.id) count FROM (select * from iot_interface_log c where 1=1  ORDER BY c.time desc) b   ");
        StringBuffer sql = new StringBuffer("SELECT * FROM (select * from iot_interface_log b  GROUP BY b.method  ORDER BY time desc) b   ");
        StringBuffer countSql = new StringBuffer("SELECT COUNT(b.id) count FROM (select * from iot_interface_log b  GROUP BY b.method) b   ");
        if (StringUtils.isNotBlank(name)){
            sql.append(" where b.method LIKE '%").append(name).append("%'OR b.interface_name LIKE '%").append(name).append("%'");
            countSql.append(" where b.method LIKE '%").append(name).append("%'OR b.interface_name LIKE '%").append(name).append("%'");
        }
        sql.append(" GROUP BY b.interface_name limit ").append((page-1)*size).append(",").append(size);
        sql.append(" limit ").append((page-1)*size).append(",").append(size);
        List<IotInterfaceLogDO> list = jdbcTemplate.query(sql.toString(),new BeanPropertyRowMapper(IotInterfaceLogDO.class));