CommTool.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. package com.shkpr.service.proxycenter.commtools;
  2. import com.global.base.component.SnowFlakeEx;
  3. import com.global.base.tools.*;
  4. import com.shkpr.service.proxycenter.constants.CommDefine;
  5. import org.springframework.util.StringUtils;
  6. import java.security.MessageDigest;
  7. import java.text.SimpleDateFormat;
  8. import java.util.*;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;
  11. public class CommTool {
  12. public static final char[] HEX_DIGITS;
  13. static {
  14. HEX_DIGITS = "0123456789ABCDEF".toCharArray();
  15. }
  16. public static String getPlatformByAgent(String strClientType, String strUserAgent){
  17. return getPlatformByAgent(!StringUtils.isEmpty(strClientType)?strClientType:strUserAgent);
  18. }
  19. public static String getPlatformByAgent(String strUserAgent){
  20. String type = "pc";
  21. if (StringUtils.isEmpty(strUserAgent))
  22. return type;
  23. String lowerAgent = strUserAgent.toLowerCase();
  24. if(lowerAgent.contains("android") || lowerAgent.contains("linux")) {
  25. type = "apk";
  26. } else if (lowerAgent.contains("iphone") || lowerAgent.contains("ios") || lowerAgent.contains("ipad")){
  27. type = "ios";
  28. } else if (lowerAgent.indexOf("micromessenger") > -1){
  29. type = "wx";
  30. } else if (lowerAgent.indexOf("cs") > -1){
  31. type = "cs";
  32. } else if (lowerAgent.indexOf("windows") > -1){
  33. type = "pc";
  34. } else if (lowerAgent.contains("tri.")){
  35. type = strUserAgent;
  36. }
  37. return type;
  38. }
  39. public static boolean isMobilePlatform(String platform){
  40. return ("apk".equals(platform) || "ios".equals(platform) || "wx".equals(platform));
  41. }
  42. public static boolean isTheThisFormatMatch(final String strFormatFilter, String strDesData){
  43. if (!StringUtils.isEmpty(strFormatFilter) && !StringUtils.isEmpty(strDesData)) {
  44. //正则表达式的模式
  45. Pattern p = Pattern.compile(strFormatFilter);
  46. //正则表达式的匹配器
  47. Matcher m = p.matcher(strDesData);
  48. //进行正则匹配
  49. return m.matches();
  50. }
  51. return false;
  52. }
  53. public static int listSize(List<? extends Object> listSrc){
  54. return (listSrc==null)?0:listSrc.size();
  55. }
  56. public static int collectionSize(Collection<? extends Object> cc){
  57. return (cc==null)?0:cc.size();
  58. }
  59. public static int mapSize(Map<? extends Object, ? extends Object> mapSrc){
  60. return (mapSrc==null)?0:mapSrc.size();
  61. }
  62. public static int lenString(String strSrc) {
  63. if (StringUtils.isEmpty(strSrc))
  64. return 0;
  65. return strSrc.length();
  66. }
  67. public static boolean strBetweenLen(String strSrc, int nMinLen, int nMaxLen){
  68. if (strSrc == null || nMinLen > nMaxLen)
  69. return false;
  70. return strSrc.length() >= nMinLen && strSrc.length() <= nMaxLen;
  71. }
  72. public static String genAppApisID(){
  73. return (new StringBuilder("AA")).append(SnowFlakeEx.getInstance().nextHexStrId(2)).toString();
  74. }
  75. public static String genApisCaseID(){
  76. return (new StringBuilder("AC")).append(SnowFlakeEx.getInstance().nextHexStrId(2)).toString();
  77. }
  78. public static String genNotifyEventID(){
  79. return (new StringBuilder("PNE")).append(SnowFlakeEx.getInstance().nextHexStrId(4)).toString();
  80. }
  81. public static String genGisTotalTempID(){
  82. return (new StringBuilder("PGT")).append(SnowFlakeEx.getInstance().nextHexStrId(4)).toString();
  83. }
  84. public static String genElementApplyID(){
  85. return (new StringBuilder("EPY")).append(SnowFlakeEx.getInstance().nextHexStrId(4)).toString();
  86. }
  87. public static String genPublishBatchNo(){
  88. return (new StringBuilder("PN")).append(SnowFlakeEx.getInstance().nextHexStrId(4)).toString();
  89. }
  90. public static String genDeviceSN(){
  91. StringBuilder tmp = new StringBuilder("GSM");
  92. tmp.append(TimeTool.convertUTC2DateStr(System.currentTimeMillis(), TimeTool.TIMESTAMP_FORMAT_EX2).substring(2));
  93. tmp.append(EncryptionUtil.MD5Hash(UUID.randomUUID().toString()).toUpperCase().substring(10, 21));
  94. return tmp.toString();
  95. }
  96. /**
  97. * 从订单id中提取订单的创建时间,并以yyyyMMddHHmmss时间格式返回
  98. * @param strOrderId
  99. * @return
  100. */
  101. public static String getOrderTmStrFromOrderID(String strOrderId){
  102. try {
  103. String time = "";
  104. int nStartIndex = 3; //所有工单的标识为前三个字符标识
  105. time = strOrderId.substring(nStartIndex, nStartIndex+TimeTool.TIMESTAMP_FORMAT_EX2.length());
  106. return time.trim();
  107. }catch (Exception e){}
  108. return "";
  109. }
  110. /**
  111. * 从订单id中提取订单的创建时间,并以UTC时间格式(精确到毫秒)返回
  112. * @param strOrderId
  113. * @return
  114. */
  115. public static long getOrderUTCFromOrderID(String strOrderId){
  116. try {
  117. return new SimpleDateFormat(TimeTool.TIMESTAMP_FORMAT_EX2).parse(getOrderTmStrFromOrderID(strOrderId)).getTime();
  118. }catch (Exception e){}
  119. return 0L;
  120. }
  121. public static String list2QueryIn(List<? extends Object> listSrc){
  122. StringBuilder str = new StringBuilder("");
  123. if (listSrc != null && listSrc.size() > 0){
  124. str.append("(");
  125. int nStart = 0;
  126. for (Object item:listSrc){
  127. if (nStart++ > 0)
  128. str.append(",");
  129. if (item instanceof String){
  130. str.append("'"+item+"'");
  131. }else{
  132. str.append(item);
  133. }
  134. }
  135. str.append(")");
  136. }
  137. return str.toString();
  138. }
  139. public static int totalCharCountsInStr(String srcStr, char chDes){
  140. int nums = 0;
  141. if (StringUtils.isEmpty(srcStr))
  142. return nums;
  143. char[] arr = srcStr.toCharArray();
  144. for (char ch:arr){
  145. if (ch == chDes)
  146. nums++;
  147. }
  148. return nums;
  149. }
  150. public static int forceConvertToInt(Object oldObj, int defaultV){
  151. if (oldObj != null){
  152. if (oldObj.getClass().getSimpleName().equals("Double"))
  153. return Double.valueOf((double)oldObj).intValue();
  154. else if (oldObj.getClass().getSimpleName().equals("Float"))
  155. return Float.valueOf((float)oldObj).intValue();
  156. else
  157. return CastUtil.castInt(oldObj, defaultV);
  158. }
  159. return defaultV;
  160. }
  161. public static String escapeInHex(final String src) {
  162. StringBuilder tmp = new StringBuilder("");
  163. if (StringUtils.isEmpty(src))
  164. return tmp.toString();
  165. int i;
  166. char j;
  167. tmp.ensureCapacity(src.length() * 6);
  168. for (i = 0; i < src.length(); i++) {
  169. j = src.charAt(i);
  170. if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))
  171. tmp.append(j);
  172. else if (j < 256) {
  173. tmp.append(j);
  174. /*tmp.append("%");
  175. if (j < 16)
  176. tmp.append("0");
  177. tmp.append(Integer.toString(j, 16));
  178. */
  179. } else {
  180. //tmp.append("%u");
  181. //tmp.append(Integer.toString(j, 16));
  182. tmp.append("&#x");
  183. tmp.append(Integer.toString(j, 16));
  184. tmp.append(";");
  185. }
  186. }
  187. return tmp.toString();
  188. }
  189. 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}$";
  190. public static String adjustMobilePhone(String phone){
  191. if (!StringUtils.isEmpty(phone)
  192. && phone.length() == 11
  193. && isTheThisFormatMatch(PHONE_MATCH_FILTER, phone)){
  194. return phone;
  195. }
  196. return "";
  197. }
  198. private static String exchangeMD5(String md5){
  199. StringBuilder res = new StringBuilder("");
  200. int len = md5.length()/2;
  201. for (int i=0; i<len; i++){
  202. int index = i*2;
  203. res.append(Integer.toHexString((Integer.parseInt(String.valueOf(md5.charAt(index+1)), 16)<<4 | Integer.parseInt(String.valueOf(md5.charAt(index)), 16)) % 16).toUpperCase());
  204. }
  205. //for (int i = 0,j = md5.length()-1; i<=j; i++,j--){
  206. // res.append(Integer.toHexString(((0x0F & md5.charAt(i)) ^ (0x0F & md5.charAt(j)))).toUpperCase());
  207. //}
  208. return res.toString();
  209. }
  210. public static String genUserUid(String account, String extend){
  211. return "UUD" + exchangeMD5(EncryptionUtil.MD5Hash(account+extend));
  212. }
  213. public static String likeMap2LikeStr(Map<String, String> mapLikes, Set<String> filterKey){
  214. StringBuilder strLikes = new StringBuilder("");
  215. if (mapLikes != null && mapLikes.size() > 0){
  216. int nStart = 0;
  217. for(Map.Entry<String, String> entry:mapLikes.entrySet()){
  218. String key = entry.getKey();
  219. String data = entry.getValue();
  220. if (StringUtils.isEmpty(data) || !filterKey.contains(key)) //likes条件暂时只支持有限字段
  221. continue;
  222. if (nStart++ > 0)
  223. strLikes.append(" or ");
  224. strLikes.append(StringUtil.lower2UnLine(key)+" like '%"+data+"%' ");
  225. }
  226. }
  227. return strLikes.toString();
  228. }
  229. //WGS84标准参考椭球中的地球长半径(单位:米)
  230. private static final double EARTH_RADIUS = 6378137; //地球半径:米
  231. /**
  232. * 根据经纬度,计算两点间的距离
  233. *
  234. * @param lng1 第一个点的经度
  235. * @param lat1 第一个点的纬度
  236. * @param lng2 第二个点的经度
  237. * @param lat2 第二个点的纬度
  238. * @return 返回距离 单位:米
  239. */
  240. public static long getGisDistance(double lng1, double lat1, double lng2, double lat2) {
  241. lat1 = Math.toRadians(lat1);
  242. lat2 = Math.toRadians(lat2);
  243. lng1 = Math.toRadians(lng1);
  244. lng2 = Math.toRadians(lng2);
  245. double a = lat1 - lat2; // 纬度之差
  246. double b = lng1 - lng2; // 经度之差
  247. double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
  248. Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));// 计算两点距离的公式
  249. s = s * EARTH_RADIUS;
  250. return Math.round(s * 10000) / 10000;
  251. }
  252. public static String genHashCodeForBytes(byte[] data){
  253. try {
  254. MessageDigest md = MessageDigest.getInstance("MD5");
  255. byte[] bytes = md.digest(data);
  256. StringBuilder ret = new StringBuilder(bytes.length * 2);
  257. for(int i = 0; i < bytes.length; ++i) {
  258. ret.append(HEX_DIGITS[bytes[i] >> 4 & 15]);
  259. ret.append(HEX_DIGITS[bytes[i] & 15]);
  260. }
  261. return ret.toString();
  262. } catch (Exception var6) {
  263. var6.printStackTrace();
  264. return (data != null && data.length >= 16)?BytesUtils.bytesToHex(data, 0, 16):"";
  265. }
  266. }
  267. public static String genFileAttachmentId(String fileName, int type, String strExtend){
  268. String time = TimeTool.convertUTC2DateStr(System.currentTimeMillis(), TimeTool.TIMESTAMP_FORMAT_EX2);
  269. String fileNameHash = (StringUtils.isEmpty(fileName))? RandomUtil.getDigitalRandomStr(4):EncryptionUtil.MD5Hash(fileName).substring(0,4);
  270. String extend = (StringUtils.isEmpty(strExtend))?RandomUtil.getDigitalRandomStr(4):strExtend;
  271. return (new StringBuilder("FT"))
  272. .append(time==null?"":time)
  273. .append(String.format("%02d",type%100))
  274. .append(fileNameHash==null?"":fileNameHash)
  275. .append(extend==null?"":extend).toString();
  276. }
  277. public static List safeList(List<? extends Object> listSrc){
  278. if (listSrc == null)
  279. return new ArrayList();
  280. else
  281. return listSrc;
  282. }
  283. public static boolean isRootAdminID(String userId){
  284. return CommDefine.ADMIN_USER_ID.equals(userId)
  285. || CommDefine.INTERNAL_OPERATOR_ID.equals(userId);
  286. }
  287. //84坐标系转2000坐标系
  288. public static double[] convert84To2000(double latitude, double longitude) {
  289. double x = 0.0, y = 0.0, z = 0.0;
  290. double a = EARTH_RADIUS;
  291. double f = 1.0 / 298.257223563;
  292. double b = (1 - f) * a;
  293. double e = Math.sqrt((a * a - b * b) / (a * a));
  294. double E = Math.atan2(z, Math.sqrt(x * x + y * y));
  295. double r = Math.sqrt(x * x + y * y + z * z);
  296. 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));
  297. double longitude1 = Math.atan2(y, x);
  298. double N = a / Math.sqrt(1 - Math.pow(e * Math.sin(latitude1), 2));
  299. double h = r / Math.cos(latitude1) - N;
  300. double X = (N + h) * Math.cos(latitude1) * Math.cos(longitude1);
  301. double Y = (N + h) * Math.cos(latitude1) * Math.sin(longitude1);
  302. double Z = (N * (1 - Math.pow(e, 2)) + h) * Math.sin(latitude1);
  303. double k = 1.0000648438897;
  304. double dx = -24.9;
  305. double dy = 140.8;
  306. double dz = 76.3;
  307. double X1 = k * (X + dx);
  308. double Y1 = k * (Y + dy);
  309. double Z1 = k * (Z + dz);
  310. return new double[]{X1, Y1, Z1};
  311. }
  312. }