CustomFunction.java 73 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573
  1. package com.mixsmart.utils;
  2. import cn.hutool.core.date.*;
  3. import cn.hutool.core.util.ArrayUtil;
  4. import cn.hutool.core.util.NumberUtil;
  5. import com.jfireel.expression.node.CalculateNode;
  6. import com.jfireel.expression.node.impl.OperatorResultNode;
  7. import com.jfireel.expression.node.impl.StaticObjectMethodNode;
  8. import com.jfireel.expression.node.impl.VariableNode;
  9. import com.jfireel.expression.token.Token;
  10. import org.apache.commons.collections4.MapUtils;
  11. import org.jsoup.Jsoup;
  12. import org.springblade.core.tool.utils.*;
  13. import java.io.FileInputStream;
  14. import java.math.BigDecimal;
  15. import java.text.ParseException;
  16. import java.text.SimpleDateFormat;
  17. import java.util.*;
  18. import java.util.concurrent.atomic.AtomicInteger;
  19. import java.util.regex.Matcher;
  20. import java.util.regex.Pattern;
  21. import java.util.stream.Collectors;
  22. import static java.math.BigDecimal.ROUND_CEILING;
  23. import static java.math.BigDecimal.ROUND_HALF_UP;
  24. /**
  25. * @author yangyj
  26. */
  27. public class CustomFunction {
  28. /**
  29. * 类调用地址前缀
  30. */
  31. public static final String CLASS_CALL = "T(com.mixsmart.utils.CustomFunction).";
  32. public static final String CONCAT = "@";
  33. public static final Set<String> KEYWORD_SET =new HashSet<>();
  34. static {
  35. KEYWORD_SET.add("first");
  36. KEYWORD_SET.add("last");
  37. KEYWORD_SET.add("empty");
  38. }
  39. /**
  40. * @Description 根据桩号类型生成桩号
  41. * @Param [stationType]
  42. * @return java.lang.String
  43. * @Author yangyj
  44. * @Date 2021.01.20 17:43
  45. **/
  46. public static String createStation(Object stationType) {
  47. if(StringUtils.isNotEmpty(stationType)) {
  48. Matcher m = RegexUtils.matcher("[~|-]",handleNull(stationType));
  49. if(m.find()){
  50. StringBuilder sb = new StringBuilder();
  51. String splitchar = m.group(0);
  52. String[] arr = stationType.toString().split(splitchar);
  53. for(String str:arr){
  54. sb.append(singleStation(str)).append(splitchar);
  55. }
  56. if(sb.length()>0){
  57. return sb.deleteCharAt(sb.length()-1).toString();
  58. }
  59. }else {
  60. return singleStation(stationType);
  61. }
  62. }
  63. return "";
  64. }
  65. /**
  66. * @Description 记录表5输入桩号代码解析,2G1#1+100>>2G1K0+100
  67. * @Param [stake]
  68. * @return java.lang.String[] result[0]:返回桩号前缀;result[1]:实际显示前缀;result[2]:里程数
  69. * @Author yangyj
  70. * @Date 2021.04.09 11:49
  71. **/
  72. public static String[] decodeStake(Object stake){
  73. String[] result = new String[]{"","",""};
  74. if(StringUtils.isNotEmpty(stake)){
  75. String stakeStr = StringUtils.repaceBlank(stake.toString().toUpperCase());
  76. Matcher m ;
  77. if(stake.toString().contains("+")){
  78. m = RegexUtils.matcher("(([A-Z0-9]*)(#\\d*)?)\\+([\\d||\\.]*)", stakeStr);
  79. if(m.find()){
  80. String partNoD = m.group(1);
  81. String partNoV = m.group(2);
  82. String kilometer = m.group(4);
  83. result[0]=partNoD;
  84. result[1]=partNoV;
  85. result[2]=kilometer;
  86. }
  87. }else{
  88. m =RegexUtils.matcher("([A-Z]*)([\\d||\\.]*)", stakeStr);
  89. if(m.find()){
  90. String partNo = m.group(1);
  91. String kilometer = m.group(2);
  92. result[0]=partNo;
  93. result[1]=partNo;
  94. result[2]=kilometer;
  95. }
  96. }
  97. }
  98. return result;
  99. }
  100. public static String[] standardStake(Object stake){
  101. String[] result = new String[]{"",""};
  102. if(StringUtils.isNotEmpty(stake)){
  103. String stakeStr = StringUtils.repaceBlank(stake.toString().toUpperCase());
  104. Matcher m = RegexUtils.matcher("([A-Z0-9]{0,3})K(\\d{1,3})\\+([\\d||\\.]*)", stakeStr);
  105. Matcher m2 = RegexUtils.matcher("([A-Z]{0,3})([\\d||\\.]+)", stakeStr);
  106. if(m.find()){
  107. String partNo = m.group(1);
  108. double km = Double.parseDouble(m.group(2));
  109. double meter = Double.parseDouble(m.group(3));
  110. result[0]=partNo;
  111. int scale=getScale(meter);
  112. result[1]=StringUtils.number2String(km*1000+meter,scale);
  113. }else if(m2.find()){
  114. result[0]=m2.group(1);
  115. result[1]=m2.group(2);
  116. }
  117. }
  118. return result;
  119. }
  120. /**
  121. * @Description 获取最大小数位
  122. * @Param [number]
  123. * @return int
  124. * @Author yangyj
  125. * @Date 2021.12.23 15:08
  126. **/
  127. public static Integer getScale(Object ...number){
  128. int max=0;
  129. for(Object n:number){
  130. if(StringUtils.isNotEmpty(n)){
  131. String[] sa = n.toString().split(",");
  132. for(String s:sa){
  133. Matcher m = RegexUtils.matcher("(\\d)+.(\\d)+",s);
  134. if(m.find()){
  135. max=Math.max(new StringBuilder(m.group()).reverse().toString().indexOf("."),max);
  136. }
  137. }
  138. }
  139. }
  140. return max;
  141. }
  142. public static String singleStation(Object station) {
  143. if(StringUtils.isNotEmpty(station)) {
  144. Object zhdata =station;
  145. String zhdatastr = zhdata.toString().toUpperCase();
  146. if(zhdatastr.contains("+")&&zhdatastr.contains("K")){
  147. return zhdatastr;
  148. }
  149. String[] stake = decodeStake(zhdatastr);
  150. String partNo =stake[1];
  151. String kilometer = stake[2];
  152. if(StringUtils.isNotEmpty(kilometer)){
  153. partNo= handleNull(partNo);
  154. int ks = (int) Math.floor(Double.parseDouble(kilometer)/1000);
  155. double ke =new BigDecimal(kilometer).subtract(new BigDecimal(String.valueOf(ks*1000))).doubleValue();
  156. String temp = ""+ke;
  157. if((int)Double.parseDouble(temp)==Double.parseDouble(temp)){
  158. temp = String.valueOf((int)Double.parseDouble(temp));
  159. }
  160. String sf="000";
  161. if(temp.length()<3){
  162. temp = sf.substring(0,3-temp.length())+temp;
  163. }
  164. if((temp.contains(".")&&temp.indexOf(".")<=2)){
  165. temp = sf.substring(0,3-temp.indexOf("."))+temp;
  166. }
  167. return partNo+"K"+ks+"+"+temp;
  168. }
  169. }
  170. return "";
  171. }
  172. public static Object calculate(Object a, Object b, Object scaleObj, Integer type) {
  173. boolean nullFlag = false;
  174. if(type == null) {
  175. return null;
  176. }
  177. if (StringUtils.isEmpty(a)&&StringUtils.isEmpty(b)){
  178. return null;
  179. }
  180. if(StringUtils.isEmpty(a) && type == 7){
  181. nullFlag = true;
  182. a=0;
  183. }
  184. if(StringUtils.isEmpty(b) && type == 7){
  185. nullFlag = true;
  186. b=0;
  187. }
  188. if(StringUtils.isNotEmpty(a) && StringUtils.isNotEmpty(b)) {
  189. try {
  190. int scale = StringUtils.handleObj2Integer(scaleObj);
  191. String aStr = a.toString();
  192. String bStr = b.toString();
  193. double ad = Double.parseDouble(aStr);
  194. double bd=0;
  195. if (type == 6) {
  196. //判断设计值是否包含"/"
  197. if (bStr.contains("/")){
  198. bd = bStr.split("/").length;
  199. return (int) (ad*bd);
  200. }else{
  201. return (int) ad;
  202. }
  203. }
  204. bd = Double.parseDouble(bStr);
  205. double result = 0;
  206. if(type == 1) {
  207. result = ad+bd;
  208. } else if(type == 2) {
  209. result = ad-bd;
  210. } else if(type == 3) {
  211. result = ad*bd;
  212. } else if(type == 4) {
  213. result = ad/bd;
  214. } else if(type == 5) {
  215. result = ad%bd;
  216. } else if(type == 7&&ad*bd!=0&&!nullFlag){
  217. return (int) Math.ceil(ad*bd);
  218. }else {
  219. return null;
  220. }
  221. BigDecimal big = new BigDecimal(result);
  222. return big.setScale(scale, ROUND_HALF_UP);
  223. } catch (NumberFormatException e) {
  224. e.printStackTrace();
  225. }
  226. }
  227. return null;
  228. }
  229. public static boolean isNumber(Object value) {
  230. if(Func.isEmpty(value)){
  231. return false;
  232. }
  233. if(value instanceof Number){
  234. return true;
  235. }
  236. String pattern = "^[+-]?\\d+(\\.\\d+)?$";
  237. Pattern r = Pattern.compile(pattern);
  238. Matcher m = r.matcher(String.valueOf(value));
  239. return m.matches();
  240. }
  241. public static boolean isNotNumber(Object value){
  242. return !isNumber(value);
  243. }
  244. public static Object sum(List<Object> list) {
  245. if(ListUtils.isNotEmpty(list)){
  246. return list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).sum();
  247. }
  248. return "";
  249. }
  250. public static Object avg(List<Object> list) {
  251. if(ListUtils.isNotEmpty(list)){
  252. OptionalDouble op =list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).average();
  253. if(op.isPresent()){
  254. return op.getAsDouble();
  255. }
  256. }
  257. return "";
  258. }
  259. public static Object max(List<Object> list) {
  260. if(ListUtils.isNotEmpty(list)){
  261. OptionalDouble op =list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).max();
  262. if(op.isPresent()){
  263. return op.getAsDouble();
  264. }
  265. }
  266. return "";
  267. }
  268. public static Object min(List<Object> list) {
  269. if(ListUtils.isNotEmpty(list)){
  270. OptionalDouble op =list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).min();
  271. if(op.isPresent()){
  272. return op.getAsDouble();
  273. }
  274. }
  275. return "";
  276. }
  277. public static Object count(Object data) {
  278. List<Object> list=obj2ListNe(data);
  279. if(ListUtils.isNotEmpty(list)){
  280. if(list.stream().anyMatch(e->StringUtils.handleNull(e).contains(":"))){
  281. return list.stream().filter(StringUtils::isNotEmpty).count();
  282. }
  283. return list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).count();
  284. }
  285. return "";
  286. }
  287. /**
  288. * @Description 输出勾选复选框
  289. * @Param [o1, o2]
  290. * @return java.lang.Object
  291. * @Author yangyj
  292. * @Date 2021.06.29 10:35
  293. **/
  294. public static Object checkbox(Object o1,Object o2){
  295. if(StringUtils.isNotEmpty(o1)&&StringUtils.isNotEmpty(o2)){
  296. if(o1.equals(o2)){
  297. return "\u2611";
  298. }
  299. }
  300. return "";
  301. }
  302. /**
  303. * @Description 返回n个空格,用于输出字符串格式化
  304. * @Param [n]
  305. * @return java.lang.Object
  306. * @Author yangyj
  307. * @Date 2021.06.29 11:41
  308. **/
  309. public static Object space(Object n){
  310. if(StringUtils.isNumber(n)){
  311. return String.join("", Collections.nCopies(Integer.parseInt(n.toString()), "\u0020"));
  312. }
  313. return "";
  314. }
  315. /**
  316. * @Description 字符串中是包含中文
  317. * @Param [chars]
  318. * @return boolean
  319. * @Author yangyj
  320. * @Date 2021.09.17 14:31
  321. **/
  322. public static boolean containsZH(Object chars){
  323. Matcher m =RegexUtils.matcher("[\u4e00-\u9fa5]",handleNull(chars));
  324. return m.find();
  325. }
  326. /**
  327. * @Description 字符串中是包含数字
  328. * @Param [chars]
  329. * @return boolean
  330. * @Author yangyj
  331. * @Date 2021.09.17 14:31
  332. **/
  333. public static boolean containsD(Object chars){
  334. Matcher m =RegexUtils.matcher("\\d",handleNull(chars));
  335. return m.find();
  336. }
  337. /**
  338. * @Description 封装超链接
  339. * @Param [uri]
  340. * @return java.lang.String
  341. * @Author yangyj
  342. * @Date 2021.10.14 16:15
  343. **/
  344. public static String uri(Object uri){
  345. if(StringUtils.isNotEmpty(uri)){
  346. return "URI<"+handleNull(uri)+">";
  347. }
  348. return "";
  349. }
  350. /**
  351. * @Description 获取相隔多少天后的日期
  352. * @Param [date, n:相隔天数,正数代表未来,负数代表历史]
  353. * @return java.lang.Object
  354. * @Author yangyj
  355. * @Date 2021.10.27 10:21
  356. **/
  357. public static Object dateAfter(Object date ,Object n){
  358. if(StringUtils.isNotEmpty(date)&&StringUtils.isNumber(n)){
  359. DateTime dt = new DateTime(date.toString());
  360. dt.offset(DateField.HOUR_OF_DAY,24*Integer.parseInt(n.toString()));
  361. return dt.toString(DatePattern.UTC_PATTERN);
  362. }
  363. return "";
  364. }
  365. public static Object dateMax(Object range){
  366. if(StringUtils.isNotEmpty(range)){
  367. String[] s= Func.toStr(range).replaceAll("[\\[\\]]","").split(",\\s+");
  368. return dateCp(s[0],s[1],false);
  369. }
  370. return StringPool.EMPTY;
  371. }
  372. public static Object dateMin(Object range){
  373. if(StringUtils.isNotEmpty(range)){
  374. String[] s= Func.toStr(range).replaceAll("[|]","").split(",");
  375. return dateCp(s[0],s[1],true);
  376. }
  377. return StringPool.EMPTY;
  378. }
  379. private static Object dateCp(Object d1 ,Object d2,Boolean isAsc){
  380. if(d1!=null&&d2!=null){
  381. Map<DateTime,Object> map = new HashMap<>();
  382. DateTime dt1 = new DateTime(d1.toString());
  383. DateTime dt2 = new DateTime(d2.toString());
  384. map.put(dt1,d1);
  385. map.put(dt2,d2);
  386. List<DateTime> list = new ArrayList<>();
  387. list.add(dt1);
  388. list.add(dt2);
  389. if(isAsc){
  390. return map.get(dcp(list,Comparator.naturalOrder()));
  391. }else{
  392. return map.get(dcp(list,Comparator.reverseOrder()));
  393. }
  394. }
  395. return StringPool.EMPTY;
  396. }
  397. /**
  398. * @Description 优良占比
  399. * @Param [data, cp]
  400. * @return java.lang.Object
  401. * @Author yangyj
  402. * @Date 2022.12.21 12:00
  403. **/
  404. public static Object proportion(List<Object> data ,String cp){
  405. if(Func.isNotEmpty(data)&&Func.isNotBlank(cp)){
  406. data= data.stream().filter(Func::isNotEmpty).map(e->e.toString().replaceAll("\\s+","")).collect(Collectors.toList());
  407. return StringUtils.number2String(100*((double)data.stream().filter(e->StringUtils.isEquals(e,cp)).count())/(double)data.size(),1);
  408. }
  409. return "";
  410. }
  411. public static Object goodSize(List<Object> data ,String cp){
  412. if(Func.isNotEmpty(data)&&Func.isNotBlank(cp)){
  413. data=data.stream().filter(Func::isNotEmpty).map(e->e.toString().replaceAll("\\s+","")).collect(Collectors.toList());
  414. return data.stream().filter(e->StringUtils.isEquals(e,cp)).count();
  415. }
  416. return "";
  417. }
  418. /**
  419. * @Description 阶梯合格率
  420. * @Param [data]
  421. * @return java.lang.Object
  422. * @Author yangyj
  423. * @Date 2022.12.21 11:59
  424. **/
  425. public static Object ladder(List<Object> data){
  426. if(Func.isNotEmpty(data)){
  427. OptionalDouble op=data.stream().map(StringUtils::handleNull).filter(StringUtils::isNumber).mapToDouble(Double::parseDouble).min();
  428. if(op.isPresent()){
  429. return op.getAsDouble()>=90?90:70;
  430. }
  431. }
  432. return "";
  433. }
  434. /**
  435. * @Description 主要工序质量等级
  436. * @Param [data]
  437. * @return java.lang.Object
  438. * @Author yangyj
  439. * @Date 2022.12.21 14:18
  440. **/
  441. public static Object major(List<Object> data){
  442. if(Func.isNotEmpty(data)&&data.stream().anyMatch(StringUtils::isNotEmpty)){
  443. return data.stream().map(StringUtils::handleNull).distinct().collect(Collectors.toList()).stream().anyMatch(e->e.contains("合格"))?"合格":"优良";
  444. }
  445. return "";
  446. }
  447. /**
  448. * @Description 单元工程质量等级评定
  449. * @Param [rate, level]
  450. * @return java.lang.Object
  451. * @Author yangyj
  452. * @Date 2022.12.21 14:33
  453. **/
  454. public static Object unit(Object rate ,Object level){
  455. if(StringUtils.isNotEmpty(rate,level)){
  456. return StringUtils.obj2Double(rate.toString())>50&&"优良".equals(level.toString())?"优良":"合格";
  457. }
  458. return "";
  459. }
  460. /**
  461. * @Description 主控项目数量
  462. * @Param [data]
  463. * @return java.lang.Object
  464. * @Author yangyj
  465. * @Date 2022.12.21 15:37
  466. **/
  467. public static Object reasonable(List<Object> data){
  468. if(ListUtils.isNotEmpty(data)){
  469. return data.stream().map(e->StringUtils.handleNull(e).replace("/","")).filter(StringUtils::isNotEmpty).count();
  470. }
  471. return "";
  472. }
  473. /**
  474. * @Description 时间比较获取
  475. * @Param [list:时间集合, comparator 比较器 ]
  476. * @return cn.hutool.core.date.DateTime
  477. * @Author yangyj
  478. * @Date 2022.11.10 10:47
  479. **/
  480. public static DateTime dcp(List<DateTime> list,Comparator<? super DateTime> comparator){
  481. return list.stream().reduce((a, b) -> comparator.compare(a, b) <= 0 ? a : b).orElse(null);
  482. }
  483. public static String dateToStr(Date date, String formatter) {
  484. String value = null;
  485. if(null != date) {
  486. if(StringUtils.isEmpty(formatter)) {
  487. formatter = "yyyy-MM-dd HH:mm:ss";
  488. }
  489. SimpleDateFormat dateFormat = new SimpleDateFormat(formatter);
  490. value = dateFormat.format(date);
  491. dateFormat = null;
  492. }
  493. return value;
  494. }
  495. public static String summary(List<String> tableNames){
  496. if(ListUtils.isNotEmpty(tableNames)){
  497. return tableNames.stream().map(e->e.replaceAll("_+\\d+","")).distinct().collect(Collectors.joining(StringPool.NEWLINE));
  498. }
  499. return StringPool.EMPTY;
  500. };
  501. public String checkItems(List<String> items,List<Object> l1,List<Object> l2,List<Object> l3,List<Object> l4,List<Object> l5,List<Object> l6,List<Object> l7,List<Object> l8,List<Object> l9,List<Object> l10,List<Object> l11,List<Object> l12){
  502. List<List<Object>> data = new ArrayList<>(Arrays.asList(l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12));
  503. List<String> result = new ArrayList<>();
  504. for(int i=0;i<data.size();i++){
  505. List<Object> list = data.get(i);
  506. if(list.stream().anyMatch(StringUtils::isNotEmpty)){
  507. result.add(items.get(i));
  508. }
  509. }
  510. if(ListUtils.isNotEmpty(result)){
  511. return String.join("、",result);
  512. }
  513. return StringPool.EMPTY;
  514. }
  515. /**
  516. * @Description 计算t1~t2,t3~t4 两个时间段的合计时间,unit 输入数值的单位
  517. * @Param [t1, t2, t3, t4, unit]
  518. * @return java.lang.Object
  519. * @Author yangyj
  520. * @Date 2021.07.02 15:47
  521. **/
  522. public static Object totalTime(Object t1,Object t2,Object t3,Object t4,Object unit){
  523. if(StringUtils.isNotEmpty(t1)&&StringUtils.isNotEmpty(t2)&&StringUtils.isNotEmpty(t3)&&StringUtils.isNotEmpty(t4)&&StringUtils.isNotEmpty(unit)){
  524. return conversionUnit((Long.parseLong(minutesPassedRecent(t1,t2).toString())+Long.parseLong(minutesPassedRecent(t3,t4).toString())),unit);
  525. }
  526. return "";
  527. }
  528. /**
  529. * @Description 字符串日期转指定格式日期
  530. * @Param [date, format:输出格式]
  531. * @return java.lang.Object
  532. * @Author yangyj
  533. * @Date 2021.07.02 15:55
  534. **/
  535. public static Object dateFormatter(Object date,Object format){
  536. if(StringUtils.isNotEmpty(date)&&StringUtils.isNotEmpty(format)){
  537. Matcher m = RegexUtils.matcher("(\\d{4})\\D(\\d{2})\\D(\\d{2})日?\\s*(\\d{0,2})(\\D\\d{1,2})?",date.toString());
  538. if(m.find()){
  539. String yyyy = handleNull(m.group(1));
  540. String MM = handleNull(m.group(2));
  541. String dd = handleNull(m.group(3));
  542. String HH = handleNull(m.group(4));
  543. String mm = handleNull(m.group(5));
  544. String d = handleNull(format);
  545. if(StringUtils.isNotEmpty(yyyy)){
  546. d=d.replace("yyyy",yyyy);
  547. }
  548. if(StringUtils.isNotEmpty(MM)){
  549. d=d.replace("MM",MM);
  550. }
  551. if(StringUtils.isNotEmpty(dd)){
  552. d=d.replace("dd",dd);
  553. }
  554. if(StringUtils.isNotEmpty(HH)){
  555. d=d.replace("HH",HH);
  556. }
  557. if(StringUtils.isNotEmpty(mm)){
  558. mm=mm.replaceAll("\\D","");
  559. d=d.replace("mm",mm);
  560. }
  561. return d;
  562. }
  563. }
  564. return "";
  565. }
  566. /**
  567. * @Description 求偏差值
  568. * @Param [list, design]
  569. * @return java.lang.Object
  570. * @Author yangyj
  571. * @Date 2021.09.18 10:43
  572. **/
  573. public static Object deviation(Object list,Object design){
  574. if(StringUtils.isNotEmpty(list)&&StringUtils.isNumber(design)){
  575. List<Object> result = new ArrayList<>();
  576. List<Object> tmp;
  577. if(list instanceof List){
  578. tmp = (List<Object>) list;
  579. }else{
  580. tmp=Arrays.asList(list.toString().split("[,|\\-~,]"));
  581. }
  582. int dev =StringUtils.handObj2Integer(design);
  583. for(Object e:tmp){
  584. if(containsZH(e)){
  585. /*不允许包含中文*/
  586. return "";
  587. }
  588. result.add(StringUtils.handObj2Integer(e)-dev);
  589. }
  590. if(ListUtils.isNotEmpty(result)){
  591. return result;
  592. }
  593. }
  594. return "";
  595. }
  596. /**
  597. * @Description 把日期格式化成 'xxxx年xx月xx日 星期x' 字符串
  598. * @Param [date]
  599. * @return java.lang.Object
  600. * @Author yangyj
  601. * @Date 2021.06.21 14:27
  602. **/
  603. public static Object toDateAndWeek(Object date){
  604. if(StringUtils.isNotEmpty(date)){
  605. Date d = parseDate(handleNull(date));
  606. String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
  607. Calendar calendar=Calendar.getInstance();
  608. assert d != null;
  609. calendar.setTime(d);
  610. String week = weekDays[calendar.get(Calendar.DAY_OF_WEEK)-1];
  611. return dateToStr(d,"yyyy年MM月dd日")+" "+week;
  612. }
  613. return null;
  614. }
  615. /**
  616. * @Description
  617. * @Param [data , unit 输入单位]
  618. * @return java.lang.Object
  619. * @Author yangyj
  620. * @Date 2022.10.13 14:13
  621. **/
  622. public static Object conversionUnit(Object data,Object unit){
  623. if(StringUtils.isNumber(data)&&StringUtils.isNotEmpty(unit)){
  624. //统一转化成毫秒在处理
  625. long ms=0;
  626. long l=Long.parseLong(data.toString());
  627. final long s=1000L;
  628. final long m=s*60;
  629. final long H=m*60;
  630. final long D=H*24;
  631. final long M=D*30;
  632. final long Y=D*365;
  633. if(StringUtils.isEquals("Y",unit.toString())){
  634. ms=l*Y;
  635. }else if(StringUtils.isEquals("M",unit.toString())){
  636. ms=l*M;
  637. }else if(StringUtils.isEquals("D",unit.toString())){
  638. ms=l*D;
  639. }else if(StringUtils.isEquals("H",unit.toString())){
  640. ms=l*H;
  641. }else if(StringUtils.isEquals("m",unit.toString())){
  642. ms=l*m;
  643. }
  644. StringBuilder sb = new StringBuilder();
  645. if(ms/Y!=0){
  646. sb.append(ms/Y).append("年");
  647. ms=ms%Y;
  648. }
  649. if(ms/M!=0){
  650. sb.append(ms/M).append("月");
  651. ms=ms%M;
  652. }
  653. if(ms/D!=0){
  654. sb.append(ms/D).append("日");
  655. ms=ms%D;
  656. }
  657. if(ms/H!=0){
  658. sb.append(ms/H).append("时");
  659. ms=ms%H;
  660. }
  661. if(ms/m!=0){
  662. sb.append(ms/m).append("分");
  663. ms=ms%m;
  664. }
  665. if(sb.length()>0){
  666. return sb.toString();
  667. }
  668. }
  669. return "";
  670. }
  671. public static Object fileSize(Object data){
  672. return fileSize(data,null);
  673. }
  674. public static Object fileSize(Object data,Object unit){
  675. if(StringUtils.isNumber(data)){
  676. if(StringUtils.isEmpty(unit)){
  677. unit="K";
  678. }
  679. //统一转化成KB在处理
  680. long ms=0;
  681. long l=Long.parseLong(data.toString());
  682. final long KB=1L;
  683. final long MB=1024*KB;
  684. final long GB=1024*MB;
  685. final long TB=1024*GB;
  686. if(StringUtils.isEquals("K",unit.toString().toUpperCase())){
  687. ms=l*KB;
  688. }else if(StringUtils.isEquals("M",unit.toString().toUpperCase())){
  689. ms=l*MB;
  690. }else if(StringUtils.isEquals("G",unit.toString().toUpperCase())){
  691. ms=l*GB;
  692. }else if(StringUtils.isEquals("T",unit.toString().toUpperCase())){
  693. ms=l*TB;
  694. }
  695. if(ms/TB!=0){
  696. return new BigDecimal(ms).divide(new BigDecimal(TB),2,ROUND_HALF_UP)+"TB";
  697. }
  698. if(ms/GB!=0){
  699. return new BigDecimal(ms).divide(new BigDecimal(GB),1,ROUND_HALF_UP)+"GB";
  700. }
  701. if(ms/MB!=0){
  702. return new BigDecimal(ms).divide(new BigDecimal(MB),0,ROUND_HALF_UP)+"MB";
  703. }
  704. return ms+"KB";
  705. }
  706. return "";
  707. }
  708. public static Object daysPassed(Object t1,Object t2){
  709. return timePassed(t1,t2,"D",0,"yyyy-MM-dd");
  710. }
  711. public static Object hoursPassed(Object t1,Object t2){
  712. return timePassed(t1,t2,"H",0,"yyyy-MM-dd HH");
  713. }
  714. public static Object minutesPassed(Object t1,Object t2){
  715. return timePassed(t1,t2,"m",0,"yyyy-MM-dd HH:mm");
  716. }
  717. /**
  718. * @Description 输入时间格式:mm:ss(例如01:33)
  719. * @Param [t1, t2]
  720. * @return java.lang.Object
  721. * @Author yangyj
  722. * @Date 2021.07.02 17:45
  723. **/
  724. public static Object minutesPassedRecent(Object t1,Object t2){
  725. String year = Calendar.getInstance().get(Calendar.YEAR)+".";
  726. int month= Calendar.getInstance().get(Calendar.MONTH)+1;
  727. String mstr="";
  728. if(month<10){
  729. mstr="0"+month+".";
  730. }else{
  731. mstr=month+".";
  732. }
  733. int day = Calendar.getInstance().get(Calendar.DATE)+1;
  734. String dstr="";
  735. if(day<10){
  736. dstr ="0"+day+" ";
  737. }else {
  738. dstr =day+" ";
  739. }
  740. t1=year+mstr+dstr+t1;
  741. t2=year+mstr+dstr+t2;
  742. return timePassed(t1,t2,"m",0,"yyyy-MM-dd HH:mm");
  743. }
  744. public static Object hoursPassedRecent(Object t1,Object t2){
  745. String year = Calendar.getInstance().get(Calendar.YEAR)+"年";
  746. t1=year+t1;t1=t1.toString().replace("日"," ").replace("时"," ");
  747. t2=year+t2;t2=t2.toString().replace("日"," ").replace("时"," ");
  748. return timePassed(t1,t2,"H",0,"yyyy-MM-dd HH");
  749. }
  750. public static Date parseDate(String dateStr) {
  751. if(StringUtils.isEmpty(dateStr)) {
  752. return null;
  753. }
  754. if(!dateStr.contains("-")){
  755. dateStr=StringUtils.repaceBlank(dateStr);
  756. Matcher m = RegexUtils.matcher("\\d{4}(.)\\d{2}(.)\\d{2}(.?)",dateStr);
  757. if(m.find()){
  758. Set<String> set = new HashSet<>();
  759. set.add(m.group(1));
  760. set.add(m.group(2));
  761. if(StringUtils.isNotEmpty(m.group(3))){
  762. set.add(m.group(3));
  763. }
  764. if(!set.isEmpty()){
  765. for(String str:set){
  766. dateStr=dateStr.replace(str,"-");
  767. }
  768. }
  769. }
  770. }
  771. Date datetime = null;
  772. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  773. try {
  774. datetime = dateFormat.parse(dateStr);
  775. } catch (ParseException e) {
  776. e.printStackTrace();
  777. }
  778. return datetime;
  779. }
  780. public static Date parseDate(Object date,String format) {
  781. if(date instanceof Date){
  782. return (Date) date;
  783. }
  784. if(date==null||StringUtils.isEmpty(format)) {
  785. return null;
  786. }
  787. String dateStr=date.toString();
  788. if(!dateStr.toString().contains("-")){
  789. Matcher m = RegexUtils.matcher("\\d{4}(.)\\d{2}(.)\\d{2}(日?)",dateStr);
  790. if(m.find()){
  791. Set<String> set = new HashSet<>();
  792. set.add(m.group(1));
  793. set.add(m.group(2));
  794. if(StringUtils.isNotEmpty(m.group(3))){
  795. dateStr=dateStr.replace(m.group(3),"");
  796. }
  797. if(!set.isEmpty()){
  798. for(String str:set){
  799. dateStr=dateStr.replace(str,"-");
  800. }
  801. }
  802. }
  803. }
  804. Date datetime = null;
  805. SimpleDateFormat dateFormat = new SimpleDateFormat(format);
  806. try {
  807. datetime = dateFormat.parse(dateStr);
  808. } catch (ParseException e) {
  809. e.printStackTrace();
  810. }
  811. return datetime;
  812. }
  813. public static String handleNull(Object obj) {
  814. if (null == obj) {
  815. return "";
  816. } else {
  817. return obj.toString().trim();
  818. }
  819. }
  820. /**
  821. * @Description 返回时间间隔差
  822. * @Param [t1:开始时间, t2:结束时间, mode:返回值单位:Y年 M月 D日 H时 m分,scale:保留小数位, format:输入日期格式]
  823. * @return java.lang.Object
  824. * @Author yangyj
  825. * @Date 2021.07.01 09:57
  826. **/
  827. public static Object timePassed(Object t1,Object t2,Object mode,Object scale,Object format){
  828. if(t1!=null&&t2!=null&&StringUtils.isNotEmpty(mode)&&StringUtils.isNotEmpty(scale)&&StringUtils.isNotEmpty(format)){
  829. // Date d1 = parseDate(t1,handleNull(format));
  830. // Date d2 = parseDate(t2,handleNull(format));
  831. DateTime d1 = new DateTime(t1.toString());
  832. DateTime d2 = new DateTime(t2.toString());
  833. // if(d1.after(d2)&&StringUtils.isEquals("H",mode)){
  834. // /*假如是计算相差单位是小时,当开始时间大于结束时间,需要考虑跨年的情况*/
  835. // Calendar c =Calendar.getInstance();
  836. // c.setTime(d1);
  837. // c.add(Calendar.YEAR, -1);
  838. // d1=new DateTime(c.getTime());
  839. // }
  840. long range = d2.getTime()-d1.getTime();
  841. long r=0;
  842. if(StringUtils.isEquals("Y",mode.toString())){
  843. r=range/(1000L *3600*24*365);
  844. }else if(StringUtils.isEquals("M",mode.toString())){
  845. r=range/(1000L *3600*24*30);
  846. }else if(StringUtils.isEquals("D",mode.toString())){
  847. r=range/(1000L *3600*24);
  848. }else if(StringUtils.isEquals("H",mode.toString())){
  849. r=range/(1000L *3600);
  850. }else if(StringUtils.isEquals("m",mode.toString())){
  851. r=range/(1000L *60);
  852. }
  853. BigDecimal b = new BigDecimal(r);
  854. if(!StringUtils.isNumber(scale)){
  855. scale=0;
  856. }
  857. return b.setScale(Integer.parseInt(scale.toString()),ROUND_HALF_UP);
  858. }
  859. return "";
  860. }
  861. public static Object k2d(Object k){
  862. Matcher mt = RegexUtils.matcher("[A-Z]*(\\d*)\\+([\\d|\\.]*)",k.toString());
  863. if(mt.find()){
  864. return Double.parseDouble(mt.group(1))*1000+Double.parseDouble(mt.group(2));
  865. }
  866. return -1;
  867. }
  868. /**
  869. * @Description 开方
  870. * @Param [a:被开方数, scale:结果的小数位]
  871. * @return java.lang.Object
  872. * @Author yangyj
  873. * @Date 2020.12.10 15:10
  874. **/
  875. public static Object sqrt(Object a) {
  876. if(StringUtils.isNumber(a)){
  877. return Math.sqrt(Double.parseDouble(a.toString()));
  878. }
  879. return "";
  880. }
  881. /**
  882. * @Description 平方
  883. * @Param [a:开方数, scale:结果的小数位]
  884. * @return java.lang.Object
  885. * @Author yangyj
  886. * @Date 2020.12.10 15:10
  887. **/
  888. public static Object pow(Object a,Object b) {
  889. if(StringUtils.isNumber(a)&&StringUtils.isNumber(b)){
  890. return Math.pow(Double.parseDouble(a.toString()),Double.parseDouble(b.toString()));
  891. }
  892. return "";
  893. }
  894. public static Object pow(Object a) {
  895. if(StringUtils.isNumber(a)){
  896. return Math.pow(Double.parseDouble(a.toString()),2);
  897. }
  898. return "";
  899. }
  900. /**
  901. * @Description 立方
  902. * @Param [base]
  903. * @return java.lang.Object
  904. * @Author yangyj
  905. * @Date 2022.06.24 16:48
  906. **/
  907. public static Object cube(Object base){
  908. return pow(base,3);
  909. }
  910. /**
  911. * @Description 生成用户指定范围实测值
  912. * @Param [n 数量, design 设计值, scope 偏差范围, rate 合格率0~1, scale保留小数位]
  913. * @return java.util.List<java.lang.Object>
  914. * @Author yangyj
  915. * @Date 2021.08.27 14:47
  916. **/
  917. public static List<Object> cmv(Object n, Object design, Object scope, Object rate, Object scale){
  918. if(StringUtils.isNotEmpty(n)&&StringUtils.isNotEmpty(design)&&StringUtils.isNotEmpty(scope)&&StringUtils.isNotEmpty(rate)&&StringUtils.isNotEmpty(scale)){
  919. return rangeList(n,design,scope,1,scale,rate);
  920. }
  921. return null;
  922. }
  923. /**
  924. * @Description 累加器
  925. * @Param [scale:保留小数位, args:累加对象,支持动态数量]
  926. * @return java.lang.Object
  927. * @Author yangyj
  928. * @Date 2021.05.18 10:40
  929. **/
  930. public static Object _sumObj(Object scale,Object...args){
  931. double result = 0d;
  932. boolean flag = false;
  933. for(Object obj:args){
  934. if(StringUtils.isNotEmpty(obj)&&StringUtils.isNumber(obj)){
  935. result+=Double.parseDouble(obj.toString());
  936. flag=true;
  937. }
  938. }
  939. if(flag){
  940. BigDecimal r = new BigDecimal(result);
  941. return r.setScale((int)Double.parseDouble(scale.toString()), ROUND_HALF_UP);
  942. }
  943. return "";
  944. }
  945. /**
  946. * @Description 空白或者/都判断为空
  947. * @Param [data]
  948. * @return java.lang.Object
  949. * @Author yangyj
  950. * @Date 2022.04.01 15:04
  951. **/
  952. public static Object isNotEmpty(Object data){
  953. List<Object> list = obj2List(data);
  954. return list.stream().map(StringUtils::handleNull).anyMatch(e->!e.contains("/"));
  955. }
  956. public static Object isPass(Object data){
  957. List<Object> list = obj2List(data);
  958. return list.stream().map(StringUtils::handleNull).map(e-> !e.contains("/")&&StringUtils.isNotEmpty(e)?"合格":"").collect(Collectors.toList());
  959. }
  960. public static List<Object> b445check(List<Object> data,Object designs,Object dev,Object xN){
  961. return b445check(data,designs,dev,xN,null);
  962. }
  963. /**
  964. * @Description 河南项目检查结果
  965. * @Param [data, designs, dev, xN, hz]
  966. * @return [共检数量,合格数量,不合格数量...]
  967. * @Author yangyj
  968. * @Date 2022.08.01 11:06
  969. **/
  970. public static List<Object> b445check(List<Object> data,Object designs,Object dev,Object xN,Object hz){
  971. List<Object> result = new ArrayList<>();
  972. designs=designFormat(designs);
  973. if(StringUtils.isNotEmpty(data,designs,dev)){
  974. if(StringUtils.isEmpty(xN)){
  975. /*偏差范围单位转换倍率默认是1*/
  976. /*同一个项目偏差范围单位理应一样,所以不用考虑多个值的情况*/
  977. xN=1;
  978. }
  979. if(StringUtils.handleNull(designs).contains("/")){
  980. /*多个设计值*/
  981. String[] designArr=designs.toString().split("/");
  982. String[] devArr=dev.toString().split("/");
  983. int total=0;
  984. int pass=0;
  985. List<List<Object>> dl = dataSpaceSplit(data,designArr);
  986. for(int i=0;i<designArr.length;i++){
  987. Object[] obs=ck(dl.size()>i?dl.get(i):dl.get(dl.size()-1),designArr[i],devArr.length>i?devArr[i]:devArr[devArr.length-1],xN);
  988. total+=StringUtils.handleObj2Integer(obs[0]);
  989. pass+=StringUtils.handleObj2Integer(obs[1]);
  990. }
  991. if(total>0){
  992. result.add(total);
  993. result.add(pass);
  994. result.add(total-pass);
  995. }
  996. }else {
  997. Object[] target = ck(data,designs,dev,xN);
  998. if(StringUtils.handObj2Integer(target[0])>0){
  999. result.add(target[0]);
  1000. result.add(target[1]);
  1001. result.add(StringUtils.handObj2Integer(target[0])-StringUtils.handObj2Integer(target[1]));
  1002. }
  1003. }
  1004. }else if(ListUtils.isNotEmpty(data)) {
  1005. if(data.parallelStream().anyMatch(StringUtils::isNotEmpty)){
  1006. data=data.parallelStream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
  1007. result.add(data.size());
  1008. result.add(data.size());
  1009. result.add(0);
  1010. }
  1011. }
  1012. if(result.size()==0){
  1013. result.addAll(Collections.nCopies(3,""));
  1014. }
  1015. return result;
  1016. }
  1017. public static Object designFormat(Object design){
  1018. if(StringUtils.isNotEmpty(design)){
  1019. return Arrays.stream(design.toString().split("[^\\d.]")).filter(StringUtils::isNotEmpty).collect(Collectors.joining("/"));
  1020. }
  1021. return "";
  1022. }
  1023. public static List<List<Object>> dataSpaceSplit(List<Object> data,String[] designArr){
  1024. List<List<Object>> result = new ArrayList<>();
  1025. if(ListUtils.isNotEmpty(data)&&designArr!=null){
  1026. /*首尾去空*/
  1027. data= listTrim(data);
  1028. String tmp = data.stream().map(StringUtils::handleNull).collect(Collectors.joining(","));
  1029. tmp=tmp.replaceAll(",,,+",",,");
  1030. List<List<Object>> preliminary =Arrays.stream(tmp.split(",,")).map(CustomFunction::obj2ListNe).collect(Collectors.toList());
  1031. /*默认容量16,小于12不会自动扩容*/
  1032. LinkedHashMap<Integer,List<Object>> classify = new LinkedHashMap<>();
  1033. for(int i=0;i< preliminary.size();i++){
  1034. int key = i%designArr.length;
  1035. classify.merge(key,preliminary.get(i),(v1,v2)-> {v1.addAll(v2);return v1;});
  1036. }
  1037. result = new ArrayList<>(classify.values());
  1038. }
  1039. return result;
  1040. }
  1041. public static List<Object> listTrim(List<Object> list){
  1042. List<Object> result = new ArrayList<>();
  1043. if(ListUtils.isNotEmpty(list)){
  1044. int end =list.size();
  1045. for(int i=list.size()-1;i>=0;i--){
  1046. if(StringUtils.isNotEmpty(list.get(i))||i==0){
  1047. end=i+1;
  1048. break;
  1049. }
  1050. }
  1051. int start=0;
  1052. for(int i=0;i<list.size();i++){
  1053. if(StringUtils.isNotEmpty(list.get(i))){
  1054. start=i;
  1055. break;
  1056. }
  1057. }
  1058. return list.subList(start,end);
  1059. }
  1060. return result;
  1061. }
  1062. public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=\\])";
  1063. public static final Pattern P = Pattern.compile(ELE_CODE_REG);
  1064. public static List<String> parseElementCode(String s){
  1065. List<String> result =new ArrayList<>();
  1066. Matcher m= P.matcher(s);
  1067. while (m.find()){
  1068. result.add(m.group().replace("'",""));
  1069. }
  1070. return result;
  1071. }
  1072. public static String coefficient(String dev,double xN){
  1073. if(StringUtils.isNotEmpty(dev)&&xN!=1){
  1074. String[] da=dev.split("[,,]");
  1075. int scale=StringUtils.getScale(xN);
  1076. dev= StringUtils.number2StringZero(Double.parseDouble(da[0])*xN,scale)+","+StringUtils.number2StringZero(Double.parseDouble(da[1])*xN,scale);
  1077. }
  1078. return dev;
  1079. }
  1080. public static List<Object> b445random(Object hz,Object design,Object dev,Object failed,Object xN){
  1081. List<Object> measureOut = new ArrayList<>();
  1082. String hzStr= StringUtils.handleNull(hz);
  1083. String designStr= StringUtils.handleNull(design);
  1084. String deviationStr= StringUtils.handleNull(dev);
  1085. if(StringUtils.isNotEmpty(hzStr,designStr,deviationStr)){
  1086. String passStr = StringUtils.handleNull(failed);
  1087. if(StringUtils.isEmpty(passStr)){
  1088. passStr="0";
  1089. }
  1090. String[] rateIn = hzStr.split("/");
  1091. rateIn= Arrays.stream(rateIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
  1092. String[] designIn = designStr.split("/");
  1093. designIn= Arrays.stream(designIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
  1094. String[] deviationIn = deviationStr.split("/");
  1095. deviationIn= Arrays.stream(deviationIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
  1096. if(xN!=null){
  1097. deviationIn= Arrays.stream(deviationIn).map(e->coefficient(e,Double.parseDouble(xN.toString()))).toArray(String[]::new);
  1098. }
  1099. String[] passIn = passStr.split("/");
  1100. passIn= Arrays.stream(passIn).filter(StringUtils::isNotEmpty).toArray(String[]::new);
  1101. if(designIn.length>0) {
  1102. for (int i = 0; i < designIn.length; i++) {
  1103. String e = designIn[i];
  1104. int _hz = Integer.parseInt(i < rateIn.length ? rateIn[i] : rateIn[rateIn.length - 1]);
  1105. String _deviation = i < deviationIn.length ? deviationIn[i] : deviationIn[deviationIn.length - 1];
  1106. String _pass = i < passIn.length ? passIn[i] : passIn[passIn.length - 1];
  1107. int _scale = StringUtils.getScale(e, _deviation);
  1108. String delimiter=StringUtils.handleNull(matcherFindGroup("[^0-9.]",e,0,false));
  1109. if(StringUtils.isEmpty(delimiter)){
  1110. delimiter=CONCAT;
  1111. }
  1112. String[] _des = e.split("["+delimiter+"]");
  1113. List<Object> _tmp = new ArrayList<>();
  1114. for(String _de:_des){
  1115. List<Object> list ;
  1116. double passD=Double.parseDouble(_pass);
  1117. /**大于0小于1则表示合格率,否则是不合格数量*/
  1118. double rate=(0<passD&&passD<1)?passD:(_hz-passD)/_hz;
  1119. list= cmv(_hz,_de,_deviation,rate,_scale);
  1120. if(ListUtils.isNotEmpty(list)){
  1121. if(list.size()>_tmp.size()){
  1122. _tmp.addAll(list);
  1123. }else{
  1124. for(int n=0;n<_tmp.size();n++){
  1125. /*假如设计值是DxD1这种形式,则需要把生成的实测值拼接起来*/
  1126. _tmp.set(n,StringUtils.join(_tmp.get(n),list.get(n),delimiter));
  1127. }
  1128. }
  1129. }
  1130. }
  1131. measureOut.addAll(_tmp);
  1132. measureOut.add("");
  1133. }
  1134. }
  1135. }
  1136. return measureOut;
  1137. }
  1138. /**
  1139. * @Description 共检点合格点公式
  1140. * @Param [data 数据, remark超出10个后的提示, design实际值, dev偏差值]
  1141. * @return java.lang.Object
  1142. * @Author yangyj
  1143. * @Date 2022.02.11 10:09
  1144. **/
  1145. public static Object checkpoints(Object data ,Object remark,Object design,Object dev,Object xN){
  1146. if(data!=null){
  1147. if(data instanceof String &&((String) data).contains("NumberFormatException")){
  1148. return data;
  1149. }
  1150. Object[] R=ck(data,design,dev,xN);
  1151. if(R[0]!=null&&R[1]!=null&&R[2]!=null){
  1152. int checkpoints=Integer.parseInt(R[0].toString());
  1153. int passpoints=Integer.parseInt(R[1].toString());
  1154. List<Object> result = (List<Object>) R[2];
  1155. boolean over=checkpoints>result.size();
  1156. if(checkpoints<=0){
  1157. return "/";
  1158. }else if(ListUtils.isNotEmpty(result)&&result.size()<=10&&!over){
  1159. result= result.stream().map(obj->{
  1160. if(StringUtils.isNumber(obj)){
  1161. if(obj.toString().contains(".")){
  1162. BigDecimal big = new BigDecimal(obj.toString());
  1163. String s = big.toString();
  1164. return s.replaceAll("(0+|\\.0+)$","");
  1165. }
  1166. }
  1167. return obj;
  1168. }).collect(Collectors.toList());
  1169. return join(result,"、");
  1170. }else{
  1171. if(StringUtils.isEmpty(remark)){
  1172. remark ="共检点,合格点";
  1173. }
  1174. return remark.toString().replace("共检","共检"+checkpoints).replace("合格","合格"+passpoints);
  1175. }
  1176. }
  1177. }
  1178. return "/";
  1179. }
  1180. public static Object[] ck(Object data ,Object design,Object dev,Object xN){
  1181. Object[] r=new Object[3];
  1182. List<Object> result = new ArrayList<>();
  1183. List<Object> datas = obj2List(removeEmpty(data));
  1184. if(ListUtils.isNotEmpty(datas)){
  1185. int checkpoints=0;
  1186. int passpoints=0;
  1187. List<Object> designList = obj2List(design);
  1188. if(ListUtils.isNotEmpty(designList)){
  1189. design=designList.get(0);
  1190. }
  1191. for(Object e:datas){
  1192. String s = handleNull(e);
  1193. if(StringUtils.isNotEmpty(s)){
  1194. if(containsZH(s)){
  1195. Matcher m =RegexUtils.matcher("[\u4e00-\u9fa5]+(\\d+)\\D*合格(\\d+)\\D+",s);
  1196. if(m.find()){
  1197. checkpoints+=Integer.parseInt(m.group(1));
  1198. passpoints+=Integer.parseInt(m.group(2));
  1199. }
  1200. }else{
  1201. result.add(s);
  1202. }
  1203. }
  1204. }
  1205. result=result.stream().map(StringUtils::handleNull).map(String::trim).filter(e->!StringUtils.isEquals("/",e)).collect(Collectors.toList());
  1206. if(result.size()>0){
  1207. List<Object> pl = passList(design,dev,result,xN);
  1208. passpoints+= pl.size();
  1209. result=obj2List(result);
  1210. checkpoints+=result.size();
  1211. }else{
  1212. System.out.println();
  1213. }
  1214. r[0]=checkpoints;
  1215. r[1]=passpoints;
  1216. r[2]=result;
  1217. }
  1218. return r;
  1219. }
  1220. public static Object tree(List<String>treeNodes,String param){
  1221. if(CollectionUtil.isNotEmpty(treeNodes)&& Func.isNotBlank(param)){
  1222. List<String>nodes=new ArrayList<>(treeNodes);
  1223. //Collections.reverse(nodes);
  1224. List<String> result = new ArrayList<>();
  1225. param=param.trim().replaceAll("(?i:c)","");
  1226. List<String> list = Arrays.asList(param.split("[^.\\d]"));
  1227. List<Integer> index =list.stream().map(Integer::parseInt).collect(Collectors.toList());
  1228. for(Integer i:index){
  1229. if(i<nodes.size()) {
  1230. result.add(nodes.get(i));
  1231. }
  1232. }
  1233. return String.join("", result);
  1234. }
  1235. return "";
  1236. }
  1237. public static Object tableNames(List<String>treeNodes){
  1238. if(CollectionUtil.isNotEmpty(treeNodes)){
  1239. List<String>nodes=new ArrayList<>(treeNodes);
  1240. return nodes.stream().filter(e->StringUtils.isNotEmpty(e)&&!e.contains("A15")).map(e->e.replaceAll("__\\d+$","")).distinct().collect(Collectors.joining("\n"));
  1241. }
  1242. return "";
  1243. }
  1244. public static Object qrate(Object design,Object dev,Object data){
  1245. return qrate(design,dev,data,0,1);
  1246. }
  1247. public static Object qrate(Object design,Object dev,Object data,Object scale){
  1248. return qrate(design,dev,data,scale,1);
  1249. }
  1250. /**
  1251. * @Description Qualified rate of measured value 计算合格率
  1252. * @Param [design: 设计值, dev:偏差范围或规定值, xN:偏差值单位转设计值单位倍率, data:数据, scale:保留小数位]
  1253. * @return java.lang.Object
  1254. * @Author yangyj
  1255. * @Date 2022.01.14 09:56
  1256. **/
  1257. public static Object qrate(Object design,Object dev,Object data,Object scale,Object xN){
  1258. if(data!=null&&StringUtils.isNotEmpty(design,dev,xN)){
  1259. Object[] R=ck(data,design,dev,xN);
  1260. if(R[0]!=null&&R[1]!=null&&Math.abs(Double.parseDouble(R[0].toString()))>0){
  1261. String result=StringUtils.number2String(Double.parseDouble(R[1].toString())*100/Double.parseDouble(R[0].toString()),scale);
  1262. if(result.contains(".")){
  1263. result =result.replaceAll("(0+|\\.0+)$","");
  1264. }
  1265. return result;
  1266. }
  1267. }
  1268. return "";
  1269. }
  1270. public static Object easyRate(Object data){
  1271. if(null!=data){
  1272. List<Object> datas = obj2List(data);
  1273. if(datas.stream().anyMatch(CustomFunction::containsZH)){
  1274. return 100;
  1275. }
  1276. }
  1277. return "";
  1278. }
  1279. /**
  1280. * @Description 检查内容
  1281. * @Param [items, names]
  1282. * @return java.lang.Object
  1283. * @Author yangyj
  1284. * @Date 2023.02.24 14:56
  1285. **/
  1286. public static Object checkContent(Object items,Object names){
  1287. if(items!=null&&names!=null){
  1288. List<Object> result = new ArrayList<>();
  1289. List<Object> content = obj2List(items);
  1290. List<Object> list = obj2List(names);
  1291. for(int i=0;i<list.size();i++){
  1292. Object cp = content.get(i);
  1293. if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals("/",cp)){
  1294. result.add(list.get(i));
  1295. }
  1296. }
  1297. if(ListUtils.isNotEmpty(result)){
  1298. return result.stream().map(StringUtils::handleNull).collect(Collectors.joining(StringPool.COMMA));
  1299. }
  1300. }
  1301. return "";
  1302. }
  1303. /**
  1304. * @Description 筛选合格的部分
  1305. * @Param [design, dev, data, xN]
  1306. * @return java.lang.Object
  1307. * @Author yangyj
  1308. * @Date 2022.02.12 13:59
  1309. **/
  1310. public static List<Object> passList(Object design,Object dev,Object data,Object xN){
  1311. List<Object> result = new ArrayList<>();
  1312. List<Object> datas = obj2List(data);
  1313. datas= (List<Object>) removeEmpty(datas);
  1314. Double[] range=scopeParse(dev,design,xN);
  1315. assert range != null;
  1316. double finalMin = range[0];
  1317. double finalMax = range[1];
  1318. List<Object> l1 = datas.stream().map(StringUtils::handleNull).filter(e->e.contains("*")||e.contains("X")||e.contains("x") ||e.contains("×")||e.contains("/")).collect(Collectors.toList());
  1319. if(ListUtils.isNotEmpty(l1)){
  1320. for(Object obj:l1){
  1321. String[] arr = obj.toString().split("[×xX*/]");
  1322. if(Arrays.stream(Arrays.stream(arr).toArray()).allMatch(StringUtils::isNumber)){
  1323. if(Arrays.stream(Arrays.stream(arr).toArray()).map(StringUtils::handleNull).map(Double::parseDouble).noneMatch(e->e>finalMax ||e< finalMin)){
  1324. result.add(obj);
  1325. }
  1326. }
  1327. }
  1328. }
  1329. List<Object> l2 = datas.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).map(Double::parseDouble).filter(e->e<= finalMax &&e>= finalMin).collect(Collectors.toList());
  1330. if(ListUtils.isNotEmpty(l2)){
  1331. result.addAll(l2);
  1332. }
  1333. return result;
  1334. }
  1335. public static Double[] scopeParse(Object dev, Object design, Object xN){
  1336. if(StringUtils.isNotEmpty(dev)){
  1337. Double[] result = new Double[2];
  1338. double designD=Double.parseDouble(design.toString());
  1339. double xND=Double.parseDouble(xN.toString());
  1340. String devStr = dev.toString();
  1341. devStr=devStr.replaceAll("[\\[\\]]+","");
  1342. double min=0;
  1343. double max=0;
  1344. devStr=devStr.replaceAll("\\s+","");
  1345. if(devStr.contains("≤")||devStr.contains("<=")||devStr.contains("<")){
  1346. devStr=devStr.replace("≤","").replace("<=","");
  1347. max=designD+Double.parseDouble(devStr)*xND;
  1348. }else if(devStr.contains("≥")||devStr.contains(">=")||devStr.contains(">")){
  1349. devStr=devStr.replace("≥","").replace(">=","");
  1350. min=designD+Double.parseDouble(devStr)*xND;
  1351. max=Double.MAX_VALUE;
  1352. }else if(devStr.contains(",")||devStr.contains(",")){
  1353. String[] arr = devStr.split("[,,]");
  1354. min = designD+Double.parseDouble(arr[0])*xND;
  1355. max = designD+Double.parseDouble(arr[1])*xND;
  1356. }else if(devStr.contains("%")){
  1357. devStr=devStr.replace("%","");
  1358. double devD =Math.abs(Double.parseDouble(devStr)*designD/100);
  1359. min = designD-devD;
  1360. max = designD+devD;
  1361. }else if(devStr.contains("±")){
  1362. devStr=devStr.replace("±","");
  1363. double devD =Math.abs(Double.parseDouble(devStr)*xND);
  1364. min = designD-devD;
  1365. max = designD+devD;
  1366. }
  1367. result[0]=min;
  1368. result[1]=max;
  1369. return result;
  1370. }
  1371. return null;
  1372. }
  1373. /**
  1374. * @Description specifiedRangeList
  1375. * @Param [hz:频率, design:设计值, dev:偏差范围, xN 偏差范围单位和设计值单位的比值,例如毫米:厘米=0.1, scale:保存小数位, passRate:合格率[0,1]]
  1376. * @return java.util.List<java.lang.Object>
  1377. * @Author yangyj
  1378. * @Date 2022.03.31 09:16
  1379. **/
  1380. public static List<Object> rangeList(Object hz,Object design,Object dev,Object xN,Object scale,Object passRate){
  1381. List<Object> result = new ArrayList<>();
  1382. if(StringUtils.isNotEmpty(design,dev,hz)){
  1383. if(StringUtils.isEmpty(scale)){
  1384. scale=0;
  1385. }
  1386. if(StringUtils.isEmpty(passRate)){
  1387. passRate=1;
  1388. }
  1389. if(StringUtils.isEmpty(xN)){
  1390. xN=1;
  1391. }
  1392. Double[] range=scopeParse(dev,design,xN);
  1393. int scaleI= Integer.parseInt(scale.toString());
  1394. int min=0,max=0;
  1395. assert range != null;
  1396. if(range.length>0){
  1397. min = (int)(range[0]*Math.pow(10,scaleI));
  1398. max = (int)(range[1]*Math.pow(10,scaleI));
  1399. }
  1400. Random rd= new Random();
  1401. int hzi=new BigDecimal(hz.toString()).multiply(new BigDecimal(passRate.toString())).setScale(0,ROUND_CEILING).intValue();
  1402. for(int i=0;i<hzi;i++){
  1403. BigDecimal tb = new BigDecimal(rd.nextInt(max-min+1)+min).divide(BigDecimal.valueOf(Math.pow(10,scaleI)),scaleI,ROUND_HALF_UP);
  1404. if(scaleI>0){
  1405. result.add(tb.doubleValue());
  1406. }else{
  1407. result.add(tb.intValue());
  1408. }
  1409. }
  1410. int total=StringUtils.handleObj2Integer(hz);
  1411. if(total-hzi>0){
  1412. for(int k=0;k<total-hzi;k++){
  1413. BigDecimal tb;
  1414. if(rd.nextBoolean()){
  1415. tb = new BigDecimal(rd.nextInt(((max-min)/2))+max+1).divide(BigDecimal.valueOf(Math.pow(10,scaleI)),scaleI,ROUND_HALF_UP);
  1416. }else{
  1417. tb = new BigDecimal(min-1-rd.nextInt(((max-min)/2))).divide(BigDecimal.valueOf(Math.pow(10,scaleI)),scaleI,ROUND_HALF_UP);
  1418. }
  1419. if(scaleI>0){
  1420. result.add(tb.doubleValue());
  1421. }else{
  1422. result.add(tb.intValue());
  1423. }
  1424. }
  1425. if(ListUtils.isNotEmpty(result)){
  1426. Collections.shuffle(result);
  1427. }
  1428. }
  1429. }
  1430. return result;
  1431. }
  1432. /**
  1433. * @Description obj 转List
  1434. * @Param [obj]
  1435. * @return java.util.List<java.lang.Object>
  1436. * @Author yangyj
  1437. * @Date 2022.01.13 15:40
  1438. **/
  1439. public static List<Object> obj2List(Object obj){
  1440. List<Object> result = new ArrayList<>();
  1441. if(obj!=null){
  1442. List<Object> datas = new ArrayList<>();
  1443. if(obj instanceof List){
  1444. datas = (List<Object>) obj;
  1445. }else {
  1446. datas.add(obj);
  1447. }
  1448. if(ListUtils.isNotEmpty(datas)){
  1449. for(Object e:datas){
  1450. if(StringUtils.isNotEmpty(e)&&!CustomFunction.containsZH(e.toString())&&(e.toString().contains("、")||e.toString().contains(",")||e.toString().contains(" ")||e.toString().contains(","))){
  1451. String s=e.toString().trim();
  1452. if(s.contains(" ")){
  1453. s=s.replaceAll("\\s+","、");
  1454. }
  1455. Object[] bs = s.split("[、,,]");
  1456. result.addAll(Arrays.asList(bs));
  1457. }else{
  1458. result.add(e);
  1459. }
  1460. }
  1461. }
  1462. }
  1463. return result;
  1464. }
  1465. /**
  1466. * @Description 对象转字符串,list取第一个对象
  1467. * @Param [obj]
  1468. * @return java.lang.Object
  1469. * @Author yangyj
  1470. * @Date 2022.02.11 15:14
  1471. **/
  1472. public static Object o2Str(Object obj){
  1473. String result = "";
  1474. if(obj!=null){
  1475. List<Object> datas =obj2List(obj);
  1476. if(ListUtils.isNotEmpty(datas)){
  1477. return handleNull(datas.get(0));
  1478. }
  1479. }
  1480. return result;
  1481. }
  1482. public static Object gfn(Object ob1,Object ob2,Object ob3){
  1483. return _gfn(ob1,ob2,ob3);
  1484. }
  1485. public static Object gfn(Object ob1,Object ob2){
  1486. return _gfn(ob1,ob2);
  1487. }
  1488. public static Object gfn(List<Object> list){
  1489. if(ListUtils.isNotEmpty(list)){
  1490. return _gfn(list.toArray());
  1491. }
  1492. return "";
  1493. }
  1494. /**
  1495. * @Description 返回第一个不为空的对象
  1496. * @Param
  1497. * @Author yangyj
  1498. * @Date 2022.01.04 13:57
  1499. **/
  1500. public static Object _gfn(Object ...obs){
  1501. if(obs!=null){
  1502. for(Object ob:obs){
  1503. if(ob instanceof List){
  1504. List<Object> list =obj2List(ob);
  1505. if(ListUtils.isNotEmpty(list)&&list.stream().anyMatch(StringUtils::isNotEmpty)){
  1506. return ob;
  1507. }
  1508. }else if(ob instanceof Map){
  1509. if(MapUtils.isNotEmpty((Map)ob)){
  1510. return ob;
  1511. }
  1512. }else{
  1513. if(StringUtils.isNotEmpty(ob)&&StringUtils.isNotEquals("/",ob)){
  1514. return ob;
  1515. }
  1516. }
  1517. }
  1518. }
  1519. return null;
  1520. }
  1521. public Object checkItemName(List<Object> data,List<Object> names){
  1522. if(ListUtils.isNotEmpty(data)&&ListUtils.isNotEmpty(names)&&data.size()!=names.size()){
  1523. StringBuilder sb = new StringBuilder();
  1524. for(int i=0;i< data.size();i++){
  1525. List<Object> datas= obj2ListNe(data.get(i));
  1526. if(datas.stream().anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))){
  1527. sb.append(names.get(i)).append(",");
  1528. }
  1529. }
  1530. if(sb.length()>1){
  1531. sb.deleteCharAt(sb.length()-1);
  1532. }
  1533. return sb.toString();
  1534. }
  1535. return "";
  1536. }
  1537. /**
  1538. * @Description 三元运算 bool?o1:o2 ,默认返回空字符串
  1539. * @Param [bool, o1, o2]
  1540. * @return java.lang.Object
  1541. * @Author yangyj
  1542. * @Date 2021.01.29 13:54
  1543. **/
  1544. public static Object ifValObj(Object bool,Object o1 ,Object o2){
  1545. Boolean fi;
  1546. if(bool instanceof Boolean){
  1547. fi = (Boolean) bool;
  1548. }else{
  1549. return "";
  1550. }
  1551. return fi?o1:o2;
  1552. }
  1553. /*太多写错公式名称的,应该是下面的方法名称比较容易接受*/
  1554. public static Object isValObj(Object bool,Object o1 ,Object o2){
  1555. return ifValObj(bool,o1,o2);
  1556. }
  1557. /**
  1558. * @Description 判断o1中是否包含字符串o2
  1559. * @Param [o1, o2]
  1560. * @return java.lang.Object
  1561. * @Author yangyj
  1562. * @Date 2021.01.29 14:04
  1563. **/
  1564. public static Object contains(Object o1 ,Object o2){
  1565. if(o1!=null&&StringUtils.isNotEmpty(o2)){
  1566. List<Object> datas = obj2List(o1);
  1567. return datas.stream().map(StringUtils::handleNull).anyMatch(e->e.contains(o2.toString()));
  1568. }
  1569. return false;
  1570. }
  1571. /**
  1572. * @Description 判断两个对象是否相等
  1573. * @Param [o1, o2]
  1574. * @return java.lang.Object
  1575. * @Author yangyj
  1576. * @Date 2021.08.23 16:51
  1577. **/
  1578. public static Object eq(Object o1 ,Object o2){
  1579. return StringUtils.isEquals(o1,o2);
  1580. }
  1581. /**
  1582. * @Description 计算数据集的合格率
  1583. * @Param [list:数据集, design:设计值, dev:偏差范围, scale:保存小数位]
  1584. * @return java.lang.Object
  1585. * @Author yangyj
  1586. * @Date 2021.10.26 09:34
  1587. **/
  1588. public static Object getListTick(Object list,Object design,Object dev,Object scale){
  1589. if(list!=null&&design!=null&&StringUtils.isNotEmpty(dev)){
  1590. if(!StringUtils.isNumber(scale)){
  1591. scale=0;
  1592. }
  1593. Matcher m = RegexUtils.matcher("(-?\\d+(\\.\\d+)?)[h|H]?[,|,](\\+?\\d+(\\.\\d+)?)[h|H]?",dev.toString().replaceAll("[(|)]",""));
  1594. if(list instanceof List&&m.find()){
  1595. List<Object> arrayList = (ArrayList<Object>) list;
  1596. double tick=0;
  1597. double designD= Double.parseDouble(handleNull(design));
  1598. double h=1;
  1599. if(dev.toString().toUpperCase(Locale.ROOT).contains("H")){
  1600. h=designD;
  1601. }
  1602. for(Object obj:arrayList){
  1603. double dx = Double.parseDouble(handleNull(obj))-designD;
  1604. if(Double.parseDouble(m.group(1))*h<=dx&&dx<=Double.parseDouble(m.group(3))*h){
  1605. tick++;
  1606. }
  1607. }
  1608. if(tick>0){
  1609. BigDecimal a= new BigDecimal(tick);
  1610. BigDecimal b= new BigDecimal(arrayList.size());
  1611. return a.divide(b,8,ROUND_HALF_UP).multiply(new BigDecimal(100)).setScale(StringUtils.handleObj2Integer(scale.toString()),ROUND_HALF_UP);
  1612. }else{
  1613. return "0";
  1614. }
  1615. }
  1616. }
  1617. return "";
  1618. }
  1619. /**
  1620. * @Description 获取最后一个对象
  1621. * @Param [list]
  1622. * @return java.lang.Object
  1623. * @Author yangyj
  1624. * @Date 2021.08.09 14:37
  1625. **/
  1626. public static Object listAt(Object o,Object indexObj){
  1627. if(o == null){
  1628. return "";
  1629. }
  1630. if(o instanceof List){
  1631. List<Object> list = obj2ListNe(o);
  1632. int index =0;
  1633. if(NumberUtil.isNumber(indexObj.toString())){
  1634. index=StringUtils.handObj2Integer(indexObj)-1;
  1635. }else if(StringUtils.isEquals("last",indexObj)||StringUtils.isEmpty(indexObj)){
  1636. index=list.size()-1;
  1637. }
  1638. if(ListUtils.isNotEmpty(list) ){
  1639. if(list.size()>index&&index>=0){
  1640. return list.get(index);
  1641. }else{
  1642. return list.get(list.size()-1);
  1643. }
  1644. }
  1645. }else{
  1646. return o.toString();
  1647. }
  1648. return "";
  1649. }
  1650. public static Map<String, String> getElementCell(String uri) {
  1651. try {
  1652. return Jsoup.parse(IoUtil.readToString(new FileInputStream(ResourceUtil.getFile(uri))))
  1653. .select("table").first()
  1654. .select("tr").stream()
  1655. .flatMap(tr->tr.select("td").stream())
  1656. .filter(d->!d.children().isEmpty())
  1657. .map(d->d.children().get(0)).map(d->d.attr("keyname")).filter(StringUtils::isNotEmpty).map(e->e.split("__"))
  1658. .reduce(
  1659. new HashMap<>(),
  1660. (a,b)->{
  1661. a.merge(b[0], b[1], (v1, v2) -> v1 + ";" + v2);
  1662. return a;},
  1663. (a,b)->null
  1664. );
  1665. }catch (Exception e){
  1666. e.printStackTrace();
  1667. return new HashMap<>();
  1668. }
  1669. }
  1670. /**
  1671. * @Description 关键字转换
  1672. * @Param [cn]
  1673. * @Author yangyj
  1674. * @Date 2022.10.10 17:24
  1675. **/
  1676. public static void formulaKeyWord(CalculateNode cn){
  1677. if(cn.type().equals(Token.OPERATOR_RESULT)){
  1678. OperatorResultNode opn = (OperatorResultNode) cn;
  1679. formulaKeyWord(opn.getLeftOperand());
  1680. formulaKeyWord(opn.getRightOperand());
  1681. }else if(cn.type().equals(Token.METHOD_RESULT)){
  1682. StaticObjectMethodNode cmn=(StaticObjectMethodNode)cn;
  1683. CalculateNode[] array= cmn.getArgsNodes();
  1684. if(ArrayUtil.isNotEmpty(array)){
  1685. for(int i=0;i<array.length;i++){
  1686. CalculateNode c = array[i];
  1687. if(c instanceof StaticObjectMethodNode){
  1688. formulaKeyWord(c);
  1689. }else if (c instanceof VariableNode){
  1690. if(KEYWORD_SET.contains(c.literals())){
  1691. /*关键字需要包裹起来*/
  1692. array[i]=new VariableNode("'"+c.literals()+"'");
  1693. }
  1694. }
  1695. }
  1696. }
  1697. cmn.setArgsNodes(array);
  1698. }
  1699. }
  1700. public static List<Object> obj2ListNe(Object obj){
  1701. List<Object> list = obj2List(obj);
  1702. return list.parallelStream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
  1703. }
  1704. /*obj2ListNe别名*/
  1705. public static List<Object> objToListNe(Object obj){
  1706. return obj2ListNe(obj);
  1707. }
  1708. /**
  1709. * @Description 过滤掉List中的空对象
  1710. * @Param [o]
  1711. * @return java.lang.Object
  1712. * @Author yangyj
  1713. * @Date 2021.07.28 11:16
  1714. **/
  1715. public static Object removeEmpty(Object o){
  1716. List<Object> result = new ArrayList<>();
  1717. if(o instanceof List){
  1718. for(Object e:(List<Object>)o){
  1719. if(StringUtils.isNotEmpty(e)){
  1720. result.add(e);
  1721. }
  1722. }
  1723. }else{
  1724. result.add(o);
  1725. }
  1726. return result;
  1727. }
  1728. /**
  1729. * @Description 设置保留小数位
  1730. * @Param
  1731. * @return
  1732. * @Author yangyj
  1733. * @Date 2021.12.31 17:14
  1734. **/
  1735. public static Object setScale(Object o,Object scale){
  1736. if(StringUtils.isNumber(scale)&&o!=null){
  1737. if(o instanceof List ||o.toString().contains(",")||o.toString().contains("、")){
  1738. List<Object> result = new ArrayList<>();
  1739. List<Object> tmp = obj2ListNe(o);
  1740. for(Object e:tmp){
  1741. if(StringUtils.isNumber(e)){
  1742. result.add(StringUtils.number2String(e,scale));
  1743. }else{
  1744. result.add("");
  1745. }
  1746. }
  1747. if(o instanceof String){
  1748. String delimiter ="、";
  1749. if(o.toString().contains(",")){
  1750. delimiter=",";
  1751. }
  1752. return result.stream().map(StringUtils::handleNull).collect(Collectors.joining(delimiter));
  1753. }
  1754. return result;
  1755. }else{
  1756. if(StringUtils.isNumber(o)){
  1757. return StringUtils.number2String(o,scale);
  1758. }
  1759. }
  1760. }
  1761. return "";
  1762. }
  1763. public static Object abs(Object o){
  1764. /**
  1765. * @Description 测试
  1766. * @Param [o]
  1767. * @return java.lang.Object
  1768. * @Author yangyj
  1769. * @Date 2022.03.21 15:43
  1770. **/
  1771. if(o!=null){
  1772. if(o instanceof List){
  1773. List<Object> result = new ArrayList<>();
  1774. List<Object> datas = obj2List(o);
  1775. if(ListUtils.isNotEmpty(datas)){
  1776. for(Object e:datas){
  1777. if(StringUtils.isNotEmpty(e)){
  1778. result.add(e.toString().replaceAll("^-",""));
  1779. }
  1780. }
  1781. }
  1782. return result;
  1783. }else{
  1784. return o.toString().replaceAll("^-","");
  1785. }
  1786. }
  1787. return null;
  1788. }
  1789. /**
  1790. * @Description 返回正则式匹配内容
  1791. * @Param [regex:正则式, value:匹配的字符串, i:group(i), g:是否返回全局搜索,全局搜索返回的是列表]
  1792. * @return java.lang.Object
  1793. * @Author yangyj
  1794. * @Date 2021.01.08 16:31
  1795. **/
  1796. public static Object matcherFindGroup(String regex, String value ,int i,boolean g){
  1797. Matcher m = RegexUtils.matcher(regex,value);
  1798. List<Object> result = new ArrayList<>();
  1799. while (m.find()){
  1800. result.add(m.group(i));
  1801. }
  1802. if(ListUtils.isNotEmpty(result)){
  1803. if(g){
  1804. return result;
  1805. }else {
  1806. return result.get(0);
  1807. }
  1808. }
  1809. return null;
  1810. }
  1811. /**
  1812. * @Description 放大缩小
  1813. * @return java.lang.Object
  1814. * @Author yangyj
  1815. * @Date 2022.01.14 14:17
  1816. **/
  1817. public static Object xN(Object o,Object xN){
  1818. String cur="";
  1819. try{
  1820. if(StringUtils.isNotEmpty(o)&&StringUtils.isNumber(xN)){
  1821. double xND=Double.parseDouble(xN.toString());
  1822. List<Object> outList = new ArrayList<>();
  1823. if(o instanceof List){
  1824. List<Object> datas = (List<Object>)o;
  1825. for(Object e:datas){
  1826. if(StringUtils.isNotEmpty(e)){
  1827. String[] as = e.toString().split("[^\\d.]");
  1828. Object m= matcherFindGroup("[^\\d.]",e.toString(),0,false);
  1829. StringBuilder d = new StringBuilder();
  1830. for(int i=0;i<as.length;i++){
  1831. String s=as[i];
  1832. cur=s;
  1833. int scale = (int) Math.max(getScale(s)-Math.log10(xND),0);
  1834. d.append(StringUtils.number2String(Double.parseDouble(s) * xND, scale)).append(i!=as.length-1&&m!=null?m:"");
  1835. }
  1836. outList.add(d.toString());
  1837. }
  1838. }
  1839. if(ListUtils.isNotEmpty(outList)){
  1840. return outList;
  1841. }
  1842. }else{
  1843. List<Object> datas = Arrays.asList(o.toString().split("[、, ,]"));
  1844. Matcher m = RegexUtils.matcher("[、, ,]",o.toString());
  1845. String s="、";
  1846. if(m.find()){
  1847. s=handleNull(m.group());
  1848. }
  1849. if(ListUtils.isNotEmpty(datas)){
  1850. for(Object e:datas){
  1851. if(StringUtils.isNotEmpty(e)){
  1852. int scale = (int) Math.max(getScale(s)-Math.log10(xND),0);
  1853. cur=e.toString();
  1854. outList.add(StringUtils.number2String(Double.parseDouble(e.toString())*xND,scale));
  1855. }
  1856. }
  1857. }
  1858. if(ListUtils.isNotEmpty(outList)){
  1859. return StringUtils.join(outList.stream().map(StringUtils::handleNull).collect(Collectors.toList()),s);
  1860. }
  1861. }
  1862. }
  1863. }catch (NumberFormatException e){
  1864. e.printStackTrace();
  1865. String error = "";
  1866. if(e.getMessage().contains("multiple points")){
  1867. error=cur+"包含多个小数点";
  1868. }else {
  1869. error=cur;
  1870. }
  1871. return "NumberFormatException(数字格式异常,请检查)"+error;
  1872. }
  1873. return "";
  1874. }
  1875. public static Object repeat(Object data){
  1876. List<Object> result = new ArrayList<>();
  1877. if(data!=null){
  1878. List<Object> list = obj2List(removeEmpty(data));
  1879. /*外观质量,这种中文描述去重*/
  1880. if(list.stream().filter(CustomFunction::containsZH).anyMatch(e->e.toString().contains("\n"))){
  1881. AtomicInteger index= new AtomicInteger(1);
  1882. result=list.stream().flatMap(e-> Arrays.stream(e.toString().split("\\n+"))).map(String::trim).map(e->e.replaceAll("^\\d+、","")).distinct().map(e->(index.getAndIncrement())+"、"+e+"\n").collect(Collectors.toList());
  1883. }else{
  1884. result=list.stream().distinct().collect(Collectors.toList());
  1885. }
  1886. }
  1887. return result;
  1888. }
  1889. /**
  1890. * @Description 截取list subList(list,1,5) 返回list的第1到第5个元素
  1891. * @Param [o]
  1892. * @return java.lang.Object
  1893. * @Author yangyj
  1894. * @Date 2021.07.28 11:16
  1895. **/
  1896. public static Object subList(Object o,Object start ,Object end){
  1897. List<Object> result = new ArrayList<>();
  1898. if(o instanceof List){
  1899. result = (List<Object>) o;
  1900. int s=StringUtils.handleObj2Integer(start);
  1901. int e=StringUtils.handleObj2Integer(end);
  1902. s= Math.max(s, 1);
  1903. if(e<=0){
  1904. e=result.size();
  1905. }
  1906. return result.subList(s-1,e);
  1907. }
  1908. return result;
  1909. }
  1910. /**
  1911. * @Description 获取G8测点偏差
  1912. * @Param [cd, pc]
  1913. * @return java.lang.Object
  1914. * @Author yangyj
  1915. * @Date 2022.02.25 11:05
  1916. **/
  1917. public static Object g8dx(Object cd,Object pc){
  1918. if(cd!=null&&pc!=null){
  1919. List<Object> result = new ArrayList<>();
  1920. List<Object> stakes=obj2List(cd);
  1921. List<Object> dx=obj2List(pc);
  1922. if(ListUtils.isNotEmpty(stakes)&&dx.size()>=stakes.size()){
  1923. Object bmd = stakes.get(0);
  1924. if(StringUtils.isNotEmpty(bmd)){
  1925. for(int i=0;i<stakes.size();i++){
  1926. Object cp = stakes.get(i);
  1927. if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals(bmd,cp)){
  1928. Matcher m = RegexUtils.matcher("(?i)zd\\d+",cp.toString());
  1929. if(!m.find()){
  1930. result.add(dx.get(i));
  1931. }
  1932. }
  1933. }
  1934. return result;
  1935. }
  1936. }
  1937. }
  1938. return "";
  1939. }
  1940. public static Object g8stakes(Object cd){
  1941. if(cd!=null){
  1942. List<Object> result = new ArrayList<>();
  1943. List<Object> stakes=obj2List(cd);
  1944. if(ListUtils.isNotEmpty(stakes)){
  1945. Object bmd = stakes.get(0);
  1946. if(StringUtils.isNotEmpty(bmd)){
  1947. for (Object cp : stakes) {
  1948. if (StringUtils.isNotEmpty(cp) && StringUtils.isNotEquals(bmd, cp)) {
  1949. Matcher m = RegexUtils.matcher("(?i)zd\\d+", cp.toString());
  1950. if (!m.find()) {
  1951. result.add(cp);
  1952. }
  1953. }
  1954. }
  1955. return result;
  1956. }
  1957. }
  1958. }
  1959. return "";
  1960. }
  1961. public static List<Object> g8c103(Object cd,Object sj, Object sc,Object dx){
  1962. List<Object> result = new ArrayList<>();
  1963. if(cd!=null&&sj!=null&&sc!=null&&dx!=null){
  1964. List<Object> cds=obj2List(cd);
  1965. List<Object> sjs=obj2List(sj);
  1966. List<Object> scs=obj2List(sc);
  1967. List<Object> dxs=obj2List(dx);
  1968. int min=Math.min(Math.min(sjs.size(),scs.size()),dxs.size());
  1969. if(ListUtils.isNotEmpty(cds)&&min>=cds.size()){
  1970. Object bmd = cds.get(0);
  1971. if(StringUtils.isNotEmpty(bmd)){
  1972. for(int i=0;i<cds.size();i++){
  1973. Object cp = cds.get(i);
  1974. if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals(bmd,cp)){
  1975. Matcher m = RegexUtils.matcher("(?i)zd\\d+",cp.toString());
  1976. if(!m.find()){
  1977. if(StringUtils.isNumber(cp)){
  1978. result.add("");
  1979. result.add("");
  1980. result.add("");
  1981. result.add(dxs.get(i));
  1982. }else {
  1983. result.add(sjs.get(i));
  1984. result.add(scs.get(i));
  1985. result.add(dxs.get(i));
  1986. result.add("");
  1987. }
  1988. }
  1989. }
  1990. }
  1991. }
  1992. }
  1993. }
  1994. return result;
  1995. }
  1996. public static List<Object> g8zzds(Object cd,Object dx,Object fi){
  1997. List<Object> result = new ArrayList<>();
  1998. if(cd!=null&&dx!=null){
  1999. List<Object> cds=obj2List(cd);
  2000. List<Object> dxs=obj2List(dx);
  2001. boolean bol= (boolean) fi;
  2002. int min=dxs.size();
  2003. if(ListUtils.isNotEmpty(cds)&&min>=cds.size()){
  2004. Object bmd = cds.get(0);
  2005. List<String> l1 = new ArrayList<>();
  2006. List<String> l2 = new ArrayList<>();
  2007. List<String> l3 = new ArrayList<>();
  2008. List<String> dyn ;
  2009. if(bol){
  2010. dyn=l3;
  2011. }else{
  2012. dyn=l2;
  2013. }
  2014. if(StringUtils.isNotEmpty(bmd)){
  2015. for(int i=0;i<cds.size();i++){
  2016. Object cp = cds.get(i);
  2017. if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals(bmd,cp)){
  2018. Matcher m = RegexUtils.matcher("(?i)zd\\d+",cp.toString());
  2019. if(!m.find()){
  2020. if(StringUtils.isNumber(cp)){
  2021. dyn.add(handleNull(dxs.get(i)));
  2022. }else {
  2023. l1.add(handleNull(dxs.get(i)));
  2024. }
  2025. }
  2026. }
  2027. }
  2028. result.add(StringUtils.join(l1,","));
  2029. result.add(StringUtils.join(l2,","));
  2030. result.add(StringUtils.join(l3,","));
  2031. }
  2032. }
  2033. }
  2034. return result;
  2035. }
  2036. public static List<Object> gcc(Object zh,Object sj,Object sc,Object dx,Object mode){
  2037. List<Object> result = new ArrayList<>();
  2038. if(zh!=null&&sj!=null&&sc!=null&&dx!=null){
  2039. List<Object> cds=obj2List(zh);
  2040. List<Object> sjs=obj2List(sj);
  2041. List<Object> scs=obj2List(sc);
  2042. List<Object> dxs=obj2List(dx);
  2043. int min=Math.min(Math.min(dxs.size(),sjs.size()),scs.size());
  2044. if(ListUtils.isNotEmpty(cds)&&min>=cds.size()){
  2045. Object bmd = cds.get(0);
  2046. if(StringUtils.isNotEmpty(bmd)){
  2047. for(int i=0;i<cds.size();i++){
  2048. Object cp = cds.get(i);
  2049. if(StringUtils.isNotEmpty(cp)&&StringUtils.isNotEquals(bmd,cp)){
  2050. Matcher m = RegexUtils.matcher("(?i)zd\\d+",cp.toString());
  2051. if(!m.find()){
  2052. if(StringUtils.isEquals(mode,0)){
  2053. if(!Pattern.matches(".+(?i)v$",cp.toString())){
  2054. result.add(sjs.get(i));
  2055. result.add(scs.get(i));
  2056. result.add(dxs.get(i));
  2057. }
  2058. }else if(StringUtils.isEquals(mode,1)){
  2059. if(Pattern.matches(".+(?i)v$",cp.toString())){
  2060. result.add(sjs.get(i));
  2061. result.add(scs.get(i));
  2062. result.add(dxs.get(i));
  2063. }
  2064. }
  2065. }
  2066. }
  2067. }
  2068. }
  2069. }
  2070. }
  2071. return result;
  2072. }
  2073. /**
  2074. * @Description list 去头尾
  2075. * @Param [o]
  2076. * @return java.lang.Object
  2077. * @Author yangyj
  2078. * @Date 2021.12.31 14:53
  2079. **/
  2080. public static Object removeHT(Object o){
  2081. List<Object> result = new ArrayList<>();
  2082. if(o instanceof List){
  2083. result= (List<Object>) o;
  2084. if(result.size()>2){
  2085. int end =result.size();
  2086. for(int i=result.size()-1;i>1;i--){
  2087. if(StringUtils.isNotEmpty(result.get(i))){
  2088. end=i;
  2089. break;
  2090. }
  2091. }
  2092. return subList(result,2,end);
  2093. }
  2094. }
  2095. return result;
  2096. }
  2097. public static Object removeByReg(Object o,Object reg){
  2098. List<Object> result = new ArrayList<>();
  2099. if(o instanceof List && StringUtils.isNotEmpty(reg)){
  2100. result= (List<Object>) o;
  2101. return result.stream().map(StringUtils::handleNull).filter(e->!Pattern.matches(reg.toString(),e)).collect(Collectors.toList());
  2102. }
  2103. return result;
  2104. }
  2105. /**
  2106. * @Description 获取动态行某列内容
  2107. * @Param [data, field]
  2108. * @return java.lang.Object
  2109. * @Author yangyj
  2110. * @Date 2022.01.08 10:02
  2111. **/
  2112. public static Object getColumn(Object data ,Object field){
  2113. if(StringUtils.isNotEmpty(field)){
  2114. List<HashMap<String,Object>> _data =objToArray(data);
  2115. if(ListUtils.isNotEmpty(_data)){
  2116. return _data.stream().map(e->e.get(field.toString())).collect(Collectors.toList());
  2117. }
  2118. }
  2119. return data;
  2120. }
  2121. /**
  2122. * @Description 合并多个list
  2123. * @Param [listArr]
  2124. * @return java.lang.Object
  2125. * @Author yangyj
  2126. * @Date 2021.12.31 15:10
  2127. **/
  2128. public static Object mergeList(Object l1,Object l2){
  2129. return _mergeList(l1,l2);
  2130. }
  2131. public static Object mergeList(Object l1,Object l2,Object l3){
  2132. return _mergeList(l1,l2,l3);
  2133. }
  2134. public static Object mergeList(Object l1,Object l2,Object l3,Object l4){
  2135. return _mergeList(l1,l2,l3,l4);
  2136. }
  2137. public static Object mergeList(Object l1,Object l2,Object l3,Object l4,Object l5){
  2138. return _mergeList(l1,l2,l3,l4,l5);
  2139. }
  2140. public static Object mergeList(Object l1,Object l2,Object l3,Object l4,Object l5,Object l6){
  2141. return _mergeList(l1,l2,l3,l4,l5,l6);
  2142. }
  2143. public static Object mergeList(Object l1,Object l2,Object l3,Object l4,Object l5,Object l6,Object l7){
  2144. return _mergeList(l1,l2,l3,l4,l5,l6,l7);
  2145. }
  2146. public static Object mergeList(Object l1,Object l2,Object l3,Object l4,Object l5,Object l6,Object l7,Object l8){
  2147. return _mergeList(l1,l2,l3,l4,l5,l6,l7,l8);
  2148. }
  2149. public static Object _mergeList(Object ...listArr){
  2150. List<Object> result = new ArrayList<>();
  2151. if(listArr!=null&&listArr.length>=2){
  2152. List<List<Object>> tmp =new ArrayList<>();
  2153. int max=0;
  2154. for(Object o:listArr){
  2155. List<Object> list = Collections.singletonList("");
  2156. if(o instanceof List){
  2157. list = (List<Object>) o;
  2158. max=Math.max(max,list.size());
  2159. }
  2160. tmp.add(list);
  2161. }
  2162. if(ListUtils.isNotEmpty(tmp)){
  2163. for(int i=0;i<max;i++){
  2164. for(List<Object> _l:tmp){
  2165. if(_l.size()>i){
  2166. result.add(_l.get(i));
  2167. }else{
  2168. result.add("");
  2169. }
  2170. }
  2171. }
  2172. }
  2173. }
  2174. return result;
  2175. }
  2176. /**
  2177. * @Description 删除列表最后一个数据
  2178. * @Param [o]
  2179. * @return java.lang.Object
  2180. * @Author yangyj
  2181. * @Date 2021.07.28 15:47
  2182. **/
  2183. public static Object remLast(Object o){
  2184. if(o instanceof List){
  2185. rem(o, ((List<Object>)o).size()-1);
  2186. }
  2187. return o;
  2188. }
  2189. /**
  2190. * @Description list 转 string
  2191. * @Param [o, separator:分隔符]
  2192. * @return java.lang.Object
  2193. * @Author yangyj
  2194. * @Date 2021.07.28 15:50
  2195. **/
  2196. public static Object join(Object o1,Object separator){
  2197. Optional<Object> op =Optional.ofNullable(o1);
  2198. if(op.isPresent()){
  2199. String s=StringUtils.handleNull(separator);
  2200. if(StringUtils.isEmpty(s)){
  2201. s="、";
  2202. }
  2203. return op.map(CustomFunction::obj2ListNe).orElse(Collections.singletonList("")).stream().map(StringUtils::handleNull).collect(Collectors.joining(s));
  2204. };
  2205. return "";
  2206. }
  2207. /**
  2208. * @Description String 转List
  2209. * @Param [o, separator]
  2210. * @return java.lang.Object
  2211. * @Author yangyj
  2212. * @Date 2021.12.03 15:09
  2213. **/
  2214. public static Object split(Object o,Object separator){
  2215. if(StringUtils.isNotEmpty(o,separator)){
  2216. System.out.println(separator);
  2217. String[] arr = o.toString().split(separator.toString());
  2218. return Arrays.stream(arr).collect(Collectors.toList());
  2219. }
  2220. return null;
  2221. }
  2222. public static Object split(Object o){
  2223. return split(o,"/|,|、|,|;|;|\\\\|(\\s+)");
  2224. }
  2225. /**
  2226. * @Description 删除下标为index的元素
  2227. * @Param [o, index]
  2228. * @return void
  2229. * @Author yangyj
  2230. * @Date 2021.07.28 15:52
  2231. **/
  2232. public static void rem(Object o,Object index){
  2233. if(o instanceof List&&StringUtils.isNumber(index)){
  2234. ((List<Object>)o).remove(StringUtils.handleObj2Integer(index).intValue());
  2235. }
  2236. }
  2237. /**
  2238. * @Description 根据百分比返回子集list内容
  2239. * @Param [obj:数据源, percent:0-100]
  2240. * @return java.lang.Object
  2241. * @Author yangyj
  2242. * @Date 2020.12.04 09:24
  2243. **/
  2244. public static Object getListPercent(Object obj,Object percent){
  2245. if(obj!=null&&percent!=null){
  2246. if(obj instanceof List){
  2247. ArrayList<Object> list = (ArrayList<Object>) obj;
  2248. Collections.shuffle(list);
  2249. int n = (int) Math.round((Double.parseDouble(percent.toString())/100)*list.size());
  2250. if(n<=list.size()){
  2251. return list.subList(0,n);
  2252. }
  2253. return list;
  2254. }
  2255. }
  2256. return "";
  2257. }
  2258. public static boolean isNumeric(String str){
  2259. Pattern pattern = Pattern.compile("[0-9.]*");
  2260. return pattern.matcher(str).matches();
  2261. }
  2262. /**
  2263. * @Description 把Object 转换成 ArrayList<HashMap<String, Object>>
  2264. * @Param [obj]
  2265. * @return java.util.ArrayList<java.util.HashMap<java.lang.String,java.lang.Object>>
  2266. * @Author yangyj
  2267. * @Date 2020.12.11 09:44
  2268. **/
  2269. public static List<HashMap<String,Object>> objToArray(Object obj){
  2270. if(obj instanceof ArrayList){
  2271. return (List<HashMap<String, Object>>) obj;
  2272. }else if(obj instanceof HashMap){
  2273. List<HashMap<String, Object>> array = new ArrayList<>();
  2274. HashMap<String, Object> map = (HashMap<String, Object>) obj ;
  2275. if(map.size()>0){
  2276. array.add(map);
  2277. }
  2278. return array;
  2279. }
  2280. return null;
  2281. }
  2282. public static Object dXd(Object design,Object data){
  2283. return dXd(design,data,1,0);
  2284. }
  2285. public static Object dXd(Object design,Object data,Object xN,Integer mode){
  2286. int scale=0;
  2287. if(StringUtils.isNotEmpty(design,data,xN)){
  2288. scale=getScale(design,data);
  2289. scale= (int) (scale-Math.log10(Double.parseDouble(xN.toString())));
  2290. }
  2291. if(StringUtils.isEmpty(mode)){mode=0;}
  2292. return dXd(design,data,xN,scale,mode);
  2293. }
  2294. /**
  2295. * @Description 求偏差公式 支持AXA-BXB=DXD或者A-B=D的格式
  2296. * @Param [design:设计值, data:实测值, xN:倍率, scale:保留小数位,mode:1乘法,其它默认减法]
  2297. * @return java.lang.Object
  2298. * @Author yangyj
  2299. * @Date 2022.01.20 09:45
  2300. **/
  2301. public static Object dXd(Object design,Object data,Object xN,Object scale,Integer mode){
  2302. if(StringUtils.isNotEmpty(design,data)){
  2303. if(StringUtils.isEmpty(xN)){
  2304. xN=1;
  2305. }
  2306. if(StringUtils.isEmpty(scale)){
  2307. scale=0;
  2308. }
  2309. String delimiter=handleNull(matcherFindGroup("[^0-9.]",design.toString(),0,false));
  2310. if(StringUtils.isEmpty(delimiter)){
  2311. delimiter=CONCAT;
  2312. }
  2313. String[] dArr=handleNull(design).split("["+delimiter+"]");
  2314. String[] bArr=handleNull(data).split("["+delimiter+"]");
  2315. Object _dx=null;
  2316. for(int n=0;n<dArr.length;n++){
  2317. BigDecimal a = new BigDecimal(dArr[n]);
  2318. BigDecimal b = new BigDecimal(bArr[n]);
  2319. String _data;
  2320. if(StringUtils.isEquals(1,mode)){
  2321. _data= b.multiply(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
  2322. }else{
  2323. _data= b.subtract(a).multiply(new BigDecimal(xN.toString())).setScale(Integer.parseInt(scale.toString()), ROUND_HALF_UP).toString();
  2324. }
  2325. if(StringUtils.isNotEmpty(_dx)){
  2326. _dx=StringUtils.join(_dx,_data,delimiter);
  2327. }else{
  2328. _dx=_data;
  2329. }
  2330. }
  2331. return _dx;
  2332. }
  2333. return "";
  2334. }
  2335. /**
  2336. * @Description 总体标准差
  2337. * @Param [data, scale]
  2338. * @return java.lang.Object
  2339. * @Author yangyj
  2340. * @Date 2022.04.14 11:32
  2341. **/
  2342. public static Object sd(Object data,Object scale){
  2343. if(data!=null&&StringUtils.isNumber(scale)){
  2344. data=removeEmpty(data);
  2345. List<Object> datas=obj2List(data);
  2346. int total=datas.size();
  2347. List<String> _datas=datas.stream().map(StringUtils::handleNull).collect(Collectors.toList());
  2348. double avgVal=_datas.stream().mapToDouble(Double::parseDouble).average().orElse(0D);
  2349. double result=Math.sqrt(_datas.stream().mapToDouble(Double::parseDouble).map(e->Math.pow(e-avgVal,2)).sum()/total);
  2350. return StringUtils.number2String(result,scale);
  2351. }
  2352. return "";
  2353. }
  2354. }