CustomFunction.java 79 KB

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