cn.com.sinosoft.cimp.portal.ws.PublicSearchService.java Source code

Java tutorial

Introduction

Here is the source code for cn.com.sinosoft.cimp.portal.ws.PublicSearchService.java

Source

package cn.com.sinosoft.cimp.portal.ws;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.lang.StringEscapeUtils;
import org.hibernate.type.StringType;
import org.hibernate.type.Type;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import cn.com.sinosoft.cimp.common.util.SqlUtil;
import cn.com.sinosoft.cimp.common.util.StrUtils;
import cn.com.sinosoft.cimp.core.service.SimpleServiceImpl;
import cn.com.sinosoft.cimp.core.service.model.PageParam;
import cn.com.sinosoft.cimp.core.service.model.PagingResult;
import cn.com.sinosoft.cimp.core.service.model.PagingSrcSql;

/**
 * 
 * @ClassName: PublicSearchService 
 * @Description: 
 * @author ZhangPan
 * @date 2015-9-10 ?10:23:27
 */
@Service
public class PublicSearchService extends SimpleServiceImpl {

    public static Map<String, String[][]> INFOS = new HashMap<String, String[][]>();

    private static Properties TYPE_PROPER;

    private static String[] SEARCH_LIKE;

    static {
        //??
        String[] SHOW_G1 = new String[] { "FOODNAME", "DECLAREUNIT", "DATE_ACCEPTED", "DATE_REVIEW", "REVIEWRESULT",
                "DATE_DATA_ACCESS" };
        String[] SHOW_G2 = new String[] { "COMP_NAME", "REG_ADDR", "BUS_ADDR", "OCODE", "PRINCIPAL",
                "DATE_DATA_ACCESS" };
        String[] SHOW_G3 = new String[] { "COMP_NAME", "REG_ADDR", "BUS_ADDR", "OCODE", "PRINCIPAL",
                "HEALTH_LICENSE", "LICENSEEND", "LICENSESTART", "DATE_DATA_ACCESS" };
        String[] SHOW_G4 = new String[] { "COMP_NAME", "REG_ADDR", "BUS_ADDR", "OCODE", "PRINCIPAL", "RECORD_DATE",
                "CLOSED_DATE", "DATE_DATA_ACCESS" };

        //PUNISHED_DESC   FACT_DESC ?
        //?
        String[] SEARCH_G1 = new String[] { "FOODNAME", "DECLAREUNIT" };
        String[] SEARCH_G2 = new String[] { "COMP_NAME", "HEALTH_LICENSE", "BUS_ADDR" };
        String[] SEARCH_G3 = new String[] { "COMP_NAME", "BUS_ADDR", "CLOSED_DATE", "RECORD_DATE" };

        //??
        SEARCH_LIKE = new String[] { "DOCTOR_NAME", "DOCTOR_UNITNAME", "NURSE_NAME", "NURSE_UNITNAME", "NAME",
                "FOODNAME", "DECLAREUNIT", "COMP_NAME", "BUS_ADDR" };

        INFOS.put("0101000000",
                new String[][] { { "CIMP_ST_DOCTOR" },
                        { "DOCTOR_NAME", "DOCTOR_SEX", "PARCTICE_LEVEL", "PARCTICE_SORT", "DOCTOR_UNITNAME",
                                "DOCTOR_WORK_CODE", "DATE_DATA_ACCESS" },
                        { "DOCTOR_NAME", "DOCTOR_SEX", "PARCTICE_SORT", "DOCTOR_UNITNAME" } });//?
        INFOS.put("0102000000",
                new String[][] { { "CIMP_ST_NURSE" },
                        { "NURSE_NAME", "NURSE_SEX", "NURSE_UNITNAME", "NURSE_CERT_CODE", "DATE_DATA_ACCESS" },
                        { "NURSE_NAME", "NURSE_SEX", "NURSE_UNITNAME" } });//?

        INFOS.put("0103000000", new String[][] { { "PER_ST_DISINFECTANT" }, SHOW_G1, SEARCH_G1 });//????
        INFOS.put("0104000000", new String[][] { { "PER_ST_WATER" }, SHOW_G1, SEARCH_G1 });//??????
        INFOS.put("0105000000", new String[][] { { "CIMP_ST_FOOD_LICENSE" }, SHOW_G1, SEARCH_G1 });//??????
        INFOS.put("0106000000", new String[][] { { "CIMP_ST_FOOD_LICENSE" }, SHOW_G1, SEARCH_G1 });//?????

        INFOS.put("0110000000", new String[][] { { "CIMP_ST_DISINFECTANT" }, SHOW_G2, SEARCH_G2 });//????
        INFOS.put("0107000000", new String[][] { { "CIMP_ST_PUBLICPLACES" }, SHOW_G3, SEARCH_G2 });//???
        INFOS.put("0109000000", new String[][] { { "CIMP_ST_DISINFECTANT" }, SHOW_G3, SEARCH_G2 });//????      
        INFOS.put("0108000000", new String[][] { { "CIMP_ST_WATER" }, SHOW_G3, SEARCH_G2 });//?????

        INFOS.put("0111000000", new String[][] { { "CIMP_ST_WATER" }, SHOW_G2, SEARCH_G3 });//??????
        INFOS.put("0121000000", new String[][] { { "CIMP_ST_RADIATION" }, SHOW_G2, SEARCH_G3 });//???
        INFOS.put("0120000000", new String[][] { { "CIMP_ST_OCC_SERVICES" }, SHOW_G2, SEARCH_G3 });//????

        /**/
        /*INFOS.put("0201010000", new String[][]{{"CIMP_ST_DISCIPLINE"}, SHOW_G4, SEARCH_G3});
        INFOS.put("0202020000", new String[][]{{"CIMP_ST_DISCIPLINE"}, SHOW_G4, SEARCH_G3});
        INFOS.put("0208070000", new String[][]{{"CIMP_ST_DISCIPLINE"}, SHOW_G4, SEARCH_G3});
        INFOS.put("0203050000", new String[][]{{"CIMP_ST_DISCIPLINE"}, SHOW_G4, SEARCH_G3});
        INFOS.put("0204030000", new String[][]{{"CIMP_ST_DISCIPLINE"}, SHOW_G4, SEARCH_G3});
        INFOS.put("0205040000", new String[][]{{"CIMP_ST_DISCIPLINE"}, SHOW_G4, SEARCH_G3});
        INFOS.put("0206080000", new String[][]{{"CIMP_ST_DISCIPLINE"}, SHOW_G4, SEARCH_G3});
        INFOS.put("0207020000", new String[][]{{"CIMP_ST_DISCIPLINE"}, SHOW_G4, SEARCH_G3});*/

        //
        /*INFOS.put("0401000000", new String[][]{{"CIMP_ST_EX_DONATE_BLOOD"},
        {"NAME", "SEX", "DATE_BIRTH", "DATE_BLOOD", "TYPE_BLOOD", "QUANTITY_BLOOD", "DATE_DATA_ACCESS"},
        {"NAME", "SEX"}
        });*/

    }

    /**
     * ??
     * 
     * @param type
     * @param pageParam
     * @return
     * @author <a href="mailto:nytclizy@gmail.com">?</a>
     */
    @Cacheable(value = "cimpdata")
    public PagingResult getPubsearchInfos(String type, Map<String, String> params, PageParam pageParam,
            boolean isSearchPunish) {
        if (null == TYPE_PROPER) {
            TYPE_PROPER = new Properties();
            try {
                //            InputStream is = getClass().getClassLoader().getResourceAsStream("searchType.properties");
                TYPE_PROPER.load(new InputStreamReader(
                        getClass().getClassLoader().getResourceAsStream("searchType.properties"), "UTF-8"));

                //            TYPE_PROPER.load(is);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        List<String> simpleSearch = new ArrayList<String>() {
            {
                add("0101000000");
                add("0102000000");
                add("0107000000");
                add("0109000000");
                add("0108000000");
                add("0120000000");
                add("0121000000");
                add("0401000000");
                add("0110000000");
            }//?;?;???;????;?????
             //???;????;
        };
        List<String> foodSearch = new ArrayList<String>() {
            {
                add("0103000000");
                add("0104000000");
                add("0105000000");
                add("0106000000");
            }//???;?????;??????;?????

        };
        List<String> discipline = new ArrayList<String>() {
            {
                add("0201010000");
                add("0202020000");
                add("0208070000");
                add("0203050000");
                add("0204030000");
                add("0205040000");
                add("0206080000");
                add("0207020000");
            }
        };
        if ("0111000000".equals(type)) {//??????
            return getSeWarterInfos(type, params, pageParam);
        } else if (foodSearch.contains(type)) {//?
            return getFoodSearchInfos(type, TYPE_PROPER.getProperty("food_" + type), params, pageParam);
        } else if (simpleSearch.contains(type)) {//?
            return getSimplePubsearchInfos(type, params, pageParam);
        } else if (discipline.contains(type)) {//?
            return getDisciplineSearchInfos(type, TYPE_PROPER.getProperty("dicipline_" + type), params, pageParam,
                    isSearchPunish);
        }
        return null;
    }

    /**
     * 
     * 
     * @Method: getSeWarterInfos
     * @Method Description: ??????
     * @Input parameters:@param type
     * @Input parameters:@param params
     * @Input parameters:@param pageParam
     * @Input parameters:@return     
     * @Return parameters:PagingResult
     * @Auther:ZhangPan
     * @Date: 2015-9-29 ?6:38:14
     * @Throws: exception  
     *
     */
    public PagingResult getSeWarterInfos(String type, Map<String, String> params, PageParam pageParam) {
        PagingSrcSql srcSql = new PagingSrcSql();
        StringBuffer sqlb = new StringBuffer();
        List<Object> values = new ArrayList<Object>();
        List<Type> types = new ArrayList<Type>();

        sqlb.append(" SELECT " + getFieldNamesByType(type) + " FROM " + getTabNameByType(type) + " WHERE 1=1 ");

        //????
        /*sqlb.append(" AND STATE_RELEASE = ? AND STATE_VALID = ? ");
        values.add(APP.CIMP_DATAPUBSTATE_ENABLE);
        values.add(APP.CIMP_DATASTATE_ENABLE);
        types.add(StringType.INSTANCE);
        types.add(StringType.INSTANCE);*/
        //??????
        sqlb.append(" and COMP_TYPE LIKE '0203%'");

        //?
        handleSearchParams(type, params, sqlb, values, types);

        //?
        for (String key : params.keySet()) {
            if (!StrUtils.isNull(params.get(key))) {
                //
                if (key.equals("RECORD_DATE")//
                        || key.equals("CLOSED_DATE")//
                ) {
                    continue;
                }

                if (key.endsWith("_BEGIN")) {
                    sqlb.append(" AND " + SqlUtil.toDate(params.get(key), 1, 0) + " <= "
                            + key.substring(0, key.length() - 6));
                } else if (key.endsWith("_END")) {
                    sqlb.append(" AND " + SqlUtil.toDate(params.get(key), 1, 0) + " >= "
                            + key.substring(0, key.length() - 4));
                } else if (key.endsWith("DATE")) {
                    sqlb.append(" AND " + SqlUtil.toChar(key, 0, 0) + " = ? ");
                    values.add(params.get(key));
                    types.add(StringType.INSTANCE);
                }
            }
        }

        srcSql.setSrcSql(sqlb.toString());
        srcSql.setTypes(types.toArray(new Type[0]));
        srcSql.setValues(values.toArray());
        return pagingSearch(pageParam, srcSql);
    }

    /**
     * 
     * 
     * @Method: getDisciplineSearchInfos
     * @Method Description: ?
     * @Input parameters:@param type
     * @Input parameters:@param  specialtyPrimary ???
     * @Input parameters:@param params
     * @Input parameters:@param pageParam
     * @Input parameters:@return     
     * @Return parameters:PagingResult
     * @Auther:ZhangPan
     * @Date: 2015-9-29 ?6:15:54
     * @Throws: exception  
     *
     */
    public PagingResult getDisciplineSearchInfos(String type, String specialtyPrimary, Map<String, String> params,
            PageParam pageParam, boolean isSearchPunish) {
        PagingSrcSql srcSql = new PagingSrcSql();
        StringBuffer sqlb = new StringBuffer();
        List<Object> values = new ArrayList<Object>();
        List<Type> types = new ArrayList<Type>();

        sqlb.append(" SELECT " + getFieldNamesByType(type));
        if (isSearchPunish) {
            // sqlb.append(", getpunished(DIS_ID) PUNISHED_DESC, getillegal(DIS_ID) FACT_DESC ");
        }
        sqlb.append(" , UUID, CREATE_TIME FROM CIMP_ST_DISCIPLINE WHERE 1=1 ");

        //????
        /*sqlb.append(" AND STATE_RELEASE = ? AND STATE_VALID = ? ");
        values.add(APP.CIMP_DATAPUBSTATE_ENABLE);
        values.add(APP.CIMP_DATASTATE_ENABLE);
        types.add(StringType.INSTANCE);
        types.add(StringType.INSTANCE);*/
        //???
        sqlb.append(" and SPECIALTY_PRIMARY like ?");
        types.add(StringType.INSTANCE);
        values.add(specialtyPrimary + "%");

        //?
        handleSearchParams(type, params, sqlb, values, types);

        //?
        for (String key : params.keySet()) {
            if (!StrUtils.isNull(params.get(key))) {
                if (key.endsWith("_BEGIN")) {
                    sqlb.append(" AND " + SqlUtil.toDate(params.get(key), 1, 0) + " <= "
                            + key.substring(0, key.length() - 6));
                } else if (key.endsWith("_END")) {
                    sqlb.append(" AND " + SqlUtil.toDate(params.get(key), 1, 0) + " >= "
                            + key.substring(0, key.length() - 4));
                } else if (key.endsWith("DATE")) {
                    sqlb.append(" AND " + SqlUtil.toChar(key, 0, 0) + " = ? ");
                    values.add(params.get(key));
                    types.add(StringType.INSTANCE);
                }
            }
        }

        srcSql.setSrcSql(sqlb.toString());
        srcSql.setTypes(types.toArray(new Type[0]));
        srcSql.setValues(values.toArray());
        return pagingSearch(pageParam, srcSql);
    }

    /**
     * 
     * 
     * @Method: getFoodSearchInfos
     * @Method Description: ???
     * @Input parameters:@param type
     * @Input parameters:@param produceType
     * @Input parameters:@param params
     * @Input parameters:@param pageParam
     * @Input parameters:@return     
     * @Return parameters:PagingResult
     * @Auther:ZhangPan
     * @Date: 2015-9-29 ?10:39:22
     * @Throws: exception  
     *
     */
    private PagingResult getFoodSearchInfos(String type, String produceType, Map<String, String> params,
            PageParam pageParam) {
        PagingSrcSql srcSql = new PagingSrcSql();
        StringBuffer sqlb = new StringBuffer();
        List<Object> values = new ArrayList<Object>();
        List<Type> types = new ArrayList<Type>();

        sqlb.append(" SELECT " + getFieldNamesByType(type) + " FROM " + getTabNameByType(type) + " WHERE 1=1 ");

        //????
        /*sqlb.append(" AND STATE_RELEASE = ? AND STATE_VALID = ? ");
        values.add(APP.CIMP_DATAPUBSTATE_ENABLE);
        values.add(APP.CIMP_DATASTATE_ENABLE);
        types.add(StringType.INSTANCE);
        types.add(StringType.INSTANCE);*/
        //?
        sqlb.append(" and PRODUCT_TYPE = ?");
        types.add(StringType.INSTANCE);
        values.add(produceType);

        //?
        handleSearchParams(type, params, sqlb, values, types);

        //?
        for (String key : params.keySet()) {
            if (!StrUtils.isNull(params.get(key))) {
                if (key.endsWith("_BEGIN")) {
                    sqlb.append(" AND " + SqlUtil.toDate(params.get(key), 1, 0) + " <= "
                            + key.substring(0, key.length() - 6));
                } else if (key.endsWith("_END")) {
                    sqlb.append(" AND " + SqlUtil.toDate(params.get(key), 1, 0) + " >= "
                            + key.substring(0, key.length() - 4));
                } else if (key.endsWith("DATE")) {
                    sqlb.append(" AND " + SqlUtil.toChar(key, 0, 0) + " = ? ");
                    values.add(params.get(key));
                    types.add(StringType.INSTANCE);
                }
            }
        }

        srcSql.setSrcSql(sqlb.toString());
        srcSql.setTypes(types.toArray(new Type[0]));
        srcSql.setValues(values.toArray());
        return pagingSearch(pageParam, srcSql);
    }

    /**
     * 
     * 
     * @Method: getSimplePubsearchInfos
     * @Method Description: ?
     * @Input parameters:@param type
     * @Input parameters:@param params
     * @Input parameters:@param pageParam
     * @Input parameters:@return     
     * @Return parameters:PagingResult
     * @Auther:ZhangPan
     * @Date: 2015-9-28 ?3:29:28
     * @Throws: exception  
     *
     */
    private PagingResult getSimplePubsearchInfos(String type, Map<String, String> params, PageParam pageParam) {
        PagingSrcSql srcSql = new PagingSrcSql();
        StringBuffer sqlb = new StringBuffer();
        List<Object> values = new ArrayList<Object>();
        List<Type> types = new ArrayList<Type>();

        sqlb.append(" SELECT " + getFieldNamesByType(type) + " FROM " + getTabNameByType(type) + " WHERE 1=1 ");

        //????
        /*sqlb.append(" AND STATE_RELEASE = ? AND STATE_VALID = ? ");
        values.add(APP.CIMP_DATAPUBSTATE_ENABLE);
        values.add(APP.CIMP_DATASTATE_ENABLE);
        types.add(StringType.INSTANCE);
        types.add(StringType.INSTANCE);*/

        //?
        handleSearchParams(type, params, sqlb, values, types);

        //?
        for (String key : params.keySet()) {

            if (!StrUtils.isNull(params.get(key))) {
                if (key.equals("LICENSEEND_END")) {
                    sqlb.append(" AND LICENSEEND <= ? ");
                    values.add(params.get(key));
                    types.add(StringType.INSTANCE);
                    continue;
                }
                if (key.equals("LICENSESTART_BEGIN")) {
                    sqlb.append(" AND LICENSESTART >= ? ");
                    values.add(params.get(key));
                    types.add(StringType.INSTANCE);
                    continue;
                }
                if (key.endsWith("_BEGIN")) {
                    sqlb.append(" AND " + SqlUtil.toDate(params.get(key), 1, 0) + " <= "
                            + key.substring(0, key.length() - 6));
                } else if (key.endsWith("_END")) {
                    sqlb.append(" AND " + SqlUtil.toDate(params.get(key), 1, 0) + " >= "
                            + key.substring(0, key.length() - 4));
                } else if (key.endsWith("DATE")) {
                    sqlb.append(" AND " + SqlUtil.toChar(key, 0, 0) + " = ? ");
                    values.add(params.get(key));
                    types.add(StringType.INSTANCE);
                }
            }
        }

        srcSql.setSrcSql(sqlb.toString());
        srcSql.setTypes(types.toArray(new Type[0]));
        srcSql.setValues(values.toArray());
        return pagingSearch(pageParam, srcSql);
    }

    /**
     * ??,
     *
     * 
     * @param params
     * @param sql
     * @param values
     * @param types
     * @author <a href="mailto:nytclizy@gmail.com">?</a>
     */
    private void handleSearchParams(String type, Map<String, String> params, StringBuffer sql, List<Object> values,
            List<Type> types) {
        String[] paramFields = INFOS.get(type)[2];
        for (String paramField : paramFields) {
            if (!StrUtils.isNull(params.get(paramField))) {

                //?paramField
                paramField = StringEscapeUtils.escapeSql(paramField);

                if (isLikeField(paramField)) {
                    sql.append(" AND " + paramField + " like ? ");
                    values.add(params.get(paramField) + "%");
                } else {
                    sql.append(" AND " + paramField + " = ? ");
                    values.add(params.get(paramField));
                }

                types.add(StringType.INSTANCE);
            }
        }
    }

    /**
     * ??like
     *
     * 
     * @param paramField
     * @return
     * @author <a href="mailto:nytclizy@gmail.com">?</a>
     */
    private boolean isLikeField(String paramField) {
        if (StrUtils.isNull(paramField)) {
            return false;
        }
        for (String likeParam : SEARCH_LIKE) {
            if (likeParam.equals(paramField)) {
                return true;
            }
        }
        return false;
    }

    /**
     * ????
     *
     * 
     * @param type
     * @return
     * @author <a href="mailto:nytclizy@gmail.com">?</a>
     */
    private String getTabNameByType(String type) {
        return INFOS.get(type)[0][0];
    }

    /**
     * ????
     *
     * 
     * @param type
     * @return
     * @author <a href="mailto:nytclizy@gmail.com">?</a>
     */
    private String getFieldNamesByType(String type) {
        String ret = " ";
        String[] fieldNames = INFOS.get(type)[1];
        for (String fieldName : fieldNames) {
            ret += fieldName + ",";
        }
        if (ret.endsWith(",")) {
            ret = ret.substring(0, ret.length() - 1);
        }
        return ret;
    }
}