OrderNumberUtil.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package com.chinaitop.depot.utils;
  2. import org.apache.commons.lang.StringUtils;
  3. import org.springframework.util.ObjectUtils;
  4. import java.text.SimpleDateFormat;
  5. import java.time.LocalDate;
  6. import java.util.Date;
  7. /**
  8. * @author qingsong.han
  9. * @description: 生成单号
  10. * @create 2024-11-13 19:28
  11. */
  12. public class OrderNumberUtil {
  13. /**
  14. * int 定长拼接-后缀顺序号
  15. *
  16. * @param length 总长度
  17. * @param param 参数
  18. * @return 参数前补0
  19. */
  20. public static String integerToString(int length, int param) {
  21. return String.format("%0" + length + "d", param);
  22. }
  23. /**
  24. * 中缀
  25. *
  26. * @return yyyyMMdd
  27. */
  28. private static String getLocalDate() {
  29. String now = LocalDate.now().toString();
  30. return now.replaceAll("-", "");
  31. }
  32. /**
  33. * @param f 前缀
  34. * @return 前缀+中缀+后缀 拼接
  35. */
  36. public static String frontData(String f, int length, int param, Date date) {
  37. String localDate = getLocalDate();
  38. if (!ObjectUtils.isEmpty(date)) {
  39. localDate = getYMD(date);
  40. }
  41. return String.format("%s%s%s", f, localDate, integerToString(length, param));
  42. }
  43. /**
  44. * 主方法
  45. * 调用生成完整规则序号: AJXXSJG + 20240622 + 002(数据库查询完整字符串:AJXXSJG20240622001)
  46. * @param f 前缀
  47. * @param length 位数必须大于0
  48. * @param xh 字符串
  49. * @param date 时间
  50. * @return 尾数+1的编号
  51. */
  52. public synchronized static String initNum(String f, int length, String xh, Date date) {
  53. // 初始化
  54. int num = 1;
  55. if (!StringUtils.isEmpty(xh)) {
  56. String substring = xh.substring(xh.length() - length);
  57. int i = Integer.parseInt(substring);
  58. if (i < maxNum(length))
  59. num += i;
  60. }
  61. return frontData(f, length, num, date);
  62. }
  63. /**
  64. * 获取int位数的最大值:如6位->999999
  65. * @param length int位数
  66. * @return int
  67. */
  68. private static int maxNum(int length) {
  69. if (0 < length) {
  70. StringBuilder builder = new StringBuilder();
  71. for (int i = 0; i < length; i++) {
  72. builder.append(9);
  73. }
  74. return Integer.parseInt(builder.toString());
  75. }
  76. return 0;
  77. }
  78. // 获取日期格式化
  79. public static String getYMD(Date param) {
  80. SimpleDateFormat dateTime = new SimpleDateFormat("yyyyMMdd");
  81. return dateTime.format(param);
  82. }
  83. // public static void main(String[] args) {
  84. // System.out.println(frontData("JH",4, 2));
  85. // System.out.println("-->" + maxNum(3));
  86. // System.out.println("-->" + initNum("AJXXSJG", 3, "AJXXSJG20240622001"));
  87. // System.out.println("-->" + initNum("3191120116103622208D010021", 4, "3191120116103622208D010021202411130001", new Date()));
  88. // }
  89. }