CustomFunction.java 81 KB

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