package com.shkpr.service.proxycenter.commtools; import com.global.base.component.SnowFlakeEx; import com.global.base.tools.*; import com.shkpr.service.proxycenter.constants.CommDefine; import org.springframework.util.StringUtils; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CommTool { public static final char[] HEX_DIGITS; static { HEX_DIGITS = "0123456789ABCDEF".toCharArray(); } public static String getPlatformByAgent(String strClientType, String strUserAgent){ return getPlatformByAgent(!StringUtils.isEmpty(strClientType)?strClientType:strUserAgent); } public static String getPlatformByAgent(String strUserAgent){ String type = "pc"; if (StringUtils.isEmpty(strUserAgent)) return type; String lowerAgent = strUserAgent.toLowerCase(); if(lowerAgent.contains("android") || lowerAgent.contains("linux")) { type = "apk"; } else if (lowerAgent.contains("iphone") || lowerAgent.contains("ios") || lowerAgent.contains("ipad")){ type = "ios"; } else if (lowerAgent.indexOf("micromessenger") > -1){ type = "wx"; } else if (lowerAgent.indexOf("cs") > -1){ type = "cs"; } else if (lowerAgent.indexOf("windows") > -1){ type = "pc"; } else if (lowerAgent.contains("tri.")){ type = strUserAgent; } return type; } public static boolean isMobilePlatform(String platform){ return ("apk".equals(platform) || "ios".equals(platform) || "wx".equals(platform)); } public static boolean isTheThisFormatMatch(final String strFormatFilter, String strDesData){ if (!StringUtils.isEmpty(strFormatFilter) && !StringUtils.isEmpty(strDesData)) { //正则表达式的模式 Pattern p = Pattern.compile(strFormatFilter); //正则表达式的匹配器 Matcher m = p.matcher(strDesData); //进行正则匹配 return m.matches(); } return false; } public static int listSize(List listSrc){ return (listSrc==null)?0:listSrc.size(); } public static int collectionSize(Collection cc){ return (cc==null)?0:cc.size(); } public static int mapSize(Map mapSrc){ return (mapSrc==null)?0:mapSrc.size(); } public static int lenString(String strSrc) { if (StringUtils.isEmpty(strSrc)) return 0; return strSrc.length(); } public static boolean strBetweenLen(String strSrc, int nMinLen, int nMaxLen){ if (strSrc == null || nMinLen > nMaxLen) return false; return strSrc.length() >= nMinLen && strSrc.length() <= nMaxLen; } public static String genAppApisID(){ return (new StringBuilder("AA")).append(SnowFlakeEx.getInstance().nextHexStrId(2)).toString(); } public static String genApisCaseID(){ return (new StringBuilder("AC")).append(SnowFlakeEx.getInstance().nextHexStrId(2)).toString(); } public static String genNotifyEventID(){ return (new StringBuilder("PNE")).append(SnowFlakeEx.getInstance().nextHexStrId(4)).toString(); } public static String genGisTotalTempID(){ return (new StringBuilder("PGT")).append(SnowFlakeEx.getInstance().nextHexStrId(4)).toString(); } public static String genElementApplyID(){ return (new StringBuilder("EPY")).append(SnowFlakeEx.getInstance().nextHexStrId(4)).toString(); } public static String genPublishBatchNo(){ return (new StringBuilder("PN")).append(SnowFlakeEx.getInstance().nextHexStrId(4)).toString(); } public static String genDeviceSN(){ StringBuilder tmp = new StringBuilder("GSM"); tmp.append(TimeTool.convertUTC2DateStr(System.currentTimeMillis(), TimeTool.TIMESTAMP_FORMAT_EX2).substring(2)); tmp.append(EncryptionUtil.MD5Hash(UUID.randomUUID().toString()).toUpperCase().substring(10, 21)); return tmp.toString(); } /** * 从订单id中提取订单的创建时间,并以yyyyMMddHHmmss时间格式返回 * @param strOrderId * @return */ public static String getOrderTmStrFromOrderID(String strOrderId){ try { String time = ""; int nStartIndex = 3; //所有工单的标识为前三个字符标识 time = strOrderId.substring(nStartIndex, nStartIndex+TimeTool.TIMESTAMP_FORMAT_EX2.length()); return time.trim(); }catch (Exception e){} return ""; } /** * 从订单id中提取订单的创建时间,并以UTC时间格式(精确到毫秒)返回 * @param strOrderId * @return */ public static long getOrderUTCFromOrderID(String strOrderId){ try { return new SimpleDateFormat(TimeTool.TIMESTAMP_FORMAT_EX2).parse(getOrderTmStrFromOrderID(strOrderId)).getTime(); }catch (Exception e){} return 0L; } public static String list2QueryIn(List listSrc){ StringBuilder str = new StringBuilder(""); if (listSrc != null && listSrc.size() > 0){ str.append("("); int nStart = 0; for (Object item:listSrc){ if (nStart++ > 0) str.append(","); if (item instanceof String){ str.append("'"+item+"'"); }else{ str.append(item); } } str.append(")"); } return str.toString(); } public static int totalCharCountsInStr(String srcStr, char chDes){ int nums = 0; if (StringUtils.isEmpty(srcStr)) return nums; char[] arr = srcStr.toCharArray(); for (char ch:arr){ if (ch == chDes) nums++; } return nums; } public static int forceConvertToInt(Object oldObj, int defaultV){ if (oldObj != null){ if (oldObj.getClass().getSimpleName().equals("Double")) return Double.valueOf((double)oldObj).intValue(); else if (oldObj.getClass().getSimpleName().equals("Float")) return Float.valueOf((float)oldObj).intValue(); else return CastUtil.castInt(oldObj, defaultV); } return defaultV; } public static String escapeInHex(final String src) { StringBuilder tmp = new StringBuilder(""); if (StringUtils.isEmpty(src)) return tmp.toString(); int i; char j; tmp.ensureCapacity(src.length() * 6); for (i = 0; i < src.length(); i++) { j = src.charAt(i); if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j)) tmp.append(j); else if (j < 256) { tmp.append(j); /*tmp.append("%"); if (j < 16) tmp.append("0"); tmp.append(Integer.toString(j, 16)); */ } else { //tmp.append("%u"); //tmp.append(Integer.toString(j, 16)); tmp.append("&#x"); tmp.append(Integer.toString(j, 16)); tmp.append(";"); } } return tmp.toString(); } private static final String PHONE_MATCH_FILTER = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$"; public static String adjustMobilePhone(String phone){ if (!StringUtils.isEmpty(phone) && phone.length() == 11 && isTheThisFormatMatch(PHONE_MATCH_FILTER, phone)){ return phone; } return ""; } private static String exchangeMD5(String md5){ StringBuilder res = new StringBuilder(""); int len = md5.length()/2; for (int i=0; i mapLikes, Set filterKey){ StringBuilder strLikes = new StringBuilder(""); if (mapLikes != null && mapLikes.size() > 0){ int nStart = 0; for(Map.Entry entry:mapLikes.entrySet()){ String key = entry.getKey(); String data = entry.getValue(); if (StringUtils.isEmpty(data) || !filterKey.contains(key)) //likes条件暂时只支持有限字段 continue; if (nStart++ > 0) strLikes.append(" or "); strLikes.append(StringUtil.lower2UnLine(key)+" like '%"+data+"%' "); } } return strLikes.toString(); } //WGS84标准参考椭球中的地球长半径(单位:米) private static final double EARTH_RADIUS = 6378137; //地球半径:米 /** * 根据经纬度,计算两点间的距离 * * @param lng1 第一个点的经度 * @param lat1 第一个点的纬度 * @param lng2 第二个点的经度 * @param lat2 第二个点的纬度 * @return 返回距离 单位:米 */ public static long getGisDistance(double lng1, double lat1, double lng2, double lat2) { lat1 = Math.toRadians(lat1); lat2 = Math.toRadians(lat2); lng1 = Math.toRadians(lng1); lng2 = Math.toRadians(lng2); double a = lat1 - lat2; // 纬度之差 double b = lng1 - lng2; // 经度之差 double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));// 计算两点距离的公式 s = s * EARTH_RADIUS; return Math.round(s * 10000) / 10000; } public static String genHashCodeForBytes(byte[] data){ try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytes = md.digest(data); StringBuilder ret = new StringBuilder(bytes.length * 2); for(int i = 0; i < bytes.length; ++i) { ret.append(HEX_DIGITS[bytes[i] >> 4 & 15]); ret.append(HEX_DIGITS[bytes[i] & 15]); } return ret.toString(); } catch (Exception var6) { var6.printStackTrace(); return (data != null && data.length >= 16)?BytesUtils.bytesToHex(data, 0, 16):""; } } public static String genFileAttachmentId(String fileName, int type, String strExtend){ String time = TimeTool.convertUTC2DateStr(System.currentTimeMillis(), TimeTool.TIMESTAMP_FORMAT_EX2); String fileNameHash = (StringUtils.isEmpty(fileName))? RandomUtil.getDigitalRandomStr(4):EncryptionUtil.MD5Hash(fileName).substring(0,4); String extend = (StringUtils.isEmpty(strExtend))?RandomUtil.getDigitalRandomStr(4):strExtend; return (new StringBuilder("FT")) .append(time==null?"":time) .append(String.format("%02d",type%100)) .append(fileNameHash==null?"":fileNameHash) .append(extend==null?"":extend).toString(); } public static List safeList(List listSrc){ if (listSrc == null) return new ArrayList(); else return listSrc; } public static boolean isRootAdminID(String userId){ return CommDefine.ADMIN_USER_ID.equals(userId) || CommDefine.INTERNAL_OPERATOR_ID.equals(userId); } //84坐标系转2000坐标系 public static double[] convert84To2000(double latitude, double longitude) { double x = 0.0, y = 0.0, z = 0.0; double a = EARTH_RADIUS; double f = 1.0 / 298.257223563; double b = (1 - f) * a; double e = Math.sqrt((a * a - b * b) / (a * a)); double E = Math.atan2(z, Math.sqrt(x * x + y * y)); double r = Math.sqrt(x * x + y * y + z * z); double latitude1 = Math.atan2(z + e * e * b * Math.pow(Math.sin(E), 3), r - a * Math.pow(e, 2) * Math.pow(Math.cos(E), 3)); double longitude1 = Math.atan2(y, x); double N = a / Math.sqrt(1 - Math.pow(e * Math.sin(latitude1), 2)); double h = r / Math.cos(latitude1) - N; double X = (N + h) * Math.cos(latitude1) * Math.cos(longitude1); double Y = (N + h) * Math.cos(latitude1) * Math.sin(longitude1); double Z = (N * (1 - Math.pow(e, 2)) + h) * Math.sin(latitude1); double k = 1.0000648438897; double dx = -24.9; double dy = 140.8; double dz = 76.3; double X1 = k * (X + dx); double Y1 = k * (Y + dy); double Z1 = k * (Z + dz); return new double[]{X1, Y1, Z1}; } }