/**
 * @file_name : CommonUtils.java
 * @author :
 * @date   : 2018年3月15日
 * Description:
 */
package cn.xxx.utils;

import cn.xxx.coreutils.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.security.SecureRandom;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * file_name : CommonUtils.java
 * author :
 * date : 2018年3月15日
 * description :
 */
public class CommonUtils {

    private static Logger logger = LoggerFactory.getLogger(CommonUtils.class);
    /**用于id号   id=时间毫秒数+n位流水号*/
    private static long serial_number = 0;
    /**用于id号   id=时间毫秒数+n位流水号*/
    private static long SERIAL_NUMBER_FOR_TRANNO = 0;

    /**用于交易号  中的流水号 n位流水号*/
    private static long TRANSNO_SERIAL_NUMBER = 0;

    /**id附加流水号长度   id=时间毫秒数+n位流水号 */
    private static final int SIZE_OF_ECNO_SERIAL_NUMBER = 5;
    /**ESB接口全局交易流水号 tranno=yyyyMMddHHmmssSSS+6位流水号*/
    private static final int SIZE_OF_TRANNO_SERIAL_NUMBER = 6;

    // 当前进程PID
    public static final int PID = getProcessID();

    public static boolean stringIsNotNull(String param){
        boolean flag=StringUtils.isNotBlank(param);
        if (flag) {
            if ("null".equals(param)) {
                flag=false;
            }
        }
        return flag;
    }

    public static boolean stringIsNull(String param){
        return !stringIsNotNull(param);
    }

    /**
     * @Description: 判断是否不为空, 如果是 ""," ","null",null 则返回false
     * @param: orignalValue 需要判断的值
     * @return: boolean
     */
    public static boolean isNotBlank(Object... obj) {
        return !isBlank(obj);
    }

    /**
     * @Description: 判断数组对象是否为空值 , 如果是 ""," ","null",null 则返回true, 对于Collection.size<1也空
     * @param: orignalValue 需要判断的值
     * @return: boolean
     */
    public static boolean isBlank(Object... objArr) {
        if(objArr==null)
            return true;
        for (Object obj : objArr) {
            if(obj==null){
                return true;
            }else if("".equals(obj.toString().trim())){
                return true;
            }else if("null".equalsIgnoreCase(obj.toString().trim())){
                return true;
            }else if(obj instanceof Collection){
                Collection objCollection=(Collection)obj;
                if(objCollection==null||objCollection.size()<1){
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 获取UUID
     * @return
     */
    public static String getUUID(){
        return UUID.randomUUID().toString();
    }

    /**
     * 方法名称: getTran<br>
     *
     * @Description:调用ESB获取全局流水号和交易时间
     * @author
     *
     * @return
     */
    public static synchronized String[] getTran() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");// 设置日期格式
        SimpleDateFormat df2 = new SimpleDateFormat("yyyyMMddHHmmssSSS");// 交易流水号时间格式
        Date date = getDate();
        String[] id = new String[] { "", "" };
        id[0] = String.valueOf(df.format(date));
        id[1] = String.valueOf(df2.format(date));
        SERIAL_NUMBER_FOR_TRANNO++;
        if (SERIAL_NUMBER_FOR_TRANNO >= (SIZE_OF_TRANNO_SERIAL_NUMBER - 1) * 10)// 超过长度,复位
            SERIAL_NUMBER_FOR_TRANNO = 0;

        String serialNumber = getEnoughLengthString(
                String.valueOf(SERIAL_NUMBER_FOR_TRANNO),
                SIZE_OF_TRANNO_SERIAL_NUMBER);
        id[1] = id[1] + serialNumber;
        return id;
    }

    /**
     * 获取当前时间
     * @return date 当前时间
     */
    public static Date getDate(){
        return new Date();
    }

    /**
     * 获取指定长度的字符串,不足左补零,超出位数,取倒数的足够位数
     *
     * @param string
     *            字符串
     * @param length
     *            指定长度
     * @return string 字符串
     */
    public static String getEnoughLengthString(String string, int length) {
        if (string == null)
            return "";

        int strLength = string.trim().length();// 字符串长度

        // 需要补零的个数
        int theNumberOfZeroCreated = length - strLength;

        if (theNumberOfZeroCreated < 0) {// 超出,去倒数足够位数
            string = string.substring(strLength - length);
        } else {// 左补零
            for (int i = 0; i < theNumberOfZeroCreated; i++) {
                string = "0" + string;
            }
        }
        return string;
    }

    /**
     * 方法名称: getWebProjectPath<br>
     *
     * @Description:获取web下的绝对文件路径 @authormxl 修改日期:2013-2-21下午03:39:52
     *
     * @param dir
     * @return
     */
    public static String getWebProjectPath(String dir) {
        String path = CommonUtils.class.getClassLoader().getResource("/").getPath() + dir;
        path = path.replaceAll("/target/classes", "/src/main/webapp").replaceAll("%20", " ");
        path = path.replaceAll("/WEB-INF/classes", "").replaceAll("%20", " ");
        return path;
    }

    /**
     *
     * @Title: getIpAddr
     * @Description: 根据HttpServletRequest获取用户IP地址
     * @param request
     * @return IP
     * @author
     * 修改时间: 2013-8-12 下午01:58:24
     * 修改内容:新建
     */
    public static String getIpAddr(HttpServletRequest request){
        String ip = request.getHeader("x-forwarded-for");
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
            ip = request.getHeader("Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;

    }

    /**
     * 过滤跨站脚本关键字
     *
     * @param str
     * 需要过滤的字符串
     * @return 过滤后的字符串
     */
    public static String filterStr(String str){
        if(str==null)
            return "";
        str=str.replaceAll("<","");
        str=str.replaceAll(">","");
        str=str.replaceAll("'","");
        str=str.replaceAll("&","&");
        str=str.replaceAll("#","#");
        str=str.replaceAll("%","%");
        str=str.replaceAll("\"","");
        return str;
    }

    /**
     * 方法名称: getParameter<br>
     * 描述:获取参数,如果为空,返回""
     * 作者: Administrator
     * 修改日期:2013-3-28下午07:08:22
     * @param request
     * @param key
     * @return
     */
    public static String getParameter(HttpServletRequest request,String key){
        Object value = request.getParameter(key);
        return value==null?"":value.toString();

    }

    /**
     * 根据身份证号获取生日
     * @param IDNo 身份证号
     * @return 返回生日 yyyy-MM-dd
     * @throws Exception
     * @throws Exception
     */
    public static String getBirthdayByIDNo(String IDNo) throws Exception{
        String birthday = "";

        if(IDNo==null||"".equals(IDNo))
            return "";

        if(IDNo.length()==18){//18位身份证号提取出生日期
            String birthday18 = IDNo.substring(6,14);
            birthday = birthday18.substring(0,4)+"-"+birthday18.substring(4,6)+"-"+birthday18.subSequence(6,8);
            System.out.println("18位身份证号的出生日期:"+birthday18);
        }else if(IDNo.length()==15){//15位身份证号提取出生日期
            String birthday15 = IDNo.substring(6,12);
            birthday = "19"+birthday15.substring(0,2)+"-"+birthday15.substring(2,4)+"-"+birthday15.substring(4,6);
            System.out.println("15位身份证号的出生日期:"+birthday15);
        }else {
            throw new Exception("输入的身份证号不是15位也不是18位,请查证!");
        }

        return birthday;
    }

    /**
     *  获取指定长度的字符串,不足左补零,超出位数,取倒数的足够位数
     * @param serialNoLong 字符串
     * @param length 指定长度
     * @return string 字符串
     */
    public static String getEnoughLengthString(long serialNoLong,int length){
        String str0 = (10*length +"").substring(1);
        NumberFormat nf = new DecimalFormat(str0);

        String result = nf.format(serialNoLong);

        return result;
    }

/*

    */
/**
     * 获取指定长度的字符串,不足左补零,超出位数,取倒数的足够位数
     *
     * @param string
     *            字符串
     * @param length
     *            指定长度
     * @return string 字符串
     *//*

    public static String getEnoughLengthString(String string, int length) {
        if (string == null)
            return "";

        int strLength = string.trim().length();// 字符串长度

        // 需要补零的个数
        int theNumberOfZeroCreated = length - strLength;

        if (theNumberOfZeroCreated < 0) {// 超出,去倒数足够位数
            string = string.substring(strLength - length);
        } else {// 左补零
            for (int i = 0; i < theNumberOfZeroCreated; i++) {
                string = "0" + string;
            }
        }
        return string;
    }

*/

    /**
     * 判断是否为空, 如果是 ""," ","null",null 则返回true
     * @param orignalValue 需要判断的值
     * @return boolean
     */
    public static boolean isEmpty(Object orignalValue) {
        return isBlank(orignalValue);
    }

    /**
     * 判断是否不为空, 如果是 ""," ","null",null 则返回false
     * @param obj 需要判断的值
     * @return boolean
     */
    public static boolean isNotEmpty(Object obj) {
        return isNotBlank(obj);
    }

    /**
     * 转换为 string 类型,如果为空("",null,"null")返回 ""
     * @param obj
     * @return 返回字符串
     */
    public static String filterToStr(Object obj) {
        return isBlank(obj)?"":obj.toString().trim();
    }

    /**
     * 转换成保留两位的  金额
     * @param num 金额
     * @return 保留两位的金额
     */
    public static String formatToMoney(String num){
        String result = "";
        if(isBlank(num))
            return result;
        Double value = null;
        try{
            value = Double.parseDouble(num);
        }catch(Exception e){
            logger.error("金额(该金额为:"+num+")转换为保留两位有效数据    过程出错",e);
            value = null;
        }

        return formatToMoney(value);
    }

    /**
     * 转换成保留两位的  金额
     * @param num 金额
     * @return 保留两位的金额
     */
    public static String formatToMoney(Double num){
        String result = "";
        if(isBlank(num))
            return result;

        DecimalFormat df=new DecimalFormat("##0.00");
        result = df.format(num);

        return result;
    }

    /**
     * 生成验证码
     */
    public static String getCheckCode(){
        SecureRandom random = new SecureRandom();
        String sRand = "";
        for (int i = 0; i < 4; i++){
            String rand = "";
            int x = random.nextInt(10);
            rand = rand+x;
            sRand += rand;
        }
        return sRand;
    }

    /**
     *
     * @param date 需要计算的日期
     * @param field the calendar field. eg. Calendar.YEAR(年),Calendar.MONTH(月),Calendar.DATE(天)
     * @param amount the amount of date or time to be added to the field.需要添加(+10)或者减少(-10)的数量
     * @return date
     */
    public static Date computeDate(Date date,int field, int amount){
        if(date==null){
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(field,amount);

        return calendar.getTime();
    }

    /**
     * 将数字从一位小数变为String型的两位小数
     * @param dnumber 一位小数
     * @return String 两位小数
     */
    public static String decimalFormat(double dnumber){
        //将用户购买金额进行显示的转换,页面需要小数点两位。
        DecimalFormat df = new DecimalFormat( "########.00 ");
        String dff = df.format(dnumber);
        return dff;
    }

    /**
     *
     * 描述:生成唯一id号  id=时间毫秒数+5位流水号
     * @author lihengjun
     * 修改日期:2012-8-15下午03:29:04
     * @return 唯一id号
     */
    public static synchronized String getUniqueId(){
        String id =  String.valueOf(System.currentTimeMillis()) ;
        serial_number++;
        if(serial_number>=(SIZE_OF_ECNO_SERIAL_NUMBER-1)*10)//超过长度,复位
            serial_number=0;

        String serialNumber = getEnoughLengthString(serial_number,SIZE_OF_ECNO_SERIAL_NUMBER);
        id = id+serialNumber;
        return id;
    }

    /**
     *
     * 描述:通过出生日期获取年龄
     * @author
     * 修改日期:2012-8-9下午01:38:53
     * @param birthday 出生日期
     * @return 当前年龄
     */
    public static int getAge(String birthday){
        Date birth = null;
        birth = cn.xxx.coreutils.DateUtil.convertStringToDate(birthday, cn.xxx.coreutils.DateUtil.YYYY_MM_DD);
        return getAge(birth);
    }

    /**
     *
     * 描述:通过出生日期获取年龄
     * @author
     * 修改日期:2012-8-9下午01:38:53
     * @param birthday 出生日期
     * @return 当前年龄
     */
    public static int getAge(Date birthday){
        Calendar cal = Calendar.getInstance();
        int yearNow = cal.get(Calendar.YEAR);
        int monthNow = cal.get(Calendar.MONTH);
        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
        cal.setTime(birthday);
        int yearBirth = cal.get(Calendar.YEAR);
        int monthBirth = cal.get(Calendar.MONTH);
        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
        int age = yearNow - yearBirth;
        if (monthNow <= monthBirth) {
            if (monthNow == monthBirth) {
                if (dayOfMonthNow < dayOfMonthBirth) {
                    age--;
                }
            } else {
                age--;
            }
        }
        return age;
    }

    /**
     * 方法名称: getPeriodByChina<br>
     * 描述:根据保险期间编码转换为中文性别描述
     * 作者: mxl
     * 修改日期:2013-2-21下午03:00:11
     * @param period
     * @return
     */
    public static String getPeriodByChina(String period){
        if(period!=null){
            String lastStr = period.substring(period.length()-1,period.length());
            if("D".equals(lastStr)){
                period = period.substring(0,period.length()-1)+"天";
            }else if("M".equals(lastStr)){
                period = period.substring(0,period.length()-1)+"月";
            }else if("Y".equals(lastStr)){
                period = period.substring(0,period.length()-1)+"年";
            }else if("O".equals(lastStr)){
                period = "至"+period.substring(0,period.length()-3)+"周岁";
            }
        }
        return period;
    }

    /**
     * 方法名称: checkIsAdult<br>
     * 描述:根据生日判断是否是成年人
     * 作者:
     * 修改日期:2013-2-25上午11:28:22
     * @param birthday
     * @return
     */
    public static boolean checkIsAdult(String birthday) {
        boolean result = false;

        Date birthdayDate = cn.xxx.coreutils.DateUtil.convertStringToDate(birthday, cn.xxx.coreutils.DateUtil.YYYY_MM_DD);

        Calendar birthDate = Calendar.getInstance();
        birthDate.setTime(birthdayDate);

        Calendar today = Calendar.getInstance();//18年以前的今天
        today.setTime(new Date());
        today.add(Calendar.YEAR, -18);//

        if (birthDate.getTime().getTime()<today.getTime().getTime()) {
            result = true;
        }

        return result;
    }

    /**
     * 计算日期(包含临界值)
     * @param targetDate
     * @param format
     * @param dateNum
     * @param unit
     * @return
     */
    public static String dateAdd(Date targetDate,String format,int dateNum,String unit){
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat(format);
        cal.setTime(targetDate);
        if("Y".equals(unit)){
            cal.add(Calendar.YEAR, dateNum);
        }else if("M".equals(unit)){
            cal.add(Calendar.MONTH, dateNum);
        }else if("D".equals(unit)){
            cal.add(Calendar.DATE, dateNum);
        }
        return df.format(cal.getTime());
    }

    /**
     *
     * @Title: dateAdd
     * @Description: 日期添加指定类型大小
     * @param compare
     * @param sdate
     * @param addNumber
     * @return
     * @author
     * 修改时间: 2014-1-17 上午11:16:53
     * 修改内容:日期添加指定类型大小
     */
    public static String dateAdd(String compare, String sdate,int addNumber)
    {
        Date date  = null;
        SimpleDateFormat df = null;

        if(sdate.indexOf("-")>0)
            df = new SimpleDateFormat("yyyy-MM-dd");
        else
            df = new SimpleDateFormat("yyyy年MM月dd日");

        try{
            date = df.parse(sdate);
        }catch(ParseException pe){
            pe.printStackTrace();
        }

        Calendar cal = null;
        cal=Calendar.getInstance();
        cal.setTime(date);

        if(compare.equalsIgnoreCase("d"))
            cal.add(Calendar.DATE,addNumber);
        if(compare.equalsIgnoreCase("m"))
            cal.add(Calendar.MONTH,addNumber);
        if(compare.equalsIgnoreCase("y"))
            cal.add(Calendar.YEAR,addNumber);

        return df.format(cal.getTime());
    }

    /**
     *
     * @Title: compareDate
     * @Description: 日期比较
     * @param firstDate
     * @param strSecondDate
     * @return
     * @throws RuntimeException
     * @author
     * 修改时间: 2014-1-17 上午11:18:05
     * 修改内容:日期比较
     */
    public static int compareDate(Date firstDate,String strSecondDate)throws RuntimeException{
        Date secondDate=convertStringToDate(strSecondDate);
        return compareDate(firstDate,secondDate);
    }

    /**
     *
     * @Title: compareDate
     * @Description: 如果参数表示的时间等于此 Calendar 表示的时间,则返回 0 值;如果此 Calendar 的时间在参数表示的时间之前,则返回小于 0 的值;如果此 Calendar 的时间在参数表示的时间之后,则返回大于 0 的值。
     * @param firstDate
     * @param secondDate
     * @return
     * @throws RuntimeException
     * @author
     * 修改时间: 2014-1-20 上午09:32:39
     * 修改内容:日期比较
     */
    public static int compareDate(Date firstDate,Date secondDate) throws RuntimeException{
        Calendar calFirst = Calendar.getInstance();
        calFirst.setTime(firstDate);
        Calendar calSecond = Calendar.getInstance();
        calSecond.setTime(secondDate);

        return calFirst.compareTo(calSecond);
    }

    /**
     *
     * @Title: convertStringToDate
     * @Description: 将字符串转换为日期类型
     * @param orignalValue
     * @return
     * @throws RuntimeException
     * @author
     * 修改时间: 2014-1-20 上午09:28:36
     * 修改内容:添加
     */
    public static  Date convertStringToDate(String orignalValue) throws RuntimeException{
        String tempValue=orignalValue;
        try{
            tempValue=tempValue.replaceFirst("年","-");
            tempValue=tempValue.replaceFirst("月","-");
            tempValue=tempValue.replaceFirst("日","");
            tempValue=tempValue.replaceFirst("/","-");
            tempValue=tempValue.replaceFirst("/","-");

            if(tempValue.trim().length()<=10){
                tempValue=tempValue.trim() +" 0:00:00";
            }
            SimpleDateFormat dateFormatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return dateFormatter.parse(tempValue);
        }catch(Exception ex){
            throw new RuntimeException(orignalValue +"不是日期型数据");
        }
    }

    /**
     * 计算日期(不包含临界值)
     * @param targetDate
     * @param format
     * @param dateNum
     * @param unit
     * @return
     */
    public static String dateAddNoCriticality(Date targetDate,String format,int dateNum,String unit){
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat(format);
        cal.setTime(targetDate);
        if("Y".equals(unit)){
            cal.add(Calendar.YEAR, dateNum);
        }else if("M".equals(unit)){
            cal.add(Calendar.MONTH, dateNum);
        }else if("D".equals(unit)){
            cal.add(Calendar.DATE, dateNum);
        }
        cal.add(Calendar.DATE, 1);
        return df.format(cal.getTime());
    }

    /**
     * 方法名称: createHtml<br>
     * 描述:构造HTTP POST交易表单
     * 作者:
     * 修改日期:2013-3-6下午04:22:45
     * @param action 表单提交地址
     * @param hiddens 以MAP形式存储的表单键值
     * @return 构造好的HTTP POST交易表单
     */
    public static String createHtml(String action, Map<String, String> hiddens) {
        StringBuffer sf = new StringBuffer();
        sf.append("<form id = \"sform\" action=\"" + action + "\" method=\"post\">\n");
        if (null != hiddens && 0 != hiddens.size()) {
            Set<Map.Entry<String, String>> set = hiddens.entrySet();
            Iterator<Map.Entry<String, String>> it = set.iterator();
            while (it.hasNext()) {
                Map.Entry<String, String> ey = it.next();
                String key = ey.getKey();
                String value = ey.getValue();
                sf.append("<input type=\"hidden\" name=\"" + key + "\" id=\"" + key + "\" value=\""
                        + value + "\"/>\n");
            }
        }
        //sf.append("<input type='submit' value='支付' />");
        sf.append("</form>\n");
        sf.append("<script type=\"text/javascript\">");
        sf.append("document.getElementById('sform').submit();");
        sf.append("</script>");
        return sf.toString();
    }

    /**
     * 方法名称: coverResultString2Map<br>
     * 描述:分割Form字符串
     * 作者:
     * 修改日期:2013-3-20下午05:27:42
     * @param res
     * @return
     */
    public static Map<String, String> coverResultString2Map(String res) {
        Map<String, String> map = null;
        if (null != res && !"".equals(res.trim())) {
            String[] resArray = res.split("&");
            if (0 != resArray.length) {
                map = new HashMap<String, String>(resArray.length);
                for (String arrayStr : resArray) {
                    if (null == arrayStr || "".equals(arrayStr.trim())) {
                        continue;
                    }
                    int index = arrayStr.indexOf("=");
                    if (-1 == index) {
                        continue;
                    }
                    map.put(arrayStr.substring(0, index), arrayStr.substring(index + 1));
                }
            }
        }
        return map;
    }

    /**
     * 方法名称: getForm<br>
     * 描述:解析组装支付表单字符串
     * 作者:
     * 修改日期:2013-3-6下午04:28:27
     * @param formStr 收费申请接口返回的form字符串
     * @return 拼装的HTML表单代码字符串
     */
    public static String getForm(String formStr){
        String form = "";
        formStr = formStr.replaceAll(" ","");
        String[] str = formStr.split("\\|");
        String action = str[0];
        String[] input = str[1].substring(1,str[1].length()-1).split(",");
        //Map<String, String> hiddens = coverResultString2Map(str[1]);
        Map<String, String> hiddens = new HashMap<String, String>();
        for(int i=0;i<input.length;i++)
        {
            String[] kv = input[i].split("=",2);
            if(kv.length == 1)
            {
                hiddens.put(kv[0],"");
            }
            else
            {
                hiddens.put(kv[0],kv[1]);
            }
        }
        form = createHtml(action,hiddens);

        return form;
    }

    /**
     * 方法名称: getTimeDiff<br>
     * 描述:获取时间差
     * 作者:
     * 修改日期:2013-3-21下午02:52:38
     * @param start
     * @param end
     * @return
     */
    public static String getTimeDiff(Date start,Date end){

        long l = end.getTime() - start.getTime();
        long day = l / (24 * 60 * 60 * 1000);
        long hour = (l / (60 * 60 * 1000) - day * 24);
        long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60);
        long s = (l / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        long ms = (l - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
        String result = day + "天" + hour + "小时" + min + "分" + s + "秒" + ms + "毫秒";
        return result;
    }

    /**
     * 方法名称: judgeUnknowPash<br>
     * 描述:判断地址连接是否含有非法字符
     * 作者:
     * 修改日期:2013-3-25下午05:17:25
     * @param path
     * @return
     */
    public static boolean judgeUnknowPath(String path,String... unknowStrList){
        for(int i=0;i<unknowStrList.length;i++){
            if(path.indexOf(unknowStrList[i])>0){
                return true;
            }
        }
        return false;
    }

    /**
     * 方法名称: getPayUnitPeriod<br>
     * 描述:获取缴费期相关信息
     * 作者:
     * 修改日期:2013-3-27上午10:41:28
     * @param paytype
     * @return
     */
    public static Map<String,String> getPayUnitPeriod(String paytype){
        Map<String,String> result = new HashMap<String,String>();

        if(!"".equals(paytype) && paytype != null){
            if(paytype.contains("ONCE")){
                result.put("unit","Y");
                result.put("period","1");
            }
            else if(paytype.contains("Y")){
                result.put("unit","Y");
                result.put("period",paytype.substring(0,paytype.length()-1));
            }
            else if(paytype.contains("M")){
                result.put("unit","M");
                result.put("period",paytype.substring(0,paytype.length()-1));
            }
            else if(paytype.contains("D")){
                result.put("unit","D");
                result.put("period",paytype.substring(0,paytype.length()-1));
            }
        }
        else{
            result.put("unit","");
            result.put("period","");
        }

        return result;
    }

    /**
     * 方法名称: getIsrUnitPeriod<br>
     * 描述:获取保险期信息
     * 作者:
     * 修改日期:2013-3-27上午10:45:48
     * @param isrperiod
     * @return
     */
    public static Map<String, String> getIsrUnitPeriod(String isrperiod){

        Map<String, String> result = new HashMap<String, String>();

        if(!"".equals(isrperiod) && isrperiod != null){
            if(isrperiod.contains("TYO")){
                result.put("unit","A");
                result.put("period",isrperiod.substring(0,isrperiod.length() - 3));
            }
            else if(isrperiod.contains("Y")){
                result.put("unit","Y");
                result.put("period",isrperiod.substring(0,isrperiod.length() - 1));
            }
            else if(isrperiod.contains("M")){
                result.put("unit","M");
                result.put("period",isrperiod.substring(0,isrperiod.length() - 1));
            }
            else if(isrperiod.contains("D")){
                result.put("unit","D");
                result.put("period",isrperiod.substring(0,isrperiod.length() - 1));
            }
        }
        else{
            result.put("unit","");
            result.put("period","");
        }

        return result;
    }

    /**
     * 方法名称: getPayType<br>
     * 描述:转换交费方式代码
     * 作者:
     * 修改日期:2013-3-27上午10:54:10
     * @param paytype
     * @return
     */
    public static String getPayType(String paytype){
        String result = "";
        if(!"".equals(paytype) && paytype != null){
            if(paytype.contains("ONCE")){
                result = "W";
            }
            else if(paytype.contains("Y")){
                result = "Y";
            }
        }
        return result;
    }

    /**
     *
     * 描述:生成电子商务客户号  ecno=时间毫秒数+5位流水号
     * @author
     * 修改日期:2012-8-15下午03:29:04
     * @return
     */
    public synchronized static String getEcno(){
        String ecno =  String.valueOf(System.currentTimeMillis()) ;
        serial_number++;
        if(serial_number>=(SIZE_OF_ECNO_SERIAL_NUMBER-1)*10)//超过长度,复位
            serial_number=0;

        String serialNumber = getEnoughLengthString(serial_number,SIZE_OF_ECNO_SERIAL_NUMBER);
        ecno = ecno+serialNumber;

        logger.info("jsx本次生成电子商务号:"+ecno);
        return ecno;
    }

    /**
     * 方法名称: getProjectPath<br>
     *
     * @Description:获取路径
     * @author mxl 修改日期:2013-2-21下午03:40:14
     *
     * @param dir
     * @return
     */
    public static String getProjectPath(String dir) {
        String path = CommonUtils.class.getClassLoader().getResource("/")
                .getPath()
                + dir;
        return path;
    }

    /**
     * 方法名称: getFlagKey<br>
     * 描述:生成flagkey
     * 作者:
     * 修改日期:2014年12月24日下午2:44:59
     * @return
     */
    public static String getFlagKey(Date date){
        String s = UUID.randomUUID().toString();
        String id=s.substring(0,8)+s.substring(9,13)+s.substring(14,18)+s.substring(19,23)+s.substring(24);
        String currentDayStr=DateUtil.convertDate(date, "yyyyMMdd");
        String flagkey="'"+currentDayStr+"'"+id+"'";
        return flagkey;
    }

    /**
     * 方法名称: getProcessID<br>
     * 描述:获得当前进程ID(PID)<br>
     * 作者:
     * 修改日期:2015年6月24日下午4:17:04<br>
     */
    public static final int getProcessID() {
        RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
        return Integer.valueOf(runtimeMXBean.getName().split("@")[0]).intValue();
    }

    /**
     * @Auth:dongyue
     * @Date:<br>
     * @Desc:验证手机号格式是否正确
     */
    public static boolean isMobile(String str) {
        Pattern p = null;
        Matcher m = null;
        boolean b = false;
        if(null==str){
            return b;
        }
        p = Pattern.compile("^[1][3,4,5,6,7,8,9][0-9]{9}$"); // 验证手机号
        m = p.matcher(str);
        b = m.matches();
        return b;
    }

}

工具类封装之--CommonUtils的更多相关文章

  1. Redis操作Set工具类封装,Java Redis Set命令封装

    Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...

  2. Redis操作List工具类封装,Java Redis List命令封装

    Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...

  3. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

  4. Redis操作字符串工具类封装,Redis工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...

  5. (转载) 百度地图工具类封装(包括定位,附近、城市、范围poi检索,反地理编码)

    目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 百度地图工具类封装(包括定位,附近.城市.范围poi检索, ...

  6. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战

    笔记 4.Redis工具类封装讲解和实战     简介:高效开发方式 Redis工具类封装讲解和实战         1.常用客户端 https://redisdesktop.com/download ...

  7. flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习

    1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...

  8. 关于TornadoFx和Android的全局配置工具类封装实现及思路解析

    原文地址: 关于TornadoFx和Android的全局配置工具类封装实现及思路解析 - Stars-One的杂货小窝 目前个人开发软件存在设置页面,可以让用户自定义些设置,但我发现,存储数据的代码逻 ...

  9. Android Sqlite 工具类封装

    鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLit ...

随机推荐

  1. 最长连续子序列(dp,分而治之递归)

    5227: 最大子列和问题 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 总提交: 76            测试通过:46 描述 给定KK个整数组 ...

  2. linux上磁盘的操作相关命令

    1.查看磁盘IO负载 - 看哪些进程在读写磁盘 lsof /dev/sda2 |head

  3. 迪杰斯特拉(Dijkstra)算法描述及理解

    Dijkstra算法是一种计算单源最短无负边路径问题的常用算法之一,时间复杂度为O(n2) 算法描述如下:dis[v]表示s到v的距离,pre[v]为v的前驱结点,用以输出路径,vis[v]表示该点最 ...

  4. VisualStudioCode创建的asp.net core控制台程序部署到linux

    1.asp.net core控制台程序 static void Main(string[] args) { ; ) { Console.WriteLine("Hello World!&quo ...

  5. Port Channel and VPC

    1.Port Channel 介绍 Port Channel  简介 绑定多个物理链路(最多8条),到一个单一的逻辑链路,在两个物理设备之间 每个物理端口只能被放入一个port-channel中. 在 ...

  6. tomcat部署公共jar包

    如果每次打war包都要把所有依赖jar放在WEB-INF/lib下,是很傻的做法,war包很大,也浪费内存.参考之前jboss上部署公共jar的经验,tomcat实现起来想来也不困难. 1. 参照ma ...

  7. 前端 CSS 目录

    前端 CSS 介绍 前端 CSS语法 前端 CSS 注释

  8. 来测试下你的Java编程能力

    上篇整理了下后面准备更系统化写的Java编程进阶的思路,如果仅看里面的词,很多同学会觉得都懂,但我真心觉得没有多少人是真懂的,所以简单的想了一些题目,感兴趣的同学们可以来做做看,看看自己的Java编程 ...

  9. linux 几种服务类型

    采集来自于 https://blog.csdn.net/hguisu/article/details/7453390 https://blog.csdn.net/limo120621/article/ ...

  10. HTTP 返回状态代码

    一.HTTP状态码 如果某项请求发送到您的服务器要求显示您网站上的某个网页(例如,用户通过浏览器访问您的网页或 Googlebot 抓取网页时),服务器将会返回 HTTP 状态代码以响应请求. 此状态 ...