Browse Source

Merge branch 'master' of http://192.168.1.220:10080/EHR/commons

zhangjinjun 6 years ago
parent
commit
bf768a569b

+ 3 - 0
README.md

@ -0,0 +1,3 @@
# commons
EHR平台的基础类库。
所有类库需要基于该类库进行编写

+ 4 - 0
commons-cat/pom.xml

@ -43,5 +43,9 @@
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
      	<dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
        </dependency>
    </dependencies>
</project>

+ 6 - 0
commons-data-hbase/pom.xml

@ -17,6 +17,12 @@
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>

+ 33 - 10
commons-data-redis/src/main/java/com/yihu/ehr/redis/client/RedisClient.java

@ -6,6 +6,8 @@ import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.StringRedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.stereotype.Service;
import org.springframework.util.SerializationUtils;
@ -46,11 +48,11 @@ public class RedisClient {
     * @param key
     * @param value
     */
    public void set(final String key, final Serializable value,long seconds) {
    public void set(final String key, final Serializable value, long seconds) {
        redisTemplate.execute((RedisCallback<Object>) connection -> {
            byte[] key_ = key.getBytes();
            byte[] value_ = SerializationUtils.serialize(value);
            connection.setEx(key_,seconds, value_);
            connection.setEx(key_, seconds, value_);
            return true;
        });
    }
@ -60,12 +62,12 @@ public class RedisClient {
     *
     * @param data
     */
    public void multiSet(Map<Serializable, Serializable> data){
    public void multiSet(Map<Serializable, Serializable> data) {
        redisTemplate.executePipelined(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
                for(Serializable key : data.keySet()){
                StringRedisConnection stringRedisConn = (StringRedisConnection) connection;
                for (Serializable key : data.keySet()) {
                    Serializable value = data.get(key);
                    connection.rPushX(SerializationUtils.serialize(key), SerializationUtils.serialize(value));
                }
@ -80,7 +82,7 @@ public class RedisClient {
     *
     * @param data
     */
    public void multiSetData(Map<String, Serializable> data){
    public void multiSetData(Map<String, Serializable> data) {
        redisTemplate.executePipelined(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
@ -104,10 +106,12 @@ public class RedisClient {
     * @return
     */
    public <T> T get(final String key) {
        return (T)redisTemplate.execute((RedisCallback<Serializable>) connection -> {
        return (T) redisTemplate.execute((RedisCallback<Serializable>) connection -> {
            byte[] keyBytes = key.getBytes();
            byte[] bytes = connection.get(keyBytes);
            if(bytes == null) return null;
            if (bytes == null) {
                return null;
            }
            return (Serializable) SerializationUtils.deserialize(bytes);
        });
@ -119,8 +123,24 @@ public class RedisClient {
     * @param keys
     * @return
     */
    public List<Serializable> multiGet(Collection<String> keys){
        return redisTemplate.opsForValue().multiGet(keys);
    public List<Object> multiGet(Collection<String> keys) {
        return redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
            keys.forEach(key -> {
                byte[] keyBytes = key.getBytes();
                connection.get(keyBytes);
            });
            return null;
        }, new RedisSerializer<Serializable>() {
            @Override
            public byte[] serialize(Serializable serializable) throws SerializationException {
                return SerializationUtils.serialize(serializable);
            }
            @Override
            public Serializable deserialize(byte[] bytes) throws SerializationException {
                return (Serializable) SerializationUtils.deserialize(bytes);
            }
        });
    }
    /**
@ -134,6 +154,7 @@ public class RedisClient {
    /**
     * 删除多条记录,如果Key集合过大,建议使用Key模糊匹配删除
     *
     * @param keys
     */
    public void delete(Collection<String> keys) {
@ -142,6 +163,7 @@ public class RedisClient {
    /**
     * 匹配特定模式的Key列表
     *
     * @param pattern
     * @return
     */
@ -158,6 +180,7 @@ public class RedisClient {
    /**
     * 是否包含指定Key
     *
     * @param key
     * @return
     */

+ 143 - 32
commons-data-solr/src/main/java/com/yihu/ehr/solr/SolrUtil.java

@ -38,20 +38,20 @@ public class SolrUtil {
    /**
     * 简单查询方法
     */
    public SolrDocumentList query(String tableName, String q, Map<String, String> sort, long start, long rows) throws Exception {
        return query(tableName, q, null, sort, start, rows, null);
    public SolrDocumentList query(String core, String q, Map<String, String> sort, long start, long rows) throws Exception {
        return query(core, q, null, sort, start, rows, null);
    }
    /**
     * 简单查询返回字段
     */
    public SolrDocumentList queryReturnFieldList(String tableName, String q, String fq, Map<String, String> sort, long start, long rows, String... fields) throws Exception {
        return query(tableName, q, fq, sort, start, rows, fields);
    public SolrDocumentList queryReturnFieldList(String core, String q, String fq, Map<String, String> sort, long start, long rows, String... fields) throws Exception {
        return query(core, q, fq, sort, start, rows, fields);
    }
    /**
     * Solr查询方法
     *
     * @param core
     * @param q      查询字符串
     * @param fq     过滤查询
     * @param sort   排序
@ -63,32 +63,89 @@ public class SolrUtil {
    public SolrDocumentList query(String core, String q, String fq, Map<String, String> sort, long start, long rows, String... fields) throws Exception {
        SolrClient conn = pool.getConnection(core);
        SolrQuery query = new SolrQuery();
        if (null != q && !q.equals("")) { //设置查询条件
        //设置查询条件
        if (StringUtils.isNotEmpty(q)) {
            query.setQuery(q);
        } else {
            query.setQuery("*:*");
        }
        if (null != fq && !fq.equals("")) { //设置过滤条件
        //设置过滤条件
        if (StringUtils.isNotEmpty(fq)) {
            query.setFilterQueries(fq);
        }
        query.setFields(fields);
        query.setStart(Integer.parseInt(String.valueOf(start)));//设置查询起始行
        query.setRows(Integer.parseInt(String.valueOf(rows)));//设置查询行数
        //设置查询起始行
        query.setStart(Integer.parseInt(String.valueOf(start)));
        //设置查询行数
        query.setRows(Integer.parseInt(String.valueOf(rows)));
        //设置排序
        if (sort != null) {
            for (Object co : sort.keySet()) {
                if (ASC == sort.get(co).toLowerCase() || ASC.equals(sort.get(co).toLowerCase())) {
                if (ASC.equals(sort.get(co).toLowerCase())) {
                    query.addSort(co.toString(), SolrQuery.ORDER.asc);
                } else {
                    query.addSort(co.toString(), SolrQuery.ORDER.desc);
                }
            }
        }
        QueryResponse rsp = conn.query(query);
        SolrDocumentList docs = rsp.getResults();
        return docs;
    }
    /**
     * Solr查询方法
     * @param core
     * @param q 查询字符串
     * @param fq 过滤查询
     * @param sort 排序
     * @param start 查询起始行
     * @param rows 查询行数
     * @param hl 高亮字段
     * @param fields 返回字段
     * @return
     * @throws Exception
     */
    public QueryResponse highlight(String core, String q, String fq, Map<String, String> sort, long start, long rows, String hl, String... fields) throws Exception {
        SolrClient conn = pool.getConnection(core);
        SolrQuery query = new SolrQuery();
        //设置查询条件
        if (StringUtils.isNotEmpty(q)) {
            query.setQuery(q);
        } else {
            query.setQuery("*:*");
        }
        //设置过滤条件
        if (StringUtils.isNotEmpty(fq)) {
            query.setFilterQueries(fq);
        }
        query.setFields(fields);
        //设置查询起始行
        query.setStart(Integer.parseInt(String.valueOf(start)));
        //设置查询行数
        query.setRows(Integer.parseInt(String.valueOf(rows)));
        //设置排序
        if (sort != null) {
            for (Object co : sort.keySet()) {
                if (ASC.equals(sort.get(co).toLowerCase())) {
                    query.addSort(co.toString(), SolrQuery.ORDER.asc);
                } else {
                    query.addSort(co.toString(), SolrQuery.ORDER.desc);
                }
            }
        }
        //高亮
        if (StringUtils.isNotEmpty(hl)) {
            query.addHighlightField(hl);
            query.setHighlightSimplePre("<em>");
            query.setHighlightSimplePost("</em>");
        }
        QueryResponse rsp = conn.query(query);
        return rsp;
    }
    /**
@ -167,14 +224,12 @@ public class SolrUtil {
        SolrClient conn = pool.getConnection(core);
        SolrQuery query = new SolrQuery();
        List<Group> groups = queryDistinctOneField(core, q, fq, sort, start, rows, fields, groupField, groupSort);
        QueryResponse response = conn.query(query);
        GroupResponse groupResponse = response.getGroupResponse();
        if (groupResponse != null) {
            List<GroupCommand> groupList = groupResponse.getValues();
            for (GroupCommand groupCommand : groupList) {
                groups = groupCommand.getValues();
                List<Group> groups = groupCommand.getValues();
                for (Group group : groups) {
                    if (group.getResult().size() > 0) {
                        solrDocumentList.add(group.getResult().get(0));
@ -209,8 +264,10 @@ public class SolrUtil {
            query.setFilterQueries(fq);
        }
        query.setStart(Integer.parseInt(String.valueOf(start)));//设置查询起始行
        query.setRows(Integer.parseInt(String.valueOf(rows)));//设置查询行数
        //设置查询起始行
        query.setStart(Integer.parseInt(String.valueOf(start)));
        //设置查询行数
        query.setRows(Integer.parseInt(String.valueOf(rows)));
        //设置排序
        if (sort != null) {
@ -241,7 +298,8 @@ public class SolrUtil {
    public long count(String core, String q, String fq) throws Exception {
        SolrClient conn = pool.getConnection(core);
        SolrQuery query = new SolrQuery();
        if (null != q && !q.equals("")) { //设置查询条件
        //设置查询条件
        if (null != q && !q.equals("")) {
            query.setQuery(q);
        } else {
            query.setQuery("*:*");
@ -254,9 +312,6 @@ public class SolrUtil {
        QueryResponse rsp = conn.query(query);
        long count = rsp.getResults().getNumFound();
        //query.setStart(start);
        //rsp = conn.query(query);
        //SolrDocumentList docs = rsp.getResults();
        return count;
    }
@ -282,13 +337,17 @@ public class SolrUtil {
        if (null != fq && !fq.equals("")) {
            query.setFilterQueries(fq);
        }
        query.setFacet(true);//设置facet=on
        //设置facet=on
        query.setFacet(true);
        query.setRows(0);
        query.addFacetField(groupField);
        query.setFacetLimit(limit);//限制每次返回结果数
        //限制每次返回结果数
        query.setFacetLimit(limit);
        query.set(FacetParams.FACET_OFFSET, start);
        query.setFacetMissing(false);//不统计null的值
        query.setFacetMinCount(0);// 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
        //不统计null的值
        query.setFacetMissing(false);
        // 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
        query.setFacetMinCount(0);
        QueryResponse rsp = conn.query(query);
        List<FacetField.Count> countList = rsp.getFacetField(groupField).getValues();
        Map<String, Long> rmap = new HashMap<>();
@ -300,6 +359,51 @@ public class SolrUtil {
    }
    /**
     * 单组分组Count统计(start从0开始),筛选出聚合值>=groupCount
     *
     * @param core       core名
     * @param q          查询条件
     * @param fq         筛选条件
     * @param groupField 分组字段名
     * @param start      起始偏移位
     * @param limit      结果条数,为负数则不限制
     * @param groupCount 聚合值
     */
    public Map<String, Long> groupCountLte(String core, String q, String fq, String groupField, int start, int limit, int groupCount) throws Exception {
        SolrClient conn = pool.getConnection(core);
        SolrQuery query = new SolrQuery();
        if (null != q && !q.equals("")) {
            query.setQuery(q);
        } else {
            query.setQuery("*:*");
        }
        if (null != fq && !fq.equals("")) {
            query.setFilterQueries(fq);
        }
        //设置facet=on
        query.setFacet(true);
        query.setRows(0);
        query.addFacetField(groupField);
        //限制每次返回结果数
        query.setFacetLimit(limit);
        query.set(FacetParams.FACET_OFFSET, start);
        //不统计null的值
        query.setFacetMissing(false);
        // 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
        query.setFacetMinCount(0);
        QueryResponse rsp = conn.query(query);
        List<FacetField.Count> countList = rsp.getFacetField(groupField).getValues();
        Map<String, Long> rmap = new HashMap<>();
        for (FacetField.Count count : countList) {
            if (count.getCount() >= groupCount) {
                rmap.put(count.getName(), (long) count.getCount());
            }
        }
        return rmap;
    }
    /**
     * 多组分组Count(独立计算)
     *
@ -320,13 +424,17 @@ public class SolrUtil {
            query.setFilterQueries(fq);
        }
        query.setFacet(true);//设置facet=on
        //设置facet=on
        query.setFacet(true);
        query.setRows(0);
        query.addFacetField(groupFields);
        query.setFacetLimit(-1); // 限制每次返回结果数
        // 限制每次返回结果数
        query.setFacetLimit(-1);
        query.set(FacetParams.FACET_OFFSET, 0);
        query.setFacetMissing(false); // 不统计null的值
        query.setFacetMinCount(0); // 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
        // 不统计null的值
        query.setFacetMissing(false);
        // 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
        query.setFacetMinCount(0);
        QueryResponse rsp = conn.query(query);
        return rsp.getFacetFields();
@ -354,14 +462,17 @@ public class SolrUtil {
        if (null != fq && !fq.equals("")) {
            query.setFilterQueries(fq);
        }
        query.setFacet(true);//设置facet=on
        //设置facet=on
        query.setFacet(true);
        query.setRows(0);
        query.addFacetPivotField(groupFields);
        query.set(FacetParams.FACET_OFFSET, start);
        query.setFacetLimit(limit);//限制每次返回结果数
        query.setFacetMissing(false);//不统计null的值
        query.setFacetMinCount(0);// 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
        //限制每次返回结果数
        query.setFacetLimit(limit);
        //不统计null的值
        query.setFacetMissing(false);
        // 设置返回的数据中每个分组的数据最小值,比如设置为0,则统计数量最小为0,不然不显示
        query.setFacetMinCount(0);
        QueryResponse rsp = conn.query(query);
        NamedList<List<PivotField>> namedList = rsp.getFacetPivot();

+ 5 - 0
commons-ehr-constants/src/main/java/com/yihu/ehr/constants/ServiceApi.java

@ -1353,6 +1353,11 @@ public class ServiceApi {
        public static final String GetYearDropdownList = "/tj/getYearDropdownList";
        public static final String GetOftenIllList = "/tj/getOftenIllList";
        public static final String GetHighCostList = "/tj/getHighCostList";
        public static final String GetRepeateInspectList = "/tj/getRepeateInspectList";
        public static final String DrugAnalysis = "/tj/drugAnalysis";
        public static class Scheduler {
            public static final String ExtractMedicineExpense = "/tj/scheduler/extractMedicineExpense";
            public static final String ExtractChronicDisease = "/tj/scheduler/extractChronicDisease";

+ 101 - 25
commons-profile-core/src/main/java/com/yihu/ehr/profile/family/ResourceCells.java

@ -7,38 +7,113 @@ import java.util.Arrays;
import java.util.List;
/**
 * Created by progr1mmer on 2018/6/9.
 * @author progr1mmer
 * @date Created on 2018/6/9.
 */
public class ResourceCells {
    public static final String ROWKEY = "rowkey";
    //Basic
    public static final String PROFILE_ID = "profile_id"; //档案主索引
    public static final String PROFILE_TYPE = "profile_type"; //档案类型
    public static final String EVENT_NO = "event_no"; //事件号
    public static final String EVENT_DATE = "event_date"; //事件时间
    public static final String EVENT_TYPE = "event_type"; //事件类型
    public static final String CARD_ID = "card_id"; //就诊卡号
    public static final String CARD_TYPE = "card_type"; //就诊卡类型
    public static final String PATIENT_ID = "patient_id"; //病人ID
    public static final String PATIENT_NAME = "patient_name"; //病人姓名
    public static final String DEMOGRAPHIC_ID = "demographic_id"; //身份证号码
    public static final String ORG_CODE = "org_code"; //机构编码
    public static final String ORG_NAME = "org_name"; //机构名称
    public static final String ORG_AREA = "org_area"; //机构地区
    public static final String CDA_VERSION = "cda_version"; //CDA版本
    public static final String CREATE_DATE = "create_date"; //创建时间
    public static final String DIAGNOSIS = "diagnosis"; //ICD10诊断代码
    public static final String DIAGNOSIS_NAME = "diagnosis_name"; //ICD10诊断名称
    public static final String HEALTH_PROBLEM = "health_problem"; //健康问题诊断代码
    public static final String HEALTH_PROBLEM_NAME = "health_problem_name"; //健康问题诊断名称
    public static final String DEPT_CODE = "dept_code"; //科室编码
    public static final String SUB_ROWKEYS = "sub_rowkeys"; //细表索引
    public static final String PATIENT_AGE = "patient_age"; //就诊年龄
    public static final String PATIENT_SEX = "patient_sex"; //患者性别
    /**
     * 档案主索引
     */
    public static final String PROFILE_ID = "profile_id";
    /**
     * 档案类型
     */
    public static final String PROFILE_TYPE = "profile_type";
    /**
     * 事件号
     */
    public static final String EVENT_NO = "event_no";
    /**
     * 事件时间
     */
    public static final String EVENT_DATE = "event_date";
    /**
     * 事件类型
     */
    public static final String EVENT_TYPE = "event_type";
    /**
     * 就诊卡号
     */
    public static final String CARD_ID = "card_id";
    /**
     * 就诊卡类型
     */
    public static final String CARD_TYPE = "card_type";
    /**
     * 病人ID
     */
    public static final String PATIENT_ID = "patient_id";
    /**
     * 病人姓名
     */
    public static final String PATIENT_NAME = "patient_name";
    /**
     * 身份证号码
     */
    public static final String DEMOGRAPHIC_ID = "demographic_id";
    /**
     * 机构编码
     */
    public static final String ORG_CODE = "org_code";
    /**
     * 机构名称
     */
    public static final String ORG_NAME = "org_name";
    /**
     * 机构地区
     */
    public static final String ORG_AREA = "org_area";
    /**
     * CDA版本
     */
    public static final String CDA_VERSION = "cda_version";
    /**
     * 创建时间
     */
    public static final String CREATE_DATE = "create_date";
    /**
     * ICD10诊断代码
     */
    public static final String DIAGNOSIS = "diagnosis";
    /**
     * ICD10诊断名称
     */
    public static final String DIAGNOSIS_NAME = "diagnosis_name";
    /**
     * 健康问题诊断代码
     */
    public static final String HEALTH_PROBLEM = "health_problem";
    /**
     * 健康问题诊断名称
     */
    public static final String HEALTH_PROBLEM_NAME = "health_problem_name";
    /**
     * 科室编码
     */
    public static final String DEPT_CODE = "dept_code";
    /**
     * 细表索引
     */
    public static final String SUB_ROWKEYS = "sub_rowkeys";
    /**
     * 就诊年龄
     */
    public static final String PATIENT_AGE = "patient_age";
    /**
     * 患者性别
     */
    public static final String PATIENT_SEX = "patient_sex";
    /**
     * 全文检索字段
     */
    public static final String SEARCH_FIELD = "search_field";
    //RawFiles
    public static final String CDA_DOCUMENT_ID = "cda_document_id";
    public static final String CDA_DOCUMENT_NAME = "cda_document_name";
    public static final String FILE_LIST = "file_list";
@ -68,7 +143,8 @@ public class ResourceCells {
                        DIAGNOSIS,
                        DIAGNOSIS_NAME,
                        HEALTH_PROBLEM,
                        HEALTH_PROBLEM_NAME
                        HEALTH_PROBLEM_NAME,
                        SEARCH_FIELD
                ));
            case File:
                return new ArrayList<>(Arrays.asList(

+ 9 - 1
commons-rest-model/src/main/java/com/yihu/ehr/model/user/MUser.java

@ -73,7 +73,7 @@ public class MUser implements Serializable{
    private  String position;//职务
    //用户机构部门关系
    private MJkzlOrgMemberRelation mJkzlOrgMemberRelation;
    private String userTypeName;
@ -472,4 +472,12 @@ public class MUser implements Serializable{
    public void setmJkzlOrgMemberRelation(MJkzlOrgMemberRelation mJkzlOrgMemberRelation) {
        this.mJkzlOrgMemberRelation = mJkzlOrgMemberRelation;
    }
    public String getUserTypeName() {
        return userTypeName;
    }
    public void setUserTypeName(String userTypeName) {
        this.userTypeName = userTypeName;
    }
}

+ 2 - 2
commons-util/src/main/java/com/yihu/ehr/util/encrypt/RSA.java

@ -77,7 +77,7 @@ public class RSA {
    /**
     * @param data 明文
     * @param key  密钥
     * @return HexString密文
     * @return Base64String密文
     * @throws Exception
     */
    public static String encrypt(String data, Key key) throws Exception {
@ -88,7 +88,7 @@ public class RSA {
    }
    /**
     * @param data HexString密文
     * @param data Base64String密文
     * @param key  密钥
     * @return 明文
     * @throws Exception

+ 52 - 46
commons-util/src/main/java/com/yihu/ehr/util/rest/Envelop.java

@ -1,6 +1,8 @@
package com.yihu.ehr.util.rest;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
@ -17,34 +19,66 @@ import java.util.List;
 *
 * @author llh
 */
public class Envelop implements Serializable{
public class Envelop<T, J> implements Serializable{
    private static final long serialVersionUID = 2076324875575488461L;
    private boolean successFlg;
    private int pageSize = 10;
    private int pageSize = 15;
    private int currPage;
    private int currPage = 1;
    private int totalPage;
    private int totalPage = 0;
    private int totalCount;
    private List detailModelList;
    private List<T> detailModelList = new ArrayList<>();
    private Object obj;
    private J obj = (J) new HashMap<>(0);
    private String errorMsg;
    private int errorCode;
    public Object getObj() {
        return obj;
    public boolean isSuccessFlg() {
        return successFlg;
    }
    public void setObj(Object obj) {
        this.obj = obj;
    public void setSuccessFlg(boolean successFlg) {
        this.successFlg = successFlg;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getCurrPage() {
        return currPage;
    }
    public void setCurrPage(int currPage) {
        this.currPage = currPage;
    }
    public int getTotalPage() {
        if (0 == pageSize){
            pageSize = 15;
        }
        if (totalCount % pageSize > 0) {
            totalPage = totalCount / pageSize + 1;
        } else {
            totalPage = totalCount / pageSize;
        }
        return totalPage;
    }
    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }
    public int getTotalCount() {
@ -55,20 +89,20 @@ public class Envelop implements Serializable{
        this.totalCount = totalCount;
    }
    public boolean isSuccessFlg() {
        return successFlg;
    public List<T> getDetailModelList() {
        return detailModelList;
    }
    public void setSuccessFlg(boolean successFlg) {
        this.successFlg = successFlg;
    public void setDetailModelList(List<T> detailModelList) {
        this.detailModelList = detailModelList;
    }
    public List getDetailModelList() {
        return detailModelList;
    public J getObj() {
        return obj;
    }
    public void setDetailModelList(List detailModelList) {
        this.detailModelList = detailModelList;
    public void setObj(J obj) {
        this.obj = obj;
    }
    public String getErrorMsg() {
@ -87,32 +121,4 @@ public class Envelop implements Serializable{
        this.errorCode = errorCode;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getCurrPage() {
        return currPage;
    }
    public void setCurrPage(int currPage) {
        this.currPage = currPage;
    }
    public int getTotalPage() {
        if (totalCount % pageSize == 0) {
            totalPage = totalCount / pageSize;
        } else {
            totalPage = totalCount / pageSize + 1;
        }
        return totalPage;
    }
    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }
}

+ 30 - 16
commons-web/src/main/java/com/yihu/ehr/controller/BaseRestEndPoint.java

@ -40,7 +40,34 @@ public class BaseRestEndPoint extends AbstractController {
    }
    /**
     * 将实体转换为模型。
     * 字符串转实体
     *
     * @param json
     * @param entityCls
     * @param <T>
     * @return
     * @throws IOException
     */
    protected <T> T toEntity(String json, Class<T> entityCls) throws IOException {
        objectMapper.setDateFormat(new SimpleDateFormat(DateTimeUtil.simpleDateTimePattern));
        T entity = objectMapper.readValue(json, entityCls);
        return entity;
    }
    /**
     * 实体转字符串
     *
     * @param obj
     * @return
     * @throws JsonProcessingException
     */
    protected String toJson(Object obj) throws JsonProcessingException {
        return objectMapper.writeValueAsString(obj);
    }
    /**
     * 将实体转换为模型
     *
     * @param source
     * @param targetCls
@ -57,19 +84,8 @@ public class BaseRestEndPoint extends AbstractController {
        return target;
    }
    protected <T> T toEntity(String json, Class<T> entityCls) throws IOException {
        objectMapper.setDateFormat(new SimpleDateFormat(DateTimeUtil.simpleDateTimePattern));
        T entity = objectMapper.readValue(json, entityCls);
        return entity;
    }
    protected String toJson(Object obj) throws JsonProcessingException {
        return objectMapper.writeValueAsString(obj);
    }
    /**
     * 将实体集合转换为模型集合。
     * 将实体集合转换为模型集合
     *
     * @param sources
     * @param targets
@ -84,12 +100,10 @@ public class BaseRestEndPoint extends AbstractController {
        Iterator iterator = sources.iterator();
        while (iterator.hasNext()) {
            Object source = iterator.next();
            T target = (T) BeanUtils.instantiate(targetCls);
            T target = BeanUtils.instantiate(targetCls);
            BeanUtils.copyProperties(source, target, propertyDiffer(StringUtils.isEmpty(properties) ? null : properties.split(","), targetCls));
            targets.add(target);
        }
        return targets;
    }

+ 87 - 34
commons-web/src/main/java/com/yihu/ehr/controller/EnvelopRestEndPoint.java

@ -1,12 +1,12 @@
package com.yihu.ehr.controller;
import com.yihu.ehr.constants.ErrorCode;
import com.yihu.ehr.util.id.BizObject;
import com.yihu.ehr.util.id.ObjectId;
import com.yihu.ehr.util.rest.Envelop;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
@ -17,7 +17,7 @@ import java.util.Random;
 * HTTP响应体格式为JSON。
 * + 成功:会根据各业务逻辑自行决定要返回的数据,各业务模块的返回结构不同。
 * + 失败:{"code":"错误代码", "message":"错误原因"}
 *
 * </p>
 * @author zhiyong
 * @author Sand
 */
@ -26,6 +26,69 @@ public class EnvelopRestEndPoint extends BaseRestEndPoint {
    @Value("${deploy.region}")
    protected Short deployRegion = 3502;
    protected <T, J> Envelop<T, J> success(List<T> contents) {
        return success(contents, (J)new HashMap<>(0));
    }
    protected <T, J, _T> Envelop<_T, J> success(List<T> contents, Class<_T> targetContents) {
        List<_T> _contents = (List)convertToModels(contents, new ArrayList<>(contents.size()), targetContents, null);
        return success(_contents);
    }
    protected <T, J> Envelop<T, J> success(J obj) {
        return success(new ArrayList<T>(0), obj);
    }
    protected <T, J, _J> Envelop<T, _J> success(J obj, Class<_J> targetObj) {
        _J _obj = convertToModel(obj, targetObj);
        return success(_obj);
    }
    protected <T, J> Envelop<T, J> success(List<T> contents, J obj) {
        return success(contents, obj, contents.size(), 1, 15);
    }
    protected <T, J, _T, _J> Envelop<_T, _J> success(List<T> contents, J obj, Class<_T> targetContents, Class<_J> targetObj) {
        List<_T> _contents = (List)convertToModels(contents, new ArrayList<>(contents.size()), targetContents, null);
        _J _obj = convertToModel(obj, targetObj);
        return success(_contents, _obj);
    }
    protected <T, J> Envelop<T, J> success(List<T> contents, int totalCount, int currPage, int rows) {
        return success(contents, (J)new HashMap<>(0), totalCount, currPage, rows);
    }
    protected <T, J, _T> Envelop<_T, J> success(List<T> contents, int totalCount, int currPage, int rows, Class<_T> targetContents) {
        List<_T> _contents = (List)convertToModels(contents, new ArrayList<>(contents.size()), targetContents, null);
        return success(_contents, totalCount, currPage, rows);
    }
    protected <T, J> Envelop<T, J> success(List<T> contents, J obj, int totalCount, int currPage, int rows) {
        Envelop<T, J> envelop = new Envelop<>();
        envelop.setSuccessFlg(true);
        envelop.setTotalCount(totalCount);
        envelop.setCurrPage(currPage);
        envelop.setPageSize(rows);
        envelop.setDetailModelList(contents);
        envelop.setObj(obj);
        return envelop;
    }
    protected <T, J, _T, _J> Envelop<_T, _J> success(List<T> contents, J obj, int totalCount, int currPage, int pageSize, Class<_T> targetContents, Class<_J> targetObj) {
        List<_T> _contents = (List)convertToModels(contents, new ArrayList<>(contents.size()), targetContents, null);
        _J _obj = convertToModel(obj, targetObj);
        return success(_contents, _obj, totalCount, currPage, pageSize);
    }
    @Deprecated
    protected Envelop success(Object object, List list){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        envelop.setObj(object);
        envelop.setDetailModelList(list);
        return envelop;
    }
    /**
     * 返回一个信封对象。信封对象的返回场景参见 Envelop.
     *
@ -33,6 +96,7 @@ public class EnvelopRestEndPoint extends BaseRestEndPoint {
     * @param totalCount
     * @return
     */
    @Deprecated
    protected Envelop getResult(List modelList, int totalCount) {
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
@ -41,6 +105,7 @@ public class EnvelopRestEndPoint extends BaseRestEndPoint {
        return envelop;
    }
    @Deprecated
    protected Envelop getPageResult(List detailModelList, int totalCount, int currPage, int rows) {
        Envelop result = new Envelop();
        result.setSuccessFlg(true);
@ -56,43 +121,31 @@ public class EnvelopRestEndPoint extends BaseRestEndPoint {
        return result;
    }
    protected Envelop failed(String errMsg){
        return failed(errMsg, ErrorCode.REQUEST_NOT_COMPLETED.value());
    protected <T, J> Envelop<T, J> failed(String errMsg){
        return failed(errMsg, -1);
    }
    protected Envelop failed(String errMsg, int errorCode){
        return failed(errMsg, errorCode, null);
    protected <T, J> Envelop<T, J> failed(String errMsg, int errorCode){
        return failed(errMsg, errorCode, (J)new HashMap<>(0));
    }
    protected Envelop failed(String errMsg, Object object){
        return failed(errMsg, ErrorCode.REQUEST_NOT_COMPLETED.value(), object);
    protected <T, J> Envelop<T, J> failed(String errMsg, J obj){
        return failed(errMsg, -1, obj);
    }
    protected Envelop failed(String errMsg, int errorCode, Object object){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(false);
    protected <T, J> Envelop<T, J> failed(String errMsg, int errorCode, J obj){
        Envelop<T, J> envelop = new Envelop<>();
        envelop.setErrorMsg(errMsg);
        envelop.setErrorCode(errorCode);
        envelop.setObj(object);
        return envelop;
    }
    protected Envelop success(Object object){
        return success(object, null);
    }
    protected Envelop success(List list){
        return success(null, list);
    }
    protected Envelop success(Object object, List list){
        Envelop envelop = new Envelop();
        envelop.setSuccessFlg(true);
        envelop.setObj(object);
        envelop.setDetailModelList(list);
        envelop.setObj(obj);
        return envelop;
    }
    /**
     * 获取obj ID
     * @param bizObject
     * @return
     */
    protected String getObjectId(BizObject bizObject){
        return new ObjectId(deployRegion, bizObject).toString();
    }
@ -103,13 +156,13 @@ public class EnvelopRestEndPoint extends BaseRestEndPoint {
     * @return
     */
    protected String getRandomString(int length) {
        String str = "abcdefghigklmnopkrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789";
        StringBuffer buffer = new StringBuffer();
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuilder builder = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(str.length() - 1);//0~61
            buffer.append(str.charAt(number));
            int number = random.nextInt(str.length());
            builder.append(str.charAt(number));
        }
        return buffer.toString();
        return builder.toString();
    }
}

+ 7 - 0
ehr-cloud-parent/pom.xml

@ -139,6 +139,7 @@
        <version.spring.boot.admin>1.5.7</version.spring.boot.admin>
        <version.jettison>1.3.7</version.jettison>
        <version.springside>4.2.3-GA</version.springside>
        <version.netty>4.0.27.Final</version.netty>
        <!-- eip -->
        <mine-util-version>2.1.3</mine-util-version>
        <sigar-version>1.6.4</sigar-version>
@ -813,6 +814,12 @@
                <artifactId>hos-web-framework</artifactId>
                <version>${hos-version}</version>
            </dependency>
          
          	<dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-all</artifactId>
                <version>${version.netty}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

+ 3 - 9
hos-web-framework/pom.xml

@ -7,7 +7,7 @@
    <parent>
        <groupId>com.yihu.ehr</groupId>
        <artifactId>ehr-cloud-parent</artifactId>
        <version>1.13.1</version>
        <version>1.13.0</version>
        <relativePath>../ehr-cloud-parent/pom.xml</relativePath>
    </parent>
@ -18,9 +18,8 @@
    <dependencies>
        <dependency>
            <groupId>happy.fish</groupId>
            <artifactId>fastDFS</artifactId>
            <version>1.1.0</version>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-data-fastdfs</artifactId>
        </dependency>
        <dependency>
@ -63,11 +62,6 @@
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>

+ 1 - 0
hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/SqlConstants.java

@ -14,6 +14,7 @@ public class SqlConstants {
    public static final String FROM = " FROM ";
    public static final String WHERE = " WHERE ";
    public static final String COUNT = " COUNT(*) ";
    public static final String DISTINCT = " DISTINCT ";
    public static final String ASTERISK = "*";
    public static final String IN = " IN ";
    public static final String BETWEEN = " BETWEEN ";

+ 12 - 1
hos-web-framework/src/main/java/com/yihu/hos/web/framework/dao/SQLGeneralDAO.java

@ -24,6 +24,7 @@ import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.persistence.Table;
import java.io.IOException;
@ -821,6 +822,10 @@ public class SQLGeneralDAO implements XSQLGeneralDAO {
    public List searchPage(Class tClass,String dataType, String version, String condition, String order, Integer offset, Integer limit,boolean isStandard) throws IOException {
        return searchPage(tClass,null,dataType,version,condition,order,offset,limit,isStandard);
    }
    public List searchPage(Class tClass,List<String> fields,String dataType, String version, String condition, String order, Integer offset, Integer limit,boolean isStandard) throws IOException {
        String tableName;
        if(isStandard){
            StandardVersion standardVersion = new StandardVersion(version);
@ -878,7 +883,12 @@ public class SQLGeneralDAO implements XSQLGeneralDAO {
                sqlCreator.order(elem.substring(1), value);
            }
        }
        String sql = sqlCreator.selectData(tableName);
        String sql = "";
        if(CollectionUtils.isEmpty(fields)){
            sql = sqlCreator.selectData(tableName);
        }else{
            sql = sqlCreator.selectData(tableName,fields);
        }
        Query query = getQuery(sqlCreator, sql);
        if (limit != null) {
            query.setMaxResults(limit);
@ -889,6 +899,7 @@ public class SQLGeneralDAO implements XSQLGeneralDAO {
        return query.list();
    }
    public boolean isExistByField(Class tClass, String stdVersion,String dataType,String field, Object val) throws IOException {
        return isExistByFields(

+ 43 - 0
hos-web-framework/src/main/java/com/yihu/hos/web/framework/util/sql/SqlCreator.java

@ -146,6 +146,47 @@ public class SqlCreator {
        return sqlBuffer.toString();
    }
    public String selectData(String tabelName,List<String> fileds) {
        setTableName(tabelName);
        for(Object key : transformer.columnToProperty.keySet()){
            itemList.add(StringUtil.toString(key));
        }
        return selectData(fileds);
    }
    public String selectData(List<String> fileds) {
        StringBuilder sqlBuffer = new StringBuilder();
        sqlBuffer.append(SqlConstants.SELECT);
        int i=0;
        for (String item : fileds) {
            if(i==0){
                sqlBuffer.append(SqlConstants.DISTINCT);
                i++;
            }
            sqlBuffer.append(item + SqlConstants.COMMA);
        }
        sqlBuffer.deleteCharAt(sqlBuffer.length() - 1);
        sqlBuffer.append(SqlConstants.FROM + tableName);
        if (!CollectionUtil.isEmpty(conditionList)) {
            sqlBuffer.append(SqlConstants.WHERE);
            sqlBuffer.append("1=1" + SqlConstants.AND);
            for (String condition : conditionList) {
                sqlBuffer.append(condition + SqlConstants.AND);
            }
            sqlBuffer.delete(sqlBuffer.length() - 4, sqlBuffer.length() - 1);
        }
        if (!CollectionUtil.isEmpty(orderList)) {
            for (String order : orderList) {
                sqlBuffer.append(order);
            }
            sqlBuffer.delete(sqlBuffer.length() - 1, sqlBuffer.length());
        }
        return sqlBuffer.toString();
    }
    public String selectData(String tabelName) {
        setTableName(tabelName);
@ -182,6 +223,8 @@ public class SqlCreator {
        return sqlBuffer.toString();
    }
    public String updateDataByTableKey(String tabelName, JsonNode jsonNode) {
        setTableName(tabelName);

+ 2 - 0
pom.xml

@ -16,6 +16,7 @@
    <description>EHR library parent pom</description>
    <modules>
        <module>ehr-cloud-parent</module>
        <module>commons-ehr-constants</module>
        <module>commons-ui-swagger</module>
        <module>commons-util</module>
@ -34,5 +35,6 @@
        <module>commons-metrics</module>
        <module>commons-entity</module>
        <module>commons-cat</module>
        <module>hos-web-framework</module>
    </modules>
</project>