GenUtil.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. package jnpf.util;
  2. import cn.hutool.json.JSONUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import jnpf.util.visiual.JnpfKeyConsts;
  6. import lombok.Data;
  7. import org.apache.commons.lang3.StringUtils;
  8. import java.math.BigDecimal;
  9. import java.text.DecimalFormat;
  10. import java.util.ArrayList;
  11. import java.util.Date;
  12. import java.util.List;
  13. @Data
  14. public class GenUtil {
  15. /**
  16. * 字段说明
  17. */
  18. private String fieldName;
  19. /**
  20. * 运算符
  21. */
  22. private String operator;
  23. /**
  24. * 逻辑拼接符号
  25. */
  26. private String logic;
  27. /**
  28. * 组件标识
  29. */
  30. private String jnpfKey;
  31. /**
  32. * 字段key
  33. */
  34. private String field;
  35. /**
  36. * 自定义的值
  37. */
  38. private String fieldValue;
  39. /**
  40. * 自定义的值2
  41. */
  42. private String fieldValue2;
  43. private List<String> selectIgnore;
  44. /**
  45. * 数据库类型
  46. */
  47. private String dbType;
  48. /**
  49. * 日期格式
  50. */
  51. private String format;
  52. /**
  53. * 数字精度
  54. */
  55. private String precision;
  56. /**
  57. * @param wrapper wrapper对象
  58. * @param fieldDb 数据库字段名实际包括前缀
  59. * @return
  60. */
  61. public QueryWrapper<?> solveValue(QueryWrapper<?> wrapper, String fieldDb) {
  62. MyType myType = myControl(jnpfKey);
  63. if ("||".equals(logic)) {
  64. wrapper.or();
  65. }
  66. if (fieldValue == null) {
  67. fieldValue = "";
  68. }
  69. try {
  70. ArrayList splitKey = new ArrayList<String>() {{
  71. add(JnpfKeyConsts.DATE);
  72. add(JnpfKeyConsts.DATE_CALCULATE);
  73. add(JnpfKeyConsts.TIME);
  74. add(JnpfKeyConsts.NUM_INPUT);
  75. add(JnpfKeyConsts.CREATETIME);
  76. add(JnpfKeyConsts.MODIFYTIME);
  77. }};
  78. if (splitKey.contains(jnpfKey) && "between".equals(operator)) {
  79. List<String> data = JsonUtil.getJsonToList(fieldValue, String.class);
  80. fieldValue = data.get(0);
  81. fieldValue2 = data.get(1);
  82. }
  83. selectIgnore = new ArrayList<String>() {{
  84. add(JnpfKeyConsts.ADDRESS);
  85. add(JnpfKeyConsts.CASCADER);
  86. add(JnpfKeyConsts.CHECKBOX);
  87. }};
  88. myType.judge(wrapper, fieldDb);
  89. return wrapper;
  90. } catch (Exception e) {
  91. return wrapper;
  92. }
  93. }
  94. /**
  95. * 判断控件的所属类型
  96. *
  97. * @param jnpfKey 控件标识
  98. * @return 控件类型
  99. */
  100. public MyType myControl(String jnpfKey) {
  101. MyType myType = null;
  102. switch (jnpfKey) {
  103. /** 基础 */
  104. case JnpfKeyConsts.COM_INPUT:
  105. case JnpfKeyConsts.TEXTAREA:
  106. case JnpfKeyConsts.BILLRULE:
  107. case JnpfKeyConsts.POPUPTABLESELECT:
  108. case JnpfKeyConsts.RELATIONFORM:
  109. case JnpfKeyConsts.RELATIONFORM_ATTR:
  110. case JnpfKeyConsts.POPUPSELECT:
  111. case JnpfKeyConsts.POPUPSELECT_ATTR:
  112. myType = new BasicControl();
  113. break;
  114. // 数字类型
  115. case JnpfKeyConsts.CALCULATE:
  116. case JnpfKeyConsts.NUM_INPUT:
  117. myType = new NumControl();
  118. break;
  119. // 日期类型
  120. case JnpfKeyConsts.DATE:
  121. case JnpfKeyConsts.DATE_CALCULATE:
  122. case JnpfKeyConsts.CREATETIME:
  123. case JnpfKeyConsts.MODIFYTIME:
  124. myType = new DateControl();
  125. break;
  126. // 时间类型
  127. case JnpfKeyConsts.TIME:
  128. myType = new TimeControl();
  129. break;
  130. // 下拉类型
  131. default:
  132. myType = new SelectControl();
  133. }
  134. return myType;
  135. }
  136. public void getNullWrapper(QueryWrapper<?> wrapper, String fieldDb) {
  137. if ("||".equals(logic)) {
  138. wrapper.or(t -> {
  139. t.isNull(fieldDb);
  140. t.or().eq(fieldDb, "");
  141. t.or().eq(fieldDb, "[]");
  142. });
  143. } else {
  144. wrapper.and(t -> {
  145. t.isNull(fieldDb);
  146. t.or().eq(fieldDb, "");
  147. t.or().eq(fieldDb, "[]");
  148. });
  149. }
  150. }
  151. private void getNotNullWrapper(QueryWrapper<?> wrapper, String fieldDb) {
  152. if ("||".equals(logic)) {
  153. wrapper.or(t -> {
  154. t.isNotNull(fieldDb);
  155. t.ne(fieldDb, "");
  156. t.ne(fieldDb, "[]");
  157. });
  158. } else {
  159. wrapper.and(t -> {
  160. t.isNotNull(fieldDb);
  161. t.ne(fieldDb, "");
  162. t.ne(fieldDb, "[]");
  163. });
  164. }
  165. }
  166. /**
  167. * 基础类型
  168. */
  169. class BasicControl extends MyType {
  170. @Override
  171. void judge(QueryWrapper<?> wrapper, String fieldDb) {
  172. switch (operator) {
  173. case "null":
  174. getNullWrapper(wrapper, fieldDb);
  175. break;
  176. case "notNull":
  177. getNotNullWrapper(wrapper, fieldDb);
  178. break;
  179. case "==":
  180. wrapper.eq(fieldDb, fieldValue);
  181. break;
  182. case "<>":
  183. wrapper.ne(fieldDb, fieldValue);
  184. break;
  185. case "like":
  186. wrapper.like(fieldDb, fieldValue);
  187. break;
  188. case "notLike":
  189. wrapper.notLike(fieldDb, fieldValue);
  190. break;
  191. }
  192. }
  193. }
  194. class NumControl extends MyType {
  195. @Override
  196. void judge(QueryWrapper<?> wrapper, String fieldDb) {
  197. BigDecimal num1 = new BigDecimal(fieldValue);
  198. BigDecimal num2 = null;
  199. if (fieldValue2 != null) {
  200. num2 = new BigDecimal(fieldValue2);
  201. }
  202. // 精度处理
  203. String fieldPrecisionValue;
  204. String fieldPrecisionValue2;
  205. if (StringUtils.isNotBlank(precision)) {
  206. String zeroNum = "0." + StringUtils.repeat("0", Integer.parseInt(precision));
  207. DecimalFormat numFormat = new DecimalFormat(zeroNum);
  208. fieldPrecisionValue = numFormat.format(new BigDecimal(fieldValue));
  209. num1 = new BigDecimal(fieldPrecisionValue);
  210. if (fieldValue2 != null) {
  211. fieldPrecisionValue2 = numFormat.format(new BigDecimal(fieldValue2));
  212. num2 = new BigDecimal(fieldPrecisionValue2);
  213. }
  214. }
  215. switch (operator) {
  216. case "null":
  217. getNullWrapper(wrapper, fieldDb);
  218. break;
  219. case "notNull":
  220. getNotNullWrapper(wrapper, fieldDb);
  221. break;
  222. case "==":
  223. wrapper.eq(fieldDb, num1);
  224. break;
  225. case "<>":
  226. wrapper.ne(fieldDb, num1);
  227. break;
  228. case ">":
  229. wrapper.gt(fieldDb, num1);
  230. break;
  231. case "<":
  232. wrapper.lt(fieldDb, num1);
  233. break;
  234. case ">=":
  235. wrapper.ge(fieldDb, num1);
  236. break;
  237. case "<=":
  238. wrapper.le(fieldDb, num1);
  239. break;
  240. case "between":
  241. wrapper.between(fieldDb, num1, num2);
  242. break;
  243. }
  244. }
  245. }
  246. class DateControl extends MyType {
  247. @Override
  248. void judge(QueryWrapper<?> wrapper, String fieldDb) {
  249. Long time = null;
  250. Long time2 = null;
  251. Date date = new Date();
  252. Date date2 = new Date();
  253. if (StringUtils.isNoneBlank(fieldValue)) {
  254. time = Long.valueOf(fieldValue);
  255. date = new Date(time);
  256. }
  257. if (StringUtils.isNoneBlank(fieldValue2)) {
  258. time2 = Long.valueOf(fieldValue2);
  259. // 日期类型的要加上当天的23:59:59
  260. if (JnpfKeyConsts.DATE.equals(jnpfKey) || JnpfKeyConsts.DATE_CALCULATE.equals(jnpfKey)) {
  261. date2 = new Date(time2 + 60 * 60 * 24 * 1000 - 1000);
  262. } else {
  263. date2 = new Date(time2);
  264. }
  265. }
  266. switch (operator) {
  267. case "null":
  268. getNullWrapper(wrapper, fieldDb);
  269. break;
  270. case "notNull":
  271. getNotNullWrapper(wrapper, fieldDb);
  272. break;
  273. case "==":
  274. if (JnpfKeyConsts.DATE.equals(jnpfKey) || JnpfKeyConsts.DATE_CALCULATE.equals(jnpfKey)) {
  275. wrapper.between(fieldDb, date, new Date(time + 60 * 60 * 24 * 1000));
  276. } else {
  277. wrapper.eq(fieldDb, date);
  278. }
  279. break;
  280. case "<>":
  281. wrapper.ne(fieldDb, date);
  282. break;
  283. case ">":
  284. wrapper.gt(fieldDb, date);
  285. break;
  286. case "<":
  287. wrapper.lt(fieldDb, date);
  288. break;
  289. case ">=":
  290. wrapper.ge(fieldDb, date);
  291. break;
  292. case "<=":
  293. wrapper.le(fieldDb, date);
  294. break;
  295. case "between":
  296. wrapper.between(fieldDb, date, date2);
  297. break;
  298. }
  299. }
  300. }
  301. class TimeControl extends MyType {
  302. @Override
  303. void judge(QueryWrapper<?> wrapper, String fieldDb) {
  304. switch (operator) {
  305. case "null":
  306. getNullWrapper(wrapper, fieldDb);
  307. break;
  308. case "notNull":
  309. getNotNullWrapper(wrapper, fieldDb);
  310. break;
  311. case "==":
  312. wrapper.eq(fieldDb, fieldValue);
  313. break;
  314. case "<>":
  315. wrapper.ne(fieldDb, fieldValue);
  316. break;
  317. case ">":
  318. wrapper.gt(fieldDb, fieldValue);
  319. break;
  320. case "<":
  321. wrapper.lt(fieldDb, fieldValue);
  322. break;
  323. case ">=":
  324. wrapper.ge(fieldDb, fieldValue);
  325. break;
  326. case "<=":
  327. wrapper.le(fieldDb, fieldValue);
  328. break;
  329. case "between":
  330. wrapper.between(fieldDb, fieldValue, fieldValue2);
  331. break;
  332. }
  333. }
  334. }
  335. private ArrayList<String> solveListValue(String fieldValue) {
  336. ArrayList<String> result = new ArrayList<>();
  337. try {
  338. List<List> list = JsonUtil.getJsonToList(fieldValue, List.class);
  339. for (List listSub : list) {
  340. result.add(JSONArray.toJSONString(listSub));
  341. // 组织选择需要取最后每个数组最后一个
  342. String value = (String)listSub.get(listSub.size() - 1);
  343. result.add(value);
  344. }
  345. }catch (Exception e){
  346. List<String> list = JsonUtil.getJsonToList(fieldValue, String.class);
  347. result.add(JSONArray.toJSONString(list));
  348. String value = list.get(list.size() - 1);
  349. result.add(value);
  350. }
  351. return result;
  352. }
  353. /**
  354. * 下拉控件类型
  355. */
  356. class SelectControl extends MyType {
  357. @Override
  358. void judge(QueryWrapper<?> wrapper, String fieldDb) {
  359. List<String> list = solveListValue(fieldValue);
  360. if (StringUtils.isNoneBlank(fieldValue) && fieldValue.charAt(0) == '[' && !selectIgnore.contains(jnpfKey)) {
  361. list = JSONUtil.toList(fieldValue, String.class);
  362. }
  363. if (selectIgnore.contains(jnpfKey) && StringUtils.isBlank(fieldValue)) {
  364. fieldValue = "[]";
  365. }
  366. switch (operator) {
  367. case "null":
  368. getNullWrapper(wrapper, fieldDb);
  369. break;
  370. case "notNull":
  371. getNotNullWrapper(wrapper, fieldDb);
  372. break;
  373. case "==":
  374. wrapper.eq(fieldDb, fieldValue);
  375. break;
  376. case "<>":
  377. wrapper.ne(fieldDb, fieldValue);
  378. break;
  379. case "like":
  380. wrapper.like(fieldDb, fieldValue);
  381. break;
  382. case "notLike":
  383. wrapper.notLike(fieldDb, fieldValue);
  384. break;
  385. case "in":
  386. if (list.size() > 0) {
  387. List<String> finalList = list;
  388. if ("||".equals(logic)) {
  389. wrapper.or(t -> {
  390. if (finalList.size() > 0) {
  391. for (int i = 0; i < finalList.size(); i++) {
  392. String value = finalList.get(i);
  393. if (i == 0) {
  394. t.like(fieldDb, value);
  395. } else {
  396. t.or().like(fieldDb, value);
  397. }
  398. }
  399. }
  400. });
  401. } else {
  402. wrapper.and(t -> {
  403. if (finalList.size() > 0) {
  404. for (int i = 0; i < finalList.size(); i++) {
  405. String value = finalList.get(i);
  406. if (i == 0) {
  407. t.like(fieldDb, value);
  408. } else {
  409. t.or().like(fieldDb, value);
  410. }
  411. }
  412. }
  413. });
  414. }
  415. if(JnpfKeyConsts.CASCADER.equals(jnpfKey) || JnpfKeyConsts.ADDRESS.equals(jnpfKey)){
  416. getNotNullWrapper(wrapper,fieldDb);
  417. }
  418. }
  419. break;
  420. case "notIn":
  421. if (list.size() > 0) {
  422. List<String> finalList1 = list;
  423. if ("||".equals(logic)) {
  424. wrapper.or(t -> {
  425. if (finalList1.size() > 0) {
  426. for (int i = 0; i < finalList1.size(); i++) {
  427. String value = finalList1.get(i);
  428. if (i == 0) {
  429. t.notLike(fieldDb, value);
  430. } else {
  431. t.notLike(fieldDb, value);
  432. }
  433. }
  434. }
  435. });
  436. } else {
  437. wrapper.and(t -> {
  438. if (finalList1.size() > 0) {
  439. for (int i = 0; i < finalList1.size(); i++) {
  440. String value = finalList1.get(i);
  441. if (i == 0) {
  442. t.notLike(fieldDb, value);
  443. } else {
  444. t.notLike(fieldDb, value);
  445. }
  446. }
  447. }
  448. });
  449. }
  450. if(JnpfKeyConsts.CASCADER.equals(jnpfKey) || JnpfKeyConsts.ADDRESS.equals(jnpfKey)){
  451. getNotNullWrapper(wrapper,fieldDb);
  452. }
  453. }
  454. break;
  455. }
  456. }
  457. }
  458. abstract class MyType {
  459. abstract void judge(QueryWrapper<?> wrapper, String fieldDb);
  460. }
  461. }