CodeEnum.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package com.fjhx.wms.utils;
  2. import cn.hutool.core.convert.Convert;
  3. import cn.hutool.core.date.DateUtil;
  4. import cn.hutool.core.text.CharSequenceUtil;
  5. import cn.hutool.core.util.ObjectUtil;
  6. import cn.hutool.extra.spring.SpringUtil;
  7. import com.baomidou.mybatisplus.extension.service.IService;
  8. import com.fjhx.wms.service.stock.impl.StockCheckServiceImpl;
  9. import com.fjhx.wms.service.stock.impl.StockJournalServiceImpl;
  10. import com.obs.services.internal.ServiceException;
  11. import lombok.Getter;
  12. import java.util.Date;
  13. import java.util.Map;
  14. @Getter
  15. public enum CodeEnum {
  16. //盘点
  17. CHECK_CODE("SC", "-yyMM-", "code", 3, StockCheckServiceImpl.class),
  18. //调仓
  19. STOCK_TRANSFER("SC", "-yyMM-", "code", 3, StockJournalServiceImpl.class),
  20. //出入库入库
  21. SIN_CODE("SI", "-yyMM-", "code", 3, StockJournalServiceImpl.class),
  22. //出入库出库
  23. SOUT_CODE("SO", "-yyMM-", "code", 3, StockJournalServiceImpl.class);
  24. CodeEnum(String prefix, String dateFormat, String codeFieldName, Integer length, Class<? extends IService<?>> serviceCls) {
  25. this.prefix = prefix;
  26. this.dateFormat = dateFormat;
  27. this.length = length;
  28. this.codeFieldName = codeFieldName;
  29. this.service = SpringUtil.getBean(serviceCls);
  30. }
  31. // 编码前缀
  32. private final String prefix;
  33. // 编码加日期规则
  34. private final String dateFormat;
  35. // 长度
  36. private final Integer length;
  37. // 编码字段名
  38. private final String codeFieldName;
  39. // service
  40. private final IService<?> service;
  41. /**
  42. * 获取键值对
  43. */
  44. public String getCode() {
  45. String itemPrefix;
  46. if (ObjectUtil.isNotEmpty(dateFormat)) {
  47. Date date = new Date();
  48. String format = DateUtil.format(date, dateFormat);
  49. itemPrefix = prefix + format;
  50. } else {
  51. itemPrefix = prefix;
  52. }
  53. Object obj = service.query()
  54. .likeRight(codeFieldName, itemPrefix)
  55. .orderByDesc(codeFieldName)
  56. .last("limit 1")
  57. .one();
  58. if (obj == null) {
  59. return itemPrefix + autoGenericCode(length, 0);
  60. }
  61. Map<String, Object> map = Convert.toMap(String.class, Object.class, obj);
  62. String code = Convert.toStr(map.get(CharSequenceUtil.toCamelCase(codeFieldName)));
  63. Integer codeNum = Convert.toInt(code.substring(itemPrefix.length()));
  64. if (ObjectUtil.isEmpty(codeNum)) {
  65. throw new ServiceException("自定义编码与系统编码生成规则冲突,暂时无法生成编码,请联系管理员");
  66. }
  67. return itemPrefix + autoGenericCode(length, codeNum);
  68. }
  69. /**
  70. * 获取键值对
  71. */
  72. public String getCode(String code) {
  73. if (ObjectUtil.isNotEmpty(code)) {
  74. Long count = service.query().eq(codeFieldName, code).count();
  75. if (count != 0) {
  76. throw new ServiceException("编码已存在");
  77. }
  78. return code;
  79. } else {
  80. return getCode();
  81. }
  82. }
  83. /**
  84. * 不够位数的在前面补0,保留num的长度位数字
  85. */
  86. private static String autoGenericCode(int length, Integer codeNum) {
  87. return String.format("%0" + length + "d", codeNum + 1);
  88. }
  89. }