123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- 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<? extends Object> listSrc){
- return (listSrc==null)?0:listSrc.size();
- }
- public static int collectionSize(Collection<? extends Object> cc){
- return (cc==null)?0:cc.size();
- }
- public static int mapSize(Map<? extends Object, ? extends Object> 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<? extends Object> 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<len; i++){
- int index = i*2;
- res.append(Integer.toHexString((Integer.parseInt(String.valueOf(md5.charAt(index+1)), 16)<<4 | Integer.parseInt(String.valueOf(md5.charAt(index)), 16)) % 16).toUpperCase());
- }
- //for (int i = 0,j = md5.length()-1; i<=j; i++,j--){
- // res.append(Integer.toHexString(((0x0F & md5.charAt(i)) ^ (0x0F & md5.charAt(j)))).toUpperCase());
- //}
- return res.toString();
- }
- public static String genUserUid(String account, String extend){
- return "UUD" + exchangeMD5(EncryptionUtil.MD5Hash(account+extend));
- }
- public static String likeMap2LikeStr(Map<String, String> mapLikes, Set<String> filterKey){
- StringBuilder strLikes = new StringBuilder("");
- if (mapLikes != null && mapLikes.size() > 0){
- int nStart = 0;
- for(Map.Entry<String, String> 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<? extends Object> 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};
- }
- }
|